React项目中TS报错解决方案

文章总结了在Umi、React、Vue3和TypeScript开发中遇到的问题及其解决方案,包括Redux开发工具报错、Storereducer的类型问题、ts写法的异常、热刷新与持久化冲突、Echarts的自适应和事件处理、ReactHooks的使用规范、umi的useRequest和useModel、微前端配置问题以及antdUpload组件的业务处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Umi&&React&&Vue3&&TS报错解决方案总结(个人向)

Redux开发工具报错window下没有某属性

解决方案,项目根目录创建global.d.ts文件

export { global }
/**
 *  解决redux开发工具报错
 */
declare global {
  interface Window {
    // 属性为redux开发工具对应属性
    // const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
    // const store = createStore(persistedReducer, composeEnhancers());
    __REDUX_DEVTOOLS_EXTENSION_COMPOSE__: Function
  }
}

Store中reducer因为接口问题报错,ts类型不能分配问题

将reducer声明处定位指定属性或者any即可

ts写法useRef声明报错问题

const child: any = useRef<ReactNode>(null)
其中null为初始化声明,ReactNode是子组件的类型推断,any防止子组件使用时报错,面向any的ts写法…

Umi开启热刷新后persisit冲突无法持久化

暂未解决,目前只好关闭热刷新,保证persist正常运行

redux-persisit刷新无法持久化?

需要关注reducer文件中是否使用不可变对象,或者正确结构,否则会被覆盖,推荐使用immer等不可变对象操作

echarts自适应多种设备的时候,事件监听无法关闭?

正难则反,将echart取出,在外部去监听并关闭时候取消监听

//echart组件中
 useEffect(() => {
    let { myChart } = initoneEchart()
    // renderChart()
    console.log(myChart);
    const listener = () => {

      // if (!myChart) {
      //   console.log(22);
      //   window.removeEventListener('resize', listener)
      // }
      console.log(11);
      myChart && myChart.resize()
    }
    window.addEventListener('resize', listener)
    return () => {
      window.removeEventListener('resize', listener)
    }
  })
  /** echart初始化 **/
  // echarts
  const initoneEchart = () => {
    type EChartsOption = echarts.EChartsOption
    let chartDom = document.getElementById('container')!;
    let myChart = echarts.init(chartDom);
    let option: EChartsOption;

    option = {
      xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
      },
      yAxis: {
        type: 'value'
      },
      series: [
        {
          data: [820, 932, 901, 934, 1290, 1330, 1320],
          type: 'line',
          smooth: true
        }
      ]
    };

    option && myChart.setOption(option);
    return {
      myChart
    }
  }

React报错Invalid hook call. Hooks can only be called inside of the body of a function component.

检查react版本是否大于16.8,是否将useHooks等用在组件头部(官方规定)

umi的useRequset结构以及fetch解构

umi的request,useRequset底层也是fetch封装,需要多一个then返回res对象并以res.json()方式序列化导出,推荐不可变对象进行深拷贝导出复制等操作

  fetch('http://localhost:8000/api/users').then(res => res.json()).then(res => {
    console.log(res);
  })

umi的useModel使用问题

umi的plugin-initial-state使用问题

文档规定了在app.ts中写入一个async函数,注意,必须是async异步函数,否则报错,无法获取,且该插件必须与useModel搭配使用,即src/models 目录下有 hooks model 时启用.
useModel为umi封装的全局状态管理工具,后续微前端也推荐该方法使用进行父子项目通讯,

// src/app.ts
// 此处进行请求设置或者async异步操作警醒存取即可
export async function getInitialState() {
  const data = await fetchXXX();
  return data;
}

umi的plugin-initial-state使用后persist持久化报错问题

报错如下:TypeError: Cannot read properties of null (reading ‘_store’)
意思无法读取app.ts中缓存的数据,则无法拿到_store对象无法缓存,
缓存代码如下:

//其余代码没贴,此处是app.ts中dom更新及使用persist的diff计算并进行存储
window.addEventListener('DOMContentLoaded', () => {
  const app = getDvaApp()
  console.log(app, 997);
  persistStore(app._store)
})

React模板字符串生成dom后点击事件触发问题

需求是使用高德地图,生成marker后,点击marker有infowindow窗口,然后点击关闭按钮关闭窗口

 let infoWindow = initInfoWindow(e.data.name)
 infoWindow.open(mapBox, [e.data.lnglat[0], e.data.lnglat[1]]);
 //在生成infoWindow中的content内容区后,在进行dom获取和绑定,否则直接绑定会报错方法未定义及click事件不存在等错误
 let dom1: any = document.getElementById('info_click')
dom1.onclick = () => {
    mapBox.clearInfoWindow()
}

由于机制问题,会读取到空值,因此将DOMContentLoaded改为load即可正常

Umi-@qiankun配置微前端bug

报错1:Disconnected from the devServer, trying to reconnect…但可显示界面

**原因分析:**由于umi有node启动的环境以及websocket实施监听热刷新机制,因此,会出现该报错
方案一:配置的子应用socket端口应该放在主应用上
在/scr/.env文件中配置SOCKET_SERVER=‘主应用地址url’,但是,如果开发期间主应用没开启呢?那岂不是又要提示影响开发?
方案二:packjson中取消socket机制
在packjson中的启动项中加入如下代码
"start": "set PORT=8089 SOCKET_SERVER=none && umi dev",
重启一下即可

报错2:You are attempting to use a basename on a page whose URL path does not begin with the basename. Expected path “/” to begin with “/app1”

该报错并没爆红,但是出现了提示,有强迫症的哥们会想去掉,或者找到原因,于是…
方案1:在.umirc的配置中写入base路径?这个配置项目前被弃用,而且行不通
方案2:调整route的路径配置?虽然一定程度可行,但是等于重新调整结构,麻烦,且不彻底
方案3:在子应用中的umirc文件中得到defineConfig中写入base配置项为’/'即可,此时不报错,解决!
总结:报错1和报错2都是属于微应用的配置问题,如果出现配置后不生效问题,尝试重新刷新或者修改配置重启覆盖.umi文件的临时文件,或者删除.umi缓存重新修改,总之,可能是缓存导致没有生效,多尝试修改下即可

antd4版本中的upload组件业务bug解决

由于4版本的upload的事件仅有onChange无法像其他组件做到onSuccess一样处理,但是业务又要对成功的图片进行特殊处理,放到指定数组中并渲染视图**,且在onChange中写业务代码会有三次的执行特性,源于antd对上传的特殊处理,对此,有的版本会识别response.code==='‘200’'或者status==='done’去特殊识别,但是有的版本又无法通过该方法进行**,由此,我们考虑曲线救国,在beforeUpload事件中进行预处理,利用函数颗粒化beforeUpload={(e) => { handleBefore({ origin: e, upItem: item }) }},并在其中利用image的onload事件去处理成功上传后的业务代码

// beforeUpload={(e) => { handleBefore({ origin: e, upItem: item }) }}
const handleBefore = (e: any) => {
    const { origin, upItem } = e
    if (origin instanceof Blob) { // 类型检查
      const img = new Image();
      img.src = URL.createObjectURL(origin);
      img.onload = () => {
        URL.revokeObjectURL(img.src);
        // 后续处理
        if (upItem?.name === 'bills') {
          // 业务代码
          // createBillItem(1)
        }
        if (upItem?.name === 'udicode') {
         // 业务代码
         // createUdiItem(1)
        }
      };
    }
  }

未完待续…

<think>好的,用户现在的问题是关于如何在React项目打包时配置忽略报错。首先,我需要回顾一下之前的对话历史。用户之前遇到了一个Next.js项目在打包时报错,具体是预渲染404页面时找不到localStorage的问题,因为服务器端没有这个API。我当时给出了详细的解决方案,包括环境判断、动态导入、配置修改等。现在用户的新问题更广泛,不是针对某个具体错误,而是如何配置打包过程忽略所有报错。 首先,我需要确认用户的需求。用户可能希望在构建过程中即使有错误也继续生成打包文件,可能是为了快速测试或绕过暂时无法解决的错误。但需要注意,忽略报错可能有风险,导致生产环境的应用出现问题,所以需要提醒用户谨慎使用。 接下来,我需要考虑不同的构建工具,比如Create React App(CRA)、Next.js、Vite等,因为不同工具的配置方式不同。用户之前使用的是Next.js,但问题现在是更广泛的React项目,所以可能需要涵盖多个工具。 对于CRA,通常使用react-scripts,官方不建议直接修改配置,但可以通过环境变量或eject来修改webpack配置。用户可能不想eject,所以需要找到不eject的方法。例如,设置CI环境变量为false可能阻止构建失败,但可能不适用于所有情况。或者使用第三方工具如react-app-rewired来覆盖配置。 对于Next.js,可以通过next.config.js中的配置来忽略错误,比如关闭静态优化或修改onDemandEntries的配置。另外,自定义Webpack配置,将ignoreWarnings选项添加到webpack配置中,忽略特定错误。 Vite的话,配置vite.config.js中的build选项,设置logLevel为'silent'或处理钩子来忽略错误。 另外,通用方法可能包括使用进程管理工具,比如在命令行中即使构建失败也继续后续步骤,但这可能不适用于所有情况。或者通过try-catch在代码中捕获错误,但这可能不适用于构建阶段的错误。 需要提醒用户,忽略报错只是临时解决方案,长期应解决根本问题。构建错误通常意味着代码中存在需要修复的问题,忽略可能导致运行时错误。 用户可能的深层需求是希望构建过程不中断,可能是为了自动化部署或测试环境,但需要权衡风险。需要给出不同场景下的解决方案,并强调潜在风险。 总结回答结构:先说明风险,然后分不同构建工具给出配置方法,再给出通用方案,最后强调正确做法。需要结构清晰,步骤明确,并提供代码示例。</think>--- ### 一、核心思路与风险提示 **核心目标**:通过配置让构建工具(Webpack/Vite/Next.js)**忽略错误并继续生成打包文件**。 **风险警告**:此操作可能导致生产环境出现不可预知问题,仅建议**临时调试**使用,正式环境应修复根本问题。 --- ### 二、分场景配置方案 #### 场景1:Create React App(CRA项目) **方案1:强制绕过错误检测(不推荐)** 修改 `package.json` 脚本添加环境变量: ```json { "scripts": { "build:force": "CI=false react-scripts build" // 强制忽略错误 } } ``` **方案2:定制Webpack配置(稳定方案)** 使用 `react-app-rewired` 覆盖配置: 1. 安装工具: ```bash npm install react-app-rewired --save-dev ``` 2. 创建 `config-overrides.js`: ```javascript module.exports = function override(config) { config.stats = 'errors-only'; // 只显示错误 config.ignoreWarnings = [ { module: /node_modules/ }, // 忽略node_modules内所有警告 { message: /Failed prop type/ } // 忽略PropTypes校验错误 ]; return config; }; ``` 3. 修改 `package.json`: ```json { "scripts": { "build": "react-app-rewired build" } } ``` --- #### 场景2:Next.js项目 **方案1:禁用严格模式** 修改 `next.config.js`: ```javascript module.exports = { reactStrictMode: false, // 关闭React严格模式 eslint: { ignoreDuringBuilds: true }, // 构建时忽略ESLint错误 typescript: { ignoreBuildErrors: true } // 忽略TypeScript错误 }; ``` **方案2:自定义Webpack错误处理** 在 `next.config.js` 中添加: ```javascript module.exports = { webpack: (config) => { config.stats = 'errors-only'; // 仅输出错误 config.ignoreWarnings = [ { module: /node_modules/ }, // 忽略第三方库警告 { message: /Critical dependency/ } // 忽略关键依赖警告 ]; return config; } }; ``` --- #### 场景3:Vite项目 **方案1:静默构建模式** 修改 `vite.config.js`: ```javascript export default defineConfig({ build: { logLevel: 'silent' // 完全静默输出 }, esbuild: { logOverride: { 'this-is-undefined-in-esm': 'silent' } // 屏蔽特定ESBuild错误 } }); ``` **方案2:错误回调拦截** 通过插件拦截错误: ```javascript // vite.config.js export default defineConfig({ plugins: [ { name: 'ignore-errors', handleHotUpdate({ server }) { server.ws.on('error', (err) => { if (err.message.includes('Unexpected token')) return; }); } } ] }); ``` --- ### 三、操作系统级暴力方案(全项目通用) **方案1:强制管道输出** 在命令行中添加错误重定向: ```bash # Linux/macOS npm run build 2>/dev/null # Windows npm run build 2> nul ``` **方案2:进程欺骗** 使用 `|| true` 强制返回成功状态码: ```bash npm run build || echo "构建失败被忽略" # 继续后续CI/CD流程 ``` --- ### 四、错误忽略的副作用与正确实践 #### 潜在风险表 | 忽略类型 | 可能后果 | 紧急程度 | |-------------------|----------------------------|----------| | 语法错误 | 页面白屏/功能完全失效 | ⚠️⚠️⚠️ | | 依赖缺失 | 运行时模块加载崩溃 | ⚠️⚠️ | | 类型错误(TS) | 生产环境数据异常 | ⚠️⚠️ | | 资源加载失败 | 图片/样式丢失 | ⚠️ | #### 正确操作流程 ```mermaid graph TD A[构建报错] --> B{错误类型分析} B -->|语法/逻辑错误| C[定位具体代码行] B -->|依赖问题| D[检查package.json] B -->|环境问题| E[验证Node.js版本] C --> F[修复后重新构建] D --> F E --> F ``` --- ### 五、扩展工具推荐 | 工具名称 | 作用 | 安装命令 | |--------------------|--------------------------|----------------------------| | `webpack-ignore` | 动态忽略指定模块 | `npm install webpack-ignore` | | `source-map-explorer` | 分析构建错误来源 | `npm install source-map-explorer` | | `eslint-loader` | 只检查不阻断构建 | `npm install eslint-loader` | --- **总结**:忽略构建报错可通过配置实现,但本质上属于**饮鸩止渴**。建议通过 `console.log` 调试、`debugger` 语句或 `--inspect` 参数定位真实错误源。长期项目应配置完善的CI/CD检查流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值