{"_id":"speedy-jsx","_rev":"32-c474c05a9ce328eb1b8ea8d80e10a545","name":"speedy-jsx","dist-tags":{"latest":"1.1.26"},"versions":{"1.0.0":{"name":"speedy-jsx","version":"1.0.0","keywords":["speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.0.0","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"2c509c26038821f4e9753a2b9612fbca6cdc34b6","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.0.0.tgz","fileCount":5,"integrity":"sha512-NvY3tv+ilJYdfVuKJNxsXGk1XXg7gjqtyF29XqyDZBcr+q1QNoL1OsgW5ys61vFWY9gp4j/LB5bmmBCxa9phuA==","signatures":[{"sig":"MEUCIQDDoC/wPV2TWAVBLccACZDzvm8p/eM5wW1zyld0HpqbegIgRjY1ZPzYXdoAJpG6Ei1TY0Pv+gSMw+P7bCmHYBD/Zi0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152631},"main":"./dist/index.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.0.0_1747184241878_0.8286597928567612","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"speedy-jsx","version":"1.0.1","keywords":["speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.0.1","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"db9f0d4c37f0c60d17d4ae8c8e516fdf56c2f8d8","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.0.1.tgz","fileCount":5,"integrity":"sha512-qMTH/W9LOADQ2hqzqKLF4xEwPGIT466mpLruudokMd+Sh8l/NPUnOOxMivMxIhtJ4StpJZFQO2NfGZqX4h8VXQ==","signatures":[{"sig":"MEUCIBPR88PfAvp+y2Blq8kNAKC71GTIYj+ySTsO8wmqDTSjAiEAz/tEGGS2p/CyA1tpBnwKIpDwCjPSm7czck402SGBEfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152091},"main":"./dist/index.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.0.1_1747184701879_0.9193076336210741","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"speedy-jsx","version":"1.0.2","keywords":["speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.0.2","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"0ebbf83079addd55fcb5f76982547ffbe37e0eac","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.0.2.tgz","fileCount":5,"integrity":"sha512-WNpgMQ8PEbEmiGVqCy+0HfQLOli3yktUBk/FwYzei9lme62ScKV+Ipfpxz/dv7Q3WbFki+a00NU9e32b/dVPTg==","signatures":[{"sig":"MEYCIQC9EROI9/WVFnCJq+JEwe6SudYFMMLVc32iWfzDPvh6LgIhAMPFt76kSW9rUgM/MlW8h+D9/fdWjymX5CaLEPcG8yPW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152155},"main":"./dist/index.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.0.2_1747188247220_0.39637448819393706","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"speedy-jsx","version":"1.0.3","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.0.3","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"9cf0e6d8cdba277092c63c6bcf25b4dbe0c4886b","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.0.3.tgz","fileCount":5,"integrity":"sha512-fzYZ3HH9TTLjeqnf5GZRZo3T2+/Ij0VswJeMBQJJlVAuykiDsriCvMNKSR+kSQv7hHLPvAa/h0kEcGrDcZ5Kmw==","signatures":[{"sig":"MEUCIQCQyvtG+OWRFnWUudh316YJh5TYX01/88tFmZR5VxDOpgIgIDKKy+rhH7APQHEvDbaofj0xlpEtE5zcZ8GxMp97iXY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152455},"main":"./dist/index.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.0.3_1747191769996_0.5634409911045364","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"speedy-jsx","version":"1.0.4","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.0.4","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"e993a9832649b9a178e08576026206594c5e1571","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.0.4.tgz","fileCount":5,"integrity":"sha512-OWEMZiG2p00AoDbq0NE5eNH5xSerrvz9pMIGTByCjnGeJM11yDhdscyqSNkSzOPtqO8ARpUYjlWQiVTJqgah8w==","signatures":[{"sig":"MEYCIQCTo/w7/Qj+iyzS79DdMTQLsF/fIN7y7GzNjF1i4ek2VAIhANVJw/X/F5npNJyjTxj8m7bt+++tfeTK9LVJ0F0lNi0J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152461},"main":"./dist/index.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.0.4_1747203319710_0.7317330872416434","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"speedy-jsx","version":"1.1.4","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.4","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"eb816fe0b93c0e15d98672e58cf154aa8468f0ee","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.4.tgz","fileCount":5,"integrity":"sha512-Stm8S/xZ+9RPrxfMUm1husdwbViCDwKwbCwtUGLsXlIT3dzxPfG7DLFVenO8mEhTyFK7JSjH+fOfcnAtj6KoCA==","signatures":[{"sig":"MEUCIFNi6oREbvkF8LQe4F4iCpNuglupE1KaQvKZbOMdz0UkAiEA7rgVqjPcXhjfavjtgwdWpj1IZLqVukhlIwe2dSRusWM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136487},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.4_1747215494959_0.4409137580326765","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"speedy-jsx","version":"1.1.0","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.0","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"016a4828dc5b7183c7ef2172588143ec0e365cad","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.0.tgz","fileCount":5,"integrity":"sha512-TWEh5B3ptZmt9HgfAdck5toMzlfjnQrjBCUxNQxCBCYtRD3dNBeNm2J7hlXYAxBMf7l9+xpR8tzgnJDgZhP0Cw==","signatures":[{"sig":"MEQCIDpNKc04YVo9gS93DCAk+tweI/GcnaYGk1sVJe5XhLPuAiAUhqst/q/xt8MSL7UwbaFtdmIfOQcE9bEINyv5O5iTaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136493},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.0_1747215548364_0.31058267812689366","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"speedy-jsx","version":"1.1.1","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.1","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"c6e68cd6a64c19fd71bcb00da1c83b6e6a479957","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.1.tgz","fileCount":6,"integrity":"sha512-t0+/mhSosEM+B7e4IzY8P4zKOgLKBcq9Gl3/jsw4GnHCqX7Q5fPt4n4+xUa04KmV1OSp8jQ7JO2f1WMM5I0dMQ==","signatures":[{"sig":"MEUCICM5aH6RlpCO+rOpOq4qmawZc0ozEwMdF8T90oyWePzHAiEA4RWULLS2YipxpeybltieFRZPQgjpN+iYu4CIb2SAKWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186398},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.1_1747216524980_0.7502058160668426","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"speedy-jsx","version":"1.1.2","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.2","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"d9ea83ab22a372e9e3b353ff9045c3c40f970d81","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.2.tgz","fileCount":6,"integrity":"sha512-VhpAEJsJHYTFH/+y+xlzFmU8OAyq5JMTurlybxJhMvf+7aV0rmWMeRJk9ICThbVaZfEhLZ7GxwC/Gq1ANDsWEQ==","signatures":[{"sig":"MEUCIEKBQLQcjbyrM8w6Zx3kB4EerUfmygRq5EjyuKsSVKCrAiEAyY9rWKMWjn9X7pokc2Ap/efy/Sj/+Dri4WvkKOkuD1s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187098},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.2_1747544171162_0.9425949180386493","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"speedy-jsx","version":"1.1.3","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.3","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"0ae4c3eb7216bbd3dd3d00b975246a233730868f","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.3.tgz","fileCount":6,"integrity":"sha512-apcsumPULH0yeUCsiBAyuQTwswv5K4p+3sOsfq4AiMB3SWJRU3D2/ipB16JVlUkfabolyL9HgR4X1SSd8WQ87g==","signatures":[{"sig":"MEUCICLVBhOELVyF9kLzfMs1Bqy3a7wCoLHqKzp+LtblPF1SAiEA2XtkJdy8jLeS6OIbWQUdfshn7lSpoWQFwlA/rXOxEEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187102},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.3_1747755663787_0.5330569337887143","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"speedy-jsx","version":"1.1.5","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.5","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"50bc0ec2f246c09ea5f9febfc474a7a2a6e16ba2","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.5.tgz","fileCount":6,"integrity":"sha512-ylagqcqB8aDln49bn2NieOOSm5pVg6h3glzxVKMwyFRsZtJSbdTgQ5DfEv3HwwYpIQOZIzs+kvGbNRNUQbzRpg==","signatures":[{"sig":"MEYCIQDaVlH/sUErAo1WJMgQTt09hqFofMM/SwaviwQ8arMToQIhANHjPIcs4BXsvRq0O7YntvM/sPM3EfWJmfIkPwlSxMPY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191016},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.5_1747756726185_0.6507113726949503","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"speedy-jsx","version":"1.1.6","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.6","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"4dd6029e685b1fcec03f343c47a18a545bf73573","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.6.tgz","fileCount":6,"integrity":"sha512-qO2kD50spsjzWm04g8wA81AQkARW7Eqsnj4yNXmwjI29GwKOdn5L2/dddhp70WbzBdIR4QsltAIPTnVYCSTosw==","signatures":[{"sig":"MEQCIDLbLBjn6carg4XLvxUTYMIMbBw7IGRs9+Rlk+vUGiV1AiBUjuh8ScD1L1T+FSPfZMD6TFsORtcbXhFmIcPL5nQtbw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191282},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.6_1747790253883_0.8486320776119638","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"speedy-jsx","version":"1.1.7","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.7","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"fa28f6d4326d990f2b762d56a423a3032e554ae1","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.7.tgz","fileCount":6,"integrity":"sha512-HwFlE1Il3HlfmMcp/70ykKbaSJrzb9lIE7hFBo0+AD63Yoxcn1Xl2rMz9ZdDMNgkZgxGia9TUrspvCuDU3MSFg==","signatures":[{"sig":"MEYCIQDKLUE8M4Zz7qig5T0BOVx+avkN9A6gL1aXAobA9x+wNwIhAOUmNXTdfNA/ZuoxLPWS/w10Ni65vD3LfmOoP2wuwupg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232537},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.7_1747818321633_0.6478631069573182","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"speedy-jsx","version":"1.1.8","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.8","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"86d0b7373be8fbc9a16001242454ce7592b9623d","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.8.tgz","fileCount":6,"integrity":"sha512-8Hd4eWOLRnDEI7/VJs0LPkmfxbxtmjDEKUvDIY4JNk4K9q0eWxnDRs3t44r2VQdn643XoBCy93BcrfibNjs+nQ==","signatures":[{"sig":"MEUCIC0ESk/dri10i9V6EAemwyaAToBEPGQu2fL7tAYTv3IsAiEApQsOasXecH5Zx7HZ/Ouv6FUISZT3b/LVzLZWsIfx/WE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232591},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.8_1747822168858_0.765396214692941","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"speedy-jsx","version":"1.1.9","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.9","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"32c74f26cbff08cea3339001ba941712734903d1","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.9.tgz","fileCount":6,"integrity":"sha512-dnhpf6UbY7az+tQpQsWDNGvob3n8tqJCQMT+AkdKeTImm2T9wZaBj0DQXgHb7cOkHQA99Kb47k8mQOCedrKKrw==","signatures":[{"sig":"MEUCIQD9rWpkGWQIOhnTjbuEJ45eb1ittPfJrZaNnESBk5YHbQIgFOpRorFbO9Wi/jn4Ptw/g8Uf0BL2VZEHEphVNXfpiDI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232592},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.9_1747879782416_0.5186571378967242","host":"s3://npm-registry-packages-npm-production"}},"1.1.10":{"name":"speedy-jsx","version":"1.1.10","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.10","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"20b47a0e1fd3dab73468a52144523f345faadb89","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.10.tgz","fileCount":6,"integrity":"sha512-fptt9ra1EWXVMNciO+CIlT0lShQ84Qh9GQv8VHeXjYy28GqsQ6j2yjkuyeHZgYi6YvwVsmWNDToxcbZQGNKlKQ==","signatures":[{"sig":"MEUCIFXpekht2TrZQL5RIxuPgMGmY6/f10DK6w9YX/hnozbzAiEAoTN1I3qWtdJCcQWpcRmQPGqydQapYRuNKxkYEtHypBQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231212},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.10_1747891996962_0.740713955919194","host":"s3://npm-registry-packages-npm-production"}},"1.1.11":{"name":"speedy-jsx","version":"1.1.11","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.11","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"c7f2ca7318ba52930f04657ba884b774f93974bb","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.11.tgz","fileCount":6,"integrity":"sha512-LLwz2WoDnPrAEeGz4WtQYIu+r5H/OilaiyHg807VrqPZlMpRaVz+9vJ7FVAkhyfbFMgEY6rn7F9n+n981HbVCw==","signatures":[{"sig":"MEYCIQDwrRH5CPpUW1Yq+Sa0Wop2C1aqMjt/rkg3J3B2mxM9YQIhAL0jCINtHfaTQu8Z4nKvGM7NMH5lZN+WSOPquIdLbuIh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232563},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.11_1747932328508_0.7372028340134278","host":"s3://npm-registry-packages-npm-production"}},"1.1.12":{"name":"speedy-jsx","version":"1.1.12","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.12","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"45ffad5b105f60e99c3972675ddfd6c8d2a16b69","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.12.tgz","fileCount":6,"integrity":"sha512-uOX0VGT25hsuSjcRxbjEWsVyPLpPwon7EbyLY4VS10BnQQVVjCa+rXrPP6V+zFRJTr8IzI3kPfwtyvV2bQgfww==","signatures":[{"sig":"MEUCIQDu9usX4bf6aGlv6bctnUQQBGyOoysX8SpXGkY2nz2ANwIgcVf1G7xzR5PxmDNhBPtxNUhxYvQ1scyZ2+w8Qs7uAis=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":240457},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.12_1747982364258_0.12724794927526428","host":"s3://npm-registry-packages-npm-production"}},"1.1.13":{"name":"speedy-jsx","version":"1.1.13","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.13","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"ad928d4dfdf3f9caee0af736dd2f603a9b2bd046","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.13.tgz","fileCount":6,"integrity":"sha512-Ms5QBkbY2zyXCbPqMy6y6JT1X8ervSYTM5JkRZZ021JUjVPGpJtA8+wiZX1a/KvdTIcapX5H1G5oSlvRKcYCrw==","signatures":[{"sig":"MEYCIQCQ+gICAv6MHrXIHFXzfSHYMy6nS05CObl+pMcvLVUnNwIhANrMg3o8SYJlJo5XI0f/7po9QylJv20okJRCurpKCHBj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":252737},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.13_1747984054032_0.5611183349271436","host":"s3://npm-registry-packages-npm-production"}},"1.1.14":{"name":"speedy-jsx","version":"1.1.14","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.14","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"c882a1a28e4d4f1f9c1201228716405e7f16dea4","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.14.tgz","fileCount":6,"integrity":"sha512-HdsYckGKJT8+HIfssCxzzB8gF2dfXvlTl/1w6S8w3xmLbcPjG+MDqajKw11mOHynjMVZkzK78gBgZFmC8DSzqw==","signatures":[{"sig":"MEQCIEn3vMCLpCBqfcowo2U8RFGQPrs/0ek/x5ZtuNCf/E1MAiA2O01gNnDY1zb8Be0Q0y3z7ajpXz1QoDIXXHTif+lCjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":255255},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"轻量级响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.14_1747984455634_0.9902955556150741","host":"s3://npm-registry-packages-npm-production"}},"1.1.15":{"name":"speedy-jsx","version":"1.1.15","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.15","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"a9505300fedba644d98a9a079e6eaf3e2b6430c7","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.15.tgz","fileCount":6,"integrity":"sha512-WRW3x7WQj75kt+1S3X48ELZVM02VXyIKMFDzgTZ0zEBnyd8T+XRmhSga3PRsbxnsD41YuahbN89xo6n8CsHNJw==","signatures":[{"sig":"MEUCIGrXBRUsG7fYGy+TwWbh0W8/MiVAZQSt7C9fbsQqMOFvAiEA+UGSehHS1EMlJ32sVT85VAKrYtX2HidoHTVrsyaSqXo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":263989},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.15_1747996528335_0.8723878929021347","host":"s3://npm-registry-packages-npm-production"}},"1.1.16":{"name":"speedy-jsx","version":"1.1.16","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.16","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"24700266e29cd6623a3f4b6f1721a5c2d534d67e","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.16.tgz","fileCount":6,"integrity":"sha512-yH7u+1dAJjC0oIj123yue9AWGcM68+6TRT9mq9aYp21m+gWlavpkBg9NLl4W+LEYPKQiOJcNC8adGAADFFtk4Q==","signatures":[{"sig":"MEYCIQDtYTAKxv4CNhazcwwOM0oeyFYgiB5w8IcJrq7dr/EwAQIhALDkZHv6g3Ajt2fXfhlnT8+CKNKyKXVwLDyNFmANG/al","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265448},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.16_1747999301358_0.27440666479980313","host":"s3://npm-registry-packages-npm-production"}},"1.1.17":{"name":"speedy-jsx","version":"1.1.17","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.17","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"d283fb37ede7128a102efb3cb73b271dd3703bb9","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.17.tgz","fileCount":6,"integrity":"sha512-BxGRqCxc+PJfB6X0kXzlI2UVdSu9KDr6vMDVibT9+SQgMFpvxOgxcBIEWxdZHW7Cth9x9uaTYNWOPAFhRoWVxA==","signatures":[{"sig":"MEUCIQDVMrD4WzfkMDsQjTWb5grs9xxxRAgN3RhePrIXo/+T4AIgHRFUwDED/utjLfGJvLBs0FXCCfFMIGPFwxyXDIxc+14=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265530},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.17_1748001338705_0.3624275879949974","host":"s3://npm-registry-packages-npm-production"}},"1.1.18":{"name":"speedy-jsx","version":"1.1.18","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.18","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"b4b5a084cdd66dad2a1c137e0c76d143749512ad","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.18.tgz","fileCount":6,"integrity":"sha512-H+6WdlyKF218cUnxVot7PvQwuNhDrok1GChnwZ2oMkfloVjQssVMBMhrozy7J5UWje4F0D7OjxlArsg9g8uxeg==","signatures":[{"sig":"MEQCIFPe2UaoPGv1apTV2j3oEQ4+Ab4kws3rtQlv/E7VyDDXAiBEnyeDqtznrl6MxvPWvnC+1x27QGH57xIsDlFztWK1NA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289423},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.18_1748056893958_0.6747871540705619","host":"s3://npm-registry-packages-npm-production"}},"1.1.19":{"name":"speedy-jsx","version":"1.1.19","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.19","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"6dec3e80ae4acf457cecc2ebc79bbe28f6ee06af","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.19.tgz","fileCount":6,"integrity":"sha512-R/eWKUHjQJbIfkPl6hKR5XlOL+1ZpTi5suDswRKZ/M3Yl8Q9EPFDXyPx+VE/rnHCECCknlR7Ws9CjJnxH0tMSg==","signatures":[{"sig":"MEUCIFT68/yR4QiWVAOeuKnYIE3BFf00wmigiwZtvS/3B+uxAiEAycqjeCwuDQ8Dqc1oS+C07dCg9Y1AYw3rmSkh0jCYTig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291503},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.19_1748079650597_0.9521203398792333","host":"s3://npm-registry-packages-npm-production"}},"1.1.20":{"name":"speedy-jsx","version":"1.1.20","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.20","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"edcc5a7da84446d8dee4a6f8933446f521fbe29a","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.20.tgz","fileCount":6,"integrity":"sha512-OMxFDotZjuoViZ9KMKhmek4zfLwWDireW2r5d6telCpkxcmpijBJsJJvYNAKcRyK4s4pHdasC+fYYW5OhAZUQg==","signatures":[{"sig":"MEYCIQC6D4UUZ/daKnwVz9F56RwlcbDkFsU36SwCC0XclXpRwQIhAPGy16TjIHQScAcZXKPAYy1Ijr+4SsCJpCetCcD9LNf/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291501},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.20_1748079850246_0.8058292980035435","host":"s3://npm-registry-packages-npm-production"}},"1.1.21":{"name":"speedy-jsx","version":"1.1.21","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.21","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"412e8bb36ad9a8626a4758ef2efc0662e3be1a08","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.21.tgz","fileCount":6,"integrity":"sha512-0nbj916m5JbjVXvMI13Yi2CRQg+IKluBrMy3oAW3M/AKITqnzSiVi3oabONGNgs3xzii+HGbxVkJth25gyi4nw==","signatures":[{"sig":"MEYCIQCqTAmmsIgmF3qHncggN0+KnRu9qFsMkC57HRKUk0aTJwIhAJyRgz250Ro8qBkce1bN01r+VlfDFjHS36AnR41qGMb8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291501},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.21_1748080145474_0.6646423309046672","host":"s3://npm-registry-packages-npm-production"}},"1.1.22":{"name":"speedy-jsx","version":"1.1.22","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.22","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"be61a66e575f9bcb0ce937a67b2e0509c58b20c8","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.22.tgz","fileCount":9,"integrity":"sha512-O7XYttDkQg3Q0eDyCLRKF97mss2jMESGAW/G0C6TgQUZuikEtfrMbtJEoChptP7XvA6/I6a0Fp7Knyi+k5aOBA==","signatures":[{"sig":"MEQCIHWBw+/cTTV4wq0xhY+Ai6kHgDW5HmrQpBnCWSkNSYpUAiBA+7sNpNwZA2GgOShm04zWikW2SYkVbGHcP9+PfwHfeg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1267975},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.22_1748142777346_0.20325138708565427","host":"s3://npm-registry-packages-npm-production"}},"1.1.23":{"name":"speedy-jsx","version":"1.1.23","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.23","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"52651feabc661ad00e30b899330af028d2a596e5","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.23.tgz","fileCount":9,"integrity":"sha512-4+BWy+S3ZSWAKL1pRY9H3Pl2gaA+Ryv5v43hHG84YdcwiqU2464R/TyccAzmkcrrvwKP5jqHyaBgX5wWIWa+rw==","signatures":[{"sig":"MEUCIGqRk/86F2KM7qtP3WXHtxvkvWPnThNubhpQMVVAUjaHAiEAg50kPa4S49EjAsND1lWP5vxCMpik2Co+t3btYf2mEGs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1268163},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"scripts":{"build":"cd ../.. && yarn build","prepare":"yarn build && node add-sourcemap-comment.js","postbuild":"node add-sourcemap-comment.js"},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.23_1748143157973_0.1630469838344466","host":"s3://npm-registry-packages-npm-production"}},"1.1.24":{"name":"speedy-jsx","version":"1.1.24","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.24","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"033943062b71f0265ad3e52e5f22d096278e68ac","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.24.tgz","fileCount":6,"integrity":"sha512-m7RDMnTtLPZRTxCT/4n3tokjfdKw6Bxr/PJNxwJ8gWpAO4frchPCmmv5nrSuvH5luWZgvsNr4/OwvokmthFmbQ==","signatures":[{"sig":"MEYCIQCqAGrFT667rms3MG3Nc9eZfJnpyuQEYsm6f37Bu6JxaQIhAJoHfV93jn3DJ2LBzsNoWQ6GrQOkMOt9j7OuV/ZKzLQO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291501},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.24_1748143344331_0.5664383674702766","host":"s3://npm-registry-packages-npm-production"}},"1.1.25":{"name":"speedy-jsx","version":"1.1.25","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","_id":"speedy-jsx@1.1.25","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"dist":{"shasum":"e27cea6b221c69e4b3a0f5b6e11db1f96697c43f","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.25.tgz","fileCount":6,"integrity":"sha512-iwDAY0Czf30dzCfjpXHncJxjzzcjDxGwvpOy0kOyphIuTgicD/+Y/+2qt/WvUKYzX2hvsGncHKeC6RDhxXfZGA==","signatures":[{"sig":"MEUCICD9pjkvAxUFiRvtrHiFWR1cqGA/mDzLqK8/qIFMR/IMAiEAnn3hjHTsXnyxlZZs/cFGJ/aUZczHNASiTIavb9KaNKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":304782},"main":"./dist/speedy.cjs","type":"module","types":"./types/index.d.ts","module":"./dist/speedy.mjs","exports":{".":{"types":"./types/index.d.ts","import":"./dist/speedy.mjs","require":"./dist/speedy.cjs"}},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"_npmVersion":"10.9.2","description":"响应式JavaScript框架","directories":{},"_nodeVersion":"22.14.0","dependencies":{"htm":"^3.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/speedy-jsx_1.1.25_1748776507843_0.58775625912474","host":"s3://npm-registry-packages-npm-production"}},"1.1.26":{"name":"speedy-jsx","version":"1.1.26","description":"响应式JavaScript框架","type":"module","main":"./dist/speedy.cjs","module":"./dist/speedy.mjs","types":"./types/index.d.ts","exports":{".":{"import":"./dist/speedy.mjs","require":"./dist/speedy.cjs","types":"./types/index.d.ts"}},"keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"author":{"name":"Rw"},"license":"ISC","dependencies":{"htm":"^3.1.1"},"devDependencies":{},"_id":"speedy-jsx@1.1.26","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-Eg+87O91DV/XHkgkUglylW7yCv69De+ZLEXi0HjLWR8pSGTWPUsDTyujUA1Q3X86tLgq/oX/G27HsCwlZxM+GA==","shasum":"d33e2c29eea5f368de8ae560636eface3f5cc9e6","tarball":"https://registry.npmjs.org/speedy-jsx/-/speedy-jsx-1.1.26.tgz","fileCount":6,"unpackedSize":305157,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBI4EX3Z46UZ8em0DierkFfJoNgUCuOu4KLwVCxVPXPyAiEAyzaQA/AgbP8kvAsvyK9zPF80zZH1Qi0f5F22RDG0fqs="}]},"_npmUser":{"name":"em00me","email":"2306483837@qq.com"},"directories":{},"maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/speedy-jsx_1.1.26_1748791129220_0.9035920285643275"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-14T00:57:21.877Z","modified":"2025-06-01T15:18:49.571Z","1.0.0":"2025-05-14T00:57:22.057Z","1.0.1":"2025-05-14T01:05:02.083Z","1.0.2":"2025-05-14T02:04:07.406Z","1.0.3":"2025-05-14T03:02:50.189Z","1.0.4":"2025-05-14T06:15:19.936Z","1.1.4":"2025-05-14T09:38:15.127Z","1.1.0":"2025-05-14T09:39:08.543Z","1.1.1":"2025-05-14T09:55:25.167Z","1.1.2":"2025-05-18T04:56:11.401Z","1.1.3":"2025-05-20T15:41:04.033Z","1.1.5":"2025-05-20T15:58:46.364Z","1.1.6":"2025-05-21T01:17:34.081Z","1.1.7":"2025-05-21T09:05:21.823Z","1.1.8":"2025-05-21T10:09:29.035Z","1.1.9":"2025-05-22T02:09:42.669Z","1.1.10":"2025-05-22T05:33:17.168Z","1.1.11":"2025-05-22T16:45:28.710Z","1.1.12":"2025-05-23T06:39:24.468Z","1.1.13":"2025-05-23T07:07:34.251Z","1.1.14":"2025-05-23T07:14:15.837Z","1.1.15":"2025-05-23T10:35:28.633Z","1.1.16":"2025-05-23T11:21:41.663Z","1.1.17":"2025-05-23T11:55:38.883Z","1.1.18":"2025-05-24T03:21:34.140Z","1.1.19":"2025-05-24T09:40:50.854Z","1.1.20":"2025-05-24T09:44:10.466Z","1.1.21":"2025-05-24T09:49:05.761Z","1.1.22":"2025-05-25T03:12:57.669Z","1.1.23":"2025-05-25T03:19:18.350Z","1.1.24":"2025-05-25T03:22:24.590Z","1.1.25":"2025-06-01T11:15:08.132Z","1.1.26":"2025-06-01T15:18:49.413Z"},"author":{"name":"Rw"},"license":"ISC","keywords":["speedy-jsx","speedy","framework","javascript","lightweight","virtual-dom","reactive","render","jsx","frontend"],"description":"响应式JavaScript框架","maintainers":[{"name":"em00me","email":"2306483837@qq.com"}],"readme":"# Speedy-JSX\n\n响应式JavaScript框架，提供虚拟DOM、组件系统、状态管理和路由功能。\n\n## 目录\n\n- [Speedy-JSX](#speedy-jsx)\n  - [目录](#目录)\n  - [特性](#特性)\n  - [安装](#安装)\n  - [快速开始](#快速开始)\n    - [基本示例](#基本示例)\n  - [组件开发](#组件开发)\n    - [组件Props使用规范](#组件props使用规范)\n      - [不要解构Props](#不要解构props)\n      - [正确处理Children](#正确处理children)\n      - [Props的默认值](#props的默认值)\n  - [响应式系统](#响应式系统)\n    - [创建响应式状态](#创建响应式状态)\n    - [监听变化](#监听变化)\n  - [状态管理](#状态管理)\n    - [创建Store](#创建store)\n    - [持久化Store](#持久化store)\n  - [路由系统](#路由系统)\n    - [基本用法](#基本用法)\n    - [路由模式](#路由模式)\n    - [嵌套路由](#嵌套路由)\n    - [动态路由参数](#动态路由参数)\n    - [查询参数](#查询参数)\n    - [命名路由](#命名路由)\n    - [路由导航守卫](#路由导航守卫)\n    - [路由元数据](#路由元数据)\n    - [编程式导航](#编程式导航)\n    - [活跃链接样式](#活跃链接样式)\n      - [精确匹配模式](#精确匹配模式)\n    - [路由重定向](#路由重定向)\n    - [404页面处理](#404页面处理)\n      - [嵌套路由404处理](#嵌套路由404处理)\n  - [样式系统](#样式系统)\n    - [作用域样式 (scope)](#作用域样式-scope)\n    - [样式化组件 (Styled Components)](#样式化组件-styled-components)\n    - [关键帧动画](#关键帧动画)\n    - [媒体查询](#媒体查询)\n    - [全局样式](#全局样式)\n    - [组合使用样式系统](#组合使用样式系统)\n    - [高级特性](#高级特性)\n  - [异步组件](#异步组件)\n  - [自定义指令](#自定义指令)\n    - [注册指令](#注册指令)\n    - [使用指令](#使用指令)\n    - [指令生命周期](#指令生命周期)\n    - [指令的最佳实践](#指令的最佳实践)\n  - [依赖注入](#依赖注入)\n  - [批量更新和效果控制](#批量更新和效果控制)\n  - [生命周期钩子](#生命周期钩子)\n  - [资源管理与清理](#资源管理与清理)\n    - [基本用法](#基本用法-1)\n    - [可用的资源管理API](#可用的资源管理api)\n      - [定时器管理](#定时器管理)\n      - [事件监听器](#事件监听器)\n      - [动画帧管理](#动画帧管理)\n      - [网络请求管理](#网络请求管理)\n      - [WebSocket管理](#websocket管理)\n      - [观察器管理](#观察器管理)\n      - [自定义清理函数](#自定义清理函数)\n      - [可取消的Promise](#可取消的promise)\n    - [避免内存泄漏的最佳实践](#避免内存泄漏的最佳实践)\n  - [API文档](#api文档)\n\n## 特性\n\n- 响应式数据系统\n- 虚拟DOM渲染\n- 组件化开发\n- 内置路由\n- 状态管理\n- CSS-in-JS支持\n- 异步组件\n\n## 安装\n\n```bash\nnpm install speedy-jsx\n# 或\nyarn add speedy-jsx\n```\n\n## 快速开始\n\n### 基本示例\n\n```jsx\nimport { render, ref } from 'speedy-jsx';\n\nfunction Counter() {\n  const count = ref(0);\n  const increment = () => { count.value++ };\n  \n  return () => (\n    <div>\n      <p>计数: {count.value}</p>\n      <button onClick={increment}>增加</button>\n    </div>\n  );\n}\n\n// 可以直接传递组件函数\nrender(Counter, document.getElementById('app'));\n```\n\n## 组件开发\n\n### 组件Props使用规范\n\n在Speedy-JSX框架中，Props是响应式对象，需要遵循以下规则：\n\n#### 不要解构Props\n\n```jsx\n// ❌ 错误：直接解构会丢失响应性\nfunction MyComponent({ title, count }) {\n  return () => <div>{title}: {count}</div>;\n}\n\n// ✅ 正确：直接使用props对象引用属性\nfunction MyComponent(props) {\n  return () => <div>{props.title}: {props.count}</div>;\n}\n```\n\n#### 正确处理Children\n\n在Speedy-JSX中，子元素作为函数参数传递给渲染函数：\n\n```jsx\n// ✅ 正确：通过渲染函数的参数获取children\nfunction Container(props) {\n  return (children) => (\n    <div className={props.className}>{children}</div>\n  );\n}\n```\n\n#### Props的默认值\n\n```jsx\nfunction Button(props) {\n  return (children) => {\n    const type = props.type || \"button\";\n    const disabled = props.disabled || false;\n    \n    return (\n      <button type={type} disabled={disabled}>\n        {children}\n      </button>\n    );\n  };\n}\n```\n\n## 响应式系统\n\n### 创建响应式状态\n\n```javascript\nimport { ref, reactive, computed } from 'speedy-jsx';\n\n// 创建响应式引用\nconst count = ref(0);\ncount.value++; // 通过.value访问和修改\n\n// 创建响应式对象\nconst state = reactive({\n  count: 0,\n  text: 'hello'\n});\nstate.count++; // 直接修改属性\n\n// 创建计算属性\nconst doubleCount = computed(() => count.value * 2);\nconsole.log(doubleCount.value); // 自动更新\n```\n\n### 监听变化\n\n```javascript\nimport { watch, watchEffect } from 'speedy-jsx';\n\n// 监听特定值\nwatch(count, (newValue, oldValue) => {\n  console.log(`count从${oldValue}变为${newValue}`);\n});\n\n// 自动收集依赖并监听\nwatchEffect(() => {\n  console.log(`当前count: ${count.value}, 两倍值: ${doubleCount.value}`);\n});\n```\n\n## 状态管理\n\n### 创建Store\n\n```jsx\nimport { defineStore, ref } from 'speedy-jsx';\n\n// 创建一个store\nconst counterStore = defineStore(() => {\n  const count = ref(0);\n  \n  function increment() {\n    count.value++;\n  }\n  \n  return {\n    count,\n    increment\n  };\n});\n\n// 使用store\nfunction Counter() {\n  return () => (\n    <div>\n      <p>Count: {counterStore.count.value}</p>\n      <button onClick={counterStore.increment}>+1</button>\n    </div>\n  );\n}\n```\n\n### 持久化Store\n\n```javascript\nimport { definePersistStore, ref } from 'speedy-jsx';\n\nconst todoStore = definePersistStore(() => {\n  const todos = ref([]);\n  \n  function addTodo(text) {\n    todos.value.push({ id: Date.now(), text, completed: false });\n  }\n  \n  return { todos, addTodo };\n}, {\n  key: 'app-todos', // 存储键名\n  storage: localStorage // 存储介质\n});\n```\n\n## 路由系统\n\nSpeedy-JSX提供了路由系统，支持哈希模式和历史模式、嵌套路由、动态参数、命名路由等功能。\n\n### 基本用法\n\n```jsx\nimport { Router, RouterView, RouterLink } from 'speedy-jsx';\n\nconst routes = [\n  { path: '/', component: Home },\n  { path: '/about', component: About },\n  { path: '/users/:id', component: UserProfile }\n];\n\nfunction App() {\n  return () => (\n    <Router routes={routes} mode=\"hash\">\n      <nav>\n        <RouterLink to=\"/\">首页</RouterLink>\n        <RouterLink to=\"/about\">关于</RouterLink>\n      </nav>\n      <RouterView />\n    </Router>\n  );\n}\n\n// 直接传递组件函数\nrender(App, document.getElementById('app'));\n```\n\n### 路由模式\n\nSpeedy路由系统支持两种导航模式：\n\n```jsx\n// 哈希模式 (默认) - 使用URL的哈希部分（#）\n<Router routes={routes} mode=\"hash\">\n\n// 历史模式 - 使用HTML5 History API\n<Router routes={routes} mode=\"history\">\n```\n\n### 嵌套路由\n\nSpeedy支持无限层级的嵌套路由：\n\n```jsx\nconst routes = [\n  { \n    path: '/user', \n    component: UserLayout,\n    children: [\n      { path: '/profile', component: UserProfile },\n      { path: '/settings', component: UserSettings },\n      { \n        path: '/posts', \n        component: PostsLayout,\n        children: [\n          { path: '/list', component: PostList },\n          { path: '/:id', component: PostDetail }\n        ]\n      }\n    ]\n  }\n];\n\n// 在父组件中使用RouterView\nfunction UserLayout() {\n  return () => (\n    <div>\n      <h2>用户中心</h2>\n      <RouterView /> {/* 子路由组件将在这里渲染 */}\n    </div>\n  );\n}\n```\n\n### 动态路由参数\n\n使用冒号语法定义动态路由参数：\n\n```jsx\n// 路由定义\nconst routes = [\n  { path: '/users/:id', component: UserDetail },\n  { path: '/articles/:category/:slug', component: ArticleDetail }\n];\n\n// 在组件中访问参数\nimport { useParams } from 'speedy-jsx';\n\nfunction UserDetail() {\n  const params = useParams();\n  \n  return () => (\n    <div>用户ID: {params.value.id}</div>\n  );\n}\n```\n\n### 查询参数\n\n访问URL查询参数：\n\n```jsx\nimport { useQuery } from 'speedy-jsx';\n\nfunction SearchPage() {\n  const query = useQuery();\n  \n  return () => (\n    <div>\n      <h2>搜索结果</h2>\n      <p>关键词: {query.value.keyword}</p>\n      <p>页码: {query.value.page || 1}</p>\n    </div>\n  );\n}\n\n// 使用RouterLink传递查询参数\n<RouterLink to={{ path: '/search', query: { keyword: 'speedy', page: 2 } }}>\n  搜索\n</RouterLink>\n```\n\n### 命名路由\n\n可以为路由指定名称，并通过名称导航：\n\n```jsx\n// 定义命名路由\nconst routes = [\n  { path: '/', name: 'home', component: Home },\n  { path: '/about', name: 'about', component: About },\n  { path: '/users/:id', name: 'user-detail', component: UserDetail }\n];\n\n// 使用命名路由导航\n<RouterLink to={{ name: 'user-detail', params: { id: 123 } }}>\n  查看用户\n</RouterLink>\n\n// 在代码中导航\nimport { useRouter } from 'speedy-jsx';\n\nfunction NavigateButton() {\n  const router = useRouter();\n  \n  const handleClick = () => {\n    router.value.push({ name: 'user-detail', params: { id: 123 } });\n  };\n  \n  return () => (\n    <button onClick={handleClick}>查看用户</button>\n  );\n}\n```\n\n### 路由导航守卫\n\nSpeedy提供了全面的导航守卫系统，用于控制导航流程：\n\n```jsx\nimport { onBeforeEach, onBeforeResolve, onAfterEach } from 'speedy-jsx';\n\n// 全局前置守卫 - 在导航开始前触发\nonBeforeEach((to, from, next) => {\n  // 检查用户是否已登录\n  if (to.path.startsWith('/admin') && !isAuthenticated()) {\n    // 重定向到登录页\n    next('/login');\n  } else {\n    // 继续导航\n    next();\n  }\n});\n\n// 全局解析守卫 - 在导航解析完成后、组件渲染前触发\nonBeforeResolve((to, from, next) => {\n  // 可以在这里加载数据\n  loadPageData(to.path).then(() => {\n    next();\n  });\n});\n\n// 全局后置钩子 - 在导航完成后触发\nonAfterEach((to, from) => {\n  // 更新页面标题\n  document.title = to.meta.title || 'Speedy应用';\n  \n  // 记录页面访问\n  trackPageView(to.path);\n});\n```\n\n### 路由元数据\n\n可以为路由添加元数据，用于存储与路由相关的额外信息：\n\n```jsx\nconst routes = [\n  { \n    path: '/admin',\n    component: AdminLayout,\n    meta: { \n      requiresAuth: true,\n      title: '管理后台'\n    }\n  }\n];\n\n// 在导航守卫中使用元数据\nonBeforeEach((to, from, next) => {\n  if (to.meta.requiresAuth && !isAuthenticated()) {\n    next('/login');\n  } else {\n    next();\n  }\n});\n```\n\n### 编程式导航\n\n除了使用RouterLink外，还可以在代码中进行导航：\n\n```jsx\nimport { useRouter } from 'speedy-jsx';\n\nfunction NavigationExample() {\n  const router = useRouter();\n  \n  function navigate() {\n    // 导航到指定路径\n    router.value.push('/about');\n    \n    // 导航到命名路由\n    router.value.push({ name: 'user-detail', params: { id: 123 } });\n    \n    // 带查询参数的导航\n    router.value.push({ path: '/search', query: { q: 'speedy' } });\n    \n    // 替换当前路由（不产生新的历史记录）\n    router.value.replace('/new-path');\n    \n    // 前进、后退和跳转历史\n    router.value.back();\n    router.value.forward();\n    router.value.go(-2); // 后退两步\n  }\n  \n  return () => (\n    <button onClick={navigate}>导航示例</button>\n  );\n}\n```\n\n### 活跃链接样式\n\nRouterLink组件会根据当前路由自动添加活跃类：\n\n```jsx\n<RouterLink \n  to=\"/about\" \n  activeClass=\"active-link\" \n  exactActiveClass=\"exact-active-link\"\n>\n  关于我们\n</RouterLink>\n\n<style>\n  .active-link {\n    color: blue; /* 当前路由或其子路由匹配时应用 */\n  }\n  .exact-active-link {\n    font-weight: bold; /* 仅当完全匹配当前路由时应用 */\n  }\n</style>\n```\n\n#### 精确匹配模式\n\nRouterLink 组件提供了 `exact` 属性，用于控制链接何时被视为活跃状态：\n\n```jsx\n// 默认匹配模式（不使用exact）：\n// 当前路径是 /about 或以 /about/ 开头的路径（如 /about/team）时都会匹配\n<RouterLink to=\"/about\" activeClass=\"active\">关于</RouterLink>\n\n// 精确匹配模式：\n// 只有当前路径完全等于 /about 时才会匹配\n<RouterLink to=\"/about\" exact={true} activeClass=\"active\">关于</RouterLink>\n```\n\n精确匹配模式对于构建导航菜单特别有用，可以防止父路由链接在访问子路由时保持活跃状态：\n\n```jsx\n// 导航菜单示例\nfunction NavMenu() {\n  return () => (\n    <nav>\n      <RouterLink to=\"/\" exact={true} activeClass=\"active\">首页</RouterLink>\n      <RouterLink to=\"/products\" exact={true} activeClass=\"active\">产品</RouterLink>\n      <RouterLink to=\"/products/new\" activeClass=\"active\">新产品</RouterLink>\n      <RouterLink to=\"/about\" activeClass=\"active\">关于</RouterLink>\n    </nav>\n  );\n}\n```\n\n上面的例子中，当访问 `/products/new` 路径时：\n- 设置了 `exact={true}` 的 `/products` 链接不会激活\n- 而 `/products/new` 链接会激活\n\n这样可以更精确地控制导航项的视觉反馈，提升用户体验。\n\n### 路由重定向\n\n可以设置路由重定向，将一个路径自动导向另一个路径：\n\n```jsx\nconst routes = [\n  { path: '/', component: Home },\n  { path: '/home', redirect: '/' },\n  \n  // 动态重定向\n  { \n    path: '/old-path/:id',\n    redirect: to => {\n      // 可以返回字符串路径\n      return `/new-path/${to.params.id}`;\n      \n      // 或返回路由对象\n      return {\n        path: `/new-path/${to.params.id}`,\n        query: { ...to.query, source: 'redirect' }\n      };\n    }\n  }\n];\n```\n\n### 404页面处理\n\n可以添加通配符路由作为404页面：\n\n```jsx\nconst routes = [\n  { path: '/', component: Home },\n  { path: '/about', component: About },\n  { path: '/404', component: NotFound },\n];\n```\n\n#### 嵌套路由404处理\n\nSpeedy 路由系统支持为每个嵌套级别配置独立的 404 页面，提供更精确的路由控制：\n\n```jsx\nconst routes = [\n  { \n    path: '/user', \n    component: UserLayout,\n    children: [\n      { path: '/profile', component: UserProfile },\n      // 用户模块专用的404页面，只会捕获/user/下的未匹配路径\n      { path: '/404', component: UserNotFound }\n    ]\n  },\n  { \n    path: '/blog',\n    component: BlogLayout,\n    children: [\n      { path: '/posts', component: BlogPosts },\n      // 博客模块专用的404页面\n      { path: '/404', component: BlogNotFound }\n    ]\n  },\n  // 全局404页面，捕获所有其他未匹配的路径\n  { path: '/404', component: GlobalNotFound }\n];\n```\n\n当路由系统无法匹配一个路径时，它会：\n\n1. 首先在当前路径的父级路由中查找 `/404` 子路由\n2. 如果找到，则渲染该嵌套404组件\n3. 如果未找到，则继续向上级路由查找\n4. 最终回退到全局 `/404` 路由\n\n这种设计允许为不同的应用模块提供专门的404页面，显示更相关的错误信息和导航选项。\n\n## 样式系统\n\nSpeedy提供了强大而灵活的CSS-in-JS样式系统，包含四个核心API：`scope`、`keyframes`、`media`和`global`，以及标签式API用于创建样式化组件。\n\n### 作用域样式 (scope)\n\n使用`styled.scope`创建局部作用域样式，自动生成唯一类名避免样式冲突：\n\n```jsx\nimport { styled } from 'speedy-jsx';\n\n// 创建局部作用域样式\nconst styles = styled.scope({\n  container: {\n    display: 'flex',\n    flexDirection: 'column',\n    padding: '20px',\n    backgroundColor: '#f5f5f5',\n    borderRadius: '8px',\n    boxShadow: '0 2px 4px rgba(0,0,0,0.1)'\n  },\n  title: {\n    fontSize: '24px',\n    color: '#333',\n    marginBottom: '16px'\n  },\n  content: {\n    fontSize: '16px',\n    lineHeight: '1.5',\n    color: '#666'\n  }\n});\n\n// 使用样式\nfunction Card() {\n  return () => (\n    <div classStyle={[styles.container]}>\n      <h2 classStyle={[styles.title]}>卡片标题</h2>\n      <p classStyle={[styles.content]}>卡片内容</p>\n    </div>\n  );\n}\n```\n\n样式通过`classStyle`属性应用于元素，支持多个样式的数组形式。每个样式都会生成唯一的类名，确保样式隔离和组件复用。\n\n### 样式化组件 (Styled Components)\n\n使用标签式API创建样式化组件，类似styled-components：\n\n```jsx\nimport { styled } from 'speedy-jsx';\n\n// 创建样式化按钮组件\nconst Button = styled.button`\n  background-color: ${props => props.$primary ? '#0070f3' : '#f0f0f0'};\n  color: ${props => props.$primary ? 'white' : '#333'};\n  padding: ${props => props.$size === 'large' ? '12px 24px' : '8px 16px'};\n  border-radius: 4px;\n  border: none;\n  font-size: ${props => props.$size === 'large' ? '16px' : '14px'};\n  font-weight: 500;\n  cursor: pointer;\n  transition: all 0.2s ease;\n  \n  &:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n    opacity: ${props => props.$hoverable ? 0.9 : 1};\n  }\n  \n  &:active {\n    transform: translateY(0);\n  }\n`;\n\n// 使用样式化组件\nfunction App() {\n  return () => (\n    <div>\n      <Button $primary={true} $size=\"large\" $hoverable={true}>\n        主要按钮\n      </Button>\n      <Button $primary={false} $size=\"small\" $hoverable={true}>\n        次要按钮\n      </Button>\n    </div>\n  );\n}\n```\n\n特点：\n- 自动生成唯一类名\n- 支持动态属性（以`$`开头的props属性）\n- 支持嵌套选择器（使用`&`引用自身）\n- 响应式监听props变化自动更新样式\n\n### 关键帧动画\n\n使用`styled.keyframes`创建CSS动画：\n\n```jsx\nimport { styled } from 'speedy-jsx';\n\n// 定义一个淡入动画\nconst fadeIn = styled.keyframes({\n  '0%': {\n    opacity: 0,\n    transform: 'translateY(20px)'\n  },\n  '50%': {\n    opacity: 0.5,\n    transform: 'translateY(10px)'\n  },\n  '100%': {\n    opacity: 1,\n    transform: 'translateY(0)'\n  }\n});\n\n// 定义一个脉冲动画\nconst pulse = styled.keyframes({\n  '0%': { transform: 'scale(1)' },\n  '50%': { transform: 'scale(1.05)' },\n  '100%': { transform: 'scale(1)' }\n});\n\n// 在样式中使用动画\nconst styles = styled.scope({\n  animatedBox: {\n    animation: `${fadeIn} 0.5s ease-out forwards`,\n    padding: '20px',\n    backgroundColor: '#f0f0f0'\n  },\n  pulsingButton: {\n    animation: `${pulse} 1s infinite ease-in-out`,\n    padding: '10px 20px',\n    backgroundColor: '#0070f3',\n    color: 'white',\n    border: 'none',\n    borderRadius: '4px'\n  }\n});\n\nfunction AnimationExample() {\n  return () => (\n    <div>\n      <div classStyle={[styles.animatedBox]}>\n        这个元素会淡入\n      </div>\n      <button classStyle={[styles.pulsingButton]}>\n        脉冲按钮\n      </button>\n    </div>\n  );\n}\n```\n\n### 媒体查询\n\n使用`styled.media`创建响应式布局：\n\n```jsx\nimport { styled } from 'speedy-jsx';\n\n// 创建基础样式\nconst styles = styled.scope({\n  grid: {\n    display: 'grid',\n    gridTemplateColumns: 'repeat(4, 1fr)',\n    gap: '20px',\n    padding: '20px'\n  },\n  card: {\n    padding: '20px',\n    borderRadius: '8px',\n    backgroundColor: 'white',\n    boxShadow: '0 2px 4px rgba(0,0,0,0.1)',\n    transition: 'transform 0.3s ease'\n  }\n});\n\n// 添加响应式媒体查询\nstyled.media({\n  // 平板设备\n  '(max-width: 992px)': {\n    [styles.grid.className]: {\n      gridTemplateColumns: 'repeat(3, 1fr)'\n    }\n  },\n  // 小平板设备\n  '(max-width: 768px)': {\n    [styles.grid.className]: {\n      gridTemplateColumns: 'repeat(2, 1fr)'\n    },\n    [styles.card.className]: {\n      padding: '15px'\n    }\n  },\n  // 移动设备\n  '(max-width: 480px)': {\n    [styles.grid.className]: {\n      gridTemplateColumns: '1fr',\n      gap: '15px',\n      padding: '10px'\n    },\n    [styles.card.className]: {\n      padding: '10px'\n    }\n  }\n});\n\nfunction ResponsiveGrid() {\n  return () => (\n    <div classStyle={[styles.grid]}>\n      <div classStyle={[styles.card]}>卡片1</div>\n      <div classStyle={[styles.card]}>卡片2</div>\n      <div classStyle={[styles.card]}>卡片3</div>\n      <div classStyle={[styles.card]}>卡片4</div>\n    </div>\n  );\n}\n```\n\n### 全局样式\n\n使用`styled.global`添加全局样式规则：\n\n```jsx\nimport { styled } from 'speedy-jsx';\n\n// 添加全局样式 - 通常在应用入口处调用一次\nstyled.global({\n  'html, body': {\n    margin: 0,\n    padding: 0,\n    fontFamily: 'system-ui, -apple-system, sans-serif',\n    boxSizing: 'border-box',\n    backgroundColor: '#f9f9f9'\n  },\n  '*, *::before, *::after': {\n    boxSizing: 'inherit'\n  },\n  'a': {\n    color: '#0070f3',\n    textDecoration: 'none',\n    transition: 'color 0.2s ease'\n  },\n  'a:hover': {\n    color: '#0051bb',\n    textDecoration: 'underline'\n  },\n  '.container': {\n    maxWidth: '1200px',\n    margin: '0 auto',\n    padding: '0 20px'\n  },\n  // 支持嵌套选择器\n  'form': {\n    'input, select, textarea': {\n      padding: '8px 12px',\n      border: '1px solid #ddd',\n      borderRadius: '4px',\n      fontSize: '16px'\n    },\n    'button': {\n      padding: '8px 16px',\n      backgroundColor: '#0070f3',\n      color: 'white',\n      border: 'none',\n      borderRadius: '4px',\n      cursor: 'pointer'\n    }\n  }\n});\n```\n\n### 组合使用样式系统\n\n全面展示样式系统功能的综合示例：\n\n```jsx\nimport { styled } from 'speedy-jsx';\nimport { ref } from 'speedy-jsx';\n\n// 1. 创建关键帧动画\nconst fadeIn = styled.keyframes({\n  '0%': { opacity: 0, transform: 'translateY(10px)' },\n  '100%': { opacity: 1, transform: 'translateY(0)' }\n});\n\n// 2. 创建全局样式\nstyled.global({\n  'body': {\n    margin: 0,\n    fontFamily: 'sans-serif',\n    backgroundColor: '#f5f5f5'\n  }\n});\n\n// 3. 创建局部样式\nconst styles = styled.scope({\n  app: {\n    maxWidth: '800px',\n    margin: '40px auto',\n    padding: '20px',\n    backgroundColor: 'white',\n    borderRadius: '8px',\n    boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\n    animation: `${fadeIn} 0.5s ease-out`\n  },\n  header: {\n    marginBottom: '24px',\n    borderBottom: '1px solid #eee',\n    paddingBottom: '16px'\n  },\n  title: {\n    fontSize: '28px',\n    fontWeight: '600',\n    color: '#333',\n    margin: '0 0 8px 0'\n  },\n  subtitle: {\n    fontSize: '16px',\n    color: '#666',\n    margin: 0\n  },\n  content: {\n    display: 'flex',\n    flexDirection: 'column',\n    gap: '20px'\n  }\n});\n\n// 4. 创建样式化组件\nconst Card = styled.div`\n  padding: 20px;\n  border-radius: 8px;\n  background-color: ${props => props.$dark ? '#333' : '#f9f9f9'};\n  color: ${props => props.$dark ? '#fff' : '#333'};\n  box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n  transition: all 0.3s ease;\n  \n  &:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n  }\n  \n  h3 {\n    margin-top: 0;\n    font-size: 18px;\n  }\n  \n  p {\n    margin-bottom: 0;\n    line-height: 1.5;\n  }\n`;\n\n// 5. 添加响应式媒体查询\nstyled.media({\n  '(max-width: 768px)': {\n    [styles.app.className]: {\n      margin: '20px 16px',\n      padding: '16px'\n    },\n    [styles.title.className]: {\n      fontSize: '24px'\n    }\n  }\n});\n\n// 主应用组件\nfunction StyleSystemDemo() {\n  const darkMode = ref(false);\n  const toggleMode = () => { darkMode.value = !darkMode.value };\n  \n  return () => (\n    <div classStyle={[styles.app]}>\n      <header classStyle={[styles.header]}>\n        <h1 classStyle={[styles.title]}>Speedy 样式系统演示</h1>\n        <p classStyle={[styles.subtitle]}>展示样式系统的全部功能</p>\n      </header>\n      \n      <div classStyle={[styles.content]}>\n        <button onClick={toggleMode}>\n          切换{darkMode.value ? '浅色' : '深色'}模式\n        </button>\n        \n        <Card $dark={darkMode.value}>\n          <h3>样式化组件</h3>\n          <p>这是使用styled.div创建的卡片组件，支持动态属性和嵌套选择器。</p>\n        </Card>\n      </div>\n    </div>\n  );\n}\n```\n\n### 高级特性\n\n样式系统还提供以下高级特性：\n\n- **嵌套选择器**：支持在样式对象中嵌套子选择器\n- **响应式props**：样式化组件中可以使用响应式属性动态更新样式\n- **自动类名生成**：确保样式隔离和避免冲突\n\n## 异步组件\n\n```jsx\nimport { Async, Pending, Then, Catch } from 'speedy-jsx';\n\nfunction DataLoader() {\n  const fetchData = () => fetch('https://api.example.com/data');\n\n  return () => (\n    <Async promise={fetchData}>\n      <Pending>\n        <p>数据加载中...</p>\n      </Pending>\n      <Then>\n        {(data) => <p>加载成功: {JSON.stringify(data)}</p>}\n      </Then>\n      <Catch>\n        {(error) => <p>加载失败: {error.message}</p>}\n      </Catch>\n    </Async>\n  );\n}\n```\n\n## 自定义指令\n\nSpeedy提供了自定义指令系统，用于复用与DOM元素交互的逻辑。指令是一种特殊的函数，可以对渲染的DOM元素执行底层操作。\n\n### 注册指令\n\n```javascript\nimport { directive } from 'speedy-jsx';\n\n// 注册一个简单的show指令\ndirective(\"show\", (el, update) => {\n  // 设置update回调函数处理值变更\n  update((oldValue, newValue) => {\n    el.style.display = newValue ? 'block' : 'none';\n  });\n\n  // 可以注册多个update回调处理不同的逻辑\n  update((oldValue, newValue) => {\n    // 例如，添加过渡效果\n    if (newValue) {\n      el.style.opacity = '1';\n      el.style.transition = 'opacity 0.3s';\n    } else {\n      el.style.opacity = '0';\n    }\n  });\n\n  // 返回清理函数（可选）\n  return () => {\n    // 指令被移除时执行的清理操作\n    console.log(\"清理show指令\");\n  };\n});\n```\n\n### 使用指令\n\n在JSX或模板中，指令通过`use-`前缀添加到元素上：\n\n```jsx\nfunction ConditionalDisplay() {\n  const visible = ref(true);\n  \n  const toggle = () => {\n    visible.value = !visible.value;\n  };\n  \n  return () => (\n    <div>\n      <button onClick={toggle}>切换显示</button>\n      <div use-show={visible.value}>\n        这个元素会根据visible的值显示或隐藏\n      </div>\n    </div>\n  );\n}\n```\n\n### 指令生命周期\n\n指令有简单的生命周期：\n\n1. **初始化**：指令首次应用到元素时执行\n2. **更新**：当指令的值发生变化时，通过update回调处理\n3. **清理**：当元素被卸载或指令被移除时执行\n\n### 指令的最佳实践\n\n1. **单一职责**：每个指令应该只关注一个特定功能\n2. **性能考虑**：避免在指令中执行重复的昂贵操作\n3. **清理资源**：始终返回清理函数来释放资源，如事件监听器\n4. **响应式值**：指令值通常应该是响应式的，以便在值变化时触发更新\n\n## 依赖注入\n\n```jsx\nimport { provide, inject } from 'speedy-jsx';\n\n// 在父组件中提供数据\nfunction Parent() {\n  provide('theme', {\n    primary: '#3498db',\n    secondary: '#2ecc71'\n  });\n  \n  return () => (\n    <div>\n      <Child />\n    </div>\n  );\n}\n\n// 在子组件中注入数据\nfunction Child() {\n  const theme = inject('theme', { primary: '#000', secondary: '#fff' });\n  \n  return () => (\n    <div style={{ color: theme.primary }}>\n      子组件内容\n    </div>\n  );\n}\n```\n\n## 批量更新和效果控制\n\n```javascript\nimport { batch, nextTick } from 'speedy-jsx';\n\n// 批量更新\nbatch(() => {\n  count1.value++;\n  count2.value++;\n  count3.value++;\n}); // 只会触发一次更新\n\n// 下一个DOM更新后执行\nnextTick(() => {\n  console.log('DOM已更新');\n});\n```\n\n## 生命周期钩子\n\n```jsx\nimport { onMounted, onUpdated, onUnmounted } from 'speedy-jsx';\n\nfunction MyComponent() {\n  onMounted(() => {\n    console.log('组件已挂载');\n  });\n  \n  onUpdated(() => {\n    console.log('组件已更新');\n  });\n  \n  onUnmounted(() => {\n    console.log('组件已卸载');\n  });\n  \n  return () => <div>组件内容</div>;\n}\n```\n\n## 资源管理与清理\n\nSpeedy提供了强大的资源管理机制，通过`$runScope()`函数可以轻松管理组件中的各种资源，确保在组件卸载时自动清理，避免内存泄漏。\n\n### 基本用法\n\n```jsx\nimport { $runScope } from 'speedy-jsx';\n\nfunction TimerComponent() {\n  const count = ref(0);\n  // 获取运行作用域\n  const run = $runScope();\n  \n  onMounted(() => {\n    \n    // 设置定时器，会在组件卸载时自动清理\n    run.setInterval(() => {\n      count.value++;\n    }, 1000);\n  });\n  \n  return () => <div>计数: {count.value}</div>;\n}\n```\n\n### 可用的资源管理API\n\n`$runScope()`提供了多种资源管理API：\n\n#### 定时器管理\n\n```jsx\nfunction TimerExample() {\n  const message = ref('');\n  const run = $runScope();\n  \n  onMounted(() => {\n    \n    // 设置定时器，自动清理\n    run.setTimeout(() => {\n      message.value = '已延迟3秒显示';\n    }, 3000);\n    \n    // 设置循环定时器，自动清理\n    run.setInterval(() => {\n      console.log('每秒执行一次');\n    }, 1000);\n  });\n  \n  return () => <div>{message.value}</div>;\n}\n```\n\n#### 事件监听器\n\n```jsx\nfunction EventListenerExample() {\n  const mousePosition = ref({ x: 0, y: 0 });\n  const run = $runScope();\n  \n  onMounted(() => {\n    \n    // 添加事件监听器，自动移除\n    run.onWindow('mousemove', (e) => {\n      mousePosition.value = { x: e.clientX, y: e.clientY };\n    });\n    \n    // 也可以使用更通用的on方法\n    const button = document.getElementById('my-button');\n    if (button) {\n      run.on(button, 'click', () => {\n        console.log('按钮被点击');\n      });\n    }\n  });\n  \n  return () => (\n    <div>鼠标位置: {mousePosition.value.x}, {mousePosition.value.y}</div>\n  );\n}\n```\n\n#### 动画帧管理\n\n```jsx\nfunction AnimationExample() {\n  const position = ref(0);\n  const run = $runScope();\n  \n  onMounted(() => {\n    \n    function animate() {\n      position.value += 5;\n      if (position.value < 500) {\n        run.requestAnimationFrame(animate);\n      }\n    }\n    \n    // 开始动画，自动取消\n    run.requestAnimationFrame(animate);\n  });\n  \n  return () => (\n    <div style={{ transform: `translateX(${position.value}px)` }}>\n      移动的元素\n    </div>\n  );\n}\n```\n\n#### 网络请求管理\n\n```jsx\nfunction FetchExample() {\n  const data = ref(null);\n  const loading = ref(false);\n  const error = ref(null);\n  const run = $runScope();\n  \n  function loadData() {\n    \n    loading.value = true;\n    error.value = null;\n    \n    // 创建可取消的fetch请求\n    run.fetch('https://api.example.com/data')\n      .then(response => response.json())\n      .then(result => {\n        data.value = result;\n        loading.value = false;\n      })\n      .catch(err => {\n        error.value = err.message;\n        loading.value = false;\n      });\n  }\n  \n  onMounted(loadData);\n  \n  return () => (\n    <div>\n      {loading.value && <p>加载中...</p>}\n      {error.value && <p>错误: {error.value}</p>}\n      {data.value && <p>数据: {JSON.stringify(data.value)}</p>}\n      <button onClick={loadData}>重新加载</button>\n    </div>\n  );\n}\n```\n\n#### WebSocket管理\n\n```jsx\nfunction ChatExample() {\n  const messages = ref([]);\n  const connection = ref(null);\n  const run = $runScope();\n  \n  onMounted(() => {\n    \n    // 创建WebSocket连接，自动关闭\n    const socket = run.createWebSocket('wss://chat.example.com');\n    \n    socket.onmessage = (event) => {\n      messages.value.push(JSON.parse(event.data));\n    };\n    \n    socket.onopen = () => {\n      console.log('连接已建立');\n    };\n    \n    connection.value = socket;\n  });\n  \n  function sendMessage(text) {\n    if (connection.value && connection.value.readyState === WebSocket.OPEN) {\n      connection.value.send(JSON.stringify({ text }));\n    }\n  }\n  \n  return () => (\n    <div>\n      <div className=\"messages\">\n        {messages.value.map((msg, i) => (\n          <div key={i}>{msg.text}</div>\n        ))}\n      </div>\n      <button onClick={() => sendMessage('Hello')}>发送消息</button>\n    </div>\n  );\n}\n```\n\n#### 观察器管理\n\n```jsx\nfunction ObserverExample() {\n  const isVisible = ref(false);\n  const elementSize = ref({ width: 0, height: 0 });\n  const run = $runScope();\n  \n  onMounted(() => {\n    const targetElement = document.getElementById('observed-element');\n    \n    if (targetElement) {\n      // 创建交叉观察器，自动断开连接\n      const intersectionObserver = run.createIntersectionObserver(\n        (entries) => {\n          isVisible.value = entries[0].isIntersecting;\n        },\n        { threshold: 0.1 }\n      );\n      intersectionObserver.observe(targetElement);\n      \n      // 创建尺寸观察器，自动断开连接\n      const resizeObserver = run.createResizeObserver((entries) => {\n        const rect = entries[0].contentRect;\n        elementSize.value = { width: rect.width, height: rect.height };\n      });\n      resizeObserver.observe(targetElement);\n    }\n  });\n  \n  return () => (\n    <div>\n      <div id=\"observed-element\" style={{ height: '200px', background: '#f0f0f0' }}>\n        被观察的元素\n      </div>\n      <p>元素{isVisible.value ? '可见' : '不可见'}</p>\n      <p>尺寸: {elementSize.value.width} x {elementSize.value.height}</p>\n    </div>\n  );\n}\n```\n\n#### 自定义清理函数\n\n```jsx\nfunction CustomCleanupExample() {\n  const thirdPartyLib = ref(null);\n  const run = $runScope();\n  \n  onMounted(() => {\n    \n    // 初始化第三方库\n    const instance = new SomeThirdPartyLib();\n    instance.initialize();\n    thirdPartyLib.value = instance;\n    \n    // 注册自定义清理函数\n    run.onCleanup(() => {\n      if (thirdPartyLib.value) {\n        thirdPartyLib.value.destroy();\n        thirdPartyLib.value = null;\n      }\n    });\n  });\n  \n  return () => <div>第三方库示例</div>;\n}\n```\n\n#### 可取消的Promise\n\n```jsx\nfunction CancelablePromiseExample() {\n  const data = ref(null);\n  const loading = ref(false);\n  const run = $runScope();\n  \n  function loadData() {\n    loading.value = true;\n    \n    // 创建可取消的Promise\n    const { promise } = run.createCancelablePormise((resolve, reject) => {\n      // 模拟长时间运行的异步操作\n      setTimeout(() => {\n        resolve({ result: 'Success' });\n      }, 3000);\n    });\n    \n    promise\n      .then(result => {\n        data.value = result;\n        loading.value = false;\n      })\n      .catch(err => {\n        if (err.canceled) {\n          console.log('操作已取消');\n        } else {\n          console.error('发生错误:', err);\n        }\n        loading.value = false;\n      });\n  }\n  \n  onMounted(loadData);\n  \n  return () => (\n    <div>\n      {loading.value ? <p>加载中...</p> : <p>数据: {JSON.stringify(data.value)}</p>}\n      <button onClick={loadData}>重新加载</button>\n    </div>\n  );\n}\n```\n\n### 避免内存泄漏的最佳实践\n\n使用`$runScope()`可以有效避免以下常见的内存泄漏源：\n\n1. **未清理的定时器**: 使用`run.setTimeout`和`run.setInterval`代替原生方法\n2. **未移除的事件监听器**: 使用`run.on`、`run.onWindow`和`run.onDocument`添加事件监听\n3. **未关闭的网络连接**: 使用`run.fetch`和`run.createWebSocket`管理网络请求\n4. **未断开连接的观察器**: 使用`run.create*Observer`系列方法创建各种观察器\n5. **第三方库资源**: 使用`run.onCleanup`注册自定义清理函数\n\n通过这些API，您可以编写更加健壮的组件，无需担心资源泄漏问题。\n\n## API文档\n\n完整的API文档请参考类型定义文件。\n","readmeFilename":"README.md"}