Angular/Webpack 청크 크기 제한

5293 단어
여러분 안녕하세요,

나는 Angular 생태계에 꽤 익숙합니다.
Sentry 서버를 사용하여 애플리케이션에서 발생한 오류를 추적하고 있습니다. 불행히도 내 Angular 11 프로젝트에서 생성된 자바스크립트 청크 파일이 너무 커서 내 설치에서 효율적으로 처리할 수 없습니다.

따라서 예를 들어보다 큰 청크를 생성하지 않도록 Angular 프로젝트를 구성하려고 합니다. Angular 내장 SplitChunksPlugin을 사용하는 200KB.

기본적으로 "customWebpackConfig"에 "optimization" 구조를 추가하면 작동합니다.

불행히도 이것은 내 index.html을 생성할 때 내 CSS 파일과 대부분의 자바스크립트 청크에 대한 참조가 누락된다는 단점이 있습니다.

기본 동작을 중단하지 않고 SplitChunksPlugin을 구성하는 가장 좋은 방법은 무엇입니까?

angular.json

{
    "version": 1,
    "projects": {
        "messenger": {
            "projectType": "application",
            "schematics": {
                "@nrwl/angular:component": {
                    "style": "scss"
                }
            },
            "root": "apps/messenger",
            "sourceRoot": "apps/foo/src",
            "prefix": "foo",
            "architect": {
                "build": {
                    "builder": "@angular-builders/custom-webpack:browser",
                    "options": {
                        "customWebpackConfig": {
                            "path": "./extra-webpack.config.js",
                            "replaceDuplicatePlugins": true
                        },
                        "outputPath": "dist/default",
                        "index": "apps/foo/src/index.html",
                        "main": "apps/foo/src/main.ts",
                        "polyfills": "apps/foo/src/polyfills.ts",
                        "tsConfig": "apps/foo/tsconfig.app.json",
                        "aot": true,
                        "assets": ["apps/foo/src/assets"],
                        "styles": ["apps/foo/src/styles.scss"],
                        "stylePreprocessorOptions": {
                            "includePaths": ["libs/shared/styles/src/lib"]
                        },


extra-webpack.config.js

const { InjectManifest } = require('workbox-webpack-plugin');
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {

   optimization: { 
      splitChunks: {
         chunks: 'all',
         minChunks: 9,
         maxInitialRequests: 19,
         maxAsyncRequests: 29,
         minSize: 99999,
         maxSize: 199999,
         enforceSizeThreshold: 119999,
      }
   },
   plugins: [
      new HtmlWebpackPlugin({
         filename: 'index.html',
         template: 'apps/messenger/src/index.html',
         showErrors: true,
      }), 
      new InjectManifest({
         swSrc: 'dist/service-worker.js',
         swDest: `service-worker.js`,
         compileSrc: false,
         maximumFileSizeToCacheInBytes: 50000000,
      }),
   ]
}


최적화 구성이 있거나 없는 index.html의 차이점은 다음과 같습니다.

$ diff -u index-without-acticated-optimization-config.html index-with-acticated-optimization-config.html |sed '~s,flip-root,foobar-root,g'
--- index-without-acticated-optimization-config.html    2021-05-16 12:48:56.409461873 +0200
+++ index-with-acticated-optimization-config.html   2021-05-16 12:46:35.905790852 +0200
@@ -20,7 +20,7 @@
         <link rel="icon" type="image/png" href="assets/theme/icons/favicons/favicon-96x96.png" sizes="96x96"/>

         <link rel="manifest" href="assets/tenant/manifest.json"/>
-    <link rel="stylesheet" href="styles.c2478474b3fbc37b11ec.css"></head>
+    </head>
     <body>
         <noscript>
             <div
@@ -48,5 +48,5 @@
             </linearGradient>
         </svg>
         <foobar-root> </foobar-root>
-    <script src="runtime-es2015.97090efd50524d776069.js" type="module"></script><script src="runtime-es5.97090efd50524d776069.js" nomodule defer></script><script src="polyfills-es5.23c58b44b91c23781d82.js" nomodule defer></script><script src="polyfills-es2015.bfc0d19950947f9e484a.js" type="module"></script><script src="vendor-es2015.8e1ef0067deec0ee52e2.js" type="module"></script><script src="vendor-es5.8e1ef0067deec0ee52e2.js" nomodule defer></script><script src="main-es2015.4b55af487645d54465f0.js" type="module"></script><script src="main-es5.4b55af487645d54465f0.js" nomodule defer></script></body>
+    <script src="runtime-es2015.739b4eb7c153a88dd0b6.js" type="module"></script><script src="runtime-es5.739b4eb7c153a88dd0b6.js" nomodule defer></script></body>
 </html>

좋은 웹페이지 즐겨찾기