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


120

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

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

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


process.env对于webpack用户的简洁解释:stackoverflow.com/questions/37311972/…–
ptim

Answers:


128

对方的回答假设您使用外部预建的文件从反应,而正确的,是大多数人不会如何去或应该消耗作出反应,一个包。而且,在这一点上,大多数每个React库和包都依赖相同的约定来在生产期间关闭开发人员时间助手。仅使用缩小的反应,所有这些潜在的优化也将留在桌面上。

最终,魔术归结为对process.env.NODE_ENV整个代码库的React嵌入引用。这些就像功能切换一样。

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上)中运行浏览器构建步骤

结果

这将产生输出包,其中所有实例都process.env.NODE_ENV被字符串文字替换:"production"

奖金

最小化转换后的代码时,您可以利用“消除死代码”的优势。DCE是当minifier是聪明地认识到:"production" !== "production"总是假的,这样只会删除任何代码在if块节省您的字节。


1
在react文档上也解释了facebook.github.io/react/docs/…–
asotog

1
您真的需要JSON.stringify('production')吗?还是仅仅“生产”就足够了?
弗拉德尼古拉

4
@VladNicula它必须是'"production"'ie。双引号,stringify为您做到了
monastic-

1
您也可以使用JSON.stringify(process.env.NODE_ENV)它,以便可以NODE_ENV=production webpack ...在命令行上通过进行切换。添加了显式代码的奖励=)
亨利·布莱斯

2
刚刚发现这种DefinePlugin用法可以替换为new webpack.EnvironmentPlugin(['NODE_ENV'])
Henry Blyth

50

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

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

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

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


2
如果您的捆绑程序精简,我认为它不会删除调试信息。据我所知,您需要在生产版本中包括React的最小版本(React发行版中包含的版本),它实际上与未最小化版本的代码不同。
爱德华·史密斯

17
如果您是npm直接从react包构建的,那么请使用诸如envify之类的设置NODE_ENV = 'production'进行相同的检查。@EdwardMSmith让我知道您想在哪里查看该信息,我可以添加它(或者您可以提交PR)!
索菲·阿尔珀特2014年

2
@BenAlpert-我会在“指南”或“提示”下说出概述生产部署的页面。我将看一看,看看我能想到什么。我实际上尚未进行生产部署,因此可能需要进行一些修订。我将提交公关。
爱德华·M·史密斯

1
我只是想补充一点,插件版本似乎没有打开开发模式,即使未缩小的版本也没有。
KallDrexx

8
我认为这不是最好的答案,因为有些人会通过browserify建立自己的反应,并且NODE_ENV应该在顶部显示一个使用的答案。
比约恩

16

我在其他地方发布了此信息,但坦率地说,这是一个更好的地方。

假设您使用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 docs表示/dist/react.min.js已针对生产进行了优化。我还没有证据表明'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }加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'))
    }
  }

1
如果从webpack cli运行:const IS_PRODUCTION = process.argv.indexOf('-p')!== -1;
格雷格

2
这不是推荐的解决方案(来源:我正在研究React)。此处记录了正确的解决方案:reactjs.org/docs/…。如果它们对您不起作用,请在React仓库中提出问题,我们将尽力为您提供帮助。
丹·阿布拉莫夫

4

对于基于Webpack的构建,我曾经为DEV和PROD设置了单独的webpack.config.js。对于产品,请按以下方式解析别名

     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')
    }

您可以从这里找到工作的人


1
这不是推荐的解决方案(来源:我正在研究React)。此处记录了正确的解决方案:reactjs.org/docs/…。如果它们对您不起作用,请在React仓库中提出问题,我们将尽力为您提供帮助。
丹·阿布拉莫夫

1

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

我不确定为什么会这样,因为该示例的webpack.config.js的注释似乎暗示externals: { react: 'React' }可以完成此工作,但随后继续进行并直接在页面中做出反应。


如果我猜对了,那是说如果使用ReactJS.Net进行捆绑和缩小,那么缩小react.js开发文件将无济于事。为此,在使用#IF DEBUG检查进行捆绑时,必须将URL显式更改为从Facebook下载页面提供的react.js生产文件。与React-dom和Redux相似。我对吗?
Faisal Mq

@FaisalMushtaq这是它的一部分;根据您如何包含react.js,您可能必须显式切换到缩小版本。但是我真正想说的是,React的设置方式可能使打开开发模式的“正式”方式不起作用。
罗曼·斯塔科夫

0

对于唯一的WebPack V4用户:

默认情况下mode: productionmode: development在Webpack配置中指定和将process.env.NODE_ENV使用DefinePlugin进行定义。无需其他代码!

webpack.prod.js(摘自文件)

const merge = require('webpack-merge');
const common = require('./webpack.common.js');

module.exports = merge(common, {
  mode: 'production',
});

在我们的JS中:

console.log(process.env.NODE_ENV) // --> 'development' or 'production'

Webpack文档:https ://webpack.js.org/guides/production/#specify-the-mode


0

我使用了贯穿Webpack的手动构建过程,因此对我来说这是一个分为两个步骤的过程:

  1. 使用cross-env包从package.json设置环境变量:

    "scripts": { "build-dev": "cross-env NODE_ENV=development webpack --config webpack.config.js", "build-prod": "cross-env NODE_ENV=production webpack --config webpack.config.js" }

  2. 更改webpack.config.js文件以使用环境变量(传递给React以确定我们是处于开发还是生产模式),并禁用最小化生产的包(如果我们处于开发模式),这样我们就可以看到我们组件的实际名称。为此,我们需要在webpack.config.js文件中使用webpack的优化属性:

    optimization: { nodeEnv: process.env.NODE_ENV, minimize: process.env.NODE_ENV === 'production' }

webpack v4.41.5,React v16.9.19,跨环境v7.0.0,节点v10.16.14

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.