screenshot-to-code社区贡献指南
🎯 为什么需要你的贡献
screenshot-to-code是一个革命性的AI工具,能够将屏幕截图、设计稿和Figma设计转换为整洁的功能代码。作为开源项目,它的发展离不开社区的贡献。无论你是前端开发者、后端工程师、AI研究者还是文档撰写者,都能在这里找到贡献的机会。
📋 贡献类型概览
| 贡献类型 | 技能要求 | 影响程度 | 适合人群 |
|---|---|---|---|
| Bug修复 | 基础编程能力 | ⭐⭐⭐ | 初学者、熟悉项目者 |
| 功能增强 | 中级编程能力 | ⭐⭐⭐⭐ | 有经验的开发者 |
| 文档改进 | 技术写作能力 | ⭐⭐ | 所有贡献者 |
| 测试用例 | 测试思维 | ⭐⭐ | QA工程师、开发者 |
| 新模型支持 | AI/ML知识 | ⭐⭐⭐⭐⭐ | AI研究者、高级开发者 |
🛠️ 技术栈深度解析
后端技术架构
前端技术栈
- 框架: React 18 + TypeScript
- 构建工具: Vite
- 样式: Tailwind CSS + Radix UI
- 代码编辑器: CodeMirror
- 状态管理: Zustand
🚀 环境搭建指南
prerequisites
# 系统要求
Node.js >= 14.18.0
Python 3.8+
Poetry (Python包管理)
Yarn (Node包管理)
后端设置
cd backend
echo "OPENAI_API_KEY=sk-your-key" > .env
echo "ANTHROPIC_API_KEY=your-key" > .env
poetry install
poetry shell
poetry run uvicorn main:app --reload --port 7001
前端设置
cd frontend
yarn
yarn dev
Docker方式
echo "OPENAI_API_KEY=sk-your-key" > .env
docker-compose up -d --build
🔧 贡献流程详解
1. 寻找贡献机会
2. 代码提交规范
- 分支命名:
feat/描述、fix/描述、docs/描述 - 提交信息: 遵循Conventional Commits规范
- 测试要求: 新功能必须包含测试用例
3. Pull Request流程
- Fork项目到个人账户
- 创建特性分支
- 实现功能并添加测试
- 运行所有测试确保通过
- 提交Pull Request并描述变更
🎨 前端贡献指南
组件开发规范
// 组件示例
interface ComponentProps {
variant?: 'primary' | 'secondary'
size?: 'sm' | 'md' | 'lg'
disabled?: boolean
}
const MyComponent: React.FC<ComponentProps> = ({
variant = 'primary',
size = 'md',
disabled = false
}) => {
return (
<button
className={cn(
'rounded-md font-medium transition-colors',
variant === 'primary' && 'bg-blue-600 text-white hover:bg-blue-700',
variant === 'secondary' && 'bg-gray-200 text-gray-900 hover:bg-gray-300',
size === 'sm' && 'px-3 py-1.5 text-sm',
size === 'md' && 'px-4 py-2 text-base',
size === 'lg' && 'px-6 py-3 text-lg',
disabled && 'opacity-50 cursor-not-allowed'
)}
disabled={disabled}
>
Click me
</button>
)
}
状态管理最佳实践
// 使用Zustand进行状态管理
interface AppState {
code: string
isLoading: boolean
variants: string[]
setCode: (code: string) => void
setIsLoading: (loading: boolean) => void
setVariants: (variants: string[]) => void
}
export const useAppStore = create<AppState>((set) => ({
code: '',
isLoading: false,
variants: [],
setCode: (code) => set({ code }),
setIsLoading: (loading) => set({ isLoading: loading }),
setVariants: (variants) => set({ variants })
}))
🤖 后端贡献指南
LLM模型集成
# 模型集成示例
async def stream_openai_response(
messages: List[ChatCompletionMessageParam],
api_key: str,
base_url: str | None,
callback: Callable[[str], Awaitable[None]],
model_name: str,
) -> Completion:
"""
流式处理OpenAI响应
"""
client = AsyncOpenAI(api_key=api_key, base_url=base_url)
try:
stream = await client.chat.completions.create(
model=model_name,
messages=messages,
stream=True,
)
async for chunk in stream:
if chunk.choices[0].delta.content:
await callback(chunk.choices[0].delta.content)
except Exception as e:
raise LLMError(f"OpenAI API error: {str(e)}")
图像处理优化
def process_image(image_data_url: str) -> tuple[str, str]:
"""
处理图像数据URL,返回处理后的数据URL和MIME类型
"""
# 提取MIME类型和base64数据
match = re.match(r'data:(image\/\w+);base64,(.*)', image_data_url)
if not match:
raise ValueError("Invalid image data URL format")
mime_type, base64_data = match.groups()
image_data = base64.b64decode(base64_data)
# 图像优化处理
image = Image.open(io.BytesIO(image_data))
# 调整大小优化
if image.size[0] > 1024 or image.size[1] > 1024:
image.thumbnail((1024, 1024), Image.Resampling.LANCZOS)
# 转换为RGB模式(如果需要)
if image.mode != 'RGB':
image = image.convert('RGB')
# 保存优化后的图像
optimized_buffer = io.BytesIO()
image.save(optimized_buffer, format='JPEG', quality=85, optimize=True)
optimized_data = optimized_buffer.getvalue()
# 返回优化后的数据URL
optimized_base64 = base64.b64encode(optimized_data).decode('utf-8')
return f"data:image/jpeg;base64,{optimized_base64}", "image/jpeg"
🧪 测试贡献指南
单元测试规范
# 后端测试示例
def test_image_mode_create_single_image(self) -> None:
"""测试单图像模式创建"""
prompt_messages, metadata = create_prompt(
stack=Stack.HTML_TAILWIND,
input_mode=InputMode.IMAGE,
generation_type="create",
prompt=PromptContent(
image_data_urls=["data:image/png;base64,test123"],
text=""
),
history=[],
is_imported_from_code=False,
)
# 验证消息结构
self.assertEqual(len(prompt_messages), 2)
self.assertEqual(prompt_messages[0]["role"], "system")
self.assertEqual(prompt_messages[1]["role"], "user")
前端测试示例
// 前端组件测试
import { render, screen } from '@testing-library/react'
import { ImageUpload } from './ImageUpload'
describe('ImageUpload', () => {
it('renders upload area correctly', () => {
render(<ImageUpload onImageUpload={() => {}} />)
expect(screen.getByText('拖放图片或点击上传')).toBeInTheDocument()
expect(screen.getByText('支持PNG, JPG, GIF格式')).toBeInTheDocument()
})
it('handles file upload', async () => {
const mockOnUpload = jest.fn()
render(<ImageUpload onImageUpload={mockOnUpload} />)
// 模拟文件上传
const file = new File(['test'], 'test.png', { type: 'image/png' })
const input = screen.getByTestId('file-input')
await userEvent.upload(input, file)
expect(mockOnUpload).toHaveBeenCalledWith(expect.any(String))
})
})
📚 文档贡献指南
文档结构规范
# 标题(清晰描述功能)
## 功能概述
- 简要描述功能用途
- 适用场景和限制
## 使用方法
```代码示例
提供具体的使用示例
参数说明
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| param1 | string | 是 | 参数说明 |
| param2 | number | 否 | 可选参数说明 |
常见问题
Q: 常见问题1
A: 详细解答
Q: 常见问题2
A: 详细解答
相关链接
### 示例文档改进
```markdown
# 视频转代码功能
## 功能概述
实验性功能,支持将网站操作视频转换为功能原型代码。
## 使用方法
```python
# 视频处理示例
from backend.video.utils import split_video_into_screenshots
video_data_url = "data:video/mp4;base64,test123"
screenshots = split_video_into_screenshots(video_data_url)
支持格式
- MP4 (H.264编码)
- WebM (VP9编码)
- 最大时长: 30秒
- 最大大小: 10MB
性能优化建议
- 使用合适的视频压缩参数
- 限制视频时长在15秒内
- 确保视频内容清晰可见
## 🎯 高质量贡献标准
### 代码质量要求
- ✅ 遵循项目代码风格
- ✅ 包含充分的注释
- ✅ 通过所有现有测试
- ✅ 新增功能包含测试用例
- ✅ 文档同步更新
### 提交信息规范
类型(范围): 简要描述
详细描述:
- 修复的问题或新增的功能
- 技术实现细节
- 测试覆盖情况
- 文档更新情况
关联Issue: #123
### 审查要点
1. **功能正确性**: 实现是否符合需求
2. **代码质量**: 是否遵循最佳实践
3. **测试覆盖**: 是否包含充分测试
4. **文档更新**: 相关文档是否同步更新
5. **性能影响**: 是否对性能有负面影响
## 🌟 进阶贡献方向
### 模型优化
- 支持新的LLM模型(如本地模型)
- 改进提示工程(Prompt Engineering)
- 多模型结果融合策略
### 功能扩展
- 新增UI框架支持(如Svelte、SolidJS)
- 代码质量检查集成
- 实时协作编辑功能
### 性能提升
- 图像处理算法优化
- 缓存策略改进
- 并发处理优化
## 🤝 社区协作指南
### 沟通渠道
- GitHub Issues: 问题报告和功能讨论
- Pull Requests: 代码贡献和审查
- 项目Wiki: 文档协作
### 行为准则
1. 尊重所有贡献者
2. 建设性讨论技术问题
3. 及时响应审查意见
4. 帮助新贡献者熟悉项目
### 获取帮助
- 查阅现有文档和示例
- 在GitHub Issues中提问
- 参考类似实现的代码
## 📈 贡献者成长路径

加入screenshot-to-code社区,让我们一起推动AI辅助开发的发展,让设计到代码的转换更加智能和高效!你的每一份贡献都将帮助开发者节省宝贵时间,提升开发效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



