权衡的艺术

框架通常可以分为命令式(如jQuery)和声明式(如vue.js),命令式关注结过程,声明式关注结果。
框架本身是封装了命令式代码,面向用户的声明式。声明式代码的性能不优于命令式,但是声明书代码的可维护性更好。框架设计者需要做到,在维持可维护性的同时让性能更小化。
声明式代码的更新性能消耗=找出差异的消耗+直接修改的性能消耗,虚拟DOM就是为了最小化找出差异的消耗而出现的。JavaScript的运算会比大量的重绘和重排的性能开销要小的多,而innerHTML修改页面会导致重绘和重排,因此性能最差,而使用原生DOM API可维护性太差。
框架在设计时有三种选择:

  • 纯运行时
  • 运行时+编译时
  • 纯编译时

纯运行时没有编译过程无法分析用户提供的内容,加入编译过程(如Vue.js)可以知道DOM和CSS的变化,进行优化。纯编译时(如Sevlte)内容必须编译后才能使用,丢失一定灵活性。

框架设计的核心要素

  • 提升用户的开发体验
    • 良好的错误提示和警告输出:错误的原因,源代码位置
  • 控制框架代码的体积
  • 良好的Tree-Shaking
    • 副作用只会出现在顶级调用中
    • 添加 /*#__PURE__*/注释可以,让 rollup.js、webpack 以及压缩工具(如 terser)都能识别它,对注释的代码进行Tree-Shaking
  • 框架应该输出怎样的产物