我明白了,Vue3设计与实现-框架设计的核心要素读后感

简介: 第一章我已经觉得有所收获了,写的很精彩,接下来就是第二章了,框架设计的核心要素,应该是框架的大体轮廓的介绍吧。构建产物、模块格式、警告信息、定位问题、开发和生产的区别、热更新的支持、树摇(去掉框架中没用到的功能代码)。

前言

第一章我已经觉得有所收获了,写的很精彩,接下来就是第二章了,框架设计的核心要素,应该是框架的大体轮廓的介绍吧。

构建产物、模块格式、警告信息、定位问题、开发和生产的区别、热更新的支持、树摇(去掉框架中没用到的功能代码)。

很不错,得好好看看,开始。

用户的开发体验提升

开发的体验提升,出了开发快之外,有时还会因为不小心、没注意从而导致使用了不对的变量或者函数,这个时候控制台的报错或者告警信息就显得尤为重要了。

最明显的就是你把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更加优秀了。大大的降低了开发时的心智压力。

目录
相关文章
|
4天前
|
JavaScript 前端开发
在Vue2或Vue3中项目中使用 Isotope(同位素) 过滤和排序神奇的布局神器,全网独家实现!
本文介绍了在Vue2或Vue3项目中如何使用Isotope(同位素)布局库来创建动态的网格布局,并提供了详细的代码实现和效果展示,包括过滤和排序功能。
10 0
在Vue2或Vue3中项目中使用 Isotope(同位素) 过滤和排序神奇的布局神器,全网独家实现!
|
4天前
|
JavaScript
基于Vue2或Vue3实现任意上下左右拖拽悬浮的元素,且配置为自定义的全局指令
这篇文章介绍了如何在Vue 2或Vue 3项目中实现一个自定义的全局指令`v-dragSwitch`,用于创建可以任意方向拖拽并悬浮的元素,同时包含边界处理的逻辑。
21 2
基于Vue2或Vue3实现任意上下左右拖拽悬浮的元素,且配置为自定义的全局指令
|
4天前
|
前端开发 JavaScript API
基于Vue3+Hooks实现4位随机数和60秒倒计时
本文介绍了如何在Vue3中使用Hooks API来实现生成4位随机数和执行60秒倒计时的功能,并提供了详细的代码示例和运行效果展示。
21 1
基于Vue3+Hooks实现4位随机数和60秒倒计时
|
4天前
|
数据可视化 JavaScript
Vue3项目使用G6可视化组件实现一个树形机构图
在Vue 3项目中使用G6可视化组件库实现树形机构图的构建和展示。
30 1
Vue3项目使用G6可视化组件实现一个树形机构图
|
3天前
|
JavaScript 算法 API
Vue 3有哪些新特性
【8月更文挑战第16天】Vue 3有哪些新特性
15 1
|
4天前
|
JavaScript
基于Vue3实现简约型侧边栏
本文介绍了如何在Vue3项目中实现一个简约型侧边栏导航,包括配置路由、页面布局和导航交互,以及如何通过Vue Router和条件渲染实现动态内容展示。
22 1
|
4天前
|
JavaScript UED
如何在Vue3项目中使用防抖节流技巧
在Vue 3项目中使用防抖和节流技巧以优化组件性能,包括使用`lodash`库和自定义实现这两种方法。
7 0
如何在Vue3项目中使用防抖节流技巧
|
4天前
|
前端开发 JavaScript
基于Vue3实现鼠标按下某个元素进行拖动,实时改变左侧或右侧元素的宽度,以及点击收起或展开的功能
本文介绍了如何在Vue3项目中实现一个鼠标拖动调整元素宽度的功能,并展示了点击按钮收起或展开侧边栏的效果,提供了完整的实现代码和操作演示。
36 0
基于Vue3实现鼠标按下某个元素进行拖动,实时改变左侧或右侧元素的宽度,以及点击收起或展开的功能
|
4天前
在 Vue3 + ElementPlus 项目中使用 el-autocomplete 控件
本文介绍了在Vue3 + ElementPlus项目中如何使用`el-autocomplete`控件实现自动补全输入功能,并探讨了不同版本ElementPlus中`clearable`属性的兼容性问题。
16 0
在 Vue3 + ElementPlus 项目中使用 el-autocomplete 控件
|
4天前
Vue3使用createVNode和render函数实现仿 Antd 加载动效
本文展示了如何在Vue3项目中使用`createVNode`和`render`函数实现一个仿Ant Design加载动效的自定义组件,并提供了详细的实现代码和使用示例。
8 0
Vue3使用createVNode和render函数实现仿 Antd 加载动效