【问题标题】:How to turn on/off ReactJS 'development mode'?如何打开/关闭 ReactJS 的“开发模式”?
【发布时间】:2014-04-02 20:34:34
【问题描述】:

开始使用 ReactJS 的 prop validation feature,正如文档所说,出于性能原因,它只适用于“开发模式”。

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

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

【问题讨论】:

标签: reactjs


【解决方案1】:

另一个答案假设您正在使用来自 react 的外部预构建文件,虽然这是正确的,但大多数人不会这样做,或者 应该 将 React 作为一个包来使用。此外,在这一点上,大多数 React 库和包依赖相同的约定来在生产期间关闭开发时间助手。仅使用缩小后的反应也会将所有这些潜在的优化留在桌面上。

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

if (process.env.NODE_ENV !== "production")
  // do propType checks

上面是最常见的模式,其他库也遵循它。因此,要“禁用”这些检查,我们需要将 NODE_ENV 切换为 "production"

禁用“开发模式”的正确方法是通过您选择的捆绑器。

网页包

在你的 webpack 配置中使用 DefinePlugin,如下所示:

new webpack.DefinePlugin({
  "process.env.NODE_ENV": JSON.stringify("production")
})

浏览

使用Envify 转换并使用NODE_ENV=production 运行您的browserify 构建步骤(Windows 上为"set NODE_ENV=production"

结果

这将生成将所有 process.env.NODE_ENV 实例替换为字符串文字的输出包:"production"

奖金

在缩小转换后的代码时,您可以利用“死代码消除”。 DCE 是当 minifier 足够聪明地意识到:"production" !== "production"always false 因此将删除 if 块中的任何代码以节省您的字节。

【讨论】:

  • 关于反应文档的解释以及facebook.github.io/react/docs/…
  • 你真的需要 JSON.stringify('production') 吗?还是仅仅“生产”就足够了?
  • @VladNicula 它必须是 '"production"' 即。双引号,stringify 为你做这个
  • 您也可以使用JSON.stringify(process.env.NODE_ENV),这样就可以在命令行上通过NODE_ENV=production webpack ... 进行切换。添加显式代码的奖励 =)
  • 刚刚发现这个DefinePlugin使用可以换成new webpack.EnvironmentPlugin(['NODE_ENV'])
【解决方案2】:

我使用通过 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 属性:

    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

【讨论】:

    【解决方案3】:

    仅限 Webpack v4 用户:

    在 Webpack 配置中指定 mode: productionmode: development 将默认使用 DefinePlugin 定义 process.env.NODE_ENV。无需额外代码!

    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

    【讨论】:

      【解决方案4】:

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

      你可以从here找到工作的那一个

      【讨论】:

      • 这不是推荐的解决方案(来源:我从事 React 工作)。 正确的解决方案记录在这里:reactjs.org/docs/…。如果它们不适合您,请在 React 存储库中提出问题,我们会尽力帮助您。
      【解决方案5】:

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

      假设您使用 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 cli 运行: const IS_PRODUCTION = process.argv.indexOf('-p') !== -1;
      • 这不是推荐的解决方案(来源:我从事 React 工作)。 正确的解决方案记录在这里:reactjs.org/docs/…。如果它们不适合您,请在 React 存储库中提出问题,我们会尽力帮助您。
      【解决方案6】:

      如果你正在使用类似ReactJS.NET / Webpack tutorial 的东西,据我所知,你不能使用 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 的情况类似。我说的对吗?
      • @FaisalMushtaq 这就是其中的一部分;根据您包含 react.js 的方式,您可能必须显式切换到缩小版本。但我真正想说的是,有可能以这样一种方式设置 React,以使“官方”打开开发模式的方式行不通。
      【解决方案7】:

      是的,它并没有很好的记录,但是在 ReactJS download page 上它谈到了开发和生产模式:

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

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

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

      【讨论】:

      • 如果 your 捆绑器缩小,我认为它不会删除调试。您需要在生产构建中包含 React 的缩小版本 - React 发行版中包含的那个 - 据我了解,它实际上与未缩小版本的代码不同。
      • 如果你是直接从 npm react 包构建的,那么使用像 envify 这样的东西来设置 NODE_ENV = 'production' 来做同样的检查。 @EdwardMSmith 让我知道您想在哪里看到该信息,我可以添加它(或者您可以提交 PR)!
      • @BenAlpert - 我会说一个页面在指南或提示下概述生产部署。我会看看,看看我能想出什么。我实际上还没有完成生产部署,所以它可能需要一些修改。我会提交 PR。
      • 我只是想补充一点,插件版本似乎没有打开开发模式,即使是未缩小的版本。
      • 我认为这不是最好的答案,因为有些人会使用 browserify 做出反应,并且使用 NODE_ENV 的答案应该出现在顶部。
      猜你喜欢
      • 2018-09-03
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      相关资源
      最近更新 更多