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

问题描述 投票:1回答:1
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中添加umdModuleIds来解决这个警告。

列表中的 文件 给了我们如下解释。

在编写UMD bundle时,ng-packagr会尽力为UMD模块标识符提供通用的默认值。同时,rollup会尽力猜测外部依赖的模块ID。 即便如此。您应该确保外部依赖的UMD模块标识符是正确的。. 如果ng-packagr没有提供一个默认值,rollup无法猜测正确的标识符,你应该在库的包文件部分使用umdModuleIds显式地提供模块标识符,就像这样。...

umdModuleIds:

外部依赖关系和它们对应的UMD模块标识符的映射。映射键是TypeScript EcmaScript模块标识符。 映射值是UMD模块的id。这个映射的目的是正确地捆绑一个UMD模块文件(与 rollup). 默认情况下。rxjs, tslib@angular/* 支持依赖符号。

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

angular rollupjs ng-packagr umd
1个回答
2
投票

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

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

import * as moment from 'moment';

字符串 moment 钥匙 umdModuleIds.

这个值应该与包的UMD bundle中注册的全局变量相匹配。如果你看一下你正在导入的JS文件,你会看到下面的 global.X 的值进行设置。对于 瞬间.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-packagr的猜测是正确的--导入名称与UMD全局变量相匹配,但你需要明确地指定它,ng-packagr才能确定。

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

但是,如果你使用的是本地库(在同一个angular工作区的库),或者是不能被ng-packagr分析的库,那么就需要查看UMD的id,确保它们匹配。例如,如果你的内部库使用了scopednamespaced的名字,比如说 @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"
      ...
    }
© www.soinside.com 2019 - 2024. All rights reserved.