Как смешать Angular Elements с подходом «ng g library»? - PullRequest
19 голосов
/ 25 марта 2019

Как вы знаете, подход "ng g library" помогает нам создавать библиотеки повторно используемых компонентов. Но что, если бы я хотел, чтобы эти компоненты были скомпилированы в веб-компоненты ... через поддержку Angular Elements? Не только это, но и то, что каждый компонент из библиотеки должен быть скомпилирован в свою собственную папку или файл JS Как настроить среду разработки, которая позволила бы мне добиться этого?

Например:

Если я создаю Lib и добавляю пользовательский компонент, я знаю, что могу скомпилировать его, сгенерировав ряд папок, таких как esm5, esm2015, fesm5 и т. Д. Теперь возникает вопрос: как я могу добавить, давайте скажем, 30 пользовательских компонентов для моей библиотеки, а затем, когда я скомпилирую, он создаст папку для каждого из них, содержащую их версию веб-компонента ... как будто Angular Elements прошел мою библиотеку компонентов и сгенерировал версию веб-компонента каждый из них.

Как это:

lib/
lib/custom/comp1
lib/custom/comp2
lib/custom/comp3
lib/custom/comp4

Превращается во что-то похожее на:

Dist/
Dist/custom/
Dist/custom/bundle
Dist/custom/esm5
Dist/custom/esm2015
Dist/custom/comp1_web_independend_component_version
Dist/custom/comp2_web_independend_component_version
Dist/custom/comp3_web_independend_component_version
Dist/custom/comp4_web_independend_component_version

Ближайшее решение, которое я нашел, это:

https://medium.com/@rahulsahay19/running-multiple-angular-elements-on-the-same-page-5949dac5523

Я также попросил команду Angular CLI помочь с этим:

https://github.com/angular/angular-cli/issues/13999

1 Ответ

2 голосов
/ 03 апреля 2019

ng build внутренне используйте webpack, чтобы сделать здание.Таким образом, эта проблема фактически разбивается на две части.

  1. Без ng eject, как подключиться к внутреннему webpackConfig и настроить его в соответствии с нашими потребностями.
  2. Как выглядит желаемый webpackConfigдля этого варианта использования.

Для части 1 есть решение @ angular-builders / custom-webpack .По сути, это позволяет вам объединить некоторое дополнительное поле с внутренним webpackConfig и по-прежнему использовать официальный "@ angular-devkit / build-angular: browser" в качестве компоновщика.

Теперь для части 2 ваш вариант использования простопроблема сборки нескольких входов и нескольких выходов в веб-пакете.Решение довольно простое.

const partialWebpackConfig = {
  entry: {
    'custom/comp1': '/path/to/src/lib/custom/comp1.ts',
    'custom/comp2': '/path/to/src/lib/custom/comp2.ts',
  },
  output: {
    path: path.resolve(__dirname, 'Dist'),
    filename: '[name].js'
  }
}

Ниже приведена пошаговая инструкция по настройке этой конфигурации.

  1. npm install @angular-builders/custom-webpack
  2. создайте webpack.config.js в корне вашего проекта:
const path = require('path');
module.exports = {
  entry: {
    'custom/comp1': path.resolve(__dirname, 'src/lib/custom/comp1.ts'),
    'custom/comp2': path.resolve(__dirname, 'src/lib/custom/comp2.ts')
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
  }
}
редактировать поле "architect.build" в angular.json:
{
  // ...
  "architect": {
    "build": {
      "builder": "@angular-builders/custom-webpack:browser",
      "options": {
        "customWebpackConfig": {
          "path": "./webpack.config.js",
        },
        // ...
запустите ng build, должен увидеть результат.

Для расширенного использования стоит отметить, что @angular-builders/custom-webpack поддерживает экспорт конфигурации webpack как функции для получения полного контроляокончательного использованного webpackConfig.

...