[{"data":1,"prerenderedAt":391},["ShallowReactive",2],{"docs:page:\u002Fvi\u002Fdocs\u002Fconcepts\u002Fpublic-web":3,"docs:navigation:vi":295,"docs:section-descriptions:\u002Fvi\u002Fdocs\u002Fconcepts\u002Fpublic-web":385,"docs:translations:\u002Fvi\u002Fdocs\u002Fconcepts\u002Fpublic-web":386,"docs:surroundings:\u002Fvi\u002Fdocs\u002Fconcepts\u002Fpublic-web":388},{"id":4,"title":5,"body":6,"description":287,"extension":288,"meta":289,"navigation":290,"path":291,"seo":292,"stem":293,"__hash__":294},"docs\u002Fvi\u002Fdocs\u002F2.concepts\u002Fpublic-web.md","Web công khai",{"type":7,"value":8,"toc":279},"minimark",[9,13,22,32,39,44,113,117,176,180,187,193,197,218,222,229,262,265,268],[10,11,5],"h1",{"id":12},"web-công-khai",[14,15,16,17,21],"p",{},"Bề mặt công khai của ",[18,19,20],"code",{},"ecoma.io"," tuân theo một mô hình URL duy nhất:",[23,24,30],"pre",{"className":25,"code":27,"language":28,"meta":29},[26],"language-text","\u002F\u003Clocale>\u002F\u003Cmount>\u002F\u003Cpath>\n","text","",[18,31,27],{"__ignoreMap":29},[14,33,34],{},[35,36],"img",{"alt":37,"src":38},"Giải phẫu một public web URL: ba segment \u002Flocale, \u002Fmount và \u002Fpath, với ví dụ \u002Fen\u002Fdocs\u002Fgetting-started và \u002Fvi\u002Fdocs\u002Fgetting-started","\u002Fvi\u002Fdocs\u002Fconcepts\u002Fpublic-web-url.svg",[40,41,43],"h2",{"id":42},"ba-segment","Ba segment",[45,46,47,71,107],"ul",{},[48,49,50,54,55,58,59,62,63,66,67,70],"li",{},[51,52,53],"strong",{},"locale"," — segment đầu tiên, luôn hiện diện. Các locale được hỗ trợ nằm\ntrong locale registry (",[18,56,57],{},"PUBLIC_LOCALES"," trong ",[18,60,61],{},"app\u002Fi18n","). Tiếng Anh\nlà ",[18,64,65],{},"\u002Fen\u002F...",", tiếng Việt là ",[18,68,69],{},"\u002Fvi\u002F...","; không có biến thể không prefix.",[48,72,73,76,77,80,81,84,85,88,89,92,93,96,97,99,100,103,104,106],{},[51,74,75],{},"mount"," — application công khai. Các mount hiện có trong ",[18,78,79],{},"app\u002Flayout","\nlà ",[18,82,83],{},"blog",", ",[18,86,87],{},"docs"," và ",[18,90,91],{},"docs\u002Fapi",". Mount khớp theo full segment boundary:\n",[18,94,95],{},"\u002Fen\u002Fdocs"," là ",[18,98,87],{},", còn ",[18,101,102],{},"\u002Fen\u002Fblogging"," không phải ",[18,105,83],{},".",[48,108,109,112],{},[51,110,111],{},"path"," — phần sau mount. Nó opaque với nền tảng; application sở hữu mount\nquyết định resource đó có tồn tại hay không.",[40,114,116],{"id":115},"ví-dụ","Ví dụ",[118,119,120,133],"table",{},[121,122,123],"thead",{},[124,125,126,130],"tr",{},[127,128,129],"th",{},"URL",[127,131,132],{},"Nghĩa",[134,135,136,147,156,166],"tbody",{},[124,137,138,144],{},[139,140,141],"td",{},[18,142,143],{},"\u002Fen",[139,145,146],{},"Locale root tiếng Anh",[124,148,149,153],{},[139,150,151],{},[18,152,95],{},[139,154,155],{},"Docs tiếng Anh, docs root",[124,157,158,163],{},[139,159,160],{},[18,161,162],{},"\u002Fen\u002Fdocs\u002Fgetting-started",[139,164,165],{},"Docs tiếng Anh, Getting Started",[124,167,168,173],{},[139,169,170],{},[18,171,172],{},"\u002Fvi\u002Fdocs\u002Fgetting-started\u002Finstallation",[139,174,175],{},"Docs tiếng Việt, trang Cài đặt",[40,177,179],{"id":178},"parse-nghiêm-ngặt","Parse nghiêm ngặt",[14,181,182,183,186],{},"Path ",[51,184,185],{},"không"," được normalize hay sửa giúp. Trailing slash, empty segment, hay\nlocale không được hỗ trợ đều bị từ chối với lý do đã định kiểu (typed reason)\nthay vì âm thầm sửa:",[23,188,191],{"className":189,"code":190,"language":28,"meta":29},[26],"\u002Fen        → localized (en)\n\u002FEN\u002Fdocs   → invalid (unsupported_locale)\n\u002Fen\u002Fdocs\u002F  → invalid (trailing_slash)\n\u002Fen\u002F\u002Fdocs  → invalid (empty_segment)\n",[18,192,190],{"__ignoreMap":29},[40,194,196],{"id":195},"ranh-giới","Ranh giới",[45,198,199,205],{},[48,200,201,204],{},[18,202,203],{},"\u002F"," là locale-resolution entry point. Nó không phục vụ nội dung và không tự\nredirect; policy resolve thuộc về caller.",[48,206,207,209,210,213,214,217],{},[18,208,91],{}," là mount lồng nhau được dành riêng cho bề mặt ",[18,211,212],{},"api-reference",".\nỨng dụng home không phục vụ nó — request tới ",[18,215,216],{},"\u002Fen\u002Fdocs\u002Fapi"," bị từ chối trước\nkhi lookup content.",[40,219,221],{"id":220},"mô-hình-nằm-ở-đâu","Mô hình nằm ở đâu",[14,223,224,225,228],{},"Mô hình URL không phải là một quy ước mà mỗi trang tự tuân theo — nó được thực\nthi trong hai module nhỏ của ",[18,226,227],{},"apps\u002Fhome"," mà mọi bề mặt public đều đi qua:",[45,230,231,243],{},[48,232,233,235,236,239,240,242],{},[18,234,61],{}," sở hữu ",[51,237,238],{},"locale dimension",": registry ",[18,241,57],{},", parse\nsegment đầu tiên và locale switching. Nó không biết gì về mount hay\napplication.",[48,244,245,235,247,239,250,253,254,256,257,84,259,261],{},[18,246,79],{},[51,248,249],{},"mount topology",[18,251,252],{},"PUBLIC_MOUNTS"," (",[18,255,83],{},",\n",[18,258,87],{},[18,260,91],{},"), khớp một pathname với một mount và dựng liên kết ngược\nlại.",[14,263,264],{},"Thêm một locale hay một mount nghĩa là thêm một entry vào registry tương ứng;\nphần còn lại của nền tảng suy ra từ chính dữ liệu đó.",[266,267],"hr",{},[14,269,270],{},[271,272,273,274],"em",{},"Tiếp: ",[275,276,278],"a",{"href":277},"\u002Fvi\u002Fdocs\u002Fconcepts\u002Fcontent-and-locales","Nội dung và ngôn ngữ",{"title":29,"searchDepth":280,"depth":280,"links":281},2,[282,283,284,285,286],{"id":42,"depth":280,"text":43},{"id":115,"depth":280,"text":116},{"id":178,"depth":280,"text":179},{"id":195,"depth":280,"text":196},{"id":220,"depth":280,"text":221},"Mô hình URL công khai — \u002F\u003Clocale>\u002F\u003Cmount>\u002F\u003Cpath> — và cách nền tảng parse, dựng URL.","md",{},true,"\u002Fvi\u002Fdocs\u002Fconcepts\u002Fpublic-web",{"title":5,"description":287},"vi\u002Fdocs\u002F2.concepts\u002Fpublic-web","qzMB-xuHVFISGKvc1uJmHmQXvb9le-n6WBivHnnqqXE",[296],{"title":297,"path":298,"stem":299,"children":300,"page":342},"Vi","\u002Fvi","vi",[301,343],{"title":302,"path":303,"stem":304,"children":305,"page":342},"Blog","\u002Fvi\u002Fblog","vi\u002Fblog",[306,312,318,324,330,336],{"title":307,"path":308,"stem":309,"children":310},"Một mô hình URL cho mọi trang public","\u002Fvi\u002Fblog\u002Furl-model","vi\u002Fblog\u002F1.url-model\u002Findex",[311],{"title":307,"path":308,"stem":309},{"title":313,"path":314,"stem":315,"children":316},"Content được resolve ở build time","\u002Fvi\u002Fblog\u002Fbuild-time-content","vi\u002Fblog\u002F2.build-time-content\u002Findex",[317],{"title":313,"path":314,"stem":315},{"title":319,"path":320,"stem":321,"children":322},"Locale switching không bao giờ nói dối","\u002Fvi\u002Fblog\u002Flocale-switching","vi\u002Fblog\u002F3.locale-switching\u002Findex",[323],{"title":319,"path":320,"stem":321},{"title":325,"path":326,"stem":327,"children":328},"Deploy một blog như static assets","\u002Fvi\u002Fblog\u002Fstatic-deployment","vi\u002Fblog\u002F4.static-deployment\u002Findex",[329],{"title":325,"path":326,"stem":327},{"title":331,"path":332,"stem":333,"children":334},"Trang đọc bài không phải trang tài liệu","\u002Fvi\u002Fblog\u002Freading-first-design","vi\u002Fblog\u002F5.reading-first-design\u002Findex",[335],{"title":331,"path":332,"stem":333},{"title":337,"path":338,"stem":339,"children":340},"Blog này là gì (và không phải gì)","\u002Fvi\u002Fblog\u002Fdemo-content-note","vi\u002Fblog\u002F6.demo-content-note\u002Findex",[341],{"title":337,"path":338,"stem":339},false,{"title":344,"path":345,"stem":346,"children":347},"Tổng quan","\u002Fvi\u002Fdocs","vi\u002Fdocs\u002Findex",[348,349,362,371],{"title":344,"path":345,"stem":346},{"title":350,"path":351,"stem":352,"children":353},"Bắt đầu","\u002Fvi\u002Fdocs\u002Fgetting-started","vi\u002Fdocs\u002F1.getting-started\u002Findex",[354,355,359],{"title":350,"path":351,"stem":352},{"title":356,"path":357,"stem":358},"Các bước đầu tiên","\u002Fvi\u002Fdocs\u002Fgetting-started\u002Ffirst-steps","vi\u002Fdocs\u002F1.getting-started\u002Ffirst-steps",{"title":360,"path":172,"stem":361},"Cài đặt","vi\u002Fdocs\u002F1.getting-started\u002Finstallation",{"title":363,"path":364,"stem":365,"children":366},"Khái niệm","\u002Fvi\u002Fdocs\u002Fconcepts","vi\u002Fdocs\u002F2.concepts\u002Findex",[367,368,370],{"title":363,"path":364,"stem":365},{"title":278,"path":277,"stem":369},"vi\u002Fdocs\u002F2.concepts\u002Fcontent-and-locales",{"title":5,"path":291,"stem":293},{"title":372,"path":373,"stem":374,"children":375},"Hướng dẫn","\u002Fvi\u002Fdocs\u002Fguides","vi\u002Fdocs\u002F3.guides\u002Findex",[376,377,381],{"title":372,"path":373,"stem":374},{"title":378,"path":379,"stem":380},"Xây dựng một trang công khai","\u002Fvi\u002Fdocs\u002Fguides\u002Fbuilding-a-public-page","vi\u002Fdocs\u002F3.guides\u002Fbuilding-a-public-page",{"title":382,"path":383,"stem":384},"Phát triển cục bộ","\u002Fvi\u002Fdocs\u002Fguides\u002Flocal-development","vi\u002Fdocs\u002F3.guides\u002Flocal-development",{},[387,299],"en",[389,390],{"title":278,"path":277,"stem":369,"children":-1},{"title":372,"path":373,"stem":374,"children":-1},1791809694090]