/
githubmr
/
facebook-react
Обзор
Документация
Войти
/
githubmr
/
facebook-react
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
v17.0.2
packages/react/src/ReactLazy.js
161 строка
4 KB
Sebastian Markbåge
Enable prefer-const lint rules (#18451)
01 апр 2020, 22:35
Не верифицирован
01 апр 2020, 22:35
3e94bce
Код
Авторство
О чём код?
/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow */ import type {Wakeable, Thenable} from 'shared/ReactTypes'; import {REACT_LAZY_TYPE} from 'shared/ReactSymbols'; const Uninitialized = -1; const Pending = 0; const Resolved = 1; const Rejected = 2; type UninitializedPayload<T> = { _status: -1, _result: () => Thenable<{default: T, ...}>, }; type PendingPayload = { _status: 0, _result: Wakeable, }; type ResolvedPayload<T> = { _status: 1, _result: T, }; type RejectedPayload = { _status: 2, _result: mixed, }; type Payload<T> = | UninitializedPayload<T> | PendingPayload | ResolvedPayload<T> | RejectedPayload; export type LazyComponent<T, P> = { $$typeof: Symbol | number, _payload: P, _init: (payload: P) => T, }; function lazyInitializer<T>(payload: Payload<T>): T { if (payload._status === Uninitialized) { const ctor = payload._result; const thenable = ctor(); // Transition to the next state. const pending: PendingPayload = (payload: any); pending._status = Pending; pending._result = thenable; thenable.then( moduleObject => { if (payload._status === Pending) { const defaultExport = moduleObject.default; if (__DEV__) { if (defaultExport === undefined) { console.error( 'lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject, ); } } // Transition to the next state. const resolved: ResolvedPayload<T> = (payload: any); resolved._status = Resolved; resolved._result = defaultExport; } }, error => { if (payload._status === Pending) { // Transition to the next state. const rejected: RejectedPayload = (payload: any); rejected._status = Rejected; rejected._result = error; } }, ); } if (payload._status === Resolved) { return payload._result; } else { throw payload._result; } } export function lazy<T>( ctor: () => Thenable<{default: T, ...}>, ): LazyComponent<T, Payload<T>> { const payload: Payload<T> = { // We use these fields to store the result. _status: -1, _result: ctor, }; const lazyType: LazyComponent<T, Payload<T>> = { $$typeof: REACT_LAZY_TYPE, _payload: payload, _init: lazyInitializer, }; if (__DEV__) { // In production, this would just set it on the object. let defaultProps; let propTypes; // $FlowFixMe Object.defineProperties(lazyType, { defaultProps: { configurable: true, get() { return defaultProps; }, set(newDefaultProps) { console.error( 'React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.', ); defaultProps = newDefaultProps; // Match production behavior more closely: // $FlowFixMe Object.defineProperty(lazyType, 'defaultProps', { enumerable: true, }); }, }, propTypes: { configurable: true, get() { return propTypes; }, set(newPropTypes) { console.error( 'React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.', ); propTypes = newPropTypes; // Match production behavior more closely: // $FlowFixMe Object.defineProperty(lazyType, 'propTypes', { enumerable: true, }); }, }, }); } return lazyType; }