vuejs / core

🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
https://vuejs.org/
MIT License
46.87k stars 8.22k forks source link

`src` imports transformation does not support Node.js subpath imports-style URLs #9919

Open haoqunjiang opened 9 months ago

haoqunjiang commented 9 months ago

Vue version

3.3.13

Link to minimal reproduction

https://stackblitz.com/edit/vitejs-vite-gqtzmr?file=src%2FApp.vue

Steps to reproduce

What is expected?

The webpage correctly displays the Vue logo in both cases.

What is actually happening?

The <img> src URL stays unchanged as #src/assets/logo.svg, fails to be transformed into an import from the #src/assets/logo.svg module, therefore can't be resolved.

System Info

System:
    OS: macOS 14.2.1
    CPU: (10) arm64 Apple M1 Pro
    Memory: 275.08 MB / 32.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 18.18.2 - ~/Library/Caches/fnm_multishells/1919_1703087524164/bin/node
    Yarn: 1.22.19 - ~/Library/Caches/fnm_multishells/1919_1703087524164/bin/yarn
    npm: 10.2.0 - ~/Library/Caches/fnm_multishells/1919_1703087524164/bin/npm
    pnpm: 8.12.1 - ~/Library/Caches/fnm_multishells/1919_1703087524164/bin/pnpm
    bun: 1.0.3 - ~/.bun/bin/bun
  Browsers:
    Chrome: 120.0.6099.109
    Chrome Canary: 122.0.6206.0
    Safari: 17.2.1
  npmPackages:
    vue: ^3.3.11 => 3.3.13

Any additional comments?

The Use Case

I want to change the default alias to src/ in create-vue to #src/, replacing the current @/. Because:

Therefore, using #src could reduce a lot of duplicate configurations in the templates. The only missing part is Vue's asset URL rewriting.

The Cause

The transformAssetUrl function skips attribute values starting with #. https://github.com/vuejs/core/blob/a8d0b1b38b092ec2d10b32bedcee2eea33b77657/packages/compiler-sfc/src/template/transformAssetUrl.ts#L110

But now that #src is a valid import specifier in Node.js, I think we can't skip such strings blindly. Actually, of all the default transformAssetUrl.tags, I find that only use[href] could possibly point to a URL fragment. In all the other tag and attribute combinations, when assigned a #string-style value, it can only be an aliased import path.

yyx990803 commented 9 months ago

We also have https://github.com/vuejs/core/pull/9894 which expands the asset url scenarios - anything that might be affected there?

haoqunjiang commented 9 months ago

anything that might be affected there?

Only <iframe> src might be a URI fragment of the current page, therefore ambiguous.

Though, I don't think <iframe> should be included in the PR.