最全 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 新特性介绍-参考资 ...
随机推荐
- 【Spring Boot学习之七】自定义参数&多环境配置&修改端口号&yml
环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.自定义参数通过注解直接获取配置文件application.properties中配置key的value1.appl ...
- 使用vue搭建应用一入门
1.准备 安装nodejs,配置环境变量 安装了nodejs,也就安装了npm 安装webpack npm install webpack -g 安装vue脚手架项目初始化工具 vue-cli npm ...
- Android 横竖屏切换处理
最近在做一个平板项目,有横竖屏切换的问题,写一下处理的方法. 第一种:禁止横竖屏切换. 对于单独的Activity,使用下面的方式直接配置: <activity android:name=&qu ...
- 实用———springmvc接收参数校验
https://www.cnblogs.com/funyoung/p/8670550.html https://www.cnblogs.com/monkeydai/p/10068547.html He ...
- Java后台验证
前台的js验证,可以通过其他手段绕过,存在安全问题,所以引入Java后台进行验证 一.导入jar包 此为hibernate-validator jar包,进行Java后台验证使用,在Java 1.9及 ...
- Go MongoDB官方数据库驱动之增删改查
package main import ( "context" "fmt" "log" "go.mongodb.org/mongo ...
- PV、UV、UIP、VV、DAU、CTR指的是什么?
PV(page view) 网站浏览量,指网页的浏览次数,用户每打开一次页面就记录一次PV,多次打开则累加. UV(unique vistor) 独立访客数,指的是某一天访问某站点的人数,以cooki ...
- Redis cluster的核心原理分析
一.节点间的内部通信机制 1.基础通信原理 (1)redis cluster节点间采取gossip协议进行通信 跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间 ...
- 将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本)
原文:将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本) 如果你要在 WPF 程序中使用线程池完成一个特殊的任务,那么使用 .NET 的 API Task.Run 并传入一个 L ...
- .NET Core随笔把数据库数据查出来转JSON并输出
直接创建WEB项目即可: public class Startup { //startup.cs是站点启动时具体做了哪些事情,主要是开启了一个mvc服务. public Startup(IConfig ...