如何向Pokémon Showdown Client提交第一个PR?Linter规则、类型检查与测试完整清单
【免费下载链接】pokemon-showdown-clientThe client for Pokémon Showdown项目地址: https://gitcode.com/gh_mirrors/po/pokemon-showdown-client
第一次想给Pokémon Showdown Client提代码却不知从哪下手?别担心。这篇文章面向新手,手把手带你跑通本地构建、Linter 检查、TypeScript 类型检查与测试三大关卡,最后附一份可直接照抄的 PR 自查清单。照着走,你就能自信地发出第一个Pokémon Showdown Client 贡献 PR。
为什么这个客户端值得你贡献?
这个仓库是Pokémon Showdown的前端客户端,负责运行play.pokemonshowdown.com,正在用TypeScript + Preact重写新客户端。理解它的加载架构,能让你快速定位该改哪个文件:
- 第一阶段:基础样式 + 后台模型(
client.css、client-core.ts) - 第二阶段:基础 UI 与连接(
client-main.ts、SockJS、client-connection.ts) - 第四阶段:重量级面板(对战、队伍编辑器),仅在对战或打开队伍页时才加载
完整架构说明见 CONTRIBUTING.md。
一键搭建本地开发环境
先确认你装了Node.js v20 或更高版本和Git,然后克隆仓库并构建:
- 克隆项目:
git clone https://gitcode.com/gh_mirrors/po/pokemon-showdown-client - 进入目录,执行
node build(Windows)或./build(其他系统) - 构建脚本会自动安装依赖、生成
config/config.js,并编译出测试页
💡 构建脚本会自动
npm install,无需手动装依赖。
本地测试:浏览器打开 play.pokemonshowdown.com/testclient-new.html,即可在不搭建登录服务器的情况下验证改动。若需要已登录账号,在config/testclient-key.js写入你的sid(注意放config/,不是play.pokemonshowdown.com/config/)。每次改完代码,重跑一次构建即可。
跑通 Linter:代码风格规则全解析
提交前必须过ESLint检查。项目的规则由两层组成:
- eslint.config.mjs:按文件类型分组(浏览器 ES3、Node、TypeScript)
- eslint-ps-standard.mjs:Showdown 共享风格,缩进用 Tab、1tbs 花括号、保留分号、单引号、行宽 120
常用命令(定义在 package.json):
| 命令 | 作用 |
|---|---|
npm run lint | 运行 Linter 检查 |
npm run fix | 自动修复可修复的风格问题 |
几条必须记住的约束(详见 CONTRIBUTING.md):
- 目标语言为ES3:不能用
Map/Set(改用普通对象)、不能async/await(Promise可以) - 可用 polyfill:
Array#includes、Object.assign、String#trim等 - 常见硬规则:
eqeqeq(用===)、no-var、prefer-const、no-fallthrough
🎯 小技巧:写完后先跑
npm run fix自动修正格式,再npm run lint看剩余问题,能省一半时间。
类型检查:TypeScript 严格模式入门
新客户端用TypeScript编写,配置见 tsconfig.json,开启了strict: true与noImplicitOverride: true,并且noEmit: true(只做类型检查、不产出文件)。覆盖范围包括play.pokemonshowdown.com/src/、replay.pokemonshowdown.com/src/、teams.pokemonshowdown.com/src/下的.ts/.tsx。
运行类型检查:
npx tsc对新手最重要的两点:
strict模式:变量未初始化、可能为undefined都会报错,养成显式标注的习惯noImplicitOverride:重写父类方法必须写override关键字,漏写会直接报错
测试:用 Node 内置框架验证改动
项目使用Node 原生测试运行器(node:test+assert),无需额外安装框架。现有用例:
- test/battle.test.js:解析一段完整对战日志,校验血量、换人、道具等状态
- test/ev-optimizer.test.js、test/ev-guesser.test.js:验证 EV 猜测与优化逻辑
运行全部测试:
node --test test/*.js此外还有两个辅助脚本:test/check-filenames 校验精灵图片命名,test/parse 用于调试文本解析。改动对战或解析逻辑时,务必补一个断言再提交。
提交 PR 前:完整自查清单
一条命令npm test会依次跑完构建 →tsc类型检查 →eslint --max-warnings 0→node --test。全部通过,才算真正“绿”。提交前逐项对照:
| # | 检查项 | 命令 / 文件 | 说明 |
|---|---|---|---|
| 1 | 构建成功 | node build/ build | 能编译、生成测试页 |
| 2 | Linter 零警告 | npm run lint | 风格、ES3 约束、无no-shadow |
| 3 | 类型检查通过 | npx tsc(tsconfig.json) | strict 模式无报错 |
| 4 | 测试全部通过 | node --test test/*.js | 覆盖你改动的逻辑 |
| 5 | 本地页面验证 | testclient-new.html | 浏览器实际跑一遍 |
| 6 | 无遗留调试代码 | — | 删掉console.log、测试 key |
小结
给Pokémon Showdown Client提第一个 PR 其实并不神秘:装好 Node v20+ →node build起测试页 →npm run fix修风格 →npx tsc过类型 →node --test跑测试,最后按上表逐项勾选即可。把这份清单存好,你后续每一次贡献都能做到又快又稳。祝你早日看到自己的 PR 被合并!🏆
【免费下载链接】pokemon-showdown-clientThe client for Pokémon Showdown项目地址: https://gitcode.com/gh_mirrors/po/pokemon-showdown-client
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考