[{"data":1,"prerenderedAt":194},["ShallowReactive",2],{"blog:page:\u002Fvi\u002Fblog\u002Fdemo-content-note":3,"blog:articles:vi":133,"blog:translations:\u002Fvi\u002Fblog\u002Fdemo-content-note":191},{"id":4,"title":5,"author":6,"body":7,"cover":120,"coverAlt":120,"date":121,"description":122,"extension":123,"featured":124,"meta":125,"navigation":126,"path":127,"seo":128,"stem":129,"tags":130,"__hash__":132},"blog\u002Fvi\u002Fblog\u002F6.demo-content-note\u002Findex.md","Blog này là gì (và không phải gì)","John Martin",{"type":8,"value":9,"toc":113},"minimark",[10,14,23,28,41,48,52,63,67,70,100,103],[11,12,5],"h1",{"id":13},"blog-này-là-gì-và-không-phải-gì",[15,16,17,18,22],"p",{},"Mọi thứ bạn đang đọc ở đây là một ",[19,20,21],"strong",{},"bản demo",". Các article được viết để\nexercise cơ chế - listing, selection featured, bài liên quan, trước\u002Fsau, locale\nswitching, resolve media - với văn editorial viết cho mục đích đó.",[24,25,27],"h2",{"id":26},"cái-gì-thật","Cái gì thật",[29,30,31,35,38],"ul",{},[32,33,34],"li",{},"Layout bạn đang đọc render từ đúng các code path mà một article production\nsẽ đi qua.",[32,36,37],{},"Pipeline build là pipeline production: Markdown vào, page prerendered ra,\nmọi link và ảnh được resolve ở build time.",[32,39,40],{},"Hành vi 404, URL canonical, và locale alternate bị ràng buộc, không phải\nmô phỏng.",[15,42,43],{},[44,45],"img",{"alt":46,"src":47},"Sơ đồ pipeline: Markdown chảy qua static build và ra file HTML, CSS, SVG thuần","\u002Fassets\u002Fbuild-time-pipeline.svg",[24,49,51],{"id":50},"cái-gì-không","Cái gì không",[29,53,54,57,60],{},[32,55,56],{},"Bản thân các article không phải tài liệu sản phẩm; bề mặt docs sở hữu việc\nđó.",[32,58,59],{},"Tên, ngày và byline là dữ liệu demo.",[32,61,62],{},"Không có CMS đằng sau - publish là một commit.",[24,64,66],{"id":65},"cách-review","Cách review",[15,68,69],{},"Click quanh một cách có chủ đích:",[71,72,73,82,85,93],"ol",{},[32,74,75,76,81],{},"Mở ",[77,78,80],"a",{"href":79},"\u002Fvi\u002Fblog\u002Furl-model","bài featured",", rồi dùng trước\u002Fsau để đi hết danh\nsách.",[32,83,84],{},"Chuyển locale giữa chừng article và xác nhận slug sống sót qua cuộc hành\ntrình.",[32,86,87,88,92],{},"Truy cập ",[89,90,91],"code",{},"\u002Fvi\u002Fblog\u002Fnot-a-real-article"," và kiểm tra bạn nhận được 404 thật.",[32,94,95,96,99],{},"Xem head của bất kỳ trang nào: một URL canonical và các ",[89,97,98],{},"hreflang"," alternate\nchỉ trỏ tới những trang tồn tại.",[101,102],"hr",{},[15,104,105],{},[106,107,108,109,112],"em",{},"Bắt đầu ở đâu cũng được - ",[77,110,111],{"href":79},"bài mô hình URL"," là một điểm\nkhởi đầu tốt như mọi điểm khác.",{"title":114,"searchDepth":115,"depth":115,"links":116},"",2,[117,118,119],{"id":26,"depth":115,"text":27},{"id":50,"depth":115,"text":51},{"id":65,"depth":115,"text":66},null,"2026-10-07","Đây là một vertical slice demo - layout thật, pipeline thật, content editorial một cách có chủ ý.","md",false,{},true,"\u002Fvi\u002Fblog\u002Fdemo-content-note",{"title":5,"description":122},"vi\u002Fblog\u002F6.demo-content-note\u002Findex",[131],"meta","9AJK5B_wHFevw0Y3VGHhVHU-7WvIwRX4q3jZ1STqwRI",[134,136,148,160,172,181],{"path":127,"stem":129,"title":5,"description":122,"date":121,"author":6,"tags":135,"featured":124},[131],{"path":137,"stem":138,"title":139,"description":140,"date":141,"author":6,"tags":142,"featured":124,"cover":145},"\u002Fvi\u002Fblog\u002Freading-first-design","vi\u002Fblog\u002F5.reading-first-design\u002Findex","Trang đọc bài không phải trang tài liệu","Vì sao layout article của blog cố tình khác layout docs - phân cấp thông tin, bề rộng cột, và sự tiết chế.","2026-09-30",[143,144],"design","typography",{"src":146,"alt":147},"\u002Fassets\u002Fcover-reading-first.svg","Minh họa bìa: bố cục một cột hẹp được chọn thay vì bố cục nhiều cột rối rắm",{"path":149,"stem":150,"title":151,"description":152,"date":153,"author":6,"tags":154,"featured":124,"cover":157},"\u002Fvi\u002Fblog\u002Fstatic-deployment","vi\u002Fblog\u002F4.static-deployment\u002Findex","Deploy một blog như static assets","Không Worker script, không database binding - toàn bộ deployment là một thư mục file và một trang 404.","2026-09-23",[155,156],"deployment","cloudflare",{"src":158,"alt":159},"\u002Fassets\u002Fcover-static-deployment.svg","Minh họa bìa: thư mục các tệp HTML và SVG chảy ra mạng lưới edge CDN",{"path":161,"stem":162,"title":163,"description":164,"date":165,"author":6,"tags":166,"featured":124,"cover":169},"\u002Fvi\u002Fblog\u002Flocale-switching","vi\u002Fblog\u002F3.locale-switching\u002Findex","Locale switching không bao giờ nói dối","Language switcher chỉ được offer thứ tồn tại. Đây là cách danh sách link được suy ra từ content thật.","2026-09-16",[167,168],"i18n","ux",{"src":170,"alt":171},"\u002Fassets\u002Ftwo-locales-one-page.svg","Minh họa bìa: hai đường dẫn ngôn ngữ hội tụ về cùng một bố cục trang",{"path":173,"stem":174,"title":175,"description":176,"date":177,"author":6,"tags":178,"featured":124},"\u002Fvi\u002Fblog\u002Fbuild-time-content","vi\u002Fblog\u002F2.build-time-content\u002Findex","Content được resolve ở build time","Vì sao blog này ship dưới dạng file prerender thay vì một content API - và điều đó mua được gì.","2026-09-09",[179,180],"architecture","static-sites",{"path":79,"stem":182,"title":183,"description":184,"date":185,"author":6,"tags":186,"featured":126,"cover":188},"vi\u002Fblog\u002F1.url-model\u002Findex","Một mô hình URL cho mọi trang public","\u002Flocale\u002Fmount\u002Fpath giữ cho mọi trang public đoán được - và vì sao ta ràng buộc nó thay vì hy vọng nó được tuân thủ.","2026-09-02",[179,187],"urls",{"src":189,"alt":190},"\u002Fassets\u002Fcover-url-model.svg","Minh họa bìa: một thanh địa chỉ tách thành ba segment locale, mount và path",[192,193],"en","vi",1791809694175]