我发现源代码充满了比较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
);
}
但为什么呢?这种检查的结果总是一样的。
答案 0 :(得分:9)
他们将browserify与envify一起使用。
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撰写本文时的当前版本)必须将其作为构建过程的一部分来处理。