Просмотр исходного кода

wip: force re-parse on reused sfc template ast

Evan You 2 лет назад
Родитель
Сommit
b6886a80b1
1 измененных файлов с 17 добавлено и 1 удалено
  1. 17 1
      packages/compiler-sfc/src/compileTemplate.ts

+ 17 - 1
packages/compiler-sfc/src/compileTemplate.ts

@@ -4,7 +4,10 @@ import {
   CompilerError,
   CompilerError,
   NodeTransform,
   NodeTransform,
   ParserOptions,
   ParserOptions,
-  RootNode
+  RootNode,
+  NodeTypes,
+  ElementNode,
+  createRoot
 } from '@vue/compiler-core'
 } from '@vue/compiler-core'
 import {
 import {
   SourceMapConsumer,
   SourceMapConsumer,
@@ -202,6 +205,19 @@ function doCompileTemplate({
   const shortId = id.replace(/^data-v-/, '')
   const shortId = id.replace(/^data-v-/, '')
   const longId = `data-v-${shortId}`
   const longId = `data-v-${shortId}`
 
 
+  if (inAST?.codegenNode) {
+    // input AST has codegenNode - it has already been transformed and cannot
+    // be reused. We need to parse a fresh one.
+    const newAST = compiler.parse(inAST.source, {
+      parseMode: 'sfc',
+      onError: e => errors.push(e)
+    })
+    const template = newAST.children.find(
+      node => node.type === NodeTypes.ELEMENT && node.tag === 'template'
+    ) as ElementNode
+    inAST = createRoot(template.children, inAST.source)
+  }
+
   let { code, ast, preamble, map } = compiler.compile(inAST || source, {
   let { code, ast, preamble, map } = compiler.compile(inAST || source, {
     mode: 'module',
     mode: 'module',
     prefixIdentifiers: true,
     prefixIdentifiers: true,