src
imports transformation does not support Node.js subpath imports-style URLs
#9919
Labels
🔨 p3-minor-bug
Priority 3: this fixes a bug, but is an edge case that only affects very specific usage.
scope: sfc
Vue version
3.3.13
Link to minimal reproduction
https://stackblitz.com/edit/vitejs-vite-gqtzmr?file=src%2FApp.vue
Steps to reproduce
npm create vue@latest -- --router
@
in the project with#src
npm run dev
ornpm 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 animport
from the#src/assets/logo.svg
module, therefore can't be resolved.System Info
Any additional comments?
The Use Case
I want to change the default alias to
src/
increate-vue
to#src/
, replacing the current@/
.Because:
imports
field inpackage.json
) in all actively maintained versions (https://nodejs.org/docs/latest-v20.x/api/packages.html#subpath-imports)package.json
directly. Considering the Vue.js documentation claimssrc
imports follow the same path resolution rules as webpack module requests, it should be supported in Vue, too.imports
field automatically in 5.4 (Add auto-import for thepackage.json
imports
field microsoft/TypeScript#55015)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#
.core/packages/compiler-sfc/src/template/transformAssetUrl.ts
Line 110 in a8d0b1b
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 onlyuse[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.The text was updated successfully, but these errors were encountered: