AI CR:前端团队代码审查规范及高频坑汇总
摘要
前端开发中,规范代码能提升开发效率、降低维护成本,还能规避安全、性能等各类问题。本文梳理前端 6 大类常见问题,明确严重程度、问题场景及可复用的规范与解决方案,适用于开发者日常开发、代码审查及新人培训。
一、问题等级划分
为明确处理优先级,将所有问题按严重程度分为 4 级,具体标准如下:
| 等级 | 说明 | 处理优先级 |
|---|---|---|
| 5 分 | 必须要改,直接影响系统稳定性、安全性或功能正确性 | 最高 |
| 4 分 | 强烈建议改,可能引发潜在问题,影响代码可维护性或用户体验 | 高 |
| 3 分 | 建议改,优化后可提升代码质量、可读性或性能 | 中 |
| 2 分 | 可改可不改,不影响核心功能,仅为细节优化 | 低 |
二、常见问题分类与解决方案
类别1:安全问题
安全问题直接关系系统数据安全与用户信息保护,为核心优先级,需严格遵循规范规避风险。
1.1 禁止硬编码敏感信息
严重程度:5 分
问题描述:硬编码 Token、密钥等敏感信息,易导致信息泄露,存在极大安全风险。
// 推荐:环境变量获取敏感信息(避免泄露)
const apiKey = process.env.API_KEY;
// 反例:硬编码密钥(高风险)
const apiKey = "sk-xxxxxxx";
1.2 防范 XSS 攻击
严重程度:5 分
问题描述:直接用 innerHTML 拼接用户输入,易引发 XSS 攻击,恶意用户可注入脚本窃取信息。
// 推荐:textContent 自动转义,防 XSS
element.textContent = userInput;
// 反例:innerHTML 拼接用户输入(XSS 风险)
element.innerHTML = userInput;
1.3 敏感信息加密存储
严重程度:4 分
问题描述:Token、用户信息等敏感数据直接存储在 localStorage / sessionStorage,未加密易被窃取。
// 推荐:AES 加密敏感 token 后存储
import CryptoJS from 'crypto-js';
const encToken = CryptoJS.AES.encrypt(token, 'secret-key').toString();
localStorage.setItem('token', encToken);
// 反例:明文存储 token(易窃取)
localStorage.setItem('token', token);
类别2:编码规范问题
规范问题影响代码可读性与一致性,长期维护易引发混乱,需统一标准开发。
2.1 变量命名规范
严重程度:4 分
问题描述:作为变量命名专项要求,若变量名无意义、用模糊缩写或数字后缀(如 data、data2、_info),会导致可读性差,不利于维护,仅针对变量这一核心对象的命名场景。
// 推荐:语义化命名(清晰易懂)
const isPopup = true;
const hasAdminAuth = false;
const projectList = [];
// 反例:模糊命名(维护困难)
const data、data2、info、_info、table;
2.2 文案用词规范
严重程度:4 分
问题描述:交互文案存在拼写、语法错误或标点混乱,影响用户体验与专业度。
// 推荐:文案规范(语法、标点正确)
"Are you sure to delete this record? This action cannot be undone!"
// 反例:文案不规范(影响专业度)
"confirm deleted record ?this can't undo."
2.3 变量作用域管控
严重程度:4 分
问题描述:短命名变量(如 o、x)作用域过大(超过 10 行),易混淆,增加维护难度。
// 推荐:缩小短命名变量作用域(避免混淆)
return objList.filter(o => Object.keys(o).length);
// 反例:短命名变量作用域过大(易出错)
const o = { ... };
/** 大量代码省略 */
return o;
2.4 杜绝魔法数字与字符串
严重程度:4 分
问题描述:直接使用字面量(数字、字符串),含义不明确,后续修改易遗漏出错。
// 推荐:枚举定义状态(含义明确,便于维护)
enum TaskStatus {
Created = 0,
Pending = 1,
Running = 2,
Completed = 3
}
task.status = TaskStatus.Running;
// 反例:魔法数字(含义模糊)
task.status = 2;
2.5 权限标识命名规范
严重程度:4 分
问题描述:权限代码命名不规范,难以区分对应菜单和操作,不利于权限管理。
规范:采用「一级菜单.二级菜单.操作」格式。
// 推荐:权限命名规范(一级菜单.二级菜单.操作)
"channel.manage.cdt.read"
// 反例:权限命名模糊(无法识别)
"temp_lls.read"
2.6 监听器和计时器清理
严重程度:4 分
问题描述:规范类要求,仅聚焦监听器、计时器两类资源,核心遵循「使用即清理」准则,覆盖临时使用、组件内长期使用等所有场景,未及时清理易引发内存泄漏,统一代码编写规范,与 5.4、6.1 形成互补。
// 推荐:监听器、计时器通用清理(覆盖多场景)
const handleClick = () => {};
dom.current.addEventListener('click', handleClick);
// 临时监听器:使用后即时清理
// dom.current.removeEventListener('click', handleClick);
// 组件内长期使用:配合生命周期清理
React.useEffect(() => () => {
dom.current.removeEventListener('click', handleClick);
}, []);
// 反例:未清理(违反规范,存在内存泄漏隐患)
dom.current.addEventListener('click', handleClick);
2.7 React 循环 Key 规范
严重程度:4 分
问题描述:循环生成 React 节点未设置 key,会导致虚拟 DOM diff 失效,引发渲染异常或性能问题。
// 推荐:设置唯一 rowKey(避免渲染异常)
<Table {...props} rowKey="id" />
// 反例:未设置 rowKey(控制台报警告)
<Table dataSource={data} columns={columns} />
2.8 合理使用 useMemo
严重程度:3 分
问题描述:变量联动场景用 useEffect 修改状态,而非 useMemo 缓存结果,增加不必要的渲染。
// 推荐:useMemo 缓存计算结果(减少不必要渲染)
const channelOpts = React.useMemo(
() => channelList.map(item => ({ value: item.id, label: item.name })),
[channelList]
);
// 反例:useEffect 修改状态(冗余渲染)
React.useEffect(() => {
setChannelOpts(channelList.map(item => ({ value: item.id, label: item.name })));
}, [channelList]);
2.9 复杂逻辑添加注释
严重程度:3 分
问题描述:复杂业务逻辑、核心算法未加注释,后续维护难以理解,建议关联需求文档链接。
// 推荐:复杂逻辑加注释并关联需求(便于维护)
// 渠道筛选与权限校验(需求链接:xxx)
...complex logics
// 反例:无注释(逻辑难理解)
...complex logics
2.10 算法结构注释规范
严重程度:2 分
问题描述:使用特定算法/数据结构优化时,未说明优化目的与原理,不利于他人理解。
// 推荐:算法注释(说明优化目的)
function createTrie(records) {
// Trie 结构优化搜索,时间复杂度 O(n)
...
}
// 反例:无算法说明(优化意图不明)
function init(records) {
...
}
2.11 TODO 注释管理
严重程度:2 分
问题描述:TODO、FIXME 等注释未关联 Issue 链接,难以追溯待处理事项的需求与进度。
// 推荐:TODO 关联 Issue(便于追溯)
// TODO: 重构代码块(优化性能,Issue:xxx<需求链接>)
// 反例:无关联链接(追溯困难)
// 重构此代码块
复用计算结果
严重程度:2 分
问题描述:重复计算相同数据或频繁创建相同对象,增加不必要的性能消耗。
// 推荐:缓存计算结果(减少性能损耗)
render: record => channelMap[record.id]?.name
// 反例:重复查询(性能低效)
render: record => channelList.find(item => item.id === record.id)?.name
类别3:可维护性问题
可维护性问题影响代码长期迭代效率,规范开发可减少后续修改成本。
3.1 组件单一职责
严重程度:4 分
问题描述:一个组件承担多个职责(如同时处理请求、渲染、交互),体积庞大、逻辑混乱,难以维护复用。
// 推荐:组件职责单一(拆分功能,便于维护)
const UserProfile = () => {/* 仅显示用户资料 */};
const UserSetting = () => {/* 仅处理用户设置 */};
// 反例:单组件多职责(逻辑混乱)
const UserComponent = () => {/* 处理资料、设置、订单等多功能 */};
3.2 全场景语义化命名
严重程度:4 分
问题描述:作为全场景命名通用准则,覆盖函数、变量、组件等所有命名场景,若用拼音(如 getYhxx)或无意义缩写命名,会导致可读性差,影响长期维护,与 2.1 变量专项规范形成互补。
// 推荐:语义化命名(避免拼音)
const getUserInfo = () => {}; // 获取用户信息
// 反例:拼音命名(语义模糊)
const getYhxx = () => {}; // 拼音缩写,不易理解
3.3 常量统一抽取
严重程度:3 分
问题描述:魔法数字、固定字符串直接写入代码,未提取为常量,后续修改易遗漏。
// 推荐:提取常量(含义明确,便于修改)
const TIMEOUT = 3000; // 超时时间 3 s
setTimeout(callback, TIMEOUT);
// 反例:魔法数字(含义模糊)
setTimeout(callback, 3000);
3.4 消除重复业务代码
严重程度:3 分
问题描述:相同业务逻辑、校验规则多处重复编写,冗余且修改时易出错。
// 推荐:提取公共函数(复用逻辑,减少冗余)
const validateLen = (val: string): boolean => {
return val.length >= 3 && val.length <= 20; // 校验长度 3-20 位
};
if (validateLen(name)) { ... }
if (validateLen(title)) { ... }
// 反例:重复校验(冗余易出错)
if (name.length >= 3 && name.length <= 20) { ... }
if (title.length >= 3 && title.length <= 20) { ... }
类别4:可扩展性问题
可扩展性问题影响代码后续迭代与功能扩展,规范开发可提升灵活性。
4.1 CSS 命名规范
严重程度:2 分
问题描述:CSS 命名未遵循模块化或 BEM 规范,样式冲突风险高,难以维护扩展。
/* 推荐:BEM 命名规范(防样式冲突) */
.btn--primary { } /* 按钮-主样式 */
.user-card__name { } /* 用户卡片-姓名 */
/* 反例:模糊命名(易冲突) */
.title { }
.box { }
4.2 组件 Props 精简
严重程度:3 分
问题描述:组件 Props 超过 8 个,接口膨胀,使用与维护成本高,可通过合并 Props 优化。
// 推荐:合并 Props(简化接口,避免膨胀)
interface TableOpts {
columns: Column[];
pageSize: 10; // 固定常用数值,更贴合实际
// 其他配置
}
<MyTable opts={opts} />
// 反例:Props 过多(接口混乱)
<MyTable a b c d e f g h i />
4.3 API 接口统一管理
严重程度:4 分
问题描述:组件内直接写死 API 地址,未集中管理,地址变更时需修改所有相关组件。
// 推荐:集中管理 API(统一维护,便于修改)
// api/user.ts
export const userApi = {
list: '/api/user/list',
detail: '/api/user/detail'
};
// 反例:硬编码 API(维护困难)
fetch('/api/user/list')
4.4 策略模式替代条件分支
严重程度:3 分
问题描述:多条件判断用大量 if-else,代码冗余、可读性差,后续添加条件需修改原有逻辑。
// 推荐:策略模式(替代 if-else,便于扩展)
const payMethods = {
credit: (amount: number) => { /* 信用卡支付 */ },
paypal: (amount: number) => { /* 贝宝支付 */ },
// 新增支付方式直接添加
};
payMethods[payType](amount);
// 反例:大量 if-else(可读性差,难扩展)
if (payType === 'credit') { ... }
else if (payType === 'paypal') { ... }
类别5:页面性能问题
性能问题直接影响页面加载速度与用户体验,需通过代码优化提升性能。
5.1 减少无效重渲染
严重程度:4 分
问题描述:React 组件未用 React.memo 优化,父组件更新时,子组件 Props 未变也会重新渲染。
// 推荐:React.memo 缓存组件(减少无效渲染)
const MemoComp = React.memo(({ data }) => {data});
// 反例:未缓存组件(无效渲染)
const Comp = ({ data }) => {data};
5.2 拆分全局状态
严重程度:4 分
问题描述:所有状态集中在一个 store,小交互会触发全页面重渲染,影响性能。
// 推荐:拆分 store(细粒度管理,避免全量渲染)
store/
├── user.ts // 用户状态
├── order.ts // 订单状态
└── product.ts // 商品状态
// 反例:单 store 管理(易全量渲染)
store/index.ts
5.3 高频事件节流防抖
严重程度:4 分
问题描述:scroll、input 等频繁触发事件未做节流/防抖,回调频繁执行,消耗性能。
// 推荐:节流控制(减少高频事件触发)
import { throttle } from 'lodash';
const handleScroll = throttle(() => { /* 滚动逻辑 */ }, 150);
window.addEventListener('scroll', handleScroll);
// 反例:无节流(高频触发,耗性能)
window.addEventListener('scroll', handleScroll);
5.4 组件销毁资源回收
严重程度:5 分
问题描述:性能优化类要求,聚焦组件销毁特定时机,需清理该时机下所有资源(监听器、数据订阅等),核心避免资源残留导致内存泄漏、提升页面性能,与 2.6 规范、6.1 健壮性保障互补,不局限于监听器、计时器。
// 推荐:组件销毁时全资源清理(性能优化核心)
useEffect(() => {
// 数据订阅清理(非监听器场景,与 2.6 区分)
const sub = observable.subscribe();
// 计时器清理(呼应 2.6 规范,聚焦销毁时机)
const timer = setInterval(fetchData, 3000);
return () => {
sub.unsubscribe();
clearInterval(timer);
};
}, []);
// 反例:未清理(内存泄漏,影响性能)
useEffect(() => {
observable.subscribe();
setInterval(fetchData, 3000);
}, []);
5.5 异步请求超时控制
问题描述:异步请求未设置超时机制,网络异常时一直等待,导致页面卡顿、无响应。
// 推荐:请求超时处理(避免页面卡顿)
const fetchWithTimeout = (url, timeout = 3000) => { // 调整超时为 3 s
return Promise.race([
fetch(url),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('请求超时')), timeout)
)
]);
};
// 反例:无超时(网络异常时一直等待)
fetch(url);
5.6 减少频繁 DOM 操作
严重程度:3 分
问题描述:循环中频繁操作 DOM(如 appendChild),会导致频繁重排重绘,影响性能。
// 推荐:批量操作 DOM(减少重排重绘)
const fragment = document.createDocumentFragment();
items.forEach(item => {
const div = document.createElement('div');
fragment.appendChild(div);
});
container.appendChild(fragment);
// 反例:频繁操作 DOM(多次重排,耗性能)
items.forEach(item => {
container.appendChild(document.createElement('div'));
});
类别6:代码健壮性问题
健壮性问题直接影响系统稳定性,易导致页面报错、功能异常,需规范代码规避。
6.1 内存泄漏治理
问题描述:健壮性保障类要求,聚焦所有内存泄漏场景(含 2.6 规范未落实、5.4 清理不彻底等),结合 Vue2、React 框架特性,拆解具体场景并给出解决方案,提升系统稳定性,是对 2.6、5.4 的补充延伸。
6.1.1 Vue2 资源销毁清理
严重程度:4 分
// 推荐:Vue2 内存泄漏防护(框架特定场景)
export default {
created() {
this.timer = setInterval(this.fetchData, 3000);
window.addEventListener('resize', this.handleResize);
},
beforeDestroy() {
clearInterval(this.timer);
window.removeEventListener('resize', this.handleResize);
}
}
// 反例:未清理资源(内存泄漏,影响稳定性)
export default {
created() {
this.timer = setInterval(this.fetchData, 3000);
window.addEventListener('resize', this.handleResize);
}
}
6.1.2 React 异步副作用清理
严重程度:4 分
6.2 空值安全处理
6.2.1 解构赋值 null 值兜底
严重程度:5 分
// 推荐:解构后处理 null(避免报错)
const { data = {} } = await fetchCall();
if (data == null) data = {}; // 兜底处理 null
return data.a;
// 反例:未处理 null(易报 Cannot read property 'a')
const { data = {} } = await fetchCall();
return data.a; // data 可能为 null
6.2.2 可选链防护空对象
严重程度:5 分
// 推荐:可选链处理空值(兜底保护)
interface Res {
items: Array<{ name: string }>;
}
function parse(data: Res) {
return data.items[0]?.name || ''; // 空值兜底为空字符串
}
// 反例:未处理空值(易报错)
function parse(data: Res) {
return data.items[0].name || ''; // items[0] 可能为 undefined
}
6.3 事件冒泡管控
6.3.1 Vue2 事件传播阻止
严重程度:5 分
<!-- 推荐:.stop 阻止冒泡(避免子组件点击误触发父组件事件) -->
<div @click="parentClick">
父组件
<button @click.stop="childClick">子组件按钮</button>
</div>
<!-- 反例:未阻止冒泡(点击子组件按钮,会同时触发 childClick 和 parentClick) -->
<div @click="parentClick">
父组件
<button @click="childClick">子组件按钮</button>
</div>
6.4 状态更新规范
6.4.1 React 函数式状态更新
严重程度:5 分
// 推荐:函数式更新状态(确保获取最新值)
const handleClick = () => {
setCount(prev => prev + 1);
setCount(prev => prev + 1); // 最终 count + 2
};
// 反例:直接更新(获取旧状态,仅 + 1)
const handleClick = () => {
setCount(count + 1);
setCount(count + 1);
};
6.5 TS 类型规范
6.5.1 严格限制 any 使用
严重程度:4 分
// 推荐:定义明确类型(避免 any,类型校验)
interface Res {
items: Array<{ name: string }>;
}
function parse(data: Res) {
return data.items[0]?.name || '';
}
// 反例:滥用 any(失去类型校验,易出错)
function parse(data: any) {
return data.items[0].name;
}
6.5.2 React Ref 类型约束
严重程度:4 分
// 推荐:可选链(避免空值报错)
const inputRef = useRef<HTMLInputElement>();
inputRef.current?.value = ''; // 可选链保护
// 反例:未处理 current 为 null(易报错)
const inputRef = useRef<HTMLInputElement>();
inputRef.current.value = '';
6.5.3 高阶组件类型保留
严重程度:3 分
// 推荐:泛型保留 HOC 类型(避免类型丢失)
const withAuth = <P extends object>(
WrappedComp: React.ComponentType<P>
) => {
return (props: P) => <WrappedComp {...props} />;
};
// 反例:未用泛型(Props 类型丢失,易出错)
const withAuth = (WrappedComp) => {
return (props) => <WrappedComp {...props} />;
};
6.6 异步异常捕获
6.6.1 异步逻辑异常处理
严重程度:4 分
// 推荐:try-catch 处理异常(控制加载状态)
const handleClick = () => {
try {
this.loading = true;
// 异步请求/复杂逻辑
} catch (err) {
console.error('操作失败:', err);
} finally {
this.loading = false; // 无论成败,关闭加载
}
}
// 反例:未处理异常(加载状态可能无法关闭)
const handleClick = () => {
fetch(`/api/${id}`).then(setData);
}
6.7 基础语法规范
6.7.1 函数调用规范
严重程度:4 分
// 推荐:正确调用函数(加括号,获取返回值)
methods: {
isFalse() { return false; }, // 语义化命名
getResult() { return !this.isFalse(); } // 正确调用
}
// 反例:未加括号(获取函数本身,非返回值)
methods: {
isFalse() { return false; },
getResult() { return !this.isFalse; } // 错误:this.isFalse 是函数
}
6.7.2 Vue 响应式更新规范
严重程度:5 分
// 推荐:Vue.set 修改数组(确保响应式生效)
Vue.set(this.items, 0, newItem); // 修改数组指定索引
// 反例:直接修改索引(Vue 无法检测,视图不更新)
this.items[0] = newItem;
6.7.3 React 状态修改规范
严重程度:5 分
// 推荐:setState 修改状态(确保视图更新)
const [state, setState] = useState({ count: 0 });
setState(prev => ({ ...prev, count: prev.count + 1 }));
// 反例:直接修改状态(React 无法检测,视图不更新)
const [state] = useState({ count: 0 });
state.count++; // 无效操作,易出错
6.7.4 Hooks 依赖项补全
严重程度:4 分
// 推荐:完善 Hooks 依赖项(确保逻辑正确)
useEffect(() => {
console.log(props.id);
}, [props.id]); // 依赖 props.id,变化时重新执行
// 反例:缺少依赖项(逻辑可能异常)
useEffect(() => {
console.log(props.id);
}, []); // 缺少 props.id 依赖
6.7.5 Vue $refs 合理时机
严重程度:4 分
// 推荐:$nextTick 确保 DOM 渲染(避免获取不到元素)
mounted() {
this.$nextTick(() => {
this.$refs.input?.focus(); // 可选链保护
});
}
// 反例:created 中使用 $refs(DOM 未渲染,可能为 undefined)
created() {
this.$refs.input.focus();
}
6.8 逻辑边界兜底
6.8.1 枚举分支完备校验
严重程度:5 分
// 推荐:枚举所有情况+兜底(避免遗漏)
type Status = 'loading' | 'success' | 'error';
function handleStatus(status: Status) {
switch(status) {
case 'loading': /* 加载中 */ break;
case 'success': /* 成功 */ break;
case 'error': /* 失败 */ break;
default:
console.warn('未知状态:', status); // 兜底提示
}
}
// 反例:未枚举所有情况+无兜底(易出错)
type Status = 'loading' | 'success';
function handleStatus(status: Status) {
switch(status) {
case 'loading': /* 加载中 */ break;
// 缺少 success 分支
}
}
6.9 函数默认值规范
6.9.1 规避默认值逻辑冲突
严重程度:4 分
// 推荐:不设默认值(明确处理无参数场景,避免 bug)
type Region = 'CN' | 'US' | 'ID' | 'MY';
function formatCurrency(money: number, region?: Region) {
if (!region) return ''; // 无 region 时兜底
// 业务逻辑
}
// 反例:默认值可能与实际需求冲突(引发 bug)
type Region = 'CN' | 'US' | 'ID' | 'MY';
function formatCurrency(money: number, region: Region = 'CN') {
// 默认值可能不符合场景
}
6.10 列表渲染 Key 规范
6.10.1 v-for 唯一标识选用
严重程度:4 分
<!-- 推荐:用数据唯一 id 作为 key(避免重复,防渲染异常) -->
<div v-for="item in list" :key="item.id">{{ item.name }}</div>
<!-- 反例:用 index 作为 key(排序/删除时易出错,ID 可能重复) -->
<div v-for="(item, index) in list" :key="index">{{ item.name }}</div>
三、总结与落地规范
本文梳理了前端开发中安全、规范、可维护性、可扩展性、性能、健壮性 6 大类常见问题,明确了各问题的严重程度、场景及解决方案,核心目标是帮助开发者规范编码、高效排查问题、提升系统质量。以下从问题统计、核心重点及落地建议三方面,形成清晰指引。
3.1 问题分类数据统计
各类问题的数量与风险等级分布明确,可直接作为优先级判定依据,具体统计如下:
| 类别 | 总数量 | 5 分(必改) | 4 分(强推) | 3 分(建议) | 2 分(优化) |
|---|---|---|---|---|---|
| 安全问题 | 3 | 2 | 1 | 0 | 0 |
| 规范问题 | 12 | 0 | 7 | 2 | 3 |
| 可维护性问题 | 4 | 0 | 2 | 2 | 0 |
| 可扩展性问题 | 4 | 0 | 1 | 2 | 1 |
| 性能问题 | 6 | 1 | 4 | 1 | 0 |
| 健壮性问题 | 20+ | 10+ | 8+ | 1 | 0 |
3.2 优化重点核心提炼
结合统计数据,明确三大核心重点,优先聚焦关键问题:
- 安全优先:安全问题数量最少,但 5 分高风险问题占比极高,直接影响数据与用户安全,为首要优化目标。
- 健壮性兜底:健壮性问题数量最多、高风险问题占比最高,易导致系统报错、异常,是保障系统稳定的核心。
- 兼顾效率与体验:规范、可维护性、可扩展性、性能类问题,重点优化高优先级(4 分)项,兼顾开发效率与用户体验。
3.3 团队落地执行建议
针对实际开发场景,给出可落地的执行建议,形成闭环管理:
- 代码审查:按严重程度划分优先级,优先修复 5 分、4 分问题,3 分、2 分问题结合迭代节奏逐步优化。
- 新人培训:以安全、健壮性问题为重点,结合代码示例普及规范,培养良好编码习惯。
- 自动化保障:配置 ESLint、TypeScript 规则,自动检测常见问题,提前预警、减少人工成本。
- 持续优化:定期复盘高频问题,更新规范与解决方案,形成最佳实践,持续提升代码质量。
前端代码规范落地需长期坚持,通过聚焦重点、闭环管理,可实现代码可维护、系统高可用、迭代高效率的目标。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)