diff --git a/docs/guide/route.md b/docs/guide/route.md index 2f4b3bd4..7307754a 100644 --- a/docs/guide/route.md +++ b/docs/guide/route.md @@ -5,122 +5,153 @@ ## 路由配置 在配置文件 `.fes.js`中通过 `router` 进行配置。 + ```js export default { router: { routes: [], - mode: 'hash' - } -} + mode: 'hash', + }, +}; ``` ### routes + `routes` 是配置添加到路由的初始路由列表,格式为路由信息的数组。具体使用参考 [Vue Router 文档](https://next.router.vuejs.org/zh/guide/) 中关于路由配置、路由匹配相关内容。 +### mode -### mode 创建历史记录的类型: -- **history**,对应 [createWebHistory](https://next.router.vuejs.org/zh/api/#createwebhistory) -- **hash**,对应 [createWebHashHistory](https://next.router.vuejs.org/zh/api/#createWebHashHistory) -- **memory**,对应 [createMemoryHistory](https://next.router.vuejs.org/zh/api/#createWebHashHistory) + +- **history**,对应 [createWebHistory](https://next.router.vuejs.org/zh/api/#createwebhistory) +- **hash**,对应 [createWebHashHistory](https://next.router.vuejs.org/zh/api/#createWebHashHistory) +- **memory**,对应 [createMemoryHistory](https://next.router.vuejs.org/zh/api/#createWebHashHistory) 默认是`hash`模式。 ## 约定式路由 -约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。 + +约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。 ### 约定规范 + 比如以下文件结构: + ``` pages ├── index.vue # 根路由页面 路径为 / -├── *.vue # 模糊匹配 路径为 * +├── [...slug].vue # 模糊匹配 路径为 /:slug(.*) ├── a.vue # 路径 /a ├── b # 文件夹b │ ├── index.vue # 路径 /b -│ ├── @id.vue # 动态路由 /b/:id +│ ├── [slug].vue # 动态路由 /b/:slug │ ├── c.vue # 路径 /b/c │ └── layout.vue # /b 路径下所有页面公共的布局组件 └── layout.vue # 根路由下所有页面共用的布局组件 ``` + 编译后会得到以下路由配置: + ```js [ { - "path": "/", - "component": require('@/pages/layout').default, - "count": 5, - "children": [ + path: '/', + component: require('@/pages/layout').default, + count: 5, + children: [ { - "path": "/a", - "component": require('@/pages/a').default, - "name": "a", - "meta": {}, - "count": 7 + path: '/a', + component: require('@/pages/a').default, + name: 'a', + meta: {}, + count: 7, }, { - "path": "/b", - "component": require('@/pages/b/layout').default, - "count": 7, - "children": [ + path: '/b', + component: require('@/pages/b/layout').default, + count: 7, + children: [ { - "path": "/b/c", - "component": require('@/pages/b/c').default, - "name": "b_c", - "meta": {}, - "count": 14 + path: '/b/c', + component: require('@/pages/b/c').default, + name: 'b_c', + meta: {}, + count: 14, }, { - "path": "/b/:id", - "component": require('@/pages/b/@id').default, - "name": "b__id", - "meta": {}, - "count": 13 + path: '/b/:id', + component: require('@/pages/b/@id').default, + name: 'b__id', + meta: {}, + count: 13, }, { - "path": "/b", - "component": require('@/pages/b/index').default, - "name": "b_index", - "meta": {}, - "count": 7 - } - ] + path: '/b', + component: require('@/pages/b/index').default, + name: 'b_index', + meta: {}, + count: 7, + }, + ], }, { - "path": "/", - "component": require('@/pages/index').default, - "name": "index", - "meta": {}, - "count": 5 + path: '/', + component: require('@/pages/index').default, + name: 'index', + meta: {}, + count: 5, }, { - "path": "/:pathMatch(.*)", - "component": require('@/pages/*').default, - "name": "FUZZYMATCH", - "meta": {}, - "count": 3 - } - ] - } -] + path: '/:pathMatch(.*)', + component: require('@/pages/*').default, + name: 'FUZZYMATCH', + meta: {}, + count: 3, + }, + ], + }, +]; ``` **需要注意的是,满足以下任意规则的文件不会被注册为路由**: -- 不是 `.vue .jsx` 文件 -- `components` 目录中的文件 +- 不是 `.vue .jsx` 文件 +- `components` 目录中的文件 ### 动态路由 -Fes.js 里约定以 `@` 开头的文件或文件夹映射为动态路由。 + +Fes.js 里约定名称为 `[slug]`格式的文件或文件夹映射为动态路由。 比如: -- `src/pages/users/@id.vue` 会成为 `/users/:id` -- `src/pages/users/@id/settings.vue` 会成为 `/users/:id/settings` +- `src/pages/users/[id].vue` 会成为 `/users/:id` +- `src/pages/users/[id]/settings.vue` 会成为 `/users/:id/settings` + + +:::warning +`@slug`形式下版本会弃用,请替换为`[slug]`~ +::: + +### 模糊匹配 + +Fes.js 里约定名称为 `[...slug]`格式的文件或文件夹映射为动态路由中的模糊匹配形式。 +比如: + +- `src/pages/users/[...].vue` 会成为 `/users/:pathMatch(.*)` +- `src/pages/users/[...id].vue` 会成为 `/users/:id(.*)` +- `src/pages/users/[...id]/settings.vue` 会成为 `/users/:id(.*)/settings` + + +:::warning +`*`形式下版本会弃用,请替换为`[...slug]`~ +::: + ### 嵌套路由 + Fes.js 里约定目录下有 `layout.vue` 时会生成嵌套路由,以 `layout.vue` 为该目录的公共父组件,`layout.vue` 中必须实现 `RouterView` 比如以下目录结构: + ``` pages └── users @@ -128,21 +159,25 @@ pages ├── index.vue └── list.vue ``` + 会生成路由: + ```js [ - { - path: '/users', component: require('@/pages/users/layout').default, + { + path: '/users', + component: require('@/pages/users/layout').default, children: [ { path: '/users', component: require('@/pages/users/index').default }, { path: '/users/list', component: require('@/pages/users/list').default }, - ] - } -] + ], + }, +]; ``` ### 模糊匹配 -Fes.js 下约定文件名为 `*` 的路由是模糊匹配路由,可以用此特性实现 [404 路由](https://next.router.vuejs.org/zh/guide/essentials/dynamic-matching.html#%E6%8D%95%E8%8E%B7%E6%89%80%E6%9C%89%E8%B7%AF%E7%94%B1%E6%88%96-404-not-found-%E8%B7%AF%E7%94%B1)。 + +Fes.js 下约定文件名为 `*` 的路由是模糊匹配路由,可以用此特性实现 [404 路由](https://next.router.vuejs.org/zh/guide/essentials/dynamic-matching.html#%E6%8D%95%E8%8E%B7%E6%89%80%E6%9C%89%E8%B7%AF%E7%94%B1%E6%88%96-404-not-found-%E8%B7%AF%E7%94%B1)。 比如以下目录结构: @@ -151,26 +186,35 @@ pages ├── index.vue # 根路由页面 路径为 / └── *.vue # 模糊匹配 路径为 * ``` + 会生成路由: + ```js [ - { - path: '/', component: require('@/pages/index').default, count: 5 + { + path: '/', + component: require('@/pages/index').default, + count: 5, }, { - path: '/:pathMatch(.*)', component: require('@/pages/**').default, count: 3 - } -] + path: '/:pathMatch(.*)', + component: require('@/pages/**').default, + count: 3, + }, +]; ``` + 这样,如果访问 `/foo`,`/` 不能匹配,会 fallback 到 `*` 路由,通过 `src/pages/*.vue` 进行渲染。 ### 智能路由 + 可以看到,编译后路由都会有 `count` 属性,这是我们根据精准匹配优先算法原则设计出路由排名算法,对匹配到的路由打分: -- 路由的路径每个子项得到4分 -- 子项为静态细分(`/list`)再加3分 -- 子项为动态细分(`/:orderId`)再加2分 -- 根段(`/`)再1分 -- 通配符(`*`)匹配到的减去1分 + +- 路由的路径每个子项得到 4 分 +- 子项为静态细分(`/list`)再加 3 分 +- 子项为动态细分(`/:orderId`)再加 2 分 +- 根段(`/`)再 1 分 +- 通配符(`*`)匹配到的减去 1 分 当我们跳转路由时,如果 URL 匹配到多个路由,则选择分数最高的路由。 @@ -180,32 +224,31 @@ pages ```js const router = new VueRouter({ - routes: [ - { - path: '/foo', - component: Foo, - children: [ + routes: [ { - path: 'bar', - component: Bar, - // a meta field - meta: { requiresAuth: true } - } - ] - } - ] -}) + path: '/foo', + component: Foo, + children: [ + { + path: 'bar', + component: Bar, + // a meta field + meta: { requiresAuth: true }, + }, + ], + }, + ], +}); ``` - 我们使用`defineRouteMeta` 配置 `meta`: ```js import { defineRouteMeta } from '@fesjs/fes'; defineRouteMeta({ - name: "store", - title: "vuex测试" -}) + name: 'store', + title: 'vuex测试', +}); ``` 当然在单文件组件中,还可以通过`<config></config>`配置 `meta`: @@ -223,14 +266,13 @@ defineRouteMeta({ 推荐使用`defineRouteMete`,有更好的提示。 ::: - - 路由元信息在编译后会附加到路由配置中: + ```js{5-8} [ - { - path: '/a', - component: require('@/pages/a').default, + { + path: '/a', + component: require('@/pages/a').default, meta: { "name": "store", "title": "vuex测试" @@ -240,9 +282,11 @@ defineRouteMeta({ ``` ## 路由跳转 + 想学习更多,可以查看 [Vue Router 官方文档](https://next.router.vuejs.org/zh/guide/essentials/navigation.html#%E6%9B%BF%E6%8D%A2%E5%BD%93%E5%89%8D%E4%BD%8D%E7%BD%AE)。 ### 声明式 + ```vue <template> <router-link to="/home">Home</router-link> @@ -250,24 +294,25 @@ defineRouteMeta({ ``` ### 命令式 + 页面跳转 API 由 `router` 实例提供,查看 [Vue Rouer 文档](https://next.router.vuejs.org/zh/api/#router-%E6%96%B9%E6%B3%95)了解更多。 ```js import { useRouter } from '@fesjs/fes'; export default { - setup(){ + setup() { const router = useRouter(); // 这三种形式是等价的 - router.push('/users/posva#bio') - router.push({ path: '/users/posva', hash: '#bio' }) - router.push({ name: 'users', params: { username: 'posva' }, hash: '#bio' }) + router.push('/users/posva#bio'); + router.push({ path: '/users/posva', hash: '#bio' }); + router.push({ name: 'users', params: { username: 'posva' }, hash: '#bio' }); // 只改变 hash - router.push({ hash: '#bio' }) + router.push({ hash: '#bio' }); // 只改变 query - router.push({ query: { page: '2' } }) + router.push({ query: { page: '2' } }); // 只改变 param - router.push({ params: { username: 'jolyne' } }) + router.push({ params: { username: 'jolyne' } }); // 跳转到上一个路由 router.goBack(); @@ -277,7 +322,6 @@ export default { // 替换历史堆栈中的记录 router.replace('/new'); - } -} - -``` \ No newline at end of file + }, +}; +``` diff --git a/packages/fes-preset-built-in/src/index.js b/packages/fes-preset-built-in/src/index.js index 15bc035a..add31ded 100644 --- a/packages/fes-preset-built-in/src/index.js +++ b/packages/fes-preset-built-in/src/index.js @@ -6,11 +6,11 @@ export default function () { require.resolve('./plugins/registerType'), // generate files - require.resolve('./plugins/generateFiles/core/plugin'), - require.resolve('./plugins/generateFiles/core/exports/coreExports'), - require.resolve('./plugins/generateFiles/core/exports/pluginExports'), - require.resolve('./plugins/generateFiles/fes'), - require.resolve('./plugins/generateFiles/genType'), + require.resolve('./plugins/core/plugin'), + require.resolve('./plugins/core/exports/coreExports'), + require.resolve('./plugins/core/exports/pluginExports'), + require.resolve('./plugins/core/entry'), + require.resolve('./plugins/core/route'), // bundle configs require.resolve('./plugins/features/alias'), @@ -31,9 +31,6 @@ export default function () { require.resolve('./plugins/features/terserOptions'), require.resolve('./plugins/features/title'), - // route - require.resolve('./plugins/route'), - // commands require.resolve('./plugins/commands/help'), require.resolve('./plugins/commands/info'), diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/fes/defaultContainer.tpl b/packages/fes-preset-built-in/src/plugins/core/entry/defaultContainer.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/generateFiles/fes/defaultContainer.tpl rename to packages/fes-preset-built-in/src/plugins/core/entry/defaultContainer.tpl diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/fes/fes.tpl b/packages/fes-preset-built-in/src/plugins/core/entry/fes.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/generateFiles/fes/fes.tpl rename to packages/fes-preset-built-in/src/plugins/core/entry/fes.tpl diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/fes/index.js b/packages/fes-preset-built-in/src/plugins/core/entry/index.js similarity index 100% rename from packages/fes-preset-built-in/src/plugins/generateFiles/fes/index.js rename to packages/fes-preset-built-in/src/plugins/core/entry/index.js diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/fes/initialState.tpl b/packages/fes-preset-built-in/src/plugins/core/entry/initialState.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/generateFiles/fes/initialState.tpl rename to packages/fes-preset-built-in/src/plugins/core/entry/initialState.tpl diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/coreExports.js b/packages/fes-preset-built-in/src/plugins/core/exports/coreExports.js similarity index 88% rename from packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/coreExports.js rename to packages/fes-preset-built-in/src/plugins/core/exports/coreExports.js index 60ea2516..fb93df0c 100644 --- a/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/coreExports.js +++ b/packages/fes-preset-built-in/src/plugins/core/exports/coreExports.js @@ -1,7 +1,7 @@ import { readFileSync } from 'fs'; import { join } from 'path'; -import generateExports from '../../../../utils/generateExports'; -import { runtimePath } from '../../../../utils/constants'; +import generateExports from '../../../utils/generateExports'; +import { runtimePath } from '../../../utils/constants'; export default function (api) { api.onGenerateFiles(async () => { diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/coreExports.tpl b/packages/fes-preset-built-in/src/plugins/core/exports/coreExports.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/coreExports.tpl rename to packages/fes-preset-built-in/src/plugins/core/exports/coreExports.tpl diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/doc.md b/packages/fes-preset-built-in/src/plugins/core/exports/doc.md similarity index 100% rename from packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/doc.md rename to packages/fes-preset-built-in/src/plugins/core/exports/doc.md diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/pluginExports.js b/packages/fes-preset-built-in/src/plugins/core/exports/pluginExports.js similarity index 58% rename from packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/pluginExports.js rename to packages/fes-preset-built-in/src/plugins/core/exports/pluginExports.js index f481a9b8..cabc3107 100644 --- a/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/pluginExports.js +++ b/packages/fes-preset-built-in/src/plugins/core/exports/pluginExports.js @@ -1,11 +1,11 @@ -import generateExports from '../../../../utils/generateExports'; +import generateExports from '../../../utils/generateExports'; export default function (api) { api.onGenerateFiles(async () => { const fesExports = await api.applyPlugins({ key: 'addPluginExports', type: api.ApplyPluginsType.add, - initialValue: [] + initialValue: [], }); const fesExportsHook = {}; // repeated definition @@ -13,11 +13,13 @@ export default function (api) { api.writeTmpFile({ path: absoluteFilePath, content: `${fesExports - .map(item => generateExports(absoluteFilePath, { - item, - fesExportsHook - })) - .join('\n')}\n` + .map((item) => + generateExports(absoluteFilePath, { + item, + fesExportsHook, + }), + ) + .join('\n')}\n`, }); }); } diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/index.js b/packages/fes-preset-built-in/src/plugins/core/plugin/index.js similarity index 97% rename from packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/index.js rename to packages/fes-preset-built-in/src/plugins/core/plugin/index.js index a09a45f2..03fd66a1 100644 --- a/packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/index.js +++ b/packages/fes-preset-built-in/src/plugins/core/plugin/index.js @@ -1,7 +1,7 @@ import { readFileSync } from 'fs'; import { join } from 'path'; import { winPath } from '@fesjs/utils'; -import { runtimePath } from '../../../../utils/constants'; +import { runtimePath } from '../../../utils/constants'; export default function (api) { const { diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/plugin.tpl b/packages/fes-preset-built-in/src/plugins/core/plugin/plugin.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/plugin.tpl rename to packages/fes-preset-built-in/src/plugins/core/plugin/plugin.tpl diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/pluginRegister.tpl b/packages/fes-preset-built-in/src/plugins/core/plugin/pluginRegister.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/pluginRegister.tpl rename to packages/fes-preset-built-in/src/plugins/core/plugin/pluginRegister.tpl diff --git a/packages/fes-preset-built-in/src/plugins/route/index.js b/packages/fes-preset-built-in/src/plugins/core/route/index.js similarity index 92% rename from packages/fes-preset-built-in/src/plugins/route/index.js rename to packages/fes-preset-built-in/src/plugins/core/route/index.js index d6368bc8..8cfc6433 100644 --- a/packages/fes-preset-built-in/src/plugins/route/index.js +++ b/packages/fes-preset-built-in/src/plugins/core/route/index.js @@ -2,15 +2,15 @@ import { readdirSync, statSync, readFileSync } from 'fs'; import { join, extname, basename } from 'path'; import { lodash, parser, generator, logger, winPath } from '@fesjs/utils'; import { parse } from '@vue/compiler-sfc'; -import { runtimePath } from '../../utils/constants'; +import { runtimePath } from '../../../utils/constants'; // pages // ├── index.vue # 根路由页面 路径 / -// ├── *.vue # 模糊匹配 路径 * +// ├── [...slug].vue # 模糊匹配 路径 /:slug(.*) // ├── a.vue # 路径 /a // ├── b // │ ├── index.vue # 路径 /b -// │ ├── @id.vue # 动态路由 /b/:id +// │ ├── [slug].vue # 动态路由 /b/:slug // │ └── c.vue # 路径 /b/c // └── layout.vue # 根路由下所有page共用的外层 @@ -38,7 +38,14 @@ const checkHasLayout = function (path) { const getRouteName = function (parentRoutePath, fileName) { const routeName = winPath(join(parentRoutePath, fileName)); - return routeName.slice(1).replace(/\//g, '_').replace(/@/g, '_').replace(/:/g, '_').replace(/\*/g, 'FUZZYMATCH'); + return routeName + .slice(1) + .replace(/\//g, '_') + .replace(/@/g, '_') + .replace(/:/g, '_') + .replace(/\*/g, 'FUZZYMATCH') + .replace(/\[([a-zA-Z]+)\]/, '_$1') + .replace(/\[...([a-zA-Z]*)\]/, 'FUZZYMATCH-$1'); }; const getRoutePath = function (parentRoutePath, fileName, isFile = true) { @@ -48,12 +55,22 @@ const getRoutePath = function (parentRoutePath, fileName, isFile = true) { } // /@id.vue -> /:id if (fileName.startsWith('@')) { + logger.warn(`[WARNING]: ${fileName} is deprecated, please use [slug]`); fileName = fileName.replace(/@/, ':'); } // /*.vue -> :pathMatch(.*) if (fileName.includes('*')) { + logger.warn(`[WARNING]: ${fileName} is deprecated, please use [...slug]`); fileName = fileName.replace('*', ':pathMatch(.*)'); } + // /[slug].vue -> /:slug + if (/\[[a-zA-Z]+\]/.test(fileName)) { + fileName = fileName.replace(/\[([a-zA-Z]+)\]/g, ':$1'); + } + // /[...slug].vue -> /:slug(.*) + if (/\[...[a-zA-Z]*\]/.test(fileName)) { + fileName = fileName.replace(/\[...([a-zA-Z]*)\]/, ':$1(.*)').replace(':(.*)', ':pathMatch(.*)'); + } return winPath(join(parentRoutePath, fileName)); }; @@ -75,7 +92,7 @@ function getRouteMeta(content) { const fn = eval(`() => (${argument.code})`); return fn(); } - } catch (err) { } + } catch (err) {} return null; } @@ -186,9 +203,9 @@ const rank = function (routes) { let count = 0; arr.forEach((sonPath) => { count += 4; - if (sonPath.indexOf(':') !== -1 && sonPath.indexOf(':pathMatch(.*)') === -1) { + if (sonPath.indexOf(':') !== -1 && sonPath.indexOf('(.*)') === -1) { count += 2; - } else if (sonPath.indexOf(':pathMatch(.*)') !== -1) { + } else if (sonPath.indexOf('(.*)') !== -1) { count -= 1; } else if (sonPath === '') { count += 1; diff --git a/packages/fes-preset-built-in/src/plugins/route/template/routeExports.tpl b/packages/fes-preset-built-in/src/plugins/core/route/template/routeExports.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/route/template/routeExports.tpl rename to packages/fes-preset-built-in/src/plugins/core/route/template/routeExports.tpl diff --git a/packages/fes-preset-built-in/src/plugins/route/template/routes.tpl b/packages/fes-preset-built-in/src/plugins/core/route/template/routes.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/route/template/routes.tpl rename to packages/fes-preset-built-in/src/plugins/core/route/template/routes.tpl diff --git a/packages/fes-preset-built-in/src/plugins/route/template/runtime.tpl b/packages/fes-preset-built-in/src/plugins/core/route/template/runtime.tpl similarity index 100% rename from packages/fes-preset-built-in/src/plugins/route/template/runtime.tpl rename to packages/fes-preset-built-in/src/plugins/core/route/template/runtime.tpl diff --git a/packages/fes-preset-built-in/src/plugins/generateFiles/genType.js b/packages/fes-preset-built-in/src/plugins/generateFiles/genType.js deleted file mode 100644 index b6076c06..00000000 --- a/packages/fes-preset-built-in/src/plugins/generateFiles/genType.js +++ /dev/null @@ -1,33 +0,0 @@ -function importsToStr(imports) { - return imports.map((imp) => { - const { source } = imp; - return `export * from '${source}';`; - }); -} - -function genTypeContent(imports) { - return { - imports: importsToStr(imports).join('\n'), - }; -} - -export default function (api) { - const { - utils: { Mustache }, - } = api; - - api.onGenerateFiles(async () => { - const typeTpl = ` -{{{ imports }}} -`; - const importSources = await api.applyPlugins({ - key: 'addConfigType', - type: api.ApplyPluginsType.add, - initialValue: [], - }); - api.writeTmpFile({ - path: 'configType.d.ts', - content: Mustache.render(typeTpl, genTypeContent(importSources)), - }); - }); -} diff --git a/packages/fes-preset-built-in/src/plugins/registerType.js b/packages/fes-preset-built-in/src/plugins/registerType.js index 5b7e7f0e..8f773137 100644 --- a/packages/fes-preset-built-in/src/plugins/registerType.js +++ b/packages/fes-preset-built-in/src/plugins/registerType.js @@ -1,9 +1,41 @@ import { name } from '../../package.json'; +function importsToStr(imports) { + return imports.map((imp) => { + const { source } = imp; + return `export * from '${source}';`; + }); +} + +function genTypeContent(imports) { + return { + imports: importsToStr(imports).join('\n'), + }; +} + export default function (api) { + const { + utils: { Mustache }, + } = api; + api.addConfigType(() => ({ source: name, runtime: ['InnerRuntimeConfig'], build: ['InnerBuildConfig'], })); + + api.onGenerateFiles(async () => { + const typeTpl = ` +{{{ imports }}} +`; + const importSources = await api.applyPlugins({ + key: 'addConfigType', + type: api.ApplyPluginsType.add, + initialValue: [], + }); + api.writeTmpFile({ + path: 'configType.d.ts', + content: Mustache.render(typeTpl, genTypeContent(importSources)), + }); + }); } diff --git a/packages/fes-template/src/pages/@id/add.vue b/packages/fes-template/src/pages/[id]/add.vue similarity index 100% rename from packages/fes-template/src/pages/@id/add.vue rename to packages/fes-template/src/pages/[id]/add.vue diff --git a/packages/fes-template/src/pages/menuTest/@id.vue b/packages/fes-template/src/pages/menuTest/[id].vue similarity index 100% rename from packages/fes-template/src/pages/menuTest/@id.vue rename to packages/fes-template/src/pages/menuTest/[id].vue diff --git a/packages/fes-template/src/pages/route/@id.vue b/packages/fes-template/src/pages/route/[id].vue similarity index 100% rename from packages/fes-template/src/pages/route/@id.vue rename to packages/fes-template/src/pages/route/[id].vue