跳到主要内容
Deno 2 终于来了 🎉️
了解更多

使用 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 和浏览器中工作

以下是 名为 is-42 的模块的示例 dnt 构建脚本

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 模块的示例、博客文章和视频。