理解框架的编译时与运行时
首先我们需要先理解一下什么事编译时和运行时
在语言层面,先来聊一下前端开发者最常遇见的两种语言JavaScript和Java
Java的代码就是被编译为.class文件才能运行,这个编译过程就是编译时,运行.class文件就是运行时- 我们在浏览器直接输入一些
JavaScript代码,就可以执行,并没有经过编译成某个文件。所以我的理解是解释型语言是没有编译时,只有运行时。
JavaScript的编译时和运行时
JavaScript的编译时或运行时,一般指的是现代框架(react、vue)是采用那种思路来实现的。
运行时
一个纯运行时框架就是在我们将DOM的数据结构传入到渲染函数时,就可以直接渲染出真实的DOM结构元素。在我们的项目开发中,假设提供一个被叫做render的API,通过给该render函数传入源数据并调用,就可以得到真实的DOM结构,那么我们可以认为该render函数就是一个运行时。
现在有以下数据需要生成dom并挂载到body上
// node是一个虚拟DOM树
// tag为元素的标签
// children为数组时表示子元素,为字符串时表示文本
const node = {tag: 'div',children: [tag: 'h1',children: '运行时']
}
现在需要一个render函数来处理上面的数据
const render = (node, root) => {const el = document.createElement(node.tag);if (typeof node.children === 'string') {// 如果子元素是文本节点,则创建文本节点。const text = document.createTextNode(node.children)el.appendChild(text)} else if (Array.isArray(node.children)) {node.children.forEach(child => {render(child, el)});}root.appendChild(el);
};
有了render函数,我们就可以调用并传参,来实现dom的渲染
const div = document.createElement('div')
render(node, div)
console.log(div)
// 最后打印的结果
/*
<div><div><h1>运行时</h1></div>
</div>
*/
观察上面的代码,其实在Vue的框架中已经提供了类似的API供我们使用,可以使你利用JavaScript的丰富表达力来完全编程式地声明组件最终的渲染输出。不过为什么我们在使用单文件组件的时候,大多都使用模版语法,这是因为较运行时的render函数的数据,模板语法更直观、书写更方便、语义化更强。
编译时
在Vue项目的单文件组件中,我们一般使用的是template模版语法,例如
<div><h1>编译时</h1>
</div>
现在要想将以上模板代码编译成正在的dom结构,就需要先解析上面的模版结构,这里就需要实现一个compiler方法去解析代码,关于compiler的实现稍微较为复杂,其原理可以参考编译器核心原理这篇文章
运行+编译时
现在有了运行时、编译时的简单示例,那么上面的代码可以这样使用:
const html =
`
<div><h1>编译时 + 运行时</h1>
</div>
`
// 编译,先将模板字符串编译成虚拟DOM树状结构
const compilerData = compiler(html);
// 在使用render函数生成真正的dom结构并挂载
render(compilerData, document.body)
上面就变成了一个简单的编译时+运行时的框架。它既支持运行时,用户可以直接提供数据对象从而无须编译;又支持编译时,用户可以提供 HTML字符串,我们将其编译为数据对象后再交给运行时处理。
如果上面的代码稍微做一下修改,将render的工作直接放到compiler里面去实现,这样我们就省去了调用render的步骤,这样就变成了一个纯粹的编译时框架,我们不需要提供任何数据,只需要提供模版代码就行。
总结
现在我们已经大概了解了什么是运行时、编译时、编译+运行时、纯编译时等框架的区别,其实在我们使用的现代框架中Vue就是一个编译+运行时的框架。由于它没有编译的过程,因此我们没办法分析用户提供的内容,但是如果加入编译步骤,可能就大不一样了,我们可以分析用户提供的内容,看看哪些内容未来可能会改变,哪些内容永远不会改变,这样我们就可以在编译的时候提取这些信息,然后将其传递给Render函数,Render函数得到这些信息之后,就可以做进一步的优化了。然而,假如我们设计的框架是纯编译时的,那么它也可以分析用户提供的内容。由于不需要任何运行时,而是直接编译成可执行的JavaScript代码,因此性能可能会更好,但是这种做法有损灵活性,即用户提供的内容必须编译后才能用。
另外,Vue的文件名中带有runtime的Vue构建版本未包含模板编译器,例如 vue.runtime.esm-bundler.js
相关文章:
理解框架的编译时与运行时
首先我们需要先理解一下什么事编译时和运行时 在语言层面,先来聊一下前端开发者最常遇见的两种语言JavaScript和Java Java的代码就是被编译为.class 文件才能运行,这个编译过程就是编译时,运行 .class 文件就是运行时我们在浏览器直接输入一…...
推挽电路---采用二极管消除交越失真----克服交越失真的互补推挽输出电路图
交越失真产生的原因及消除方法 由于晶体管的门限电压不为零,比如一般的硅三极管,NPN型在0.7V以上才导通,这样在00.7就存在死区,不能完全模拟出输入信号波形,PNP型小于-0.7V才导通,比如当输入的交流的正弦波…...
day11_面向对象
今日内容 零、 复习昨日 一、一日一题(数组,OOP) 二、面向对象练习(方法参数返回值) 三、局部变量&成员变量 四、this关键字 五、构造方法 六、重载 七、封装 小破站同步上课视频: https://space.bilibili.com/402601570/channel/collectiondetail?…...
大数据处理学习笔记1.1 搭建Scala开发环境
文章目录零、本讲学习目标一、Scala简介(一)Scala概述(二)函数式编程(三)Scala特性1、一切都是对象2、一切都是函数3、一切都是表达式(四)在线运行Scala二、选择Scala版本三、Window…...
VSCODE C++ 调用matplotlibcpp画图
使用VSCODE编写C程序,想在调试过程中看中间数据的波形,于是找到了python的matplotlibcpp库,参考文章链接是:https://blog.csdn.net/weixin_43769166/article/details/118365416;按照他的步骤配置好之后,跳出…...
面对“开门红”,跨境支付如何寻求新增长曲线?
易观:2022年是第三方支付行业洗牌加剧的一年,在部分机构选择退出的过程中,也有机构开始瞄准跨境业务,成为了支付机构转型的重要方向之一。跨境支付是指两个或及其以上的国家或地区进行国际贸易、国际投资或其他经济活动࿰…...
MySQL入门篇-MySQL MHA高可用实战
MHA简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司的youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提…...
C语言文件操作
目录1.文件指针2.文件的打开和关闭3.文件的读写3.1文件的顺序读写fgetc和fputcfgets和fputsfscanf和fprintffread和fwrite3.2文件的随机读写fseekftellrewind4.文本文件和二进制文件5.文件读取结束的判定6.文件缓冲区1.文件指针 在文件操作中,一个关键的概念是文件…...
Flink中核心重点总结
目录 1. 算子链 1.1. 一对一(One-to-one, forwarding) 1.2. 重分区(Redistributing) 1.3. 为什么有算子链 2. 物理分区(Physical Partitioning) 2.1. 什么是分区 2.2. 随机分区ÿ…...
gismo中NURBS的相关函数的使用---待完善
文章目录 前言一、B样条的求值1.1 节点向量的生成1.2 基函数的调用1.3 函数里面的T指的是系数类型二、以等几何两个单元12个控制点为例输出的控制点坐标有误1.4二、#pic_center <table><tr><td bgcolor=PowderBlue>二维数2.12.22.32.4三、3.13.23.33.4四、4.…...
5.数据共享与持久化
数据共享与持久化 在容器中管理数据主要有两种方式: 数据卷(Data Volumes)挂载主机目录 (Bind mounts) 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性: 数据…...
RabbitMQ-客户端源码之AMQCommand
AMQCommand不是直接包含Method等成员变量的,而是通过CommandAssembler又做了一次封装。 接下来先看下CommandAssembler类。此类中有这些成员变量: /** Current state, used to decide how to handle each incoming frame. */ private enum CAState {EXP…...
linux设置登录失败处理功能(密码错误次数限制、pam_tally2.so模块)和操作超时退出功能(/etc/profile)
一、登录失败处理功能策略 1、登录失败处理功能策略(服务器终端) (1)编辑系统/etc/pam.d/system-auth 文件,在 auth 字段所在的那一部分添加如下pam_tally2.so模块的策略参数: auth required pam_tally2…...
Centos7上Docker安装
文章目录1.Docker常识2.安装Docker1.卸载旧版本Docker2.安装Docker3.启动Docker4.配置镜像加速前天开学啦~所以可以回来继续卷了哈哈哈,放假在家效率不高,在学校事情也少点(^_−)☆昨天和今天学了学Docker相关的知识,也算是简单了解了下&…...
新瑞鹏“狂飙”,宠物医疗是门好生意吗?
宠物看病比人还贵,正在让不少年轻一族陷入尴尬境地。在知乎上,有个高赞提问叫“你愿意花光积蓄,给宠物治病吗”,这个在老一辈人看来不可思议的魔幻选择,真实地发生在当下的年轻人身上。提问底下,有人表示自…...
Spring循环依赖问题,Spring是如何解决循环依赖的?
文章目录一、什么是循环依赖1、代码实例2、重要信息二、源码分析1、初始化Student对Student中的ClassRoom进行Autowire操作2、Student的自动注入ClassRoom时,又对ClassRoom的初始化3、ClassRoom的初始化,又执行自动注入Student的逻辑4、Student注入Class…...
更改SAP GUI登录界面信息
在SAP GUI的登录界面,左部输入登录信息如客户端、用户名、密码等,右部空余部分可维护一些登录信息文本,如登录的产品、客户端说明及注意事项等,此项操作详见SAP Notes 205487 – Own text on SAPGui logon screen 维护文档使用的…...
分布式微服务架构下网络通信的底层实现原理
在分布式架构中,网络通信是底层基础,没有网络,也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作,共同完成一件事情。 同样,在大规模的系统架构中,应用吞吐量上不去、网络存在通信延迟、我…...
进大厂必备的Java面试八股文大全(2023最新精简易懂版,八股文中的八股文)
为什么同样是跳槽,有些人薪资能翻三倍?” 最近一个粉丝发出了灵魂拷问,类似的问题我收到过很多次,身边也确实有认识的同事、朋友们有非常成功的跳槽经历和收益,先说一个典型例子: 学弟小 A 工作一年半&am…...
都说测试行业饱和了,为什么我们公司给初级测试开到了12K?
故事起因: 最近我有个刚毕业的学生问我说:我感觉现在测试行业已经饱和了,也不是说饱和了,是初级的测试根本就没有公司要,哪怕你不要工资也没公司要你,测试刚学出来,没有任何的项目经验和工作经验…...
C语言新手避坑指南:math.h库函数参数检查与常见编译错误解决
C语言新手避坑指南:math.h库函数参数检查与常见编译错误解决 刚接触C语言的开发者在使用math.h库时,往往会遇到各种"坑"——从莫名其妙的计算结果到令人困惑的编译错误。这些问题看似简单,却可能让初学者浪费数小时调试时间。本文将…...
书匠策AI:学术江湖里的“论文剑客”,助你披荆斩棘!
书匠策AI官网:www.shujiangce.com | 微信公众号搜一搜:书匠策AI 在学术的江湖里,写期刊论文就像是一场“闯关游戏”——选题、查文献、搭框架、写内容、调格式……每一关都充满挑战,稍有不慎就可能“Game Over”。但别怕…...
GTE文本向量模型实战教程:前端Vue组件封装/predict接口调用与loading状态
GTE文本向量模型实战教程:前端Vue组件封装/predict接口调用与loading状态 1. 引言 如果你正在开发一个需要理解中文文本的Web应用,比如自动提取新闻中的关键人物和事件,或者分析用户评论的情感倾向,那么文本向量模型就是你需要的…...
2025届毕业生推荐的六大AI学术方案解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 不能让文章有明显人工智能生成的迹象,得从好些方面着手。用词处,别用…...
启动器故障排除指南:Java环境修复与第三方冲突解决
启动器故障排除指南:Java环境修复与第三方冲突解决 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher(PCL)。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL 当使用Minecraft启动器安装Forge时遇到"java.lang.NoC…...
MouseOverShapeBox
MouseOverShapeBox MouseOverShapeBox 源码详解 - 鼠标悬停高亮标注框 这是一个增强版图像标注控件,当鼠标移动到形状上时,会高亮显示该形状。类似于图片标注工具中鼠标悬停时边框变色的效果。📄 文件头部(版权信息) /…...
SEO_如何制定有效的SEO策略?分步指南(132 )
如何制定有效的SEO策略?分步指南 在互联网时代,一个网站的成功往往取决于其在搜索引擎上的排名。制定有效的SEO策略是提升网站流量、吸引潜在客户的关键。本文将为你提供一份详细的分步指南,帮助你制定并实施有效的SEO策略。 第一步&#x…...
Phi-4-reasoning-vision-15B部署教程:内网验证+外网网关调试全流程避坑指南
Phi-4-reasoning-vision-15B部署教程:内网验证外网网关调试全流程避坑指南 1. 模型介绍 Phi-4-reasoning-vision-15B是微软推出的多模态视觉推理模型,具备强大的图像理解和分析能力。这个模型特别适合需要处理复杂视觉任务的场景,比如文档O…...
Step3-VL-10B多场景落地指南:从OCR到数学推理的10个高频使用模板
Step3-VL-10B多场景落地指南:从OCR到数学推理的10个高频使用模板 你是不是也遇到过这样的问题?面对一张图片,想提取里面的文字,得去找专门的OCR工具;想分析图片内容,得用图像识别软件;要是图片…...
别盲目冲网安!普通本科转行 5 年月薪 2 万 +,掏心窝子真话
别盲目冲网安!普通本科转行5年,月薪2万的真心话 网安行业确实火,但真话难听:这行超卷,缺的是能干活的实战派,不是凑数的小白。 我普通本科出身,转行网安5年,如今月薪2万࿰…...
