阅读《Vue.js设计与实现》 -- 02

接上一篇文章:阅读《Vue.js设计与实现》 – 01

文章目录

  • 第二章
    • 提升用户的开发体验
      • tips
    • 控制框架代码的体积
      • Tree-Shaking
      • 副作用
    • 框架应该输出怎样的构建产物?
      • 注意
      • 这两个文件有什么区别?
    • 特性开关
      • 如何实现?
    • 处理错误
    • TS支持

第二章

本书第二章,主要是告诉我们一个好的框架需要考虑的事情很多,包括:构建的产物是什么?产物构建模式?提升用户的开发体验?热更新?减少打包体积?可配置?……

这部分主要就是说:vue怎么样做到这些事情,以及vue怎么好的。属于自卖自夸,手动狗头!

提升用户的开发体验

衡量一个框架是否足够优秀的指标之一,就是看它的开发体验如何。

说白了就是出现问题提示我们程序员够不够清楚,别出个问题全是源码提示,一点进去直接跳进源码(说实话,菜鸟开发vue经常性这样,所以感觉有点自卖自夸),《Vue.js设计与实现》 中举例的是 createApp 挂载元素不存在时的一个 wran,那确实提示得很清楚

在这里插入图片描述

这要是都提示不清楚,那也没必要说 vue 好用了,毕竟挂载上去是最重要的一点!

如果 Vue.js 内部不做任何处理,那么我们很可能得到的是 JavaScript 层面的错误信息,例如 Uncaught TypeError: Cannot read property 'xxx' of null,根据此信息,我们很难知道问题出在哪里。

tips

我们在写代码打印 ref 对象时,如果不加 .value 就打印,打印出来的结构还是比较难看的,打印结果需要我们手动点击进去,且有很多我们不关注的无用信息。

在这里插入图片描述

但是其实浏览器允许我们编写自定义的 formatter,从而自定义输出形式。在 Vue.js3 的源码中,你可以搜索到名为 initCustomFormatter 的函数,该函数就是用来在开发环境下初始化自定义 formatter 的。

我们只需要设置一下goole控制台,即可优化打印结果,步骤如下:

1、打开控制台,点击如图按钮

在这里插入图片描述

2、找到控制台,开启 Enablecustom formatters即可

在这里插入图片描述

设置之后的打印结果会变成

在这里插入图片描述

控制框架代码的体积

这部分主要讲的就是:框架在实现相同功能时,肯定是代码越少越好,这样体积更小,请求后加载速度就更快!但是这个和上一个违背了,因为要处理好报错,肯定就要加一堆不相关的逻辑。vue想办法解决了这个问题,就是区分环境,用rollup里面的插件来设置一个Boolean值(源码为__DEV__常量 ),让开发环境有提示,生产环境因为rollupTree-Shaking,就不会打包进入生产环境,减小体积!

在这里插入图片描述

Tree-Shaking

什么是 Tree-Shaking ?在前端领域,这个概念因 rollup.js 而普及,指的就是消除那些永远不会被执行的代码,现在无论是 rollup.js 还是 webpack,都支持 Tree-Shaking

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

这里《Vue.js设计与实现》举了一个rollup打包的例子,一个input.js文件

import { foo } from './utils.js'

一个utils.js文件

export function foo(obj) {obj && obj.foo
}export function bar(obj) {obj && obj.bar
}

使用 rollup 打包后,打包文件只会留下 foo 函数,bar 函数会被Tree-Shaking掉!

但是又发现其实 foo 也没有使用,只是引用了而已,按理说应该也要将其删除!

副作用

当调用函数的时候会对外部产生影响。这时你可能会说,上面的代码明显是读取对象的值,怎么会产生副作用呢?其实是有可能的,试想一下,如果 obj 对象是一个通过 Proxy 创建的代理对象,那么当我们读取对象属性时,就会触发代理对象的 get ,在 get 中是可能产生副作用的,例如:我们在 get 夹子中修改了某个全局变量。而到底会不会产生副作用,只有代码真正运行的时候才能知道,JavaScript 本身是动态语言,因此想要静态地分析哪些代码是永远不会被使用的很有难度。

因为静态地分析 JavaScript 代码很困难,所以像 rollup.js 这类工具都会提供一个机制,让我们能明确地告诉 rollup.js:“放心吧,这段代码不会产生副作用,你可以移除它。”

如何告诉rollup呢?使用/*#__PURE__*/

代码变成:

import {foo} from './utils'
/*#__PURE__*/ foo()

在这里插入图片描述

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

这里讲解了rollup如何打包产物为你需要的格式,如果用户想直接通过script直接引入那么就要设置

在这里插入图片描述

菜鸟这里直接搞成表格

需要的打包产物rollup设置(output/format)
script直接引入iife
script使用module形式引入esm
node中使用require引入cjs

注意

这里第二种其实会产生两种文件,一种vue.esm-browser.js,该文件是直接给 <script type="module"> 使用的,还有一种vue.esm-bundler.js,这个文件是开发时,给构建工具(vite 或者 webpack)使用的!

我们知道,无论是 rollup.js 还是 webpack,在寻找资源时,如果 package.json 中存在 module 字段,那么会优先使用 module 字段指向的资源来代替 main 字段指向的资源。

这两个文件有什么区别?

区别在于上文中的 __DEV__ 常量。当构建用于<script>标签的 ESM 资源时,如果是用于开发环境,那么__DEV__ 会设置为 true;如果是用于生产环境,那么 __DEV__ 常量会设置为 false,从而被 Tree-Shaking 移除。

但是当我们构建提供给打包工具的 ESM 格式的资源时,不能直接把 __DEV__ 设置为 true或 false,而要使用 (process.env.NODE_ENV !=='production') 替换 __DEV__ 常量。

在这里插入图片描述

特性开关

就是预留一些配置,用户通过true或者false(或者其他代码)来确定自己要不要那些功能,如果用户想要就在打包时留下那些功能代码,不想要就直接删除!

在这里插入图片描述

如何实现?

其实很简单,原理和上文提到的__DEV__ 常量一样,本质上是利用 rollup.js 的预定义常量插件来实现。

更具体的就想要读者去看书了,这里不好总结,感觉就是一整段,但是都拿过来就要被寄律师函了,手动狗头!

死道友不死贫道,手动狗头,大家可以看这个:https://juejin.cn/post/7091263773301800991?from=search-suggest#heading-17

处理错误

框架需要为用户提供统一的错误处理接口,这样用户可以通过注册自定义的错误处理函数来处理全部的框架异常。

说实话,菜鸟没有用过,所以不太清楚这个统一的错误处理接口是啥,然后菜鸟问了一下GPT,感觉这里统一的错误接口应该就是和js里面的顶层监听错误一个意思!类似:

在这里插入图片描述

GPT回答:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

菜鸟感觉基本用处不是很大,读者想了解可以直接vue3官网搜:onErrorCaptured() --> vue3的一个生命周期!

TS支持

一个常见的认知误区,即"使用 TS 编写框架和框架对 TS 类型支持友好是两件完全不同的事"。有时候为了让框架提供更加友好的类型支持,甚至要花费比实现框架功能本身更多的时间和精力。

菜鸟只是略懂ts,但是感觉ts让我们的心智负担更重而不是减少了!我们程序需要的是:检验变量类型,以确保逻辑正确,而不是在项目中一引入就一大堆报错,然后去找用什么类型才能让这个组件的类型是对的,以及一些不知道名字的库的类型是对的,感觉ts检测的重心应该在逻辑而不是检验为什么组件类型不对。

就像这本书说的:

有时候为了让框架提供更加友好的类型支持,甚至要花费比实现框架功能本身更多的时间和精力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac:Ant 下载+安装+环境配置(详细讲解)

&#x1f4cc; 下载 Ant 下载地址&#xff1a;https://ant.apache.org/bindownload.cgi &#x1f4cc; 无需安装 Apache官网下载 Ant 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目录下新建了个…

qt图表背景问题

从代码来看&#xff0c;这段代码涉及到设置背景透明度和背景可见性的操作&#xff0c;主要是在一个基于Qt框架的图形界面程序中对某个图表控件&#xff08;fontChart&#xff09;和视图控件&#xff08;fontChartView&#xff09;进行操作。以下是每行代码的作用以及它们之间的…

蓝桥杯国赛子串2023动态规划,暴力

#include <bits/stdc.h> using namespace std; // string ss; #define int long long string s; //该方法通过动态规划&#xff0c;找到2023字串&#xff0c;而2023等于202加3&#xff0c;202等于202&#xff0c;20等于20&#xff1b; int f2() {int dp[4]{0};//dp[0]代表…

uni-app——网络API

uni-app 网络API 在 uni-app 开发中&#xff0c;网络请求是获取数据与和服务器交互的重要手段。以下介绍 uni-app 中常见的网络 API&#xff0c;包括发起请求、上传和下载以及 WebSocket、UDP 通信等方面。 发起请求 在 uni-app 里&#xff0c;使用uni.request(OBJECT)来发起…

计算机网络笔记再战——理解几个经典的协议HTTP章3

理解几个经典协议——HTTP章3 返回结果的HTTP状态码 ​ 我们知道&#xff0c;ICMP可以传递IP通信时候的状态如何。HTTP虽然没有辅助的解析&#xff0c;但是它可以使用状态码来表达我们的HTTP请求的结果&#xff0c;标记服务器端的处理是否正常、通知出现的错误等工作。这就是…

国产编辑器EverEdit - Hex Dump插件:看到文本的另一面!

1 Hex Dump插件 1.1 应用场景 有时可能需要显示字母的ASCII编码&#xff0c;或其他文字的字节编码&#xff0c;可以使用Hex Dump插件来完成 1.2 使用方法 安装Hex Dump插件&#xff0c;安装插件方法参考&#xff1a;扩展管理 在编辑器中选中文本&#xff0c;选择扩展 -> …

《驾驭MXNet:深度剖析分布式深度学习训练的高效之道》

在深度学习的迅猛发展进程中&#xff0c;模型的规模和复杂性持续攀升&#xff0c;对计算资源的需求也愈发苛刻。单机训练在面对大规模数据集和复杂模型结构时&#xff0c;常常显得力不从心。分布式深度学习训练成为解决这一困境的关键途径&#xff0c;而MXNet作为一款强大的开源…

Vue3项目开发:状态管理实践指南

# Vue3项目开发&#xff1a;状态管理实践指南 一、引言 背景介绍 在Vue项目中&#xff0c;状态管理是一个非常重要的话题。合理的状态管理能够帮助我们更好地组织和管理数据&#xff0c;提升项目的可维护性和可扩展性。本文将深入探讨Vue3项目中状态管理的最佳实践&#xff0c;…

网络安全漏洞与修复 网络安全软件漏洞

文章目录 一、软件漏洞的概念 1、信息安全漏洞简述2、软件漏洞3、软件漏洞概念4、软件漏洞的成因分析 二、软件漏洞标准化管理 1、软件漏洞分类2、软件漏洞分级3、安全漏洞管理规范 一、软件漏洞的概念 1、信息安全漏洞简述 信息安全漏洞是信息安风险的主要根源之一&…

SpringBoot项目controller层接收对应格式请求的相关RequestMapping配置

目录 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; 注&#xff1a;此情况注意和&#xff08;4&#xff09;中情况进行区分 &#xff08;4&#xff09; 在几个springboot项目开发后&#xff0c;我总结了以下的一些常见的接收对应请求的…

2025年图生视频模型技术全景解析

一、开源图生视频模型 阿里通义万象Wan2.1系列 I2V-14B-480P&#xff1a; 14B参数基础模型支持480P分辨率图生视频显存需求16GB以上 I2V-14B-720P&#xff1a; 高清增强版模型采用分帧渲染技术&#xff0c;输出分辨率达1280720 技术特性&#xff1a; 支持中文提示词自动解析内置…

一场由 ES 分片 routing 引发的问题

一场由 ES 分片 routing 引发的问题 ES 结构 {"poroperties": {"joinType": {"type": "join","eager_global_ordinals": true,"relations": {"spu": "sku"}},"id":{"type&q…

Linux信号的处理

目录 一、信号处理概述&#xff1a;为什么需要“信号”&#xff1f; 二、用户空间与内核空间&#xff1a;进程的“双重人格” 三、内核态与用户态&#xff1a;权限的“安全锁” 四、信号捕捉的内核级实现&#xff1a;层层“安检” 五、sigaction函数&#xff1a;精细控制信…

IntelliJ IDEA 2023.3.1安装指南从下载到配置的完整教程(附资源下载)

安装 IntelliJ IDEA 2023.3.1 非常简单&#xff0c;以下是详细的安装步骤&#xff0c;适用于 Windows、macOS 和 Linux 系统。 1. 下载 IntelliJ IDEA IntelliJ IDEA下载链接&#xff1a;https://pan.quark.cn/s/3ad975664934 选择适合你的操作系统的版本&#xff1a; Ultimat…

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解 &#xff08;图1-1&#xff09; 一、鸿蒙中App、HAP、HAR、HSP是什么&#xff1f; &#xff08;1&#xff09;App Pack&#xff08;Application Package&#xff09; 是应用发布的形态&#xff0c;上架应用市场是以App Pa…

配置阿里云yum源

配置阿里云yum源 修改默认的yum仓库&#xff0c;把原有的移动到创建的目录里&#xff08;踢出国外的yum源&#xff09; # 切换到/ect/yum.repos.d/目录下 cd /etc/yum.repos.d/ # 新建repo目录 mkdir repo # 把原有的移动到创建的目录里 mv ./*.repo ./repo/配置yum源 # 找到…

在C#的MVC框架framework项目的使用ajax,及源码下载

在C# MVC框架中使用AJAX实现异步请求,有助于提高应用程序的性能和用户体验。 在MVC框架framework项目中&#xff0c;ajax使用方法如下 1.在Controller类中&#xff0c;创建一个新的方法&#xff08;例如&#xff1a;GetRes&#xff09;&#xff0c;该方法处理AJAX请求并返回J…

Linux部署DHCP服务脚本

#!/bin/bash #部署DHCP服务 #userli 20250319#检查是否为root用户 if[ "$USER" ! "root" ] thenecho "错误&#xff1a;非root用户&#xff0c;权限不足&#xff01;"exit 0 fi#配置网络环境 read -ep "请给本机配置一个IP地址(不…

vulhub Matrix-Breakout

1.下载靶机&#xff0c;打开靶机和kali虚拟机 2.查询kali和靶机ip 3.浏览器访问 访问81端口有登陆界面 4.扫描敏感目录 kali dirb 扫描 一一访问 robot.txt提示我们继续找找&#xff0c;可能是因为我们的字典太小了&#xff0c;我们换个扫描器换个字典试下,利用kali自带的最大…

科普类——双目立体视觉与 RGBD 相机的简单对比

双目立体视觉与 RGBD 相机生成的深度图在原理、性能和应用场景上有显著差异。以下是两者的详细对比和分析&#xff1a; 1. 原理差异 (1) 双目立体视觉 (Stereo Vision) 原理&#xff1a; 通过两个摄像头模拟人眼视差&#xff0c;计算匹配像素点的水平位移&#xff08;视差&…