[{"data":1,"prerenderedAt":3716},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-nuxt-4-routing-rendering":420,"-tu-hoc-nuxt-4-routing-rendering-surround":3711},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":3704,"extension":3705,"links":3706,"meta":3707,"navigation":3708,"path":369,"seo":3709,"stem":370,"__hash__":3710},"docs\u002F2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering.md","Routing và Rendering modes",{"type":424,"value":425,"toc":3676},"minimark",[426,431,448,453,463,467,670,677,778,782,788,863,867,1172,1176,1280,1360,1426,1429,1471,1475,1619,1623,1701,1770,1807,1814,2030,2034,2040,2044,2087,2090,2094,2126,2233,2237,2274,2277,2339,2346,2353,2664,2668,2761,2765,3006,3009,3111,3115,3341,3345,3378,3385,3431,3435,3665,3673],[427,428,430],"h2",{"id":429},"_1-file-based-routing","1. File-based routing",[432,433,434,435,447],"p",{},"Trong Nuxt, ",[436,437,438,439,443,444],"strong",{},"mỗi ",[440,441,442],"code",{},".vue"," trong ",[440,445,446],{},"app\u002Fpages\u002F"," = 1 route. Không cần config router.",[449,450,452],"h3",{"id":451},"mapping-cơ-bản","Mapping cơ bản",[454,455,460],"pre",{"className":456,"code":458,"language":459},[457],"language-text","app\u002Fpages\u002F\n├── index.vue                    →  \u002F\n├── about.vue                    →  \u002Fabout\n├── contact.vue                  →  \u002Fcontact\n├── users\u002F\n│   ├── index.vue                →  \u002Fusers\n│   └── [id].vue                 →  \u002Fusers\u002F123    (dynamic param)\n├── blog\u002F\n│   ├── [...slug].vue            →  \u002Fblog\u002Fa\u002Fb\u002Fc   (catch-all)\n│   └── index.vue                →  \u002Fblog\n└── admin\u002F\n    └── [[tab]].vue              →  \u002Fadmin or \u002Fadmin\u002Fusers  (optional)\n","text",[440,461,458],{"__ignoreMap":462},"",[449,464,466],{"id":465},"dynamic-param","Dynamic param",[454,468,472],{"className":469,"code":470,"language":471,"meta":462,"style":462},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- app\u002Fpages\u002Fusers\u002F[id].vue -->\n\u003Ctemplate>\n  \u003Cdiv>User ID: {{ route.params.id }}\u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup lang=\"ts\">\nconst route = useRoute();\n\u002F\u002F route.params.id — string | string[]\n\nconst { data: user } = await useFetch(`\u002Fapi\u002Fusers\u002F${route.params.id}`);\n\u003C\u002Fscript>\n","vue",[440,473,474,483,497,520,529,536,565,586,592,597,661],{"__ignoreMap":462},[475,476,479],"span",{"class":477,"line":478},"line",1,[475,480,482],{"class":481},"sHwdD","\u003C!-- app\u002Fpages\u002Fusers\u002F[id].vue -->\n",[475,484,486,490,494],{"class":477,"line":485},2,[475,487,489],{"class":488},"sMK4o","\u003C",[475,491,493],{"class":492},"swJcz","template",[475,495,496],{"class":488},">\n",[475,498,500,503,506,509,513,516,518],{"class":477,"line":499},3,[475,501,502],{"class":488},"  \u003C",[475,504,505],{"class":492},"div",[475,507,508],{"class":488},">",[475,510,512],{"class":511},"sTEyZ","User ID: {{ route.params.id }}",[475,514,515],{"class":488},"\u003C\u002F",[475,517,505],{"class":492},[475,519,496],{"class":488},[475,521,523,525,527],{"class":477,"line":522},4,[475,524,515],{"class":488},[475,526,493],{"class":492},[475,528,496],{"class":488},[475,530,532],{"class":477,"line":531},5,[475,533,535],{"emptyLinePlaceholder":534},true,"\n",[475,537,539,541,544,548,551,554,557,561,563],{"class":477,"line":538},6,[475,540,489],{"class":488},[475,542,543],{"class":492},"script",[475,545,547],{"class":546},"spNyl"," setup",[475,549,550],{"class":546}," lang",[475,552,553],{"class":488},"=",[475,555,556],{"class":488},"\"",[475,558,560],{"class":559},"sfazB","ts",[475,562,556],{"class":488},[475,564,496],{"class":488},[475,566,568,571,574,576,580,583],{"class":477,"line":567},7,[475,569,570],{"class":546},"const",[475,572,573],{"class":511}," route ",[475,575,553],{"class":488},[475,577,579],{"class":578},"s2Zo4"," useRoute",[475,581,582],{"class":511},"()",[475,584,585],{"class":488},";\n",[475,587,589],{"class":477,"line":588},8,[475,590,591],{"class":481},"\u002F\u002F route.params.id — string | string[]\n",[475,593,595],{"class":477,"line":594},9,[475,596,535],{"emptyLinePlaceholder":534},[475,598,600,602,605,608,611,614,617,620,624,627,630,633,636,639,642,645,648,650,653,656,659],{"class":477,"line":599},10,[475,601,570],{"class":546},[475,603,604],{"class":488}," {",[475,606,607],{"class":492}," data",[475,609,610],{"class":488},":",[475,612,613],{"class":511}," user ",[475,615,616],{"class":488},"}",[475,618,619],{"class":488}," =",[475,621,623],{"class":622},"s7zQu"," await",[475,625,626],{"class":578}," useFetch",[475,628,629],{"class":511},"(",[475,631,632],{"class":488},"`",[475,634,635],{"class":559},"\u002Fapi\u002Fusers\u002F",[475,637,638],{"class":488},"${",[475,640,641],{"class":511},"route",[475,643,644],{"class":488},".",[475,646,647],{"class":511},"params",[475,649,644],{"class":488},[475,651,652],{"class":511},"id",[475,654,655],{"class":488},"}`",[475,657,658],{"class":511},")",[475,660,585],{"class":488},[475,662,664,666,668],{"class":477,"line":663},11,[475,665,515],{"class":488},[475,667,543],{"class":492},[475,669,496],{"class":488},[449,671,673,674],{"id":672},"catch-all-slug","Catch-all ",[440,675,676],{},"[...slug]",[454,678,680],{"className":469,"code":679,"language":471,"meta":462,"style":462},"\u003C!-- \u002Fblog\u002Fa\u002Fb\u002Fc → params.slug = [\"a\", \"b\", \"c\"] -->\n\u003Cscript setup lang=\"ts\">\nconst route = useRoute();\nconst path = (route.params.slug as string[]).join(\"\u002F\");\n\u003C\u002Fscript>\n",[440,681,682,687,707,721,770],{"__ignoreMap":462},[475,683,684],{"class":477,"line":478},[475,685,686],{"class":481},"\u003C!-- \u002Fblog\u002Fa\u002Fb\u002Fc → params.slug = [\"a\", \"b\", \"c\"] -->\n",[475,688,689,691,693,695,697,699,701,703,705],{"class":477,"line":485},[475,690,489],{"class":488},[475,692,543],{"class":492},[475,694,547],{"class":546},[475,696,550],{"class":546},[475,698,553],{"class":488},[475,700,556],{"class":488},[475,702,560],{"class":559},[475,704,556],{"class":488},[475,706,496],{"class":488},[475,708,709,711,713,715,717,719],{"class":477,"line":499},[475,710,570],{"class":546},[475,712,573],{"class":511},[475,714,553],{"class":488},[475,716,579],{"class":578},[475,718,582],{"class":511},[475,720,585],{"class":488},[475,722,723,725,728,730,733,735,737,739,742,745,749,752,754,757,759,761,764,766,768],{"class":477,"line":522},[475,724,570],{"class":546},[475,726,727],{"class":511}," path ",[475,729,553],{"class":488},[475,731,732],{"class":511}," (route",[475,734,644],{"class":488},[475,736,647],{"class":511},[475,738,644],{"class":488},[475,740,741],{"class":511},"slug ",[475,743,744],{"class":622},"as",[475,746,748],{"class":747},"sBMFI"," string",[475,750,751],{"class":511},"[])",[475,753,644],{"class":488},[475,755,756],{"class":578},"join",[475,758,629],{"class":511},[475,760,556],{"class":488},[475,762,763],{"class":559},"\u002F",[475,765,556],{"class":488},[475,767,658],{"class":511},[475,769,585],{"class":488},[475,771,772,774,776],{"class":477,"line":531},[475,773,515],{"class":488},[475,775,543],{"class":492},[475,777,496],{"class":488},[449,779,781],{"id":780},"nested-route-layout","Nested route + layout",[454,783,786],{"className":784,"code":785,"language":459},[457],"app\u002Fpages\u002F\n├── parent.vue                   ← parent page\n└── parent\u002F                      ← nested\n    ├── child-a.vue              →  \u002Fparent\u002Fchild-a\n    └── child-b.vue              →  \u002Fparent\u002Fchild-b\n",[440,787,785],{"__ignoreMap":462},[454,789,791],{"className":469,"code":790,"language":471,"meta":462,"style":462},"\u003C!-- app\u002Fpages\u002Fparent.vue -->\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>Parent\u003C\u002Fh1>\n    \u003CNuxtPage \u002F>                  \u003C!-- render child route ở đây -->\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n",[440,792,793,798,806,814,833,846,855],{"__ignoreMap":462},[475,794,795],{"class":477,"line":478},[475,796,797],{"class":481},"\u003C!-- app\u002Fpages\u002Fparent.vue -->\n",[475,799,800,802,804],{"class":477,"line":485},[475,801,489],{"class":488},[475,803,493],{"class":492},[475,805,496],{"class":488},[475,807,808,810,812],{"class":477,"line":499},[475,809,502],{"class":488},[475,811,505],{"class":492},[475,813,496],{"class":488},[475,815,816,819,822,824,827,829,831],{"class":477,"line":522},[475,817,818],{"class":488},"    \u003C",[475,820,821],{"class":492},"h1",[475,823,508],{"class":488},[475,825,826],{"class":511},"Parent",[475,828,515],{"class":488},[475,830,821],{"class":492},[475,832,496],{"class":488},[475,834,835,837,840,843],{"class":477,"line":531},[475,836,818],{"class":488},[475,838,839],{"class":492},"NuxtPage",[475,841,842],{"class":488}," \u002F>",[475,844,845],{"class":481},"                  \u003C!-- render child route ở đây -->\n",[475,847,848,851,853],{"class":477,"line":538},[475,849,850],{"class":488},"  \u003C\u002F",[475,852,505],{"class":492},[475,854,496],{"class":488},[475,856,857,859,861],{"class":477,"line":567},[475,858,515],{"class":488},[475,860,493],{"class":492},[475,862,496],{"class":488},[427,864,866],{"id":865},"_2-navigation","2. Navigation",[454,868,870],{"className":469,"code":869,"language":471,"meta":462,"style":462},"\u003C!-- Declarative — \u003CNuxtLink> -->\n\u003Ctemplate>\n  \u003CNuxtLink to=\"\u002Fusers\u002F123\">View user\u003C\u002FNuxtLink>\n  \u003CNuxtLink :to=\"{ name: 'users-id', params: { id: 42 } }\">By name\u003C\u002FNuxtLink>\n  \u003CNuxtLink to=\"\u002Flogin\" external>External link\u003C\u002FNuxtLink>\n\u003C\u002Ftemplate>\n\n\u003C!-- Programmatic -->\n\u003Cscript setup lang=\"ts\">\nconst router = useRouter();\nfunction goHome() { router.push(\"\u002F\"); }\n\n\u002F\u002F Hoặc dùng navigateTo (cả server + client)\nasync function login() {\n  await $fetch(\"\u002Fapi\u002Flogin\", { method: \"POST\" });\n  return navigateTo(\"\u002Fdashboard\");\n}\n\u003C\u002Fscript>\n",[440,871,872,877,885,915,944,975,983,987,992,1012,1028,1064,1069,1075,1092,1135,1157,1163],{"__ignoreMap":462},[475,873,874],{"class":477,"line":478},[475,875,876],{"class":481},"\u003C!-- Declarative — \u003CNuxtLink> -->\n",[475,878,879,881,883],{"class":477,"line":485},[475,880,489],{"class":488},[475,882,493],{"class":492},[475,884,496],{"class":488},[475,886,887,889,892,895,897,899,902,904,906,909,911,913],{"class":477,"line":499},[475,888,502],{"class":488},[475,890,891],{"class":492},"NuxtLink",[475,893,894],{"class":546}," to",[475,896,553],{"class":488},[475,898,556],{"class":488},[475,900,901],{"class":559},"\u002Fusers\u002F123",[475,903,556],{"class":488},[475,905,508],{"class":488},[475,907,908],{"class":511},"View user",[475,910,515],{"class":488},[475,912,891],{"class":492},[475,914,496],{"class":488},[475,916,917,919,921,924,926,928,931,933,935,938,940,942],{"class":477,"line":522},[475,918,502],{"class":488},[475,920,891],{"class":492},[475,922,923],{"class":546}," :to",[475,925,553],{"class":488},[475,927,556],{"class":488},[475,929,930],{"class":559},"{ name: 'users-id', params: { id: 42 } }",[475,932,556],{"class":488},[475,934,508],{"class":488},[475,936,937],{"class":511},"By name",[475,939,515],{"class":488},[475,941,891],{"class":492},[475,943,496],{"class":488},[475,945,946,948,950,952,954,956,959,961,964,966,969,971,973],{"class":477,"line":531},[475,947,502],{"class":488},[475,949,891],{"class":492},[475,951,894],{"class":546},[475,953,553],{"class":488},[475,955,556],{"class":488},[475,957,958],{"class":559},"\u002Flogin",[475,960,556],{"class":488},[475,962,963],{"class":546}," external",[475,965,508],{"class":488},[475,967,968],{"class":511},"External link",[475,970,515],{"class":488},[475,972,891],{"class":492},[475,974,496],{"class":488},[475,976,977,979,981],{"class":477,"line":538},[475,978,515],{"class":488},[475,980,493],{"class":492},[475,982,496],{"class":488},[475,984,985],{"class":477,"line":567},[475,986,535],{"emptyLinePlaceholder":534},[475,988,989],{"class":477,"line":588},[475,990,991],{"class":481},"\u003C!-- Programmatic -->\n",[475,993,994,996,998,1000,1002,1004,1006,1008,1010],{"class":477,"line":594},[475,995,489],{"class":488},[475,997,543],{"class":492},[475,999,547],{"class":546},[475,1001,550],{"class":546},[475,1003,553],{"class":488},[475,1005,556],{"class":488},[475,1007,560],{"class":559},[475,1009,556],{"class":488},[475,1011,496],{"class":488},[475,1013,1014,1016,1019,1021,1024,1026],{"class":477,"line":599},[475,1015,570],{"class":546},[475,1017,1018],{"class":511}," router ",[475,1020,553],{"class":488},[475,1022,1023],{"class":578}," useRouter",[475,1025,582],{"class":511},[475,1027,585],{"class":488},[475,1029,1030,1033,1036,1038,1040,1043,1045,1048,1050,1052,1054,1056,1058,1061],{"class":477,"line":663},[475,1031,1032],{"class":546},"function",[475,1034,1035],{"class":578}," goHome",[475,1037,582],{"class":488},[475,1039,604],{"class":488},[475,1041,1042],{"class":511}," router",[475,1044,644],{"class":488},[475,1046,1047],{"class":578},"push",[475,1049,629],{"class":492},[475,1051,556],{"class":488},[475,1053,763],{"class":559},[475,1055,556],{"class":488},[475,1057,658],{"class":492},[475,1059,1060],{"class":488},";",[475,1062,1063],{"class":488}," }\n",[475,1065,1067],{"class":477,"line":1066},12,[475,1068,535],{"emptyLinePlaceholder":534},[475,1070,1072],{"class":477,"line":1071},13,[475,1073,1074],{"class":481},"\u002F\u002F Hoặc dùng navigateTo (cả server + client)\n",[475,1076,1078,1081,1084,1087,1089],{"class":477,"line":1077},14,[475,1079,1080],{"class":546},"async",[475,1082,1083],{"class":546}," function",[475,1085,1086],{"class":578}," login",[475,1088,582],{"class":488},[475,1090,1091],{"class":488}," {\n",[475,1093,1095,1098,1101,1103,1105,1108,1110,1113,1115,1118,1120,1123,1126,1128,1131,1133],{"class":477,"line":1094},15,[475,1096,1097],{"class":622},"  await",[475,1099,1100],{"class":578}," $fetch",[475,1102,629],{"class":492},[475,1104,556],{"class":488},[475,1106,1107],{"class":559},"\u002Fapi\u002Flogin",[475,1109,556],{"class":488},[475,1111,1112],{"class":488},",",[475,1114,604],{"class":488},[475,1116,1117],{"class":492}," method",[475,1119,610],{"class":488},[475,1121,1122],{"class":488}," \"",[475,1124,1125],{"class":559},"POST",[475,1127,556],{"class":488},[475,1129,1130],{"class":488}," }",[475,1132,658],{"class":492},[475,1134,585],{"class":488},[475,1136,1138,1141,1144,1146,1148,1151,1153,1155],{"class":477,"line":1137},16,[475,1139,1140],{"class":622},"  return",[475,1142,1143],{"class":578}," navigateTo",[475,1145,629],{"class":492},[475,1147,556],{"class":488},[475,1149,1150],{"class":559},"\u002Fdashboard",[475,1152,556],{"class":488},[475,1154,658],{"class":492},[475,1156,585],{"class":488},[475,1158,1160],{"class":477,"line":1159},17,[475,1161,1162],{"class":488},"}\n",[475,1164,1166,1168,1170],{"class":477,"line":1165},18,[475,1167,515],{"class":488},[475,1169,543],{"class":492},[475,1171,496],{"class":488},[427,1173,1175],{"id":1174},"_3-layouts","3. Layouts",[454,1177,1179],{"className":469,"code":1178,"language":471,"meta":462,"style":462},"\u003C!-- app\u002Flayouts\u002Fdefault.vue -->\n\u003Ctemplate>\n  \u003Cdiv class=\"layout\">\n    \u003CHeader \u002F>\n    \u003Cmain>\n      \u003Cslot \u002F>                    \u003C!-- page nội dung -->\n    \u003C\u002Fmain>\n    \u003CFooter \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n",[440,1180,1181,1186,1194,1214,1224,1233,1246,1255,1264,1272],{"__ignoreMap":462},[475,1182,1183],{"class":477,"line":478},[475,1184,1185],{"class":481},"\u003C!-- app\u002Flayouts\u002Fdefault.vue -->\n",[475,1187,1188,1190,1192],{"class":477,"line":485},[475,1189,489],{"class":488},[475,1191,493],{"class":492},[475,1193,496],{"class":488},[475,1195,1196,1198,1200,1203,1205,1207,1210,1212],{"class":477,"line":499},[475,1197,502],{"class":488},[475,1199,505],{"class":492},[475,1201,1202],{"class":546}," class",[475,1204,553],{"class":488},[475,1206,556],{"class":488},[475,1208,1209],{"class":559},"layout",[475,1211,556],{"class":488},[475,1213,496],{"class":488},[475,1215,1216,1218,1221],{"class":477,"line":522},[475,1217,818],{"class":488},[475,1219,1220],{"class":492},"Header",[475,1222,1223],{"class":488}," \u002F>\n",[475,1225,1226,1228,1231],{"class":477,"line":531},[475,1227,818],{"class":488},[475,1229,1230],{"class":492},"main",[475,1232,496],{"class":488},[475,1234,1235,1238,1241,1243],{"class":477,"line":538},[475,1236,1237],{"class":488},"      \u003C",[475,1239,1240],{"class":492},"slot",[475,1242,842],{"class":488},[475,1244,1245],{"class":481},"                    \u003C!-- page nội dung -->\n",[475,1247,1248,1251,1253],{"class":477,"line":567},[475,1249,1250],{"class":488},"    \u003C\u002F",[475,1252,1230],{"class":492},[475,1254,496],{"class":488},[475,1256,1257,1259,1262],{"class":477,"line":588},[475,1258,818],{"class":488},[475,1260,1261],{"class":492},"Footer",[475,1263,1223],{"class":488},[475,1265,1266,1268,1270],{"class":477,"line":594},[475,1267,850],{"class":488},[475,1269,505],{"class":492},[475,1271,496],{"class":488},[475,1273,1274,1276,1278],{"class":477,"line":599},[475,1275,515],{"class":488},[475,1277,493],{"class":492},[475,1279,496],{"class":488},[454,1281,1283],{"className":469,"code":1282,"language":471,"meta":462,"style":462},"\u003C!-- app\u002Flayouts\u002Fadmin.vue -->\n\u003Ctemplate>\n  \u003Cdiv class=\"admin-layout\">\n    \u003CAdminSidebar \u002F>\n    \u003Cmain>\u003Cslot \u002F>\u003C\u002Fmain>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n",[440,1284,1285,1290,1298,1317,1326,1344,1352],{"__ignoreMap":462},[475,1286,1287],{"class":477,"line":478},[475,1288,1289],{"class":481},"\u003C!-- app\u002Flayouts\u002Fadmin.vue -->\n",[475,1291,1292,1294,1296],{"class":477,"line":485},[475,1293,489],{"class":488},[475,1295,493],{"class":492},[475,1297,496],{"class":488},[475,1299,1300,1302,1304,1306,1308,1310,1313,1315],{"class":477,"line":499},[475,1301,502],{"class":488},[475,1303,505],{"class":492},[475,1305,1202],{"class":546},[475,1307,553],{"class":488},[475,1309,556],{"class":488},[475,1311,1312],{"class":559},"admin-layout",[475,1314,556],{"class":488},[475,1316,496],{"class":488},[475,1318,1319,1321,1324],{"class":477,"line":522},[475,1320,818],{"class":488},[475,1322,1323],{"class":492},"AdminSidebar",[475,1325,1223],{"class":488},[475,1327,1328,1330,1332,1335,1337,1340,1342],{"class":477,"line":531},[475,1329,818],{"class":488},[475,1331,1230],{"class":492},[475,1333,1334],{"class":488},">\u003C",[475,1336,1240],{"class":492},[475,1338,1339],{"class":488}," \u002F>\u003C\u002F",[475,1341,1230],{"class":492},[475,1343,496],{"class":488},[475,1345,1346,1348,1350],{"class":477,"line":538},[475,1347,850],{"class":488},[475,1349,505],{"class":492},[475,1351,496],{"class":488},[475,1353,1354,1356,1358],{"class":477,"line":567},[475,1355,515],{"class":488},[475,1357,493],{"class":492},[475,1359,496],{"class":488},[454,1361,1363],{"className":469,"code":1362,"language":471,"meta":462,"style":462},"\u003C!-- app\u002Fpages\u002Fadmin\u002Fusers.vue — chọn layout admin -->\n\u003Cscript setup lang=\"ts\">\ndefinePageMeta({ layout: \"admin\" });\n\u003C\u002Fscript>\n",[440,1364,1365,1370,1390,1418],{"__ignoreMap":462},[475,1366,1367],{"class":477,"line":478},[475,1368,1369],{"class":481},"\u003C!-- app\u002Fpages\u002Fadmin\u002Fusers.vue — chọn layout admin -->\n",[475,1371,1372,1374,1376,1378,1380,1382,1384,1386,1388],{"class":477,"line":485},[475,1373,489],{"class":488},[475,1375,543],{"class":492},[475,1377,547],{"class":546},[475,1379,550],{"class":546},[475,1381,553],{"class":488},[475,1383,556],{"class":488},[475,1385,560],{"class":559},[475,1387,556],{"class":488},[475,1389,496],{"class":488},[475,1391,1392,1395,1397,1400,1403,1405,1407,1410,1412,1414,1416],{"class":477,"line":499},[475,1393,1394],{"class":578},"definePageMeta",[475,1396,629],{"class":511},[475,1398,1399],{"class":488},"{",[475,1401,1402],{"class":492}," layout",[475,1404,610],{"class":488},[475,1406,1122],{"class":488},[475,1408,1409],{"class":559},"admin",[475,1411,556],{"class":488},[475,1413,1130],{"class":488},[475,1415,658],{"class":511},[475,1417,585],{"class":488},[475,1419,1420,1422,1424],{"class":477,"line":522},[475,1421,515],{"class":488},[475,1423,543],{"class":492},[475,1425,496],{"class":488},[432,1427,1428],{},"Hoặc dynamic:",[454,1430,1432],{"className":469,"code":1431,"language":471,"meta":462,"style":462},"\u003CNuxtLayout :name=\"layoutName\">\n  \u003CNuxtPage \u002F>\n\u003C\u002FNuxtLayout>\n",[440,1433,1434,1458,1463],{"__ignoreMap":462},[475,1435,1436,1438,1441,1444,1447,1449,1451,1454,1456],{"class":477,"line":478},[475,1437,489],{"class":488},[475,1439,1440],{"class":492},"NuxtLayout",[475,1442,1443],{"class":488}," :",[475,1445,1446],{"class":546},"name",[475,1448,553],{"class":488},[475,1450,556],{"class":488},[475,1452,1453],{"class":511},"layoutName",[475,1455,556],{"class":488},[475,1457,496],{"class":488},[475,1459,1460],{"class":477,"line":485},[475,1461,1462],{"class":511},"  \u003CNuxtPage \u002F>\n",[475,1464,1465,1467,1469],{"class":477,"line":499},[475,1466,515],{"class":488},[475,1468,1440],{"class":492},[475,1470,496],{"class":488},[427,1472,1474],{"id":1473},"_4-route-middleware","4. Route middleware",[454,1476,1480],{"className":1477,"code":1478,"language":1479,"meta":462,"style":462},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F app\u002Fmiddleware\u002Fauth.ts\nexport default defineNuxtRouteMiddleware((to, from) => {\n  const user = useState(\"user\");\n  if (!user.value && to.path !== \"\u002Flogin\") {\n    return navigateTo(\"\u002Flogin\");\n  }\n});\n","typescript",[440,1481,1482,1487,1518,1544,1587,1606,1611],{"__ignoreMap":462},[475,1483,1484],{"class":477,"line":478},[475,1485,1486],{"class":481},"\u002F\u002F app\u002Fmiddleware\u002Fauth.ts\n",[475,1488,1489,1492,1495,1498,1500,1502,1506,1508,1511,1513,1516],{"class":477,"line":485},[475,1490,1491],{"class":622},"export",[475,1493,1494],{"class":622}," default",[475,1496,1497],{"class":578}," defineNuxtRouteMiddleware",[475,1499,629],{"class":511},[475,1501,629],{"class":488},[475,1503,1505],{"class":1504},"sHdIc","to",[475,1507,1112],{"class":488},[475,1509,1510],{"class":1504}," from",[475,1512,658],{"class":488},[475,1514,1515],{"class":546}," =>",[475,1517,1091],{"class":488},[475,1519,1520,1523,1526,1528,1531,1533,1535,1538,1540,1542],{"class":477,"line":499},[475,1521,1522],{"class":546},"  const",[475,1524,1525],{"class":511}," user",[475,1527,619],{"class":488},[475,1529,1530],{"class":578}," useState",[475,1532,629],{"class":492},[475,1534,556],{"class":488},[475,1536,1537],{"class":559},"user",[475,1539,556],{"class":488},[475,1541,658],{"class":492},[475,1543,585],{"class":488},[475,1545,1546,1549,1552,1555,1557,1559,1562,1565,1567,1569,1572,1575,1577,1579,1581,1584],{"class":477,"line":522},[475,1547,1548],{"class":622},"  if",[475,1550,1551],{"class":492}," (",[475,1553,1554],{"class":488},"!",[475,1556,1537],{"class":511},[475,1558,644],{"class":488},[475,1560,1561],{"class":511},"value",[475,1563,1564],{"class":488}," &&",[475,1566,894],{"class":511},[475,1568,644],{"class":488},[475,1570,1571],{"class":511},"path",[475,1573,1574],{"class":488}," !==",[475,1576,1122],{"class":488},[475,1578,958],{"class":559},[475,1580,556],{"class":488},[475,1582,1583],{"class":492},") ",[475,1585,1586],{"class":488},"{\n",[475,1588,1589,1592,1594,1596,1598,1600,1602,1604],{"class":477,"line":531},[475,1590,1591],{"class":622},"    return",[475,1593,1143],{"class":578},[475,1595,629],{"class":492},[475,1597,556],{"class":488},[475,1599,958],{"class":559},[475,1601,556],{"class":488},[475,1603,658],{"class":492},[475,1605,585],{"class":488},[475,1607,1608],{"class":477,"line":538},[475,1609,1610],{"class":488},"  }\n",[475,1612,1613,1615,1617],{"class":477,"line":567},[475,1614,616],{"class":488},[475,1616,658],{"class":511},[475,1618,585],{"class":488},[449,1620,1622],{"id":1621},"áp-dụng","Áp dụng",[454,1624,1626],{"className":469,"code":1625,"language":471,"meta":462,"style":462},"\u003C!-- Per-page -->\n\u003Cscript setup lang=\"ts\">\ndefinePageMeta({ middleware: \"auth\" });\n\u003C\u002Fscript>\n\n\u003C!-- Hoặc global — auto chạy cho mọi route -->\n\u003C!-- app\u002Fmiddleware\u002Flog.global.ts -->\n",[440,1627,1628,1633,1653,1679,1687,1691,1696],{"__ignoreMap":462},[475,1629,1630],{"class":477,"line":478},[475,1631,1632],{"class":481},"\u003C!-- Per-page -->\n",[475,1634,1635,1637,1639,1641,1643,1645,1647,1649,1651],{"class":477,"line":485},[475,1636,489],{"class":488},[475,1638,543],{"class":492},[475,1640,547],{"class":546},[475,1642,550],{"class":546},[475,1644,553],{"class":488},[475,1646,556],{"class":488},[475,1648,560],{"class":559},[475,1650,556],{"class":488},[475,1652,496],{"class":488},[475,1654,1655,1657,1659,1661,1664,1666,1668,1671,1673,1675,1677],{"class":477,"line":499},[475,1656,1394],{"class":578},[475,1658,629],{"class":511},[475,1660,1399],{"class":488},[475,1662,1663],{"class":492}," middleware",[475,1665,610],{"class":488},[475,1667,1122],{"class":488},[475,1669,1670],{"class":559},"auth",[475,1672,556],{"class":488},[475,1674,1130],{"class":488},[475,1676,658],{"class":511},[475,1678,585],{"class":488},[475,1680,1681,1683,1685],{"class":477,"line":522},[475,1682,515],{"class":488},[475,1684,543],{"class":492},[475,1686,496],{"class":488},[475,1688,1689],{"class":477,"line":531},[475,1690,535],{"emptyLinePlaceholder":534},[475,1692,1693],{"class":477,"line":538},[475,1694,1695],{"class":481},"\u003C!-- Hoặc global — auto chạy cho mọi route -->\n",[475,1697,1698],{"class":477,"line":567},[475,1699,1700],{"class":481},"\u003C!-- app\u002Fmiddleware\u002Flog.global.ts -->\n",[454,1702,1704],{"className":1477,"code":1703,"language":1479,"meta":462,"style":462},"\u002F\u002F app\u002Fmiddleware\u002Flog.global.ts — auto chạy mọi route\nexport default defineNuxtRouteMiddleware((to) => {\n  console.log(\"Navigating to:\", to.path);\n});\n",[440,1705,1706,1711,1731,1762],{"__ignoreMap":462},[475,1707,1708],{"class":477,"line":478},[475,1709,1710],{"class":481},"\u002F\u002F app\u002Fmiddleware\u002Flog.global.ts — auto chạy mọi route\n",[475,1712,1713,1715,1717,1719,1721,1723,1725,1727,1729],{"class":477,"line":485},[475,1714,1491],{"class":622},[475,1716,1494],{"class":622},[475,1718,1497],{"class":578},[475,1720,629],{"class":511},[475,1722,629],{"class":488},[475,1724,1505],{"class":1504},[475,1726,658],{"class":488},[475,1728,1515],{"class":546},[475,1730,1091],{"class":488},[475,1732,1733,1736,1738,1741,1743,1745,1748,1750,1752,1754,1756,1758,1760],{"class":477,"line":499},[475,1734,1735],{"class":511},"  console",[475,1737,644],{"class":488},[475,1739,1740],{"class":578},"log",[475,1742,629],{"class":492},[475,1744,556],{"class":488},[475,1746,1747],{"class":559},"Navigating to:",[475,1749,556],{"class":488},[475,1751,1112],{"class":488},[475,1753,894],{"class":511},[475,1755,644],{"class":488},[475,1757,1571],{"class":511},[475,1759,658],{"class":492},[475,1761,585],{"class":488},[475,1763,1764,1766,1768],{"class":477,"line":522},[475,1765,616],{"class":488},[475,1767,658],{"class":511},[475,1769,585],{"class":488},[1771,1772,1775,1786],"callout",{"color":1773,"icon":1774},"warning","i-lucide-star",[432,1776,1777,1778,1781,1782],{},"⭐ ",[436,1779,1780],{},"Câu PV:"," ",[1783,1784,1785],"em",{},"\"Middleware Nuxt khác Vue Router beforeEach chỗ nào?\"",[1787,1788,1789],"blockquote",{},[432,1790,1791,1792,1795,1796,1799,1800,1803,1804,1806],{},"\"Vue Router ",[440,1793,1794],{},"beforeEach"," chỉ chạy ở client. Nuxt middleware chạy ",[436,1797,1798],{},"cả server (SSR) lẫn client navigation"," — đảm bảo logic auth consistent ở mọi render mode. File ",[440,1801,1802],{},"*.global.ts"," auto-run mọi route, không global thì phải register qua ",[440,1805,1394],{},".\"",[427,1808,1810,1811,1813],{"id":1809},"_5-definepagemeta-config-page","5. ",[440,1812,1394],{}," — config page",[454,1815,1817],{"className":469,"code":1816,"language":471,"meta":462,"style":462},"\u003Cscript setup lang=\"ts\">\ndefinePageMeta({\n  layout: \"admin\",\n  middleware: [\"auth\", \"admin-only\"],\n  validate: async (route) => {\n    return \u002F^\\d+$\u002F.test(route.params.id);   \u002F\u002F chỉ accept số\n  },\n  scrollToTop: true,\n  pageTransition: { name: \"slide\", mode: \"out-in\" },\n});\n\u003C\u002Fscript>\n",[440,1818,1819,1839,1847,1863,1893,1913,1958,1963,1976,2014,2022],{"__ignoreMap":462},[475,1820,1821,1823,1825,1827,1829,1831,1833,1835,1837],{"class":477,"line":478},[475,1822,489],{"class":488},[475,1824,543],{"class":492},[475,1826,547],{"class":546},[475,1828,550],{"class":546},[475,1830,553],{"class":488},[475,1832,556],{"class":488},[475,1834,560],{"class":559},[475,1836,556],{"class":488},[475,1838,496],{"class":488},[475,1840,1841,1843,1845],{"class":477,"line":485},[475,1842,1394],{"class":578},[475,1844,629],{"class":511},[475,1846,1586],{"class":488},[475,1848,1849,1852,1854,1856,1858,1860],{"class":477,"line":499},[475,1850,1851],{"class":492},"  layout",[475,1853,610],{"class":488},[475,1855,1122],{"class":488},[475,1857,1409],{"class":559},[475,1859,556],{"class":488},[475,1861,1862],{"class":488},",\n",[475,1864,1865,1868,1870,1873,1875,1877,1879,1881,1883,1886,1888,1891],{"class":477,"line":522},[475,1866,1867],{"class":492},"  middleware",[475,1869,610],{"class":488},[475,1871,1872],{"class":511}," [",[475,1874,556],{"class":488},[475,1876,1670],{"class":559},[475,1878,556],{"class":488},[475,1880,1112],{"class":488},[475,1882,1122],{"class":488},[475,1884,1885],{"class":559},"admin-only",[475,1887,556],{"class":488},[475,1889,1890],{"class":511},"]",[475,1892,1862],{"class":488},[475,1894,1895,1898,1900,1903,1905,1907,1909,1911],{"class":477,"line":531},[475,1896,1897],{"class":578},"  validate",[475,1899,610],{"class":488},[475,1901,1902],{"class":546}," async",[475,1904,1551],{"class":488},[475,1906,641],{"class":1504},[475,1908,658],{"class":488},[475,1910,1515],{"class":546},[475,1912,1091],{"class":488},[475,1914,1915,1917,1920,1923,1926,1929,1932,1934,1936,1939,1941,1943,1945,1947,1949,1951,1953,1955],{"class":477,"line":538},[475,1916,1591],{"class":622},[475,1918,1919],{"class":488}," \u002F",[475,1921,1922],{"class":622},"^",[475,1924,1925],{"class":559},"\\d",[475,1927,1928],{"class":488},"+",[475,1930,1931],{"class":622},"$",[475,1933,763],{"class":488},[475,1935,644],{"class":488},[475,1937,1938],{"class":578},"test",[475,1940,629],{"class":492},[475,1942,641],{"class":511},[475,1944,644],{"class":488},[475,1946,647],{"class":511},[475,1948,644],{"class":488},[475,1950,652],{"class":511},[475,1952,658],{"class":492},[475,1954,1060],{"class":488},[475,1956,1957],{"class":481},"   \u002F\u002F chỉ accept số\n",[475,1959,1960],{"class":477,"line":567},[475,1961,1962],{"class":488},"  },\n",[475,1964,1965,1968,1970,1974],{"class":477,"line":588},[475,1966,1967],{"class":492},"  scrollToTop",[475,1969,610],{"class":488},[475,1971,1973],{"class":1972},"sfNiH"," true",[475,1975,1862],{"class":488},[475,1977,1978,1981,1983,1985,1988,1990,1992,1995,1997,1999,2002,2004,2006,2009,2011],{"class":477,"line":594},[475,1979,1980],{"class":492},"  pageTransition",[475,1982,610],{"class":488},[475,1984,604],{"class":488},[475,1986,1987],{"class":492}," name",[475,1989,610],{"class":488},[475,1991,1122],{"class":488},[475,1993,1994],{"class":559},"slide",[475,1996,556],{"class":488},[475,1998,1112],{"class":488},[475,2000,2001],{"class":492}," mode",[475,2003,610],{"class":488},[475,2005,1122],{"class":488},[475,2007,2008],{"class":559},"out-in",[475,2010,556],{"class":488},[475,2012,2013],{"class":488}," },\n",[475,2015,2016,2018,2020],{"class":477,"line":599},[475,2017,616],{"class":488},[475,2019,658],{"class":511},[475,2021,585],{"class":488},[475,2023,2024,2026,2028],{"class":477,"line":663},[475,2025,515],{"class":488},[475,2027,543],{"class":492},[475,2029,496],{"class":488},[427,2031,2033],{"id":2032},"_6-rendering-modes-4-lựa-chọn","6. Rendering modes — 4 lựa chọn",[432,2035,2036,2037,644],{},"Nuxt mạnh ở chỗ ",[436,2038,2039],{},"mỗi route có thể chọn rendering mode khác nhau",[449,2041,2043],{"id":2042},"ssr-server-side-rendering-default","SSR (Server-Side Rendering) — default",[454,2045,2047],{"className":1477,"code":2046,"language":1479,"meta":462,"style":462},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  ssr: true                  \u002F\u002F default\n});\n",[440,2048,2049,2054,2067,2079],{"__ignoreMap":462},[475,2050,2051],{"class":477,"line":478},[475,2052,2053],{"class":481},"\u002F\u002F nuxt.config.ts\n",[475,2055,2056,2058,2060,2063,2065],{"class":477,"line":485},[475,2057,1491],{"class":622},[475,2059,1494],{"class":622},[475,2061,2062],{"class":578}," defineNuxtConfig",[475,2064,629],{"class":511},[475,2066,1586],{"class":488},[475,2068,2069,2072,2074,2076],{"class":477,"line":499},[475,2070,2071],{"class":492},"  ssr",[475,2073,610],{"class":488},[475,2075,1973],{"class":1972},[475,2077,2078],{"class":481},"                  \u002F\u002F default\n",[475,2080,2081,2083,2085],{"class":477,"line":522},[475,2082,616],{"class":488},[475,2084,658],{"class":511},[475,2086,585],{"class":488},[432,2088,2089],{},"Mỗi request → server render HTML → trả về browser → hydrate JS. SEO tốt, first paint nhanh.",[449,2091,2093],{"id":2092},"ssg-static-prerender","SSG \u002F Static (Prerender)",[454,2095,2099],{"className":2096,"code":2097,"language":2098,"meta":462,"style":462},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Build ra static HTML cho mọi page\nnpx nuxt generate\n\n# Deploy thư mục .output\u002Fpublic — dùng Netlify, Cloudflare Pages, GitHub Pages\n","bash",[440,2100,2101,2106,2117,2121],{"__ignoreMap":462},[475,2102,2103],{"class":477,"line":478},[475,2104,2105],{"class":481},"# Build ra static HTML cho mọi page\n",[475,2107,2108,2111,2114],{"class":477,"line":485},[475,2109,2110],{"class":747},"npx",[475,2112,2113],{"class":559}," nuxt",[475,2115,2116],{"class":559}," generate\n",[475,2118,2119],{"class":477,"line":499},[475,2120,535],{"emptyLinePlaceholder":534},[475,2122,2123],{"class":477,"line":522},[475,2124,2125],{"class":481},"# Deploy thư mục .output\u002Fpublic — dùng Netlify, Cloudflare Pages, GitHub Pages\n",[454,2127,2129],{"className":1477,"code":2128,"language":1479,"meta":462,"style":462},"\u002F\u002F Prerender per-route\nexport default defineNuxtConfig({\n  routeRules: {\n    \"\u002F\": { prerender: true },\n    \"\u002Fabout\": { prerender: true },\n    \"\u002Fblog\u002F**\": { prerender: true },\n  }\n});\n",[440,2130,2131,2136,2148,2157,2179,2200,2221,2225],{"__ignoreMap":462},[475,2132,2133],{"class":477,"line":478},[475,2134,2135],{"class":481},"\u002F\u002F Prerender per-route\n",[475,2137,2138,2140,2142,2144,2146],{"class":477,"line":485},[475,2139,1491],{"class":622},[475,2141,1494],{"class":622},[475,2143,2062],{"class":578},[475,2145,629],{"class":511},[475,2147,1586],{"class":488},[475,2149,2150,2153,2155],{"class":477,"line":499},[475,2151,2152],{"class":492},"  routeRules",[475,2154,610],{"class":488},[475,2156,1091],{"class":488},[475,2158,2159,2162,2164,2166,2168,2170,2173,2175,2177],{"class":477,"line":522},[475,2160,2161],{"class":488},"    \"",[475,2163,763],{"class":492},[475,2165,556],{"class":488},[475,2167,610],{"class":488},[475,2169,604],{"class":488},[475,2171,2172],{"class":492}," prerender",[475,2174,610],{"class":488},[475,2176,1973],{"class":1972},[475,2178,2013],{"class":488},[475,2180,2181,2183,2186,2188,2190,2192,2194,2196,2198],{"class":477,"line":531},[475,2182,2161],{"class":488},[475,2184,2185],{"class":492},"\u002Fabout",[475,2187,556],{"class":488},[475,2189,610],{"class":488},[475,2191,604],{"class":488},[475,2193,2172],{"class":492},[475,2195,610],{"class":488},[475,2197,1973],{"class":1972},[475,2199,2013],{"class":488},[475,2201,2202,2204,2207,2209,2211,2213,2215,2217,2219],{"class":477,"line":538},[475,2203,2161],{"class":488},[475,2205,2206],{"class":492},"\u002Fblog\u002F**",[475,2208,556],{"class":488},[475,2210,610],{"class":488},[475,2212,604],{"class":488},[475,2214,2172],{"class":492},[475,2216,610],{"class":488},[475,2218,1973],{"class":1972},[475,2220,2013],{"class":488},[475,2222,2223],{"class":477,"line":567},[475,2224,1610],{"class":488},[475,2226,2227,2229,2231],{"class":477,"line":588},[475,2228,616],{"class":488},[475,2230,658],{"class":511},[475,2232,585],{"class":488},[449,2234,2236],{"id":2235},"spa-client-only","SPA (Client-only)",[454,2238,2240],{"className":1477,"code":2239,"language":1479,"meta":462,"style":462},"export default defineNuxtConfig({\n  ssr: false                 \u002F\u002F toàn app là SPA\n});\n",[440,2241,2242,2254,2266],{"__ignoreMap":462},[475,2243,2244,2246,2248,2250,2252],{"class":477,"line":478},[475,2245,1491],{"class":622},[475,2247,1494],{"class":622},[475,2249,2062],{"class":578},[475,2251,629],{"class":511},[475,2253,1586],{"class":488},[475,2255,2256,2258,2260,2263],{"class":477,"line":485},[475,2257,2071],{"class":492},[475,2259,610],{"class":488},[475,2261,2262],{"class":1972}," false",[475,2264,2265],{"class":481},"                 \u002F\u002F toàn app là SPA\n",[475,2267,2268,2270,2272],{"class":477,"line":499},[475,2269,616],{"class":488},[475,2271,658],{"class":511},[475,2273,585],{"class":488},[432,2275,2276],{},"Hoặc per-route:",[454,2278,2280],{"className":1477,"code":2279,"language":1479,"meta":462,"style":462},"export default defineNuxtConfig({\n  routeRules: {\n    \"\u002Fdashboard\u002F**\": { ssr: false }    \u002F\u002F dashboard là SPA, public route SSR\n  }\n});\n",[440,2281,2282,2294,2302,2327,2331],{"__ignoreMap":462},[475,2283,2284,2286,2288,2290,2292],{"class":477,"line":478},[475,2285,1491],{"class":622},[475,2287,1494],{"class":622},[475,2289,2062],{"class":578},[475,2291,629],{"class":511},[475,2293,1586],{"class":488},[475,2295,2296,2298,2300],{"class":477,"line":485},[475,2297,2152],{"class":492},[475,2299,610],{"class":488},[475,2301,1091],{"class":488},[475,2303,2304,2306,2309,2311,2313,2315,2318,2320,2322,2324],{"class":477,"line":499},[475,2305,2161],{"class":488},[475,2307,2308],{"class":492},"\u002Fdashboard\u002F**",[475,2310,556],{"class":488},[475,2312,610],{"class":488},[475,2314,604],{"class":488},[475,2316,2317],{"class":492}," ssr",[475,2319,610],{"class":488},[475,2321,2262],{"class":1972},[475,2323,1130],{"class":488},[475,2325,2326],{"class":481},"    \u002F\u002F dashboard là SPA, public route SSR\n",[475,2328,2329],{"class":477,"line":522},[475,2330,1610],{"class":488},[475,2332,2333,2335,2337],{"class":477,"line":531},[475,2334,616],{"class":488},[475,2336,658],{"class":511},[475,2338,585],{"class":488},[449,2340,2342,2343],{"id":2341},"hybrid-rendering-routerules","Hybrid rendering — ",[440,2344,2345],{},"routeRules",[1771,2347,1777,2349,2352],{"color":2348,"icon":1774},"primary",[436,2350,2351],{},"Hybrid rendering là sức mạnh lớn nhất Nuxt 4"," — mỗi route mode riêng:",[454,2354,2356],{"className":1477,"code":2355,"language":1479,"meta":462,"style":462},"export default defineNuxtConfig({\n  routeRules: {\n    \u002F\u002F Static — prerender ở build, serve CDN\n    \"\u002F\": { prerender: true },\n    \"\u002Fabout\": { prerender: true },\n    \n    \u002F\u002F ISR — regenerate sau N giây (như Next.js ISR)\n    \"\u002Fblog\u002F**\": { isr: 600 },         \u002F\u002F cache 10 phút\n    \n    \u002F\u002F SWR — stale-while-revalidate\n    \"\u002Fnews\u002F**\": { swr: 60 },\n    \n    \u002F\u002F SPA only — không SSR\n    \"\u002Fadmin\u002F**\": { ssr: false },\n    \n    \u002F\u002F Server only — không bundle JS client\n    \"\u002Fapi\u002F**\": { cors: true },\n    \n    \u002F\u002F Custom headers\n    \"\u002Flegal\u002F*\": {\n      headers: { \"Cache-Control\": \"max-age=31536000\" }\n    },\n    \n    \u002F\u002F Redirect\n    \"\u002Fold-page\": { redirect: \"\u002Fnew-page\" },\n  }\n});\n",[440,2357,2358,2370,2378,2383,2403,2423,2428,2433,2460,2464,2469,2492,2496,2501,2522,2526,2531,2553,2557,2563,2577,2605,2611,2616,2622,2650,2655],{"__ignoreMap":462},[475,2359,2360,2362,2364,2366,2368],{"class":477,"line":478},[475,2361,1491],{"class":622},[475,2363,1494],{"class":622},[475,2365,2062],{"class":578},[475,2367,629],{"class":511},[475,2369,1586],{"class":488},[475,2371,2372,2374,2376],{"class":477,"line":485},[475,2373,2152],{"class":492},[475,2375,610],{"class":488},[475,2377,1091],{"class":488},[475,2379,2380],{"class":477,"line":499},[475,2381,2382],{"class":481},"    \u002F\u002F Static — prerender ở build, serve CDN\n",[475,2384,2385,2387,2389,2391,2393,2395,2397,2399,2401],{"class":477,"line":522},[475,2386,2161],{"class":488},[475,2388,763],{"class":492},[475,2390,556],{"class":488},[475,2392,610],{"class":488},[475,2394,604],{"class":488},[475,2396,2172],{"class":492},[475,2398,610],{"class":488},[475,2400,1973],{"class":1972},[475,2402,2013],{"class":488},[475,2404,2405,2407,2409,2411,2413,2415,2417,2419,2421],{"class":477,"line":531},[475,2406,2161],{"class":488},[475,2408,2185],{"class":492},[475,2410,556],{"class":488},[475,2412,610],{"class":488},[475,2414,604],{"class":488},[475,2416,2172],{"class":492},[475,2418,610],{"class":488},[475,2420,1973],{"class":1972},[475,2422,2013],{"class":488},[475,2424,2425],{"class":477,"line":538},[475,2426,2427],{"class":511},"    \n",[475,2429,2430],{"class":477,"line":567},[475,2431,2432],{"class":481},"    \u002F\u002F ISR — regenerate sau N giây (như Next.js ISR)\n",[475,2434,2435,2437,2439,2441,2443,2445,2448,2450,2454,2457],{"class":477,"line":588},[475,2436,2161],{"class":488},[475,2438,2206],{"class":492},[475,2440,556],{"class":488},[475,2442,610],{"class":488},[475,2444,604],{"class":488},[475,2446,2447],{"class":492}," isr",[475,2449,610],{"class":488},[475,2451,2453],{"class":2452},"sbssI"," 600",[475,2455,2456],{"class":488}," },",[475,2458,2459],{"class":481},"         \u002F\u002F cache 10 phút\n",[475,2461,2462],{"class":477,"line":594},[475,2463,2427],{"class":511},[475,2465,2466],{"class":477,"line":599},[475,2467,2468],{"class":481},"    \u002F\u002F SWR — stale-while-revalidate\n",[475,2470,2471,2473,2476,2478,2480,2482,2485,2487,2490],{"class":477,"line":663},[475,2472,2161],{"class":488},[475,2474,2475],{"class":492},"\u002Fnews\u002F**",[475,2477,556],{"class":488},[475,2479,610],{"class":488},[475,2481,604],{"class":488},[475,2483,2484],{"class":492}," swr",[475,2486,610],{"class":488},[475,2488,2489],{"class":2452}," 60",[475,2491,2013],{"class":488},[475,2493,2494],{"class":477,"line":1066},[475,2495,2427],{"class":511},[475,2497,2498],{"class":477,"line":1071},[475,2499,2500],{"class":481},"    \u002F\u002F SPA only — không SSR\n",[475,2502,2503,2505,2508,2510,2512,2514,2516,2518,2520],{"class":477,"line":1077},[475,2504,2161],{"class":488},[475,2506,2507],{"class":492},"\u002Fadmin\u002F**",[475,2509,556],{"class":488},[475,2511,610],{"class":488},[475,2513,604],{"class":488},[475,2515,2317],{"class":492},[475,2517,610],{"class":488},[475,2519,2262],{"class":1972},[475,2521,2013],{"class":488},[475,2523,2524],{"class":477,"line":1094},[475,2525,2427],{"class":511},[475,2527,2528],{"class":477,"line":1137},[475,2529,2530],{"class":481},"    \u002F\u002F Server only — không bundle JS client\n",[475,2532,2533,2535,2538,2540,2542,2544,2547,2549,2551],{"class":477,"line":1159},[475,2534,2161],{"class":488},[475,2536,2537],{"class":492},"\u002Fapi\u002F**",[475,2539,556],{"class":488},[475,2541,610],{"class":488},[475,2543,604],{"class":488},[475,2545,2546],{"class":492}," cors",[475,2548,610],{"class":488},[475,2550,1973],{"class":1972},[475,2552,2013],{"class":488},[475,2554,2555],{"class":477,"line":1165},[475,2556,2427],{"class":511},[475,2558,2560],{"class":477,"line":2559},19,[475,2561,2562],{"class":481},"    \u002F\u002F Custom headers\n",[475,2564,2566,2568,2571,2573,2575],{"class":477,"line":2565},20,[475,2567,2161],{"class":488},[475,2569,2570],{"class":492},"\u002Flegal\u002F*",[475,2572,556],{"class":488},[475,2574,610],{"class":488},[475,2576,1091],{"class":488},[475,2578,2580,2583,2585,2587,2589,2592,2594,2596,2598,2601,2603],{"class":477,"line":2579},21,[475,2581,2582],{"class":492},"      headers",[475,2584,610],{"class":488},[475,2586,604],{"class":488},[475,2588,1122],{"class":488},[475,2590,2591],{"class":492},"Cache-Control",[475,2593,556],{"class":488},[475,2595,610],{"class":488},[475,2597,1122],{"class":488},[475,2599,2600],{"class":559},"max-age=31536000",[475,2602,556],{"class":488},[475,2604,1063],{"class":488},[475,2606,2608],{"class":477,"line":2607},22,[475,2609,2610],{"class":488},"    },\n",[475,2612,2614],{"class":477,"line":2613},23,[475,2615,2427],{"class":511},[475,2617,2619],{"class":477,"line":2618},24,[475,2620,2621],{"class":481},"    \u002F\u002F Redirect\n",[475,2623,2625,2627,2630,2632,2634,2636,2639,2641,2643,2646,2648],{"class":477,"line":2624},25,[475,2626,2161],{"class":488},[475,2628,2629],{"class":492},"\u002Fold-page",[475,2631,556],{"class":488},[475,2633,610],{"class":488},[475,2635,604],{"class":488},[475,2637,2638],{"class":492}," redirect",[475,2640,610],{"class":488},[475,2642,1122],{"class":488},[475,2644,2645],{"class":559},"\u002Fnew-page",[475,2647,556],{"class":488},[475,2649,2013],{"class":488},[475,2651,2653],{"class":477,"line":2652},26,[475,2654,1610],{"class":488},[475,2656,2658,2660,2662],{"class":477,"line":2657},27,[475,2659,616],{"class":488},[475,2661,658],{"class":511},[475,2663,585],{"class":488},[449,2665,2667],{"id":2666},"so-sánh-modes","So sánh modes",[2669,2670,2671,2690],"table",{},[2672,2673,2674],"thead",{},[2675,2676,2677,2681,2684,2687],"tr",{},[2678,2679,2680],"th",{},"Mode",[2678,2682,2683],{},"Server render",[2678,2685,2686],{},"Client hydrate",[2678,2688,2689],{},"Khi nào",[2691,2692,2693,2708,2721,2734,2747],"tbody",{},[2675,2694,2695,2699,2702,2705],{},[2696,2697,2698],"td",{},"SSR (default)",[2696,2700,2701],{},"Mỗi request",[2696,2703,2704],{},"✅",[2696,2706,2707],{},"App có data động, SEO quan trọng",[2675,2709,2710,2713,2716,2718],{},[2696,2711,2712],{},"SSG \u002F Prerender",[2696,2714,2715],{},"Build time",[2696,2717,2704],{},[2696,2719,2720],{},"Marketing site, docs, blog ổn định",[2675,2722,2723,2726,2729,2731],{},[2696,2724,2725],{},"ISR",[2696,2727,2728],{},"Build time + revalidate",[2696,2730,2704],{},[2696,2732,2733],{},"Content đổi định kỳ (blog, product)",[2675,2735,2736,2739,2742,2744],{},[2696,2737,2738],{},"SWR",[2696,2740,2741],{},"Cache request đầu",[2696,2743,2704],{},[2696,2745,2746],{},"Trang dynamic không cần realtime",[2675,2748,2749,2752,2755,2758],{},[2696,2750,2751],{},"SPA",[2696,2753,2754],{},"❌",[2696,2756,2757],{},"Full client",[2696,2759,2760],{},"Dashboard auth-gated, không cần SEO",[427,2762,2764],{"id":2763},"_7-error-pages","7. Error pages",[454,2766,2768],{"className":469,"code":2767,"language":471,"meta":462,"style":462},"\u003C!-- app\u002Ferror.vue -->\n\u003Ctemplate>\n  \u003Cdiv class=\"error\">\n    \u003Ch1>{{ error.statusCode }}\u003C\u002Fh1>\n    \u003Cp>{{ error.statusMessage }}\u003C\u002Fp>\n    \u003Cbutton @click=\"handleError\">Go home\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup lang=\"ts\">\nconst props = defineProps\u003C{ error: { statusCode: number; statusMessage: string } }>();\n\nfunction handleError() {\n  clearError({ redirect: \"\u002F\" });\n}\n\u003C\u002Fscript>\n",[440,2769,2770,2775,2783,2802,2819,2836,2866,2874,2882,2886,2906,2954,2958,2969,2994,2998],{"__ignoreMap":462},[475,2771,2772],{"class":477,"line":478},[475,2773,2774],{"class":481},"\u003C!-- app\u002Ferror.vue -->\n",[475,2776,2777,2779,2781],{"class":477,"line":485},[475,2778,489],{"class":488},[475,2780,493],{"class":492},[475,2782,496],{"class":488},[475,2784,2785,2787,2789,2791,2793,2795,2798,2800],{"class":477,"line":499},[475,2786,502],{"class":488},[475,2788,505],{"class":492},[475,2790,1202],{"class":546},[475,2792,553],{"class":488},[475,2794,556],{"class":488},[475,2796,2797],{"class":559},"error",[475,2799,556],{"class":488},[475,2801,496],{"class":488},[475,2803,2804,2806,2808,2810,2813,2815,2817],{"class":477,"line":522},[475,2805,818],{"class":488},[475,2807,821],{"class":492},[475,2809,508],{"class":488},[475,2811,2812],{"class":511},"{{ error.statusCode }}",[475,2814,515],{"class":488},[475,2816,821],{"class":492},[475,2818,496],{"class":488},[475,2820,2821,2823,2825,2827,2830,2832,2834],{"class":477,"line":531},[475,2822,818],{"class":488},[475,2824,432],{"class":492},[475,2826,508],{"class":488},[475,2828,2829],{"class":511},"{{ error.statusMessage }}",[475,2831,515],{"class":488},[475,2833,432],{"class":492},[475,2835,496],{"class":488},[475,2837,2838,2840,2843,2846,2848,2850,2853,2855,2857,2860,2862,2864],{"class":477,"line":538},[475,2839,818],{"class":488},[475,2841,2842],{"class":492},"button",[475,2844,2845],{"class":546}," @click",[475,2847,553],{"class":488},[475,2849,556],{"class":488},[475,2851,2852],{"class":559},"handleError",[475,2854,556],{"class":488},[475,2856,508],{"class":488},[475,2858,2859],{"class":511},"Go home",[475,2861,515],{"class":488},[475,2863,2842],{"class":492},[475,2865,496],{"class":488},[475,2867,2868,2870,2872],{"class":477,"line":567},[475,2869,850],{"class":488},[475,2871,505],{"class":492},[475,2873,496],{"class":488},[475,2875,2876,2878,2880],{"class":477,"line":588},[475,2877,515],{"class":488},[475,2879,493],{"class":492},[475,2881,496],{"class":488},[475,2883,2884],{"class":477,"line":594},[475,2885,535],{"emptyLinePlaceholder":534},[475,2887,2888,2890,2892,2894,2896,2898,2900,2902,2904],{"class":477,"line":599},[475,2889,489],{"class":488},[475,2891,543],{"class":492},[475,2893,547],{"class":546},[475,2895,550],{"class":546},[475,2897,553],{"class":488},[475,2899,556],{"class":488},[475,2901,560],{"class":559},[475,2903,556],{"class":488},[475,2905,496],{"class":488},[475,2907,2908,2910,2913,2915,2918,2921,2924,2926,2928,2931,2933,2936,2938,2941,2943,2945,2947,2950,2952],{"class":477,"line":663},[475,2909,570],{"class":546},[475,2911,2912],{"class":511}," props ",[475,2914,553],{"class":488},[475,2916,2917],{"class":578}," defineProps",[475,2919,2920],{"class":488},"\u003C{",[475,2922,2923],{"class":492}," error",[475,2925,610],{"class":488},[475,2927,604],{"class":488},[475,2929,2930],{"class":492}," statusCode",[475,2932,610],{"class":488},[475,2934,2935],{"class":747}," number",[475,2937,1060],{"class":488},[475,2939,2940],{"class":492}," statusMessage",[475,2942,610],{"class":488},[475,2944,748],{"class":747},[475,2946,1130],{"class":488},[475,2948,2949],{"class":488}," }>",[475,2951,582],{"class":511},[475,2953,585],{"class":488},[475,2955,2956],{"class":477,"line":1066},[475,2957,535],{"emptyLinePlaceholder":534},[475,2959,2960,2962,2965,2967],{"class":477,"line":1071},[475,2961,1032],{"class":546},[475,2963,2964],{"class":578}," handleError",[475,2966,582],{"class":488},[475,2968,1091],{"class":488},[475,2970,2971,2974,2976,2978,2980,2982,2984,2986,2988,2990,2992],{"class":477,"line":1077},[475,2972,2973],{"class":578},"  clearError",[475,2975,629],{"class":492},[475,2977,1399],{"class":488},[475,2979,2638],{"class":492},[475,2981,610],{"class":488},[475,2983,1122],{"class":488},[475,2985,763],{"class":559},[475,2987,556],{"class":488},[475,2989,1130],{"class":488},[475,2991,658],{"class":492},[475,2993,585],{"class":488},[475,2995,2996],{"class":477,"line":1094},[475,2997,1162],{"class":488},[475,2999,3000,3002,3004],{"class":477,"line":1137},[475,3001,515],{"class":488},[475,3003,543],{"class":492},[475,3005,496],{"class":488},[432,3007,3008],{},"Throw error trong page\u002Fmiddleware:",[454,3010,3012],{"className":1477,"code":3011,"language":1479,"meta":462,"style":462},"\u002F\u002F Server\nthrow createError({ statusCode: 404, statusMessage: \"Not Found\" });\n\n\u002F\u002F Client + Server\nthrow createError({ statusCode: 401, statusMessage: \"Unauthorized\", fatal: true });\n",[440,3013,3014,3019,3057,3061,3066],{"__ignoreMap":462},[475,3015,3016],{"class":477,"line":478},[475,3017,3018],{"class":481},"\u002F\u002F Server\n",[475,3020,3021,3024,3027,3029,3031,3033,3035,3038,3040,3042,3044,3046,3049,3051,3053,3055],{"class":477,"line":485},[475,3022,3023],{"class":622},"throw",[475,3025,3026],{"class":578}," createError",[475,3028,629],{"class":511},[475,3030,1399],{"class":488},[475,3032,2930],{"class":492},[475,3034,610],{"class":488},[475,3036,3037],{"class":2452}," 404",[475,3039,1112],{"class":488},[475,3041,2940],{"class":492},[475,3043,610],{"class":488},[475,3045,1122],{"class":488},[475,3047,3048],{"class":559},"Not Found",[475,3050,556],{"class":488},[475,3052,1130],{"class":488},[475,3054,658],{"class":511},[475,3056,585],{"class":488},[475,3058,3059],{"class":477,"line":499},[475,3060,535],{"emptyLinePlaceholder":534},[475,3062,3063],{"class":477,"line":522},[475,3064,3065],{"class":481},"\u002F\u002F Client + Server\n",[475,3067,3068,3070,3072,3074,3076,3078,3080,3083,3085,3087,3089,3091,3094,3096,3098,3101,3103,3105,3107,3109],{"class":477,"line":531},[475,3069,3023],{"class":622},[475,3071,3026],{"class":578},[475,3073,629],{"class":511},[475,3075,1399],{"class":488},[475,3077,2930],{"class":492},[475,3079,610],{"class":488},[475,3081,3082],{"class":2452}," 401",[475,3084,1112],{"class":488},[475,3086,2940],{"class":492},[475,3088,610],{"class":488},[475,3090,1122],{"class":488},[475,3092,3093],{"class":559},"Unauthorized",[475,3095,556],{"class":488},[475,3097,1112],{"class":488},[475,3099,3100],{"class":492}," fatal",[475,3102,610],{"class":488},[475,3104,1973],{"class":1972},[475,3106,1130],{"class":488},[475,3108,658],{"class":511},[475,3110,585],{"class":488},[427,3112,3114],{"id":3113},"_8-layout-transition-page-transition","8. Layout transition + page transition",[454,3116,3118],{"className":469,"code":3117,"language":471,"meta":462,"style":462},"\u003Cscript setup lang=\"ts\">\ndefinePageMeta({\n  pageTransition: { name: \"slide\", mode: \"out-in\" },\n  layoutTransition: { name: \"fade\" },\n});\n\u003C\u002Fscript>\n\n\u003Cstyle>\n.slide-enter-active, .slide-leave-active { transition: all 0.3s; }\n.slide-enter-from { transform: translateX(50px); opacity: 0; }\n.slide-leave-to { transform: translateX(-50px); opacity: 0; }\n\u003C\u002Fstyle>\n",[440,3119,3120,3140,3148,3180,3202,3210,3218,3222,3231,3264,3301,3333],{"__ignoreMap":462},[475,3121,3122,3124,3126,3128,3130,3132,3134,3136,3138],{"class":477,"line":478},[475,3123,489],{"class":488},[475,3125,543],{"class":492},[475,3127,547],{"class":546},[475,3129,550],{"class":546},[475,3131,553],{"class":488},[475,3133,556],{"class":488},[475,3135,560],{"class":559},[475,3137,556],{"class":488},[475,3139,496],{"class":488},[475,3141,3142,3144,3146],{"class":477,"line":485},[475,3143,1394],{"class":578},[475,3145,629],{"class":511},[475,3147,1586],{"class":488},[475,3149,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178],{"class":477,"line":499},[475,3151,1980],{"class":492},[475,3153,610],{"class":488},[475,3155,604],{"class":488},[475,3157,1987],{"class":492},[475,3159,610],{"class":488},[475,3161,1122],{"class":488},[475,3163,1994],{"class":559},[475,3165,556],{"class":488},[475,3167,1112],{"class":488},[475,3169,2001],{"class":492},[475,3171,610],{"class":488},[475,3173,1122],{"class":488},[475,3175,2008],{"class":559},[475,3177,556],{"class":488},[475,3179,2013],{"class":488},[475,3181,3182,3185,3187,3189,3191,3193,3195,3198,3200],{"class":477,"line":522},[475,3183,3184],{"class":492},"  layoutTransition",[475,3186,610],{"class":488},[475,3188,604],{"class":488},[475,3190,1987],{"class":492},[475,3192,610],{"class":488},[475,3194,1122],{"class":488},[475,3196,3197],{"class":559},"fade",[475,3199,556],{"class":488},[475,3201,2013],{"class":488},[475,3203,3204,3206,3208],{"class":477,"line":531},[475,3205,616],{"class":488},[475,3207,658],{"class":511},[475,3209,585],{"class":488},[475,3211,3212,3214,3216],{"class":477,"line":538},[475,3213,515],{"class":488},[475,3215,543],{"class":492},[475,3217,496],{"class":488},[475,3219,3220],{"class":477,"line":567},[475,3221,535],{"emptyLinePlaceholder":534},[475,3223,3224,3226,3229],{"class":477,"line":588},[475,3225,489],{"class":488},[475,3227,3228],{"class":492},"style",[475,3230,496],{"class":488},[475,3232,3233,3235,3238,3240,3243,3246,3248,3252,3254,3257,3260,3262],{"class":477,"line":594},[475,3234,644],{"class":488},[475,3236,3237],{"class":747},"slide-enter-active",[475,3239,1112],{"class":488},[475,3241,3242],{"class":488}," .",[475,3244,3245],{"class":747},"slide-leave-active",[475,3247,604],{"class":488},[475,3249,3251],{"class":3250},"sqsOY"," transition",[475,3253,610],{"class":488},[475,3255,3256],{"class":511}," all ",[475,3258,3259],{"class":2452},"0.3s",[475,3261,1060],{"class":488},[475,3263,1063],{"class":488},[475,3265,3266,3268,3271,3273,3276,3278,3281,3283,3286,3289,3292,3294,3297,3299],{"class":477,"line":599},[475,3267,644],{"class":488},[475,3269,3270],{"class":747},"slide-enter-from",[475,3272,604],{"class":488},[475,3274,3275],{"class":3250}," transform",[475,3277,610],{"class":488},[475,3279,3280],{"class":578}," translateX",[475,3282,629],{"class":488},[475,3284,3285],{"class":2452},"50px",[475,3287,3288],{"class":488},");",[475,3290,3291],{"class":3250}," opacity",[475,3293,610],{"class":488},[475,3295,3296],{"class":2452}," 0",[475,3298,1060],{"class":488},[475,3300,1063],{"class":488},[475,3302,3303,3305,3308,3310,3312,3314,3316,3318,3321,3323,3325,3327,3329,3331],{"class":477,"line":663},[475,3304,644],{"class":488},[475,3306,3307],{"class":747},"slide-leave-to",[475,3309,604],{"class":488},[475,3311,3275],{"class":3250},[475,3313,610],{"class":488},[475,3315,3280],{"class":578},[475,3317,629],{"class":488},[475,3319,3320],{"class":2452},"-50px",[475,3322,3288],{"class":488},[475,3324,3291],{"class":3250},[475,3326,610],{"class":488},[475,3328,3296],{"class":2452},[475,3330,1060],{"class":488},[475,3332,1063],{"class":488},[475,3334,3335,3337,3339],{"class":477,"line":1066},[475,3336,515],{"class":488},[475,3338,3228],{"class":492},[475,3340,496],{"class":488},[427,3342,3344],{"id":3343},"_9-nuxtlink-prefetch","9. NuxtLink prefetch",[454,3346,3348],{"className":469,"code":3347,"language":471,"meta":462,"style":462},"\u003CNuxtLink to=\"\u002Fblog\u002Fpost-1\">Read post\u003C\u002FNuxtLink>\n",[440,3349,3350],{"__ignoreMap":462},[475,3351,3352,3354,3356,3358,3360,3362,3365,3367,3369,3372,3374,3376],{"class":477,"line":478},[475,3353,489],{"class":488},[475,3355,891],{"class":492},[475,3357,894],{"class":546},[475,3359,553],{"class":488},[475,3361,556],{"class":488},[475,3363,3364],{"class":559},"\u002Fblog\u002Fpost-1",[475,3366,556],{"class":488},[475,3368,508],{"class":488},[475,3370,3371],{"class":511},"Read post",[475,3373,515],{"class":488},[475,3375,891],{"class":492},[475,3377,496],{"class":488},[432,3379,3380,3381,3384],{},"Mặc định Nuxt ",[436,3382,3383],{},"prefetch"," link visible trong viewport — click instant. Tắt:",[454,3386,3388],{"className":469,"code":3387,"language":471,"meta":462,"style":462},"\u003CNuxtLink to=\"\u002Fheavy\" :prefetch=\"false\">Heavy page\u003C\u002FNuxtLink>\n",[440,3389,3390],{"__ignoreMap":462},[475,3391,3392,3394,3396,3398,3400,3402,3405,3407,3409,3411,3413,3415,3418,3420,3422,3425,3427,3429],{"class":477,"line":478},[475,3393,489],{"class":488},[475,3395,891],{"class":492},[475,3397,894],{"class":546},[475,3399,553],{"class":488},[475,3401,556],{"class":488},[475,3403,3404],{"class":559},"\u002Fheavy",[475,3406,556],{"class":488},[475,3408,1443],{"class":488},[475,3410,3383],{"class":546},[475,3412,553],{"class":488},[475,3414,556],{"class":488},[475,3416,3417],{"class":1972},"false",[475,3419,556],{"class":488},[475,3421,508],{"class":488},[475,3423,3424],{"class":511},"Heavy page",[475,3426,515],{"class":488},[475,3428,891],{"class":492},[475,3430,496],{"class":488},[427,3432,3434],{"id":3433},"_10-seo-meta","10. SEO meta",[454,3436,3438],{"className":469,"code":3437,"language":471,"meta":462,"style":462},"\u003Cscript setup lang=\"ts\">\nuseSeoMeta({\n  title: \"Blog post — My App\",\n  description: \"Tóm tắt nội dung bài viết\",\n  ogTitle: \"Blog post\",\n  ogDescription: \"Tóm tắt\",\n  ogImage: \"https:\u002F\u002Fexample.com\u002Fog.png\",\n  ogUrl: \"https:\u002F\u002Fexample.com\u002Fblog\u002Fpost-1\",\n  twitterCard: \"summary_large_image\",\n});\n\n\u002F\u002F Hoặc useHead — generic\nuseHead({\n  link: [{ rel: \"canonical\", href: \"https:\u002F\u002Fexample.com\u002Fblog\u002Fpost-1\" }],\n});\n\u003C\u002Fscript>\n",[440,3439,3440,3460,3469,3485,3501,3517,3533,3549,3565,3581,3589,3593,3598,3607,3649,3657],{"__ignoreMap":462},[475,3441,3442,3444,3446,3448,3450,3452,3454,3456,3458],{"class":477,"line":478},[475,3443,489],{"class":488},[475,3445,543],{"class":492},[475,3447,547],{"class":546},[475,3449,550],{"class":546},[475,3451,553],{"class":488},[475,3453,556],{"class":488},[475,3455,560],{"class":559},[475,3457,556],{"class":488},[475,3459,496],{"class":488},[475,3461,3462,3465,3467],{"class":477,"line":485},[475,3463,3464],{"class":578},"useSeoMeta",[475,3466,629],{"class":511},[475,3468,1586],{"class":488},[475,3470,3471,3474,3476,3478,3481,3483],{"class":477,"line":499},[475,3472,3473],{"class":492},"  title",[475,3475,610],{"class":488},[475,3477,1122],{"class":488},[475,3479,3480],{"class":559},"Blog post — My App",[475,3482,556],{"class":488},[475,3484,1862],{"class":488},[475,3486,3487,3490,3492,3494,3497,3499],{"class":477,"line":522},[475,3488,3489],{"class":492},"  description",[475,3491,610],{"class":488},[475,3493,1122],{"class":488},[475,3495,3496],{"class":559},"Tóm tắt nội dung bài viết",[475,3498,556],{"class":488},[475,3500,1862],{"class":488},[475,3502,3503,3506,3508,3510,3513,3515],{"class":477,"line":531},[475,3504,3505],{"class":492},"  ogTitle",[475,3507,610],{"class":488},[475,3509,1122],{"class":488},[475,3511,3512],{"class":559},"Blog post",[475,3514,556],{"class":488},[475,3516,1862],{"class":488},[475,3518,3519,3522,3524,3526,3529,3531],{"class":477,"line":538},[475,3520,3521],{"class":492},"  ogDescription",[475,3523,610],{"class":488},[475,3525,1122],{"class":488},[475,3527,3528],{"class":559},"Tóm tắt",[475,3530,556],{"class":488},[475,3532,1862],{"class":488},[475,3534,3535,3538,3540,3542,3545,3547],{"class":477,"line":567},[475,3536,3537],{"class":492},"  ogImage",[475,3539,610],{"class":488},[475,3541,1122],{"class":488},[475,3543,3544],{"class":559},"https:\u002F\u002Fexample.com\u002Fog.png",[475,3546,556],{"class":488},[475,3548,1862],{"class":488},[475,3550,3551,3554,3556,3558,3561,3563],{"class":477,"line":588},[475,3552,3553],{"class":492},"  ogUrl",[475,3555,610],{"class":488},[475,3557,1122],{"class":488},[475,3559,3560],{"class":559},"https:\u002F\u002Fexample.com\u002Fblog\u002Fpost-1",[475,3562,556],{"class":488},[475,3564,1862],{"class":488},[475,3566,3567,3570,3572,3574,3577,3579],{"class":477,"line":594},[475,3568,3569],{"class":492},"  twitterCard",[475,3571,610],{"class":488},[475,3573,1122],{"class":488},[475,3575,3576],{"class":559},"summary_large_image",[475,3578,556],{"class":488},[475,3580,1862],{"class":488},[475,3582,3583,3585,3587],{"class":477,"line":599},[475,3584,616],{"class":488},[475,3586,658],{"class":511},[475,3588,585],{"class":488},[475,3590,3591],{"class":477,"line":663},[475,3592,535],{"emptyLinePlaceholder":534},[475,3594,3595],{"class":477,"line":1066},[475,3596,3597],{"class":481},"\u002F\u002F Hoặc useHead — generic\n",[475,3599,3600,3603,3605],{"class":477,"line":1071},[475,3601,3602],{"class":578},"useHead",[475,3604,629],{"class":511},[475,3606,1586],{"class":488},[475,3608,3609,3612,3614,3616,3618,3621,3623,3625,3628,3630,3632,3635,3637,3639,3641,3643,3645,3647],{"class":477,"line":1077},[475,3610,3611],{"class":492},"  link",[475,3613,610],{"class":488},[475,3615,1872],{"class":511},[475,3617,1399],{"class":488},[475,3619,3620],{"class":492}," rel",[475,3622,610],{"class":488},[475,3624,1122],{"class":488},[475,3626,3627],{"class":559},"canonical",[475,3629,556],{"class":488},[475,3631,1112],{"class":488},[475,3633,3634],{"class":492}," href",[475,3636,610],{"class":488},[475,3638,1122],{"class":488},[475,3640,3560],{"class":559},[475,3642,556],{"class":488},[475,3644,1130],{"class":488},[475,3646,1890],{"class":511},[475,3648,1862],{"class":488},[475,3650,3651,3653,3655],{"class":477,"line":1094},[475,3652,616],{"class":488},[475,3654,658],{"class":511},[475,3656,585],{"class":488},[475,3658,3659,3661,3663],{"class":477,"line":1137},[475,3660,515],{"class":488},[475,3662,543],{"class":492},[475,3664,496],{"class":488},[1771,3666,3668,3669],{"color":2348,"icon":3667},"i-lucide-arrow-right","Tiếp theo: ",[3670,3671,3672],"a",{"href":374},"Data Fetching & Server Routes",[3228,3674,3675],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}",{"title":462,"searchDepth":485,"depth":485,"links":3677},[3678,3685,3686,3687,3690,3692,3700,3701,3702,3703],{"id":429,"depth":485,"text":430,"children":3679},[3680,3681,3682,3684],{"id":451,"depth":499,"text":452},{"id":465,"depth":499,"text":466},{"id":672,"depth":499,"text":3683},"Catch-all [...slug]",{"id":780,"depth":499,"text":781},{"id":865,"depth":485,"text":866},{"id":1174,"depth":485,"text":1175},{"id":1473,"depth":485,"text":1474,"children":3688},[3689],{"id":1621,"depth":499,"text":1622},{"id":1809,"depth":485,"text":3691},"5. definePageMeta — config page",{"id":2032,"depth":485,"text":2033,"children":3693},[3694,3695,3696,3697,3699],{"id":2042,"depth":499,"text":2043},{"id":2092,"depth":499,"text":2093},{"id":2235,"depth":499,"text":2236},{"id":2341,"depth":499,"text":3698},"Hybrid rendering — routeRules",{"id":2666,"depth":499,"text":2667},{"id":2763,"depth":485,"text":2764},{"id":3113,"depth":485,"text":3114},{"id":3343,"depth":485,"text":3344},{"id":3433,"depth":485,"text":3434},"File-based routing, layouts, middleware, SSR \u002F SSG \u002F SPA \u002F Hybrid rendering — chọn đúng cho app.","md",null,{},{"title":368,"icon":371},{"title":422,"description":3704},"tmYWCV6pizyuWieJueRg6ZGr7kIOeDzPASwHW0QHZCk",[3712,3714],{"title":173,"path":365,"stem":366,"description":3713,"icon":176,"children":-1},"Nuxt 4.0 (07\u002F2025) — cấu trúc app\u002F, smarter data fetching, TypeScript chia projects. Cài đặt và project mới.",{"title":373,"path":374,"stem":375,"description":3715,"icon":91,"children":-1},"useFetch, useAsyncData, $fetch, state management, server API routes, Nitro engine — Nuxt 4 mới nhất.",1783490360093]