最近在开发中,我发现很多重复的代码模式其实可以用 AI 来优化。于是我开发了一个 VSCode 插件,它能根据上下文自动提供代码建议,大大提高了开发效率。今天就来分享这个有趣的开发经历。
为什么要开发这个插件?
在日常开发中,我发现有这些痛点:
-
重复代码模式多
- 组件的基础结构
- 工具函数的常见实现
- 测试用例的模板代码
-
上下文切换频繁
- 查文档耗时
- 切换窗口影响思路
- 复制粘贴容易出错
-
代码质量不稳定
- 风格不统一
- 最佳实践难以保证
- 新人上手困难
插件功能设计
1. 智能代码提示
// src/providers/completionProvider.ts
import * as vscode from 'vscode'
import { OpenAIApi, Configuration } from 'openai'
import { getFileContext } from '../utils/context'
export class AICompletionProvider implements vscode.CompletionItemProvider {
private openai: OpenAIApi
constructor(apiKey: string) {
const configuration = new Configuration({ apiKey })
this.openai = new OpenAIApi(configuration)
}
async provideCompletionItems(
document: vscode.TextDocument,
position: vscode.Position
): Promise<vscode.CompletionItem[]> {
try {
// 1. 获取上下文
const context = await getFileContext(document, position)
// 2. 生成提示
const completion = await this.openai.createChatCompletion({
model: 'gpt-3.5-turbo',
messages: [
{
role: 'system',
content: '你是一个专业的前端开发助手,精通React、TypeScript和前端最佳实践。'
},
{
role: 'user',
content: `根据以下代码上下文,提供3-5个最可能的代码补全建议:\n\n${context}`
}
],
temperature: 0.3
})
// 3. 转换为CompletionItem
return this.formatCompletions(completion.data.choices)
} catch (error) {
console.error('代码补全失败:', error)
return []
}
}
private formatCompletions(
choices: any[]
): vscode.CompletionItem[] {
return choices.map(choice => {
const item = new vscode.CompletionItem(
choice.message?.content,
vscode.CompletionItemKind.Snippet
)
item.detail = '🤖 AI建议'
item.documentation = new vscode.MarkdownString(
'基于上下文的智能补全建议'
)
return item
})
}
}
2. 代码重构建议
// src/providers/refactorProvider.ts
import * as vscode from 'vscode'
import { analyzeCode } from '../utils/codeAnalysis'
export class AIRefactorProvider {
async provideRefactorSuggestions(
document: vscode.TextDocument,
range: vscode.Range
): Promise<vscode.CodeAction[]> {
const code = document.getText(range)
const analysis = await analyzeCode(code)
return analysis.suggestions.map(suggestion => {
const action = new vscode.CodeAction(
suggestion.title,
vscode.CodeActionKind.RefactorRewrite
)
action.edit = new vscode.WorkspaceEdit()
action.edit.replace(
document.uri,
range,
suggestion.newCode
)
return action
})
}
}
// utils/codeAnalysis.ts
export async function analyzeCode(code: string) {
const completion = await openai.createChatCompletion({
model: 'gpt-3.5-turbo',
messages: [
{
role: 'system',
content: '你是一个代码重构专家,精通前端开发最佳实践。'
},
{
role: 'user',
content: `分析以下代码,提供重构建议:\n\n${code}`
}
]
})
return {
suggestions: parseRefactorSuggestions(
completion.data.choices[0].message?.content
)
}
}
3. 智能注释生成
// src/providers/commentProvider.ts
import * as vscode from 'vscode'
import { generateComment } from '../utils/comment'
export class AICommentProvider {
async provideComments(
document: vscode.TextDocument,
range: vscode.Range
): Promise<string> {
const code = document.getText(range)
const comment = await generateComment(code)
return comment
}
}
// utils/comment.ts
export async function generateComment(code: string): Promise<string> {
const completion = await openai.createChatCompletion({
model: 'gpt-3.5-turbo',
messages: [
{
role: 'system',
content: '你是一个技术文档专家,擅长编写清晰的代码注释。'
},
{
role: 'user',
content: `为以下代码生成清晰的注释,包括:
1. 功能描述
2. 参数说明
3. 返回值说明
4. 注意事项
代码:\n${code}`
}
],
temperature: 0.3
})
return completion.data.choices[0].message?.content || ''
}
插件配置和激活
// package.json
{
"name": "ai-code-assistant",
"displayName": "AI Code Assistant",
"version": "0.1.0",
"engines": {
"vscode": "^1.60.0"
},
"categories": ["Programming Languages"],
"activationEvents": [
"onLanguage:javascript",
"onLanguage:typescript",
"onLanguage:typescriptreact"
],
"contributes": {
"commands": [
{
"command": "aiCodeAssistant.generateComment",
"title": "AI: Generate Comment"
},
{
"command": "aiCodeAssistant.suggestRefactor",
"title": "AI: Suggest Refactoring"
}
],
"configuration": {
"title": "AI Code Assistant",
"properties": {
"aiCodeAssistant.apiKey": {
"type": "string",
"description": "OpenAI API Key"
}
}
}
}
}
// src/extension.ts
import * as vscode from 'vscode'
import { AICompletionProvider } from './providers/completionProvider'
import { AIRefactorProvider } from './providers/refactorProvider'
import { AICommentProvider } from './providers/commentProvider'
export function activate(context: vscode.ExtensionContext) {
// 1. 获取配置
const config = vscode.workspace.getConfiguration('aiCodeAssistant')
const apiKey = config.get('apiKey') as string
if (!apiKey) {
vscode.window.showErrorMessage(
'请配置OpenAI API Key'
)
return
}
// 2. 注册提供者
const completionProvider = new AICompletionProvider(apiKey)
const refactorProvider = new AIRefactorProvider()
const commentProvider = new AICommentProvider()
// 3. 注册命令
context.subscriptions.push(
vscode.languages.registerCompletionItemProvider(
['javascript', 'typescript', 'typescriptreact'],
completionProvider,
'.' // 触发字符
),
vscode.commands.registerCommand(
'aiCodeAssistant.generateComment',
async () => {
const editor = vscode.window.activeTextEditor
if (!editor) return
const comment = await commentProvider.provideComments(
editor.document,
editor.selection
)
editor.edit(builder => {
builder.insert(
editor.selection.start,
comment + '\n'
)
})
}
),
vscode.commands.registerCommand(
'aiCodeAssistant.suggestRefactor',
async () => {
const editor = vscode.window.activeTextEditor
if (!editor) return
const actions = await refactorProvider
.provideRefactorSuggestions(
editor.document,
editor.selection
)
const selected = await vscode.window.showQuickPick(
actions.map(action => ({
label: action.title,
action
}))
)
if (selected) {
await vscode.workspace.applyEdit(
selected.action.edit!
)
}
}
)
)
}
实战踩坑记录
-
性能优化
- 使用缓存减少API调用
- 控制提示词长度
- 异步处理避免阻塞
-
上下文处理
- 合理截取代码片段
- 保留关键导入信息
- 处理多文件依赖
-
错误处理
- API调用失败降级
- 用户输入验证
- 异常状态恢复
使用效果
-
代码补全
- 更智能的建议
- 符合项目风格
- 自动引入依赖
-
重构建议
- 发现代码问题
- 提供最佳实践
- 自动重构实现
-
注释生成
- 规范的格式
- 完整的信息
- 清晰的描述
写在最后
开发这个插件的过程让我深刻体会到 AI 在提升开发效率方面的巨大潜力。虽然还有很多可以优化的地方,但目前的效果已经能显著提升日常开发效率了。
如果你也想尝试开发类似的插件,建议可以:
- 从小功能开始
- 注重实用性
- 持续收集反馈
- 不断迭代优化
项目代码已经开源在 GitHub,欢迎一起交流学习!
如果觉得有帮助,别忘了点赞关注,我会继续分享更多实战经验~