├── assets └── vue-overview-2.jpeg ├── readme-en.md ├── readme.md ├── .gitignore ├── basic-concept.md └── template-parse.md /assets/vue-overview-2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defcc/into-vue/HEAD/assets/vue-overview-2.jpeg -------------------------------------------------------------------------------- /readme-en.md: -------------------------------------------------------------------------------- 1 | ## Into Vue.js 2 | 3 | 这个系列文章将会带你走入 Vue.js 2.0 的世界,预计将会每周日更新一篇。 4 | 你会看到 Vue.js 的使用,以及 Vue.js 的核心实现分析。 5 | 6 | ## 囊括的内容 7 | 8 | 1. [基本概念](./basic-concept.md) 9 | 2. 编译期和运行期 10 | 3. 依赖收集和响应式实现 11 | 4. 渲染函数和 UI 渲染机制 12 | 5. virtual dom 13 | 6. 服务器端渲染的实现 14 | 7. 平台独立性 15 | 8. 自定义插件 16 | 9. 动画 -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ## Into Vue.js 2 | 3 | 这个系列文章将会带你走入 Vue.js 2.0 的世界,预计将会每周日更新一篇。 4 | 你会看到 Vue.js 的使用,以及 Vue.js 的核心实现分析。 5 | 6 | ## 囊括的内容 7 | 8 | 1. [基本概念](./basic-concept.md) 9 | 2. 编译期 10 | 1. [模版解析](./template-parse.md) 11 | 2. ast 优化 12 | 3. 渲染函数代码生成 13 | 3. 依赖收集和响应式实现 14 | 4. 渲染函数和 UI 渲染机制 15 | 5. virtual dom 16 | 6. 服务器端渲染的实现 17 | 7. 平台独立性 18 | 8. 自定义插件 19 | 9. 动画 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | -------------------------------------------------------------------------------- /basic-concept.md: -------------------------------------------------------------------------------- 1 | ## Vue.js 2.0 basic concepts 2 | 3 | 下面这张图从宏观上展现了 Vue.js 2.0 整体流程图 4 | 5 |  6 | 7 | 从这张图中,我们可以初步看到一个 Vue.js 的应用是如何运行起来的,模版通过编译生成 ast,再由 ast 生成 Vue.js 的渲染函数,渲染函数结合数据生成 virtual dom tree,diff 和 patch 后生成新的 UI。 8 | 9 | 下面分别表述一些关于 Vue.js 的基本概念。 10 | 11 | ### 模版 12 | Vue.js 的模版基于纯 html,基于 Vue 的模版语法,我们可以比较方便地声明数据和 UI 的关系。 13 | 14 | ### AST (Abstract syntax tree) 15 | AST 是抽象语法树的简称,Vue.js 使用 html parser 将 html 模版解析为 ast,并且对 ast 进行一些优化的标记处理,提取最大的静态树,方便 virtual dom 时直接跳过 diff. 16 | 17 | ### 渲染函数 18 | 渲染函数是用来生成 virtual dom 的。Vue.js 推荐使用模版来构建我们的应用界面,在底层实现中 Vue 会将模版编译成渲染函数,当然我们也可以不写模版,直接写渲染函数,以获得更好的控制。 19 | 20 | ### Virtual dom 21 | 虚拟 dom 树,Vue.js 的 virtual dom patching 算法是基于 https://github.com/paldepind/snabbdom 的实现,并在此基础上作了很多的调整和改进。 22 | 23 | ### Watcher 24 | 每一个 Vue.js 组件都有一个对应的 watcher,这个 watcher 将会在组件 render 的时候收集组件所依赖的数据,并在依赖有更新的时候,触发组件重新渲染。你根本不需要写 shouldComponentUpdate,Vue.js 会自动优化并更新需要更新的 UI。 25 | 26 | ---- 27 | 28 | Render function 可以作为一道分割线,Render function 的左边可以称之为编译期,将 Vue.js 的模版转换为渲染函数。Vue.js 2.0 对于 jsx 语法的支持即是通过 babel 插件编译实现。Render function 的右边是 Vue.js 的运行时,主要是基于渲染函数生成 virtual dom 树,diff & patch。 29 | 30 | 下面一篇我们将会详细介绍 Vue.js 的编译期,通过 parser 对模版进行解析生成 ast。 31 | -------------------------------------------------------------------------------- /template-parse.md: -------------------------------------------------------------------------------- 1 | ## Vue.js 模版解析过程分析 2 | 3 | ### 模版和解析说明 4 | 5 | 先来看一段 Vue.js 的模版 6 | 7 | ```html 8 |
123
` ,需要闭合第一个 p 标签。 45 | 2. 一些标签不能出现在 p 中,比如 div li 等块级标签。对于这些标签,如果出现了形如 `
123