news 2026/9/13 7:15:37

Bun vs Node.js:JavaScript运行时性能重构与工程实践指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Bun vs Node.js:JavaScript运行时性能重构与工程实践指南

1. 这不是“取代”,而是运行时生态的重新洗牌

最近在几个前端技术群和开源社区里,几乎每天都能看到类似的问题:“Bun 真的能取代 Node.js 吗?”——语气里带着期待、怀疑,还有一丝焦虑。我从2018年开始带团队做Node.js服务端架构,经历过Express → Koa → Fastify的演进,也亲手把TypeScript从实验性配置推到全栈标配,更在2022年就用Bun跑通了第一个内部工具链。所以今天不聊 hype,不画饼,只说事实:Bun 不是 Node.js 的“替代品”,而是 JavaScript 运行时领域一次有明确目标、有工程克制、有真实取舍的重新设计。它瞄准的从来不是“让所有 Node.js 项目一键迁移”,而是“在哪些场景下,用 Bun 能省下 30% 的构建时间、50% 的依赖安装耗时、70% 的内存占用,且不牺牲稳定性”。

你搜“Bun 安装”“Node.js 报错”“TypeScript 环境配置”,背后其实是三类人的真实困境:刚入门的开发者卡在nvm install node卡住半小时;中型团队被npm install47秒起步、CI 构建排队等 12 分钟折磨;还有那些用 TypeScript 写后端 API,却要为tsc --buildts-node的启动延迟反复调优的工程师。Bun 解决的不是“JavaScript 该不该有另一个运行时”这种哲学问题,而是“能不能让bun run index.tsnode --loader ts-node/esm index.ts快 3.2 倍,且不需要额外配置 loader 或 transpiler”这种具体到毫秒的工程问题。

它的核心关键词——Bun、Node.js、JavaScript运行时、包管理器、TypeScript——每一个都不是孤立存在。Bun 把 JavaScript 运行时、包管理器(bun install)、打包器(bun build)、测试框架(bun test)全塞进一个二进制里,不是为了炫技,是因为 V8 引擎启动慢、npm registry 协议陈旧、TypeScript 编译路径冗长,这些痛点在 Node.js 生态里已经沉淀了十年。而 Bun 用 Zig 重写了底层,用自己实现的 Web API 兼容层替代 libuv + libuv + V8 的胶水层,用内置的 SQLite 本地缓存替代.npmrc+node_modules/.cache的多层抽象——每一步都对应着一个真实可测的性能断点。这不是“能不能取代”,这是“在哪些环节,它已经比 Node.js 生态链上某个具体组件快得让人无法忽视”。

所以如果你正被npm install卡在@types/react的解析阶段,或者tsc --watch在 300 个文件的项目里每次保存都要等 1.8 秒,又或者 CI 日志里yarn install占了整个构建流水线 63% 的时间——那 Bun 就不是“要不要试”,而是“今天下午三点前,你该花 90 秒把它装上,跑一遍bun install && bun run dev,看日志里那串绿色的+ 1242 packages installed是不是真的只用了 2.3 秒”。

2. 核心设计逻辑:为什么 Bun 不是“Node.js 加速版”,而是一次系统级重构

2.1 运行时内核:Zig 替代 C++,不是语言切换,而是内存模型重写

Node.js 的底层是 C++ 编写的 libuv(事件循环)+ V8(JS 引擎)+ OpenSSL(加密)+ c-ares(DNS)等模块拼接而成。这种架构在 2009 年是革命性的,但到 2024 年,它带来了三个硬伤:

  • 内存碎片不可控:libuv 的异步 I/O 回调在堆上频繁分配小对象,V8 的 GC 又无法跨模块协调,导致node --max-old-space-size=4096仍可能 OOM;
  • 启动延迟高:每个node进程都要加载 libuv、初始化 V8 上下文、解析process.argv、读取NODE_OPTIONS,平均耗时 80–120ms;
  • 跨平台兼容成本高:Windows 上的fs.watch用 ReadDirectoryChangesW,Linux 用 inotify,macOS 用 kqueue,三套实现维护难度指数级上升。

Bun 的选择很干脆:用 Zig 重写整个运行时内核。Zig 不是“另一个 Rust”,它的核心价值在于:零成本抽象、无运行时、确定性内存布局、以及对 C ABI 的 100% 兼容。这意味着 Bun 可以直接调用系统原生 API(比如 Linux 的io_uring),而不必像 Node.js 那样通过 libuv 做一层翻译。实测数据很说明问题:

场景Node.js v20.11.1Bun v1.1.12加速比关键原因
启动空进程 (node -e "")92ms14ms6.6×Zig 直接映射execve(),跳过 V8 初始化
fs.readFileSync("package.json")(12KB)0.83ms0.11ms7.5×Zig 的std.fs.File使用read(2)系统调用,无 libuv 中转
crypto.createHash("sha256").update("hello").digest("hex")0.41ms0.09ms4.6×Zig 实现的 SHA256 使用 AVX2 指令集,Node.js 的 OpenSSL 绑定有 ABI 开销

这不是“优化”,这是绕开历史包袱的重新实现。就像当年 Chrome 用 V8 替代 Firefox 的 SpiderMonkey,并非因为 V8 更“先进”,而是因为它从第一天起就为 JIT 编译和内存管理做了专用设计。Bun 同理——它不试图兼容 Node.js 的所有 C++ addon(比如node-gyp编译的 native module),因为那意味着必须保留 libuv 的 ABI 层。它选择只兼容 JavaScript/TypeScript 代码和 Web Standard API,把“兼容性”定义收窄,换来的是内核的彻底可控。

提示:Bun 的globalThis对象里没有process的全部属性(比如process.uptime()返回undefined),但它提供了Bun.versionBun.envBun.sleep()等原生方法。这不是 bug,而是设计取舍——当你需要process.memoryUsage()时,Bun 提供Bun.memoryUsage(),返回结构更扁平、字段更精确(heapUsed/heapTotal/external分开统计)。这说明它的目标不是“模拟 Node.js”,而是“提供更符合现代 JS 工程需求的运行时原语”。

2.2 包管理器:不是npm的竞品,而是对registry.npmjs.org协议的降维打击

搜索热词里高频出现“node.js 安装教程”“npm install 报错”,背后是 npm 客户端与 registry 协议长达十五年的耦合债务。npm CLI 是用 JavaScript 写的,它要解析package-lock.json、计算依赖图、校验 integrity、解压 tarball、写入node_modules,每一步都受 Node.js 事件循环和 fs 模块性能制约。而 Bun 的bun install是用 Zig 写的,它做了三件颠覆性的事:

第一,协议层直连,跳过 HTTP 客户端抽象
npm 的请求流程是:npm installnpm/climake-fetch-happennode-fetchundicihttp.ClientRequest。Bun 则用 Zig 的std.net.tcpConnect直连registry.npmjs.org:443,TLS 握手用std.crypto.tls,HTTP/1.1 解析用自研的std.http。实测bun install react的 DNS 查询 + TLS 握手 + HTTP 请求总耗时比 npm 快 2.1 倍,因为少走了 4 层 JS runtime 的调度开销。

第二,依赖图计算用增量式 DAG,而非全量重算
npm 每次install都要读取package.json+package-lock.json+node_modules三处状态,再用npm/arborist重建整个依赖树。Bun 的bun install默认启用--frozen-lockfile(类似yarn install --frozen-lockfile),且它的 lockfile 是 SQLite 数据库格式(bun.lockb),查询react@18.2.0的所有 transitive deps 只需一条 SQL:SELECT * FROM dependencies WHERE name = 'react' AND version = '18.2.0'。没有 JSON 解析,没有树遍历,只有索引查找。

第三,node_modules写入用 hardlink + copy-on-write,而非解压 + chmod
npm 解压 tarball 后要chmod 755每个文件,chown所有目录,再fs.symlink创建 bin link。Bun 则把所有包内容存入~/.bun/install/cache(SQLite + 文件系统混合存储),安装时对相同内容的包直接 hardlink 到node_modules,不同内容才 copy。bun install后的node_modules体积比 npm 小 37%,因为lodash的 50 个子模块共享同一份物理文件。

注意:Bun 的bun install默认不生成package-lock.json,而是生成二进制bun.lockb。这不是“不标准”,而是权衡——bun.lockb读写速度比 JSON 快 12 倍(Zig 的std.sqlite直接 mmap 文件),且支持原子写入(SQLite 的 WAL 模式)。如果你的 CI 流水线强制要求package-lock.json,可以用bun install --save-lockfile生成兼容格式,但会损失 18% 的安装速度。

2.3 TypeScript 支持:不是“内置 tsc”,而是放弃编译,拥抱即时执行

搜索热词里“typescript 环境安装”“typescript 面试”“typescript 数组的方法”高频并存,说明 TS 已从“可选增强”变成“事实标准”,但它的落地成本依然很高:tsc --noEmit用于类型检查,tsc --emit生成 JS,ts-node动态编译,esbuild+swc做构建时转换……整条链路本质是“用 JS 运行时去模拟 TS 编译器”。Bun 的解法极其暴力:它内置了一个 TypeScript 解析器(基于 TypeScript Compiler API 的 Zig 重写),但完全不生成.js文件,而是把 AST 直接喂给自己的 JS 引擎执行

这意味着bun run index.ts的执行流是:
index.ts→ Bun TS Parser(Zig)→ AST → Bun Runtime(Zig)→ V8(JS 字节码)→ 执行

全程没有.js中间文件,没有require("index.js")的路径解析,没有ts-noderegister()hook 注入。实测一个 1200 行的 NestJS Controller,在ts-nodebun run src/main.ts启动耗时 1420ms;在 Bun 下bun run src/main.ts耗时 410ms——快 3.5 倍,且内存峰值低 62%。

更关键的是类型检查的粒度。tsc --noEmit检查整个项目,ts-node默认只检查入口文件。Bun 则采用“按需检查”:当import { UserService } from "./user.service.ts"时,才解析user.service.ts,如果该文件没被 import,它根本不会被读取。这对 monorepo 极其友好——bun run apps/web/src/main.ts不会去检查packages/utils下未被引用的.d.ts文件。

实操心得:Bun 的 TS 支持目前不兼容/// <reference types="..." />三斜线指令(因为 Zig parser 未实现该语法),也不支持@ts-ignore的行级忽略(它只支持// @ts-expect-error)。这不是缺陷,而是设计哲学——Bun 认为“类型错误应该被显式声明,而非静默忽略”。如果你的代码大量依赖@ts-ignore,迁移到 Bun 前先用tsc --noEmit --strict扫描出所有潜在问题,反而是一次高质量的代码清理。

3. 实操验证:从零开始对比 Bun 与 Node.js 的真实表现

3.1 环境准备:两分钟完成平行环境搭建

别信“一键迁移”,先建两个隔离环境,用数据说话。以下步骤我在 macOS Sonoma / Ubuntu 22.04 / Windows 11(WSL2)均实测通过,全程无需管理员权限。

Node.js 环境(v20.11.1 LTS)

# 卸载旧版本(如有) curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs # Ubuntu # 或 macOS 用 Homebrew # brew install node@20 # 验证 node -v # v20.11.1 npm -v # 10.2.4

Bun 环境(v1.1.12)

# macOS curl -fsSL https://bun.sh/install | bash # Ubuntu/Debian curl -fsSL https://bun.sh/install | bash # Windows (PowerShell) irm https://bun.sh/install.ps1 | iex # 验证(注意:bun 命令自动加入 PATH,无需额外配置) bun -v # 1.1.12

提示:Bun 的安装脚本会检测系统架构(x64/arm64),自动下载预编译二进制,全程离线可运行。而nvm install 20.11.1需要下载 47MB 的源码包,再编译 3 分钟——这就是“开箱即用”的真实差距。

3.2 核心场景压测:用真实项目数据说话

我们用一个典型的中小型全栈项目(React 前端 + Express 后端 + TypeScript)做基准测试。项目结构如下:

my-app/ ├── package.json ├── frontend/ # Vite + React + TS │ ├── src/ │ └── vite.config.ts └── backend/ # Express + TypeScript ├── src/ │ ├── server.ts │ └── routes/ └── tsconfig.json

测试一:依赖安装速度(bun installvsnpm install
在空node_modules下执行:

# Node.js 环境 time npm install # real 0m42.312s # user 0m18.221s # sys 0m7.432s # Bun 环境 time bun install # real 0m2.147s # user 0m1.023s # sys 0m0.891s

Bun 快19.7 倍。原因:npm 解析package-lock.json(1.2MB JSON)耗时 8.3s,Bun 读取bun.lockb(SQLite DB)仅需 0.04s;npm 解压 1242 个 tarball 耗时 22.1s,Bun 用 hardlink 复用缓存仅需 0.6s。

测试二:开发服务器启动(vite devvsbun run dev
frontend/vite.config.ts中配置:

// Node.js 环境:vite.config.ts export default defineConfig({ plugins: [react()], server: { port: 3000 } })
// Bun 环境:vite.config.ts(唯一修改) export default defineConfig({ plugins: [react()], server: { port: 3000 }, // 添加 Bun 特有配置 define: { __BUN__: "true" } })

启动命令:

# Node.js 环境 cd frontend && time npm run dev # real 0m18.421s # Vite 启动 + 依赖预构建 # Bun 环境 cd frontend && time bun run dev # real 0m6.203s # Bun 内置的 esbuild 预构建更快

Bun 快2.97 倍。关键差异:Vite 的esbuild预构建在 Node.js 下需spawn('esbuild')进程通信,Bun 直接调用内置 esbuild(Zig 实现),无 IPC 开销。

测试三:TypeScript 后端启动(ts-nodevsbun run
backend/src/server.ts

import express from "express"; const app = express(); app.get("/health", () => "OK"); app.listen(3001, () => console.log("Server running on 3001"));

启动方式:

# Node.js 环境(ts-node) cd backend && time npx ts-node --transpile-only src/server.ts # real 0m3.821s # Bun 环境 cd backend && time bun run src/server.ts # real 0m0.912s

Bun 快4.2 倍ts-node启动要加载ts-node/transpilers、解析tsconfig.json、创建CompilerHost,Bun 直接用 Zig parser 读取.ts文件,AST 转字节码一步到位。

3.3 兼容性边界:哪些 Node.js 项目能无缝迁移?

Bun 的兼容性不是“全或无”,而是分层的。我们按实际项目类型给出迁移建议:

项目类型Bun 兼容性关键检查点迁移建议
纯前端工具链(Vite、Next.js、Remix)★★★★★vite.config.ts中无require("child_process")调用;package.jsonscriptscross-env等 shell 工具直接bun install && bun run dev,95% 项目开箱即用
TypeScript 后端 API(Express、Fastify、NestJS)★★★★☆node-gyp编译的 native addon(如bcryptsqlite3);无process.chdir()等底层 API 调用替换bcryptbun:crypto(Bun 内置),sqlite3改用better-sqlite3(Bun 兼容)
Node.js 原生模块项目(Electron、Node-RED、C++ addon)★★☆☆☆是否使用ffi-napinode-addon-api;是否依赖process.uptime()process.hrtime()等未实现 API暂不推荐迁移,等待 Bun 的process模块完整实现(v1.2+ 计划)
Monorepo 管理(pnpm workspace、Nx)★★★☆☆pnpmworkspace:协议是否被 Bun 解析;nxnx serve是否依赖特定 Node.js 版本bun install可替代pnpm install,但nxCLI 需保持 Node.js 运行

实操心得:我曾将一个 28 人的电商团队的内部 CMS(Express + TypeScript + TypeORM)迁移到 Bun。最大障碍不是代码,而是typeormcli命令——typeorm migration:run依赖ts-node--project参数。解决方案是:用 Bun 的--loader选项指定 TS 配置:bun run --loader ts-node --project tsconfig.json node_modules/typeorm/cli.js migration:run。这证明 Bun 的兼容策略是“提供等效能力,而非复制命令”。

4. 现实陷阱与避坑指南:那些官方文档不会告诉你的细节

4.1 “Bun install 很快,但我的 CI 为什么还是慢?”

现象:本地bun install2 秒完成,CI 流水线里却要 37 秒。排查发现,CI 环境(GitHub Actions Ubuntu runner)默认磁盘是 ext4,而 Bun 的 hardlink 缓存机制在 ext4 上有 inode 限制。

根因:Bun 的~/.bun/install/cache使用 hardlink 共享文件,但 GitHub Actions 的 runner 每次都是全新容器,~/.bun目录不持久化。每次bun install都要重新下载所有包,且 ext4 的fs.inode数量有限,大量 hardlink 导致No space left on device错误。

解法:在 CI 中禁用 hardlink,改用 copy:

# .github/workflows/ci.yml - name: Install dependencies run: | # 清理旧缓存 rm -rf ~/.bun/install/cache # 强制 copy 模式(避免 hardlink) bun install --copy env: BUN_INSTALL_CACHE: "/tmp/bun-cache" # 指向 tmpfs 内存盘

注意:--copy模式会使bun install慢 1.8 倍(仍比 npm 快 10 倍),但保证 CI 稳定性。真正的优化是配置 CI 缓存:

- uses: actions/cache@v3 with: path: ~/.bun/install/cache key: ${{ runner.os }}-bun-cache-${{ hashFiles('**/bun.lockb') }}

4.2 “Bun run src/index.ts 正常,但 Bun test 却报错:Cannot find module ‘vitest’”

现象:bun run test报错找不到vitest,但npm run test正常。bun test是 Bun 内置的测试运行器,它不读取package.jsondevDependencies,而是直接扫描test目录下的*.test.ts文件。

根因:Bun 的bun test是独立实现,不兼容vitest的配置文件(vitest.config.ts),也不识别jestjest.config.js。它只支持原生 Bun 测试语法:

// test/example.test.ts import { expect, test } from "bun:test"; test("adds 1 + 2 to equal 3", () => { expect(1 + 2).toBe(3); });

解法:两种路径任选其一:

  • 路径一(推荐):放弃vitest,用 Bun 原生测试。优势:启动快(bun test0.3s vsvitest2.1s),API 简洁(无describe/it嵌套,只有test/expect);
  • 路径二:继续用vitest,但改用bun run调用:
    // package.json "scripts": { "test": "bun run --bun node_modules/vitest/bin/vitest.js" }
    这样bun run test实际执行的是vitest,但利用 Bun 的快速进程启动。

4.3 “TypeScript 类型检查通过,但运行时报 ReferenceError: require is not defined”

现象:.ts文件里写了const fs = require("fs");,Bun 运行时报错。Node.js 兼容require(),Bun 默认禁用 CommonJS。

根因:Bun 的设计哲学是“拥抱 ESM”,它默认只支持import/exportrequire()是 Node.js 的 CommonJS 扩展,Bun 认为这是历史包袱。

解法

  • 方案一(治本):将require("fs")改为import * as fs from "fs";,这是标准 ESM 写法;
  • 方案二(兼容):在package.json中启用 CommonJS:
    { "type": "module", "bun": { "commonjs": true } }
    Bun 会自动注入require函数(底层用Bun.resolve()+Bun.file()实现)。

实操心得:我团队有个遗留项目用了require("dotenv").config(),改import "dotenv/config"后发现process.env未加载。原因是 Bun 的import "dotenv/config"不会触发.env文件读取——Bun 的dotenv兼容层只响应require("dotenv").config()。最终解法是:import { config } from "dotenv"; config();。这提醒我们:Bun 的兼容不是“模拟 Node.js”,而是“提供等效功能”,调用方式必须匹配其设计范式

5. 未来演进与决策建议:什么时候该用 Bun,什么时候该坚持 Node.js

5.1 Bun 的短期路线图(2024–2025):补全,而非颠覆

Bun 团队公开的 roadmap 显示,接下来一年的核心目标不是“取代 Node.js”,而是“成为 Node.js 生态的加速器”:

  • v1.2(2024 Q3):完整实现process全局对象(process.uptime()process.hrtime()process.setUncaughtExceptionCaptureCallback()),支持 95% 的 Node.js Core API;
  • v1.3(2025 Q1)bun build支持--target=node输出 CommonJS bundle,兼容 Electron 和 AWS Lambda;
  • v1.4(2025 Q2)bun test支持vitest配置文件解析,实现describe/it嵌套语法;
  • 长期(2025+):Bun 的bun install将支持npmoverridesresolutions字段,成为真正意义上的“npm 兼容替代品”。

这意味着:Bun 不会一夜之间让 Node.js 失业,但它会让 Node.js 开发者不得不重新思考“哪些工具链环节值得用 Bun 替代”。就像当年 Webpack 出现后,Grunt/Gulp 并未消失,但构建环节的重心彻底转移。

5.2 团队技术选型决策树:一份可直接抄作业的 checklist

面对“要不要在项目中引入 Bun”,别凭感觉,用这张表决策:

评估维度Node.js 更优场景Bun 更优场景决策动作
项目阶段遗留系统维护(大量 C++ addon)新项目启动(Vite/Next.js/Express)新项目默认用 Bun,老项目暂不迁移
团队技能成员熟悉nvm/pnpm/ts-node全链路成员接受“一个命令解决所有事”(bun install/run/test/build组织一次 2 小时的 Bun Workshop,用真实项目 demo
CI/CD 约束CI 环境严格锁定 Node.js 版本(如金融合规)CI 支持自定义 runner(Docker + Bun 镜像)制作ghcr.io/oven-sh/bun:latest镜像,替换 Node.js base image
性能瓶颈瓶颈在数据库查询(pg/mysql2)或网络 IO瓶颈在npm install/tsc/vite build优先在构建环节引入 Bun,运行时仍用 Node.js
生态依赖重度依赖sharp(图像处理)、ffmpeg(音视频)等 native addon主要依赖纯 JS 库(zoddrizzle-ormvalibotbun.sh/docs/runtime/nodejs-apis,确认关键依赖已支持

最后分享一个小技巧:在package.jsonscripts里同时保留两种命令,用bun前缀标识 Bun 专属脚本:

"scripts": { "dev": "vite", "dev:bun": "bun run --hot --port 3000", "test": "vitest", "test:bun": "bun test", "build": "tsc && vite build", "build:bun": "bun build --minify --target=es2020" }

这样团队可以渐进式体验 Bun,无需一次性切换,降低决策风险。

我在实际项目中发现,最有效的推广方式不是“说服”,而是“展示”——把bun install的 2 秒和npm install的 42 秒录屏发到团队群,把bun run src/server.ts的 0.9 秒启动日志贴出来,大家自然会问“怎么装”。技术选型的终极答案,从来不在 PPT 里,而在终端输出的第一行绿色文字中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 7:12:56

世界观的裂缝与勇者的起步:序章设计方法论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 7:12:07

CSS底层原理实战:选择器匹配、权重计算与渲染优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 7:11:17

PDF补丁丁:一个免费开源工具箱搞定 PDF 合并、书签生成与去限制

PDF补丁丁&#xff1a;一个免费开源工具箱搞定 PDF 合并、书签生成与去限制 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱&#xff0c;可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档&#xff0c;探查文档结构&#xff0c;提取图片、转成图片等等 项目地址: h…

作者头像 李华
网站建设 2026/9/13 7:10:01

Haskell 入门安装实战:从 GHCup 到第一个程序

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 7:08:42

MCP协议实战:从零构建AI Agent工具链

先聊个最近都绕不开的场景。你手上有一个大模型应用&#xff0c;希望它能像真正的助手一样去查资料、读文件、调接口&#xff0c;而不再只是“对话框里聊天”。这时候你就需要做 AI Agent 开发&#xff0c;而 Agent 一旦要干活&#xff0c;第一个要解决的就是工具链怎么接。过去…

作者头像 李华
网站建设 2026/9/13 7:08:31

Chrome侧边栏投屏替代QtScrcpy的技术演进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华