因为…所以… — 从DOM操作到现代前端架构的完整因果推导
SPA只有一个空HTML+大JS包 → 首屏要等JS下载完才能渲染 → 白屏时间长
搜索引擎爬虫不执行JS → 看不到内容 → SEO差
每个请求都要在服务器渲染HTML → TPS上不去 → 服务器成本比CDN贵10倍
因为大部分页面内容不频繁变 → 所以构建时就把HTML生成好,放CDN上,0服务器成本
| 方案 | 渲染时机 | 因为…所以选 |
|---|---|---|
| CSR | 浏览器 | 因为不需要SEO → 管理后台等内部系统 |
| SSR | 每次请求时 | 因为需要SEO+内容实时 → 电商详情页 |
| SSG | 构建时 | 因为内容不常变 → 博客/文档/营销页 |
| ISR | 构建时+定时更新 | 因为大部分不变但偶尔更新 → 博客+最新文章 |
"Prop Drilling"——像传纸条一样,中间每个人都要传,谁也不看
类比:公司公告栏——不用一个人一个人传,直接贴公告栏,谁需要谁去看
因为Webpack要打包所有模块再启动 → 大项目冷启动30秒+ → 所以Vite用浏览器原生ESM,按需编译,冷启动1秒
因为写三套代码(H5+iOS+Android)成本3倍 → 所以需要跨端
| 方案 | 原理 | 因为…所以选 |
|---|---|---|
| H5/小程序 | Web技术 | 因为开发快 → 所以做运营页/简单应用 |
| React Native | JS→原生组件 | 因为要原生体验+JS生态 → 所以选RN |
| Flutter | Dart→自绘引擎 | 因为要一致体验+高性能 → 所以选Flutter |
| UniApp | Vue→多端编译 | 因为国内小程序多 → 所以UniApp一套代码多端 |
因为Google统计:加载每增加1秒 → 转化率下降7% → 所以性能优化不是可选是必选
| 因为 | 所以 | 具体方案 |
|---|---|---|
| JS包太大 | → 代码分割 | 路由懒加载 () => import('./Page.vue') |
| 图片太大 | → 图片优化 | WebP格式 + 懒加载 + CDN缩略图 |
| 首屏要等数据 | → 预加载 | prefetch/prerender + SSR首屏 |
| 重复请求 | → 缓存 | HTTP缓存 + 本地缓存 + Redis |
| 渲染阻塞 | → 异步加载 | script defer/async + CSS critical path |
| 面试题 | 因为…所以… |
|---|---|
| SPA vs SSR vs SSG | 因为SPA首屏慢/SEO差 → SSR;因为SSR贵 → SSG |
| Vue响应式原理 | 因为要数据驱动 → Proxy拦截getter/setter → 依赖收集+派发更新 |
| Virtual DOM | 因为直接操作DOM慢 → 所以用JS对象模拟DOM → diff最小更新 |
| Pinia vs Vuex | 因为Vuex有mutation/action冗余 → 所以Pinia更简洁 |
| Vite vs Webpack | 因为Webpack冷启动慢 → 所以Vite用ESM按需编译 |
| 跨端方案 | 因为写三套代码成本3倍 → 所以RN/Flutter/UniApp |