{"_id":"twin-node","_rev":"33-b991173ee110ca549082ad5f4c179c83","name":"twin-node","dist-tags":{"latest":"1.0.31"},"versions":{"1.0.0":{"name":"twin-node","version":"1.0.0","keywords":[],"author":{"name":"zhang_xiangm@163.com"},"license":"ISC","_id":"twin-node@1.0.0","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"cf16f2b511a16cb8cac385fd9c1ac258e00ed713","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.0.tgz","fileCount":3,"integrity":"sha512-SFyfGPA/AVMEUo8Bgpc/5ZpiggL3W1x1W5oVtCXW/UE/tR3JWN49Y5pu0p8G9F/4GuKsaJUFVj/EHUZOpvRNFw==","signatures":[{"sig":"MEQCIAmRSNhmlnIEla+uiW27vCCfMxCZgy6Bpyro06k6R4BAAiA6ql/hVlaAh877CcMucyQTM8DvxCXETaIw2eMULrT34w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28007},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.0_1753618778102_0.4902940661570714","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"twin-node","version":"1.0.1","keywords":[],"author":{"name":"zhang_xiangm@163.com"},"license":"ISC","_id":"twin-node@1.0.1","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"72eaa1eac7a62d8d3dce7d1607eb3cc8f347af07","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.1.tgz","fileCount":4,"integrity":"sha512-65oTrtPFqNLN0UQxXo8r2frHns1VUsN73nv84/IICnbDODv4qlhP2Oh/oWcUJkZnP3WbZULcaWVDD9kk0rWJsw==","signatures":[{"sig":"MEUCIQD3aCsGa7kHNfZslOdDRqVx9rrsa2KSBZolPQJnZPd6NwIge17TkLYV9P1bI2kdAkXo3yhj/ZrkhXmGS9wAC/Z30fQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43167},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.1_1753620783819_0.9521412350021115","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"twin-node","version":"1.0.3","keywords":[],"author":{"name":"zhang_xiangm@163.com"},"license":"ISC","_id":"twin-node@1.0.3","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"72dbfdea92c9cdcb35309f97f7f228008eb0f101","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.3.tgz","fileCount":5,"integrity":"sha512-TcX0PvlmIeAbAWmirILrsiuhCSZf8mfXQHQGX09Fxn2jhXwYKLLT5gSAljK4OtWthQAeO+n1NT3zgCHbvxEKgA==","signatures":[{"sig":"MEUCIBtd65X/ioaTwG9W3zjkmHhcnfE4nGPQIkoWC3hb0IXrAiEA38iUUgzilNUFnM+0L2707rwaYvZcWTyvzHO3MC6IopI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52633},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node是一个轻量级html文档构建库，提供声明式构建和链式配置两大核心功能。其专注于高性能场景，提倡的编程范式是反MVVM，反虚拟DOM。","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.3_1753632971395_0.5894156323232849","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"twin-node","version":"1.0.4","keywords":[],"author":{"name":"zhang_xiangm@163.com"},"license":"ISC","_id":"twin-node@1.0.4","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"e393b59f6881924500ac32c33845a6b2917eb605","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.4.tgz","fileCount":5,"integrity":"sha512-ha0o6f0yAXXPkcKX/Ru7V8wtxIiRaGseX6xqVyS7NEO2UJCC75j6N+ZLL27cRDlY8T3hXao8bAEBxybgXnMHNg==","signatures":[{"sig":"MEQCIBcsEM/SF4oWB1b9ixrIMhxG46LsdxmwjzKgNRwyfOrrAiB69weAmAKYxfz68tuhKFmTWLTl1ZgSI6Y+GZe6C1q+wg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56840},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"TwinNode是一个轻量级html文档构建库，提供声明式构建和扁平化配置两大核心功能。无虚拟DOM，专注于高性能场景。","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.4_1753682057707_0.11494133969592535","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"twin-node","version":"1.0.5","keywords":[],"author":{"name":"zhang_xiangm@163.com"},"license":"ISC","_id":"twin-node@1.0.5","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"c49654d192a00a13464782d785665f8ed44b45f4","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.5.tgz","fileCount":6,"integrity":"sha512-uMXFPlhquVlaPVZDzzUKYrcf0tmSlo4YJPgG56phOLmzyP+fhloYUeDeAZJpJms2SQxR+50ZbtYpBW0NX0IO1A==","signatures":[{"sig":"MEYCIQCSw/UaYjGAuWVdSsFB9LGsz9ZcEJXVd4xP/ksYoegMbQIhALFJPOiWLFA+Yz+0AaLmSObvreVHwZdsi2QEEjS8elCC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59462},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"TwinNode是一个轻量级html文档构建库，提供声明式构建和扁平化配置两大核心功能。无虚拟DOM，专注于高性能场景。","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.5_1753695977768_0.06810609257636524","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"twin-node","version":"1.0.6","keywords":[],"author":{"name":"zhang_xiangm@163.com"},"license":"ISC","_id":"twin-node@1.0.6","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"4d1e486c167d6052b1712bf31bdd98e404331406","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.6.tgz","fileCount":6,"integrity":"sha512-SquL0XHatLrSCzHxcdo7wJqW3kcQsm0djjJtCXmCVsUYXkmOZoUpOuQOUiazhBatBJsRFsYGll1n0v8NidvhbA==","signatures":[{"sig":"MEQCIGMZtEHQws6YEoy+jRh2fkDu3+sbB4znnoXOvYWak8YiAiAxxpDOu7MYPsNZebUqfsRRAL+zveh5shaRzOO9+H1CkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83123},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"TwinNode是一个轻量级html文档构建库，提供声明式构建和扁平化配置两大核心功能。无虚拟DOM，专注于高性能场景。","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.6_1754148812666_0.7403631364222425","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"twin-node","version":"1.0.7","keywords":[],"author":{"name":"zhang_xiangm@163.com"},"license":"ISC","_id":"twin-node@1.0.7","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"a7998542621c20c6d8ca0092ca30db06ca2341ce","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.7.tgz","fileCount":6,"integrity":"sha512-ao0Uv78AnSLr732+oeGOTUWYjBya2HPTIhNnS0lVnuKvP/jBVFeZgkkhMQBkrgKNWsTBZ1/8wzwtiN/31L3ZtQ==","signatures":[{"sig":"MEUCIQDciazufeKHLbsyOgH0PBo8TKUL5XsczDFAHkEia3jILwIgPP6aRMWVnoHqCIK4ZZN6DWgWujkXUEaAVbdwRnjKkFo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82407},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"TwinNode是一个轻量级html文档构建库，提供声明式构建和扁平化配置两大核心功能。无虚拟DOM，专注于高性能场景。","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.7_1754222970150_0.43531844079184245","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"twin-node","version":"1.0.8","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"ISC","_id":"twin-node@1.0.8","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"d89900ff77ba4505c156e230dcc9d2b6ca236c5d","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.8.tgz","fileCount":5,"integrity":"sha512-tS9JrOIqyETpD00kGArOxpIxF6c2qm7TjVajgFjZ9if1RrIQ+9PbzqpOipx5ufPKMNlRCEg4Jea8zt0f9spM5Q==","signatures":[{"sig":"MEYCIQD+o+DkSKxqinUKPIpdXwz6pbkaipCLCnmBu7JFGtpunwIhANqw6K5UreaEguNWNssESpuWTjYOwzcG7JerzDia93FJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56417},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.8_1754364907996_0.3055539426113616","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"twin-node","version":"1.0.9","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.9","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"6783f5a0d925601608efc9b24629c48e4b663226","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.9.tgz","fileCount":5,"integrity":"sha512-CLkKWiMj1oiveyXAKSScGxMxrTCZUiC0P4v5h0PO/uMLE+J2YBwPJ4+yYsa3K+SByntptYN1oTvv5mZYBbbUew==","signatures":[{"sig":"MEQCIGRXfhmVA9K0eMMXx81dr7WrNAomprzCjRMHm2qUqJFeAiA96IMjFt0zdsqGC3nbZeY8xDql5fPZhVQZum/dfDBjXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54187},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.9_1754384538258_0.7940428265235548","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"twin-node","version":"1.0.10","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.10","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"7ece1599a82c8207e148bb8b6795ec5a9f04c235","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.10.tgz","fileCount":5,"integrity":"sha512-5g8ORrd1MWCm4STmeMJip/RLv3XFet7Ts4yioeexWJl4KA/19jOrXntaBaQq+D90Mf9js/pry78cDKdjdBEwkg==","signatures":[{"sig":"MEQCIAbpTloV5qpQ9lN6fCdTfjddtpOJxYPk5R4/jMnZhrLbAiBOQF/UOHiUdQ2MEhczsRE/axxktW67mvXSEhpE88h16Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54222},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.10_1754386220296_0.9319373324965963","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"twin-node","version":"1.0.11","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.11","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"bbb31a06047cca89bfabc2e2ee0892bfa1a5b08a","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.11.tgz","fileCount":5,"integrity":"sha512-yvtHm4KldbLjvF9J5k8bRbKZFR1zbieAsITxkLf9OTlEOQiVCpEHuipjkaOqrTmPFXu7GKWQ+amKvuexerReyw==","signatures":[{"sig":"MEYCIQDomhinexYrJzPZGMm0R0FDB24rOKSE3eDRNnxFSpiMAQIhAP67fThRLPVkbyp/x73CA55/PQcOPZzeIrwKGaitdJ6d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54202},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.11_1754484783920_0.9957474972351403","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"twin-node","version":"1.0.12","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.12","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"57f156da78ea8c4ff297e5b3c8eac6d440487949","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.12.tgz","fileCount":5,"integrity":"sha512-HrNooCj42fF8zZimS+nwYv92bQPu8C61hijyfy534DAkKvMwcRVFFw2g+IuE+L64hpNswBBlOLYcu9f22X+CFw==","signatures":[{"sig":"MEQCICMdx6y4PtFROFylr0lLGQLO6GKdF1LymhEuxXCruK1mAiB5VYcxuKoS0L1fZ5pAbAsoqOul151SP+iVe8fR8Ui9hQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54143},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.12_1754717475541_0.8557344259383035","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"twin-node","version":"1.0.13","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.13","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"7808e2a5b986b80ffe98623e59c48d807fb7b680","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.13.tgz","fileCount":5,"integrity":"sha512-FL+ziER9/MZnt1CRVJ8JkAtiWMmX8tTjQGSEg/AhGmX2Tot8do4QZ6HtMpMeCHqGnEIOcLrIkMO4SCQignakiA==","signatures":[{"sig":"MEUCIFiRarROZ7L081Zjxr7P40eSUTUVNAgMRX1Jsg1aVlnSAiEA8XvtbD2cVoVdY0Qz/QkkMbzWbnVBb77qRksGT4lXSvU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54188},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.13_1754717899397_0.045626347059531946","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"twin-node","version":"1.0.14","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.14","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"9242a3e8abafcc8252ab0afedbb09107c01c8f5a","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.14.tgz","fileCount":5,"integrity":"sha512-iVw/Q2mPvRPuc+g1HjTYH2vafbsKXVCq+lU1QWFrqPvj3CLxMk5UAYRzR/RQHU6+OftgR4SdXF5Kzfk76sBhpw==","signatures":[{"sig":"MEUCIHMvGNaFIGox6HthShLHy7dzo51j33NVsBUvHfL3ro+QAiEAq/yxi2ZoaHQ9vBs+6/5WmO83XmHhKboXzgqaFOCFwOU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55231},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.14_1754749931959_0.3495531995407499","host":"s3://npm-registry-packages-npm-production"}},"1.0.15":{"name":"twin-node","version":"1.0.15","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.15","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"7a750c284f1718b53eb03c4231a7bdea0ce8caae","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.15.tgz","fileCount":5,"integrity":"sha512-y+XUODAMTWWuF18oTnDgGEopNCNdYBZ06+4htVZN2ZV7c7+cgezcbarnaAjjazhhJcfFqpNUyK+RHNEZot22zw==","signatures":[{"sig":"MEYCIQCVUa5M7h99AtOTgmpzVBdK//kGfGy2u3na7Odmgq8VuQIhAOo0QtOWy4r6sCGlxTC7xaHczrz+jn2+t/UnbtMl+Ux0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60674},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.15_1754794203497_0.9414933953701887","host":"s3://npm-registry-packages-npm-production"}},"1.0.16":{"name":"twin-node","version":"1.0.16","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.16","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"787dca41f197fbfcff4209aee22058427875da82","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.16.tgz","fileCount":5,"integrity":"sha512-oRggVrMsaD9zhaXI8nYogeyNDcPsTRv4herkP50YpXQIFylhPlFKQI1QAhccxhZuyfML3JGqD0yo0bobGqcaKg==","signatures":[{"sig":"MEYCIQCuUBSg7knZH8OardJ9MCO+DT84SAQQNEyzkh7//YL7AAIhAKjYFlIwr0khddNPgR7/3vwls5BieSPKBKnCjB/F5/SY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60590},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.16_1754794503512_0.4159452324684054","host":"s3://npm-registry-packages-npm-production"}},"1.0.17":{"name":"twin-node","version":"1.0.17","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.17","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"832c75ea66bf9b036e9c61e61e3d4738c8269daa","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.17.tgz","fileCount":5,"integrity":"sha512-fELIml+mJMFczmv5+t2puFBa5fkd+OwUbN4xVAqu/SlTPJ9/PcVfbBsZzoQ6gu34L7Pb91Lrts6vDLDDBPIGpw==","signatures":[{"sig":"MEYCIQCQYFX2xyu31esuesPK9sBrUPiZKujO/6WkwfvPq2IbRAIhAIoM9vKZLarAKAOJFVad0HHIPatncdkxRH+CQnGBDEIZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60618},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.17_1755218198401_0.8424564191472208","host":"s3://npm-registry-packages-npm-production"}},"1.0.18":{"name":"twin-node","version":"1.0.18","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.18","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"5baba882feeba2cc171cf467dc90e437caca6bbb","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.18.tgz","fileCount":5,"integrity":"sha512-F0RH4CSKpIwZHbUQJegbBsbhRHfy8poc0ltzWZPcpAS9ngPPsJ5bm+jQdQT433iLuCPC7AtI+XXXfIr8833XiQ==","signatures":[{"sig":"MEYCIQCnydg9OXjXZ7i5iqE3opTYt3K2k7Jf6VEGAXUMMv+JEQIhAIEMqQujnDeL4uSGIDOR/HzCLRsqxEIlEa72VBSUIer+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60674},"main":"twin-node.js","scripts":{},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.18_1755218415612_0.03812062176445208","host":"s3://npm-registry-packages-npm-production"}},"1.0.19":{"name":"twin-node","version":"1.0.19","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.19","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"5d1ad4cc308ca24557c5066e97795c45b896b822","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.19.tgz","fileCount":5,"integrity":"sha512-BbmTy9anNle8cWVS8WdTWDUaDFhZ8XYe/WhIsJEJ3FdL4XIMW7WC/b7OGiwvecuu2freH+4VEcXxakxr63geow==","signatures":[{"sig":"MEUCIFUF8RrlvFIbJjPbNwMN/5uW7WizoU2kHWRXwZ82jtneAiEA/TWO/8Qoqy8B7pUnQU+l/OMUFXOFeOV/ZFI2Uwe36lQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44061},"main":"twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^27.5.1","webpack":"^5.101.3","webpack-cli":"^5.1.4","copy-webpack-plugin":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.19_1756108714267_0.6643030305013857","host":"s3://npm-registry-packages-npm-production"}},"1.0.20":{"name":"twin-node","version":"1.0.20","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.20","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"a0a5dc0d95f9ae1ca337b5c9a48e4b0ba88a882b","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.20.tgz","fileCount":7,"integrity":"sha512-+fxwHUjl5d6ZEv7ftH6a+tRhHQkkelt0mLEEtXXRPzKZ317KqQFKvXld7VIO58O3LUoNWsbIPnjrJDInGY3CiQ==","signatures":[{"sig":"MEUCIHhbES7oqFjknp6PJvU+qekCZfd/ca5XpiogsXYXswc6AiEAoSR/YIpVnYDIjtO42KiNtj8mdfAaQJPy3sKEX3hhf24=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89772},"main":"dist/twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4","copy-webpack-plugin":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.20_1756110019348_0.003300281572762076","host":"s3://npm-registry-packages-npm-production"}},"1.0.21":{"name":"twin-node","version":"1.0.21","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.21","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"c1b9c4cabaf7394c51583846b34c1c1caa96a11f","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.21.tgz","fileCount":4,"integrity":"sha512-QtccRse62ijfuWkCV8eCwkOy9BAYqcBA72fVqw8o0U5N0WUIrJXgJFWXN1EwVZVbSw0Yc4F9U+1a6SFjhe0p1A==","signatures":[{"sig":"MEQCICYlewPw0fUr/MoMyTjgasKKXR0CJ8OyAAkEVWsetVGVAiAqrQ4eCQy5NZW2TxVkSNv/SjCRX1AL0BElJzYgLfZ5IQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41610},"main":"dist/twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.21_1756110710830_0.171816496638157","host":"s3://npm-registry-packages-npm-production"}},"1.0.22":{"name":"twin-node","version":"1.0.22","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.22","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"7498f09e809f61c36690ed6dac1d8446ab8cbedc","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.22.tgz","fileCount":5,"integrity":"sha512-24Fhzgq1QztrXbXT4pVhBNRp5FPFWho6AbT6wN4Pmwamb7CA4tEmVxNOjSwx5sYDvs7QC+UmJfq7UoR3i/a0WQ==","signatures":[{"sig":"MEUCIQDZ3nkVMn9GMvyZbQ6b5n0Oz6Cfrz+ftjBmsiyUJv49FAIgSdszB5Lzr1iUZhvbm/qK2VdXAAHPleNMR+9gwzKXt38=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68584},"main":"dist/twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.22_1756111695943_0.9134281884444984","host":"s3://npm-registry-packages-npm-production"}},"1.0.23":{"name":"twin-node","version":"1.0.23","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.23","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"11b910cb179c6c1a41f42bee71f25374e1370d7a","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.23.tgz","fileCount":6,"integrity":"sha512-zxG8IeiVvM0//e5/00ZTAFVgwuyr6VPwSyp2TD4c8DdMrW67hXEWqY74aMKotpHJEBQK2cBUj3uLP3XZur31Fw==","signatures":[{"sig":"MEUCIDoyoh9A+33b47C6I+8VieudTeijitJoGP+ik0h86tnQAiEA49IROyhG8J4kH/5sMz+1f+RSPmKfxmO0ifruEbLiDCE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70104},"main":"dist/twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.23_1756123418191_0.78598456538966","host":"s3://npm-registry-packages-npm-production"}},"1.0.24":{"name":"twin-node","version":"1.0.24","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.24","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"487a618f7f9cc51f8b8094e6d60fa19bbbbf391b","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.24.tgz","fileCount":6,"integrity":"sha512-iKIIMdWeiweZiLnLL8B6JRuScerBXqVoquvYS0Cb8NFs5umPlcVP2DaNMj2ZE/m0C3JrGiDVt6JoqOyyGRNHzw==","signatures":[{"sig":"MEQCIAKd64mCsLG0ZOYrlt2hlhAtAYtmj2k1uRnLFJmnOutFAiBzX1KLvaUHfMJitXCFlJROExjpYmzdrSA6e5hDG+TJxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69970},"main":"dist/twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.24_1756134394362_0.07545251936751773","host":"s3://npm-registry-packages-npm-production"}},"1.0.25":{"name":"twin-node","version":"1.0.25","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.25","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"086ef07fe0fb4ff4e2c8865456bec810207f1f0c","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.25.tgz","fileCount":6,"integrity":"sha512-flfvjdaxW2ZmhoV85Oy7stQXJJgMrAA7ZHHkdkjCQHySBiNEjvi6IDmoKtjWRbBTyROVuiOIx7NdSlOox6zx5g==","signatures":[{"sig":"MEUCIQCzIoVGJ6J4dh07yhEznHwQImlSNMJ09WeQ85sofoYTjAIgC5ILQAuX3XpyCOSFMg3aQUkpGon0DysCV8h1t6a8E3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70488},"main":"dist/twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.25_1756135336394_0.04282707777513606","host":"s3://npm-registry-packages-npm-production"}},"1.0.26":{"name":"twin-node","version":"1.0.26","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.26","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"ad9ceececf32ac4a09c0da4b66592d25aa3f1132","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.26.tgz","fileCount":6,"integrity":"sha512-vwE7KUjhpGwv8s8nVFxp1hB6hwdOamHacABk2Xl7nHxj1kF6VnQNz+pLJUQZGmpg+msJOl1lhQGcZXlXCpa2Vg==","signatures":[{"sig":"MEUCIQDmGN2wJviOqwfWXNOC0PETCOtKHGOqf141K/T3ErcZjAIgH2qLt7IRv4rLQwKVcNakVhFSMhb1IjS0TFLKhJ0wowg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70488},"main":"dist/twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.26_1756168971439_0.43517335873850715","host":"s3://npm-registry-packages-npm-production"}},"1.0.27":{"name":"twin-node","version":"1.0.27","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.27","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"db3b1b0b7be7156105b8e976c05b548b577226d3","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.27.tgz","fileCount":6,"integrity":"sha512-zg06lsEV/9dgRD199ddoELMCqoo6Y+QKfXvI1FpdAJoiTCILR7C/TRhe/4/E3Q3kmOqdJ1qHW3fPdIAiuv7r3g==","signatures":[{"sig":"MEUCIQCJOKUd9ii3dxdvC4aq4KhPmlzu9cNwsrw3Fem7K4q6ZwIgc8rfPv9mjZANx0wNFwqWWqSvgeIh+cvcOuwWEsZRpvQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69921},"main":"dist/twin-node.js","scripts":{"build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.27_1756169377038_0.24117392439036367","host":"s3://npm-registry-packages-npm-production"}},"1.0.28":{"name":"twin-node","version":"1.0.28","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.28","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"96862392fc20b5db18ddb6c8f99caef2c7d50565","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.28.tgz","fileCount":7,"integrity":"sha512-/yjz4XR87XZ9crjfKC/v9DvGr8zv6xzPnWO41/fdMKxIShJyNnQ8Zcm1KK71vaVELVQeV7MhO4SIZnw+LU8LSQ==","signatures":[{"sig":"MEUCIF7mmH2SVF+ONEy7xFARIiiMye3tf9DH+Y3u0GAYQyB5AiEA2pwFWiXI/asgSTGCmwiNIMkhKa4xrSc4CcRpI0RgVhA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91341},"main":"dist/twin-node.js","scripts":{"dev":"webpack-dev-server --progress --mode development","build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4","webpack-dev-server":"^5.1.0","copy-webpack-plugin":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.28_1757644800959_0.9716725888187603","host":"s3://npm-registry-packages-npm-production"}},"1.0.29":{"name":"twin-node","version":"1.0.29","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.29","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"8b683bd9b6d6994be72db2e4f3625c99cd392730","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.29.tgz","fileCount":7,"integrity":"sha512-myrL5BbZI+gyYRuiuCqCPqXPfbSFoKE6eCBD1IFVGE5WIIrAeE5au8QqmVHu6MqsBR22UkD9zRBOsJG10R6Myw==","signatures":[{"sig":"MEYCIQDzMzAO1kPZJ5yNFJNlFXtWiUFpaTm5pVvhSk/R9ccnaAIhAI6xw4p90t5Xi6a4wlXSnlOq5Y+7oqFGYschi1S5yzDm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91196},"main":"dist/twin-node.js","scripts":{"dev":"webpack-dev-server --progress --mode development","build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4","webpack-dev-server":"^5.1.0","copy-webpack-plugin":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.29_1757662281827_0.767602088297169","host":"s3://npm-registry-packages-npm-production"}},"1.0.30":{"name":"twin-node","version":"1.0.30","keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","_id":"twin-node@1.0.30","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"dist":{"shasum":"715e04f754d5206a6880ac7217f648b8abdf362a","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.30.tgz","fileCount":7,"integrity":"sha512-cialAgjYbNgG4dErrgMNQhc1P7GcdXLM36LjlR/y64SoV3sk6EsKpqu3hqzAIrVYy/28ICghMM+SFdSqFYaENw==","signatures":[{"sig":"MEUCIDypk2niPPEdCgchq/8NKfLre1m6zOrZISC3/WjA0L4MAiEA2FSFfYy5ZqyFuJCiBtuCB3Re5KJOModJgo+m40fYwfg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87524},"main":"dist/twin-node.js","scripts":{"dev":"webpack-dev-server --progress --mode development","build":"webpack --mode production","prepack":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"_npmVersion":"10.9.2","description":"twin-node,声明式构建和配置html文档","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4","webpack-dev-server":"^5.1.0","copy-webpack-plugin":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/twin-node_1.0.30_1757928609410_0.06707682052909991","host":"s3://npm-registry-packages-npm-production"}},"1.0.31":{"name":"twin-node","version":"1.0.31","main":"dist/twin-node.js","scripts":{"dev":"webpack-dev-server --progress --mode development","build":"webpack --mode production","prepublishOnly":"npm run build","prepack":"npm run build"},"devDependencies":{"webpack":"^5.101.3","webpack-cli":"^5.1.4","copy-webpack-plugin":"^11.0.0","webpack-dev-server":"^5.1.0"},"keywords":["声明式构建和配置html文档","无虚拟DOM"],"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","description":"twin-node,声明式构建和配置html文档","_id":"twin-node@1.0.31","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-gNRXHzGkwpT+WiKti2n3fLLA+qbhue647XSI4HSMEOTdNtNEGSkPkfUehjESPES3SHytC0GxjZCzjAn9U0DuBQ==","shasum":"8f1d61a1430993ac73f5aecef22defc4c9cab103","tarball":"https://registry.npmjs.org/twin-node/-/twin-node-1.0.31.tgz","fileCount":10,"unpackedSize":85902,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCmMBH9IySrnMk78XevQIEKl81nDYU51JOuybirjSqAYwIhAKkk++Tz7a8nko9uXVnwrcGyEPpgFlK5cFF8fWbSiWRZ"}]},"_npmUser":{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"},"directories":{},"maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/twin-node_1.0.31_1758276594781_0.6187598773284086"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-27T12:19:38.101Z","modified":"2025-09-19T10:09:55.192Z","1.0.0":"2025-07-27T12:19:38.367Z","1.0.1":"2025-07-27T12:53:04.049Z","1.0.2":"2025-07-27T13:08:27.229Z","1.0.3":"2025-07-27T16:16:11.612Z","1.0.4":"2025-07-28T05:54:17.900Z","1.0.5":"2025-07-28T09:46:17.954Z","1.0.6":"2025-08-02T15:33:32.890Z","1.0.7":"2025-08-03T12:09:30.378Z","1.0.8":"2025-08-05T03:35:08.227Z","1.0.9":"2025-08-05T09:02:18.443Z","1.0.10":"2025-08-05T09:30:20.515Z","1.0.11":"2025-08-06T12:53:04.094Z","1.0.12":"2025-08-09T05:31:15.723Z","1.0.13":"2025-08-09T05:38:19.576Z","1.0.14":"2025-08-09T14:32:12.159Z","1.0.15":"2025-08-10T02:50:03.701Z","1.0.16":"2025-08-10T02:55:03.686Z","1.0.17":"2025-08-15T00:36:38.602Z","1.0.18":"2025-08-15T00:40:15.837Z","1.0.19":"2025-08-25T07:58:34.451Z","1.0.20":"2025-08-25T08:20:19.572Z","1.0.21":"2025-08-25T08:31:51.036Z","1.0.22":"2025-08-25T08:48:16.147Z","1.0.23":"2025-08-25T12:03:38.364Z","1.0.24":"2025-08-25T15:06:34.560Z","1.0.25":"2025-08-25T15:22:16.583Z","1.0.26":"2025-08-26T00:42:51.611Z","1.0.27":"2025-08-26T00:49:37.209Z","1.0.28":"2025-09-12T02:40:01.143Z","1.0.29":"2025-09-12T07:31:22.004Z","1.0.30":"2025-09-15T09:30:09.592Z","1.0.31":"2025-09-19T10:09:55.021Z"},"author":{"name":"zhang_xiangm@163.com"},"license":"MIT","keywords":["声明式构建和配置html文档","无虚拟DOM"],"description":"twin-node,声明式构建和配置html文档","maintainers":[{"name":"zhang_xiangm","email":"zhang_xiangm@163.com"}],"readme":"# twin-node.js\r\n\r\n## 简介\r\n\r\ntwin-node是一个返璞归真的html文档构建和处理库。提供声明式构建、链式配置、WebComponents集成、动态代理四大核心功能。无脚手架，无虚拟DOM，专注于高性能场景。\r\n\r\n## 安装\r\n\r\n- 原生脚本引入\r\n\r\n```html\r\n<script src=\"twin-node.js\"></script>\r\n```\r\n\r\n- npm安装\r\n\r\n```console\r\nnpm i twin-node\r\n```\r\n\r\n- 模块化导入\r\n\r\n```javascript\r\n//注意twin-node只支持这一种导入方式，不支持命名导入\r\nimport \"twin-node\"\r\n```\r\n\r\n## 快速上手\r\n\r\ntwin-node提供javascript偏好和html偏好两种风格的页面构建方式，请根据您的偏好选择一种或两种风格混合使用。\r\n\r\n- javascript偏好\r\n\r\n```html\r\n<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n  <title>快速上手</title>\r\n  <script src=\"twin-node.js\"></script>\r\n</head>\r\n<body>\r\n  <div id=\"app\"></div>\r\n  <script>\r\n    //第一步：用以下标准语法解构出标签函数，注意函数名必须与标签名完全一致\r\n    const {table,thead,tbody,tr,th,td} = $$.tags\r\n    //第二步：声明式构建文档\r\n    const node = table(\r\n      thead(\r\n        tr(\r\n          th(\"学号\"),th(\"姓名\"),th(\"性别\")\r\n        )\r\n      ),\r\n      tbody(\r\n        tr(\r\n          td(1),td(\"张向明\"),td(\"男\"),\r\n        ),\r\n        tr(\r\n          td(2),td(\"蒋海艳\"),td(\"女\"),\r\n        )\r\n      )\r\n    )\r\n    //第三步：挂载\r\n    node.render(\"#app\")\r\n  </script>\r\n</body>\r\n</html>\r\n```\r\n\r\n- html偏好\r\n\r\n```html\r\n<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n  <title>快速上手</title>\r\n  <script src=\"twin-node.js\"></script>\r\n</head>\r\n<body>\r\n\r\n  <!-- 页面骨架 -->\r\n  <header></header>\r\n  <main></main>\r\n  <footer></footer>\r\n\r\n  <!-- 页头组件 -->\r\n  <template id=\"tempalte1\">\r\n    <!-- 以下使用了一个极端的css选择器，但不会污染外部样式 -->\r\n    <style>\r\n      *{background-color:red;}\r\n    </style>\r\n    <div>这是页头</div>\r\n  </template>\r\n\r\n  <!-- 主体组件 -->\r\n  <template id=\"tempalte2\">\r\n    <div>这是网页主体</div>\r\n  </template>\r\n\r\n  <!-- 页脚组件 -->\r\n  <template id=\"tempalte3\">\r\n    <div>这是页脚</div>\r\n  </template>\r\n\r\n  <script>\r\n    //shadowTemplate函数会为当前节点创建一个ShadowRoot，然后将template的内容复制到ShadowRoot中\r\n    $$.query(\"header\").shadowTemplate(\"#template1\");\r\n    $$.query(\"main\").shadowTemplate(\"#template2\");\r\n    $$.query(\"footer\").shadowTemplate(\"#template3\");\r\n  </script>\r\n\r\n</body>\r\n</html>\r\n```\r\n\r\n## 帮助文档\r\n\r\n### 1. 概念\r\n\r\n#### 1.1 孪生节点\r\n\r\n孪生节点是在Node实例（以下统一称为真节点）上构建的一层代理，其实现原理是一个Proxy。孪生节点的目的是为了使用精简指令集来操作真节点的对象属性、标签属性、样式、事件，并提供链式写法。请看如下示例：\r\n\r\n```javascript\r\n$$(\"div\")                   //创建了一个div真节点，并返回其孪生节点\r\n  .porp(\"id\",\"div1\")        //用prop配置对象属性\r\n  .attr(\"title\",\"div1\")     //用attr配置标签属性\r\n  .class(\"my-div\")          //用class配置类名\r\n  .css(\"color\",\"red\")       //用css配置样式\r\n  .on(\"click\",event=>console.log(event))  //用on配置事件\r\n```\r\n\r\n#### 1.2 动态代理\r\n\r\n动态代理是指使用特殊前缀的函数来为真节点配置对象属性、标签属性、样式属性、事件。这些函数都是动态创建的，因此能够向后兼容所有的节点属性。\r\n\r\n```javascript\r\n$$(\"div\")                   \r\n  .id(\"div1\")               //小驼峰命名的动态代理用来配置对象属性\r\n  ._title(\"div1\")           //下划线开始的动态代理用来配置标签属性\r\n  .$color(\"red\")            //$符号开始的动态代理用来配置样式\r\n  .Click(event=>console.log(event))  //大驼峰命名的动态代理用来配置事件\r\n```\r\n\r\n#### 1.3 TwinNode函数\r\n\r\nTwinNode是一个用来构建孪生节点的函数，其简写形式为$$，以下全部用简写形式。此外TwinNode有一个使用非常频繁的静态方法TwinNode.query(selector),其作用是在document下搜索DOM节点，并包装为孪生节点。\r\n\r\n``` javascript\r\nlet twinNode1 = $$(\"div\")  //创建了一个div真节点，并返回其孪生节点\r\nlet twinNode2 = $$(document.querySelector(\"div\"))  //将已经存在的真节点包装为孪生节点\r\nlet twinNode3 = $$.query(\"div\")  //等效于$$(document.querySelector(\"div\"))\r\n```\r\n\r\n#### 1.4 标签函数\r\n\r\n标签函数是用来声明式构建孪生节点的函数，可以使用以下两种方式来获得标签函数：\r\n\r\n```javascript\r\n//1: 通过对象解构语法获得，要求标签函数名与要构建的DOM节点标签名完全一致，\r\n//   请不要担心$$.tags中没有你想要的标签函数，底层是一个Proxy，你想要就一定有\r\nconst {div,span} = $$.tags  \r\n//2: 通过TwinNode.defineTag获取，可自定义函数名\r\nconst myDiv = $$.defineTag(\"div\")\r\n```\r\n\r\n声明式构建孪生节点示例\r\n\r\n```javascript\r\nconst {table,tr,td} = $$.tags\r\nlet twinNode = table(\r\n  tr(\r\n    td(\"单元格11\"),\r\n    td(\"单元格12\"),\r\n  ),\r\n  tr(\r\n    td(\"单元格21\"),\r\n    td(\"单元格22\"),\r\n  )\r\n)\r\n```\r\n\r\n#### 1.5 解孪生\r\n\r\n解孪生是指从孪生节点上获取其真节点的过程，通过孪生节点的下标0就可以完成解孪生\r\n\r\n```javascript\r\nconst div = $$.tags.div       //创建标签函数\r\nconst twinNode = div(\"内容\")  //创建孪生节点\r\nconst realNode = twinNode[0]  //解孪生\r\n```\r\n\r\n#### 1.6 无参函数组件\r\n\r\n所谓函数组件就是一个能够返回孪生节点或真节点的函数，命名为函数组件是为了区别于WebComponents组件，以下是创建函数组件和复用函数组件的过程\r\n\r\n```javascript\r\n//定义函数既是创建组件\r\nfunction component() {\r\n  //返回一个由标签函数构建的孪生节点\r\n  return tbody(\r\n    tr(\r\n      td(\"内容\"), td(\"内容\"), td(\"内容\")\r\n    ),\r\n    tr(\r\n      td(\"内容\"), td(\"内容\"), td(\"内容\")\r\n    )\r\n  )\r\n}\r\n//复用函数组件\r\nconst node = table(\r\n  thead(\r\n    tr(\r\n      th(\"字段1\"), th(\"字段2\"), th(\"字段3\")\r\n    )\r\n  ),\r\n  component   //等价与component()，框架会自动调用无参的函数组件\r\n)\r\n//挂载节点\r\nnode.render(\"#app\")\r\n```\r\n\r\n#### 1.7 有参函数组件\r\n\r\n无论是无参函数组件还是有参函数组件，其本质都是一个能返回孪生节点或真节点的函数，唯一的不同点是有参的函数组件在使用时必须手动传参调用。示例如下：\r\n\r\n```javascript\r\n//定义函数组件\r\nfunction component(data) {\r\n  return tbody(\r\n    data.map(item =>\r\n      tr(\r\n        td(item.id),\r\n        td(item.name),\r\n        td(item.sex === 1 ? \"男\" : \"女\")\r\n      )\r\n    )\r\n  )\r\n}\r\n//准备数据\r\nconst myFamily = [\r\n  { id: 1, name: \"张向明\", sex: 1 },\r\n  { id: 2, name: \"蒋海艳\", sex: 2 },\r\n  { id: 3, name: \"张泽珩\", sex: 1 }\r\n]\r\n//使用函数组件\r\nconst node = table(\r\n  thead(\r\n    tr(\r\n      th(\"字段1\"), th(\"字段2\"), th(\"字段3\")\r\n    )\r\n  ),\r\n  component(myFamily)  //调用组件函数并传入参数\r\n)\r\n//挂载节点\r\nnode.render(\"#app\")\r\n```\r\n\r\n#### 1.8 文档碎片\r\n\r\n下滑线_是一个特殊的标签函数，其用途是创建一个文档碎片孪生节点，其真节点是一个DocumentFragment实例。使用方式如下：\r\n\r\n```javascript\r\n//创建文档碎片组件\r\nfunction component() {\r\n  const {_} = $$.tags     //解构出_函数\r\n  return _(\r\n    li(\"项目1\"),\r\n    li(\"项目2\"),\r\n    li(\"项目3\")\r\n  )\r\n}\r\n//复用组件\r\nconst node = ul(\r\n  component \r\n)\r\n//挂载节点\r\nnode.render(\"#app\")\r\n\r\n```\r\n\r\n### 2. 标签函数参数详解\r\n\r\n标签函数接收多个不同类型的参数，每种类型的参数，在构建过程中都有自己特定的含义，这些参数的表义与顺序无关，但文档结构与顺序有关。标签函数可无限嵌套调用，以实现复杂的文档构建。请看如下示例：\r\n\r\n```javascript\r\nconst node = ul(\r\n\r\n  //以下空值将被忽略，不参与构建\r\n  null,undefined,\"\",\r\n\r\n  //如果参数是一个孪生节点，则会将其真节点追加到ul中\r\n  li(\"项目1\"),\r\n\r\n  //如果参数是一个数组，将被自动展开，并追加到ul中\r\n  [li(\"项目2\"),li(\"项目3\")],\r\n\r\n  //如参数是一个函数，将会自动运行并将结果递归追加到当前节点\r\n  ()=>li(\"项目4\"),\r\n\r\n  //如果参数是一个正则表达式，则用来为ul配置id和class和其他属性\r\n  //#开始的片段将被解析成id，多个id取最后一个\r\n  //.开始的片段将被解析成className,多个className可叠加\r\n  /#ul5.class1.class2/,\r\n\r\n  //如果参数是一个object，则用来配置本节点的attribute、样式、事件\r\n  {\r\n    title: \"标题\", \r\n    style: { color: \"red\", fontSize: \"20px\" },  \r\n    click: event => console.log(event.target)   \r\n  },\r\n\r\n  //无限嵌套\r\n  li(\r\n    {id:\"li1\",class:\"list-item\"},\r\n    span(\"内容\"),\r\n    span(\"内容\")\r\n  ),\r\n\r\n  //如参数是一个真Node，这个参数将被追加到ul中\r\n  //你几乎永远不会这样做，除非你正在编写复杂的通用库\r\n  document.getElementByid(\"node1\")\r\n\r\n)\r\n```\r\n\r\n### 3. 配置后置\r\n\r\n第2节的文档构建过程太过复杂，twin-node提供了类似于jquery的链式调用来扁平化构建过程。请看如下示例：\r\n\r\n```javascript\r\nconst node = ul(\r\n  li(\"我有id颜色\").attr(\"id\", \"project16\").css(\"color\", \"red\"),\r\n  li(\"class1\").class(\"class1\"),\r\n  li(\"点我\").on(\"click\",event=>alert(event.target))\r\n)\r\n```\r\n\r\n### 4. 与SVG集成\r\n\r\n普通的标签函数从$$.tags中解构，而svg标签函数需要从svgTags中解构\r\n\r\n```javascript\r\nconst { svg, path } = $$.svgTags;     \r\nconst node = svg(\r\n  { width: 100, height: 100 },\r\n  path(\r\n    { d: \"M0,0 L100,100\", stroke: \"red\", \"stroke-width\": 1 }\r\n  )\r\n)\r\n```\r\n\r\n### 5. TwinNode静态函数\r\n\r\n|方法                      |功能                         |\r\n|--------------------------|-----------------------------|\r\n|$$.query(selector)        |等效于document.querySelector(selector) |\r\n|$$.queryAll(selector)     |等效于document.querySelectorAll(selector)|\r\n|$$.on(type,fn,option)     |等效于window.addEventListener(type,fn,option) |\r\n|$$.of(type,fn,option)     |等效于window.removeEventListener(type,fn,option) |\r\n|$$.defineTag(tagName)     |定义一个标签函数,极少使用 |\r\n|$$.defineSvgTag(tagName)  |定义一个SVG标签函数,极少使用|\r\n\r\n### 6. TwinNode静态属性\r\n\r\n|属性               |功能                         |\r\n|-------------------|-----------------------------|\r\n|$$.tags            |标签函数大全 |\r\n|$$.svgTags         |SVG标签函数大全 |\r\n\r\n### 7. TwinNode实例属性\r\n\r\n|属性名                 |功能                 |\r\n|----------------------|-------------------- |\r\n|twinNode[0]           |获取真节点|\r\n|twinNode[-1]          |获取真节点的shadowRoot的孪生节点|\r\n|twinNode.isTwinNode   |当前对象是否是一个孪生节点|\r\n\r\n### 8. TwinNode实例函数\r\n\r\n#### 8.1 检索\r\n\r\n|函数                |功能                 |\r\n|--------------------|--------------------|\r\n|query(selector)     |用查询表达式查询子节点，返回子节点的孪生节点|\r\n|queryAll(selector)  |替代querySelectorAll|\r\n|children()          |获取孪生节点的直接子节点|\r\n|children(index)     |获取孪生节点的第index个直接子节点|\r\n|parent()            |获取父节点的孪生节点|\r\n|parent(selector)    |获取满足selector的祖先节点|\r\n\r\n#### 8.2 文档处理\r\n\r\n|函数                |功能                 |\r\n|--------------------|--------------------|\r\n|next()              |获取下一个孪生节点|\r\n|next(node)          |在本节点之后插入一个节点|\r\n|previous()          |获取上一个孪生节点|\r\n|previous(node)      |在本节点之前插入一个节点|\r\n|up()                |向上移动|\r\n|down()              |向下移动|\r\n|append(...child)    |追加子节点|\r\n|prepend(...child)   |在首位插入子节点|\r\n|appendTo(container) |追加到容器|\r\n|prependTo(container)|插入到容器的首位|\r\n|insert(node,where)  |在指定的位置插入子节点|\r\n|render(container)   |先清空容器，再追加到容器|\r\n|ref(name,target)    |使target的name属性指向本孪生节点|\r\n|ref(name)           |使windowt的name属性指向本孪生节点|\r\n\r\n#### 8.3 对象属性(property)\r\n\r\n|函数                   |功能                 |\r\n|-----------------------|--------------------|\r\n|prop(name)             |获取真节点的property|\r\n|prop(name,value)       |设置真节点的property|\r\n|prop(name,fn)          |用fn的返回值设置真节点的property|\r\n|prop(obj)              |以对象形式配置真节点的property|\r\n|html(value)            |获取或设置真节点的innerHTML|\r\n|html(fn)               |用fn的返回值设置真节点的innerHTML|\r\n|text(value)            |获取或设置真节点的innerText|\r\n|text(fn)               |用fn的返回值设置真节点的innerText|\r\n|rect()                 |getBoundingClientRect()的结果|\r\n|offset()               |以对象的形式返回真节点的offsetXXX|\r\n|do(name,...ages)       |调用真节点的函数,并返回本孪生节点|\r\n|xxx()                  |动态代理，获取真节点的xxx对象属性，小驼峰命名|\r\n|xxx(value)             |设置真节点的xxx对象属性的值|\r\n|xxx(fn)                |用fn的返回值设置真节点的xxx对象属性值|\r\n\r\n#### 8.4 标签属性(attribute)\r\n\r\n|函数                |功能                 |\r\n|--------------------|--------------------|\r\n|attr(name)          |获取真节点的标签属性|\r\n|attr(name,value)    |设置真节点的标签属性|\r\n|attr(name,false)    |移除真节点的标签属性|\r\n|attr(name,fn)       |用fn的返回值设置真节点的标签属性|\r\n|attr(obj)           |以对象形式配置真节点的标签属性|\r\n|hasAttr(name)       |判定真节点是否有标签属性|\r\n|class(name,value)   |为真节点添加类名|\r\n|class(name,false)   |移除真节点的类名|\r\n|class(name,fn)      |用fn的返回值添加类名|\r\n|hasClass(name)      |判定真节点是否有类名|\r\n|_xxx()              |动态代理,获取真节点的xxx标签属性值，以下划线开始|\r\n|_xxx(value)         |设置真节点的标签属性值|\r\n|_xxx(fn)            |用fn的返回值设置真节点的标签属性值|\r\n\r\n#### 8.5 样式(style)\r\n\r\n|函数                |功能                 |\r\n|--------------------|--------------------|\r\n|css(name)           |调用getComputedStyle获取样式值|\r\n|css(name,null,false)|不调用getComputedStyle获取样式值|\r\n|css(name,value)     |设置真节点的样式|\r\n|css(name,fn)        |用fn的返回值设置真节点的样式|\r\n|css(obj)            |以对象形式设置真节点的样式|\r\n|var(name,value)     |为真节点配置css变量|\r\n|hide()              |隐藏真节点|\r\n|show()              |显示真节点|\r\n|$xxx()              |动态代理,获取真节点的xxx样式属性值，以$开始|\r\n|$xxx(value)         |设置真节点的xxx样式属性值|\r\n|$xxx(fn)            |用fn的返回值设置真节点的样式属性值|\r\n\r\n#### 8.6 事件(event)\r\n\r\n|函数                    |功能                 |\r\n|------------------------|--------------------|\r\n|on(type,...args)        |为真节点配置事件|\r\n|off(type,...args)       |卸载真节点的事件|\r\n|dispatchEvent(...types) |触发新的事件|\r\n|onEventPath(event)      |真节点是否在event的传播路径上|\r\n|Xxx(...args)            |动态代理，首字母大小，表示配置事件|\r\n\r\n### 9. 动态代理\r\n\r\n除以上实例函数外的其他函数都是遵循如下规则的动态代理函数\r\n\r\n|规则            |功能                    |示例|\r\n|----------------|-----------------------|----|\r\n|第一个字母小写   |为真节点配置对象属性     |id(\"id1\")|\r\n|第一个字母为_    |为真节点配置attribute   |_title(\"标题\")|\r\n|第一个字母为$    |为真节点配置样式        |$display(\"block\")|\r\n|第一个字母大写   |为真节点配置事件         |Click(event=>console.log(1))|\r\n\r\n注意对象属性函数与标签属性函数的区别，如：  \r\ntwinNode.checked(true),底层的逻辑是node.checked = true;  \r\ntwinNode._checked(true),底层的逻辑是node.setAttribute(\"checked\",\"\")\r\n\r\n### 10. 与Web Components集成\r\n\r\nWeb Components是现代浏览器支持的一套原生组件化API。主要包括自定义组件(Custom Element)、影子节点(ShadowRoot)、模板(template)、插槽(slot)四部分。twin-node实现了与Web Components API的完美集成。tion callback(root)\r\n\r\n#### 10.1 使用template填充ShadowRoot\r\n\r\nshadowTemplate函数会为当前节点创建一个ShadowRoot，然后用指定的template的副本来填充ShadowRoot。\r\n\r\n```html\r\n<template id=\"template\">\r\n  <!-- 这里使用了一个极端的css选择器，但他不会污染组件外部的样式 -->\r\n  <style>\r\n    *{color:green}\r\n  </style>\r\n  <div>内容</div>\r\n  <script root>\r\n    //script被标记为root,当template的副本挂载到shadowRoot后，将运行该脚本\r\n    console.log(\"这个脚本块被标记为root，由shadowTemplate函数托管，将注入this和root参数\");\r\n    console.log(\"this is \",this);\r\n    console.log(\"root is \",root);\r\n    console.log(\"host is \",root.host);\r\n    console.log(\"this===host\",this===root.host);\r\n  </script>\r\n  <script>\r\n    console.log(\"这个脚本块没有被标记为root，会先于标记为root的脚本块执行\");\r\n  </script>\r\n</template>\r\n\r\n<div id=\"host\"></div>\r\n\r\n<script>\r\n  $$.query(\"#host\").shadowTemplate(\"#template\")\r\n</script>\r\n```\r\n\r\n#### 10.2 插槽\r\n\r\n可以在template中定义好插槽占位符，在host中定义插槽的实例，插槽实例的slot属性与插槽占位符的name属性一一对应。host中第一没有slot标记的节点会自动插入到template中的无名(默认)插槽。\r\n\r\n```html\r\n<template id=\"template\">\r\n  <header>\r\n    <!-- 这个一个具名插槽 -->\r\n    <slot name=\"slot1\"></slot>\r\n  </header>\r\n  <main>\r\n    <!-- 这个一个默认插槽 -->\r\n    <slot></slot>\r\n  </main>\r\n  <footer>\r\n    <!-- 这个一个具名插槽 -->\r\n    <slot name=\"slot2\"></slot>\r\n  </footer>\r\n</template>\r\n\r\n<div id=\"host\">\r\n  <div slot=\"slot1\">页头：插入slot1</div>\r\n  <div>主体：插入到默认插槽</div>\r\n  <div slot=\"slot2\">页脚:插入slot2</div>\r\n</div>\r\n\r\n<script>\r\n  $$.query(\"#host\").shadowTemplate(\"#template\")\r\n</script>\r\n```\r\n\r\n#### 10.3 callback\r\n\r\n```html\r\n<template id=\"template\">\r\n  <div>内容</div>\r\n</template>\r\n\r\n<div id=\"host\"></div>\r\n\r\n<script>\r\n  const host = $$.query(\"#host\")\r\n  const template = $$.query(\"#template\")\r\n  host.shadowTemplate(\r\n    template,\r\n    /**\r\n     * 创建ShadowDOM后的回调函数\r\n     * @param {ShadowRoot} root\r\n     */\r\n    function(root){\r\n      console.log(\"this is \",this)\r\n      console.log(\"root is \",root)\r\n      console.log(\"host is \",root.host)\r\n      console.log(\"this===root.host\",this===root.host)\r\n      root.querySelector(\"div\").style.color=\"red\"\r\n    }\r\n  )\r\n</script>\r\n```\r\n\r\n#### 10.4 与CustomElement的集成\r\n\r\n```html\r\n<div id=\"container\"></div>\r\n\r\n<script>\r\n  //定义webcomponent组件\r\n  class MyDiv extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.attachShadow({ mode: \"open\" });\r\n      this.shadowRoot.innerHTML = \"内容\";\r\n    }\r\n  }\r\n  //定义与组件对应的标签\r\n  customElements.define(\"my-div\",MyDiv)\r\n  //解构标签函数\r\n  const { my_div } = $$.tags  //函数名的下划线对应是标签的中划线\r\n  //构建文档\r\n  const node = div(\r\n    my_div(\"这是组件的内容\")\r\n  )\r\n  //渲染\r\n  node.render(\"#container\")\r\n</script>\r\n```\r\n\r\n#### 10.5 调用远程页面\r\n\r\n- include.html\r\n\r\n```html\r\n<style>\r\n  div{\r\n    color:green;\r\n  }\r\n</style>\r\n<div>\r\n  被嵌入的页面\r\n</div>\r\n```\r\n\r\n- index.html\r\n\r\n```html\r\n<div id=\"host\"></div>\r\n\r\n<script>\r\n  const host = $$.query(\"#host\")\r\n  host.fetchHTML(\r\n    \"include.html\",\r\n    {method:\"get\"},\r\n    function(shadowRoot){\r\n      console.log(\"this is \",this)\r\n      console.log(\"root is \",shadowRoot)\r\n      console.log(\"host is \",shadowRoot.host)\r\n    }\r\n  )\r\n</script>\r\n```\r\n\r\n#### 10.6 编译template\r\n\r\ntwin-node提供一套完全符合html和javascript规范的模板语法。模板语法的规则非常简单：\r\n\r\n- 脚本片段：DOM节点上的script属性可插入一段符合javascript语法的脚本，编译时该脚本会包裹在DOM节点的外围。\r\n- 空大括号：脚本片段是用来包裹其所在的DOM节点的，应该包含一对空大括号（这是符合javascript语法的），形象的表示将DOM节点插到此处。如果脚本片段只有一句，则可以省略空大括号。\r\n- 插值语法：DOM节点的属性值和内容可以用${}来插入动态内容，其语法完全符合javascript的模板字符串。\r\n- 数据：运行时引擎会注入data参数，在脚本片段和插值语法中都可以使用data参数。\r\n- 无响应式：twin-node专注于轻量化和高性能，鼓励您控制DOM节点的每一个细节，因此并没有提供类似于vue或react的数据响应式机制。数据变化时，要么重新渲染，要么用原生手段改变DOM。因此提倡使用细粒度的template，以免大面积渲染。\r\n\r\n```html\r\n<template id=\"template\">\r\n  <table>\r\n    <tbody>\r\n      <!-- tr上的脚本片段只有一句，可以省略空大括号，运行时会预演绎为\"for(let item of data){} -->\r\n      <tr script=\"for(let item of data)\" id=\"${item.id}\">\r\n        <td>${item.id}</td>\r\n        <td>${item.name}</td>\r\n        <td script=\"if(item.sex===0)\">女</td>\r\n        <td script=\"else\">男</td>\r\n        <!-- 最后两个td,由于if else的排他性，事实上只有一个td，可用如下插值语法优化\r\n          <td>${item.sex===0?\"女\":\"男\"}</td>\r\n        -->\r\n      </tr>\r\n    </tbody>\r\n  </table>\r\n  <div style=\"display: flex;gap: 20px;\">\r\n    <!--span上的脚本片段不只一句，你需要手动加一对空大括号，以确保在运行时能在您预想的位置插入span节点 -->\r\n    <span script=\"for(let i=0;i<data.length;i++){let item=data[i];{}}\">${item.name}</span>\r\n  </div>\r\n</template>\r\n\r\n<div id=\"host\"></div>\r\n\r\n<script>\r\n  let data = [\r\n    {id:1,name:\"张向明\",sex:1},\r\n    {id:2,name:\"蒋海艳\",sex:0}\r\n  ]\r\n  let host= $$.query(\"#host\")\r\n  let template = $$.query(\"#template\")\r\n  $$.query(\"#host\").compileTemplate(template,data,function(root){\r\n    root.querySelector(\"table\").style.backgroundColor = \"lightgray\";\r\n    //注意：\r\n    //  由于ShadowRoot的存在，您无法通过document.querySelector来获取host内部的DOM节点\r\n    //  你可以在回调函数中使用root.querySelector来获取host的内部DOM节点\r\n    //  在回调函数之外，您只能通过document.querySelector(\"#host\").shadowRoot.querySelector(\"table\")来获取内部DOM节点\r\n  })\r\n</script>\r\n```\r\n","readmeFilename":"readme.md"}