Przeglądaj źródła

feat(compiler-core): add `comments` parser option (#1858)

Barthélémy Ledoux 5 lat temu
rodzic
commit
62b9d02f6f

+ 10 - 0
packages/compiler-core/__tests__/parse.spec.ts

@@ -374,6 +374,16 @@ describe('compiler: parse', () => {
         }
       })
     })
+
+    test('comments option', () => {
+      __DEV__ = false
+      const astNoComment = baseParse('<!--abc-->')
+      const astWithComments = baseParse('<!--abc-->', { comments: true })
+      __DEV__ = true
+
+      expect(astNoComment.children).toHaveLength(0)
+      expect(astWithComments.children).toHaveLength(1)
+    })
   })
 
   describe('Element', () => {

+ 4 - 0
packages/compiler-core/src/options.ts

@@ -49,6 +49,10 @@ export interface ParserOptions {
    */
   decodeEntities?: (rawText: string, asAttr: boolean) => string
   onError?: (error: CompilerError) => void
+  /**
+   * Keep comments in the templates AST, even in production
+   */
+  comments?: boolean
 }
 
 export type HoistTransform = (

+ 8 - 3
packages/compiler-core/src/parse.ts

@@ -50,7 +50,8 @@ export const defaultParserOptions: MergedParserOptions = {
   isCustomElement: NO,
   decodeEntities: (rawText: string): string =>
     rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),
-  onError: defaultOnError
+  onError: defaultOnError,
+  comments: false
 }
 
 export const enum TextModes {
@@ -228,8 +229,12 @@ function parseChildren(
           } else {
             node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ')
           }
-        } else if (!__DEV__ && node.type === NodeTypes.COMMENT) {
-          // remove comment nodes in prod
+        } else if (
+          !__DEV__ &&
+          node.type === NodeTypes.COMMENT &&
+          !context.options.comments
+        ) {
+          // remove comment nodes in prod by default
           removedWhitespace = true
           nodes[i] = null as any
         }