最全 webpak4.0 打包性能优化清单
最全 webpak4.0 打包性能优化清单
webpack4.0如何进行打包优化?
无非是从两个角度进行优化,其一:优化打包速度,其二:优化打包体积,送你一份打包性能优化清单
1.使用loader的时候尽量指定exclude和inlucde来提高文件查找效率,避免不必要的查找,设置noParse参数
module: {
noParse: /jquery/, // 不去解析jquery中的依赖
rules:[
{
test: /\.js?$/,
use: [
{ loader: 'babel-loader' },
{
// 自定义的同步处理loader
loader: 'replaceLoader',
options: {
name: 'hellonew'
}
},
{
// 自定义的异步处理loader
loader: 'asyncReplaceLoader',
options: {
name: 'myloader'
}
}
],
exclude: ['/node_modules'],
include: [path.resolve(__dirname, '../src/asset/less/component/js')]
}
]
},
2.对css公共的模块进行分离
const CssMiniExtreactPlugin = require('mini-css-extract-plugin')
// postcss自动给css3加上前缀
module{
rules:[
{
test: /\.less?$/,
// loader的执行顺序,从下到上,从右到左
use: [
{
loader: CssMiniExtreactPlugin.loader,
options: {
publicPath: '../'
}
},
{
// css-loader
loader: 'css-loader',
options: {
importLoaders: 2 // import引入的less文件也执行less-loader
// modules: true
// minimize: true
}
},
'postcss-loader',
'less-loader'
]
}
]
}
plugins:[
new CssMiniExtreactPlugin({
filename: 'css/[name]_[contenthash].css',
chunkFilename: 'css/[name]_chunk_[contenthash].css'
}),
],
optimization: {
//拆分css,公共的使用过两次的chunk打包到common.css方便做缓存,单独的css每个页面打包一个针对当前的页面的css
splitChunks: {
name: true,
cacheGroups: {
// 打包公共的css
styles: {
name: 'common',
test: /\.less$/,
chunks: 'all',
enforce: true,
minChunks: 2
},
// 打包每个页面的css
fooStyles: {
name: 'index',
test: (m, c, entry = 'index') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
chunks: 'all',
enforce: true
},
barStyles: {
name: 'detail',
test: (m, c, entry = 'detail') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
chunks: 'all',
enforce: true
},
}
}
}
}
3.拆分js,将公共的js拆分方便把相同的内容缓存下来
// 配置splitChunks
optimization: {
splitChunks: {
name: true,
cacheGroups: {
vendors: {
chunks: 'async',
name: 'verdon',
test: /[\\/]node_modules[\\/]/,
priority: -20,
minSize: 0
// filename: '[name].js'
},
default: {
chunks: 'all',
name: 'common',
minChunks: 1,
test: /[\\/]node_modules[\\/]/, // 配置打包哪里的文件
priority: -10
// reuseExistingChunk: true
}
}
}
}
4.开启css,js和html压缩
//压缩css
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
plugins:[
new OptimizeCssAssetsWebpackPlugin()
]
//压缩js
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
optimization: {
minimizer: [
new UglifyJsPlugin({
cache: true,
parallel: true, // 并发压缩
sourceMap: true // 开启sourcemap
})
]
}
//压缩html
const HtmlWebpackPlugin = require('html-webpack-plugin')
plugins:[
new HtmlWebpackPlugin({
hash: true,
template: `./src/index.html`,
filename: `index.html`,
minify: {
collapseWhitespace: true //开启html压缩
}
})
]
5.使用tree shake把没有用到的js和css剔除掉
optimization: {
usedExports: true, // 使用tree shake
}
//需要在package.json里面设置“sideEffect”进行配合使用
"sideEffects": [
"*.css", //移出css
"@babel/polyfill" //移除掉@babel/polyfill
],
6.善用alias,resolve里面有一个alias的配置项目,能够让开发者指定一些模块的引用路径。
// 省略后缀
resolve: {
extensions: ['.js', '.vue', '.jsx', '.json'],
// 定义别名
alias: {
'@component': utils.resolve('../src/component')
}
},
7.使用prefetch预加载
// 异步加载
function dom() {
return import(/* webpackPrefetch:true */ 'lodash').then(({ default: _ }) => {
let div = $('<div>')
div.html(_.join(['webpack', 'is', 'so', 'easy'], '***'))
return div
})
}
8.使用懒加载
//配置babel
npm install @babel/plugin-syntax-dynamic-import -D
//.babelrc文件配置如下
{
"plugins": ["@babel/plugin-syntax-dynamic-import"]
}
//在项目中正常使用即可
const Foo = () => import('./Foo.vue')
9.使用DllPlugin使得第三方模块只打包分析一次
//生成一个webpack.dll.config.js文件,执行npm run dll
const utils = require('./utils')
const webpack = require('webpack')
module.exports = {
mode: 'production',
entry: {
jquery: ['jquery'],
lodash: ['lodash']
},
output: {
path: utils.resolve('../dll'),
filename: '[name].dll.js',
library: '[name]' // 将打包的dll文件暴露一个公共的变量
},
plugins: [
// 输出映射关系
new webpack.DllPlugin({
name: '[name]',
path: utils.resolve('../dll/[name].manifest.json')
})
]
}
//以下为webpack配置
new AddAssetWebpackPlugin({
filepath: utils.resolve('../dll/jquery.dll.js')
}),
new AddAssetWebpackPlugin({
filepath: utils.resolve('../dll/lodash.dll.js')
}),
new webpack.DllReferencePlugin({
manifest: utils.resolve('../dll/jquery.manifest.json')
}),
new webpack.DllReferencePlugin({
manifest: utils.resolve('../dll/lodash.manifest.json')
})
10.使用happyPack进行多线程打包,提升打包效率
//npm install happypack -D
const Happypack = require('happypack') // 多线程打包,提高打包速度
let os = require('os')
let happyThreadPool = Happypack.ThreadPool({ size: os.cpus().length })
//webpack.config.js配置
rules:[
{
test:/\.less?$/
use:['happypack/loader?id=css']
}
{
test: /\.js?$/,
use: ['Happypack/loader?id=js'],
}
]
plugins:[
new Happypack({
id:'css',
use:['style-loader','css-loader','less-loader'],
threadPool: happyThreadPool
}),
new Happypack({
id: 'js',
use: [
{ loader: 'babel-loader' },
{
loader: 'replaceLoader',
options: {
name: 'hellonew'
}
},
{
loader: 'asyncReplaceLoader',
options: {
name: 'wxl'
}
}
],
threadPool: happyThreadPool
})
]
11.对图片打包,适当采用base64位格式,如css sprite图片可以使用base64位格式
rules:[
{
test: /\.(jpg|png|svg|gif)?$/,
use: {
// loader: 'file-loader',
loader: 'url-loader', // url-loader把图片打包成base64格式了
options: {
// placeholder
name: '[name]_[hash].[ext]',
outputPath: 'images/', // 将图片打包到指定的文件夹下
limit: 204800 // 小于限定尺寸图片就被打包到images目录下
}
}
}
]
12.合理使用devtool参数,开发环境不建议使用cheap-module-source-map
devtool: 'cheap-module-source-map',
13.使用image-webpack-loader压缩图片,适当设置压缩程度,以免造成图片失真
$ npm install image-webpack-loader --save-dev
{
loader: 'image-webpack-loader',
options: {
mozjpeg: {
progressive: true,
quality: 65
},
optipng: {
enabled: true
},
pngquant: {
quality: [0.65, 0.90],
speed: 4
},
gifsicle: {
interlaced: false
},
webp: {
quality: 75
}
}
}
最全 webpak4.0 打包性能优化清单的更多相关文章
- webpack 打包性能优化
webpack 打包性能优化 开启多线程打包 thread-loader https://www.npmjs.com/package/thread-loader https://github.com/ ...
- webpack打包性能优化
1. 使用 gzip 压缩打包后的 js 文件 这个方法优化浏览器下载时的文件大小(打包后的文件大小没有改变) webpack.config.prod.js 中 var CompressionWebp ...
- 深入浅出的webpack构建工具---tree shaking打包性能优化(十二)
阅读目录 1. 什么是tree-shaking? 2. 在webpack中如何使用 tree-shaking 呢? 3. 使用webpack-deep-scope-plugin 优化 回到顶部 1. ...
- Spring Boot2.0之性能优化
1.JVM参数调优 针对运行效果 吞吐量 初始堆内存与最大堆尽量相同 减少垃圾回收次数 2.扫包优化: 启动优化 默认Tomcat容器改为Undertow Tomcat的吞吐量500 ...
- Vue-cli3性能优化
Vue-cli3.0的打包性能优化方案:https://juejin.im/post/5d42962be51d4561b84c00c3 提升90%加载速度——vuecli下的首屏性能优化:https: ...
- 前端性能优化的另一种方式——HTTP2.0
最近在读一本书叫<web性能权威指南>谷歌公司高性能团队核心成员的权威之作. 一直听说HTTP2.0,对此也仅仅是耳闻,没有具体研读过,这次正好有两个篇章,分别讲HTTP1.1和HTTP2 ...
- 浅谈webpack4.0 性能优化(转)
前言:在现实项目中,我们可能很少需要从头开始去配置一个webpack 项目,特别是webpack4.0发布以后,零配置启动一个项目成为一种标配.正因为零配置的webpack对项目本身提供的“打包”和“ ...
- 【Vuejs】335-(超全) Vue 项目性能优化实践指南
点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...
- webpack4.0打包优化策略整理小结
本文转载于:https://www.jb51.net/article/137449.htm 介绍了webpack4.0打包优化策略整理小结,分享给大家,具体如下: webapck4 新特性介绍-参考资 ...
随机推荐
- Python键盘按键模拟
有时候我们需要使用python执行一些脚本,可能需要让程序自动按键或自动点击鼠标,下面的代码实现了对键盘的模拟按键, 需要安装pypiwin32,当然也可以直接用ctypes来实现. 输入:pip i ...
- (CSDN迁移) jFinal无法启动_JFinalDemoGenerator问题解决办法
Eclipse -> 项目右键 -> Build Path -> Config Build Path -> Source -> Add Folder, 将a_little ...
- 各手机PC品牌投屏功能连接方法
一.iOS终端(iPhone/iPad)无线投屏: 1.将iPhone或iPad与必捷会议盒子连接至同一路由器: 2.滑动iPhone/iPad的屏幕,调出Airplay功能,选择需要投屏的主机,开始 ...
- RobotFrameWork基本语法练习
1.基本使用如下图 2.运行日志如下(可对照查看语句输出) Starting test: Test.Test Suite.test_case1 20180810 15:48:58.525 : INFO ...
- Dubbo2.7.3入门
2.7.X的Dubbo,包名不再是com.alibaba,而是org.apache 先看工程目录结构 一个公共api模块,一个SpringBoot项目充当Dubbo服务,一个SpringBoot项目充 ...
- SQL Server 数据库启动过程(用户数据库加载过程的疑难杂症)
前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...
- 如何Dockerize您的端到端验收测试
本文作为使用Selenium Docker映像以及CodeceptJS和Express服务器的“操作方法”指南. 其中,我们将涵盖: 什么是E2E验收测试? 为什么要使用Docker? 松散耦合的测试 ...
- 洛谷--P1028 数的计算(递推)
题意:链接:https://www.luogu.org/problem/P1028 先输入一个自然数n (n≤1000) , 然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自 ...
- 【rt-thread】1、快速建立rt-thread nano最小裁剪工程
快速建立rt-thread nano最小裁剪工程 使用keil5建立 1.下载rt-thread 3.03版本,3.03程序占用最小 2.使用 CubeMX 配置工程 3.选择添加rt-thread ...
- Python入门 .变量 常量 基础数据类型 用户输入 流程控制语句 小练习题
# 2.name = input(“>>>”)通过代码来验证name变量是什么数据类型?--str name = input(">>>") pr ...