一、開發階段優化
1. 熱更新加速(HMR)
// vue.config.js
module.exports = {devServer: {hot: true, // 開啟熱更新injectClient: true, // 自動注入HMR客戶端watchOptions: {ignored: /node_modules/, // 忽略node_modules變化aggregateTimeout: 300 // 防抖延遲}}
}
效果:修改組件代碼時,僅更新當前組件而非整個頁面。
2. 減少Loader處理范圍
// 針對babel-loader優化
{test: /\.js$/,include: [ // 明確處理范圍path.resolve(__dirname, 'src'),path.resolve(__dirname, 'node_modules/vue-awesome')],use: ['babel-loader?cacheDirectory'] // 啟用緩存
}
二、構建速度優化
1. 多線程并行處理
const ThreadLoader = require('thread-loader');// 預熱線程池
ThreadLoader.warmup({workers: 2,workerParallelJobs: 50
}, ['babel-loader']);// 配置
{test: /\.js$/,use: [{loader: 'thread-loader',options: { workers: 2 }},'babel-loader']
}
2. 緩存策略
// 持久化緩存(Webpack5+)
cache: {type: 'filesystem',buildDependencies: {config: [__filename] // 配置文件變化時緩存失效}
}
三、產物體積優化
1. Tree Shaking優化
// package.json 標記副作用文件
{"sideEffects": ["*.css","*.vue" // Vue單文件組件默認有副作用]
}// 確保使用ES模塊導入
import { Button } from 'element-ui' // ? 按需加載
import ElementUI from 'element-ui' // ? 全量引入
2. 按需加載第三方庫
// 以Element-UI為例
const components = ['ElButton', 'ElInput'];
const plugins = ['ElLoading'];plugins.forEach(plugin => {app.use(require(`element-ui/lib/${plugin.toLowerCase()}`));
});
3. 圖片壓縮(Webpack5+)
{test: /\.(png|jpe?g|webp)$/,type: 'asset',parser: {dataUrlCondition: {maxSize: 8 * 1024 // 8KB以下轉base64}},use: [{loader: 'image-webpack-loader',options: {mozjpeg: { quality: 65 },webp: { quality: 75 }}}]
}
四、Vue專項優化
1. 模板預編譯
// vue-loader配置
{loader: 'vue-loader',options: {compilerOptions: {whitespace: 'condense' // 壓縮模板空白字符},reactivityTransform: true // 啟用響應性語法糖}
}
2. 異步組件分割
// 路由配置示例
const UserDetails = () => import(/* webpackChunkName: "user" */ './views/UserDetails.vue'
);
3. 運行時版本構建
// vue.config.js
module.exports = {configureWebpack: {resolve: {alias: {'vue$': 'vue/dist/vue.runtime.esm-bundler.js' // 使用無編譯器版本}}}
}
效果:減少約30%的Vue核心庫體積。
五、高級優化方案
1. 模塊聯邦(微前端場景)
// 模塊提供方配置
new ModuleFederationPlugin({name: 'app1',filename: 'remoteEntry.js',exposes: {'./Button': './src/components/Button.vue'}
});// 消費方配置
remotes: {app1: 'app1@http://localhost:3001/remoteEntry.js'
}
2. Gzip壓縮(需配合Nginx)
const CompressionPlugin = require('compression-webpack-plugin');new CompressionPlugin({test: /\.(js|css|html|svg)$/,threshold: 10240, // 10KB以上文件壓縮algorithm: 'gzip'
})
優化效果對比
優化項 | 構建時間 | 產物體積 | 首屏加載 |
---|---|---|---|
基礎配置 | 45s | 4.2MB | 2.8s |
多線程+緩存 | 22s (-50%) | - | - |
Tree Shaking+按需加載 | - | 2.1MB (-50%) | 1.5s |
Gzip壓縮 | - | 1.3MB (-70%) | 0.9s |