[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fhttp":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fhttp":830,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fhttp":854},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":826,"stem":827,"id":828,"extension":829},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fhttp","HTTP 与数据","Angular 通过 HttpClient（@angular\u002Fcommon\u002Fhttp）发起 HTTP 请求，返回 RxJS Observable。见 RxJS 互操作、依赖注入。","技能小册",[12,13],"angular","http","2024-12-27",false,{"type":17,"value":18,"toc":819},"minimark",[19,23,57,61,174,177,508,522,525,528,717,736,739,754,757,760,815],[20,21,8],"h1",{"id":22},"http-与数据",[24,25,26,27,34,35,38,39,45,46,51,52,56],"p",{},"Angular 通过 ",[28,29,30],"strong",{},[31,32,33],"code",{},"HttpClient","（",[31,36,37],{},"@angular\u002Fcommon\u002Fhttp","）发起 HTTP 请求，返回 ",[28,40,41,42],{},"RxJS ",[31,43,44],{},"Observable","。见 ",[47,48,50],"a",{"href":49},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fsignals\u002Frxjs","RxJS 互操作","、",[47,53,55],{"href":54},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fdi","依赖注入","。",[58,59,60],"h2",{"id":60},"配置",[62,63,68],"pre",{"className":64,"code":65,"language":66,"meta":67,"style":67},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F main.ts 或 app.config.ts\nimport { provideHttpClient, withInterceptors } from \"@angular\u002Fcommon\u002Fhttp\";\n\nbootstrapApplication(AppComponent, {\n  providers: [provideHttpClient()],\n});\n","ts","",[31,69,70,79,119,126,141,163],{"__ignoreMap":67},[71,72,75],"span",{"class":73,"line":74},"line",1,[71,76,78],{"class":77},"sutJx","\u002F\u002F main.ts 或 app.config.ts\n",[71,80,82,86,90,94,97,100,103,106,110,113,116],{"class":73,"line":81},2,[71,83,85],{"class":84},"sVHd0","import",[71,87,89],{"class":88},"sP7_E"," {",[71,91,93],{"class":92},"su5hD"," provideHttpClient",[71,95,96],{"class":88},",",[71,98,99],{"class":92}," withInterceptors",[71,101,102],{"class":88}," }",[71,104,105],{"class":84}," from",[71,107,109],{"class":108},"sjJ54"," \"",[71,111,37],{"class":112},"s_sjI",[71,114,115],{"class":108},"\"",[71,117,118],{"class":88},";\n",[71,120,122],{"class":73,"line":121},3,[71,123,125],{"emptyLinePlaceholder":124},true,"\n",[71,127,129,133,136,138],{"class":73,"line":128},4,[71,130,132],{"class":131},"sGLFI","bootstrapApplication",[71,134,135],{"class":92},"(AppComponent",[71,137,96],{"class":88},[71,139,140],{"class":88}," {\n",[71,142,144,148,151,154,157,160],{"class":73,"line":143},5,[71,145,147],{"class":146},"skxfh","  providers",[71,149,150],{"class":88},":",[71,152,153],{"class":92}," [",[71,155,156],{"class":131},"provideHttpClient",[71,158,159],{"class":92},"()]",[71,161,162],{"class":88},",\n",[71,164,166,169,172],{"class":73,"line":165},6,[71,167,168],{"class":88},"}",[71,170,171],{"class":92},")",[71,173,118],{"class":88},[58,175,176],{"id":176},"基本请求",[62,178,180],{"className":64,"code":179,"language":66,"meta":67,"style":67},"import { inject, Injectable } from \"@angular\u002Fcore\";\nimport { HttpClient } from \"@angular\u002Fcommon\u002Fhttp\";\n\nexport interface User {\n  id: number;\n  name: string;\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class UserApi {\n  private http = inject(HttpClient);\n\n  list() {\n    return this.http.get\u003CUser[]>(\"\u002Fapi\u002Fusers\");\n  }\n\n  create(body: Pick\u003CUser, \"name\">) {\n    return this.http.post\u003CUser>(\"\u002Fapi\u002Fusers\", body);\n  }\n}\n",[31,181,182,209,230,234,249,264,276,282,287,319,332,352,357,368,413,419,424,459,498,503],{"__ignoreMap":67},[71,183,184,186,188,191,193,196,198,200,202,205,207],{"class":73,"line":74},[71,185,85],{"class":84},[71,187,89],{"class":88},[71,189,190],{"class":92}," inject",[71,192,96],{"class":88},[71,194,195],{"class":92}," Injectable",[71,197,102],{"class":88},[71,199,105],{"class":84},[71,201,109],{"class":108},[71,203,204],{"class":112},"@angular\u002Fcore",[71,206,115],{"class":108},[71,208,118],{"class":88},[71,210,211,213,215,218,220,222,224,226,228],{"class":73,"line":81},[71,212,85],{"class":84},[71,214,89],{"class":88},[71,216,217],{"class":92}," HttpClient",[71,219,102],{"class":88},[71,221,105],{"class":84},[71,223,109],{"class":108},[71,225,37],{"class":112},[71,227,115],{"class":108},[71,229,118],{"class":88},[71,231,232],{"class":73,"line":121},[71,233,125],{"emptyLinePlaceholder":124},[71,235,236,239,243,247],{"class":73,"line":128},[71,237,238],{"class":84},"export",[71,240,242],{"class":241},"sbsja"," interface",[71,244,246],{"class":245},"sbgvK"," User",[71,248,140],{"class":88},[71,250,251,255,258,262],{"class":73,"line":143},[71,252,254],{"class":253},"sucvu","  id",[71,256,150],{"class":257},"smGrS",[71,259,261],{"class":260},"sZMiF"," number",[71,263,118],{"class":88},[71,265,266,269,271,274],{"class":73,"line":165},[71,267,268],{"class":253},"  name",[71,270,150],{"class":257},[71,272,273],{"class":260}," string",[71,275,118],{"class":88},[71,277,279],{"class":73,"line":278},7,[71,280,281],{"class":88},"}\n",[71,283,285],{"class":73,"line":284},8,[71,286,125],{"emptyLinePlaceholder":124},[71,288,290,293,296,299,302,305,307,309,312,314,316],{"class":73,"line":289},9,[71,291,292],{"class":88},"@",[71,294,295],{"class":131},"Injectable",[71,297,298],{"class":92},"(",[71,300,301],{"class":88},"{",[71,303,304],{"class":146}," providedIn",[71,306,150],{"class":88},[71,308,109],{"class":108},[71,310,311],{"class":112},"root",[71,313,115],{"class":108},[71,315,102],{"class":88},[71,317,318],{"class":92},")\n",[71,320,322,324,327,330],{"class":73,"line":321},10,[71,323,238],{"class":84},[71,325,326],{"class":241}," class",[71,328,329],{"class":245}," UserApi",[71,331,140],{"class":88},[71,333,335,338,341,344,347,350],{"class":73,"line":334},11,[71,336,337],{"class":241},"  private",[71,339,340],{"class":253}," http",[71,342,343],{"class":257}," =",[71,345,190],{"class":346},"sVXei",[71,348,349],{"class":92},"(HttpClient)",[71,351,118],{"class":88},[71,353,355],{"class":73,"line":354},12,[71,356,125],{"emptyLinePlaceholder":124},[71,358,360,363,366],{"class":73,"line":359},13,[71,361,362],{"class":346},"  list",[71,364,365],{"class":88},"()",[71,367,140],{"class":88},[71,369,371,374,378,381,383,385,388,391,394,397,400,402,404,407,409,411],{"class":73,"line":370},14,[71,372,373],{"class":84},"    return",[71,375,377],{"class":376},"s39Yj"," this",[71,379,380],{"class":88},".",[71,382,13],{"class":92},[71,384,380],{"class":88},[71,386,387],{"class":131},"get",[71,389,390],{"class":88},"\u003C",[71,392,393],{"class":245},"User",[71,395,396],{"class":146},"[]",[71,398,399],{"class":88},">",[71,401,298],{"class":146},[71,403,115],{"class":108},[71,405,406],{"class":112},"\u002Fapi\u002Fusers",[71,408,115],{"class":108},[71,410,171],{"class":146},[71,412,118],{"class":88},[71,414,416],{"class":73,"line":415},15,[71,417,418],{"class":88},"  }\n",[71,420,422],{"class":73,"line":421},16,[71,423,125],{"emptyLinePlaceholder":124},[71,425,427,430,432,436,438,441,443,445,447,449,452,454,457],{"class":73,"line":426},17,[71,428,429],{"class":346},"  create",[71,431,298],{"class":88},[71,433,435],{"class":434},"s99_P","body",[71,437,150],{"class":257},[71,439,440],{"class":245}," Pick",[71,442,390],{"class":88},[71,444,393],{"class":245},[71,446,96],{"class":88},[71,448,109],{"class":108},[71,450,451],{"class":112},"name",[71,453,115],{"class":108},[71,455,456],{"class":88},">)",[71,458,140],{"class":88},[71,460,462,464,466,468,470,472,475,477,479,481,483,485,487,489,491,494,496],{"class":73,"line":461},18,[71,463,373],{"class":84},[71,465,377],{"class":376},[71,467,380],{"class":88},[71,469,13],{"class":92},[71,471,380],{"class":88},[71,473,474],{"class":131},"post",[71,476,390],{"class":88},[71,478,393],{"class":245},[71,480,399],{"class":88},[71,482,298],{"class":146},[71,484,115],{"class":108},[71,486,406],{"class":112},[71,488,115],{"class":108},[71,490,96],{"class":88},[71,492,493],{"class":92}," body",[71,495,171],{"class":146},[71,497,118],{"class":88},[71,499,501],{"class":73,"line":500},19,[71,502,418],{"class":88},[71,504,506],{"class":73,"line":505},20,[71,507,281],{"class":88},[24,509,510,511,514,515,518,519,56],{},"组件中配合 ",[31,512,513],{},"async"," 管道或 ",[31,516,517],{},"toSignal"," 消费，见 ",[47,520,521],{"href":49},"signals\u002Frxjs",[58,523,524],{"id":524},"拦截器",[24,526,527],{},"函数式拦截器（Angular 15+）用于统一附加 Token、处理错误：",[62,529,531],{"className":64,"code":530,"language":66,"meta":67,"style":67},"import { HttpInterceptorFn } from \"@angular\u002Fcommon\u002Fhttp\";\n\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n  const token = localStorage.getItem(\"token\");\n  if (token) {\n    req = req.clone({ setHeaders: { Authorization: `Bearer ${token}` } });\n  }\n  return next(req);\n};\n",[31,532,533,554,558,593,625,640,693,697,712],{"__ignoreMap":67},[71,534,535,537,539,542,544,546,548,550,552],{"class":73,"line":74},[71,536,85],{"class":84},[71,538,89],{"class":88},[71,540,541],{"class":92}," HttpInterceptorFn",[71,543,102],{"class":88},[71,545,105],{"class":84},[71,547,109],{"class":108},[71,549,37],{"class":112},[71,551,115],{"class":108},[71,553,118],{"class":88},[71,555,556],{"class":73,"line":81},[71,557,125],{"emptyLinePlaceholder":124},[71,559,560,562,565,569,571,573,575,578,581,583,586,588,591],{"class":73,"line":121},[71,561,238],{"class":84},[71,563,564],{"class":241}," const",[71,566,568],{"class":567},"sfCm-"," authInterceptor",[71,570,150],{"class":257},[71,572,541],{"class":245},[71,574,343],{"class":257},[71,576,577],{"class":88}," (",[71,579,580],{"class":434},"req",[71,582,96],{"class":88},[71,584,585],{"class":434}," next",[71,587,171],{"class":88},[71,589,590],{"class":241}," =>",[71,592,140],{"class":88},[71,594,595,598,602,604,607,609,612,614,616,619,621,623],{"class":73,"line":128},[71,596,597],{"class":241},"  const",[71,599,601],{"class":600},"s_hVV"," token",[71,603,343],{"class":257},[71,605,606],{"class":92}," localStorage",[71,608,380],{"class":88},[71,610,611],{"class":131},"getItem",[71,613,298],{"class":146},[71,615,115],{"class":108},[71,617,618],{"class":112},"token",[71,620,115],{"class":108},[71,622,171],{"class":146},[71,624,118],{"class":88},[71,626,627,630,632,634,637],{"class":73,"line":143},[71,628,629],{"class":84},"  if",[71,631,577],{"class":146},[71,633,618],{"class":92},[71,635,636],{"class":146},") ",[71,638,639],{"class":88},"{\n",[71,641,642,645,647,650,652,655,657,659,662,664,666,669,671,674,677,680,682,685,687,689,691],{"class":73,"line":165},[71,643,644],{"class":92},"    req",[71,646,343],{"class":257},[71,648,649],{"class":92}," req",[71,651,380],{"class":88},[71,653,654],{"class":131},"clone",[71,656,298],{"class":146},[71,658,301],{"class":88},[71,660,661],{"class":146}," setHeaders",[71,663,150],{"class":88},[71,665,89],{"class":88},[71,667,668],{"class":146}," Authorization",[71,670,150],{"class":88},[71,672,673],{"class":108}," `",[71,675,676],{"class":112},"Bearer ",[71,678,679],{"class":108},"${",[71,681,618],{"class":92},[71,683,684],{"class":108},"}`",[71,686,102],{"class":88},[71,688,102],{"class":88},[71,690,171],{"class":146},[71,692,118],{"class":88},[71,694,695],{"class":73,"line":278},[71,696,418],{"class":88},[71,698,699,702,704,706,708,710],{"class":73,"line":284},[71,700,701],{"class":84},"  return",[71,703,585],{"class":131},[71,705,298],{"class":146},[71,707,580],{"class":92},[71,709,171],{"class":146},[71,711,118],{"class":88},[71,713,714],{"class":73,"line":289},[71,715,716],{"class":88},"};\n",[62,718,720],{"className":64,"code":719,"language":66,"meta":67,"style":67},"provideHttpClient(withInterceptors([authInterceptor]));\n",[31,721,722],{"__ignoreMap":67},[71,723,724,726,728,731,734],{"class":73,"line":74},[71,725,156],{"class":131},[71,727,298],{"class":92},[71,729,730],{"class":131},"withInterceptors",[71,732,733],{"class":92},"([authInterceptor]))",[71,735,118],{"class":88},[58,737,738],{"id":738},"错误处理",[24,740,741,742,745,746,749,750,753],{},"在 ",[31,743,744],{},"subscribe"," 的 ",[31,747,748],{},"error"," 回调、",[31,751,752],{},"catchError"," 操作符或全局拦截器中处理；向用户展示错误时避免泄露服务端内部堆栈。",[58,755,756],{"id":756},"参考文献",[24,758,759],{},"以下链接在编写时均可正常访问：",[761,762,763,776],"table",{},[764,765,766],"thead",{},[767,768,769,773],"tr",{},[770,771,772],"th",{},"资料",[770,774,775],{},"说明",[777,778,779,792,803],"tbody",{},[767,780,781,789],{},[782,783,784],"td",{},[47,785,33],{"href":786,"rel":787},"https:\u002F\u002Fangular.dev\u002Fguide\u002Fhttp",[788],"nofollow",[782,790,791],{},"官方指南",[767,793,794,800],{},[782,795,796],{},[47,797,524],{"href":798,"rel":799},"https:\u002F\u002Fangular.dev\u002Fguide\u002Fhttp\u002Finterceptors",[788],[782,801,802],{},"函数式拦截器",[767,804,805,812],{},[782,806,807],{},[47,808,811],{"href":809,"rel":810},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FHTTP",[788],"MDN：HTTP",[782,813,814],{},"协议基础",[816,817,818],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVXei, html code.shiki .sVXei{--shiki-light:#E53935;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":67,"searchDepth":81,"depth":81,"links":820},[821,822,823,824,825],{"id":60,"depth":81,"text":60},{"id":176,"depth":81,"text":176},{"id":524,"depth":81,"text":524},{"id":738,"depth":81,"text":738},{"id":756,"depth":81,"text":756},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fframe\u002FAngular\u002Fhttp","knowledge\u002Fknowledge\u002Fbooklet\u002Fframe\u002FAngular\u002Fhttp.md","md",{"items":831},[832,836,840,842,846,850],{"path":833,"title":834,"description":835,"category":10,"score":165},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fecology","生态集成","Angular 官方维护路由、HTTP、表单、动画等；UI 与状态扩展由社区与官方 Material 团队提供。涵盖官方\u002F半官方库、常用第三方库、与 Vue\u002FReact 生态对照、选型建议与常见坑。",{"path":837,"title":838,"description":839,"category":10,"score":165},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fsignals\u002Fbasics","Signal 基础","Signals 是 Angular 16 引入的响应式原语：可读写的 signal、派生的 computed、副作用 effect。用于组件内状态与跨组件细粒度更新，涵盖 API、input signal、与变更检测的关系、最佳实践与常见坑。",{"path":49,"title":50,"description":841,"category":10,"score":165},"Angular 内置 RxJS 处理异步流（HTTP、HttpClient、路由事件、FormControl 的 valueChanges 等）。Signal 适合同步\u002F短链路状态；长生命周期流仍常用 Observable。涵盖 async 管道、toSignal\u002FtoObservable、常用操作符、最佳实践与常见坑。",{"path":843,"title":844,"description":845,"category":10,"score":165},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fforms","表单","Angular 提供 响应式表单（Reactive Forms） 与 模板驱动表单（Template-driven）。复杂表单推荐 Reactive Forms（模型在 TypeScript 中，易测试）。涵盖 FormGroup\u002FFormArray、Typed Forms、自定义校验器、最佳实践与常见坑。",{"path":847,"title":848,"description":849,"category":10,"score":165},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fstate","状态管理","Angular 没有强制单一状态库：服务 + DI、Signal、RxJS 即可覆盖多数场景；大型应用可选用 NgRx。涵盖选型、服务作为状态容器、跨组件共享、NgRx 与 SignalStore、常见坑。",{"path":851,"title":852,"description":853,"category":10,"score":165},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fperformance\u002Fchange-detection","变更检测","Angular 在数据变化后更新 DOM 的过程称为 变更检测（Change Detection）。理解默认策略、Zone.js 机制、OnPush 与 Signal 协同，有助于性能调优。运行时技巧见 runtime。",{"series":855,"title":12,"items":856,"index":278,"prev":896,"next":897},"booklet\u002Fframe\u002Fangular",[857,861,863,865,869,871,873,875,876,880,884,888,890,892],{"path":858,"title":859,"date":860,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fbasics","Angular 基础","2020-03-07",{"path":837,"title":838,"date":862,"pinned":15},"2026-06-12",{"path":851,"title":852,"date":864,"pinned":15},"2023-10-12",{"path":866,"title":867,"date":868,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fcomponents","组件与模板","2021-07-11",{"path":54,"title":55,"date":870,"pinned":15},"2021-01-24",{"path":833,"title":834,"date":872,"pinned":15},"2026-07-12",{"path":843,"title":844,"date":874,"pinned":15},"2025-05-26",{"path":7,"title":8,"date":14,"pinned":15},{"path":877,"title":878,"date":879,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fproject","工程化","2021-09-01",{"path":881,"title":882,"date":883,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Frouter","路由","2023-02-04",{"path":885,"title":886,"date":887,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fperformance\u002Fruntime","运行时优化","2022-11-01",{"path":49,"title":50,"date":889,"pinned":15},"2026-04-06",{"path":847,"title":848,"date":891,"pinned":15},"2025-04-29",{"path":893,"title":894,"date":895,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Ftest","测试","2021-08-25",{"path":843,"title":844,"date":874,"pinned":15},{"path":877,"title":878,"date":879,"pinned":15}]