Adventure 8
Adventure 8
Adventure 8
Adventure 8
"你们每天都在用 YouTube、TikTok、Instagram。但你有没有想过它们到底是 什么做的?今天我们就要把它们打开看看。每台电脑都自带这个工具,叫 DevTools,浏览器免费送的。"
Adventure 8
"看 —— 这是一棵树。最上面是 html。两个分枝:head(看不见的元数据)和 body(看得见的内容)。再往下:每个 section、每个 button、每张 image —— 都是树上的一个节点。"
<html> → <body> → <header> → <h1> → 文字<h1> 在 Elements 里的文字,页面会变吗?" → 当场试 —— 会!Adventure 8
Adventure 8
Adventure 8
"看到没?我点了按钮,页面变了,Elements 里的树也变了。但 View Source 里那段文字 —— 纹丝没动。"
<p>Click the button below to load...</p>.quote-card → <p> 内容 变了Adventure 8
View Source (Ctrl+U) | Elements (F12) | ||
显示的是 | 服务器发的原始 HTML | 当前的 DOM 树 | |
何时定下来 | 页面加载那一刻 | 实时 —— JS 一动就更新 | |
会变吗? | 永不 | 会,实时 | |
快捷键 | Ctrl+U | F12 |
Adventure 8
Adventure 8
步 | 改什么 | 在哪改 | 学生看到 | |
1 | <h1> 文字 → "I'm [自己的名字]" | Elements,双击 | 标题变了 | |
2 | .card background → 红色 | Elements → Styles | 卡片变红 | |
3 | Console: document.body.style.zoom = 0.5 | Console 标签 | 整个页面缩小一半 | |
4 | 刷新(F5) | — | 所有改动都消失 |
"刷新 —— 全没了。 因为 DevTools 改的是内存里的 DOM 树,没碰服务器上的源文件。 下个 Block 我们就去看源文件在哪。"
Adventure 8
What you see on screen (browser paints it)
▲
│ browser paints
│
DOM tree (in memory)
▲
│ browser reads + builds
│
HTML + CSS + JS (text files)
▲
│ fetched via URL
│
(the server)
<h1> 节点、一个有样式的元素、任何一段 JavaScript(在 <script> 里)。完成的举手!Adventure 8
Adventure 8
Adventure 8
"上个 Block 我们看到了眼前的 —— HTML/CSS/JS 在浏览器里搭出页面。但想想:样本站上有个 'Quote of the Day' 按钮,点了之后会出现一句话 —— 那句话从哪儿来? HTML 里没写吧?"
Adventure 8
"我点按钮的瞬间,浏览器 飞了一封信出去 ,飞到那台机器上问 'give me a quote'。那台机器 回了一封信 ,里面装着那句话。浏览器拿到信、打开、把句子放到页面上。这一去一回?就叫 HTTP 请求。"
Adventure 8
Adventure 8
?c=i?c=aAdventure 8
{
"quote": "The only way to do great work is to love what you do.",
"author": "Steve Jobs"
}Adventure 8
{...JSON...}"Adventure 8
"每次你看见 YouTube 上冒出一个新视频卡片 —— 都是浏览器在问 YouTube 服务器:再给我几个视频。服务器回一段 JSON,浏览器把它变成卡片。我们的样本站只问一次。YouTube 每秒问几十次。 同一件事,只是规模不一样。"
Adventure 8
Adventure 8
"YouTube 给你播视频 —— 完整链路是这样: 前端 (浏览器)问 后端 (YouTube 服务器):给我 10 个视频。 后端 问 数据库:最近哪 10 个最火?数据库返回列表 → 后端打包成 JSON → 前端画卡片。"
"你 AI 做的网站只有前端 —— AI 把它部署到了 CF Pages(一台静态服务器)。没有后端、没有数据库。所以它只能展示固定内容。"
Adventure 8
Adventure 8
"你 AI 做的网站是 静态的。但像样本站这样,你可以用 fetch 连别人的 API,让它'感觉'动态。要做有用户登录、能保存数据的真网站,你需要 自己的后端 —— 那是后面的事了。"
Adventure 8
"你的网站 = 静态。YouTube = 动态 + 静态混合。差别就是 后端开不开火."
Adventure 8
Adventure 8
Adventure 8
"改坏了?别慌。History 还在,随时能回去。"
Adventure 8
"每次改了什么就 commit 一下 —— 拍个照、写一句说明。所有快照排成时间线 = 你的 history。"
Adventure 8
Your computer → Git → GitHub → Cloudflare Pages → CDN → User's browser
"你的 AI Agent 干的就是这一整条:写代码、push 到 GitHub、搭一个 CF Pages 项目、绑域名、配 DNS。 它都帮你做完了。下面我们自己跑一遍。"
Adventure 8
Adventure 8
ai.ethanxi.com)Adventure 8
"Build log = 程序员最好的朋友。下面我们要自己生成一条这样的 log。"
Adventure 8
Adventure 8
老师在投影上跑一遍完整流程 —— 不解释任何东西。只是为了让学生开始之前先有 "这件事是可行的" 这种感觉。
"就这样。这就是你们现在要做的。"
Adventure 8
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Hello — I'm Sam</title>
</head>
<body>
<h1>Hello, World — I'm Sam</h1>
<p>This is the first website I deployed myself.</p>
</body>
</html>
Adventure 8
my-first-site · 设为 Public · 不要 勾 "Add a README"index.html —— 然后粘 Step 1 的代码Adventure 8
my-first-site → SaveAdventure 8
https://my-first-site-xxx.pages.dev"现在 CF 那台服务器在:拉你的代码 → 看到只有一个 index.html,没什么好 build 的 → 把文件上传到全球 CDN。等那个绿色对勾出来,你的网站就在全网活着了。"
Adventure 8
<h1> 文字 —— 加 emoji、换句话、让它属于你Adventure 8
"你把 GitHub 当成了一个 触发器 —— 你 push 一次,CF Pages 就自动跑一次部署。这就是 'auto-deploy':你不用每次手动上传文件了 —— '存档' 这个动作本身就是部署。"
<img src="..."> 引用 —— CF Pages 自动把它一起 deploy。index.htmlmainAdventure 8
Your source code (HTML/CSS/JS)
↓ git commit + push
GitHub
↓ webhook fires
Cloudflare Pages (build)
↓ uploads artifacts
Global CDN
↓ HTTP + JSON
User's browser
↓ parse → DOM tree → paint
What the user sees
Adventure 8
"你刚刚做完了一次 真实、完整的部署 —— 从空 repo 到一个全世界都能访问的 URL。每一步都是你自己做的。下次想搭网站?不需要 AI。你自己就能。"
Adventure 8
"这就是 赋权 —— 你从 '按按钮、然后祈祷' 变成了 '我懂这个'。"
Adventure 8
my-first-site 改成你自己的个人主页 —— 你的名字、爱好、颜色、再加一张图Adventure 8
API | 后端能回答的问题菜单 | |
Build | 把源代码编译成可发布的文件 | |
CDN | 全球分布的快递分发点;用户从最近的拉 | |
Client | = 前端 | |
Commit | Git 里的一次存档 | |
Console | DevTools 里跑 JS / 看错误的标签 | |
CSS | 决定页面 长什么样的文件 | |
数据库 | 后端长期存东西的地方 | |
Deploy | 把网站文件放到公网服务器上 | |
DevTools | 浏览器自带的内部仪表盘 | |
DNS | 域名 → IP 的电话簿 | |
DOM | 浏览器在内存里建的页面树 | |
域名 | URL 里人能看懂的部分 | |
Elements 面板 | DevTools 里看 DOM 树的标签 | |
Fetch | JS 里发 HTTP 请求的标准方法 | |
前端 | 在你浏览器里跑的部分 | |
Git | 保存项目历史的版本控制工具 | |
GitHub | 上传 Git repo 的网站 | |
History | 所有 Git 存档的时间线 | |
Hosting | 租用服务器空间存放你的网站 | |
HTML | 决定页面 页面有什么内容 | |
HTTP | 浏览器和服务器之间说话的规矩 | |
HTTPS | 加密版的 HTTP | |
IP 地址 | 机器在互联网上的真正数字地址 | |
JS / JavaScript | 决定页面 页面的行为 | |
JSON | 前后端交换的数据格式 | |
Network 面板 | DevTools 里看页面发的所有请求的标签 | |
Node | DOM 树上的一个零件 | |
Push | 把本地存档上传到 GitHub | |
Repository(repo) | 一个项目的所有文件 + 所有历史版本 | |
请求 | 前端发出的一次 "问" | |
响应 | 后端返回的一次 "答" | |
服务器 | 一台一直开着、等回答问题的电脑 | |
Server-side | = 后端 | |
静态网站 | 服务器把现成的文件给你 | |
动态网站 | 服务器每次都临时算一个答案 | |
View Source | 服务器最初发的原始 HTML(永不变) |
Adventure 8