Better

Ethan的博客,欢迎访问交流

rollup.config 中使用 cjs 模块

rollup 配置文件推荐使用 esm 的方式,意味你不能使用 module.exports 语法,那如果我要导入一个 cjs 模块包用呢。

背景

rollup 默认期望配置文是 esm 格式,并在需要它们之前将它们和它们的相对导入打包和编译到 cjs。这是一个快速的过程,其优点是很容易在配置和 es 模块代码库之间共享代码。如果你想用 cjs 来编写你的配置,你可以使用 .cjs 扩展名来跳过这个过程。

但这里存在一个可能是,我可能想要复用一些 cjs 模块的代码,因为就配置文件而言,cjs 的语法更常见。

现象

举个例子 slash@3.0 版本的代码,使用的 cjs 语法,直接在 rollup.config 通过 import 导入是 ok,但我自己把源码拉下来,直接新建 slash.cjs 模块,通过路径导入使用,却报很神奇的错误。首先你需要了解 rollup 会将参数解析为 command 对象,格式为 { _: [], c: true, config: true }

  • 如果 cjs 默认导出一个函数,则该函数会被调用一遍,调用参数为 command 对象,amazing!!!
  • 如果你使用 cjs 导出对象,则直接会报错,提示没有 default 导出,如果不使用,则会提示 rollup 配置不对,没有提供 options.input
  • 总结:现象是这么个现象,本也想搞懂,但在 rollup 源码里调试了半天后,我决定放弃了,大致得到的结论为,该配置不是直接交给 node 执行的,rollup 好像有个编译器,会对配置文件进行词法/语法分析,所以具体魔法,咱不清楚

esm and cjs in node.js

重复一遍 node.js 对于 esm 和 cjs 的判定逻辑

  • 模块加载:nodejs 支持两种模块加载器,cjs-loader 和 esm-loader,esm 仍然可以导入 cjs 包,但 cjs 包不能同步导入 esm 包
  • 模块检测:如果 package.json 中 type 没有设置或设置为 commonjs,则 js 文件只能使用 cjs 语法,只有显示设置为 module,才能使用 esm 语法。但你可以通过创建 cjs 或 mjs 后缀文件,强行使用对应语法


留言