Skip to content

Commit

Permalink
fix#4375 解决快应用中路由跳转API不支持相对路径的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
Qiyu8 committed Sep 3, 2019
1 parent d59e63b commit 6893db3
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 5 deletions.
14 changes: 10 additions & 4 deletions packages/taro-quickapp/src/api/router/index.js
Original file line number Diff line number Diff line change
@@ -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'

Expand Down Expand Up @@ -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) => {
Expand All @@ -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

Expand All @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions packages/taro-transformer-wx/src/constant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
42 changes: 41 additions & 1 deletion packages/taro-transformer-wx/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand Down Expand Up @@ -186,6 +189,38 @@ function findThirdPartyComponent (properties: (t.ObjectMethod | t.ObjectProperty
}
}

function getRouterProperties(path: NodePath<t.Node>): (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: {
Expand Down Expand Up @@ -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()) {
Expand Down

0 comments on commit 6893db3

Please sign in to comment.