Webpack性能优化

webpack的性能优化,移动端的性能优化 webpack 是一种前端构建工具(从前期的打包工具逐渐演化为构建工具)。它的配置并不简单,由此演化的优化自成一套很复杂的知识体系。webpack 性能优化可分为开发环境优化和生产环境优化。开发环境优化又分为优化代码构建速度,和优化代码调试。生产环境优化又分为优化打包构建速度和优化代码运行性能。webpack打包原理Webpack 是一个模块打包工具,它能够把各种资源,例如 JavaScript、CSS、图片等都作为模块来处理,并且可以利用插件来扩展其功能,从而实现资源的合并、压缩、替换等。 阅读详情

Webpack性能优化

在使用webpack打包的时候,当我们的项目工程越来越大的时候就会出现打包的时间越来越长,这个时候需要对打包资源进行一系列的优化。

减少Webpack打包时间

优化Loader

对于 Loader 来说,影响打包效率首当其冲必属 Babel 了。因为 Babel 会将代码转为字符串生成 AST,然后对 AST 继续进行转变最后再生成新的代码,项目越大,转换代码越多,效率就越低。当然了,我们是有办法优化的。

首先我们可以优化 Loader 的文件搜索范围

module.exports = {
  module: {
    rules: [
      {
        // js 文件才使用 babel
        test: /\.js$/,
        loader: 'babel-loader',
        // 只在 src 文件夹下查找
        include: [resolve('src')],
        // 不会去查找的路径
        exclude: /node_modules/
      }
    ]
  }
}

对于 Babel 来说,我们肯定是希望只作用在 JS 代码上的,然后 node_modules 中使用的代码都是编译过的,所以我们也完全没有必要再去处理一遍。

当然这样做还不够,我们还可以将 Babel 编译过的文件缓存起来,下次只需要编译更改过的代码文件即可,这样可以大幅度加快打包时间

loader: 'babel-loader?cacheDirectory=true'

HappyPack

受限于 Node 是单线程运行的,所以 Webpack 在打包的过程中也是单线程的,特别是在执行 Loader 的时候,长时间编译的任务很多,这样就会导致等待的情况。

HappyPack 可以将 Loader 的同步执行转换为并行的,这样就能充分利用系统资源来加快打包效率了

module: {
  loaders: [
    {
      test: /\.js$/,
      include: [resolve('src')],
      exclude: /node_modules/,
      // id 后面的内容对应下面
      loader: 'happypack/loader?id=happybabel'
    }
  ]
},
plugins: [
  new HappyPack({
    id: 'happybabel',
    loaders: ['babel-loader?cacheDirectory'],
    // 开启 4 个线程
    threads: 4
  })
]

DllPlugin

DllPlugin 可以将特定的类库提前打包然后引入。这种方式可以极大的减少打包类库的次数,只有当类库更新版本才有需要重新打包,并且也实现了将公共代码抽离成单独文件的优化方案。

接下来我们就来学习如何使用 DllPlugin

// 单独配置在一个文件中
// webpack.dll.conf.js
const path = require('path')
const webpack = require('webpack')
module.exports = {
  entry: {
    // 想统一打包的类库
    vendor: ['react']
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].dll.js',
    library: '[name]-[hash]'
  },
  plugins: [
    new webpack.DllPlugin({
      // name 必须和 output.library 一致
      name: '[name]-[hash]',
      // 该属性需要与 DllReferencePlugin 中一致
      context: __dirname,
      path: path.join(__dirname, 'dist', '[name]-manifest.json')
    })
  ]
}

然后我们需要执行这个配置文件生成依赖文件,接下来我们需要使用 DllReferencePlugin 将依赖文件引入项目中

// webpack.conf.js
module.exports = {
  // ...省略其他配置
  plugins: [
    new webpack.DllReferencePlugin({
      context: __dirname,
      // manifest 就是之前打包出来的 json 文件
      manifest: require('./dist/vendor-manifest.json'),
    })
  ]
}

代码压缩

在 Webpack3 中,我们一般使用 UglifyJS 来压缩代码,但是这个是单线程运行的,为了加快效率,我们可以使用 webpack-parallel-uglify-plugin 来并行运行 UglifyJS,从而提高效率。

在 Webpack4 中,我们就不需要以上这些操作了,只需要将 mode 设置为 production 就可以默认开启以上功能。代码压缩也是我们必做的性能优化方案,当然我们不止可以压缩 JS 代码,还可以压缩 HTML、CSS 代码,并且在压缩 JS 代码的过程中,我们还可以通过配置实现比如删除 console.log 这类代码的功能。

一些小的优化点

我们可以通过一些小的优化点来优化打包速度

  • resolve.extensions:用来表明文件后缀列表,默认查找顺序是 ['.js', '.json'],如果你的导入文件没有添加后缀就会按照这个顺序查找文件。我们应该尽可能减少后缀列表长度,然后将出现频率高的后缀排在前面
  • resolve.alias:可以通过别名的方式来映射一个路径,能让 Webpack 更快找到路径
  • module.noParse:如果你确定一个文件下没有其他依赖,就可以使用该属性让 Webpack 不扫描该文件,这种方式对于大型的类库很有帮助

减少 Webpack 打包后的文件体积

按需加载

想必大家在开发 SPA 项目的时候,项目中都会存在十几甚至更多的路由页面。如果我们将这些页面全部打包进一个 JS 文件的话,虽然将多个请求合并了,但是同样也加载了很多并不需要的代码,耗费了更长的时间。那么为了首页能更快地呈现给用户,我们肯定是希望首页能加载的文件体积越小越好,这时候我们就可以使用按需加载,将每个路由页面单独打包为一个文件。当然不仅仅路由可以按需加载,对于 loadash 这种大型类库同样可以使用这个功能。

按需加载的代码实现这里就不详细展开了,因为鉴于用的框架不同,实现起来都是不一样的。当然了,虽然他们的用法可能不同,但是底层的机制都是一样的。都是当使用的时候再去下载对应文件,返回一个 Promise,当 Promise 成功以后去执行回调。

Scope Hoisting

Scope Hoisting 会分析出模块之间的依赖关系,尽可能的把打包出来的模块合并到一个函数中去。

比如我们希望打包两个文件

// test.js
export const a = 1
// index.js
import { a } from './test.js'

对于这种情况,我们打包出来的代码会类似这样

[
  /* 0 */
  function (module, exports, require) {
    //...
  },
  /* 1 */
  function (module, exports, require) {
    //...
  }
]

但是如果我们使用 Scope Hoisting 的话,代码就会尽可能的合并到一个函数中去,也就变成了这样的类似代码

[
  /* 0 */
  function (module, exports, require) {
    //...
  }
]

这样的打包方式生成的代码明显比之前的少多了。如果在 Webpack4 中你希望开启这个功能,只需要启用 optimization.concatenateModules 就可以了。

module.exports = {
  optimization: {
    concatenateModules: true
  }
}

Tree Shaking

Tree Shaking 可以实现删除项目中未被引用的代码,比如

// test.js
export const a = 1
export const b = 2
// index.js
import { a } from './test.js'

对于以上情况,test 文件中的变量 b 如果没有在项目中使用到的话,就不会被打包到文件中。

如果你使用 Webpack 4 的话,开启生产环境就会自动启动这个优化功能。

总结

Webpack的版本更新很快,各个版本之间实现优化的方式都会有区别,所以具体实现的方式饿哦们还是需要参考官网文档为准

webpack性能优化方案(详细) 因为该插件webpack已经默认安装和集成,所以我们并不需要单独安装和直接使用该插件;只需要提供SplitChunksPlugin相关的配置信息即可;Webpack提供了SplitChunksPlugin默认的配置,我们也可以手动来修改它的配置:比如默认配置中,chunks仅仅针对于异步(async)请求,我们可以设置为initial或者all;SplitChunks自定义配置解析常用配置解析默认值是async另一个值是initial,表示对通过的代码进行处理。 阅读详情

相关推荐

【webpack5】 性能优化

【webpack5】 性能优化 优化构建速度 (开发体验效率) 优化产出代码 (应用性能、网络性能啥的) 一、优化构建速度 1、babel-loader 开启缓存 当有设置时,指定的目录将用来缓存 loader 的执行结果。之后的 webpack 构建,将会尝试读取缓存,来避免在每次执行时,可能产生的、高性能消耗的 Babel 重新编译过程(recompilation process) babel-loader?cacheDirectory module: { rules: [ {

小笼包不是包的博客 2369

Webpack之性能优化篇

Webpack之性能优化篇 性能优化概述 本文所讲的性能优化主要体现在三个方面: 构建性能 这里所说的构建性能,是指在开发阶段的构建性能,而不是生产环境的构建性能; 优化的目标: 降低从打包开始,到代码效果呈现到页面所需要的时间。 传输性能 传输性能是指,打包后的JS代码从服务器传输到用户浏览器经过的时间。 在优化传输性能时要考虑到: 总传输量:所有需要传输的文件内容加起来,就是总传输量;文件数量:当访问页面时,需要传输的JS文件数量,文件数量越多,http请求越多,响应速度越慢;浏览器缓存:

张印的博客 4525

CentOS7下Node.js v20+安装与常见依赖库问题解决指南

本文详细介绍了在CentOS7系统下安装Node.js v20+的完整流程及常见依赖库问题的解决方案。通过升级glibc到2.28+、配置环境变量以及处理libstdc++版本问题,帮助开发者顺利在老旧系统上部署最新版Node.js,提升开发效率。

weixin_30689307的博客 156

webpack之常见性能优化

webpack之常见性能优化构建性能传输性能运行性能 关于webpack常见的性能优化,可从以下三方面做处理。 构建性能,当构建性能越高,开发效率越高。 传输性能,在这方面重点考虑网络中总的传输量,以及文件数量等。 运行性能,主要是指js在客户端的运行效率。 构建性能 传输性能 运行性能 ...

Mr_RedStar的博客 1万+

EETI_eGTouch驱动移植及校准

一.环境 芯片:NXP IMX6Q 内核版本:4.1.15 uname:Linux myimx6ek314 4.1.15-myimx6-g5d588fa6-dirty #4 SMP PREEMPT Tue Nov 17 17:26:34 CST 2020 armv7l armv7l armv7l GNU/Linux 二.官方《EETI_eGTouch_Linux_Programming_Guide_v2.5l.pdf》文档勘误 HID_MULTITOUCH =Y or N(官方文档设置为M): 正确设置H

Garden的博客 4332

利用HipSTR从二代测序数据中精准解析短串联重复序列(STR)的遗传多态性

本文详细介绍了如何利用HipSTR工具从二代测序(NGS)数据中精准解析短串联重复序列(STR)的遗传多态性。通过三步走策略,HipSTR能够高效识别STR区域、估算重复次数并判定基因型,适用于法医鉴定、疾病研究和细胞系鉴定等多个领域。文章还提供了实战操作指南和常见问题解决方案,帮助研究者充分利用NGS数据开展STR分析。

weixin_28702105的博客 482

webpack性能优化详解,你想知道的webpack都在这里

webpack性能优化 开发环境性能优化;生产环境性能优化; 开发环境性能优化: 优化打包构建速度-HMR; 优化代码调试-source-map; 生产环境性能优化: 优化打包构建速度:oneOf;babel缓存;多进程打包;externals;dll; 优化代码运行的性能:缓存(hash-chunkhash-contenthash);tree shaking;code split;懒加载/预加载;pwa; ...

Delicia_Lani的博客 875

【专业书1】量化交易——从入门到精通

股票季节性策略几乎失效了,但商品期货的仍有效,因为其季节性需求源于真实的经济需求而非投机。交易策略获利的前提:交易价格处于均值回归(低价时买入)或动量状态(降价时先做空后以更低价买入),否则在随机游走状态下是无法有效交易的。构建交易策略实际上是在决定:在特殊条件、特定时间尺度下价格趋势的呈现(均值回归/趋势走势),以及用什么价格作为初始判断的参考价格。如果以高夏普比率为目标,需要更高的交易频率:基于大数定律,押注越多,偏离均值收益的偏差就越小。买同比最好的股票,卖同比最差的股票。但在不同的时间尺度下可以。

weixin_44589682的博客 1544

webpack 性能优化

webpack 性能优化无非是从时间和空间两个维度去分析。时间指的是打包时间尽可能快;空间指的是打包体积尽可能小。本文的 webpack 性能优化是基于 webpack 4.3.0 版本。

杏子 1272

Linux 设置双网卡通信,外网网卡和内网网卡

背景,Linux 主机已经安装了内网、外网 2 张网卡,目前外网网络已通,需要设置内网网卡转发通内网 内网需要通信的设备的网段,如果 10.99.0.0 代表 10.99 网段的所有 IP 表示 10.xx 网段走 10.xx.xx.xx 这个网关转发 :内网网卡设备示例 2、设置启动自动生效 打开 文件,如果没有则创建该文件,然后在文件内写入如下的内容修改上面的语句 为 即可 示例...

简简单单Onlinezuozuo 6602

【DaVinci Configurator专题】-5-通过Data Mapping自动创建CAN信号关联的Port并添加到APP SWC

目录 1 导入CAN Matrix变更后的Arxml文件 2 自动创建CAN信号关联的APP Port 3 CAN信号与App SWC的接口映射/连接 4 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: DaVinci Developer DaVinci Configurator Pro ARXML AUTOSAR System Description Network Explorer 1

「汽车电子助手」的博客 5126

webpack性能优化

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_44652065的博客 4030

Python 爬虫实战:抓取悦动圈跑步爱好者运动轨迹数据,规划健身路线

通过本次 Python 爬虫实战,我们学习了如何使用 Python 抓取悦动圈跑步爱好者的运动轨迹数据,并基于这些数据进行分析和处理,最终规划出健身路线。在这个过程中,我们掌握了requests、BeautifulSoup、pandas和matplotlib等库的基本使用方法,了解了爬虫的基本原理和流程。希望本文能够帮助你更好地理解和应用 Python 爬虫技术,在数据处理和分析领域取得更多的成果。

u014481728的博客 2359

webpack打包vue项目性能优化

项目打包上线设置productionSourceMap为false减小.map文件所占dist文件的体积; 开启gzip对dist文件进一步压缩(ps:需后端配合开启gzip方可使用); 使用cdn减小打包后vendor.js的体积,从而缩短首屏加载时间(ps:第3步如果注释掉出现错误可以不进行注释); 按需引用组件(iview为例); 未完待续。。。 ...

likuntao123的博客 846

骑砍2霸主MOD开发(9)-游戏大地图(MapScene)

Settlement类型由town,castle,castle_village,village,hideout五种类型组成,通过对GameEntity中添加tag实现类型的加载.大地图中军团(MobileParty)的移动速度,AI寻路,食物消耗等均和当前MobileParty所处地形有关,地形统一被定义为TerrainType,类型有森林,荒漠等.MapScene.Read("Main_map", ref sceneInitializationData, "") 装载Main_map大地图。

骑砍战团&霸主MOD开发 1621

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Webpack: 其他性能优化

前面章节我们已经详细探讨 Webpack 中如何使用分包、代码压缩提升应用执行性能。使用动态加载,减少首屏资源加载量;使用externals、Tree-Shaking、Scope Hoisting 特性,减少应用体积;正确使用[hash]占位符,优化 HTTP 资源缓存效率,等等。下面我们一一展开,解释每条最佳实践以及背后的逻辑。压缩、Tree-Shaking、Scope Hoisting 都在减少产物体积;Code Splitting、外置依赖、[hash]则有助于提升 HTTP 缓存效率;

Wang的专栏 1081

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 性能优化琐碎事
下一篇: 关于如何计算rem
小小荧
博客等级 码龄9年 133粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值