]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(compiler-core): hoist static text calls between elements
authorEvan You <yyx990803@gmail.com>
Mon, 10 Feb 2020 23:32:11 +0000 (18:32 -0500)
committerEvan You <yyx990803@gmail.com>
Mon, 10 Feb 2020 23:32:11 +0000 (18:32 -0500)
packages/compiler-core/__tests__/transforms/__snapshots__/hoistStatic.spec.ts.snap
packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts
packages/compiler-core/src/ast.ts
packages/compiler-core/src/transforms/hoistStatic.ts
packages/compiler-dom/src/index.ts

index 205a134786da219368dd567c91d0483ef7f0382b..c3678c7adfdf648582eaa5ec8cab4f9fb62649bc 100644 (file)
@@ -172,12 +172,7 @@ exports[`compiler: hoistStatic transform prefixIdentifiers hoist nested static t
 "const _Vue = Vue
 const { createVNode: _createVNode } = _Vue
 
-const _hoisted_1 = _createVNode(\\"span\\", null, [
-  \\"foo \\",
-  _toDisplayString(1),
-  \\" \\",
-  _toDisplayString(true)
-])
+const _hoisted_1 = _createVNode(\\"span\\", null, \\"foo \\" + _toDisplayString(1) + \\" \\" + _toDisplayString(true))
 
 return function render(_ctx, _cache) {
   with (this) {
@@ -244,12 +239,14 @@ exports[`compiler: hoistStatic transform prefixIdentifiers should NOT hoist expr
 
 return function render(_ctx, _cache) {
   with (this) {
-    const { toDisplayString: _toDisplayString, resolveComponent: _resolveComponent, createVNode: _createVNode, createBlock: _createBlock, openBlock: _openBlock } = _Vue
+    const { toDisplayString: _toDisplayString, createTextVNode: _createTextVNode, resolveComponent: _resolveComponent, createVNode: _createVNode, createBlock: _createBlock, openBlock: _openBlock } = _Vue
 
     const _component_Comp = _resolveComponent(\\"Comp\\")
 
     return (_openBlock(), _createBlock(_component_Comp, null, {
-      default: ({ foo }) => [_toDisplayString(_ctx.foo)],
+      default: ({ foo }) => [
+        _createTextVNode(_toDisplayString(_ctx.foo), 1 /* TEXT */)
+      ],
       _compiled: true
     }))
   }
index 3989805ee3f325b7e71e8295e8d2cc0159203a2d..5024031246a26927df00499f8c46f9e9eb690be5 100644 (file)
@@ -11,7 +11,8 @@ import {
   CREATE_VNODE,
   WITH_DIRECTIVES,
   FRAGMENT,
-  RENDER_LIST
+  RENDER_LIST,
+  CREATE_TEXT
 } from '../../src/runtimeHelpers'
 import { transformElement } from '../../src/transforms/transformElement'
 import { transformExpression } from '../../src/transforms/transformExpression'
@@ -21,6 +22,7 @@ import { transformBind } from '../../src/transforms/vBind'
 import { transformOn } from '../../src/transforms/vOn'
 import { createObjectMatcher, genFlagText } from '../testUtils'
 import { PatchFlags } from '@vue/shared'
+import { transformText } from '../../src/transforms/transformText'
 
 function transformWithHoist(template: string, options: CompilerOptions = {}) {
   const ast = parse(template)
@@ -30,7 +32,8 @@ function transformWithHoist(template: string, options: CompilerOptions = {}) {
       transformIf,
       transformFor,
       ...(options.prefixIdentifiers ? [transformExpression] : []),
-      transformElement
+      transformElement,
+      transformText
     ],
     directiveTransforms: {
       on: transformOn,
@@ -467,6 +470,24 @@ describe('compiler: hoistStatic transform', () => {
     expect(generate(root).code).toMatchSnapshot()
   })
 
+  test('hoist static text node between elements', () => {
+    const { root } = transformWithHoist(`<div>static<div>static</div></div>`)
+    expect(root.hoists).toMatchObject([
+      {
+        callee: CREATE_TEXT,
+        arguments: [
+          {
+            type: NodeTypes.TEXT,
+            content: `static`
+          }
+        ]
+      },
+      {
+        callee: CREATE_VNODE
+      }
+    ])
+  })
+
   describe('prefixIdentifiers', () => {
     test('hoist nested static tree with static interpolation', () => {
       const { root, args } = transformWithHoist(
@@ -482,32 +503,9 @@ describe('compiler: hoistStatic transform', () => {
           arguments: [
             `"span"`,
             `null`,
-            [
-              {
-                type: NodeTypes.TEXT,
-                content: `foo `
-              },
-              {
-                type: NodeTypes.INTERPOLATION,
-                content: {
-                  content: `1`,
-                  isStatic: false,
-                  isConstant: true
-                }
-              },
-              {
-                type: NodeTypes.TEXT,
-                content: ` `
-              },
-              {
-                type: NodeTypes.INTERPOLATION,
-                content: {
-                  content: `true`,
-                  isStatic: false,
-                  isConstant: true
-                }
-              }
-            ]
+            {
+              type: NodeTypes.COMPOUND_EXPRESSION
+            }
           ]
         }
       ])
index 602af41dba255f9100ad27512644d5524e61747e..0039b6e05ebee3f166f0a924fe066bcfe6759bb1 100644 (file)
@@ -243,7 +243,7 @@ export interface ForNode extends Node {
 export interface TextCallNode extends Node {
   type: NodeTypes.TEXT_CALL
   content: TextNode | InterpolationNode | CompoundExpressionNode
-  codegenNode: CallExpression
+  codegenNode: CallExpression | SimpleExpressionNode // when hoisted
 }
 
 // JS Node Types ---------------------------------------------------------------
index 7dd38b4650999f2e5ee68308ab5791f333841804..f04f24449cb8efacd63e5997afd5c6b80915b142 100644 (file)
@@ -21,6 +21,8 @@ export function hoistStatic(root: RootNode, context: TransformContext) {
     root.children,
     context,
     new Map(),
+    // Root node is unfortuantely non-hoistable due to potential parent
+    // fallthrough attributes.
     isSingleElementRoot(root, root.children[0])
   )
 }
@@ -86,6 +88,11 @@ function walk(
         // Do not hoist v-if single child because it has to be a block
         walk(branchChildren, context, resultCache, branchChildren.length === 1)
       }
+    } else if (
+      child.type === NodeTypes.TEXT_CALL &&
+      isStaticNode(child.content, resultCache)
+    ) {
+      child.codegenNode = context.hoist(child.codegenNode)
     }
   }
 }
index 07f427e5c1187b0a2045ee28ebb53ce0e5ac92cc..5ae5c1b5ee7fba85673387b204bf74fad4069c47 100644 (file)
@@ -41,7 +41,7 @@ export function compile(
   template: string,
   options: CompilerOptions = {}
 ): CodegenResult {
-  return baseCompile(template, {
+  const result = baseCompile(template, {
     ...parserOptions,
     ...options,
     nodeTransforms: [...DOMNodeTransforms, ...(options.nodeTransforms || [])],
@@ -50,6 +50,8 @@ export function compile(
       ...(options.directiveTransforms || {})
     }
   })
+  // debugger
+  return result
 }
 
 export function parse(template: string, options: ParserOptions = {}): RootNode {