Пакет 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, веб-пакет будет просто беспрепятственно связывать весь пакет.

Вы пытаетесь ng serve --prod или ng build --prod?

Другие вопросы по тегам