vite-plugin-vue icon indicating copy to clipboard operation
vite-plugin-vue copied to clipboard

[@vitejs/plugin-vue-jsx] importing vue sfc with jsx does not work if custom queries added

Open dotoleeoak opened this issue 3 years ago • 4 comments

Describe the bug

In Nuxt 3, custom queries are added to id when importing files under pages directory, such as /pages/index.vue?vue&type=script&lang.jsx&macro=true (in this case, macro=true) In this case, vue jsx plugin does not acknowledge the context and throws an error.

More info: https://github.com/nuxt/nuxt.js/issues/13435 Probably related to PR vitejs/vite#7121

Reproduction

https://stackblitz.com/edit/vitejs-vite-uo2vwz

System Info

System:
  OS: Linux 5.16 Ubuntu 20.04.4 LTS (Focal Fossa)
  CPU: (16) x64 AMD EPYC 7B13
  Memory: 33.38 GB / 62.80 GB
  Container: Yes
  Shell: 5.0.17 - /bin/bash
Binaries:
  Node: 16.15.0 - ~/.nvm/versions/node/v16.15.0/bin/node
  Yarn: 3.2.1 - ~/.nvm/versions/node/v16.15.0/bin/yarn
  npm: 8.5.5 - ~/.nvm/versions/node/v16.15.0/bin/npm

Used Package Manager

yarn

Logs

ERROR  Failed to parse source for import analysis because the content contains invalid JS syntax. If you are using JSX, make sure to name the file with the .jsx or .tsx extension.


 WARN   [SSR] Error transforming /pagess/index.vue?vue&type=script&setup=true&lang.jsx&macro=true: Failed to parse source for import analysis because the content contains invalid JS syntax. If you are using JSX, make sure to name the file with the .jsx or .tsx extension.

   at formatError (node_modules/vite/dist/node/chunks/dep-59dc6e00.js:38663:46)
   at TransformContext.error (node_modules/vite/dist/node/chunks/dep-59dc6e00.js:38659:19)
   at TransformContext.transform (node_modules/vite/dist/node/chunks/dep-59dc6e00.js:56777:22)
   at async Object.transform (node_modules/vite/dist/node/chunks/dep-59dc6e00.js:38900:30)
   at async doTransform (node_modules/vite/dist/node/chunks/dep-59dc6e00.js:55857:29)

Validations

dotoleeoak avatar Jun 05 '22 10:06 dotoleeoak

IIUC extension needs to be at the end of id. So /pages/index.vue?vue&type=script&lang.jsx&macro=true needs to be /pages/index.vue?vue&type=script&macro=true&lang.jsx.

refs: https://github.com/vitejs/vite/pull/6912#issuecomment-1039355130

sapphi-red avatar Jun 07 '22 13:06 sapphi-red

We can likely work around this in Nuxt - but would you welcome a PR to change the behaviour in Vite so that it isn't dependent on query order?

danielroe avatar Jun 11 '22 08:06 danielroe

Probably no. Even if vue-jsx plugin accepted it, plugins which assume .jsx to be at the end (or at the end after removing query) will exist and they will not work. But I'm not certain about this.

sapphi-red avatar Jun 11 '22 12:06 sapphi-red

I'd second working around it in Nuxt at the meantime. There's a solution of using meta.vite.lang to specify the extension like:

https://github.com/vitejs/vite/blob/dc0022529610f159d5e635087307ac109746d830/packages/plugin-vue/src/main.ts#L229-L233

But this isn't commonly used yet, and it would break the ecosystem otherwise. I agree though that a behaviour like this isn't great at a glance, but I'd imagine a migration over to meta.vite.lang and then dropping checking extensions in Vite 4 would be the ideal path forward.

(I haven't considered other consequence of dropping the extensions check yet)

bluwy avatar Jun 13 '22 05:06 bluwy