Skip to content

Commit d353739

Browse files
committed
refactor transform to require compiler module
1 parent 6fddcc3 commit d353739

File tree

2 files changed

+55
-53
lines changed

2 files changed

+55
-53
lines changed

lib/template-compiler.js

Lines changed: 12 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,26 @@
1-
var compiler = require('vue-template-compiler')
2-
var transpile = require('vue-template-es2015-compiler')
1+
var normalize = require('./normalize')
32
var loaderUtils = require('loader-utils')
3+
var compiler = require('vue-template-compiler')
44
var beautify = require('js-beautify').js_beautify
5-
var normalize = require('./normalize')
5+
var transpile = require('vue-template-es2015-compiler')
66
var hotReloadAPIPath = normalize.dep('vue-hot-reload-api')
7+
var transformRequire = require('./template-transform-require')
78

8-
// vue compiler module for using transforming `<tag>:<attribute>` to `require`
9-
var defaultTransformToRequire = {
10-
img: 'src',
11-
image: 'xlink:href'
12-
}
13-
var transformToRequire = defaultTransformToRequire
14-
var defaultCompileOptions = {
15-
modules: [{
16-
postTransformNode (el) {
17-
for (var tag in transformToRequire) {
18-
if (el.tag === tag && el.attrs) {
19-
var attributes = transformToRequire[tag]
20-
if (typeof attributes === 'string') {
21-
el.attrs.some(attr => rewrite(attr, attributes))
22-
} else if (Array.isArray(attributes)) {
23-
attributes.forEach(item => el.attrs.some(attr => rewrite(attr, item)))
24-
}
25-
}
26-
}
27-
}
28-
}]
29-
}
30-
31-
function rewrite (attr, name) {
32-
if (attr.name === name) {
33-
var value = attr.value
34-
var isStatic = value.charAt(0) === '"' && value.charAt(value.length - 1) === '"'
35-
if (!isStatic) {
36-
return
37-
}
38-
var firstChar = value.charAt(1)
39-
if (firstChar === '.' || firstChar === '~') {
40-
if (firstChar === '~') {
41-
value = '"' + value.slice(2)
42-
}
43-
attr.value = `require(${value})`
44-
}
45-
return true
46-
}
47-
}
9+
var defaultCompileModules = [transformRequire]
4810

4911
module.exports = function (html) {
5012
this.cacheable()
5113
var isServer = this.target === 'node'
5214
var isProduction = this.minimize || process.env.NODE_ENV === 'production'
5315
var options = loaderUtils.getOptions(this) || {}
54-
if (options.transformToRequire) {
55-
transformToRequire = Object.assign(
56-
{},
57-
defaultTransformToRequire,
58-
options.transformToRequire
59-
)
60-
}
6116

62-
var compiled = compiler.compile(html, Object.assign({
63-
preserveWhitespace: options.preserveWhitespace
64-
}, defaultCompileOptions))
17+
// set user transformToRequire options on module
18+
transformRequire._userOptions = options.transformToRequire
19+
20+
var compiled = compiler.compile(html, {
21+
preserveWhitespace: options.preserveWhitespace,
22+
modules: defaultCompileModules.concat(options.modules || [])
23+
})
6524

6625
// tips
6726
if (compiled.tips && compiled.tips.length) {

lib/template-transform-require.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// vue compiler module for using transforming `<tag>:<attribute>` to `require`
2+
var defaultOptions = {
3+
img: 'src',
4+
image: 'xlink:href'
5+
}
6+
7+
module.exports = {
8+
_userOptions: null,
9+
postTransformNode: el => {
10+
var userOptions = module.exports._userOptions
11+
var options = userOptions
12+
? Object.assign({}, defaultOptions, userOptions)
13+
: defaultOptions
14+
for (var tag in options) {
15+
if (el.tag === tag && el.attrs) {
16+
var attributes = options[tag]
17+
if (typeof attributes === 'string') {
18+
el.attrs.some(attr => rewrite(attr, attributes))
19+
} else if (Array.isArray(attributes)) {
20+
attributes.forEach(item => el.attrs.some(attr => rewrite(attr, item)))
21+
}
22+
}
23+
}
24+
}
25+
}
26+
27+
function rewrite (attr, name) {
28+
if (attr.name === name) {
29+
var value = attr.value
30+
var isStatic = value.charAt(0) === '"' && value.charAt(value.length - 1) === '"'
31+
if (!isStatic) {
32+
return
33+
}
34+
var firstChar = value.charAt(1)
35+
if (firstChar === '.' || firstChar === '~') {
36+
if (firstChar === '~') {
37+
value = '"' + value.slice(2)
38+
}
39+
attr.value = `require(${value})`
40+
}
41+
return true
42+
}
43+
}

0 commit comments

Comments
 (0)