技术栈:rollup: ^3.3.0
我之前也有尝试用过 rollup
,但是我没太注意版本号,就是记得之前在 rollup.config.js
的文件中是可以写 es6
的语法的,但是最近【2022年11月左右】我使用 rollup
的时候遇到一个问题,不能使用 import
语法了
就是这个 SyntaxError: Cannot use import statement outside a module
, 一个很常见的问题,一开始我以为是我写错,后来发现配置文件也没啥问题呀
然后用搜索引擎搜了一下,好像也没看到什么好的解决方案,有人说把 rollup.config.js
改成 rollup.config.mjs
,我尝试过,如果只是单纯的把.js
改成 .mjs
是行不通,我看着也很别扭,我在这个错误里发现了一个配置项。
然后我就去rollup
的官方文档 里搜索这个配置项就找到下面的解释
英文也不是特别好,看个七七八八吧,大概就是使用这个配置项会让rollup
在执行前把我的配置文件中 ES moudule
变成 CommonJS
,哪怕是 resolve
或者 __dirname
引用进来的配置是使用 esmodule
写的,也是可以被转成 CommonJS
的。大概就是这个意思咯,要不要用就看自己的啦,但是不用好像就不能用 import
这类 ESModule
的语法的。 把 package.json
中的 type
配置成 module
也是行不通。
也算是采了个坑了吧,我经常遇到这种,就是安装的模块之前是使用 CommonJS
写的,然后你安装新的版本的时候,他就是 ESModule
的了,然后一使用就报错。
比如写 node
的小伙伴经常会用到的一个库 execa
,在 5.x
的版本里像下面这样使用是完全没问题。相信很多小伙伴还是习惯这样写的
const execa = require('execa')
但是现在不指定版本默认安装的时候,他就是 6.x
的了,然后再这么写就给你报错
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /xxx/node_modules/execa/index.js
要么就用回之前的版本,要么就给项目配置 ESModule
。但是配置 ESModule
的话,遇到一些没有 ESmodule
的库又要用回 CommonJs
的写法,就很杂。现在的技术迭代都非常的快,在使用的时候,还是要稍微注意一下版本更新,遇到各种版本问题也就差不多是一些配置项
或者写法的问题,不要慌,官方文档走起。希望解决了一个问题,能让自己遇到这一类问题会更有信心