如何在 Google Closure Compiler 中指定 ES6 导入的路径?

问题描述

使用最新版本的 Closure Compiler,无论我如何在 import 语句中指定模块的路径,我似乎都无法加载 ES6 模块。

为了测试这一点,我在同一目录中创建了两个非常简单的文件

defaults.js:

const defaults = {color: "#F44336"}
export {defaults}

test.js:

import {defaults} from 'defaults.js'
console.log(defaults.color)

当我只运行 test.js 而不尝试使用 Closure Compiler 处理它时,它会按预期工作并导入模块。但是尝试编译它会产生错误

test.js:1:0: ERROR - [JSC_JS_MODULE_LOAD_WARNING] Failed to load module "defaults"

这是我使用的命令行:

compiler \
--module_resolution NODE \
--compilation_level ADVANCED \
--language_in ECMASCRIPT_2020 \
--language_out ECMASCRIPT_2020 \
--js test.js

我尝试将 test.js 中模块文件的路径指定为完全限定的绝对路径和各种形式的相对路径,但没有任何效果。我还尝试将模块文件添加为编译器的 --js 选项,但没有骰子。

这看起来很简单,但我也没有通过广泛的谷歌搜索找到解决方案。谁能告诉我我错过了什么?

解决方法

我重新创建了你的文件(注意区别):

defaults.js

const defaults = {color: "#F44336"}
export {defaults}

test.js

import {defaults} from './defaults.js' // relative path!
console.log(defaults.color)

编译

必须--js 指定编译中涉及的所有文件。

$ cc --module_resolution NODE --compilation_level ADVANCED --js defaults.js --js test.js
console.log("#F44336");

cc 只是我的 Closure 编译器副本的别名


附录

我很确定你最大的错误一定是这样的:

import {defaults} from 'defaults.js'

这永远不会将文件加载到磁盘上,而是在您的依赖项中寻找名为 defaults.js 的 NPM 包。