reactjs源中明显的ifs有什么意义?

时间:2015-03-09 06:33:03

标签: javascript reactjs

我发现源代码充满了比较if ("production" !== "development")

例如(来自https://cdnjs.cloudflare.com/ajax/libs/react/0.12.2/react.js,第6240行):

if ("production" !== "development") {
    this._checkPropTypes(
        contextTypes,
        maskedContext,
        ReactPropTypeLocations.context
    );
}

但为什么呢?这种检查的结果总是一样的。

2 个答案:

答案 0 :(得分:9)

他们将browserifyenvify一起使用。

  

envify将用普通替换你的环境变量检查   字符串 - 只包含您使用的变量,因此您不需要   不得不担心,例如,AWS_SECRET_KEY泄漏。 [...]   通过良好的缩小器(例如UglifyJS2)运行它,以上   代码将被彻底删除。

答案 1 :(得分:1)

这样做是为了启用仅开发检查和记录。

如果您查看React源代码,您将看到if (__DEV__)支票,这些支票会被React的构建流程替换为if ("production" !== process.env.NODE_ENV)

然后使用

envify将源代码中对process.env.NODE_ENV的引用替换为构建过程运行时的当前值。

对于React的未压缩开发版本(当使用npm版本时,默认情况下)process.env.NODE_ENV设置为"development",因此您可以获得这些额外检查的好处,例如验证通过的道具to propTypes的组件,警告controlled components由于配置错误可能是只读的,有关没有key道具的项目列表的警告以及React提供的所有其他开发模式日志记录常见的问题,如拼写生命周期方法和HTML属性道具名称。

对于压缩生成版本,process.env.NODE_ENV设置为"production",因此当使用UglifyJS压缩构建时,这些代码块会被Ugilify的死代码检测到淘汰过程作为代码永远不会运行并完全从源中删除。


这样做的好处是,您可以利用if ("production" !== process.env.NODE_ENV)检查添加仅开发检查并记录到您自己的React组件和库,因为人们当前从npm捆绑React(使用v0。 12.2撰写本文时的当前版本)必须将其作为构建过程的一部分来处理。