Vue3 源码分析 02 - 框架设计的核心要素

大家也可以去我的博客看相关技术文章,欢迎大家,一同进步!!!!

vue3 源码分析,第二章 框架设计的核心要素

目录

控制代码体积

环境变量

js 复制代码
if (__DEV__ && !res) {
  warn(
    `Failed to mount app: mount target selector "${container}" returned null.`
  );
}

这里的__DEV__就是环境变量,vue构建生产资源的时候就会移除掉这部分,因为他是dead code永远不会执行

tree-shaking

Tree-Shaking 指的就是消除那些永远不会被执行的代码,也就是排除 dead code,现在无论是 rollup.js 还是 webpack,都支持 Tree-Shaking。

  • Tree-Shaking 只对 ES Module 有效
  • Tree-Shaking 依赖静态的模块结构

构建不同的产物

  • 生产环境的 vue.global.prod.js 不含警告信息
  • 开发环境的 vue.global.js,包含必要警告信息

这是构建产物基于环境的输出,除此之外还有别的,而这些构建产物都是基于对应的需求

直接使用<script>标签 - IIFE

有时候,我们可能html直接使用<script>标签,使用vue,此时我们需要IIFE

直接使用<script>标签 - ES Module

html 复制代码
<script type="module" src="/path/to/vue.esm-browser.js"></script>

随着技术的发展和浏览器的支持,现在主流浏览器对原生 ESM的支持都不错,所以用户除了能够使用 <script> 标签引用 IIFE 格式的资源外,还可以直接引入 ESM 格式的资源,例如 Vue.js 3 还会 输出 vue.esm-browser.js 文件,用户可以模块引入

同时补充 ESModule的构建产物也有两种 给浏览器环境,和给打包工具的

  • 浏览器 esm-browser.js
  • 打包工具 esm-bundler.js

node端使用 - cjs

服务端渲染SSR, 会使用到cjs格式的构建产物

特性开关

本质上是利用rollup.js的预定义常量插件来实现

js 复制代码
if (__VUE_OPTIONS_API__) {
  currentInstance = instance;
  pauseTracking();
  applyOptions(instance, Component);
  resetTracking();
  currentInstance = null;
}

错误处理

js 复制代码
// utils.js
let handleError = null;
export default {
  foo(fn) {
    callWithErrorHandling(fn);
  },
  // 用户可以统一注册错误处理函数
  registerErrorHandler(fn) {
    handleError = fn;
  },
};
function callWithErrorHandling(fn) {
  try {
    fn && fn();
  } catch (e) {
    // 将捕获到的错误传递给用户的错误处理程序
    handleError(e);
  }
}

使用

js 复制代码
import utils from "./utils";
utils.registerErrorHandler(e => {
  console.error(e);
});

vue中的

js 复制代码
import App from "App.vue";
const app = createApp(App);
app.config.errorHandler = () => {
  // 错误处理程序
};

类型支持

采用 Typescript

总结

  • tree-sharing 基于 ESM 实现
  • 基于需求会有各种的构建产物
    • 浏览器 esm-browser.js
    • 打包工具 esm-bundler.js
  • 特性开关
  • 统一的错误处理接口
  • 类型支持
相关推荐
秃头网友小李1 天前
前端难点:keep-alive 缓存什么?RouterView 的 key 为什么要带 scopeId?
前端·vue.js
徐小夕1 天前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法
奋斗吧程序媛2 天前
补充一个小知识点:有关@click.native
前端·vue.js
英勇无比的消炎药2 天前
一行命令背后:TinyRobot CLI 如何重构 AI 对话接入的效率范式
vue.js·aigc
jay神2 天前
基于 FastAPI + Vue 的宠物领养管理系统
前端·vue.js·python·毕业设计·fastapi·宠物
一杯奶茶¥2 天前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
英勇无比的消炎药2 天前
一站式搞定品牌风格:TinyRobot 主题定制从入门到精通
vue.js
尽欢i2 天前
Vue3 customRef 封神教程:防抖、本地存储、自动埋点一套搞定,模板干干净净
前端·javascript·vue.js
因_崔斯汀2 天前
Vue 模板编译:HTML 是怎么变成 JS 的?
前端·vue.js
英勇无比的消炎药2 天前
样式随心定制:TinyRobot 样式覆写与 CSS 变量实战解析
vue.js