如何最小体积引用一个库-按需加载

333 阅读2分钟

按需加载

这里我们用 loadsh 作为例子,不同的引入方式会导致打包出来的体积不一样

我们采用 vite 的项目来举例说明

  • 使用 vite 脚手架创建一个项目
  • 使用 vite-bundle-visualizer 来分析打包后的体积

使用方式

全部引用

安装

pnpm run loadsh

引用方式

// App.vue 中 
import * as _ from "loadsh"; 
console.log(_.add(1, 2));

分析

安装 vite-bundle-visualizer

pnpm run vite-bundle-visualizer

在根目录下执行

npx vite-bundle-visualizer

可以看到,这里把 loadsh 全都引入了进来,体积有 527 KB

image.png

按需引入

安装

pnpm run loadsh

引用方式

我们不要傻乎乎去把所有的都引入进来,我们引入我们需要的方法就可以了

// App.vue 中 
import add from "loadsh/add"; 
console.log(add(1, 2));

分析

这里变成了8KB左右

image.png 无论是 Webpack 还是 vite 生产环境中使用的 Rollup,在打包构建的时候都会去解析模块,如果你使用的是 loadsh 而不是更精准的 loadsh/add ,它就会打包整个 loadsh 而不是 loadsh/add 这个模块。模块的一般的单位是 js 文件,你可以看到 loadsh 构建出来的是存在 add 这个 js 的,所以我们可以直接引用

image.png

当我们自己写代码的时候,写一整个的工具库,所有的方法都放在一个 js 文件中,那就巧妇难成无米之炊

如果你觉得这样写太难受了,可以使用插件 lodash-webpack-pluginbabel-plugin-lodash,本质上也是替换路径,只不过把手动书写变成了自动化

使用模块的Tree-shaking

我们这里使用 loadsh-es

安装

pnpm run loadsh-es

引用方式

我们不要傻乎乎去把所有的都引入进来,我们引入我们需要的方法就可以了

// App.vue 中 
import { add } from "lodash-es"; 
console.log(add(1, 2));

分析

这里的模块也小了,只有7KB左右

image.png

这个和上面的按需引入的原理就不太一样了,这里是使用了 ESModule 的方式,在构建的时候进行了 Tree-shaking,把一些不需要的代码给去除了

总结

看上去按需引入和后面的es模块引入差不多,但是实际上还是有区别的