From dfaea6c108bd20507589637fa65eddb0ee47b901 Mon Sep 17 00:00:00 2001 From: wanchun <445436867@qq.com> Date: Mon, 7 Mar 2022 16:29:21 +0800 Subject: [PATCH] =?UTF-8?q?.vue=E6=96=87=E4=BB=B6=E4=B9=9F=E6=94=AF?= =?UTF-8?q?=E6=8C=81defineRouteMeta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/misc/route/index.js | 32 ++++++++---- .../plugins/misc/route/template/routes.tpl | 2 +- packages/fes-template-h5/src/pages/index.vue | 50 ++++++++++++------- .../fes-template-h5/src/pages/onepiece.vue | 2 +- packages/fes-template-h5/src/pages/test.tsx | 8 +-- packages/fes/types.d.ts | 7 ++- 6 files changed, 66 insertions(+), 35 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 9ff40cba..b9026770 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, generator } from '@fesjs/utils'; +import { lodash, parser } from '@fesjs/utils'; import { parse } from '@vue/compiler-sfc'; import { Logger } from '@fesjs/compiler'; import { runtimePath } from '../../../utils/constants'; @@ -102,7 +102,7 @@ const genRoutes = function (parentRoutes, path, parentRoutePath, config) { const routeName = getRouteName(parentRoutePath, fileName); const componentPath = getComponentPath(parentRoutePath, fileName, config); - const content = readFileSync(component, 'utf-8'); + let content = readFileSync(component, 'utf-8'); let routeMeta = {}; if (ext === '.vue') { const { descriptor } = parse(content); @@ -111,23 +111,27 @@ const genRoutes = function (parentRoutes, path, parentRoutePath, config) { ); routeMeta = routeMetaBlock?.content ? JSON.parse(routeMetaBlock.content) : {}; } - if (ext === '.jsx' || ext === '.tsx') { + let importMeta = ''; + if (ext === '.vue' || ext === '.jsx' || ext === '.tsx') { + if (ext === '.vue') { + const { descriptor } = parse(content); + content = descriptor.script.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 === 'defineRoute')[0]; - if (defineRouteExpression) { - const argument = generator(defineRouteExpression.expression.arguments[0]); - routeMeta = JSON.parse(argument.code.replace(/'/g, '"').replace(/(\S+):/g, (global, m1) => `"${m1}":`)); + 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`; } } const routeConfig = { path: routePath, component: componentPath, - name: routeMeta.name || routeName, - meta: routeMeta + name: (importMeta ? `${importMeta}.name` : routeMeta.name) || routeName, + meta: importMeta || routeMeta }; if (hasLayout) { if (fileName === 'layout') { @@ -237,6 +241,14 @@ 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'); }; @@ -319,7 +331,7 @@ export default function (api) { api.addCoreExports(() => [ { - specifiers: ['getRoutes', 'getRouter', 'getHistory', 'destroyRouter', 'defineRoute'], + specifiers: ['getRoutes', 'getRouter', 'getHistory', 'destroyRouter', 'defineRouteMeta'], source: absCoreFilePath } ]); diff --git a/packages/fes-preset-built-in/src/plugins/misc/route/template/routes.tpl b/packages/fes-preset-built-in/src/plugins/misc/route/template/routes.tpl index 1e3db781..6d2083d4 100644 --- a/packages/fes-preset-built-in/src/plugins/misc/route/template/routes.tpl +++ b/packages/fes-preset-built-in/src/plugins/misc/route/template/routes.tpl @@ -61,6 +61,6 @@ export const destroyRouter = ()=>{ history = null; } -export const defineRoute = (param)=>{ +export const defineRouteMeta = (param)=>{ return param } diff --git a/packages/fes-template-h5/src/pages/index.vue b/packages/fes-template-h5/src/pages/index.vue index 8cf4ebc3..d6684f83 100644 --- a/packages/fes-template-h5/src/pages/index.vue +++ b/packages/fes-template-h5/src/pages/index.vue @@ -1,26 +1,30 @@ - -{ - "title": "首页", - "name": "testIndex", - "layout": "false" -} - diff --git a/packages/fes-template-h5/src/pages/onepiece.vue b/packages/fes-template-h5/src/pages/onepiece.vue index bcf8dafd..e8c335c6 100644 --- a/packages/fes-template-h5/src/pages/onepiece.vue +++ b/packages/fes-template-h5/src/pages/onepiece.vue @@ -5,7 +5,7 @@ { "title": "onepiece", - "layout": "true" + "layout": true }