【问题标题】:How to mix Angular Elements with the "ng g library" approach?如何将 Angular Elements 与“ng g library”方法混合使用?
【发布时间】:2019-08-15 23:35:57
【问题描述】:

如您所知,“ng g library”方法可以帮助我们创建可重用组件的库。但是,如果我希望通过 Angular Elements 的支持将这些组件编译成 Web 组件呢?不仅如此,lib 中的每个组件都将被编译到自己的文件夹或 JS 文件中。如何配置可以让我实现这一目标的开发环境?

例如:

如果我创建一个Lib并添加一个自定义组件,我知道我可以编译它,生成一系列文件夹,例如esm5,esm2015,fesm5等。现在,问题是:如何添加,让我们对我的库说 30 个自定义组件,然后当我编译时,它会为每个组件创建一个文件夹,其中包含它们的 Web 组件版本......好像 Angular Elements 遍历了我的组件库并生成了 Web 组件版本他们每个人。

像这样:

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

【问题讨论】:

标签: angular angular-cli ng-packagr angular-elements


【解决方案1】:

ng build 内部使用 webpack 进行构建。所以这个问题实际上分解为两个部分。

  1. 如果没有ng eject,如何利用内部 webpackConfig 并根据我们的需要对其进行自定义。
  2. 此用例所需的 webpackConfig 是什么样的。

对于第 1 部分,有一个解决方案 @angular-builders/custom-webpack。基本上它允许你将一些额外的字段合并到内部 webpackConfig 中,并且仍然使用官方的“@angular-devkit/build-angular:browser”作为构建器。

现在对于第 2 部分,您的用例只是 webpack 中的多入口多输出构建问题。解决方案非常简单。

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'
  }
}
  1. 编辑angular.json中的“architect.build”字段:
{
  // ...
  "architect": {
    "build": {
      "builder": "@angular-builders/custom-webpack:browser",
      "options": {
        "customWebpackConfig": {
          "path": "./webpack.config.js",
        },
        // ...
  1. 运行ng build,应该会看到结果。

为了提前使用,值得一提的是@angular-builders/custom-webpack支持导出webpack config as a function以完全控制最终使用的webpackConfig。

【讨论】:

  • 您好,hackape,谢谢您的回答!我创建了一个新项目并按照您的步骤操作。但是,最终结果不是“Web 组件”。实际上,您的答案中的 Angular Elements 部分并不清楚。换句话说,编译的组件不能在没有 Angular 的网站上用作独立组件。这是 repo,如果你想尝试一下:github.com/fabionolasco/stackoverflow-angular-elements
  • 我对 Angular 不是很有经验,但我在处理 webpack 问题方面经验丰富。你能指出编译结果到底有什么问题吗?
  • 编译结果不是Web Components (W3C)。 Web 组件不需要 Angular 来运行。我们可以反过来说,编译后的结果仍然是 Angular 组件。
  • 从您的示例仓库编译有效 Web 组件的命令是什么?
  • 如果我做对了,“Web 组件”和“Angular 组件”的编译结果是从相同的源代码构建的,所以我假设当前配置中省略了一些 webpack 进程。我希望并排查看它们以找出差异。所以让我们先把输入/输出问题放在一边,请您指导我使用正确的配置/命令以首先生成正确的 Web 组件结果吗?
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2020-10-04
  • 2020-04-05
相关资源
最近更新 更多