【问题标题】:How can remove console.log in the production build of a React application created using create-react-app?如何在使用 create-react-app 创建的 React 应用程序的生产版本中删除 console.log?
【发布时间】:2019-10-10 02:14:25
【问题描述】:

如何在使用 create-react-app CRA 创建的 React 应用程序的生产版本中删除 console.log?

【问题讨论】:

  • 自答题仍必须以问答形式发布,并且两者都必须满足任何帖子的质量要求。另外,既然它已经在您链接的那个中,为什么还需要另一个问答对?
  • 由于在使用 create-react-app 创建的应用程序中应用解决方案时遇到问题,所以我写它来帮助他人
  • 尽管如此,请至少将其拆分为 Q 和 A。
  • 谢谢@jonrsharpe 的建议。希望现在这是正确的拆分。

标签: reactjs build create-react-app console.log


【解决方案1】:

我创建了一个 helper 文件夹,其中包含一个名为 ConsoleHelper.js 的文件

const ConsoleHelper = (data) => {
  if (process.env.NODE_ENV === 'production') return;
  console.log(data);
}

export default ConsoleHelper;

所以,不要使用console.log(data),而是使用ConsoleHelper(data)

【讨论】:

  • 如此简单又如此有效,甚至无需与 webpack 搞混!我添加了一个传递第二个参数的选项,因为我通常也会注销某种对象。非常感谢您发布这个!
  • @SpencerBigum 随时:)
  • 这个解决方案的问题是这个控制台消息的来源将被省略并替换为你的助手的位置。
  • @ExisZhang 我无法理解您的评论。你能详细说明一下吗?
【解决方案2】:

我正在使用这种方法来避免弹出react-scripts

if (process.env.NODE_ENV === 'production') {
  console.log = () => {}
  console.error = () => {}
  console.debug = () => {}
}

index.js

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import './styles/main.scss'

// replace console.* for disable log on production
if (process.env.NODE_ENV === 'production') {
  console.log = () => {}
  console.error = () => {}
  console.debug = () => {}
}

ReactDOM.render(<App />, document.getElementById('root'))

【讨论】:

    【解决方案3】:

    这是我使用craco的解决方案

    安装https://babeljs.io/docs/en/babel-plugin-transform-remove-console/

    并像更新 craco.config.js 一样

    module.exports = {
      plugins: [{ plugin: require('@semantic-ui-react/craco-less') }],
      babel: {
        // ...
      plugins: process.env.NODE_ENV === "production" ? [["transform-remove-console", { "exclude": ["error"] }]] : []
      }
    }
    

    【讨论】:

      【解决方案4】:

      这是我使用craco 的解决方案。

      "@craco/craco": "^6.0.0",
      "react-scripts": "4.0.1",
      

      craco.config.js

      module.exports = {
        webpack: {
          configure: (webpackConfig) => {
            if (process.env.NODE_ENV === 'production') {
              // remove console in production
              const TerserPlugin = webpackConfig.optimization.minimizer.find((i) => i.constructor.name === 'TerserPlugin');
              if (TerserPlugin) {
                TerserPlugin.options.terserOptions.compress['drop_console'] = true;
              }
            }
      
            return webpackConfig;
          },
        },
      };
      
      

      【讨论】:

      • 与 CRA (create-react-app) 相关的主题,您无法单独设置 webpack。所以你的解决方案在这种情况下是不相关的。
      【解决方案5】:

      问题的简单解决方案是帮助面临同样问题的其他人。

      参考:https://stackoverflow.com/a/41041580/3574669

      参考中的建议,需要对文件“webpack.config.js”进行修改。 create-react-app 在内部使用 webpack 和配置文件,但无法在我的应用程序根目录中添加 webpack.config.js 以应用更改。这需要保留 create-react-app 设置并为 webpack 和配置构建自己的设置。经过大量探索和编写示例代码后,这对我来说并不容易。

      由于我对 create-react-app 非常满意,所以也不想搁置它的好处。

      最后,我在node_modules/react-scripts/config/webpack.config.js 中做了一个简单的更改,添加了一行drop_console: true,,如参考文献中所述。参考中建议的代码如下,

      module.exports = {
        optimization: {
          minimizer: [
            new TerserPlugin({
              sourceMap: true, // Must be set to true if using source-maps in production
              terserOptions: {
                compress: {
                  drop_console: true, // << this needs only to remove console.log //
                },
              },
            }),
          ],
        },
      };
      

      这对我来说很好,通过简单的更改,我的生产构建应用程序中没有控制台日志。

      我正在使用"react-scripts": "3.0.1",

      注意:每当您稍后重新安装“react-scripts”时,都会清除此新行。所以它需要在这样的事件中再次做同样的改变。

      重要提示:如果使用 CI/CD,请勿使用此方法

      【讨论】:

      • 这是如何获得 2 票的,这超出了我的理解。你永远不应该像 Ajay 自己提到的那样更改 node_modules 中的代码,一个简单的 npm 我只会覆盖它,如果你想更改你经常使用的一个存储库中的代码,只需 fork 并在本地使用它。跨度>
      • @naor.z 我建议进行一次更改和简单的预防措施。对于新手开发人员来说,它也很容易实现和维护。分叉和更改并不是那么简单。此外,这不需要任何额外的努力来制作“hello world”所建议的帮助程序并替换整个代码中的“console.log”。如果比我建议的更简单,请提出任何其他解决方案。
      • -1 表示非常危险的方法。简单——是的,错了——是的。很少有这些方法的项目对于任何严肃的工作都是不可维护的。有两个选项: #1 弹出配置 #2 使用 github.com/timarney/react-app-rewired 更改 WebPack 选项 我更喜欢选项 2
      • @zveljkovic 该解决方案不是最好的,但对于特定目的而言简单且可维护,因为只需维护一行。对于一个非常大的项目和配置中的多项更改,我可能同意您的 2 个选项。但是我不明白为什么针对特定目的的特定方法是危险的,因为它不会破坏代码?
      • 同意。将检查#2。谢谢
      【解决方案6】:

      简单的方法是在根目录下创建一个名为logger.js的新文件

      在 logger.js 中

      var logger = function logger(...messages){
          if(process.env.NODE_ENV === 'development'){
              console.log(messages);
          }
      }
      exports.logger = logger;
      

      现在将此 logger.js 文件导入到您的组件中。例如我的组件文件是 demo.jsx

      import React from 'react';
      var logger = require('../logger.js').logger;
      
      class Demo extends React.Component{
          constructor(props){
          }
      
          render(){
              return(
                  <p>Hello i am demo component</p>
              );
          }
      
          componentDidMount(){
              logger('I am printing only in developmet')
          }
      }
      export default Demo;
      

      【讨论】:

      • 开始编码时很好。但是已经编写了数千行代码会怎样。
      • @Ajay 您可以简单地将所有“console.log”批量重命名为“logger”,然后手动将其导入所有文件。我不太喜欢这种方法,我认为它为几乎所有文件添加了一个很容易避免的导入。我认为答案 hello world 是正确的解决方案。当您执行诸如安装所有依赖项之类的操作时,您可以创建一个更改 drop_console 参数的脚本
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      相关资源
      最近更新 更多