@tarojs/router 3.4.0-beta.0 → 3.4.0

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.
@@ -1,15 +1,16 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import _objectSpread from '@babel/runtime/helpers/objectSpread2';
2
3
  import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
3
4
  import _regeneratorRuntime from '@babel/runtime/regenerator';
5
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
4
6
  import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
5
7
  import _createClass from '@babel/runtime/helpers/createClass';
6
8
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
7
- import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
8
- import _objectSpread from '@babel/runtime/helpers/objectSpread2';
9
- import { requestAnimationFrame, container, SERVICE_IDENTIFIER, eventCenter, createPageConfig, stringify, Current } from '@tarojs/runtime';
9
+ import { Current, requestAnimationFrame, container, SERVICE_IDENTIFIER, createPageConfig, stringify, eventCenter } from '@tarojs/runtime';
10
10
  import _typeof from '@babel/runtime/helpers/typeof';
11
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
11
12
  import _createForOfIteratorHelper from '@babel/runtime/helpers/createForOfIteratorHelper';
12
- import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
13
+ import { initTabBarApis } from '@tarojs/taro';
13
14
 
14
15
  var r,
15
16
  B = r || (r = {});
@@ -439,10 +440,14 @@ function prependBasename() {
439
440
  var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
440
441
  return basename.replace(/\/$/, '') + '/' + url.replace(/^\//, '');
441
442
  }
442
- var hasBasename = function hasBasename(path, prefix) {
443
+ var hasBasename = function hasBasename() {
444
+ var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
445
+ var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
443
446
  return new RegExp('^' + prefix + '(\\/|\\?|#|$)', 'i').test(path);
444
447
  };
445
- var stripBasename = function stripBasename(path, prefix) {
448
+ var stripBasename = function stripBasename() {
449
+ var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
450
+ var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
446
451
  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;
447
452
  };
448
453
 
@@ -460,8 +465,10 @@ var Stacks = /*#__PURE__*/function () {
460
465
  set: function set(delta) {
461
466
  if (delta > 0) {
462
467
  this.backDelta = delta;
463
- } else {
468
+ } else if (this.backDelta > 0) {
464
469
  --this.backDelta;
470
+ } else {
471
+ this.backDelta = 0;
465
472
  }
466
473
  }
467
474
  }, {
@@ -484,25 +491,41 @@ var Stacks = /*#__PURE__*/function () {
484
491
  value: function getItem(index) {
485
492
  return this.stacks[index];
486
493
  }
494
+ }, {
495
+ key: "getLastIndex",
496
+ value: function getLastIndex(pathname) {
497
+ var stateWith = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
498
+
499
+ var list = _toConsumableArray(this.stacks).reverse();
500
+
501
+ return list.findIndex(function (page, i) {
502
+ var _page$path;
503
+
504
+ return i >= stateWith && ((_page$path = page.path) === null || _page$path === void 0 ? void 0 : _page$path.replace(/\?.*/g, '')) === pathname;
505
+ });
506
+ }
487
507
  }, {
488
508
  key: "getDelta",
489
509
  value: function getDelta(pathname) {
490
510
  if (this.backDelta >= 1) {
491
511
  return this.backDelta;
492
- } // NOTE: 此处为了修复浏览器后退多级页面,在大量重复路由状况下可能出现判断错误的情况 (增强判断能力只能考虑在 query 中新增参数来判断,暂时搁置)
493
-
512
+ }
494
513
 
495
- var prevIndex = this.stacks.findIndex(function (r) {
496
- var _r$path;
514
+ var index = this.getLastIndex(pathname); // NOTE: 此处为了修复浏览器后退多级页面,在大量重复路由状况下可能出现判断错误的情况 (增强判断能力只能考虑在 query 中新增参数来判断,暂时搁置)
497
515
 
498
- return ((_r$path = r.path) === null || _r$path === void 0 ? void 0 : _r$path.replace(/\?.*/g, '')) === pathname;
499
- });
500
- return this.length - 1 - prevIndex;
516
+ return index > 0 ? index : 1;
501
517
  }
502
518
  }, {
503
519
  key: "getPrevIndex",
504
520
  value: function getPrevIndex(pathname) {
505
- return this.length - 1 - this.getDelta(pathname);
521
+ var stateWith = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
522
+ var lastIndex = this.getLastIndex(pathname, stateWith);
523
+
524
+ if (lastIndex < 0) {
525
+ return -1;
526
+ }
527
+
528
+ return this.length - 1 - lastIndex;
506
529
  }
507
530
  }, {
508
531
  key: "pop",
@@ -521,48 +544,98 @@ var Stacks = /*#__PURE__*/function () {
521
544
 
522
545
  var stacks = new Stacks();
523
546
 
524
- var routesAlias = {};
525
- function setRoutesAlias(alias) {
526
- routesAlias = alias;
527
- }
528
547
  function addLeadingSlash(path) {
529
548
  if (path == null) {
530
549
  return '';
531
550
  }
532
551
 
533
552
  return path.charAt(0) === '/' ? path : '/' + path;
534
- } // eslint-disable-next-line @typescript-eslint/ban-types
535
- var isTabBar = function isTabBar(config) {
536
- var _Object$entries$find, _config$tabBar;
537
-
538
- var _config$router = config.router,
539
- _config$router$custom = _config$router.customRoutes,
540
- customRoutes = _config$router$custom === void 0 ? {} : _config$router$custom,
541
- _config$router$basena = _config$router.basename,
542
- basename = _config$router$basena === void 0 ? '' : _config$router$basena,
543
- pathname = _config$router.pathname;
544
- var routePath = stripBasename(pathname, basename);
545
- var pagePath = ((_Object$entries$find = Object.entries(customRoutes).find(function (_ref) {
546
- var _ref2 = _slicedToArray(_ref, 2),
547
- target = _ref2[1];
548
-
549
- return target === routePath;
550
- })) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0]) || routePath;
551
- return !!pagePath && (((_config$tabBar = config.tabBar) === null || _config$tabBar === void 0 ? void 0 : _config$tabBar.list) || []).some(function (t) {
552
- return t.pagePath === pagePath;
553
- });
554
- };
553
+ }
554
+
555
+ var RoutesAlias = /*#__PURE__*/function () {
556
+ function RoutesAlias() {
557
+ var _this = this;
558
+
559
+ _classCallCheck(this, RoutesAlias);
560
+
561
+ _defineProperty(this, "conf", []);
562
+
563
+ _defineProperty(this, "getConfig", function () {
564
+ var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
565
+
566
+ var customRoute = _this.conf.filter(function (arr) {
567
+ return arr.includes(url);
568
+ });
569
+
570
+ return customRoute[0];
571
+ });
572
+
573
+ _defineProperty(this, "getOrigin", function () {
574
+ var _this$getConfig;
575
+
576
+ var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
577
+ return ((_this$getConfig = _this.getConfig(url)) === null || _this$getConfig === void 0 ? void 0 : _this$getConfig[0]) || url;
578
+ });
579
+
580
+ _defineProperty(this, "getAlias", function () {
581
+ var _this$getConfig2;
582
+
583
+ var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
584
+ return ((_this$getConfig2 = _this.getConfig(url)) === null || _this$getConfig2 === void 0 ? void 0 : _this$getConfig2[1]) || url;
585
+ });
586
+
587
+ _defineProperty(this, "getAll", function () {
588
+ var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
589
+ return _this.conf.filter(function (arr) {
590
+ return arr.includes(url);
591
+ }).reduce(function (p, a) {
592
+ p.push(a[1]);
593
+ return p;
594
+ }, [url]);
595
+ });
596
+ }
597
+
598
+ _createClass(RoutesAlias, [{
599
+ key: "set",
600
+ value: function set() {
601
+ var _this2 = this;
602
+
603
+ var customRoutes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
604
+
605
+ var _loop = function _loop(_key) {
606
+ var path = customRoutes[_key];
607
+ _key = addLeadingSlash(_key);
608
+
609
+ if (typeof path === 'string') {
610
+ _this2.conf.push([_key, addLeadingSlash(path)]);
611
+ } else if ((path === null || path === void 0 ? void 0 : path.length) > 0) {
612
+ var _this2$conf;
613
+
614
+ (_this2$conf = _this2.conf).push.apply(_this2$conf, _toConsumableArray(path.map(function (p) {
615
+ return [_key, addLeadingSlash(p)];
616
+ })));
617
+ }
618
+
619
+ key = _key;
620
+ };
621
+
622
+ for (var key in customRoutes) {
623
+ _loop(key);
624
+ }
625
+ }
626
+ }]);
627
+
628
+ return RoutesAlias;
629
+ }();
630
+
631
+ var routesAlias = new RoutesAlias();
555
632
 
556
633
  function processNavigateUrl(option) {
557
634
  var _pathPieces$pathname;
558
635
 
559
636
  var pathPieces = J(option.url); // 处理自定义路由
560
637
 
561
- Object.keys(routesAlias).forEach(function (key) {
562
- if (addLeadingSlash(key) === addLeadingSlash(pathPieces.pathname)) {
563
- pathPieces.pathname = routesAlias[key];
564
- }
565
- }); // 处理相对路径
638
+ pathPieces.pathname = routesAlias.getAlias(addLeadingSlash(pathPieces.pathname)); // 处理相对路径
566
639
 
567
640
  if (pathPieces !== null && pathPieces !== void 0 && (_pathPieces$pathname = pathPieces.pathname) !== null && _pathPieces$pathname !== void 0 && _pathPieces$pathname.includes('./')) {
568
641
  var parts = history.location.pathname.split('/');
@@ -599,9 +672,12 @@ function _navigate() {
599
672
  complete = option.complete,
600
673
  fail = option.fail;
601
674
  var unListen = history.listen(function () {
602
- success === null || success === void 0 ? void 0 : success();
603
- complete === null || complete === void 0 ? void 0 : complete();
604
- resolve();
675
+ var res = {
676
+ errMsg: "".concat(method, ":ok")
677
+ };
678
+ success === null || success === void 0 ? void 0 : success(res);
679
+ complete === null || complete === void 0 ? void 0 : complete(res);
680
+ resolve(res);
605
681
  unListen();
606
682
  });
607
683
 
@@ -614,7 +690,10 @@ function _navigate() {
614
690
 
615
691
  if (method === 'navigateTo') {
616
692
  history.push(pathPieces, state);
617
- } else if (method === 'redirectTo') {
693
+ } else if (method === 'redirectTo' || method === 'switchTab') {
694
+ history.replace(pathPieces, state);
695
+ } else if (method === 'reLaunch') {
696
+ stacks.delta = stacks.length;
618
697
  history.replace(pathPieces, state);
619
698
  }
620
699
  } else if (method === 'navigateBack') {
@@ -622,9 +701,12 @@ function _navigate() {
622
701
  history.go(-option.delta);
623
702
  }
624
703
  } catch (error) {
625
- fail === null || fail === void 0 ? void 0 : fail(error);
626
- complete === null || complete === void 0 ? void 0 : complete();
627
- reject(error);
704
+ var res = {
705
+ errMsg: "".concat(method, ":fail ").concat(error.message || error)
706
+ };
707
+ fail === null || fail === void 0 ? void 0 : fail(res);
708
+ complete === null || complete === void 0 ? void 0 : complete(res);
709
+ reject(res);
628
710
  }
629
711
  }));
630
712
 
@@ -656,15 +738,18 @@ function navigateBack() {
656
738
  return navigate(options, 'navigateBack');
657
739
  }
658
740
  function switchTab(option) {
659
- // TODO: 清除掉所有的栈去目标页面
660
- return redirectTo(option);
741
+ return navigate(option, 'switchTab');
661
742
  }
662
743
  function reLaunch(option) {
663
- // TODO: 清除掉所有的栈去目标页面
664
- return redirectTo(option);
744
+ return navigate(option, 'reLaunch');
665
745
  }
666
746
  function getCurrentPages() {
667
- return stacks.get();
747
+ var pages = stacks.get();
748
+ return pages.map(function (e) {
749
+ return _objectSpread(_objectSpread({}, e), {}, {
750
+ route: e.path || ''
751
+ });
752
+ });
668
753
  }
669
754
 
670
755
  var pathToRegexp$2 = {exports: {}};
@@ -1297,117 +1382,6 @@ var UniversalRouter = function () {
1297
1382
 
1298
1383
  UniversalRouter.pathToRegexp = pathToRegexp$1;
1299
1384
 
1300
- var Taro = require('@tarojs/taro-h5');
1301
-
1302
- function initTabbar(config) {
1303
- if (config.tabBar == null) {
1304
- return;
1305
- } // TODO: 找到 tabbar 的类型
1306
-
1307
-
1308
- var tabbar = document.createElement('taro-tabbar');
1309
- var homePage = config.pages ? config.pages[0] : '';
1310
- tabbar.conf = config.tabBar;
1311
- tabbar.conf.homePage = history.location.pathname === '/' ? homePage : history.location.pathname;
1312
- var routerConfig = config.router;
1313
- tabbar.conf.mode = routerConfig && routerConfig.mode ? routerConfig.mode : 'hash';
1314
-
1315
- if (routerConfig.customRoutes) {
1316
- tabbar.conf.custom = true;
1317
- tabbar.conf.customRoutes = routerConfig.customRoutes;
1318
- } else {
1319
- tabbar.conf.custom = false;
1320
- tabbar.conf.customRoutes = {};
1321
- }
1322
-
1323
- if (typeof routerConfig.basename !== 'undefined') {
1324
- tabbar.conf.basename = routerConfig.basename;
1325
- }
1326
-
1327
- var container = document.getElementById('container'); // eslint-disable-next-line no-unused-expressions
1328
-
1329
- container === null || container === void 0 ? void 0 : container.appendChild(tabbar);
1330
- Taro.initTabBarApis(config);
1331
- }
1332
-
1333
- var routerConfig = Object.create(null);
1334
- function init(config) {
1335
- var _document$getElementB;
1336
-
1337
- config.router.mode = config.router.mode || 'hash';
1338
- setHistoryMode(config.router.mode, config.router.basename);
1339
- Object.assign(routerConfig, config);
1340
- (_document$getElementB = document.getElementById('app')) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove();
1341
- var container = document.createElement('div');
1342
- container.classList.add('taro-tabbar__container');
1343
- container.id = 'container';
1344
- var panel = document.createElement('div');
1345
- panel.classList.add('taro-tabbar__panel');
1346
- var app = document.createElement('div');
1347
- app.id = 'app';
1348
- app.classList.add('taro_router');
1349
- panel.appendChild(app);
1350
- container.appendChild(panel);
1351
- document.body.appendChild(container);
1352
- initTabbar(config);
1353
- }
1354
-
1355
- var pageScrollFn;
1356
- var pageDOM = window;
1357
- function bindPageScroll(page, config) {
1358
- pageDOM.removeEventListener('scroll', pageScrollFn);
1359
- pageDOM = getScrollContainer();
1360
- var distance = config.onReachBottomDistance || 50;
1361
- var isReachBottom = false;
1362
-
1363
- pageScrollFn = function pageScrollFn() {
1364
- page.onPageScroll && page.onPageScroll({
1365
- scrollTop: pageDOM instanceof Window ? window.scrollY : pageDOM.scrollTop
1366
- });
1367
-
1368
- if (isReachBottom && getOffset() > distance) {
1369
- isReachBottom = false;
1370
- }
1371
-
1372
- if (page.onReachBottom && !isReachBottom && getOffset() < distance) {
1373
- isReachBottom = true;
1374
- page.onReachBottom();
1375
- }
1376
- };
1377
-
1378
- pageDOM.addEventListener('scroll', pageScrollFn, false);
1379
- }
1380
- window.addEventListener('DOMSubtreeModified', function (e) {
1381
- var _e$target;
1382
-
1383
- // @ts-ignore
1384
- var className = (_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target.className;
1385
-
1386
- if (className && /taro-tabbar__/.test(className)) {
1387
- pageDOM.removeEventListener('scroll', pageScrollFn);
1388
- pageDOM = getScrollContainer();
1389
- pageDOM.addEventListener('scroll', pageScrollFn, false);
1390
- }
1391
- }, false);
1392
-
1393
- function getScrollContainer() {
1394
- if (document.querySelector('.taro-tabbar__tabbar') === null) {
1395
- // 没设置tabbar
1396
- return window;
1397
- } else {
1398
- // 有设置tabbar
1399
- return document.querySelector('.taro-tabbar__panel') || window;
1400
- }
1401
- }
1402
-
1403
- function getOffset() {
1404
- if (pageDOM instanceof Window) {
1405
- return document.documentElement.scrollHeight - window.scrollY - window.innerHeight;
1406
- } else {
1407
- return pageDOM.scrollHeight - pageDOM.scrollTop - pageDOM.clientHeight;
1408
- }
1409
- }
1410
-
1411
1385
  var queryString = {};
1412
1386
 
1413
1387
  var strictUriEncode = function strictUriEncode(str) {
@@ -1972,147 +1946,540 @@ var filterObj = function filterObj(obj, predicate) {
1972
1946
  };
1973
1947
  })(queryString);
1974
1948
 
1975
- function getSearch() {
1976
- var search = '?';
1949
+ var pageScrollFn;
1950
+ var pageDOM = window;
1951
+ function bindPageScroll(page, pageEl, config) {
1952
+ pageEl.removeEventListener('scroll', pageScrollFn);
1953
+ pageDOM = pageEl;
1954
+ var distance = config.onReachBottomDistance || 50;
1955
+ var isReachBottom = false;
1977
1956
 
1978
- if (routerConfig.router.mode === 'hash') {
1979
- var idx = location.hash.indexOf('?');
1957
+ pageScrollFn = function pageScrollFn() {
1958
+ page.onPageScroll && page.onPageScroll({
1959
+ scrollTop: pageDOM instanceof Window ? window.scrollY : pageDOM.scrollTop
1960
+ });
1980
1961
 
1981
- if (idx > -1) {
1982
- search = location.hash.slice(idx);
1962
+ if (isReachBottom && getOffset() > distance) {
1963
+ isReachBottom = false;
1983
1964
  }
1965
+
1966
+ if (page.onReachBottom && !isReachBottom && getOffset() < distance) {
1967
+ isReachBottom = true;
1968
+ page.onReachBottom();
1969
+ }
1970
+ };
1971
+
1972
+ pageDOM.addEventListener('scroll', pageScrollFn, false);
1973
+ }
1974
+
1975
+ function getOffset() {
1976
+ if (pageDOM instanceof Window) {
1977
+ return document.documentElement.scrollHeight - window.scrollY - window.innerHeight;
1984
1978
  } else {
1985
- search = location.search;
1979
+ return pageDOM.scrollHeight - pageDOM.scrollTop - pageDOM.clientHeight;
1986
1980
  }
1981
+ }
1982
+
1983
+ var pageResizeFn;
1984
+ function bindPageResize(page) {
1985
+ window.removeEventListener('resize', pageResizeFn);
1987
1986
 
1988
- return search.substr(1);
1987
+ pageResizeFn = function pageResizeFn() {
1988
+ page.onResize && page.onResize({
1989
+ size: {
1990
+ windowHeight: window.innerHeight,
1991
+ windowWidth: window.innerWidth
1992
+ }
1993
+ });
1994
+ };
1995
+
1996
+ window.addEventListener('resize', pageResizeFn, false);
1989
1997
  }
1990
1998
 
1991
- var qs = function qs() {
1992
- var stamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
1993
- var search = getSearch();
1994
- var query = search ? queryString.parse(search) : {};
1999
+ function bindPageEvents(page, pageEl) {
2000
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1995
2001
 
1996
- if (stamp) {
1997
- query.stamp = stamp.toString();
2002
+ if (!pageEl) {
2003
+ pageEl = getPageContainer();
1998
2004
  }
1999
2005
 
2000
- return query;
2001
- };
2006
+ bindPageScroll(page, pageEl, config);
2007
+ bindPageResize(page);
2008
+ }
2002
2009
 
2003
- /* eslint-disable dot-notation */
2004
- function pageOnReady(page) {
2005
- var onLoad = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
2006
- var pageEl = document.getElementById(page.path);
2010
+ function getPageContainer() {
2011
+ var _Current$page;
2007
2012
 
2008
- if (pageEl && !(pageEl !== null && pageEl !== void 0 && pageEl['__isReady'])) {
2009
- var _el$componentOnReady;
2013
+ var id = (_Current$page = Current.page) === null || _Current$page === void 0 ? void 0 : _Current$page.path;
2014
+ var el = id ? document.getElementById(id) : document.querySelector('.taro_page') || document.querySelector('.taro_router');
2015
+ return el || window;
2016
+ }
2010
2017
 
2011
- var el = pageEl.firstElementChild;
2012
- el === null || el === void 0 ? void 0 : (_el$componentOnReady = el['componentOnReady']) === null || _el$componentOnReady === void 0 ? void 0 : _el$componentOnReady.call(el).then(function () {
2013
- requestAnimationFrame(function () {
2014
- page.onReady();
2015
- pageEl['__isReady'] = true;
2016
- });
2017
- });
2018
- onLoad && (pageEl['__page'] = page);
2019
- }
2018
+ /**
2019
+ * 插入页面动画需要的样式
2020
+ */
2021
+ function loadAnimateStyle() {
2022
+ var ms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 300;
2023
+ var css = "\n.taro_router .taro_page {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: #fff;\n transform: translate(100%, 0);\n transition: transform ".concat(ms, "ms;\n}\n\n.taro_router .taro_page.taro_tabbar_page,\n.taro_router .taro_page.taro_page_show.taro_page_stationed {\n transform: none;\n}\n\n.taro_router .taro_page.taro_page_show {\n transform: translate(0, 0);\n}");
2024
+ var style = document.createElement('style');
2025
+ style.innerHTML = css;
2026
+ document.getElementsByTagName('head')[0].appendChild(style);
2020
2027
  }
2021
- function loadPage(page) {
2022
- var pageConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2023
- var stacksIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2024
- if (!page) return;
2025
- var pageEl = document.getElementById(page.path);
2026
-
2027
- if (pageEl) {
2028
- pageEl.style.display = 'block';
2028
+
2029
+ // @ts-nocheck
2030
+ function initTabbar(config) {
2031
+ if (config.tabBar == null) {
2032
+ return;
2033
+ } // TODO: custom-tab-bar
2034
+
2035
+
2036
+ var tabbar = document.createElement('taro-tabbar');
2037
+ var homePage = config.entryPagePath || (config.pages ? config.pages[0] : '');
2038
+ tabbar.conf = config.tabBar;
2039
+ tabbar.conf.homePage = history.location.pathname === '/' ? homePage : history.location.pathname;
2040
+ var routerConfig = config.router;
2041
+ tabbar.conf.mode = routerConfig && routerConfig.mode ? routerConfig.mode : 'hash';
2042
+
2043
+ if (routerConfig.customRoutes) {
2044
+ tabbar.conf.custom = true;
2045
+ tabbar.conf.customRoutes = routerConfig.customRoutes;
2029
2046
  } else {
2030
- page.onLoad(qs(stacksIndex), function () {
2031
- return pageOnReady(page, true);
2032
- });
2047
+ tabbar.conf.custom = false;
2048
+ tabbar.conf.customRoutes = {};
2033
2049
  }
2034
2050
 
2035
- stacks.push(page);
2036
- page.onShow();
2037
- bindPageScroll(page, pageConfig);
2038
- }
2039
- function unloadPage(page) {
2040
- var delta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
2041
- if (!page) return;
2042
- stacks.delta = --delta;
2043
- stacks.pop();
2044
- page.onUnload();
2045
- if (delta >= 1) unloadPage(stacks.last, delta);
2046
- }
2047
- function showPage(page) {
2048
- var pageConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2049
- var stacksIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2050
- if (!page) return;
2051
- page.onShow();
2052
- var pageEl = document.getElementById(page.path);
2053
-
2054
- if (pageEl) {
2055
- pageEl.style.display = 'block';
2056
- } else {
2057
- page.onLoad(qs(stacksIndex), function () {
2058
- return pageOnReady(page, false);
2059
- });
2051
+ if (typeof routerConfig.basename !== 'undefined') {
2052
+ tabbar.conf.basename = routerConfig.basename;
2060
2053
  }
2061
2054
 
2062
- bindPageScroll(page, pageConfig);
2055
+ var container = document.getElementById('container');
2056
+ container === null || container === void 0 ? void 0 : container.appendChild(tabbar);
2057
+ initTabBarApis(config);
2063
2058
  }
2064
- function hidePage(page) {
2065
- if (!page) return; // NOTE: 修复多页并发问题,此处可能因为路由跳转过快,执行时页面可能还没有创建成功
2066
2059
 
2067
- var pageEl = document.getElementById(page.path);
2060
+ function setDisplay(el) {
2061
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2068
2062
 
2069
- if (pageEl) {
2070
- pageEl.style.display = 'none';
2071
- page.onHide();
2072
- } else {
2073
- setTimeout(function () {
2074
- return hidePage(page);
2075
- }, 0);
2063
+ if (el) {
2064
+ el.style.display = type;
2076
2065
  }
2077
2066
  }
2078
2067
 
2079
- function createRouter(app, config, framework) {
2080
- var _config$router$custom;
2068
+ var PageHandler = /*#__PURE__*/function () {
2069
+ function PageHandler(config) {
2070
+ _classCallCheck(this, PageHandler);
2081
2071
 
2082
- init(config);
2083
- var routes = [];
2084
- var alias = (_config$router$custom = config.router.customRoutes) !== null && _config$router$custom !== void 0 ? _config$router$custom : {};
2085
- var runtimeHooks = container.get(SERVICE_IDENTIFIER.Hooks);
2086
- setRoutesAlias(alias);
2072
+ _defineProperty(this, "config", void 0);
2087
2073
 
2088
- for (var i = 0; i < config.routes.length; i++) {
2089
- var route = config.routes[i];
2090
- var path = addLeadingSlash(route.path);
2091
- routes.push({
2092
- path: alias[path] || path,
2093
- action: route.load
2074
+ _defineProperty(this, "defaultAnimation", {
2075
+ duration: 300,
2076
+ delay: 50
2094
2077
  });
2078
+
2079
+ _defineProperty(this, "unloadTimer", void 0);
2080
+
2081
+ _defineProperty(this, "hideTimer", void 0);
2082
+
2083
+ _defineProperty(this, "lastHidePage", void 0);
2084
+
2085
+ _defineProperty(this, "lastUnloadPage", void 0);
2086
+
2087
+ this.config = config;
2088
+ this.mount();
2095
2089
  }
2096
2090
 
2097
- var basename = config.router.basename;
2091
+ _createClass(PageHandler, [{
2092
+ key: "appId",
2093
+ get: function get() {
2094
+ return 'app';
2095
+ }
2096
+ }, {
2097
+ key: "router",
2098
+ get: function get() {
2099
+ return this.config.router;
2100
+ }
2101
+ }, {
2102
+ key: "routerMode",
2103
+ get: function get() {
2104
+ return this.router.mode || 'hash';
2105
+ }
2106
+ }, {
2107
+ key: "customRoutes",
2108
+ get: function get() {
2109
+ return this.router.customRoutes || {};
2110
+ }
2111
+ }, {
2112
+ key: "routes",
2113
+ get: function get() {
2114
+ return this.config.routes;
2115
+ }
2116
+ }, {
2117
+ key: "tabBarList",
2118
+ get: function get() {
2119
+ var _this$config$tabBar;
2120
+
2121
+ return ((_this$config$tabBar = this.config.tabBar) === null || _this$config$tabBar === void 0 ? void 0 : _this$config$tabBar.list) || [];
2122
+ }
2123
+ }, {
2124
+ key: "PullDownRefresh",
2125
+ get: function get() {
2126
+ return this.config.PullDownRefresh;
2127
+ }
2128
+ }, {
2129
+ key: "animation",
2130
+ get: function get() {
2131
+ var _this$config$animatio, _this$config;
2132
+
2133
+ return (_this$config$animatio = (_this$config = this.config) === null || _this$config === void 0 ? void 0 : _this$config.animation) !== null && _this$config$animatio !== void 0 ? _this$config$animatio : this.defaultAnimation;
2134
+ }
2135
+ }, {
2136
+ key: "animationDelay",
2137
+ get: function get() {
2138
+ var _this$defaultAnimatio;
2139
+
2140
+ return (_typeof(this.animation) === 'object' ? this.animation.delay : this.animation ? (_this$defaultAnimatio = this.defaultAnimation) === null || _this$defaultAnimatio === void 0 ? void 0 : _this$defaultAnimatio.delay : 0) || 0;
2141
+ }
2142
+ }, {
2143
+ key: "animationDuration",
2144
+ get: function get() {
2145
+ var _this$defaultAnimatio2;
2146
+
2147
+ return (_typeof(this.animation) === 'object' ? this.animation.duration : this.animation ? (_this$defaultAnimatio2 = this.defaultAnimation) === null || _this$defaultAnimatio2 === void 0 ? void 0 : _this$defaultAnimatio2.duration : 0) || 0;
2148
+ }
2149
+ }, {
2150
+ key: "pathname",
2151
+ get: function get() {
2152
+ return this.router.pathname;
2153
+ },
2154
+ set: function set(p) {
2155
+ this.router.pathname = p;
2156
+ }
2157
+ }, {
2158
+ key: "basename",
2159
+ get: function get() {
2160
+ return this.router.basename || '';
2161
+ }
2162
+ }, {
2163
+ key: "pageConfig",
2164
+ get: function get() {
2165
+ var _this = this;
2166
+
2167
+ return this.routes.find(function (r) {
2168
+ var _routesAlias$getConfi;
2169
+
2170
+ var routePath = stripBasename(_this.pathname, _this.basename);
2171
+ var pagePath = addLeadingSlash(r.path);
2172
+ return pagePath === routePath || ((_routesAlias$getConfi = routesAlias.getConfig(pagePath)) === null || _routesAlias$getConfi === void 0 ? void 0 : _routesAlias$getConfi.includes(routePath));
2173
+ });
2174
+ }
2175
+ }, {
2176
+ key: "isTabBar",
2177
+ get: function get() {
2178
+ var _Object$entries$find;
2179
+
2180
+ var routePath = stripBasename(this.pathname, this.basename);
2181
+ var pagePath = ((_Object$entries$find = Object.entries(this.customRoutes).find(function (_ref) {
2182
+ var _ref2 = _slicedToArray(_ref, 2),
2183
+ target = _ref2[1];
2184
+
2185
+ if (typeof target === 'string') {
2186
+ return target === routePath;
2187
+ } else if ((target === null || target === void 0 ? void 0 : target.length) > 0) {
2188
+ return target.includes(routePath);
2189
+ }
2190
+
2191
+ return false;
2192
+ })) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0]) || routePath;
2193
+ return !!pagePath && this.tabBarList.some(function (t) {
2194
+ return t.pagePath === pagePath;
2195
+ });
2196
+ }
2197
+ }, {
2198
+ key: "isSamePage",
2199
+ value: function isSamePage(page) {
2200
+ var routePath = stripBasename(this.pathname, this.basename);
2201
+ var pagePath = stripBasename(page === null || page === void 0 ? void 0 : page.path, this.basename);
2202
+ return pagePath.startsWith(routePath + '?');
2203
+ }
2204
+ }, {
2205
+ key: "search",
2206
+ get: function get() {
2207
+ var search = '?';
2208
+
2209
+ if (this.routerMode === 'hash') {
2210
+ var idx = location.hash.indexOf('?');
2211
+
2212
+ if (idx > -1) {
2213
+ search = location.hash.slice(idx);
2214
+ }
2215
+ } else {
2216
+ search = location.search;
2217
+ }
2218
+
2219
+ return search.substr(1);
2220
+ }
2221
+ }, {
2222
+ key: "getQuery",
2223
+ value: function getQuery() {
2224
+ var stamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
2225
+ var search = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2226
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
2227
+ search = search ? "".concat(search, "&").concat(this.search) : this.search;
2228
+ var query = search ? queryString.parse(search) : {};
2229
+ query.stamp = stamp.toString();
2230
+ return _objectSpread(_objectSpread({}, query), options);
2231
+ }
2232
+ }, {
2233
+ key: "mount",
2234
+ value: function mount() {
2235
+ var _document$getElementB;
2236
+
2237
+ setHistoryMode(this.routerMode, this.router.basename);
2238
+ (_document$getElementB = document.getElementById('app')) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove();
2239
+ this.animation && loadAnimateStyle(this.animationDuration);
2240
+ var app = document.createElement('div');
2241
+ app.id = this.appId;
2242
+ app.classList.add('taro_router');
2243
+
2244
+ if (this.tabBarList.length > 1) {
2245
+ var container = document.createElement('div');
2246
+ container.classList.add('taro-tabbar__container');
2247
+ container.id = 'container';
2248
+ var panel = document.createElement('div');
2249
+ panel.classList.add('taro-tabbar__panel');
2250
+ panel.appendChild(app);
2251
+ container.appendChild(panel);
2252
+ document.body.appendChild(container);
2253
+ initTabbar(this.config);
2254
+ } else {
2255
+ document.body.appendChild(app);
2256
+ }
2257
+ }
2258
+ }, {
2259
+ key: "onReady",
2260
+ value: function onReady(page) {
2261
+ var onLoad = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
2262
+ var pageEl = document.getElementById(page.path);
2263
+
2264
+ if (pageEl && !(pageEl !== null && pageEl !== void 0 && pageEl['__isReady'])) {
2265
+ var _el$componentOnReady, _el$componentOnReady$;
2266
+
2267
+ var el = pageEl.firstElementChild;
2268
+ el === null || el === void 0 ? void 0 : (_el$componentOnReady = el['componentOnReady']) === null || _el$componentOnReady === void 0 ? void 0 : (_el$componentOnReady$ = _el$componentOnReady.call(el)) === null || _el$componentOnReady$ === void 0 ? void 0 : _el$componentOnReady$.then(function () {
2269
+ requestAnimationFrame(function () {
2270
+ var _page$onReady;
2271
+
2272
+ (_page$onReady = page.onReady) === null || _page$onReady === void 0 ? void 0 : _page$onReady.call(page);
2273
+ pageEl['__isReady'] = true;
2274
+ });
2275
+ });
2276
+ onLoad && (pageEl['__page'] = page);
2277
+ }
2278
+ }
2279
+ }, {
2280
+ key: "load",
2281
+ value: function load(page) {
2282
+ var _this2 = this;
2283
+
2284
+ var pageConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2285
+ var stacksIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2286
+ if (!page) return; // NOTE: 页面栈推入太晚可能导致 getCurrentPages 无法获取到当前页面实例
2287
+
2288
+ stacks.push(page);
2289
+ var param = this.getQuery(stacks.length, '', page.options);
2290
+ var pageEl = document.getElementById(page.path);
2291
+
2292
+ if (pageEl) {
2293
+ var _page$onShow;
2294
+
2295
+ setDisplay(pageEl);
2296
+ this.isTabBar && pageEl.classList.add('taro_tabbar_page');
2297
+ this.addAnimation(pageEl, stacksIndex === 0);
2298
+ (_page$onShow = page.onShow) === null || _page$onShow === void 0 ? void 0 : _page$onShow.call(page);
2299
+ bindPageEvents(page, pageEl, pageConfig);
2300
+ } else {
2301
+ var _page$onLoad;
2302
+
2303
+ (_page$onLoad = page.onLoad) === null || _page$onLoad === void 0 ? void 0 : _page$onLoad.call(page, param, function () {
2304
+ var _pageEl, _page$onShow2;
2305
+
2306
+ pageEl = document.getElementById(page.path);
2307
+ _this2.isTabBar && ((_pageEl = pageEl) === null || _pageEl === void 0 ? void 0 : _pageEl.classList.add('taro_tabbar_page'));
2308
+
2309
+ _this2.addAnimation(pageEl, stacksIndex === 0);
2310
+
2311
+ _this2.onReady(page, true);
2312
+
2313
+ (_page$onShow2 = page.onShow) === null || _page$onShow2 === void 0 ? void 0 : _page$onShow2.call(page);
2314
+ bindPageEvents(page, pageEl, pageConfig);
2315
+ });
2316
+ }
2317
+ }
2318
+ }, {
2319
+ key: "unload",
2320
+ value: function unload(page) {
2321
+ var _this3 = this;
2322
+
2323
+ var delta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
2324
+ var top = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2325
+ if (!page) return;
2326
+ stacks.delta = --delta;
2327
+ stacks.pop();
2328
+
2329
+ if (this.animation && top) {
2330
+ if (this.unloadTimer) {
2331
+ var _this$lastUnloadPage, _this$lastUnloadPage$;
2332
+
2333
+ clearTimeout(this.unloadTimer);
2334
+ (_this$lastUnloadPage = this.lastUnloadPage) === null || _this$lastUnloadPage === void 0 ? void 0 : (_this$lastUnloadPage$ = _this$lastUnloadPage.onUnload) === null || _this$lastUnloadPage$ === void 0 ? void 0 : _this$lastUnloadPage$.call(_this$lastUnloadPage);
2335
+ this.unloadTimer = null;
2336
+ }
2337
+
2338
+ this.lastUnloadPage = page;
2339
+ var pageEl = document.getElementById(page.path);
2340
+ pageEl === null || pageEl === void 0 ? void 0 : pageEl.classList.remove('taro_page_stationed');
2341
+ pageEl === null || pageEl === void 0 ? void 0 : pageEl.classList.remove('taro_page_show');
2342
+ this.unloadTimer = setTimeout(function () {
2343
+ var _this3$lastUnloadPage, _this3$lastUnloadPage2;
2344
+
2345
+ _this3.unloadTimer = null;
2346
+ (_this3$lastUnloadPage = _this3.lastUnloadPage) === null || _this3$lastUnloadPage === void 0 ? void 0 : (_this3$lastUnloadPage2 = _this3$lastUnloadPage.onUnload) === null || _this3$lastUnloadPage2 === void 0 ? void 0 : _this3$lastUnloadPage2.call(_this3$lastUnloadPage);
2347
+ }, this.animationDuration);
2348
+ } else {
2349
+ var _page$onUnload;
2350
+
2351
+ var _pageEl2 = document.getElementById(page.path);
2352
+
2353
+ _pageEl2 === null || _pageEl2 === void 0 ? void 0 : _pageEl2.classList.remove('taro_page_stationed');
2354
+ _pageEl2 === null || _pageEl2 === void 0 ? void 0 : _pageEl2.classList.remove('taro_page_show');
2355
+ page === null || page === void 0 ? void 0 : (_page$onUnload = page.onUnload) === null || _page$onUnload === void 0 ? void 0 : _page$onUnload.call(page);
2356
+ }
2357
+
2358
+ if (delta >= 1) this.unload(stacks.last, delta);
2359
+ }
2360
+ }, {
2361
+ key: "show",
2362
+ value: function show(page) {
2363
+ var _this4 = this;
2364
+
2365
+ var pageConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2366
+ var stacksIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
2367
+ if (!page) return;
2368
+ var param = this.getQuery(stacks.length, '', page.options);
2369
+ var pageEl = document.getElementById(page.path);
2370
+
2371
+ if (pageEl) {
2372
+ var _page$onShow3;
2373
+
2374
+ setDisplay(pageEl);
2375
+ this.addAnimation(pageEl, stacksIndex === 0);
2376
+ (_page$onShow3 = page.onShow) === null || _page$onShow3 === void 0 ? void 0 : _page$onShow3.call(page);
2377
+ bindPageEvents(page, pageEl, pageConfig);
2378
+ } else {
2379
+ var _page$onLoad2;
2380
+
2381
+ (_page$onLoad2 = page.onLoad) === null || _page$onLoad2 === void 0 ? void 0 : _page$onLoad2.call(page, param, function () {
2382
+ var _page$onShow4;
2383
+
2384
+ pageEl = document.getElementById(page.path);
2385
+
2386
+ _this4.addAnimation(pageEl, stacksIndex === 0);
2387
+
2388
+ _this4.onReady(page, false);
2389
+
2390
+ (_page$onShow4 = page.onShow) === null || _page$onShow4 === void 0 ? void 0 : _page$onShow4.call(page);
2391
+ bindPageEvents(page, pageEl, pageConfig);
2392
+ });
2393
+ }
2394
+ }
2395
+ }, {
2396
+ key: "hide",
2397
+ value: function hide(page) {
2398
+ var _this5 = this;
2399
+
2400
+ if (!page) return; // NOTE: 修复多页并发问题,此处可能因为路由跳转过快,执行时页面可能还没有创建成功
2401
+
2402
+ var pageEl = document.getElementById(page.path);
2403
+
2404
+ if (pageEl) {
2405
+ var _page$onHide;
2406
+
2407
+ if (this.hideTimer) {
2408
+ clearTimeout(this.hideTimer);
2409
+ this.hideTimer = null;
2410
+ setDisplay(this.lastHidePage, 'none');
2411
+ }
2412
+
2413
+ this.lastHidePage = pageEl;
2414
+ this.hideTimer = setTimeout(function () {
2415
+ _this5.hideTimer = null;
2416
+ setDisplay(_this5.lastHidePage, 'none');
2417
+ }, this.animationDuration + this.animationDelay);
2418
+ (_page$onHide = page.onHide) === null || _page$onHide === void 0 ? void 0 : _page$onHide.call(page);
2419
+ } else {
2420
+ setTimeout(function () {
2421
+ return _this5.hide(page);
2422
+ }, 0);
2423
+ }
2424
+ }
2425
+ }, {
2426
+ key: "addAnimation",
2427
+ value: function addAnimation(pageEl) {
2428
+ var _this6 = this;
2429
+
2430
+ var first = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2431
+ if (!pageEl) return;
2432
+
2433
+ if (this.animation && !first) {
2434
+ setTimeout(function () {
2435
+ pageEl.classList.add('taro_page_show');
2436
+ setTimeout(function () {
2437
+ pageEl.classList.add('taro_page_stationed');
2438
+ }, _this6.animationDuration);
2439
+ }, this.animationDelay);
2440
+ } else {
2441
+ pageEl.classList.add('taro_page_show');
2442
+ pageEl.classList.add('taro_page_stationed');
2443
+ }
2444
+ }
2445
+ }]);
2446
+
2447
+ return PageHandler;
2448
+ }();
2449
+
2450
+ function createRouter(app, config, framework) {
2451
+ var _routes$0$path, _app$onLaunch, _app$onShow;
2452
+
2453
+ var handler = new PageHandler(config);
2454
+ var runtimeHooks = container.get(SERVICE_IDENTIFIER.Hooks);
2455
+ routesAlias.set(handler.router.customRoutes);
2456
+ var basename = handler.router.basename;
2457
+ var routes = handler.routes.map(function (route) {
2458
+ return {
2459
+ path: routesAlias.getAll(addLeadingSlash(route.path)),
2460
+ action: route.load
2461
+ };
2462
+ });
2463
+ var entryPagePath = config.entryPagePath || ((_routes$0$path = routes[0].path) === null || _routes$0$path === void 0 ? void 0 : _routes$0$path[0]);
2098
2464
  var router = new UniversalRouter(routes, {
2099
2465
  baseUrl: basename || ''
2100
2466
  });
2101
- app.onLaunch();
2467
+ var launchParam = handler.getQuery(stacks.length);
2468
+ (_app$onLaunch = app.onLaunch) === null || _app$onLaunch === void 0 ? void 0 : _app$onLaunch.call(app, launchParam);
2102
2469
 
2103
2470
  var render = /*#__PURE__*/function () {
2104
2471
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) {
2105
- var location, action, element, _app$onPageNotFound, pageConfig, enablePullDownRefresh, _pageConfig$navigatio, currentPage, pathname, shouldLoad, prevIndex, delta, _prevIndex, _element$default, _runtimeHooks$createP, el, loadConfig, stacksIndex, page;
2472
+ var location, action, element, _app$onPageNotFound, pageConfig, enablePullDownRefresh, _pageConfig$navigatio, currentPage, pathname, shouldLoad, prevIndex, delta, _prevIndex, _delta, _element$default, _runtimeHooks$createP, el, loadConfig, stacksIndex, page;
2106
2473
 
2107
2474
  return _regeneratorRuntime.wrap(function _callee$(_context) {
2108
2475
  while (1) {
2109
2476
  switch (_context.prev = _context.next) {
2110
2477
  case 0:
2111
2478
  location = _ref.location, action = _ref.action;
2112
- routerConfig.router.pathname = location.pathname;
2479
+ handler.pathname = location.pathname;
2113
2480
  _context.prev = 2;
2114
2481
  _context.next = 5;
2115
- return router.resolve(config.router.forcePath || location.pathname);
2482
+ return router.resolve(handler.router.forcePath || handler.pathname);
2116
2483
 
2117
2484
  case 5:
2118
2485
  element = _context.sent;
@@ -2129,7 +2496,7 @@ function createRouter(app, config, framework) {
2129
2496
  }
2130
2497
 
2131
2498
  (_app$onPageNotFound = app.onPageNotFound) === null || _app$onPageNotFound === void 0 ? void 0 : _app$onPageNotFound.call(app, {
2132
- path: location.pathname
2499
+ path: handler.pathname
2133
2500
  });
2134
2501
  _context.next = 15;
2135
2502
  break;
@@ -2146,14 +2513,11 @@ function createRouter(app, config, framework) {
2146
2513
  return _context.abrupt("return");
2147
2514
 
2148
2515
  case 17:
2149
- pageConfig = config.routes.find(function (r) {
2150
- var path = addLeadingSlash(r.path);
2151
- return path === location.pathname || alias[path] === location.pathname;
2152
- });
2516
+ pageConfig = handler.pageConfig;
2153
2517
  enablePullDownRefresh = false;
2154
2518
  eventCenter.trigger('__taroRouterChange', {
2155
2519
  toLocation: {
2156
- path: location.pathname
2520
+ path: handler.pathname
2157
2521
  }
2158
2522
  });
2159
2523
 
@@ -2163,7 +2527,7 @@ function createRouter(app, config, framework) {
2163
2527
  }
2164
2528
 
2165
2529
  currentPage = Current.page;
2166
- pathname = location.pathname;
2530
+ pathname = handler.pathname;
2167
2531
  shouldLoad = false;
2168
2532
 
2169
2533
  if (!(action === 'POP')) {
@@ -2174,62 +2538,60 @@ function createRouter(app, config, framework) {
2174
2538
  // NOTE: 浏览器事件退后多次时,该事件只会被触发一次
2175
2539
  prevIndex = stacks.getPrevIndex(pathname);
2176
2540
  delta = stacks.getDelta(pathname);
2177
- unloadPage(currentPage, delta);
2541
+ handler.unload(currentPage, delta, prevIndex > -1);
2178
2542
 
2179
2543
  if (prevIndex > -1) {
2180
- showPage(stacks.getItem(prevIndex), pageConfig, prevIndex);
2544
+ handler.show(stacks.getItem(prevIndex), pageConfig, prevIndex);
2181
2545
  } else {
2182
2546
  shouldLoad = true;
2183
2547
  }
2184
2548
 
2185
- _context.next = 46;
2549
+ _context.next = 42;
2186
2550
  break;
2187
2551
 
2188
2552
  case 31:
2189
- if (!(action === 'PUSH')) {
2190
- _context.next = 36;
2553
+ if (!handler.isTabBar) {
2554
+ _context.next = 40;
2191
2555
  break;
2192
2556
  }
2193
2557
 
2194
- hidePage(currentPage);
2195
- shouldLoad = true;
2196
- _context.next = 46;
2197
- break;
2198
-
2199
- case 36:
2200
- if (!(action === 'REPLACE')) {
2201
- _context.next = 46;
2558
+ if (!handler.isSamePage(currentPage)) {
2559
+ _context.next = 34;
2202
2560
  break;
2203
2561
  }
2204
2562
 
2205
- if (!isTabBar(config)) {
2206
- _context.next = 44;
2207
- break;
2208
- }
2563
+ return _context.abrupt("return");
2209
2564
 
2210
- hidePage(currentPage);
2211
- _prevIndex = stacks.getPrevIndex(pathname);
2565
+ case 34:
2566
+ _prevIndex = stacks.getPrevIndex(pathname, 0);
2567
+ handler.hide(currentPage);
2212
2568
 
2213
2569
  if (!(_prevIndex > -1)) {
2214
- _context.next = 42;
2570
+ _context.next = 38;
2215
2571
  break;
2216
2572
  }
2217
2573
 
2218
- return _context.abrupt("return", showPage(stacks.getItem(_prevIndex), pageConfig, _prevIndex));
2574
+ return _context.abrupt("return", handler.show(stacks.getItem(_prevIndex), pageConfig, _prevIndex));
2219
2575
 
2220
- case 42:
2221
- _context.next = 45;
2576
+ case 38:
2577
+ _context.next = 41;
2222
2578
  break;
2223
2579
 
2224
- case 44:
2225
- unloadPage(currentPage);
2580
+ case 40:
2581
+ if (action === 'REPLACE') {
2582
+ _delta = stacks.getDelta(pathname); // NOTE: 页面路由记录并不会清空,只是移除掉缓存的 stack 以及页面
2226
2583
 
2227
- case 45:
2584
+ handler.unload(currentPage, _delta);
2585
+ } else if (action === 'PUSH') {
2586
+ handler.hide(currentPage);
2587
+ }
2588
+
2589
+ case 41:
2228
2590
  shouldLoad = true;
2229
2591
 
2230
- case 46:
2231
- if (!shouldLoad) {
2232
- _context.next = 54;
2592
+ case 42:
2593
+ if (!(shouldLoad || stacks.length < 1)) {
2594
+ _context.next = 50;
2233
2595
  break;
2234
2596
  }
2235
2597
 
@@ -2238,10 +2600,10 @@ function createRouter(app, config, framework) {
2238
2600
  stacksIndex = stacks.length;
2239
2601
  delete loadConfig['path'];
2240
2602
  delete loadConfig['load'];
2241
- page = createPageConfig(enablePullDownRefresh ? (_runtimeHooks$createP = runtimeHooks.createPullDownComponent) === null || _runtimeHooks$createP === void 0 ? void 0 : _runtimeHooks$createP.call(runtimeHooks, el, location.pathname, framework, routerConfig.PullDownRefresh) : el, pathname + stringify(qs(stacksIndex)), {}, loadConfig);
2242
- return _context.abrupt("return", loadPage(page, pageConfig, stacksIndex));
2603
+ page = createPageConfig(enablePullDownRefresh ? (_runtimeHooks$createP = runtimeHooks.createPullDownComponent) === null || _runtimeHooks$createP === void 0 ? void 0 : _runtimeHooks$createP.call(runtimeHooks, el, location.pathname, framework, handler.PullDownRefresh) : el, pathname + stringify(handler.getQuery(stacksIndex)), {}, loadConfig);
2604
+ return _context.abrupt("return", handler.load(page, pageConfig, stacksIndex));
2243
2605
 
2244
- case 54:
2606
+ case 50:
2245
2607
  case "end":
2246
2608
  return _context.stop();
2247
2609
  }
@@ -2255,14 +2617,14 @@ function createRouter(app, config, framework) {
2255
2617
  }();
2256
2618
 
2257
2619
  if (history.location.pathname === '/') {
2258
- history.replace(prependBasename(routes[0].path + history.location.search));
2620
+ history.replace(prependBasename(entryPagePath + history.location.search));
2259
2621
  }
2260
2622
 
2261
2623
  render({
2262
2624
  location: history.location,
2263
2625
  action: r.Push
2264
2626
  });
2265
- app.onShow(qs(stacks.length));
2627
+ (_app$onShow = app.onShow) === null || _app$onShow === void 0 ? void 0 : _app$onShow.call(app, launchParam);
2266
2628
  return history.listen(render);
2267
2629
  }
2268
2630