閱讀完該文章大概須要2.5min。html
讀完該篇文章你能學到前端
vue-cli
默認作了哪些優化?- 在cli的基礎上咱們又能作哪些優化?
vue.config.js
中如何配置一些經常使用的plugin
和loader
vue-cli
的出現,讓咱們省掉了配置webpack的時間。也就是說,一個不懂webpack的人,也能直接上手開發。好比file-loader
,url-loader
會提早爲咱們配置好。vue性能方面,
vue-cli
也默認儘量多的幫咱們作了優化,好比cache-loader會在項目中預先作了配置。咱們能夠在控制檯輸入vue inspect > webpack.config.js
,便可在webpack.config.js文件中查看cli預先定義好的基礎配置。咱們今天就在vue-cli搭建好的項目基礎上聊一聊可優化的點。node
本文所用到的項目源碼jquery
speed-measure-webpack-plugin
插件能夠在build的時候看到webpack的loader和plugin所用的時間,配置很是簡單。以下:// vue.config.js
module.exports = {
chainWebpack: config => {
config.plugin('speed')
.use(SpeedMeasureWebpackPlugin)
}
}
複製代碼
webpack-bundle-analyzer
插件能夠幫咱們可視化的展現build時的每一個包的大小以及依賴。vue-cli也幫咱們作了默認的配置,我只須要在build的後面加一個參數--report便可。// package.json
{
"name": "dll-vue",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"report": "vue-cli-service build --report",
}
}
複製代碼
npm run report
以後,dist目錄下就多了一個report.html文件,咱們用瀏覽器打開這個文件看一下,右上角那個小藍塊是咱們的vue代碼,接下來咱們主要來優化小藍塊以外的代碼咱們一般配置include和exclude,來達到使loader僅僅處理匹配到的文件,像這樣webpack
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js[x]?$/,
use: ['babel-loader'],
include: [path.resolve(__dirname, 'src')]
}
]
},
}
複製代碼
而vue的transpileDependencies
屬性默認狀況下 babel-loader
會忽略全部 node_modules
中的文件,其實已經知足了咱們大部分需求。git
webpack
如何尋找模塊所對應的文件,好比import * from 'xxx',xxx模塊應該優先從node_modules中找,咱們經過vue inspect > webpack.config.js
導出的文件中在modules字段中能夠清晰的看到已經將node_modules設置爲優先尋找的模塊resolve: {
// ...
modules: [
'node_modules',
...
]
// ...
}
複製代碼
parallel
屬性的含義是:是否爲 Babel 或 TypeScript 使用 thread-loader
,默認值爲cpu的內核數,也就是說若是你係統是3核cpu,則build的時候,會自動在babel-loader和ts-loader執行時候開啓3個線程。若是你想試着本身的配置一下,能夠像下面這樣。(不過我試着本身配置了以後,彷佛沒什麼效果。也許是我配置的不對,歡迎你們來指正)config.module.rule('vue')
.use('thread-loader')
.loader('thread-loader')
.before('vue-loader')
複製代碼
noParse
來標識這個模塊,這樣 Webpack
會引入這些模塊,可是不進行轉化和解析,從而提高 Webpack
的構建性能 ,例如:jquery
、lodash
,vue.config.js
中能夠這樣配置:// vue.config.js
module.exports = {
//...
configureWebpack:{
module: {
noParse: /^(lodash|moment)$/
}
}
//...
}
複製代碼
// vue.config.js
module.exports = {
//...
configureWebpack:{
plugins: [
new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn/)
]
}
//...
}
複製代碼
<-- public/index.html -->
<script src="https://code.jquery.com/jquery-3.6.0.min.> js"></script> 複製代碼
// App.vue\
import $ from 'jquery'
$('.today').text = 'today'
複製代碼
externals
來達到build時忽略掉指定的依賴// vue.config.js
module.exports = {
//...
configureWebpack:{
config.externals = {
jquery: 'jQuery'
}
}
//...
}
複製代碼
// vue.config.js
module.exports = {
//...
configureWebpack:{
config.optimization.minimizer = [
new UglifyJsPlugin({
uglifyOptions: {
compress: {
drop_console: true, // 去掉console
}
parallel: true, //默認併發運行數:os.cpus().length - 1
}
})
]
}
//...
}
複製代碼
//vue.config.js
module.exports = {
//...
configureWebpack:{
plugins: [
new CompressionWebpackPlugin()
]
}
//...
}
複製代碼
manifest.json
這個文件。讓咱們從接下來的實戰中來學習它。// webpack.dll.config.js
module.exports = {
mode: 'production',
entry: {
vue_vendor: ['vue/dist/vue.runtime.esm.js', 'vuex', 'vue-router', 'element-ui'],
other_vendor: ['lodash', 'moment']
},
output: {
filename: '[name].dll.js',
path: path.resolve(__dirname, './public/dll'),
library: '[name]_[hash]'
},\
plugins: [
new webpack.DllPlugin({
name: '[name]_[hash]',
path: path.resolve(__dirname, '[name].manifest.json')
})
]
}
複製代碼
// package.json
{
.....
"scripts": {
.....
"dll": "webpack --config ./webpack.dll.config.js"
}
.....
}
複製代碼
npm run dll
後能夠看到生成兩個manifest文件,像這樣add-asset-html-webpack-plugin
)module.exports = {
chainWebpack: config => {
// 多個manifest.json文件就須要寫屢次
config.plugin('vendorDll1')
.use(webpack.DllReferencePlugin, [
{
context: __dirname,
manifest: require('./public/manifest/other_vendor.manifest.json')
}
])
config.plugin('vendorDll2')
.use(webpack.DllReferencePlugin, [
{
context: __dirname,
manifest: require('./public/manifest/vue_vendor.manifest.json')
}
])
// 將dll下的文件自動插入到index.html中
config.plugin('asset')
.use(AddAssetHtmlWebpackPlugin, [
[
{
filepath: path.resolve(__dirname, 'public/dll/vue_vendor.dll.js'),
outputPath: 'dll',
publicPath: '/dll'
},
{
filepath: path.resolve(__dirname, 'public/dll/other_vendor.dll.js'),
outputPath: 'dll',
publicPath: '/dll'
}
]
])
}
}
複製代碼
//vue.config.js
module.exports = {
//...
chainWebpack: config => {
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {}
})
}
//...
}
複製代碼
extensions: ['.mjs', '.js', '.jsx', '.vue', '.json', '.wasm']
let a = 1
let b = 2
let c = a + b
// webpack自動優化爲
c = 3
複製代碼
該文章爲最近優化團隊項目webpack打包速度,作的總結。github
若是有不對的地方歡迎你們在討論區糾正web
歡迎關注公衆號:前端小卡
vue-router
若是以爲有用,歡迎點個贊啦