Deno 是一个现代的、安全的 JavaScript 和 TypeScript 运行时环境。虽然它支持 ECMAScript 模块,但是还可以通过一些方式来使用 CommonJS 模块。
CommonJS 模块
CommonJS 是 JavaScript 模块的一种格式。它最初被 Node.js 采用,并被广泛的使用在 Node.js 模块中。 CommonJS 模块使用 require()
函数来引入其他模块,并使用 module.exports
或 exports
对象来导出模块。
示例代码 math.js
:
function add(a, b) { return a + b; } function multiply(a, b) { return a * b; } exports.add = add; exports.multiply = multiply;
在另一个文件中,我们可以通过 require()
来使用这个模块:
const math = require('./math'); console.log(math.add(1, 2)); // 输出 3 console.log(math.multiply(2, 3)); // 输出 6
在 Deno 中使用 CommonJS 模块
目前,Deno 已经原生支持 ECMAScript 模块,并不直接支持 CommonJS 模块。但是在 Deno 中,并不需要使用 Node.js 或者其他构建工具来编译 CommonJS 模块,因为 Deno 的内置模块加载器是非常灵活的。
可以通过两种方式来使用 CommonJS 模块:使用第三方模块 esm
或者自定义模块加载器。
使用第三方模块 esm
esm
是一个第三方模块,它允许我们在 Deno 中导入 CommonJS 模块。 首先,我们需要安装 esm
:
$ deno install --allow-read --allow-run --allow-write -f --unstable https://deno.land/x/esm/install.js
然后,在我们的代码中添加以下语句:
require = require("esm")(module/*, options*/);
现在就可以使用 require()
函数来引入 CommonJS 模块了。示例代码 index.js
:
require = require("esm")(module/*, options*/); const math = require('./math'); console.log(math.add(1, 2)); // 输出 3 console.log(math.multiply(2, 3)); // 输出 6
运行代码时,需要添加命令行参数 --loader
来指定加载器:
$ deno run --allow-read --allow-write --allow-net --unstable --loader ./loader.js index.js
其中,./loader.js
是 esm
模块加载器的路径。
自定义模块加载器
更高级的方式是自定义模块加载器。Deno 的模块加载器可以在运行时动态地加载模块,因此我们可以编写一个加载器来解析和加载 CommonJS 模块。
我们需要实现一个函数 createLoader()
,它负责解析模块路径并加载模块。示例代码 loader.js
:
-- -------------------- ---- ------- -------- -------------- - ----- ----- - --- ------ ----- - ------------ - - ----- -------- ------------------ --------- - -- --------- -- ------------------------------ - ----- --- - --- -------------- ------------ ----- -------- - --------------------------------- --------------------- ------ --------------------- - ------ ---------- - -------- --------- - --------- - - --- - ----- -- - ------------ ----------- -- --------------- - ------ ---------------------- - ----- ------ - - -------- -- -- ------------- -------- ----- ------- - ---------------- -------- -------- ----- ------- - ---------- -------- -------- -------- ----------- ---------- - ---------- ---- ----- ------ - --- ------------------ ---------- ---------- ------------- ------------ --------- -------------- --------------- ------------------ --- --------------- ---------------------- ------ --------------- - -------- ------------------ - ----- ------- - ----------- -- --------------- - ---------- --- --- --------------- - ----------- -- ------------------ ----- ------ -------- - ------ - ----- -------- -- - ----- - ----- ------- - - --------------- ----- ---- - ----------------- - ---------- ------------------------ --- ----------------------- ---- -- -- - ---------------------------- ---- -- -- -
将模块加载器存储在一个单独的文件中,然后使用 --import-map
参数指定它,就可以使用 CommonJS 模块了:
$ deno run --allow-all --import-map ./import_map.json --unstable ./entry.js
示例代码 import_map.json
:
{ "imports": { "file:///path/to/loader.js": "https://deno.land/x/comjjs_loader/loader.js" } }
总结
虽然 Deno 并不直接支持 CommonJS 模块,但是可以通过第三方模块 esm
或者自定义模块加载器来使用 CommonJS 模块。如果您需要使用 CommonJS 模块,这些方法将非常有用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65211e6795b1f8cacd893ed0