UNPKG

3.02 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.lazy = void 0;
4var tslib_1 = require("tslib");
5var React = (0, tslib_1.__importStar)(require("react"));
6var react_1 = require("react");
7var loadable_1 = require("../loadable/loadable");
8var detectBackend_1 = require("../utils/detectBackend");
9var utils_1 = require("../utils/utils");
10var Component_1 = require("./Component");
11var useImported_1 = require("./useImported");
12/**
13 * creates a "lazy" component, like `React.lazy`
14 * @see {@link useImported} or {@link useLazy}
15 * @param {Function} loaderFunction - () => import('a'), or () => require('b')
16 * @param {Object} [options]
17 * @param {React.Component} [options.LoadingComponent]
18 * @param {React.Component} [options.ErrorComponent]
19 * @param {Function} [options.onError] - error handler. Will consume the real error.
20 * @param {Function} [options.async = false] - enable React 16+ suspense.
21 *
22 * @example
23 * const PageA = imported('./pageA', { async: true });
24 */
25function loader(loaderFunction, baseOptions) {
26 if (baseOptions === void 0) { baseOptions = {}; }
27 var loadable = (0, loadable_1.getLoadable)(loaderFunction);
28 var Imported = React.forwardRef(function ImportedComponentHOC(_a, ref) {
29 var _b = _a.importedProps, importedProps = _b === void 0 ? {} : _b, props = (0, tslib_1.__rest)(_a, ["importedProps"]);
30 var options = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, baseOptions), importedProps);
31 // re-get loadable in order to have fresh reference
32 loadable = (0, loadable_1.getLoadable)(loaderFunction);
33 return (React.createElement(Component_1.ImportedComponent, { loadable: loadable, LoadingComponent: options.LoadingComponent, ErrorComponent: options.ErrorComponent, onError: options.onError, render: options.render, async: options.async, forwardProps: props || {}, forwardRef: ref }));
34 });
35 Imported.preload = function () {
36 loadable.load().catch(function () { return ({}); });
37 return loadable.resolution;
38 };
39 Object.defineProperty(Imported, 'done', {
40 get: function () {
41 return loadable.resolution;
42 },
43 });
44 return Imported;
45}
46var ReactLazy = React.lazy;
47/**
48 * React.lazy "as-is" replacement
49 */
50function lazy(importer) {
51 if (detectBackend_1.isBackend) {
52 return loader(importer);
53 }
54 if (process.env.NODE_ENV !== 'production') {
55 // lazy is not hot-reloadable
56 if (module.hot) {
57 return loader(importer, { async: true });
58 }
59 }
60 var topLoadable = (0, loadable_1.getLoadable)(importer);
61 return function ImportedLazy(props) {
62 var loadable = (0, useImported_1.useLoadable)(topLoadable).loadable;
63 var Lazy = (0, react_1.useMemo)(function () { return ReactLazy(function () { return loadable.tryResolveSync(utils_1.asDefault); }); }, [loadable]);
64 return React.createElement(Lazy, (0, tslib_1.__assign)({}, props));
65 };
66}
67exports.lazy = lazy;
68exports.default = loader;