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

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

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

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

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

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

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

在經(jīng)過各種原因分析與排查后,最終在 angular.json 的 schema(./node_modules/@angular/cli/lib/config/schema.json) 中發(fā)現(xiàn)了問題,再結(jié)合 Angular 12 release 文檔定位到了具體原因: Angular 12 一個主要的改動是將 aotbuildOptimizeroptimization 等參數(shù)由默認(rèn)值 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 后的默認(rèn)生產(chǎn)模式,對于跨版本升級來說是比較坑爹的。我們可以從這個提交中了解變動細(xì)節(jié):656f8d7

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

解決辦法則是在 development 配置中禁用生產(chǎn)模式相關(guān)的配置項。示例:

{   "$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" }
登錄后復(fù)制

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

1.2 問題:開啟 aotpug 編譯報錯

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

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

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

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

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

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

2.1 Angular 支持自定義 webpack 配置

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

npm i -D @angular-builders/custom-webpack
登錄后復(fù)制

修改 angluar.json 配置。內(nèi)容格式參考:

{   "$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     }   } }
登錄后復(fù)制

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

2.2 為 Angular 配置 webpack dll 支持

新建 webpack.config.js 文件。內(nèi)容參考:

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; };
登錄后復(fù)制

新建 webpack.dll.mjs 文件,用于 dll 構(gòu)建。內(nèi)容示例:

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`); });
登錄后復(fù)制

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

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",     } }
登錄后復(fù)制

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

3 小結(jié)

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
成人三级高清视频在线看| 亚洲黄色免费av| 精品午夜视频| 欧美精品国产一区| 激情久久久久久久| 国产精选在线| 久久av免费| 日本午夜精品视频在线观看| 欧美日韩视频| 国产一区二区三区日韩精品| 欧美精品成人| 久久超碰99| 国产精品亚洲综合在线观看| 日韩精品第一| 日韩动漫一区| 国产三级精品三级在线观看国产| 亚洲精品国产嫩草在线观看 | 在线国产一区二区| 久久精品国产999大香线蕉| 日本国产亚洲| 日韩av成人高清| 99在线|亚洲一区二区| 精品成人18| 久久精品理论片| 麻豆精品99| sm久久捆绑调教精品一区| 久久久91麻豆精品国产一区| 精品网站999| 欧美日韩国产v| 亚洲性图久久| 亚洲日韩视频| 国产欧美日韩一区二区三区四区| 97成人在线| 男女性色大片免费观看一区二区 | 日本成人手机在线| 日本中文字幕视频一区| 亚州国产精品| 91精品国产自产精品男人的天堂 | 夜久久久久久| 欧美精品一卡| 亚洲美女久久| 亚洲精品裸体| 日本午夜精品| 免费一区二区三区在线视频| 美女国产一区二区三区| 成人黄色av| 一区二区自拍| 日韩av在线免费观看不卡| 久久中文字幕导航| 性欧美xxxx免费岛国不卡电影| 欧美一区二区三区久久精品| 亚洲综合激情在线| 日韩高清电影免费| 国产精品嫩模av在线| 日韩av在线播放网址| 亚洲精品无播放器在线播放| 欧美专区一区| 91看片一区| 美女久久一区| 国产96在线亚洲| 伊人久久亚洲美女图片| 97se亚洲| 日韩av一级| 日产欧产美韩系列久久99| 精品三区视频| 亚洲一区国产| 麻豆国产精品| 尤物网精品视频| 国产精品久久久久久久免费软件 | 欧美激情亚洲| 老牛国产精品一区的观看方式| 欧美精品一区二区久久| 欧美日韩亚洲一区在线观看| 欧美日韩国产综合网| 日韩国产一区二区三区| 美女av一区| 国产精品午夜av| 青草综合视频| 日韩精品一区二区三区中文在线| 国产免费av一区二区三区| 久久精品91| 四虎成人av| 成人在线免费观看91| 国产精品久久久亚洲一区| 亚洲精品动态| 蜜臀久久久久久久| 天堂成人免费av电影一区| 午夜日韩av| 亚洲精品97| 妖精视频成人观看www| 欧美另类专区| 91成人网在线观看| 亚洲精品电影| 久久午夜精品一区二区| 免费日韩一区二区| 亚洲精品美女91| 首页欧美精品中文字幕| 久久av在线| 亚洲精品护士| 日韩欧美精品一区二区综合视频| 久久精品国产网站| 国产精品欧美日韩一区| 久久a爱视频| 久久精品国产免费| 国产一区二区精品久| 久久精品网址| 91亚洲自偷观看高清| 日韩一区二区三区免费播放| 91精品国产成人观看| 欧美日韩四区| 蜜臀91精品一区二区三区| 一区二区亚洲视频| 国产精品综合色区在线观看| 亚洲一区二区小说| 欧美一区自拍| 麻豆91小视频| 欧美成a人免费观看久久| 婷婷综合网站| 中文字幕免费精品| 免费看一区二区三区| 日本高清不卡一区二区三区视频 | 91精品韩国| 午夜欧美精品| 人人精品人人爱| 日本欧美在线| 麻豆成全视频免费观看在线看| 88久久精品| 国产精品美女在线观看直播| sm捆绑调教国产免费网站在线观看| 亚洲深夜av| 日韩欧美另类中文字幕| 麻豆一区二区三| 日韩激情一区| 石原莉奈在线亚洲二区| 久久激情五月婷婷| 亚洲伦乱视频| 综合激情网...| 久久午夜影院| 日韩视频二区| 国产三级精品三级在线观看国产| 欧美综合另类| 五月精品视频| 蜜桃免费网站一区二区三区| 欧美国产先锋| 国产精品美女久久久| 国产精品激情电影| 激情综合激情| 国产精品密蕾丝视频下载| 国产一区亚洲| 91精品国产自产观看在线| 成人日韩在线| 日本麻豆一区二区三区视频| 黄色在线观看www| 免费黄网站欧美| 日韩欧美视频专区| 日本a级不卡| 欧美精品一区二区久久| 亚洲精品伊人| 99视频精品全部免费在线视频| 精品视频国产| 夜夜嗨一区二区| 国产精品13p| 日韩成人在线看| 欧美日韩免费观看一区=区三区| 久久国产成人午夜av影院宅| 日本一区福利在线| 99久久精品国产亚洲精品| 国产精品一区二区av交换| 亚洲美洲欧洲综合国产一区 | 美女视频免费精品| 99精品在线观看| 国产精品2023| 一区二区精品| 欧美~级网站不卡| 日本激情一区| 国产精品探花在线观看| 免费成人性网站| 久久精品99久久无色码中文字幕| 亚洲国产影院| 久久精品女人| 18国产精品| 蜜桃视频在线观看一区二区| 欧美成人a交片免费看| 国产精品传媒麻豆hd| 午夜久久av | 激情欧美一区| 国模大尺度视频一区二区| 日韩一区二区三区四区五区| 伊人精品在线| 久久久亚洲一区| 国产一区二区三区免费在线| 国产欧美日韩免费观看| 蜜桃久久av| 99国产精品久久久久久久成人热| 国产亚洲激情| 深夜视频一区二区| 91亚洲人成网污www| 麻豆国产欧美一区二区三区| 青青国产精品| 亚洲在线久久|