38 分钟
AI 时代的全栈 App 开发实战

前端部署与 CDN:静态托管、全球加速、域名、HTTPS、PWA、性能优化

就干前端部署这事儿:静态托管、CDN全球加速、域名与DNS、HTTPS、PWA离线应用、前端性能优化(Core Web Vitals),学完能让前端应用快、稳、全球都能访问

  • 理解前端部署的特点:静态文件、CDN 加速、无需服务器运行时、全球分发
  • 掌握静态托管平台(Vercel/Netlify/GitHub Pages/Cloudflare Pages/对象存储+CDN)的选型和用法
  • 理解 CDN 的工作原理:边缘节点、缓存、回源、全球加速,学会配置缓存策略
  • 掌握域名注册、DNS 解析、HTTPS 证书的完整流程
  • 理解 PWA(渐进式 Web 应用)的核心能力:Service Worker、离线缓存、添加到主屏幕、推送通知
  • 掌握前端性能优化:Core Web Vitals(LCP/FID/INP/CLS)、代码分割、懒加载、资源优化、缓存策略
  • 就说前端部署的工程实践:CI/CD自动部署、版本管理、回滚、缓存失效、环境变量
  • 就拿朋友好学 App 静态导出加 Capacitor 打包这事,说清前端部署和 App 打包的关联

前端部署的特点

前端部署和后端部署不一样:前端是静态文件,包括HTML/CSS/JS/图片/字体,构建完就是这堆文件,不需要Node/PHP/Python这类服务器运行时,直接放静态文件服务器或CDN就行。特点:无状态,每个用户请求的都是相同的静态文件,不用服务器处理逻辑;全球分发,静态文件能缓存到CDN边缘节点,用户从最近节点拿,延迟低;高可用,静态文件服务几乎不会挂,CDN边缘节点多,单点故障不影响;成本低,静态托管很多平台免费,CDN流量费也便宜;部署简单,构建→上传静态文件→配置域名→完成。本课程的朋友好学 App前端是Next.js静态导出,用next build + next export,产出out/目录的静态文件,能部署到任何静态托管平台,也能通过Capacitor打包进Android APK,WebView加载本地静态文件,完全离线运行。

Python
# 前端部署流程(Next.js 静态导出为例)
# 1. 构建:npm run build(Next.js 构建,产出 .next/)
# 2. 静态导出:next export(产出 out/ 目录,包含所有静态文件)
#    或在 next.config.js 里设置 output: 'export',build 时自动导出
# 3. 部署:把 out/ 目录的文件上传到静态托管平台/CDN
#    - Vercel/Netlify:连接 GitHub,push 自动构建部署(不用手动上传)
#    - 对象存储+CDN:上传到阿里云 OSS/腾讯云 COS/AWS S3,开启静态网站托管,绑定 CDN
#    - GitHub Pages:push 到 gh-pages 分支,自动托管(免费,适合个人项目/文档)
#    - Cloudflare Pages:连接 GitHub,自动构建部署,免费额度大,全球 CDN
# 4. 配置域名:把域名 CNAME 到托管平台的地址
# 5. HTTPS:托管平台自动签发 SSL 证书(免费)
# 6. 完成:用户访问 https://yourdomain.com 就能看到应用
print("前端部署=构建静态文件→上传到静态托管/CDN→配置域名HTTPS")

静态托管平台选型

配对题静态托管平台与定位匹配
🐍静态托管选型心法

个人项目/开源文档/MVP → GitHub Pages(免费简单)或 Vercel/Netlify(功能强免费额度大);商业产品/Next.js 项目 → Vercel(和 Next.js 深度集成,preview 部署、自动 HTTPS、全球 CDN,免费额度够初期,流量大了付费也合理);用 Cloudflare 全家桶 → Cloudflare Pages(和 CDN/WAF/DNS 一体化,全球节点多);大流量/成本敏感/完全可控 → 对象存储+CDN(阿里云 OSS+CDN 或 AWS S3+CloudFront,按用量付费,大流量比 PaaS 便宜);国内访问速度 → 用国内平台(阿里云 OSS+CDN、腾讯云 COS+CDN),Vercel/Netlify 在国内访问速度不稳定(节点在境外),且国内域名需要备案;本课程的朋友好学 App 前端如果要做 Web 版部署:国内用户为主→阿里云 OSS+CDN(域名备案)或 Vercel(境外节点,国内访问可能慢);个人展示→GitHub Pages/Vercel 免费。但朋友好学主要是 App(Capacitor 打包 APK,静态文件在本地),Web 部署是可选的。

CDN:全球加速的核心

CDN(Content Delivery Network,内容分发网络)是一组分布在全球各地的边缘服务器,把静态文件缓存到离用户最近的节点,用户请求时从最近的节点获取,而不是从源服务器,降低延迟、减轻源服务器压力、提高可用性。工作原理:用户请求域名 → DNS 解析到最近的 CDN 边缘节点;边缘节点有缓存 → 直接返回(缓存命中,HIT);边缘节点没有缓存 → 回源(从源服务器获取文件),缓存到边缘节点,返回给用户(缓存未命中,MISS);后续请求都从边缘节点缓存获取。

示例
# CDN 缓存策略配置(以阿里云 CDN/Cloudflare 为例)
# 缓存规则:
# - HTML 文件:缓存时间短(5分钟-1小时),因为 HTML 会更新(引用新的 JS/CSS 文件名)
#   Cache-Control: public, max-age=300  (5分钟)
# - JS/CSS/图片/字体:缓存时间长(30天-1年),因为文件名带 hash(如 app.abc123.js),内容变了文件名也变
#   Cache-Control: public, max-age=31536000, immutable  (1年,immutable 表示不再验证)
# - 不缓存的文件(如 API 响应、用户数据):
#   Cache-Control: no-cache, no-store, must-revalidate
#
# 缓存失效(Cache Invalidation):
# - 文件名带 hash(content hash):内容变了文件名变,旧文件名的缓存不影响,这是最优雅的方案(Webpack/Vite 自动做)
# - 手动刷新:CDN 控制台手动刷新某个 URL 或目录的缓存(发布后立即生效)
# - 版本号:URL 加 ?v=2.0,新版本用新 URL,旧缓存不影响
#
# 关键:HTML 短缓存 + 静态资源长缓存+文件名hash,是前端缓存的最佳实践
# - 用户访问 HTML(5分钟缓存,能较快拿到最新版本)
# - HTML 引用的 JS/CSS 文件名带 hash(内容变了文件名变,长缓存不影响)
# - 发布新版本:新 HTML 引用新的 JS/CSS 文件名,用户拿到新 HTML 就会加载新资源
💡CDN 缓存最佳实践

文件名带 content hash,Webpack/Vite/Next.js 自动做,比如 app.a1b2c3.js,内容变了文件名就变,这是缓存失效的方案;HTML 设短缓存,5分钟到1小时,JS、CSS、图片、字体这些静态资源设长缓存,30天到1年,加 immutable;发布后要么手动刷 CDN 缓存,要么等 HTML 短缓存过期,让用户尽快拿到新版本;用 CDN 的 HIT ratio 指标监控,静态资源命中率要>90%,低了就是缓存策略有问题;gzip/Brotli 压缩:CDN 自动压缩 HTML、CSS、JS 这些文本文件,传输体积减60-80%;图片优化:CDN 自动转格式,WebP/AVIF 比 JPEG/PNG 小30-50%,还能按需缩放,根据设备分辨率返回合适尺寸;HTTPS:CDN 自动管 SSL 证书,用 HTTP/2 或 HTTP/3(QUIC)加速;国内 CDN 域名要备案,阿里云、腾讯云 CDN 绑国内域名得备案,不备案只能用境外 CDN 节点,国内访问慢。

域名与 DNS

域名是用户访问你应用的地址(如 pygood.com)。 就按这几步来:注册域名:选阿里云万网、腾讯云 DNSPod、Namecheap、GoDaddy、Cloudflare Registrar 其中一个,优先选好记的;.com 最通用,.app/.dev 适合开发者,.io 是技术产品常用的。DNS 解析:把域名指向你的服务器或 CDN。常用记录类型:A 记录(域名→IPv4 地址)、AAAA(域名→IPv6)、CNAME(域名→另一个域名,常用于 CDN/PaaS)、MX(邮件)、TXT(验证/SPF)、NS(域名服务器)。DNS 服务商:Cloudflare DNS(免费、全球节点、解析快、和 CDN 一体化)、阿里云 DNS/DNSPod(国内解析快、和云服务一体化)、AWS Route53。域名备案:国内服务器/CDN 强制要做;个人备案约 1-2 周,企业备案约 2-4 周,需要身份证、营业执照、真实性核验材料。域名续费:别忘续费,过期被别人抢注就麻烦了,开自动续费。

⚠️国内域名和备案注意事项

用国内服务器/CDN(阿里云/腾讯云)绑定域名,必须ICP备案,不备案域名无法解析到国内节点,会被拦截;备案需要:身份证(个人)或营业执照(企业)、手机号、真实性核验(人脸识别或幕布照片)、网站名称和内容说明;备案期间网站不能访问,个人备案约7-20天,企业备案约15-30天;已备案的域名换服务器提供商,需要做「接入备案」,在新服务商那里追加接入,不用重新备案;备案后网站内容要和备案时的内容一致,不能做违法违规内容,否则会被注销备案;不想备案,可用境外服务器/CDN(Vercel/Netlify/Cloudflare/境外节点),但国内访问速度可能慢且不稳定;本课程的朋友好学 App是App(用户下载APK),不依赖域名,后端可选,以后做Web版且国内用户为主,需要备案域名。

HTTPS:现在是标配,不是可选

HTTPS(HTTP Secure)是 HTTP 的加密版本,用 SSL/TLS 加密传输,防止窃听和篡改。现在 HTTPS 是标配:浏览器标记 HTTP 网站为「不安全」;很多新 API(Service Worker、Geolocation、Camera、HTTP/2)只在 HTTPS 下可用;SEO 排名 HTTPS 有优势;用户信任(支付、登录、个人数据必须 HTTPS)。证书类型:DV(Domain Validation,域名验证,免费,Let's Encrypt),证明你拥有这个域名;OV(Organization Validation,组织验证,付费),证明你的组织真实存在;EV(Extended Validation,扩展验证,付费较贵),最高级别,浏览器显示组织名(现在越来越少用)。免费证书:Let's Encrypt(90天有效期,自动续期,最流行)、ZeroSSL、云厂商免费证书(阿里云/腾讯云提供免费 DV 证书,1年有效期)。静态托管平台(Vercel/Netlify/Cloudflare)自动签发和续期 HTTPS 证书,零配置。

PWA:让网页像 App 一样

PWA(Progressive Web App,渐进式 Web 应用)不是一个技术,而是一组 Web 技术的组合,让网页应用拥有类似原生 App 的体验:可安装(添加到主屏幕,有图标,全屏打开,没有浏览器地址栏);离线可用(Service Worker 缓存资源,没网也能打开);推送通知(Web Push,即使用户没打开网页也能收到通知);后台同步(Background Sync,网络恢复后自动同步数据);快速(Service Worker 缓存,二次加载秒开)。核心技术:Web App Manifest(manifest.json,定义应用名称、图标、主题色、启动 URL、显示模式);Service Worker(后台运行的脚本,拦截请求、缓存资源、处理推送,独立于网页,不阻塞主线程);HTTPS(PWA 必须 HTTPS,localhost 除外)。

JavaScript
// PWA 核心文件示例
// 1. manifest.json(应用清单)
// {
//   "name": "朋友好学 AI 学 Python",
//   "short_name": "朋友好学",
//   "description": "AI 驱动的 Python 学习应用",
//   "start_url": "/",
//   "display": "standalone",  // standalone=全屏像App,minimal-ui=最小UI,browser=浏览器
//   "background_color": "#0a0a0f",
//   "theme_color": "#6366f1",
//   "orientation": "portrait",
//   "icons": [
//     { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
//     { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" },
//     { "src": "/icon-512-maskable.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
//   ]
// }
//
// 2. Service Worker(sw.js,注册后后台运行)
// const CACHE_NAME = 'pygood-v1';
// const ASSETS_TO_CACHE = ['/', '/index.html', '/styles.css', '/app.js', '/icon-192.png'];
//
// // 安装:缓存静态资源
// self.addEventListener('install', (event) => {
//   event.waitUntil(
//     caches.open(CACHE_NAME).then((cache) => cache.addAll(ASSETS_TO_CACHE))
//   );
// });
//
// // 激活:清理旧缓存
// self.addEventListener('activate', (event) => {
//   event.waitUntil(
//     caches.keys().then((keys) =>
//       Promise.all(keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k)))
//     )
//   );
// });
//
// // 拦截请求:缓存优先,回退网络
// self.addEventListener('fetch', (event) => {
//   event.respondWith(
//     caches.match(event.request).then((cached) => cached || fetch(event.request))
//   );
// });
//
// 3. 注册 Service Worker(在主 JS 里)
// if ('serviceWorker' in navigator) {
//   navigator.serviceWorker.register('/sw.js').then(() => console.log('SW registered'));
// }
ℹ️PWA 的优势与局限

优势无需应用商店,用户直接在浏览器添加到主屏幕,不需要审核,不需要下载安装包;跨平台,一套代码跑iOS/Android/桌面浏览器;离线可用,Service Worker缓存,没网也能打开和使用;更新即时,刷新就是最新版,不需要用户手动更新应用;成本低,不需要开发原生App,不需要支付开发者账号费用;发现性好,网页可以被搜索引擎索引,用户通过搜索就能找到。局限:iOS支持不完整,苹果对PWA不积极,推送通知支持差、后台同步不支持、存储配额有限、添加到主屏幕的入口隐蔽;系统能力有限,不能调用蓝牙、NFC、HealthKit、AR、短信等原生能力;用户认知低,很多用户不知道「添加到主屏幕」这个操作,留存不如原生App;应用商店不可见,不能在App Store/Google Play搜到,获客只能靠网页引流;性能上限是浏览器,复杂动画、游戏、实时通信不如原生。适用:内容型/工具型/学习类应用、内部工具、MVP验证、新兴市场。不适合:需要深度系统能力的应用(游戏/AR/健康/金融交易)、需要应用商店曝光的产品、对推送通知强依赖的应用。本课程的朋友好学 App用Capacitor打包成原生APK,比PWA系统能力强、用户体验好,也可以同时做PWA版,Web用户不用下载就能用。

前端性能优化:Core Web Vitals

前端性能影响用户体验和转化率。加载时间每增加1秒,转化率降7%,跳出率增30%。Google的Core Web Vitals是衡量前端性能的核心指标,也是SEO排名因素:LCP(Largest Contentful Paint,最大内容绘制):页面主要内容加载完成的时间,目标<2.5秒(好),2.5-4秒(需改进),>4秒(差);INP(Interaction to Next Paint,交互到下一次绘制,2024年替代FID):用户交互到页面响应的时间,目标<200ms(好),200-500ms(需改进),>500ms(差);CLS(Cumulative Layout Shift,累积布局偏移):页面加载过程中布局意外移动的程度(如图片加载后把文字挤下去),目标<0.1(好),0.1-0.25(需改进),>0.25(差)

配对题性能优化手段与对应指标匹配
🐍前端性能优化心法

先测再优化:用 Lighthouse(Chrome DevTools)/WebPageTest/真实用户监控(RUM)测当前性能,找到瓶颈(是 LCP 慢?INP 差?CLS 高?),针对性优化,别瞎优化;首屏是重点:用户只关心首屏多久能看到内容,首屏外的可以懒加载;JS 是最贵的资源:JS 要下载、解析、编译、执行,比 CSS/图片贵得多,减小 JS 体积和执行时间是性能优化的核心(代码分割、Tree Shaking、移除无用依赖、用轻量库);图片通常是最大的资源:用现代格式(WebP/AVIF)、按需缩放、懒加载、声明尺寸,图片优化往往收益最大;缓存是免费的性能:合理的缓存策略让回访用户秒开,HTML 短缓存+静态资源长缓存+hash 文件名是最佳实践;别过早优化:先让功能跑起来,再测性能瓶颈,再针对性优化,别一开始就纠结微优化(如把 for 改成 while 省 1ms,没意义);本课程的朋友好学 App 是 Capacitor 打包的 App(静态文件在本地,没有网络延迟),真正的重资源是 Pyodide WASM 和代码编辑器:手机端用零依赖的原生编辑器、不挂载重量级 Monaco,桌面 Web 端才用 next/dynamic 按需加载自托管 Monaco,Pyodide 懒加载并用 Web Worker 跑 Python、不卡主线程(这一步已经做了),同时避免不必要的重新渲染。

前端部署工程实践

示例
# 前端部署工程实践清单
# 1. CI/CD 自动部署:
#    - push 到 main → 自动构建(npm ci && npm run build)→ 自动部署到 Vercel/Netlify/CDN
#    - 每个 PR 生成 preview 预览链接(Vercel/Netlify 自动),方便测试和审查
#    - 构建失败不部署(CI 里跑 lint/test/build,全过才部署)
#
# 2. 环境变量:
#    - 前端环境变量在构建时注入(Vercel/Netlify 环境变量管理,或 .env.production)
#    - 前端环境变量会打包进 JS(用户能看到),不要放密钥(API Key/数据库密码)
#    - 不同环境(dev/staging/prod)用不同环境变量
#
# 3. 版本管理和回滚:
#    - 每次部署生成唯一版本号(git commit hash 或时间戳)
#    - 保留历史版本(Vercel/Netlify 自动保留,一键回滚到任意历史版本)
#    - 回滚要快(出问题几分钟内能回到上一个稳定版本)
#
# 4. 缓存失效:
#    - 文件名带 content hash(自动),内容变了文件名变
#    - HTML 短缓存(5分钟),静态资源长缓存(1年)
#    - 发布后可手动刷新 CDN 缓存(或等 HTML 过期)
#
# 5. 监控:
#    - 前端错误监控:Sentry(自动捕获 JS 错误、白屏、性能)
#    - 性能监控:Core Web Vitals(LCP/INP/CLS)真实用户数据(RUM)
#    - 可用性监控:定时检查网站是否可访问(UptimeRobot/自建)
#    - 告警:错误率高、性能下降、网站不可用,及时告警
#
# 6. 安全:
#    - HTTPS 强制(HTTP 跳转 HTTPS,HSTS)
#    - CSP(Content Security Policy,内容安全策略,防止 XSS)
#    - 安全头:X-Frame-Options、X-Content-Type-Options、Referrer-Policy
#    - 依赖安全:npm audit / Dependabot 定期检查依赖漏洞,及时升级
#    - 不要把密钥放前端代码(会被打包进 JS,用户能看到)

本节小结

前端部署特点:静态文件、无状态、全球CDN分发、高可用、成本极低、部署简单。朋友好学 App 是 Next.js 静态导出+Capacitor 打包 APK(静态文件在本地完全离线),Web 部署可选。静态托管选型:个人/MVP→GitHub Pages/Vercel/Netlify(免费);商业/Next.js→Vercel(深度集成preview部署);Cloudflare全家桶→Cloudflare Pages;大流量/成本敏感/国内→对象存储+CDN(阿里云OSS+CDN);国内访问速度优先用国内平台(需备案)。CDN原理:边缘节点缓存,缓存命中直接返回,未命中回源;缓存策略:HTML短缓存(5分钟)+静态资源长缓存(1年+immutable)+文件名content hash(内容变文件名变,最优雅缓存失效);gzip/Brotli压缩、图片WebP/AVIF、HTTP/2/3。域名DNS:注册→DNS解析(A/AAAA/CNAME/MX/TXT)→备案(国内强制)→续费;HTTPS是标配(DV免费Let's Encrypt,静态平台自动签发)。PWA:Web App Manifest+Service Worker+HTTPS,可安装/离线/推送/后台同步,跨平台无需应用商店,但iOS支持不完整/系统能力有限/用户认知低,适合内容工具型不适合深度系统能力。性能优化Core Web Vitals:LCP<2.5s(最大内容绘制)、INP<200ms(交互响应,替代FID)、CLS<0.1(布局偏移);手段:代码分割、懒加载、资源压缩、预加载、CDN、缓存、减少JS执行、图片尺寸声明、第三方脚本优化;先测量再优化(Lighthouse/RUM),JS是最昂贵资源,图片通常最大,缓存是免费性能,不要过早优化。部署工程:CI/CD自动部署+preview、环境变量构建时注入(不放密钥)、版本管理+一键回滚、缓存失效、Sentry监控+性能RUM、安全(HTTPS/CSP/安全头/依赖审计)。部署好了,怎么让用户下载使用、怎么持续迭代,下一节讲上架、运营与持续迭代。

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

纯网页包壳容易被应用商店以“最小功能不足”驳回,关键在于用原生能力补足 Web 做不到的部分:权限申请(麦克风/摄像头)、安全键盘与键盘高度、状态栏与安全区、文件与分享、版本更新、扫码等。让 Web 负责快速迭代的内容与 UI,原生负责系统能力与体验兜底,这种混合架构才是套壳 App 的合规且高体验形态。