手撸一个Vue(看不懂可以举报)
手撸一个Vue
背景
vue是啥,有哪些基本功能,模板,script, style, 双向绑定一大堆,开始动手吧
仓库
https://github.com/listen80/two-way-binding
体验一下(pc上使用)
https://listen80.github.io/two-way-binding/public/
单文件
通过ajax获取类似.vue .html .tpl文件
const parser = new DOMParser();
export default (template) => {
const doc = parser.parseFromString(`<body>${template}</body>`, 'text/html');
const body = doc.querySelector('body')
return {
template: body.querySelector('template')?.content,
script: body.querySelector('script'),
style: body.querySelector('style'),
}
};
构建vue实例
- 把script文本变成script运行
- 把原始data变成reactive的形式,增加依赖收集
- 解析template,扣出来指令,属性,方法,子组件等为了区分指令前缀使用@而不是v-
- 挂载style样式增加
- 替换当前实例挂载的元素,目前为止所有的元素(html, script, style)都已经使用上来了
// ...上面还有
/**
* 创建组件,加载组件脚本、样式和模板,并进行渲染
*/
create() {
// 从配置选项中解构出目标元素和属性
const { el, props = {} } = this.options
// 从组件属性中解构出脚本、模板和样式
const { script, template, style } = this.componentProperties
// 1. 获取的ES6代码是模
// 获取脚本标签中的 ES6 模块代码
const es6ModuleCode = script.textContent;
// 2. 将代码转为blob URL(模拟模块文件)
// 创建一个包含 ES6 模块代码的 Blob 对象
const blob = new Blob([es6ModuleCode], { type: 'text/javascript' });
// 为 Blob 对象创建一个 URL
const url = URL.createObjectURL(blob);
// 3. 用动态import()加载该模块
// 动态导入模块
import(url).then(module => {
// 将样式添加到文档中
document.head.append(style)
// console.log(module.default); // 输出 'ES6 Module'
// 获取模块中的数据,若不存在则使用空对象
const data = module.default.data || {};
// 获取模块中的方法,若不存在则使用空对象
const methods = module.default.methods || {};
// 获取模块中的子组件,若不存在则使用空对象
const components = module.default.components || {};
// 将属性和数据合并到当前实例
Object.assign(this, props, data);
// 对当前实例进行数据观测
observe(this);
// this.data = data
// 编译模板并渲染
compile(template, this, methods, components);
// 终于明白这里为什么是replace
// 用模板替换目标元素
el.replaceWith(template)
}).catch(err => {
// 捕获模块加载失败的错误并打印
console.error('加载模块失败', err);
});
}
总结
就这么结束了,是不是很简单,当然其中的细节很多,上文主要是描述核心思想点
本demo是没有使用虚拟dom,是dom跟数据直接绑定的,跟进vue3.6 vapor
水平有限,本文只是为了学习分享简单的示例,目的是为了了解运作机制,如果有纰漏请联系我
手撸一个Vue(看不懂可以举报)的更多相关文章
- 使用Java Socket手撸一个http服务器
原文连接:使用Java Socket手撸一个http服务器 作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomc ...
- 第二篇-用Flutter手撸一个抖音国内版,看看有多炫
前言 继上一篇使用Flutter开发的抖音国际版 后再次撸一个国内版抖音,大部分功能已完成,主要是Flutter开发APP速度很爽, 先看下图 项目主要结构介绍 这次主要的改动在api.dart 及 ...
- 纯手工撸一个vue框架
前言 vue create 真的很方便,但是很多人欠缺的是手动撸一遍.有些人离开脚手架都不会开发了. Vue最简单的结构 步骤 搭建最基本的结构 打开空文件夹,通过 npm init 命令生成pack ...
- C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架
C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...
- 手撸一个SpringBoot-Starter
1. 简介 通过了解SpringBoot的原理后,我们可以手撸一个spring-boot-starter来加深理解. 1.1 什么是starter spring官网解释 starters是一组方便的依 ...
- Golang:手撸一个支持六种级别的日志库
Golang标准日志库提供的日志输出方法有Print.Fatal.Panic等,没有常见的Debug.Info.Error等日志级别,用起来不太顺手.这篇文章就来手撸一个自己的日志库,可以记录不同级别 ...
- 【手撸一个ORM】MyOrm的使用说明
[手撸一个ORM]第一步.约定和实体描述 [手撸一个ORM]第二步.封装实体描述和实体属性描述 [手撸一个ORM]第三步.SQL语句构造器和SqlParameter封装 [手撸一个ORM]第四步.Ex ...
- 如何使用 js 写一个正常人看不懂的无聊代码
如何使用 js 写一个正常人看不懂的无聊代码 代码质量, 代码可读性, 代码可维护性, clean code WAT js WTF https://www.destroyallsoftware.com ...
- 通过 Netty、ZooKeeper 手撸一个 RPC 服务
说明 项目链接 微服务框架都包括什么? 如何实现 RPC 远程调用? 开源 RPC 框架 限定语言 跨语言 RPC 框架 本地 Docker 搭建 ZooKeeper 下载镜像 启动容器 查看容器日志 ...
- 手撸一个springsecurity,了解一下security原理
手撸一个springsecurity,了解一下security原理 转载自:www.javaman.cn 手撸一个springsecurity,了解一下security原理 今天手撸一个简易版本的sp ...
随机推荐
- JavaScript入门笔记day2
文章目录 常用互动方法 1. document.write() 直接向页面输出内容 2. `alert();`弹出消息对话框 3. confirm消息对话框 4. prompt弹出消息对话框,用于需要 ...
- WindowsPE文件格式入门02.选项头其它和节表
https://www.bpsend.net/thread-444-1-1.html 选项头 IMAGE_OPTIONAL_HEADER:以供操作系统加载PE文件使用,32位必选. 重要字段: DWO ...
- Qt 图片轮播
最近研究了一下图片轮播,主要是用到了QPropertyAnimation这个类,具体代码示例如下: main.cpp #include <QApplication> #include &q ...
- WPF绑定与通知属性到界面
绑定与通知属性到界面 本文同时为b站WPF课程的笔记,相关示例代码 前言 在上一篇文章C#代码事件里面,我们介绍了利用给控件命名的方式,在后端代码中访问并修改属性.这样子直截了当,但是这样后端代码依赖 ...
- .NET 9中的异常处理性能提升分析:为什么过去慢,未来快
一.为什么要关注.NET异常处理的性能 随着现代云原生.高并发.分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径.在高复杂度的微服务.网络服务.异步 ...
- 书籍赠送丨《Flink jm、tm启动过程和资源分配》直播预告
5月20日晚19点,袋鼠云数栈技术研发团队开发工程师--吹雪,将会为大家直播分享<Flink jm.tm启动过程和资源分配>. 课程内容主要包括以下三点: 1.flink jm启动过程2. ...
- DRF之Response源码分析
DRF之Response源码分析 [一]响应类的对象Response源码 [1]路由 from django.contrib import admin from django.urls import ...
- Blazor学习之旅(2)第一个Blazor应用
本篇我们来构建第一个Blazor Web应用,这里我们选择Blazor Server类型,后面我们再学习Blazor WebAssembly类型. 话外音:有人问我西门子在用Blazor吗?是的,西门 ...
- Office 无法插入ActiveX控件的一个解决办法。
微软4月中旬公告,基于安全考量,微软将默认关闭Microsoft 365及Office 2024中的ActiveX.造成"开发工具"下无法插入ActiveX控件. 想再打开Acti ...
- 地震储层预测笔记—AVO近似公式总结
地震储层预测笔记-AVO近似公式总结 (一).Zeoppritz方程 AVO地球物理基础是平面弹性波在层状介质下推倒得出的Zeopprizt方程,在两层介质下(如图1所示)其Zeopprizt方程可以 ...