有没有办法在开发模式下禁用或加速React PropType验证?

时间:2016-01-16 18:13:22

标签: performance validation reactjs react-proptypes

据我所知,禁用React PropType验证的唯一方法是uglify React process.env.NODE_ENV定义为'production'

但是,我想在没有运行时PropType验证的情况下使用开发模式,原因如下:

  • 他们显着减慢我的应用程序。 PropType验证是分析结果中的最高罪犯,因为:
    • 我有一个相当深的组件层次结构,在多个级别上使用PropType验证(是的,我确实有适当的shouldComponentUpdate等。)
    • 我正在使用Redux,这意味着所有更新都从层次结构顶部或附近开始
    • 我有鼠标拖动互动,每秒可以进行30次更新
  • 我仍然希望看到所有其他React警告和错误,这些警告和错误也会在生产模式下被禁用。
  • 无论如何,Flowtype显然可以在很多情况下静态验证PropTypes。

如果没有别的我可以为babel-plugin-react-transform创建一个转换器去除所有组件'propTypes(或者只是那些我以某种方式注释的组件),但我想知道如果有更简单的方法,因为React 可以轻松提供编译时标志来禁用PropType验证。

更新:该babel插件已存在(https://www.npmjs.com/package/babel-plugin-react-remove-prop-types

1 个答案:

答案 0 :(得分:5)

简答:没有简单的标志只能禁用PropType验证

目前,PropType验证由__DEV__全局变量启用。 如果它被改为false,你将丢失其他React警告和错误,如你所说,你不能。

此代码here in ReactDOMFactories显示了如何选择ReactElementValidatorReactElement工厂来定义元素创建的工作方式:

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。

更新 - 2017年5月10日
Andy发现有一个Babel Plugin that removes Prop Types 我没有测试过。请务必阅读插件的Is it safe?部分,了解它是否适​​合您。