iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Angular13+开发模式太慢如何解决
  • 721
分享到

Angular13+开发模式太慢如何解决

2023-07-04 20:07:40 721人浏览 八月长安
摘要

今天小编给大家分享一下angular13+开发模式太慢如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 Angula

今天小编给大家分享一下angular13+开发模式太慢如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1 Angular 13+ 开发模式太慢的原因与解决

近期在某个高频迭代七年的 Angular 项目升级至 Angular 13 后,其开发模式的构建速度慢、资源占用高,开发体验相当差。在一台仅在开会时偶尔使用的 Macbook air(近期居家办公期间转换为了主要生产力工具) 中启动构建时,它的风扇会呼呼作响,CPU 负荷被打满,而在构建完成后,热更新一次的时间在一分钟以上。

在经过各种原因分析与排查后,最终在 angular.JSON 的 schema(./node_modules/@angular/cli/lib/config/schema.json) 中发现了问题,再结合 Angular 12 release 文档定位到了具体原因: Angular 12 一个主要的改动是将 aotbuildOptimizeroptimization 等参数由默认值 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 后的默认生产模式,对于跨版本升级来说是比较坑爹的。

1.1 解决 Angular 12+ 开发模式慢的问题

解决办法则是在 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 开启与关闭时,在构建结果表现上可能会有一些差异,需视具体问题而分析。

1.2 问题:开启 aotpug 编译报错

该项目中使用 pug 开发 html 内容。关闭 aot 时构建正常,开启后则会报错。

根据报错内容及位置进行 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 进一步优化:Angular 自定义 webpack 配置 dll 支持

该项目项目构建上有自定义 WEBpack 配置的需求,使用了 @angular-builders/custom-webpack 库实现,但是没有配置 dll。

Angular 提供了 vendorChunk 参数,开启它会提取在 package.json 中的依赖等公共资源至独立 chunk 中,其可以很好的解决热更新 bundles 过大导致热更新太慢等的问题,但仍然存在较高的内存占用,而且实际的对比测试中,在存在 webpack5 缓存的情况下,其相比 dll 模式的构建编译速度以及热更新速度都稍微慢一些。故对于开发机器性能一般的情况下,给开发模式配置 dll 是会带来一定的收益的。

2.1 Angular 支持自定义 webpack 配置

首先需要配置自定义 webpack 配置的构建支持。执行如下命令添加依赖:

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": []          }        }      }    }  },  "defaultProject": "front",  "schematics": {    "@schematics/angular:module": {      "routing": true,      "spec": false    },    "@schematics/angular:component": {      "flat": false,      "inlineStyle": true,      "inlineTemplate": false    }  }}

该示例中涉及多处自定义配置内容,主要需注意 webpack 相关的部分, 其他内容可视自身项目具体情况对比参考。

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;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';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",    }}

最后,可执行 npm run dev 测试效果是否符合预期。

以上就是“Angular13+开发模式太慢如何解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Angular13+开发模式太慢如何解决

本文链接: https://www.lsjlt.com/news/347373.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Angular13+开发模式太慢如何解决
    今天小编给大家分享一下Angular13+开发模式太慢如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 Angula...
    99+
    2023-07-04
  • Angular13+ 开发模式太慢怎么办?原因与解决方法介绍
    可以看到 Angular 12 后的默认生产模式,对于跨版本升级来说是比较坑爹的。我们可以从这个提交中了解变动细节:656f8d71.1 解决 Angular 12+ 开发模式慢的问题解决办法则是在 development 配置中禁用生产模...
    99+
    2023-05-14
    javascript Angular
  • Angular13+开发模式慢的原因及构建性能优化解析
    目录1 Angular 13+ 开发模式太慢的原因与解决1.1 解决 Angular 12+ 开发模式慢的问题1.2 问题:开启 aot 后 pug 编译报错2 进一步优化:Angu...
    99+
    2022-12-20
    Angular 13+性能优化 Angular开发模式性能优化
  • vscode中开发golang太慢了如何解决
    这篇“vscode中开发golang太慢了如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vscode中开发golan...
    99+
    2023-07-06
  • win11太慢太卡如何解决
    本文小编为大家详细介绍“win11太慢太卡如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“win11太慢太卡如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方法一:首先我们点开开始菜单,然后点击其中...
    99+
    2023-07-01
  • 电脑太慢太卡如何解决
    这篇文章主要讲解了“电脑太慢太卡如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“电脑太慢太卡如何解决”吧!电脑太慢太卡解决方法:方法一:系统优化 首先在桌面上找到“计算机”按钮并打开,...
    99+
    2023-07-01
  • ubuntu下载太慢如何解决
    这篇文章主要讲解了“ubuntu下载太慢如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ubuntu下载太慢如何解决”吧!1.打开终端命令行模式。2.依次输入以下命令进行解决即可。su...
    99+
    2023-07-04
  • vscode中开发golang太慢了怎么办?怎么解决?
    近年来,Golang 作为一门初创公司都爱用的编程语言,越来越受到开发者们的关注。与此同时,也会因为种种原因出现一些问题导致开发效率降低。其中,有一种常见的情况就是使用 VSCode 编辑器时,Golang 开发环境因为过于慢而让人焦虑。接...
    99+
    2023-05-14
  • mongodb分页查询太慢如何解决
    要解决MongoDB分页查询太慢的问题,可以考虑以下几个方面的优化:1. 使用索引:确保查询的字段上创建了适当的索引,特别是分页查询...
    99+
    2023-08-23
    mongodb
  • react打包压缩太慢如何解决
    这篇文章主要介绍“react打包压缩太慢如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react打包压缩太慢如何解决”文章能帮助大家解决问题。react打包压缩太慢的解决办法:1、使用“np...
    99+
    2023-07-04
  • vscode安装包下载太慢如何解决
    今天小编给大家分享一下vscode安装包下载太慢如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方法一第一步 vsco...
    99+
    2023-07-04
  • 如何解决Vue开发模式下跨域问题
    这篇文章给大家分享的是有关如何解决Vue开发模式下跨域问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。设置请求头部后端设置请求头部Access-Control-Allow-Cr...
    99+
    2024-04-02
  • redis缓存读取速度太慢如何解决
    要提高Redis缓存的读取速度,可以考虑以下几个方面的优化:1. 使用合适的硬件:确保Redis运行在高性能的服务器上,并且服务器的...
    99+
    2023-09-05
    redis
  • win101909开机慢如何解决
    今天小编给大家分享一下win101909开机慢如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。解决方法: 按路径“控制...
    99+
    2023-07-01
  • win7开机慢如何解决
    这篇文章主要介绍了win7开机慢如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win7开机慢如何解决文章都会有所收获,下面我们一起来看看吧。操作步骤: 这里以win7系统为例,鼠标右键“计算机”,选择属...
    99+
    2023-07-01
  • mybatis-plus批量更新太慢该如何解决详解
    最近使用mybatis-plus的 saveOrUpdateBath 和saveBath接口执行特别慢,数据量大时往往需要十几分钟,打开日志查看原来批量操作也是循环单条数据插入的,那...
    99+
    2023-03-06
    mybatisplus 批量更新 mybatis-plus 批量更新 mybatis批量更新写法
  • win10开机慢如何解决
    这篇文章主要介绍“win10开机慢如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10开机慢如何解决”文章能帮助大家解决问题。打开控制面板,然后找到“电源选项”。 然后在右方点击“选择电...
    99+
    2023-07-02
  • 如何解决mysql存储过程太慢的问题
    小编给大家分享一下如何解决mysql存储过程太慢的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql存储过程太慢的解决...
    99+
    2024-04-02
  • 在docker中拉取mysql镜像太慢如何解决
    在docker中拉取mysql镜像太慢如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。docker拉取mysql镜像半个小时依然没有成功,改用阿里云镜像加...
    99+
    2023-06-14
  • win11如何打开开发者模式
    今天小编给大家分享一下win11如何打开开发者模式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先点击任务栏最左边的win...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作