如何使用Deno的内置工具
首发于我的博客:https://blog.zhangbing.site/
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 upgrade
或升级到特定版本,例如v1.3.0:
deno upgrade --version 1.30.0
以下大多数工具在所有版本中都可用,但是更高版本可能具有更多功能和错误修复。
Deno 帮助
输入以下命令可以查看工具和选项的列表:
deno help
Eval-Print Loop (REPL)
和Node.js一样,可以通过在终端输入 deno
来访问repl表达式评估控制台。输入的每个表达式都返回一个结果或 undefined
的结果:
$ denoDeno 1.3.0
exit using ctrl+d or close()
> const w = 'World';
undefined
> w
World
> console.log(`Hello ${w}!`);
Hello World!
undefined
> close()$
通过使用光标键导航表达式历史记录,可以重新输入以前输入的表达式。
依赖检查
可以通过输入 deno info <module>
来查看所有模块的依赖关系树,其中 <module>
是一个入口脚本的path/URL。
考虑以下具有导出的 hello
和 sum
函数的 lib.js
库代码:
// general library: lib.js/*** 返回“Hello <name>!”字符串* @module lib* @param {string} name* @returns {string} Hello <name>!*/
export function hello(name = 'Anonymous') {return `Hello ${ name.trim() }!`;
};/*** 返回所有参数的总数* @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';constspr = 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.jsHello SitePoint.com reader!
total: 6
可以使用 deno info ./index.js
检查 index.js
使用的依赖项:
$ deno info ./index.jslocal: /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.tsDownload 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
标志,但使用时不会改变文件。
Linter 有助于发现不太明显的语法错误,并确保代码符合团队的标准。你可能已经在你的编辑器中或从命令行中使用了像ESLint这样的linter,但是Deno在任何安装了它的环境中提供了另一个选项。
要递归lint当前和子目录中的所有 .js
和 .ts
文件,输入 deno lint —unstable
:
$ deno lint --unstable(no-extra-semi) Unnecessary semicolon.
};^at /home/deno/testing/lib.js:13:1Found 1 problem
另外,你也可以指定一个或多个文件来限制linter。例如:
$ deno lint --unstable ./index.js
$
更多信息,请参见Deno Manual: Linter。它包含了一系列的规则,你可以在代码注释中添加这些规则来忽略或强制执行特定的语法。它包括一个规则列表,你可以添加到代码注释中,以忽略或强制执行特定的语法。
测试运行
Deno具有用于对JavaScript或TypeScript函数进行单元测试的内置测试运行程序。
测试定义在任何名为 <something>test
的文件中,扩展名为 .js
、.mjs
、.ts
、.jsx
或 .tsx
。它必须对 Deno.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 ./testrunning 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" ./testrunning 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 Manual: Testing。也有一些第三方测试模块,包括Merlin和Ruhm,但这些模块在表面之下仍然使用 Deno.test
。
V8 Debugger
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.jsDebugger listening on ws://0.0.0.0:9229/ws/ceb123...
Debugger session started.
在新的Chrome标签中打开,然后 deno
脚本将显示为新的远程目标:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FEKthgjt-1607876715672)(/Users/zhangbing/Desktop/deno-built-in-tools/1.png)]
注意:“Node专用DevTools”将不会连接到Deno的调试器,即使它们相似。
点击目标的inspect链接以启动DevTools。如果你使用过客户端调试,就会很熟悉。Sources选项卡是最有用的,可让你逐步执行代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-35VOWHi4-1607876715692)(/Users/zhangbing/Desktop/deno-built-in-tools/2.png)]
有关更多信息,请参见Deno Manual: Debugger。
代码格式化
内置的代码格式化器可以自动格式化JavaScript和TypeScript代码,方式与Prettier类似。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 Manual: Code Formatter。
警告!自动格式化可能会对JSDoc注释产生不利影响。
文档生成
Deno可以从源代码中的JSDoc注释生成文档,这些注释解释了一个函数的目的、参数和返回值。目前,Deno只会为导出函数的模块生成文档。例如:
$ deno doc ./lib.jsDefined in file:///home/deno/testing/lib.js:9:0function hello(name)return "Hello <name>!" string@module lib@param {string} name@returns {string} Hello <name>!Defined in file:///home/deno/testing/lib.js:21:0function sum(...args)Returns total of all arguments@module lib@param {...*} args@returns {*} total$
添加 —json
标志将以JSON格式输出文档。
有关更多信息,请参见Deno Manual: Documentation Generator。
脚本打包
你的主脚本及其所有依赖项可以使用以下方法捆绑到一个文件中:
deno bundle <main-script> <output-script>
例如:
$ deno bundle ./index.js ./index.bundle.jsBundle file:///home/deno/testing/index.js
Emit "./index.bundle.js" (3.13 KB)
然后可以执行生成的脚本:
$ deno run ./index.bundle.jsHello SitePoint.com reader!
total: 6
将脚本分发给最终用户或将最终代码库部署到实时服务器时,这可能会很有用。
注意:捆绑时顶级await调用可能会失败,因此必须添加异步包装器函数。这是一个已知问题,将在将来的Deno版本中修复。
有关更多信息,请参见Deno Manual: Bundling。
脚本安装程序
Deno脚本可以全局安装,这样就可以从文件系统的任何位置运行。它类似于安装全局的Node.js模块,但有些简单,更容易使用。
必须通过 deno install
命令:
- 任何必需的运行时权限标志,例如
--allow-read
,--allow-write
或--allow-net
。 - 可选的已安装脚本名称,带有
--name <scriptname>
。 - 一个可选的安装根目录,使用
--root <path>
。如果没有设置,Deno会将脚本安装到DENO_INSTALL_ROOT
环境变量或$HOME/.deno/bin/
中设置的路径。 - 模块路径或URL。
上面的示例脚本可以通过以下方式安装:
$ deno install --name myscript ./index.js✅ Successfully installed myscript
/home/deno/.deno/bin/myscript
将在 .deno/bin/
目录中创建一个 myscript
文件,其内容如下:
#!/bin/sh
# generated by deno install
deno "run" "file:///home/deno/testing/index.js" "$@"
myscript
现在可以在系统上的任何位置运行。例如:
cd ~
$ myscriptHello SitePoint.com reader!
total: 6
通过此过程,很容易告诉用户如何从已发布的URL安装应用程序。例如:
deno install --name myapp https://myserver.com/myapp.js
myapp
Deno目前没有提供 uninstall
或 remove
命令。移除脚本的唯一方法是手动从 .deno/bin/
目录或任何安装它的地方删除生成的文件。
有关更多信息,请参见Deno Manual: Script Installer。
完整的Deno工具包?
Deno的工具是新的,有的还很初级,但是文档化的“标准”方法是有好处的。Node.js提供了众多的第三方选择,但这可能会导致选择麻痹或不断切换解决方案。你是否还在坚持使用同一个Node.js测试套件?
但是,请注意:随着Deno使用量的增加,这些内置工具可能会迅速发展。
原文:https://www.sitepoint.com/deno-built-in-tools/
作者:Craig Buckler
如何使用Deno的内置工具相关推荐
- Java虚拟机学习总结(3)——JDK内置工具(jps、jstack、jmap、jstat)使用详解
一.JDK内置工具 - javap 1. 介绍 java 反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件. 2.命令 javap <options> <clas ...
- 利用Windows内置工具winsat测试硬盘速度(SSD机械盘对比)
利用Windows内置工具winsat测试硬盘速度(SSD&机械盘对比) 以下是红色内容是在命令行运行: C:\Users\Administrator>winsat disk Windo ...
- [MODIS数据处理#2]常用的Arcmap内置工具(一)
上一篇文章中,我们使用MRT工具完成了对MODIS数据的预处理,并对栅格进行了预处理. 接下来的两期是对Arcmap中常用内置工具的介绍,使用的ArcGIS版本为10.2: • 投影栅格 • 裁剪 • ...
- JVM-2.jdk自带内置工具
文章目录 1. 概要 2. JPS 3. jstat---性能分析 4. jmap--堆内存分析 4.1 打印java堆详情 4.2 打印堆中对象的统计信息 4.3 dump出堆内存信息 4.4 触发 ...
- (六)Java关于内置工具类
Java 内置工具类(String.StringBuffer.LinkedList.ArrayList.HashMap等工具) Java提供了异常丰富的工具类数量巨阳之多,对于 Java学习者而言 ...
- acer软件保护卡清除工具clear_使用Windows 10内置工具释放硬盘空间的最佳方法
如果您的磁盘空间不足,可以使用 Windows 10 中内置的工具来清理垃圾文件.应用程序和游戏等,以优化硬盘空间.使用这些清理工具不仅能够释放空间,而且还有助于提高系统性能. 下面小编就为大家汇总介 ...
- TS高级类型内置工具类型
Partial<T> 将泛型 T 中的所有属性转化为可选属性 /*** Make all properties in T optional*/ type Partial<T> ...
- 【Appium】元素探测工具UIautomatorViewer 和Appium destop内置工具
Appium destop内置元素探测工具 platformName-设备平台:填Android或IOS deviceName----设备名:按adb devices查出的设备名填写即可,Androi ...
- python内置开发工具是什么_Python内置工具(tools)总结
Python提供了以下几个内置tools模块,简化开发 operator collections itertools functools 除此之外,还有一些其他工具,比如mimetools.unitt ...
最新文章
- 独家 | Tableau中的Z-Order了解一下!
- 【深度学习】面向医学图像的病灶分割调研(一)
- java左右三角_java打印一个顺序与倒序的杨辉三角,要求两个三角左右排列
- python autoit上传文件_结合python+selenium使用AutoIt V3实现文件、图片上传
- 缓存中间件-Memcache命令介绍
- Netty工作笔记0010---Channel应用案例1
- (5)STM32使用HAL库实现串口通讯——实战操作
- 你真的会使用SQL Server的备份还原功能吗?之一:恢复模型
- 【web前端性能优化】12.css sprite(图片精灵)-雪碧图实现原理
- 找个免费的天气预报API真难a
- 天猫多个商品主图、属性图和细节图分类下载
- html多重表格设置密码,日记坊-excel协同办公:一张表格设置多个不同密码,限制多区域编辑权限...
- tomcat服务器报503
- 如何在 Ubuntu 中加密硬盘
- 解密「UWB」精准定位黑科技
- Redis集群模式源码分析
- linux nginx rpm 安装配置,Centos下安装nginx rpm包
- Win32汇编:过程与宏调用
- LibGDX_1.1: LibGDX 跨平台游戏开发框架简介
- surface rt 8.1 越狱应用签名工具