UNPKG

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