From 67b2866fe68ab3488e65e47cb2910b82799c397c Mon Sep 17 00:00:00 2001 From: wanchun <445436867@qq.com> Date: Mon, 7 Mar 2022 17:53:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=B9=E5=9B=9E=E5=A3=B0=E6=98=8E?= =?UTF-8?q?=E7=94=A8=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/misc/route/index.js | 45 +++++++++---------- packages/fes-template-h5/src/pages/index.vue | 2 +- packages/fes-template-h5/src/pages/test.tsx | 2 +- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/packages/fes-preset-built-in/src/plugins/misc/route/index.js b/packages/fes-preset-built-in/src/plugins/misc/route/index.js index b9026770..f963cb00 100644 --- a/packages/fes-preset-built-in/src/plugins/misc/route/index.js +++ b/packages/fes-preset-built-in/src/plugins/misc/route/index.js @@ -2,7 +2,7 @@ import { readdirSync, statSync, readFileSync } from 'fs'; import { join, extname, posix, basename } from 'path'; -import { lodash, parser } from '@fesjs/utils'; +import { lodash, parser, generator } from '@fesjs/utils'; import { parse } from '@vue/compiler-sfc'; import { Logger } from '@fesjs/compiler'; import { runtimePath } from '../../../utils/constants'; @@ -71,6 +71,19 @@ const getRoutePath = function (parentRoutePath, fileName) { return posix.join(parentRoutePath, fileName); }; +function getRouteMeta(content) { + const ast = parser.parse(content, { + sourceType: 'module', + plugins: ['jsx', 'typescript'] + }); + const defineRouteExpression = ast.program.body.filter(expression => expression.type === 'ExpressionStatement' && expression.expression.type === 'CallExpression' && expression.expression.callee.name === 'defineRouteMeta')[0]; + if (defineRouteExpression) { + const argument = generator(defineRouteExpression.expression.arguments[0]); + return JSON.parse(argument.code.replace(/'/g, '"').replace(/(\S+):/g, (global, m1) => `"${m1}":`)); + } + return null; +} + let cacheGenRoutes = {}; // TODO 约定 layout 目录作为布局文件夹, @@ -110,28 +123,20 @@ const genRoutes = function (parentRoutes, path, parentRoutePath, config) { b => b.type === 'config' ); routeMeta = routeMetaBlock?.content ? JSON.parse(routeMetaBlock.content) : {}; - } - let importMeta = ''; - if (ext === '.vue' || ext === '.jsx' || ext === '.tsx') { - if (ext === '.vue') { - const { descriptor } = parse(content); + if (descriptor.script) { content = descriptor.script.content; + routeMeta = getRouteMeta(content) || routeMeta; } - const ast = parser.parse(content, { - sourceType: 'module', - plugins: ['jsx', 'typescript'] - }); - const defineRouteMetaExpression = ast.program.body.filter(expression => expression.type === 'ExportNamedDeclaration' && expression.declaration.type === 'VariableDeclaration' && expression.declaration.declarations[0].id.name === 'meta')[0]; - if (defineRouteMetaExpression) { - importMeta = `require('${componentPath}').meta`; - } + } + if (ext === '.jsx' || ext === '.tsx') { + routeMeta = getRouteMeta(content) || {}; } const routeConfig = { path: routePath, component: componentPath, - name: (importMeta ? `${importMeta}.name` : routeMeta.name) || routeName, - meta: importMeta || routeMeta + name: routeMeta.name || routeName, + meta: routeMeta }; if (hasLayout) { if (fileName === 'layout') { @@ -241,14 +246,6 @@ const getRoutesJSON = function ({ routes, config }) { /"component": ("(.+?)")/g, (global, m1, m2) => `"component": ${m2.replace(/\^/g, '"')}` ) - .replace( - /"name": "require(.+?)"/g, - (global, m1) => `"name": require${m1}` - ) - .replace( - /"meta": "require(.+?)"/g, - (global, m1) => `"meta": require${m1}` - ) .replace(/\\r\\n/g, '\r\n') .replace(/\\n/g, '\r\n'); }; diff --git a/packages/fes-template-h5/src/pages/index.vue b/packages/fes-template-h5/src/pages/index.vue index d6684f83..7d6479dc 100644 --- a/packages/fes-template-h5/src/pages/index.vue +++ b/packages/fes-template-h5/src/pages/index.vue @@ -19,7 +19,7 @@ import HelloWorld from '@/components/helloWorld'; import HelloTSX from '@/components/helloTSX'; import helloTS from '@/components/helloTS'; -export const meta = defineRouteMeta({ +defineRouteMeta({ title: '首页', name: 'testIndex', layout: false diff --git a/packages/fes-template-h5/src/pages/test.tsx b/packages/fes-template-h5/src/pages/test.tsx index 4b21bb18..07efe642 100644 --- a/packages/fes-template-h5/src/pages/test.tsx +++ b/packages/fes-template-h5/src/pages/test.tsx @@ -1,7 +1,7 @@ import { defineRouteMeta, useRoute } from '@fesjs/fes'; import { defineComponent } from 'vue'; -export const meta = defineRouteMeta({ +defineRouteMeta({ title: 'test', name: 'test' })