项目开发中的实用小技巧
最近我一直在忙项目,对我来说,赚钱是最重要的!今天想和大家聊聊一些目前特别实用的内容。
我会记录一些笔记,分享生活中的点滴和经验。
在现在这种环境下,前端开发者可以通过深入技术、扩展技能、探索新领域和培养产品思维来找到新的机会。
Cursor 规则是什么呢?
Cursor 规则,简单来说就是为 Cursor 制定一些规范,帮助约束AI生成的代码。
当某条规则被触发时,它的内容会被自动加入到提示词中,让AI在自动补全、生成代码、重构或修复错误时都能遵循这些规定。
Cursor 规则分为两种:
- 全局规则(User Rules):适用于所有项目的通用规则。
- 项目规则(Project Rules):存放在项目目录下的
.cursor/rules中,只用于限制当前项目。

比如你可以输入 /Generate Cursor Rules 来让系统自动生成规则,

这样就能迅速生成相应的规则了。
Vue 3 + TypeScript 项目的规则
项目结构
src/
├── api/ # API configuration and service calls
├── assets/ # Static assets (images, fonts, etc.)
├── components/ # Reusable components
├── config/ # Global configurations
├── constants/ # System constants
├── directives/ # Custom directives
├── hooks/ # Custom composition hooks
├── layouts/ # Layout components
├── pages/ # Page views
├── router/ # Vue Router configuration
├── store/ # Pinia state management
├── style/ # Global styles and variables
├── types/ # TypeScript types and interfaces
└── utils/ # Utility functions
编码标准
组件结构
- 使用
语法的组合式 API - 组件名称用 PascalCase(例如:
UserProfile.vue) - 采用单文件组件(SFC)结构
- 按类型组织导入(Vue核心、第三方库、内部导入)
// Vue core imports
import { ref, computed, onMounted } from 'vue'
// Third-party libraries
import { storeToRefs } from 'pinia'
// Internal imports
import { useUserStore } from '@/store/user'
import type { User } from '@/types/user'
// Props definition
const props = defineProps()
// Component logic
/* Component styles */
TypeScript 使用
- 为所有数据结构定义合适的接口和类型
- 为函数参数和返回值添加类型注释
- 利用 TypeScript 的高级特性(泛型、工具类型等)
- 尽量避免使用
any类型;必要时请使用合适的类型或unknown
// Good practice
interface UserData {
id: string;
name: string;
email: string;
role: 'admin' | 'user' | 'guest';
}
// Function with proper typing
const fetchUser = async (id: string): Promise => {
// Implementation
}
组合钩子
- 自定义钩子命名时加上
use前缀(例如:useUserList) - 保持钩子专注于单一职责
- 返回响应式数据以维持消费组件的响应性
- 用 JSDoc 注释记录钩子的参数和返回值
/**
* Hook for managing user data
* @param initialFilter - Initial filter criteria
* @returns User data and operations
*/
export function useUsers(initialFilter?: UserFilter) {
const users = ref([])
const isLoading = ref(false)
const error = ref(null)
// Implementation
return {
users,
isLoading,
error,
fetchUsers,
createUser,
updateUser,
deleteUser
}
}
状态管理(Pinia)
- 为不同领域创建模块化的 store
- 使用组合式 API 风格的
defineStore - 定义合适的状态类型
- 使用 actions 进行异步操作
- 使用 getters 获取派生状态
export const useUserStore = defineStore('user', () => {
// State
const users = ref([])
const currentUser = ref(null)
const isLoading = ref(false)
// Getters
const isAdmin = computed(() =>
currentUser.value?.role === 'admin'
)
// Actions
async function fetchUsers() {
isLoading.value = true
try {
users.value = await userApi.getAll()
} catch (error) {
console.error('Failed to fetch users:', error)
} finally {
isLoading.value = false
}
}
return {
users,
currentUser,
isLoading,
isAdmin,
fetchUsers
}
})
API 调用
- 按领域/实体组织 API 调用
- 使用 axios 或 fetch 并做好错误处理
- 定义请求和响应的类型
- 实现拦截器以处理常见操作(认证、错误处理)
// userApi.ts
import axios from 'axios'
import type { User, CreateUserDTO } from '@/types/user'
const API_URL = '/api/users'
/**
* Fetches all users
* @returns List of users
*/
export async function getAll(): Promise {
const response = await axios.get(API_URL)
return response.data
}
/**
* Creates a new user
* @param userData - User data to create
* @returns Created user
*/
export async function create(userData: CreateUserDTO): Promise {
const response = await axios.post(API_URL, userData)
return response.data
}
路由
- 使用命名路由
- 为路由组件实现懒加载
- 使用路由守卫进行认证/授权
- 按功能或领域对路由进行分组
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
path: '/',
name: 'Home',
component: () => import('@/pages/Home.vue')
},
{
path: '/users',
name: 'UserList',
component: () => import('@/pages/users/UserList.vue'),
meta: { requiresAuth: true }
},
{
path: '/users/:id',
name: 'UserDetail',
component: () => import('@/pages/users/UserDetail.vue'),
props: true,
meta: { requiresAuth: true }
}
]
样式指南
- 使用 Less 进行 CSS 预处理
- 遵循 BEM 方法论命名类
- 使用变量管理颜色、间距和排版
- 除非必要,优先使用局部样式
// variables.less
@primary-color: #1890ff;
@text-color: #333;
@spacing-base: 8px;
// Component styles
.user {
&__header {
margin-bottom: @spacing-base * 2;
color: @text-color;
}
&__content {
padding: @spacing-base * 2;
}
}
性能优化
- 使用
computed属性来获取派生值 - 使用
v-show处理频繁切换,使用v-if进行条件渲染 - 实现
defineAsyncComponent进行代码分割 - 对需要保持状态的组件使用
keep-alive - 为 v-for 循环添加唯一值的 key 属性
错误处理
- 实现全局错误处理
- 对异步操作使用 try/catch
- 展示用户友好的错误消息
- 记录错误以便调试
测试
- 为组件和钩子编写单元测试
- 为关键用户流程编写集成测试
- 使用 Vitest 或 Jest 进行单元测试
- 使用 Testing Library 或 Cypress 进行组件/e2e 测试
ThreeJS 集成
- 将 Three.js 逻辑分离到专用钩子/服务中
- 当组件卸载时清理 Three.js 资源
- 使用 ref 访问 DOM 元素以进行画布挂载
- 优化渲染周期和资源使用
export function useThreeJsScene() {
const canvasRef = ref(null)
let scene: THREE.Scene | null = null
let renderer: THREE.WebGLRenderer | null = null
let camera: THREE.PerspectiveCamera | null = null
onMounted(() => {
if (!canvasRef.value) return
// Initialize Three.js scene
scene = new THREE.Scene()
renderer = new THREE.WebGLRenderer({ canvas: canvasRef.value })
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
// Setup scene
// Start animation loop
animate()
})
onUnmounted(() => {
// Clean up resources
if (renderer) {
renderer.dispose()
}
// Dispose of geometries, materials, textures, etc.
})
// Animation loop
function animate() {
if (!scene || !camera || !renderer) return
requestAnimationFrame(animate)
// Update scene
renderer.render(scene, camera)
}
return {
canvasRef,
// Expose methods to manipulate the scene
}
}
文档
- 为函数、钩子和组件添加 JSDoc 注释
- 记录组件的 props、事件和插槽
- 保持 README 和其他文档的更新
- 记录复杂的业务逻辑和架构决策
全局规则
轻松上手 Cursor 的用户规则和 MCP 概念
你知道吗?在 Cursor 中,用户规则可以通过设置来配置,适用于所有项目,比如你想强制输出中文或者制定一些通用的编码规范。这些用户规则是全局性的,可以在任何地方的 Cursor 环境中使用。
不过要注意,这些规则以纯文本的形式定义,不支持 .mdc 格式。一般来说,它们用于设定一些全局偏好,比如你希望 AI 回复时的语言风格、语气,或者是你个人常用的编码习惯。
说到 .mdc 文件格式,它其实就是一种轻量级的 Markdown 文件格式。
如果你想设置项目规则,可以在 <a href="https://link.juejin.cn/?target=">- - 项目规则(Project Rules) :存储在.cursor 中找到相关信息,这些规则仅限于当前项目生效,并且可以根据文件后缀、路径等条件来触发,比如说在 .tsx 文件中应用 React 的规范。
Cursor 支持四种不同的规则类型:
- Always:始终应用这个规则。
- Auto Attached:当匹配特定模式的文件被引用时,自动附加这个规则。
- Agent Requested:根据 AI 代理的判断来决定是否应用规则,不过这需要你提供规则说明。
- Manual:只有在明确提示时才会附加这个规则。
如果你想手动调用规则,可以使用对应的指令;想让它自动触发,可以用另一种指令;如果希望规则始终生效,使用相应的命令;而如果希望 AI 来决定是否使用,这也是可以的。
在 mdc 文件里,你可以根据不同的最佳实践配置各种编码规范,比如依据个人偏好、行业标准、官方建议等。
为了让 Cursor 的规则发挥最大效果,编写规则时要简洁明确。这里有些小建议:
- 保持规则简洁明了:控制在 300 到 500 行之间是个不错的选择。
- 拆分复杂任务:将复杂的任务拆分成多个小规则,这样更容易管理。
- 提供示例和代码片段:在适当的情况下,提供具体示例或引用的文件会更有帮助。
- 在提示中引用规则:在需要时,可以在聊天提示中提到特定规则。
- 尽量清晰:避免模糊不清的指导,写规则就像写内部文档一样。
- 及时更新:如果你在对话中反复强调某个点,可以把它写成规则。
- 团队合作:团队内部共享同一份规则,定期讨论和更新,确保与当前的最佳实践一致。
举个例子,假如你在做一个 Vue 3 项目,项目会用到 Vue Router、TypeScript、Three.js 和 Pinia,特别适合中大型管理类项目。你可以通过脚手架搭建,支持现代前端开发流程。
在组件规范方面,以下是一些基础规则:
- 使用 Composition API:在组件中使用 Vue 3 的 Composition API 来组织逻辑。
- 组件命名使用 PascalCase:所有组件名称应该用 PascalCase 格式,比如 MyComponent。
- Props 定义要清晰:使用 TypeScript 来定义组件的 props。
- 事件要清晰:使用描述性的事件名称,确保一目了然。
- 方法备注:为每个方法添加注释,说明用途。
- 创建组件时使用预处理器:确保语法清晰。
当然,其他技术栈也是同样道理,最终的配置还是要看个人的习惯和最佳实践。
接下来,聊聊 Cursor 的 MCP 概念吧!
MCP 是 Cursor 中集成的模型上下文协议,旨在让大语言模型和外部工具之间无缝互动。通过这个协议,Cursor 可以打破传统的代码补全限制,直接调用本地和云端工具,完成更复杂的操作,比如文件转换、数据抓取和版本控制。
MCP 的核心价值在于它的双向连接机制:
- 支持 LLM 主动调用本地开发工具(如 Git、Node.js 模块)和第三方 API(如 Replicate 图像生成)。
- 允许工具服务向模型推送实时反馈数据(例如数据库查询结果、系统命令执行日志)。
在 Cursor 中,MCP 有很多实际应用场景,比如:
- 文档自动化处理:将对话记录转成 PDF 文件。
- 依赖管理:实时查询项目的依赖包,并提供升级建议。
- 跨平台操作:直接执行 GitHub 命令或调用工具进行 3D 建模。
技术上,它支持 SSE 和标准输入输出两种通信协议。在配置时,你需要在 Cursor 的设置中添加 MCP 服务器地址或本地可执行命令。
对于开发者来说,MCP 的标准化接口降低了接入成本,可以快速发布 npm 包形式的服务组件。同时,协议层的安全机制也能保障敏感操作的可控性。
总之,MCP 就像是 AI 应用的 USB-C 端口,让不同的数据源和工具之间的连接变得更简单。无论你在构建什么样的 AI 驱动应用,MCP 都提供了一种标准化的方式。
### 深入了解 Function Calling、AI Agent 和 MCP 的区别
在聊到 Function Calling 的时候,我们其实是在说一个 AI 模型如何根据上下文来自动执行某些功能。简单来说,它就是 AI 模型和外部系统之间的桥梁,不同的模型可能会有各自独特的实现方式,代码的集成方法也各不相同,都是由不同的 AI 平台来定义和落实的。
接下来谈谈 Model Context Protocol(MCP),这玩意儿就像电子设备的 Type C 接口一样,方便又实用。MCP 让 AI 模型能够与各种 API 和数据源无缝衔接,旨在取代那些零散的 Agent 代码集成方式,提升 AI 系统的可靠性和效率。通过建立统一的标准,服务提供商可以基于这个协议推出自己的 AI 功能,帮助开发者更快地构建出强大的 AI 应用。这样一来,开发者就不用再重复发明轮子,通过开源项目就能建立起一个强大的 AI Agent 生态。MCP 还能在不同的应用和服务之间保持上下文联系,增强整体自主执行任务的能力。
再说说 AI Agent,这是一种智能系统,可以自主运行以达到特定目标。与传统的 AI 聊天工具只给出建议或要求手动操作不同,AI Agent 能够根据具体情况进行分析、做出决策并主动采取行动。借助 MCP 提供的功能描述,AI Agent 可以更好地理解上下文,从而在各种平台和服务上自动完成任务。
如果你对 MCP 感兴趣,这里有一些推荐的网站供你参考:
– [smithery-ai](https://link.zhihu.com/?target=https%3A//link.juejin.cn/%3Ftarget%3Dhttps%253A%252F%252Fsmithery.ai%252Fserver%252F%2540smithery-ai%252Fgithub)
– [mcp.so](https://link.zhihu.com/?target=https%3A//link.juejin.cn/%3Ftarget%3Dhttps%253A%252F%252Fmcp.so%252F)
– [MCP官方服务](https://link.zhihu.com/?target=https%3A//link.juejin.cn/%3Ftarget%3Dhttps%253A%252F%252Fmodelcontextprotocol.io%252Fintroduction)
– [cursor mcp](https://link.zhihu.com/?target=https%3A//link.juejin.cn/%3Ftarget%3Dhttps%253A%252F%252Fcursor.directory%252Fmcp)
– [cursor mcp tools](https://link.zhihu.com/?target=https%3A//link.juejin.cn/%3Ftarget%3Dhttps%253A%252F%252Fdocs.cursor.com%252Ftools)
接下来,看看如何检查 MCP Server 的状态。在完成上述配置后,你可以回到 Cursor 的 MCP 界面,查看相关状态。每个 MCP 服务名称旁边的小灯会告诉你当前的状态:红灯代表不可用,黄灯表示正在连接中,绿灯则是可用状态,而无颜色则意味着你关闭了相应的 MCP 服务。
说到 Cursor 1.0 的优势,这里有几个亮点值得一提:
– **BugBot 自动审查 PR**:它会自动分析 GitHub 上的 Pull Request,找到代码问题,甚至能生成评论建议。只需点击“Fix in Cursor”就能一键修复。
– **后台智能体全量开放**:支持代码补全、文件分析和环境配置,真正做到后台托管,让你更专注于逻辑编写。
– **Jupyter Notebook 原生支持**:在编辑器里直接操作 Notebook 单元格,数据科学爱好者绝对会喜欢。
– **项目级记忆功能(Memories)**:让 Cursor 记住你的项目历史,理解上下文的能力更强。
– **MCP 一键安装**:自动配置开发环境,OAuth 授权一步到位,零配置上线。
– **UI 全面升级**:仪表盘、图表、统计数据应有尽有,支持 Mermaid 图和 Markdown 表格的对话界面。
最后,关于白嫖和付费的问题,完全看个人需求。没有绝对的对错,但我觉得尊重技术成果是很重要的。总是想着白嫖可能会让你错失更多。有价值的技术适当收费是合理的,希望大家能以积极的心态学习和探讨,而不是消极地抱怨。











全局规则和项目规则的区分讲得真好!我之前有点混淆。
这篇文章真是干货满满,特别适合新手!
在实践中使用Cursor规则时,发现了一些不易察觉的bug,大家有遇到过类似情况吗?
使用Cursor规则时,有没有什么常见的误区需要注意?
我对Cursor的最佳实践还有点疑惑,大家怎么看?
这规则能自动生成,真是太方便了!有没有人试过这个功能?效果如何?
这些配置实践很实用,省去不少摸索的时间,感谢分享!
我尝试过用Cursor生成代码,有时候生成的内容和我的需求不太吻合,大家碰到过这种情况吗?
在使用Cursor时,有没有推荐的调试工具?这样能更好地发现问题。
配置Cursor规则时,建议在项目初期就设定好,这样后期修改会更方便。
这个自动生成规则的功能,真的太实用了!加快了我的项目进度。
我在项目中设置了Cursor规则后,代码的可读性明显提高,真是受益匪浅。
建议在团队内部讨论并统一Cursor规则,这样能提高协作效率,避免各自为政。