Vue3源码梳理:设计一个微型Vue的源码框架环境

目录结构设计

  • 创建 vue-mini 目录
  • 在该目录中,初始化npm包:$ npm init -y
  • 创建package.json文件
  • 创建packages 目录,作为核心代码区域
    • 在内创建vue目录:打包,测试实例,项目整体入口模块
    • 在内创建 shared 目录:共享公共方法模块
    • 在内创建 compiler-core 目录:编译器核心模块
    • 在内创建 compiler-dom 目录:浏览器相关编译器模块
    • 在内创建 reactivity 目录:响应性模块
    • 在内创建 runtime-core 目录:运行时核心模块
    • 在内创建 runtime-dom 目录:浏览器相关运行时模块

为框架导入配置ts

  • TS环境
    • 主要是类型的世界
    • $ npm i -g typescript
    • $ tsc -v
    • $tsc -init 生成ts配置文件
      • 配置文件参考:typescriptlang.org/tsconfig

引入 prettier 来格式化代码

  • vscode 扩展,添加插件,搜索:Prettier - Code formatter

  • 在项目根目录下,创建 .prettierrc

    {"semi": false, // 格式化不需要分号"singleQuote": true, // 格式化代码使用单引号"printWidth": 80, // 代码长度大于80之后,就开始换行"trailingComma": "none", // 不尾随添加 , 如果值为 es5, 则会在对象的最后一个自动加上 ,"arrowParens": "avoid" // 省略箭头函数小括号,示例:const fn = (a) => {};always 是保留小括号 示例: const fn = a => {}
    }
    
  • 如果想要配置保存时格式化,那么需要在设置中搜索 save 进行配置

  • 同时注意,prettier 可能会和其他格式化工具存在冲突导致代码丢失,在使用中仅使用一个作为格式化的工具

模块打包器 rollup

  • 文档:rollupjs.com
  • webpack打包会产生一些冗余代码,在开发大型项目中影响不大,如果我们开发一个库,这些冗余代码就会大大增加库的体积,这就不美好了
  • 这个小而美的工具就是 rollup
  • 新建文件 rollup.config.js
  • 默认导出数组,数组中的每一个对象都是一个单独的导出文件配置,详细可查:http://www.rollupjs.com/guide/big-list-of-options
  • 安装依赖插件
    • $ cnpm i -D @rollup/plugin-commonjs@22.0.1 @rollup/plugin-node-resolve@13.3.0 @rollup/plugin-typescript@8.3.4
  • 创建打包命令
    • 在package.json中添加 build命令
    • "build": "rollup -c"
    • -c 是指读取rollup的配置文件
  • 编写测试代码
    *
  • 开始打包:$ npm run build
    • 此时会报错:RollupError: Node tried to load your configuration file as CommonJS even though it is likely an ES module.
    • 解决方案:在package.json中添加 “type” :“module”,
    • 此时仍会报错:cannot find module ‘typescript’
    • 解决方案:项目中使用ts,但是还缺少其他插件:cnpm i -D tslib@2.4.0 typescript@4.7.4
    • 此时打包成功

配置路径映射

  • ts中的一项api, 也就是 路径 - path
  • 可以让程序员不用相对路径访问api,只需要添加配置,就可自动解析路径
  • 在tsconfig.ts中配置,compilerOptions.baseUrl = “.”
  • 再配置 compilerOptions.paths
    "paths": {"@vue/*": ["packages/*/src"]
    }
    
  • 之后,就可以使用了, 示例
    import { isArray } from '@vue/shared'console.log(isArray([]))
    

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

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

相关文章

高云GW1NSR-4C开发板M3核RT-Thread应用

1.仅提供RT-Thread的Nano版本 MCU工程在\EMPU(GW1NS-4C)_V1.2\ref_design\MCU_RefDesign\Keil_RefDesign\rt_thread_nano\PROJECT目录下,FPGA工程参考: 高云GW1NSR-4C开发板M3硬核应用-CSDN博客 特别注意,MCU主频(即FPGA工程经P…

C#基础知识 - 变量、常量与数据类型篇

C#基础知识 - 变量、常量与数据类型篇 第3节 变量、常量与数据类型3.1 C#变量3.1.1 变量使用3.1.2 自定义变量3.1.2 接收用户输入 3.2 C#常量3.2.1 常量的使用 3.3 C#数据类型3.3.1 数据类型之值类型3.3.2 数据类型之引用类型 更多C#基础知识详解请查看:C#基础知识 …

Adaptive IBC :异构链互操作性的颠覆者

2024年第一季度,隐私协议 Secret Network 将会使用 Octopus Network 基于 Adaptive IBC 技术路线开发的 NEAR IBC,实现与 NEAR Protocol 之间将会实现首次跨链交互,这同样是 Cosmos 生态与 NEAR 之间的首次连接。整个加密世界正在成为一个越来…

ESP32网络编程实例-WebSocket服务器广播信息

WebSocket服务器广播信息 文章目录 WebSocket服务器广播信息1、软件准备2、硬件准备3、代码实现3.1 服务器代码实现3.2 客户端代码实现在本文中,我们将介绍如何向连接到 ESP32 服务器的所有 WebSocket 客户端广播消息。 1、软件准备 Arduino IDE在前面的文章中,如何搭建ESP32…

elasticsearch查询出现Limit of total fields 1000 has been exceeded

项目场景: 在项目中使用elasticsearch保存日志等相关数据,查询页面查询这些日志数据 问题描述 提示:这里描述项目中遇到的问题: 今天在检查日志数据时,发现数据出不来,检查后端日志,发现一直…

【lesson14】MySQL表的基本查询retrieve(读取)1

文章目录 表的基本操作介绍retrieveselect列建表基本测试 where子句建表基本测试 表的基本操作介绍 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) retrieve select列 建表 基本测试 插入数据 全列查询 …

深度学习记录--矩阵维数

如何识别矩阵的维数 如下图 矩阵的行列数容易在前向和后向传播过程中弄错,故写这篇文章来提醒易错点 顺便起到日后查表改错的作用 本文仅作本人查询参考(摘自吴恩达深度学习笔记)

C++标准模板(STL)- 算法库

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。 有制约算法 C20 在命名空间 std::ranges 中提供大多数算法的…

laravel5.5 里面如果想要使用自定义的数据库连接器

由于项目里面使用到了doris,虽然doris支持mysql协议,但是如果直接把他当mysql使用是行不通的,因为doris并不支持mysql的一些option和mode设置,然后就会一直报错: SQLSTATE[HY000]: General error: 2013 Lost connecti…

前端常用去重的几种方式

文章目录 方式1: ES6新语法方式2: 遍历 利用filter方式3: 使用 new Map() for循环方式4: 利用 hasOwnProperty总结 在github 查看该文章 方式1: ES6新语法 过滤出网页中不重复的html标签 结合去重知识点考查 […new Set([…document.querySelectorAll(‘*’)].map(v>v.t…

分布式锁,进程锁,线程锁

线程锁:大家都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等…

Vue使用Canvas实现电子签名功能示例

当使用Vue来实现电子签名功能时&#xff0c;可以结合Canvas元素和Vue的数据绑定功能来实现。下面是一个简单的示例&#xff0c;演示了如何在Vue中使用Canvas实现电子签名功能&#xff1a; <template><div><!-- Canvas元素用于绘制电子签名 --><canvasref…

bigdecimal比较大小

bigdecimal比较大小 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在日常的Java开发中&#xff0c;我们经常会涉及到对数字进行比较&#xff0c;而BigDecimal作为一种高精度的数值类型&#xff0c;其…

06 使用v-model实现双向数据绑定

概述 Vue achieves two-way data binding by creating a dedicated directive that watches a data property within your Vue component. The v-model directive triggers data updates when the target data property is modified on the UI. Vue 通过创建一个专用指令来观…

IntelliJ IDEA 自带HTTP Client接口插件上传文件示例

如何使用IntelliJ IDEA自带的HTTP Client接口插件进行文件上传的示例。在这个示例中&#xff0c;我们将关注Controller代码、HTTP请求文件&#xff08;xxx.http&#xff09;&#xff0c;以及文件的上传和处理。 Controller代码 首先&#xff0c;让我们看一下处理文件上传的Co…

第15章 《乐趣》Page305~311, 代码精简以后,讨论一下引用含义的问题

将Page305~311的代码精简了一下&#xff0c;讨论一下引用含义的问题&#xff0c;精简之后的代码如下&#xff1a; #include <iostream> #include <SDL2/SDL.h>using namespace std;namespace sdl2 {char const* last_error() {return SDL_GetError(); }struct Ini…

基于 WebSocket 打造聊天室

一、什么是 WebSocket&#xff1f; WebSocket 是一种基于TCP连接上进行 全双工 通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c…

第三十六章 XML 模式的高级选项 - 创建子类型的替换组

文章目录 第三十六章 XML 模式的高级选项 - 创建子类型的替换组创建子类型的替换组将子类限制在替换组中 第三十六章 XML 模式的高级选项 - 创建子类型的替换组 创建子类型的替换组 XML 模式规范还允许定义替换组&#xff0c;这可以是创建选择的替代方法。语法有些不同。无需…

Windows 10如何关闭系统自动更新(实用教程)

本章教程&#xff0c;用最简洁的方式介绍在windows10中如何关闭系统自动更新。 目录 一、关闭自动更新服务 二、关闭自动更新组策略 一、关闭自动更新服务 1、 winr 2、services.msc 3、找到并双击 Windows Update 修改启动类型为禁用 二、关闭自动更新组策略 1、winr 2、gp…

2.4【渲染】Vulkan渲染APIs

写在前面 Screen支持Khronos的Vulkan渲染API。Vulkan是一款用于3D图形和计算的低开销、跨平台、开放行业标准API。它使开发人员能够使用相同的图形API来面向各种设备。 Vulkan标准由Khronos Group发布。 通常,硬件供应商都有自己的Khronos标准实现,利用硬件加速,特别是GP…