在实际项目中,用户的电脑可能会进入 睡眠、休眠,或者切换网络、锁屏,甚至浏览器将页面冻结。这些情况会对网页的运行产生多方面的影响,比如 WebSocket 断开、渲染上下文丢失、定时器冻结 等。
本文整理了一份 前端容错恢复方案 Checklist,并为每个方案提供了 代码实现示例,帮助你在开发中逐项检查,提升应用的稳定性与可用性。
在实际项目中,用户的电脑可能会进入 睡眠、休眠,或者切换网络、锁屏,甚至浏览器将页面冻结。这些情况会对网页的运行产生多方面的影响,比如 WebSocket 断开、渲染上下文丢失、定时器冻结 等。
本文整理了一份 前端容错恢复方案 Checklist,并为每个方案提供了 代码实现示例,帮助你在开发中逐项检查,提升应用的稳定性与可用性。
import _ from "lodash-es";
export class ViewportHelper {
constructor({
designWidth = 1920,
designHeight = 1080,
baseFont = 16,
minFont = 10,
maxFont = 50,
useRem = false,
useScaleFit = false,
containerSelector = "#app",
delay = 100,
} = {}) {
this.designWidth = designWidth;
this.designHeight = designHeight;
this.baseFont = baseFont;
this.minFont = minFont;
this.maxFont = maxFont;
this.useRem = useRem;
this.useScaleFit = useScaleFit;
this.containerSelector = containerSelector;
this.delay = delay;
if (useRem && useScaleFit) {
this.useScaleFit = false;
console.warn(
`The useRem and useScaleFit options are mutually exclusive. useScaleFit will be disabled.`
);
}
this.onResize = _.debounce(() => {
if (this.useRem) this.setRem();
if (this.useScaleFit) this.scaleFit();
}, delay);
window.addEventListener("resize", this.onResize);
if (this.useRem) {
this.setRem();
}
if (this.useScaleFit) {
this.scaleFit();
}
}
setRem() {
const w = window.innerWidth;
const h = window.innerHeight;
// 同时考虑宽度和高度,取最小值作为比例基准
const ratio = Math.min(w / this.designWidth, h / this.designHeight);
const fontSize = Math.max(
this.minFont,
Math.min(this.maxFont, this.baseFont * ratio)
);
document.documentElement.style.fontSize = fontSize + "px";
}
destroy() {
window.removeEventListener("resize", this.onResize);
}
scaleFit() {
const container = document.querySelector(this.containerSelector);
if (!container) return;
const w = window.innerWidth;
const h = window.innerHeight;
const scale = Math.min(w / this.designWidth, h / this.designHeight);
container.style.width = `${this.designWidth}px`;
container.style.height = `${this.designHeight}px`;
container.style.transformOrigin = "center center";
container.style.position = "absolute";
container.style.left = "50%";
container.style.top = "50%";
container.style.transform = `translate(-50%, -50%) scale(${scale})`;
container.style.border = `1px solid red`;
}
}
在 JavaScript 中,Proxy 可以拦截并自定义对象的基本操作,但它并不是目标对象的透明代理。即使不做任何拦截,Proxy 也无法完全模拟原始对象的行为,这主要源于 this 指向的变化问题。
const target = {
m() {
console.log(this === proxy); // true 当通过proxy调用时
}
};
const handler = {};
const proxy = new Proxy(target, handler);
target.m(); // false - 直接调用,this指向target
proxy.m(); // true - 通过proxy调用,this指向proxy

欢迎来到exploreoo的随笔, 有任何疑问请联系3351550900@qq.com, 或者联系作者: 138后头随便
适用场景:前端(Vite、Vue CLI/Webpack、CRA、Next.js、Nuxt)、Node.js 服务端、容器化(Docker/K8s)、CI/CD。涵盖 构建时 vs 运行时、命名约定、优先级与加载顺序、安全与密钥管理、跨平台、类型校验 等。
.env 不会生效。若需要部署后能改,用运行时注入(env.js / config.json / Nginx envsubst)。VITE_、VUE_APP_、REACT_APP_、NEXT_PUBLIC_、Nuxt 的 runtimeConfig.public)。.env.local > .env.[mode] > .env > 系统环境;但不同工具略有差别。envalid、zod 在启动时校验,能大幅降低拼写错误或缺失导致的线上故障。PWA 是一种结合了 Web 与原生应用优势的前端技术架构,核心能力包括:
必须是跨域的场景下,当你通过浏览器发送一个请求时,为了保证跨域安全控制,浏览器不会立即发送该请求,而是自动先发起一个 OPTIONS 请求,询问目标服务器是否允许你真正的请求行为,这就是所谓的预检请求(preflight request)。
另外,预检请求不会携带cookies,即使设置了withCredentials: true或者credentials: 'include'。
跨域场景的前提下,只要满足以下任一条件,就会触发预检请求:
GET、POST 或 HEAD(如:PUT、DELETE)Authorization、X-Token、Content-Type: application/json),也就是除以下这些之外的:
AcceptAccept-LanguageContent-LanguageContent-Type(仅限 text/plain、multipart/form-data、application/x-www-form-urlencoded)在现代前端开发中,合理使用 CDN 可以显著提升应用加载速度,但同时也带来了可用性挑战。本文将深入探讨如何实现稳健的 CDN 加载策略,包括开发与生产环境的不同处理方式,以及必不可少的 fallback 机制。