@tarojs/router 3.3.13 → 3.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var runtime = require('@tarojs/runtime');
6
+ var taro = require('@tarojs/taro');
6
7
 
7
8
  function _extends() {
8
9
  _extends = Object.assign || function (target) {
@@ -56,39 +57,116 @@ function prependBasename(url) {
56
57
  if ( url === void 0 ) url = '';
57
58
 
58
59
  return basename.replace(/\/$/, '') + '/' + url.replace(/^\//, '');
59
- }
60
+ }
61
+ var hasBasename = function (path, prefix) { return new RegExp('^' + prefix + '(\\/|\\?|#|$)', 'i').test(path); };
62
+ var stripBasename = function (path, prefix) { return hasBasename(path, prefix) ? path.substr(prefix.length) : path; };
60
63
 
61
- var stacks = [];
64
+ var Stacks = function Stacks() {
65
+ this.stacks = [];
66
+ this.backDelta = 0;
67
+ };
68
+
69
+ var prototypeAccessors = { delta: { configurable: true },length: { configurable: true },last: { configurable: true } };
70
+ prototypeAccessors.delta.set = function (delta) {
71
+ if (delta > 0) {
72
+ this.backDelta = delta;
73
+ }
74
+ else {
75
+ --this.backDelta;
76
+ }
77
+ };
78
+ prototypeAccessors.length.get = function () {
79
+ return this.stacks.length;
80
+ };
81
+ prototypeAccessors.last.get = function () {
82
+ return this.stacks[this.length - 1];
83
+ };
84
+ Stacks.prototype.get = function get () {
85
+ return this.stacks;
86
+ };
87
+ Stacks.prototype.getItem = function getItem (index) {
88
+ return this.stacks[index];
89
+ };
90
+ Stacks.prototype.getLastIndex = function getLastIndex (pathname) {
91
+ var list = [].concat( this.stacks ).reverse();
92
+ return list.findIndex(function (page, i) { var _a; return i !== 0 && ((_a = page.path) === null || _a === void 0 ? void 0 : _a.replace(/\?.*/g, '')) === pathname; });
93
+ };
94
+ Stacks.prototype.getDelta = function getDelta (pathname) {
95
+ if (this.backDelta >= 1) {
96
+ return this.backDelta;
97
+ }
98
+ // NOTE: 此处为了修复浏览器后退多级页面,在大量重复路由状况下可能出现判断错误的情况 (增强判断能力只能考虑在 query 中新增参数来判断,暂时搁置)
99
+ return this.getLastIndex(pathname) || 1;
100
+ };
101
+ Stacks.prototype.getPrevIndex = function getPrevIndex (pathname) {
102
+ var lastIndex = this.getLastIndex(pathname);
103
+ if (lastIndex < 0) {
104
+ return -1;
105
+ }
106
+ return this.length - 1 - lastIndex;
107
+ };
108
+ Stacks.prototype.pop = function pop () {
109
+ return this.stacks.pop();
110
+ };
111
+ Stacks.prototype.push = function push (page) {
112
+ return this.stacks.push(page);
113
+ };
114
+
115
+ Object.defineProperties( Stacks.prototype, prototypeAccessors );
116
+ var stacks = new Stacks();
62
117
 
63
- var routesAlias = {};
64
- function setRoutesAlias(alias) {
65
- routesAlias = alias;
66
- }
67
118
  function addLeadingSlash(path) {
68
119
  if (path == null) {
69
120
  return '';
70
121
  }
71
122
  return path.charAt(0) === '/' ? path : '/' + path;
72
123
  }
73
- // 解决navigateBack调用delta>1时,路由栈异常问题
74
- // 比如:A->B->C,navigateBack({delta: 2}),此时路由栈中还存在B页面
75
- // 原因:主要是由于一次性退出多层级页面时,此action只会执行一次,此处进行手动处理
76
- var historyBackDelta = 1;
77
- function setHistoryBackDelta(delta) {
78
- historyBackDelta = delta;
79
- }
80
- // eslint-disable-next-line @typescript-eslint/ban-types
81
- var throttle = function (fn, threshold) {
82
- var lastTime = 0;
83
- return function () {
84
- var now = Date.now();
85
- if (now - lastTime > threshold) {
86
- fn.apply(this, arguments);
87
- lastTime = now;
88
- }
124
+ var RoutesAlias = function RoutesAlias() {
125
+ var this$1 = this;
126
+
127
+ this.conf = [];
128
+ this.getConfig = function (url) {
129
+ var customRoute = this$1.conf.filter(function (arr) {
130
+ return arr.includes(url);
131
+ });
132
+ return customRoute[0];
89
133
  };
134
+ this.getOrigin = function (url) {
135
+ var _a;
136
+ return ((_a = this$1.getConfig(url)) === null || _a === void 0 ? void 0 : _a[0]) || url;
137
+ };
138
+ this.getAlias = function (url) {
139
+ var _a;
140
+ return ((_a = this$1.getConfig(url)) === null || _a === void 0 ? void 0 : _a[1]) || url;
141
+ };
142
+ this.getAll = function (url) {
143
+ return this$1.conf.filter(function (arr) {
144
+ return arr.includes(url);
145
+ }).reduce(function (p, a) {
146
+ p.push(a[1]);
147
+ return p;
148
+ }, [url]);
149
+ };
150
+ };
151
+ RoutesAlias.prototype.set = function set (customRoutes) {
152
+ var this$1 = this;
153
+ var ref;
154
+
155
+ if ( customRoutes === void 0 ) customRoutes = {};
156
+ var loop = function ( key ) {
157
+ var path = customRoutes[key];
158
+ key = addLeadingSlash(key);
159
+ if (typeof path === 'string') {
160
+ this$1.conf.push([key, addLeadingSlash(path)]);
161
+ }
162
+ else if ((path === null || path === void 0 ? void 0 : path.length) > 0) {
163
+ (ref = this$1.conf).push.apply(ref, path.map(function (p) { return [key, addLeadingSlash(p)]; }));
164
+ }
165
+ };
166
+
167
+ for (var key in customRoutes) loop( key );
90
168
  };
91
- var stripBasename = function (path, basename) { return path.startsWith(basename) ? path.replace(basename, '') : path; };
169
+ var routesAlias = new RoutesAlias();
92
170
  var isTabBar = function (config) {
93
171
  var _a, _b;
94
172
  var ref = config.router;
@@ -98,20 +176,35 @@ var isTabBar = function (config) {
98
176
  var routePath = stripBasename(pathname, basename);
99
177
  var pagePath = ((_a = Object.entries(customRoutes).find(function (ref) {
100
178
  var target = ref[1];
101
-
102
- return target === routePath;
179
+
180
+ if (typeof target === 'string') {
181
+ return target === routePath;
182
+ }
183
+ else if ((target === null || target === void 0 ? void 0 : target.length) > 0) {
184
+ return target.includes(routePath);
185
+ }
186
+ return false;
103
187
  })) === null || _a === void 0 ? void 0 : _a[0]) || routePath;
104
188
  return !!pagePath && (((_b = config.tabBar) === null || _b === void 0 ? void 0 : _b.list) || []).some(function (t) { return t.pagePath === pagePath; });
105
189
  };
106
190
 
107
191
  function processNavigateUrl(option) {
192
+ var _a;
108
193
  var pathPieces = J(option.url);
109
194
  // 处理自定义路由
110
- Object.keys(routesAlias).forEach(function (key) {
111
- if (addLeadingSlash(key) === addLeadingSlash(pathPieces.pathname)) {
112
- pathPieces.pathname = routesAlias[key];
113
- }
114
- });
195
+ pathPieces.pathname = routesAlias.getAlias(addLeadingSlash(pathPieces.pathname));
196
+ // 处理相对路径
197
+ if ((_a = pathPieces === null || pathPieces === void 0 ? void 0 : pathPieces.pathname) === null || _a === void 0 ? void 0 : _a.includes('./')) {
198
+ var parts = exports.history.location.pathname.split('/');
199
+ parts.pop();
200
+ pathPieces.pathname.split('/').forEach(function (item) {
201
+ if (item === '.') {
202
+ return;
203
+ }
204
+ item === '..' ? parts.pop() : parts.push(item);
205
+ });
206
+ pathPieces.pathname = parts.join('/');
207
+ }
115
208
  // 处理 basename
116
209
  pathPieces.pathname = prependBasename(pathPieces.pathname);
117
210
  // hack fix history v5 bug: https://github.com/remix-run/history/issues/814
@@ -125,9 +218,10 @@ async function navigate(option, method) {
125
218
  var complete = option.complete;
126
219
  var fail = option.fail;
127
220
  var unListen = exports.history.listen(function () {
128
- success === null || success === void 0 ? void 0 : success();
129
- complete === null || complete === void 0 ? void 0 : complete();
130
- resolve();
221
+ var res = { errMsg: (method + ": ok") };
222
+ success === null || success === void 0 ? void 0 : success(res);
223
+ complete === null || complete === void 0 ? void 0 : complete(res);
224
+ resolve(res);
131
225
  unListen();
132
226
  });
133
227
  try {
@@ -137,19 +231,24 @@ async function navigate(option, method) {
137
231
  if (method === 'navigateTo') {
138
232
  exports.history.push(pathPieces, state);
139
233
  }
140
- else if (method === 'redirectTo') {
234
+ else if (method === 'redirectTo' || method === 'switchTab') {
235
+ exports.history.replace(pathPieces, state);
236
+ }
237
+ else if (method === 'reLaunch') {
238
+ stacks.delta = stacks.length;
141
239
  exports.history.replace(pathPieces, state);
142
240
  }
143
241
  }
144
242
  else if (method === 'navigateBack') {
145
- setHistoryBackDelta(option.delta);
243
+ stacks.delta = option.delta;
146
244
  exports.history.go(-option.delta);
147
245
  }
148
246
  }
149
247
  catch (error) {
150
- fail === null || fail === void 0 ? void 0 : fail(error);
151
- complete === null || complete === void 0 ? void 0 : complete();
152
- reject(error);
248
+ var res = { errMsg: (method + ": fail " + (error.message || error)) };
249
+ fail === null || fail === void 0 ? void 0 : fail(res);
250
+ complete === null || complete === void 0 ? void 0 : complete(res);
251
+ reject(res);
153
252
  }
154
253
  });
155
254
  }
@@ -168,15 +267,14 @@ function navigateBack(options) {
168
267
  return navigate(options, 'navigateBack');
169
268
  }
170
269
  function switchTab(option) {
171
- // TODO: 清除掉所有的栈去目标页面
172
- return redirectTo(option);
270
+ return navigate(option, 'switchTab');
173
271
  }
174
272
  function reLaunch(option) {
175
- // TODO: 清除掉所有的栈去目标页面
176
- return redirectTo(option);
273
+ return navigate(option, 'reLaunch');
177
274
  }
178
275
  function getCurrentPages() {
179
- return stacks;
276
+ var pages = stacks.get();
277
+ return pages.map(function (e) { return (Object.assign(Object.assign({}, e), { route: e.path || '' })); });
180
278
  }
181
279
 
182
280
  /**
@@ -822,18 +920,18 @@ var UniversalRouter = function () {
822
920
 
823
921
  UniversalRouter.pathToRegexp = pathToRegexp_1;
824
922
 
923
+ // @ts-nocheck
825
924
  function initTabbar(config) {
826
925
  if (config.tabBar == null) {
827
926
  return;
828
927
  }
829
928
  // TODO: 找到 tabbar 的类型
830
929
  var tabbar = document.createElement('taro-tabbar');
831
- var homePage = config.pages ? config.pages[0] : '';
930
+ var homePage = config.entryPagePath || (config.pages ? config.pages[0] : '');
832
931
  tabbar.conf = config.tabBar;
833
932
  tabbar.conf.homePage = exports.history.location.pathname === '/' ? homePage : exports.history.location.pathname;
834
933
  var routerConfig = config.router;
835
934
  tabbar.conf.mode = routerConfig && routerConfig.mode ? routerConfig.mode : 'hash';
836
- tabbar.conf.custom = !!routerConfig.customRoutes;
837
935
  if (routerConfig.customRoutes) {
838
936
  tabbar.conf.custom = true;
839
937
  tabbar.conf.customRoutes = routerConfig.customRoutes;
@@ -848,6 +946,7 @@ function initTabbar(config) {
848
946
  var container = document.getElementById('container');
849
947
  // eslint-disable-next-line no-unused-expressions
850
948
  container === null || container === void 0 ? void 0 : container.appendChild(tabbar);
949
+ taro.initTabBarApis(config);
851
950
  }
852
951
 
853
952
  var routerConfig = Object.create(null);
@@ -871,6 +970,58 @@ function init(config) {
871
970
  initTabbar(config);
872
971
  }
873
972
 
973
+ var pageScrollFn;
974
+ var pageDOM = window;
975
+ function bindPageScroll(page, config) {
976
+ pageDOM.removeEventListener('scroll', pageScrollFn);
977
+ pageDOM = getScrollContainer();
978
+ var distance = config.onReachBottomDistance || 50;
979
+ var isReachBottom = false;
980
+ pageScrollFn = function () {
981
+ page.onPageScroll && page.onPageScroll({
982
+ scrollTop: pageDOM instanceof Window ? window.scrollY : pageDOM.scrollTop
983
+ });
984
+ if (isReachBottom && getOffset() > distance) {
985
+ isReachBottom = false;
986
+ }
987
+ if (page.onReachBottom &&
988
+ !isReachBottom &&
989
+ getOffset() < distance) {
990
+ isReachBottom = true;
991
+ page.onReachBottom();
992
+ }
993
+ };
994
+ pageDOM.addEventListener('scroll', pageScrollFn, false);
995
+ }
996
+ window.addEventListener('DOMSubtreeModified', function (e) {
997
+ var _a;
998
+ // @ts-ignore
999
+ var className = (_a = e.target) === null || _a === void 0 ? void 0 : _a.className;
1000
+ if (className && /taro-tabbar__/.test(className)) {
1001
+ pageDOM.removeEventListener('scroll', pageScrollFn);
1002
+ pageDOM = getScrollContainer();
1003
+ pageDOM.addEventListener('scroll', pageScrollFn, false);
1004
+ }
1005
+ }, false);
1006
+ function getScrollContainer() {
1007
+ if (document.querySelector('.taro-tabbar__tabbar') === null) {
1008
+ // 没设置tabbar
1009
+ return window;
1010
+ }
1011
+ else {
1012
+ // 有设置tabbar
1013
+ return document.querySelector('.taro-tabbar__panel') || window;
1014
+ }
1015
+ }
1016
+ function getOffset() {
1017
+ if (pageDOM instanceof Window) {
1018
+ return document.documentElement.scrollHeight - window.scrollY - window.innerHeight;
1019
+ }
1020
+ else {
1021
+ return pageDOM.scrollHeight - pageDOM.scrollTop - pageDOM.clientHeight;
1022
+ }
1023
+ }
1024
+
874
1025
  function createCommonjsModule(fn, module) {
875
1026
  return module = { exports: {} }, fn(module, module.exports), module.exports;
876
1027
  }
@@ -1427,14 +1578,25 @@ var queryString_5 = queryString.stringifyUrl;
1427
1578
  var queryString_6 = queryString.pick;
1428
1579
  var queryString_7 = queryString.exclude;
1429
1580
 
1581
+ function getSearch() {
1582
+ var search = '?';
1583
+ if (routerConfig.router.mode === 'hash') {
1584
+ var idx = location.hash.indexOf('?');
1585
+ if (idx > -1) {
1586
+ search = location.hash.slice(idx);
1587
+ }
1588
+ }
1589
+ else {
1590
+ search = location.search;
1591
+ }
1592
+ return search.substr(1);
1593
+ }
1430
1594
  var qs = function (stamp) {
1431
1595
  if ( stamp === void 0 ) stamp = 0;
1432
1596
 
1433
- var search = routerConfig.router.mode === 'hash'
1434
- ? location.hash.slice(routerConfig.router.pathname.length + 1)
1435
- : location.search;
1597
+ var search = getSearch();
1436
1598
  var query = search
1437
- ? queryString.parse(search.substr(1))
1599
+ ? queryString.parse(search)
1438
1600
  : {};
1439
1601
  if (stamp) {
1440
1602
  query.stamp = stamp.toString();
@@ -1442,99 +1604,15 @@ var qs = function (stamp) {
1442
1604
  return query;
1443
1605
  };
1444
1606
 
1445
- var pageScrollFn;
1446
- var pageDOM = window;
1447
- function bindPageScroll(page, config) {
1448
- pageDOM.removeEventListener('scroll', pageScrollFn);
1449
- pageDOM = getScrollContainer();
1450
- var distance = config.onReachBottomDistance || 50;
1451
- var isReachBottom = false;
1452
- pageScrollFn = function () {
1453
- page.onPageScroll && page.onPageScroll({
1454
- scrollTop: pageDOM instanceof Window ? window.scrollY : pageDOM.scrollTop
1455
- });
1456
- if (isReachBottom && getOffset() > distance) {
1457
- isReachBottom = false;
1458
- }
1459
- if (page.onReachBottom &&
1460
- !isReachBottom &&
1461
- getOffset() < distance) {
1462
- isReachBottom = true;
1463
- page.onReachBottom();
1464
- }
1465
- };
1466
- pageDOM.addEventListener('scroll', pageScrollFn, false);
1467
- }
1468
- window.addEventListener('DOMSubtreeModified', function (e) {
1469
- var _a;
1470
- // @ts-ignore
1471
- var className = (_a = e.target) === null || _a === void 0 ? void 0 : _a.className;
1472
- if (className && /taro-tabbar__/.test(className)) {
1473
- pageDOM.removeEventListener('scroll', pageScrollFn);
1474
- pageDOM = getScrollContainer();
1475
- pageDOM.addEventListener('scroll', pageScrollFn, false);
1476
- }
1477
- }, false);
1478
- function getScrollContainer() {
1479
- if (document.querySelector('.taro-tabbar__tabbar') === null) {
1480
- // 没设置tabbar
1481
- return window;
1482
- }
1483
- else {
1484
- // 有设置tabbar
1485
- return document.querySelector('.taro-tabbar__panel') || window;
1486
- }
1487
- }
1488
- function getOffset() {
1489
- if (pageDOM instanceof Window) {
1490
- return document.documentElement.scrollHeight - window.scrollY - window.innerHeight;
1491
- }
1492
- else {
1493
- return pageDOM.scrollHeight - pageDOM.scrollTop - pageDOM.clientHeight;
1494
- }
1495
- }
1496
-
1497
1607
  /* eslint-disable dot-notation */
1498
- function hidePage(page) {
1499
- if (page != null) {
1500
- page.onHide();
1501
- var pageEl = document.getElementById(page.path);
1502
- if (pageEl) {
1503
- pageEl.style.display = 'none';
1504
- }
1505
- }
1506
- }
1507
- function showPage(page, pageConfig, stacksIndex) {
1508
- if ( stacksIndex === void 0 ) stacksIndex = 0;
1509
-
1510
- if (page != null) {
1511
- page.onShow();
1512
- var pageEl = document.getElementById(page.path);
1513
- if (pageEl) {
1514
- pageEl.style.display = 'block';
1515
- }
1516
- else {
1517
- page.onLoad(qs(stacksIndex));
1518
- pageEl = document.getElementById(page.path);
1519
- pageOnReady(pageEl, page, false);
1520
- }
1521
- bindPageScroll(page, pageConfig || {});
1522
- }
1523
- }
1524
- function unloadPage(page) {
1525
- if (page != null) {
1526
- stacks.pop();
1527
- page.onUnload();
1528
- }
1529
- }
1530
- function pageOnReady(pageEl, page, onLoad) {
1608
+ function pageOnReady(page, onLoad) {
1531
1609
  if ( onLoad === void 0 ) onLoad = true;
1532
1610
 
1533
- var _a;
1611
+ var _a, _b;
1612
+ var pageEl = document.getElementById(page.path);
1534
1613
  if (pageEl && !(pageEl === null || pageEl === void 0 ? void 0 : pageEl['__isReady'])) {
1535
1614
  var el = pageEl.firstElementChild;
1536
- // eslint-disable-next-line no-unused-expressions
1537
- (_a = el === null || el === void 0 ? void 0 : el['componentOnReady']) === null || _a === void 0 ? void 0 : _a.call(el).then(function () {
1615
+ (_b = (_a = el === null || el === void 0 ? void 0 : el['componentOnReady']) === null || _a === void 0 ? void 0 : _a.call(el)) === null || _b === void 0 ? void 0 : _b.then(function () {
1538
1616
  runtime.requestAnimationFrame(function () {
1539
1617
  page.onReady();
1540
1618
  pageEl['__isReady'] = true;
@@ -1544,43 +1622,82 @@ function pageOnReady(pageEl, page, onLoad) {
1544
1622
  }
1545
1623
  }
1546
1624
  function loadPage(page, pageConfig, stacksIndex) {
1625
+ if ( pageConfig === void 0 ) pageConfig = {};
1547
1626
  if ( stacksIndex === void 0 ) stacksIndex = 0;
1548
1627
 
1549
- if (page !== null) {
1550
- var pageEl = document.getElementById(page.path);
1551
- if (pageEl) {
1552
- pageEl.style.display = 'block';
1553
- }
1554
- else {
1555
- page.onLoad(qs(stacksIndex), function () {
1556
- pageEl = document.getElementById(page.path);
1557
- pageOnReady(pageEl, page);
1558
- });
1559
- }
1560
- stacks.push(page);
1561
- page.onShow();
1562
- bindPageScroll(page, pageConfig || {});
1628
+ if (!page)
1629
+ { return; }
1630
+ var pageEl = document.getElementById(page.path);
1631
+ if (pageEl) {
1632
+ pageEl.style.display = 'block';
1633
+ }
1634
+ else {
1635
+ page.onLoad(qs(stacksIndex), function () { return pageOnReady(page, true); });
1636
+ }
1637
+ stacks.push(page);
1638
+ page.onShow();
1639
+ bindPageScroll(page, pageConfig);
1640
+ }
1641
+ function unloadPage(page, delta) {
1642
+ if ( delta === void 0 ) delta = 1;
1643
+
1644
+ if (!page)
1645
+ { return; }
1646
+ stacks.delta = --delta;
1647
+ stacks.pop();
1648
+ page.onUnload();
1649
+ if (delta >= 1)
1650
+ { unloadPage(stacks.last, delta); }
1651
+ }
1652
+ function showPage(page, pageConfig, stacksIndex) {
1653
+ if ( pageConfig === void 0 ) pageConfig = {};
1654
+ if ( stacksIndex === void 0 ) stacksIndex = 0;
1655
+
1656
+ if (!page)
1657
+ { return; }
1658
+ page.onShow();
1659
+ var pageEl = document.getElementById(page.path);
1660
+ if (pageEl) {
1661
+ pageEl.style.display = 'block';
1662
+ }
1663
+ else {
1664
+ page.onLoad(qs(stacksIndex), function () { return pageOnReady(page, false); });
1563
1665
  }
1666
+ bindPageScroll(page, pageConfig);
1564
1667
  }
1668
+ function hidePage(page) {
1669
+ if (!page)
1670
+ { return; }
1671
+ // NOTE: 修复多页并发问题,此处可能因为路由跳转过快,执行时页面可能还没有创建成功
1672
+ var pageEl = document.getElementById(page.path);
1673
+ if (pageEl) {
1674
+ pageEl.style.display = 'none';
1675
+ page.onHide();
1676
+ }
1677
+ else {
1678
+ setTimeout(function () { return hidePage(page); }, 0);
1679
+ }
1680
+ }
1681
+
1682
+ /* eslint-disable dot-notation */
1565
1683
  function createRouter(app, config, framework) {
1566
1684
  var _a;
1567
1685
  init(config);
1568
1686
  var routes = [];
1569
- var alias = (_a = config.router.customRoutes) !== null && _a !== void 0 ? _a : {};
1570
1687
  var runtimeHooks = runtime.container.get(runtime.SERVICE_IDENTIFIER.Hooks);
1571
- setRoutesAlias(alias);
1688
+ routesAlias.set(config.router.customRoutes);
1572
1689
  for (var i = 0; i < config.routes.length; i++) {
1573
1690
  var route = config.routes[i];
1574
1691
  var path = addLeadingSlash(route.path);
1575
1692
  routes.push({
1576
- path: alias[path] || path,
1693
+ path: routesAlias.getAll(path),
1577
1694
  action: route.load
1578
1695
  });
1579
1696
  }
1580
1697
  var basename = config.router.basename;
1581
1698
  var router = new UniversalRouter(routes, { baseUrl: basename || '' });
1582
1699
  app.onLaunch();
1583
- var render = throttle(async function (ref) {
1700
+ var render = async function (ref) {
1584
1701
  var location = ref.location;
1585
1702
  var action = ref.action;
1586
1703
 
@@ -1603,8 +1720,10 @@ function createRouter(app, config, framework) {
1603
1720
  if (!element)
1604
1721
  { return; }
1605
1722
  var pageConfig = config.routes.find(function (r) {
1723
+ var _a;
1606
1724
  var path = addLeadingSlash(r.path);
1607
- return path === location.pathname || alias[path] === location.pathname;
1725
+ var urlPath = stripBasename(location.pathname, routerConfig.router.basename);
1726
+ return path === urlPath || ((_a = routesAlias.getConfig(path)) === null || _a === void 0 ? void 0 : _a.includes(urlPath));
1608
1727
  });
1609
1728
  var enablePullDownRefresh = false;
1610
1729
  runtime.eventCenter.trigger('__taroRouterChange', {
@@ -1616,67 +1735,53 @@ function createRouter(app, config, framework) {
1616
1735
  document.title = (_b = pageConfig.navigationBarTitleText) !== null && _b !== void 0 ? _b : document.title;
1617
1736
  enablePullDownRefresh = pageConfig.enablePullDownRefresh;
1618
1737
  }
1738
+ var currentPage = runtime.Current.page;
1739
+ var pathname = location.pathname;
1619
1740
  var shouldLoad = false;
1620
1741
  if (action === 'POP') {
1621
- unloadPage(runtime.Current.page);
1622
- var delta = historyBackDelta;
1623
- while (delta-- > 1) {
1624
- unloadPage(stacks.slice(-1)[0]);
1625
- }
1626
- // 最终必须重置为 1
1627
- setHistoryBackDelta(1);
1628
- var prevIndex = stacks.reduceRight(function (p, s, i) {
1629
- if (p !== 0)
1630
- { return p; }
1631
- else if (s.path === location.pathname + runtime.stringify(qs(i)))
1632
- { return i; }
1633
- else
1634
- { return 0; }
1635
- }, 0);
1636
- var prev = stacks[prevIndex];
1637
- if (prev) {
1638
- showPage(prev, pageConfig, prevIndex);
1742
+ // NOTE: 浏览器事件退后多次时,该事件只会被触发一次
1743
+ var prevIndex = stacks.getPrevIndex(pathname);
1744
+ var delta = stacks.getDelta(pathname);
1745
+ unloadPage(currentPage, delta);
1746
+ if (prevIndex > -1) {
1747
+ showPage(stacks.getItem(prevIndex), pageConfig, prevIndex);
1639
1748
  }
1640
1749
  else {
1641
1750
  shouldLoad = true;
1642
1751
  }
1643
1752
  }
1644
1753
  else if (action === 'PUSH') {
1645
- hidePage(runtime.Current.page);
1754
+ hidePage(currentPage);
1646
1755
  shouldLoad = true;
1647
1756
  }
1648
1757
  else if (action === 'REPLACE') {
1649
1758
  if (isTabBar(config)) {
1650
- hidePage(runtime.Current.page);
1651
- var pathname = stripBasename(config.router.pathname, basename);
1652
- var prevIndex$1 = stacks.findIndex(function (r) {
1653
- var _a;
1654
- return ((_a = r.path) === null || _a === void 0 ? void 0 : _a.replace(/\?.*/g, '')) === pathname;
1655
- });
1759
+ hidePage(currentPage);
1760
+ var prevIndex$1 = stacks.getPrevIndex(pathname);
1656
1761
  if (prevIndex$1 > -1) {
1657
- // tabbar 页且之前出现过,直接复用
1658
- var prev$1 = stacks[prevIndex$1];
1659
- return showPage(prev$1, pageConfig, prevIndex$1);
1762
+ // NOTE: tabbar 页且之前出现过,直接复用
1763
+ return showPage(stacks.getItem(prevIndex$1), pageConfig, prevIndex$1);
1660
1764
  }
1661
1765
  }
1662
1766
  else {
1663
- unloadPage(runtime.Current.page);
1767
+ var delta$1 = stacks.getDelta(pathname);
1768
+ // NOTE: 页面路由记录并不会清空,只是移除掉缓存的 stack 以及页面
1769
+ unloadPage(currentPage, delta$1);
1664
1770
  }
1665
1771
  shouldLoad = true;
1666
1772
  }
1667
- if (shouldLoad) {
1773
+ if (shouldLoad || stacks.length < 1) {
1668
1774
  var el = (_c = element.default) !== null && _c !== void 0 ? _c : element;
1669
1775
  var loadConfig = Object.assign({}, pageConfig);
1776
+ var stacksIndex = stacks.length;
1670
1777
  delete loadConfig['path'];
1671
1778
  delete loadConfig['load'];
1672
- var pathname$1 = stripBasename(config.router.pathname, basename);
1673
- var routerIndex = stacks.length;
1674
- var page = runtime.createPageConfig(enablePullDownRefresh ? (_d = runtimeHooks.createPullDownComponent) === null || _d === void 0 ? void 0 : _d.call(runtimeHooks, el, location.pathname, framework, routerConfig.PullDownRefresh) : el, pathname$1 + runtime.stringify(qs(routerIndex)), {}, loadConfig);
1675
- loadPage(page, pageConfig, routerIndex);
1779
+ var page = runtime.createPageConfig(enablePullDownRefresh ? (_d = runtimeHooks.createPullDownComponent) === null || _d === void 0 ? void 0 : _d.call(runtimeHooks, el, location.pathname, framework, routerConfig.PullDownRefresh) : el, pathname + runtime.stringify(qs(stacksIndex)), {}, loadConfig);
1780
+ return loadPage(page, pageConfig, stacksIndex);
1676
1781
  }
1677
- }, 500);
1782
+ };
1678
1783
  if (exports.history.location.pathname === '/') {
1679
- exports.history.replace(prependBasename(routes[0].path + exports.history.location.search));
1784
+ exports.history.replace(prependBasename((config.entryPagePath || ((_a = routes[0].path) === null || _a === void 0 ? void 0 : _a[0])) + exports.history.location.search));
1680
1785
  }
1681
1786
  render({ location: exports.history.location, action: r.Push });
1682
1787
  app.onShow(qs(stacks.length));