路由懒加载、组件懒加载

引入组件注册路由

合理使用 Tree shaking

Tree shaking 的作用:消除无用的 JS 代码,减少代码体积
举个 🌰:

  1. // util.js
  2. export function targetType(target) {
  3. return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();
  4. }
  5. export function deepClone(target) {
  6. return JSON.parse(JSON.stringify(target));
  7. }

项目中只使用了 targetType 方法,但未使用 deepClone 方法,项目打包后,deepClone 方法不会被打包到项目里

tree-shaking 原理:
依赖于 ES6 的模块特性,ES6 模块依赖关系是确定的,和运行时的状态无关,可以进行可靠的静态分析,这就是 tree-shaking 的基础
静态分析就是不需要执行代码,就可以从字面量上对代码进行分析。ES6 之前的模块化,比如 CommonJS 是动态加载,只有执行后才知道引用的什么模块,就不能通过静态分析去做优化,正是基于这个基础上,才使得 tree-shaking 成为可能

Tree shaking 并不是万能的

并不是说所有无用的代码都可以被消除,还是上面的代码,换个写法 tree-shaking 就失效了

  1. // util.js
  2. export default {
  3. targetType(target) {
  4. return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();
  5. },
  6. deepClone(target) {
  7. return JSON.parse(JSON.stringify(target));
  8. }
  9. };
  10. // 引入并使用
  11. import util from '../util';
  12. util.targetType(null)

同样的,项目中只使用了 targetType 方法,未使用 deepClone 方法,项目打包后,deepClone 方法还是被打包到项目里

究其原因,export default 导出的是一个对象,「无法通过静态分析判断出一个对象的哪些变量未被使用,所以 tree-shaking 只对使用 export 导出的变量生效」
这也是函数式编程越来越火的原因,因为可以很好利用 tree-shaking 精简项目的体积,也是 vue3 全面拥抱了函数式编程的原因之一

使用骨架屏缩短白屏时间