diff --git a/packages/compiler-sfc/__tests__/__snapshots__/templateTransformAssetUrl.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/templateTransformAssetUrl.spec.ts.snap
index e1c962a6f..9e74a95ae 100644
--- a/packages/compiler-sfc/__tests__/__snapshots__/templateTransformAssetUrl.spec.ts.snap
+++ b/packages/compiler-sfc/__tests__/__snapshots__/templateTransformAssetUrl.spec.ts.snap
@@ -1,5 +1,37 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`compiler sfc: transform asset url should allow for full base URLs, with paths 1`] = `
+"import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \\"vue\\"
+
+export function render(_ctx, _cache) {
+ return (_openBlock(), _createBlock(\\"img\\", { src: \\"http://localhost:3000/src/logo.png\\" }))
+}"
+`;
+
+exports[`compiler sfc: transform asset url should allow for full base URLs, without paths 1`] = `
+"import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \\"vue\\"
+
+export function render(_ctx, _cache) {
+ return (_openBlock(), _createBlock(\\"img\\", { src: \\"http://localhost:3000/logo.png\\" }))
+}"
+`;
+
+exports[`compiler sfc: transform asset url should allow for full base URLs, without port 1`] = `
+"import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \\"vue\\"
+
+export function render(_ctx, _cache) {
+ return (_openBlock(), _createBlock(\\"img\\", { src: \\"http://localhost/logo.png\\" }))
+}"
+`;
+
+exports[`compiler sfc: transform asset url should allow for full base URLs, without protocol 1`] = `
+"import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \\"vue\\"
+
+export function render(_ctx, _cache) {
+ return (_openBlock(), _createBlock(\\"img\\", { src: \\"//localhost/logo.png\\" }))
+}"
+`;
+
exports[`compiler sfc: transform asset url support uri fragment 1`] = `
"import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \\"vue\\"
import _imports_0 from '@svg/file.svg'
diff --git a/packages/compiler-sfc/__tests__/templateTransformAssetUrl.spec.ts b/packages/compiler-sfc/__tests__/templateTransformAssetUrl.spec.ts
index 41eb6463c..9fdfa7719 100644
--- a/packages/compiler-sfc/__tests__/templateTransformAssetUrl.spec.ts
+++ b/packages/compiler-sfc/__tests__/templateTransformAssetUrl.spec.ts
@@ -94,4 +94,36 @@ describe('compiler sfc: transform asset url', () => {
// should not remove it
expect(code).toMatch(`"xlink:href": "#myCircle"`)
})
+
+ test('should allow for full base URLs, with paths', () => {
+ const { code } = compileWithAssetUrls(`
`, {
+ base: 'http://localhost:3000/src/'
+ })
+
+ expect(code).toMatchSnapshot()
+ })
+
+ test('should allow for full base URLs, without paths', () => {
+ const { code } = compileWithAssetUrls(`
`, {
+ base: 'http://localhost:3000'
+ })
+
+ expect(code).toMatchSnapshot()
+ })
+
+ test('should allow for full base URLs, without port', () => {
+ const { code } = compileWithAssetUrls(`
`, {
+ base: 'http://localhost'
+ })
+
+ expect(code).toMatchSnapshot()
+ })
+
+ test('should allow for full base URLs, without protocol', () => {
+ const { code } = compileWithAssetUrls(`
`, {
+ base: '//localhost'
+ })
+
+ expect(code).toMatchSnapshot()
+ })
})
diff --git a/packages/compiler-sfc/src/templateTransformAssetUrl.ts b/packages/compiler-sfc/src/templateTransformAssetUrl.ts
index 78211e6ab..7a92f6ea0 100644
--- a/packages/compiler-sfc/src/templateTransformAssetUrl.ts
+++ b/packages/compiler-sfc/src/templateTransformAssetUrl.ts
@@ -121,12 +121,17 @@ export const transformAssetUrl: NodeTransform = (
attr.value.content[0] !== '@' &&
isRelativeUrl(attr.value.content)
) {
+ // Allow for full hostnames provided in options.base
+ const base = parseUrl(options.base)
+ const protocol = base.protocol || ''
+ const host = base.host ? protocol + '//' + base.host : ''
+ const basePath = base.path || '/'
+
// 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 || '')
- )
+ attr.value.content =
+ host +
+ (path.posix || path).join(basePath, url.path + (url.hash || ''))
}
return
}
diff --git a/packages/compiler-sfc/src/templateUtils.ts b/packages/compiler-sfc/src/templateUtils.ts
index 6f93d612a..b1befd927 100644
--- a/packages/compiler-sfc/src/templateUtils.ts
+++ b/packages/compiler-sfc/src/templateUtils.ts
@@ -35,5 +35,5 @@ export function parseUrl(url: string): UrlWithStringQuery {
function parseUriParts(urlString: string): UrlWithStringQuery {
// A TypeError is thrown if urlString is not a string
// @see https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
- return uriParse(isString(urlString) ? urlString : '')
+ return uriParse(isString(urlString) ? urlString : '', false, true)
}