服务端2月24日 23:02
React Query 如何处理错误和重试?哪些错误不该重试?React Query 的错误处理要分两层:组件里展示用户能看懂的错误,全局里做日志和兜底通知。重试不要一刀切,网络抖动和 5xx 可以重试,401、403、404、表单校验这类 4xx 通常不该重试;否则只是把错误请求重复打到服务端。
## 追问
### retry 默认是几次?
浏览器端查询默认会重试 3 次,并使用退避延迟;服务端渲染场景通常不建议重试太多,否则会拖慢响应。
### retry 和 refetch 有什么区别?
retry 是一次请求失败后的自动补救,refetch 是用户或程序主动重新拉取。错误页里的“再试一次”通常调用 refetch 或 reset err...服务端2月24日 23:04
React Query 如何与 Suspense 集成?错误边界怎么处理?React Query 接入 Suspense 后,加载状态交给 Suspense fallback,错误交给 Error Boundary。实际项目里优先用 useSuspenseQuery,而不是在每个组件里判断 isLoading。注意:开启 Suspense 不代表不用管错误,网络失败会抛给最近的错误边界;如果要让“重试”按钮生效,还要配 QueryErrorResetBoundary。
## 追问
### useSuspenseQuery 和 useQuery 有什么区别?
useSuspenseQuery 成功返回时 data 一定有值,加载中会挂起组件。你少写了 load...服务端2月24日 23:05
React Query 项目中如何组织查询和命名 query key?项目里不要把 useQuery 散落在组件里。更稳的做法是按业务域组织:API 函数只负责请求,自定义 Hook 负责暴露查询,query key 工厂负责命名和失效。query key 用数组,从宽到窄写,比如 ['users', 'detail', id];凡是 queryFn 依赖的参数都必须进 key,否则缓存可能串数据。
## 追问
### 为什么不建议直接写字符串 key?
字符串很难表达层级,也不方便批量失效。数组 key 可以让你失效整个用户域、某个详情页,或某个筛选列表。
### API 函数和 Hook 为什么要分开?
API 函数可独立测试,也能被预取、SSR、...服务端2月25日 21:48
什么是 WebRTC?它的核心组成部分有哪些?WebRTC 是浏览器里的实时音视频和数据通信能力,核心价值是不用插件就能让两个端建立低延迟连接。它主要由三块组成:媒体采集用 `getUserMedia` 拿摄像头、麦克风;连接与协商用 `RTCPeerConnection` 处理 SDP、ICE、加密和媒体传输;任意数据传输用 `RTCDataChannel`。另外要记住:WebRTC 不自带信令服务,房间、呼叫、offer/answer 和 candidate 交换通常由业务用 WebSocket 或 HTTP 自己实现。
## 追问
### WebRTC 是完全点对点吗?
不一定。能直连时媒体可以 P2P;直连失败会走 TUR...服务端2月25日 21:49
WebRTC 如何实现 NAT 穿透?STUN、TURN 和 ICE 分别做什么?WebRTC 的 NAT 穿透不是靠某一个协议硬打洞,而是由 ICE 统一调度:先收集本地地址,再用 STUN 拿到公网映射地址,最后在直连失败时走 TURN 中继。面试里可以这样答:STUN 负责“我在公网看起来是谁”,TURN 负责“直连不通时替我转发”,ICE 负责“把所有候选路径试一遍,选能通且质量最好的”。生产环境只配 STUN 不够,遇到对称 NAT、企业防火墙或 UDP 被限制时,必须有 TURN 兜底。
## 追问
### STUN 和 TURN 有什么区别?
STUN 只参与建连阶段,帮助发现公网 IP 和端口,媒体流通常仍然点对点传输。TURN 会一直在媒体路径上转...服务端2月25日 23:39
Canvas 如何进行图像处理和像素操作?Canvas 图像处理就是四步:`drawImage` 把图片、视频帧或另一个 Canvas 画上去;`getImageData` 读出像素;修改 `data` 里的 RGBA;再用 `putImageData` 写回。`data` 是 `Uint8ClampedArray`,每个像素 4 个值,位置从 `i * 4` 开始。九参数 `drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh)` 可同时裁剪和缩放,雪碧图截帧、头像裁剪常用。跨域图必须服务端开 CORS,并给图片设置 `crossOrigin="anonymous"`,否则读像素会抛 `S...服务端2月28日 20:39
Shell 中 if 和 case 语句有什么区别?如何使用?`if` 适合判断条件真假,比如文件是否存在、变量是否为空、命令是否执行成功;`case` 适合一个变量匹配多个模式,比如菜单选项、文件后缀、运行环境。写 Shell 条件判断时,变量要加引号,复杂字符串判断优先用 `[[ ]]`,数字计算用 `(( ))`。
## 追问
### `[ ]` 和 `[[ ]]` 有什么区别?
`[ ]` 是传统 test 写法,兼容性好但限制多;`[[ ]]` 是 Bash 扩展,支持 `&&`、`||`、模式匹配和正则,变量未加引号时也更不容易出错。写 Bash 脚本通常优先用 `[[ ]]`。
### if 能直接判断命令结果吗?
可以。`if...服务端2月28日 20:42
grep、sed、awk 和 cut 分别适合处理什么文本问题?Shell 文本处理常用四件套:`grep` 负责找行,`sed` 负责按规则改行,`awk` 负责按列计算和格式化,`cut` 负责简单切字段。判断工具时别背命令,先看问题:是搜索、替换、列处理,还是固定分隔符提取。
## 追问
### grep 适合什么?
适合按关键字或正则筛选行。常用参数是 `-i` 忽略大小写、`-n` 显示行号、`-r` 递归目录、`-v` 反向过滤。
### sed 和 awk 怎么区分?
`sed` 更像“流式编辑器”,擅长替换、删除、打印某段行;`awk` 更像“小型报表工具”,擅长按字段取列、条件过滤、求和统计。
### cut 还有必要学吗?...服务端2月28日 20:44
Shell 脚本中如何定义和使用数组?Shell 数组主要分两类:普通数组和关联数组。普通数组用数字下标,适合保存文件名、参数列表;关联数组用字符串 key,适合保存配置。写脚本时最重要的一点是:访问数组尽量用双引号包住 `"${arr[@]}"`,否则遇到空格文件名会翻车。
## 追问
### 普通数组怎么定义和读取?
普通数组用空格分隔定义,索引从 0 开始。`${arr[0]}` 取第一个元素,`${arr[@]}` 取全部元素,`${#arr[@]}` 取长度。
### `${arr[@]}` 和 `${arr[*]}` 有什么区别?
加双引号时区别最大:`"${arr[@]}"` 会保留每个元素的边界,`"$...服务端2月28日 20:49
如何在浏览器中正确加载和初始化 OpenCV.js?OpenCV.js 在浏览器里不能只看 `script onload`,真正可用要等 WASM 运行时初始化完成。常见方式有三种:CDN 引入、本地静态文件、npm 包。最稳的判断是监听 `cv.onRuntimeInitialized`,否则很容易出现 `cv.imread is not a function` 或方法尚未挂载的问题。
## 追问
### CDN 怎么写才安全?
`script` 的 `onload` 只代表文件下载完成,不代表 OpenCV 运行时准备好了。应在 onload 里设置 `cv.onRuntimeInitialized`,初始化完成后再启用按钮或调用...