Есть ли способ отключить или ускорить проверку React PropType в режиме разработки?

Насколько я знаю, единственный способ отключить React PropType валидация - это угадать React с process.env.NODE_ENV, определенным как 'production'.

Однако я бы хотел использовать режим разработки без проверки PropType во время выполнения по следующим причинам:

  • Они значительно замедляют мое приложение. Проверка PropType является верхним нарушителем в результатах профилирования, потому что:
    • У меня довольно глубокая иерархия компонентов с проверкой PropType на нескольких уровнях (да, у меня есть надлежащий mustComponentUpdate и т.д.).
    • Я использую Redux, что означает, что все обновления начинаются с вершины иерархии или рядом с ней.
    • У меня есть взаимодействия с мышью, которые стремятся к 30 обновлениям в секунду.
  • Я все еще хочу видеть все другие предупреждения и ошибки React, которые также будут отключены в режиме производства.
  • Flowtype может, по-видимому, статически проверять PropTypes во многих случаях.

Если ничего другого, я не мог бы создать трансформатор для babel-plugin-react-transform, который удаляет все компоненты propTypes (или, возможно, только те из компонентов, которые я аннотировал определенным образом), но мне интересно, есть ли более простой способ сделать это, потому что React может легко предоставить флаг времени компиляции, чтобы отключить проверку PropType.

UPDATE: этот плагин babel уже существует (https://www.npmjs.com/package/babel-plugin-react-remove-prop-types)

Ответ 1

Короткий ответ: нет простого флага для отключения проверки только PropType


В настоящее время валидация PropType включена глобальной переменной __DEV__. Если он изменился на false, вы потеряете другие предупреждения и ошибки React, которые, как вы сказали, вы не сможете.

Этот код здесь, в ReactDOMFactories показывает, как заводы ReactElementValidator и ReactElement выбраны для определения того, как будет выполняться создание элемента:/p >

function createDOMFactory(tag) {
  if (__DEV__) {
    return ReactElementValidator.createFactory(tag);
  }
  return ReactElement.createFactory(tag);
}

В ReactElementValidator.createElement вы можете увидеть, что он вызывает ReactElement.createElement, а затем validatePropTypes:

var ReactElementValidator = {

  createElement: function(type, props, children) {

    /* some code here */

    var element = ReactElement.createElement.apply(this, arguments);

    /* some code here */

    // here would be a good place for the flag that you need
    validatePropTypes(element);

    return element;
  }

Я не уверен, как эта информация может вам помочь, но, по крайней мере, показывает, что нет простого способа отключить PropType флагом, как вы задавались вопросом.


ОБНОВЛЕНИЕ - 10/май/2017
Andy обнаружил, что есть Babel Plugin, который удаляет типы Prop. < ш > Я не проверял. Обязательно прочтите Это безопасно? в разделе плагина, чтобы узнать, подходит ли он вам.