久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

Angular13+ 開發(fā)模式太慢怎么辦?原因與解決方法介紹

Angular13+ 開發(fā)模式太慢怎么辦?下面本篇文章給大家介紹一下Angular 13+ 開發(fā)模式太慢的原因與構建性能優(yōu)化的方法,希望對大家有所幫助!

Angular13+ 開發(fā)模式太慢怎么辦?原因與解決方法介紹

1 Angular 13+ 開發(fā)模式太慢的原因與解決

近期在某個高頻迭代七年的 Angular 項目升級至 Angular 13 后,其開發(fā)模式的構建速度慢、資源占用高,開發(fā)體驗相當差。在一臺僅在開會時偶爾使用的 Macbook air(近期居家辦公期間轉換為了主要生產力工具) 中啟動構建時,它的風扇會呼呼作響,CPU 負荷被打滿,而在構建完成后,熱更新一次的時間在一分鐘以上。【相關教程推薦:《angular教程》】

在經過各種原因分析與排查后,最終在 angular.json 的 schema(./node_modules/@angular/cli/lib/config/schema.json) 中發(fā)現(xiàn)了問題,再結合 Angular 12 release 文檔定位到了具體原因: Angular 12 一個主要的改動是將 aotbuildOptimizeroptimization 等參數(shù)由默認值 false 改為了 true

A number of browser and server builder options have had their default values changed. The aim of these changes is to reduce the configuration complexity and support the new "production builds by default" initiative.

可以看到 Angular 12 后的默認生產模式,對于跨版本升級來說是比較坑爹的。我們可以從這個提交中了解變動細節(jié):656f8d7

1.1 解決 Angular 12+ 開發(fā)模式慢的問題

解決辦法則是在 development 配置中禁用生產模式相關的配置項。示例:

{   "$schema": "./node_modules/@angular/cli/lib/config/schema.json",   "projects": {     "front": {       "architect": {         "build": {           "configurations": {             "development": {               "tsConfig": "./tsconfig.dev.json",               "aot": false,               "buildOptimizer": false,               "optimization": false,               "extractLicenses": false,               "sourceMap": true,               "vendorChunk": true,               "namedChunks": true             }           }         },     }   },   "defaultProject": "front" }
登錄后復制

需注意 aot 開啟與關閉時,在構建結果表現(xiàn)上可能會有一些差異,需視具體問題而分析。

1.2 問題:開啟 aotpug 編譯報錯

該項目中使用 pug 開發(fā) html 內容。關閉 aot 時構建正常,開啟后則會報錯。

根據(jù)報錯內容及位置進行 debugger 調試,可以看到其編譯結果為一個 esModule 的對象。這是由于使用了 raw-loader,其編譯結果默認為 esModule 模式,禁用 esModule 配置項即可。示例(自定義 webpack 配置可參考下文的 dll 配置相關示例):

{   test: /.pug$/,   use: [     {       loader: 'raw-loader',       options: {         esModule: false,       },     },     {       loader: 'pug-html-loader',       options: {         doctype: 'html',       },     },   ], },
登錄后復制

2 進一步優(yōu)化:Angular 自定義 webpack 配置 dll 支持

該項目項目構建上有自定義 webpack 配置的需求,使用了 @angular-builders/custom-webpack 庫實現(xiàn),但是沒有配置 dll。

Angular 提供了 vendorChunk 參數(shù),開啟它會提取在 package.json 中的依賴等公共資源至獨立 chunk 中,其可以很好的解決熱更新 bundles 過大導致熱更新太慢等的問題,但仍然存在較高的內存占用,而且實際的對比測試中,在存在 webpack5 緩存的情況下,其相比 dll 模式的構建編譯速度以及熱更新速度都稍微慢一些。故對于開發(fā)機器性能一般的情況下,給開發(fā)模式配置 dll 是會帶來一定的收益的。

2.1 Angular 支持自定義 webpack 配置

首先需要配置自定義 webpack 配置的構建支持。執(zhí)行如下命令添加依賴:

npm i -D @angular-builders/custom-webpack
登錄后復制

修改 angluar.json 配置。內容格式參考:

{   "$schema": "./node_modules/@angular/cli/lib/config/schema.json",   "cli": {     "analytics": false,     "cache": {       "path": "node_modules/.cache/ng"     }   },   "version": 1,   "newProjectRoot": "projects",   "projects": {     "front": {       "root": "",       "sourceRoot": "src",       "projectType": "application",       "prefix": "app",       "schematics": {         "@schematics/angular:component": {           "style": "less"         }       },       "architect": {         "build": {           "builder": "@angular-builders/custom-webpack:browser",           "options": {             "customWebpackConfig": {               "path": "./webpack.config.js"             },             "indexTransform": "scripts/index-html-transform.js",             "outputHashing": "media",             "deleteOutputPath": true,             "watch": true,             "sourceMap": false,             "outputPath": "dist/dev",             "index": "src/index.html",             "main": "src/app-main.ts",             "polyfills": "src/polyfills.ts",             "tsConfig": "./tsconfig.app.json",             "baseHref": "./",             "assets": [               "src/assets/",               {                 "glob": "**/*",                 "input": "./node_modules/@ant-design/icons-angular/src/inline-svg/",                 "output": "/assets/"               }             ],             "styles": [               "node_modules/angular-tree-component/dist/angular-tree-component.css",               "src/css/index.less"             ],             "scripts": []           },           "configurations": {             "development": {               "tsConfig": "./tsconfig.dev.json",               "buildOptimizer": false,               "optimization": false,               "aot": false,               "extractLicenses": false,               "sourceMap": true,               "vendorChunk": true,               "namedChunks": true,               "scripts": [                 {                   "inject": true,                   "input": "./dist/dll/dll.js",                   "bundleName": "dll_library"                 }               ]             },             "production": {               "outputPath": "dist/prod",               "baseHref": "./",               "watch": false,               "fileReplacements": [                 {                   "replace": "src/environments/environment.ts",                   "with": "src/environments/environment.prod.ts"                 }               ],               "optimization": {                 "scripts": true,                 "styles": {                   "minify": true,                   "inlineCritical": false                 },                 "fonts": true               },               "outputHashing": "all",               "sourceMap": false,               "namedChunks": false,               "aot": true,               "extractLicenses": false,               "vendorChunk": false,               "buildOptimizer": true             }           },           "defaultConfiguration": "production"         },         "serve": {           "builder": "@angular-builders/custom-webpack:dev-server",           "options": {             "browserTarget": "front:build",             "liveReload": false,             "open": false,             "host": "0.0.0.0",             "port": 3002,             "servePath": "/",             "publicHost": "localhost.gf.com.cn",             "proxyConfig": "config/ngcli-proxy-config.js",             "disableHostCheck": true           },           "configurations": {             "production": {               "browserTarget": "front:build:production"             },             "development": {               "browserTarget": "front:build:development"             }           },           "defaultConfiguration": "development"         },         "test": {           "builder": "@angular-builders/custom-webpack:karma",           "options": {             "customWebpackConfig": {               "path": "./webpack.test.config.js"             },             "indexTransform": "scripts/index-html-transform.js",             "main": "src/ngtest.ts",             "polyfills": "src/polyfills.ts",             "tsConfig": "./tsconfig.spec.json",             "karmaConfig": "./karma.conf.js",             "assets": [               "src/assets/",               {                 "glob": "**/*",                 "input": "./node_modules/@ant-design/icons-angular/src/inline-svg/",                 "output": "/assets/"               }             ],             "styles": [               "node_modules/angular-tree-component/dist/angular-tree-component.css",               "src/css/index.less"             ],             "scripts": []           }         }       }     }   },   "defaultProject": "front",   "schematics": {     "@schematics/angular:module": {       "routing": true,       "spec": false     },     "@schematics/angular:component": {       "flat": false,       "inlineStyle": true,       "inlineTemplate": false     }   } }
登錄后復制

該示例中涉及多處自定義配置內容,主要需注意 webpack 相關的部分, 其他內容可視自身項目具體情況對比參考。一些細節(jié)也可參考以前的這篇文章中的實踐介紹:lzw.me/a/update-to…

2.2 為 Angular 配置 webpack dll 支持

新建 webpack.config.js 文件。內容參考:

const { existsSync } = require('node:fs'); const { resolve } = require('node:path'); const webpack = require('webpack');  // require('events').EventEmitter.defaultMaxListeners = 0;  /**  * @param {import('webpack').Configuration} config  * @param {import('@angular-builders/custom-webpack').CustomWebpackBrowserSchema} options  * @param {import('@angular-builders/custom-webpack').TargetOptions} targetOptions  */ module.exports = (config, options, targetOptions) => {   if (!config.devServer) config.devServer = {};    config.plugins.push(     new webpack.DefinePlugin({ LZWME_DEV: config.mode === 'development' }),   );    const dllDir = resolve(__dirname, './dist/dll');   if (     existsSync(dllDir) &&     config.mode === 'development' &&     options.scripts?.some((d) => d.bundleName === 'dll_library')   ) {     console.log('use dll:', dllDir);     config.plugins.unshift(       new webpack.DllReferencePlugin({         manifest: require(resolve(dllDir, 'dll-manifest.json')),         context: __dirname,       })     );   }    config.module.rules = config.module.rules.filter((d) => {     if (d.test instanceof RegExp) {       // 使用 less,移除 sass/stylus loader       return !(d.test.test('x.sass') || d.test.test('x.scss') || d.test.test('x.styl'));     }     return true;   });    config.module.rules.unshift(     {       test: /.pug$/,       use: [         {           loader: 'raw-loader',           options: {             esModule: false,           },         },         {           loader: 'pug-html-loader',           options: {             doctype: 'html',           },         },       ],     },     {       test: /.html$/,       loader: 'raw-loader',       exclude: [helpers.root('src/index.html')],     },     {       test: /.svg$/,       loader: 'raw-loader',     },     {       test: /.(t|les)s/,       loader: require.resolve('@lzwme/strip-loader'),       exclude: /node_modules/,       options: {         disabled: config.mode !== 'production',       },     }   );    // AngularWebpackPlugin,用于自定義 index.html 處理插件   const awPlugin = config.plugins.find((p) => p.options?.hasOwnProperty('directTemplateLoading'));   if (awPlugin) awPlugin.pluginOptions.directTemplateLoading = false;    // 兼容上古遺傳邏輯,禁用部分插件   config.plugins = config.plugins.filter((plugin) => {     const pluginName = plugin.constructor.name;     if (/CircularDependency|CommonJsUsageWarnPlugin/.test(pluginName)) {       console.log('[webpack][plugin] disabled: ', pluginName);       return false;     }      return true;   });   // console.log('[webpack][config]', config.mode, config, options, targetOptions);   return config; };
登錄后復制

新建 webpack.dll.mjs 文件,用于 dll 構建。內容示例:

import { join } from 'node:path'; import webpack from 'webpack';  const rootDir = process.cwd(); const isDev = process.argv.slice(2).includes('--dev') || process.env.NODE_ENV === 'development';  /** @type {import('webpack').Configuration} */ const config = {   context: rootDir,   mode: isDev ? 'development' : 'production',   entry: {     dll: [       '@angular/common',       '@angular/core',       '@angular/forms',       '@angular/platform-browser',       '@angular/platform-browser-dynamic',       '@angular/router',       '@lzwme/asmd-calc',       // more...     ],   },   output: {     path: join(rootDir, 'dist/dll'),     filename: 'dll.js',     library: '[name]_library',   },   plugins: [     new webpack.DllPlugin({       path: join(rootDir, 'dist/dll/[name]-manifest.json'),       name: '[name]_library',     }),     new webpack.IgnorePlugin({       resourceRegExp: /^./locale$/,       contextRegExp: /moment$/,     }),   ],   cache: { type: 'filesystem' }, };  webpack(config).run((err, result) => {   console.log(err ? `Failed!` : `Success!`, err || `${result.endTime - result.startTime}ms`); });
登錄后復制

angular.json 中添加 dll.js 文件的注入配置,可參考前文示例中 development.scripts 中的配置內容格式。

package.json 中增加啟動腳本配置。示例:

{     "scripts": {         "ng:serve": "node --max_old_space_size=8192 node_modules/@angular/cli/bin/ng serve",         "dll": "node config/webpack.dll.mjs",         "dev": "npm run dll -- --dev && npm run ng:serve -- -c development",     } }
登錄后復制

最后,可執(zhí)行 npm run dev 測試效果是否符合預期。

3 小結

angular-cli 在升級至 webpack 5 以后,基于 webpack 5 的緩存能力做了許多編譯優(yōu)化,一般情況下開發(fā)模式二次構建速度相比之前會有大幅的提升。但是相比 snowpackvite 一類的 esm no bundles 方案仍有較大的差距。其從 Angular 13 開始已經在嘗試引入 esbuild,但由于其高度定制化的構建邏輯適配等問題,對一些配置參數(shù)的兼容支持相對較為復雜。在 Angular 15 中已經可以進行生產級配置嘗試了,有興趣也可作升級配置與嘗試。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
麻豆精品少妇| 国产精选久久| 国产一区一一区高清不卡| 亚洲香蕉久久| 亚洲一区二区动漫| 亚洲电影在线一区二区三区| 精品免费av在线| 色一区二区三区四区| av综合电影网站| 日韩av一级| 亚洲韩日在线| 日韩精品一二区| 日韩av自拍| 久久福利毛片| 亚洲人www| 欧美日韩国产免费观看视频| japanese国产精品| 模特精品在线| 欧美综合二区| 日韩中文字幕一区二区高清99| 亚洲日韩中文字幕一区| 国产精品欧美三级在线观看| 国产aⅴ精品一区二区三区久久 | 欧美日韩国产精品一区二区亚洲| 国精品一区二区三区| 亚洲三级视频| 欧美国产偷国产精品三区| 在线成人动漫av| 欧美日韩亚洲三区| 久久久影院免费| 亚洲日韩视频| 久久精品国产网站| 红桃视频国产一区| 国产精品白丝久久av网站| 日韩精品免费一区二区在线观看| 国产精品毛片一区二区三区| 国产精品调教视频| 欧美午夜不卡影院在线观看完整版免费| 亚洲精品成人一区| 免费国产自久久久久三四区久久 | 国产成人在线中文字幕| 日韩一区二区免费看| 欧美日韩亚洲一区二区三区在线 | 红桃视频亚洲| 精品一区视频| 亚洲欧洲日韩| 婷婷亚洲五月| 亚洲www啪成人一区二区| 美女国产一区二区三区| 亚洲ab电影| 久久午夜精品| 水蜜桃久久夜色精品一区| 国产探花一区二区| 亚洲精品欧美| 亚洲开心激情| 男人的天堂久久精品| 伊人久久成人| 国产美女亚洲精品7777| 亚洲v天堂v手机在线| 欧美在线91| 日韩av一二三| 日韩一区二区三免费高清在线观看 | 国产中文欧美日韩在线| 欧美日韩91| 国产欧美一区| 欧美国产先锋| 久久香蕉精品香蕉| 高清av一区| 欧美日韩免费看片| 九色porny丨国产首页在线| 日韩高清不卡| 国产一区久久| 亚洲永久字幕| 久热精品在线| 国产欧美在线| 亚洲伦乱视频| 欧洲激情综合| 日韩av中文字幕一区二区三区| 日本在线不卡视频一二三区| 青青草精品视频| 国产一区二区三区四区大秀| 日本久久成人网| 天堂成人国产精品一区| 欧美日韩一区自拍| 欧洲一区二区三区精品| 美女国产精品| 久久精品国产网站| 亚洲性色视频| 美国三级日本三级久久99| 国产亚洲精品美女久久| 999久久久免费精品国产| 日韩欧美四区| 91亚洲国产成人久久精品| 99pao成人国产永久免费视频| 欧美一区二区三区免费看| 深夜视频一区二区| 国产剧情一区| 99热精品在线观看| 久久不卡国产精品一区二区| 狠狠色综合网| 亚洲天堂av影院| 97久久中文字幕| 国产91精品对白在线播放| 综合色就爱涩涩涩综合婷婷| 国产精品毛片一区二区在线看| 亚洲欧美日韩一区在线观看| 久久久久久婷| 久久激情五月激情| 午夜在线一区| 国产一区二区中文| 9色国产精品| 午夜国产精品视频| 久久免费视频66| 欧美日韩亚洲一区二区三区在线| 亚洲欧洲一区二区天堂久久| 国产精品久久久久久久免费观看 | 久久久国产亚洲精品| 欧美黄色精品| 青草av.久久免费一区| 蜜臀av一区二区三区| 亚洲黄色在线| 欧美日韩激情| 91精品99| 久久国产精品毛片| 久久福利精品| 亚洲精品日韩久久| 视频精品一区| 欧美在线看片| 国产精品久久久久久久久久齐齐 | 亚洲精品国模| 婷婷视频一区二区三区| 亚欧洲精品视频在线观看| 免费观看日韩电影| 日韩激情综合| 蜜桃久久久久| av中文字幕在线观看第一页 | 国产乱论精品| 成人午夜网址| 国产99亚洲| 久久激情网站| 另类亚洲自拍| 欧美片第1页综合| 麻豆国产欧美一区二区三区| 国产一区二区三区亚洲| 久久中文字幕av| 亚洲区欧美区| 国产精品99久久精品| 99精品小视频| 欧美三区不卡| 久久精品成人| 日韩精品一级| 中文字幕在线视频久| 伊人成人在线视频| 日韩福利视频一区| 麻豆传媒一区二区三区| 四虎影视精品| 国产精品亚洲成在人线| 日韩毛片在线| 日韩高清电影一区| 四虎4545www国产精品| 日韩一区二区三区精品| 久久久国产亚洲精品| 日韩精品第一| 国精品一区二区三区| 麻豆国产精品一区二区三区| 日韩一级网站| 亚洲尤物av| 久久都是精品| 日韩一区二区免费看| 亚洲色图网站| 久久久9色精品国产一区二区三区| 亚洲三级av| 欧美不卡高清| 丰满少妇一区| 日韩av不卡在线观看| 国产在线不卡| 在线观看精品| 福利片在线一区二区| 国产精一区二区| 日韩精品一区二区三区中文| 9久re热视频在线精品| 日韩不卡视频在线观看| 久久精品国产999大香线蕉| 日韩av一区二| 欧美在线资源| 久久精品91| 欧美成人基地 | 亚洲女人av| 老司机精品久久| 国产精品呻吟| 性色一区二区| 亚洲日产国产精品| 日本aⅴ亚洲精品中文乱码| 婷婷久久一区| 久久国产精品久久久久久电车 | 国产乱码精品一区二区三区亚洲人| 亚洲精品少妇| 国产精品第十页| 高清精品久久| 亚洲先锋成人|