perf(compiler-sfc): improve asset url trasnform efficiency
This commit is contained in:
parent
40166a8637
commit
c5dcfe16f6
@ -81,62 +81,60 @@ export const transformAssetUrl: NodeTransform = (
|
|||||||
options: AssetURLOptions = defaultAssetUrlOptions
|
options: AssetURLOptions = defaultAssetUrlOptions
|
||||||
) => {
|
) => {
|
||||||
if (node.type === NodeTypes.ELEMENT) {
|
if (node.type === NodeTypes.ELEMENT) {
|
||||||
const tags = options.tags || defaultAssetUrlOptions.tags
|
if (!node.props.length) {
|
||||||
for (const tag in tags) {
|
return
|
||||||
if ((tag === '*' || node.tag === tag) && node.props.length) {
|
|
||||||
const attributes = tags[tag]
|
|
||||||
attributes.forEach(name => {
|
|
||||||
node.props.forEach((attr, index) => {
|
|
||||||
if (
|
|
||||||
attr.type !== NodeTypes.ATTRIBUTE ||
|
|
||||||
attr.name !== name ||
|
|
||||||
!attr.value ||
|
|
||||||
(!options.includeAbsolute && !isRelativeUrl(attr.value.content))
|
|
||||||
) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = parseUrl(attr.value.content)
|
|
||||||
|
|
||||||
if (options.base) {
|
|
||||||
// explicit base - directly rewrite the url into absolute url
|
|
||||||
// does not apply to absolute urls or urls that start with `@`
|
|
||||||
// since they are aliases
|
|
||||||
if (
|
|
||||||
attr.value.content[0] !== '@' &&
|
|
||||||
isRelativeUrl(attr.value.content)
|
|
||||||
) {
|
|
||||||
// when packaged in the browser, path will be using the posix-
|
|
||||||
// only version provided by rollup-plugin-node-builtins.
|
|
||||||
attr.value.content = (path.posix || path).join(
|
|
||||||
options.base,
|
|
||||||
url.path + (url.hash || '')
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise, transform the url into an import.
|
|
||||||
// this assumes a bundler will resolve the import into the correct
|
|
||||||
// absolute url (e.g. webpack file-loader)
|
|
||||||
const exp = getImportsExpressionExp(
|
|
||||||
url.path,
|
|
||||||
url.hash,
|
|
||||||
attr.loc,
|
|
||||||
context
|
|
||||||
)
|
|
||||||
node.props[index] = {
|
|
||||||
type: NodeTypes.DIRECTIVE,
|
|
||||||
name: 'bind',
|
|
||||||
arg: createSimpleExpression(name, true, attr.loc),
|
|
||||||
exp,
|
|
||||||
modifiers: [],
|
|
||||||
loc: attr.loc
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const tags = options.tags || defaultAssetUrlOptions.tags
|
||||||
|
const attrs = tags[node.tag]
|
||||||
|
const wildCardAttrs = tags['*']
|
||||||
|
if (!attrs && !wildCardAttrs) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const assetAttrs = (attrs || []).concat(wildCardAttrs || [])
|
||||||
|
node.props.forEach((attr, index) => {
|
||||||
|
if (
|
||||||
|
attr.type !== NodeTypes.ATTRIBUTE ||
|
||||||
|
!assetAttrs.includes(attr.name) ||
|
||||||
|
!attr.value ||
|
||||||
|
(!options.includeAbsolute && !isRelativeUrl(attr.value.content))
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = parseUrl(attr.value.content)
|
||||||
|
if (options.base) {
|
||||||
|
// explicit base - directly rewrite the url into absolute url
|
||||||
|
// does not apply to absolute urls or urls that start with `@`
|
||||||
|
// since they are aliases
|
||||||
|
if (
|
||||||
|
attr.value.content[0] !== '@' &&
|
||||||
|
isRelativeUrl(attr.value.content)
|
||||||
|
) {
|
||||||
|
// when packaged in the browser, path will be using the posix-
|
||||||
|
// only version provided by rollup-plugin-node-builtins.
|
||||||
|
attr.value.content = (path.posix || path).join(
|
||||||
|
options.base,
|
||||||
|
url.path + (url.hash || '')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise, transform the url into an import.
|
||||||
|
// this assumes a bundler will resolve the import into the correct
|
||||||
|
// absolute url (e.g. webpack file-loader)
|
||||||
|
const exp = getImportsExpressionExp(url.path, url.hash, attr.loc, context)
|
||||||
|
node.props[index] = {
|
||||||
|
type: NodeTypes.DIRECTIVE,
|
||||||
|
name: 'bind',
|
||||||
|
arg: createSimpleExpression(attr.name, true, attr.loc),
|
||||||
|
exp,
|
||||||
|
modifiers: [],
|
||||||
|
loc: attr.loc
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user