这是我为准备前端/全栈开发工程师面试整理的第29天每日三题练习:
✅ 题目1:Web Components技术全景解析
核心三要素
Custom Elements(自定义元素)
class MyButton extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = ` <button><slot></slot></button> <style> button { padding: 8px 16px; } </style> `; } } customElements.define('my-button', MyButton);
Shadow DOM(影子DOM)
<!-- 使用示例 --> <my-button>点击我</my-button>
HTML Templates(模板标签)
<template id="user-card"> <div class="card"> <h2><slot name="name"></slot></h2> </div> </template>
与主流框架对比
特性 | WebComponents | React/Vue |
---|---|---|
渲染引擎 | 浏览器原生 | 虚拟DOM |
样式隔离 | Shadow DOM天然支持 | CSS-in-JS/Scoped |
包体积 | 无运行时 | 需要框架运行时 |
学习曲线 | 较高 | 中等 |
浏览器兼容方案
// 动态加载polyfill
if (!('customElements' in window)) {
await import('https://unpkg.com/@webcomponents/webcomponentsjs');
}
✅ 题目2:React 18并发模式原理剖析
并发模式核心机制
可中断渲染
// 使用startTransition标记非紧急更新 import { startTransition } from 'react'; function handleInput(text) { startTransition(() => { setSearchText(text); // 低优先级更新 }); }
自动批处理优化
// React 17及之前:多次渲染 setCount(c => c + 1); setFlag(f => !f); // React 18自动批处理:单次渲染
Suspense数据流
<Suspense fallback={<Loading />}> <LazyComponent /> </Suspense>
性能优化示例
// 使用useTransition管理加载状态
function App() {
const [isPending, startTransition] = useTransition();
return (
<div>
{isPending && <Spinner />}
<button onClick={() => {
startTransition(() => {
loadData();
});
}}>
加载数据
</button>
</div>
);
}
✅ 题目3:微服务网关设计实践指南(Nodejs)
核心功能设计
动态路由配置
// 使用Express实现 const gateway = express(); const routeTable = { '/user-service/*': 'http://user-cluster:3000', '/order-service/*': 'http://order-cluster:3001' }; gateway.all('*', (req, res) => { const path = req.path; const target = Object.entries(routeTable) .find(([prefix]) => path.startsWith(prefix))?.[1]; if (!target) return res.status(404).send(); // 代理请求 httpProxy.web(req, res, { target }); });
熔断降级策略
// 使用circuit-breaker-js const CircuitBreaker = require('circuit-breaker-js'); const breaker = new CircuitBreaker({ timeoutDuration: 5000, failureThreshold: 3 }); app.get('/api', (req, res) => { breaker.run(() => fetchService(), { success: data => res.send(data), failure: err => res.status(503).send('服务暂不可用') }); });
JWT鉴权流程
const jwt = require('jsonwebtoken'); gateway.use((req, res, next) => { try { const token = req.headers.authorization.split(' ')[1]; req.user = jwt.verify(token, SECRET_KEY); next(); } catch (err) { res.status(401).send('无效凭证'); } });
高可用设计方案
方案类型 | 实现方式 | 适用场景 |
---|---|---|
集群部署 | Nginx+Keepalived双活 | 百万级QPS系统 |
流量染色 | Header携带环境标识 | 灰度发布 |
动态限流 | Redis令牌桶算法 | 秒杀活动 |
📅 明日预告:
- TypeScript类型体操技巧
- Vue3编译器优化原理
- 分布式链路追踪系统设计
💪 坚持每日三题,未来更进一步!如果你也在准备面试,欢迎一起刷题打卡!