diff --git a/admin-ui/src/store/modules/permission.js b/admin-ui/src/store/modules/permission.js index ad286fd..39e14ac 100644 --- a/admin-ui/src/store/modules/permission.js +++ b/admin-ui/src/store/modules/permission.js @@ -1,6 +1,7 @@ import { constantRoutes } from '@/router' import { getRoutes } from '@/api/admin/sys-role' import Layout from '@/layout' +import { getViewContextKey, normalizeViewPath } from './route-view' // import sysuserindex from '@/views/sysuser/index' /** @@ -61,7 +62,8 @@ export function generaMenu(routes, data) { const viewsContext = require.context('@/views', true, /\.vue$/) export const loadView = (view) => { // 路由懒加载 - const key = `.${view}.vue` + const normalizedView = normalizeViewPath(view) + const key = getViewContextKey(normalizedView) if (viewsContext.keys().includes(key)) { // require.context 返回的是 { default: Component, __esModule: true }, // Vue Router 4 需要直接拿到组件对象(.default),否则渲染空白 @@ -69,7 +71,7 @@ export const loadView = (view) => { // 路由懒加载 return mod.default || mod } // 兜底:动态 import(生产构建不受 dynamic-import-node 影响) - return () => import(`@/views${view}.vue`) + return () => import(`@/views/${normalizedView}.vue`) } /** diff --git a/admin-ui/src/store/modules/route-view.js b/admin-ui/src/store/modules/route-view.js new file mode 100644 index 0000000..c928dd3 --- /dev/null +++ b/admin-ui/src/store/modules/route-view.js @@ -0,0 +1,7 @@ +export function normalizeViewPath(view) { + return String(view || '').replace(/^\/+/, '') +} + +export function getViewContextKey(view) { + return `./${normalizeViewPath(view)}.vue` +} diff --git a/admin-ui/tests/unit/store/route-view.spec.js b/admin-ui/tests/unit/store/route-view.spec.js new file mode 100644 index 0000000..db58029 --- /dev/null +++ b/admin-ui/tests/unit/store/route-view.spec.js @@ -0,0 +1,18 @@ +import { getViewContextKey, normalizeViewPath } from '@/store/modules/route-view' + +describe('dynamic route view paths', () => { + it.each([ + ['chorus/providers/index', 'chorus/providers/index'], + ['/chorus/providers/index', 'chorus/providers/index'], + ['///chorus/providers/index', 'chorus/providers/index'] + ])('normalizes %s', (view, expected) => { + expect(normalizeViewPath(view)).toBe(expected) + }) + + it.each([ + ['chorus/providers/index', './chorus/providers/index.vue'], + ['/chorus/providers/index', './chorus/providers/index.vue'] + ])('builds the webpack context key for %s', (view, expected) => { + expect(getViewContextKey(view)).toBe(expected) + }) +})