vanjs-router
Advanced tools
@@ -1,1 +0,1 @@ | ||
| let o=Object.getPrototypeOf,w,p,a,d,T={isConnected:1},$=1e3,m,F={},q=o(T),x=o(o),h,H=(t,e,s,r)=>(t??(setTimeout(s,r),new Set)).add(e),M=(t,e,s)=>{let r=a;a=e;try{return t(s)}catch(n){return console.error(n),s}finally{a=r}},v=t=>t.filter(e=>{var s;return(s=e._dom)==null?void 0:s.isConnected}),W=t=>m=H(m,t,()=>{for(let e of m)e._bindings=v(e._bindings),e._listeners=v(e._listeners);m=h},$),y={get val(){var t;return(t=a==null?void 0:a._getters)==null||t.add(this),this.rawVal},get oldVal(){var t;return(t=a==null?void 0:a._getters)==null||t.add(this),this._oldVal},set val(t){var e;(e=a==null?void 0:a._setters)==null||e.add(this),t!==this.rawVal&&(this.rawVal=t,this._bindings.length+this._listeners.length?(p==null||p.add(this),w=H(w,this,z)):this._oldVal=t)}},k=t=>({__proto__:y,rawVal:t,_oldVal:t,_bindings:[],_listeners:[]}),g=(t,e)=>{let s={_getters:new Set,_setters:new Set},r={f:t},n=d;d=[];let l=M(t,s,e);l=(l??document).nodeType?l:new Text(l);for(let i of s._getters)s._setters.has(i)||(W(i),i._bindings.push(r));for(let i of d)i._dom=l;return d=n,r._dom=l},V=(t,e=k(),s)=>{let r={_getters:new Set,_setters:new Set},n={f:t,s:e};n._dom=s??(d==null?void 0:d.push(n))??T,e.val=M(t,r,e.rawVal);for(let l of r._getters)r._setters.has(l)||(W(l),l._listeners.push(n));return e},G=(t,...e)=>{for(let s of e.flat(1/0)){let r=o(s??0),n=r===y?g(()=>s.val):r===x?g(s):s;n!=h&&t.append(n)}return t},I=(t,e,...s)=>{var i;let[r,...n]=o(s[0]??0)===q?s:[{},...s],l=t?document.createElementNS(t,e):document.createElement(e);for(let[c,f]of Object.entries(r)){let O=u=>u?Object.getOwnPropertyDescriptor(u,c)??O(o(u)):h,P=e+","+c,E=F[P]??(F[P]=((i=O(o(l)))==null?void 0:i.set)??0),C=c.startsWith("on")?(u,N)=>{let j=c.slice(2);l.removeEventListener(j,N),l.addEventListener(j,u)}:E?E.bind(l):l.setAttribute.bind(l,c),b=o(f??0);c.startsWith("on")||b===x&&(f=V(f),b=y),b===y?g(()=>(C(f.val,f._oldVal),l)):C(f)}return G(l,n)},A=t=>({get:(e,s)=>I.bind(h,t,s)}),R=(t,e)=>e?e!==t&&t.replaceWith(e):t.remove(),z=()=>{let t=0,e=[...w].filter(r=>r.rawVal!==r._oldVal);do{p=new Set;for(let r of new Set(e.flatMap(n=>n._listeners=v(n._listeners))))V(r.f,r.s,r._dom),r._dom=h}while(++t<100&&(e=[...p]).length);let s=[...w].filter(r=>r.rawVal!==r._oldVal);w=h;for(let r of new Set(s.flatMap(n=>n._bindings=v(n._bindings))))R(r._dom,g(r.f,r._dom)),r._dom=h;for(let r of s)r._oldVal=r.rawVal};const S={tags:new Proxy(t=>new Proxy(I,A(t)),A()),hydrate:(t,e)=>R(t,g(e,t)),add:G,state:k,derive:V},L=()=>location.hash?location.hash.slice(1):"home",_=S.state(L());window.addEventListener("hashchange",t=>{_.val=L()});class K{constructor(e){if(this.args=[],this.delayed=!1,this.isFirstLoad=!0,!e)throw new Error("config 不能为空");if(!e.rule)throw new Error("rule 不能为空");if(!e.Loader)throw new Error("Loader 不能为空");this.rule=e.rule,this.Loader=e.Loader,this.delayed=e.delayed||!1,this.onFirst=e.onFirst||(async()=>{}),this.onLoad=e.onLoad||(async()=>{}),this.element=this.Loader(),this.element.hidden=!0,S.derive(()=>{const s=this.matchHash();s?(async()=>(this.args.splice(0),this.args.push(...s.args),this.isFirstLoad&&(this.isFirstLoad=!1,await this.onFirst()),await this.onLoad(),this.delayed||this.show()))():this.hide()})}matchHash(){if(this.rule instanceof RegExp){const s=_.val.match(this.rule);return s?{hash:_.val,args:[...s].slice(1)}:!1}const e=_.val.split("/").filter(s=>s.length>0);return e.length<1&&e.push("home"),e[0]==this.rule?{hash:_.val,args:e.slice(1)}:!1}show(){this.element.hidden=!1}hide(){this.element.hidden=!0}}const B=t=>new K(t).element,D=(t,...e)=>{location.hash=`/${[t,...e].join("/")}`},J={nowHash:L,now:_,Handler:K,Route:B,goto:D};Object.defineProperty(window,"router",{value:J});Object.defineProperty(window,"van",{value:S}); | ||
| var q=Object.defineProperty;var z=(t,e,s)=>e in t?q(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var o=(t,e,s)=>z(t,typeof e!="symbol"?e+"":e,s);let d=Object.getPrototypeOf,p,g,a,h,x={isConnected:1},B=1e3,v,A={},D=d(x),H=d(d),c,M=(t,e,s,r)=>(t??(setTimeout(s,r),new Set)).add(e),W=(t,e,s)=>{let r=a;a=e;try{return t(s)}catch(n){return console.error(n),s}finally{a=r}},y=t=>t.filter(e=>{var s;return(s=e._dom)==null?void 0:s.isConnected}),k=t=>v=M(v,t,()=>{for(let e of v)e._bindings=y(e._bindings),e._listeners=y(e._listeners);v=c},B),b={get val(){var t;return(t=a==null?void 0:a._getters)==null||t.add(this),this.rawVal},get oldVal(){var t;return(t=a==null?void 0:a._getters)==null||t.add(this),this._oldVal},set val(t){var e;(e=a==null?void 0:a._setters)==null||e.add(this),t!==this.rawVal&&(this.rawVal=t,this._bindings.length+this._listeners.length?(g==null||g.add(this),p=M(p,this,J)):this._oldVal=t)}},G=t=>({__proto__:b,rawVal:t,_oldVal:t,_bindings:[],_listeners:[]}),m=(t,e)=>{let s={_getters:new Set,_setters:new Set},r={f:t},n=h;h=[];let l=W(t,s,e);l=(l??document).nodeType?l:new Text(l);for(let i of s._getters)s._setters.has(i)||(k(i),i._bindings.push(r));for(let i of h)i._dom=l;return h=n,r._dom=l},V=(t,e=G(),s)=>{let r={_getters:new Set,_setters:new Set},n={f:t,s:e};n._dom=s??(h==null?void 0:h.push(n))??x,e.val=W(t,r,e.rawVal);for(let l of r._getters)r._setters.has(l)||(k(l),l._listeners.push(n));return e},I=(t,...e)=>{for(let s of e.flat(1/0)){let r=d(s??0),n=r===b?m(()=>s.val):r===H?m(s):s;n!=c&&t.append(n)}return t},R=(t,e,...s)=>{var i;let[r,...n]=d(s[0]??0)===D?s:[{},...s],l=t?document.createElementNS(t,e):document.createElement(e);for(let[f,_]of Object.entries(r)){let P=w=>w?Object.getOwnPropertyDescriptor(w,f)??P(d(w)):c,E=e+","+f,C=A[E]??(A[E]=((i=P(d(l)))==null?void 0:i.set)??0),F=f.startsWith("on")?(w,$)=>{let j=f.slice(2);l.removeEventListener(j,$),l.addEventListener(j,w)}:C?C.bind(l):l.setAttribute.bind(l,f),L=d(_??0);f.startsWith("on")||L===H&&(_=V(_),L=b),L===b?m(()=>(F(_.val,_._oldVal),l)):F(_)}return I(l,n)},T=t=>({get:(e,s)=>R.bind(c,t,s)}),K=(t,e)=>e?e!==t&&t.replaceWith(e):t.remove(),J=()=>{let t=0,e=[...p].filter(r=>r.rawVal!==r._oldVal);do{g=new Set;for(let r of new Set(e.flatMap(n=>n._listeners=y(n._listeners))))V(r.f,r.s,r._dom),r._dom=c}while(++t<100&&(e=[...g]).length);let s=[...p].filter(r=>r.rawVal!==r._oldVal);p=c;for(let r of new Set(s.flatMap(n=>n._bindings=y(n._bindings))))K(r._dom,m(r.f,r._dom)),r._dom=c;for(let r of s)r._oldVal=r.rawVal};const S={tags:new Proxy(t=>new Proxy(R,T(t)),T()),hydrate:(t,e)=>K(t,m(e,t)),add:I,state:G,derive:V},O=()=>location.hash?location.hash.slice(1):"home",u=S.state(O());window.addEventListener("hashchange",t=>{u.val=O()});class N{constructor(e){o(this,"rule");o(this,"args",[]);o(this,"Loader");o(this,"delayed",!1);o(this,"onFirst");o(this,"onLoad");o(this,"element");o(this,"isFirstLoad",!0);if(!e)throw new Error("config 不能为空");if(!e.rule)throw new Error("rule 不能为空");if(!e.Loader)throw new Error("Loader 不能为空");this.rule=e.rule,this.Loader=e.Loader,this.delayed=e.delayed||!1,this.onFirst=e.onFirst||(async()=>{}),this.onLoad=e.onLoad||(async()=>{}),this.element=this.Loader(),this.element.hidden=!0,S.derive(()=>{const s=this.matchHash();s?(async()=>(this.args.splice(0),this.args.push(...s.args),this.isFirstLoad&&(this.isFirstLoad=!1,await this.onFirst()),await this.onLoad(),this.delayed||this.show()))():this.hide()})}matchHash(){if(this.rule instanceof RegExp){const s=u.val.match(this.rule);return s?{hash:u.val,args:[...s].slice(1)}:!1}const e=u.val.split("/").filter(s=>s.length>0);return e.length<1&&e.push("home"),e[0]==this.rule?{hash:u.val,args:e.slice(1)}:!1}show(){this.element.hidden=!1}hide(){this.element.hidden=!0}}const Q=t=>new N(t).element,U=(t,...e)=>{location.hash=`/${[t,...e].join("/")}`},X={nowHash:O,now:u,Handler:N,Route:Q,goto:U};Object.defineProperty(window,"router",{value:X});Object.defineProperty(window,"van",{value:S}); |
+5
-2
@@ -11,5 +11,8 @@ { | ||
| "name": "vanjs-router", | ||
| "version": "2.0.4", | ||
| "version": "2.0.5", | ||
| "main": "js/router.js", | ||
| "types": "src/router.ts" | ||
| "types": "src/router.ts", | ||
| "scripts": { | ||
| "build": "vite build && tsc" | ||
| } | ||
| } |
+1
-1
@@ -42,3 +42,3 @@ import van from 'vanjs-core' | ||
| /** 路由根元素,对外导出,可直接添加到 DOM 树 */ | ||
| public element: HTMLElement | ||
| public element: E | ||
| /** 记录当前是否初次命中路由,决定是否执行 `onFirst` 事件。 */ | ||
@@ -45,0 +45,0 @@ private isFirstLoad = true |
13589
2.31%218
0.46%