ВНИМАНИЕ: Не было задано имя для внешнего модуля 'X' в output.globals - угадывание 'X' - PullRequest
1 голос
/ 24 апреля 2020
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'

Я получаю это сообщение, когда пытаюсь связать свою библиотеку с универсальным определением модуля. Предупреждение можно исправить, добавив umdModuleIds в пакет ng. json.

Документация дает нам следующее объяснение:

При написании UMD bundle, ng-packagr делает все возможное, чтобы предоставить общие значения по умолчанию для идентификаторов модуля UMD. Кроме того, накопительный пакет сделает все возможное, чтобы угадать идентификатор модуля внешней зависимости. Даже тогда, , вы должны убедиться, что идентификаторы модулей UMD внешних зависимостей являются правильными . Если ng-packagr не предоставляет значение по умолчанию и накопительный пакет не может угадать правильный идентификатор, вы должны явно указать идентификатор модуля, используя umdModuleIds в разделе файла пакета библиотеки, например: ...

umdModuleIds:

Карта внешних зависимостей и соответствующих им идентификаторов модуля UMD. Ключи карты являются идентификаторами модуля TypeScript / EcmaScript. Значения карты - это идентификаторы модуля UMD. Цель этой карты - правильно связать файл модуля UMD (с rollup). По умолчанию поддерживаются символы зависимостей rxjs, tslib и @angular/*.

Как найти или проверить правильность UMD-идентификатора момента, анализатора одат или любого другого модуля, который должны быть добавлены в umdModuleIds?

1 Ответ

1 голос
/ 26 апреля 2020

Мне также было трудно понять документы. Параметр ng-packagr umdModuleIds в ng-package.json представляет собой сопоставление имен импорта с идентификаторами модулей, которые UMD регистрирует в объекте javascript global.

Под именем импорта, я имею в виду, в вашем коде машинописи :

import * as moment from 'moment';

Строка moment должна быть ключом в umdModuleIds.

Значение должно совпадать с глобальной переменной, зарегистрированной в пакете UMD для пакета. Если вы посмотрите на импортируемый файл 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 зависимостей, а именно добавить библиотечные зависимости в библиотеку * Файл 1026 * (пакет. json в том же каталоге, что и файл ng-package. json). Сначала я попробовал бы - я считаю, что ng-packagr правильно находит идентификаторы модуля UMD, когда зависимость включена в пакет. json.

Однако, в случае, если вы используете локальные библиотеки (библиотеки в том же рабочем пространстве angular) или библиотеках, которые иначе не могут быть проанализированы с помощью ng-packagr, необходимо взглянуть на идентификаторы UMD и убедиться, что они совпадают. Например, если вы используете имена областей / областей имен для своих внутренних библиотек, например @mycompany/util, вы увидите, что идентификаторы модулей UMD зарегистрированы следующим образом:

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, например:

    "umdModuleIds": {
      "@mycompany/util": "mycompany.util"
      ...
    }
...