首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >1.vue源码entry中runtime-with-compiler.js和runtime.js的区别

1.vue源码entry中runtime-with-compiler.js和runtime.js的区别

作者头像
用户3258338
发布于 2021-04-01 03:43:05
发布于 2021-04-01 03:43:05
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

Vue的编译渲染过程

template => ast => render函数 => VDOM => 真实DOM

  • 先将template解析成抽象语法树(ast)
  • 将ast编译成(complier)成render函数
  • 将render函数渲染(render)成虚拟DOM
  • 最后将虚拟DOM渲染成真实DOM

runtime-with-compiler

1. 使用场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Vue({
  el:'#app',
  components:{APP},
  remplate:'<APP/>'
})

2. 渲染过程

渲染成最终真实DOM的过程 template ==> ast ==> render ==> vdom ==> UI

runtime-only

1. 使用场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Vue({
  el:'#app',

  render: h=>h(APP)
})

2. 渲染过程

渲染成最终真实DOM的过程 render ==> vdom ==> UI

两者对比

render ==> vdom ==> UI

runtime-compiler

runtime-only

体积更大(有compiler代码)

体积更小

有Vue.compilerAPI

无Vue.compilerAPI

可以使用template模板、render函数渲染

只能使用render函数渲染

两者如何选用

runtime-with-compiler

  1. 在html中使用vue库,若只使用指令、数据绑定等,此时写template比写render函数更容易理解并方便,则需使用Runtime + Compiler构建的Vue库
  2. 挂载DOM元素的HTML被提取出来作为模板,则需使用Runtime + Compiler构建的Vue库

runtime-only

  1. 当使用vue-loader或者vueify, *.vue文件内部的模板会在构建时预编译成Javascript.所以最终打包好的包里面实际上是不需要编译器的,所以使用运行时版本即可

透过现象看本质

那么造成这两个区别的到底是什么呢?

原因在于

runtime-with-compiler的打包入口文件是src/platforms/web/entry-runtime-with-compiler.js

runtime-only的打包入口文件是src/platforms/web/entry-runtime.js

runtime-with-compiler实际上引用的就是runtime-only,他们两个唯一的区别就是src/platforms/web/entry-runtime-with-compiler.js,如下我已将不重要的一些代码删除掉了,来看一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import config from 'core/config'
import { warn, cached } from 'core/util/index'
import { mark, measure } from 'core/util/perf'

import Vue from './runtime/index'
import { query } from './util/index'
import { compileToFunctions } from './compiler/index'
import { shouldDecodeNewlines, shouldDecodeNewlinesForHref } from './util/compat'

const idToTemplate = cached(id => {
  const el = query(id)
  return el && el.innerHTML
})

const mount = Vue.prototype.$mount
Vue.prototype.$mount = function (
  el?: string | Element,
  hydrating?: boolean
): Component {
  el = el && query(el)
  const options = this.$options
  // resolve template/el and convert to render function
  if (!options.render) {
    let template = options.template
    if (template) {
      if (typeof template === 'string') {
        if (template.charAt(0) === '#') {
          template = idToTemplate(template)
          /* istanbul ignore if */
          if (process.env.NODE_ENV !== 'production' && !template) {
            warn(
              `Template element not found or is empty: ${options.template}`,
              this
            )
          }
        }
      } else if (template.nodeType) {
        template = template.innerHTML
      } else {
        return this
      }
    } else if (el) {
      template = getOuterHTML(el)
    }
    if (template) {
      const { render, staticRenderFns } = compileToFunctions(template, {
        outputSourceRange: process.env.NODE_ENV !== 'production',
        shouldDecodeNewlines,
        shouldDecodeNewlinesForHref,
        delimiters: options.delimiters,
        comments: options.comments
      }, this)
      options.render = render
      options.staticRenderFns = staticRenderFns
    }
  }
  return mount.call(this, el, hydrating)
}

/**
 * Get outerHTML of elements, taking care
 * of SVG elements in IE as well.
 */
function getOuterHTML (el: Element): string {
  if (el.outerHTML) {
    return el.outerHTML
  } else {
    const container = document.createElement('div')
    container.appendChild(el.cloneNode(true))
    return container.innerHTML
  }
}

Vue.compile = compileToFunctions

export default Vue

以上代码就是对runtime-only的代码进行包装(改写了Vue.prototype.$mount方法)。如果没有render函数,就利用template转成render函数。即下图中红色背景的过程:

template => ast => render函数 => VDOM => 真实DOM

so,以上就是runtime-onley和runtime-with-compiler的区别就清楚了!如有哪里理解错误以及书写错误,欢迎留言指正!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 女程序员的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【C++】哈希表的实现(链地址法)
【C++】哈希表的实现(开放定址法)中我们介绍了一个哈希函数:除法散列法(除留余数法),还有一个处理哈希冲突的方法:开放定址法中的线性探测。
羚羊角
2025/07/11
1040
【C++】哈希表的实现(链地址法)
Java数据结构和算法(十三)——哈希表
  Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构。它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组、链表、树等数据结构不同,在这些数据结构中查找某个关键字,通常要遍历整个数据结构,也就是O(N)的时间级,但是对于哈希表来说,只是O(1)的时间级。   注意,这里有个重要的问题就是如何把关键字转换为数组的下标,这个转换的函数称为哈希函数(也称散列函数),转换的过程称为哈希化。 1、哈希函数的引入   大家都用过
IT可乐
2018/03/30
1.3K0
Java数据结构和算法(十三)——哈希表
【C++进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解
哈希就是一种特殊的存储结构,通过特定的函数,使得数据的存储位置与它的关键码之间建立一种一一映射的关系,这样在查找数据时就可以直接通过关键值来快速查找
GG Bond1
2024/08/05
3790
【C++进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解
从 0 开始学习 JavaScript 数据结构与算法(十)哈希表
哈希表是一种非常重要的数据结构,几乎所有的编程语言都直接或者间接应用这种数据结构。
XPoet
2021/04/26
6430
数据结构一(哈希表)想进大厂的必备知识点
数据结构对于编程人员是非常重要的,想要提高自己的编程水平,或者是技术职称,都要好好的学习数据结构.那么今天讲的哈希表就是一种非常重要的数据结构,大多数学习编程的人员都搞不懂数据结构或者是其中的哈希表结构.
叫我可儿呀
2020/04/18
6490
【C++】哈希表的实现
哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进 ⾏快速查找。
用户11375356
2024/12/24
2180
【C++】哈希表的实现
数据结构:哈希碰撞的本质及解决方式
通过哈希函数产生了哈希碰撞,应该如何处理?在学习完哈希碰撞的解决方式之后,我们就可以完整地认识哈希表这种数据结构了。最后,我会带你来了解一个哈希表的常用高级应用——BloomFilter。
码农架构
2021/01/22
1.8K0
数据结构:哈希碰撞的本质及解决方式
【数据结构进阶】哈希表
之前我们学习了红黑树,其虽然通过自平衡机制提供了高效的查找、插入和删除操作,但其操作仍依赖于树的高度,最坏情况下的时间复杂度为O(log n)。当我们希望能够实现常数时间复杂度的查找操作时,哈希表便成为了一个更优的选择。哈希表虽然不再像红黑树的元素一样默认有序,但其通过 “ 哈希 ” 将数据进行映射,从而在理想情况下实现O(1)时间复杂度的操作,在某些需要高效查找的场景非常实用。本篇文章,我们将深入学习哈希表的相关知识,并尝试实现。
ephemerals__
2025/02/25
1870
【数据结构进阶】哈希表
Python 算法基础篇:哈希表与散列函数
哈希表是一种高效的数据结构,常用于存储键值对并支持快速的插入、查找和删除操作。散列函数是哈希表的关键组成部分,用于将键映射到哈希表的索引位置。本篇博客将介绍哈希表和散列函数的基本概念,并通过实例代码演示它们的应用。
小蓝枣
2023/07/24
6060
C++寻位映射的奇幻密码:哈希
哈希,用于将任意大小的数据映射为固定长度的数值(哈希值),这个过程通过哈希函数实现,其核心目标是高效地存储、查找和验证数据
DARLING Zero two
2025/05/20
1290
C++寻位映射的奇幻密码:哈希
学生物的女朋友都能看懂的哈希表总结!
之前给大家介绍了链表,栈和队列今天我们来说一种新的数据结构散列(哈希)表,散列是应用非常广泛的数据结构,在我们的刷题过程中,散列表的出场率特别高。所以我们快来一起把散列表的内些事给整明白吧,文章框架如下。
公众号袁厨的算法小屋
2020/11/25
9080
学生物的女朋友都能看懂的哈希表总结!
Algorithms_算法专项_Hash算法的原理&哈希冲突的解决办法
数组下标: 初始化一个能够容纳最大数据的int数组,数组中的值默认为0 ,然后把出现的这n个数的下标置为1,判断某个数是否存在—>直接判断这个数在数组中对应的下标是0还是1即可,1则存在,0 则不存在,那么查询的时间复杂度 O(1),也不需要遍历。
小小工匠
2021/08/17
5370
数据结构是哈希表(hashTable)
哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构。也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度。这个映射函数称为哈希函数(也称为散列函数),映射过程称为哈希化,存放记录的数组叫做散列表。比如我们可以用下面的方法将关键字映射成数组的下标:arrayIndex = hugeNumber % arraySize。         哈希化之后难免会产生一个问题,那就是对不同的关键字,可能得到同一个散列地址,即同一个数组下标,这种现象称为冲突,那么我们该如
xiangzhihong
2018/02/01
7740
C语言实现哈希搜索算法
哈希搜索,也叫散列查找,是一种通过哈希表(散列表)实现快速查找目标元素的算法。哈希搜索算法通常适用于需要快速查找一组数据中是否存在某个元素的场景,其时间复杂度最高为 O(1),而平均情况下的时间复杂度通常相当接近 O(1),因此在实际应用中具有很高的效率和性能。
芯动大师
2023/10/14
4070
C语言实现哈希搜索算法
STL源码剖析-hashtable
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details/80877353
bear_fish
2018/09/14
9370
STL源码剖析-hashtable
散列表(哈希表)
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/83998492
zy010101
2019/05/25
7900
穿越数据迷宫:C++哈希表的奇幻旅程
在C++的世界中,哈希表是一种高效、独特的数据结构,被广泛应用于需要快速查找、插入、删除的场景。通过哈希函数将数据映射到表中,它不仅提高了操作效率,还在解决冲突时展现了精巧的设计。哈希表在算法的应用中尤为重要,无论是缓存、字典处理还是集合操作,都离不开它的身影。本篇博客将带你一步步深入理解哈希表的实现原理及其应用,让你在编码之路上更上一层楼。
suye
2024/11/19
2720
哈希表(Hashtable)及哈希冲突处理
【玩转 GPU】AI绘画、AI文本、AI翻译、GPU点亮AI想象空间-腾讯云开发者社区-腾讯云 (tencent.com)
疯狂的KK
2023/07/10
3770
哈希表(Hashtable)及哈希冲突处理
查找——HASH
对于频繁使用的查找表,希望 ASL = 0 记录在表中位置和其关键字之间存在一种确定的关系 HASH 定义 根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表” HASH函数的构造 构造原则 - 函数本身便于计算 - 计算出来的地址分布均匀,即对任一关键字k,f(k) 对应不同地址的概率相等,目的是尽可能减少冲突 --- 直接定址法
ruochen
2021/07/02
7640
查找——HASH
【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】
哈希(hash)又称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。
egoist祈
2025/04/19
600
【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】
推荐阅读
相关推荐
【C++】哈希表的实现(链地址法)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档