使用 Deno 构建模块
为什么选择 Deno?
如今编写和发布现代 JavaScript 模块可能很痛苦。作为模块作者,您的模块应支持 CommonJS、ESM 和 TypeScript 声明,以及在 Deno、Node.js 和 Web 浏览器中工作。
使用 Deno,编写模块非常简单,并且可以支持所有目标和格式,以支持最广泛的模块用户。最棒的是,您可以立即提高工作效率,而无需配置工具链 或 设置 TypeScript.
dnt
— Deno 到 Node 转换
创建现代 ES 模块后,您可以使用 dnt
将您的模块转换为 npm 模块,该模块:支持 CommonJS 和 ESM 在 Deno 和 Node 中运行测试支持 TypeScript 在 Deno、Node 和浏览器中工作
import { build, emptyDir } from "https://deno.land/x/[email protected]/mod.ts";
await emptyDir("./npm");
await build({
entryPoints: ["./mod.ts"],
outDir: "./npm",
shims: {
deno: true,
},
package: {
name: "is-42",
version: Deno.args[0],
description:
"Boolean function that returns whether or not parameter is the number 42",
license: "MIT",
repository: {
type: "git",
url: "git+https://github.com/lambtron/is-42.git",
},
bugs: {
url: "https://github.com/lambtron/is-42/issues",
},
},
postBuild() {
Deno.copyFileSync("LICENSE", "npm/LICENSE");
Deno.copyFileSync("README.md", "npm/README.md");
},
});
要运行构建脚本
$ deno run -A build_npm.ts 0.0.1
以及其输出
[dnt] Transforming...
[dnt] Running npm install...
added 6 packages, and audited 7 packages in 2s
found 0 vulnerabilities
[dnt] Building project...
[dnt] Type checking ESM...
[dnt] Emitting ESM package...
[dnt] Emitting script package...
[dnt] Running post build action...
[dnt] Running tests...
> test
> node test_runner.js
Running tests in ./script/mod_test.js...
test 42 should return true ... ok
test 1 should return false ... ok
Running tests in ./esm/mod_test.js...
test 42 should return true ... ok
test 1 should return false ... ok
[dnt] Complete!
现在,与 npm 兼容的 CommonJS 和 ESM 包位于 /npm 中,因此发布到 npm 只需执行此步骤即可
$ npm publish /npm
Node 如何?
在 Node 中,模块作者通常会编写冗余代码或复杂的构建过程,以确保其包支持各种格式和目标。 了解为什么 Node.js 和 npm 模块解析系统如此复杂以及它为开发人员带来的问题。其他资源
以下是一些关于使用 Deno 创建 JavaScript 模块的示例、博客文章和视频。