服务端2月25日 22:51
WebView 能跑 PWA 吗?离线应用和 Service Worker 支持情况如何?## WebView 能跑 PWA 吗?离线应用和 Service Worker 支持情况如何?
WebView 对 PWA 的支持**严重受限**,不能直接当作浏览器使用 PWA。
**Service Worker**:Android WebView 从 Chrome 40+ 支持注册,但需手动启用 `setJavaScriptEnabled + setDomStorageEnabled`。iOS WKWebView 自 iOS 11.3 支持 Service Worker,但有限制——默认不共享浏览器 SW 缓存。
**离线应用核心障碍**:
- **Manifest 注册**...服务端2月25日 23:04
WebView 中视频播放有哪些坑?如何处理全屏和自动播放?## WebView 中视频播放有哪些坑?如何处理全屏和自动播放?
WebView 内嵌视频的核心问题集中在**全屏切换、自动播放限制、硬件加速**三方面。
**自动播放**:多数浏览器禁止带声音自动播放。Android 需设置 `mediaPlaybackRequiresUserGesture = false`(API 17+),iOS WKWebView 设置 `mediaTypesRequiringUserActionForPlayback = []`。静音视频自动播放限制更宽松。
**全屏播放**:HTML5 video 全屏时 Android 需实现 `onShowCus...服务端2月25日 23:04
WebView 如何拦截和修改网络请求?shouldInterceptRequest 能做什么?## WebView 如何拦截和修改网络请求?shouldInterceptRequest 能做什么?
Android 用 `shouldInterceptRequest`(WebViewClient),iOS 用 `WKURLSchemeHandler`(WKWebView)拦截请求,可读取 URL/Headers 并返回自定义响应。
**Android shouldInterceptRequest**:
- 非 UI 线程回调,不可操作 View
- 返回 WebResourceResponse 即替换原始响应,返回 null 走默认逻辑
- 仅拦截 GET/POST 等 HTT...服务端2月25日 23:05
WebView 如何与原生页面混合使用?混合栈有哪些坑?## WebView 如何与原生页面混合使用?混合栈有哪些坑?
WebView 与原生页面混合使用指在同一 App 中交替展示 H5 页面和原生页面,形成**混合导航栈**。核心方案:
1. **容器模式**:Native 提供 WebView 容器 Activity/ViewController,H5 页面作为容器内容
2. **路由分发**:URL Scheme 或 JS Bridge 指令决定跳转原生还是 WebView
3. **栈管理**:统一路由层维护混合栈,处理前进/后退的页面类型判断
关键注意事项:
- **回退逻辑**:WebView 内部有历史栈,按返回键需先回退...服务端2月25日 23:37
Canvas fillText 和 strokeText 有什么区别?如何实现高级文本效果?## Canvas fillText 和 strokeText 有什么区别?如何实现高级文本效果?
**fillText** 绘制实心文字,**strokeText** 绘制文字轮廓(空心),两者共用 font、textAlign、textBaseline 属性。调用签名:`fillText(text, x, y [, maxWidth])`,maxWidth 超出时自动压缩。
关键要点:
- **同时使用**:先 strokeText 再 fillText,可做出描边+填充效果,避免填充被描边覆盖
- **measureText**:获取文本宽度做布局计算,返回 TextMetri...服务端2月28日 22:28
axios 如何实现并发请求和取消请求?代码怎么写?axios 的并发和取消分别基于 **Promise.all 和 AbortController/CancelToken**。
**并发请求:** 使用 `Promise.all` 同时发起多个请求,全部成功返回结果数组,任一失败则整体失败。`axios.all` 已废弃(v0.27+),直接用 `Promise.all`。需要逐个处理结果用 `Promise.allSettled`,无论成功失败都返回每个请求的状态。
```js
// 并发请求
const [users, posts] = await Promise.all([
axios.get('/api/users'),...服务端2月28日 22:31
axios 文件上传下载怎么做?进度监控和 CSRF 防护如何实现?axios 的高级特性主要有 **文件上传下载、进度监控、CSRF 防护、实例封装**。
**文件上传:** 使用 FormData 构建请求体,设置 `Content-Type: multipart/form-data`(axios 自动识别 FormData 并设置)。分片上传需手动将文件切片(Blob.slice),逐片上传并在后端合并。上传示例:`const form = new FormData(); form.append('file', fileBlob); axios.post('/upload', form)`。
**文件下载:** 配置 `responseType...服务端2月28日 22:33
axios 和 fetch 有什么区别?什么时候该用 axios 而非 fetch?axios 和 fetch 的核心区别在 **错误处理、拦截器、请求取消、数据转换、兼容性** 五个方面。
**错误处理:** fetch 只有网络故障才 reject,HTTP 4xx/5xx 仍走 resolve,需手动检查 `response.ok`;axios 自动将 4xx/5xx 转为 reject,错误处理更符合直觉。
**拦截器:** axios 内建请求/响应拦截器,统一添加 Token、处理错误码;fetch 无拦截器,需手动包装或用第三方库。
**请求取消:** axios 支持 CancelToken 和 AbortController;fetch 只支持 ...服务端2月28日 22:35
axios 性能优化有哪些技巧?如何减少冗余请求?axios 性能优化围绕 **请求去重、缓存、并发控制、体积优化** 四个维度。
**请求去重:** 对同一接口的并发请求做合并,避免重复发送。实现方式:在请求拦截器中用 URL+参数生成 key,维护一个 Map 记录正在进行的请求,相同 key 的请求复用同一个 Promise,响应后删除 key。也叫"请求锁"或"请求合并"。
**请求缓存:** 对不常变的数据(配置信息、字典表)做本地缓存。在响应拦截器中按 URL+参数缓存响应,设置 TTL 过期。也可用 HTTP 缓存头(Cache-Control、ETag)配合浏览器缓存,axios 的 `adapter` 可实现自定义...服务端2月28日 23:14
axios 存在哪些安全风险?如何防范 XSS 和 CSRF 攻击?axios 的安全风险集中在 **CSRF、XSS、敏感数据泄露、SSRF** 四个方面。
**CSRF 防护:** axios 内置 CSRF 防护,通过 `xsrfCookieName` 和 `xsrfHeaderName` 配置自动从 Cookie 读取 Token 并附加到请求头。后端需设置 `Set-Cookie: XSRF-TOKEN=xxx`,前端配置 `axios.defaults.xsrfCookieName = 'XSRF-TOKEN'`。对于 SameSite Cookie 策略,建议后端设置 `SameSite=Strict` 或 `Lax` 作为双重保障。
...