我也觉得这些文档很难理解。在ng-package.json
中,ng-packagr的umdModuleIds
设置是将导入名称映射到UMD在javascript global
对象中注册的模块ID。
所谓导入名称,是指在你的typescript代码中:
import * as moment from 'moment';
字符串moment
应该是umdModuleIds
下的关键字。
值应该与包的UMD捆绑中注册的全局变量相匹配。如果您查看正在导入的JS文件,您会看到设置global.X
值。对于moment.js,代码块如下:
;(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
global.moment = factory()
}(this, (function () { 'use strict';
这行代码global.moment = ...
会给你所需的。因此,为了正确导入moment,你的ng-package.json
应包含:
"lib": {
"entryFile": "src/public-api.ts",
"umdModuleIds": {
"moment": "moment"
}
}
在这种情况下,ng-packagr的猜测是正确的——导入名称与UMD全局变量匹配,但你需要明确指定它,以便ng-packagr可以确定。
对于NPM依赖项,应该有另一种(更好的)方法来解决这个问题,即将库依赖关系添加到库的package.json
文件中(与ng-package.json文件相同的目录中的package.json)。我建议先尝试这种方法-我相信当依赖项包含在package.json中时,ng-packagr会正确地找到UMD模块ID。
然而,在使用本地库(与angular工作区相同的库)或其他无法被ng-packagr分析的库的情况下,有必要查看UMD ID并确保它们匹配。例如,如果您为内部库使用作用域/命名空间名称,如@mycompany/util
,则会发现UMD模块ID注册如下:
文件:~/dist/util/bundles/mycompany-util.umd.js
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define('@mycompany/util', ['exports'], factory) :
(global = global || self, factory((global.mycompany = global.mycompany || {}, global.mycompany.util = {})));
}(this, (function (exports) { 'use strict';
因此,鉴于该行代码 global.mycompany.util =
,您需要指定UMD模块ID,例如:
"umdModuleIds": {
"@mycompany/util": "mycompany.util"
...
}
@mycompany/product-name/ui-module-name
这样的情况该怎么处理呢?我试过用"@mycompany/product-name/ui-module-name": "mycompany['product-name']['ui-module-name']"
来解析,但是似乎不行,并且提示信息为No name was provided for external module '@mycompany/product-name/ui-module-name' in output.globals – guessing 'uiModuleName'
。 - GarethASuiModuleName
,但迄今为止我尝试过的一切都没有起作用。 - GarethASumdModuleIds
,因此我认为我们不应再使用它。 - Raphaël Balet