咱来聊聊 Vue - compile

在 vue 里, 模板编译也是非常重要的一部分, 里面也非常复杂, 这次探究不会深入探究每一个细节, 而是走一个全景概要, 来吧, 大家和我一起去一探究竟

初体验

我们看了 Vue 的初始化函数就会知道, 在最后一步, 它进行了 __vm.$mount(el)__ 的操作, 而这个 $mount 在两个地方定义过, 分别是在 entry-runtime-with-compiler.js(简称: eMount) 和 runtime/index.js(简称: rMount) 这两个文件里, 那么这两个有什么区别呢?// entry-runtime-with-compiler.js

constmount=Vue.prototype.$mount// 这个 $mount 其实就是 rMount

Vue.prototype.$mount=function(

el?:string|Element,

hydrating?:boolean

):Component{

constoptions=this.$options

if(!options.render){

...

if(template){

const{render,staticRenderFns}=compileToFunctions(template,{

shouldDecodeNewlines,

shouldDecodeNewlinesForHref,

delimiters:options.delimiters,

comments:options.comments

},this)

options.render=render

options.staticRenderFns=staticRenderFns

}

...

}

returnmount.call(this,el,hydrating)

}

其实 eMount 最后还是去调用的 rMount, 只不过在 eMount 做了一定的操作, 如果你提供了 render 函数, 那么它会直接去调用 rMount, 如果没有, 它就会去找你有没有提供 template, 如果你没有提供 template, 它就会用 el 去查询 dom 生成 template, 最后通过编译返回了一个 render 函数, 再去调用 eMount

从上面可以看出, 最重要的一部分就是 compileToFunctions 这个函数, 它最后返回了 render 函数, 关于这个函数, 它有点复杂, 我画了一张图来看一看它的关系, 可能会有误差, 希望大侠们可以指出

编译三步走

看一下这个编译的整体过程, 我们其实可以发现, 最核心的部分就是在这里传进去的 baseCompile 做的工作:

parse: 第一步, 我们需要将 template 转换成抽象语法树 (AST)

optimizer: 第二步, 我们对这个抽象语法树进行静态节点的标记, 这样就可以优化渲染过程

generateCode: 第三步, 根据 AST 生成一个 render 函数字符串

好了, 我们接下来就一个一个慢慢看

解析器

在解析器中有一个非常重要的概念 AST, 大家可以去自行了解一下

在 Vue 中, ASTNode 分几种不同类型, 关于 ASTNode 的定义在 flow/compile.js 里面, 请看下图:

我们用一个简单的例子来说明一下:

Latest vue.js Commits

{{1 + 1}}

vue compile添加html,咱来聊聊 Vue - compile相关推荐

  1. vue 中provide的用法_聊聊Vue中provide/inject的应用详解

    众所周知,在组件式开发中,最大的痛点就在于组件之间的通信.在 Vue 中,Vue 提供了各种各样的组件通信方式,从基础的 props/$emit 到用于兄弟组件通信的 EventBus,再到用于全局数 ...

  2. vue 动态添加class_前端开发:Vue项目实战-Music

    大家好,我来了,本期为大家带来的前端开发知识是"前端开发:Vue项目实战-Music",有兴趣做前端的朋友,和我一起来看看吧! 主要内容 项目环境搭建 路由导航实现 ListVie ...

  3. vue动态设置文字布局方式_详解Vue动态添加模板的几种方法

    动态添加模板需要收集原始数据的页面,这个时候我们需要很多原始数据收集模板,下面给大家详解Vue 动态添加模板的几种方法,希望对你学习这方面知识有所帮助. 通常我们会在组件里的 template 属性定 ...

  4. 聊聊Vue(前端Vue面试包过)【面试干货】

    聊聊Vue[面试干货] (耐心看完这篇Vue.面试中小厂的同学差不多都能过) 1 对于MVVM的理解 首先你要知道MVVM是个什么鬼 MVVM 是 Model-View-ViewModel 的缩写 M ...

  5. 实锤了,尤大妥妥的二次元迷弟 —— 聊聊 Vue 的进化历程

    文章目录 实锤了,尤大妥妥的二次元迷弟 -- 聊聊 Vue 的进化历程 1. 前言 2. 库阶段 2.1 阶段发展 2.2 设计重点和特征 3. 框架阶段 3.1 阶段发展 3.2 设计重点 4. 通 ...

  6. VUE 框架添加全局公共方法 , 保留小数点后两位

    在main.js 里面给Vue对象添加方法. 来一个示例代码: import Vue from 'vue' import App from './App'Vue.prototype.num_to_st ...

  7. 添加数据功能java,SpringBoot+Vue实现数据添加功能

    一.添加代码生成器 用来自动为数据库映射类建立:mapper.service.controller package com.hanmh.utils; import com.baomidou.mybat ...

  8. Vue中添加新的路由并访问

    1.搭建好Vue脚手架(这里使用的版本是Vue2.0) 2.在代码编辑器(这里使用的是Sublime Text)打开项目文件夹 3.在文件目录src中的component下创建一个新的vue页面,写入 ...

  9. vue cli 添加html,vue-cli创建的项目,配置多页面的实现方法

    vue官方提供的命令行工具vue-cli,能够快速搭建单页应用.默认一个页面入口index.html,那么,如果我们需要多页面该如何配置,实际上也不复杂 假设要新建的页面是rule,以下以rule为例 ...

最新文章

  1. 2021年大数据Kafka(七):Kafka的分片和副本机制
  2. vscode断开调试服务器文件,vscode显示等待调试器断开连接
  3. shell中大于、等于、小于
  4. [转]Linux下pppoe配合Drcom插件上网方法介绍......
  5. Metaspace 引起的 FullGC 问题排查过程及解决方案
  6. yolov5损失函数笔记
  7. osx java 6_OSX 10.11 java 6不兼容怎么办?OSX 10.11 java 6不兼容解决办法
  8. mysql 线程池源码模块_易语言Mysql线程池2.0模块源码
  9. linux 磁盘延时,Linux:如何模拟硬盘延迟?我想在不使用CPU电源的情况下增加iowait值...
  10. xfce中仿gnome的多桌面的xfdashboard的用法
  11. 全站仪与计算机之间的数据传输,必看!全站仪数据传输的三种方式详解,都安排得明明白白(上)...
  12. 完全卸载gitlab
  13. phP imageMagic抠图,ps抠图技巧汇总
  14. Word技巧:快速将不同字数的姓名对齐
  15. python提取pdf表格数据 无边框_Python使用Tabula提取PDF表格数据
  16. gflags 调试内存_windows下堆异常调试神器--gflags
  17. PrintShield打印监控系统
  18. 猿创征文|2022全球程序员薪资排行一览
  19. RabbitMQ的Queue详解;
  20. 华为使用计算机投屏要打开什么,华为Mate20手机怎么投屏到电脑上呢

热门文章

  1. poj 3082多边形相交 'Roid Rage
  2. 谈.Net委托与线程——解决窗体假死
  3. RHEL修改最大文件打开数,关于epoll socket Too many open files问题的解决
  4. [笔试题目] 腾讯2015年9月基础研究笔试题
  5. [LeetCode] Binary Tree Paths - 二叉树基础系列题目
  6. 2017年第八届蓝桥杯 - 省赛 - C/C++大学A组 - C. 魔方状态
  7. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - H. 等差数列
  8. 974. Subarray Sums Divisible by K
  9. Scrapy + Redis 分布式爬取58同城北京全站二手房数据
  10. 大数据WEB阶段(十四)JavaEE开发模式