我正在尝试配置我的代码库,以便能够同时执行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'
}
}
});
然后在typescript中导入一个组件,我就可以了
// some-component.component.ts
import * as moment from 'moment/moment';
这适用于本地开发。
当我尝试使用汇总进行AoT编译时,我得到了Cannot call a namespace ('moment')
编译错误。我在this thread here之后解决了这个问题,所以在对rollup配置进行一些更改之后,组件中的import语句应该是
// some-component.component.ts
import moment from 'moment';
这适用于AoT和汇总,但现在SystemJS有一个问题需要理解。
我似乎无法摆脱循环。我可以让一个工作,但不能同时工作。有没有办法让SystemJS理解汇总所需的import语句?我认为不可能反过来。
编辑:
我确实找到了一种至少让它起作用的方法,但它并不完全理想。我只是将它声明为any
而不是导入它,然后使用脚本标记在外部加载库。所以现在组件是
// some-component.component.ts
declare const moment: any;
正如我所说,这并不理想,因为这不允许我将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语句替换为以下解决方案:
import * as momentImported from 'moment';
const moment = momentImported;
此解决方案最初由以下Github问题提供: https://github.com/dherges/ng-packagr/issues/217#issuecomment-339460255