p5.js 2.x 仓库全景指南:从快速上手创意编程到源码结构、构建与贡献实践
【免费下载链接】p5.jsp5.js is a client-side JS platform that empowers artists, designers, students, and anyone to learn to code and express themselves creatively on the web. It is based on the core principles of Processing. Looking for p5.js 2.0? http://beta.p5js.org项目地址: https://gitcode.com/GitHub_Trending/p5/p5.js
p5.js 是一个面向艺术家、设计师、教育者与编程初学者的免费开源 JavaScript 创意编程库,它在浏览器端将 Processing 的核心理念带到 Web,让"把整个网页当作你的速写本"成为现实。本文以仓库根目录的 README.md 为主干,结合 package.json、src/core/main.js、src/app.js、contributor_docs/contributor_guidelines.md 等源码与文档,系统讲解 p5.js 的定位、快速上手方式、源码组织与构建流程、issue 与 PR 贡献全流程、社区治理结构,以及本仓库当前版本(2.3.1)的实际工程事实,帮助读者既会"用"也能"看懂"这个库。
p5.js 是什么:一个以无障碍与可及性为优先的创意编码平台
p5.js 是运行在客户端(浏览器)的 JavaScript 平台,它的核心目标人群是艺术家、设计师、学生以及任何想学习编码并在 Web 上表达创意的普通人。它基于 Processing 的核心原则构建,支持创建视听、交互、实验性与生成式(generative)作品,并强调把"网页"本身当作创作画布。
从项目自我定位来看,README 明确把 p5.js 描述为"a free and open-source JavaScript library for accessible creative coding",即一个"面向可及性创意编码"的自由开源库。这里的 accessible(可及/无障碍)不只是口号,而是渗透到整个项目组织与代码实现中:
- 仓库提供了完整的无障碍功能模块 src/accessibility/,包含
describe()、textOutput()、gridOutput()等能力,用于为屏幕阅读器等辅助技术描述画布内容; - 贡献者指南把Access(可及性)列为设计原则之首,并明确"我们做的每一个决策都必须考虑它如何提升历史上被边缘化群体的可及性"(见 contributor_docs/contributor_guidelines.md)。
项目还强调多语言可及性:仓库中提供了 translations/ 目录,包含 en、es、hi、ja、ko、zh 六种语言的翻译资源(translations/index.js 负责加载),配合 p5.js 官网上"带视觉示例的庞大参考文档"(docs/ 目录中存放了构建参考文档用的 converted.json 与 parameterData.json)。
注意:README 中对外链接指向 p5js.org 官方站点、在线编辑器 editor.p5js.org、社区论坛与 Discord 等,这些属于项目对外生态,具体使用时请以官方站点为准;本文其余内容均以当前仓库实际文件为证据。
30 秒上手:最小可运行 sketch 与核心生命周期
最小示例
README 给出了一个最精简的全局模式 sketch,读者可以用它快速验证 p5.js 是否正常工作:
function setup() { createCanvas(400, 400); background(255); } function draw() { circle(mouseX, mouseY, 80); }这段代码包含了 p5.js 的核心生命周期概念:
setup():sketch 启动时执行一次,用于初始化画布与全局状态。从 src/core/main.js 的#_setup()实现看,p5 在用户setup()之前会先默认创建一个100x100的 P2D 画布(this.createCanvas(100, 100, constants.P2D)),用户随后调用createCanvas()时会替换掉它;setup()结束后记录_millisStart时间戳,使millis()从 0 开始计时;draw():每帧循环执行。#_start()(src/core/main.js)在 setup 完成后调用this._draw()启动绘制循环。
全局模式与实例模式
从 src/core/main.js 的p5构造函数源码可以看到,p5.js 支持两种运行模式:
- 全局模式(global):不传 sketch 闭包时,
this._isGlobal = true,构造函数会遍历p5.prototype与实例属性,把非下划线开头的所有方法与属性通过createBindGlobal绑定到window上——这就是为什么可以直接裸写createCanvas()、circle()而不需要任何前缀; - 实例模式(instance):传入
sketch闭包时,所有方法绑定到该 p5 实例对象上,适合与其它库共存或需要多个独立 sketch 的场景。构造函数还会调用p5._checkForUserDefinedFunctions检查用户是否拼错了setup/draw(仅检测大小写类拼写错误,如Setup、SETUP)。
实例模式的标准写法(非 README 原文,由构造函数签名constructor(sketch, node)推断):
new p5(function (p) { p.setup = function () { p.createCanvas(400, 400); }; p.draw = function () { p.circle(p.mouseX, p.mouseY, 80); }; });构造函数还接受可选的第二个参数node(字符串 id 或 HTMLElement),用于把画布挂载到指定 DOM 节点(src/core/main.js 中字符串会被document.getElementById解析)。
源码组织:模块化"内置插件"架构
p5.js 的源码位于 src/ 目录,其组织方式在 src/README.md 中有明确说明:源码被划分为若干子目录,它们在概念上等价于第三方插件(addon),只是因为这些功能对 p5 构建 Web 艺术项目过于核心而直接随库一起发布。
src/core/是唯一的例外,它承载 p5.js 大部分内部逻辑——"协调其他一切"的核心代码。若要做精简的自定义构建(contributor_docs/archive/custom_p5_build.md),core 目录是唯一硬性要求,其余模块均可选;- 其余模块包括:
shape(形状)、color(颜色)、accessibility(无障碍)、data、dom、events、image、io、math、utilities、webgl、webgpu、type(字体排版)、friendly_errors(友好错误系统)、strands(生成式编程的中间表示与代码生成子系统)等。
各模块通过"插件注入"方式挂载到p5构造器上。看 src/app.js 的入口文件,可以清晰还原模块装配顺序:
// core import p5 from './core/main'; // shape import shape from './shape'; shape(p5); // accessibility import accessibility from './accessibility'; accessibility(p5); // color import color from './color'; color(p5); // ... data / dom / events / image / io / math / utilities / webgl / type // Shaders + filters import shader from './webgl/p5.Shader'; p5.registerAddon(shader); import strands from './strands/p5.strands'; p5.registerAddon(strands); import { waitForDocumentReady, _globalInit } from './core/init'; waitForDocumentReady().then(_globalInit); export default p5;每个模块导出的是一个"以 p5 构造器为参数的初始化函数",模块内部再向原型上挂载自己的方法与属性。p5.registerAddon()(src/core/main.js)提供了正式的插件注册机制:插件可通过它声明presetup、postsetup、predraw、postdraw、remove等生命周期钩子(p5.lifecycleHooks),p5 在对应阶段会依次调用这些钩子;同时该机制具备去重能力,避免插件重复注册其依赖插件。
Node 端入口 src/app.node.js 与浏览器端几乎一致,唯一差异是不加载 friendly_errors 模块(对应代码被注释),因为友好错误系统依赖浏览器环境。
公共 API 设计原则
src/README.md 还阐述了 API 风格约定,这对理解源码命名很有帮助:
- 公共 API:使用短小、清晰、陈述式的函数名,如
circle()优于new Circle();若公共函数名超过一两个单词,就值得重新考虑 API 结构; - 原生 API 别名:浏览器原生能力可以被包装成更富创意、更具表达力的接口,如
print()比console.log()更容易向初学者解释; - 内部 API:不暴露给用户、仅用于库内协调的构造器通常以"挂到 p5 构造器上做命名空间"的形式存在,需要 p5 实例时则显式作为参数传入。
构建、运行与测试:package.json 中的工程事实
当前仓库版本为2.3.1(见 package.json 的"version"字段),采用 ESM("type": "module")。核心脚本如下(来自 package.json):
| 命令 | 作用 |
|---|---|
npm run build | 使用 rolldown 构建库(rolldown -c,配置见 rolldown.config.js) |
npm run dev | 启动 Vite 开发服务器预览preview/目录 |
npm run dev:global | 同时启动构建监听(rolldown -c -w)与全局模式预览服务器(vite preview/global/) |
npm test | 运行 vitest 单元测试 |
npm run bench | 运行 vitest 基准测试(test/bench/下已有渲染、向量、CPU 变换等基准) |
npm run lint | 使用 oxlint 检查代码(oxlint .) |
npm run docs | 用 documentation 工具从源码 JSDoc 生成 docs/data.json,再经 utils/convert.mjs 转换 |
npm run generate-types | 生成 TypeScript 类型定义(utils/typescript.mjs) |
npm run test:types | 用 tsc 检查 test/types/ 下的类型测试(basic.ts、instance.ts、webgpu.ts 等) |
构建产物(files字段)包含lib/p5.js、lib/p5.min.js、ESM 版本lib/p5.esm.js及 WebGPU 变体lib/p5.webgpu.js等。浏览器字段指向./lib/p5.min.js,Node 导出入口为./dist/app.node.js。
在 HTML 中使用
仓库自带的 lib/empty-example/index.html 展示了最标准的引入方式:
<!DOCTYPE html> <html lang=""> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>p5.js example</title> <style> body { padding: 0; margin: 0; background-color: #1b1b1b; } </style> <script src="../p5.min.js"></script> <!-- <script src="../addons/p5.sound.js"></script> --> <script src="sketch.js"></script> </head> <body> <main> </main> </body> </html>即:引入p5.min.js,再引入自己的sketch.js(内容为 setup/draw),body 中的<main>元素用于承载画布。声音插件p5.sound.js位于 lib/addons/,按需取消注释引入即可。
作为 npm 包使用
package.json 的exports字段定义了子路径导出,因此可以通过 npm 按需导入:
import p5 from 'p5'; // 完整库 import p5 from 'p5/node'; // Node 端入口(不含 friendly_errors) import p5 from 'p5/core'; // 仅核心 import p5 from 'p5/webgl'; // 仅 WebGL 模块 // 还支持 color / shape / dom / image / io / math / webgpu / type 等子模块参与贡献:从 issue 到 Pull Request 的完整工作流
报告问题(Issues)
README 与 contributor_docs/contributor_guidelines.md 都强调:开发讨论主要通过 GitHub issue 进行。仓库提供了四类 issue 模板,各自对应不同的贡献场景与审批门槛:
| 模板 | 适用场景 | 审批要求 |
|---|---|---|
| Found a bug | 报告 p5.js 行为与文档描述不符的 bug | 至少 1 位领域 steward 或 maintainer 批准后才能开始 PR |
| Existing Feature Enhancement | 增强既有功能(如给color()增加新的颜色定义方式) | 至少 1 位领域 steward 或 maintainer 批准;必填"如何提升可及性(Increasing Access)"陈述 |
| New Feature Request | 提出全新功能(如新增createTable绘制原生表格) | 至少 2 位领域 steward 或 maintainer 批准 |
| Discussion | 以上都不适用的一般性讨论 | 模板本身仅是最简文本区 |
"Found a bug" 模板需要填写的关键字段包括:最合适的子领域(用于自动打标签)、p5.js 版本号(在<script>标签链接或 p5.js/p5.min.js 第一行,形如2.3.1)、浏览器及版本(Chrome 查看chrome://version、Firefox 查看about:support、Safari 在"关于 Safari"中查看)、操作系统、以及复现步骤(附最小示例代码)。文档特别强调:复现是关键(Replication is key!),并建议描述"你期望代码做什么(expected)"与"代码实际做了什么(actual)"两方面。
重要约定:在没有对应 issue 或 issue 未被批准实现之前,不要提交 PR。任何在 issue 批准前提交的 PR 都会被关闭,直到 issue 获得批准。
本地开发环境搭建
contributor_docs/contributor_guidelines.md 中的 "Quick Get Started For Developers" 给出了标准的本地贡献流程:
- Fork p5.js 仓库;
- Clone 你的 fork 到本地;
- 添加 upstream 远程仓库:
git remote add upstream https://github.com/processing/p5.js - 确认已安装 Node.js(需 v18 及以上):
node -v - 安装依赖(注意是
npm ci而非npm install,以保证锁定版本一致性):npm ci - 基于
main创建描述性分支:git checkout -b [branch_name] - 开发过程中频繁运行测试(耗时长,但能确保不破坏既有行为):
npm test - 新功能或功能增强需补充单元测试;
- 完成后提交改动并创建 Pull Request。
构建相关命令:npm test会完整构建 p5.js 并运行全部单元测试;只想构建不跑测试用npm run build,产物输出到lib/目录(p5.js与p5.min.js)。
代码库结构速览
贡献者指南给出的关键目录如下(注意其中tasks目录在本仓库中已被rolldown.config.js构建脚本取代,属于文档历史描述,实际以当前仓库为准):
src:最终合并为 p5.js / p5.min.js 的所有源码;test:单元测试与文档示例测试代码(详见 contributor_docs/unit_testing.md);contributor_docs:全部贡献者文档。
Git 工作流要点
- 分支:开发前从
main创建分支(git checkout -b branch_name),避免污染主干; - 提交频率:文档建议"完成一个能用一句话描述的子任务就提交一次",而非把大改动堆进一个 commit;
- 提交前检查:
git status确认只包含预期改动的文件,git diff查看详细变更;禁止提交非 PR 意图的文件; - 提交命令:
git add .暂存,git commit -m "[your_commit_message]"提交,提交信息要具体描述(如Add documentation example to circle() function,而不是Documentation fix 1)。
创建 Pull Request
本地提交完成后,推送到 fork(GitHub Desktop 点击 Push 按钮,或命令行git push -u origin [branch_name]),然后在 GitHub 上发起 PR。PR 模板要求填写:
- Title:简要描述改动,避免泛泛而谈;
- Resolves:替换
Resolves #[Add issue number here]中的 issue 编号,如Resolves #1234——PR 合并后对应 issue 会自动关闭;若不想自动关闭(后续还有更多改动),改为Addresses; - Changes:清晰描述改动内容、实现细节与关键决策;
- Screenshots of the change:可选,但当改动影响画布渲染效果时应附上"示例 sketch 运行结果"截图(注意不是代码编辑器截图);
- PR Checklist:勾选相关检查项。
PR 打开后需自查三点:Commits 数量与本人提交一致;Files changed 只包含预期改动;分支与目标分支无冲突。
处理冲突(Rebase & Resolve Conflicts)
若出现冲突,可选择在 GitHub 网页端直接解决:冲突代码被<<<<<<<、=======、>>>>>>>标记分隔,一侧是你的代码、另一侧是主分支的变更,删除标记并保留最终代码后点击 "Mark as resolved",全部解决后 "Commit merge"。
本地手动解决流程(这也是冲突过于复杂时网页端无法处理时的方案):
git remote add upstream https://github.com/processing/p5.js git fetch upstream git rebase upstream/main # 若仅 lib/p5.js 和 lib/p5.min.js 冲突,重新构建项目即可修复 npm test git add -u git rebase --continue git pushPR 评审与迭代
PR 提交后由 steward 或 maintainer 评审,可能直接合并,也可能要求修改。若需修改,在本地对应分支继续改动、提交并 push 到 fork,新 commit 会自动出现在 PR 中;在 PR 下留言告知评审者即可,全部通过后合并。
社区治理:Steward 领域分工与轮值领导制
p5.js 采用轮值领导制(rotating leadership model,2020 年开始)。README 中记录了关键人物:
- 创建者:Lauren Lee McCarthy(2013 年创建,作为 Processing 面向 Web 的新诠释);
- 现任 Lead:[@ksen0](2024-present);现任 Mentor:[@limzykenneth](2023-present);
- 历任 Lead/Mentor:[@lmccart](Creator)、[@qianqianye](Lead,2021-2025)、[@outofambit](Co-Lead 2021-22 / Mentor 2022-2023)、[@mcturner1995](Lead 2020)。
Steward(领域守护者)是项目治理的核心机制:他们是特别熟悉、积极参与或响应项目特定领域的贡献者,职责是为他人提供上下文与指导。如果你对某领域有贡献疑问,可以在 issue 或 PR 中 @ 对应 steward;他们也会参与功能请求评审并引导领域发展方向。任何人都可以自愿成为 steward,没有特定专业要求,只需有兴趣主动学习与参与——在对应招募 issue 中回复感兴趣的领域即可。
当前 steward 领域分工(完整表格见 README.md 的 STEWARDS-LIST 区块)包括:Maintainers、Accessibility、Color、Core、DevOps、Documentation、Graphics (WebGL)、Graphics (WebGPU)、i18n(es/hi/ko/zh)、p5.js-web-editor、p5.js-website、p5.sound.js、Typography 等。
此外项目还有两项重要治理约定:
- AI 使用政策:项目不接受完全由 AI 生成的贡献,AI 工具仅可辅助使用;贡献者必须能理解并对自己的改动负责(详见 AI_USAGE_POLICY.md 与 AGENTS.md);
- 贡献者认可:项目遵循 all-contributors 规范,所有类型的贡献都会被认可,贡献者名单维护在 CONTRIBUTORS.md。
延伸阅读
围绕本文涉及主题,仓库中还有以下文档可继续深入(均以仓库根目录为起点的相对路径):
- 贡献全流程细节:contributor_docs/contributor_guidelines.md
- Steward 职责与评审流程:contributor_docs/steward_guidelines.md
- 单元测试编写规范:contributor_docs/unit_testing.md
- 参考文档(内联 JSDoc)贡献:contributor_docs/contributing_to_the_p5js_reference.md
- 无障碍特性开发:contributor_docs/web_accessibility.md
- 友好错误系统(FES):contributor_docs/friendly_error_system.md 与实现源码 src/friendly_errors/
- WebGL 贡献指南:contributor_docs/webgl_contribution_guide.md
- WebGPU 架构说明:contributor_docs/webgpu.md
- 源码组织与 API 设计原则:src/README.md
- 自定义精简构建:contributor_docs/archive/custom_p5_build.md
结语
从一次createCanvas的调用,到src/app.js中十几个模块的插件式装配,再到 issue 模板、steward 审批与 PR 冲突解决——README 这份文档背后是一套完整而成熟的工程体系。理解它,既能让你更快地开始创作第一个 sketch,也能让你作为贡献者更顺畅地融入这个以"可及性、包容性、社区与快乐"为优先的开源项目。
【免费下载链接】p5.jsp5.js is a client-side JS platform that empowers artists, designers, students, and anyone to learn to code and express themselves creatively on the web. It is based on the core principles of Processing. Looking for p5.js 2.0? http://beta.p5js.org项目地址: https://gitcode.com/GitHub_Trending/p5/p5.js
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考