Как создать библиотеку angular2, которая будет поддерживаться всеми загрузчиками скриптов

Как я могу создать файл javascript, содержащий модуль Angular 2, который может использоваться другими приложениями, но загружается во время выполнения непосредственно с централизованного сервера и НЕ связан с кодом конкретного приложения?

Думайте об этом как о CDN для библиотеки Angular 2. Требование состоит в том, чтобы потребители этой библиотеки включали один скрипт на свою страницу.

Это требование реализовать его таким образом, поэтому меня не интересуют какие-либо ответы, которые предлагают объединить библиотеку в выходные файлы отдельного приложения. Сценарий библиотеки должен быть загружен непосредственно с сервера библиотеки во время выполнения.

  • Централизованное веб-приложение называется CustomAuth.
  • CustomAuth имеет один модуль Angular 2 под названием CustomAuthModule.
  • CustomAuthModule предоставляет несколько сервисов и компонентов, которые могут использоваться внешними приложениями Angular 2.

Вот желаемый рабочий процесс (с высокого уровня).

  • Разработчик хочет использовать CustomAuth в своем приложении Angular2 под названием BookLibrary.
  • На главной странице разработчика они добавляют скрипт, который указывает на http://server-url/CustomAuth/script. Потребителю не нужно ничего знать о загрузчиках модулей, таких как systemjs или webpack.
  • В своем коде angular2 они импортируют данные из модуля CustomAuth (сервисы, компоненты и т. д.).
  • Когда они компилируют свое приложение с использованием angular-cli, оно не будет включать код CustomAuth, а вместо этого будет предполагать, что оно будет загружено на лету во время выполнения.

Я провел много исследований по этому поводу, и мне не повезло понять это. Любая помощь будет принята с благодарностью.


person TwitchBronBron    schedule 16.12.2016    source источник
comment
Я думаю, вы можете создать полифил js для своего модуля, например, в примере с plunker мы включаем угловой 2 полифил /w2FVfKlWP72pzXIsfsCU. таким образом, он позволит пользователю импортировать файл js, который пользователь может импортировать в свой index.html и использовать его модуль.   -  person Vinay Pandya    schedule 18.01.2017


Ответы (1)


Вы можете добиться этого с помощью ES6 + Angular2 + Webpack.

Прежде чем углубиться в это, позвольте мне объяснить, что такое umd модульная система.

Шаблон UMD обычно пытается обеспечить совместимость с самыми популярными загрузчиками скриптов дня (например, RequireJS среди прочих).

Как указано выше, UMD — это шаблон, в котором библиотеки, созданные с помощью этого шаблона, будут поддерживать все загрузчики модулей/скриптов, такие как requirejs, webpack, browserify, systemjs и т. д. То есть библиотеки, соответствующие шаблону UMD, будут распознаваться всеми основными модульными системами. (AMD, CommonJS, ES6 и Vanilla JS).

Так работают все библиотеки в CDN.

Теперь даже вы должны следовать тому же шаблону, т.е. UMD. Поскольку ваша библиотека находится на angular2, я бы посоветовал вам использовать ES6, Angular2 и Webpack.

Вы должны установить эти конфиги, чтобы получить библиотеку в формате UMD, чтобы ее могли использовать любые загрузчики скриптов.

output: {
    path: __dirname + '/lib', // path to output
    filename: outputFile, // library file name
    library: libraryName, // library name
    libraryTarget: 'umd', // the umd format
    umdNamedDefine: true // setting this to true will name the AMD module
  },

Как только ваш выходной пакет webpack будет готов (модуль umd), любой пользователь может внедрить вашу библиотеку на страницу индекса и начать использовать ваши компоненты angular2 независимо от используемых систем загрузчиков скриптов/модулей.

Есть хороший пример здесь, и он объяснил это здесь

В: Как потребитель нашей библиотеки может включить этот пакет umd в свое приложение Angular 2?

Ответ: Поскольку ваша библиотека будет модулем UMD, пользователь может включить библиотеку на основе системы загрузчика/модуля скриптов, которую он использует в своем приложении.

Например. Ванильный JS:

    <script src="http://example.com/your_lib.js"></script>
    <script>
        // Your_Lib will be available and will attach itself
        // to the global scope.
        var html = Your_Lib.render();
    </script>

Требуется JS (АМД):

    <script src="http://example.com/require.js"></script>
    <script> requirejs config goes here </script>
    <script>
        define(['your_lib', function(Your_Lib) {
             var html = Your_Lib.render();
        }])
    </script>

SystemJS (Общий JS):

var map = {
            '@angular': 'node_modules/@angular',
             ....
            'your_lib': 'example.com/your_lib.js'
        };
        var config = {
            defaultJSExtensions: true,
            map: map,
            packages: packages
        };
        System.config(config);

Затем вы можете импортировать свою библиотеку, как обычно.

Веб-пакет:

В файле index.html

В webpack.config.js

{
    externals: {
        // require("your_lib") is external and available
        //  on the global var Your_Lib
        "your_lib": "Your_Lib"
    }
}

И ваша библиотека будет доступна как Your_Lib в глобальной области видимости.

person Thaadikkaaran    schedule 19.01.2017
comment
Как потребитель нашей библиотеки может включить этот пакет umd в свое приложение Angular 2? - person TwitchBronBron; 23.01.2017
comment
@TwitchBronBron Обновил ответ - person Thaadikkaaran; 01.02.2017
comment
@JaganathanBantheswaran Ницца. Будет ли это работать с angular-cli? - person Chris; 02.02.2017
comment
Я пробовал с angular-cli. Вы могли бы попробовать это и дайте мне знать. - person Thaadikkaaran; 03.02.2017
comment
Похоже, это лучшее доступное решение. Спасибо. - person TwitchBronBron; 23.02.2017