如何打开/关闭 ReactJS“开发模式”?
另一个答案假设您使用的是来自 react 的外部预构建文件,尽管正确,但大多数人不会或应该将React 作为一个包来使用。此外,在这一点上,大多数 React 库和包也依赖于相同的约定来在生产期间关闭开发时间助手。仅使用缩小的react也会将所有这些潜在的优化留在桌面上。
最终,魔术归结为 React 在process.env.NODE_ENV
整个代码库中嵌入引用;这些就像一个功能切换。
if (process.env.NODE_ENV !== "production")
// do propType checks
以上是最常见的模式,其他库也遵循它。所以要“禁用”这些检查,我们需要切换NODE_ENV
到"production"
禁用“开发模式”的正确方法是通过您选择的捆绑程序。
网络包
DefinePlugin
在您的 webpack 配置中使用 ,如下所示:
new webpack.DefinePlugin({
"process.env.NODE_ENV": JSON.stringify("production")
})
浏览器化
使用Envify转换并使用NODE_ENV=production
("set NODE_ENV=production"
在 Windows 上)运行您的browserify构建步骤
结果
这将生成输出包,其中的所有实例都process.env.NODE_ENV
替换为字符串文字:"production"
奖金
缩小转换后的代码时,您可以利用“死代码消除”。DCE是当minifier是聪明地认识到:"production" !== "production"
是总是假的,这样只会删除任何代码在if块节省您的字节。
是的,它没有很好的文档记录,但是在 ReactJS下载页面上它谈到了开发和生产模式:
我们提供两个版本的 React:用于开发的未压缩版本和用于生产的缩小版本。开发版本包含关于常见错误的额外警告,而生产版本包含额外的性能优化并去除所有错误消息。
基本上,未缩小版的 React 是“开发”模式,缩小版的 React 是“生产”模式。
要处于“生产”模式,只需包含缩小版本 react-0.9.0.min.js
我把这个贴在别处,但坦率地说,这里会是一个更好的地方。
假设您使用 npm 安装 React 15.0.1,import react from 'react'
或者react = require('react')
将运行./mode_modules/react/lib/React.js
React 的原始源代码。
React 文档建议您./mode_modules/react/dist/react.js
用于开发和react.min.js
生产。
如果您缩小/lib/React.js
或/dist/react.js
用于生产,React 将显示一条警告消息,表明您已缩小非生产代码:
Warning: It looks like you're using a minified copy of the development build of React. When deploying React apps to production, make sure to use the production build which skips development warnings and is faster. See fb.me/react-minification for more details.
react-dom、redux、react-redux 的行为类似。Redux 显示警告消息。我相信 react-dom 也是如此。
因此,显然鼓励您使用/dist
.
但是,如果您缩小/dist
版本,webpack 的 UglifyJsPlugin 会抱怨。
WARNING in ../~/react/dist/react.js
Critical dependencies:
4:478-485 This seems to be a pre-built javascript file. Though this is possible, it's not recommended. Try to require the original source to get better results.
@ ../~/react/dist/react.js 4:478-4851
您无法避免此消息,因为 UglifyJsPlugin 只能排除 webpack 块,而不能排除单个文件。
我自己使用开发和生产/dist
版本。
- Webpack 要做的工作更少,而且完成得更快。(YRMV)
- React 文档说
/dist/react.min.js
已针对生产进行了优化。我没有读到任何证据表明'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }
plus uglify 与“/dist/react.min.js”一样好。我读过没有证据表明你得到了相同的结果代码。 - 我从 uglify 收到 1 条警告消息,而不是从 react/redux 生态系统收到 3 条警告消息。
你可以让 webpack 使用这些/dist
版本:
resolve: {
alias: {
'react$': path.join(__dirname, 'node_modules', 'react','dist',
(IS_PRODUCTION ? 'react.min.js' : 'react.js')),
'react-dom$': path.join(__dirname, 'node_modules', 'react-dom','dist',
(IS_PRODUCTION ? 'react-dom.min.js' : 'react-dom.js')),
'redux$': path.join(__dirname, 'node_modules', 'redux','dist',
(IS_PRODUCTION ? 'redux.min.js' : 'redux.js')),
'react-redux$': path.join(__dirname, 'node_modules', 'react-redux','dist',
(IS_PRODUCTION ? 'react-redux.min.js' : 'react-redux.js'))
}
}
对于基于 webpack 的构建,我曾经为 DEV 和 PROD 设置单独的 webpack.config.js。对于 Prod,解析别名如下
alias: {
'react$': path.join(__dirname, 'node_modules', 'react','dist','react.min.js'),
'react-dom$': path.join(__dirname, 'node_modules', 'react-dom','dist','react-dom.min.js')
}
你可以从这里找到工作的
如果您正在使用类似ReactJS.NET / Webpack 教程的内容,就我所知,您不能使用 process.env 来打开/关闭 React 开发模式。此示例直接链接到 react.js(请参阅Index.cshtml),因此您只需通过更改 URL 来选择 .min.js 或非缩小变体。
我不确定为什么会这样,因为示例的 webpack.config.js 有一个注释,似乎暗示它externals: { react: 'React' }
会完成这项工作,但随后继续将react直接包含到页面中。