wip(compiler): adjust statement positions

This commit is contained in:
Evan You
2019-09-25 15:09:58 -04:00
parent b43f3b61b7
commit ff2313e43a
5 changed files with 43 additions and 20 deletions

View File

@@ -145,10 +145,20 @@ export function generate(
const context = createCodegenContext(ast, options)
const { mode, push, prefixIdentifiers, indent, deindent, newline } = context
const imports = ast.imports.join(', ')
// preambles
if (mode === 'function') {
// generate const declarations for helpers
// Generate const declaration for helpers
// In prefix mode, we place the const declaration at top so it's done
// only once; But if we not prefixing, we place the decalration inside the
// with block so it doesn't incur the `in` check cost for every helper access.
if (imports) {
push(`const { ${imports} } = Vue\n`)
if (prefixIdentifiers) {
push(`const { ${imports} } = Vue\n`)
} else {
// save Vue in a separate variable to avoid collision
push(`const _Vue = Vue`)
}
}
genHoists(ast.hoists, context)
push(`return `)
@@ -160,8 +170,24 @@ export function generate(
genHoists(ast.hoists, context)
push(`export default `)
}
// enter render function
push(`function render() {`)
indent()
if (!prefixIdentifiers) {
push(`with (this) {`)
indent()
// function mode const declarations should be inside with block
if (mode === 'function' && imports) {
push(`const { ${imports} } = _Vue`)
newline()
}
} else {
push(`const _ctx = this`)
newline()
}
// generate asset resolution statements
if (ast.statements.length) {
ast.statements.forEach(s => {
@@ -170,13 +196,8 @@ export function generate(
})
newline()
}
if (!prefixIdentifiers) {
push(`with (this) {`)
indent()
} else {
push(`const _ctx = this`)
newline()
}
// generate the VNode tree expression
push(`return `)
genChildren(ast.children, context, true /* asRoot */)
if (!prefixIdentifiers) {