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

相关推荐
F-2H36 分钟前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱056739 分钟前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
gqkmiss1 小时前
Chrome 浏览器插件获取网页 iframe 中的 window 对象
前端·chrome·iframe·postmessage·chrome 插件
m0_748247553 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
m0_748255024 小时前
前端常用算法集合
前端·算法
真的很上进4 小时前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
web130933203984 小时前
vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法
前端·vue.js·elementui
NiNg_1_2345 小时前
Echarts连接数据库,实时绘制图表详解
前端·数据库·echarts
如若1235 小时前
对文件内的文件名生成目录,方便查阅
java·前端·python
滚雪球~6 小时前
npm error code ETIMEDOUT
前端·npm·node.js