针对vue项目的webpack优化攻略

[复制链接]
发表于 2025-5-26 14:12:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、开发阶段优化

1. 热更新加快(HMR)

  1. // vue.config.js
  2. module.exports = {
  3.   devServer: {
  4.     hot: true,  // 开启热更新
  5.     injectClient: true, // 自动注入HMR客户端
  6.     watchOptions: {
  7.       ignored: /node_modules/,  // 忽略node_modules变化
  8.       aggregateTimeout: 300      // 防抖延迟
  9.     }
  10.   }
  11. }
复制代码
效果:修改组件代码时,仅更新当前组件而非整个页面。
2. 镌汰Loader处理范围

  1. // 针对babel-loader优化
  2. {
  3.   test: /\.js$/,
  4.   include: [ // 明确处理范围
  5.     path.resolve(__dirname, 'src'),
  6.     path.resolve(__dirname, 'node_modules/vue-awesome')
  7.   ],
  8.   use: ['babel-loader?cacheDirectory'] // 启用缓存
  9. }
复制代码

二、构建速度优化

1. 多线程并行处理

  1. const ThreadLoader = require('thread-loader');
  2. // 预热线程池
  3. ThreadLoader.warmup({
  4.   workers: 2,
  5.   workerParallelJobs: 50
  6. }, ['babel-loader']);
  7. // 配置
  8. {
  9.   test: /\.js$/,
  10.   use: [
  11.     {
  12.       loader: 'thread-loader',
  13.       options: { workers: 2 }
  14.     },
  15.     'babel-loader'
  16.   ]
  17. }
复制代码
2. 缓存计谋

  1. // 持久化缓存(Webpack5+)
  2. cache: {
  3.   type: 'filesystem',
  4.   buildDependencies: {
  5.     config: [__filename] // 配置文件变化时缓存失效
  6.   }
  7. }
复制代码

三、产物体积优化

1. Tree Shaking优化

  1. // package.json 标记副作用文件
  2. {
  3.   "sideEffects": [
  4.     "*.css",
  5.     "*.vue"  // Vue单文件组件默认有副作用
  6.   ]
  7. }
  8. // 确保使用ES模块导入
  9. import { Button } from 'element-ui'  // ✅ 按需加载
  10. import ElementUI from 'element-ui'   // ❌ 全量引入
复制代码
2. 按需加载第三方库

  1. // 以Element-UI为例
  2. const components = ['ElButton', 'ElInput'];
  3. const plugins = ['ElLoading'];
  4. plugins.forEach(plugin => {
  5.   app.use(require(`element-ui/lib/${plugin.toLowerCase()}`));
  6. });
复制代码
3. 图片压缩(Webpack5+)

  1. {
  2.   test: /\.(png|jpe?g|webp)$/,
  3.   type: 'asset',
  4.   parser: {
  5.     dataUrlCondition: {
  6.       maxSize: 8 * 1024 // 8KB以下转base64
  7.     }
  8.   },
  9.   use: [
  10.     {
  11.       loader: 'image-webpack-loader',
  12.       options: {
  13.         mozjpeg: { quality: 65 },
  14.         webp: { quality: 75 }
  15.       }
  16.     }
  17.   ]
  18. }
复制代码

四、Vue专项优化

1. 模板预编译

  1. // vue-loader配置
  2. {
  3.   loader: 'vue-loader',
  4.   options: {
  5.     compilerOptions: {
  6.       whitespace: 'condense'  // 压缩模板空白字符
  7.     },
  8.     reactivityTransform: true // 启用响应性语法糖
  9.   }
  10. }
复制代码
2. 异步组件分割

  1. // 路由配置示例
  2. const UserDetails = () => import(
  3.   /* webpackChunkName: "user" */
  4.   './views/UserDetails.vue'
  5. );
复制代码
3. 运行时版本构建

  1. // vue.config.js
  2. module.exports = {
  3.   configureWebpack: {
  4.     resolve: {
  5.       alias: {
  6.         'vue$': 'vue/dist/vue.runtime.esm-bundler.js' // 使用无编译器版本
  7.       }
  8.     }
  9.   }
  10. }
复制代码
效果:镌汰约30%的Vue焦点库体积。

五、高级优化方案

1. 模块联邦(微前端场景)

  1. // 模块提供方配置
  2. new ModuleFederationPlugin({
  3.   name: 'app1',
  4.   filename: 'remoteEntry.js',
  5.   exposes: {
  6.     './Button': './src/components/Button.vue'
  7.   }
  8. });
  9. // 消费方配置
  10. remotes: {
  11.   app1: 'app1@http://localhost:3001/remoteEntry.js'
  12. }
复制代码
2. Gzip压缩(需共同Nginx)

  1. const CompressionPlugin = require('compression-webpack-plugin');
  2. new CompressionPlugin({
  3.   test: /\.(js|css|html|svg)$/,
  4.   threshold: 10240, // 10KB以上文件压缩
  5.   algorithm: 'gzip'
  6. })
复制代码

优化效果对比

优化项构建时间产物体积首屏加载基础设置45s4.2MB2.8s多线程+缓存22s (-50%)--Tree Shaking+按需加载-2.1MB (-50%)1.5sGzip压缩-1.3MB (-70%)0.9s
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

快速回复 返回顶部 返回列表