如何禁用来自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默认参数:
- 先安装必要的开发依赖:
npm install react-app-rewired customize-cra --save-dev
- 在项目根目录创建
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; } );
- 修改
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




