vite打包优化

612 阅读2分钟

无论是用webpack 还是vite 这些打包效果都是一样的

这里使用的打包工具是vite

为了查看其中第三方库的打包的大小 这里做了一些配置

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
  plugins: [vue()],
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          echarts: ['echarts'],
          lodash: ['lodash'],
          lodashes: ['lodash-es'],
          vue: ['vue'],
          // 使用 Cherry-pick的时候再打开下方两行配置
          // throttle: ['lodash/throttle'],
          // cloneDeep: ['lodash/cloneDeep'],
        },
      },
    },
  },
})

一、清除没有页面中引用了但是没有使用的组件

image.png 例如上图 我们引用了一个使用了ecahrts的组件但是没有使用它,但是在打包的时候仍然将echarts打包了!! 我们将其删除再打包看看

image.png 这样它就不会打包ecahrts的代码啦

二、使用lodash-es 去替代 lodash (如果您仍然在使用ie9之前的ie浏览器,请跳过此条)

什么是lodash-es?

lodash-es 是lodash的 es modules版本。在早期,lodash为了兼容大部分浏览器而采用了commonjs的方式进行打包 随着时代的更替 现在大部分浏览器都已经支持es modules的方式进行导入导出。

在打包时 lodash-es 比 lodash 更有优势

lodash

image.png

我们可以看到 我就导入lodash之后打包文件多了70多kb 原因是lodash是不支持esmodules的方式导出的, 我们这样的导入相当于将lodash整个导入进来了

(按道理来讲 打包工具应该会做treeShaking 将没用的代码给去除掉的 后续搞明白了再更新)

你可能会想 会不会就是 cloneDeep这个函数就这么大呢? 其实不是的,我们换个方式继续导入来看看

image.png 可以看到 我们打包的lodash 仍然是70多kb!!! 那么有没用办法解决这种情况呢? 答案是有的,我们再换个方式来看看(Cherry-pick 方式)

image.png 可以看到 我们导入了两个函数占了差不多15Kb!! 但是这种也有一个问题 + 如果多个地方使用lodash 我们这样引用则会非常麻烦

lodash-es

首先我们看下 完整引入lodash-es的文件大小

image.png 我们可以看到完整引用的代码体积是 85Kb 接下来我们按需引用

image.png 我们可以看到 按需引用之后文件大小为 14.8KB和上方使用Cherry-pick 方式的一致!(因为lodash-es是按照esmodules的方式打包的 所以可以直接用es的方式按需加载) 这样就会方便很多!