基于 webpack 的 vue 项目优化

Vue 是一款流行的前端框架,它拥有很好的可维护性和性能。但是,在开发大型 Vue 应用时,你可能会遇到性能瓶颈。这时候,使用 webpack 进行项目优化是个不错的选择。本文将介绍一些基于 webpack 的 Vue 项目优化技巧。

1. 优化打包速度

在使用 webpack 打包 Vue 项目时,我们希望打包速度尽可能快。下面是一些提升打包速度的技巧:

1.1 使用 DLLPlugin

DLLPlugin 可以将第三方库(如 Vue、Vuex 等)打包成一个包,减少了每次构建时的依赖分析和打包耗时。具体操作步骤如下:

  1. 配置 webpack.config.dll.js 文件:
const path = require('path');
const webpack = require('webpack');

module.exports = {
  entry: {
    vendor: ['vue', 'vuex', 'vue-router', 'axios'] // 可根据项目需求自定义
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].dll.js',
    // library 需要和 DllPlugin 中的 name 一致
    library: '[name]_dll'
  },
  plugins: [
    new webpack.DllPlugin({
      path: path.join(__dirname, 'dist', '[name]-manifest.json'),
      // name 需要和 output.library 一致
      name: '[name]_dll'
    })
  ]
}
  1. 运行 webpack --config webpack.config.dll.js 命令,生成 vendor.dll.js 和 vendor-manifest.json 文件。

  2. 配置 webpack.config.js 文件:

const webpack = require('webpack');
const path = require('path');

module.exports = {
  // 首先引入 dll 文件
  entry: {
    app: './src/main.js',
    vendor: ['vue', 'vuex', 'vue-router', 'axios'] // 可根据项目需求自定义
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].js'
  },
  plugins: [
    // 然后告诉 webpack 使用 DllReferencePlugin 插件加载 vendor.dll.js 文件
    new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require('./dist/vendor-manifest.json')
    })
  ]
}

1.2 使用 HappyPack

HappyPack 可以让 webpack 适用多线程,从而加速构建时间。具体操作步骤如下:

  1. 安装 HappyPacknpm i happypack -D

  2. 配置 webpack.config.js 文件:

const Happypack = require('happypack');
const os = require('os');
const HappyThreadPool = Happypack.ThreadPool({ size: os.cpus().length - 1 });

module.exports = {
  ...
  module: {
    rules: [
      {
        ...
        use: ['happypack/loader?id=vue']
      },
      {
        ...
        use: ['happypack/loader?id=js']
      }
    ]
  },
  plugins: [
    ...
    new Happypack({
      id: 'vue',
      threadPool: HappyThreadPool,
      loaders: ['vue-loader']
    }),
    new Happypack({
      id: 'js',
      threadPool: HappyThreadPool,
      loaders: ['babel-loader']
    })
  ]
}

2. 优化代码分割

代码分割可以让我们将代码分成更小的块,以此来减小文件大小,提高加载速度。下面是一些优化代码分割的技巧:

2.1 使用 SplitChunksPlugin

SplitChunksPlugin 可以将公共代码提取到一个公共块中,避免代码重复。具体操作步骤如下:

  1. 配置 webpack.config.js 文件:
module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'all',
      minSize: 30000,
      maxSize: 0,
      minChunks: 1,
      maxAsyncRequests: 5,
      maxInitialRequests: 3,
      automaticNameDelimiter: '~',
      name: true,
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true
        }
      }
    }
  }
}

2.2 按需加载路由和组件

按需加载可以减小首屏加载大小,从而提高速度。具体操作步骤如下:

  1. 使用 webpackbabel 的动态 import()

  2. 使用 Vue 提供的异步组件:

Vue.component('async-component', () => import('./async-component'))

3. 优化文件体积

文件体积是影响加载速度的重要因素,下面是一些优化文件体积的技巧:

3.1 压缩代码

压缩代码可以减小文件大小,从而提高速度。在 webpack 中,我们可以使用 UglifyJsPlugin 插件对代码进行压缩:

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
  ...
  optimization: {
    minimizer: [
      new UglifyJsPlugin({
        uglifyOptions: {
          compress: {
            warnings: false,
            drop_console: true, // 删除所有的 console 语句
            collapse_vars: true,
            reduce_vars: true
          },
          output: {
            comments: false, // 删除所有注释
            beautify: false
          }
        }
      })
    ]
  }
}

3.2 减小图片大小

在 Vue 项目中,我们经常使用图片来装饰页面,但是图片过大会增加加载时间。这时可以使用如下技巧:

  1. 使用图片压缩工具,如 tinypng.com、kraken.io 等;

  2. 使用 base64 编码:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAABAQMAAADO7P..."/>

4. 其他技巧

  1. 配合使用 lint 工具和代码规范,避免不必要的代码冗余和错误;

  2. 使用 Tree Shaking,可以剔除项目中没有用到的代码,进一步减小文件体积。

总结

通过上述的优化技巧,我们可以让 Vue 项目在性能方面得到很大的提升。当然,这些技巧并不是绝对的,需要根据具体的项目情况去适配。希望这篇文章能够对大家有所启发。完整示例代码可见我的 GitHub

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65ac9001add4f0e0ff625aaf