Пакет NPM не импортируется в угловое производственное приложение
Цель
Я пытаюсь предоставить модуль rxjs для расширения машинного текста в виде пакета npm для использования в проектах Angular.
проблема
Использование пакета в приложении Angular прекрасно работает в режиме локального разработчика, но как только приложение создано для производства, пакет не импортируется в окончательном дистрибутиве.
подробности
В основном дополнения предоставляют новый метод: Observable.safeSubscribe ()
(полный исходный код здесь: ngx-safe-subscribe.ts)import { Observable, Subscription } from 'rxjs'; declare module 'rxjs/internal/Observable' { interface Observable<T> { safeSubscribe: typeof safeSubscribe; } } export function safeSubscribe<T>(...): Subscription { ... } Observable.prototype.safeSubscribe = safeSubscribe;
Пакет собран с помощью ng-packagr
После импорта и использования в проекте Angular все работает нормально:
(полное демо здесь: демо)import { Component, OnDestroy } from '@angular/core'; import { of } from 'rxjs'; import '@badisi/ngx-safe-subscribe'; @Component({ selector: 'my-app', templateUrl: './app.component.html' }) export class AppComponent implements OnDestroy { constructor() { of([]).safeSubscribe(this, () => { console.log('ok'); }); } ngOnDestroy(): void {} }
После сборки для производства пакет не импортируется в окончательный дистрибутив:
ng serve --prod [error in console]: TypeError: Object(...)(...).safeSubscribe is not a function
Мои последние попытки были сделаны со всем последним
angular@7.0.0, typescript@3.1.3, ng-packagr@4.4.0
Кстати, использование именованного стиля импорта в коде Visual Studio приводит к следующему:
import { safeSubscribe } from '@badisi/ngx-safe-subscribe'; [ts] 'safeSubscribe' is declared but its value is never read.
Трудно сказать, связана ли проблема с машинописью, angular-cli, webpack или даже с ng-packagr, не способными распознать расширение и правильно импортировать его в окончательном дистрибутиве.
Так что любая помощь будет очень цениться!
Благодарю.
2 ответа
Сам нашел ответ но не без сложностей..
Быстрый ответ
Добавьте следующее свойство в пакет npm:
package.json {
sideEffects: true
}
объяснение
Проблема была связана с ng-packagr, который устанавливает sideEffects:false в версии dist файла package.json.
Рекомендуется установить Angular Package Format v6 для оптимизации дистрибутива:
"Пакеты, содержащие это свойство со значением false, будут обрабатываться веб-пакетом более агрессивно, чем те, которые этого не делают. Конечным результатом этих оптимизаций должен быть меньший размер пакета и лучшее распределение кода по блокам пакета после разделения кода" [ источник]
При значении false будет объединена только реально используемая часть кода. Однако в моем случае расширение распознается как "объявленное, но никогда не читаемое", поэтому игнорируется в процессе сборки. Если для sideEffects установлено значение true, веб-пакет будет просто беспрепятственно связывать весь пакет.