【问题标题】:Removing log statements in Create React App without ejecting在不弹出的情况下删除 Create React App 中的日志语句
【发布时间】:2018-05-30 01:48:14
【问题描述】:

我在开发应用程序时使用了很多 console.log() 语句(我的意思是 LOTS)。如果没有"ejecting",我该如何从 创建 React 应用 我考虑过但不确定如何实现:

在我的 package.json 中:

 "build": "react-scripts build && uglifyjs --compress drop_console build/static/js/main.xxxxx.js  -o build/static/js/main.xxxxx.js

但是我怎么知道main.js文件上的hash后缀,所以我可以调用这个命令并用相同的文件名保存输出js文件

【问题讨论】:

  • 您是要删除代码行还是仅删除日志输出?修复后者就足够了吗?
  • 抑制日志输出。

标签: create-react-app uglifyjs


【解决方案1】:

我使用这个设置。我在开发时仍然需要控制台日志。

// config-overrides.js
const { override, addBabelPlugins } = require('customize-cra')

module.exports = override(
  process.env.NODE_ENV !== 'development' && addBabelPlugins(
    "transform-remove-console"
  )
)

【讨论】:

    【解决方案2】:

    你可以试试这个组合包来覆盖配置:

    注意:从react-app-rewired的文件来看,这会破坏CRA提供的“保证”。所以在使用前要小心。

    npm i -D customize-cra react-app-rewired babel-plugin-transform-remove-console
    

    修改你的 package.json,将 react-scripts 替换为 react-app-rewiredreject 除外。完成后,您的脚本应如下所示:

    "scripts": {
     "start": "react-app-rewired start",
     "build": "react-app-rewired build",
     "test": "react-app-rewired test",
     "eject": "react-scripts eject"
    }
    

    然后在根目录下创建一个文件:

    touch config-overrides.js
    
    // config-overrides.js
    const { override, addBabelPlugins } = require('customize-cra')
    
    module.exports = override(
      addBabelPlugins(
        "transform-remove-console"
      )
    )
    

    最后,在运行npm run build 之后,所有console.log 都消失了。

    【讨论】:

      【解决方案3】:

      将此添加到 index.js

      if (process.env.NODE_ENV !== 'development') {
        console.log = () => {}
      }
      

      请注意,这只会抑制消息,不会从您部署的代码中删除它们。

      注意 2020 年 11 月

      不要对库模块执行此操作,它将禁用父项目的 console.log。

      2020 年 9 月更新

      CRA repo 上有一些关于这个问题的动向...去这里给它支持/竖起大拇指https://github.com/facebook/create-react-app/pull/9222

      参考资料: How to quickly and conveniently disable all console.log statements in my code?

      【讨论】:

      • 作为一个初学者,我认为这个答案更适合我。 :)
      • 我还会根据您的团队使用的内容覆盖其他控制台方法,例如 console.debug、console.warn、console.info。
      • 恶意用户不能翻转变量的运行时值然后查看日志吗?
      • 如果为您的 Web 应用程序留下日志消息存在任何安全隐患,那么显然您应该在构建过程中去除日志。我个人使用github.com/arackaf/customize-cra 在我的config-overrides.js 文件中使用addBabelPlugin('transform-remove-console') 来执行此操作。
      【解决方案4】:

      在 package.json 脚本中执行此操作:

       "build": "./scripts/build.sh"
      

      然后在你的项目中:

      scripts/build.sh 看起来像:

      #!/usr/bin/env bash
      
      set -e;
      cd "$(dirname $(dirname "$BASH_SOURCE"))"  # cd to project root
      
      react-scripts build 
      
      for f in build/static/js/*.js; do
      
        uglifyjs --compress drop_console "$PWD/$f" -o "$PWD/$f"
      
      done
      

      【讨论】:

        【解决方案5】:

        如果你只是想抑制日志输出,你可以包装 console.log 并改用它

        const log = (...msgs) => {
          if (process.env.NODE_ENV === 'development') console.log(...msgs)
        }
        

        您可以导入/导出它,但这听起来很痛苦。添加到global

        似乎是件好事
        global.log = log
        
        global.log('will only log in dev')
        

        【讨论】:

        • 能否详细说明使用全局命令来抑制控制台日志。
        • 哦,在这种情况下,global 没什么特别的......也可以使用window。我的意思是您可以编写自己的 log 函数,该函数仅在开发模式下输出(create-react-app 在运行 npm start 时使用)并将该日志函数放在可访问的东西上,而不必在任何地方导入它(如全局 /窗口)
        • 使用这种方法,您必须确保团队中的所有开发人员都使用这个特定的日志功能。他们不会,因为他们中的一些人总是会忘记使用它。
        • 恶意用户不能翻转变量的运行时值然后查看日志吗?
        • @AlexChannelmeter 这是客户端。恶意用户已经可以访问客户端上的所有内容
        猜你喜欢
        • 2019-01-26
        • 2018-12-08
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        • 2018-01-28
        • 1970-01-01
        相关资源
        最近更新 更多