将一些 ES 风格的 npm 模块包含到一个主要包含 commonJS 模块的项目中

Include a few ES style npm modules into a project with mostly commonJS modules

我在这个space中浏览了很多问题,但我没有找到明确的答案。

我最近将我项目的许多 npm 依赖项更新到了最新版本。该项目完全围绕 commonJS 构建,它包含的大多数 npm 模块都使用 commonJS。然而,一些(比如 chalk)现在使用 ES 语法。令人惊讶的是,我还没有找到包含这些模块的合理方法。

因为我显然可以使用 import 加载 commonJS 模块我想我可以将所有 require 语句更改为 import,大概必须在少数地方使用动态导入我正在动态使用 require。这是唯一的解决方案吗?必须更改整个结构以支持几个 npm 模块似乎很愚蠢。

在较新版本的 nodejs 中,将 ESM 模块直接导入 CommonJS 模块的方法是使用 import 的动态版本,如:

// import ESM module from CommonJS module
import("chalk").then(m => {
   // use m here
});

这是 CommonJS 模块中允许 import 的一种方式,尽管它可能会使编码和坚持 CommonJS 核心变得更加困难。

这个限制部分是因为 ESM 模块可以在异步操作上使用 top-level await,但是 require() 构建的 CommonJS 模块是一个纯同步模型。因此,在 ESM 模块中允许顶级 await 与纯同步 CommonJS 加载架构不兼容。

动态 import() 是一种异步加载模型,因此它可用于加载 ESM 模块,即使在 CommonJS 模块中也是如此。


随着越来越多的 NPM 模块仅转移到 ESM 接口,开始将项目过渡到 ESM 的迹象似乎已经敲响了。 ESM 功能相当齐全,现在可以在 nodejs 和浏览器中实现。

您可以使用常规 import 从 ESM 模块加载 CommonJS 模块,这样也可以更轻松地迁移到 ESM。