Skip to content

Commit ef35b62

Browse files
Nathan ReidAkryum
authored andcommitted
enable loading locally installed Vue compiler (#314)
1 parent 7b806fd commit ef35b62

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

packages/vue-component/plugin/vue-compiler.js

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@ import { Meteor } from 'meteor/meteor'
55
import _ from 'lodash'
66
import 'colors'
77

8-
let templateCompiler, transpile
9-
10-
if (vueVersion === 2) {
11-
templateCompiler = require('vue-template-compiler')
12-
transpile = require('vue-template-es2015-compiler')
13-
}
8+
let defaultTemplateCompiler, defaultTranspile
9+
const loadDefaultTemplateCompiler = () => defaultTemplateCompiler || (defaultTemplateCompiler = require('vue-template-compiler'));
10+
const loadDefaultTranspiler = () => defaultTranspile || (defaultTranspile = require('vue-template-es2015-compiler'));
1411

1512
function toFunction (code) {
1613
return 'function (){' + code + '}'
@@ -546,8 +543,8 @@ function compileTags (inputFile, sfcDescriptor, parts, babelOptions, dependencyM
546543
function compileOneFileWithContents (inputFile, contents, parts, babelOptions) {
547544
try {
548545
const cache = Cache.getCache(inputFile)
549-
550-
const sfcDescriptor = templateCompiler.parseComponent(contents, { pad: 'line' })
546+
const compiler = loadPackage(inputFile, 'vue-template-compiler', loadDefaultTemplateCompiler)
547+
const sfcDescriptor = compiler.parseComponent(contents, { pad: 'line' })
551548

552549
return compileTags(inputFile, sfcDescriptor, parts, babelOptions, cache.dependencyManager)
553550
} catch (e) {
@@ -589,7 +586,8 @@ function generateJs (vueId, inputFile, compileResult, isHotReload = false) {
589586
// Template option
590587
js += `__vue_options__.template = __vue_template__;\n`
591588
} else if (vueVersion === 2) {
592-
const templateCompilationResult = templateCompiler.compile(compileResult.template, {
589+
const compiler = loadPackage(inputFile, 'vue-template-compiler', loadDefaultTemplateCompiler)
590+
const templateCompilationResult = compiler.compile(compileResult.template, {
593591
id: vueId,
594592
warn: (message) => {
595593
const msg = `${inputFilePath}: ${message}`
@@ -617,6 +615,7 @@ function generateJs (vueId, inputFile, compileResult, isHotReload = false) {
617615
staticRenderFns = `[${templateCompilationResult.staticRenderFns.map(toFunction).join(',')}]`
618616
let renderJs = `__vue_options__.render = ${render};\n`
619617
renderJs += `__vue_options__.staticRenderFns = ${staticRenderFns};\n`
618+
const transpile = loadPackage(inputFile, 'vue-template-es2015-compiler', loadDefaultTranspiler)
620619
renderJs = transpile(renderJs)
621620
if (isDev) {
622621
renderJs += `__vue_options__.render._withStripped = true;\n`
@@ -699,3 +698,15 @@ function generateJs (vueId, inputFile, compileResult, isHotReload = false) {
699698
staticRenderFns,
700699
}
701700
}
701+
702+
function loadPackage(inputFile, packageName, loadDefaultPackage) {
703+
try {
704+
return inputFile.require(packageName)
705+
} catch (err) {
706+
// console.log(`Unable to locally load package ${packageName}: ${err.toString().substring(0,40)}`)
707+
/**
708+
* If the user doesn't have the package installed, fallback to the one bundled with this plugin.
709+
**/
710+
return loadDefaultPackage()
711+
}
712+
}

0 commit comments

Comments
 (0)