恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
lit-virtualizer 开发指南:从源码构建、测试到基准与发布的完整贡献流程
首页
资讯中心
/
lit-virtualizer 开发指南:从源码构建、测试到基准与发布的完整贡献流程
lit-virtualizer 开发指南:从源码构建、测试到基准与发布的完整贡献流程
发布时间:2026/9/13 15:07:07
lit-virtualizer 开发指南从源码构建、测试到基准与发布的完整贡献流程【免费下载链接】litLit is a simple library for building fast, lightweight web components.项目地址: https://gitcode.com/GitHub_Trending/li/lit本篇指南围绕 Lit 仓库中lit-labs/virtualizer基于 Lit 的视口级虚拟滚动库的 CONTRIBUTING.md 展开系统讲解该包的源码组织、构建流程、单元/截图测试、性能基准Tachometer以及 NPM 发布策略。读完本文你将掌握如何为 lit-virtualizer 新增功能、编写测试、生成基准截图、运行基准并理解其发布产物边界可直接按步骤在本地复现整套贡献流程。一、仓库结构与源码布局lit-virtualizer 的包目录位于 packages/labs/virtualizer核心源码集中在src/下。与多数纯工具库不同这个包的主入口除了自定义元素还同时暴露指令与控制器 API因此在动手改代码前先厘清目录职责非常关键。src 源码组织从当前仓库的实际结构看src/主要包含以下模块src/LitVirtualizer.tslit-virtualizer自定义元素的实现通过 src/lit-virtualizer.ts 中的customElements.define(lit-virtualizer, LitVirtualizer)注册到全局并声明了HTMLElementTagNameMap以提供类型提示src/Virtualizer.ts 与 src/ScrollerController.ts虚拟化核心引擎与滚动控制器src/virtualize.tsvirtualize指令把宿主元素变为虚拟化容器src/events.tsrangeChanged、visibilityChanged等事件定义src/layouts布局系统包括flow默认流式布局、grid网格布局、masonry瀑布流、flexWrap以及共享的 BaseLayout.ts、GridBaseLayout.ts、SizeCache.ts 等基础设施src/polyfillLoaders/ResizeObserver.ts 与 src/polyfills/resize-observer-polyfillResizeObserver特性检测加载器与内置 polyfillsrc/supportresize-observer-errors.ts处理 ResizeObserver loop limit exceeded 报错与method-interception.ts等辅助工具。需要说明的是当前仓库的源码已采用 TypeScript 编写对应src/**/*.ts而非贡献指南中记载的纯 JS ES modules编译产物才是面向浏览器与 npm 的 ES modules这一点在构建一节会详细展开。uni-virtualizer 的历史渊源贡献指南记载历史上src/lib/uni-virtualizer存放着从父级 monorepo 的 uni-virtual 包复制而来的 uni-virtualizer 源码并计划未来将其独立发布为 npm 包届时 lit-virtualizer 只需直接依赖uni-virtualizer包而不再把源码内联到lib中。从当前仓库的目录列表看该内联目录已不存在虚拟化核心已重构为上文提到的Virtualizer.ts、ScrollerController.ts与layouts/等模块——这正体现了把虚拟化能力下沉为独立包这一设计方向的演进。阅读代码时若看到与旧文档不一致的路径以 src 的实际结构为准。二、构建流程与 ES Modules 发布策略npm run build 做了什么在包目录下执行npm run build当前版本通过 package.json 中的 wireit 配置编排构建它聚合了两个子任务build:ts运行tsc --build --pretty将src/**/*.ts编译为 ESM 格式的.js与.d.ts类型声明输出到包根目录layouts/、events.js、lit-virtualizer.js、Virtualizer.js、LitVirtualizer.js、ScrollerController.js、virtualize.js、polyfillLoaders/、support/等该任务还依赖internal-scripts:build与lit:buildbuild:copy-polyfill执行mkdir -p polyfills/resize-observer-polyfill cp src/polyfills/resize-observer-polyfill/ResizeObserver.js polyfills/resize-observer-polyfill/ResizeObserver.js把内置的ResizeObserverpolyfill 同步到构建产物目录。也就是说构建产物的源被组织为编译输出的 TypeScript 结果 原样拷贝的 polyfill 文件二者共同构成可发布的包内容。为什么以 ES modules 发布该包与 Lit 本身一致以 ES modules 形式发布把模块解析module resolution的责任留给使用者。这样带来的自由度包括使用者可以自行决定打包与转译方式是否打包、如何分包便于实现代码分割code splitting按需加载虚拟化逻辑保持bare specifier形式的依赖引用交由构建链或开发服务器解析。代价是在浏览器中直接使用裸模块标识符需要开发服务器具备bare specifier解析能力这一点与 Lit 官方Tools and Workflows的指引一致。如果你打算给该包提交修改请确保产物保持 ESM 形态不要引入依赖 Node 特定模块机制的代码。三、测试体系lit-virtualizer 的测试分为两层基于 Web Test Runner 的集成/单元测试以及基于 Puppeteer 的截图回归测试。两者的入口与新增方式不同下面分别说明。集成测试与单元测试运行npm run test即执行包内所有单元与集成测试。当前仓库中该命令经由 wireit 调度实际调用 packages/tests/run-web-tests.js 配合 web-test-runner.config.js 运行测试框架为Web Test Runner Mocha Chai并额外执行一次 ES5 语法兼容性检查tsc --target ES5 --noEmit --downlevelIteration。测试用例位于 src/test覆盖了大量真实场景例如scrolling.test.ts滚动行为element-and-directive-parity.test.tslit-virtualizer元素与virtualize指令的行为一致性layout-complete.test.ts布局完成时机hidden.test.ts、item-changes.test.ts、key-function.test.ts 等边界场景src/test/layouts/flow.test.tsflow布局的专项测试src/test/supportResizeObserver错误处理与method-interception的单元测试。新增单元/集成测试时把测试文件放入src/test下对应的场景目录即可被自动收集。若你在测试中遇到 ResizeObserver loop limit exceeded 报错导致用例失败可参考 src/support/resize-observer-errors.ts 提供的三个工具函数setupIgnoreWindowResizeObserverLoopErrors、ignoreWindowResizeObserverLoopErrors、preventResizeObserverLoopErrorEventDefaults在测试夹具中屏蔽该良性错误。截图回归测试截图测试用于捕获虚拟化渲染与滚动行为的像素级回归。测试用例页面位于 test/screenshot/cases每个子目录如lit-virtual、scroll对应一个独立测试页。由于 lit-virtualizer 使用 ES modules每个页面在截图测试前会先经过Rollup构建见 test/screenshot/rollup.config.js它读取cases/下每个目录的main.js以cases/name/main.js为入口、输出 ESM 格式的cases/name/build产物。以 cases/lit-virtual/index.html 为例页面通过script typemodule srcbuild/main.js引用构建产物而 main.js 负责拉取共享的contacts.json数据、创建lit-virtualizer元素并注入items与renderItem。运行截图测试npm run test:screenshot该命令等价于cd test/screenshot rollup -c mocha screenshot.js由Puppeteer Mocha Chai驱动。测试逻辑位于 screenshot.js每个用例启动一个 Puppeteer 浏览器访问对应用例页截取actual.case.png再与仓库中保存的expected.case.png基准图用pixelmatch阈值 0.1逐像素比对要求差异像素数为 0 才算通过。新增一个截图测试用例按贡献指南的步骤新增截图测试的完整流程如下复用现有页面先判断 cases 下是否已有满足需求的页面设置能复用就复用新建页面目录若没有在test/screenshot/cases/下新建目录放入index.html与main.js搭建测试页。main.js会在构建阶段被自动打包因此在index.html中引用构建产物当前仓库中实际产物名为build/main.js以实际构建输出为准注册用例在 test/screenshot/screenshot.js 中新增describe/it测试用例设置页面跳转地址、等待选择器与滚动动作生成基准图为便于只生成新页面的基准截图可以临时在describe上加.only例如describe.only(lit-virtual, ...)再运行npm run generate-screenshots完成后务必移除.only。当前仓库已含两组基准图可作为参考lit-virtual 用例基准图初始渲染 800x600对应初始渲染出列表项的期望画面scroll 用例滚动定位基准图滚动到指定位置 800x600对应滚动到指定索引与位置的期望画面。截图用例本身也在验证两个关键行为一是列表能渲染出足够填满视口的子元素displays items二是滚动后只保留视口附近的元素并正确重排scrollsscroll用例还覆盖了?index100与?index100positionend两种 URL 参数驱动的定位场景与scrollToIndexAPI 的行为相互印证。重新生成基准截图如果对 lit-virtualizer 的改动有意改变了期望画面例如调整了间距、布局或滚动行为需要重新生成基准图npm run generate-screenshots即cd test/screenshot rollup -c mocha screenshot.js --generate-screenshots此时所有用例写出的图片命名为expected.case.png并覆盖旧基准。注意只有确定新画面是预期行为时才应重新生成无意的渲染回归应当修复代码而不是刷新基准。四、性能基准测试Tachometer运行基准在包目录下执行npm run bench即运行基础的滚动指令基准。基准页位于 test/benchmarks/basic.html它构造一个包含 1000 个数字项的数组用virtualize指令配合FlowLayout渲染到页面中。当前仓库中该命令实际固定为tach --root../../.. --browserchrome-headless test/benchmarks/basic.html --measurefcp即使用TachometerPolymer 团队的基准工具仓库依赖中声明为tachometer在 headless Chrome 中测量FCPFirst Contentful Paint首次内容绘制。另外package.json 还提供了npm run bench:scroll它通过 test/benchmarks/scrollingBenchmarks.json 配置并强制清理 npm 安装运行滚动类基准。贡献指南还记载了通过环境变量选择基准的用法BENCHuseShadowDOM npm run bench这是文档中描述的扩展方式在查看基准相关脚本时以 package.json 中当前实际定义的bench/bench:scroll/bench:debug脚本为准。基准指标与改进方向贡献指南明确指出目前用FCP 衡量渲染完成时间并不理想因为它包含了与虚拟化无关的准备开销例如生成待渲染列表项列表本身所花的时间。因此理想的做法是在 lit-virtualizer 的生命周期中找到能判定异步渲染/布局循环即将完成的那个时间点再借助 Tachometer 的start与stop回调获得更贴近真实渲染成本的指标。如果你关注性能优化或想改进基准的准确性可以围绕 src/Virtualizer.ts 与 src/ScrollerController.ts 中的异步渲染/布局循环调度寻找可暴露为渲染完成信号的钩子并结合 layout-complete.test.ts 对布局完成语义的既有定义来设计该时间点。五、发布到 NPM该包作为Lit Labs实验性包发布当前 npm 包名为lit-labs/virtualizer见 package.json 的name字段因此使用npm i lit-labs/virtualizer安装。需要留意的是贡献指南中记载的包名lit-virtualizer属于历史版本命名两者 API 同源但以当前发布名为准同时它处于 late prerelease 阶段1.0 前可能仍有预计是机械性、易迁移的破坏性变更。发布产物边界发布时只发布入口文件与运行时代码目录不包括src/源码与测试。当前仓库通过package.json的files字段精确圈定发布内容根级入口lit-virtualizer.js、virtualize.js、Virtualizer.js、LitVirtualizer.js、ScrollerController.js、events.js含对应.d.ts与.map布局产物layouts/**含shared/子目录polyfill 相关polyfillLoaders/**与polyfills/resize-observer-polyfill/ResizeObserver.js辅助模块support/**。同时exports字段把这些子路径如./layouts/grid.js、./virtualize.js、./events.js、./polyfillLoaders/ResizeObserver.js、./support/resize-observer-errors.js显式暴露为可导入入口并为每个入口提供types声明。也就是说读者既可以从主入口import lit-labs/virtualizer使用lit-virtualizer元素也可以按子路径引入virtualize指令、具体布局或错误处理工具。结语贡献 lit-virtualizer 的完整闭环是理解 src 的模块分工 → 用npm run build产出 ESM 构建 → 用npm run test与npm run test:screenshot必要时npm run generate-screenshots保障行为与像素级回归 → 用npm run bench与 Tachometer 度量渲染性能 → 最后由维护者按 package.json 的files白名单发布到 npm。本文覆盖的每一步都能在当前仓库中找到对应源码或配置作为依据是上手该包开发与贡献的可靠路线图。【免费下载链接】litLit is a simple library for building fast, lightweight web components.项目地址: https://gitcode.com/GitHub_Trending/li/lit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考