Skip to content

第二章:框架设计的核心要素

提升开发体验

一个优秀的框架衡量指标之一就是看他的开发体验

  1. Vue 通过 warn 函数提供了友好的警告信息,帮助用户定位问题。
  2. 在打印数据时,尤其是响应式数据,非常的不直观,Vue 通过 initCustomFormatter 函数自定义了控制台输出。

TIP

Chrome 下勾选 Console 里的 Enable custom formatters 选项,就可以看到更直观的打印。

控制框架代码体积

通过 __DEV__ 常量,将开发环境和生产环境区分。做到了在开发环境为用户提供友好的开发体验的同时,不增加生产环境代码。

良好的 Tree-Shaking

  1. 要想实现 Tree-Shaking,代码必须使 ESM 模块。
  2. 当函数调用时会对外部产生影响(例如修改了全局变量)这种情况无法实现 Tree-Shaking,我们成为有副作用。可以通过注释 /*#__PURE__*/ 来告诉打包工具,代码不会产生副作用。

输出的构建产物

  1. 在浏览器中使用 iife 模式
  2. 支持 ESM 的浏览器可以使用 vue.esm-browser.js
  3. 项目中使用 vue.esm-bundler.js

TIP

同样都是 esm -browser 和 -bundler 的区别?

  • browser 会将 __DEV___ 设置为 false
  • bundler 会将__DEV___ 设置为 process.env.NODE_ENV !== 'production',使其交给项目中的打包工具决定如何打包。
  1. 服务端渲染使用 CommonJS 规范,cjs

特性开关

Vue 提供了诸多特性并提供了对应的特性开关,开发者可以有选择的去取舍这些特性。

Vue 为了兼容 Vue2 的 options-api,提供了相关的代码支持,如果开发者明确知到代码不会使用选项式 API,那么可以将其 Tree-Shaking,从而减少资源体积。

javascript
// 借助 webpack.DefinePlugin 配置
new webpack.DefinePlugin({
  __VUE_OPTIONS_API__: JSON.stringify(false) // 开启或者关闭特性
});

错误处理

为了提高用户代码的健壮性和简洁性,Vue 提供了统一的错误处理函数。

javascript
let handlerError = null;
export default {
  foo(fn) {
    callWithErrorHandling(fn);
  },
  // 用户调用该方法注册错误回调
  registerErrorHandling(fn) {
    handlerError = fn;
  }
};
// 源码里也是用的该函数名
function callWithErrorHandling() {
  try {
    fn && fn();
  } catch (e) {
    // 将捕获到的错误传递给用户,用户可以选择忽略 或者将其上报给错误监控系统
    handlerError(e);
  }
}

良好的 TS 支持