如何打开/关闭 ReactJS“开发模式”?

IT技术 reactjs
2021-04-20 04:42:47

开始使用 ReactJS 的prop 验证功能,正如文档所说,出于性能原因,该功能仅适用于“开发模式”。

React 似乎正在验证我注释的特定组件的属性,但我不记得明确打开“开发模式”。

我尝试寻找如何触发/切换开发模式,但没有任何运气。

6个回答

另一个答案假设您使用的是来自 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块节省您的字节。

您也可以使用JSON.stringify(process.env.NODE_ENV)它,以便可以通过NODE_ENV=production webpack ...命令行进行切换添加了显式代码的奖励 =)
2021-05-22 04:42:47
刚发现这个DefinePlugin用途可以换成new webpack.EnvironmentPlugin(['NODE_ENV'])
2021-05-25 04:42:47
在反应文档中也解释了facebook.github.io/react/docs/...
2021-06-06 04:42:47
你真的需要 JSON.stringify('production') 吗?还是仅仅“生产”就足够了?
2021-06-08 04:42:47
@VladNicula 它需要是'"production"'ie。双引号,stringify 为你做这件事
2021-06-14 04:42:47

是的,它没有很好的文档记录,但是在 ReactJS下载页面上它谈到了开发和生产模式:

我们提供两个版本的 React:用于开发的未压缩版本和用于生产的缩小版本。开发版本包含关于常见错误的额外警告,而生产版本包含额外的性能优化并去除所有错误消息。

基本上,未缩小版的 React 是“开发”模式,缩小版的 React 是“生产”模式。

要处于“生产”模式,只需包含缩小版本 react-0.9.0.min.js

我不认为这是最好的答案,因为有些人用 browserify 构建他们的反应,并且使用的答案NODE_ENV应该出现在顶部。
2021-05-30 04:42:47
如果您的捆绑器缩小,我认为它不会删除调试。你需要在你的生产构建中包含 React 的缩小版本 - React 发行版中包含的那个 - 根据我的理解,它实际上与未缩小版本的代码不同。
2021-06-05 04:42:47
我只是想补充一点,插件版本似乎没有打开开发模式,即使是未缩小的版本。
2021-06-07 04:42:47
@BenAlpert - 我会在指南或提示下说一个页面,概述生产部署。我会看看,看看我能想出什么。我实际上还没有进行生产部署,因此可能需要进行一些修改。我会提交一个 PR。
2021-06-16 04:42:47
如果您npm直接react 包构建,则使用诸如 envify 之类的东西来设置NODE_ENV = 'production'以执行相同的检查。@EdwardMSmith 让我知道您希望在哪里查看该信息,我可以添加它(或者您可以提交 PR)!
2021-06-21 04:42:47

我把这个贴在别处,但坦率地说,这里会是一个更好的地方。

假设您使用 npm 安装 React 15.0.1,import react from 'react'或者react = require('react')将运行./mode_modules/react/lib/React.jsReact 的原始源代码。

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'))
    }
  }
这不是推荐的解决方案(来源:我在 React 上工作)。正确的解决方案被记录在这里:reactjs.org/docs/...如果它们对您不起作用,请在 React 存储库中提交问题,我们会尽力帮助您。
2021-05-25 04:42:47
如果从 webpack cli 运行: const IS_PRODUCTION = process.argv.indexOf('-p') !== -1;
2021-06-19 04:42:47

对于基于 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')
    }

你可以从这里找到工作的

这不是推荐的解决方案(来源:我在 React 上工作)。正确的解决方案被记录在这里:reactjs.org/docs/...如果它们对您不起作用,请在 React 存储库中提交问题,我们会尽力帮助您。
2021-05-26 04:42:47

如果您正在使用类似ReactJS.NET / Webpack 教程的内容,就我所知,您不能使用 process.env 来打开/关闭 React 开发模式。此示例直接链接到 react.js(请参阅Index.cshtml),因此您只需通过更改 URL 来选择 .min.js 或非缩小变体。

我不确定为什么会这样,因为示例的 webpack.config.js 有一个注释,似乎暗示它externals: { react: 'React' }会完成这项工作,但随后继续将react直接包含到页面中。

@FaisalMushtaq 这是其中的一部分;根据您包含 react.js 的方式,您可能必须明确切换到缩小版本。但我真正想说的是,可以将 React 设置为“官方”开启开发模式的方式不起作用。
2021-06-03 04:42:47
如果我猜对了,您是说如果您使用 ReactJS.Net 进行捆绑和缩小,那么缩小 react.js 开发文件将无济于事。为此,在使用 #IF DEBUG 检查进行捆绑时,必须将 URL 显式更改为从 Facebook 下载页面提供的 react.js 的生产文件。与 react-dom 和 Redux 的情况类似。我对吗?
2021-06-14 04:42:47