背景
Deno 是一个现代化的 JavaScript 和 TypeScript 运行时环境,它的目标是取代 Node.js。和 Node.js 不同,Deno 默认使用 ECMAScript 模块 (ESM) 进行模块化。但是,在实际开发过程中,有些 NPM 包还没有完全支持 ESM,这样就会出现 Deno 无法解析 ESM 模块的问题。
例如,假设我们想要在 Deno 中使用 NPM 上的 lodash
:
import * as _ from 'lodash';
将会得到以下错误:
error: Cannot find module "lodash" at https://deno.land/...
这是因为 lodash
不是一个 ESM 模块,而是一个 CommonJS 模块。
解决方案
要解决这个问题,我们需要使用一些工具来将 CommonJS 模块转换成 ESM 模块,然后再在 Deno 中使用它们。
1. 使用 esbuild
esbuild 是一个非常快速的 JavaScript 打包器和压缩器。它支持将 CommonJS 模块转换成 ESM 模块。
首先,我们需要全局安装 esbuild
:
npm install -g esbuild
然后,我们可以使用以下命令来将 lodash
转换成 ESM 模块:
esbuild --format=esm node_modules/lodash/lodash.js --outfile=dist/lodash.mjs
现在,我们可以在 Deno 中导入 lodash
:
import * as _ from './dist/lodash.mjs';
2. 使用 rollup
Rollup 是一个类似 webpack 的 JavaScript 打包器。但是,它专注于将 CommonJS 模块和 ES6 模块转换成 ESM 模块。
首先,我们需要全局安装 rollup
:
npm install -g rollup
然后,我们需要创建一个 rollup.config.js
文件:
-- -------------------- ---- ------- ------ -------- ---- ------------------------- ------ ------- - ------ -------------------------------- -------- ------------- ------- - ----- ------------------ ------- ------ -- --
最后,我们可以使用以下命令来将 lodash
转换成 ESM 模块:
rollup --config rollup.config.js
现在,我们可以在 Deno 中导入 lodash
:
import * as _ from './dist/lodash.mjs';
结论
本文介绍了两种将 CommonJS 模块转换成 ESM 模块的方法,以解决 Deno 在解析 NPM 包时遇到的问题。尽管这些方法可能增加了一些额外的步骤和依赖关系,但它们为我们提供了更广泛的选择,使我们能够在 Deno 中使用更多的第三方库。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670f80d35f5512810264ef8d