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

Angular 警告:没有为外部模块提供名称';X';在output.globals–;猜测';X';,angular,rollupjs,ng-packagr,umd,Angular,Rollupjs,Ng Packagr,Umd,当我尝试将我的库绑定到通用模块定义时,我收到此消息。可以通过在ng-package.json中添加UMDModuleId来修复该警告 该报告给了我们以下解释: 在编写UMD包时,ng packagr会尽力提供 UMD模块标识符的通用默认值。还有,汇总 将尽力猜测外部依赖项的模块ID。 即使如此,您也应该确保 外部依赖项是正确的。如果ng Packager不提供 默认值和汇总无法猜测正确的标识符,请 应使用UMDModuleId显式提供模块标识符 在库的包文件部分,如下所示: UMDModuleI

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

该报告给了我们以下解释:

在编写UMD包时,ng packagr会尽力提供 UMD模块标识符的通用默认值。还有,汇总 将尽力猜测外部依赖项的模块ID。 即使如此,您也应该确保 外部依赖项是正确的。如果ng Packager不提供 默认值和汇总无法猜测正确的标识符,请 应使用UMDModuleId显式提供模块标识符 在库的包文件部分,如下所示:

UMDModuleId

外部依赖关系及其对应UMD模块的映射 标识符。映射键是TypeScript/EcmaScript模块标识符。 映射值是UMD模块ID。这张地图的目的是正确地 捆绑一个UMD模块文件(使用
汇总
)。默认情况下,
rxjs
tslib
并且支持
@angular/*
依赖项符号


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

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

我所说的导入名称是指,在您的typescript代码中:

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'
字符串
moment
应该是
umdModuleIds
下的键

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

/!矩.js
;(功能(全球、工厂){
typeof exports==='object'&&typeof module!=='undefined'?module.exports=factory():
typeof define==“函数”&&define.amd?定义(工厂):
global.moment=factory()
}(这个,(函数(){'use strict';
global.moment=…
为您提供了所需内容。因此,要正确导入moment,您的
ng package.json
应该包括:

import * as moment from 'moment';
在本例中,ng packagr的猜测是正确的—导入名称与UMD全局变量匹配,但您需要显式指定它,以便ng packagr能够确定

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

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

文件:~/dist/util/bundles/mycompany util.umd.js

(功能(全局,工厂){
导出类型==“对象”&&typeof模块!==“未定义”?工厂(导出):
typeof define=='function'&&define.amd?define('@mycompany/util',['exports',factory):
(global=global | | self,factory((global.mycompany=global.mycompany |{},global.mycompany.util={}));
}(此功能(导出){‘严格使用’;
因此,给定行
global.mycompany.util=
,您需要指定UMD模块ID,如下所示:

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

谢谢。您能介绍一下这样一种情况吗?我试过
“@mycompany/product name/ui module name”
”@mycompany/product name/ui module name:“mycompany['product-name']['ui-module-name']无效,警告是,
output.globals中没有为外部模块“@mycompany/product name/ui module name”提供名称–猜测“uiModuleName”
您是否尝试查看@mycompany/product name/ui module name umd.js文件的前几行?您只需要匹配dependee库的ng包中的名称即可e、 json。我做了,但不幸的是,正如我发布的
“mycompany['product-name']['ui-module-name']”
一样,这相当于
mycompany.product-name.ui-module-name
——试试看。不幸的是,这也没什么用。它猜测
uiModuleName
,但我尝试过的东西到目前为止都不起作用
    "umdModuleIds": {
      "@mycompany/util": "mycompany.util"
      ...
    }