今天构建时需要一个问题: vue-template-compiler 和vue的版本不一致的问题
解决: 在package.json中把两个包的版本配置一致即可
那么为什么要版本一致, vue-template-compiler到底是干嘛的
从以上图可得知
vue-template-compiler该模块可用于将 Vue 2.0 模板预编译为渲染函数(template => ast => render),以避免运行时编译开销和 CSP 限制。大都数场景下,与 vue-loader
一起使用,只有在编写具有非常特定需求的构建工具时,才需要单独使用它
需要注意的是,This package is auto-generated. For pull requests please see src/platforms/web/entry-compiler.js. – 这个包是自动生成的,请查看 entry-compiler.js
文件。
其文件路径,vue/src/platforms/web/entry-compiler.js
export { parseComponent } from 'sfc/parser'
export { compile, compileToFunctions } from './compiler/index'
export { ssrCompile, ssrCompileToFunctions } from './server/compiler'
export { generateCodeFrame } from 'compiler/codeframe'
可得知,vue-template-compiler
的代码是从 vue 源码中抽离的!接着,我们对比一下 vue-template-compiler
和 vue 关于编译的 API。发现对于 compile 等函数是一致,只是 vue-template-compiler
开放的参数和方法更多。因此,vue
和 vue-template-compiler
的版本必须一致(同一份源码)!
vue-template-compiler的API
const compiler = require('vue-template-compiler')
const result = compiler.compile(
{
ast: {
type: 1,
tag: 'div',
attrsList: [ [Object] ],
attrsMap: { id: 'test' },
rawAttrsMap: {},
parent: undefined,
children: [ [Object], [Object], [Object] ],
plain: false,
attrs: [ [Object] ],
static: false,
staticRoot: false
},
render: `with(this){return _c('div',{attrs:{"id":"test"}},[
_m(0), // 上述提到的静态子树,索引为0 This is my vue render test
_v(" "), // 空白节点 之间的换行内容
_c('p',[_v("my name is "+_s(myName))]) // my name is {{myName}}
])}`,
staticRenderFns: [
`with(this){return _c('div',[_c('p',[_v("This is my vue render test")])])}`
],
errors: [],
tips: []
}
)
console.log(result)
vue 关于编译的 API
{
template: {
type: 'template',
content: '\n{{ msg }}\n',
start: 10,
attrs: {},
end: 54
},
script: {
type: 'script',
content: '\n' +
'export default {\n' +
' data () {\n' +
' return {\n' +
" msg: 'Hello world!'\n" +
' }\n' +
' }\n' +
'}\n',
start: 77,
attrs: {},
end: 174
},
styles: [
{
type: 'style',
content: '\n.example {\n color: red;\n}\n',
start: 194,
attrs: {},
end: 236
}
],
customBlocks: [
{
type: 'custom1',
content: '自定义块',
start: 257,
attrs: {},
end: 261
}
],
errors: []
}
vue在渲染阶段会把模板编译为AST,然后根据AST生成render函数,底层通过调用render函数会生成VNode创建虚拟DOM。