拓冰建站拓冰建站
首页 / 资讯中心 / 正文

p5.js 友好错误系统(FES)与文档化工作全解析:GSoC 2023 实践复盘与源码级指南

p5.js 友好错误系统FES与文档化工作全解析GSoC 2023 实践复盘与源码级指南【免费下载链接】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 开源仓库中 Ayush Shankarayush23dash在 Google Summer of CodeGSoC2023 期间的项目总结文档为核心系统梳理其在 友好错误系统Friendly Error SystemFES 上的三项核心工作FES 与 p5.js 解耦的探索、FES 代码库的调研与重构以及印地语Hindii18n 翻译与贡献文档的完善。结合仓库当前源码你将理解 FES 的模块划分、核心函数调用链、浏览器错误监控原理以及翻译体系的工作机制并掌握在 p5.js 中定位与排查 FES 相关问题的实战方法。一、项目背景GSoC 2023 的 FES 主题该项目由 Ayush Shankar 完成导师为 Alice Chungalmchung与 Nick Briznbriz。其最初的提案核心是将 FES 从 p5.js 中解耦Decoupling即把错误提示机制抽离为独立的 npm 包使 p5.js 主仓库更轻量、让 FES 可以独立迭代与维护。初始提案设想的分步计划包括按官方指引创建并初始化一个新的 npm 包将既有 FES 在新包中复刻覆盖三类场景浏览器抛出错误时用户代码调用 p5.js API 时其他用户能从帮助信息中受益的自定义场景FES 代码全部取自src/core/friendly_errors国际化i18n则复用translations/目录下的翻译文件在新包搭建完成后让本地 p5.js 仓库成功调用新包调用成功后在新 git 分支上移除 p5.js 仓库中所有 FES 引用仅用于测试验证可行性后再继续开发。需要说明的是当前仓库中的 FES 已位于 src/friendly_errors而非文档写作时提到的src/core/friendly_errors目录结构调整正体现了后续持续重构的成果。二、解耦初期的探索与关键经验随着编码周期推进作者与两位导师共同调整了优先级。但在解耦探索的初期几周已经积累了不少可供复用的实战经验创建独立目录并逐个导入 FES 文件将 FES 相关文件从 p5.js 主仓库中逐一搬运到新目录修复npm test失败引入browserify配置后测试恢复通过配置如下browserify: { transform: [ [ babelify, { presets: [babel/preset-env] } ] ] }修正新 FES 文件内部的 import 路径并在主仓库app.js中导入新 FES 文件测试结果除fes_core.js外其余 FES 文件均通过测试。后续的解耦方案是直接将 FES 打包发布为 npm 包并在package.json中引用但这需要处理 FES 对 p5.js 的外部依赖包括import { translator } from ../internationalization; import * as constants from ../constants; const dataDoc require(../../../docs/parameterData.json); import main;这些依赖国际化翻译器、常量表、参数文档数据正是 FES 与 p5.js 深度耦合的体现也是解耦的最大障碍。最终项目方向调整为重构既有代码库、解决既有 open issue、改进文档并为 FES 增加印地语翻译。三、FES 模块源码结构当前仓库实况要在 p5.js 中定位 FES 相关代码当前仓库的核心目录是 src/friendly_errors其入口 index.js 通过p5.registerAddon依次注册四个模块import fesCore from ./fes_core; import validateParams from ./param_validator.js; import sketchVerifier from ./sketch_verifier.js; import fes from ./fes; export default function (p5) { p5.registerAddon(fes); p5.registerAddon(fesCore); p5.registerAddon(validateParams); p5.registerAddon(sketchVerifier); }各模块职责如下文件职责fes.js消息输出层基于tl-utilTL实现多语言模板字符串提供FES.log/FES.warn/FES.error等方法支持带样式的控制台消息前缀为 p5.js says:fes_core.js核心逻辑浏览器错误监控、拼写纠错Levenshtein 距离、顶层误用检测、_friendlyError通用入口param_validator.js参数校验基于 Zod 与 docs/parameterData.json 生成校验 Schema检测参数过少/过多/类型错误sketch_verifier.js草图静态检查用 acorn 解析用户代码检测用户变量/函数与 p5 常量、全局函数的命名冲突browser_errors.js浏览器错误查找表按错误类型ReferenceError / SyntaxError / TypeError与浏览器差异建立正则模板stacktrace.js栈解析工具改编自 stacktracejs提取用户代码出错位置3.1 参数校验与文档数据的联动param_validator.js 是 FES 与文档体系结合最紧密的模块它读取 docs/parameterData.json 中为每个 p5 函数生成的重载签名数据如background的[p5.Color]、[Number,Number,Number,Number?]再基于 Zod 在运行时构造校验 Schema。内置的基础 Schema 覆盖Any、Array、Boolean、Function、Integer、Number、Object、String并通过instanceof校验AudioNode、HTMLCanvasElement、KeyboardEvent、MouseEvent、RegExp等 Web API 对象类型。参数位置以 first / second / third... 这样的序数词呈现与 fes.js 中的ordinals及paramTooFew、paramTooMany、paramType等翻译键配合生成类似 Expected at least 1 argument, but received fewer in background(). 的友好提示。3.2 草图静态检查sketch_verifier.js 在lifecycles.presetup阶段触发除非p5.disableFriendlyErrors或p5.disableSketchChecker为真它取页面最后一个script作为用户代码用 acorn 解析出用户定义的变量与函数setup、draw、preload等事件回调在ignoreFunction列表中豁免再与 p5 常量表src/core/constants.js及p5.prototype上的公开成员比对检测 redeclare 类命名冲突。四、FES 核心函数调用关系调研文档核心章节作者在项目期间的一项核心工作是逐一翻阅 FES 的每个文件与函数建立函数 → 使用位置的调用清单与流程图这一调研成果对理解 FES 全局影响面极具价值现结合当前仓库源码核对如下。4.1 validate_params参数校验函数使用位置ValidationError()test_reference.html、test.html、chai_helpers.js、describe.js、outputs.js、creating_reading.js、p5.Color.js、2d_primitives.js、attributes.js、curves.js、environment.js、error_helpers.js、transform.js、vertex.js、downloading.js、pixels.js、files.js、saveTable.js、trigonometry.js、3d_primitives.js、interaction.js、normal.js等_clearValidateParamsCache()error_helpers.js_getValidateParamsArgTree()error_helpers.js_validateParameters()覆盖几乎所有 p5 API 模块describe.js、outputs.js、creating_reading.js、setting.js、environment.js、rendering.js、transform.js、2d_primitives.js、attributes.js、curves.js、vertex.js、p5.TypedDict.js、dom.js、acceleration.js、keyboard.js、image.js、loading_displaying.js、pixels.js、files.js、calculation.js、random.js、trigonometry.js、string_functions.js、3d_primitives.js、interaction.js、light.js、loading.js、material.js、p5.Camera.js、p5.FrameBuffer.js、error_helpers.js从当前仓库看_validateParameters的调用点遍布 src/color、src/shape、src/math、src/image、src/io、src/dom、src/webgl 等几乎全部功能模块这印证了参数校验是 FES 中覆盖最广、与每个 p5 API 都直接相关的部分。4.2 stacktrace栈解析函数使用位置getErrorStackParser()validate_params.jsFES 内部、fes_core.jsFES 内部4.3 file_errors文件加载错误函数使用位置_friendlyFileLoadError()fes_core.jsFES 内部、loading_displaying.js、files.js、loading.js、downloading.js、loadBytes.js、loadImage.js、loadJSON.js、loadModel.js、loadShader.js、loadStrings.js、loadTable.js、loadXML.js、saveTable.js、loadFont.js文件加载错误处理覆盖了 p5.js 的全部load*系列 API是新手最常遇到的一类错误。4.4 fes_core核心函数使用位置_friendlyError()main.js、file_errors.jsFES 内部、sketch_reader.jsFES 内部、validate_params.jsFES 内部、vertex.js、p5.Vector.js、loading.js、p5.Matrix.js、p5.RendererGL.js、p5.Shader.js、error_helpers.js_friendlyAutoPlayError()dom.jscheckForUserDefinedFunctions()main.jsfesErrorMonitor()browser_errors.js、validate_params.jsFES 内部、error_helpers.jshelpForMisusedAtTopLevelCode()error_helpers.js4.5 浏览器错误监控原理fes_core.js 在非压缩构建下通过window.addEventListener注册三类全局监听window.addEventListener(load, checkForUserDefinedFunctions, false); window.addEventListener(error, fesErrorMonitor, false); window.addEventListener(unhandledrejection, fesErrorMonitor, false);fesErrorMonitor的处理流程为从Error/ErrorEvent/PromiseRejectionEvent中提取错误对象用 stacktrace 解析器解析错误栈过滤 p5 内部错误isInternal直接返回在 browser_errors.js 的errorTable中按错误消息正则匹配模板占位符{{}}匹配标识符、{{.}}匹配任意内容、{}匹配非捕获标识符按错误类型分发处理SyntaxError区分 INVALIDTOKEN非法字符、UNEXPECTEDTOKEN意外标记、REDECLAREDVARIABLE变量重复声明、MISSINGINITIALIZERconst 未初始化、BADRETURNORYIELDreturn 位置错误ReferenceErrorNOTDEFINED未定义先走handleMisspelling拼写纠错与helpForMisusedAtTopLevelCode顶层误用检测CANNOTACCESS初始化前访问提示检查声明顺序TypeErrorNOTFUNC不是函数、READNULL读 null 属性、READUDEFINED读 undefined 属性、CONSTASSIGN给 const 重新赋值。其中拼写纠错采用Levenshtein 距离Wagner–Fischer 算法阈值EDIT_DIST_THRESHOLD 2并预先按名称长度降序排序 p5 公共符号确保命中更具体的符号例如优先提示HALF_PI而非PI。若用户代码在setup()/draw()之外误用 p5 变量或函数如直接使用PI做全局运算会收到建议将其移入setup()的提示——这正是 issue #1121 所对应的helpForMisusedAtTopLevelCode逻辑。五、印地语翻译FES 的 i18n 扩展作者在暑期承担的另一项任务是为 FES 增加印地语Hindi翻译。翻译内容以 JSON 形式存放于 translations/hi/translation.json其fes键下包含autoplay、checkUserDefinedFns、fileLoadError等全部 FES 消息模板例如自动播放错误消息的印地语版本autoplay: जिस मीडिया को चलाने की कोशिश की गई ({{src}} के साथ) उसे इस ब्राउज़र द्वारा अनुमति नहीं दी गई, संभवतः ब्राउज़र की स्वत: प्ले नीति के कारण।\n\n अधिक जानकारी: {{url}}当前 translations/index.js 中维护的语言列表为[en, es, ko, zh, hi, ja]印地语已作为正式语言纳入。运行时层面fes.js 通过navigator.language选择语言并支持从本地localStorage读取缓存的翻译、或fetch(./fes-zh.json)这类按需加载的翻译文件翻译键值中的占位符如{{src}}、{{url}}由tl-util模板引擎在输出时替换为实际内容。六、文档化与流程改进除编码工作外作者还完善了 p5.js 的 README 与贡献者指南降低了新手在本机搭建运行环境的门槛并调研了使用 Mermaid 生成流程图的方法用于直观呈现 FES 函数的调用关系。此前的流程图sketchboard 链接与函数清单相结合构成了 FES 的地图帮助后续贡献者快速定位某个 FES 函数在哪里被调用。在贡献流程上作者创建/评论了若干 issue并提交/评审了多份 PR其中已合并的包括修复 FES 既有 issue创建于 #6181延续于 #6202评审翻译类 PR#6210、#5591合并的代码 PR#6221、#6260、#6272以及 #6335 等。仓库为只读示例上述 issue/PR 编号源自原文档记录仅供追溯 GSoC 2023 的工作脉络当前仓库代码已在此基础上持续演进。七、项目现状与后续方向作者在项目收尾阶段正在为 FES 目录编写 README并绘制引用 FES 函数及其在 p5.js 各处使用情况的流程图目标是让贡献者在阅读 FES 代码的第一时间就能理解全貌。文档同时指出了 FES 的后续工作方向重构 FES 目录内文件降低初读复杂度——当前 src/friendly_errors 的代码对首次接触的贡献者仍有理解门槛持续改进 FES 文档持续解决 FES 相关 issue长期目标仍是 FES 解耦将其抽为独立包。当前仓库中 FES 已包含disableFriendlyErrors开关见 src/core/main.js 的p5.disableFriendlyErrors true;说明用户可在不需要友好提示时关闭该功能以提升性能压缩构建IS_MINIFIED下_friendlyError等函数也会被置为空实现。八、给未来贡献者的实操建议基于本文梳理的源码结构参与 FES 相关工作的推荐路径如下快速定位入口从 src/friendly_errors/index.js 进入按需阅读 fes_core.js监控、param_validator.js参数校验、sketch_verifier.js静态检查复现与调试通过npm install安装依赖后运行npm testvitest执行单元测试npm run dev启动 preview 开发服务器进行浏览器端验证FES 相关手工测试样例位于 test/manual-test-examples/fes覆盖参数过多/过少、类型错误、拼写错误、顶层误用等场景新增或修改提示消息在 fes.js 中维护英文模板并在 translations 下补充对应语言的翻译 JSON扩展错误识别修改 browser_errors.js 的errorTable与 fes_core.js 的fesErrorMonitor分发逻辑验证改动对照 test/unit 与 test/visual 中的测试确保既有行为不回归。结语GSoC 2023 的这份项目总结既是 FES 解耦探索的第一手记录也沉淀了一份难得的FES 函数调用地图它让后续贡献者得以按图索骥从_friendlyError、_validateParameters、_friendlyFileLoadError、fesErrorMonitor等核心函数出发快速理解友好错误系统如何贯穿 p5.js 的每一个 API 调用与每一次浏览器异常。结合当前仓库源码FES 已演进为覆盖参数校验、文件加载错误、浏览器错误监控、草图静态检查、多语言输出的一体化错误提示体系而解耦为独立包仍作为长期目标留待社区继续推进。【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门