我正在尝试将我的项目设置为使用汇总,作为angular2移动到AOT编译的一部分,但是,我遇到了以下问题。
错误:'主题'不是由node_modules \ rxjs \ Subject.js
导出的
这是我的 rollup.js 文件:
import rollup from 'rollup';
import nodeResolve from 'rollup-plugin-node-resolve'
import commonjs from 'rollup-plugin-commonjs';
import uglify from 'rollup-plugin-uglify'
export default {
entry: 'client/main.js',
dest: 'public/assets/js/build.js',
sourceMap: false,
format: 'iife',
plugins: [
nodeResolve({jsnext: true, module: true}),
commonjs({
include: 'node_modules/rxjs/**',
include: 'node_modules/angular2-jwt/**',
}),
uglify()
]
}
为什么会这样,我跟着angular2食谱指南?
答案 0 :(得分:9)
您需要将namedExports
选项与rollup-plugin-commonjs一起使用:https://github.com/rollup/rollup-plugin-commonjs#custom-named-exports。
此外,您可能会发现它对include: 'node_modules/**'
而不是单个包很有用,否则依赖项的任何依赖都会绕过插件(在上面的配置中,您有重复的include
属性 - 也许这就是只是一个错字?如果您需要传递多个值,请使用数组)。
commonjs({
include: 'node_modules/**',
namedExports: {
'node_modules/rxjs/Subject.js': [ 'Subject' ]
}
})
答案 1 :(得分:0)
我终于在我的系统上找到了这个。
指定的导出解决方案是错误的,因为rollup-plugin-commonjs会处理Subject.js中的导出。
我的问题是"包括" rollup-plugin-commonjs中的选项。
有两个问题。
第一:在选项中指定包含为" node_modules / rxjs / **"你必须确保完整的路径可以解决到你期望的目的。
示例:
我从" c:/ foo / build"运行我的构建命令但我的文件在" c:/ my-source"那么包含模式可能会解析为" c:/ build / node_modules"这意味着当commonjs插件检查它是否应该处理" node_modules / rxjs / "它会看到" c:/ my-source / node_modules / rxjs / "不匹配" c:/ build / node_modules / rxjs / **"因此它不会将出口转换为ES6。
第二个问题是区分大小写。包含模式区分大小写。这也使我绊倒了。
这两个问题都可以通过打开" node_modules \ rollup-plugin-commonjs \ dist \ rollup-plugin-commonjs.cjs.js"来确认。文件和调试"转换"功能
如果修改代码(在转换函数的最开头)就是这样的
if (id.includes('rxjs\\Subject.js')) {
debugger;
}
然后在调试器中运行代码,您可以逐步执行代码,直到它到达过滤器函数。在那里你会看到过滤器功能正在跳过" rxjs / Subject.js"文件。
我几乎保证在发生错误时这就是问题。
答案 2 :(得分:0)
我发现这可以与符号链接一起发生。