posva / unplugin-vue-router

Next Generation file based typed routing for Vue Router
https://uvr.esm.is
MIT License
1.7k stars 82 forks source link

definePage fails with rsbuild #531

Open gltjk opened 3 weeks ago

gltjk commented 3 weeks ago

Hi, I just moved one of my vite project to rsbuild and found meta information given by definePage disappeared.

Here is a demo project: https://github.com/gltjk/rsbuild-unplugin-vue-router

I used definePage in src/pages/index.vue:

<script setup>
definePage({
  meta: {
    title: 'Home',
  },
});
</script>

and in src/pages/about.vue

<script setup>
definePage({
  meta: {
    title: 'About',
  },
});
</script>

I also rendered the whole route object on the page. Here are the screenshots of those two pages, where it is clearly seen that the meta object is empty.

Home page screenshot About page screenshot

There is also an error shown in the terminal when the project starts. Here is it:

error   Compile error: 
Failed to compile, check the errors for troubleshooting.
File: /Users/username/project-path/rsbuild-vue/src/pages/about.vue?definePage&vue&lang.tsx:1:1
  × ModuleError: At least one <template> or <script> is required in a single file component. /Users/username/project-path/rsbuild-vue/src/pages/about.vue (from: /Users/username/project-path/rsbuild-vue/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0])
  │     at parse$1 (/Users/username/project-path/rsbuild-vue/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js:1864:7)
  │     at Object.loader (/Users/username/project-path/rsbuild-vue/node_modules/vue-loader/dist/index.js:64:36)
  │     at LOADER_EXECUTION (/Users/username/project-path/rsbuild-vue/node_modules/@rspack/core/dist/index.js:10363:18)
  │     at runSyncOrAsync2 (/Users/username/project-path/rsbuild-vue/node_modules/@rspack/core/dist/index.js:10364:6)
  │     at node:internal/util:433:21
  │     at new Promise (<anonymous>)
  │     at runSyncOrAsync2 (node:internal/util:419:12)
  │     at runLoaders (/Users/username/project-path/rsbuild-vue/node_modules/@rspack/core/dist/index.js:10833:54)

File: /Users/username/project-path/rsbuild-vue/src/pages/index.vue?definePage&vue&lang.tsx:1:1
  × ModuleError: At least one <template> or <script> is required in a single file component. /Users/username/project-path/rsbuild-vue/src/pages/index.vue (from: /Users/username/project-path/rsbuild-vue/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0])
  │     at parse$1 (/Users/username/project-path/rsbuild-vue/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js:1864:7)
  │     at Object.loader (/Users/username/project-path/rsbuild-vue/node_modules/vue-loader/dist/index.js:64:36)
  │     at LOADER_EXECUTION (/Users/username/project-path/rsbuild-vue/node_modules/@rspack/core/dist/index.js:10363:18)
  │     at runSyncOrAsync2 (/Users/username/project-path/rsbuild-vue/node_modules/@rspack/core/dist/index.js:10364:6)
  │     at node:internal/util:433:21
  │     at new Promise (<anonymous>)
  │     at runSyncOrAsync2 (node:internal/util:419:12)
  │     at runLoaders (/Users/username/project-path/rsbuild-vue/node_modules/@rspack/core/dist/index.js:10833:54)

It seems that the definePage part is rendered as a separate SFC rather than part of the original vue file.

Here is my rsbuild.config.mjs for reference:

import { defineConfig } from '@rsbuild/core';
import { pluginVue } from '@rsbuild/plugin-vue';
import { rspack as VueRouter } from 'unplugin-vue-router';

export default defineConfig({
  plugins: [pluginVue()],
  tools: {
    rspack: {
      plugins: [VueRouter()],
    },
  },
});

For other information please refer to the repository I posted above or feel free to discuss here.

I'm not sure why this happened and am hoping for assistance. Thanks!