Skip to content

Commit a316dfe

Browse files
committed
optimize asset merging
1 parent c0d22e8 commit a316dfe

File tree

15 files changed

+78
-84
lines changed

15 files changed

+78
-84
lines changed

component.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@
6969
"src/util/env.js",
7070
"src/util/index.js",
7171
"src/util/lang.js",
72-
"src/util/merge-option.js",
7372
"src/util/misc.js",
73+
"src/util/options.js",
7474
"src/vue.js",
7575
"src/watcher.js"
7676
]

src/api/global.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var _ = require('../util')
2-
var mergeOptions = require('../util/merge-option')
2+
var config = require('../config')
33

44
/**
55
* Expose useful internals
@@ -48,7 +48,7 @@ exports.extend = function (extendOptions) {
4848
Sub.prototype = Object.create(Super.prototype)
4949
Sub.prototype.constructor = Sub
5050
Sub.cid = cid++
51-
Sub.options = mergeOptions(
51+
Sub.options = _.mergeOptions(
5252
Super.options,
5353
extendOptions
5454
)
@@ -101,13 +101,6 @@ exports.use = function (plugin) {
101101
* @param {Function} Constructor
102102
*/
103103

104-
var assetTypes = [
105-
'directive',
106-
'elementDirective',
107-
'filter',
108-
'transition'
109-
]
110-
111104
function createAssetRegisters (Constructor) {
112105

113106
/* Asset registration methods share the same signature:
@@ -116,7 +109,7 @@ function createAssetRegisters (Constructor) {
116109
* @param {*} definition
117110
*/
118111

119-
assetTypes.forEach(function (type) {
112+
config._assetTypes.forEach(function (type) {
120113
Constructor[type] = function (id, definition) {
121114
if (!definition) {
122115
return this.options[type + 's'][id]

src/compiler/compile.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var config = require('../config')
33
var textParser = require('../parsers/text')
44
var dirParser = require('../parsers/directive')
55
var templateParser = require('../parsers/template')
6+
var resolveAsset = _.resolveAsset
67

78
// internal directives
89
var propDef = require('../directives/prop')
@@ -278,7 +279,7 @@ function processTextToken (token, options) {
278279
}
279280
function setTokenType (type) {
280281
token.type = type
281-
token.def = options.directives[type]
282+
token.def = resolveAsset(options, 'directives', type)
282283
token.descriptor = dirParser.parse(token.value)[0]
283284
}
284285
return el
@@ -469,7 +470,7 @@ function makePropsLinkFn (props) {
469470

470471
function checkElementDirectives (el, options) {
471472
var tag = el.tagName.toLowerCase()
472-
var def = options.elementDirectives[tag]
473+
var def = resolveAsset(options, 'elementDirectives', tag)
473474
if (def) {
474475
return makeTerminalNodeLinkFn(el, tag, '', options, def)
475476
}
@@ -539,6 +540,8 @@ skip.terminal = true
539540

540541
function makeTerminalNodeLinkFn (el, dirName, value, options, def) {
541542
var descriptor = dirParser.parse(value)[0]
543+
// no need to call resolveAsset since terminal directives
544+
// are always internal
542545
def = def || options.directives[dirName]
543546
var fn = function terminalNodeLinkFn (vm, el, host) {
544547
vm._bindDir(dirName, el, descriptor, def, host)
@@ -571,7 +574,7 @@ function compileDirectives (elOrAttrs, options) {
571574
if (value === null) continue
572575
if (name.indexOf(config.prefix) === 0) {
573576
dirName = name.slice(config.prefix.length)
574-
dirDef = options.directives[dirName]
577+
dirDef = resolveAsset(options, 'directives', dirName)
575578
_.assertAsset(dirDef, 'directive', dirName)
576579
if (dirDef) {
577580
dirs.push({

src/config.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,20 @@ module.exports = {
6262
* @type {Boolean}
6363
*/
6464

65-
_delimitersChanged: true
65+
_delimitersChanged: true,
66+
67+
/**
68+
* List of asset types that a component can own.
69+
*
70+
* @type {Array}
71+
*/
72+
73+
_assetTypes: [
74+
'directive',
75+
'elementDirective',
76+
'filter',
77+
'transition'
78+
]
6679

6780
}
6881

src/directives/repeat.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ var expParser = require('../parsers/expression')
66
var templateParser = require('../parsers/template')
77
var compile = require('../compiler/compile')
88
var transclude = require('../compiler/transclude')
9-
var mergeOptions = require('../util/merge-option')
109
var uid = 0
1110

1211
// async component resolution states
@@ -133,7 +132,7 @@ module.exports = {
133132
return
134133
}
135134
this.Ctor = Ctor
136-
var merged = mergeOptions(Ctor.options, {}, {
135+
var merged = _.mergeOptions(Ctor.options, {}, {
137136
$parent: this.vm
138137
})
139138
merged.template = this.inlineTempalte || merged.template
@@ -175,7 +174,7 @@ module.exports = {
175174
_.define(context, key, meta[key])
176175
}
177176
var id = this.ctorGetter.call(context, context)
178-
var Ctor = this.vm.$options.components[id]
177+
var Ctor = _.resolveAsset(this.vm.$options, 'components', id)
179178
_.assertAsset(Ctor, 'component', id)
180179
if (!Ctor.options) {
181180
_.warn(

src/directives/transition.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ module.exports = {
1919
// so the transition module knows this is a
2020
// javascript transition without having to check
2121
// computed CSS.
22-
fns: vm.$options.transitions[id]
22+
fns: _.resolveAsset(vm.$options, 'transitions', id)
2323
}
2424
if (oldId) {
2525
_.removeClass(this.el, oldId + '-transition')

src/instance/init.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var mergeOptions = require('../util/merge-option')
1+
var mergeOptions = require('../util').mergeOptions
22

33
/**
44
* The main init sequence. This is called for every

src/instance/misc.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ var _ = require('../util')
1111
*/
1212

1313
exports._applyFilter = function (id, args) {
14-
var registry = this.$options.filters
15-
var filter = registry[id]
14+
var filter = _.resolveAsset(this.$options, 'filters', id)
1615
_.assertAsset(filter, 'filter', id)
1716
return (filter.read || filter).apply(this, args)
1817
}
@@ -29,8 +28,7 @@ exports._applyFilter = function (id, args) {
2928
*/
3029

3130
exports._resolveComponent = function (id, cb) {
32-
var registry = this.$options.components
33-
var factory = registry[id]
31+
var factory = _.resolveAsset(this.$options, 'components', id)
3432
_.assertAsset(factory, 'component', id)
3533
// async component factory
3634
if (!factory.options) {

src/util/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ extend(exports, lang)
55
extend(exports, require('./env'))
66
extend(exports, require('./dom'))
77
extend(exports, require('./misc'))
8-
extend(exports, require('./debug'))
8+
extend(exports, require('./debug'))
9+
extend(exports, require('./options'))

src/util/misc.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
var _ = require('./debug')
1+
var _ = require('./index')
22
var config = require('../config')
3+
var commonTagRE = /^(div|p|span|img|a|br|ul|ol|li|h1|h2|h3|h4|h5|table|tbody|tr|td|pre)$/
34

45
/**
56
* Check if an element is a component, if yes return its
@@ -17,7 +18,10 @@ exports.checkComponent = function (el, options) {
1718
var exp = el.getAttribute('is')
1819
el.removeAttribute('is')
1920
return exp
20-
} else if (options.components[tag]) {
21+
} else if (
22+
!commonTagRE.test(tag) &&
23+
_.resolveAsset(options, 'components', tag)
24+
) {
2125
return tag
2226
}
2327
}
@@ -66,7 +70,7 @@ exports.resolveFilters = function (vm, filters, target) {
6670
var res = target || {}
6771
// var registry = vm.$options.filters
6872
filters.forEach(function (f) {
69-
var def = vm.$options.filters[f.name]
73+
var def = _.resolveAsset(vm.$options, 'filters', f.name)
7074
_.assertAsset(def, 'filter', f.name)
7175
if (!def) return
7276
var args = f.args

0 commit comments

Comments
 (0)