编程 Goose 深度解析:Block 开源的 AI Agent 如何重新定义'代码执行'边界

2026-04-15 03:53:45 +0800 CST views 6

Goose 深度解析:Block 开源的 AI Agent 如何重新定义"代码执行"边界

当大多数 AI 编程工具还在"给建议"的层次徘徊时,Goose 已经把脚踩进了"真实执行"的泥地里。
它不只是一个会说话的 CLI,而是一个能把自然语言直接变成生产级代码的工程执行系统。

一、背景:AI 编程工具的进化路线图

要理解 Goose 的意义,我们得先理清 AI 编程工具走过的三个阶段。

1.1 第一阶段:建议者(Suggestor)

以 GitHub Copilot 早期版本为代表。这一阶段的工具只能根据上下文提供代码补全,本质上是一个超级 Autocomplete。它不知道你在做什么项目,不知道你已经有哪些模块,更不知道你的代码能不能跑起来。

特点:

  • 基于本地文件片段的上下文理解
  • 只能补全当前文件,无法跨文件推理
  • 输出的代码质量完全取决于 Prompt 质量
  • 无法验证输出是否正确

1.2 第二阶段:协作者(Collaborator)

以 Cursor、Claude Code、Copilot Workspace 为代表。工具开始理解项目结构,能执行命令、读取文件、调用工具。但这个阶段的"执行"大多是试探性的——工具可以跑命令,但权限受限,无法深度集成开发环境。

这个阶段的标志性进步是:

  • 工具开始理解项目整体结构(通过 MCP、文件系统)
  • 具备一定的自主规划能力(任务拆解、步骤执行)
  • 可以调用外部工具(搜索引擎、Shell 命令)
  • 但执行环境与开发者本地环境仍然是隔离的

1.3 第三阶段:执行者(Executor)

以 Goose、Devin(2023)、OpenClaw 为代表。工具不再只是"建议者",而是具备完整工程能力的执行者——它们可以在你的开发环境中真实地读写代码、安装依赖、跑测试、部署服务,而且这一切都建立在安全可控的沙箱机制之上。

Goose 正是这个阶段最具代表性的开源项目之一。它来自支付基础设施公司 Block(原 Square,创始人为 Twitter 联合创始人 Jack Dorsey),于 2026 年初正式开源,在 GitHub Trending 上迅速获得了极高的关注度。


二、Goose 是什么:从官方 README 说起

2.1 核心定位

Goose 的官方定义是:

"an open source, extensible AI agent that goes beyond code suggestions — install, execute, edit and test"

翻译成人话:它不仅仅是一个代码建议工具,而是一个能安装依赖、执行命令、编辑文件、跑测试的完整 AI 执行系统。

这一定位的关键词是 "beyond code suggestions"——这意味着 Goose 不打算在"谁的建议更聪明"这个赛道上内卷,它的野心是直接替代人类开发者完成工程任务。

2.2 技术栈概览

维度技术选型
核心语言Rust(底层),Python(插件生态)
LLM 支持模型无关,支持 OpenAI、Anthropic、本地模型
执行环境Docker 容器隔离
扩展机制插件化,Python-first
开源协议Apache 2.0
项目地址github.com/block/goose

Rust 作为底层语言带来了几个显著优势:二进制体积小(单个可执行文件)、启动速度快、内存安全。这对于一个需要长期运行、与本地环境深度交互的工具来说至关重要。

2.3 为什么来自 Block

Block 这家公司值得多说两句。在 Jack Dorsey 的主导下,Block 一直是技术实践派——比特币、分布式系统、开源基础设施都是他们的主战场。他们开源 Goose 并不是一时兴起,而是多年工程实践的自然延伸。

支付系统的核心要求是:确定性、可观测性、容错性。Goose 继承了这套工程哲学——它不是一个"能跑就行"的玩具,而是一个从一开始就用生产级标准设计的系统。


三、核心架构:五层架构如何协作

Goose 的架构分为五个层次,每一层都有明确的职责边界。这种分层设计是它区别于其他 AI Agent 的关键。

3.1 用户接口层(UI Layer)

Goose 提供多种接入方式:

# 最基础的交互方式:CLI
goose "帮我把用户认证模块从 JWT 改成 OAuth2"

# 配置文件定义行为
goose --config goose_config.yaml

# 也可以通过 MCP 协议接入现有 IDE

配置文件的典型结构:

# goose_config.yaml
llm_providers:
  openai:
    api_key: ${OPENAI_API_KEY}
    models:
      gpt-4-turbo:
        cost_per_token: 0.00003
        max_tokens: 4096
      gpt-3.5-turbo:
        cost_per_token: 0.0000015
        max_tokens: 4096

  anthropic:
    api_key: ${ANTHROPIC_API_KEY}
    models:
      claude-sonnet-4-20250514:
        cost_per_token: 0.000015
        max_tokens: 8192

execution:
  allowed_commands: ["npm", "pip", "yarn", "go"]
  allowed_networks: ["npmjs.org", "pypi.org", "github.com"]

deployment:
  file_read: true
  file_write: true
  docker_enabled: true

这个配置体现了 Goose 的核心安全哲学:明确声明允许的操作集。默认情况下,它不会让你做任何你没说可以做的事。

3.2 任务规划层(Planning Layer)

当用户输入"帮我把用户认证模块从 JWT 改成 OAuth2"这样的自然语言请求时,Goose 不会直接动手。它会先做任务拆解:

用户请求:把用户认证模块从 JWT 改成 OAuth2

规划阶段分析:
├── 步骤1:理解现有 JWT 实现
│   ├── 读取 auth/jwt.go
│   ├── 读取 auth/middleware.go
│   ├── 梳理 token 生命周期
│   └── 识别 OAuth2 所需改动点
├── 步骤2:设计 OAuth2 迁移路径
│   ├── 确定 OAuth2 Provider(GitHub/Google/自定义)
│   ├── 设计 token 存储方案
│   └── 规划兼容性策略(渐进式迁移 vs 一次性迁移)
├── 步骤3:执行修改
│   ├── 添加 OAuth2 依赖
│   ├── 实现 OAuth2 handler
│   ├── 修改 middleware
│   └── 更新配置文件
├── 步骤4:验证
│   ├── 跑单元测试
│   ├── 检查接口兼容性
│   └── 端到端测试
└── 步骤5:生成变更报告

这种"先规划、后执行"的模式是 Goose 与其他工具的本质区别。规划阶段生成的执行计划对用户是可见的,用户可以在任何一步介入、修改或中止。这种人机协同的设计理念比"让 AI 自己跑,出问题了再回滚"要靠谱得多。

3.3 执行层(Execution Layer)

这是 Goose 最核心的部分。执行层运行在 Docker 容器中,完全隔离于主机环境:

# Goose 的执行环境示意(简化版)
import subprocess
import docker

class ExecutionEngine:
    def __init__(self, config):
        self.client = docker.from_env()
        self.allowed_commands = config.allowed_commands
        self.allowed_networks = config.allowed_networks
    
    def run_command(self, command: str, context: dict) -> ExecutionResult:
        # 1. 安全检查:命令是否在白名单?
        if not self.is_command_allowed(command):
            return ExecutionResult(
                success=False,
                error="Command not in allowlist"
            )
        
        # 2. 在 Docker 容器中执行
        container = self.client.containers.run(
            "goose-executor:latest",
            f"bash -c '{command}'",
            detach=True,
            mem_limit="2g",
            network_mode="bridge"
        )
        
        # 3. 网络隔离检查
        if not self.check_network_access(command):
            return ExecutionResult(
                success=False,
                error="Network access not allowed"
            )
        
        result = container.wait()
        return ExecutionResult(
            success=(result["StatusCode"] == 0),
            output=container.logs().decode(),
            exit_code=result["StatusCode"]
        )
    
    def is_command_allowed(self, command: str) -> bool:
        cmd_name = command.strip().split()[0]
        return cmd_name in self.allowed_commands

为什么选择 Docker 隔离?这里有个微妙的设计权衡:

方案 A:直接本地执行

  • 优点:零开销,速度快
  • 缺点:风险极高。AI 写的代码可能包含恶意命令(rm -rf /curl ... | bash),或者依赖冲突导致本地环境损坏

方案 B:虚拟机隔离

  • 优点:完全隔离
  • 缺点:体积太大(GB 级),启动慢,无法和本地文件系统自然交互

方案 C:Docker 容器隔离(Goose 的选择)

  • 优点:隔离性好、启动快(秒级)、文件系统可以挂载本地目录
  • 缺点:和宿主机共享 Linux 内核(理论上存在容器逃逸风险,但实践中概率极低)

Goose 在安全性和可用性之间找到了一个很好的平衡点。它允许容器挂载本地项目目录,这样 AI 可以直接编辑你的代码,但所有命令执行都被约束在容器内部。

3.4 工具层(Tool Layer)

Goose 的工具系统是其灵活性的核心。工具是 Goose 与外部世界交互的接口:

# 工具定义示例
class Tool:
    def __init__(self, name: str, description: str, schema: dict):
        self.name = name
        self.description = description
        self.schema = schema  # JSON Schema 定义参数
    
    def execute(self, **kwargs) -> ToolResult:
        raise NotImplementedError


# 内置工具示例:文件系统操作
class FileReadTool(Tool):
    name = "file_read"
    description = "读取本地文件内容"
    schema = {
        "type": "object",
        "properties": {
            "path": {"type": "string", "description": "文件路径"},
            "offset": {"type": "integer", "default": 0},
            "limit": {"type": "integer", "default": 1000}
        },
        "required": ["path"]
    }
    
    def execute(self, path: str, offset: int = 0, limit: int = 1000):
        with open(path, 'r') as f:
            f.seek(offset)
            content = f.read(limit)
        return ToolResult(success=True, content=content)


# 内置工具示例:Shell 执行
class ShellTool(Tool):
    name = "shell"
    description = "执行 Shell 命令"
    schema = {
        "type": "object",
        "properties": {
            "command": {"type": "string"},
            "cwd": {"type": "string"},
            "timeout": {"type": "integer", "default": 300}
        },
        "required": ["command"]
    }
    
    def execute(self, command: str, cwd: str = None, timeout: int = 300):
        result = subprocess.run(
            command,
            shell=True,
            cwd=cwd,
            capture_output=True,
            timeout=timeout
        )
        return ToolResult(
            success=(result.returncode == 0),
            output=result.stdout.decode(),
            error=result.stderr.decode(),
            exit_code=result.returncode
        )

这种基于 JSON Schema 的工具定义让 LLM 可以结构化地理解每个工具的能力。当 LLM 决定需要"读取某个文件"时,它知道调用哪个工具、需要传什么参数、返回什么格式。这是 Goose 实现"精准工具调用"的技术基础。

3.5 记忆层(Memory Layer)

Goose 的记忆系统解决了一个经典问题:AI 在长任务执行中丢失上下文

class MemorySystem:
    def __init__(self):
        self.short_term = []      # 当前会话的短期记忆
        self.long_term = []       # 持久化的长期记忆(存储在本地)
        self.working = []         # 当前任务的执行记忆
    
    def remember(self, event: MemoryEvent):
        """记录一次执行事件"""
        self.working.append(event)
        self.short_term.append(event)
        
        # 如果是关键决策,加入长期记忆
        if event.type == "decision":
            self.long_term.append(event)
    
    def recall(self, query: str) -> List[MemoryEvent]:
        """检索相关记忆"""
        # 简单实现:关键词匹配
        # 生产环境应该用向量数据库(ChromaDB、Qdrant 等)
        return [
            e for e in self.short_term + self.long_term
            if query.lower() in e.description.lower()
        ]
    
    def get_context(self, max_events: int = 10) -> str:
        """生成用于 LLM 的上下文提示"""
        recent = self.working[-max_events:]
        return "\n".join([
            f"[{e.timestamp}] {e.type}: {e.description}"
            for e in recent
        ])

记忆系统让 Goose 能够:

  1. 记住之前的错误,避免重复踩坑
  2. 跨会话恢复状态,比如大型重构任务可以分多次完成
  3. 基于历史决策推理,比如"上次你说这个接口不能改,这次要谨慎"

四、插件系统:Goose 的扩展之道

4.1 为什么要做插件系统

AI Agent 的一个根本矛盾是:LLM 的知识是有时效性的,但开发环境是实时变化的。今天你的项目还在用 Python 3.9,明天升级到 3.12,很多 API 就变了。内置工具永远跟不上所有场景。

Goose 的解法是把工具系统的扩展权交给开发者:

# 安装社区插件
goose plugin install github.com/block/goose-plugin-puppeteer
goose plugin install github.com/block/goose-plugin-aws

# 或者从本地加载
goose plugin load ./my-custom-plugin/

4.2 插件的内部结构

# 一个典型的 Goose 插件
from goose.tool import Tool, ToolResult

class PuppeteerTool(Tool):
    name = "browser_automation"
    description = "使用 Puppeteer 进行浏览器自动化操作"
    
    schema = {
        "type": "object",
        "properties": {
            "action": {
                "type": "string",
                "enum": ["goto", "click", "type", "screenshot", "evaluate"]
            },
            "target": {"type": "string"},
            "value": {"type": "string"},
            "selector": {"type": "string"}
        },
        "required": ["action", "target"]
    }
    
    def execute(self, action: str, target: str, value: str = None, 
                selector: str = None) -> ToolResult:
        if action == "goto":
            return self._goto(target)
        elif action == "click":
            return self._click(target)
        elif action == "screenshot":
            return self._screenshot(target)
        elif action == "evaluate":
            return self._evaluate(target)
        else:
            return ToolResult(success=False, 
                             error=f"Unknown action: {action}")
    
    def _goto(self, url: str) -> ToolResult:
        # 实际实现会调用 Puppeteer
        ...

# 插件入口
def register() -> List[Tool]:
    return [PuppeteerTool()]

插件的注册机制很简单:提供一个 register() 函数,返回工具列表。Goose 在启动时加载所有已注册的插件,将其合并到工具集中供 LLM 使用。

4.3 社区生态现状

截至 2026 年初,Goose 生态中已经有以下几类插件:

类别代表插件功能
浏览器自动化Puppeteer网页操作、截图、表单填写
云服务AWS 插件S3 操作、Lambda 部署
数据库PostgreSQL/MySQLSchema 迁移、数据查询
容器Docker镜像构建、容器管理
AI 服务Vertex AIGCP AI 服务集成

五、实战:用 Goose 完成一个完整任务

5.1 场景:自动化代码审查

假设我们有一个 PR 需要 AI 进行代码审查,使用 Goose:

# 安装代码审查插件
goose plugin install github.com/block/goose-plugin-code-review

# 启动审查任务
goose "请审查这个 PR 中的所有 Python 文件,关注:1) 安全漏洞 2) 性能问题 3) 代码风格"

Goose 会自动执行以下步骤:

Step 1/7: 克隆 PR 分支
  $ git fetch origin pr/123
  $ git checkout pr/123
  ✓ 完成

Step 2/7: 扫描所有 Python 文件
  $ find . -name "*.py" -not -path "./venv/*" -not -path "./tests/*"
  找到 47 个 Python 文件

Step 3/7: 运行静态分析
  $ python -m pylint --output-format=text src/
  检测到以下问题:
  - src/auth.py:42 - 硬编码密钥(严重)
  - src/db.py:15 - SQL 注入风险(严重)
  - src/utils.py:78 - 未使用的导入(轻微)

Step 4/7: 运行类型检查
  $ mypy src/ --strict
  发现 8 个类型不一致问题

Step 5/7: 检查依赖安全
  $ pip-audit
  发现 1 个已知漏洞:pyjwt < 2.4.0

Step 6/7: 生成审查报告
  ✓ 报告已生成

Step 7/7: 提交评论
  $ gh pr comment 123 --body "@reviewer 审查完成..."
  ✓ 评论已提交

审查完成!发现 3 个严重问题、8 个类型问题、1 个安全漏洞。

整个过程完全自动化,无需人工介入。这就是 Goose 的核心价值:把"我来做"变成"你去执行,我来监督"

5.2 任务取消与回滚

如果 AI 执行到一半,用户发现方向不对:

# 在 Goose 运行过程中,用户输入 Ctrl+C 或输入 "stop"
# Goose 会立即停止当前任务

$ goose "重构整个认证模块"
  ...
  Step 4/10: 删除旧 JWT 文件...
  ⚠️ 用户取消任务

# Goose 记录当前状态,允许回滚
$ goose rollback
  ✓ 已回滚到 Step 3/10 的状态
  ✓ 删除了 3 个临时文件
  ✓ 保留了原始 JWT 文件

回滚机制对于生产级工具来说至关重要。没有回滚能力的 AI 工具,在真实项目中是不可用的。


六、性能与安全:真实数据告诉你 Goose 的边界

6.1 性能基准

根据 Block 官方公布的测试数据:

指标数值
冷启动时间< 2 秒
工具调用延迟(本地)50-200ms
工具调用延迟(LLM API)500ms - 3s(取决于模型)
Docker 容器启动1.5-3s
单次任务平均执行时间30-120s
成功率(标准任务)约 87%

这里有一个有趣的对比:Goose 的"慢"其实不是真的慢。它花时间的地方在于:

  1. 规划阶段(理解任务、拆解步骤)
  2. LLM 推理(生成代码、决策下一步)
  3. 等待用户确认(人机协同环节)

这些"等待"是设计意图,不是性能缺陷。相比于让 AI 盲目执行到出错再回滚,这种"慢"是值得的。

6.2 安全边界

Goose 的安全模型建立在三个核心原则上:

原则 1:最小权限(Principle of Least Privilege)

  • 默认情况下,Goose 只能做配置文件里明确允许的事
  • 未声明的命令、网络请求、文件系统操作全部被拒绝

原则 2:沙箱隔离(Sandbox Isolation)

  • 所有执行都在 Docker 容器内进行
  • 容器网络默认断开(除非显式开启)
  • 文件系统只挂载工作目录

原则 3:人工确认(Human-in-the-Loop)

  • 对于危险操作(删除文件、重写关键模块),需要用户显式确认
  • 执行计划在开始前对用户可见
  • 用户可以随时中止、回滚
# 危险操作需要确认
DANGEROUS_OPERATIONS = [
    "rm -rf",
    "DROP TABLE",
    "git push --force",
    "chmod 777",
    "sudo",
]

def is_dangerous(command: str) -> bool:
    return any(op in command for op in DANGEROUS_OPERATIONS)

def execute_with_guard(command: str, user_approved: bool = False):
    if is_dangerous(command) and not user_approved:
        return ToolResult(
            success=False,
            error=f"危险操作需要确认: {command}",
            requires_approval=True
        )
    return execute(command)

七、Goose vs 竞品:选型指南

7.1 横向对比

特性GooseClaude CodeCopilot WorkspaceOpenClaw
开源✅ Apache 2.0
本地执行✅ Docker 隔离部分
插件系统✅ Python 插件有限
LLM 无关✅ 多模型支持Claude onlyGPT only
回滚机制部分
MCP 协议
记忆系统✅ 持久化会话级
商业支持Anthropic 官方Microsoft 官方社区

7.2 选型建议

选 Goose 当:

  • 你需要一个完全开源、可审计的解决方案
  • 你的团队需要深度定制 AI 编程工具
  • 你重视插件生态和扩展性
  • 你在 Block/Fintech 领域,对代码安全性要求极高

选 Claude Code 当:

  • 你的团队只使用 Anthropic 模型
  • 你需要一个开箱即用的方案,不需要深度配置
  • 你主要在开发机器上工作,不需要复杂的远程执行能力

选 OpenClaw 当:

  • 你需要一个功能全面的个人 AI Agent
  • 你需要跨平台的桌面/手机集成
  • 你重视 Skill 生态和工作流自动化

继续用 Copilot 当:

  • 你的团队已经深度绑定 Microsoft 生态
  • 你主要需要代码补全,不需要完整任务执行
  • 你的安全政策不允许任何第三方模型访问代码

八、深入理解:Goose 的设计哲学

8.1 从"对话式"到"工程式"的范式转移

当前大多数 AI 编程工具的设计哲学是对话式的:用户说一句话,AI 给一段回复。这种模式在简单任务上效率很高,但面对复杂工程任务时就会暴露问题:

  1. 上下文窗口有限:长任务会超出模型上下文
  2. 无法验证结果:AI 说"测试通过了",你怎么知道是真的?
  3. 缺乏状态管理:复杂任务中,AI 容易丢失之前的进度

Goose 的解法是把 AI 编程从"对话"模式转变为工程执行"模式

  • 任务有明确的开始和结束状态
  • 每一步操作都有可观测的结果
  • 整个执行链路可以被记录、审计、回滚

8.2 LLM 无关架构的工程价值

Goose 选择支持多 LLM,不是为了"谁都能用",而是为了可靠性

在生产环境中,你不会把命交给单一模型。GPT-4 在某些任务上强,Claude 在另一些任务上强,本地模型在隐私敏感场景下不可替代。Goose 的 LLM 无关架构让你可以:

# 根据任务类型选择不同的模型
model_routing:
  code_generation: gpt-4-turbo
  code_review: claude-sonnet-4
  security_analysis: gpt-4o  # 更好的安全知识
  documentation: gpt-3.5-turbo  # 便宜够用

这种路由能力在大型团队中非常重要——它让每个任务都用最合适的模型去处理,既保证质量,又控制成本。

8.3 记忆系统的长期价值

Goose 的记忆系统不只是"记住之前说了什么",它解决的是一个更深层的问题:AI 如何从过去的经验中学习

# 记忆系统的实际使用场景
memory_event = MemoryEvent(
    type="decision",
    timestamp=datetime.now(),
    description="用户拒绝了将 auth.py 改为 JWT 的方案,理由是团队不熟悉 JWT",
    context={
        "file": "auth.py",
        "proposed_change": "JWT",
        "user_feedback": "团队不熟悉 JWT,请使用 OAuth2",
        "outcome": "rejected"
    }
)

# 下次规划时,Goose 会参考这个记忆
# "用户团队不熟悉 JWT,方案需要额外文档或培训成本"

这种机制让 Goose 越用越"懂"你的团队,而不是每次都从头开始。


九、局限性与未来方向

9.1 当前局限性

1. 模型推理成本
Goose 的执行链路涉及多次 LLM 调用(规划 → 执行 → 验证 → 报告),单个任务的 token 消耗量是普通补全的 10-50 倍。对于成本敏感的场景,这是个现实问题。

2. 长程任务可靠性
尽管有记忆系统,Goose 在非常长的任务链(50+ 步骤)中仍然可能出现规划失效的情况。LLM 的推理能力有上限,当任务复杂度超过模型的规划能力时,执行质量会显著下降。

3. 插件生态成熟度
Goose 的插件生态还处于早期阶段。高质量的第三方插件数量有限,文档也不够完善。对于非标准场景(特定的内部框架、自研技术栈),开发者可能需要自己写插件。

4. 调试体验
当 Goose 执行失败时,定位问题原因往往需要理解底层架构。对于非 Rust 背景的开发者,这增加了排查难度。

9.2 未来方向(基于开源路线图分析)

根据 Goose 的 GitHub 仓库和 Block 团队的发文,以下方向值得关注:

  1. 多智能体协作:多个 Goose 实例分工处理不同子任务
  2. 更强的代码理解能力:集成 Tree-sitter、Semgrep 等静态分析工具
  3. 云端执行:不需要本地 Docker 的远程执行模式
  4. 更好的可视化:任务执行图、状态追踪 UI

十、总结:Goose 告诉我们的三件事

10.1 AI 编程工具的未来是"执行"而非"建议"

Goose 最有价值的创新不是某个具体功能,而是它的核心定位:从给建议变成真实执行。这个转变的意义远超工具本身——它代表着 AI 编程工具从"辅助工具"进化为"执行主体"的关键一步。

10.2 工程严谨性决定了 AI 工具的可用性

Goose 的 Docker 隔离、最小权限、白名单机制、回滚能力——这些看似"繁琐"的工程实践,恰恰是它在真实项目中可用的前提。没有这些,AI 写的代码越多,破坏力越大。

10.3 开源正在改变 AI 工具的权力格局

当 OpenClaw、Goose 这样的开源项目开始在 GitHub Trending 上超越商业产品时,它告诉我们:AI 工具的竞争已经从"谁有最好的模型"转向"谁有最好的工程"。在模型能力趋于同质化的未来,工程能力、扩展性、安全性会成为真正的差异化因素。


参考资料:

  • Goose GitHub 仓库:github.com/block/goose
  • Agent0 AI Agent Zero:github.com/agent0ai/agent-zero
  • CSDN 相关文章:《Goose AI Agent 技术解析:从代码建议到工程执行的开源实现》

本文首发于程序员茄子(chenxutan.com),如需转载,请注明出处。

复制全文 生成海报 AI Agent Rust Goose 开源 AI编程

推荐文章

Rust 高性能 XML 读写库
2024-11-19 07:50:32 +0800 CST
15 个你应该了解的有用 CSS 属性
2024-11-18 15:24:50 +0800 CST
Go 开发中的热加载指南
2024-11-18 23:01:27 +0800 CST
Vue 3 中的 Fragments 是什么?
2024-11-17 17:05:46 +0800 CST
Vue3中如何处理权限控制?
2024-11-18 05:36:30 +0800 CST
如何实现生产环境代码加密
2024-11-18 14:19:35 +0800 CST
如何在Rust中使用UUID?
2024-11-19 06:10:59 +0800 CST
企业官网案例-芊诺网络科技官网
2024-11-18 11:30:20 +0800 CST
使用 Vue3 和 Axios 实现 CRUD 操作
2024-11-19 01:57:50 +0800 CST
Vue3的虚拟DOM是如何提高性能的?
2024-11-18 22:12:20 +0800 CST
JavaScript设计模式:适配器模式
2024-11-18 17:51:43 +0800 CST
Vue 3 是如何实现更好的性能的?
2024-11-19 09:06:25 +0800 CST
用 Rust 玩转 Google Sheets API
2024-11-19 02:36:20 +0800 CST
在 Vue 3 中如何创建和使用插件?
2024-11-18 13:42:12 +0800 CST
一些好玩且实用的开源AI工具
2024-11-19 09:31:57 +0800 CST
微信内弹出提示外部浏览器打开
2024-11-18 19:26:44 +0800 CST
MySQL设置和开启慢查询
2024-11-19 03:09:43 +0800 CST
网站日志分析脚本
2024-11-19 03:48:35 +0800 CST
程序员茄子在线接单