vue模版编译

已知template内容

<div id="app">
    <h1 key1="key1">
        h1-h1
        <h3 key3="key3">{{a}}</h3>
    </h1>
    <h2 key2="key2">{{b}}</h2>
</div>

打印内容

var ast = parse(template.trim(), options);   //console.log(ast)
var code = generate(ast, options);

ast内容如下

{type: 1, tag: "div", attrsList: Array(1), attrsMap: {}, rawAttrsMap: {},}
attrs: [{name: "id", value: "app", dynamic: undefined, start: 5, end: 13}]
attrsList: [{name: "id", value: "app", start: 5, end: 13}]
attrsMap: {id: "app"}
children: (4) [{}, {}, {}, {}] 展开在下面
end: 132
parent: undefined
plain: false
rawAttrsMap: {id: {name: "id", value: "app", start: 5, end: 13}}
start: 0
static: false
staticRoot: false
tag: "div"
type: 1

上面的children属性展开

0: {type: 1, tag: "h1", attrsList: Array(1), attrsMap: {}, rawAttrsMap: {},}
1: {type: 1, tag: "h3", attrsList: Array(1), attrsMap: {}, rawAttrsMap: {},}
2: {type: 3, text: " ", start: 89, end: 99, static: true}
3: {type: 1, tag: "h2", attrsList: Array(1), attrsMap: {}, rawAttrsMap: {},}

generate函数

function generate (
  ast,
  options
) {
  var state = new CodegenState(options);
  var code = ast ? (ast.tag === 'script' ? 'null' : genElement(ast, state)) : '_c("div")';
  return {
    render: ("with(this){return " + code + "}"),
    staticRenderFns: state.staticRenderFns
  }
}

源代码 对照 code代码

<div id="app">
    <h1 key1="key1">
        h1-h1
        <h3 key3="key3">{{a}}</h3>
    </h1>
    <h2 key2="key2">{{b}}</h2>
</div>

_c('div',
    { attrs:{"id":"app"} },
    [ _c('h1',{attrs:{"key1":"key1"}},[_v("\n  h1-h1\n  ")]),_c('h3',{attrs:{"key3":"key3"}},[_v(_s(a))]),_v(" "),
        _c('h2',{attrs:{"key2":"key2"}},[_v(_s(b))])
    ]
)

你可能感兴趣的:(vue.js,javascript,前端)