警告:在 output.globals 中没有为外部模块'X'提供名称 – 猜测'X'


WARNING: No name was provided for external module 'moment' in output.globals – guessing 'momentImported'
WARNING: No name was provided for external module 'odata-parser' in output.globals – guessing 'parser'

当我尝试将库绑定到通用模块定义时,我会收到此消息。可以通过在ng-package.json.中添加umdModuleId来修复该警告

文件为我们提供了以下解释:

在编写UMD捆绑包时,ng packagegr会尽力提供UMD模块标识符的公共默认值。此外,汇总将尽力猜测外部依赖项的模块ID。即便如此,您也应该确保外部依赖项是正确的。万一ng-packager不提供默认和汇总无法猜测正确的标识符,您应使用umdModuleId显式提供模块标识符在库的包文件部分,如下所示:。。。

umdModuleIds:

外部依赖关系及其对应UMD模块的映射标识符。映射键是TypeScript/EcmaScript模块标识符。映射值是UMD模块ID。这张地图的目的是捆绑UMD模块文件(与rollup(。默认情况下,rxjstslib并且支持CCD_ 5依赖符号。

如何查找或检查必须添加到umdModuleId的moment、odata解析器或任何其他模块的UMD ID的正确性?

我发现文档也很难理解。ng-package.json中的ng-packagerumdModuleIds设置是将导入名称映射到UMD在javascriptglobal对象中注册的模块ID。

我所说的导入名称是指,在你的打字脚本代码中:

import * as moment from 'moment';

字符串moment应该是umdModuleIds下的键。

该值应与包的UMD捆绑包中注册的全局变量匹配。如果您查看正在导入的JS文件,您将看到正在设置的global.X值。对于moment.js,代码块为:

//! 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 = ...为您提供所需。因此,为了正确导入时刻,您的ng-package.json应该包括:

"lib": {
"entryFile": "src/public-api.ts",
"umdModuleIds": {
"moment": "moment"
}
}

在这种情况下,ng-packager的猜测是正确的——导入名称与UMD全局变量匹配,但您需要明确指定它,以便ng-package能够确定。

对于NPM依赖项,应该有另一种(也是更好的(方法可以解决这个问题,那就是将库依赖项添加到库package.json文件中(package.json与ng-package.json文件位于同一目录中(。我会先尝试一下——我相信当依赖项包含在package.json.中时,ng-packager会正确地找到UMD模块ID

然而,如果您使用的是本地库(位于同一角度工作区中的库(,或者ng packagegr无法分析的库,则有必要查看UMD ID并确保它们匹配。例如,如果您为内部库使用作用域/名称空间名称,如@mycompany/util,您将看到UMD模块ID注册如下:

File: ~/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"
...
}

最新更新