我把 deno 官方文档抄了一遍,以确保,知晓有哪些功能了!

本贴最后更新于 990 天前,其中的信息可能已经东海扬尘

1. installation

    1. shell-mac/linux curl -fsSL https://deno.land/x/install/install.sh | sh
    1. powerShell-win iwr https://deno.land/x/install/install.ps1 -useb | iex
    1. scoop-win scoop install deno
    1. choco-win choco install deno
    1. homebrew-mac brew install deno
    1. nix-mac/linux nix-shell -p deno
    1. source using Cargo cargo install deno --locked
    1. docker https://github.com/denoland/deno_docker

2. env

    1. DENO_DIR defaults to $HOME/.cache/deno
    1. NO_COLOR turn off/on color output

3. auto compleate

bash

deno completions bash > /usr/local/etc/bash_completion.d/deno.bash
source /usr/local/etc/bash_completion.d/deno.bash

zsh

# create a folder to save your completions. it can be anywhere
mkdir ~/.zsh
deno completions zsh > ~/.zsh/_deno

# write this into .zshrc
fpath=(~/.zsh $fpath)
autoload -Uz compinit
compinit -u

zsh + oh-my-zsh

mkdir ~/.oh-my-zsh/custom/plugins/deno
deno completions zsh > ~/.oh-my-zsh/custom/plugins/deno/_deno

powershell

deno completions powershell >> $profile

vscode: Deno initalize workspace configuration

More IDE's config https://deno.land/manual@main/getting_started/setup_your_environment

4. first steps

    1. curl
const url = Deno.args[0];
const res = await fetch(url);
const body = new Uint8Array(await res.arrayBuffer());
await Deno.stdout.write(body);

Deno is a runtime which is secure by default, using --alow-net please

deno run --allow-net=example.com https://deno.land/std@0.100.0/examples/curl.ts https://example.com

    1. file --allow-read
const filenames = Deno.args;

for (const filename of filenames) {
  const file = await Deno.open(filename);
  await Deno.copy(file, Deno.stdout);
  file.close();
}

deno run --allow-read https://deno.land/std@0.100.0/examples/cat.ts /etc/passwd

    1. tcp --allow-net
const hostname = "0.0.0.0";
const port = 8080;
const listener = Deno.listen({ hostname, port });
console.log(`Listening on ${hostname}:${port}`);
for await (const conn of listener) {
  Deno.copy(conn, conn);
}

deno run --allow-net https://deno.land/std@0.100.0/examples/echo_server.ts

5. command line interface

# subcommand
deno help
# shot flag
deno -h
# full flag
deno --help


SUBCOMMANDS:
    bundle         Bundle module and dependencies into single file
    cache          Cache the dependencies
    compile        UNSTABLE: Compile the script into a self contained executable
    completions    Generate shell completions
    coverage       Print coverage reports
    doc            Show documentation for a module
    eval           Eval script
    fmt            Format source files
    help           Prints this message or the help of the given subcommand(s)
    info           Show info about cache or info related to source file
    install        Install script as an executable
    lint           Lint source files
    lsp            Start the language server
    repl           Read Eval Print Loop
    run            Run a JavaScript or TypeScript program
    test           Run tests
    types          Print runtime TypeScript declarations
    upgrade        Upgrade deno executable to given version

ENVIRONMENT VARIABLES:
    DENO_AUTH_TOKENS     A semi-colon separated list of bearer tokens and
                         hostnames to use when fetching remote modules from
                         private repositories
                         (e.g. "abcde12345@deno.land;54321edcba@github.com")
    DENO_CERT            Load certificate authority from PEM encoded file
    DENO_DIR             Set the cache directory
    DENO_INSTALL_ROOT    Set deno install's output directory
                         (defaults to $HOME/.deno/bin)
    DENO_WEBGPU_TRACE    Directory to use for wgpu traces
    HTTP_PROXY           Proxy address for HTTP requests
                         (module downloads, fetch)
    HTTPS_PROXY          Proxy address for HTTPS requests
                         (module downloads, fetch)
    NO_COLOR             Set to disable color
    NO_PROXY             Comma-separated list of hosts which do not use a proxy
                         (module downloads, fetch)

deno run

deno-run
Run a JavaScript or TypeScript program

By default all programs are run in sandbox without access to disk, network or
ability to spawn subprocesses.

  deno run https://deno.land/std/examples/welcome.ts

Grant all permissions:

  deno run -A https://deno.land/std/http/file_server.ts

Grant permission to read from disk and listen to network:

  deno run --allow-read --allow-net https://deno.land/std/http/file_server.ts

Grant permission to read allow-listed files from disk:

  deno run --allow-read=/etc https://deno.land/std/http/file_server.ts

Deno allows specifying the filename '-' to read the file from stdin.

  curl https://deno.land/std/examples/welcome.ts | target/debug/deno run -

USAGE:
    deno run [OPTIONS] <SCRIPT_ARG>...

OPTIONS:
    -A, --allow-all
            Allow all permissions

        --allow-env=<allow-env>
            Allow environment access

        --allow-hrtime
            Allow high resolution time measurement

        --allow-net=<allow-net>
            Allow network access

        --allow-plugin
            Allow loading plugins

        --allow-read=<allow-read>
            Allow file system read access

        --allow-run=<allow-run>
            Allow running subprocesses

        --allow-write=<allow-write>
            Allow file system write access

        --cached-only
            Require that remote dependencies are already cached

        --cert <FILE>
            Load certificate authority from PEM encoded file

    -c, --config <FILE>
            Load tsconfig.json configuration file

    -h, --help
            Prints help information

        --import-map <FILE>
            Load import map file from local file or remote URL.
            Docs: https://deno.land/manual/linking_to_external_code/import_maps
            Specification: https://wicg.github.io/import-maps/
            Examples: https://github.com/WICG/import-maps#the-import-map
        --inspect=<HOST:PORT>
            Activate inspector on host:port (default: 127.0.0.1:9229)

        --inspect-brk=<HOST:PORT>
            Activate inspector on host:port and break at start of user script

        --location <HREF>
            Value of 'globalThis.location' used by some web APIs

        --lock <FILE>
            Check the specified lock file

        --lock-write
            Write lock file (use with --lock)

    -L, --log-level <log-level>
            Set log level [possible values: debug, info]

        --no-check
            Skip type checking modules

        --no-remote
            Do not resolve remote modules

        --prompt
            Fallback to prompt if required permission wasn't passed

    -q, --quiet
            Suppress diagnostic output
            By default, subcommands print human-readable diagnostic messages to stderr.
            If the flag is set, restrict these messages to errors.
    -r, --reload=<CACHE_BLOCKLIST>
            Reload source code cache (recompile TypeScript)
            --reload
              Reload everything
            --reload=https://deno.land/std
              Reload only standard modules
            --reload=https://deno.land/std/fs/utils.ts,https://deno.land/std/fmt/colors.ts
              Reloads specific modules
        --seed <NUMBER>
            Seed Math.random()

        --unstable
            Enable unstable features and APIs

        --v8-flags=<v8-flags>
            Set V8 command line options (for help: --v8-flags=--help)

        --watch
            UNSTABLE: Watch for file changes and restart process automatically.
            Only local files from entry point module graph are watched.

ARGS:
    <SCRIPT_ARG>...
            Script arg

6. WebAssembly

const wasmCode = new Uint8Array([
  0, 97, 115, 109, 1, 0, 0, 0, 1, 133, 128, 128, 128, 0, 1, 96, 0, 1, 127,
  3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 0, 1, 112, 0, 0,
  5, 131, 128, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 0, 0, 7, 145,
  128, 128, 128, 0, 2, 6, 109, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97,
  105, 110, 0, 0, 10, 138, 128, 128, 128, 0, 1, 132, 128, 128, 128, 0, 0,
  65, 42, 11
]);
const wasmModule = new WebAssembly.Module(wasmCode);
const wasmInstance = new WebAssembly.Instance(wasmModule);
const main = wasmInstance.exports.main as CallableFunction
console.log(main().toString());

7. debug

chrome

    1. using --inspect-brk
    1. open chrome and input chrome://inspect

vscode

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Deno",
      "type": "pwa-node",
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "runtimeExecutable": "deno",
      "runtimeArgs": ["run", "--inspect-brk", "-A", "${file}"],
      "attachSimplePort": 9229
    }
  ]
}

8. runtime

apis

there has two types of deno's api (Web API,Global API)

apis: https://github.com/denoland/deno/releases/latest/download/lib.deno.d.ts


lifecycle

supports browser compatible lifecycle events: load an unload

// imported.ts
const handler = (e: Event): void => {
  console.log(`got ${e.type} event in event handler (imported)`);
};

window.addEventListener("load", handler);
window.addEventListener("unload", handler);

window.onload = (e: Event): void => {
  console.log(`got ${e.type} event in onload function (imported)`);
};

window.onunload = (e: Event): void => {
  console.log(`got ${e.type} event in onunload function (imported)`);
};

console.log("log from imported script");
// main.ts
import "./imported.ts";

const handler = (e: Event): void => {
  console.log(`got ${e.type} event in event handler (main)`);
};

window.addEventListener("load", handler);

window.addEventListener("unload", handler);

window.onload = (e: Event): void => {
  console.log(`got ${e.type} event in onload function (main)`);
};

window.onunload = (e: Event): void => {
  console.log(`got ${e.type} event in onunload function (main)`);
};

console.log("log from main script");
$ deno run main.ts
# first console was not eventListener
log from imported script
log from main script
# load event listener
got load event in event handler (imported)
got load event in event handler (main)
# onload
got load event in onload function (main)
# unload event listener
got unload event in event handler (imported)
got unload event in event handler (main)
# unload
got unload event in onunload function (main)

Check, by descriptor, if a permission is granted or not.

// Global write permission.
const desc1 = { name: "write" } as const;
// Write permission to `$PWD/foo/bar`.
const desc2 = { name: "write", path: "foo/bar" } as const;
// Global net permission.
const desc3 = { name: "net" } as const;
// Net permission to 127.0.0.1:8000.
const desc4 = { name: "net", host: "127.0.0.1:8000" } as const;
// High-resolution time permission.
const desc5 = { name: "hrtime" } as const;
const desc1 = { name: "read", path: "/foo" } as const;
// out put
// devcui@macross devcui-cli % deno run permission.ts
// Check file:///Users/devcui/Projects/devcui-cli/permission.ts
// PermissionStatus { state: "prompt", onchange: null }
console.log(await Deno.permissions.query(desc1));

const desc2 = { name: "read", path: "/foo/bar" } as const;
console.log(await Deno.permissions.query(desc2));

const desc3 = { name: "read", path: "/bar" } as const;
console.log(await Deno.permissions.query(desc3));

request permission

const desc1 = { name: "read", path: "/foo" } as const;
const status1 = await Deno.permissions.request(desc1);
// ⚠️ Deno requests read access to "/foo". Grant? [g/d (g = grant, d = deny)] g
console.log(status1);

revoke permissions

const desc = { name: "read", path: "/foo" } as const;
console.log(await Deno.permissions.revoke(desc));
// PermissionStatus { state: "prompt" }

web platform apis

    1. fetch
    1. CustomEvent,EventTarget,EventListener
    1. WebWorker
    1. Blob
    1. Console
    1. Performance
    1. setTimeout,setInterval,clearInterval
    1. Streams API
    1. URL
    1. URLSearchParams
    1. WebSocket

https://github.com/denoland/deno/blob/v1.11.5/cli/dts/lib.deno.shared_globals.d.ts

https://github.com/denoland/deno/blob/v1.11.5/cli/dts/lib.deno.window.d.ts

https://github.com/denoland/deno/blob/v1.11.5/cli/dts/lib.deno.worker.d.ts


http server

// listen server
const server = Deno.listen({ port: 8080 });

// tls server
const server = Deno.listenTls({
  port: 8443,
  certFile: "localhost.crt",
  keyFile: "localhost.key",
  alpnProtocols: ["h2", "http/1.1"],
});

// handle http
const server = Deno.listen({ port: 8080 });
for await (const conn of server) {
  // ...handle the connection...
}

// accept listener
// close listener
try {
  const conn = await server.accept();
  conn.close();
  // ... handle the connection ...
} catch (err) {
  // The listener has closed
  break;
}

// serving http
const server = Deno.listen({ port: 8080 });
for await (const conn of server) {
  (async () => {
    const httpConn = Deno.serveHttp(conn);
    for await (const requestEvent of httpConn) {
      console.log(requestEvent.method);
    }
    // waiting for the next request
    const requestEvent = await httpConn.nextRequest();
  })();
}

// request and response
// request
async function handle(conn: Deno.Conn) {
  const httpConn = Deno.serveHttp(conn);
  for await (const requestEvent of httpConn) {
    const url = new URL(requestEvent.request.url);
    console.log(`path: ${url.path}`);
  }
}
// response
async function handle(conn: Deno.Conn) {
  const httpConn = Deno.serveHttp(conn);
  for await (const requestEvent of httpConn) {
    await requestEvent.respondWith(
      // new Response
      new Response("hello world", {
        status: 200,
      })
    );
  }
}

// http2 support
const server = Deno.listenTls({
  port: 8443,
  certFile: "localhost.crt",
  keyFile: "localhost.key",
  // protocol 'h2,http/1.1'
  alpnProtocols: ["h2", "http/1.1"],
});

location

deno run --location=https://www.baidu.com that equals sevlet-context-path or baseHref ...

console.log(location.href);
// https://www.baidu.com

await fetch("./a");
// https://www.baidu.com/a

// deno run --location https://example.com/index.html --allow-net main.ts

const worker = new Worker("./workers/hello.ts", { type: "module" });
// Fetches worker module at "https://example.com/workers/hello.ts".

web storage

localStorage.setItem();
localStorage.getItem();
localStorage.removeItem();
localStorage.clear();

workers

// Good
new Worker(new URL("./worker.js", import.meta.url).href, { type: "module" });

// Bad
new Worker(new URL("./worker.js", import.meta.url).href);
new Worker(new URL("./worker.js", import.meta.url).href, { type: "classic" });
new Worker("./worker.js", { type: "module" });

// this is demo, demo, and demo
const worker = new Worker(new URL("./worker.js", import.meta.url).href, {
  type: "module",
  deno: {
    namespace: true,
  },
});
worker.postMessage({ filename: "./log.txt" });

self.onmessage = async (e) => {
  const { filename } = e.data;
  const text = await Deno.readTextFile(filename);
  console.log(text);
  self.close();
};

// specifying worker permissions
const worker = new Worker(new URL("./worker.js", import.meta.url).href, {
  type: "module",
  deno: {
    namespace: true,
    permissions: {
      net: ["https://deno.land/"],
      read: [
        new URL("./file_1.txt", import.meta.url),
        new URL("./file_2.txt", import.meta.url),
      ],
      write: false,
    },
  },
});

const worker = new Worker(new URL("./worker.js", import.meta.url).href, {
  type: "module",
  deno: {
    namespace: true,
    permissions: "inherit",
  },
});

const worker = new Worker(new URL("./worker.js", import.meta.url).href, {
  type: "module",
  deno: {
    namespace: true,
    permissions: {
      env: false,
      hrtime: false,
      net: "inherit",
      plugin: false,
      read: false,
      run: false,
      write: false,
    },
  },
});

9. linking to external code

// load third party code
import { assertEquals } from "https://deno.land/std@0.100.0/testing/asserts.ts";

// $ deno run test.ts
// Compile file:///mnt/f9/Projects/github.com/denoland/deno/docs/test.ts
// Download https://deno.land/std@0.100.0/testing/asserts.ts
// Download https://deno.land/std@0.100.0/fmt/colors.ts
// Download https://deno.land/std@0.100.0/testing/diff.ts
// Asserted!

the file will cache to

On Linux/Redox: $XDG_CACHE_HOME/deno or $HOME/.cache/deno
On Windows: %LOCALAPPDATA%/deno (%LOCALAPPDATA% = FOLDERID_LocalAppData)
On macOS: $HOME/Library/Caches/deno
If something fails, it falls back to $HOME/.deno

if the host of the URL goes down?

# Download the dependencies.
DENO_DIR=./deno_dir deno cache src/deps.ts

# Make sure the variable is set for any command which invokes the cache.
DENO_DIR=./deno_dir deno test src

# Check the directory into source control.
git add -u deno_dir
git commit

reload everything

deno cache --reload my_module.ts

checking & lock files

deno cache --lock=lock.json --lock-write src/deps.ts

from lock

deno cache --reload --lock=lock.json src/deps.ts

use --cached-only flag to require that remote dependencies are already cached


Proxy configuration is read from environmental variables: HTTP_PROXY, HTTPS_PROXY and NO_PROXY.


private modules https://deno.land/manual/linking_to_external_code/private
that impl by DENO_AUTH_TOKENS env and the github


js map

{
  "imports": {
    "fmt/": "https://deno.land/std@0.100.0/fmt/"
  }
}

use --import-map=<FILE> cli flag to import js map

10. using typeScript

    1. Deno converts typescript(tsx/jsx) to javascript.
    1. Build into Deno and Rust library called swc.
    1. code -> checked & transformed -> cache(js file + meta file + buildinfo file).
> deno info
DENO_DIR location: "/path/to/cache/deno"
Remote modules cache: "/path/to/cache/deno/deps"
TypeScript compiler cache: "/path/to/cache/deno/gen"

jump type checking

deno run --allow-net --no-check my_server.ts

deno supports the type of file

Media Type / How File is Handled

  • application/typescript / TypeScript (with path extension influence)
  • text/typescript / TypeScript(with path extension influence)
  • video/vnd.dlna.mpeg-tts / TypeScript (with path extension influence)
  • video/mp2t / TypeScript (with path extension influence)
  • application/x-typescript / TypeScript (with path extension influence)
  • application/javascript / JavaScript (with path extensions influence)
  • text/javascript / JavaScript (with path extensions influence)
  • application/ecmascript / JavaScript (with path extensions influence)
  • text/ecmascript / JavaScript (with path extensions influence)
  • application/x-javascript / JavaScript (with path extensions influence)
  • application/node / JavaScript (with path extensions influence)
  • text/jsx / JSX
  • text/tsx / TSX
  • text/plain / Attempt to determine that path extension, otherwise unknown
  • application/octet-stream / Attempt to determine that path extension, otherwise unknown

support tsconfig.json to config tsc

> deno run --config ./tsconfig.json main.ts

https://deno.land/manual@v1.11.5/typescript/configuration


how deno uses a configuration file

Option Default Notes
allowJs true This almost never needs to be changed
allowUnreachableCode false
allowUnusedLabels false
checkJs false If true causes TypeScript to type check JavaScript
experimentalDecorators true We enable these by default as they are already opt-in in the code and when we skip type checking, the Rust based emitter has them on by default. We strongly discourage the use of legacy decorators, as they are incompatible with the future decorators standard in JavaScript
jsx react
jsxFactory React.createElement
jsxFragmentFactory React.Fragment
keyofStringsOnly false
lib [ "deno.window" ] The default for this varies based on other settings in Deno. If it is supplied, it overrides the default. See below for more information.
noFallthroughCasesInSwitch false
noImplicitAny true
noImplicitReturns false
noImplicitThis true
noImplicitUseStrict true
noStrictGenericChecks false
noUnusedLocals false
noUnusedParameters false
noUncheckedIndexedAccess false
reactNamespace React
strict true
strictBindCallApply true
strictFunctionTypes true
strictPropertyInitialization true
strictNullChecks true
suppressExcessPropertyErrors false
suppressImplicitAnyIndexErrors false

lib

name desc
deno.ns includes all custom deno global namespace apis plus the Deno additions to import.meta
deno.unstable includes the addition unstable deno global namespace apis
deno.window includes deno.ns/dom
dom.iterable standard typescript libraries
deno.worker deno web worker
deno.asynciterable async iterable
dom The main browser global library that ships with TypeScript
dom.iterable The iterable extensions to the browser global library
scripthost The library for the Microsoft Windows Script Host
webworker The main library for web workers in the browser
webworker.importscripts The library that exposes the importScripts() API in the web worker
webworker.iterable The library that adds iterables to objects within a web worker

when typescript is type checking a file,it only cares about the types for the file, and the tsc compiler has a lot of logic to try to resolve those types.

By the default '.ts' -> '.d.ts' -> '.js'


providing types when importing

if you have javascript module and .d.ts,use @deno-types to import type checking file

// @deno-types="./coolLib.d.ts"
import * as coolLib from "./coolLib.js";

providing types when hosting

Using the triple-slash reference directive

/// <reference types="./coolLib.d.ts" />
import * as coolLib from "http://xxx.xxx.coolLib.js";

checking web workers

/// <reference no-default-lib="true" />
/// <reference lib="deno.worker" />

or using tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "lib": ["deno.worker"]
  }
}

that will use X-TypeScript-Types header

HTTP/1.1 200 OK
Content-Type: application/javascript; charset=UTF-8
Content-Length: 648
X-TypeScript-Types: ./coolLib.d.ts

Type checking JavaScript

Deno supports using the TypeScript type checker to type check JavaScript. You can mark any individual file by adding the check JavaScript pragma to the file:

// @ts-check

or

tsconfig

{
  "compilerOptions": {
    "checkJs": true
  }
}

doc

/** @type {string []} */
const a = [];

pass checking

// @ts-nocheck

rum time compiler apis

The runtime compiler API is unstable (and requires the --unstable flag to be used to enable it).

function emit(
  rootSpecifier: string | URL,
  options?: EmitOptions
): Promise<EmitResult>;

interface EmitOptions {
  /** Indicate that the source code should be emitted to a single file
   * JavaScript bundle that is a single ES module (`"module"`) or a single
   * file self contained script we executes in an immediately invoked function
   * when loaded (`"classic"`). */
  bundle?: "module" | "classic";
  /** If `true` then the sources will be typed checked, returning any
   * diagnostic errors in the result.  If `false` type checking will be
   * skipped.  Defaults to `true`.
   *
   * *Note* by default, only TypeScript will be type checked, just like on
   * the command line.  Use the `compilerOptions` options of `checkJs` to
   * enable type checking of JavaScript. */
  check?: boolean;
  /** A set of options that are aligned to TypeScript compiler options that
   * are supported by Deno. */
  compilerOptions?: CompilerOptions;
  /** An [import-map](https://deno.land/manual/linking_to_external_code/import_maps#import-maps)
   * which will be applied to the imports. */
  importMap?: ImportMap;
  /** An absolute path to an [import-map](https://deno.land/manual/linking_to_external_code/import_maps#import-maps).
   * Required to be specified if an `importMap` is specified to be able to
   * determine resolution of relative paths. If a `importMap` is not
   * specified, then it will assumed the file path points to an import map on
   * disk and will be attempted to be loaded based on current runtime
   * permissions.
   */
  importMapPath?: string;
  /** A record of sources to use when doing the emit.  If provided, Deno will
   * use these sources instead of trying to resolve the modules externally. */
  sources?: Record<string, string>;
}

interface EmitResult {
  /** Diagnostic messages returned from the type checker (`tsc`). */
  diagnostics: Diagnostic[];
  /** Any emitted files.  If bundled, then the JavaScript will have the
   * key of `deno:///bundle.js` with an optional map (based on
   * `compilerOptions`) in `deno:///bundle.js.map`. */
  files: Record<string, string>;
  /** An optional array of any compiler options that were ignored by Deno. */
  ignoredOptions?: string[];
  /** An array of internal statistics related to the emit, for diagnostic
   * purposes. */
  stats: Array<[string, number]>;
}

example

> deno run mod.ts

You could do something similar with Deno.emit():

try {
  const { files } = await Deno.emit("mod.ts");
  for (const [fileName, text] of Object.entries(files)) {
    console.log(`emitted ${fileName} with a length of ${text.length}`);
  }
} catch (e) {
  // something went wrong, inspect `e` to determine
}

or improve typescript's source

const { files } = await Deno.emit("/mod.ts", {
  sources: {
    "/mod.ts": `import * as a from "./a.ts";\nconsole.log(a);\n`,
    "/a.ts": `export const a: Record<string, string> = {};\n`,
  },
});

type checking and emitting and diagnostics

const { files, diagnostics } = await Deno.emit("./mod.js", {
  compilerOptions: {
    checkJs: true,
  },
});
// there is something that impacted the emit
console.warn(Deno.formatDiagnostics(diagnostics));

bundling

const { files, diagnostics } = await Deno.emit("./mod.ts", {
  bundle: "module",
});

import maps

const { files } = await Deno.emit("mod.ts", {
  bundle: "module",
  importMap: {
    imports: {
      "lodash": "https://deno.land/x/lodash",
    },
  },
  importMapPath: "file:///import-map.json",
});

skip type checking/transpiling only

const { files } = await Deno.emit("./mod.ts", {
  check: false,
});

11. standard library

https://deno.land/std/

12. testing

  • 1.assert(expr: unknown, msg = ""): asserts expr
  • 2.assertEquals(actual: unknown, expected: unknown, msg?: string): void
  • 3.assertExists(actual: unknown,msg?: string): void
  • 4.assertNotEquals(actual: unknown, expected: unknown, msg?: string): void
  • 5.assertStrictEquals(actual: unknown, expected: unknown, msg?: string): void
  • 6.assertStringIncludes(actual: string, expected: string, msg?: string): void
  • 7.assertArrayIncludes(actual: unknown[], expected: unknown[], msg?: string): void
  • 8.assertMatch(actual: string, expected: RegExp, msg?: string): void
  • 9.assertNotMatch(actual: string, expected: RegExp, msg?: string): void
  • 10.assertObjectMatch( actual: Record<PropertyKey, unknown>, expected: Record<PropertyKey, unknown>): void
  • 11.assertThrows(fn: () => void, ErrorClass?: Constructor, msgIncludes = "", msg?: string): Error
  • 12.assertThrowsAsync(fn: () => Promise, ErrorClass?: Constructor, msgIncludes = "", msg?: string): Promise

13. tools

installer, look like go get

deno install --allow-net --allow-read -n serve https://deno.land/std@0.100.0/http/file_server.ts


formatter

# format all JS/TS files in the current directory and subdirectories
deno fmt
# format specific files
deno fmt myfile1.ts myfile2.ts
# check if all the JS/TS files in the current directory and subdirectories are formatted
deno fmt --check
# format stdin and write to stdout
cat file.ts | deno fmt -

read-eval-print-loop

pass


bundler

deno bundle https://deno.land/std@0.100.0/examples/colors.ts colors.bundle.js


compiling executables

deno compile [--output ] will compile the script into a self-contained executable.

deno compile --allow-read --allow-net https://deno.land/std/http/file_server.ts


documentation generator

/**
 * Adds x and y.
 * @param {number} x
 * @param {number} y
 * @returns {number} Sum of x and y
 */
export function add(x: number, y: number): number {
  return x + y;
}
deno doc add.ts

function add(x: number, y: number): number
  Adds x and y. @param {number} x @param {number} y @returns {number} Sum of x and y

dependency inspector

deno info https://deno.land/std@0.67.0/http/file_server.ts

deno info https://deno.land/std@0.67.0/http/file_server.ts
Download https://deno.land/std@0.67.0/http/file_server.ts
...
local: /home/deno/.cache/deno/deps/https/deno.land/f57792e36f2dbf28b14a75e2372a479c6392780d4712d76698d5031f943c0020
type: TypeScript
compiled: /home/deno/.cache/deno/gen/https/deno.land/f57792e36f2dbf28b14a75e2372a479c6392780d4712d76698d5031f943c0020.js
deps: 23 unique (total 139.89KB)
https://deno.land/std@0.67.0/http/file_server.ts (10.49KB)
├─┬ https://deno.land/std@0.67.0/path/mod.ts (717B)
│ ├── https://deno.land/std@0.67.0/path/_constants.ts (2.35KB)
│ ├─┬ https://deno.land/std@0.67.0/path/win32.ts (27.36KB)
│ │ ├── https://deno.land/std@0.67.0/path/_interface.ts (657B)
│ │ ├── https://deno.land/std@0.67.0/path/_constants.ts *
│ │ ├─┬ https://deno.land/std@0.67.0/path/_util.ts (3.3KB)
│ │ │ ├── https://deno.land/std@0.67.0/path/_interface.ts *
│ │ │ └── https://deno.land/std@0.67.0/path/_constants.ts *
│ │ └── https://deno.land/std@0.67.0/_util/assert.ts (405B)
│ ├─┬ https://deno.land/std@0.67.0/path/posix.ts (12.67KB)
│ │ ├── https://deno.land/std@0.67.0/path/_interface.ts *
│ │ ├── https://deno.land/std@0.67.0/path/_constants.ts *
│ │ └── https://deno.land/std@0.67.0/path/_util.ts *
│ ├─┬ https://deno.land/std@0.67.0/path/common.ts (1.14KB)
│ │ └─┬ https://deno.land/std@0.67.0/path/separator.ts (264B)
│ │   └── https://deno.land/std@0.67.0/path/_constants.ts *
│ ├── https://deno.land/std@0.67.0/path/separator.ts *
│ ├── https://deno.land/std@0.67.0/path/_interface.ts *
│ └─┬ https://deno.land/std@0.67.0/path/glob.ts (8.12KB)
│   ├── https://deno.land/std@0.67.0/path/_constants.ts *
│   ├── https://deno.land/std@0.67.0/path/mod.ts *
│   └── https://deno.land/std@0.67.0/path/separator.ts *
├─┬ https://deno.land/std@0.67.0/http/server.ts (10.23KB)
│ ├── https://deno.land/std@0.67.0/encoding/utf8.ts (433B)
│ ├─┬ https://deno.land/std@0.67.0/io/bufio.ts (21.15KB)
│ │ ├── https://deno.land/std@0.67.0/bytes/mod.ts (4.34KB)
│ │ └── https://deno.land/std@0.67.0/_util/assert.ts *
│ ├── https://deno.land/std@0.67.0/_util/assert.ts *
│ ├─┬ https://deno.land/std@0.67.0/async/mod.ts (202B)
│ │ ├── https://deno.land/std@0.67.0/async/deferred.ts (1.03KB)
│ │ ├── https://deno.land/std@0.67.0/async/delay.ts (279B)
│ │ ├─┬ https://deno.land/std@0.67.0/async/mux_async_iterator.ts (1.98KB)
│ │ │ └── https://deno.land/std@0.67.0/async/deferred.ts *
│ │ └── https://deno.land/std@0.67.0/async/pool.ts (1.58KB)
│ └─┬ https://deno.land/std@0.67.0/http/_io.ts (11.25KB)
│   ├── https://deno.land/std@0.67.0/io/bufio.ts *
│   ├─┬ https://deno.land/std@0.67.0/textproto/mod.ts (4.52KB)
│   │ ├── https://deno.land/std@0.67.0/io/bufio.ts *
│   │ ├── https://deno.land/std@0.67.0/bytes/mod.ts *
│   │ └── https://deno.land/std@0.67.0/encoding/utf8.ts *
│   ├── https://deno.land/std@0.67.0/_util/assert.ts *
│   ├── https://deno.land/std@0.67.0/encoding/utf8.ts *
│   ├── https://deno.land/std@0.67.0/http/server.ts *
│   └── https://deno.land/std@0.67.0/http/http_status.ts (5.93KB)
├─┬ https://deno.land/std@0.67.0/flags/mod.ts (9.54KB)
│ └── https://deno.land/std@0.67.0/_util/assert.ts *
└── https://deno.land/std@0.67.0/_util/assert.ts *

linter

# lint all JS/TS files in the current directory and subdirectories
deno lint
# lint specific files
deno lint myfile1.ts myfile2.ts
# print result as JSON
deno lint --json
# read from stdin
cat file.ts | deno lint -

rules https://lint.deno.land/

14. embedding

Deno consists of multiple parts, one of which is deno_core. This is a rust crate that can be used to embed a JavaScript runtime into your rust application. Deno is built on top of deno_core.

The Deno crate is hosted on crates.io.

https://crates.io/crates/deno_core

You can view the API on docs.rs.

https://docs.rs/deno_core/0.92.0/deno_core/

15.OVER

1 操作
someone66251 在 2021-07-12 14:33:01 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...