@umijs/renderer-react 4.3.35 → 4.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/browser.js CHANGED
@@ -147,9 +147,8 @@ var getBrowser = function getBrowser(opts, routesElement) {
147
147
  matchedRouteIds.forEach(function (id) {
148
148
  var _opts$routes$id, _opts$routes$id2;
149
149
  // preload lazy component
150
- // window.__umi_manifest__ is available when routePrefetch and manifest config is enabled
151
- // __umi_manifest__ is not needed for preload, keep this is for compatibility and minimal change
152
- if (window.__umi_manifest__) {
150
+ // window.__umi_route_prefetch__ is available when routePrefetch and manifest config is enabled
151
+ if (window.__umi_route_prefetch__) {
153
152
  var _opts$routeComponents;
154
153
  // ref: https://github.com/facebook/react/blob/0940414/packages/react/src/ReactLazy.js#L135
155
154
  var lazyCtor = (_opts$routeComponents = opts.routeComponents[id]) === null || _opts$routeComponents === void 0 || (_opts$routeComponents = _opts$routeComponents._payload) === null || _opts$routeComponents === void 0 ? void 0 : _opts$routeComponents._result;
package/dist/link.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import React, { PropsWithChildren } from 'react';
1
+ import React from 'react';
2
2
  import { LinkProps } from 'react-router-dom';
3
- export declare function LinkWithPrefetch(props: PropsWithChildren<{
4
- prefetch?: boolean;
5
- } & LinkProps & React.RefAttributes<HTMLAnchorElement>>): JSX.Element | null;
3
+ export declare const LinkWithPrefetch: React.ForwardRefExoticComponent<Omit<React.PropsWithChildren<{
4
+ prefetch?: boolean | "viewport" | "render" | "intent" | "none" | undefined;
5
+ prefetchTimeout?: number | undefined;
6
+ } & LinkProps & React.RefAttributes<HTMLAnchorElement>>, "ref"> & React.RefAttributes<unknown>>;
package/dist/link.js CHANGED
@@ -1,22 +1,89 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
3
  var _excluded = ["prefetch"];
4
- import React from 'react';
4
+ import React, { useLayoutEffect } from 'react';
5
5
  import { Link } from 'react-router-dom';
6
6
  import { useAppData } from "./appContext";
7
- export function LinkWithPrefetch(props) {
7
+ import { useIntersectionObserver } from "./useIntersectionObserver";
8
+ function useForwardedRef(ref) {
9
+ var innerRef = React.useRef(null);
10
+ React.useEffect(function () {
11
+ if (!ref) return;
12
+ if (typeof ref === 'function') {
13
+ ref(innerRef.current);
14
+ } else {
15
+ ref.current = innerRef.current;
16
+ }
17
+ });
18
+ return innerRef;
19
+ }
20
+ export var LinkWithPrefetch = /*#__PURE__*/React.forwardRef(function (props, forwardedRef) {
8
21
  var _props$to;
9
- var prefetch = props.prefetch,
22
+ var prefetchProp = props.prefetch,
10
23
  linkProps = _objectWithoutProperties(props, _excluded);
24
+ var _ref = typeof window !== 'undefined' &&
25
+ // @ts-ignore
26
+ window.__umi_route_prefetch__ || {
27
+ defaultPrefetch: 'none',
28
+ defaultPrefetchTimeout: 50
29
+ },
30
+ defaultPrefetch = _ref.defaultPrefetch,
31
+ defaultPrefetchTimeout = _ref.defaultPrefetchTimeout;
32
+ var prefetch = (prefetchProp === true ? 'intent' : prefetchProp === false ? 'none' : prefetchProp) || defaultPrefetch;
33
+ if (!['intent', 'render', 'viewport', 'none'].includes(prefetch)) {
34
+ throw new Error("Invalid prefetch value ".concat(prefetch, " found in Link component"));
35
+ }
11
36
  var appData = useAppData();
12
37
  var to = typeof props.to === 'string' ? props.to : (_props$to = props.to) === null || _props$to === void 0 ? void 0 : _props$to.pathname;
38
+ var hasRenderFetched = React.useRef(false);
39
+ var ref = useForwardedRef(forwardedRef);
40
+ // prefetch intent
41
+ var handleMouseEnter = function handleMouseEnter(e) {
42
+ if (prefetch !== 'intent') return;
43
+ var eventTarget = e.target || {};
44
+ if (eventTarget.preloadTimeout) return;
45
+ eventTarget.preloadTimeout = setTimeout(function () {
46
+ var _appData$preloadRoute;
47
+ eventTarget.preloadTimeout = null;
48
+ (_appData$preloadRoute = appData.preloadRoute) === null || _appData$preloadRoute === void 0 || _appData$preloadRoute.call(appData, to);
49
+ }, props.prefetchTimeout || defaultPrefetchTimeout);
50
+ };
51
+ var handleMouseLeave = function handleMouseLeave(e) {
52
+ if (prefetch !== 'intent') return;
53
+ var eventTarget = e.target || {};
54
+ if (eventTarget.preloadTimeout) {
55
+ clearTimeout(eventTarget.preloadTimeout);
56
+ eventTarget.preloadTimeout = null;
57
+ }
58
+ };
59
+
60
+ // prefetch render
61
+ useLayoutEffect(function () {
62
+ if (prefetch === 'render' && !hasRenderFetched.current) {
63
+ var _appData$preloadRoute2;
64
+ (_appData$preloadRoute2 = appData.preloadRoute) === null || _appData$preloadRoute2 === void 0 || _appData$preloadRoute2.call(appData, to);
65
+ hasRenderFetched.current = true;
66
+ }
67
+ }, [prefetch, to]);
68
+
69
+ // prefetch viewport
70
+ useIntersectionObserver(ref, function (entry) {
71
+ if (entry !== null && entry !== void 0 && entry.isIntersecting) {
72
+ var _appData$preloadRoute3;
73
+ (_appData$preloadRoute3 = appData.preloadRoute) === null || _appData$preloadRoute3 === void 0 || _appData$preloadRoute3.call(appData, to);
74
+ }
75
+ }, {
76
+ rootMargin: '100px'
77
+ }, {
78
+ disabled: prefetch !== 'viewport'
79
+ });
80
+
13
81
  // compatible with old code
14
82
  // which to might be undefined
15
83
  if (!to) return null;
16
84
  return /*#__PURE__*/React.createElement(Link, _extends({
17
- onMouseEnter: function onMouseEnter() {
18
- var _appData$preloadRoute;
19
- return prefetch && to && ((_appData$preloadRoute = appData.preloadRoute) === null || _appData$preloadRoute === void 0 ? void 0 : _appData$preloadRoute.call(appData, to));
20
- }
85
+ onMouseEnter: handleMouseEnter,
86
+ onMouseLeave: handleMouseLeave,
87
+ ref: ref
21
88
  }, linkProps), props.children);
22
- }
89
+ });
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare function useIntersectionObserver<T extends Element>(ref: React.RefObject<T>, callback: (entry: IntersectionObserverEntry | undefined) => void, intersectionObserverOptions?: IntersectionObserverInit, options?: {
3
+ disabled?: boolean;
4
+ }): IntersectionObserver | null;
@@ -0,0 +1,26 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React from 'react';
3
+ export function useIntersectionObserver(ref, callback) {
4
+ var intersectionObserverOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
5
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
6
+ // check if IntersectionObserver is available
7
+ if (typeof IntersectionObserver !== 'function') return null;
8
+ var isIntersectionObserverAvailable = React.useRef(typeof IntersectionObserver === 'function');
9
+ var observerRef = React.useRef(null);
10
+ React.useEffect(function () {
11
+ if (!ref.current || !isIntersectionObserverAvailable.current || options.disabled) {
12
+ return;
13
+ }
14
+ observerRef.current = new IntersectionObserver(function (_ref) {
15
+ var _ref2 = _slicedToArray(_ref, 1),
16
+ entry = _ref2[0];
17
+ callback(entry);
18
+ }, intersectionObserverOptions);
19
+ observerRef.current.observe(ref.current);
20
+ return function () {
21
+ var _observerRef$current;
22
+ (_observerRef$current = observerRef.current) === null || _observerRef$current === void 0 || _observerRef$current.disconnect();
23
+ };
24
+ }, [callback, intersectionObserverOptions, options.disabled, ref]);
25
+ return observerRef.current;
26
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umijs/renderer-react",
3
- "version": "4.3.35",
3
+ "version": "4.4.0",
4
4
  "description": "@umijs/renderer-react",
5
5
  "homepage": "https://github.com/umijs/umi/tree/master/packages/renderer-react#readme",
6
6
  "bugs": "https://github.com/umijs/umi/issues",