6

我正在尝试将我的项目设置为使用汇总,作为 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 食谱指南?

4

3 回答 3

11

您需要将该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' ]
  }
})
于 2016-10-10T12:20:23.933 回答
1

我终于在我的系统上解决了这个问题。

命名的导出解决方案是错误的,因为 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”文件并调试“transform”函数来确认。

如果您修改代码(在转换函数的最开始)是这样的

if (id.includes('rxjs\\Subject.js')) {
        debugger;
}

然后在调试器中运行代码,您可以单步执行代码,直到它到达过滤器函数。在那里你会看到过滤功能正在跳过“rxjs/Subject.js”文件。

我几乎可以保证这是发生错误时的问题。

于 2017-04-06T21:35:26.420 回答
0

我发现这可以与符号链接结合使用。

于 2017-07-14T19:44:19.493 回答