使用Angular 7调整webpack配置,自由控制捆绑大小和行为(ag-Grid入门教程)

我叫做Loved。
感谢所有的Qiita贡献者,谢谢你们一直以来的辛勤付出。

太长;不看预备版。

在Angular7中,ng eject命令,该命令在Angular6中可用,已被废弃。
因此,本次将介绍在Angular7中使用Angular-CLI进行开发时的webpack详细配置方法。
通过编辑angular.json并创建webpack扩展配置文件来构建的方式。

目标读者

・如果使用Angular 7的默认构建设置无法满足需求的人,需要调整Angular内部运行的webpack部分的配置。
・由于我们已经准备好了在Angular 7环境下进行初始设置,因此也希望那些打算学习/使用Angular 7(和ag-Grid)的人能够享受到这个过程中。

环境


 >> ng version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 7.3.0
Node: 9.3.0
OS: win32 x64
Angular:
...

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.13.0
@angular-devkit/core         7.3.0
@angular-devkit/schematics   7.3.0
@schematics/angular          7.3.0
@schematics/update           0.13.0
rxjs                         6.3.3
typescript                   3.2.2


尽管Node的版本较旧,但请不要在意。

这次我们将借助ag-grid的教程来介绍步骤。
ag-grid是一个免费的社区版网格模块。
https://www.ag-grid.com/angular-getting-started/

步骤

我们开始吧。
前期准备与之前的教程页面几乎相同。
如果你已经理解得很好,可以跳过准备步骤,没有问题。

准备工作



// インストールとプロジェクトの作成
npm install -g @angular/cli
ng new my-app --style scss --routing false
cd my-app
// ag-gridのインストール
npm install --save ag-grid-community ag-grid-angular

// プロジェクト内 app.module.tsを編集
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { AgGridModule } from 'ag-grid-angular';// ←追加

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule, AgGridModule.withComponents([])],// ←追加
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

// styles.scssを編集
@import "~ag-grid-community/dist/styles/ag-grid.css";
@import "~ag-grid-community/dist/styles/ag-theme-balham.css";

// app.component.ts 編集
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'my-app';

      columnDefs = [
        {headerName: 'Class', field: 'class' },
        {headerName: 'Name', field: 'name' },
        {headerName: 'Power', field: 'power'}
    ];

    rowData = [
        { class: 'Berserker', name: 'Nightingale', power: 35000 },
        { class: 'Assassin', name: 'Carmilla', power: 32000 },
        { class: 'Avenger', name: 'Jeanne alter', power: 72000 }
    ];
}
// app.component.html を以下に置き換え
<ag-grid-angular 
    style="width: 500px; height: 200px;" 
    class="ag-theme-balham"
    [rowData]="rowData" 
    [columnDefs]="columnDefs"
    >
</ag-grid-angular>
// トップページにgridが表示されていればOK。

本题

假设我们想要构建上述创建的Web应用程序。
其中一个要求是“一个捆绑文件的大小应小于1MB”。
现在就运行ng build –prod吧。



>> ng build --prod

Date: 2019-02-07T15:49:28.086Z
Hash: 817914fa2637c6d3b8aa
Time: 66877ms
chunk {0} runtime.a5dd35324ddfd942bef1.js (runtime) 1.41 kB [entry] [rendered]
chunk {1} es2015-polyfills.12eccedba99646c7daca.js (es2015-polyfills) 56.4 kB [initial] [rendered]
chunk {2} main.00849e0d189f184e52e5.js (main) 1.01 MB [initial] [rendered]
chunk {3} polyfills.407a467dedb63cfdd103.js (polyfills) 41 kB [initial] [rendered]
chunk {4} styles.eb752abcca03cc6fe597.css (styles) 115 kB [initial] [rendered]

哎呀哎呀。捆绑后的main.js文件大小超过1MB了…
(为了突出这个问题,我添加了ag-Grid的导入代码。
实际上,我还要导入许多其他供应商的库,所以文件大小会更大呢。)

那么,我们可以使用–vendorChunk选项将业务逻辑和供应商分离。是的,那就试着加上吧!(开低效的戏谑)



>> ng build --prod --vendorChunk

Date: 2019-02-07T15:58:37.946Z
Hash: 63108113a0539a610fb7
Time: 58052ms
chunk {0} runtime.a5dd35324ddfd942bef1.js (runtime) 1.41 kB [entry] [rendered]
chunk {1} es2015-polyfills.12eccedba99646c7daca.js (es2015-polyfills) 56.4 kB [initial] [rendered]
chunk {2} main.dda08de101eb4da8c253.js (main) 6.04 kB [initial] [rendered]
chunk {3} polyfills.407a467dedb63cfdd103.js (polyfills) 41 kB [initial] [rendered]
chunk {4} styles.eb752abcca03cc6fe597.css (styles) 115 kB [initial] [rendered]
chunk {5} vendor.4d52dd9a82dee508d6a2.js (vendor) 1.01 MB [initial] [rendered]

嗯。最終供应商方面超过了1MB。仅仅通过Angular-CLI的设置来解决似乎很困难。因此,让我们尝试一下本次介绍的方法吧。(终于进入正题了…)


// 使用する拡張モジュールをインストール
 npm -D install @angular-builders/custom-webpack
 npm -D install ngx-build-plus //←1行目のモジュールだけで動かなかったら入れてみて下さい
 npm -D install webpack //←上に同じ。

// angular.json を編集
     //"builder": "@angular-devkit/build-angular:browser",
          "builder": "@angular-builders/custom-webpack:browser", //←に変更
          "options": {
            "customWebpackConfig": {//←追加
              "path": "./extra-webpack.config.js"//←追加
            }, //←追加
            "outputPath": "dist/my-app",
            "index": "src/index.html",
            "main": "src/main.ts",
       //....
// 上で指定した場所(今回ならangular.jsonと同階層)にextra-webpack.config.jsを作成し、
// 追加のwebpack詳細設定を記載する。
// 記載した部分のみがangularのbuilderに追加で反映される
// 今回はmaxSizeを1MB未満にすることでチャンクファイルのサイズ上限を調整した。
const webpack = require('webpack');

module.exports = {
    output: {
        filename: "[name].js" // name of the generated bundle
    },
    optimization: {
        splitChunks: {
            chunks: 'async',
            minSize: 50000,
            maxSize: 900000,
            minChunks: 1,
            maxAsyncRequests: 5,
            maxInitialRequests: 3,
            automaticNameDelimiter: '.',
            name: true,
            cacheGroups: {
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    priority: -10
                },
                default: {
                    minChunks: 2,
                    priority: -20,
                    reuseExistingChunk: true
                }
            }
        }
    }
};

好啊,我们重新构建吧。



>> ng build --prod

Date: 2019-02-07T17:06:48.049Z
Hash: bbabf25c9a51d613d39a
Time: 41291ms
chunk {0} runtime.js (runtime) 1.41 kB [entry] [rendered]
chunk {1} es2015-polyfills.d0ae3f07.js (es2015-polyfills.d0ae3f07) 56.4 kB [initial] [rendered]
chunk {2} main.31ecd969.js (main.31ecd969) 29.7 kB [initial] [rendered]
chunk {3} main.54813583.js (main.54813583) 278 kB [initial] [rendered]
chunk {4} main.65932fe3.js (main.65932fe3) 33.8 kB [initial] [rendered]
chunk {5} main.88436b06.js (main.88436b06) 191 kB [initial] [rendered]
chunk {6} main.8ff27ea1.js (main.8ff27ea1) 238 kB [initial] [rendered]
chunk {7} main.bc2eed23.js (main.bc2eed23) 29.9 kB [initial] [rendered]
chunk {8} main.d0ae3f07.js (main.d0ae3f07) 2.73 kB [initial] [rendered]
chunk {9} main.defd55b6.js (main.defd55b6) 238 kB [initial] [rendered]
chunk {10} polyfills.d0ae3f07.js (polyfills.d0ae3f07) 41 kB [initial] [rendered]
chunk {11} styles.d0ae3f07.eb752abcca03cc6fe597.css, styles.d0ae3f07.js (styles.d0ae3f07) 115 kB [initial] [rendered]

要件已完成!!恭喜恭喜~
当然不仅仅是修改包大小,只要是webpack中可以配置的项,
只需将其填写在之前提到的扩展配置文件中,即可生效。
特别是构建命令没有太大变化,只需使用ng build –prod就可以搞定,非常方便。

总结

安装必要的模块后,只需要编辑适当的配置文件即可。
个人认为相比于ng eject来说,这种方法更容易。
由于Angular的版本升级,相关步骤经常会发生变化,这真的很痛苦。
比如在Angular4中,有些步骤根本没有什么用,这真的很令人失望。

如果能够为Angular 7的日本语文档做出贡献,我会非常高兴。非常感谢您的阅览。

广告
将在 10 秒后关闭
bannerAds