Ver Fonte

more efficient compiler module handling

Evan You há 10 anos atrás
pai
commit
a20dd86ecf

+ 11 - 12
src/compiler/codegen.js

@@ -1,13 +1,14 @@
 /* @flow */
 
 import { genHandlers } from './events'
-import { baseWarn } from './helpers'
+import { baseWarn, pluckModuleFunction } from './helpers'
 import baseDirectives from './directives/index'
 import { no } from 'shared/util'
 
 // configurable state
 let warn
-let platformModules
+let transforms
+let dataGenFns
 let platformDirectives
 let isPlatformReservedTag
 let staticRenderFns
@@ -25,7 +26,8 @@ export function generate (
   const currentStaticRenderFns: Array<string> = staticRenderFns = []
   currentOptions = options
   warn = options.warn || baseWarn
-  platformModules = options.modules || []
+  transforms = pluckModuleFunction(options.modules, 'transformCode')
+  dataGenFns = pluckModuleFunction(options.modules, 'genData')
   platformDirectives = options.directives || {}
   isPlatformReservedTag = options.isReservedTag || no
   const code = ast ? genElement(ast) : '_h(_e("div"))'
@@ -72,12 +74,9 @@ function genElement (el: ASTElement): string {
         code = `_m(${staticRenderFns.length - 1})`
       }
     }
-    // platform modules
-    for (let i = 0; i < platformModules.length; i++) {
-      const transform = platformModules[i].transformCode
-      if (transform) {
-        code = transform(el, code)
-      }
+    // module transforms
+    for (let i = 0; i < transforms.length; i++) {
+      code = transforms[i](el, code)
     }
     // check keep-alive
     if (el.component && el.keepAlive) {
@@ -141,9 +140,9 @@ function genData (el: ASTElement): string | void {
   if (el.slotTarget) {
     data += `slot:${el.slotTarget},`
   }
-  // platform modules
-  for (let i = 0; i < platformModules.length; i++) {
-    data += platformModules[i].genData(el)
+  // module data generation functions
+  for (let i = 0; i < dataGenFns.length; i++) {
+    data += dataGenFns[i](el)
   }
   // v-show, used to avoid transition being applied
   // since v-show takes it over

+ 9 - 0
src/compiler/helpers.js

@@ -4,6 +4,15 @@ export function baseWarn (msg: string) {
   console.error(`[Vue parser]: ${msg}`)
 }
 
+export function pluckModuleFunction (
+  modules: ?Array<Object>,
+  key: string
+): Array<Function> {
+  return modules
+    ? modules.map(m => m[key]).filter(_ => _)
+    : []
+}
+
 export function addProp (el: ASTElement, name: string, value: string) {
   (el.props || (el.props = [])).push({ name, value })
 }

+ 5 - 4
src/compiler/parser/index.js

@@ -5,6 +5,7 @@ import { parseHTML } from './html-parser'
 import { parseText } from './text-parser'
 import { hyphenate, cached, no } from 'shared/util'
 import {
+  pluckModuleFunction,
   getAndRemoveAttr,
   addProp,
   addAttr,
@@ -30,7 +31,7 @@ const decodeHTMLCached = cached(decodeHTML)
 let warn
 let platformGetTagNamespace
 let platformMustUseProp
-let platformModules
+let transforms
 let delimiters
 
 /**
@@ -43,7 +44,7 @@ export function parse (
   warn = options.warn || baseWarn
   platformGetTagNamespace = options.getTagNamespace || no
   platformMustUseProp = options.mustUseProp || no
-  platformModules = options.modules || []
+  transforms = pluckModuleFunction(options.modules, 'transformNode')
   delimiters = options.delimiters
   const stack = []
   let root
@@ -115,8 +116,8 @@ export function parse (
         processRender(element)
         processSlot(element)
         processComponent(element)
-        for (let i = 0; i < platformModules.length; i++) {
-          platformModules[i].transformNode(element, options)
+        for (let i = 0; i < transforms.length; i++) {
+          transforms[i](element, options)
         }
         processAttrs(element)
       }

+ 12 - 1
src/entries/web-compiler.js

@@ -1,4 +1,5 @@
-import { compile as baseCompile } from 'web/compiler/index'
+import { extend } from 'shared/util'
+import { compile as baseCompile, baseOptions } from 'web/compiler/index'
 import { detectErrors } from 'compiler/error-detector'
 
 export { parseSFC as parseComponent } from 'compiler/parser/sfc-parser'
@@ -8,8 +9,18 @@ export function compile (
   template: string,
   options?: Object
 ): CompiledResult {
+  options = options || {}
   const errors = []
+  // allow injecting modules/directives
+  const modules = options.modules
+    ? baseOptions.modules.concat(options.modules)
+    : baseOptions.modules
+  const directives = options.directives
+    ? extend(extend({}, baseOptions.directives), options.directives)
+    : baseOptions.directives
   const compiled = baseCompile(template, {
+    modules,
+    directives,
     warn: msg => {
       errors.push(msg)
     }