1
1
const qs = require ( 'querystring' )
2
- const prettier = require ( 'prettier' )
3
- const consolidate = require ( 'consolidate' )
4
2
const loaderUtils = require ( 'loader-utils' )
5
3
const compiler = require ( 'vue-template-compiler' )
6
- const transpile = require ( 'vue-template-es2015-compiler' )
7
4
const transformAssetUrl = require ( './modules/assetUrl' )
8
5
const transformSrcset = require ( './modules/srcset' )
9
6
const { genTemplateHotReloadCode } = require ( '../hotReload' )
7
+ const { compileTemplate } = require ( 'vue-component-compiler' )
10
8
11
9
// Loader that compiles raw template into JavaScript functions.
12
10
// This is injected by the global pitcher (../pitch) for template
13
11
// selection requests initiated from vue files.
14
12
// Also handles lang="xxx" pre-processing via consolidate if necessary.
15
- module . exports = function ( template ) {
13
+ module . exports = function ( source ) {
16
14
const loaderContext = this
17
15
const query = qs . parse ( this . resourceQuery . slice ( 1 ) )
18
16
19
17
// although this is not the main vue-loader, we can get access to the same
20
18
// vue-loader options because we've set an ident in the plugin and used that
21
19
// ident to create the request for this loader in the pitcher.
22
20
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 ) {
62
21
const { id } = query
63
22
const isServer = loaderContext . target === 'node'
64
23
const isProduction = loaderContext . minimize || process . env . NODE_ENV === 'production'
65
24
const needsHotReload = ! isServer && ! isProduction && options . hotReload !== false
66
25
const defaultModules = [ transformAssetUrl ( options . transformAssetUrl ) , transformSrcset ( ) ]
67
- const hasFunctionalTemplate = query . functional
26
+ const isFunctional = query . functional
68
27
69
28
const userCompilerOptions = options . compilerOptions || { }
70
-
71
29
const compilerOptions = Object . assign ( { } , userCompilerOptions , {
72
30
scopeId : query . scoped ? `data-v-${ id } ` : null ,
73
31
modules : defaultModules . concat ( userCompilerOptions . modules || [ ] ) ,
74
32
comments : query . comments
75
33
} )
76
34
77
- // support user compiler
78
- const compilerToUse = options . compiler || compiler
35
+ const preprocessOptions = Object . assign ( {
36
+ filename : this . resourcePath
37
+ } , options . template )
79
38
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
+ }
84
54
85
- const compiled = compile ( sourceTemplate , compilerOptions )
55
+ const compiled = compileTemplate ( finalOptions )
86
56
87
57
// tips
88
58
if ( compiled . tips && compiled . tips . length ) {
@@ -91,65 +61,29 @@ function actuallyCompile (sourceTemplate, options, loaderContext, query) {
91
61
} )
92
62
}
93
63
94
- let code
64
+ // errors
95
65
if ( compiled . errors && compiled . errors . length ) {
96
66
loaderContext . emitError (
97
- `\n Error compiling template:\n${ pad ( sourceTemplate ) } \n` +
67
+ `\n Error compiling template:\n${ pad ( compiled . source ) } \n` +
98
68
compiled . errors . map ( e => ` - ${ e } ` ) . join ( '\n' ) +
99
69
'\n'
100
70
)
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 }`
135
71
}
136
72
73
+ let { code } = compiled
74
+
137
75
// hot-reload
138
76
if ( needsHotReload ) {
139
77
code += genTemplateHotReloadCode ( id )
140
78
}
141
79
80
+ // finish with ESM exports
81
+ code += `export { render, staticRenderFns }`
142
82
return code
143
83
}
144
84
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
153
87
. split ( / \r ? \n / )
154
88
. map ( line => ` ${ line } ` )
155
89
. join ( '\n' )
0 commit comments