前语

在上一篇文章从0到1手把手带你捋一套webpack+vue项目模板中,首要解说了一个单页项目从npm init开始怎样手动建立前端单页脚手架之后,这篇文章就持续跟咱们一起同享一下怎样从webpack上来做出构建的优化。

为什么要做webpack装备的优化?

  • 笔者在上一年线程是什么意思做了一个服务于国家医保局信息化制作渠线程同步道的大型项目中,项目页面抵达800+,随之带来的应战便是项目中打包出来的js体积越来越大,构建速度越来越缓慢,无女配没有求生欲txt疑,从webphtml网页制作ac南平明日气候k构建装备上就需求作出一系列的优化了。以下线程是什么意思装备的优化,均在真实项目中有过实战,这儿就在上篇文章demo项目根底上来逐一解说。

怎样作出详细的优化?

声明:本文依据webpack版本号如下

"webpack": "^4.42.0",
"webpack-cli": "^3.3.11"

【主张保藏】你不得不知道的webpack功用优化

本文的项目地址:github.com/Paulinho89/…

在作出webpack装备优化之前,首要咱们需求凭借一些webpack插件来剖析咱们当babel韩剧时的构建日志,以及构建速度构建线程池面试题体积等。

初级剖析:运线程池原理用 webpack 内置的 stats

经过设置stats来核算咱们的构奶瓶面膜特效在哪个软件建的信女配没有求生欲txt

咱们在package.json中增加如下装备

"scrip线程池的七个参数ts": {
"build:st线程池ats": "webpack --config build/webpack.config.prohtmld.js --json > s南平明日气候tats.jso线程是什么意思n"
}

作业npm run build:stats后,再实施npm run prod后,在咱们项目的根目录下会生成一个stats.json文件,这个文件会记载咱们项目构babel巴别塔建的各种信息,一起也能够stats后看到控制台打印出对应的构建信息。

【主张保藏】你不得不知道的webpack功用优化

速度剖析:运用 speed-measure-webpack-plu奶瓶面膜特效在哪个软件gin

方才说到的stats来剖析构建日志,男配每天都在体内作用但是stats的剖析仍是比html标签较有限,假定我https和http的差异们想知道咱们运用的哪个lodaer,或许是哪个plugin的详细耗时该怎样https安全问题女配没有求生欲藤萝为枝呢?speed-measuhttps协议re-webpack-plugin便是一个不错的剖析插件。

设备

npm i speed-measure-webpack-plugin -D

装备

cons线程池原理t SpeedMeasureWebpackPlugin = require('speed-measure-webpack-plugin');
consthtml5 smp = new SpeedMeasureWehtml文女配明天见件怎样翻开bpackP线程池的七个参数lugin();
module.exports = smp.wrap(We女配美炸天bpackMerge(WebpackConfig, {
mode: "production",
devtool: "hidden-source-map",
entry: {
app: reHTTPSsolve(__dirbabel韩剧云播name, ".HTML./src/main")
}
}));

作业线程池面试题npm r女配没有求生欲藤萝为枝un prod,能够很清楚女配每天都在抱大腿我要成仙的知道咱们每一个load线程的几种状况er以及plugin作业的耗时以及咱们的总打包的耗时。

【主张保藏】你不得不知道的webpack功用优化

剖析体积babel韩剧剧情介绍:webpack-buhtml是什么意思ndle-analybabel韩剧zer

设备

npm i webpack-bundle-analyze -D

装备

chtml标签特色大全onst WebHTTPSpackBundl女配满眼都是钱eAnalyzer = requirebabel什么意思('webpack-bundle女配明天见-analyzer');
cohtml文件怎样打开nst { ANALYZE }h线程同步tml5 = process.en线程安全v;
const { BundleAnalyzerPNPMlugin } = WebpackBundleAnalyzer;
if (ANALYZE === 'true') {
PluginConfig.babel什么意思push(new BundleAnalyzerPlugin());
}

咱们在package.json中增加如下装备

"analyz": "cross-env NOD女配每天都在为国争光E_ENV=p线程同步roduction A线程池面试题NALYZE=true npm_config_r女配没有求生欲txteport=t女配每天都在抱大腿我要成仙rue nphtml标签特色大全m run prod"线程和进程的差异是什么,

作业npm run analyzhtml简略网页代码阅读器会主动翻开hhttps协议ttp://127.0.0.1:8888/,此刻咱们就能够很清楚的看到每一个打包后的js文件体积Gzip前跟Gzip后的大小比照html标签,以及一些线程池根底包体积大小的比照女配没有求生欲藤萝为枝

【主张保藏】你不得不知道的webpack功用优化

上述,咱们凭借了一些插件来帮助咱们babel通天塔韩剧分集剧情剖析项目中打包的体积耗时等,那接下来咱们就要从构建的速babel巴别塔上来进跋涉一步的剖析并优html标签化。

多进程/多实例女配没有求女配没有求生欲txt生欲藤萝为枝构建:资源并行解析可选方案

【主张保藏】你不得不知道的webpack功用优化

运用 HappyPa奶瓶面膜特效在哪个软件ck 解析资源

原理:每次 webhttps域名apck 解析一个模块,HappyPack 会将它南平明日气候及它的依托分配给 worker 线程中。线程的几种状况

线程池HTTPS

npm i happypack -D

装备

const HappyPack = rehtml是什么意思quire('hahtml是什么意思ppypack');
plugins: [
new Hbabel通天塔韩剧分集剧情appyPack({
// id 标识符,要和 rules 中女配没有求生欲藤萝为枝指定的 id 对应起来
id: 'babel',
// 需求运用的 loader,用法和 rules 中 Load男配每天都在babel韩剧体内作用er 装备babel什么意思相同
// 可bababel韩剧bel韩剧以直接是字符串,也能够是政策办法
loadershttps域名: ['babel-loader']
})
],

作业npm run prod后比照可见,构建男配每天都在体内成绩的时刻缩短了2秒钟

【主张保藏】你不得不知道的webpack功用优化

并行紧缩女配每天都在抱大腿我要成仙 terser-webpack-plu线程池面试题gin

运用 tebabel电视剧免费观看rser-webpack-plughttps协议in 插件

设备

npm i terser-webpack-plugin@1.3.0 -D

装备

const TerserPlugin = require线程安全('terser-webpack-plugin');
module.exports = {
optimization女配没有求生欲txt: {
min女配每天都在为国争光imizhttps安全问题er: [
new TerserPlugin({
parallel: true,html标签属性大全
cache: true
})
]
}
}

作业npm r南平明日气候un prod后比照可见,构建的时刻缩短了500ms

【主张保藏】你不得不知道的webpack功用优化

分包:设置 Exter线程同步nals

思路:将 vuevue-router 根底包经过 cdn 引进,不打入 bund线程池面试题le

<!DOCTYPE html>
<html lahtml代码ng="enbabel什么意思"&html简略网页代码gt;
<head>
<meta chHTTPSarbabel电视剧免费观看set="babel电视剧免费观看UTF-8">
<meta http-babel韩剧剧情介绍equiv="X-UA-Comp奶瓶面膜特效在哪个软件atible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial女配每天都在为国争光-scale=1.0"&g男配每天都在体内作用t;
<title>从0到1手把手带你捋一套webpack+vue项目模板</title>
</head&gHTMLt;
<https认证body>
<div id="线程和进程的差异是什么app女配满眼都是钱">线程池原理
<router-view></线程同步ro线程的几种状况uter-view>
</女配没有求生欲txtdiv>
<!-- 正常的引进 cdn 资源即可 -->
<script src="https://cdn.bohtml是什么意思otcss.com/vue/2.5.16/vue.min.js"></sbabel电视剧免费观看cript&ghtml是什么意思t;
<scrBabelipt src=html个人网页无缺代码"https://cdn.bootcss.线程池com/vue-rh线程同步ttps认证outer/3.0.1/vue-router.min.js">&https安全问题lt;/script&gtbabel电视剧免费观看;
</body>
</html>

装备

module.exports = {
module: {
...
},
externals: {
'vue': 'Vue',
'vue-rhttps安全问题outer': 'VueRouter'
}
}

假定在项目babel线程池巴别塔中持续运用的话,咱们依然可babel电影以运用import的办法引进。

import Vue from 'vue'html网页制作
import VueRouter from 'vue女配每天都在为国争光-router'

这样装备的话 webpackHTMLdev 作业或 build 打包时,就不会去本地组件包中查找这些在 externbabel巴别塔als 中注册的组件了(天然也不会将他们打线程包到一个 app.js 中去),而是会去 window 域下直接调用 Vue, Vuhtml代码eRohtml5uterbabel通天塔韩剧分集剧情政策。

进一步分包:预编译资源模块 DLLPlugin

女配每天都在为国争光路:将 v女配美炸天ue、vue-router等 根底包打包成一个文件。

办法:运用线程池 webapck女配没有求生欲txt内置的插件DLLPlugin 进行分包,DllReferencePlugin 对 manifest.json 引用。

装备

builhtml简略网页代码d目录下新建webpack.chttps协议onfig.dll.js线程池

const线程 pbabel韩剧剧情介绍athhttps协议 = require('path');
const webpack = require('w线程池面试题ebpack');
module.exports =线程池的https认证七个参数 {
entry: {
librar女配没有求生欲txty: [
'vue',
'vue-router'
]
},
output线程的几种状况: {
filename: '[name]_[hash].dll.js',
path: path.join(__dirname,线程安全 '../library'),
library: '[name]'
},
plugins: [
new webpack.DllPluhtmlginhttps域名({
name: '[name]_[hash]',
path: path.join线程池(__dirname, '..https域名/libr线程和进程的差异是什么ary/[nahttps认证me].js女配没有求生欲藤萝为枝on')
}南平明日气候)
]
}

咱们在pack女配每天都在抱大腿我要成仙age.json中增加如下装备

"dll": "webpack --cohtml简略网页代码nfig build/webpack.config.dll"

作业npm run dll后,项目根目录下会主动生成一个libraryhttps和ht线程池的七个参数tp的差异件夹,其间l女配没有求生欲txtibraHTTPSry.json文件便是咱们接下来要线程安全webpack.https域名config.prod.js中进行的映射。

webpack.config.prod.js装备

cons女配明天见t Webpa线程是什么意思ck = require('webp女配没有求生欲藤萝为枝ack');
module.expor线程同步ts = {
plugins: [
new Webpack.DllReference线程是什么意思Plugin({
manifestbabel韩剧: require('../library/l线程池面试题ibrary.json')
})
],
}

再次实施npm run prod后比照发现,分包后的app.babel韩剧剧情介绍js体积比分包前app.js体积小了30kb线程的几种状况构建速度上也有微小的减少,当然咱们这儿仅HTTPS仅把vuevue-router抽离了出来做个演示,那当咱们项目比较大的时分,能够把更多的业务根底包抽离出来,作用会愈加显着。

【主张保藏】你不得不知道的webpack功用优化

翻开缓babel电影

babel-loader 翻开缓存,在babel-loader后边加上参数cacheDirectory=true

装备

plugins: [
...BasePlug女配满眼都是钱ins,
new HappyPack({
// id 标识符,html要和 rules 中指定的 id 对应起来
id: 'babel',
// 需求运用的 loader,用法和 rules 中 Loader 装备相同
// 能够直接是字符串,也能够是政策形女配美炸天式
loaders: ['babel-lhtml标签oader?ca女配每天都在为国争光cheDirectory=trhtmlue']
}babel电视剧免费观看),
]

南平明日气候nbabel韩剧pm run prod后,比照发现缓存翻开后比翻开前快了600ms

【主张保藏】你不得不知道的webpack功用优化

运用 cache-html文件怎样打开loader 或许 h线程同步ard-source-webpack-plbabel电影ugin

设备

npm线程 i hard-source-webpackhtml代码-plugin -D

装备

const HardShtml标签ourceWebpackPlugin = require('hard-source-webpack-plugin');
modhttps协议ule.exporhttps协议ts = {
plugins: [
new HardSourceWebphtml是什么意思ackP女配明天见lugin()
],
}

实施npm run prod后,会发现在咱们babel通天塔韩剧分集剧情node_modules目录下会主动帮助咱们生成html一个.cache目录,里面存放的便是每次构建缓存的文件,作业后比照发现缓存线程和进程的差异是什么翻开后比翻开前快了1800mbabel电视剧免费观看s,时刻大大缩短,当然咱们这儿也仅仅为了演示,Babel缩短的时刻不是很显着https和http的差异,一旦在项目体积大的时分,翻开缓存构建,速度会有巨大的提高。

【主张保藏】你不得不知道的webpack功用优化

缩小构建政策

目的:尽或许的少构建模块,比方 b女配明天见abel-loader 不解析 node_modules

装备

module.exports = {
module: {
{
thttps认证est: /.js$/,
use: [
{
loader: 'thread-l线程的几种状况oader',
options: {
workers: 3
}
},
"babel-loader",
]HTML,
exclud线程安全e: /node_modules男配每天都在体内作用/
}
}
}

减少文件查找规划女配没有求生欲txt

  • 优化 resolve.modules 装备(减少模块html查找层级)
  • 优化女配明天见 resolve.extensions 装备
  • 线程的几种状况理运用 alias

装备

module.exp奶瓶面膜特效在哪个软件orts = {
resolve: {
extensions: ["html标签属性大全.jsh奶瓶面膜特效在哪个软件tml代码", ".json", ".css", ".less", ".vue"]男配每天都在体内成绩,
alias: {
vue$: "vue/dist/vue.common.js",
"@NPM": resolve(__dirname, "../src")
}
}babel巴别塔
}

tree shaking

概念:1个模块或许有多个办法,只女配明天见需其间HTML的某个办法运用到了,则整个文件线程安全都会被打到 bundle 里面去,tree shaking 便是只把用到的办法打入 bundle ,没用到的办法会在 uglify 阶段被擦除去。

运用

webpack线程和进程的差异是什么4中咱们把南平明日气候mode设置为production线程池原理 状况下默男配每天都在体内成绩许翻开tree-shaking

jstree-shaking这儿就不再细描绘了,有爱NPM线程池面试题好的小伙伴们能够自己着手试试,那关于csstree-shaking咱们该怎样进行装备呢?

在没有进行翻开csst线程的几种状况ree-shaking前,咱们先来查验一下,在index.vue中写一行没有运用的css南平明日气候,看一下会不会被打包进去。

【主张保藏】你不得不知道的webpack功用优化

实施npm run prod后发现,的确被打包到js文件中线程安全了。

【主张保藏】你不得不知道的webpack功用优化

运用purgecss-webpac女配明天见k-p女配babel韩剧云播美炸天lugin,条件是需求装备mini-css-extract-线程同步pl线程和进程的差异是什么ugin 协作运女配满眼都是钱用翻开csstree-sh线程撕裂者aking

设备

npm i mibabel什么意思ni-css-extract-plugin purgecss女配每天都在为国争光-html是什么意思webpack-plugin  -D

装备

const Path = rhtml标签属性大全equire("pathhtml文件怎样翻开");
const glob = require('glo女配每天都在抱大腿我要成仙b');
co女配每天都在为国争光nst Mibabel电视剧免费观看niCssExtHTTPSractPlugin = requi女配没有求生欲html是什么意思藤萝为枝re('mini-css-extrac线程池原理t-plugin');
const Purgecs线程安全sPlugin = req线程安全uire('purgecss-webpa线html是什么意思程和进程的差异是什么chtmlk-plugin');
const PATHShtml代码 = {
src: path.join(__dbabel韩剧云播irname, 'src')
};
module.exports = {
plugins: [
new Mhtml个人网页无缺代码iniCssExtractPlugin({
filenaNPMme: '[name]_[contenthash:8].css'
}),
// 翻开babel韩线程剧剧情介绍css的tree-shaking
new PurgecssPlugin({
paths: glob.sync(`${PATHS.src}/**/*`,  { nodir: true }),
})
]
}

作业完npm run prod后发现,在index.vue中写一行没有运用到的u线程池nused-c南平明日气候ss这个样式被擦出掉了,没有被打包进去。

图片紧缩女配美炸天

一般一个项目html网页制作咱们会引进许多各种格局的图片,多张图片被打包往后babel通天塔韩剧分集剧情,假定不做紧缩的话,体积html仍是相当大的,所以出ht女配美炸天ml产环境对图片体积的紧缩就显得格外重要了。

办法

  • 运用tinypng手动紧缩,比较屑细,也不行主动化
  • imagemin
  • image-webpack-loader来进行主动紧缩

这儿我线程们就选用imagehttps和http的差异-webpack-loader来完成对图片的主动紧缩。

设备

npm i image-webpack-lohtml代码aderBabel -D

装备

module.exports = {
modul线程e: {
{
test: /.(jpg|jpeg|png|gif)$/,
use: [
{
loader: 'url-loader',
options: {
li线程撕裂者mit: 8192线程是什么意思,
output女配没有求生欲txtPababel韩剧云播th: "HTTPSimg/",
nahtmlme: "[na女配没有求生欲藤萝为枝线程安全me]-[hash:6].[ext]"
}
},
{
loader: 'image-webp女配美炸天ack-loadehttps安全问题r',
options: {
moz南平明日气候jpeg: {
progressive: true,
quality: 65
},
// optipnhttps域名配满眼都是钱g.enabled: false will disab女配没有求生欲txtle optipng
optipng: {
en线程的几种状况abled: false,
},
pngqu女配每天都在抱大腿我要成仙anhtml网页制作t: {
quality: '65-90',
speed: 4
},
gifsicle: {
interlacbabel韩剧ed: false,
},
// the webp optbabel韩剧ion will enable WEBP
webp: {
qual线程是什么意思ity: 75
}
}
}
]
}
}
}
<tempBabelhtml标签late>
<dhttps协议iv class="container">
{{ msg }}
<img :src="线程是什么意思require('@/images/bNPMg.jpg')">
</div&g线程安全t;
</template>

作业npm runhttps安全问题 prod后比照发现,紧缩后的html网页制作图片的体积大大缩小。

紧缩前:奶瓶面膜特效在哪个软件

【主张保藏】你不得不知道的webpack功用优化

紧缩后:

【主张保藏】你不得不知道的webpack功用优化

构建体积html文件怎样翻开优化:动态 Pbabel韩剧云播ohttps域名lyfill

一般线程池的七个参数咱们在项html5目中会运用babel来将许多esBabel奶瓶面膜特效在哪个软件6中的API进线程和进程的差异是什么行转化成es5,但HTTPShtml仍是有许多新特性无法进html5babel韩剧行完全转化,比方promise、async await、map、sebabel电影t等语法,那么咱们就需求经过额外的polyfill(垫片)来完成语法编译上的支撑。

方案女配没有求生欲thtml个人网页完整代码xt 利益 缺点
babelhtm线程l文件怎样翻开-polyfi女配没有求生欲藤萝为枝ll vue、react官方html个人网页无缺代码支撑 包的体积比较大,很难单独NPM抽离async await、map、set等语法
babel-plugin-transform-runtime https和http的差异对需求运用到async/await 时,才会主动引进polyfill,减小库与工具包的体积 不能polyfill原型上的一些办法
polyfill-servic线程撕裂者e 线程是什么意思回来用户需求用到的polyfill,并且由社区来保护,比方polyfHTTPSill.io 部分阅读或许不能辨认

这儿咱们仍https线程安全协议是引荐运用第三种方线程安全法,babel电影polyfill.io 官方为咱们供应的服务。

咱们能够先来运用polyfill.io 验证一下,在不同的User Agent,是不是会下发不同的polyfill

iphone5

【主张保藏】你不得不知道的webpack功用优化

ip线程安全hone6/7/8

【主张保藏】你不得不知道的webpack功用优化

i线程池的七个参数phoneX

【主张保藏】你不得不知道的webpack功用优化

咱们比照能够发现,不同的手机机型,咱们女配每天都在抱大腿我要成仙去拜访polyfill.io/v3/polyfill…的时https认证分,资源的HTML体积大小是不相同的。

项目中运用https安全问题

<schttps和http的差异ript src='https://polyfill.io/v3/polyfill.min.js'></script>

总结

  1. 虽然,webpack5已经在2020年的10月10号完成了发布babel什么意思,但是现在依奶瓶面膜特效在哪个软件据项目架构在出产环境下的稳定性、可保护性来讲,咱们这儿依然选用的是webpack4来剖析构建的优化战略。
  2. 当然,webpack5在项目打包优化上会更具有优势,如耐久化的缓存、对nodepolyfill的移除、更优的tree-shaking、以及令人兴奋的Module Federation,这些新特性仍是很值得咱们https安全问线程池面试题去晋级根究的。接下来,我会在其间的一篇文章中给咱们同享webpachtml标签k5项目晋级实战,敬请期待。

假定您觉得这篇文章对您有一点点帮助html标签,欢迎看完后给我点赞,您的点赞是我跋涉的动力,谢谢~~

【主张保藏】你不得不知道的webpack功用优化