【Vue设计与实现】框架设计的核心要素

前言

本章主要介绍从用户的开发体验、控制框架代码的体积、Tree-Shaking 的工作机制、框架产物、特性开关、错误处理、TypeScript 支持等几个方面出发,讨论了框架设计者在设计框架时应该考虑的内容。

提升用户的开发体验

衡量一个框架是否足够优秀的指标之一就是看它的开发体验如何,例如完善的报错信息、自定义的initCustomFormatter log封装等。

控制框架代码的体积

这里讲到了使用rollup对Vue进行打包构建,以及Vue在缩小代码体积的一些措施,如告警代码通过rollup配置的__DEV__来控制是否使用,在正式环境中__DEV__为false,警告代码会被认定为不会被执行的死代码而不打包入最终代码。

arduino 复制代码
rollup 只是用于 Vue 发布文件的构建,对用户使用没有直接影响。

之前用 webpack 打包,还是会自带一个小型的动态 module 加载机制,并且每个文件是包在一个模块函数里的。rollup 打包通过重命名 import binding 直接把所有文件的函数都放在同一个函数体里面... 所以最终出来的文件会小一些,并且初始化快个十几毫秒的样子。
  
作者:尤雨溪  
链接:https://www.zhihu.com/question/37861778/answer/73847503  
来源:知乎  

框架要做到良好的Tree-Shaking

想要实现 Tree-Shaking,必须满足一个条件,即模块必须是ESM(ES Module),因为 Tree-Shaking 依赖 ESM 的静态结构。

现在无论是 rollup.js 还是 webpack,都支持 Tree-Shaking。

使用 __PURE__ 可以告诉rollup或webpack该函数不会产生副作用如果需要tree-shaking可以放心进行。

在编写框架的时候需要合理使用 /*#__PURE__*/ 注释。如果你去搜索 Vue.js 3 的源码,会发现它大量使用了该注释。 如:

框架应该输出怎样的构建产物

复制代码
在源码的dev.js中可以看到Vue在输出资源时有iife、cjs、esm三种格式。

IIFE格式

有时用户会希望可以直接在 HTML 页面中使用 <script>标签引入框架并使用。

JavaScript 复制代码
01 <body>
02   <script src="/path/to/vue.js"></script>
03   <script>
04   const { createApp } = Vue
05   // ...
06   </script>
07 </body>

vue.global.js就是IIFE格式的资源可以方便用户直接通过src引入调用

javascript 复制代码
01 var Vue = (function(exports){
02   // ...
03   exports.createApp = createApp;
04   // ...
05   return exports
06 }({}))

ESM格式

在vue源码中ESM格式文件也有两种,用于浏览器的vue.runtime.esm-browser.js和用于打包工具使用的vue.runtime.esm-bundler.js。

CJS格式

当进行服务端渲染时,Vue.js 的代码是在 Node.js 环境中运行的,而非浏览器环境。在 Node.js 环境中,资源的模块格式应该是CommonJS,简称 cjs。为了能够输出 cjs 模块的资源,我们可以通过修改 rollup.config.js 的配置 format: 'cjs' 来实现。

特性开关

css 复制代码
在设计框架时,框架会给用户提供诸多特性(或功能),例如我们提供 A、B、C 三个特性给用户,同时还提供了 a、b、c 三个对应的特性开关,用户可以通过设置 a、b、c 为 true 或false 来代表开启或关闭对应的特性。

比如用户在 Vue.js 3 中仍然可以使用选项 API 的方式编写代码,这时vue源码中的__VUE_OPTIONS_API__变量就会控制打包时shaking掉Composition API这一部分的代码。

错误处理

在源码中提供了registerErrorHandler 函数,用户可以使用它注册错误处理程序,然后在 callWithErrorHandling 函数内部捕获错误后,把错误传递给用户注册的错误处理程序。

这样可以保证用户侧的代码简介健壮。

javascript 复制代码
01 import utils from 'utils.js'
02 // 注册错误处理程序
03 utils.registerErrorHandler((e) => {
04   console.log(e)
05 })
06 utils.foo(() => {/*...*/})
07 utils.bar(() => {/*...*/})

良好的 TypeScript 类型支持

Vue.js 源码中的 runtime-core/src/apiDefineComponent.ts 文件,整个文件里真正会在浏览器中运行的代码其实只有 3 行 ,但是全部的代码接近 300 行,其实这些代码都是在为类型支持服务。由此可见,框架想要做到完善的类型支持,需要付出相当大的努力。

总结

本章节内容主要介绍了Vue框架通过完善的开发体验、代码体积控制、Tree-Shaking、构建产物输出、特性开关、错误处理以及良好的TypeScript类型支持,提供了强大而友好的开发环境,为开发者提供了便捷、高效的工具。从框架设计的视角引领读者学习Vue的设计思想,后续章节将会更详细的介绍Vue的设计思路。

相关推荐
吴永琦(桂林电子科技大学)23 分钟前
HTML5
前端·html·html5
爱因斯坦乐26 分钟前
【HTML】纯前端网页小游戏-戳破彩泡
前端·javascript·html
恋猫de小郭31 分钟前
注意,暂时不要升级 MacOS ,Flutter/RN 等构建 ipa 可能会因 「ITMS-90048」This bundle is invalid 被拒绝
android·前端·flutter
大莲芒4 小时前
react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react17
前端·react.js·前端框架
木木黄木木6 小时前
html5炫酷3D文字效果项目开发实践
前端·3d·html5
Li_Ning217 小时前
【接口重复请求】axios通过AbortController解决页面切换过快,接口重复请求问题
前端
胡八一8 小时前
Window调试 ios 的 Safari 浏览器
前端·ios·safari
Dontla8 小时前
前端页面鼠标移动监控(鼠标运动、鼠标监控)鼠标节流处理、throttle、限制触发频率(setTimeout、clearInterval)
前端·javascript
再学一点就睡8 小时前
深拷贝与浅拷贝:代码世界里的永恒与瞬间
前端·javascript
CrimsonHu8 小时前
B站首页的 Banner 这么好看,我用原生 JS + 三大框架统统给你复刻一遍!
前端·javascript·css