refactor(compiler-vapor): fast path for string

This commit is contained in:
三咲智子 Kevin Deng 2024-01-30 22:17:34 +08:00
parent c0b7515369
commit 7f8a94b48e
No known key found for this signature in database
GPG Key ID: 69992F2250DFD93E
7 changed files with 24 additions and 21 deletions

View File

@ -56,9 +56,12 @@ export interface CodegenContext {
newline(): CodeFragment newline(): CodeFragment
multi( multi(
codes: [left: string, right: string, segment: string], codes: [left: string, right: string, segment: string],
...fn: Array<false | CodeFragment[]> ...fn: Array<false | string | CodeFragment[]>
): CodeFragment[]
call(
name: string,
...args: Array<false | string | CodeFragment[]>
): CodeFragment[] ): CodeFragment[]
call(name: string, ...args: Array<false | CodeFragment[]>): CodeFragment[]
withIndent<T>(fn: () => T): T withIndent<T>(fn: () => T): T
helpers: Set<string> helpers: Set<string>
@ -116,8 +119,9 @@ function createCodegenContext(ir: RootIRNode, options: CodegenOptions) {
const frag: CodeFragment[] = [] const frag: CodeFragment[] = []
fns = fns.filter(Boolean) fns = fns.filter(Boolean)
frag.push(left) frag.push(left)
for (const [i, fn] of fns.entries()) { for (let [i, fn] of fns.entries()) {
if (fn) { if (fn) {
if (isString(fn)) fn = [fn]
frag.push(...fn) frag.push(...fn)
if (i < fns.length - 1) frag.push(seg) if (i < fns.length - 1) frag.push(seg)
} }

View File

@ -16,9 +16,9 @@ export function genInsertNode(
newline(), newline(),
...call( ...call(
vaporHelper('insert'), vaporHelper('insert'),
[element], element,
[`n${oper.parent}`], `n${oper.parent}`,
[`n${oper.anchor}`], `n${oper.anchor}`,
), ),
] ]
} }
@ -31,8 +31,8 @@ export function genPrependNode(
newline(), newline(),
...call( ...call(
vaporHelper('prepend'), vaporHelper('prepend'),
[`n${oper.parent}`], `n${oper.parent}`,
...oper.elements.map(el => [`n${el}`]), ...oper.elements.map(el => `n${el}`),
), ),
] ]
} }
@ -46,8 +46,8 @@ export function genAppendNode(
newline(), newline(),
...call( ...call(
vaporHelper('append'), vaporHelper('append'),
[`n${oper.parent}`], `n${oper.parent}`,
...oper.elements.map(el => [`n${el}`]), ...oper.elements.map(el => `n${el}`),
), ),
] ]
} }

View File

@ -16,13 +16,12 @@ export function genSetEvent(
const name = genName() const name = genName()
const handler = genFinalizedHandler() const handler = genFinalizedHandler()
const opt = !!options.length && [ const opt =
`{ ${options.map(v => `${v}: true`).join(', ')} }`, !!options.length && `{ ${options.map(v => `${v}: true`).join(', ')} }`
]
return [ return [
newline(), newline(),
...call(vaporHelper('on'), [`n${oper.element}`], name, handler, opt), ...call(vaporHelper('on'), `n${oper.element}`, name, handler, opt),
] ]
function genName(): CodeFragment[] { function genName(): CodeFragment[] {
@ -38,7 +37,7 @@ export function genSetEvent(
} }
} }
function genEventHandler(): CodeFragment[] { function genEventHandler() {
const exp = oper.value const exp = oper.value
if (exp && exp.content.trim()) { if (exp && exp.content.trim()) {
const isMemberExp = isMemberExpression(exp.content, ctxOptions) const isMemberExp = isMemberExpression(exp.content, ctxOptions)
@ -64,10 +63,10 @@ export function genSetEvent(
} }
} }
} }
return ['() => {}'] return '() => {}'
} }
function genFinalizedHandler(): CodeFragment[] { function genFinalizedHandler() {
let expr = genEventHandler() let expr = genEventHandler()
if (nonKeys.length) { if (nonKeys.length) {

View File

@ -11,7 +11,7 @@ export function genSetHtml(
newline(), newline(),
...call( ...call(
vaporHelper('setHtml'), vaporHelper('setHtml'),
[`n${oper.element}`], `n${oper.element}`,
genExpression(oper.value, context), genExpression(oper.value, context),
), ),
] ]

View File

@ -19,7 +19,7 @@ export function genSetModelValue(
return [ return [
newline(), newline(),
...call(vaporHelper('on'), [`n${oper.element}`], name, handler), ...call(vaporHelper('on'), `n${oper.element}`, name, handler),
] ]
function genName(): CodeFragment[] { function genName(): CodeFragment[] {

View File

@ -9,7 +9,7 @@ export function genSetProp(
): CodeFragment[] { ): CodeFragment[] {
const { call, newline, vaporHelper, helper } = context const { call, newline, vaporHelper, helper } = context
const element = [`n${oper.element}`] const element = `n${oper.element}`
const expr = genExpression(oper.key, context) const expr = genExpression(oper.key, context)
// fast path for static props // fast path for static props

View File

@ -11,7 +11,7 @@ export function genSetText(
newline(), newline(),
...call( ...call(
vaporHelper('setText'), vaporHelper('setText'),
[`n${oper.element}`], `n${oper.element}`,
genExpression(oper.value, context), genExpression(oper.value, context),
), ),
] ]