You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何禁用来自node_modules的defaultProps警告(Create React App未弹出配置)

如何禁用来自node_modules的defaultProps警告(Create React App未弹出配置)

我完全懂你的烦恼——依赖的第三方库还在使用即将被废弃的defaultProps,而你又不想弹出CRA的配置(毕竟弹出后维护成本太高),就只想屏蔽这些来自node_modules的警告对吧?下面给你两个实用方案,按需pick:

方案一:运行时拦截警告(简单快捷,零额外依赖)

直接在项目的入口文件(一般是src/index.js最顶部插入一段代码,拦截console.error,只过滤来自第三方库的特定警告:

// 一定要放在文件最开头,确保在React加载前执行
const originalConsoleError = console.error;

console.error = (...args) => {
  // 匹配React关于defaultProps废弃的警告文本
  const isDefaultPropsWarning = args[0]?.includes(
    'Support for defaultProps will be removed from function components'
  );

  if (isDefaultPropsWarning) {
    // 检查调用栈是否来自node_modules目录
    const callStack = new Error().stack;
    if (callStack?.includes('node_modules')) {
      // 跳过这个来自第三方库的警告
      return;
    }
  }

  // 其他警告正常输出,不影响自己代码的提示
  originalConsoleError.apply(console, args);
};

这个方法的好处是不用装任何额外工具,直接生效,而且只会屏蔽第三方库的问题,你自己代码里的同类警告还是会正常提示,完全不影响你遵循React的新规范。

方案二:通过react-app-rewired修改Babel配置(更优雅,从根源解决)

如果觉得拦截console的方式有点“取巧”,可以用社区工具扩展CRA的配置,不用弹出就能修改Babel规则,把第三方库的defaultProps自动转换成ES6默认参数:

  1. 先安装必要的开发依赖:
npm install react-app-rewired customize-cra --save-dev
  1. 在项目根目录创建config-overrides.js文件,填入以下配置:
const { override, addBabelPlugin } = require('customize-cra');

module.exports = override(
  // 启用React自动JSX runtime
  addBabelPlugin([
    '@babel/plugin-transform-react-jsx',
    {
      runtime: 'automatic',
      importSource: 'react',
    },
  ]),
  // 针对node_modules中的模块单独配置Babel,转换defaultProps为默认参数
  (config) => {
    config.module.rules.forEach(rule => {
      if (rule.oneOf) {
        rule.oneOf.forEach(oneOfRule => {
          if (oneOfRule.test && oneOfRule.test.toString().includes('js|mjs|jsx|ts|tsx')) {
            // 保留原规则只处理src目录的代码
            oneOfRule.include = /src/;
            oneOfRule.exclude = /node_modules/;
            // 新增规则处理node_modules中的代码,转换defaultProps
            const nodeModulesRule = {
              ...oneOfRule,
              include: /node_modules/,
              exclude: undefined,
              use: [
                ...oneOfRule.use,
                {
                  loader: require.resolve('babel-loader'),
                  options: {
                    plugins: ['@babel/plugin-transform-react-default-props']
                  }
                }
              ]
            };
            rule.oneOf.push(nodeModulesRule);
          }
        });
      }
    });
    return config;
  }
);
  1. 修改package.json里的scripts命令,把react-scripts替换成react-app-rewired
"scripts": {
  "start": "react-app-rewired start",
  "build": "react-app-rewired build",
  "test": "react-app-rewired test",
  "eject": "react-scripts eject"
}

这个方案是从代码转译层面解决问题,把第三方库的旧写法自动转换成React推荐的新写法,从根源上消除警告,更符合长期的规范,但需要安装额外依赖,配置稍复杂一点。

两种方案都能完美解决你的问题,根据自己的偏好选择就好~

备注:内容来源于stack exchange,提问作者Manoj Sreekumar

火山引擎 最新活动