denza启动指导(如何使用Deno的内置工具)

Deno和 Node.js之间一个令人惊讶的区别是运行时内置的工具数量。除了 Read-Eval-Print Loop (REPL) 控制台,Node.js 需要第三方模块来处理大多数间接编码活动,例如测试和 linting。Deno 内置工具提供了开箱即用的几乎所有东西。

在我们开始之前,请注意。deno是新的!谨慎使用这些工具。有些可能不稳定。很少有配置选项。其他可能会产生不良副作用,例如递归处理每个子目录中的每个文件。最好从专用项目目录测试工具。

安装 Deno

使用以下终端命令在 macOS 或 Linux 上安装 Deno:

curl -fsSL https://deno.land/x/install/install.sh | sh

或来自 Windows Powershell:

iwr https://deno.land/x/install/install.ps1 -useb | iex

Deno 手册中提供了更多安装选项。

回车deno --version检查安装是否成功。显示 V8 Javascript 引擎、TypeScript 编译器和 Deno 本身的版本号。

升级 Deno

使用以下命令将 Deno 升级到最新版本:

deno upgrade

或升级到特定版本,例如 v1.3.0:

deno upgrade --version 1.30.0

以下大多数工具在所有版本中都可用,但更高版本可能具有更多功能和错误修复。

Deno 帮助

可以通过输入以下命令查看工具和选项列表:

deno help

读取-评估-打印循环 (REPL)

与 Node.js 一样,可以通过deno在终端中输入来访问 REPL 表达式评估控制台。您输入的每个表达式都会返回一个结果或undefined:

$ deno Deno 1.3.0 exit using ctrl d or close() > const w = 'World'; undefined > w World > console.log(`Hello ${w}!`); Hello World! undefined > close() $

通过使用光标键浏览表达式历史,可以重新输入以前输入的表达式。

依赖检查器

可以通过输入入口脚本的路径/URL 来deno info <module>查看所有模块依赖关系的树。<module>

考虑以下lib.js带有导出hello和sum函数的库代码:

// general library: lib.js /** * return "Hello <name>!" string * @module lib * @param {string} name * @returns {string} Hello <name>! */ export function hello(name = 'Anonymous') { return `Hello ${ name.trim() }!`; }; /** * Returns total of all arguments * @module lib * @param {...*} args * @returns {*} total */ export function sum(...args) { return [...args].reduce((a, b) => a b); }

这些可以index.js在同一目录中的主入口脚本中使用:

// main entry script: index.js // import lib.js modules import { hello, sum } from './lib.js'; const spr = sum('Site', 'Point', '.com', ' ', 'reader'), add = sum(1, 2, 3); // output console.log( hello(spr) ); console.log( 'total:', add );

运行结果deno run ./index.js:

$ deno run ./index.js Hello SitePoint.com reader! total: 6

index.js可以通过以下方式检查使用的依赖项deno info ./index.js:

$ deno info ./index.js local: /home/deno/testing/index.js type: JavaScript deps: file:///home/deno/testing/index.js └── file:///home/deno/testing/lib.js

类似地,可以检查任何模块 URL 所需的依赖项,但请注意该模块将在首次使用时被下载并在本地缓存。例如:

$ deno info https://deno.land/std/hash/mod.ts Download https://deno.land/std/hash/mod.ts Download https://deno.land/std@0.65.0/hash/mod.ts Download https://deno.land/std@0.65.0/hash/_wasm/hash.ts Download https://deno.land/std@0.65.0/hash/hasher.ts Download https://deno.land/std@0.65.0/hash/_wasm/wasm.js Download https://deno.land/std@0.65.0/encoding/hex.ts Download https://deno.land/std@0.65.0/encoding/base64.ts deps: https://deno.land/std/hash/mod.ts └─┬ https://deno.land/std@0.65.0/hash/_wasm/hash.ts ├─┬ https://deno.land/std@0.65.0/hash/_wasm/wasm.js │ └── https://deno.land/std@0.65.0/encoding/base64.ts ├── https://deno.land/std@0.65.0/encoding/hex.ts └── https://deno.land/std@0.65.0/encoding/base64.ts

有关更多信息,请参阅Deno 手册:依赖检查器。

Linter(语法检查器)

Deno 提供了一个 linter 来验证 JavaScript 和 TypeScript 代码。这是一个需要--unstable标志的不稳定功能,但使用时不会更改任何文件。

Linting 有助于发现不太明显的语法错误并确保代码符合您团队的标准。你可能已经在编辑器或命令行中使用了诸如ESLint 之类的 linter,但 Deno 在安装它的任何环境中都提供了另​一个选项。

要递归地检查当前目录和子目录中的所有.js文件.ts,请输入deno lint --unstable:

$ deno lint --unstable (no-extra-semi) Unnecessary semicolon. }; ^ at /home/deno/testing/lib.js:13:1 Found 1 problem

或者,您可以指定一个或多个文件来限制 linting。例如:

$ deno lint --unstable ./index.js $

有关更多信息,请参阅Deno 手册:Linter。它包括一个规则列表,您可以添加到代码注释中以忽略或强制执行特定语法。

测试赛跑者

Deno 有一个内置的测试运行器,用于对 JavaScript 或 TypeScript 函数进行单元测试。

测试在任何以、、、或扩展名命名<something>test的文件中定义。它必须进行一次或多次调用并传递测试名称字符串和测试函数。该函数可以是同步的或异步的,并使用各种断言实用程序来评估结果。.js.mjs.ts.jsx.tsxDeno.test

使用名为的文件创建一个新test子目录lib.test.js:

// test lib.js library // assertions import { assertEquals } from 'https://deno.land/std/testing/asserts.ts'; // lib.js modules import { hello, sum } from '../lib.js'; // hello function Deno.test('lib/hello tests', () => { assertEquals( hello('Someone'), 'Hello Someone!'); assertEquals( hello(), 'Hello Anonymous!' ); }); // sum integers Deno.test('lib/sum integer tests', () => { assertEquals( sum(1, 2, 3), 6 ); assertEquals( sum(1, 2, 3, 4, 5, 6), 21 ); }); // sum strings Deno.test('lib/sum string tests', () => { assertEquals( sum('a', 'b', 'c'), 'abc' ); assertEquals( sum('A', 'b', 'C'), 'AbC' ); }); // sum mixed values Deno.test('lib/sum mixed tests', () => { assertEquals( sum('a', 1, 2), 'a12' ); assertEquals( sum(1, 2, 'a'), '3a' ); assertEquals( sum('an', null, [], 'ed'), 'annulled' ); });

要从所有目录运行所有测试,请输入deno test. 或者运行存储在特定目录中的测试,使用deno test <dir>. 例如:

$ deno test ./test running 4 tests test lib/hello tests ... ok (4ms) test lib/sum integer tests ... ok (2ms) test lib/sum string tests ... ok (2ms) test lib/sum mixed tests ... ok (2ms) test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (11ms) $

还--filter可以指定字符串或正则表达式以按名称限制测试。例如:

$ deno test --filter "hello" ./test running 1 tests test lib/hello tests ... ok (4ms) test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out (5ms)

--failfast通过传递一个选项,可以在第一次失败时停止长时间运行的测试。

有关更多信息,请参阅Deno 手册:测试。一些第三方测试模块也可用,包括Merlin和Ruhm,但这些仍然Deno.test在表面下使用。

V8 调试器

Deno 提供与 Node.js 相同的 V8 引擎和调试器。可以使用 Chrome 浏览器或VS Code附加到调试器,然后单步执行代码以查看变量和对象更改。

要启动调试器,请在第一行运行带有--inspect或--inspect-brk停止的脚本。如果您需要从网络上的其他设备连接到调试器,请添加其 IP 地址和端口,或者使用--inspect=0.0.0.0:9229. 例如:

$ deno run --inspect-brk=0.0.0.0:9229 ./index.js Debugger listening on ws://0.0.0.0:9229/ws/ceb123... Debugger session started.

打开在新的 Chrome 选项卡中,deno脚本将显示为新的远程目标

denza启动指导(如何使用Deno的内置工具)(1)

注意:“dedicated DevTools for Node”不会连接到 Deno 的调试器,即使它们相似。

单击目标的检查链接以启动 DevTools。如果您使用过客户端调试,这将是熟悉的。Sources选项卡是最有用的,它允许您逐步执行代码:

denza启动指导(如何使用Deno的内置工具)(2)

代码格式化程序

内置的代码格式化程序以类似于Prettier的方式自动格式化 JavaScript 和 TypeScript 代码。Deno 的格式化程序也是固执己见的,目前无法配置选项。

要使用它,请输入deno fmt递归格式化每个子目录中的每个文件。例如:

$ deno fmt /home/deno/testing/index.js /home/deno/testing/test/lib.test.js /home/deno/testing/lib.js

或者,您可以格式化一个或多个单独的文件,例如deno fmt ./index.js.

如果您检查该lib.test.js文件,您会看到格式化程序已删除一些间距并将字符串转换为使用双引号 ( "):

// hello function Deno.test("lib/hello tests", () => { assertEquals(hello("Someone"), "Hello Someone!"); assertEquals(hello(), "Hello Anonymous!"); });

// deno-fmt-ignore通过添加注释可以忽略单个代码块。例如:

// deno-fmt-ignore const bin = [ 1, 0, 0, 0, 1, 0, 0, 0, 1, ];

// deno-fmt-ignore-file通过在代码顶部添加注释可以忽略整个文件。

有关更多信息,请参阅Deno 手册:代码格式化程序。

警告!自动格式化会对 JSDoc 注释产生不利影响。

文档生成器

Deno 可以从源代码中的JSDoc 注释生成文档,解释函数的用途、参数和返回值。目前,Deno 只会为具有哪些export功能的模块生成文档。例如:

$ deno doc ./lib.js Defined in file:///home/deno/testing/lib.js:9:0 function hello(name) return "Hello <name>!" string @module lib @param {string} name @returns {string} Hello <name>! Defined in file:///home/deno/testing/lib.js:21:0 function sum(...args) Returns total of all arguments @module lib @param {...*} args @returns {*} total $

添加--json标志以 JSON 格式输出文档。

脚本捆绑

您的主脚本及其所有依赖项可以使用以下方法捆绑到一个文件中:

deno bundle <main-script> <output-script>

例如:

$ deno bundle ./index.js ./index.bundle.js Bundle file:///home/deno/testing/index.js Emit "./index.bundle.js" (3.13 KB)

然后可以执行生成的脚本:

$ deno run ./index.bundle.js Hello SitePoint.com reader! total: 6

在将脚本分发给最终用户或将最终代码库部署到实时服务器时,这可能很有用。

注意:捆绑时顶级await调用可能会失败,因此async必须添加包装函数。这是一个已知问题,将在未来的 Deno 版本中修复。

有关更多信息,请参阅Deno 手册:捆绑。

脚本安装程序

Deno 脚本可以全局安装,因此可以从文件系统中的任何位置运行。它类似于安装全局 Node.js 模块,但更简单易用。

deno install必须通过命令:

  1. 任何必需的运行时权限标志,例如--allow-read、--allow-write或--allow-net.
  2. 一个可选的已安装脚本名称,带有--name <scriptname>.
  3. 一个可选的安装根文件夹,带有--root <path>. 如果未设置,Deno 会将脚本安装到DENO_INSTALL_ROOT环境变量中设置的路径或$HOME/.deno/bin/.
  4. 模块路径或 URL。

上面的示例脚本可以安装:

$ deno install --name myscript ./index.js ✅ Successfully installed myscript /home/deno/.deno/bin/myscript

myscript在目录中创建一个文件.deno/bin/,其内容如下:

#!/bin/sh # generated by deno install deno "run" "file:///home/deno/testing/index.js" "$@"

myscript现在可以从系统上的任何位置运行。例如:

cd ~ $ myscript Hello SitePoint.com reader! total: 6

这个过程可以很容易地告诉用户如何从已发布的 URL 安装您的应用程序。例如:

deno install --name myapp https://myserver.com/myapp.js myapp

Deno 目前不提供uninstallorremove命令。删除脚本的唯一方法是从.deno/bin/目录或安装位置手动删除生成的文件。

有关更多信息,请参阅Deno 手册:脚本安装程序。

完整的 Deno 工具包?

Deno 的工具是新的,有些是初级的,但是记录在案的“标准”方法有好处。Node.js 提供了许多第三方选项,但这可能导致选择瘫痪或持续的解决方案切换。您是否坚持使用相同的 Node.js 测试套件?

但是,请注意:随着 Deno 使用量的增长,这些内置工具可能会迅速发展。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页