Skip to content

Commit fb53690

Browse files
committed
refactor: wip use dependency compiler
1 parent 7c5b6ac commit fb53690

File tree

4 files changed

+33
-97
lines changed

4 files changed

+33
-97
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ The following option has been changed to resourceQuery:
218218

219219
- `compiler`
220220
- `compilerOptions`
221+
- `transpileOptions`
221222
- `transformAssetUrls`
222223
- `optimizeSSR`
223224
- `hotReload`

lib/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const path = require('path')
22
const hash = require('hash-sum')
3-
const parse = require('./parse')
3+
const { parse } = require('vue-component-compiler')
44
const qs = require('querystring')
55
const plugin = require('./plugin')
66
const selectBlock = require('./select')

lib/template-loader/index.js

Lines changed: 30 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,58 @@
11
const qs = require('querystring')
2-
const prettier = require('prettier')
3-
const consolidate = require('consolidate')
42
const loaderUtils = require('loader-utils')
53
const compiler = require('vue-template-compiler')
6-
const transpile = require('vue-template-es2015-compiler')
74
const transformAssetUrl = require('./modules/assetUrl')
85
const transformSrcset = require('./modules/srcset')
96
const { genTemplateHotReloadCode } = require('../hotReload')
7+
const { compileTemplate } = require('vue-component-compiler')
108

119
// Loader that compiles raw template into JavaScript functions.
1210
// This is injected by the global pitcher (../pitch) for template
1311
// selection requests initiated from vue files.
1412
// Also handles lang="xxx" pre-processing via consolidate if necessary.
15-
module.exports = function (template) {
13+
module.exports = function (source) {
1614
const loaderContext = this
1715
const query = qs.parse(this.resourceQuery.slice(1))
1816

1917
// although this is not the main vue-loader, we can get access to the same
2018
// vue-loader options because we've set an ident in the plugin and used that
2119
// ident to create the request for this loader in the pitcher.
2220
const options = loaderUtils.getOptions(loaderContext) || {}
23-
24-
const cb = loaderContext.async()
25-
const compile = template => cb(null, actuallyCompile(
26-
template,
27-
options,
28-
loaderContext,
29-
query
30-
))
31-
32-
if (query.lang && consolidate[query.lang]) {
33-
preprocess(
34-
template,
35-
options,
36-
loaderContext,
37-
query.lang,
38-
(err, template) => {
39-
if (err) return cb(err)
40-
compile(template)
41-
}
42-
)
43-
} else {
44-
compile(template)
45-
}
46-
}
47-
48-
function preprocess (rawTemplate, options, loaderContext, lang, cb) {
49-
const engineOptions = Object.assign({
50-
filename: loaderContext.resourcePath
51-
}, options.template)
52-
53-
consolidate[lang].render(rawTemplate, engineOptions, (err, template) => {
54-
if (err) {
55-
return cb(err)
56-
}
57-
cb(null, template)
58-
})
59-
}
60-
61-
function actuallyCompile (sourceTemplate, options, loaderContext, query) {
6221
const { id } = query
6322
const isServer = loaderContext.target === 'node'
6423
const isProduction = loaderContext.minimize || process.env.NODE_ENV === 'production'
6524
const needsHotReload = !isServer && !isProduction && options.hotReload !== false
6625
const defaultModules = [transformAssetUrl(options.transformAssetUrl), transformSrcset()]
67-
const hasFunctionalTemplate = query.functional
26+
const isFunctional = query.functional
6827

6928
const userCompilerOptions = options.compilerOptions || {}
70-
7129
const compilerOptions = Object.assign({}, userCompilerOptions, {
7230
scopeId: query.scoped ? `data-v-${id}` : null,
7331
modules: defaultModules.concat(userCompilerOptions.modules || []),
7432
comments: query.comments
7533
})
7634

77-
// support user compiler
78-
const compilerToUse = options.compiler || compiler
35+
const preprocessOptions = Object.assign({
36+
filename: this.resourcePath
37+
}, options.template)
7938

80-
const compile =
81-
isServer && compilerToUse.ssrCompile && options.optimizeSSR !== false
82-
? compilerToUse.ssrCompile
83-
: compilerToUse.compile
39+
// for vue-component-compiler
40+
const finalOptions = {
41+
source,
42+
// allow using custom compiler via options
43+
compiler: options.compiler || compiler,
44+
compilerOptions,
45+
// handle possible lang="xxx"
46+
preprocessLang: query.lang,
47+
preprocessOptions,
48+
// allow customizing behavior of vue-template-es2015-compiler
49+
transpileOptions: options.transpileOptions,
50+
isProduction,
51+
isFunctional,
52+
optimizeSSR: isServer && options.optimizeSSR !== false
53+
}
8454

85-
const compiled = compile(sourceTemplate, compilerOptions)
55+
const compiled = compileTemplate(finalOptions)
8656

8757
// tips
8858
if (compiled.tips && compiled.tips.length) {
@@ -91,65 +61,29 @@ function actuallyCompile (sourceTemplate, options, loaderContext, query) {
9161
})
9262
}
9363

94-
let code
64+
// errors
9565
if (compiled.errors && compiled.errors.length) {
9666
loaderContext.emitError(
97-
`\n Error compiling template:\n${pad(sourceTemplate)}\n` +
67+
`\n Error compiling template:\n${pad(compiled.source)}\n` +
9868
compiled.errors.map(e => ` - ${e}`).join('\n') +
9969
'\n'
10070
)
101-
code =
102-
`export var render = function () {}\n` +
103-
`export var staticRenderFns = []`
104-
} else {
105-
const bubleOptions = options.buble || {
106-
transforms: {
107-
stripWithFunctional: hasFunctionalTemplate
108-
}
109-
}
110-
const staticRenderFns = compiled.staticRenderFns.map(fn =>
111-
toFunction(fn, hasFunctionalTemplate)
112-
)
113-
114-
code =
115-
transpile(
116-
'var render = ' +
117-
toFunction(compiled.render, hasFunctionalTemplate) +
118-
'\n' +
119-
'var staticRenderFns = [' +
120-
staticRenderFns.join(',') +
121-
']',
122-
bubleOptions
123-
) + '\n'
124-
125-
// prettify render fn
126-
if (!isProduction) {
127-
code = prettier.format(code, { semi: false })
128-
}
129-
130-
// mark with stripped (this enables Vue to use correct runtime proxy detection)
131-
if (!isProduction && bubleOptions.transforms.stripWith !== false) {
132-
code += `render._withStripped = true\n`
133-
}
134-
code += `export { render, staticRenderFns }`
13571
}
13672

73+
let { code } = compiled
74+
13775
// hot-reload
13876
if (needsHotReload) {
13977
code += genTemplateHotReloadCode(id)
14078
}
14179

80+
// finish with ESM exports
81+
code += `export { render, staticRenderFns }`
14282
return code
14383
}
14484

145-
function toFunction (code, hasFunctionalTemplate) {
146-
return (
147-
'function (' + (hasFunctionalTemplate ? '_h,_vm' : '') + ') {' + code + '}'
148-
)
149-
}
150-
151-
function pad (sourceTemplate) {
152-
return sourceTemplate
85+
function pad (source) {
86+
return source
15387
.split(/\r?\n/)
15488
.map(line => ` ${line}`)
15589
.join('\n')

lib/utils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const qs = require('querystring')
22

3+
// transform the attrs on a SFC block descriptor into a resourceQuery string
34
exports.attrsToQuery = (attrs, langFallback) => {
45
let query = ``
56
for (const name in attrs) {

0 commit comments

Comments
 (0)