Angular 2 - 为 JIT 和 AoT 导入外部库
Angular 2 - Import external libraries for both JIT and AoT
我正在尝试将我的代码库配置为能够执行 JiT 和 AoT,以便我可以将 JiT 用于本地开发,将 AoT 用于生产。我遵循 angular documentation here 并成功地让两者单独工作。
我遇到的问题是当我尝试导入外部库时,特别是 moment-js。
对于 JiT,我使用的是 SystemJS,其配置是
// systemjs.config.js
System.config({
map: {
// ...
moment: '/node_modules/moment',
},
packages: {
// ...
moment: {
defaultExtension: 'js'
}
}
});
然后在打字稿中导入一个组件,我可以这样做
// some-component.component.ts
import * as moment from 'moment/moment';
这对本地开发来说效果很好。
然而,当我尝试使用汇总进行 AoT 编译时,出现 Cannot call a namespace ('moment')
编译错误。我在 之后解决了这个问题,所以在对汇总配置进行一些更改后,组件中的导入语句应该是
// some-component.component.ts
import moment from 'moment';
这对 AoT 和汇总非常有效,但现在 SystemJS 无法理解它。
我似乎无法摆脱循环。我可以让一个人工作,但不能同时让两个人工作。有没有办法让 SystemJS 理解汇总所需的导入语句?我认为反过来是不可能的。
编辑:
我确实找到了一种至少可以让它工作的方法,但它并不十分理想。我没有导入它,而是将它声明为 any
,然后使用脚本标记从外部加载到库中。所以现在组件是
// some-component.component.ts
declare const moment: any;
正如我所说,这并不理想,因为这不允许我将 moment 与 AoT 构建捆绑在一起,并且它还强制打字稿将 'moment' var 解释为 any
所以现在它不知道它的类型。所以这仍然不能完全回答我的问题,但这至少有效。
继续导入:
import * as moment from 'moment';
并将插件添加到 rollup.js:
{
name: 'replace moment imports',
transform: code => ({
code: code.replace(/import\s*\*\s*as\s*moment/g, 'import moment'),
map: { mappings: '' }
})
},
对于那些不想添加自定义 rollup.js 插件或正在使用 ng-packagr
之类的打包工具的人,请考虑将您的导入语句替换为以下解决方案:
import * as momentImported from 'moment';
const moment = momentImported;
此解决方案最初由以下 Github 问题提供:
https://github.com/dherges/ng-packagr/issues/217#issuecomment-339460255
我正在尝试将我的代码库配置为能够执行 JiT 和 AoT,以便我可以将 JiT 用于本地开发,将 AoT 用于生产。我遵循 angular documentation here 并成功地让两者单独工作。
我遇到的问题是当我尝试导入外部库时,特别是 moment-js。
对于 JiT,我使用的是 SystemJS,其配置是
// systemjs.config.js
System.config({
map: {
// ...
moment: '/node_modules/moment',
},
packages: {
// ...
moment: {
defaultExtension: 'js'
}
}
});
然后在打字稿中导入一个组件,我可以这样做
// some-component.component.ts
import * as moment from 'moment/moment';
这对本地开发来说效果很好。
然而,当我尝试使用汇总进行 AoT 编译时,出现 Cannot call a namespace ('moment')
编译错误。我在
// some-component.component.ts
import moment from 'moment';
这对 AoT 和汇总非常有效,但现在 SystemJS 无法理解它。
我似乎无法摆脱循环。我可以让一个人工作,但不能同时让两个人工作。有没有办法让 SystemJS 理解汇总所需的导入语句?我认为反过来是不可能的。
编辑:
我确实找到了一种至少可以让它工作的方法,但它并不十分理想。我没有导入它,而是将它声明为 any
,然后使用脚本标记从外部加载到库中。所以现在组件是
// some-component.component.ts
declare const moment: any;
正如我所说,这并不理想,因为这不允许我将 moment 与 AoT 构建捆绑在一起,并且它还强制打字稿将 'moment' var 解释为 any
所以现在它不知道它的类型。所以这仍然不能完全回答我的问题,但这至少有效。
继续导入:
import * as moment from 'moment';
并将插件添加到 rollup.js:
{
name: 'replace moment imports',
transform: code => ({
code: code.replace(/import\s*\*\s*as\s*moment/g, 'import moment'),
map: { mappings: '' }
})
},
对于那些不想添加自定义 rollup.js 插件或正在使用 ng-packagr
之类的打包工具的人,请考虑将您的导入语句替换为以下解决方案:
import * as momentImported from 'moment';
const moment = momentImported;
此解决方案最初由以下 Github 问题提供:
https://github.com/dherges/ng-packagr/issues/217#issuecomment-339460255