发布于 2026-01-06 0 阅读
0

使用 Cursor AI 进行 Vibe 编码:如何构建 Figma 风格的注释 DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

使用光标 AI 进行 Vibe 编码:如何构建 Figma 风格的注释

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

介绍

现代应用程序开发依赖于协作。无论是头脑风暴、代码审查还是用户界面设计,如今的团队都能通过实时、情境化的反馈,比以往任何时候都更加顺畅地协同工作。

人工智能现在为许多协作应用程序提供支持,一种新的概念正在流行:“Vibe Coding”(氛围编码)。

如果你经常在 X(以前称为 Twitter)上和开发者们交流,你可能会注意到人们通过编写代码来构建各种东西,从快速演示应用程序到可用于生产的 SaaS 产品。

在本教程中,我将向您展示如何使用Cursor AI来实现这一点。

我们将借助Velt(一个可以轻松嵌入实时协作功能的工具包)在 Web 应用程序中构建一个 Figma 风格的评论系统。

到最后,你将拥有一个功能齐全的实时评论系统,具有嵌套线程和上下文反馈功能,就像 Figma 一样。

我们将添加到应用程序中的主要功能:

图片100

  • 上下文注释:为项目中的元素或部分添加注释,供用户参考。
  • 实时协作:同步用户间的评论更新,确保大家步调一致。
  • 主题评论:允许用户回复评论,并允许主题从评论区清除,以便更好地组织内容。

完成本教程后,您将掌握在应用程序中构建交互式和协作功能的基础知识,您可以扩展应用程序的更多功能,并将用户体验提升到一个新的水平!

如今,协作不仅仅是一项功能,更是现代数字环境中的一项基本要求。还记得你上次使用 Figma 或 Google Docs 是什么时候吗?感觉是不是很流畅?

这绝对不仅仅是能够实时评论和编辑,而是那种亲密感和连接感,让人感觉即使通过数字界面,其他人也在做出贡献。

Vibe 编码和光标 IDE

图片99

随着人工智能为许多协作应用程序提供支持,一种名为“Vibe Coding”(氛围编码)的新概念正在流行。Vibe Coding 由 OpenAI 联合创始人 Andrej Karpathy 提出,其核心思想是让人工智能和大型语言模型 (LLM) 自动完成大部分编码任务。

这使得开发者能够专注于改进和引导AI生成的代码,而不是手动编写每一行代码。正如Karpathy所说:

“有一种我称之为‘感觉编码’的新型编码方式,在这种方式中,你要完全沉浸于感觉之中,拥抱指数级增长,甚至忘记代码的存在。”

Cursor是最受欢迎的 AI 代码编辑器之一,它让编写代码变得更加轻松,提供智能代码补全和对话式编码功能,例如 AI 聊天、代理和 Composer。

它们共同帮助开发者更快地交付产品,同时减少重复性工作。无论您是构建快速演示还是构建完整的应用程序,Cursor AI 的 Vibe 编码功能都能极大地提升您的工作效率。

Vibe 编码的优点和缺点

虽然 Vibe 编码为加速开发和扩大参与提供了令人兴奋的机会,但为了保持代码质量和开发人员的熟练程度,平衡 AI 辅助和人工监督至关重要。

优点:

  • Vibe 编码有助于自动化重复性任务,使开发人员能够专注于解决问题和创造性任务,从而更快地构建和发布产品。
  • 借助人工智能工具处理大部分样板工作,开发人员可以快速构建原型并迭代产品,从而加快创新周期。
  • Vibe 编码降低了入门门槛,让非技术用户或初级开发人员可以通过自然语言指令创建功能性应用程序。

缺点:

  • AI 生成的代码有时可能缺乏优化或引入隐藏的低效之处,需要开发人员额外关注进行审查和重构。
  • 如果没有严格的监管,人工智能工具可能会生成存在安全漏洞或用户数据处理不当的代码,从而增加安全漏洞的风险。
  • 过度依赖人工智能进行编码可能会导致对核心编程概念的实践经验减少,从而可能削弱开发人员的长期专业技能。

过度依赖 Vibe 编码可能会给应用程序带来潜在的安全问题,正如这条推文所示:

图1

从零开始构建 Figma 风格评论的挑战

一开始,构建一个类似 Figma 的评论系统似乎很简单,只要用户能够评论并显示评论即可。然而,一旦涉及到后端需求,复杂性就会迅速提升,许多开发者很快就会发现这一点。在本文中,我们将深入剖析从零开始构建此类系统所面临的主要挑战和所需投入。

前端和后端要求

你的前端开发将专注于构建用于添加和显示评论的用户界面。这包括确保评论显示在正确的位置(避免淹没无关区域)以及流畅地处理实时更新。

虽然前端对用户体验至关重要,但真正的复杂性却隐藏在幕后,由后端处理。

后端是大部分神奇功能发生的地方。它为实时协作提供支持,管理数据流并保护您的应用程序。

以下是后端的一些关键考虑因素:

数据存储与管理

高效存储评论至关重要。你需要一个数据库架构,支持线程式讨论(回复位于其父讨论下方,而不是线性地排在最后)、上下文信息(这条评论针对哪个元素?)、元数据,例如,每次你发表评论时,请提供一些信息,告诉我评论的内容以及评论者是谁。

将这项功能扩展到数百万条评论,同时还要保证快速查询性能,这是一个巨大的挑战。

// An example: Database schema for comments
{
    id: 'comment-123',
    userId: 'user-456',
    elementId: 'element-789', 
    text: 'This needs revision.',
    timestamp: '2023-10-01T12:34:56Z',
    replies: 
    [ 
            { userId: 'user-789', text: 'Agreed.', timestamp: '2023-10-01T12:35:10Z' }
    ]
}
Enter fullscreen mode Exit fullscreen mode

真正的挑战在于:

  • 设计一个能够随着评论数和用户数扩展的模式。
  • 高效地查询评论中的特定元素或主题。
  • 在不破坏数据完整性的前提下处理更新和删除操作。

实时通信

后端系统应该足够快,能够与用户实时同步(响应同步评论)。

您拥有 WebSocket 连接,您拥有用户在线状态,并且存在以下提到的延迟问题。尤其是在处理不稳定的连接或高用户并发时。

// Backend WebSocket implementation
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
    ws.on('message', (message) => {
        const comment = JSON.parse(message);
        broadcastComment(comment); // Send to all connected clients
    });

    ws.on('close', () => {
        handleUserDisconnect(ws.userId); // Handle user disconnections
    });
});

Enter fullscreen mode Exit fullscreen mode

主要挑战:

  • 在多个服务器实例之间存储 WebSocket 连接。
  • 连接不稳定(例如,用户使用不稳定的网络或短暂断开连接)。
  • 评论实时同步,不会造成服务器崩溃。

安全与合规

只有经过身份验证的用户才能查看或评论应用,这一点至关重要。您需要设置安全措施、进行授权并处理数据隐私。而当涉及到多区域部署或 GDPR 等标准时,这一切都会变得极其复杂。

// An example Authenticating WebSocket connections
wss.on('connection', (ws, req) => {
    const token = req.headers['authorization'];
    if (!validateToken(token)) {
        ws.close(); // Reject unauthorized connections
    }
});
Enter fullscreen mode Exit fullscreen mode

主要挑战:

  • 实施安全的身份验证和授权机制。
  • 确保数据隐私并遵守相关法规。
  • 防止恶意攻击(例如,垃圾评论或数据泄露)。

可扩展性和多区域支持

随着用户群的增长,扩展评论系统势在必行。这通常包括在不同地区部署服务器,以及处理复杂的状态同步问题,以确保全球评论同步。

// Multi-region presence sync
function syncPresenceAcrossRegions(userId, status) {
    const regions = ['us-east', 'eu-west', 'ap-south'];
    regions.forEach(region => {
        if (region !== currentRegion) {
            notifyRegion(region, userId, status); // Sync user state across regions
        }
    });
}
Enter fullscreen mode Exit fullscreen mode

主要挑战:

  • 在不降低性能的前提下处理高用户并发请求。
  • 以最小的延迟跨多个区域同步用户状态和评论。
  • 随着用户群的增长,如何有效管理基础设施成本?

资源投资

开发时间

从零开始构建一个可用于生产环境的代码库,例如一个评论系统,可能需要数周甚至数月的时间。这包括设计、开发、测试以及随着时间推移需要不断改进的迭代过程。

维护

一旦部署完成,您将需要持续修复漏洞、扩展应用程序并进行安全更新。您如何应对用户数量的快速增长?或者,当 WebSocket 连接建立失败时,您又该如何处理?

// Handling WebSocket reconnections
socket.onclose = () => {
    setTimeout(() => {
        connectWebSocket(); // Reconnect after a delay
    }, 5000);
};
Enter fullscreen mode Exit fullscreen mode

成本

实时协作需要基础设施支持。你需要服务器来建立 WebSocket 连接,需要数据库来存储评论和进行监控,以确保一切正常。

Velt SDK简介

Velt SDK

从零开始构建实时协作功能(例如实时评论、光标轨迹或用户在线状态指示器)通常既复杂又耗时。

Velt SDK提供高性能、即插即用的实时在线状态和协作解决方案,简化了这一流程。您无需担心 WebSocket 管理、会话处理或实时同步等问题。

借助 Velt,您可以专注于产品的核心功能,同时无缝添加 Figma 式的实时评论等功能。此外,Velt 还负责前端和后端,您甚至可以接入自己的身份验证提供商,从而更快地发布产品,减少不必要的麻烦。

项目设置

首先,在终端中运行以下命令创建一个新的 React 项目:

npx create-react-app figma-style-comment
cd figma-style-comment
Enter fullscreen mode Exit fullscreen mode

您的全新 React 项目已搭建完成!在深入学习之前,我们还需要安装一个包。安装完成后,我们就可以使用Cursor AI生成应用程序了。

接下来,我们来安装Velt npm 包:

npm install @veltdev/react
Enter fullscreen mode Exit fullscreen mode

这是我们目前所需的最基本配置。

接下来,我们将使用 Cursor AI 来帮助我们构建应用程序。但在此之前,我们需要配置 Velt 以便正确集成它。

配置

前往 Velt 控制台 并获取您的 Velt API 密钥。此密钥将用于验证您对 Velt API 的请求。

然后将此 API 密钥存储在您的 .env 文件中:

REACT_APP_VELT_API_KEY=your_api_key
Enter fullscreen mode Exit fullscreen mode

到目前为止,我们已经使用 React 设置了项目,安装了@veltdev/reactnpm 包,并且获取了 Velt API 密钥。

使用光标构建着陆页

我们现在已经搭建了一个基本的 React 项目。我们也安装了 Velt npm 包,但在深入研究它之前,我们的首要任务是构建着陆页。

那么,我们先来重点使用 Cursor 构建着陆页吧!

我们已向 Cursor AI 聊天发出提示:

Generate a high-quality, premium-looking landing page for an AI product using React and normal CSS (no Tailwind or styled-components). The landing page should have a modern and sleek design with an engaging hero section, a compelling call-to-action (CTA), and sections for features, testimonials, and pricing.

The design should feel futuristic, elegant, and visually appealing with a clean UI, smooth animations (CSS-based where possible), and a dark theme with neon or gradient accents. Include:

- Hero Section: Large, eye-catching headline, subtext, and a 'Get Started' button.
- Features Section: Three to four cards highlighting AI product capabilities with icons.
- Testimonials: A section with user reviews and profile pictures.
- Pricing: Simple pricing plans with CTA buttons.
- Footer: Contact info, social links, and company details.

Ensure the page is fully responsive and looks premium on all devices. Use CSS for styling, avoiding frameworks like Tailwind or Bootstrap. Maintain proper spacing, typography, and hover effects for a smooth UI experience.
Enter fullscreen mode Exit fullscreen mode

图2

Cursor 生成了根组件的内容,在本例中为App.jsx。请务必检查并确认所有设置均已正确后再继续!

图3

现在,这是我们的App.jsx代码:

import React from 'react';
import Hero from './components/Hero';
import Features from './components/Features';
import Testimonials from './components/Testimonials';
import Pricing from './components/Pricing';
import Footer from './components/Footer';
import './App.css';

function App() {
  return (
    <div className="app">
      <nav className="navbar">
        <div className="logo">AI<span>Product</span></div>
        <div className="nav-links">
          <a href="#features">Features</a>
          <a href="#testimonials">Testimonials</a>
          <a href="#pricing">Pricing</a>
          <button className="cta-button">Get Started</button>
        </div>
      </nav>
      <Hero />
      <Features />
      <Testimonials />
      <Pricing />
      <Footer />
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

另外,我们需要添加该App.css文件以确保样式正确应用。请务必将其包含在您的项目中!

:root {
  --primary: #2a2a2a;
  --secondary: #0c0c0c;
  --accent: #00f7ff;
  --gradient-1: linear-gradient(45deg, #00f7ff, #00ff88);
  --gradient-2: linear-gradient(45deg, #ff00ea, #00f7ff);
  --text: #ffffff;
  --text-secondary: #a0a0a0;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: 'Inter', sans-serif;
  background-color: var(--secondary);
  color: var(--text);
  line-height: 1.6;
}

.app {
  overflow-x: hidden;
}

.navbar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1.5rem 4rem;
  background: rgba(12, 12, 12, 0.8);
  backdrop-filter: blur(10px);
  z-index: 1000;
}

.logo {
  font-size: 1.5rem;
  font-weight: 700;
  background: var(--gradient-1);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
}

.nav-links {
  display: flex;
  gap: 2rem;
  align-items: center;
}

.nav-links a {
  color: var(--text);
  text-decoration: none;
  transition: color 0.3s ease;
}

.nav-links a:hover {
  color: var(--accent);
}

.cta-button {
  background: var(--gradient-1);
  border: none;
  padding: 0.8rem 1.5rem;
  border-radius: 25px;
  color: var(--secondary);
  font-weight: 600;
  cursor: pointer;
  transition: transform 0.3s ease;
}

.cta-button:hover {
  transform: translateY(-2px);
}

@media (max-width: 768px) {
  .navbar {
    padding: 1rem 2rem;
  }

  .nav-links {
    display: none;
  }
}
Enter fullscreen mode Exit fullscreen mode

Cursor 的另一个很棒的功能我也非常喜欢!

例如,我们目前还没有Hero组件,也没有目录。但在 Cursor 中,右上角components有一个“应用”按钮。点击该按钮后,它会询问您要将文件创建在哪里。

你只需要选择位置并应用内容,剩下的就交给它来处理!是不是很神奇?我就是这么做的。😃

图4

那么,让我们来了解一下英雄组件:

import React from "react";
import "./Hero.css";

const Hero = () => {
  return (
    <section className="hero">
      <div className="hero-content">
        <h1>
          Transform Your Workflow with
          <span className="gradient-text"> AI</span>
        </h1>
        <p>
          Harness the power of artificial intelligence to streamline your
          processes and boost productivity like never before.
        </p>
        <button className="cta-button hero-cta">
          Get Started Free
          <span className="arrow">→</span>
        </button>
      </div>
      <div className="hero-image">
        <div className="gradient-sphere"></div>
      </div>
    </section>
  );
};

export default Hero;

Enter fullscreen mode Exit fullscreen mode

以下是Hero组件的CSS代码:

.hero {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 4rem;
  position: relative;
  overflow: hidden;
}

.hero-content {
  max-width: 600px;
  animation: fadeIn 1s ease-out;
}

.hero h1 {
  font-size: 4rem;
  line-height: 1.2;
  margin-bottom: 1.5rem;
}

.gradient-text {
  background: var(--gradient-2);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
}

.hero p {
  font-size: 1.2rem;
  color: var(--text-secondary);
  margin-bottom: 2rem;
}

.hero-cta {
  font-size: 1.1rem;
  padding: 1rem 2rem;
}

.arrow {
  margin-left: 0.5rem;
  transition: transform 0.3s ease;
}

.hero-cta:hover .arrow {
  transform: translateX(5px);
}

.hero-image {
  position: relative;
  width: 500px;
  height: 500px;
}

.gradient-sphere {
  position: absolute;
  width: 100%;
  height: 100%;
  background: var(--gradient-1);
  border-radius: 50%;
  filter: blur(60px);
  opacity: 0.6;
  animation: float 6s ease-in-out infinite;
}

@keyframes fadeIn {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes float {
  0%,
  100% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-20px);
  }
}

@media (max-width: 768px) {
  .hero {
    flex-direction: column;
    padding: 6rem 2rem 2rem;
    text-align: center;
  }

  .hero h1 {
    font-size: 2.5rem;
  }

  .hero-image {
    width: 300px;
    height: 300px;
    margin-top: 2rem;
  }
}

Enter fullscreen mode Exit fullscreen mode

我们再把这个Features组件也提取出来,它的模式与其他组件相同。

需要注意的一点是:Cursor 可能会询问您是否要创建所有组件,还是只创建几个示例组件。目前为止,它已经生成了 Features 组件,然后才要求您确认。

图5

在明确我们需要所有组件之后,Cursor 已经创建了客户评价、定价和页脚组件。

仔细检查一切是否就绪,确认无误后,请 Cursor 执行下一步操作。

图6

如您所见,只需获取代码,并确保所有组件文件都已正确添加到您的项目中。请仔细检查是否已正确复制所有内容。完成后,我们就可以启动应用程序了!

Cursor 要求我们在项目中添加两个特定的链接index.html。请务必将它们添加到目录下的文件中public

图7

现在一切就绪!打开我们使用 Cursor AI 创建的着陆页。

只需前往您的终端并运行:

npm start
Enter fullscreen mode Exit fullscreen mode

您的应用应该已经启动并运行了,让我们看看它的实际效果吧!

图8

现在,我们的整个着陆页都完成了!渐变设计和深色模式的配色让它看起来非常惊艳。图标和整体布局都给人一种专业的感觉,您觉得呢?

我们在开发应用程序方面取得了令人瞩目的进展,而且未来还有更多激动人心的内容!

集成 Velt SDK

到目前为止,我们已经成功完成了落地页,现在让我们把应用提升到一个新的水平吧!

首先,我们需要App用 `<Velt>` 标签包裹我们的组件VeltProvider,并传入 API 密钥。这将确保 Velt 的所有功能都能在我们的应用程序中使用。让我们开始吧!

import {
  VeltComments,
  VeltCommentsSidebar,
  VeltProvider,
} from "@veltdev/react";
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import "./index.css";

const root = ReactDOM.createRoot(document.getElementById("root"));

console.log({ API: process.env.REACT_APP_VELT_API_KEY });

root.render(
  <VeltProvider apiKey={process.env.REACT_APP_VELT_API_KEY}>
    <VeltComments darkMode={true} />
    <VeltCommentsSidebar darkMode={true} />
    <App />
  </VeltProvider>
);

Enter fullscreen mode Exit fullscreen mode

我从 Velt 中添加了两个新组件:

  • VeltComments
  • VeltCommentsSidebar

我们会用到这两个组件,现在先把它们添加进去吧。VeltComments是必需的,因为它是我们关注的核心功能,而VeltCommentsSidebar稍后会用到。我很快就会向你展示它的具体用途!

用户身份验证

需要注意的是,您无需自行处理用户身份验证。Velt 会为您处理好这一切!

您只需从前端发送必要的用户信息,Velt 就会无缝处理身份验证过程。就这么简单,一切就绪!

这里AuthComponent,Velt 的useIdentify钩子帮助我们轻松识别用户。

//Warning: Make sure this is a child component to VeltProvider
//and not within the same file where VeltProvider is placed.

// 1) Import the useIdentify hook
import { useIdentify } from "@veltdev/react";

export default function YourAuthComponent() {
  const userService = () => {
    return {
      uid: "888",
      organizationId: "organizationId123", // this is the organization id the user belongs to. You should always use this.
      displayName: "Syket",
      email: "syket@gmail.com",
      photoURL: "https://i.pravatar.cc/300",
      color: "#ee00ff", // Use valid Hex code value. Used in the background color of the user's avatar.
      textColor: "#ee00ff", // Use valid Hex code value. Used in the text color of the user's intial when photoUrl is not present.
    };
  };

  let yourAuthenticatedUser = userService();

  // 2) Fetch the relevant User info from yourAuthenticatedUser
  const { uid, displayName, email, photoURL, organizationId } =
    yourAuthenticatedUser;

  // Create the Velt user object
  const user = {
    userId: uid,
    organizationId: organizationId, // this is the organization id the user belongs to. You should always use this.
    name: displayName,
    email: email,
    photoUrl: photoURL,
    color: "#ee00ff", // Use valid Hex code value. Used in the background color of the user's avatar.
    textColor: "#ee00ff", // Use valid Hex code value. Used in the text color of the user's intial when photoUrl is not present.
  };

  //3) Pass the user object to the SDK
  useIdentify(user);

  return <div></div>;
}

Enter fullscreen mode Exit fullscreen mode

将此组件添加到您的components目录中并命名AuthComponent。代码非常简单明了,只需指定用户信息,以便 Velt 可以将其存储在服务器上即可。

接下来,我们将创建文档组件,该组件使用useSetDocument钩子来初始化一个新文档。此钩子需要两个参数:

  • 文档 ID – 文档的唯一标识符。
  • 文档名称– 文档的显示名称。

我们还定义了网站上文档工具栏的位置。这里,我们将其设置为显示在页面底部中央。稍后我会向您展示它的效果!😊

👉这里可以用任何名称代替“文档”,它只是一个用于跟踪和协作的标识符。选择一个符合您使用场景的名称!

此外,我们还使用了三个强大的 Velt 组件,使我们的实现变得轻松便捷:

  • VeltCommentTool – 此工具可用于向文档添加注释。
  • VeltPresence – 显示当前正在查看文档的用户。
  • VeltSidebarButton – 在侧边栏中显示所有评论和主题。

这些组件将我们的应用程序提升到了一个新的水平,不仅可以查看评论,还能解锁更多互动功能!

// 1) Create a component that will represent your document

//Warning: Make sure this is a child component to VeltProvider
//and not within the same file where VeltProvider is placed.

// 2) Import the useSetDocument hook
import {
  useSetDocument,
  VeltCommentTool,
  VeltPresence,
  VeltSidebarButton,
} from "@veltdev/react";

export default function YourDocument() {
  // 3) Set a document ID
  useSetDocument("unique-document-id", { documentName: "Document Name" });

  return (
    <div
      style={{
        position: "fixed",
        bottom: "20px",
        left: "50%",
        transform: "translateX(-50%)",
        backgroundColor: "#0F0F0F",
        border: "1px solid #2F2F2F",
        padding: "12px 24px",
        borderRadius: "50px",
        boxShadow: "0 4px 12px rgba(0, 0, 0, 0.1)",
        display: "flex",
        alignItems: "center",
        gap: "16px",
        zIndex: 1000,
      }}
    >
      <VeltCommentTool darkMode={true} />
      <VeltPresence />
      <VeltSidebarButton darkMode={true} />
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

App接下来,我们需要创建一个新组件,用于导入文档组件和身份验证组件。这个新组件随后将在作为应用程序根组件的组件内部使用。

import YourAuthComponent from "./YourAuthComponent";
import YourDocument from "./YourDocument";

const VeltToolbar = () => {
  return (
    <div>
      <YourDocument />
      <YourAuthComponent />
    </div>
  );
};
export default VeltToolbar;

Enter fullscreen mode Exit fullscreen mode

我们差不多准备就绪了!只需确保将VeltToolbar组件添加到你的代码中App.jsx。前往你的App组件,正确集成它,别忘了重启应用以查看更改。

图片9

太棒了!🎉您已成功将 Velt SDK 集成到您的应用程序中!

您可以在这里看到我们之前提到的工具栏,它位于屏幕底部中央。该工具栏提供了三个主要选项:

  • 评论图标– 您可以通过此图标直接向文档添加评论。
  • 用户图标– 指示您的登录状态。
  • 侧边栏图标– 显示您在此文档中创建的所有评论和主题。

现在,让我们来测试一下这个功能吧!😃

我们的应用现在配备了类似 Figma 的评论系统!我们不仅可以添加评论,还可以发起讨论串、上传图片,甚至发送音频和视频录音,解锁了无限可能。

我们来试试添加图片、编辑评论并做出回应,看看效果如何!😊

我们可以选择特定区域添加评论。如上图所示,我们还可以在评论中添加图片。现在,让我们来看看这些评论在侧边栏中的显示效果。

图片10

所有评论都清晰地显示在侧边栏中。将鼠标悬停在图片上,会弹出一个窗口,显示该图片的完整评论串。

图片11

借助 Cursor,我们在网站上集成了一个类似 Figma 的评论功能,现在已经上线了!当然,所有评论都安全地存储在 Velt 服务器上。我们无需进行任何身份验证、评论存储或复杂的后端逻辑,Velt 开箱即用,帮我们处理了所有这些。

结账应用程序实际运行演示 -点击此处

维尔特的其他功能

除了状态显示和实时光标之外,Velt还提供多种强大的协作功能:

  1. 实时反应 - 添加实时显示的浮动表情符号和反应
  2. 跟随模式 - 允许用户互相跟随彼此的动作。非常适合用于演示和引导式教程。
  3. Huddles  - 在您的应用内创建即时音频/视频会议空间。与您现有的用户界面无缝集成。
  4. 实时选择 - 实时选择并高亮文本。非常适合协作编辑。
  5. 视频播放器同步 - 实现用户间视频播放器同步。非常适合视频会议和演示。

点击此处查看更多功能 

结论:

在本篇 Velt Figma 风格评论功能集成教程中,我们探讨了如何将此组件无缝集成到您的应用程序中。现在,您已经掌握了从 Velt 入门、处理用户身份验证到使用VeltCommentTool显示评论的扎实基础。

我们还利用useSetDocument钩子来定义文档上下文并useIdentify管理用户身份验证和授权。

通过将 Cursor AI 与 Vibe Coding 理念相结合,我们得以加速该功能的开发。AI 处理了大部分重复性编码工作,而我们则专注于优化和完善实现。这种方法展示了现代开发者如何通过将 AI 驱动的工作流程与 Velt SDK 等强大工具相结合,更快地构建原型、更智能地工作并更快地交付产品。

您可以通过在应用程序中的任何位置显示特定用户的评论或显示评论总数来进一步增强身份验证功能,从而让您可以完全灵活地自定义体验。

有了本指南,您现在就拥有了构建完全交互式的 Figma 风格评论系统的基础——证明了使用 Cursor AI 等 AI 工具进行“氛围编码”如何简化即使是复杂的实时协作功能。

文章来源:https://dev.to/arindam_1729/vibe-coding-with-cursor-ai-how-to-build-figma-style-comments-556m