警告:在 output.globals 中没有为外部模块“X”提供名称——猜测是“X”

ROM*_*MAN 10 umd rollupjs angular ng-packagr

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'
Run Code Online (Sandbox Code Playgroud)

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

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

在编写 UMD 包时,ng-packagr 尽最大努力为 UMD 模块标识符提供通用默认值。此外, rollup 将尽最大努力猜测外部依赖项的模块 ID。即使这样,您也应该确保外部依赖项的 UMD 模块标识符是正确的。如果 ng-packagr 不提供默认值并且 rollup 无法猜测正确的标识符,您应该通过在库的包文件部分中使用 umdModuleIds 来明确提供模块标识符,如下所示:...

umdModuleIds

外部依赖关系及其对应的 UMD 模块标识符的映射。Map 键是 TypeScript / EcmaScript 模块标识符。映射值是 UMD 模块 ID。此映射的目的是正确捆绑 UMD 模块文件(带有rollup)。默认情况下,支持rxjs,tslib@angular/*依赖项符号。

如何查找或检查必须添加到 umdModuleIds 的 moment、odata-parser 或任何其他模块的 UMD ID 的正确性?

cri*_*mbo 17

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

通过导入名称,我的意思是,在您的打字稿代码中:

import * as moment from 'moment';
Run Code Online (Sandbox Code Playgroud)

字符串moment应该是 下的键umdModuleIds

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

import * as moment from 'moment';
Run Code Online (Sandbox Code Playgroud)

这条线global.moment = ...给你你需要的东西。因此,要正确导入时刻,您ng-package.json应该包括:

  "lib": {
    "entryFile": "src/public-api.ts",
    "umdModuleIds": {
      "moment": "moment"
    }
  }
Run Code Online (Sandbox Code Playgroud)

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

应该有另一种(更好的)方法可以为 NPM 依赖项修复此问题,即将库依赖项添加到库package.json文件(与 ng-package.json 文件位于同一目录中的 package.json)。我会先尝试 - 我相信当依赖项包含在 package.json 中时,ng-packagr 会正确地找到 UMD 模块 ID。

但是,如果您使用的是本地库(同一角度工作区中的库)或 ng-packagr 无法分析的库,则有必要查看 UMD id 并确保它们匹配。例如,如果您为内部库使用范围/命名空间名称,例如@mycompany/util,您将看到 UMD 模块 ID 是这样注册的:

File: ~/dist/util/bundles/mycompany-util.umd.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';
Run Code Online (Sandbox Code Playgroud)

因此,给定这一行,global.mycompany.util =您需要指定 UMD 模块 ID,例如:

    "umdModuleIds": {
      "@mycompany/util": "mycompany.util"
      ...
    }
Run Code Online (Sandbox Code Playgroud)