1. 开场:把 AI 请进网址栏
公元前 2025 年,一位前端工程师在键盘上敲下 npm create aigc-app@latest
,
浏览器瞬间变成了一座 24h 不打烊的剧院:
- 观众是用户
- 演员是 AI
- 舞台是 Web
下面这份节目单,记录了最值得一聊的 Web 技术------它们就像后台道具师,默默把 AI 的魔法变成可点击的像素。
2. 道具一:WebGPU ------ 把显卡借给 AI
关键台词 | "亲爱的显卡,别只打游戏了,来跑个 7B 大模型吧!" |
---|---|
底层原理 | 浏览器→WebGPU→驱动→显卡→矩阵运算→AI 推理 |
生活比喻 | 把家里的台式机 GPU 像共享单车一样扫二维码骑走 |
js
// 1行代码,显卡到手
const adapter = await navigator.gpu.requestAdapter();
小贴士:
如果看到
undefined
,说明浏览器还在劝你"显卡太老,先去喝杯咖啡"。
3. 道具二:WebAssembly + SIMD ------ CPU 也想加班
关键台词 | "CPU 大喊:我还能再战十年!" |
---|---|
底层原理 | C/C++ 编译成 .wasm ,SIMD 一次算 128 bit,像 4×4 拼乐高 |
js
// 加载 wasm,给 CPU 打鸡血
const wasmModule = await WebAssembly.instantiateStreaming(
fetch('model_simd.wasm')
);
小图标:⚡️ "单核变八核,电费不变"
4. 道具三:Web Workers + SharedArrayBuffer ------ 多线程不堵车
关键台词 | "主线程:你慢慢算,我去刷 UI。" |
---|---|
底层原理 | 主线程 ↔ SharedArrayBuffer ↔ Worker ↔ AI 模型 |
生活比喻 | 老板(主线程)把报表丢给实习生(Worker),自己去开会 |
js
// 主线程
const worker = new Worker('aigc.worker.js');
worker.postMessage({ cmd: 'dream', prompt: '赛博猫咪' });
// worker.js
self.onmessage = ({ data }) => {
const pixels = bigModel.inference(data.prompt);
self.postMessage(pixels, [pixels.buffer]); // 零拷贝传输
};
5. 道具四:WebRTC + WebTransport ------ 把服务器搬进浏览器
关键台词 | "别再问我服务器在哪,它就在隔壁标签页!" |
---|---|
底层原理 | P2P 数据通道 → UDP/QUIC → 低延迟流式推理 |
生活比喻 | 像打电话,但双方都是浏览器 |
js
// 建立 P2P 推理通道
const pc = new RTCPeerConnection();
const dataChannel = pc.createDataChannel('ai-stream');
dataChannel.onmessage = ({ data }) => drawImage(data);
6. 道具五:Web Codecs ------ 让像素学会压缩瑜伽
关键台词 | "一张 4K 图,秒变表情包。" |
---|---|
底层原理 | 浏览器原生硬件编解码 → H.264/AV1/VP9 |
生活比喻 | 把大象塞进冰箱,但冰箱自带黑洞压缩器 |
js
const decoder = new VideoDecoder({
output: frame => canvas.drawImage(frame),
error: e => console.error('解码器罢工', e)
});
decoder.configure({ codec: 'avc1.42E01E' });
7. 道具六:IndexedDB + OPFS ------ 浏览器里藏个硬盘
关键台词 | "模型 2 GB?本地缓存,下次秒开。" |
---|---|
底层原理 | 浏览器沙盒文件系统 → 异步 IO → 零拷贝映射 |
生活比喻 | 把模型当离线地图,没网也能导航 |
js
const root = await navigator.storage.getDirectory();
const fileHandle = await root.getFileHandle('llama2_7b.bin', { create: true });
const writable = await fileHandle.createWritable();
await writable.write(modelBlob);
await writable.close();
8. 彩蛋:一行代码的 AI 魔法秀
把上文所有技术串成一串糖葫芦,只需:
js
// index.html
<canvas id="stage"></canvas>
<script type="module">
import { AIGen } from './aigc.min.js';
await AIGen.init({ gpu: true, wasmSimd: true, cache: true });
AIGen.paint('月光下的独角兽', document.getElementById('stage'));
</script>
浏览器:"灯光、显卡、Action!"
9. 谢幕 & 加餐
下一站 | 学习资料 |
---|---|
WebGPU 入门 | gpuweb.github.io |
wasm SIMD | github.com/WebAssembly... |
WebRTC datachannel | webrtc.github.io/samples |
小彩蛋:把本文打印出来折成纸飞机,飞得越远,模型跑得越快 🛩️
"愿你写的每一个
await
,都能等到未来的惊喜。"------ 一个把 AI 塞进地址栏的工程师