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 后缀文件,强行使用对应语法