From 6893db3a43143edd884fafc8636601c61188e9b7 Mon Sep 17 00:00:00 2001 From: Qiyu8 Date: Tue, 3 Sep 2019 20:42:14 +0800 Subject: [PATCH] =?UTF-8?q?fix#4375=20=E8=A7=A3=E5=86=B3=E5=BF=AB=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E4=B8=AD=E8=B7=AF=E7=94=B1=E8=B7=B3=E8=BD=ACAPI?= =?UTF-8?q?=E4=B8=8D=E6=94=AF=E6=8C=81=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taro-quickapp/src/api/router/index.js | 14 +++++-- packages/taro-transformer-wx/src/constant.ts | 9 ++++ packages/taro-transformer-wx/src/index.ts | 42 ++++++++++++++++++- 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/packages/taro-quickapp/src/api/router/index.js b/packages/taro-quickapp/src/api/router/index.js index 3cbde6cffaa9..71f9e528cc89 100644 --- a/packages/taro-quickapp/src/api/router/index.js +++ b/packages/taro-quickapp/src/api/router/index.js @@ -1,9 +1,9 @@ import router from '@system.router' +import * as path from 'path' import appGlobal from '../../global' import { addLeadingSlash, getUniqueKey } from '../../util' import { cacheDataGet, cacheDataSet } from '../../data-cache' - const preloadPrivateKey = 'quick$PriPreload' const preloadInitedComponent = 'quick$PriPreloadComponent' @@ -34,7 +34,7 @@ export function reLaunch (options = {}) { } function qappNavigate (options = {}, method = 'push') { - const { url = '', success, fail, complete } = options + const { url = '', $$pagePath, success, fail, complete } = options const res = { errMsg: 'ok' } return new Promise((resolve, reject) => { @@ -47,7 +47,13 @@ function qappNavigate (options = {}, method = 'push') { } params = getUrlParams(url) const markIndex = url.indexOf('?') - const parseUrl = addLeadingSlash(url.substr(0, markIndex >= 0 ? markIndex : url.length)) + let parseUrl = url.substr(0, ~markIndex ? markIndex : url.length).replace(/^(.\/)/g, '') + if ($$pagePath && /^(..\/)/g.test(parseUrl)) { + $$pagePath = $$pagePath.substr(0, $$pagePath.lastIndexOf('/')) + parseUrl = addLeadingSlash(path.join($$pagePath, parseUrl)) + } else { + parseUrl = addLeadingSlash(parseUrl) + } appGlobal.taroRouterParamsCache = appGlobal.taroRouterParamsCache || {} appGlobal.taroRouterParamsCache[parseUrl] = params @@ -65,7 +71,7 @@ function qappNavigate (options = {}, method = 'push') { } try { router[method]({ - uri: url.substr(0, url.lastIndexOf('/')), + uri: parseUrl.substr(0, parseUrl.lastIndexOf('/')), params }) success && success(res) diff --git a/packages/taro-transformer-wx/src/constant.ts b/packages/taro-transformer-wx/src/constant.ts index 960085961111..9a5f6b465db7 100644 --- a/packages/taro-transformer-wx/src/constant.ts +++ b/packages/taro-transformer-wx/src/constant.ts @@ -150,6 +150,15 @@ export let FN_PREFIX = '__fn_' export const setFnPrefix = (s: string) => FN_PREFIX = s +export const PAGE_PATH = '$$pagePath' + +export const ROUTER_API = new Set([ + 'navigateTo', + 'reLaunch', + 'switchTab', + 'redirectTo' +]) + export const quickappComponentName = new Set([ 'Swiper', 'Audio', diff --git a/packages/taro-transformer-wx/src/index.ts b/packages/taro-transformer-wx/src/index.ts index 1889664fea08..3ef2958ef723 100644 --- a/packages/taro-transformer-wx/src/index.ts +++ b/packages/taro-transformer-wx/src/index.ts @@ -37,12 +37,15 @@ import { GEN_LOOP_COMPID, CONTEXT_PROVIDER, setIsTaroReady, - setCompId + setCompId, + ROUTER_API, + PAGE_PATH } from './constant' import { Adapters, setAdapter, Adapter } from './adapter' import { Options, setTransformOptions, buildBabelTransformOptions } from './options' import { get as safeGet, cloneDeep, snakeCase } from 'lodash' import { isTestEnv } from './env' +import { extname, sep } from 'path' const template = require('babel-template') @@ -186,6 +189,38 @@ function findThirdPartyComponent (properties: (t.ObjectMethod | t.ObjectProperty } } +function getRouterProperties(path: NodePath): (t.ObjectMethod | t.ObjectProperty | t.SpreadProperty)[] { + const routerArgs = (path.get('url').parent as t.CallExpression).arguments + if (!routerArgs.length) { + return [] + } + return t.isObjectExpression(routerArgs[0]) ? (routerArgs[0] as any).properties : [] +} + +function getPagePath(sourcePath: string, sourceDir = ''): string { + if (!sourceDir) { + return '' + } + let pagePath = sourcePath.replace(sourceDir, '') + pagePath = pagePath.replace(extname(pagePath), '') + pagePath = pagePath.split(sep).join('/') + if (pagePath.startsWith('/')) { + pagePath = pagePath.slice(1) + } + return pagePath +} + +function addPagePathInRouterConfig(properties: (t.ObjectMethod | t.ObjectProperty | t.SpreadProperty)[], pagePath?: string) { + if (!pagePath) { + return + } + properties.forEach((prop, idx) => { + if (t.isObjectProperty(prop) && t.isIdentifier(prop.key) && prop.key.name === 'url') { + properties.splice(idx + 1, 0, t.objectProperty(t.identifier(PAGE_PATH), t.stringLiteral(pagePath))) + } + }) +} + export interface Result { template: string components: { @@ -395,6 +430,11 @@ export default function transform (options: Options): TransformResult { ) } } + if (Adapters.quickapp === Adapter.type && t.isIdentifier(id) && id.name === 'Taro' && t.isIdentifier(property) && ROUTER_API.has(property.name)) { + const routerProperties = getRouterProperties(path) + const pagePath = getPagePath(options.sourcePath, options.sourceDir) + addPagePathInRouterConfig(routerProperties, pagePath) + } } if (callee.isReferencedIdentifier()) {