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

react-router useParams()在编译部署后出现TypeError: (0 , o.UO) is not a function错误(本地开发正常)

react-router useParams()在编译部署后出现TypeError: (0 , o.UO) is not a function错误(本地开发正常)

我之前在部署React项目到GitHub Pages时也碰到过几乎一模一样的生产环境钩子报错问题,结合你的代码和报错信息来看,大概率是生产构建时的依赖兼容性、代码细节不严谨,或者部署配置遗漏导致的,下面给你几个具体的排查和解决方向:


1. 先修复代码里的细节问题(避免构建时的异常压缩)

你的代码本地能跑,但有几个不规范的地方,生产环境的压缩/优化工具(比如Terser)可能会把这些细节放大,导致函数被误处理:

问题1:search()函数的遍历逻辑冗余且不严谨

你用Object.keys(Chips).map()遍历查找匹配项,但map是用来转换数组的,不是做查找的——即使找到匹配项也会继续遍历,效率低还容易出逻辑漏洞。改成find更合理:

// 优化后的查找逻辑
const search = () => {
  if (!id) return false;
  // 直接用Object.values获取所有chip,用find快速匹配
  return Object.values(Chips).find(chip => chip.name === id) || false;
}

问题2:函数拼写错误 + 依赖引用不清晰

  • intiChipValue是拼写错误,应该改成initChipValue(虽然本地不影响,但生产构建的严格检查可能触发异常)
  • useEffect依赖id,但内部调用的search()也依赖id,最好把查找逻辑直接移到useEffect里,减少外部依赖,避免构建工具的依赖分析异常:
// 简化后的状态初始化与更新逻辑
const [chipValue, setChipValue] = useState(false);

useEffect(() => {
  if (!id) {
    setChipValue(false);
    return;
  }
  const matchedChip = Object.values(Chips).find(chip => chip.name === id);
  setChipValue(matchedChip ? matchedChip.value : false);
}, [id]);

2. 检查react-router-dom的依赖配置

生产环境必须确保react-router-dom直接依赖(不是devDependency),而且版本和你的代码写法兼容:

  1. 先删除node_modulespackage-lock.json/yarn.lock
  2. 重新安装最新版依赖:
    npm install react-router-dom@latest
    
  3. 确认package.jsonreact-router-domdependencies字段下,而不是devDependencies

3. 配置GitHub Pages的路由base路径

如果你的项目是部署在项目站点(不是用户/组织主页,比如https://yourname.github.io/your-repo/),必须给BrowserRouter加上basename属性,否则路由跳转和参数解析会完全异常:

// 在项目的根路由配置文件中
import { BrowserRouter } from 'react-router-dom';

ReactDOM.createRoot(document.getElementById('root')).render(
  <BrowserRouter basename="/your-repo-name"> {/* 替换成你的仓库实际名称 */}
    <App />
  </BrowserRouter>
);

4. 排查构建压缩工具的问题

如果用的是Create React App,默认的Terser压缩有时候会误处理React钩子函数。可以先尝试不压缩构建测试:
修改package.jsonbuild脚本:

"scripts": {
  "build": "react-scripts build --minify=false"
}

构建后部署到GitHub Pages,如果能正常运行,说明是压缩工具的问题。这时候可以用craco或者react-app-rewired修改webpack配置,给Terser添加保留React钩子的规则:
比如在craco.config.js中:

module.exports = {
  webpack: {
    configure: (webpackConfig) => {
      webpackConfig.optimization.minimizer.forEach(minimizer => {
        if (minimizer.constructor.name === 'TerserPlugin') {
          minimizer.options.terserOptions.mangle = {
            reserved: ['useParams'] // 强制保留useParams函数名
          };
        }
      });
      return webpackConfig;
    }
  }
};

建议你先从代码修复开始试,再检查依赖和base路径——我之前就是因为没加basename+代码里的冗余遍历导致了几乎一样的错误,改完就正常运行了。

火山引擎 最新活动