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

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

  • 他们大大降低了我的应用程序的速度。 PropType验证是分析结果中最主要的违法者,因为:
  • 我具有相当深的组件层次结构,并且在多个级别进行PropType验证(是的,我确实具有适当的shouldComponentUpdate等)。
  • 我正在使用Redux,这意味着所有更新都从
  • 层次结构的顶部或顶部开始
  • 我有鼠标拖动交互,它每秒争取30个更新
  • 我仍然想查看所有其他React警告和错误,这些警告和错误也会在生产模式下被禁用。
  • 无论如何,
  • Flowtype显然可以在很多情况下静态验证PropType。

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

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

    最佳答案

    简短答案:没有简单的标志可以仅禁用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?部分,以查看它是否适合您。

    10-05 21:52