前言
第一章我已经觉得有所收获了,写的很精彩,接下来就是第二章了,框架设计的核心要素,应该是框架的大体轮廓的介绍吧。
构建产物、模块格式、警告信息、定位问题、开发和生产的区别、热更新的支持、树摇(去掉框架中没用到的功能代码)。
很不错,得好好看看,开始。
用户的开发体验提升
开发的体验提升,出了开发快之外,有时还会因为不小心、没注意从而导致使用了不对的变量或者函数,这个时候控制台的报错或者告警信息就显得尤为重要了。
最明显的就是你把vue的应用挂载到一个不存在的dom上,这时候就会告诉你挂载失败,该dom不存在。
还有就是输出vue的对象,在开发的时候,vue3是有自定义输出对象的formatter的,但是需要你在开发人员工具的Console面板中勾选Enable custom formatters这个复选框,这样你就不会看到很复杂的对象结构了,比如ref对象。
框架代码体积的控制
vue3的源码中有__DEV__这个常量,可以用来区分环境,如果为开发环境,那就正常执行里面的操作,如果为非开发环境,那么就会在打包的时候直接移除掉。
vue都是用rollup打包的,这个常量也是通过它的插件来定义的。
vue3在输出资源时会针对不同环境来输出资源文件,开发时输出vue.global.js,生产时输出vue.global.prod.js,生产的资源那文件中不会有__DEV__以及用__DEV__来作为判断依据的那部分代码。
这样一来,开发时的告警信息不会在生产环境中出现,从而减少了很多的开发环境时的框架代码,于是就在不影响开发体验的同时还控制了框架代码的体积。
框架要做到良好的tree-shanking
树摇只在es模块中起作用,因为es模块是静态的结构,才可以将没有使用到的代码给剔除掉。
最早rollup这个工具中出现的,现在webpack也支持。
通过常量__DEV__来去除告警信息的代码,通过树摇来去除框架中未使用到的代码。
当遇到静态分析后很难去除的js代码,可以通过一个机制来去除,很难去除的代码是因为可能会有副作用,只要你写上/*#__PURE__*/
,就等于告诉rollup,这段代码没有副作用,可以去除它。
一般来说只有模块内的顶级调用才会触发函数的副作用,如果这个函数A的调用是包裹在另一个函数B中,那么只要另一个函数B不调用,树摇就会去除函数B了。如果函数A是直接在模块内直接调用,那么树摇才会觉得它可能会产生副作用,于是就不会移除函数A。
框架输出的产物
vue3 输出的产物格式有以下几种:
IIFE:立即调用的函数表达式,用于直接在浏览器中使用,比如 (function (exports) {...})(obj)
,自调用函数。
ESM:es模块,用于script=module时的直接在浏览器使用。
CommonJS:Nodejs的写法,用于服务器端渲染时的使用。
IIFE 可以直接用script引入,从而可以在页面中直接使用vue。
ESM 可以在浏览器中直接使用import的方式来使用vue。
CommonJS:通过require来使用vue。
特性开关
vue3 兼容了 vue2,但是如果你的项目中用不到vue2的组件选项的api功能特性,可以通过将预定义常量__VUE_OPTIONS_API__设置为false来关闭这样的特性。
这样一来,代码中只会包含vue3的组合式api的功能特性,而不会有vue2的组件选项式api的功能特性了,就会减少很多代码体积了。
错误处理
错误的处理可以单个单个的处理,比如你在调用这个函数的时候给它外层加上try catch。这个会导致你写很多遍 try catch。
错误的处理可以统一的处理,比如封装一层,在这一层里面去try catch,你只需要把函数传递进去就行。这个会导致错误处理catch的行为与封装的这层耦合到一起了。
错误的处理统一处理,可以再升级以下,留一个定制的接口,通过这个接口可以设置如何处理try catch后的错误。这个将错误处理catch的行为与封装的这层解耦了。
错误的处理全局处理,可以将所有的错误都进行收集,通过留一个定制的接口,只要发生错误,都可以通过这个接口收集到所有try catch后的错误信息。这个用于全局处理异常,更为方便。
感觉其实很多重复的操作都可以经过这一层的封装噢。比如axios请求的catch,也可以这样做,将多个请求的catch统一处理,也支持你自己定制。
良好的TS类型支持
TS 是微软开源的基于JS的超集编程语言,能为JS提供类型支持。
TS可以做到代码即文档、编辑器自动提示、能避免低级BUG、增强代码的可维护性。所以它能作为评价一个框架是否完善的重要指标。
并不是使用TS就代表TS类型支持友好,如果你老使用any,可能它的那些好处也几乎没用了。有时你想给你的项目弄到完善的TS支持,可能会因此在一开始的时候产生数倍的工作量,它需要花很大的力气,不过它会在之后的开发与维护过程中非常的方便,因为前期完善了这些TS支持,后面就可以享受到它的好处带来的体验与效率。
总结
开发体验对于一个框架来说很重要。框架的体积、输出的资源格式、特性的开关、错误的处理、类型支持,都是衡量一个框架是否完善的指标。
vue在这方面表现很不错,特别是vue3更加优秀了。大大的降低了开发时的心智压力。