@nuxt/hints 1.0.0-alpha.6 → 1.0.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/client/200.html +1 -1
- package/dist/client/404.html +1 -1
- package/dist/client/_nuxt/8JEyW-wR.js +1 -0
- package/dist/client/_nuxt/B6uQK5FY.js +1 -0
- package/dist/client/_nuxt/{B5aFfd-r.js → BC7GvhRc.js} +1 -1
- package/dist/client/_nuxt/BDzmeJ6w.js +1 -0
- package/dist/client/_nuxt/{CmBIQlQV.js → BFYIK0lc.js} +10 -10
- package/dist/client/_nuxt/BUw7H-hv.js +1 -0
- package/dist/client/_nuxt/BgS17fQP.js +1 -0
- package/dist/client/_nuxt/{CPJ7wMZ4.js → BpvkYYYf.js} +1 -1
- package/dist/client/_nuxt/C-EnH0Lt.js +1 -0
- package/dist/client/_nuxt/C3Wv6jpd.js +1 -0
- package/dist/client/_nuxt/C47S-Tmv.js +1 -0
- package/dist/client/_nuxt/{C-Jbm3Hp.js → C4gqWexZ.js} +1 -1
- package/dist/client/_nuxt/{DSNF90uQ.js → CFvV-NJL.js} +1 -1
- package/dist/client/_nuxt/{BOswn9ZA.js → CHixySwz.js} +1 -1
- package/dist/client/_nuxt/{DxoRA_Jg.js → CKsR24bi.js} +1 -1
- package/dist/client/_nuxt/CMTm3GFP.js +1 -0
- package/dist/client/_nuxt/CMjwMIkn.js +1 -0
- package/dist/client/_nuxt/CjoLj4QM.js +1 -0
- package/dist/client/_nuxt/{C7PG24o2.js → CsWGzJ2d.js} +1 -1
- package/dist/client/_nuxt/CxJIMPBb.js +6 -0
- package/dist/client/_nuxt/{DJRd5JwX.js → D0lHLEVW.js} +1 -1
- package/dist/client/_nuxt/DJjDtW9f.js +1 -0
- package/dist/client/_nuxt/{B4xF9mB8.js → DJusdO6H.js} +1 -1
- package/dist/client/_nuxt/Dw-rzC63.js +4 -0
- package/dist/client/_nuxt/{DCjNVr8X.js → Dzw9Ycsi.js} +1 -1
- package/dist/client/_nuxt/builds/latest.json +1 -1
- package/dist/client/_nuxt/builds/meta/c9d33be6-f2ad-4bd9-8dd1-70c2dc337718.json +1 -0
- package/dist/client/_nuxt/{entry.I8MQ9pCy.css → entry.bXb283Sw.css} +1 -1
- package/dist/client/_nuxt/error-404.CCf1PrmA.css +1 -0
- package/dist/client/_nuxt/error-500.CZ0xe9I8.css +1 -0
- package/dist/client/component-lazy-load/index.html +1 -0
- package/dist/client/hydration/index.html +1 -1
- package/dist/client/index.html +1 -1
- package/dist/client/third-party-scripts/index.html +1 -1
- package/dist/client/web-vitals/index.html +1 -1
- package/dist/module.json +1 -1
- package/dist/module.mjs +194 -15
- package/dist/runtime/core/server/sse.js +16 -0
- package/dist/runtime/core/server/types.d.ts +12 -0
- package/dist/runtime/core/server/types.js +2 -0
- package/dist/runtime/hydration/composables.js +19 -13
- package/dist/runtime/hydration/nitro.plugin.d.ts +2 -0
- package/dist/runtime/hydration/nitro.plugin.js +65 -0
- package/dist/runtime/hydration/utils.d.ts +2 -2
- package/dist/runtime/hydration/utils.js +3 -2
- package/dist/runtime/lazy-load/composables.d.ts +11 -0
- package/dist/runtime/lazy-load/composables.js +49 -0
- package/dist/runtime/lazy-load/nitro.plugin.d.ts +2 -0
- package/dist/runtime/lazy-load/nitro.plugin.js +59 -0
- package/dist/runtime/lazy-load/plugin.client.d.ts +2 -0
- package/dist/runtime/lazy-load/plugin.client.js +73 -0
- package/dist/runtime/lazy-load/schema.d.ts +28 -0
- package/dist/runtime/lazy-load/schema.js +16 -0
- package/dist/runtime/lazy-load/utils.d.ts +1 -0
- package/dist/runtime/lazy-load/utils.js +2 -0
- package/dist/runtime/types.d.ts +14 -0
- package/package.json +30 -27
- package/dist/client/_nuxt/CGh86NWx.js +0 -4
- package/dist/client/_nuxt/COqnpOrt.js +0 -1
- package/dist/client/_nuxt/CgPyyo4O.js +0 -1
- package/dist/client/_nuxt/CmMr59Fi.js +0 -1
- package/dist/client/_nuxt/CmeNmt1M.js +0 -1
- package/dist/client/_nuxt/DIAcCAND.js +0 -6
- package/dist/client/_nuxt/PoHY5YXO.js +0 -1
- package/dist/client/_nuxt/Xqf5ue2O.js +0 -1
- package/dist/client/_nuxt/biRC-D3g.js +0 -1
- package/dist/client/_nuxt/builds/meta/320be0c4-177a-4724-8735-6b1a31ee8c22.json +0 -1
- package/dist/client/_nuxt/error-404.CTzDoZ55.css +0 -1
- package/dist/client/_nuxt/error-500.AUw9fuc1.css +0 -1
- package/dist/runtime/hydration/handler.nitro.d.ts +0 -5
- package/dist/runtime/hydration/handler.nitro.js +0 -52
- package/dist/runtime/hydration/sse.nitro.js +0 -22
- /package/dist/runtime/{hydration/sse.nitro.d.ts → core/server/sse.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -28,6 +28,7 @@ Now you can open your Nuxt app, go to the DevTools, and click the Nuxt Hints ico
|
|
|
28
28
|
- **💧 Hydration Mismatch Debugging**: Side-by-side diffing of server-rendered and client-hydrated HTML to pinpoint the exact cause of mismatches.
|
|
29
29
|
- **⚡️ Web Vitals Analysis**: Real-time metrics for LCP, INP, and CLS with detailed attribution and element-specific optimization tips.
|
|
30
30
|
- **📦 Third-Party Script Auditing**: Dashboard to monitor performance, identify render-blocking scripts, and get security recommendations.
|
|
31
|
+
- **🧩 Unused Component Detection**: Detects statically imported components that aren't rendered during SSR or hydration and suggests lazy-loading them to reduce bundle size.
|
|
31
32
|
- **🔍 Interactive Diagnostics**:
|
|
32
33
|
- **Hover to Highlight**: Hover over an issue in the DevTools to highlight the corresponding element on your page.
|
|
33
34
|
- **Click to Inspect**: Click to open the component source file directly in your code editor.
|
|
@@ -61,6 +62,12 @@ Analyze all third-party scripts on your page. The dashboard shows loading times,
|
|
|
61
62
|
|
|
62
63
|

|
|
63
64
|
|
|
65
|
+
### Unused Imported Component Detection (Lazy Load)
|
|
66
|
+
|
|
67
|
+
Identify statically imported components that were never rendered during SSR or initial hydration. The module suggests converting them to lazy-loaded components to reduce end-users initial bundle size.
|
|
68
|
+
|
|
69
|
+

|
|
70
|
+
|
|
64
71
|
## How It Works
|
|
65
72
|
|
|
66
73
|
### Performance Monitoring
|
|
@@ -75,6 +82,12 @@ The module hooks into Vue's hydration process to compare the server-rendered DOM
|
|
|
75
82
|
|
|
76
83
|
Using a combination of a Nitro plugin and client-side observers, Nuxt Hints tracks every script loaded on the page, measuring its performance and analyzing its attributes.
|
|
77
84
|
|
|
85
|
+
### Unused Component Detection (Lazy Load)
|
|
86
|
+
|
|
87
|
+
At build time, a Vite plugin analyzes your component imports to identify statically imported `.vue` components. At runtime, the module tracks which of those components actually render during SSR and initial hydration. After the page finishes loading, any imported component that was never rendered is flagged as a candidate for lazy loading.
|
|
88
|
+
|
|
89
|
+
Suggestions are reported to the console and sent to the DevTools UI via Server-Sent Events, where you can review them per route and dismiss entries you've already addressed. The recommended fix is to either prefix the component with `Lazy` (e.g., `<LazyHeavyComponent>`) or use `defineAsyncComponent` so it is only downloaded when needed.
|
|
90
|
+
|
|
78
91
|
### Example Console Output
|
|
79
92
|
|
|
80
93
|
When Nuxt Hints detects issues, you'll see clear warnings in your browser console:
|
package/dist/client/200.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-hints/_nuxt/entry.
|
|
1
|
+
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-hints/_nuxt/entry.bXb283Sw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-hints/_nuxt/Dw-rzC63.js"><script type="module" src="/__nuxt-hints/_nuxt/Dw-rzC63.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-hints",buildId:"c9d33be6-f2ad-4bd9-8dd1-70c2dc337718",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-hints-iframe" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1771872811303,false]</script></body></html>
|
package/dist/client/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-hints/_nuxt/entry.
|
|
1
|
+
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-hints/_nuxt/entry.bXb283Sw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-hints/_nuxt/Dw-rzC63.js"><script type="module" src="/__nuxt-hints/_nuxt/Dw-rzC63.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-hints",buildId:"c9d33be6-f2ad-4bd9-8dd1-70c2dc337718",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-hints-iframe" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1771872811304,false]</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as g}from"./CKsR24bi.js";import L from"./CxJIMPBb.js";import{_ as w}from"./D0lHLEVW.js";import{_ as z}from"./BC7GvhRc.js";import{g as N,e as v,o as n,c as a,b as c,w as i,k as _,F as p,x,d as u,a as t,l as $,t as r,n as C,L as B}from"./Dw-rzC63.js";import"./Dzw9Ycsi.js";import"./B6uQK5FY.js";const A={grid:"","gap-4":"","p-4":""},E={class:"flex items-center justify-between"},I={class:"text-sm font-semibold"},S={class:"w-full text-sm"},R={class:"py-2"},T={class:"text-xs bg-neutral-100 dark:bg-neutral-800 px-1.5 py-0.5 rounded"},D={class:"text-xs text-neutral-400 ml-1"},H={class:"py-2 text-xs text-neutral-500 dark:text-neutral-400 truncate max-w-48"},V={class:"py-2 text-xs text-neutral-500 dark:text-neutral-400 truncate max-w-48"},F={key:1,class:"text-neutral-500 dark:text-neutral-400"},K=N({__name:"component-lazy-load",setup(O){const d=v(),m=C(()=>d.$lazyLoadHints.value.filter(s=>s.state.directImports.some(e=>!e.rendered)));async function f(s){d.$lazyLoadHints.value=d.$lazyLoadHints.value.filter(e=>e.id!==s),$fetch(new URL(`${B}/${s}`,window.location.origin).href,{method:"DELETE"})}return(s,e)=>{const y=g,b=L,h=w,k=z;return n(),a("div",A,[c(y,{type:"info"},{default:i(()=>[...e[0]||(e[0]=[u(" These components are statically imported but were not rendered during SSR or initial hydration. Consider using the ",-1),t("code",null,"Lazy",-1),u(" prefix or ",-1),t("code",null,"defineAsyncComponent",-1),u(" to reduce the initial bundle size. ",-1)])]),_:1}),_(m).length>0?(n(!0),a(p,{key:0},x(_(m),l=>(n(),$(k,{key:l.id,class:"p4"},{default:i(()=>[t("header",E,[t("span",I,r(l.route),1),c(h,{title:"Remove",size:"small",quaternary:"",onClick:o=>f(l.id)},{default:i(()=>[c(b,{name:"material-symbols:delete-outline",class:"text-lg"})]),_:1},8,["onClick"])]),t("table",S,[e[1]||(e[1]=t("thead",null,[t("tr",{class:"border-b border-neutral-200 dark:border-neutral-700 text-left text-neutral-500 dark:text-neutral-400"},[t("th",{class:"pb-2 font-medium"}," Component "),t("th",{class:"pb-2 font-medium"}," Import Source "),t("th",{class:"pb-2 font-medium"}," Imported By ")])],-1)),t("tbody",null,[(n(!0),a(p,null,x(l.state.directImports.filter(o=>!o.rendered),o=>(n(),a("tr",{key:o.componentName,class:"border-b border-neutral-100 dark:border-neutral-800 last:border-b-0"},[t("td",R,[t("code",T,r(o.componentName),1),t("span",D,"→ Lazy"+r(o.componentName),1)]),t("td",H,r(o.importSource),1),t("td",V,r(o.importedBy),1)]))),128))])])]),_:2},1024))),128)):(n(),a("div",F," No lazy-load suggestions found. Navigate pages in your app to collect data. "))])}}});export{K as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as O,D as A,e as q,s as T,E,G as N,I as U,J as j,B as L,K as P,M as I,N as H,v as D,O as _,P as V,Q as F,n as y,R as M,S as W,T as B,U as z,V as G,W as Q,X as $}from"./Dw-rzC63.js";const J=(...t)=>t.find(o=>o!==void 0);function K(t){const o=t.componentName||"NuxtLink";function f(e){return typeof e=="string"&&e.startsWith("#")}function S(e,l,v){const a=v??t.trailingSlash;if(!e||a!=="append"&&a!=="remove")return e;if(typeof e=="string")return C(e,a);const u="path"in e&&e.path!==void 0?e.path:l(e).path;return{...e,name:void 0,path:C(u,a)}}function k(e){const l=A(),v=$(),a=y(()=>!!e.target&&e.target!=="_self"),u=y(()=>{const i=e.to||e.href||"";return typeof i=="string"&&B(i,{acceptRelative:!0})}),b=P("RouterLink"),h=b&&typeof b!="string"?b.useLink:void 0,c=y(()=>{if(e.external)return!0;const i=e.to||e.href||"";return typeof i=="object"?!1:i===""||u.value}),r=y(()=>{const i=e.to||e.href||"";return c.value?i:S(i,l.resolve,e.trailingSlash)}),g=c.value?void 0:h?.({...e,to:r}),m=y(()=>{const i=e.trailingSlash??t.trailingSlash;if(!r.value||u.value||f(r.value))return r.value;if(c.value){const x=typeof r.value=="object"&&"path"in r.value?_(r.value):r.value,R=typeof x=="object"?l.resolve(x).href:x;return C(R,i)}return typeof r.value=="object"?l.resolve(r.value)?.href??null:C(z(v.app.baseURL,r.value),i)});return{to:r,hasTarget:a,isAbsoluteUrl:u,isExternal:c,href:m,isActive:g?.isActive??y(()=>r.value===l.currentRoute.value.path),isExactActive:g?.isExactActive??y(()=>r.value===l.currentRoute.value.path),route:g?.route??y(()=>l.resolve(r.value)),async navigate(i){await F(m.value,{replace:e.replace,external:c.value||a.value})}}}return O({name:o,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},prefetchOn:{type:[String,Object],default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1},trailingSlash:{type:String,default:void 0,required:!1}},useLink:k,setup(e,{slots:l}){const v=A(),{to:a,href:u,navigate:b,isExternal:h,hasTarget:c,isAbsoluteUrl:r}=k(e),g=H(!1),m=D(null),i=s=>{m.value=e.custom?s?.$el?.nextElementSibling:s?.$el};function x(s){return!g.value&&(typeof e.prefetchOn=="string"?e.prefetchOn===s:e.prefetchOn?.[s]??t.prefetchOn?.[s])&&(e.prefetch??t.prefetch)!==!1&&e.noPrefetch!==!0&&e.target!=="_blank"&&!Z()}async function R(s=q()){if(g.value)return;g.value=!0;const d=typeof a.value=="string"?a.value:h.value?_(a.value):v.resolve(a.value).fullPath,n=h.value?new URL(d,window.location.href).href:d;await Promise.all([s.hooks.callHook("link:prefetch",n).catch(()=>{}),!h.value&&!c.value&&V(a.value,v).catch(()=>{})])}if(x("visibility")){const s=q();let d,n=null;T(()=>{const p=X();E(()=>{d=N(()=>{m?.value?.tagName&&(n=p.observe(m.value,async()=>{n?.(),n=null,await R(s)}))})})}),U(()=>{d&&j(d),n?.(),n=null})}return()=>{if(!h.value&&!c.value&&!f(a.value)){const n={ref:i,to:a.value,activeClass:e.activeClass||t.activeClass,exactActiveClass:e.exactActiveClass||t.exactActiveClass,replace:e.replace,ariaCurrentValue:e.ariaCurrentValue,custom:e.custom};return e.custom||(x("interaction")&&(n.onPointerenter=R.bind(null,void 0),n.onFocus=R.bind(null,void 0)),g.value&&(n.class=e.prefetchedClass||t.prefetchedClass),n.rel=e.rel||void 0),L(P("RouterLink"),n,l.default)}const s=e.target||null,d=J(e.noRel?"":e.rel,t.externalRelAttribute,r.value||c.value?"noopener noreferrer":"")||null;return e.custom?l.default?l.default({href:u.value,navigate:b,prefetch:R,get route(){if(!u.value)return;const n=new URL(u.value,window.location.href);return{path:n.pathname,fullPath:n.pathname,get query(){return I(n.search)},hash:n.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:u.value}},rel:d,target:s,isExternal:h.value||c.value,isActive:!1,isExactActive:!1}):null:L("a",{ref:m,href:u.value||null,rel:d,target:s,onClick:async n=>{if(!(h.value||c.value)){n.preventDefault();try{const p=M(u.value);return await(e.replace?v.replace(p):v.push(p))}finally{if(f(a.value)){const p=a.value.slice(1);let w=p;try{w=decodeURIComponent(p)}catch{}document.getElementById(w)?.focus()}}}}},l.default?.())}}})}const ae=K(W);function C(t,o){const f=o==="append"?G:Q;return B(t)&&!t.startsWith("http")?t:f(t,!0)}function X(){const t=q();if(t._observer)return t._observer;let o=null;const f=new Map,S=(e,l)=>(o||=new IntersectionObserver(v=>{for(const a of v){const u=f.get(a.target);(a.isIntersecting||a.intersectionRatio>0)&&u&&u()}}),f.set(e,l),o.observe(e),()=>{f.delete(e),o?.unobserve(e),f.size===0&&(o?.disconnect(),o=null)});return t._observer={observe:S}}const Y=/2g/;function Z(){const t=navigator.connection;return!!(t&&(t.saveData||Y.test(t.effectiveType)))}export{ae as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as n,o as s,c,r as o}from"./
|
|
1
|
+
import{_ as n,o as s,c,r as o}from"./Dw-rzC63.js";const r={},t={class:"n-card n-card-base"};function _(e,a){return s(),c("div",t,[o(e.$slots,"default")])}const l=Object.assign(n(r,[["render",_]]),{__name:"NCard"});export{l as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import C from"./CxJIMPBb.js";import{_ as L,o as r,c as h,r as N,g as $,j as V,e as y,b as t,w as s,a as e,k as o,l as c,d as m,t as _,m as u,n as g}from"./Dw-rzC63.js";import{_ as j}from"./BC7GvhRc.js";import{_ as B}from"./B6uQK5FY.js";import{_ as S}from"./CKsR24bi.js";import"./Dzw9Ycsi.js";const H={},I={class:"n-badge"};function A(p,d){return r(),h("span",I,[N(p.$slots,"default")])}const M=Object.assign(L(H,[["render",A]]),{__name:"NBadge"}),P={class:"grid grid-cols-1 md:grid-cols-3 gap-3 p-4"},T={class:"flex items-center gap-3 min-w-0"},W={class:"flex items-center gap-3 min-w-0"},D={class:"flex items-center gap-3 min-w-0"},J=$({__name:"index",setup(p){const{allMetrics:d}=V(),k=y().$hydrationMismatches,w=y().$lazyLoadHints,x=g(()=>k.value.length),f=g(()=>w.value.reduce((b,a)=>b+a.state.directImports.filter(n=>!n.rendered).length,0));return(b,a)=>{const n=C,z=M,l=j,i=B,v=S;return r(),h("div",P,[t(i,{to:"/web-vitals",class:"block"},{default:s(()=>[t(l,{class:"flex items-center justify-between p-4 hover:border-neutral-400 dark:hover:border-neutral-500"},{default:s(()=>[e("div",T,[t(n,{name:"material-symbols:monitoring",class:"text-xl text-blue-500"}),a[0]||(a[0]=e("div",{class:"min-w-0"},[e("div",{class:"text-sm font-medium truncate"}," Web Vitals "),e("div",{class:"text-xs text-neutral-500"}," LCP / INP / CLS ")],-1))]),o(d).length?(r(),c(z,{key:0},{default:s(()=>[m(_(o(d).length)+" issues ",1)]),_:1})):u("",!0)]),_:1})]),_:1}),t(i,{to:"/hydration",class:"block"},{default:s(()=>[t(l,{class:"flex items-center justify-between p-4 hover:border-neutral-400 dark:hover:border-neutral-500"},{default:s(()=>[e("div",W,[t(n,{name:"material-symbols:water-full",class:"text-xl text-cyan-500"}),a[1]||(a[1]=e("div",{class:"min-w-0"},[e("div",{class:"text-sm font-medium truncate"}," Hydration "),e("div",{class:"text-xs text-neutral-500"}," SSR vs client diffs ")],-1))]),o(x)?(r(),c(v,{key:0,size:"small",type:"error",bordered:!1},{default:s(()=>[m(_(o(x))+" issues ",1)]),_:1})):u("",!0)]),_:1})]),_:1}),t(i,{to:"/third-party-scripts",class:"block"},{default:s(()=>[t(l,{class:"p-4 flex items-center gap-3 hover:border-neutral-400 dark:hover:border-neutral-500"},{default:s(()=>[t(n,{name:"material-symbols:extension",class:"text-xl text-violet-500"}),a[2]||(a[2]=e("div",{class:"min-w-0"},[e("div",{class:"text-sm font-medium truncate"}," Third party scripts "),e("div",{class:"text-xs text-neutral-500"}," Analyze third-party scripts speed. ")],-1))]),_:1})]),_:1}),t(i,{to:"/component-lazy-load",class:"block"},{default:s(()=>[t(l,{class:"flex items-center justify-between p-4 hover:border-neutral-400 dark:hover:border-neutral-500"},{default:s(()=>[e("div",D,[t(n,{name:"material-symbols:speed",class:"text-xl text-amber-500"}),a[3]||(a[3]=e("div",{class:"min-w-0"},[e("div",{class:"text-sm font-medium truncate"}," Lazy Load "),e("div",{class:"text-xs text-neutral-500"}," Components to lazy-load ")],-1))]),o(f)?(r(),c(v,{key:0,size:"small",type:"warning",bordered:!1},{default:s(()=>[m(_(o(f))+" suggestions ",1)]),_:1})):u("",!0)]),_:1})]),_:1})])}}});export{J as default};
|