使用{{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 ...}}语句。