图秀主页
56.67M · 2026-02-04
大家好,我是土豆,欢迎关注我的公众号:土豆学前端
痛点一:Bug 调试像在迷宫里找钥匙
传统开发中,遇到问题只能疯狂翻文档、搜 Stack Overflow、问 GPT 然后复制粘贴。问题是——你怎么知道搜到的答案是不是最新的?适不适合你的项目?
痛点二:设计稿还原度全靠"盲猜"
UI 给了设计图,你左看右看上看下看,这个间距是 16px 还是 18px?这个颜色是#333 还是#444?来回切屏,眼睛都快瞎了。
痛点三:云函数调试像开盲盒
云函数报错了?先登录控制台,找到函数,点开日志,翻半天...等等,这个 error 是哪次调用的来着?
web_search和understand_image工具简单来说:让 AI 真正懂你的项目,而不是瞎猫碰死耗子。
如果你还在用 VS Code,是时候升级了。Cursor 是专为 AI 编程优化的 IDE,原生支持 MCP 协议。
# macOS/Linux
# 直接去官网下载即可:
# 下载后首次启动,会提示你导入VS Code设置
# 强烈建议导入,无缝迁移
什么是 Coding Plan?
这是 MiniMax 专门为开发者提供的订阅服务,包含 web 搜索和图片理解能力。简单说就是给 AI 装上了"网络搜索"和"看图说话"两个技能。
打开 Cursor 的 MCP 配置文件:
# macOS/Linux
~/.cursor/mcp.json
# Windows
%USERPROFILE%.cursormcp.json
添加 MiniMax 配置:
{
"mcpServers": {
"MiniMax": {
"command": "uvx",
"args": ["minimax-coding-plan-mcp", "-y"],
"env": {
"MINIMAX_API_KEY": "你的API_KEY",
"MINIMAX_API_HOST": "https://api.minimax.io"
}
}
}
}
注意事项 ️
重启 Cursor,打开 Composer (Cmd/Ctrl+I),输入/mcp,如果看到web_search和understand_image就说明配置成功了!
CloudBase 是腾讯云开发的 MCP 工具,专门用于管理云开发资源。
npm install -g @cloudbase/cli@latest
tcb login
# 会打开浏览器进行授权登录
在~/.cursor/mcp.json中添加:
{
"mcpServers": {
"MiniMax": {
// ...前面的配置
},
"cloudbase": {
"command": "npx",
"args": ["@cloudbase/cloudbase-mcp@latest"]
}
}
}
# 安装Taro CLI
npm install -g @tarojs/cli
# 创建项目
taro init myapp
# 选择模板时推荐:
# - React (更成熟的生态)
# - TypeScript (类型安全)
# - 微信小程序
Tailwind CSS 是目前最受欢迎的原子化 CSS 框架,而且特别适合 AI 编程——AI 能直接"说人话"生成样式。
安装依赖:
cd myapp
npm install -D tailwindcss postcss autoprefixer
npm install -D weapp-tailwindcss
初始化配置:
npx tailwindcss init
配置tailwind.config.js:
module.exports = {
content: [
"./src/**/*.{js,jsx,ts,tsx}",
],
// 小程序不支持某些特殊字符,需要自定义分隔符
separator: '_',
corePlugins: {
// 关闭preflight,避免样式冲突
preflight: false
}
}
配置 Taro:
在config/index.js中添加:
const config = {
// ...其他配置
plugins: [
['@tarojs/plugin-html'],
['weapp-tailwindcss/webpack', {
// 配置选项
}]
],
mini: {
postcss: {
pxtransform: {
enable: true,
config: {}
}
}
}
}
在app.css中引入 Tailwind:
@tailwind base;
@tailwind components;
@tailwind utilities;
验证安装:
在任意页面组件中测试:
import { View } from '@tarojs/components'
export default function Index() {
return (
<View className="flex items-center justify-center h-screen bg-blue-500">
<View className="text-white text-2xl">Hello Tailwind!</View>
</View>
)
}
运行npm run dev:weapp,如果看到蓝色背景和白色文字,说明配置成功!
场景: Taro 项目中遇到一个奇怪的 API 报错。
传统做法:
使用 MiniMax MCP:
直接在 Cursor 的 Composer 中告诉 AI:
这个错误信息是什么意思?帮我用web_search搜索一下Taro社区有没有类似问题的解决方案:
[ERROR] Error: miniprogram-api-typings: Module not found
AI 会自动调用web_search工具,搜索最新的解决方案,并给你总结:
根据搜索结果,这个问题是因为...
解决方案:
1. 升级 Taro 版本到 3.6+
2. 或者安装缺失的类型定义: npm install -D miniprogram-api-typings
相关讨论:
- ...
- ...
为什么这么厉害?
场景: UI 给了一张设计稿,要求 100%还原。
传统做法:
使用 MiniMax MCP:
帮我分析这张设计稿,用Taro + Tailwind CSS实现。
重点关注:
- 布局结构
- 间距和对齐
- 颜色和字号
- 组件层次
AI 会分析图片,然后生成:
import { View, Text, Image } from '@tarojs/components'
export default function ProductCard() {
return (
<View className="bg-white rounded-2xl p-4 shadow-lg">
{/* 商品图片 */}
<View className="relative mb-4">
<Image
src="xxx"
className="w-full h-48 rounded-xl object-cover"
/>
{/* 右上角标签 */}
<View className="absolute top-2 right-2 bg-red-500 text-white px-3 py-1 rounded-full text-xs">
热卖
</View>
</View>
{/* 商品信息 */}
<View className="space-y-2">
<Text className="text-lg font-bold text-gray-800">
商品名称
</Text>
<View className="flex items-center justify-between">
<Text className="text-2xl font-bold text-red-500">
¥199
</Text>
<Text className="text-sm text-gray-400 line-through">
¥299
</Text>
</View>
</View>
</View>
)
}
Pro Tips:
场景: 云函数返回了错误,需要查看日志排查问题。
传统做法:
使用 CloudBase MCP:
直接在 Cursor 中告诉 AI:
我的getUserInfo云函数返回500错误,帮我查看最近的日志,找出问题原因并修复
AI 会:
// AI发现的问题:
// 原代码:
const user = await db.collection('users').doc(userId).get()
return user.data.name // 当用户不存在时,data是undefined
// AI的修复:
const user = await db.collection('users').doc(userId).get()
if (!user.data) {
return { error: '用户不存在' }
}
return user.data.name // 增加了错误处理
CloudBase MCP 的其他神器功能:
为什么需要.cursorrules?
想象一下,你有一个 10 人的开发团队,每个人的代码风格都不一样:
项目代码看起来像"垃圾场"。
解决方案:
在项目根目录创建.cursorrules或.cursorrules.md文件:
# Taro 小程序开发规范
## 技术栈
- Taro 3.x
- React 18+ (function 组件 + Hooks)
- TypeScript
- Tailwind CSS
## 代码风格
### 组件规范
- 所有组件必须使用 Function Component
- 必须使用 TypeScript,定义完整的 Props 类型
- 组件文件名使用 PascalCase: `UserProfile.tsx`
### 样式规范
- 优先使用 Tailwind CSS utility 类
- 禁止使用 inline style
- 自定义样式使用 CSS Modules
- 响应式设计使用 Tailwind 的断点系统
示例:
```jsx
import { View, Text } from '@tarojs/components'
import { FC } from 'react'
interface UserCardProps {
name: string
avatar: string
}
const UserCard: FC<UserCardProps> = ({ name, avatar }) => {
return (
<View className="flex items-center p-4 bg-white rounded-lg shadow">
<Image src={avatar} className="w-12 h-12 rounded-full" />
<Text className="ml-3 text-base font-medium">{name}</Text>
</View>
)
}
export default UserCard
```
{ code, message, data }示例:
exports.main = async (event) => {
try {
const { userId } = event
if (!userId) {
return { code: 400, message: '缺少userId参数' }
}
const result = await db.collection('users')
.doc(userId)
.get()
return {
code: 0,
message: 'success',
data: result.data
}
} catch (error) {
console.error('getUserInfo error:', error)
return {
code: 500,
message: '服务器错误',
error: error.message
}
}
}
配置好后的效果:
当你让AI写代码时,它会严格遵守这些规范:
你: 帮我写一个用户列表页面
AI: 好的,我会按照项目规范,使用 Function Component + TypeScript + Tailwind CSS 来实现...
[生成的代码自动符合规范]
为什么说Tailwind CSS是AI友好的?
因为Tailwind的类名就是**"人类语言"**:
// 传统CSS: AI需要理解复杂的样式规则
<View style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
padding: '16px',
backgroundColor: '#ffffff',
borderRadius: '8px',
boxShadow: '0 2px 8px rgba(0,0,0,0.1)'
}}>
// Tailwind CSS: AI直接"说人话"
<View className="flex items-center justify-between p-4 bg-white rounded-lg shadow-md">
实战案例:
你可以这样和 AI 交流:
你: 做一个卡片组件,要有圆角、阴影、内边距16px,flex布局,上面是图片,下面是文字
AI: 明白了!
[直接生成Tailwind代码]
常用的 Tailwind 组合:
// 1. 水平居中的容器
<View className="flex items-center justify-center">
// 2. 垂直布局,间距16px
<View className="flex flex-col space-y-4">
// 3. 卡片样式
<View className="bg-white rounded-xl shadow-lg p-4">
// 4. 响应式文字
<Text className="text-base md:text-lg lg:text-xl">
// 5. 按钮样式
<View className="bg-blue-500 hover:bg-blue-600 text-white py-2 px-4 rounded-full">
️ 小程序特殊限制:
小程序不支持某些特殊字符作为类名,所以:
// 错误写法
<View className="w-1/2"> // 小程序不支持 /
<View className="hover:bg-blue"> // 小程序不支持 :
// 正确写法 (配置separator: '_')
<View className="w-1_2">
<View className="hover_bg-blue">
需求: 开发一个"待办事项"功能,包含:
开发流程:
你: 我要做一个待办事项功能,帮我规划一下技术方案
AI: 好的!我建议:
前端:
- 页面组件: TodoList.tsx, TodoItem.tsx, AddTodo.tsx
- 状态管理: 使用React Hooks (useState, useEffect)
- 样式: Tailwind CSS
后端:
- 云数据库集合: todos
- _id: 自动生成
- content: string (待办内容)
- completed: boolean
- createdAt: timestamp
- 云函数: getTodos, addTodo, updateTodo, deleteTodo
需要我帮你实现吗?
如果你有设计稿:
你: [粘贴设计稿截图] 帮我分析这个待办列表的设计,用Taro + Tailwind实现
AI: 我看到的设计包括:
- 顶部有一个输入框和添加按钮
- 列表项左边是圆形checkbox
- 中间是待办文字,完成的文字有删除线
- 右边是删除按钮
- 整体使用卡片布局,圆角+阴影
[生成代码...]
如果没有设计稿:
你: 帮我设计一个现代风格的待办列表UI,使用Tailwind CSS
AI: 好的,我会采用:
- 渐变背景
- 毛玻璃效果的卡片
- 动画过渡效果
- 微交互反馈
[生成代码...]
// components/TodoList.tsx
import { View, Text, Input, Button } from '@tarojs/components'
import { useState, useEffect } from 'react'
import Taro from '@tarojs/taro'
interface Todo {
_id: string
content: string
completed: boolean
createdAt: number
}
const TodoList = () => {
const [todos, setTodos] = useState<Todo[]>([])
const [input, setInput] = useState('')
const [loading, setLoading] = useState(false)
// 加载待办列表
useEffect(() => {
loadTodos()
}, [])
const loadTodos = async () => {
setLoading(true)
try {
// 调用云函数
const res = await Taro.cloud.callFunction({
name: 'getTodos'
})
setTodos(res.result.data)
} catch (error) {
Taro.showToast({
title: '加载失败',
icon: 'none'
})
} finally {
setLoading(false)
}
}
const addTodo = async () => {
if (!input.trim()) return
try {
await Taro.cloud.callFunction({
name: 'addTodo',
data: { content: input }
})
setInput('')
loadTodos()
Taro.showToast({
title: '添加成功',
icon: 'success'
})
} catch (error) {
Taro.showToast({
title: '添加失败',
icon: 'none'
})
}
}
const toggleTodo = async (id: string, completed: boolean) => {
try {
await Taro.cloud.callFunction({
name: 'updateTodo',
data: { id, completed: !completed }
})
loadTodos()
} catch (error) {
Taro.showToast({
title: '更新失败',
icon: 'none'
})
}
}
const deleteTodo = async (id: string) => {
try {
await Taro.showModal({
title: '确认删除',
content: '确定要删除这条待办吗?'
})
await Taro.cloud.callFunction({
name: 'deleteTodo',
data: { id }
})
loadTodos()
Taro.showToast({
title: '删除成功',
icon: 'success'
})
} catch (error) {
// 用户取消或删除失败
}
}
return (
<View className="min-h-screen bg-gradient-to-br from-blue-50 to-purple-50 p-4">
{/* 标题 */}
<View className="text-center mb-6">
<Text className="text-3xl font-bold bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
我的待办
</Text>
</View>
{/* 添加待办 */}
<View className="bg-white rounded-2xl shadow-lg p-4 mb-4">
<View className="flex items-center space-x-2">
<Input
className="flex-1 px-4 py-2 bg-gray-100 rounded-full"
placeholder="添加新待办..."
value={input}
onInput={(e) => setInput(e.detail.value)}
/>
<Button
className="bg-blue-500 text-white px-6 py-2 rounded-full"
onClick={addTodo}
>
添加
</Button>
</View>
</View>
{/* 待办列表 */}
{loading ? (
<View className="text-center py-8">
<Text className="text-gray-500">加载中...</Text>
</View>
) : todos.length === 0 ? (
<View className="text-center py-8">
<Text className="text-gray-500">暂无待办事项</Text>
</View>
) : (
<View className="space-y-2">
{todos.map(todo => (
<View
key={todo._id}
className="bg-white rounded-xl shadow p-4 flex items-center"
>
{/* Checkbox */}
<View
className={`w-6 h-6 rounded-full border-2 mr-3 flex items-center justify-center ${
todo.completed
? 'bg-blue-500 border-blue-500'
: 'border-gray-300'
}`}
onClick={() => toggleTodo(todo._id, todo.completed)}
>
{todo.completed && (
<Text className="text-white text-sm"></Text>
)}
</View>
{/* 内容 */}
<Text
className={`flex-1 ${
todo.completed
? 'line-through text-gray-400'
: 'text-gray-800'
}`}
>
{todo.content}
</Text>
{/* 删除按钮 */}
<View
className="w-8 h-8 bg-red-100 rounded-full flex items-center justify-center"
onClick={() => deleteTodo(todo._id)}
>
<Text className="text-red-500 text-sm"></Text>
</View>
</View>
))}
</View>
)}
</View>
)
}
export default TodoList
你: 帮我创建云函数getTodos,查询todos集合的所有数据,按创建时间倒序排列
AI: [自动调用CloudBase MCP创建云函数]
云函数已创建! 代码如下:
[云函数代码...]
需要我帮你部署吗?
如果遇到错误:
你: 调用addTodo云函数时报错: permission denied
AI: 让我查看一下日志... [调用CloudBase MCP]
分析结果:
- 错误原因: 云数据库安全规则限制了写入权限
- 解决方案: 需要在云开发控制台配置安全规则
我可以帮你生成安全规则配置:
{
"read": true,
"write": "auth.uid != null" // 仅登录用户可写入
}
或者如果是开发测试阶段,可以临时设置为:
{
"read": true,
"write": true
}
错误做法:
你: 帮我写一个商城小程序
AI: [生成2000行代码]
你: [直接复制粘贴]
正确做法:
你: 我要做一个商城小程序,先帮我规划架构
AI: [给出技术方案]
你: 为什么选择这个方案?有什么优缺点?
AI: [详细解释]
你: 好的,那我们先从首页开始,你能给我讲解一下首页的实现思路吗?
AI: [讲解思路]
你: 明白了,那现在帮我实现首页
关键点:
错误做法:
每个功能都是独立开发,没有统一规范:
正确做法:
建立.cursorrules规范,所有代码风格统一:
# 必须使用 Function Component + Hooks
# 必须使用 TypeScript
# 样式优先使用 Tailwind CSS
# 组件命名使用 PascalCase
# 文件命名使用 camelCase
错误做法:
AI 生成代码后直接使用,不检查:
正确做法:
让 AI 做代码审查:
你: 帮我审查这段代码,重点关注:
1. 性能问题
2. 安全隐患
3. 最佳实践
4. 可维护性
[粘贴代码]
AI: 发现以下问题:
1. 性能问题:
- useEffect没有依赖项,会导致无限循环
- 建议添加依赖数组
2. 安全问题:
- 用户输入没有做XSS防护
- 建议使用DOMPurify库
3. 最佳实践:
- 建议使用useCallback优化函数
- 建议使用useMemo优化计算
改进后的代码:
[给出改进方案]
错误做法:
每次都让 AI 搜索,即使是已知问题:
你: Taro怎么调用微信API?
[触发web_search]
你: Taro怎么配置路由?
[又触发web_search]
你: Taro怎么使用生命周期?
[再次web_search]
这样做的问题:
正确做法:
建立知识库,把常用信息整理到.cursorrules:
# Taro 常用 API 速查
## 页面导航
Taro.navigateTo({ url: '/pages/index/index' })
## 微信 API 调用
Taro.getUserInfo()
Taro.chooseImage()
Taro.uploadFile()
## 生命周期
useEffect(() => {}, []) // componentDidMount
useEffect(() => () => {}, []) // componentWillUnmount
什么时候使用 web_search:
什么时候不需要:
标准开发流程:
1. 需求分析 (5分钟)
└─ 让AI帮你分析需求,拆分任务
2. 技术设计 (10分钟)
└─ 确定技术方案,数据结构,接口定义
3. UI设计/还原 (15分钟)
├─ 有设计稿: 用understand_image分析
└─ 无设计稿: 让AI生成现代化UI
4. 前端开发 (30分钟)
├─ 让AI生成组件骨架
├─ 补充业务逻辑
└─ 添加交互效果
5. 后端开发 (20分钟)
├─ 用CloudBase MCP创建云函数
├─ 配置数据库规则
└─ 部署并测试
6. 联调测试 (15分钟)
├─ 发现问题用web_search搜索
├─ 用CloudBase MCP查看日志
└─ 快速定位和修复
7. 代码审查 (10分钟)
├─ 让AI审查代码质量
├─ 优化性能和安全
└─ 统一代码风格
总计: 约1-2小时完成一个完整功能
对比传统开发:
传统开发流程:
1. 需求分析 (30分钟)
2. 查阅文档 (1小时)
3. UI设计/还原 (2小时)
4. 前端开发 (3小时)
5. 后端开发 (2小时)
6. 联调测试 (2小时)
└─ 遇到问题反复搜索,试错
7. 代码审查 (1小时)
总计: 1-2天
效率提升: 10-15 倍
如果你的项目有特殊需求,可以开发自己的 MCP 服务器。
示例场景: 你有一个内部 API 文档系统,希望 AI 能直接查询。
解决方案: 创建一个 MCP 服务器,暴露query_docs工具:
// docs-mcp-server.js
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server({
name: 'docs-server',
version: '1.0.0'
}, {
capabilities: {
tools: {}
}
});
// 注册工具
server.setRequestHandler('tools/list', async () => {
return {
tools: [{
name: 'query_docs',
description: '查询内部API文档',
inputSchema: {
type: 'object',
properties: {
keyword: {
type: 'string',
description: '搜索关键词'
}
}
}
}]
};
});
// 实现工具逻辑
server.setRequestHandler('tools/call', async (request) => {
if (request.params.name === 'query_docs') {
const { keyword } = request.params.arguments;
// 查询你的文档系统
const results = await queryInternalDocs(keyword);
return {
content: [{
type: 'text',
text: JSON.stringify(results)
}]
};
}
});
// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);
配置到 Cursor:
{
"mcpServers": {
"docs": {
"command": "node",
"args": ["/path/to/docs-mcp-server.js"]
}
}
}
如果你的项目有大量相似页面,可以让 AI 批量生成:
你: 我有一个商城项目,需要生成这些页面:
- 商品列表
- 商品详情
- 购物车
- 订单列表
- 订单详情
- 个人中心
它们的UI风格相似,都使用卡片布局+Tailwind CSS。
帮我生成页面骨架和路由配置。
AI: 好的,我会为你生成:
1. 6个页面组件
2. 统一的路由配置
3. 通用的布局组件
4. 共享的样式定义
[开始生成...]
让 AI 帮你写测试用例:
你: 为TodoList组件写单元测试,覆盖:
1. 渲染测试
2. 添加待办
3. 完成待办
4. 删除待办
5. 边界情况(空输入,网络错误等)
AI: [生成测试代码]
import { render, fireEvent, waitFor } from '@testing-library/react'
import TodoList from './TodoList'
describe('TodoList', () => {
it('应该正确渲染', () => {
const { getByText } = render(<TodoList />)
expect(getByText('我的待办')).toBeInTheDocument()
})
it('应该能添加待办', async () => {
// ... 测试代码
})
// ... 更多测试
})
让 AI 分析性能瓶颈:
你: 我的待办列表页面加载很慢,帮我分析性能问题
AI: 让我看看代码...
发现以下问题:
1. useEffect依赖项设置不当,导致频繁重新渲染
2. 列表项没有使用React.memo优化
3. 云函数查询没有做缓存
建议优化方案:
[给出详细的优化代码]
使用 MiniMax + Cursor + Taro 的组合,你会发现开发小程序不再是痛苦的过程,而是充满创造力的旅程:
记住:AI 是你的助手,不是替代品。
最好的开发模式是:AI 处理重复劳动,你专注创造价值。
现在,打开 Cursor,开始你的 AI 辅助开发之旅吧!