perf(compiler-sfc): improve asset url trasnform efficiency

This commit is contained in:
Evan You 2020-05-05 16:07:15 -04:00
parent 40166a8637
commit c5dcfe16f6

View File

@ -81,15 +81,22 @@ export const transformAssetUrl: NodeTransform = (
options: AssetURLOptions = defaultAssetUrlOptions options: AssetURLOptions = defaultAssetUrlOptions
) => { ) => {
if (node.type === NodeTypes.ELEMENT) { if (node.type === NodeTypes.ELEMENT) {
if (!node.props.length) {
return
}
const tags = options.tags || defaultAssetUrlOptions.tags const tags = options.tags || defaultAssetUrlOptions.tags
for (const tag in tags) { const attrs = tags[node.tag]
if ((tag === '*' || node.tag === tag) && node.props.length) { const wildCardAttrs = tags['*']
const attributes = tags[tag] if (!attrs && !wildCardAttrs) {
attributes.forEach(name => { return
}
const assetAttrs = (attrs || []).concat(wildCardAttrs || [])
node.props.forEach((attr, index) => { node.props.forEach((attr, index) => {
if ( if (
attr.type !== NodeTypes.ATTRIBUTE || attr.type !== NodeTypes.ATTRIBUTE ||
attr.name !== name || !assetAttrs.includes(attr.name) ||
!attr.value || !attr.value ||
(!options.includeAbsolute && !isRelativeUrl(attr.value.content)) (!options.includeAbsolute && !isRelativeUrl(attr.value.content))
) { ) {
@ -97,7 +104,6 @@ export const transformAssetUrl: NodeTransform = (
} }
const url = parseUrl(attr.value.content) const url = parseUrl(attr.value.content)
if (options.base) { if (options.base) {
// explicit base - directly rewrite the url into absolute url // explicit base - directly rewrite the url into absolute url
// does not apply to absolute urls or urls that start with `@` // does not apply to absolute urls or urls that start with `@`
@ -119,24 +125,16 @@ export const transformAssetUrl: NodeTransform = (
// otherwise, transform the url into an import. // otherwise, transform the url into an import.
// this assumes a bundler will resolve the import into the correct // this assumes a bundler will resolve the import into the correct
// absolute url (e.g. webpack file-loader) // absolute url (e.g. webpack file-loader)
const exp = getImportsExpressionExp( const exp = getImportsExpressionExp(url.path, url.hash, attr.loc, context)
url.path,
url.hash,
attr.loc,
context
)
node.props[index] = { node.props[index] = {
type: NodeTypes.DIRECTIVE, type: NodeTypes.DIRECTIVE,
name: 'bind', name: 'bind',
arg: createSimpleExpression(name, true, attr.loc), arg: createSimpleExpression(attr.name, true, attr.loc),
exp, exp,
modifiers: [], modifiers: [],
loc: attr.loc loc: attr.loc
} }
}) })
})
}
}
} }
} }