ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

tsParticles Slim 包版本演进与插件装配机制:从 CHANGELOG 看 @tsparticles/slim 的架构实践

tsParticles Slim 包版本演进与插件装配机制:从 CHANGELOG 看 @tsparticles/slim 的架构实践 tsParticles Slim 包版本演进与插件装配机制从 CHANGELOG 看 tsparticles/slim 的架构实践【免费下载链接】tsparticlestsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website. Ready to use components available for React.js, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Inferno, Solid, Riot and Web Components.项目地址: https://gitcode.com/GitHub_Trending/ts/tsparticles本文以 bundles/slim/CHANGELOG.md 记录的tsparticles/slim包完整版本历史为主体梳理该精简粒子包从 v1 时代一路演进到当前 4.3.3 的关键里程碑引擎拆分、插件外置、加载方式重构并结合 bundles/slim/src/index.ts 等源码解析loadSlim的插件装配流程、checkVersion版本校验与./lazy动态加载入口的实现细节帮助你在项目中正确选型和使用这个轻量级粒子包。1. 文档主体Slim 包的版本历史脉络bundles/slim/CHANGELOG.md 遵循 Conventional Commits 规范逐版本记录了tsparticles/slim包的变更历史。其中大量版本条目标注为 Version bump only for package tsparticles/slim表示该版本只是随 monorepo 联动发版而没有直接改动 slim 包本身真正对 slim 包有实质影响的条目则带有 Features / Bug Fixes 明细。按时间线梳理可以划分出四个清晰的阶段。1.1 v1.x 时代跟随预设包的历史2021 年及以前CHANGELOG 最早的可追溯版本是1.18.02021-07-29此时包名仍写作tsparticles-preset-bubbles。这一阶段的条目多为预设级别的联动更新例如1.18.32021-08-10为 particle 类新增方法commit57434531.19.02021-08-23改进 move path 生成器commit9b67377。这些条目反映了 slim 包尚未独立成型的早期状态——它只是 monorepo 内一个与其他预设联动发版的产物。1.2 v2.x 时代引擎拆分与全面插件化2021-10 至 2023-06这是 slim 包历史上最重要的一段演进CHANGELOG 中有密集的重构记录2.0.0-beta.02021-10-06slim 与 full 包从引擎中拆出。同一版本集中完成了多项 breaking 变更将所有 interactions 外置为独立包commit76c44df将所有 shapes 外置为独立包commit77e4113将点击交互外置为独立包commit466973d将 polygon mask 外置为独立插件commitabdfe37将所有 updaters 外置为独立包commit94bdde6完成 slim 与 full 包相对 engine 的拆分commit268b78c。2.0.0-beta.32021-12-04将 particles.js 兼容层移到独立包commit70404b7即现在的bundles/pjs。2.0.12022-02-15为 slim 和 full 包加入 v1 兼容插件并修复 pjs 插件的若干问题commit411ddce。2.1.42022-07-28为react-particles做准备切换替代包commit49e749e。2.2.22022-08-16使用 pointer events 修复移动端鼠标事件触发两次的问题commit1019fa4关联 issue #4622。2.3.02022-09-11将所有 external interactors 移出引擎commit9d3c325。2.4.02022-10-30所有 easing 曲线移至插件包slim 因easing-quad是默认曲线而依赖它commitd4e4b8f移除所有 canvas 上下文 save/restore 调用commit208722f。2.9.02023-02-10引擎加入版本号commit9406873——这一改动是后来checkVersion机制的前提。2.11.02023-07-12为插件加载加入 refresh 标志防止实例被多次刷新commit9d999d6加入 tree shaking 支持commit86806a6。2.10.02023-06-03 正式发版汇总了这一系列重构的完整清单包括创建并落地 move 插件commit752483a、新增基于 SVG path 的路径插件commit72316ec、在 opacity/size/color 更新器中实现 delay 选项commitdfd4e9f等。从源码结构看正是这一阶段的拆分确立了 slim 包如今“纯聚合器”的定位它自身不含任何粒子绘制逻辑只是把一组经过筛选的插件包注册进引擎。这一点可以直接从 bundles/slim/src/index.ts 得到印证——整个文件几乎全部是import { loadXxx } from tsparticles/xxx语句。1.3 v3.x 时代加载方式重构与颜色体系完善2023-08 至 2025-083.0.0-beta.12023-08-25正确支持 npm exports 选项commitbdfaca8。这正是 bundles/slim/package.json 中exports字段区分.与./lazy两个子路径的由来。3.0.0-beta.42023-09-11为 tsparticles-confetti 选项新增 flat optionscommitdff6c75。3.0.0-beta.52023-12-03新增 emoji shape性能优于 text shapecommit868ee4d。emoji 形状如今仍是 slim 包的内置形状之一。3.0.02023-12-04为 trail 特效加入 fadecommit17750ea。3.0.32023-12-26在有 element id 时使用该 id并修复 emoji 内存管理问题commit1990bbc。3.2.22024-02-20修复循环依赖检测及动态导入相关问题commitb6ed5d3——这类修复与 bundle 的./lazy动态导入路径密切相关。3.3.02024-02-27修复 Chrome 中异步 rAF 函数的问题并减少 vite 构建中的异步方法数量commit2600f6f。3.4.02024-05-12变更了 bundles 的加载方式不再预加载插件commit13b00a0。这是 slim 包加载模型的一次质变直接体现为今天源码中engine.pluginManager.register(callback)的惰性注册模式——插件不是 import 时就加载而是注册一个回调在引擎真正初始化时才执行。3.6.0-beta.0/3.6.02024-10-07修复 out modes 问题commit85ba20f。3.6.02024-11-18修复颜色语法问题commitf3c976f关联 issue #5409。3.7.02024-11-24新增 named color 插件并在引擎中加入 hex colorcommitc4db774同日的3.7.1修复了 canvas 的 resize 问题commite7c816c。3.8.12025-01-31修复 fullScreen 激活时 z-index 样式问题commit5e94ca4关联 issue #5458——对作为背景层使用的 slim 场景尤为关键。1.4 v4.x 时代稳定发版与细节修复2026 年至今v4.0.0 经历了从4.0.0-alpha.02026-01-07自 v3.9.1 分叉到4.0.0-beta.17、再到4.0.0正式版的完整预发布周期4.0.0-alpha.42026-01-21新增 manual particles 插件commit8d73e42将 parallax mover 插件重做为 parallax external 交互插件commit6e2052c。4.0.0-alpha.62026-01-22format 修复commitdd42a71。4.0.0-alpha.182026-02-04修复 slim 的加载顺序问题commit552e360。4.0.0-beta.122026-04-15新增 explode destroy 模式与 destroy external 交互器commite6dfdd8。4.0.02026-05-15正式版发布。4.1.22026-06-01修复 bundle exportscommit429c147。这修复的是 bundles/slim/package.json 中exports映射这类发布期产物问题。后续4.1.3至4.3.3当前版本2026-07-23均为联动发版slim 包本体无直接变更。2. Slim 包的构成依赖清单即能力边界CHANGELOG 反复出现的 Version bump only 条目也提醒我们slim 包的能力边界由它的依赖决定。bundles/slim/package.json 的dependencies字段列出了它聚合的全部插件包可归纳为五类类别包含的包基础包tsparticles/basic内含 circle 形状、move 插件、opacity/size/paint/out-modes 更新器、RGB/Hex/HSL 颜色插件、blend 插件见 bundles/basic/src/index.ts鼠标/外部交互12 个external-attract、external-bounce、external-bubble、external-connect、external-destroy、external-grab、external-parallax、external-pause、external-push、external-remove、external-repulse、external-slow粒子间交互3 个particles-attract、particles-collisions、particles-links形状6 个shape-emoji、shape-image、shape-line、shape-polygon、shape-square、shape-star更新器与插件5 个updater-life、updater-paint、updater-rotate、plugin-easing-quad、plugin-interactivitybundles/slim/README.md 中的 mermaid 依赖图也展示了这一结构slim 指向 basic、engine 与上述交互、插件、形状、更新器分组。值得注意的是easing-quad这一依赖——正如 CHANGELOG 中2.4.0条目所述因为 quad 是默认缓动曲线slim 必须显式依赖它否则默认动画的缓动会缺失。对比之下bundles/all/src/index.ts 导入的插件数量远超 slim包括 gif 形状、emitters、mask、export、infection 等这就是 slim 与 all 两个 bundle 的定位差异slim 面向常用功能 轻体积all 面向全量功能。3. 源码级解析loadSlim 的装配机制理解了版本演进后再看 bundles/slim/src/index.ts 中loadSlim的实现CHANGELOG 中若干条目就有了直接的代码落点。3.1 惰性注册而非预加载export async function loadSlim(engine: Engine): Promisevoid { engine.checkVersion(__VERSION__); await engine.pluginManager.register(async e { // ... 注册全部插件的加载回调 }); }两个关键点engine.checkVersion(__VERSION__)先行校验。对照 engine/src/Core/Engine.tscheckVersion会在引擎版本与插件包版本不一致时直接抛出错误checkVersion(pluginVersion: string): void { if (this.version pluginVersion) { return; } throw new Error( The tsParticles version is different from the loaded plugins version. Engine version: ${this.version}. Plugin version: ${pluginVersion}, ); }引擎版本号是在 CHANGELOG 的2.9.0条目中引入的commit9406873。实际效果是如果tsparticles/engine与tsparticles/slim版本不同步例如锁文件陈旧loadSlim会在第一时间报错而不是产生难以排查的运行时异常。这也是为什么 monorepo 会做全仓统一发版、并产生大量 Version bump only 记录——各包版本必须严格一致。pluginManager.register只登记回调。这与 CHANGELOG3.4.0条目 changed bundles loading method, no more preloading plugins 对应调用loadSlim(engine)时并不会立刻注册所有插件而是向引擎登记一个加载回调在引擎实例真正初始化tsParticles.load(...)触发实例创建时才执行。同时2.11.0条目中的 refresh flagcommit9d999d6保证同一实例不会因多次loadSlim调用而被重复刷新。3.2 并行加载与交互分组的嵌套结构回调内部的加载分为两层Promise.allconst loadInteractivityForSlim async (e: Engine): Promisevoid { await loadInteractivityPlugin(e); // 先加载交互总插件 await Promise.all([ // 再并行加载全部具体交互 loadExternalParallaxInteraction(e), loadExternalAttractInteraction(e), // ... 共 12 个 external 交互 loadParticlesAttractInteraction(e), loadParticlesCollisionsInteraction(e), loadParticlesLinksInteraction(e), ]); }; await Promise.all([ loadBasic(e), // 基础包 loadInteractivityForSlim(e), // 交互组有依赖顺序 loadEasingQuadPlugin(e), // 默认缓动 loadEmojiShape(e), loadImageShape(e), // 6 种形状 loadLineShape(e), loadPolygonShape(e), loadSquareShape(e), loadStarShape(e), loadLifeUpdater(e), // 3 个更新器 loadPaintUpdater(e), loadRotateUpdater(e), ]);交互之所以嵌套而非全部平铺进顶层Promise.all是因为plugin-interactivity是交互基础设施各具体交互插件的注册依赖它先就位——这一串行/并行的分层设计正是 CHANGELOG4.0.0-alpha.18中 fix slim loading ordercommit552e360修复过的历史问题在现阶段的正确形态。3.3 lazy 变体按需动态导入bundles/slim/src/index.lazy.ts 提供了与index.ts签名完全一致的另一个loadSlim区别在于插件模块全部通过import(tsparticles/xxx/lazy)动态导入const [ { loadBasic }, { loadExternalParallaxInteraction }, // ... 共 24 个模块 ] await Promise.all([ import(tsparticles/basic/lazy), import(tsparticles/interaction-external-parallax/lazy), // ... import(tsparticles/updater-rotate/lazy), ]);配合 bundles/slim/package.json 中exports字段的./lazy子路径对应dist/*/index.lazy.js构建工具如 Vite、webpack 的动态 import 拆分可以把 24 个插件包拆成独立 chunk在实际需要时才下载。CHANGELOG 中3.2.2修复循环依赖检测、3.3.0针对 Chrome 异步 rAF 与 vite 构建的优化都发生在这条动态导入链路上。对应到使用侧只需要把导入改为import { loadSlim } from tsparticles/slim/lazy;3.4 浏览器全局注入CDN bundle 场景由 bundles/slim/src/browser.ts 处理它把loadSlim与引擎的tsParticles实例挂到globalThis上使页面脚本可以直接使用loadSlim(tsParticles)无需打包器。package.json中sideEffects白名单声明dist/browser/browser.js与dist/browser/index.js其余产物标记为无副作用这正是2.11.0加入 tree shakingcommit86806a6后的产物结构。4. 实战使用完整继承 README 的用法示例README 给出的快速检查清单是安装tsparticles/engine或用下方 CDN bundle→ 在tsParticles.load(...)之前调用加载函数 → 在配置中启用对应选项。以下示例按框架完整给出。4.1 CDN / 原生 JS / jQueryCDN 版本提供两类文件一个是把所有脚本打进单文件的 bundle 文件引入tsparticles.slim.bundle.min.js后行为与 v1 一致可直接使用全局tsParticles实例这是从 v1 迁移的最省事方式一个是仅包含loadSlim函数的文件需要手动引入所有依赖即 README Included Packages 一节所列的全部包。(async () { await loadSlim(tsParticles); await tsParticles.load({ id: tsparticles, options: {/* options */}, }); })();4.2 React.js / Preact / Inferno三者语法相同。以下示例使用类组件语法Hooks 写法见下。import React from react; import Particles from react-particles; import type { Engine } from tsparticles/engine; import { loadSlim } from tsparticles/slim; export class ParticlesContainer extends PureComponentunknown { // 自定义该组件的 tsParticles 安装方式 async customInit(engine: Engine) { // 将 slim bundle 装入 tsParticles await loadSlim(engine); } render() { const options { /* custom options */ }; return Particles options{options} init{this.customInit} /; } }Hooks / 函数组件写法import React, { useCallback } from react; import Particles from react-particles; import type { Engine } from tsparticles/engine; import { loadSlim } from tsparticles/slim; export function ParticlesContainer(props: unknown) { // 自定义该组件的 tsParticles 安装方式 const customInit useCallback(async (engine: Engine) { // 将 slim bundle 装入 tsParticles await loadSlim(engine); }); const options { /* custom options */ }; return Particles options{options} init{customInit} /; }4.3 Vue2.x 与 3.x 语法相同Particles idtsparticles :particlesInitparticlesInit :optionsoptions /const options { /* custom options */ }; async function particlesInit(engine: Engine) { await loadSlim(engine); }4.4 Angularng-particles [id]id [options]options [particlesInit]particlesInit/ng-particlesconst options {/* custom options */}; async function particlesInit(engine: Engine): void { await loadSlim(engine); }4.5 SvelteParticles idtsparticles options{options} particlesInit{particlesInit} /let options {/* custom options */}; let particlesInit async engine { await loadSlim(engine); };5. 常见陷阱与排查建议README 的 Common pitfalls 一节给出了三条建议结合 CHANGELOG 中的历史修复可以扩展为更具体的排查路径在loadSlim(...)之前调用了tsParticles.load(...)由于插件注册是惰性的load时若插件尚未登记对应的形状或交互不会生效。务必保证加载顺序。启用高级选项前先确认 peer 包slim 只内置 24 个插件包若配置中使用了 gif 形状、emitters、路径等 slim 未包含的功能需要单独引入对应插件包或改用 all bundle。逐组变更选项以隔离回归当出现渲染异常时一次只改一个选项分组可以快速定位问题组。版本不一致报错loadSlim内部checkVersion抛出的 The tsParticles version is different from the loaded plugins version 错误意味着tsparticles/engine与tsparticles/slim版本未对齐应对齐安装版本当前两者均为 4.3.3。全屏背景被页面元素遮盖这正是3.8.1修复的 z-index 问题commit5e94ca4使用 fullScreen 时确保升级到该版本之后。6. 小结bundles/slim/CHANGELOG.md 记录的不是零散的修修补补而是 tsParticles 从单体到插件化 monorepo 的完整演进轨迹2.0.0-beta.0拆分引擎、2.4.0把 easing 外置、3.4.0改为惰性加载、4.x进入稳定维护期。对使用者而言tsparticles/slim的价值在于一个确定性的功能集合——basic 基础能力、12 种鼠标交互、3 种粒子交互、6 种形状和常用更新器——通过loadSlim(engine)一次性装配对维护者而言其 源码 展示了版本校验checkVersion、依赖分层的并行注册与./lazy动态导入这三条工程实践是理解整个 tsParticles 包体系的理想切入点。【免费下载链接】tsparticlestsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website. Ready to use components available for React.js, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Inferno, Solid, Riot and Web Components.项目地址: https://gitcode.com/GitHub_Trending/ts/tsparticles创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表