使用{{npm-deps}}指定对包含{{es6}}模块的库的依赖项会在Google Closure中引发错误,使得依赖项无法使用。
h3. 背景
{{rc-time-picker}}作为一组{{es6}}模块在{{es/}}子文件夹中提供,同时还有在{{lib/}}子目录中提供的“传统”{{module.exports}}。{{package.json}}分别将其指定为{{module}}和{{main}}(参见
https://github.com/react-component/time-picker/blob/master/package.json)。
使用此类依赖项与以下类似的npm-deps构建Clojurescript,会导致Google Closure选择{{es6}}部分,并随后抱怨文件混合了{{goog.provide}}和{{es6}}模块
(require '[cljs.build.api :as b])
(b/build ["src/"]
{:main 'my.app
:output-to "js/app.js"
:optimizations :simple
:npm-deps {"react" "16.2.0",
"react-dom" "16.2.0",
"rc-time-picker" "^3.3.1",}
:install-deps true})
在简单的{{app.cljs}}中引入{{"rc-time-picker" :as ...}}会导致编译时出现以下错误
警告:警告 - 文件不能是goog.provide、goog.module和/或ES6模块的组合:.../out/node_modules/rc-time-picker/es/Combobox.js
...
错误:JSC_LANGUAGE_FEATURE。此语言功能仅在ECMASCRIPT6模式或更高版本中受支持:模块。在...out/node_modules/rc-time-picker/es/TimePicker.js行12 :66
...
指定{{:language-in}}和{{:language-out}}并没有帮助。
错误信息是由Clojurescript代码引起的,该代码将{{node_modules/rc-time-picker/es/}}中的代码复制到{{out/node_modules/rc-time-picker}},并在文件的顶部添加各种{{goog.provide}}语句,文件的结尾是一个{{export default ...}}语句。