【摘要】 Vue compiler部分逻辑梳理

示例代码托管在:http://www.github.com/dashnowords/blogs

一. 简述

compiler模块Vue框架中用于模板编译的,它的作用就是将Vue中的组件模板转换成render函数,render函数在运行时可以生成虚拟节点vnode,它是Vue中虚拟DOM树的基本实现流程。完整版的Vue是包含runtimecompiler的,也就是说模板的编译过程可以在运行时进行,这无疑是一种性能负担。Vue官方也提供了独立的runtime版本,其中只包含运行时环境,把从templaterender函数的生成部分放在构建时完成(利用vue-templete-compiler模块),以提高运行时的效率。

由于跨平台需求,compiler模块的实现过程步骤稍多,不断地利用高阶函数来拆分整体逻辑,不是很容易阅读,本篇对该模块的基本流程进行一个梳理,再参考文末彩蛋推荐的电子书,就比较容易看懂了。

二. 编译流程

相关入口在实例挂载函数$mount的实现中:

Vue.prototype.$mount = function(){const options = this.$options//....const { render, staticRenderFns } = compileToFunctions(template, {shouldDecodeNewlines,shouldDecodeNewlinesForHref,delimiters: options.delimiters,comments: options.comments}, this)options.render = renderoptions.staticRenderFns = staticRenderFns//....return mount.call(this, el, hydrating)
}

可以看到实例挂载方法$mount的逻辑就是在调用mount方法前在实例的$options添加了额外的信息。此处调用的compileToFunctions方法经历的逻辑跳转了多层高阶函数,涉及文件也比较多,直接上图比较清楚:

笔者将涉及函数简化为输入输出的形式:

核心逻辑步骤如下所示:

梳理完流程,整个编译流程的宏观流程也就相对清晰了,这里为了兼顾不同平台的方法差异,将有差异的部分提取为独立的模块,然后作为函数参数注入执行函数,这种通过高阶函数来组织代码的方式能提高核心逻辑的聚合程度,如果是普通的业务逻辑,很可能会是以扁平化串联调用的形式来编写方法的,笔者个人认为两种模式没有绝对的优劣对比,虽然高阶函数看起来更高级。

三. 彩蛋环节

分享一本非常详细的讲述Vue核心原理的开源电子书【Vue.js 技术揭秘】。

md原文.rar

作者:大史不说话

Vue源码中compiler部分逻辑梳理(内有彩蛋)相关推荐

  1. Vue源码中的对象相等比较

    Vue源码中的对象比较函数写的极为经典漂亮,在此进行部分注释并添加一个函数类型比较判断,代码如下: function isObject(o) {return typeof o==='object'}f ...

  2. 什么是php的ast结构,什么是AST?Vue源码中AST语法树的解析

    这篇文章给大家介绍的内容是关于什么是AST?Vue源码中AST语法树的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是AST AST是指抽象语法树(abstract syn ...

  3. 基于Vue源码中e2e测试实践

    您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ 基于Vue源码中e2e测试实践 前言 技术选型&对Vue的参考 Puppeteer测试流程 在Concis中 ...

  4. vue源码中优秀代码片段(一)

    一.前言 笔者在读Vue源码时, 手记一些源码中优美的代码片段,一起来学习吧 二.代码片段 1. makeMap 检测某值是否在字符串(逗号分隔的字符串)中存在, 运用了柯里化函数和缓存函数 源码鉴赏 ...

  5. Vue源码翻译之渲染逻辑链

    本篇文章主要要记录说明的是,Vue在Vdom的创建上的相关细节.这也是描绘了Vue在界面的创建上的一个逻辑顺序,同时我也非常拜服作者编码的逻辑性,当然或许这么庞大复杂的编码不是一次性铸就的,我想应该也 ...

  6. vue中rules校验是验证首字符_小白也能秒懂Vue源码中那些精细设计(选项处理)...

    我"崩"不住了,在彭凡同志锲而不舍的催促下这篇文章终于"蛋"生了. 说正经的这篇文章不好写,不好写的原因是我不太擅长写这些类比文,但它还是写出来了. 相信大部分 ...

  7. 「从源码中学习」面试官都不知道的Vue题目答案

    前言 当回答面试官问及的Vue问题,我们除了照本宣科的回答外,其实还可以根据少量的源码来秀一把,来体现出你对Vue的深度了解. 本文会陆续更新,此次涉及以下问题: "new Vue()做了什 ...

  8. vue 拷贝 数组_vue源码中值得学习的方法

    最近在深入研究vue源码,把学习过程中,看到的一些好玩的的函数方法收集起来做分享,希望对大家对深入学习js有所帮助.如果大家都能一眼看懂这些函数,说明技术还是不错的哦. 1. 数据类型判断 Objec ...

  9. 学习vue源码(14)深入学习diff

    大白话简述 这一节,先对diff进行简单的描述,不会出现任何的源码,只是为了帮助大家建立一种思路,了解下 Diff 的大概内容. 1.Diff 的作用2.Diff 的做法3.Diff 的比较逻辑4.简 ...

最新文章

  1. IBM被曝拟出售昔日明星业务Watson Health,10年医疗梦就此破碎?
  2. linux死锁检测的一种思路【转】
  3. msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
  4. Android内核开发:学会分析系统的启动log
  5. Edit Distance Python源码及支持包的实现
  6. AI新浪潮:截止2022年,全球74%的计算将来自端侧
  7. 学密码学一定得学程序
  8. JavaWeb学习之路——SSM框架之Spring(四)
  9. 大道至简第一章阅读笔记
  10. c语言最简单的程序编写,C语言简单程序编写.doc
  11. Xen 安装ubuntu xen DomU
  12. PHP语言、浏览器、操作系统、IP、地理位置、ISP
  13. 怎么隐藏php版本,Linux服务器中怎样隐藏PHP版本
  14. 社工查询-最强社工查询网址汇总
  15. Mark Text快捷键
  16. python猜数字游戏实例_Python文曲星猜数字游戏实例代码教程
  17. 在 JDK 1.4 中打印
  18. mysql数据库教程级联_Mysql实现级联操作(级联更新、级联删除)
  19. 自然语言处理(1)——绪论与概述
  20. Linux valgrind java_linux下利用valgrind工具进行内存泄露检测和性能分析

热门文章

  1. ROS笔记(24) Amcl
  2. java实现蛇蛇大作战_蛇蛇大作战3D旋涡版
  3. java 正規表示 group_经验分享|Java+百度AI实现人脸识别
  4. PX4编译文件 Makefile 剖析
  5. xdebug调试时出错 --mxp
  6. mongodb-java-driver基本用法
  7. 开源软件free download manager在windows defender中报毒
  8. Virtuoso崩掉时layout数据恢复
  9. vbox设置剪切板共享
  10. Android -- I/O CALL SMS Layout