Node.js中ES6模块无法正常运行问题求助
我之前也碰到过类似的情况,Node.js v9.x的实验性ES模块特性确实有不少坑,结合Transcrypt生成的代码,咱们可以从这几个方向排查解决:
1. 修正文件扩展名
Node.js v9.10.1的实验性ES模块只认.mjs扩展名的文件,默认Transcrypt生成的可能是.js,这会导致Node把它当成CommonJS模块处理,和你的预期冲突。你可以:
- 把生成的模块文件重命名为
.mjs - 然后用这个命令运行:
node --experimental-modules your-module.mjs
2. 调整import语句的路径格式
早期Node.js实验模块要求import必须带完整的文件扩展名,不能省略。你打开Transcrypt生成的代码看看,比如如果有import {__envir__} from './some-module'这种写法,得改成import {__envir__} from './some-module.mjs'。要是不想手动改,可以看看Transcrypt的编译参数里有没有能自动生成带扩展名import的选项。
3. 处理模块作用域的差异
在ES模块里,顶级作用域不是全局作用域,你代码里的var time = {};这种顶级变量只会在当前模块内有效,不会挂载到global对象上。如果你的代码里有其他地方依赖这个全局的time,就得把它改成模块导出:
export const time = {};
然后在需要用的地方import进来。
4. 考虑版本兼容性
Node.js v9.10.1的ES模块支持还非常初级,bug很多。如果上面的方法都搞不定,要么换个Transcrypt兼容的Node.js版本,要么升级到Node.js 12及以上版本——这时候ES模块已经稳定很多,适配起来会更省心。
5. 确认Transcrypt的编译配置
你用的是Transcrypt的modules分支,得确保编译时启用了正确的ES6模块生成选项。比如编译命令里加上--es6或者对应的参数,让它生成符合Node.js实验模块要求的代码。可以看看Transcrypt本地的分支文档,确认配置没出错。
内容的提问来源于stack exchange,提问作者Jacques de Hooge

