深入解读 AI 编程工具 — Cursor

在 AI 工具爆发的时代,各类辅助编程产品层出不穷。而其中 Cursor 因其独特的设计与对开发者真实问题的深度关注,正在成为开发者群体热议的焦点。
本文将带你清晰了解:什么是 Cursor?它如何工作?真正解决了哪些痛点?为何能成为行业快速增长的工具? 

一、Cursor 的起源与快速成长

Cursor 背后的初创公司 Anysphere 成立于 2022 年,而 Cursor 的首个版本在 2023 年 3 月推出。仅仅两年时间,Anysphere 就完成了 9 亿美元的 C 轮融资,公司估值高达 99 亿美元!更令人惊讶的是,Cursor 的年收入已经突破 5 亿美元,这在开发工具领域几乎前所未有——据我所知,没有其他公司能在推出第一款产品后的两年内达到这样的规模。

Cursor 的快速普及也得益于企业级市场的认可:财富 500 强中超过一半的最大科技公司都在使用它。这不仅显示了 Cursor 的市场认可度,也侧面反映了其使用率和增长速度极快,在短时间内就能与 GitHub Copilot 等成熟工具形成竞争。

二、什么是 Cursor?

Cursor 是一个 AI 驱动的智能开发环境(AI‑powered IDE),由 Anysphere 公司研发,定位不是简单的代码补全插件,而是一个真正“理解你的代码库”的开发工具。它基于大型语言模型,对整个项目语义进行深度理解,并可以用自然语言进行交互与编程。 

从某种意义来说,Cursor 更像是一个 开发者的智能“协作者” 而不仅仅是一个编辑器。它被越来越多的工程师用于解决真实的开发难题,尤其是在面对跨文件重构、复杂代码搜索与快速迭代时。 

三、Cursor 的核心内容

Cursor 的核心内容主要由以下几个部分组成:

1. 语义索引与安全索引部分

Cursor 会在项目打开时对整个代码库进行索引,生成“语义图”。实现方法如下:

  • 代码拆分与嵌入:Cursor 会将每个文件拆分成小块,每块生成向量嵌入(embedding),便于向量搜索。
  • 安全处理:文件名和代码被加密和混淆,避免在服务器端泄露敏感信息。
  • 向量数据库存储:嵌入存储在专门的向量数据库中,用于快速匹配查询。
  • Merkle Tree 保持索引同步:客户端和服务器端分别保存 Merkle 树,通过比较哈希值,只重新索引被修改的文件,从而节省计算资源和带宽。

这种架构保证了 Cursor 能在不上传完整源码的情况下,实现全局语义搜索和自然语言问答功能,同时保持安全性。

1.1. 使用代码块进行语义索引

为了支持像上文提到的向量搜索,Cursor 需要先将代码拆分成更小的块,创建嵌入(embeddings),并将这些嵌入存储在服务器上。具体流程如下:

  1. 创建代码块:Cursor 会将每个文件的内容切分成小块,每一块将作为后续的嵌入单元。
  2. 生成嵌入而不存储原始文件名或代码:Cursor 不希望在服务器上存储文件名或源码,因为这些信息可能被视为机密。它会将文件名混淆,并将代码块加密后发送到服务器。服务器解密后,使用 OpenAI 的嵌入模型或自研模型生成嵌入,并存储在向量数据库(Turbopuffer)中。

生成嵌入需要大量计算资源,因此在 Cursor 的后端利用云端 GPU 来完成。对于中型代码库,索引通常在一分钟以内完成,而大型代码库可能需要数分钟甚至更长时间。用户可以在 Cursor 的设置中查看索引状态(Cursor Settings → Indexing)。

1.2 使用 Merkle 树保持索引最新

在编辑代码库时,无论是使用 Cursor 还是其他 IDE,服务器端的索引都会逐渐过时。一个简单但低效的解决方案是每隔几分钟重新索引所有文件,但由于索引计算量大,并且传输加密代码块会消耗带宽,这并不理想。Cursor 的做法是使用 Merkle 树 和高延迟同步引擎(每 3 分钟运行一次)来保持服务器索引的更新。

Merkle 树是一种树结构,每个叶子节点是对应文件的加密哈希值(例如 main.js 文件的哈希),每个非叶子节点是其子节点哈希的组合。Cursor 对每个文件夹和项目建立类似结构的 Merkle 树(使用混淆后的文件名),客户端和服务器分别维护自己的树。

每 3 分钟,Cursor 会进行一次索引同步。通过对比客户端和服务器的 Merkle 树,Cursor 可以确定哪些文件需要重新索引。例如,如果客户端的 index.html 文件发生变化,通过树遍历可以快速定位需要同步的文件。Merkle 树不仅让树遍历高效,还能确保只同步发生变化的文件,最大限度减少计算和带宽消耗。

这种 Merkle 树结构非常适合实际使用场景:比如一天结束关闭电脑,第二天拉取 Git 更新,或者团队协作时大量文件变化,Cursor 只会重新索引必要的文件,节省时间和计算资源。

1.3. 安全索引

虽然 Cursor 不在服务器上存储源码,但一些敏感信息仍不适合上传,即使加密也可能存在风险,包括 密钥、API Key、密码 等。

  • 使用 .gitignore.cursorignore 可以确保索引安全。敏感信息通常以本地变量或 .env 文件形式存储,这些文件被加入 .gitignore。Cursor 会遵循这些规则,不索引或上传被忽略的文件。
  • 上传代码块前,Cursor 还会扫描可能的敏感信息,避免上传。
1.4. 大规模代码库的索引

对于包含数千万行代码的大型单仓库(monorepo),索引整个代码库非常耗时且消耗大量计算资源,而且通常没有必要。此时使用 .cursorignore 文件忽略不需要索引的文件是最合理的做法,官方文档提供了详细指南。

 2. 我观察到的 Cursor 实际工具调用顺序

阶段 1:理解项目结构(建立上下文)

当 Cursor 还不知道项目长什么样时
顺序工具用途说明
list_dir查看目录结构先了解项目布局,入口文件、模块划分
file_search文件名模糊搜索快速定位可能相关的文件
glob_file_search模式查找文件批量定位某类文件(如 *.tsx**/api/**

阶段 2:定位相关代码(从粗到细)

Cursor 开始“找代码”
顺序工具用途说明
codebase_search语义代码搜索用自然语言理解需求,找到可能相关的实现
grep精确文本 / 正则搜索对关键函数名、变量名做精确定位
read_file读取文件内容查看实现细节,理解上下文

👉 真实情况

  • codebase_search 用来“猜方向”
  • grep 用来“钉位置”

阶段 3:深入理解与补充上下文

代码不够?继续挖
顺序工具用途说明
read_file(局部)精读关键逻辑常用 offset / limit 读取重点代码
glob_file_search发现相关文件如找测试、接口、调用方
grep(扩展)查调用链搜索函数被谁调用、在哪里使用

阶段 4:修改 / 生成代码

Cursor 开始“动手改代码”
顺序工具用途说明
edit_file修改现有文件插入、删除、调整逻辑
write_file创建新文件新模块、新组件、新测试
apply_diff批量应用修改多文件、大范围重构时使用

阶段 5:验证与执行

确认改动是否正确
顺序工具用途说明
terminal执行命令构建、测试、lint、安装依赖
read_file复查改动检查最终代码是否符合预期

阶段 6:补充信息(必要时)

本地信息不够时
顺序工具用途说明
web_search网络搜索查最新文档、API、解决方案

阶段 7:版本控制与结构性改动(可选)

依赖环境 & 权限
顺序功能说明
Git 操作查看 diff、提交、更建分支
代码重构工具重命名符号、提取函数/变量

一句话总结调用规律

Cursor 的真实工作方式是:
先看结构 → 再语义搜索 → 精确搜索 → 读文件 → 改代码 → 跑命令 → 再检查

以“添加用户认证功能”为例:

2. 编辑器核心层

编辑器核心提供代码可视化、文件管理、终端集成等基础 IDE 功能,同时支持插件扩展和自定义界面。它是 Cursor 的运行基础,使 AI 功能能在熟悉的开发环境中无缝操作。

3. AI models 

Cursor 支持来自所有主要模型提供商的所有前沿编程模型。

4. 自然语言交互与多代理系统

Cursor 提供自然语言交互,开发者可以直接用普通语言指令修改代码、重构模块或生成新功能。同时,Cursor 支持多代理模式,多任务 AI 可以并行运行,协调完成复杂的开发任务,例如重构整个模块或自动生成测试代码。

5.  Commands

Cursor 的命令功能允许你创建可复用、可共享的工作流命令,这些命令以简单的 / 前缀触发,可在聊天输入框中快速调用,从而提高团队协作效率和常见任务处理的速度。

🛠️ 命令是如何工作的?

  • 命令以 纯 Markdown 文件 (*.md) 的形式定义;
  • 文件放在特定目录中后,系统会在聊天框输入 / 时自动检测并展示可用命令。

例如run-tests-and-fix-failure.md 可以定义成下面这样的。

# Run All Tests and Fix Failures ## Overview Execute the full test suite and systematically fix any failures, ensuring code quality and functionality. ## Steps 1. **Run test suite** - Execute all tests in the project - Capture output and identify failures - Check both unit and integration tests 2. **Analyze failures** - Categorize by type: flaky, broken, new failures - Prioritize fixes based on impact - Check if failures are related to recent changes 3. **Fix issues systematically** - Start with the most critical failures - Fix one issue at a time - Re-run tests after each fix

可存放的位置包括:

  1. 项目命令:存放在项目根目录下的 .cursor/commands 文件夹;
  2. 全局命令:存放在用户主目录的 ~/.cursor/commands 文件夹。
.cursor/ └── commands/ ├── address-github-pr-comments.md ├── code-review-checklist.md ├── create-pr.md ├── light-review-existing-diffs.md ├── onboard-new-developer.md ├── run-all-tests-and-fix.md ├── security-audit.md └── setup-new-feature.md

Cursor Commands

6. Context 

在代码生成过程中提供给 AI 模型的信息,包括文件、symbols以及对话历史。

7. CLI

Cursor CLI 是 Cursor 提供的命令行级 AI 编程接口,用于在终端环境中直接调用 AI Agent 完成代码编写、重构、审查与问题分析等任务。相比只存在于编辑器中的 AI 助手,Cursor CLI 更适合融入现有的工程化流程,例如脚本自动化、CI/CD 流水线以及本地工具链。

该工具支持 交互式模式非交互式模式:在交互模式下,开发者可以与 AI 进行持续对话,逐步明确需求、审阅修改方案并确认执行;在非交互模式下,则可通过一次性指令输出结果,适用于性能检查、安全审计等自动化场景。同时,Cursor CLI 提供会话管理能力,允许恢复历史对话,从而在多次调用中保持上下文一致性,减少重复沟通成本。

整体来看,Cursor CLI 更像是一个可脚本化的 AI 编程代理入口,将 AI 能力下沉到终端层,使其成为开发流程中的基础工具,而不仅是编辑器里的辅助功能。

细节请查阅下面官网链接。https://cursor.com/docs/cli/overview

Cursor headless CLI

8. hooks

Hooks 允许你通过自定义脚本来观察、控制并扩展代理(agent)循环。Hooks 是独立启动的进程,使用 JSON 通过标准输入/输出(stdio)进行双向通信。它们会在代理循环的指定阶段之前或之后运行,并且可以对行为进行观察、阻止或修改。

{ "version": 1, "hooks": { "beforeShellExecution": [{ "command": "./script.sh" }], "afterShellExecution": [{ "command": "./script.sh" }], "afterMCPExecution": [{ "command": "./script.sh" }], "afterFileEdit": [{ "command": "./format.sh" }], "beforeTabFileRead": [{ "command": "./redact-secrets-tab.sh" }], "afterTabFileEdit": [{ "command": "./format-tab.sh" }] } }

四、Cursor 的新功能

 1. 自动测试web 页面以及修复。

只需要表述你要测试什么内容,然后cursor就帮你启动项目并且自动测试里面内容。

比如你的测试内容如下:

把llm playground 页面里面文生文,文生图的功能给我测试一下,在测试的过程中,如果发现有什么问题,给我修复一下。后端python 环境是conda 里面虚拟环境llm_Ft。

下图是测试结果。

完整视频

Cursor Browser - 页面自动测试

2. Debug Mode

编码 Agent 在很多事情上都很擅长,但有些 bug 总能难倒它们。为此我们推出了 Debug Mode——一种完全围绕运行时信息和人工验证构建的全新 Agent 工作循环。

在构建它时,我们研究了团队中最擅长调试的工程师的实践,并将他们的工作流整合为一种 Agent 模式,为其配备了可对代码进行插桩以采集运行时日志的工具、用于生成多种“到底出了什么问题”假设的提示,以及主动请你协助复现问题和验证修复的能力。

最终形成的是一个交互式流程,可以可靠地修复那些此前即便是最智能的模型单独工作也力所不及,或需要开发者投入大量时间才能处理的 bug。

1. 描述该 bug

首先,从下拉菜单中选择 Debug Mode,并尽可能详细地描述这个 bug。

debug-mode-intro1

代理不会立即尝试生成修复方案,而是先通读你的代码库,并针对可能出错的地方提出多个假设。其中有些可能是你自己也会想到的思路,但另一些则很可能是你原本不会考虑的方法。

接下来,代理会在你的代码中插入用于验证这些假设的日志记录语句,从而为在 bug 发生时获取实际运行数据做好准备。

2. 复现该 bug

接下来,回到你的应用,在代理采集运行时日志的同时复现这个 bug。

debug-mode-repro2

当 bug 发生时,代理可以准确了解你的代码中发生了什么:变量状态、执行路径以及时序信息。基于这些数据,它可以精准定位根本原因并生成有针对性的修复方案。通常这只需要对两三行代码做精确修改,而不是像普通代理交互那样给你上百行试探性代码。

3. 验证修复

此时,Debug Mode 会要求你在应用了建议修复的情况下,再复现一次这个 bug。若 bug 已经消失,你就可以将其标记为已修复,agent 会移除所有埋点(instrumentation),只留下一个干净、最小化的变更,方便你直接发布。

debug-mode-fixed3

3. 浏览器布局和样式编辑器

借助全新的浏览器侧边栏和组件树,同时进行设计与编码。

移动元素、更新颜色、测试布局并实时调整 CSS,然后使用 agent 将更改即时应用到你的代码库中。你也可以选中多个元素,通过文字描述你想要的修改,让 agent 自动完成视觉调整。

cursor-browser-css-inspector

4. 代码审核-bugbot

4. 多智能体评判-Multi-agent judging

当并行运行多个智能体时,Cursor 现在会自动评估所有运行结果,并推荐一个最佳解决方案。

被选中的智能体会附带一条评论,解释为何选择它。只有在所有并行智能体都完成运行之后,才会进行最佳解决方案的评判。

为什么我更推荐Cursor?

它不只是一个插件,而是一个增强版VS Code

最开始我也用过Copilot、Codeium、CodeGeeX等插件,说实话,功能都差不多。但Cursor给我最大的感受是:它把AI功能完全整合进了编辑器,体验完全不一样。
具体体现在:

  •  更强的全局代码库理解(Context Awareness)- Semantic Search
  • 针对大型任务(重构/多文件更改)更友好 -- large-scale refactor,
  • 多agent 一起运行 --Parallel Agents
  • 与linear ,figma , browser 集成。
  • 响应更快,不会有插件经常性的卡顿
  • 理解整个代码库,而不只当前文件
  • 会主动搜索和读取代码,不用手动喂上下文
  • 更擅长多文件修改和重构
  • 可以直接用自然语言下达“项目级指令”
  • 更适合接手和理解陌生 / 老项目
  • 对调用链、影响范围的判断更强
  • 修改代码时更像在“结对编程”而不是补全
  • 对复杂改动(重构、统一风格、抽逻辑)成功率更高
  • 隐私安全:支持本地控制和隐私模式,保护企业代码。

Copilot的其他优势

当然,Copilot也有它独有的优势。
它几乎支持所有主流IDE 。你可以在VS Code里用它,换到IDEA或WebStorm也能用,甚至连Neovim党都能愉快地使用Copilot。

简而言之,Copilot 更像是“增强型助手”,依附于已有 IDE,而 Cursor 更像一个“AI 伙伴 IDE”,在项目全局上提供智能决策和自动化支持。

七、价格

个人

所有个人计划均包含:

  • 无限标签补全
  • 所有模型的更高 Agent 使用上限
  • 访问 Bugbot
  • 访问 Cloud Agents

每个计划都包含按模型推理的 API 价格计费的用量:

  • Pro 包含 $20 的 API Agent 用量 + 额外奖励用量
  • Pro Plus 包含 $70 的 API Agent 用量 + 额外奖励用量
  • Ultra 包含 $400 的 API Agent 用量 + 额外奖励用量

模型定价

八. 技术栈

关于 Cursor 这个不到 3 年历史的代码库的一些数据:

  • 25,000 个文件
  • 700 万行代码

编辑器是基于 Visual Studio Code 的分支开发的,这意味着它使用了和 VS Code 相同的技术栈:

  • TypeScript:大部分业务逻辑都是用这种语言编写
  • Electron:Cursor 使用的框架

在公司刚成立时,他们必须决定是像 Zed 那样从零构建编辑器,还是从现有编辑器分支开始。Sualeh 解释了这个决定:

“我们需要拥有自己的编辑器,而不能‘只是’一个扩展,因为我们想改变人们编程的方式。这意味着我们要么构建一个全新的 IDE,要么从现有编辑器分支。
我们选择了分支,因为从零开始构建稳定的编辑器需要巨大的工作量。我们的价值主张不是构建稳定的编辑器,而是以渐进方式改变开发者的编程方式。例如,要构建神奇的‘标签模型’,如果不分支几乎不可能,而通过分支就很简单。分支让我们能够专注于用户体验,而不是编辑器本身。”
后端
  • TypeScript:大部分业务逻辑使用该语言
  • Rust:所有性能关键组件使用 Rust,例如下面提到的 Orchestrator
  • Node API 调用 Rust:大部分业务逻辑在 TypeScript 中,性能密集部分在 Rust 中,因此通过 Node.js 桥接从 TypeScript 调用 Rust 代码。例如调用用 Rust 编写的索引逻辑就大量使用了这种桥接
  • 单体架构:后端服务大部分是单体架构,并作为整体部署。这提醒我们,单体架构对早期创业公司来说非常有效,能帮助团队快速迭代
数据库
  • Turbopuffer:多租户数据库,用于存储加密文件和工作区的 Merkle 树(下面会详细介绍)。团队喜欢它的可扩展性,也避免了以前处理数据库分片的复杂性。关于挑战见下文“工程挑战”
  • Pinecone:向量数据库,用于存储部分文档的 embedding
数据流
  • Warpstream:兼容 Apache Kafka 的数据流服务
工具链
  • Datadog:日志和监控。Sualeh 表示他们是重度用户,觉得 Datadog 的开发者体验远优于其他选择
  • PagerDuty:值班管理,与 Slack 集成
  • Slack:内部沟通和聊天
  • Sentry:错误监控
  • Amplitude:分析工具
  • Stripe:支付和计费,用于购买 Cursor 的计划
  • WorkOS:Cursor 登录认证,例如 GitHub 或 Google Workspace 登录
  • Vercel:Cursor.com 网站的托管平台
  • Linear:工作管理
  • Cursor:当然,团队用 Cursor 自己开发 Cursor。最终,每个工程师都对自己提交的代码负责,无论是手写还是由 Cursor 生成
模型训练

Cursor 使用多个提供商来训练自己的模型或微调现有模型:

  • Voltage Park
  • Databricks MosaicML
  • Foundry
物理基础设施

所有基础设施都运行在云端。Sualeh 说:

“非常依赖云。主要使用 AWS,其次 Azure 处理推理。我们还使用其他一些新型 GPU 云服务。”
  • 大部分 CPU 基础设施在 AWS 上运行
  • 运营数万块 NVIDIA H100 GPU,其中一部分在 Azure 上
在 Microsoft Azure 数据中心的 20 块 NVIDIA H100 GPU。Cursor 的计算需求相当于成千上万这样的机架。来源:NVIDIA
  • 推理(Inference)是 Cursor 使用 GPU 的最大场景,用于生成下一个 token,无论是自动补全还是完整代码块。实际上,Azure GPU 只用于推理,不用于 LLM 相关的微调和模型训练
  • Terraform 用于管理基础设施,比如 GPU 和虚拟机(如 EC2 实例)

九、总结

Cursor 是一款超越传统 IDE 的 AI 驱动开发环境,它不仅提供智能补全,更通过语义索引、自然语言交互和多任务代理,实现了对整个项目的理解和操作。与 Copilot 相比,Cursor 在全局语义理解、自动化能力和多代理协作方面有明显优势,是 AI 参与软件开发的一种全新范式。

对于追求高效率、跨模块协作以及复杂项目自动化的开发者,Cursor 不只是辅助工具,而是一个真正的智能开发伙伴。

参考资料

https://newsletter.pragmaticengineer.com/p/cursor?utm_source=chatgpt.com

https://docs.github.com/en/copilot/tutorials/reduce-technical-debt?utm_source=chatgpt.com

https://cursor.com/docs/get-started/concepts

https://cursor.com/security#codebase-indexing

https://cursor.com/cn/blog/debug-mode

https://cursor.com/cn/changelog/2-2

https://dev.to/zachary62/building-cursor-with-cursor-a-step-by-step-guide-to-creating-your-own-ai-coding-agent-17c4

https://cursor101.com/zh/tutorial/learn-cursor-0-why-use-cursor

https://www.emergentsoftware.net/blog/cursor-vs-github-copilot-choosing-the-right-ai-coding-assistant/?utm_source=chatgpt.com

Read more

手把手实现OCR自动化:DeepSeek-OCR-WEBUI快速上手指南

手把手实现OCR自动化:DeepSeek-OCR-WEBUI快速上手指南 1. 引言 1.1 OCR技术的现实挑战 在数字化转型加速的今天,大量纸质文档、扫描件和图像中的文本信息亟需高效提取。传统OCR(光学字符识别)工具虽然能处理标准印刷体文字,但在面对复杂背景、低分辨率图像、倾斜排版或手写体时往往表现不佳。此外,企业级应用对多语言支持、结构化输出(如表格还原)、API集成能力提出了更高要求。 DeepSeek-OCR-WEBUI 正是在这一背景下推出的开源解决方案。它基于深度学习大模型,具备强大的文本定位与识别能力,尤其擅长中文场景下的高精度OCR任务。通过Web界面与OpenAI兼容接口的双重设计,既满足开发者集成需求,也方便非技术人员直接使用。 1.2 本文目标与价值 本文将带你从零开始部署并使用 DeepSeek-OCR-WEBUI 镜像,涵盖环境准备、服务启动、前后端交互逻辑及实际调用示例。你将掌握: * 如何快速部署一个本地OCR服务 * 使用标准HTTP请求进行图片文本提取 * 借助Web UI实现可视化操作 * 将其无缝集成到现有工作流中 无

双剑破天门:攻防世界Web题解之独孤九剑心法(九)

双剑破天门:攻防世界Web题解之独孤九剑心法(九)

免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任 **本文以攻防世界部分题为例进行演示,后续会对攻防世界大部分的web题目进行演示,如果你感兴趣请关注** 目录 一:Supersqli 二:Warmup 三:总结 1.supersqli 2.Warmup 一:Supersqli 打开如下所示,初步筛查这应该是一道SQL注入题 这确实是一道SQL注入 1’ or 1=1 # 那接下来就是查询字段数 字段数为2 1’ order by 2 # 查询数据库 正常的查询发现不行,被过滤了 但是没有过滤分号那就可以堆叠注入联合show 1’;show tables ;# 成功查询到一个特殊的表 1';show columns from `1919810931114514`;# 查询发现此表含flag但select被过滤如何查询flag 利用handler代替select

前端常用可视化图表组件大全

🖥️ PC端主流图表库(通常也支持移动端) 这些是功能最强大、应用最广泛的库,能覆盖绝大多数PC端仪表盘和后台管理系统的需求。 库名称核心特点适用场景渲染技术开源/许可ECharts国产全能型:图表类型极丰富(50+种),配置灵活,中文文档友好,社区庞大。支持Canvas和SVG双引擎渲染,性能优异 。企业级后台、大屏展示、PC端各类复杂图表需求。Canvas/SVGApache 2.0 (开源)Chart.js简单易用:上手门槛极低,API简洁明了,文档清晰。设计风格清新现代,响应式布局是内置的 。快速原型开发、小型项目、需要简洁美观图表的场景。CanvasMIT (开源)Highcharts成熟稳定:商业级库,兼容性极佳(支持IE6),交互和样式非常精致。被全球众多大公司信赖,文档和示例极其完善 。对浏览器兼容性要求严苛的金融、政府项目;追求极致稳定性的企业应用。SVG/VML免费供非商业使用,商业需许可D3.js定制之王:不提供预制图表,

前端部署:别让你的应用在上线后掉链子

前端部署:别让你的应用在上线后掉链子 毒舌时刻 这部署流程写得跟绕口令似的,谁能记得住? 各位前端同行,咱们今天聊聊前端部署。别告诉我你还在手动上传文件到服务器,那感觉就像在石器时代用石头砸坚果——能用,但效率低得可怜。 为什么你需要自动化部署 最近看到一个项目,部署时需要手动复制文件到服务器,每次部署都要花上几个小时。我就想问:你是在做部署还是在做体力活? 反面教材 # 反面教材:手动部署 # 1. 构建项目 npm run build # 2. 压缩文件 zip -r build.zip build # 3. 上传到服务器 scp build.zip user@server:/var/www/html # 4. 登录服务器 ssh user@server # 5. 解压文件 unzip