本文内容如下

性能优化相关内容

如果你都有了答案,可以忽略本文章,或去webpack学习导图寻找更多答案


性能优化两大方面

一,开发环境性能优化

优化: 构建速度,代码调试

  1. HMR热模块更新(代码调试)
  2. source-map(代码调试)
  3. oneOf(构建速度)
  4. 缓存 (构建速度)
  5. 多进程打包 (构建速度)

二,生产环境性能优化

优化: 减少请求,代码体积,加快请求速度

  1. 缓存(减少请求)
  2. 代码压缩(代码体积)
  3. tree-shaking摇树(代码体积)
  4. code-splitting代码分割(加快请求速度)
  5. lazy loading懒加载/预加载(加快请求速度)
  6. externals忽略打包 (代码体积)
  7. dll动态链接库(构建速度)

开发环境性能优化

HMR热模块替换

Hot module replacement

前景问题:有100个模块,只更新其中一个,其他99个也跟着更新,浪费资源

热更新:新代码生效,网页不刷新,状态不丢失
自动刷新:整个网页全部刷新,速度较慢,状态会丢失

css文件: 可以使用HMR,因为style-loader内部实现了
js文件: 不能使用HMR,需要监听执行函数,只能监听非入口文件
html文件:不能使用HMR,不需要HMR,因为只有一个html文件

1.在devServer加上这两个属性
devServer:{ hot:ture,hotOnly:ture//hot 和 hotOnly 的区别是在某些模块不支持热更新的情况下,前者会自动刷新页面,后者不会刷新页面,而是在控制台输出热更新失败
}
2.引入webpack
const webpack = require('webpack')
3.在插件加上new webpack.HashedModuleIdsPlugin()//JS热更新:需要监听,在文件逻辑页面写
//一旦module.hot为true,说明开启了HMR功能,让HMR功能生效
if(module.hot){module.hot.accept('./a', () => { console.log(有更新就执行回调)})
}

sourceMap

源代码与打包后的代码映射关系

作用:可以快速查找代码错误,有错会报错,定位到源代码的错误地点

类型:string//关闭配置
devtool:"none"//推荐配置组合:生产环境无需设置
devtool:"cheap-module-source-map" //开发环境配置//每个关键字代表的含义
source-map:代码映射,但打包会慢,需要配置其他关键字
eval:打包速度最快的一种方式,执行效率最快,性能最好的一种打包方式。
cheap: 只监视入口文件的业务代码和打包后的js代码的准确性。
module: 不仅监视业务逻辑的错误,还会监视入口文件中引入的第三方模块以及一些loader的代码错误。

oneOf

问题:默认会执行一次所有的loader
解决:所有loader如果遇到能一个处理的,就不会再继续走下面的loader
注意:不能有两个配置处理同一种类型文件,要放在oneOf外面

module = {relus:[{eslint},{oneOf:[{test:'',use:{}         }]}         ]
},

缓存

问题:如果文件有100个,而只修改1个,这样任然需要打包100个
解决:缓存

babel缓存:

开启后,将第一次打包的结果缓存起来,检测与转换,开启babel缓存更有利于处理JS文件

{test: /\.jsx?$/,exclude: /node_modules/,use: [{loader: 'babel-loader',options: {cacheDirectory: true //开启babel缓存}}]
},

文件资源缓存:

问题:后台服务器会给文件做强缓存,不加hash,用户使用的是强缓存,更新不了文件

解决:给文件名加hash,浏览器会帮更新文件,因为名字改变了

1.加hash:每次webpack构建时会生成一个唯一的hash值
[name]_[hash:8].js
问题:js和css同时使用一个hash值,如果只更改了其中一个文件,
会使另外一个文件缓存失效,导致不必要的更新2.加chunkhash:多个文件的统一出口文件
[name]_[chunkhash:8].js
问题:js和css同时使用一个hash值,因为css是在jS中引入的,属于同一个chunk3.加cententhash:cententhash会根据文件内容的变化而改变hash,不同的内容会生成不同的hash
[name]_[cententhash:8].js

注意:webpack 5.x:hash已经废弃


多进程打包

多进程打包,适应范围:大工程才使用

注意:开启进程需要600毫秒

yarn add -D thread-loadermodule = {rules:[{test:'/\.jsx?/',exclude: /node_modules/,use:[{loader:'thread-loader',options:{workers:2 //使用2个进程打包  }},{loader:'babel-loader',options:{...}}]  }]
}

生产环境性能优化


代码压缩

压缩代码,缩小文件体积

html代码压缩

yarn add -D html-webpack-pluginconst HtmlWebpackPlugin = require('html-webpack-plugin');plugins: [new HtmlWebpackPlugin({template: './index.html',  title: '代码研习',          minify: {                  //html代码压缩collapseWhitespace: true,  //移除空格removeComments: true       //移除注释}})
]

css代码压缩

yarn add -D css-minimizer-webpack-pluginconst CssMinimizer= require('css-minimizer-webpack-plugin')
plugins: [ new CssMinimizer() ]

js文件代码压缩

production模式自动压缩

tree-shaking摇树

摇树,把不健康的叶子摇下来

意思是:把没有使用到的文件删除,去除无效的代码,减小文件体积

使用前提: 使用ES6模块化(import),开启production模式

optimization:{usedExports:true  //开启,只要是导出的目录都摇树
}在package.json配置:
{"sideEffects":false, // 去js文件中寻找导出的变量是否引用,false是所有模块都监控,可能会删除CSS文件"sideEffects":["*.css","*.less"] //所有的CSS都不需要监控.
}

code-splitting代码分割

作用:代码分割/打包分割,如:把一个2M的文件,拆分成2个1M的文件,分别引入加载

解决问题:文件体积大,重复引入文件,加载时间长

分割方式:

  1. 第一种方式:多入口文件,每个入口都会打包成一个chunk
  2. 第二种方式:webpack内置的打包分割
  3. 第三种方式:通过JS代码,让某个文件单独打包成一个chunk

第一种方式: 多入口文件,每个入口都会打包成一个chunk

entry: {main: './src/index.js',test: './src/test.js'
},
output: {path: resolve(__dirname, '../dist'),filename: 'js/[name].[contenthash:8].js',
},

第二种方式:webpack内置的打包分割

可以将 node_modules 中引用的代码单独打包成一个chunk最终输出

webpack会自动分析多入口chunk中,有没有公共的依赖,如果有会打包成单独一个chunk

optimization:{splitChunks: {chunks: 'all',  //默认支持异步async,all对所有的模块有效//详细配置minSize:30 * 1024 //当模块大于30KB时才分割minChunks:1,    //模块引用的次数,只要1次就分割出来maxAsyncRequests:5, //模块数,超过5个就不分割了maxInitialRequests:3, //入口文件不同请求3次automaticNameDelimiter:'~', //名称连接符name:true,  //可以使用命名规则cacheGroups:{ //缓存组,判断哪些模型需要进行分割vendors:{ //是通过node_modules引用进来的name:'vendors'//chunk名称(多入口的配置)test:/[\\/]node_modules[\\/]/,priority:5 //优先级,数字越大,优先级越高},common:{  //公共模块name:'common',mixChunks:2,priority:0,reuseExistingChunk:true}}},
}

简单例子

单独打包dayjs

import React from 'react'
import dayjs from 'dayjs'export const App = () => {return (<div><h3>App</h3><h3>{dayjs(Date.now()).format('YYYY-MM-DD')}</h3></div>)
}//webpack配置
optimization: {runtimeChunk: 'single',splitChunks: {  //代码分割chunks: 'all',}
}//打包结果
//962.78b1a132.js 就是dayjs打包的chunkasset js/962.78b1a132.js 163 KiB [emitted] [immutable] [minimized] (id hint: vendors) 1 related assetasset js/runtime.0aed458b.js 1.75 KiB [emitted] [immutable] [minimized] (name: runtime)asset js/main.9badeae3.js 1.3 KiB [emitted] [immutable] [minimized] (name: main)asset js/test.d725219e.js 148 bytes [emitted] [immutable] [minimized] (name: test)

第三种方式:通过JS代码,让某个文件单独打包成一个chunk

import动态导入,也会让文件被单独打包成一个chunk

//sayhi.js
export const sayHi = (value) => console.log(value)//App.js
/*webpackChunkName:'sayhhh'*/  是给chunk重命名,默认是文件名
import(/*webpackChunkName:'sayhhh'*/'./sayhi').then((res) => {res.sayHi('hello')
})//打包结果
asset js/sayhhh.a7ff02f1.js 198 bytes [emitted] [immutable] [minimized] (name: sayhhh)
asset js/main.a79942e4.js 1.37 KiB [emitted] [immutable] [minimized] (name: main)

lazy loading懒加载/预加载

异步加载/懒加载,会自动代码分割

react简单例子:点击按钮之后,加载lazyLoad中的函数

//lazyLoad.js
export const lazy = () => console.log('lazy')//home.jsx
export const Home = () => {const handelLazyLoad = () => {import('./lazyLoad').then(res => {res.lazy()})}return (<div><button onClick={() => handelLazyLoad()}>懒加载</button></div>)
}//打包结果:
asset js/src_lazyLoad_js.16c9cfe1.js 2.07 KiB [emitted] [immutable] 1 related asset

externals忽略打包

环境: 生产环境
场景: 有些库使用cnd引入,需要忽略打包,这样打包的体积更小
注意: 需要html中手动引入被忽略的包

例子:
dayjs 希望通过 cdn引入

import React from 'react'
import dayjs from 'dayjs'export const App = () => {return (<div><h3>App</h3><h3>{dayjs(Date.now()).format('YYYY-MM-DD')}</h3></div>)
}//webpack
module.export = {externals: {dayjs: 'dayjs'   //忽略的包名}
}//html<script src="https://cdn.bootcdn.net/ajax/libs/dayjs/1.10.6/dayjs.min.js"></script>

这样dayjs就没有被打包了,如何验证? 把html中的cdn链接注释,就会报错找不到dayjs,证明使用的是cdn连接


dll动态链接库

将多个库打包成一个chunk

第一步:新建一个打包库的文件

const { resolve } = require('path')
const Webpack = require('webpack')module.exports = {mode: 'production',entry: {vendor: ['dayjs'] //需要打包的库,放到数组中},output: {path: resolve(__dirname, '../dll'),filename: '[name].dll.js',library: '[name]_library' //打包的库里向外暴露出去的内容叫什么名字},plugins: [new Webpack.DllPlugin({name: '[name]_library', //隐射库的暴露内容名称path: resolve(__dirname, '../dll/manifest.json')//输出文件路径})]
}

第二步:执行该文件

执行成功后,在dll目录生成两个文件:manifest.json,vendor.dll.js(名字是根据第一步的配置生成)

yarn dll"scripts": {"dll": "webpack  --config ./build/webpack.dll.js"
},

第三步:忽略打包文件和使用文件

manifest.json的作用是:告诉webpack,哪些文件忽略打包
vendor.dll.js的作用是:使用时引入

const { resolve } = require('path')
const Webpack = require('webpack')
const AddAssetHtml = require('add-asset-html-webpack-plugin') 这个库的作用是把dll的文件引入html中const proConfig = {mode: 'production',plugins: [new Webpack.DllReferencePlugin({  //告诉webpack哪些库不参与打包,同时使用时的名称也得该manifest: resolve(__dirname, '../dll/manifest.json')}),new AddAssetHtml({filepath: resolve(__dirname, '../dll/vendor.dll.js')})],
};module.exports = proConfig//打包结果
asset vendor.dll.js 6.4 KiB [emitted] [minimized]

总结:


学习更多

webpack学习导图

webpack学习:性能优化相关推荐

  1. oracle 测试sql执行时间_从 TPCH 测试学习性能优化技巧

    一. 目标 TPCH是由TPC(Transaction Processing Performance Council)事务处理性能委员会公布的一套针对数据库决策支持能力的测试基准,通过模拟数据库中与业 ...

  2. Webpack构建性能优化指南

    本指南翻译自webpack官方性能指南文档:https://webpack.js.org/guides/build-performance/ 构建性能 本指南涵盖了对增进构建或编译性能的一些有效的提示 ...

  3. 解密阿里云大规模深度学习性能优化实践

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 作者 | 阿里云异构计算AI加速负责人 游亮 近日,斯坦福大学公布了最新的 DAWNBench 深 ...

  4. oracle 考试技巧,从 TPCH 测试学习性能优化技巧

    一.目标 TPCH是由TPC(Transaction Processing Performance Council)事务处理性能委员会公布的一套针对数据库决策支持能力的测试基准,通过模拟数据库中与业务 ...

  5. mysql性能优化学习_mysql学习——性能优化之sql优化

    尽量少 join MySQL 的优势在于简单,但这在某些方面其实也是其劣势.MySQL 优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多.对于复杂的多表 Join,一方 ...

  6. oracle 考试技巧,从 TPCH 测试学习性能优化技巧之 Q14

    一. 查询要求 Q14语句查询获得某一个月的收入中有多大的百分比是来自促销零件.用以监视促销带来的市场反应. Q14语句的特点是:带有聚集.连接操作的简单查询. 二. Oracle执行 Oracle编 ...

  7. 从 TPCH 测试学习性能优化技巧之 Q10

    一.     查询要求 Q10语句是查询每个国家在某时刻起的三个月内货运存在问题的客户和造成的损失. Q10语句的特点是:带有分组.排序.聚集操作并存的多表连接查询操作.查询语句没有从语法上限制返回多 ...

  8. 如何学习Linux性能优化?

    如何学习Linux性能优化? 你是否也曾跟我一样,看了很多书.学了很多 Linux 性能工具,但在面对 Linux 性能问题时,还是束手无策?实际上,性能分析和优化始终是大多数软件工程师的一个痛点.但 ...

  9. dll文件懒加载_前端性能优化

    # 前端性能优化 写在最前面:下面都是我对webpack的一些性能优化,想系统的学习性能优化方面的知识 推荐大家看看这本书 很系统 感觉面试也能如鱼得水 ## 构建优化 ### webpack优化 ( ...

  10. 写给中高级前端关于性能优化的9大策略和6大指标 | 网易四年实践

    「链接和长图失效,请大家点击阅读原文查看详情」 前言 笔者近半年一直在参与项目重构,在重构过程中大量应用「性能优化」和「设计模式」两方面的知识.「性能优化」和「设计模式」两方面的知识不管在工作还是面试 ...

最新文章

  1. dispatch js实现_详解vuex中action何时完成以及如何正确调用dispatch的思考
  2. 如何检查字符串是否包含Ruby中的子字符串?
  3. 解决报错OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
  4. leetcode1103. 分糖果 II 该模拟就模拟,别老想着优化
  5. etl报表开发是什么意思_中间表是什么?和报表有什么关系?会带来怎样的问题?又如何解决?...
  6. python3的 pymysql把mysqldb库取代了,让python 3支持mysqldb的解决方法
  7. 国家植物标本资源库信息网正式上线
  8. apache的tomcat负载均衡和集群配置
  9. android常见的面试题,Android常见笔试面试题
  10. chrome devTool
  11. 知识表示学习Trans系列梳理(论文+代码)
  12. Qt:During startup program exited with code 0xc0000135
  13. 苹果手机透明桌面_手机透明桌面,赶紧秀一下!
  14. ftp连不上linux虚拟机,cuteftp连不上Linux虚拟机的解决方案
  15. 区块链技术驱动商业银行开展供应链金融业务的创新路径
  16. 毕业设计 Stm32云平台的智能病房监控系统
  17. Python手册--目录
  18. [附源码]JAVA+ssm基于Internet快递柜管理系统(程序+Lw)
  19. 容器高度或者宽度的获取方式
  20. 【原创】【百度之星2017资格赛1003】度度熊与邪恶大魔王

热门文章

  1. 【30天python从零到一】---第二天:python基础语法(一)
  2. Win10压缩的在linux打不开,win10压缩包打不开什么原因?打不开压缩包解决方法
  3. 键盘按键KeyCode大全
  4. HP SmartStart CD ISO下载地址
  5. anaconda prompt中cd到指定目录
  6. 【服务器】window 服务器端 iis 安装
  7. wepy开发微信小程序,在页面内绘制图表 使用wxCharts插件
  8. 关联规则算法——Apriori算法
  9. linux环境vmd下载,VMD Linux版下载|VMD(变分模态分解程序) V1.9.3 Linux版 下载_当下软件园_软件下载...
  10. Android状态栏微技巧,带你真正理解沉浸式模式(转)