【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的设计思路。

相关推荐
齐 飞1 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
神仙别闹18 分钟前
基于tensorflow和flask的本地图片库web图片搜索引擎
前端·flask·tensorflow
GIS程序媛—椰子1 小时前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js
DogEgg_0011 小时前
前端八股文(一)HTML 持续更新中。。。
前端·html
ZL不懂前端1 小时前
Content Security Policy (CSP)
前端·javascript·面试
木舟10091 小时前
ffmpeg重复回听音频流,时长叠加问题
前端
王大锤43912 小时前
golang通用后台管理系统07(后台与若依前端对接)
开发语言·前端·golang
我血条子呢2 小时前
[Vue]防止路由重复跳转
前端·javascript·vue.js
黎金安2 小时前
前端第二次作业
前端·css·css3
啦啦右一2 小时前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习