Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
haoqunjiang opened this issue Dec 25, 2023 · 2 comments
Labels
🔨 p3-minor-bug Priority 3: this fixes a bug, but is an edge case that only affects very specific usage. scope: sfc

Comments

@haoqunjiang
Copy link
Member

Vue version

3.3.13

Link to minimal reproduction

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

Steps to reproduce

  • Create a new project with npm create vue@latest -- --router
  • Replace all the presence of @ in the project with #src
  • Run either npm run dev or npm run build && npm run preview

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 #.

attr.value.content[0] === '#' ||

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.

@haoqunjiang haoqunjiang added scope: sfc 🔨 p3-minor-bug Priority 3: this fixes a bug, but is an edge case that only affects very specific usage. labels Dec 25, 2023
@yyx990803
Copy link
Member

We also have #9894 which expands the asset url scenarios - anything that might be affected there?

@haoqunjiang
Copy link
Member Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🔨 p3-minor-bug Priority 3: this fixes a bug, but is an edge case that only affects very specific usage. scope: sfc
Projects
None yet
Development

No branches or pull requests

2 participants