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