## 2-1 render.js (服务器渲染函数)
>[info] import
~~~
;(导入)节点组件创建
import { createComponentInstanceForVnode } from 'core/vdom/create-component'
~~~
>[info] module
~~~
export function createRenderFunction (modules, directives, isUnaryTag) {
;渲染节点
function renderNode (node, write, next, isRoot) {
if (node.componentOptions) {
const child = createComponentInstanceForVnode(node)
renderNode(child._render(), write, next, isRoot)
} else {
if (node.tag) {
renderElement(node, write, next, isRoot)
} else {
write(node.text, next)
}
}
}
;渲染元素
function renderElement (el, write, next, isRoot) {
if (isRoot) {
if (!el.data) el.data = {}
if (!el.data.attrs) el.data.attrs = {}
el.data.attrs['server-rendered'] = 'true'
}
const startTag = renderStartingTag(el)
const endTag = `</${el.tag}>`
if (isUnaryTag(el.tag)) {
write(startTag, next)
} else if (!el.children || !el.children.length) {
write(startTag + endTag, next)
} else {
write(startTag, () => {
const total = el.children.length
let rendered = 0
function renderChild (child) {
renderNode(child, write, () => {
rendered++
if (rendered < total) {
renderChild(el.children[rendered])
} else {
write(endTag, next)
}
})
}
renderChild(el.children[0])
})
}
}
;渲染标签
function renderStartingTag (node) {
let markup = `<${node.tag}`
if (node.data) {
// check directives
const dirs = node.data.directives
if (dirs) {
for (let i = 0; i < dirs.length; i++) {
const dirRenderer = directives[dirs[i].name]
if (dirRenderer) {
// directives mutate the node's data
// which then gets rendered by modules
dirRenderer(node, dirs[i])
}
}
}
// apply other modules
for (let i = 0; i < modules.length; i++) {
const res = modules[i](node)
if (res) {
markup += res
}
}
}
return markup + '>'
}
;渲染接口
return function render (component, write, done) {
renderNode(component._render(), write, done, true)
}
}
~~~
>[info] export
~~~
;(导出)创建服务器渲染函数
export function createRenderFunction (modules, directives, isUnaryTag) {
~~~
- 概述
- 框架结构
- 编译入口(\entries)
- web-compiler.js(web编译)
- web-runtime.js(web运行时)
- web-runtime-wih-compiler.js(web编译运行)
- web-server-renderer.js(web服务器渲染)
- 核心实现 (\core)
- index.js(核心入口)
- config.js(核心配置)
- core\util(核心工具)
- core\observer(双向绑定)
- core\vdom(虚拟DOM)
- core\global-api(核心api)
- core\instance(核心实例)
- 模板编译(\compiler)
- compiler\parser(模板解析)
- events.js(事件解析)
- helper.js(解析助手)
- directives\ref.js(ref指令)
- optimizer.js(解析优化)
- codegen.js(渲染生成)
- index.js(模板编译入口)
- web渲染(\platforms\web)
- compiler(web编译目录)
- runtime(web运行时目录)
- server(web服务器目录)
- util(web工具目录)
- 服务器渲染(\server)
- render-stream.js(流式渲染)
- render.js(服务器渲染函数)
- create-renderer.js(创建渲染接口)
- 框架流程
- Vue初始化
- Vue视图数据绑定
- Vue数据变化刷新
- Vue视图操作刷新
- 框架工具
- 基础工具(\shared)
- 模板编译助手
- 核心实例工具
- Web渲染工具
- 基础原理
- dom
- string
- array
- function
- object
- es6
- 模块(Module)
- 类(Class)
- 函数(箭头)
- 字符串(扩展)
- 代理接口(Proxy)
- 数据绑定基础
- 数据绑定实现
- mvvm简单实现
- mvvm简单使用
- vdom算法
- vdom实现
- vue源码分析资料