[{"data":1,"prerenderedAt":2462},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-nuxt-4-gioi-thieu-cai-dat":420,"-tu-hoc-nuxt-4-gioi-thieu-cai-dat-surround":2457},[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":2450,"extension":2451,"links":2452,"meta":2453,"navigation":2454,"path":365,"seo":2455,"stem":366,"__hash__":2456},"docs\u002F2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat.md","Giới thiệu và Cài đặt Nuxt 4",{"type":424,"value":425,"toc":2430},"minimark",[426,431,443,462,473,477,555,559,568,661,669,850,854,870,874,954,960,964,972,996,1004,1537,1541,1578,1581,1638,1652,1656,1662,1713,1726,1730,1737,1818,1915,1934,1938,2074,2078,2331,2411,2418,2426],[427,428,430],"h2",{"id":429},"_1-nuxt-là-gì","1. Nuxt là gì?",[432,433,434,438,439,442],"p",{},[435,436,437],"strong",{},"Nuxt"," = meta-framework xây trên ",[435,440,441],{},"Vue 3"," — kèm sẵn:",[444,445,446,450,453,456,459],"ul",{},[447,448,449],"li",{},"File-based routing.",[447,451,452],{},"SSR \u002F SSG \u002F SPA \u002F Hybrid rendering.",[447,454,455],{},"Auto-import composable, component.",[447,457,458],{},"Server engine (Nitro) — write API route trong cùng project.",[447,460,461],{},"Module ecosystem cực rộng.",[432,463,464,465,468,469,472],{},"Tương đương ",[435,466,467],{},"Next.js cho React",", ",[435,470,471],{},"SvelteKit cho Svelte",".",[427,474,476],{"id":475},"_2-nuxt-40-bản-stable-072025","2. Nuxt 4.0 — bản stable (07\u002F2025)",[478,479,480,504,516,530,534,543],"card-group",{},[481,482,485,486,468,490,468,493,468,496,499,500,503],"card",{"icon":483,"title":484},"i-lucide-folder-tree","Cấu trúc app\u002F mới","Tất cả code app (",[487,488,489],"code",{},"components\u002F",[487,491,492],{},"pages\u002F",[487,494,495],{},"layouts\u002F",[487,497,498],{},"composables\u002F",") chuyển vào ",[487,501,502],{},"app\u002F",". Config & dependency ở root → tách biệt rõ.",[481,505,508,511,512,515],{"icon":506,"title":507},"i-lucide-refresh-cw","Smarter data fetching",[487,509,510],{},"useFetch","\u002F",[487,513,514],{},"useAsyncData"," — auto cache theo key, dedupe request, cleanup khi unmount, reactive key tự refetch.",[481,517,520,521,468,523,468,526,529],{"icon":518,"title":519},"i-lucide-shield-check","TS chia 3 project","Tách project TS riêng cho ",[487,522,502],{},[487,524,525],{},"server\u002F",[487,527,528],{},"shared\u002F"," → type inference chính xác, server util không leak sang client.",[481,531,533],{"icon":268,"title":532},"Performance (4.2)","Abort control cho data fetching, async handler extraction giảm bundle đến 39%, experimental TS plugin support.",[481,535,538,539,542],{"icon":536,"title":537},"i-lucide-trash-2","Drop legacy","Bỏ Nuxt 2 compat từ ",[487,540,541],{},"@nuxt\u002Fkit",", một số legacy util gone. Migration codemod chạy được tự động.",[481,544,547,550,551,554],{"icon":545,"title":546},"i-lucide-check-circle","Migration painless",[487,548,549],{},"npx nuxt upgrade --dedupe"," + ",[487,552,553],{},"npx codemod@latest nuxt\u002F4\u002Fmigration-recipe"," — đa số project xong trong vài phút.",[427,556,558],{"id":557},"_3-nuxt-3-vs-nuxt-4-chỗ-đổi-đáng-kể","3. Nuxt 3 vs Nuxt 4 — chỗ đổi đáng kể",[560,561,564,567],"callout",{"color":562,"icon":563},"primary","i-lucide-info",[435,565,566],{},"Nuxt 3 support đến cuối tháng 01\u002F2026"," — kèm backport feature từ 4. Bạn không bị ép migrate vội.",[569,570,571,585],"table",{},[572,573,574],"thead",{},[575,576,577,580,583],"tr",{},[578,579],"th",{},[578,581,582],{},"Nuxt 3",[578,584,358],{},[586,587,588,602,617,628,639,650],"tbody",{},[575,589,590,594,597],{},[591,592,593],"td",{},"Cấu trúc",[591,595,596],{},"Files ở root",[591,598,599,601],{},[487,600,502],{}," directory mặc định",[575,603,604,609,612],{},[591,605,606,608],{},[487,607,510],{}," stale",[591,610,611],{},"Giữ data cũ khi refetch (stale-while-revalidate)",[591,613,614],{},[435,615,616],{},"Clear data → null, pending=true",[575,618,619,622,625],{},[591,620,621],{},"Share data cùng key",[591,623,624],{},"Không tự động",[591,626,627],{},"✅ Tự động share",[575,629,630,633,636],{},[591,631,632],{},"TS project",[591,634,635],{},"1 project tổng",[591,637,638],{},"3 project (app\u002Fserver\u002Fshared)",[575,640,641,644,647],{},[591,642,643],{},"Data cleanup",[591,645,646],{},"Manual",[591,648,649],{},"✅ Auto khi component unmount",[575,651,652,655,658],{},[591,653,654],{},"Module compat Nuxt 2",[591,656,657],{},"Có",[591,659,660],{},"❌ Drop",[662,663,665,666,668],"h3",{"id":664},"breaking-change-usefetch-data-behavior","Breaking change ",[487,667,510],{}," data behavior",[670,671,676],"pre",{"className":672,"code":673,"language":674,"meta":675,"style":675},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- Nuxt 3 — stale-while-revalidate -->\n\u003Cscript setup>\nconst { data, pending } = await useFetch(\"\u002Fapi\u002Fusers\");\n\u002F\u002F Khi refetch — data cũ giữ, pending = true\n\u003C\u002Fscript>\n\n\u003C!-- Nuxt 4 — clear immediately -->\n\u003Cscript setup>\nconst { data, pending } = await useFetch(\"\u002Fapi\u002Fusers\");\n\u002F\u002F Khi refetch — data = null, pending = true\n\u002F\u002F Muốn giữ behavior cũ: `getCachedData`\n\u003C\u002Fscript>\n","vue","",[487,677,678,687,705,756,762,772,779,785,796,829,835,841],{"__ignoreMap":675},[679,680,683],"span",{"class":681,"line":682},"line",1,[679,684,686],{"class":685},"sHwdD","\u003C!-- Nuxt 3 — stale-while-revalidate -->\n",[679,688,690,694,698,702],{"class":681,"line":689},2,[679,691,693],{"class":692},"sMK4o","\u003C",[679,695,697],{"class":696},"swJcz","script",[679,699,701],{"class":700},"spNyl"," setup",[679,703,704],{"class":692},">\n",[679,706,708,711,714,718,721,724,727,730,734,738,741,744,748,750,753],{"class":681,"line":707},3,[679,709,710],{"class":700},"const",[679,712,713],{"class":692}," {",[679,715,717],{"class":716},"sTEyZ"," data",[679,719,720],{"class":692},",",[679,722,723],{"class":716}," pending ",[679,725,726],{"class":692},"}",[679,728,729],{"class":692}," =",[679,731,733],{"class":732},"s7zQu"," await",[679,735,737],{"class":736},"s2Zo4"," useFetch",[679,739,740],{"class":716},"(",[679,742,743],{"class":692},"\"",[679,745,747],{"class":746},"sfazB","\u002Fapi\u002Fusers",[679,749,743],{"class":692},[679,751,752],{"class":716},")",[679,754,755],{"class":692},";\n",[679,757,759],{"class":681,"line":758},4,[679,760,761],{"class":685},"\u002F\u002F Khi refetch — data cũ giữ, pending = true\n",[679,763,765,768,770],{"class":681,"line":764},5,[679,766,767],{"class":692},"\u003C\u002F",[679,769,697],{"class":696},[679,771,704],{"class":692},[679,773,775],{"class":681,"line":774},6,[679,776,778],{"emptyLinePlaceholder":777},true,"\n",[679,780,782],{"class":681,"line":781},7,[679,783,784],{"class":685},"\u003C!-- Nuxt 4 — clear immediately -->\n",[679,786,788,790,792,794],{"class":681,"line":787},8,[679,789,693],{"class":692},[679,791,697],{"class":696},[679,793,701],{"class":700},[679,795,704],{"class":692},[679,797,799,801,803,805,807,809,811,813,815,817,819,821,823,825,827],{"class":681,"line":798},9,[679,800,710],{"class":700},[679,802,713],{"class":692},[679,804,717],{"class":716},[679,806,720],{"class":692},[679,808,723],{"class":716},[679,810,726],{"class":692},[679,812,729],{"class":692},[679,814,733],{"class":732},[679,816,737],{"class":736},[679,818,740],{"class":716},[679,820,743],{"class":692},[679,822,747],{"class":746},[679,824,743],{"class":692},[679,826,752],{"class":716},[679,828,755],{"class":692},[679,830,832],{"class":681,"line":831},10,[679,833,834],{"class":685},"\u002F\u002F Khi refetch — data = null, pending = true\n",[679,836,838],{"class":681,"line":837},11,[679,839,840],{"class":685},"\u002F\u002F Muốn giữ behavior cũ: `getCachedData`\n",[679,842,844,846,848],{"class":681,"line":843},12,[679,845,767],{"class":692},[679,847,697],{"class":696},[679,849,704],{"class":692},[427,851,853],{"id":852},"_4-yêu-cầu-hệ-thống","4. Yêu cầu hệ thống",[444,855,856,862,867],{},[447,857,858,861],{},[435,859,860],{},"Node.js 18.x trở lên"," (khuyến nghị 20 LTS \u002F 22 LTS).",[447,863,864,472],{},[435,865,866],{},"npm \u002F pnpm \u002F yarn \u002F bun",[447,868,869],{},"Editor có Volar (Vue Language Server) — VS Code mặc định có.",[427,871,873],{"id":872},"_5-tạo-project-mới","5. Tạo project mới",[670,875,879],{"className":876,"code":877,"language":878,"meta":675,"style":675},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Khuyên dùng — nuxi (CLI chính chủ)\nnpx nuxi@latest init my-app\n\n# Hoặc với pnpm\npnpm dlx nuxi@latest init my-app\n\n# Vào project\ncd my-app\npnpm install\npnpm dev\n","bash",[487,880,881,886,901,905,910,924,928,933,940,947],{"__ignoreMap":675},[679,882,883],{"class":681,"line":682},[679,884,885],{"class":685},"# Khuyên dùng — nuxi (CLI chính chủ)\n",[679,887,888,892,895,898],{"class":681,"line":689},[679,889,891],{"class":890},"sBMFI","npx",[679,893,894],{"class":746}," nuxi@latest",[679,896,897],{"class":746}," init",[679,899,900],{"class":746}," my-app\n",[679,902,903],{"class":681,"line":707},[679,904,778],{"emptyLinePlaceholder":777},[679,906,907],{"class":681,"line":758},[679,908,909],{"class":685},"# Hoặc với pnpm\n",[679,911,912,915,918,920,922],{"class":681,"line":764},[679,913,914],{"class":890},"pnpm",[679,916,917],{"class":746}," dlx",[679,919,894],{"class":746},[679,921,897],{"class":746},[679,923,900],{"class":746},[679,925,926],{"class":681,"line":774},[679,927,778],{"emptyLinePlaceholder":777},[679,929,930],{"class":681,"line":781},[679,931,932],{"class":685},"# Vào project\n",[679,934,935,938],{"class":681,"line":787},[679,936,937],{"class":736},"cd",[679,939,900],{"class":746},[679,941,942,944],{"class":681,"line":798},[679,943,914],{"class":890},[679,945,946],{"class":746}," install\n",[679,948,949,951],{"class":681,"line":831},[679,950,914],{"class":890},[679,952,953],{"class":746}," dev\n",[432,955,956,957,472],{},"→ Mở ",[487,958,959],{},"http:\u002F\u002Flocalhost:3000",[662,961,963],{"id":962},"cấu-trúc-khởi-tạo-nuxt-4","Cấu trúc khởi tạo (Nuxt 4)",[670,965,970],{"className":966,"code":968,"language":969},[967],"language-text","my-app\u002F\n├── app\u002F                          ← code app\n│   ├── app.vue                   ← root component\n│   ├── components\u002F\n│   ├── composables\u002F\n│   ├── layouts\u002F\n│   ├── middleware\u002F\n│   ├── pages\u002F\n│   ├── plugins\u002F\n│   └── assets\u002F\n├── server\u002F                       ← API routes, server middleware\n│   ├── api\u002F\n│   ├── middleware\u002F\n│   └── plugins\u002F\n├── shared\u002F                       ← code share giữa app + server\n│   ├── types\u002F\n│   └── utils\u002F\n├── public\u002F                       ← static files (favicon, images)\n├── content\u002F                      ← (nếu dùng @nuxt\u002Fcontent)\n├── .nuxt\u002F                        ← generated, ignore\n├── nuxt.config.ts                ← config chính\n├── package.json\n└── tsconfig.json\n","text",[487,971,968],{"__ignoreMap":675},[560,973,976,987],{"color":974,"icon":975},"warning","i-lucide-star",[432,977,978,979,982,983],{},"⭐ ",[435,980,981],{},"Câu PV cốt lõi:"," ",[984,985,986],"em",{},"\"Nuxt 4 vs Nuxt 3 — đổi gì lớn?\"",[988,989,990],"blockquote",{},[432,991,992,993,995],{},"\"Lớn nhất: cấu trúc ",[487,994,502],{}," mới — code app tách khỏi config. TypeScript chia 3 project riêng (app\u002Fserver\u002Fshared) → type chính xác hơn, server-only util không truy cập được từ client. Data fetching mới: tự share data cùng key, auto cleanup khi unmount, behavior khi refetch đổi từ stale-while-revalidate sang clear immediately.\"",[427,997,999,1000,1003],{"id":998},"_6-nuxtconfigts-file-quan-trọng-nhất","6. ",[487,1001,1002],{},"nuxt.config.ts"," — file quan trọng nhất",[670,1005,1009],{"className":1006,"code":1007,"language":1008,"meta":675,"style":675},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  \u002F\u002F Compatibility mode\n  compatibilityDate: '2025-07-01',\n  \n  \u002F\u002F App config\n  app: {\n    head: {\n      title: 'My App',\n      meta: [{ name: 'description', content: 'My great app' }],\n    },\n    pageTransition: { name: 'page', mode: 'out-in' },\n  },\n  \n  \u002F\u002F Module\n  modules: [\n    '@nuxt\u002Fui',\n    '@pinia\u002Fnuxt',\n    '@vueuse\u002Fnuxt',\n    '@nuxt\u002Fimage',\n    '@nuxtjs\u002Fi18n',\n  ],\n  \n  \u002F\u002F Runtime config — runtime accessible\n  runtimeConfig: {\n    apiSecret: '',              \u002F\u002F server-only (env: NUXT_API_SECRET)\n    public: {\n      apiBase: '\u002Fapi',          \u002F\u002F exposed to client (env: NUXT_PUBLIC_API_BASE)\n    },\n  },\n  \n  \u002F\u002F CSS global\n  css: ['~\u002Fassets\u002Fcss\u002Fmain.css'],\n  \n  \u002F\u002F TypeScript\n  typescript: {\n    strict: true,\n    typeCheck: true,            \u002F\u002F chạy vue-tsc song song\n  },\n  \n  \u002F\u002F Nitro server\n  nitro: {\n    preset: 'node-server',      \u002F\u002F hoặc 'vercel', 'cloudflare', 'static'...\n  },\n  \n  \u002F\u002F Dev\n  devtools: { enabled: true },\n});\n","typescript",[487,1010,1011,1016,1032,1037,1057,1062,1067,1077,1086,1102,1149,1154,1191,1197,1202,1208,1219,1232,1244,1256,1268,1280,1288,1293,1299,1309,1325,1335,1355,1360,1365,1370,1376,1397,1402,1408,1418,1432,1447,1452,1457,1463,1473,1493,1498,1503,1509,1528],{"__ignoreMap":675},[679,1012,1013],{"class":681,"line":682},[679,1014,1015],{"class":685},"\u002F\u002F nuxt.config.ts\n",[679,1017,1018,1021,1024,1027,1029],{"class":681,"line":689},[679,1019,1020],{"class":732},"export",[679,1022,1023],{"class":732}," default",[679,1025,1026],{"class":736}," defineNuxtConfig",[679,1028,740],{"class":716},[679,1030,1031],{"class":692},"{\n",[679,1033,1034],{"class":681,"line":707},[679,1035,1036],{"class":685},"  \u002F\u002F Compatibility mode\n",[679,1038,1039,1042,1045,1048,1051,1054],{"class":681,"line":758},[679,1040,1041],{"class":696},"  compatibilityDate",[679,1043,1044],{"class":692},":",[679,1046,1047],{"class":692}," '",[679,1049,1050],{"class":746},"2025-07-01",[679,1052,1053],{"class":692},"'",[679,1055,1056],{"class":692},",\n",[679,1058,1059],{"class":681,"line":764},[679,1060,1061],{"class":716},"  \n",[679,1063,1064],{"class":681,"line":774},[679,1065,1066],{"class":685},"  \u002F\u002F App config\n",[679,1068,1069,1072,1074],{"class":681,"line":781},[679,1070,1071],{"class":696},"  app",[679,1073,1044],{"class":692},[679,1075,1076],{"class":692}," {\n",[679,1078,1079,1082,1084],{"class":681,"line":787},[679,1080,1081],{"class":696},"    head",[679,1083,1044],{"class":692},[679,1085,1076],{"class":692},[679,1087,1088,1091,1093,1095,1098,1100],{"class":681,"line":798},[679,1089,1090],{"class":696},"      title",[679,1092,1044],{"class":692},[679,1094,1047],{"class":692},[679,1096,1097],{"class":746},"My App",[679,1099,1053],{"class":692},[679,1101,1056],{"class":692},[679,1103,1104,1107,1109,1112,1115,1118,1120,1122,1125,1127,1129,1132,1134,1136,1139,1141,1144,1147],{"class":681,"line":831},[679,1105,1106],{"class":696},"      meta",[679,1108,1044],{"class":692},[679,1110,1111],{"class":716}," [",[679,1113,1114],{"class":692},"{",[679,1116,1117],{"class":696}," name",[679,1119,1044],{"class":692},[679,1121,1047],{"class":692},[679,1123,1124],{"class":746},"description",[679,1126,1053],{"class":692},[679,1128,720],{"class":692},[679,1130,1131],{"class":696}," content",[679,1133,1044],{"class":692},[679,1135,1047],{"class":692},[679,1137,1138],{"class":746},"My great app",[679,1140,1053],{"class":692},[679,1142,1143],{"class":692}," }",[679,1145,1146],{"class":716},"]",[679,1148,1056],{"class":692},[679,1150,1151],{"class":681,"line":837},[679,1152,1153],{"class":692},"    },\n",[679,1155,1156,1159,1161,1163,1165,1167,1169,1172,1174,1176,1179,1181,1183,1186,1188],{"class":681,"line":843},[679,1157,1158],{"class":696},"    pageTransition",[679,1160,1044],{"class":692},[679,1162,713],{"class":692},[679,1164,1117],{"class":696},[679,1166,1044],{"class":692},[679,1168,1047],{"class":692},[679,1170,1171],{"class":746},"page",[679,1173,1053],{"class":692},[679,1175,720],{"class":692},[679,1177,1178],{"class":696}," mode",[679,1180,1044],{"class":692},[679,1182,1047],{"class":692},[679,1184,1185],{"class":746},"out-in",[679,1187,1053],{"class":692},[679,1189,1190],{"class":692}," },\n",[679,1192,1194],{"class":681,"line":1193},13,[679,1195,1196],{"class":692},"  },\n",[679,1198,1200],{"class":681,"line":1199},14,[679,1201,1061],{"class":716},[679,1203,1205],{"class":681,"line":1204},15,[679,1206,1207],{"class":685},"  \u002F\u002F Module\n",[679,1209,1211,1214,1216],{"class":681,"line":1210},16,[679,1212,1213],{"class":696},"  modules",[679,1215,1044],{"class":692},[679,1217,1218],{"class":716}," [\n",[679,1220,1222,1225,1228,1230],{"class":681,"line":1221},17,[679,1223,1224],{"class":692},"    '",[679,1226,1227],{"class":746},"@nuxt\u002Fui",[679,1229,1053],{"class":692},[679,1231,1056],{"class":692},[679,1233,1235,1237,1240,1242],{"class":681,"line":1234},18,[679,1236,1224],{"class":692},[679,1238,1239],{"class":746},"@pinia\u002Fnuxt",[679,1241,1053],{"class":692},[679,1243,1056],{"class":692},[679,1245,1247,1249,1252,1254],{"class":681,"line":1246},19,[679,1248,1224],{"class":692},[679,1250,1251],{"class":746},"@vueuse\u002Fnuxt",[679,1253,1053],{"class":692},[679,1255,1056],{"class":692},[679,1257,1259,1261,1264,1266],{"class":681,"line":1258},20,[679,1260,1224],{"class":692},[679,1262,1263],{"class":746},"@nuxt\u002Fimage",[679,1265,1053],{"class":692},[679,1267,1056],{"class":692},[679,1269,1271,1273,1276,1278],{"class":681,"line":1270},21,[679,1272,1224],{"class":692},[679,1274,1275],{"class":746},"@nuxtjs\u002Fi18n",[679,1277,1053],{"class":692},[679,1279,1056],{"class":692},[679,1281,1283,1286],{"class":681,"line":1282},22,[679,1284,1285],{"class":716},"  ]",[679,1287,1056],{"class":692},[679,1289,1291],{"class":681,"line":1290},23,[679,1292,1061],{"class":716},[679,1294,1296],{"class":681,"line":1295},24,[679,1297,1298],{"class":685},"  \u002F\u002F Runtime config — runtime accessible\n",[679,1300,1302,1305,1307],{"class":681,"line":1301},25,[679,1303,1304],{"class":696},"  runtimeConfig",[679,1306,1044],{"class":692},[679,1308,1076],{"class":692},[679,1310,1312,1315,1317,1320,1322],{"class":681,"line":1311},26,[679,1313,1314],{"class":696},"    apiSecret",[679,1316,1044],{"class":692},[679,1318,1319],{"class":692}," ''",[679,1321,720],{"class":692},[679,1323,1324],{"class":685},"              \u002F\u002F server-only (env: NUXT_API_SECRET)\n",[679,1326,1328,1331,1333],{"class":681,"line":1327},27,[679,1329,1330],{"class":696},"    public",[679,1332,1044],{"class":692},[679,1334,1076],{"class":692},[679,1336,1338,1341,1343,1345,1348,1350,1352],{"class":681,"line":1337},28,[679,1339,1340],{"class":696},"      apiBase",[679,1342,1044],{"class":692},[679,1344,1047],{"class":692},[679,1346,1347],{"class":746},"\u002Fapi",[679,1349,1053],{"class":692},[679,1351,720],{"class":692},[679,1353,1354],{"class":685},"          \u002F\u002F exposed to client (env: NUXT_PUBLIC_API_BASE)\n",[679,1356,1358],{"class":681,"line":1357},29,[679,1359,1153],{"class":692},[679,1361,1363],{"class":681,"line":1362},30,[679,1364,1196],{"class":692},[679,1366,1368],{"class":681,"line":1367},31,[679,1369,1061],{"class":716},[679,1371,1373],{"class":681,"line":1372},32,[679,1374,1375],{"class":685},"  \u002F\u002F CSS global\n",[679,1377,1379,1382,1384,1386,1388,1391,1393,1395],{"class":681,"line":1378},33,[679,1380,1381],{"class":696},"  css",[679,1383,1044],{"class":692},[679,1385,1111],{"class":716},[679,1387,1053],{"class":692},[679,1389,1390],{"class":746},"~\u002Fassets\u002Fcss\u002Fmain.css",[679,1392,1053],{"class":692},[679,1394,1146],{"class":716},[679,1396,1056],{"class":692},[679,1398,1400],{"class":681,"line":1399},34,[679,1401,1061],{"class":716},[679,1403,1405],{"class":681,"line":1404},35,[679,1406,1407],{"class":685},"  \u002F\u002F TypeScript\n",[679,1409,1411,1414,1416],{"class":681,"line":1410},36,[679,1412,1413],{"class":696},"  typescript",[679,1415,1044],{"class":692},[679,1417,1076],{"class":692},[679,1419,1421,1424,1426,1430],{"class":681,"line":1420},37,[679,1422,1423],{"class":696},"    strict",[679,1425,1044],{"class":692},[679,1427,1429],{"class":1428},"sfNiH"," true",[679,1431,1056],{"class":692},[679,1433,1435,1438,1440,1442,1444],{"class":681,"line":1434},38,[679,1436,1437],{"class":696},"    typeCheck",[679,1439,1044],{"class":692},[679,1441,1429],{"class":1428},[679,1443,720],{"class":692},[679,1445,1446],{"class":685},"            \u002F\u002F chạy vue-tsc song song\n",[679,1448,1450],{"class":681,"line":1449},39,[679,1451,1196],{"class":692},[679,1453,1455],{"class":681,"line":1454},40,[679,1456,1061],{"class":716},[679,1458,1460],{"class":681,"line":1459},41,[679,1461,1462],{"class":685},"  \u002F\u002F Nitro server\n",[679,1464,1466,1469,1471],{"class":681,"line":1465},42,[679,1467,1468],{"class":696},"  nitro",[679,1470,1044],{"class":692},[679,1472,1076],{"class":692},[679,1474,1476,1479,1481,1483,1486,1488,1490],{"class":681,"line":1475},43,[679,1477,1478],{"class":696},"    preset",[679,1480,1044],{"class":692},[679,1482,1047],{"class":692},[679,1484,1485],{"class":746},"node-server",[679,1487,1053],{"class":692},[679,1489,720],{"class":692},[679,1491,1492],{"class":685},"      \u002F\u002F hoặc 'vercel', 'cloudflare', 'static'...\n",[679,1494,1496],{"class":681,"line":1495},44,[679,1497,1196],{"class":692},[679,1499,1501],{"class":681,"line":1500},45,[679,1502,1061],{"class":716},[679,1504,1506],{"class":681,"line":1505},46,[679,1507,1508],{"class":685},"  \u002F\u002F Dev\n",[679,1510,1512,1515,1517,1519,1522,1524,1526],{"class":681,"line":1511},47,[679,1513,1514],{"class":696},"  devtools",[679,1516,1044],{"class":692},[679,1518,713],{"class":692},[679,1520,1521],{"class":696}," enabled",[679,1523,1044],{"class":692},[679,1525,1429],{"class":1428},[679,1527,1190],{"class":692},[679,1529,1531,1533,1535],{"class":681,"line":1530},48,[679,1532,726],{"class":692},[679,1534,752],{"class":716},[679,1536,755],{"class":692},[662,1538,1540],{"id":1539},"environment-variable","Environment variable",[670,1542,1544],{"className":876,"code":1543,"language":878,"meta":675,"style":675},"# .env\nNUXT_API_SECRET=my-secret           # → runtimeConfig.apiSecret (server only)\nNUXT_PUBLIC_API_BASE=https:\u002F\u002Fapi.x  # → runtimeConfig.public.apiBase (cả client + server)\n",[487,1545,1546,1551,1565],{"__ignoreMap":675},[679,1547,1548],{"class":681,"line":682},[679,1549,1550],{"class":685},"# .env\n",[679,1552,1553,1556,1559,1562],{"class":681,"line":689},[679,1554,1555],{"class":716},"NUXT_API_SECRET",[679,1557,1558],{"class":692},"=",[679,1560,1561],{"class":746},"my-secret",[679,1563,1564],{"class":685},"           # → runtimeConfig.apiSecret (server only)\n",[679,1566,1567,1570,1572,1575],{"class":681,"line":707},[679,1568,1569],{"class":716},"NUXT_PUBLIC_API_BASE",[679,1571,1558],{"class":692},[679,1573,1574],{"class":746},"https:\u002F\u002Fapi.x",[679,1576,1577],{"class":685},"  # → runtimeConfig.public.apiBase (cả client + server)\n",[432,1579,1580],{},"Dùng trong code:",[670,1582,1584],{"className":1006,"code":1583,"language":1008,"meta":675,"style":675},"const config = useRuntimeConfig();\nconfig.apiSecret;          \u002F\u002F server only — undefined ở client\nconfig.public.apiBase;     \u002F\u002F both\n",[487,1585,1586,1603,1619],{"__ignoreMap":675},[679,1587,1588,1590,1593,1595,1598,1601],{"class":681,"line":682},[679,1589,710],{"class":700},[679,1591,1592],{"class":716}," config ",[679,1594,1558],{"class":692},[679,1596,1597],{"class":736}," useRuntimeConfig",[679,1599,1600],{"class":716},"()",[679,1602,755],{"class":692},[679,1604,1605,1608,1610,1613,1616],{"class":681,"line":689},[679,1606,1607],{"class":716},"config",[679,1609,472],{"class":692},[679,1611,1612],{"class":716},"apiSecret",[679,1614,1615],{"class":692},";",[679,1617,1618],{"class":685},"          \u002F\u002F server only — undefined ở client\n",[679,1620,1621,1623,1625,1628,1630,1633,1635],{"class":681,"line":707},[679,1622,1607],{"class":716},[679,1624,472],{"class":692},[679,1626,1627],{"class":716},"public",[679,1629,472],{"class":692},[679,1631,1632],{"class":716},"apiBase",[679,1634,1615],{"class":692},[679,1636,1637],{"class":685},"     \u002F\u002F both\n",[560,1639,1641,1644,1645,1647,1648,1651],{"color":974,"icon":1640},"i-lucide-alert-triangle",[435,1642,1643],{},"Quan trọng — Security:"," chỉ key trong ",[487,1646,1627],{}," mới expose client. Mọi key khác ",[435,1649,1650],{},"chỉ server",", đừng nhầm.",[427,1653,1655],{"id":1654},"_7-typescript-trong-nuxt-4","7. TypeScript trong Nuxt 4",[432,1657,1658,1659,1044],{},"3 TS project tự sinh trong ",[487,1660,1661],{},".nuxt\u002Ftsconfig.*.json",[569,1663,1664,1674],{},[572,1665,1666],{},[575,1667,1668,1671],{},[578,1669,1670],{},"Project",[578,1672,1673],{},"Scope",[586,1675,1676,1689,1701],{},[575,1677,1678,1683],{},[591,1679,1680],{},[487,1681,1682],{},"tsconfig.app.json",[591,1684,1685,1686,1688],{},"Code trong ",[487,1687,502],{}," — client + universal",[575,1690,1691,1696],{},[591,1692,1693],{},[487,1694,1695],{},"tsconfig.server.json",[591,1697,1685,1698,1700],{},[487,1699,525],{}," — Node.js, có Nitro types",[575,1702,1703,1708],{},[591,1704,1705],{},[487,1706,1707],{},"tsconfig.shared.json",[591,1709,1685,1710,1712],{},[487,1711,528],{}," — strict cả 2 môi trường",[560,1714,1715,1718,1719,1722,1723,1725],{"color":562,"icon":268},[435,1716,1717],{},"Lợi ích thực tế:"," Import ",[487,1720,1721],{},"fs"," từ component ",[487,1724,502],{}," → TS báo lỗi ngay (không có ở client). Trước Nuxt 3 chỉ runtime mới biết.",[427,1727,1729],{"id":1728},"_8-auto-import-đặc-thù-nuxt","8. Auto-import — đặc thù Nuxt",[432,1731,1732,1733,1736],{},"Bạn không cần ",[487,1734,1735],{},"import"," cho:",[444,1738,1739,1748,1756,1786,1806],{},[447,1740,1741,1744,1745,472],{},[435,1742,1743],{},"Composable"," trong ",[487,1746,1747],{},"app\u002Fcomposables\u002F",[447,1749,1750,1744,1753,472],{},[435,1751,1752],{},"Component",[487,1754,1755],{},"app\u002Fcomponents\u002F",[447,1757,1758,1761,1762,468,1764,468,1767,468,1770,468,1773,468,1776,468,1779,468,1782,1785],{},[435,1759,1760],{},"Built-in composable",": ",[487,1763,510],{},[487,1765,1766],{},"useState",[487,1768,1769],{},"useRoute",[487,1771,1772],{},"useRouter",[487,1774,1775],{},"useRuntimeConfig",[487,1777,1778],{},"useHead",[487,1780,1781],{},"useSeoMeta",[487,1783,1784],{},"defineNuxtPlugin","...",[447,1787,1788,1761,1791,468,1794,468,1797,468,1800,468,1803,1785],{},[435,1789,1790],{},"Vue 3 reactivity",[487,1792,1793],{},"ref",[487,1795,1796],{},"reactive",[487,1798,1799],{},"computed",[487,1801,1802],{},"watch",[487,1804,1805],{},"onMounted",[447,1807,1808,1744,1811,1814,1815,472],{},[435,1809,1810],{},"Utils",[487,1812,1813],{},"app\u002Futils\u002F"," và ",[487,1816,1817],{},"shared\u002Futils\u002F",[670,1819,1821],{"className":672,"code":1820,"language":674,"meta":675,"style":675},"\u003C!-- Không cần import gì hết -->\n\u003Cscript setup lang=\"ts\">\nconst count = ref(0);                 \u002F\u002F auto-imported\nconst { data } = await useFetch(\"\u002Fapi\u002Fusers\");  \u002F\u002F auto\n\u003C\u002Fscript>\n",[487,1822,1823,1828,1850,1875,1907],{"__ignoreMap":675},[679,1824,1825],{"class":681,"line":682},[679,1826,1827],{"class":685},"\u003C!-- Không cần import gì hết -->\n",[679,1829,1830,1832,1834,1836,1839,1841,1843,1846,1848],{"class":681,"line":689},[679,1831,693],{"class":692},[679,1833,697],{"class":696},[679,1835,701],{"class":700},[679,1837,1838],{"class":700}," lang",[679,1840,1558],{"class":692},[679,1842,743],{"class":692},[679,1844,1845],{"class":746},"ts",[679,1847,743],{"class":692},[679,1849,704],{"class":692},[679,1851,1852,1854,1857,1859,1862,1864,1868,1870,1872],{"class":681,"line":707},[679,1853,710],{"class":700},[679,1855,1856],{"class":716}," count ",[679,1858,1558],{"class":692},[679,1860,1861],{"class":736}," ref",[679,1863,740],{"class":716},[679,1865,1867],{"class":1866},"sbssI","0",[679,1869,752],{"class":716},[679,1871,1615],{"class":692},[679,1873,1874],{"class":685},"                 \u002F\u002F auto-imported\n",[679,1876,1877,1879,1881,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904],{"class":681,"line":758},[679,1878,710],{"class":700},[679,1880,713],{"class":692},[679,1882,1883],{"class":716}," data ",[679,1885,726],{"class":692},[679,1887,729],{"class":692},[679,1889,733],{"class":732},[679,1891,737],{"class":736},[679,1893,740],{"class":716},[679,1895,743],{"class":692},[679,1897,747],{"class":746},[679,1899,743],{"class":692},[679,1901,752],{"class":716},[679,1903,1615],{"class":692},[679,1905,1906],{"class":685},"  \u002F\u002F auto\n",[679,1908,1909,1911,1913],{"class":681,"line":764},[679,1910,767],{"class":692},[679,1912,697],{"class":696},[679,1914,704],{"class":692},[560,1916,1917,1925],{"color":974,"icon":975},[432,1918,978,1919,982,1922],{},[435,1920,1921],{},"Câu PV:",[984,1923,1924],{},"\"Auto-import có overhead bundle không?\"",[988,1926,1927],{},[432,1928,1929,1930,1933],{},"\"Không. Auto-import được Nuxt scan và ",[435,1931,1932],{},"add import statement lúc build",". Build output có import explicit như bình thường, tree-shake ngon. Chỉ là tiện DX khi viết, không phải global runtime.\"",[427,1935,1937],{"id":1936},"_9-composables-built-in-cần-biết","9. Composables built-in cần biết",[569,1939,1940,1949],{},[572,1941,1942],{},[575,1943,1944,1946],{},[578,1945,1743],{},[578,1947,1948],{},"Tác dụng",[586,1950,1951,1961,1971,1981,1991,2001,2011,2021,2031,2044,2054,2064],{},[575,1952,1953,1958],{},[591,1954,1955],{},[487,1956,1957],{},"useFetch(url)",[591,1959,1960],{},"Fetch + cache, SSR-aware",[575,1962,1963,1968],{},[591,1964,1965],{},[487,1966,1967],{},"useAsyncData(key, fn)",[591,1969,1970],{},"Generic async data với key, SSR-aware",[575,1972,1973,1978],{},[591,1974,1975],{},[487,1976,1977],{},"$fetch(url)",[591,1979,1980],{},"Fetch raw (không reactive) — dùng trong event handler",[575,1982,1983,1988],{},[591,1984,1985],{},[487,1986,1987],{},"useState(key, init)",[591,1989,1990],{},"Cross-component SSR-safe state",[575,1992,1993,1998],{},[591,1994,1995],{},[487,1996,1997],{},"useRoute()",[591,1999,2000],{},"Route hiện tại",[575,2002,2003,2008],{},[591,2004,2005],{},[487,2006,2007],{},"useRouter()",[591,2009,2010],{},"Programmatic navigation",[575,2012,2013,2018],{},[591,2014,2015],{},[487,2016,2017],{},"navigateTo(path)",[591,2019,2020],{},"Redirect (cả server + client)",[575,2022,2023,2028],{},[591,2024,2025],{},[487,2026,2027],{},"useRuntimeConfig()",[591,2029,2030],{},"Runtime config",[575,2032,2033,2038],{},[591,2034,2035],{},[487,2036,2037],{},"useHead(meta)",[591,2039,2040,2041],{},"Modify ",[487,2042,2043],{},"\u003Chead>",[575,2045,2046,2051],{},[591,2047,2048],{},[487,2049,2050],{},"useSeoMeta(meta)",[591,2052,2053],{},"SEO-typed meta",[575,2055,2056,2061],{},[591,2057,2058],{},[487,2059,2060],{},"useCookie(name)",[591,2062,2063],{},"Cookie reactive",[575,2065,2066,2071],{},[591,2067,2068],{},[487,2069,2070],{},"useNuxtApp()",[591,2072,2073],{},"Truy cập Nuxt instance (plugin, $... helper)",[427,2075,2077],{"id":2076},"_10-khởi-động-hello-world","10. Khởi động Hello World",[670,2079,2081],{"className":672,"code":2080,"language":674,"meta":675,"style":675},"\u003C!-- app\u002Fapp.vue -->\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>{{ title }}\u003C\u002Fh1>\n    \u003Cp>Count: {{ count }}\u003C\u002Fp>\n    \u003Cbutton @click=\"count++\">Increment\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup lang=\"ts\">\nconst title = \"Nuxt 4 — Hello!\";\nconst count = ref(0);\n\nuseHead({\n  title: title,\n  meta: [{ name: 'description', content: 'My first Nuxt 4 app' }]\n});\n\u003C\u002Fscript>\n",[487,2082,2083,2088,2097,2107,2127,2144,2174,2183,2191,2195,2215,2234,2252,2256,2264,2276,2315,2323],{"__ignoreMap":675},[679,2084,2085],{"class":681,"line":682},[679,2086,2087],{"class":685},"\u003C!-- app\u002Fapp.vue -->\n",[679,2089,2090,2092,2095],{"class":681,"line":689},[679,2091,693],{"class":692},[679,2093,2094],{"class":696},"template",[679,2096,704],{"class":692},[679,2098,2099,2102,2105],{"class":681,"line":707},[679,2100,2101],{"class":692},"  \u003C",[679,2103,2104],{"class":696},"div",[679,2106,704],{"class":692},[679,2108,2109,2112,2115,2118,2121,2123,2125],{"class":681,"line":758},[679,2110,2111],{"class":692},"    \u003C",[679,2113,2114],{"class":696},"h1",[679,2116,2117],{"class":692},">",[679,2119,2120],{"class":716},"{{ title }}",[679,2122,767],{"class":692},[679,2124,2114],{"class":696},[679,2126,704],{"class":692},[679,2128,2129,2131,2133,2135,2138,2140,2142],{"class":681,"line":764},[679,2130,2111],{"class":692},[679,2132,432],{"class":696},[679,2134,2117],{"class":692},[679,2136,2137],{"class":716},"Count: {{ count }}",[679,2139,767],{"class":692},[679,2141,432],{"class":696},[679,2143,704],{"class":692},[679,2145,2146,2148,2151,2154,2156,2158,2161,2163,2165,2168,2170,2172],{"class":681,"line":774},[679,2147,2111],{"class":692},[679,2149,2150],{"class":696},"button",[679,2152,2153],{"class":700}," @click",[679,2155,1558],{"class":692},[679,2157,743],{"class":692},[679,2159,2160],{"class":746},"count++",[679,2162,743],{"class":692},[679,2164,2117],{"class":692},[679,2166,2167],{"class":716},"Increment",[679,2169,767],{"class":692},[679,2171,2150],{"class":696},[679,2173,704],{"class":692},[679,2175,2176,2179,2181],{"class":681,"line":781},[679,2177,2178],{"class":692},"  \u003C\u002F",[679,2180,2104],{"class":696},[679,2182,704],{"class":692},[679,2184,2185,2187,2189],{"class":681,"line":787},[679,2186,767],{"class":692},[679,2188,2094],{"class":696},[679,2190,704],{"class":692},[679,2192,2193],{"class":681,"line":798},[679,2194,778],{"emptyLinePlaceholder":777},[679,2196,2197,2199,2201,2203,2205,2207,2209,2211,2213],{"class":681,"line":831},[679,2198,693],{"class":692},[679,2200,697],{"class":696},[679,2202,701],{"class":700},[679,2204,1838],{"class":700},[679,2206,1558],{"class":692},[679,2208,743],{"class":692},[679,2210,1845],{"class":746},[679,2212,743],{"class":692},[679,2214,704],{"class":692},[679,2216,2217,2219,2222,2224,2227,2230,2232],{"class":681,"line":837},[679,2218,710],{"class":700},[679,2220,2221],{"class":716}," title ",[679,2223,1558],{"class":692},[679,2225,2226],{"class":692}," \"",[679,2228,2229],{"class":746},"Nuxt 4 — Hello!",[679,2231,743],{"class":692},[679,2233,755],{"class":692},[679,2235,2236,2238,2240,2242,2244,2246,2248,2250],{"class":681,"line":843},[679,2237,710],{"class":700},[679,2239,1856],{"class":716},[679,2241,1558],{"class":692},[679,2243,1861],{"class":736},[679,2245,740],{"class":716},[679,2247,1867],{"class":1866},[679,2249,752],{"class":716},[679,2251,755],{"class":692},[679,2253,2254],{"class":681,"line":1193},[679,2255,778],{"emptyLinePlaceholder":777},[679,2257,2258,2260,2262],{"class":681,"line":1199},[679,2259,1778],{"class":736},[679,2261,740],{"class":716},[679,2263,1031],{"class":692},[679,2265,2266,2269,2271,2274],{"class":681,"line":1204},[679,2267,2268],{"class":696},"  title",[679,2270,1044],{"class":692},[679,2272,2273],{"class":716}," title",[679,2275,1056],{"class":692},[679,2277,2278,2281,2283,2285,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2308,2310,2312],{"class":681,"line":1210},[679,2279,2280],{"class":696},"  meta",[679,2282,1044],{"class":692},[679,2284,1111],{"class":716},[679,2286,1114],{"class":692},[679,2288,1117],{"class":696},[679,2290,1044],{"class":692},[679,2292,1047],{"class":692},[679,2294,1124],{"class":746},[679,2296,1053],{"class":692},[679,2298,720],{"class":692},[679,2300,1131],{"class":696},[679,2302,1044],{"class":692},[679,2304,1047],{"class":692},[679,2306,2307],{"class":746},"My first Nuxt 4 app",[679,2309,1053],{"class":692},[679,2311,1143],{"class":692},[679,2313,2314],{"class":716},"]\n",[679,2316,2317,2319,2321],{"class":681,"line":1221},[679,2318,726],{"class":692},[679,2320,752],{"class":716},[679,2322,755],{"class":692},[679,2324,2325,2327,2329],{"class":681,"line":1234},[679,2326,767],{"class":692},[679,2328,697],{"class":696},[679,2330,704],{"class":692},[670,2332,2334],{"className":1006,"code":2333,"language":1008,"meta":675,"style":675},"\u002F\u002F server\u002Fapi\u002Fhello.ts — server route đầu tiên\nexport default defineEventHandler(() => ({\n  message: \"Hello from server!\",\n  time: new Date().toISOString(),\n}));\n",[487,2335,2336,2341,2362,2378,2402],{"__ignoreMap":675},[679,2337,2338],{"class":681,"line":682},[679,2339,2340],{"class":685},"\u002F\u002F server\u002Fapi\u002Fhello.ts — server route đầu tiên\n",[679,2342,2343,2345,2347,2350,2352,2354,2357,2360],{"class":681,"line":689},[679,2344,1020],{"class":732},[679,2346,1023],{"class":732},[679,2348,2349],{"class":736}," defineEventHandler",[679,2351,740],{"class":716},[679,2353,1600],{"class":692},[679,2355,2356],{"class":700}," =>",[679,2358,2359],{"class":716}," (",[679,2361,1031],{"class":692},[679,2363,2364,2367,2369,2371,2374,2376],{"class":681,"line":707},[679,2365,2366],{"class":696},"  message",[679,2368,1044],{"class":692},[679,2370,2226],{"class":692},[679,2372,2373],{"class":746},"Hello from server!",[679,2375,743],{"class":692},[679,2377,1056],{"class":692},[679,2379,2380,2383,2385,2388,2391,2393,2395,2398,2400],{"class":681,"line":758},[679,2381,2382],{"class":696},"  time",[679,2384,1044],{"class":692},[679,2386,2387],{"class":692}," new",[679,2389,2390],{"class":736}," Date",[679,2392,1600],{"class":716},[679,2394,472],{"class":692},[679,2396,2397],{"class":736},"toISOString",[679,2399,1600],{"class":716},[679,2401,1056],{"class":692},[679,2403,2404,2406,2409],{"class":681,"line":764},[679,2405,726],{"class":692},[679,2407,2408],{"class":716},"))",[679,2410,755],{"class":692},[432,2412,2413,2414,2417],{},"→ ",[487,2415,2416],{},"GET \u002Fapi\u002Fhello"," trả JSON. Cùng project, không server riêng.",[560,2419,2421,2422],{"color":562,"icon":2420},"i-lucide-arrow-right","Tiếp theo: ",[2423,2424,2425],"a",{"href":369},"Routing & Rendering",[2427,2428,2429],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":675,"searchDepth":689,"depth":689,"links":2431},[2432,2433,2434,2438,2439,2442,2446,2447,2448,2449],{"id":429,"depth":689,"text":430},{"id":475,"depth":689,"text":476},{"id":557,"depth":689,"text":558,"children":2435},[2436],{"id":664,"depth":707,"text":2437},"Breaking change useFetch data behavior",{"id":852,"depth":689,"text":853},{"id":872,"depth":689,"text":873,"children":2440},[2441],{"id":962,"depth":707,"text":963},{"id":998,"depth":689,"text":2443,"children":2444},"6. nuxt.config.ts — file quan trọng nhất",[2445],{"id":1539,"depth":707,"text":1540},{"id":1654,"depth":689,"text":1655},{"id":1728,"depth":689,"text":1729},{"id":1936,"depth":689,"text":1937},{"id":2076,"depth":689,"text":2077},"Nuxt 4.0 (07\u002F2025) — cấu trúc app\u002F, smarter data fetching, TypeScript chia projects. Cài đặt và project mới.","md",null,{},{"title":173,"icon":176},{"title":422,"description":2450},"xm2s5vQ4rCdyV_tCD0EhYdDvLLKhroJ6_Lpmprbui9s",[2458,2460],{"title":358,"path":360,"stem":361,"description":2459,"icon":359,"children":-1},"Học Nuxt 4 — cấu trúc app\u002F mới, smarter data fetching, hybrid rendering, Nitro server.",{"title":368,"path":369,"stem":370,"description":2461,"icon":371,"children":-1},"File-based routing, layouts, middleware, SSR \u002F SSG \u002F SPA \u002F Hybrid rendering — chọn đúng cho app.",1783490359906]