Google Closure Compiler是否支持ECMAScript Modules?JSC_INVALID_MODULE_PATH报错
Google Closure Compiler完全支持ECMAScript Modules(ESM),你遇到的报错并非不支持ESM,而是模块解析规则和Node.js内置模块处理的配置问题,以下是具体说明和解决方案:
报错原因分析
默认浏览器解析模式报错
执行google-closure-compiler --js buffer.js --language_in ECMASCRIPT_2019时,Compiler默认使用BROWSER模块解析模式,该模式不识别node:buffer这类Node.js专属的内置模块路径,因此抛出INVALID_MODULE_PATH错误。Node解析模式下的模块加载报错
切换到--module_resolution=NODE后,Compiler会按照Node.js的模块规则尝试查找并加载node:buffer,但由于node:buffer是Node.js内置模块,没有对应的物理文件,Compiler无法找到模块文件,因此抛出JS_MODULE_LOAD_WARNING错误。
而CommonJS能正常编译的原因是:Compiler对CommonJS的require语句默认仅做语法保留,不会主动触发模块解析逻辑,因此不会出现加载失败的问题。
正确启用ESM的配置方案
要让Compiler正确处理ESM(包括Node.js内置模块的ESM导入),需要以下关键配置:
1. 基础ESM启用参数
必须指定以下参数以开启ESM支持:
--language_in ECMASCRIPT_2019(或更高版本,ESM在ES2015及以上支持)--module_resolution=NODE:启用Node.js风格的模块解析规则
2. 处理Node.js内置模块
针对node:buffer这类内置模块,有两种解决方式:
方式一:使用Externs文件声明内置模块
引入Closure Compiler官方提供的Node.js externs文件,通过--externs参数告诉Compiler这些是合法的内置模块:
google-closure-compiler --js buffer.js --language_in ECMASCRIPT_2019 --module_resolution=NODE --externs node.js
方式二:允许未知模块跳过检查
如果不需要对内置模块做类型校验,可使用--allow_unknown_modules参数跳过模块加载检查:
google-closure-compiler --js buffer.js --language_in ECMASCRIPT_2019 --module_resolution=NODE --allow_unknown_modules
3. 指定输出模块格式(可选)
如果希望输出仍为ESM格式,需添加--language_out ECMASCRIPT_2019参数,否则Compiler可能会将代码转为其他格式(比如IIFE):
google-closure-compiler --js buffer.js --language_in ECMASCRIPT_2019 --module_resolution=NODE --allow_unknown_modules --language_out ECMASCRIPT_2019
验证编译结果
使用上述配置后,你的ESM代码buffer.js即可正常编译,Compiler会正确处理import { Buffer } from 'node:buffer'语句。
内容的提问来源于stack exchange,提问作者Nagev

