From c1eb19eb84519d98f8845869d0c6047eec71da44 Mon Sep 17 00:00:00 2001 From: dribble-njr <72367140+dribble-njr@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:46:04 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20dribble-?= =?UTF-8?q?njr/blog@6268b163b8256cf6f24e5acdf0650b656c69d6a1=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 4 +- article/index.html | 6 +- ...\345\217\211\346\240\221.html-dZHoE2lD.js" | 2 +- ...\347\264\242\346\240\221.html-BRHkwM8L.js" | 2 +- ...\350\247\204\345\210\222.html-U9YyrO12.js" | 2 +- ...\351\223\276\350\241\250.html-DGNJio24.js" | 2 +- ...007\343\200\201WebSocket.html-rjc6_IG0.js" | 2 +- ...08\343\200\201WebStorage.html-5kGJ81lf.js" | 2 +- ...> 001-character-encoding.html-E_VDWDGh.js} | 2 +- ...GEbOiO.js => 001-dnd-kit.html-jsyMYY9a.js} | 2 +- ...X.js => 001-finalhandler.html-s_PiC4wA.js} | 2 +- ...js => 001-hello-database.html-Zgc4Q_aW.js} | 2 +- ...v.js => 001-hello-rspack.html-hPXOzEdL.js} | 2 +- ...myI.js => 001-hello-vite.html-7wlT7B5t.js} | 2 +- ...7.js => 001-html-history.html-tURB45U7.js} | 2 +- ...T.js => 001-init-project.html-9epaxP2F.js} | 2 +- ...5.js => 001-init-project.html-txRST9Rg.js} | 2 +- ....js => 001-install-mysql.html-qc7jqvu9.js} | 2 +- ...js => 001-modularization.html-aVDXVF3p.js} | 4 +- ...uMgtzmT.js => 001-module.html-S6GWBUID.js} | 2 +- ....js => 001-network-model.html-AnQrVYyf.js} | 2 +- ..._R.js => 001-quick-start.html-reK2EBPD.js} | 2 +- ...NO.js => 001-set-the-ssh.html-_kRdhh4B.js} | 2 +- ....js => 001-var-let-const.html-s47UVxV9.js} | 2 +- ....js => 001-webpack-basic.html-iANhhZl5.js} | 2 +- ...010\343\200\201WebWorker.html-z-ry9p5x.js" | 2 +- ...\347\233\270\347\255\211.html-Qe14ZYL2.js" | 2 +- .../0012\343\200\201AJAX.html-KSX5mbJA.js" | 2 +- ...\346\213\267\350\264\235.html-KNURvFJh.js" | 2 +- ...\345\276\252\347\216\257.html-RxwjAYeR.js" | 2 +- ....js => 002-HTTP-overview.html-yA9pf-8X.js} | 2 +- ...DLl.js => 002-annotation.html-jSTF0IVD.js} | 2 +- ... => 002-build-git-server.html-k7ZuvaaM.js} | 2 +- ...s => 002-package-manager.html-8ga7lBMd.js} | 2 +- ...dS.js => 002-quick-start.html-GzDTnx7H.js} | 2 +- ...js => 002-relation-model.html-eh9sdhEc.js} | 2 +- ...wigBR.js => 002-selector.html-Y8lG2Qy6.js} | 2 +- ...252gQD2-.js => 002-types.html-X5moh2oe.js} | 2 +- ...Pn.js => 002-webpack-css.html-C0hFA9Ag.js} | 2 +- ...wKIC.js => 003-box-model.html-FIoUn3l-.js} | 2 +- ...s.js => 003-configure-bt.html-3e4O9NhM.js} | 2 +- ...Xx79.js => 003-db-design.html-Oji9hdtE.js} | 2 +- ...x-qvH9.js => 003-doctype.html-3ssLfMA4.js} | 2 +- ...U8.js => 003-file-upload.html-PdEE_gdK.js} | 2 +- ... 003-get-post-difference.html-y7Gjbjjy.js} | 2 +- ...1XZ.js => 003-judge-type.html-0nLfDuM_.js} | 2 +- ...-k6pbBUqo.js => 003-tool.html-DLnZqT_R.js} | 2 +- ...js => 003-webpack-assets.html-kB2bMhYm.js} | 2 +- ... => 004-HTTP-development.html-BBWBnLvD.js} | 2 +- ...=> 004-advanced-db-model.html-tGr-G7p6.js} | 2 +- ...004-automated-deployment.html-wjHFQrWt.js} | 2 +- ...js => 004-common-element.html-q8tUaFIS.js} | 2 +- ....js => 004-global-upload.html-2q23fxm8.js} | 2 +- ...ve-value-reference-value.html-MLxMLvib.js} | 2 +- ...=> 004-project-standards.html-2vM9DZTK.js} | 2 +- ...lsoM.js => 004-text-font.html-ldUSeidH.js} | 2 +- ...js => 004-webpack-plugin.html-n3ujVQXJ.js} | 2 +- ...ex3.js => 005-HTTP-cache.html-KgXwqlEv.js} | 2 +- ... => 005-advanced-element.html-LXvnYZdN.js} | 2 +- ... 005-cascade-inheritance.html-5BhjxfCj.js} | 2 +- ...=> 005-execution-context.html-salfrApg.js} | 2 +- ...js => 005-install-docker.html-gBSt4qi-.js} | 2 +- ...5-postcss-px-to-viewport.html-1cqOLJHS.js} | 2 +- ...-TahGLhP-.js => 005-qwik.html-U4rDkWuK.js} | 2 +- ....js => 005-webpack-babel.html-Fqs9mfmk.js} | 2 +- ...wj3v3oe.js => 005-yeoman.html-KxN9wacd.js} | 2 +- ...js => 006-HTTPS-overview.html-SYoh5fQX.js} | 2 +- ....js => 006-animation-svg.html-8eIQ6Ihw.js} | 2 +- ...=> 006-background-border.html-RCrBWyb-.js} | 2 +- ...6-react-server-component.html-k-YETDuh.js} | 2 +- ...ntically-meaningful-tags.html-WThMFqDm.js} | 2 +- ...ng-toLocalString-valueOf.html-cxsnu0DQ.js} | 2 +- ...b9.js => 006-webpack-vue.html-1d_xRqtP.js} | 2 +- ...andshakes-and-four-waves.html-dYxpKZ12.js} | 2 +- ...007-basic-reference-type.html-aceDmBbB.js} | 2 +- ...dration-is-pure-overhead.html-RuYzXwld.js} | 2 +- ...FuX3.js => 007-media-tag.html-4B2dcBja.js} | 2 +- ...ine-export-in-highcharts.html-wjbjRKLu.js} | 2 +- ...zeXYe.js => 007-position.html-bHWd8Nqh.js} | 2 +- ...> 007-webpack-dev-server.html-t2yhyF-D.js} | 2 +- ...ZFA.js => 008-canvas-svg.html-J5y6viF5.js} | 2 +- ...ollection-reference-type.html-6hAWB_6B.js} | 2 +- ...cC7j6Fly.js => 008-float.html-NWrPV4-8.js} | 2 +- ...mI5mFu.js => 008-tcp-udp.html-rUxlBxzI.js} | 2 +- ...s => 008-webpack-resolve.html-WaOOPcO4.js} | 2 +- ...=> 009-array-like-object.html-99xk2Ewf.js} | 2 +- ...-SyAmrX4g.js => 009-flex.html-UhyQHsgH.js} | 2 +- ...-when-authorized-refused.html-KimibnOR.js} | 2 +- ...oQ.js => 009-src-vs-href.html-7SGMc5wm.js} | 2 +- ...=> 009-webpack-env-split.html-2H2sFtOB.js} | 2 +- ...1-a-pragmatic-philosophy.html-2Asvolaw.js} | 2 +- ...-eSTvuSoN.js => 01-array.html-qqj7snQD.js} | 2 +- ...js => 01-command-pattern.html-NToFxAAq.js} | 2 +- ...js => 01-getting-started.html-WKDe7Qbs.js} | 2 +- ...js => 01-getting-started.html-y0dVi-KY.js} | 2 +- ...-browser-rendering-works.html-GwCLJ--h.js} | 2 +- ...l-ecnfoh5n.js => 01-init.html-zmrtRBND.js} | 2 +- ...-F0K_vhBd.js => 01-maven.html-2dOiULAq.js} | 2 +- ...01-overview-architecture.html-2m6AorPJ.js} | 2 +- ...p.js => 01-pages-layouts.html-q0AcGxgI.js} | 2 +- ...tYv.js => 01-quick-start.html-icBlNGVT.js} | 2 +- ...mGo.js => 01-quick-start.html-nSD4Idct.js} | 2 +- ...IUYZlb.js => 01-useState.html-TAgOQCTv.js} | 2 +- ...ss-plugin-ordered-header.html-q2B5p71G.js} | 2 +- ...rea-placeholder-pre-line.html-FmF3dONc.js} | 2 +- ...ov7DEVBH.js => 010-html5.html-IzmK_1on.js} | 2 +- ...s => 010-object-property.html-CMstI5aK.js} | 2 +- ...-Mmr-V3cT.js => 010-unit.html-fJENl0PI.js} | 2 +- ...5Xit3Oi.js => 011-center.html-QIgnh1uy.js} | 2 +- ....js => 011-create-object.html-i2ltl5i0.js} | 2 +- ...js => 011-defer-vs-async.html-BCGYD0Av.js} | 2 +- ...Lfr47G.js => 012-extends.html-0PMdv4Ro.js} | 2 +- ...s => 012-form-validation.html-Z8hIzVSe.js} | 2 +- ...-3XqGR-dj.js => 012-grid.html-VQlEaWjN.js} | 2 +- ...l-oRnppy7q.js => 013-BFC.html-aFsmxXJq.js} | 2 +- ...IiH58Ic4.js => 013-class.html-KYMn2F8Y.js} | 2 +- ...l-iv5Q82Xp.js => 013-seo.html-oy2Hbj6G.js} | 2 +- ....js => 014-implement-new.html-42YlTdDK.js} | 2 +- ...-responsive-design-intro.html-7YdohJT-.js} | 2 +- ... => 015-auto-change-node.html-vmI9x_qg.js} | 2 +- ...ghf05.js => 015-function.html-0dV-rtlJ.js} | 2 +- ...=> 015-responsive-design.html-zWMQ9SbQ.js} | 2 +- ...=> 016-how-to-responsive.html-3LyDgIXl.js} | 2 +- ...=> 016-rest-client-error.html-JHYKZQb6.js} | 2 +- ...-BWOVpThp.js => 016-this.html-V0F_Y6Ry.js} | 2 +- ...mplement-call-apply-bind.html-inN8CfCD.js} | 2 +- ...s => 017-loading-spinner.html-RGOKwDDs.js} | 2 +- ...whistle-debug-real-phone.html-8fLPP_oc.js} | 2 +- ...0qC3m.js => 018-autofill.html-k6Z5PbWM.js} | 2 +- ... 018-monaco-editor-react.html-sSKOAfLt.js} | 2 +- ...=> 019-ios-prevent-touch.html-sCERLB9h.js} | 2 +- ...\351\200\232\344\277\241.html-tJc86P4B.js" | 2 +- ...tml-IZr6VCnt.js => 02-V8.html-abcG9r2W.js} | 2 +- ... 02-a-pragmatic-approach.html-JGy5n7BJ.js} | 2 +- ...02-architecture-overview.html-6076uJDz.js} | 2 +- ...z992.js => 02-express.js.html-wRqB8YUW.js} | 2 +- ...js => 02-factory-pattern.html-Zwdb5ir_.js} | 2 +- ...1ajs.js => 02-git-basics.html-c-hemJSp.js} | 2 +- ...nDPPJ1I0.js => 02-server.html-sju2MrZY.js} | 2 +- ...9UW.js => 02-style-props.html-oN7Hm48h.js} | 2 +- ...C6b79.js => 02-useEffect.html-7KsZvcwk.js} | 2 +- ...CdcFCF.js => 020-ios-img.html-qmiwZBqQ.js} | 2 +- ...\345\216\237\347\220\206.html-hxEjAjw7.js" | 2 +- ...43\200\201provide-inject.html--gqiviyZ.js" | 2 +- ...Kkhx.js => 03-basic-tool.html-g3IuINfV.js} | 2 +- ...8Pz1RB.js => 03-database.html-GzHjF5vt.js} | 2 +- ... => 03-flyweight-pattern.html-IIVmQYZ2.js} | 2 +- ...pUVr.js => 03-git-branch.html-CPKiQy0r.js} | 2 +- ... => 03-memory-management.html-zNWUMiQc.js} | 2 +- ...yJD.js => 03-render-loop.html-dW4TkDPY.js} | 2 +- ...\346\217\222\346\247\275.html-VPX4UrNy.js" | 2 +- ...ml-pkUj-_Sw.js => 04-api.html-L9kwFNyo.js} | 2 +- ...aC.js => 04-cross-domain.html-hLz1ACuK.js} | 2 +- ...UmXQ.js => 04-git-server.html-VbjfIz48.js} | 2 +- ...s => 04-mediator-pattern.html-Wk0Fs-dK.js} | 2 +- ...=> 04-pragmatic-paranoid.html-JLwUFQv7.js} | 2 +- ...W29.js => 04-scene-graph.html-QBvEcXGS.js} | 2 +- ...\347\273\204\344\273\266.html-KRYxl05T.js" | 2 +- ...=> 05-middleware-pattern.html-hSMzJDay.js} | 2 +- ...s-after-entering-the-URL.html-OWWRueDp.js} | 2 +- ...LsT.js => 05-work-around.html-kkeNGkzw.js} | 2 +- ...3\266\347\232\204v-model.html-oSrQEt5s.js" | 2 +- ...J.js => 06-change-commit.html-yJsOvgbD.js} | 2 +- ...sgEh.js => 06-concurrent.html-4XZcy3em.js} | 2 +- assets/06-mixin-pattern.html-xPNxrrXT.js | 89 +++++ .../06\343\200\201Mixin.html-vFrCtzEG.js" | 2 +- assets/07-module-pattern.html-PPpx4-1O.js | 1 + ...FuP.js => 07-when-coding.html-mMkE9Kb1.js} | 2 +- ...\345\237\272\347\241\200.html-sWkWMy6L.js" | 2 +- ... 08-before-start-project.html-qoPrQxFC.js} | 2 +- ...\345\207\275\346\225\260.html-gNvTRZCR.js" | 2 +- ... => 09-pragmatic-project.html-w1zorxVJ.js} | 2 +- ...\346\214\207\344\273\244.html-KKqSJCFB.js" | 2 +- ...\346\217\222\344\273\266.html-_zTLOduh.js" | 2 +- ...html-t3q06end.js => 2023.html-gXOG2LdF.js} | 2 +- ...html-dchrgZ6a.js => 2024.html-Fl5-sZEu.js} | 2 +- ....html-uIvc4tSN.js => 404.html-ey9YfrM5.js} | 2 +- assets/{app-2R243if7.js => app-I81jsmus.js} | 22 +- assets/{arc-FolFS303.js => arc-jj2rQ79R.js} | 2 +- ...C.js => blockDiagram-6b2b5046-dPjrH4Tz.js} | 2 +- ...k4Ib.js => c4Diagram-b947cdbb-6LlQD8gP.js} | 2 +- assets/channel-E06Uohc9.js | 1 - assets/channel-_BoElw_v.js | 1 + ...-.js => classDiagram-35230388-WCO95pQ7.js} | 2 +- ...s => classDiagram-v2-412acd34-jptX3zzM.js} | 2 +- assets/clone-RIIBrVN3.js | 1 + assets/clone-hs9N3Qmu.js | 1 - ...Qnzmw.js => codemirror-editor-j7-Ov7Pm.js} | 2 +- ...GoK.js => createText-423428c9-DMNkaBZH.js} | 2 +- ...uTLZ61Cj.js => edges-d417c7a0-dMLW4fNk.js} | 2 +- ...-Gcb.js => erDiagram-0ea73325-HOSw3jCf.js} | 2 +- ...79xoTHo.js => flowDb-d35e309a-JunLwFy6.js} | 2 +- ...7L.js => flowDiagram-d949d7c1-Km3bw0Wv.js} | 2 +- assets/flowDiagram-v2-49332944-CeopBWYD.js | 1 + assets/flowDiagram-v2-49332944-jpRhKRK7.js | 1 - ...chart-elk-definition-27cc417a-E40wJWYz.js} | 2 +- ...I.js => ganttDiagram-5c869e3b-PaDnyKb9.js} | 2 +- ...s => gitGraphDiagram-b9d81de9-ii4rvYx6.js} | 2 +- .../{graph-vDJi9agi.js => graph-kdm1lDeG.js} | 2 +- ...mHY5htT3.js => index-8fae9850-AldU4d2Z.js} | 2 +- ...tml-2ZEvTyqm.js => index.html--6TZOf5z.js} | 2 +- ...tml-rr2e2a2C.js => index.html--6exqmtK.js} | 2 +- ...tml-Ez0b591v.js => index.html--F5t8OTY.js} | 2 +- ...tml--rq-pZBd.js => index.html--JPoGlT0.js} | 2 +- ...tml-HOdxw-79.js => index.html--L5HZE0X.js} | 2 +- ...tml-cbiocN7z.js => index.html--VlRPmKi.js} | 2 +- ...tml-2XB4vSRh.js => index.html-0C__MQ28.js} | 2 +- ...tml-pHT5J-DB.js => index.html-0CdTPh7N.js} | 2 +- ...tml-bOd4CKkV.js => index.html-0KCmLuwB.js} | 2 +- ...tml-6nX5abh5.js => index.html-0eyk_dry.js} | 2 +- ...tml-0DpfjzBl.js => index.html-0uRcbDSq.js} | 2 +- ...tml-4CQRZNtv.js => index.html-0wnONOpX.js} | 2 +- ...tml-n3UBXl_A.js => index.html-14MHn-Up.js} | 2 +- ...tml-c4rRs-NN.js => index.html-1Nr8bhuM.js} | 2 +- ...tml-d38JKPow.js => index.html-23cYN8fI.js} | 2 +- ...tml-YpHE7Cx_.js => index.html-31ErRzhC.js} | 2 +- ...tml-X759pPU_.js => index.html-3ghGFG8O.js} | 2 +- ...tml-gUBfRxr2.js => index.html-3nJHAvil.js} | 2 +- ...tml-N_kW9YLo.js => index.html-4Iq9ezl_.js} | 2 +- ...tml-wYo71ybu.js => index.html-4UU_vsFD.js} | 2 +- ...tml-w49iT_oy.js => index.html-4vDv9sc6.js} | 2 +- ...tml-z0YzqgrC.js => index.html-5TDjfNLf.js} | 2 +- ...tml-DfbYiCSB.js => index.html-5bSC_2vH.js} | 2 +- ...tml-QjGLyWCs.js => index.html-66s9zgMZ.js} | 2 +- ...tml-5XHgOxjy.js => index.html-67kf_GGd.js} | 2 +- ...tml-aH_uGVqv.js => index.html-6cowqeov.js} | 2 +- ...tml-VFFAf27P.js => index.html-6qpwIxqQ.js} | 2 +- ...tml-UK93Vd89.js => index.html-6wkUhdzd.js} | 2 +- ...tml-qu3zlAs0.js => index.html-7EzYSmUS.js} | 2 +- ...tml-fXiqRdON.js => index.html-7b-Yq8WZ.js} | 2 +- ...tml-g2XThmuH.js => index.html-7hjLHxps.js} | 2 +- ...tml-ZaikQdSp.js => index.html-8AvS5k6X.js} | 2 +- ...tml-mGdiLQP4.js => index.html-8FWG5OXL.js} | 2 +- ...tml-RE83hP6O.js => index.html-90UyKJBw.js} | 2 +- ...tml-zWMKsbfL.js => index.html-91G785uA.js} | 2 +- ...tml-FZuIpOY_.js => index.html-93LI1O8A.js} | 2 +- ...tml-G90Ce1_P.js => index.html-9E0mn_M3.js} | 2 +- ...tml-pOmA5x9t.js => index.html-9R3u1krZ.js} | 2 +- ...tml-WXkd1m1L.js => index.html-9mtT_v42.js} | 2 +- ...tml-wz0pq5zC.js => index.html-AcDDHBjs.js} | 2 +- ...tml-rNq1W2Zl.js => index.html-AcHcpmyL.js} | 2 +- ...tml-cTdgF5uu.js => index.html-B0zestXk.js} | 2 +- ...tml-8TNIbXKM.js => index.html-B2x9k5tu.js} | 2 +- ...tml-yTMqUL6z.js => index.html-BLPlXPB1.js} | 2 +- ...tml-KdTxVzQB.js => index.html-BLkmkmA_.js} | 2 +- ...tml-1qS3_eHk.js => index.html-BNOp3Mse.js} | 2 +- ...tml-_qN0xDFh.js => index.html-BhnJj992.js} | 2 +- ...tml-KZiYdgNN.js => index.html-Bs3oO7C_.js} | 2 +- ...tml-GPGqn-oS.js => index.html-C360RI7I.js} | 2 +- ...tml-MtNsNwRx.js => index.html-CHWD6_iY.js} | 2 +- ...tml-MGEj_GPV.js => index.html-D6T1DCMH.js} | 2 +- ...tml-vCzwf0Sn.js => index.html-DVi4lX_-.js} | 2 +- ...tml-LGd4fJ-7.js => index.html-E-kz0qY7.js} | 2 +- ...tml-SuQyXgcv.js => index.html-E1HdBVl_.js} | 2 +- ...tml-7J1SFePC.js => index.html-EQdXoVXB.js} | 2 +- ...tml-n8R1JMtH.js => index.html-ERfJaqW-.js} | 2 +- ...tml-NcsXm3WC.js => index.html-F5HnQcet.js} | 2 +- ...tml-xgR8-wRj.js => index.html-F8Nld46U.js} | 2 +- ...tml-1nC4QyoR.js => index.html-FFZ3YKGZ.js} | 2 +- ...tml-ig41yThJ.js => index.html-FnjjrZVb.js} | 2 +- ...tml-3CUydp4K.js => index.html-FoB7MnFp.js} | 2 +- ...tml-7kHbRdSg.js => index.html-G24g2E_r.js} | 2 +- ...tml-515f-G8L.js => index.html-GFPyrhoV.js} | 2 +- ...tml-GDKls1L1.js => index.html-GGbbhDjJ.js} | 2 +- ...tml-w8grGS9G.js => index.html-GYlVtT_i.js} | 2 +- ...tml-QThOMSe4.js => index.html-H1AzmvhU.js} | 2 +- ...tml-dCuwV4c-.js => index.html-HOTiQ-yL.js} | 2 +- ...tml-6PZm1DnQ.js => index.html-HZQfa0vK.js} | 2 +- ...tml-_5kjpK31.js => index.html-Hr6EYV6k.js} | 2 +- ...tml-Wr3ujhrK.js => index.html-I-71DhOf.js} | 2 +- ...tml-BQ5qZrok.js => index.html-Ilj8DScN.js} | 2 +- ...tml-8ChHX9NB.js => index.html-Io97aBuh.js} | 2 +- ...tml-PD4FMCrk.js => index.html-Ith43-eG.js} | 2 +- ...tml-HIFvKPWZ.js => index.html-J6YBbtvY.js} | 2 +- ...tml-D8NQd95K.js => index.html-J8BMHg89.js} | 2 +- ...tml-eYHlm8Wt.js => index.html-JF4gDM7D.js} | 2 +- ...tml--pdyXLPg.js => index.html-JHMCqP3K.js} | 2 +- ...tml-4IHlJjCx.js => index.html-JX1VErOL.js} | 2 +- ...tml-4t0YWChX.js => index.html-JhGcsNxJ.js} | 2 +- ...tml-gQEDS16t.js => index.html-JnfKE5ye.js} | 2 +- ...tml-zNLvzmNu.js => index.html-JpugBYVz.js} | 2 +- ...tml-vCptjdB4.js => index.html-JsjX07PL.js} | 2 +- ...tml-OOLb7v7r.js => index.html-KAO7TBkB.js} | 2 +- ...tml-Lu-6iPu6.js => index.html-KRoADKjE.js} | 2 +- ...tml-L9JXX8_J.js => index.html-KmYW_B6k.js} | 2 +- ...tml-VMaWReow.js => index.html-L7Ue2F8C.js} | 2 +- ...tml-4T6lwsm_.js => index.html-Lt33W2fu.js} | 2 +- ...tml-qkR6G051.js => index.html-MDmNSIgf.js} | 2 +- ...tml-1wIIZvk4.js => index.html-MGvi-vgA.js} | 2 +- ...tml-6QOAi_wy.js => index.html-MQIB_QpV.js} | 2 +- ...tml-NsGWRbqf.js => index.html-MUvLrlGW.js} | 2 +- ...tml-DVInEGrY.js => index.html-NJpwtthw.js} | 2 +- ...tml-ReqWpZHA.js => index.html-NW49SvAU.js} | 2 +- ...tml-7pQDueGH.js => index.html-NleAmsCg.js} | 2 +- ...tml-shaRytHI.js => index.html-NtP5QAzU.js} | 2 +- ...tml-xRFtv6mu.js => index.html-Nxu2qgD8.js} | 2 +- ...tml-z0Rcj3zT.js => index.html-OOfR2c4H.js} | 2 +- ...tml-6PkFsrKl.js => index.html-OfXkBPs5.js} | 2 +- ...tml-qUwdIo1v.js => index.html-Otbm08-E.js} | 2 +- ...tml--FWk7Vul.js => index.html-PSD82k6J.js} | 2 +- ...tml-9AGhSKws.js => index.html-QW4gd68q.js} | 2 +- ...tml-7xhgW9hM.js => index.html-QYtx_6GE.js} | 2 +- ...tml-B1fEnyTH.js => index.html-QrgOJdpu.js} | 2 +- ...tml-WUCyIDuT.js => index.html-RQO6tcOD.js} | 2 +- ...tml-tLYxd7rz.js => index.html-RsY9uX7U.js} | 2 +- ...tml-zHvTH7-y.js => index.html-S3OdPlRp.js} | 2 +- ...tml-ybYFZQb-.js => index.html-STrbfrZI.js} | 2 +- ...tml-XAb12k43.js => index.html-U4OrLyv3.js} | 2 +- ...tml-O2Nw6hi-.js => index.html-U9VUqS42.js} | 2 +- ...tml-UV9Smhks.js => index.html-UO9hy6Wg.js} | 2 +- ...tml-vf9G2sX7.js => index.html-Ud0Zos-f.js} | 2 +- ...tml-VqeFNyyk.js => index.html-Uu7Eupg5.js} | 2 +- ...tml-98hJQE1V.js => index.html-VUoUY136.js} | 2 +- ...tml-wEmbbtzu.js => index.html-Vht3PBEQ.js} | 2 +- ...tml-moSu92Ti.js => index.html-VpRKBb5o.js} | 2 +- ...tml-RrGBfii6.js => index.html-WASu2T95.js} | 2 +- ...tml-dcS37JKq.js => index.html-X2Gi4GIY.js} | 2 +- ...tml-UAdi2jtU.js => index.html-XMSDWYao.js} | 2 +- ...tml-uY8tN_X4.js => index.html-X_CyS4d0.js} | 2 +- ...tml-YcjenteE.js => index.html-XzAVJ3CG.js} | 2 +- ...tml-hU-axrvG.js => index.html-YLj9MQpu.js} | 2 +- ...tml-vBNZ4m0L.js => index.html-Y_H1tKQ_.js} | 2 +- ...tml-xS9JslX3.js => index.html-Ym9lCym2.js} | 2 +- ...tml-nG6FSSk5.js => index.html-ZauJualt.js} | 2 +- ...tml-XZhO_x0W.js => index.html-_Ef4-0Of.js} | 2 +- ...tml-ZMuIpS6c.js => index.html-_ln2i5-P.js} | 2 +- ...tml-5H3zUw48.js => index.html-a_wSv45V.js} | 2 +- ...tml-QkDQyo7Q.js => index.html-aesCbmQA.js} | 2 +- ...tml-SjREii9h.js => index.html-bbwK6XkQ.js} | 2 +- ...tml-OD32esEy.js => index.html-bt7UO1xo.js} | 2 +- ...tml-VTuwfCCE.js => index.html-bxCqco6-.js} | 2 +- ...tml-DhX6vdce.js => index.html-ctq9zSHa.js} | 2 +- ...tml-pbQnLiRI.js => index.html-cwVFNAda.js} | 2 +- assets/index.html-czHpBbp1.js | 1 + ...tml-IHiIz7ti.js => index.html-dIPTRAjj.js} | 2 +- ...tml-9LWvYvJf.js => index.html-eDM5dFS5.js} | 2 +- ...tml-TrCwWslF.js => index.html-eLzDRIQF.js} | 2 +- ...tml-6z6s2ocp.js => index.html-ev38ZdxY.js} | 2 +- ...tml-iOMix6mD.js => index.html-exQTTyLY.js} | 2 +- ...tml-p5Pg_qkt.js => index.html-fjIZXpuo.js} | 2 +- ...tml-OeaCJOYD.js => index.html-fjQs7H5E.js} | 2 +- ...tml-VsrUWBLa.js => index.html-fnL6KmMG.js} | 2 +- ...tml-yyvhfuS4.js => index.html-g-SNk94n.js} | 2 +- ...tml-E9q0BpxL.js => index.html-g-lURbYW.js} | 2 +- ...tml-yAAtfPRA.js => index.html-g7IFZ7G_.js} | 2 +- ...tml-P-GVqPkq.js => index.html-gBD8K-X8.js} | 2 +- ...tml-CU9BR9sP.js => index.html-gBdMXoqL.js} | 2 +- ...tml-2XYbmDKB.js => index.html-h32hkhC5.js} | 2 +- ...tml-SssOY4Zb.js => index.html-hE-Har5l.js} | 2 +- ...tml-ZEfQwbxY.js => index.html-hsh4fjDy.js} | 2 +- ...tml-o9wQA3cF.js => index.html-i-MMHlcp.js} | 2 +- ...tml-kr7a12_R.js => index.html-i1mgSfOT.js} | 2 +- ...tml-KME69s3l.js => index.html-ibC1JRbc.js} | 2 +- ...tml-wCyt5Bog.js => index.html-idRdJbqu.js} | 2 +- ...tml-agu9Tswz.js => index.html-iuNHJ9u0.js} | 2 +- ...tml-PqQ0uo5u.js => index.html-jA6pdA_t.js} | 2 +- ...tml-14cCgwtd.js => index.html-jV03Xo7p.js} | 2 +- ...tml-Se9AuWN3.js => index.html-jbhoO6oS.js} | 2 +- ...tml-luHOsFrI.js => index.html-kB5LT_k5.js} | 2 +- ...tml-38UUtIUW.js => index.html-lXCBBac6.js} | 2 +- ...tml-MCWjWsAw.js => index.html-mNqFLZ6A.js} | 2 +- ...tml-hR7PYs57.js => index.html-myvTt2O1.js} | 2 +- ...tml-nk-nrgVB.js => index.html-n-TQD5DG.js} | 2 +- ...tml-r2UKxxc1.js => index.html-nBzh5_NL.js} | 2 +- ...tml-Ce5yMMMw.js => index.html-nNjnaUOx.js} | 2 +- ...tml-cTggcwJJ.js => index.html-nbHjCI4E.js} | 2 +- ...tml-48RqkH9L.js => index.html-ndkFXjKu.js} | 2 +- ...tml-omQNpfwb.js => index.html-oB5J5RJE.js} | 2 +- ...tml-UZSmYhmx.js => index.html-oTNaI8Zq.js} | 2 +- ...tml-vI6nL4gW.js => index.html-ogpErsaM.js} | 2 +- ...tml-WGk49Tv5.js => index.html-oss9_NPr.js} | 2 +- ...tml-xfPlmwnO.js => index.html-pW4WP2Sh.js} | 2 +- ...tml-MJ0Gnn_F.js => index.html-poaCb2xU.js} | 2 +- ...tml-NR6J1WpB.js => index.html-pvf-HGge.js} | 2 +- ...tml-4QfykMhJ.js => index.html-pzCTWktT.js} | 2 +- ...tml-OYEwVsMC.js => index.html-q0Xqqilw.js} | 2 +- ...tml-CM4Qw_Xy.js => index.html-qHDzCwT5.js} | 2 +- ...tml-24M_Uygr.js => index.html-qWcyy2kZ.js} | 2 +- ...tml-NQxrG0fz.js => index.html-qcRlqlnK.js} | 2 +- ...tml-6LZc6Qgc.js => index.html-qjj58GcY.js} | 2 +- ...tml-y_SxEoYa.js => index.html-qmnTnY6r.js} | 2 +- ...tml-BHYZ6wGh.js => index.html-qyCDq7xX.js} | 2 +- ...tml-JS2QsVHb.js => index.html-rD4AKpx1.js} | 2 +- ...tml-saQ_y99N.js => index.html-rDZW1GmE.js} | 2 +- ...tml-biNtxuVy.js => index.html-rFvRzY47.js} | 2 +- ...tml-R3RqRDu-.js => index.html-reC06NIi.js} | 2 +- ...tml-0pMmJO2f.js => index.html-rkgsTpEx.js} | 2 +- ...tml-g8q3PkXX.js => index.html-sUYrfL3B.js} | 2 +- ...tml-5emhMzoK.js => index.html-sWh3vQXB.js} | 2 +- ...tml-yMRZy3oz.js => index.html-tRPz2-E6.js} | 2 +- ...tml-ONSG8EPU.js => index.html-tS5cu49v.js} | 2 +- ...tml-oSCTgMYF.js => index.html-t_vO7joq.js} | 2 +- ...tml-2DwvSX-3.js => index.html-tnhdXudS.js} | 2 +- ...tml-GL-fUBiv.js => index.html-uBMV0KJZ.js} | 2 +- ...tml-0st9ukgV.js => index.html-ullx7Kuy.js} | 2 +- ...tml-6e8qEoMy.js => index.html-uvGUJw4d.js} | 2 +- ...tml-8HQ8FKg-.js => index.html-v-DWFIuk.js} | 2 +- ...tml-cUv3aHhf.js => index.html-v0Tcuabu.js} | 2 +- ...tml-kN-Nsdix.js => index.html-vFZDFVW3.js} | 2 +- ...tml-8QoYgqEV.js => index.html-vT57E_ru.js} | 2 +- ...tml-6Pq7OcfA.js => index.html-vx0DB81j.js} | 2 +- ...tml-QsjQIX8R.js => index.html-w8VQYI8z.js} | 2 +- ...tml-P0LXao83.js => index.html-wg-1Cxci.js} | 2 +- ...tml-UOTgR6zC.js => index.html-wuly5niv.js} | 2 +- ...tml-ggqW-JQb.js => index.html-x1gEaREp.js} | 2 +- ...tml-IwYPYSi0.js => index.html-xSha5ig2.js} | 2 +- ...tml-pPFdIPqh.js => index.html-xbfU6A5W.js} | 2 +- ...tml--GC_rvs-.js => index.html-xeADokS7.js} | 2 +- ...tml-WktSnXxw.js => index.html-y5Coax85.js} | 2 +- ...tml-NBSoPrCk.js => index.html-yHhtUDPD.js} | 2 +- ...tml-UyhuCEdI.js => index.html-ySkr2bj2.js} | 2 +- ...tml-s9VJ5-1w.js => index.html-yT7SX3kb.js} | 2 +- ...tml-KBT_DBi1.js => index.html-yh9aPgpr.js} | 2 +- assets/index.html-yt9Xge56.js | 1 + ...tml-SmPk6-es.js => index.html-yvodhWZV.js} | 2 +- ...tml-3ImxJlYz.js => index.html-zQWoWdBH.js} | 2 +- ...tml-h0Bglre2.js => index.html-zqRWhf8b.js} | 2 +- ...tml-kKKFYoZo.js => index.html-zuhL_Xmm.js} | 2 +- ...On.js => infoDiagram-db7b18fc-3Dvf5x-f.js} | 2 +- ...tml-oX3Ek7N2.js => intro.html-aVWLN24f.js} | 2 +- ...js => journeyDiagram-d5636530-oIxwWC6o.js} | 2 +- ...{layout-vhfCKIw6.js => layout-c9rdiZ4H.js} | 2 +- assets/{line-0KVoflyH.js => line-mT-6NujG.js} | 2 +- ...{linear-ZY3LUsi4.js => linear-HkO0wGww.js} | 2 +- ...e-oTI0dw4V.js => mermaid.core-RdWnh729.js} | 8 +- ...> mindmap-definition-377f8f1f-fZozfFch.js} | 2 +- ...eF_.js => pieDiagram-b0208e96-klsHLmfx.js} | 2 +- ...s => quadrantDiagram-0332be45-GeUBZ95u.js} | 2 +- ...> requirementDiagram-bf7890df-giSaRfV5.js} | 2 +- ....js => sankeyDiagram-0acdec17-moTHnuw0.js} | 2 +- ...s => sequenceDiagram-c18d009d-n-wJomEG.js} | 2 +- ...ml-44inynfd.js => slides.html-54Ht2Ryt.js} | 2 +- ...s.js => stateDiagram-43596fc0-A4zK6RbX.js} | 2 +- ...s => stateDiagram-v2-2ead4f9c-GfOOeFYL.js} | 2 +- ...qbrbaNT.js => styles-6860f46c-_a1nXaH0.js} | 2 +- ...88cDJLt.js => styles-7383a064-Mrp4_RJz.js} | 2 +- ...QFbAfhn.js => styles-b2c874b6-n89kVm5z.js} | 2 +- ....js => svgDrawCommon-0ee1b4e9-c7S2S_St.js} | 2 +- ... timeline-definition-d977decf-e99VZsQT.js} | 2 +- ...-repl-966AioC4.js => vue-repl-nQ-EEHLy.js} | 2 +- ...js => xychartDiagram-e50adddc-sdb6I-2e.js} | 2 +- atom.xml | 305 +++++++++--------- .../database/basic/001-hello-database.html | 4 +- .../database/basic/002-relation-model.html | 4 +- backend/database/basic/003-db-design.html | 4 +- .../database/basic/004-advanced-db-model.html | 4 +- backend/database/basic/index.html | 4 +- backend/database/index.html | 4 +- backend/database/mysql/001-install-mysql.html | 4 +- backend/database/mysql/index.html | 4 +- backend/database/sql/01-quick-start.html | 4 +- backend/database/sql/index.html | 4 +- backend/index.html | 4 +- backend/java/index.html | 4 +- backend/java/tool/01-maven.html | 4 +- backend/java/tool/index.html | 4 +- backend/linux/index.html | 4 +- backend/linux/practice/001-set-the-ssh.html | 4 +- .../linux/practice/002-build-git-server.html | 4 +- backend/linux/practice/003-configure-bt.html | 4 +- .../practice/004-automated-deployment.html | 4 +- .../linux/practice/005-install-docker.html | 4 +- backend/linux/practice/index.html | 4 +- .../express/01-overview-architecture.html | 4 +- backend/node/express/02-express.js.html | 4 +- backend/node/express/index.html | 4 +- backend/node/index.html | 4 +- backend/node/module/001-finalhandler.html | 4 +- backend/node/module/index.html | 4 +- category/algorithm/index.html | 6 +- category/browser/index.html | 6 +- category/chakra/index.html | 6 +- category/css/index.html | 6 +- category/database/index.html | 6 +- category/html/index.html | 6 +- category/index.html | 6 +- category/javascript/index.html | 6 +- category/leetcode/index.html | 6 +- category/linux/index.html | 6 +- category/next/index.html | 6 +- category/node/index.html | 6 +- category/operating-system/index.html | 6 +- category/pixi/index.html | 6 +- category/practice/index.html | 6 +- category/project/index.html | 6 +- category/react/index.html | 6 +- category/reading/index.html | 6 +- category/vue/index.html | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- ...\344\272\214\345\217\211\346\240\221.html" | 4 +- ...\346\220\234\347\264\242\346\240\221.html" | 4 +- ...\346\200\201\350\247\204\345\210\222.html" | 4 +- ...\343\200\201\351\223\276\350\241\250.html" | 4 +- computer-science/algorithm/01-array.html | 4 +- computer-science/algorithm/index.html | 4 +- computer-science/index.html | 4 +- .../networking/001-network-model.html | 4 +- .../networking/002-HTTP-overview.html | 4 +- .../networking/003-get-post-difference.html | 4 +- .../networking/004-HTTP-development.html | 4 +- .../networking/005-HTTP-cache.html | 4 +- .../networking/006-HTTPS-overview.html | 4 +- ...7-TCP-three-handshakes-and-four-waves.html | 4 +- computer-science/networking/008-tcp-udp.html | 4 +- ...009-http-code-when-authorized-refused.html | 4 +- computer-science/networking/index.html | 4 +- .../001-character-encoding.html | 4 +- computer-science/operating-system/index.html | 4 +- feed.json | 61 ++-- frontend/basic/css/001-quick-start.html | 4 +- frontend/basic/css/002-selector.html | 4 +- frontend/basic/css/003-box-model.html | 4 +- frontend/basic/css/004-text-font.html | 4 +- .../basic/css/005-cascade-inheritance.html | 4 +- frontend/basic/css/006-background-border.html | 4 +- frontend/basic/css/007-position.html | 4 +- frontend/basic/css/008-float.html | 4 +- frontend/basic/css/009-flex.html | 4 +- frontend/basic/css/010-unit.html | 4 +- frontend/basic/css/011-center.html | 4 +- frontend/basic/css/012-grid.html | 4 +- frontend/basic/css/013-BFC.html | 4 +- .../css/014-responsive-design-intro.html | 4 +- frontend/basic/css/015-responsive-design.html | 4 +- frontend/basic/css/016-how-to-responsive.html | 4 +- frontend/basic/css/017-loading-spinner.html | 4 +- frontend/basic/css/018-autofill.html | 4 +- frontend/basic/css/index.html | 4 +- .../html/0007\343\200\201WebSocket.html" | 4 +- .../html/0008\343\200\201WebStorage.html" | 4 +- frontend/basic/html/001-html-history.html | 4 +- .../html/0010\343\200\201WebWorker.html" | 4 +- frontend/basic/html/002-quick-start.html | 4 +- frontend/basic/html/003-doctype.html | 4 +- frontend/basic/html/004-common-element.html | 4 +- frontend/basic/html/005-advanced-element.html | 4 +- .../006-semantically-meaningful-tags.html | 4 +- frontend/basic/html/007-media-tag.html | 4 +- frontend/basic/html/008-canvas-svg.html | 4 +- frontend/basic/html/009-src-vs-href.html | 4 +- frontend/basic/html/010-html5.html | 4 +- frontend/basic/html/011-defer-vs-async.html | 4 +- frontend/basic/html/012-form-validation.html | 4 +- frontend/basic/html/013-seo.html | 4 +- frontend/basic/html/index.html | 4 +- frontend/basic/index.html | 4 +- .../basic/javascript/001-var-let-const.html | 4 +- ...\345\200\274\347\233\270\347\255\211.html" | 4 +- .../javascript/0012\343\200\201AJAX.html" | 4 +- ...\346\267\261\346\213\267\350\264\235.html" | 4 +- ...\344\273\266\345\276\252\347\216\257.html" | 4 +- frontend/basic/javascript/002-types.html | 4 +- frontend/basic/javascript/003-judge-type.html | 4 +- .../004-primitive-value-reference-value.html | 4 +- .../javascript/005-execution-context.html | 4 +- .../006-toString-toLocalString-valueOf.html | 4 +- .../javascript/007-basic-reference-type.html | 4 +- .../008-collection-reference-type.html | 4 +- .../javascript/009-array-like-object.html | 4 +- .../basic/javascript/010-object-property.html | 4 +- .../basic/javascript/011-create-object.html | 4 +- frontend/basic/javascript/012-extends.html | 4 +- frontend/basic/javascript/013-class.html | 4 +- .../basic/javascript/014-implement-new.html | 4 +- frontend/basic/javascript/015-function.html | 4 +- frontend/basic/javascript/016-this.html | 4 +- .../017-implement-call-apply-bind.html | 4 +- frontend/basic/javascript/index.html | 4 +- .../01-how-browser-rendering-works.html | 4 +- frontend/browser/02-V8.html | 4 +- frontend/browser/03-memory-management.html | 4 +- frontend/browser/04-cross-domain.html | 4 +- ...5-what-happens-after-entering-the-URL.html | 4 +- frontend/browser/index.html | 4 +- .../engineering/basic/001-modularization.html | 8 +- .../basic/002-package-manager.html | 6 +- frontend/engineering/basic/003-tool.html | 6 +- .../basic/004-project-standards.html | 6 +- frontend/engineering/basic/005-yeoman.html | 6 +- frontend/engineering/basic/index.html | 6 +- frontend/engineering/build-tool/index.html | 4 +- .../build-tool/rspack/001-hello-rspack.html | 4 +- .../engineering/build-tool/rspack/index.html | 4 +- .../build-tool/vite/001-hello-vite.html | 4 +- .../engineering/build-tool/vite/index.html | 4 +- .../build-tool/webpack/001-webpack-basic.html | 4 +- .../build-tool/webpack/002-webpack-css.html | 4 +- .../webpack/003-webpack-assets.html | 4 +- .../webpack/004-webpack-plugin.html | 4 +- .../build-tool/webpack/005-webpack-babel.html | 4 +- .../build-tool/webpack/006-webpack-vue.html | 4 +- .../webpack/007-webpack-dev-server.html | 4 +- .../webpack/008-webpack-resolve.html | 4 +- .../webpack/009-webpack-env-split.html | 4 +- .../engineering/build-tool/webpack/index.html | 4 +- frontend/engineering/index.html | 4 +- frontend/engineering/ssr/005-qwik.html | 4 +- .../ssr/006-react-server-component.html | 4 +- .../ssr/007-hydration-is-pure-overhead.html | 4 +- frontend/engineering/ssr/index.html | 4 +- .../framework/chakra/01-getting-started.html | 4 +- frontend/framework/chakra/02-style-props.html | 4 +- frontend/framework/chakra/index.html | 4 +- frontend/framework/index.html | 4 +- frontend/framework/next/index.html | 4 +- .../next/pages-router/01-pages-layouts.html | 4 +- .../framework/next/pages-router/index.html | 4 +- frontend/framework/node/001-module.html | 4 +- frontend/framework/node/index.html | 4 +- frontend/framework/pixi/01-quick-start.html | 4 +- .../pixi/02-architecture-overview.html | 4 +- frontend/framework/pixi/03-render-loop.html | 4 +- frontend/framework/pixi/04-scene-graph.html | 4 +- frontend/framework/pixi/index.html | 4 +- frontend/framework/react/01-useState.html | 4 +- frontend/framework/react/02-useEffect.html | 4 +- frontend/framework/react/index.html | 4 +- ...\344\273\266\351\200\232\344\277\241.html" | 4 +- ...200\201Vuex \345\216\237\347\220\206.html" | 4 +- .../vue/02\343\200\201provide-inject.html" | 4 +- ...\343\200\201\346\217\222\346\247\275.html" | 4 +- ...\346\255\245\347\273\204\344\273\266.html" | 4 +- ...3\204\344\273\266\347\232\204v-model.html" | 4 +- .../framework/vue/06\343\200\201Mixin.html" | 4 +- ...5\274\217API\345\237\272\347\241\200.html" | 4 +- ...\345\274\217\345\207\275\346\225\260.html" | 4 +- ...\343\200\201\346\214\207\344\273\244.html" | 4 +- ...\343\200\201\346\217\222\344\273\266.html" | 4 +- frontend/framework/vue/index.html | 4 +- frontend/index.html | 4 +- frontend/practice/001-dnd-kit.html | 4 +- frontend/practice/002-annotation.html | 4 +- frontend/practice/003-file-upload.html | 4 +- frontend/practice/004-global-upload.html | 4 +- .../practice/005-postcss-px-to-viewport.html | 4 +- frontend/practice/006-animation-svg.html | 4 +- .../007-offline-export-in-highcharts.html | 4 +- ...10-antd-textarea-placeholder-pre-line.html | 4 +- frontend/practice/015-auto-change-node.html | 4 +- frontend/practice/016-rest-client-error.html | 4 +- .../017-whistle-debug-real-phone.html | 4 +- .../practice/018-monaco-editor-react.html | 4 +- frontend/practice/019-ios-prevent-touch.html | 4 +- frontend/practice/020-ios-img.html | 4 +- frontend/practice/index.html | 4 +- index.html | 6 +- intro.html | 4 +- project/RSSHub/index.html | 4 +- project/github-auto-commit/index.html | 4 +- project/imperial-kitchen/01-init.html | 4 +- project/imperial-kitchen/02-server.html | 4 +- project/imperial-kitchen/03-database.html | 4 +- project/imperial-kitchen/04-api.html | 4 +- project/imperial-kitchen/index.html | 4 +- project/index.html | 4 +- project/mini-vue-cli/001-init-project.html | 4 +- project/mini-vue-cli/index.html | 4 +- .../01.vuepress-plugin-ordered-header.html | 4 +- project/plugin/index.html | 4 +- project/ssg/index.html | 4 +- project/tyro-ui/001-init-project.html | 4 +- project/tyro-ui/index.html | 4 +- reading/index.html | 4 +- reading/patterns/index.html | 6 +- .../patterns/vanilla/01-command-pattern.html | 6 +- .../patterns/vanilla/02-factory-pattern.html | 6 +- .../vanilla/03-flyweight-pattern.html | 6 +- .../patterns/vanilla/04-mediator-pattern.html | 6 +- .../vanilla/05-middleware-pattern.html | 8 +- .../patterns/vanilla/06-mixin-pattern.html | 145 +++++++++ .../patterns/vanilla/07-module-pattern.html | 40 +++ reading/patterns/vanilla/index.html | 6 +- .../01-a-pragmatic-philosophy.html | 4 +- .../02-a-pragmatic-approach.html | 4 +- .../pragmatic-programmer/03-basic-tool.html | 4 +- .../04-pragmatic-paranoid.html | 4 +- .../pragmatic-programmer/05-work-around.html | 4 +- .../pragmatic-programmer/06-concurrent.html | 4 +- .../pragmatic-programmer/07-when-coding.html | 4 +- .../08-before-start-project.html | 4 +- .../09-pragmatic-project.html | 4 +- reading/pragmatic-programmer/index.html | 4 +- reading/pro-git/01-getting-started.html | 4 +- reading/pro-git/02-git-basics.html | 4 +- reading/pro-git/03-git-branch.html | 4 +- reading/pro-git/04-git-server.html | 4 +- reading/pro-git/06-change-commit.html | 4 +- reading/pro-git/index.html | 4 +- rss.xml | 272 +++++++--------- service-worker.js | 2 +- service-worker.js.map | 2 +- sitemap.xml | 2 +- slides.html | 4 +- star/index.html | 6 +- survival/index.html | 4 +- survival/okr/2023.html | 4 +- survival/okr/2024.html | 4 +- survival/okr/index.html | 4 +- survival/week/index.html | 4 +- tag/amd/index.html | 6 +- tag/animation/index.html | 6 +- tag/antd/index.html | 6 +- tag/architecture/index.html | 6 +- tag/atomic-css/index.html | 6 +- tag/backend/index.html | 6 +- tag/basic-knowledge/index.html | 6 +- tag/branch/index.html | 6 +- tag/bt/index.html | 6 +- tag/canvas/index.html | 6 +- tag/centos/index.html | 6 +- tag/chakra/index.html | 6 +- tag/cjs/index.html | 6 +- tag/cli/index.html | 6 +- tag/cmd/index.html | 6 +- tag/cnpm/index.html | 6 +- tag/code-editor/index.html | 6 +- tag/command-pattern/index.html | 6 +- tag/commit/index.html | 6 +- tag/computer-science/index.html | 6 +- tag/css/index.html | 6 +- tag/data-model/index.html | 6 +- tag/debug/index.html | 6 +- tag/design-pattern/index.html | 6 +- tag/dnd-kit/index.html | 6 +- tag/docker/index.html | 6 +- tag/effect-hooks/index.html | 6 +- tag/efficiency/index.html | 6 +- tag/esm/index.html | 6 +- tag/express/index.html | 6 +- tag/factory-pattern/index.html | 6 +- tag/flyweight-pattern/index.html | 6 +- tag/form/index.html | 6 +- tag/frontend/index.html | 6 +- tag/git/index.html | 6 +- tag/github-auto-commit/index.html | 6 +- tag/github/index.html | 6 +- tag/grid/index.html | 6 +- tag/highcharts/index.html | 6 +- tag/history/index.html | 6 +- tag/hooks/index.html | 6 +- tag/html/index.html | 6 +- tag/html5/index.html | 6 +- tag/http-code/index.html | 6 +- tag/http/index.html | 6 +- tag/https/index.html | 6 +- tag/index.html | 6 +- tag/init-project/index.html | 6 +- tag/kitchen/index.html | 6 +- tag/langchain/index.html | 6 +- tag/language-advanced/index.html | 6 +- tag/language-basic/index.html | 6 +- tag/mediator-pattern/index.html | 6 +- tag/middleware-pattern/index.html | 6 +- tag/mixin-pattern/index.html | 40 +++ tag/module-pattern/index.html | 40 +++ tag/module/index.html | 6 +- tag/mysql/index.html | 6 +- tag/network/index.html | 6 +- tag/new/index.html | 6 +- tag/next.js/index.html | 6 +- tag/node/index.html | 6 +- tag/npm/index.html | 6 +- tag/object/index.html | 6 +- tag/openai/index.html | 6 +- tag/pages-router/index.html | 6 +- tag/pnpm/index.html | 6 +- tag/postcss/index.html | 6 +- tag/pragmatic/index.html | 6 +- tag/react-core/index.html | 6 +- tag/react/index.html | 6 +- tag/rspack/index.html | 6 +- tag/rss/index.html | 6 +- tag/selector/index.html | 6 +- tag/seo/index.html | 6 +- tag/sql/index.html | 6 +- tag/ssg/index.html | 6 +- tag/ssh/index.html | 6 +- tag/ssr/index.html | 6 +- tag/state-hooks/index.html | 6 +- tag/styled-system/index.html | 6 +- tag/svg/index.html | 6 +- tag/tcp/index.html | 6 +- .../index.html" | 6 +- tag/this/index.html | 6 +- tag/trick/index.html | 6 +- tag/typescript/index.html | 6 +- tag/udp/index.html | 6 +- "tag/v8-\345\274\225\346\223\216/index.html" | 6 +- tag/vanilla/index.html | 6 +- tag/vite/index.html | 6 +- tag/vscode/index.html | 6 +- tag/vuepress/index.html | 6 +- tag/vuex/index.html | 6 +- tag/web-worker/index.html | 6 +- tag/webpack/index.html | 6 +- tag/yarn/index.html | 6 +- tag/yeoman/index.html | 6 +- tag/zsh/index.html | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- "tag/\345\205\274\345\256\271/index.html" | 6 +- "tag/\345\207\275\346\225\260/index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- "tag/\345\270\203\345\261\200/index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- "tag/\346\225\260\347\273\204/index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- "tag/\346\265\256\345\212\250/index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- "tag/\351\223\276\350\241\250/index.html" | 6 +- .../index.html" | 6 +- "tag/\351\241\271\347\233\256/index.html" | 6 +- .../index.html" | 6 +- .../index.html" | 6 +- timeline/index.html | 6 +- 840 files changed, 2067 insertions(+), 1744 deletions(-) rename "assets/0001\343\200\201\344\272\214\345\217\211\346\240\221.html-4auqombs.js" => "assets/0001\343\200\201\344\272\214\345\217\211\346\240\221.html-dZHoE2lD.js" (99%) rename "assets/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html-OF0zcdo8.js" => "assets/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html-BRHkwM8L.js" (99%) rename "assets/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html-BaRf7Si3.js" => "assets/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html-U9YyrO12.js" (99%) rename "assets/0004\343\200\201\351\223\276\350\241\250.html--ickDlYH.js" => "assets/0004\343\200\201\351\223\276\350\241\250.html-DGNJio24.js" (99%) rename "assets/0007\343\200\201WebSocket.html-clDh-CAk.js" => "assets/0007\343\200\201WebSocket.html-rjc6_IG0.js" (99%) rename "assets/0008\343\200\201WebStorage.html-LEVYFRc7.js" => "assets/0008\343\200\201WebStorage.html-5kGJ81lf.js" (99%) rename assets/{001-character-encoding.html-cVILioj-.js => 001-character-encoding.html-E_VDWDGh.js} (98%) rename assets/{001-dnd-kit.html-2XGEbOiO.js => 001-dnd-kit.html-jsyMYY9a.js} (99%) rename assets/{001-finalhandler.html-ovhKFVbX.js => 001-finalhandler.html-s_PiC4wA.js} (98%) rename assets/{001-hello-database.html-aOK2afKr.js => 001-hello-database.html-Zgc4Q_aW.js} (98%) rename assets/{001-hello-rspack.html-bi8TfCOv.js => 001-hello-rspack.html-hPXOzEdL.js} (99%) rename assets/{001-hello-vite.html--F-BEmyI.js => 001-hello-vite.html-7wlT7B5t.js} (99%) rename assets/{001-html-history.html-v0CXXyX7.js => 001-html-history.html-tURB45U7.js} (99%) rename assets/{001-init-project.html-JrVvGhXT.js => 001-init-project.html-9epaxP2F.js} (99%) rename assets/{001-init-project.html-sp9TCZ05.js => 001-init-project.html-txRST9Rg.js} (98%) rename assets/{001-install-mysql.html-8EsZMsqk.js => 001-install-mysql.html-qc7jqvu9.js} (99%) rename assets/{001-modularization.html-C5iw405Z.js => 001-modularization.html-aVDXVF3p.js} (92%) rename assets/{001-module.html-0uMgtzmT.js => 001-module.html-S6GWBUID.js} (99%) rename assets/{001-network-model.html-NoIFtNe7.js => 001-network-model.html-AnQrVYyf.js} (98%) rename assets/{001-quick-start.html-2zV3Q__R.js => 001-quick-start.html-reK2EBPD.js} (99%) rename assets/{001-set-the-ssh.html-aEDPE2NO.js => 001-set-the-ssh.html-_kRdhh4B.js} (99%) rename assets/{001-var-let-const.html-QE4xXk9s.js => 001-var-let-const.html-s47UVxV9.js} (98%) rename assets/{001-webpack-basic.html-pCqwATgK.js => 001-webpack-basic.html-iANhhZl5.js} (99%) rename "assets/0010\343\200\201WebWorker.html-QlxKBHVw.js" => "assets/0010\343\200\201WebWorker.html-z-ry9p5x.js" (96%) rename "assets/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html-qhcibsAO.js" => "assets/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html-Qe14ZYL2.js" (99%) rename "assets/0012\343\200\201AJAX.html-DQSqS6qA.js" => "assets/0012\343\200\201AJAX.html-KSX5mbJA.js" (99%) rename "assets/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html-aQKjlhhK.js" => "assets/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html-KNURvFJh.js" (99%) rename "assets/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html-CHv7YjC_.js" => "assets/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html-RxwjAYeR.js" (98%) rename assets/{002-HTTP-overview.html-t1eJ1tmB.js => 002-HTTP-overview.html-yA9pf-8X.js} (99%) rename assets/{002-annotation.html-oZ12-DLl.js => 002-annotation.html-jSTF0IVD.js} (99%) rename assets/{002-build-git-server.html-C4U8vbpS.js => 002-build-git-server.html-k7ZuvaaM.js} (99%) rename assets/{002-package-manager.html-ooVRb0tm.js => 002-package-manager.html-8ga7lBMd.js} (97%) rename assets/{002-quick-start.html-yQRWabdS.js => 002-quick-start.html-GzDTnx7H.js} (99%) rename assets/{002-relation-model.html-GwrX2GKL.js => 002-relation-model.html-eh9sdhEc.js} (99%) rename assets/{002-selector.html-_GCwigBR.js => 002-selector.html-Y8lG2Qy6.js} (99%) rename assets/{002-types.html-252gQD2-.js => 002-types.html-X5moh2oe.js} (99%) rename assets/{002-webpack-css.html-QMyYbPPn.js => 002-webpack-css.html-C0hFA9Ag.js} (99%) rename assets/{003-box-model.html-XDv8wKIC.js => 003-box-model.html-FIoUn3l-.js} (99%) rename assets/{003-configure-bt.html-3veiWlcs.js => 003-configure-bt.html-3e4O9NhM.js} (99%) rename assets/{003-db-design.html-xMFrXx79.js => 003-db-design.html-Oji9hdtE.js} (99%) rename assets/{003-doctype.html-slx-qvH9.js => 003-doctype.html-3ssLfMA4.js} (99%) rename assets/{003-file-upload.html-aXCMPaU8.js => 003-file-upload.html-PdEE_gdK.js} (99%) rename assets/{003-get-post-difference.html-AcYlQkUc.js => 003-get-post-difference.html-y7Gjbjjy.js} (99%) rename assets/{003-judge-type.html-88H_u1XZ.js => 003-judge-type.html-0nLfDuM_.js} (99%) rename assets/{003-tool.html-k6pbBUqo.js => 003-tool.html-DLnZqT_R.js} (98%) rename assets/{003-webpack-assets.html-NHLlXkyd.js => 003-webpack-assets.html-kB2bMhYm.js} (99%) rename assets/{004-HTTP-development.html-fXKTMLP5.js => 004-HTTP-development.html-BBWBnLvD.js} (99%) rename assets/{004-advanced-db-model.html-ruy78wNd.js => 004-advanced-db-model.html-tGr-G7p6.js} (99%) rename assets/{004-automated-deployment.html-gtM4lpgE.js => 004-automated-deployment.html-wjHFQrWt.js} (99%) rename assets/{004-common-element.html-Xjzjjmz0.js => 004-common-element.html-q8tUaFIS.js} (99%) rename assets/{004-global-upload.html-_IRYzqKH.js => 004-global-upload.html-2q23fxm8.js} (99%) rename assets/{004-primitive-value-reference-value.html-zZRxOtGZ.js => 004-primitive-value-reference-value.html-MLxMLvib.js} (99%) rename assets/{004-project-standards.html-IEck58m4.js => 004-project-standards.html-2vM9DZTK.js} (99%) rename assets/{004-text-font.html-7LU7lsoM.js => 004-text-font.html-ldUSeidH.js} (99%) rename assets/{004-webpack-plugin.html-9kEyMOsf.js => 004-webpack-plugin.html-n3ujVQXJ.js} (99%) rename assets/{005-HTTP-cache.html-93Z7vex3.js => 005-HTTP-cache.html-KgXwqlEv.js} (99%) rename assets/{005-advanced-element.html-Iw8_OFlN.js => 005-advanced-element.html-LXvnYZdN.js} (99%) rename assets/{005-cascade-inheritance.html-PJNtVfy1.js => 005-cascade-inheritance.html-5BhjxfCj.js} (99%) rename assets/{005-execution-context.html-h2_naATY.js => 005-execution-context.html-salfrApg.js} (99%) rename assets/{005-install-docker.html-0N1qwABW.js => 005-install-docker.html-gBSt4qi-.js} (99%) rename assets/{005-postcss-px-to-viewport.html-NXFQc7im.js => 005-postcss-px-to-viewport.html-1cqOLJHS.js} (99%) rename assets/{005-qwik.html-TahGLhP-.js => 005-qwik.html-U4rDkWuK.js} (99%) rename assets/{005-webpack-babel.html-1lDmfMgr.js => 005-webpack-babel.html-Fqs9mfmk.js} (99%) rename assets/{005-yeoman.html-9wj3v3oe.js => 005-yeoman.html-KxN9wacd.js} (99%) rename assets/{006-HTTPS-overview.html-dTO_M_73.js => 006-HTTPS-overview.html-SYoh5fQX.js} (99%) rename assets/{006-animation-svg.html-JwE1dpsg.js => 006-animation-svg.html-8eIQ6Ihw.js} (99%) rename assets/{006-background-border.html-pQQrVWCp.js => 006-background-border.html-RCrBWyb-.js} (99%) rename assets/{006-react-server-component.html-R-ash7ca.js => 006-react-server-component.html-k-YETDuh.js} (99%) rename assets/{006-semantically-meaningful-tags.html-antLdR07.js => 006-semantically-meaningful-tags.html-WThMFqDm.js} (98%) rename assets/{006-toString-toLocalString-valueOf.html-chx5Y-eq.js => 006-toString-toLocalString-valueOf.html-cxsnu0DQ.js} (99%) rename assets/{006-webpack-vue.html-la6H1Wb9.js => 006-webpack-vue.html-1d_xRqtP.js} (99%) rename assets/{007-TCP-three-handshakes-and-four-waves.html-DvEKPAYq.js => 007-TCP-three-handshakes-and-four-waves.html-dYxpKZ12.js} (99%) rename assets/{007-basic-reference-type.html-ye_NfEZd.js => 007-basic-reference-type.html-aceDmBbB.js} (99%) rename assets/{007-hydration-is-pure-overhead.html-SvnUqg0L.js => 007-hydration-is-pure-overhead.html-RuYzXwld.js} (99%) rename assets/{007-media-tag.html-8v4cFuX3.js => 007-media-tag.html-4B2dcBja.js} (99%) rename assets/{007-offline-export-in-highcharts.html-UrRUULFr.js => 007-offline-export-in-highcharts.html-wjbjRKLu.js} (99%) rename assets/{007-position.html-xnmzeXYe.js => 007-position.html-bHWd8Nqh.js} (99%) rename assets/{007-webpack-dev-server.html-UoW4CmYC.js => 007-webpack-dev-server.html-t2yhyF-D.js} (99%) rename assets/{008-canvas-svg.html-Afq3qZFA.js => 008-canvas-svg.html-J5y6viF5.js} (99%) rename assets/{008-collection-reference-type.html-aot29-MR.js => 008-collection-reference-type.html-6hAWB_6B.js} (99%) rename assets/{008-float.html-cC7j6Fly.js => 008-float.html-NWrPV4-8.js} (99%) rename assets/{008-tcp-udp.html-JhmI5mFu.js => 008-tcp-udp.html-rUxlBxzI.js} (99%) rename assets/{008-webpack-resolve.html-Iqw5UzOE.js => 008-webpack-resolve.html-WaOOPcO4.js} (99%) rename assets/{009-array-like-object.html-3HK1Wx8D.js => 009-array-like-object.html-99xk2Ewf.js} (99%) rename assets/{009-flex.html-SyAmrX4g.js => 009-flex.html-UhyQHsgH.js} (99%) rename assets/{009-http-code-when-authorized-refused.html-wOR2ePmW.js => 009-http-code-when-authorized-refused.html-KimibnOR.js} (98%) rename assets/{009-src-vs-href.html-R_B9c0oQ.js => 009-src-vs-href.html-7SGMc5wm.js} (98%) rename assets/{009-webpack-env-split.html-4VesWHbQ.js => 009-webpack-env-split.html-2H2sFtOB.js} (99%) rename assets/{01-a-pragmatic-philosophy.html-nlUzlsGE.js => 01-a-pragmatic-philosophy.html-2Asvolaw.js} (99%) rename assets/{01-array.html-eSTvuSoN.js => 01-array.html-qqj7snQD.js} (99%) rename assets/{01-command-pattern.html-sJvJ55xh.js => 01-command-pattern.html-NToFxAAq.js} (99%) rename assets/{01-getting-started.html-XlgIMo6A.js => 01-getting-started.html-WKDe7Qbs.js} (99%) rename assets/{01-getting-started.html-BoyDoh_2.js => 01-getting-started.html-y0dVi-KY.js} (99%) rename assets/{01-how-browser-rendering-works.html-yfqVgOrF.js => 01-how-browser-rendering-works.html-GwCLJ--h.js} (99%) rename assets/{01-init.html-ecnfoh5n.js => 01-init.html-zmrtRBND.js} (99%) rename assets/{01-maven.html-F0K_vhBd.js => 01-maven.html-2dOiULAq.js} (99%) rename assets/{01-overview-architecture.html-pqHY5Qm9.js => 01-overview-architecture.html-2m6AorPJ.js} (99%) rename assets/{01-pages-layouts.html-tbsDBwEp.js => 01-pages-layouts.html-q0AcGxgI.js} (99%) rename assets/{01-quick-start.html-cNfJxtYv.js => 01-quick-start.html-icBlNGVT.js} (99%) rename assets/{01-quick-start.html-1kCTwmGo.js => 01-quick-start.html-nSD4Idct.js} (99%) rename assets/{01-useState.html-jaIUYZlb.js => 01-useState.html-TAgOQCTv.js} (99%) rename assets/{01.vuepress-plugin-ordered-header.html-G4Pomedj.js => 01.vuepress-plugin-ordered-header.html-q2B5p71G.js} (99%) rename assets/{010-antd-textarea-placeholder-pre-line.html-dyz4BBJw.js => 010-antd-textarea-placeholder-pre-line.html-FmF3dONc.js} (99%) rename assets/{010-html5.html-ov7DEVBH.js => 010-html5.html-IzmK_1on.js} (97%) rename assets/{010-object-property.html-4o3XoTEX.js => 010-object-property.html-CMstI5aK.js} (99%) rename assets/{010-unit.html-Mmr-V3cT.js => 010-unit.html-fJENl0PI.js} (98%) rename assets/{011-center.html-C5Xit3Oi.js => 011-center.html-QIgnh1uy.js} (99%) rename assets/{011-create-object.html-R-m-KNNj.js => 011-create-object.html-i2ltl5i0.js} (99%) rename assets/{011-defer-vs-async.html-VM1cIXwT.js => 011-defer-vs-async.html-BCGYD0Av.js} (98%) rename assets/{012-extends.html-oILfr47G.js => 012-extends.html-0PMdv4Ro.js} (99%) rename assets/{012-form-validation.html-5UKN3JjB.js => 012-form-validation.html-Z8hIzVSe.js} (99%) rename assets/{012-grid.html-3XqGR-dj.js => 012-grid.html-VQlEaWjN.js} (99%) rename assets/{013-BFC.html-oRnppy7q.js => 013-BFC.html-aFsmxXJq.js} (99%) rename assets/{013-class.html-IiH58Ic4.js => 013-class.html-KYMn2F8Y.js} (99%) rename assets/{013-seo.html-iv5Q82Xp.js => 013-seo.html-oy2Hbj6G.js} (99%) rename assets/{014-implement-new.html-sKoB2ySS.js => 014-implement-new.html-42YlTdDK.js} (99%) rename assets/{014-responsive-design-intro.html-iPsvIRFt.js => 014-responsive-design-intro.html-7YdohJT-.js} (99%) rename assets/{015-auto-change-node.html-a3AMX6nS.js => 015-auto-change-node.html-vmI9x_qg.js} (99%) rename assets/{015-function.html-lE3ghf05.js => 015-function.html-0dV-rtlJ.js} (99%) rename assets/{015-responsive-design.html-4WzXXkGD.js => 015-responsive-design.html-zWMQ9SbQ.js} (99%) rename assets/{016-how-to-responsive.html-M9Iwp3xZ.js => 016-how-to-responsive.html-3LyDgIXl.js} (99%) rename assets/{016-rest-client-error.html-p-eY-lWi.js => 016-rest-client-error.html-JHYKZQb6.js} (98%) rename assets/{016-this.html-BWOVpThp.js => 016-this.html-V0F_Y6Ry.js} (99%) rename assets/{017-implement-call-apply-bind.html-pF9-IIfp.js => 017-implement-call-apply-bind.html-inN8CfCD.js} (99%) rename assets/{017-loading-spinner.html-NrAgtaAG.js => 017-loading-spinner.html-RGOKwDDs.js} (98%) rename assets/{017-whistle-debug-real-phone.html-cdCQQvjc.js => 017-whistle-debug-real-phone.html-8fLPP_oc.js} (99%) rename assets/{018-autofill.html-d9_0qC3m.js => 018-autofill.html-k6Z5PbWM.js} (98%) rename assets/{018-monaco-editor-react.html-_kPxgArL.js => 018-monaco-editor-react.html-sSKOAfLt.js} (99%) rename assets/{019-ios-prevent-touch.html-WrR4-Zb-.js => 019-ios-prevent-touch.html-sCERLB9h.js} (99%) rename "assets/01\343\200\201\347\210\266\345\255\220\347\273\204\344\273\266\351\200\232\344\277\241.html-Ur3YppQN.js" => "assets/01\343\200\201\347\210\266\345\255\220\347\273\204\344\273\266\351\200\232\344\277\241.html-tJc86P4B.js" (99%) rename assets/{02-V8.html-IZr6VCnt.js => 02-V8.html-abcG9r2W.js} (99%) rename assets/{02-a-pragmatic-approach.html-6wOj4UWX.js => 02-a-pragmatic-approach.html-JGy5n7BJ.js} (99%) rename assets/{02-architecture-overview.html-8ZZdthIG.js => 02-architecture-overview.html-6076uJDz.js} (98%) rename assets/{02-express.js.html-pkHCz992.js => 02-express.js.html-wRqB8YUW.js} (99%) rename assets/{02-factory-pattern.html-XSFhUFpy.js => 02-factory-pattern.html-Zwdb5ir_.js} (99%) rename assets/{02-git-basics.html-uhff1ajs.js => 02-git-basics.html-c-hemJSp.js} (99%) rename assets/{02-server.html-nDPPJ1I0.js => 02-server.html-sju2MrZY.js} (99%) rename assets/{02-style-props.html-KG0Fp9UW.js => 02-style-props.html-oN7Hm48h.js} (99%) rename assets/{02-useEffect.html-3NUC6b79.js => 02-useEffect.html-7KsZvcwk.js} (99%) rename assets/{020-ios-img.html-XvCdcFCF.js => 020-ios-img.html-qmiwZBqQ.js} (98%) rename "assets/02\343\200\201Vuex \345\216\237\347\220\206.html-NnrN3jKK.js" => "assets/02\343\200\201Vuex \345\216\237\347\220\206.html-hxEjAjw7.js" (99%) rename "assets/02\343\200\201provide-inject.html-OTYzp_vx.js" => "assets/02\343\200\201provide-inject.html--gqiviyZ.js" (99%) rename assets/{03-basic-tool.html-5ZYgKkhx.js => 03-basic-tool.html-g3IuINfV.js} (99%) rename assets/{03-database.html-iZ8Pz1RB.js => 03-database.html-GzHjF5vt.js} (99%) rename assets/{03-flyweight-pattern.html-8q_3lsgm.js => 03-flyweight-pattern.html-IIVmQYZ2.js} (99%) rename assets/{03-git-branch.html-X-MvpUVr.js => 03-git-branch.html-CPKiQy0r.js} (99%) rename assets/{03-memory-management.html-1tFtncAW.js => 03-memory-management.html-zNWUMiQc.js} (99%) rename assets/{03-render-loop.html-qGaAgyJD.js => 03-render-loop.html-dW4TkDPY.js} (99%) rename "assets/03\343\200\201\346\217\222\346\247\275.html-IZ-NFkUC.js" => "assets/03\343\200\201\346\217\222\346\247\275.html-VPX4UrNy.js" (99%) rename assets/{04-api.html-pkUj-_Sw.js => 04-api.html-L9kwFNyo.js} (98%) rename assets/{04-cross-domain.html-SnbAooaC.js => 04-cross-domain.html-hLz1ACuK.js} (98%) rename assets/{04-git-server.html-saxeUmXQ.js => 04-git-server.html-VbjfIz48.js} (97%) rename assets/{04-mediator-pattern.html-P4FmQ5sb.js => 04-mediator-pattern.html-Wk0Fs-dK.js} (99%) rename assets/{04-pragmatic-paranoid.html-XFMDx0LS.js => 04-pragmatic-paranoid.html-JLwUFQv7.js} (98%) rename assets/{04-scene-graph.html-yMu1RW29.js => 04-scene-graph.html-QBvEcXGS.js} (99%) rename "assets/04\343\200\201\345\212\250\346\200\201\347\273\204\344\273\266\345\222\214\345\274\202\346\255\245\347\273\204\344\273\266.html-xMkS9nHj.js" => "assets/04\343\200\201\345\212\250\346\200\201\347\273\204\344\273\266\345\222\214\345\274\202\346\255\245\347\273\204\344\273\266.html-KRYxl05T.js" (99%) rename assets/{05-middleware-pattern.html-wkcOGRem.js => 05-middleware-pattern.html-hSMzJDay.js} (99%) rename assets/{05-what-happens-after-entering-the-URL.html-k-e2Q0RE.js => 05-what-happens-after-entering-the-URL.html-OWWRueDp.js} (99%) rename assets/{05-work-around.html-AZ__xLsT.js => 05-work-around.html-kkeNGkzw.js} (98%) rename "assets/05\343\200\201\347\273\204\344\273\266\347\232\204v-model.html-hymI2g5O.js" => "assets/05\343\200\201\347\273\204\344\273\266\347\232\204v-model.html-oSrQEt5s.js" (99%) rename assets/{06-change-commit.html-rZc35dXJ.js => 06-change-commit.html-yJsOvgbD.js} (98%) rename assets/{06-concurrent.html-R5x_sgEh.js => 06-concurrent.html-4XZcy3em.js} (98%) create mode 100644 assets/06-mixin-pattern.html-xPNxrrXT.js rename "assets/06\343\200\201Mixin.html-LXvYo5XJ.js" => "assets/06\343\200\201Mixin.html-vFrCtzEG.js" (99%) create mode 100644 assets/07-module-pattern.html-PPpx4-1O.js rename assets/{07-when-coding.html-VHzO1FuP.js => 07-when-coding.html-mMkE9Kb1.js} (98%) rename "assets/07\343\200\201\347\273\204\345\220\210\345\274\217API\345\237\272\347\241\200.html-fzqdzynD.js" => "assets/07\343\200\201\347\273\204\345\220\210\345\274\217API\345\237\272\347\241\200.html-sWkWMy6L.js" (99%) rename assets/{08-before-start-project.html-RLsfigWB.js => 08-before-start-project.html-qoPrQxFC.js} (98%) rename "assets/08\343\200\201\347\273\204\345\220\210\345\274\217\345\207\275\346\225\260.html-I7pt9eZc.js" => "assets/08\343\200\201\347\273\204\345\220\210\345\274\217\345\207\275\346\225\260.html-gNvTRZCR.js" (99%) rename assets/{09-pragmatic-project.html-PVXGEU7u.js => 09-pragmatic-project.html-w1zorxVJ.js} (98%) rename "assets/09\343\200\201\346\214\207\344\273\244.html-z9tsn97x.js" => "assets/09\343\200\201\346\214\207\344\273\244.html-KKqSJCFB.js" (95%) rename "assets/10\343\200\201\346\217\222\344\273\266.html-oMYOdKlX.js" => "assets/10\343\200\201\346\217\222\344\273\266.html-_zTLOduh.js" (95%) rename assets/{2023.html-t3q06end.js => 2023.html-gXOG2LdF.js} (99%) rename assets/{2024.html-dchrgZ6a.js => 2024.html-Fl5-sZEu.js} (99%) rename assets/{404.html-uIvc4tSN.js => 404.html-ey9YfrM5.js} (93%) rename assets/{app-2R243if7.js => app-I81jsmus.js} (59%) rename assets/{arc-FolFS303.js => arc-jj2rQ79R.js} (96%) rename assets/{blockDiagram-6b2b5046-VcrT_T_C.js => blockDiagram-6b2b5046-dPjrH4Tz.js} (98%) rename assets/{c4Diagram-b947cdbb-g3DAk4Ib.js => c4Diagram-b947cdbb-6LlQD8gP.js} (99%) delete mode 100644 assets/channel-E06Uohc9.js create mode 100644 assets/channel-_BoElw_v.js rename assets/{classDiagram-35230388-D24NGFi-.js => classDiagram-35230388-WCO95pQ7.js} (97%) rename assets/{classDiagram-v2-412acd34-MgRZZr-Z.js => classDiagram-v2-412acd34-jptX3zzM.js} (92%) create mode 100644 assets/clone-RIIBrVN3.js delete mode 100644 assets/clone-hs9N3Qmu.js rename assets/{codemirror-editor-GJMQnzmw.js => codemirror-editor-j7-Ov7Pm.js} (99%) rename assets/{createText-423428c9-JBHtRGoK.js => createText-423428c9-DMNkaBZH.js} (99%) rename assets/{edges-d417c7a0-uTLZ61Cj.js => edges-d417c7a0-dMLW4fNk.js} (99%) rename assets/{erDiagram-0ea73325-O1f0-Gcb.js => erDiagram-0ea73325-HOSw3jCf.js} (99%) rename assets/{flowDb-d35e309a-d79xoTHo.js => flowDb-d35e309a-JunLwFy6.js} (99%) rename assets/{flowDiagram-d949d7c1-9DQ3Nn7L.js => flowDiagram-d949d7c1-Km3bw0Wv.js} (97%) create mode 100644 assets/flowDiagram-v2-49332944-CeopBWYD.js delete mode 100644 assets/flowDiagram-v2-49332944-jpRhKRK7.js rename assets/{flowchart-elk-definition-27cc417a-gvB_jGnE.js => flowchart-elk-definition-27cc417a-E40wJWYz.js} (99%) rename assets/{ganttDiagram-5c869e3b-7C6Fd_5I.js => ganttDiagram-5c869e3b-PaDnyKb9.js} (99%) rename assets/{gitGraphDiagram-b9d81de9-pTfZTwrI.js => gitGraphDiagram-b9d81de9-ii4rvYx6.js} (99%) rename assets/{graph-vDJi9agi.js => graph-kdm1lDeG.js} (99%) rename assets/{index-8fae9850-mHY5htT3.js => index-8fae9850-AldU4d2Z.js} (96%) rename assets/{index.html-2ZEvTyqm.js => index.html--6TZOf5z.js} (97%) rename assets/{index.html-rr2e2a2C.js => index.html--6exqmtK.js} (94%) rename assets/{index.html-Ez0b591v.js => index.html--F5t8OTY.js} (95%) rename assets/{index.html--rq-pZBd.js => index.html--JPoGlT0.js} (98%) rename assets/{index.html-HOdxw-79.js => index.html--L5HZE0X.js} (93%) rename assets/{index.html-cbiocN7z.js => index.html--VlRPmKi.js} (97%) rename assets/{index.html-2XB4vSRh.js => index.html-0C__MQ28.js} (94%) rename assets/{index.html-pHT5J-DB.js => index.html-0CdTPh7N.js} (93%) rename assets/{index.html-bOd4CKkV.js => index.html-0KCmLuwB.js} (96%) rename assets/{index.html-6nX5abh5.js => index.html-0eyk_dry.js} (99%) rename assets/{index.html-0DpfjzBl.js => index.html-0uRcbDSq.js} (93%) rename assets/{index.html-4CQRZNtv.js => index.html-0wnONOpX.js} (93%) rename assets/{index.html-n3UBXl_A.js => index.html-14MHn-Up.js} (93%) rename assets/{index.html-c4rRs-NN.js => index.html-1Nr8bhuM.js} (94%) rename assets/{index.html-d38JKPow.js => index.html-23cYN8fI.js} (94%) rename assets/{index.html-YpHE7Cx_.js => index.html-31ErRzhC.js} (93%) rename assets/{index.html-X759pPU_.js => index.html-3ghGFG8O.js} (93%) rename assets/{index.html-gUBfRxr2.js => index.html-3nJHAvil.js} (93%) rename assets/{index.html-N_kW9YLo.js => index.html-4Iq9ezl_.js} (94%) rename assets/{index.html-wYo71ybu.js => index.html-4UU_vsFD.js} (94%) rename assets/{index.html-w49iT_oy.js => index.html-4vDv9sc6.js} (94%) rename assets/{index.html-z0YzqgrC.js => index.html-5TDjfNLf.js} (93%) rename assets/{index.html-DfbYiCSB.js => index.html-5bSC_2vH.js} (93%) rename assets/{index.html-QjGLyWCs.js => index.html-66s9zgMZ.js} (94%) rename assets/{index.html-5XHgOxjy.js => index.html-67kf_GGd.js} (94%) rename assets/{index.html-aH_uGVqv.js => index.html-6cowqeov.js} (94%) rename assets/{index.html-VFFAf27P.js => index.html-6qpwIxqQ.js} (94%) rename assets/{index.html-UK93Vd89.js => index.html-6wkUhdzd.js} (93%) rename assets/{index.html-qu3zlAs0.js => index.html-7EzYSmUS.js} (93%) rename assets/{index.html-fXiqRdON.js => index.html-7b-Yq8WZ.js} (93%) rename assets/{index.html-g2XThmuH.js => index.html-7hjLHxps.js} (93%) rename assets/{index.html-ZaikQdSp.js => index.html-8AvS5k6X.js} (93%) rename assets/{index.html-mGdiLQP4.js => index.html-8FWG5OXL.js} (94%) rename assets/{index.html-RE83hP6O.js => index.html-90UyKJBw.js} (93%) rename assets/{index.html-zWMKsbfL.js => index.html-91G785uA.js} (94%) rename assets/{index.html-FZuIpOY_.js => index.html-93LI1O8A.js} (93%) rename assets/{index.html-G90Ce1_P.js => index.html-9E0mn_M3.js} (93%) rename assets/{index.html-pOmA5x9t.js => index.html-9R3u1krZ.js} (93%) rename assets/{index.html-WXkd1m1L.js => index.html-9mtT_v42.js} (93%) rename assets/{index.html-wz0pq5zC.js => index.html-AcDDHBjs.js} (94%) rename assets/{index.html-rNq1W2Zl.js => index.html-AcHcpmyL.js} (93%) rename assets/{index.html-cTdgF5uu.js => index.html-B0zestXk.js} (93%) rename assets/{index.html-8TNIbXKM.js => index.html-B2x9k5tu.js} (93%) rename assets/{index.html-yTMqUL6z.js => index.html-BLPlXPB1.js} (94%) rename assets/{index.html-KdTxVzQB.js => index.html-BLkmkmA_.js} (93%) rename assets/{index.html-1qS3_eHk.js => index.html-BNOp3Mse.js} (94%) rename assets/{index.html-_qN0xDFh.js => index.html-BhnJj992.js} (93%) rename assets/{index.html-KZiYdgNN.js => index.html-Bs3oO7C_.js} (94%) rename assets/{index.html-GPGqn-oS.js => index.html-C360RI7I.js} (94%) rename assets/{index.html-MtNsNwRx.js => index.html-CHWD6_iY.js} (94%) rename assets/{index.html-MGEj_GPV.js => index.html-D6T1DCMH.js} (93%) rename assets/{index.html-vCzwf0Sn.js => index.html-DVi4lX_-.js} (96%) rename assets/{index.html-LGd4fJ-7.js => index.html-E-kz0qY7.js} (93%) rename assets/{index.html-SuQyXgcv.js => index.html-E1HdBVl_.js} (98%) rename assets/{index.html-7J1SFePC.js => index.html-EQdXoVXB.js} (93%) rename assets/{index.html-n8R1JMtH.js => index.html-ERfJaqW-.js} (94%) rename assets/{index.html-NcsXm3WC.js => index.html-F5HnQcet.js} (94%) rename assets/{index.html-xgR8-wRj.js => index.html-F8Nld46U.js} (94%) rename assets/{index.html-1nC4QyoR.js => index.html-FFZ3YKGZ.js} (93%) rename assets/{index.html-ig41yThJ.js => index.html-FnjjrZVb.js} (94%) rename assets/{index.html-3CUydp4K.js => index.html-FoB7MnFp.js} (94%) rename assets/{index.html-7kHbRdSg.js => index.html-G24g2E_r.js} (93%) rename assets/{index.html-515f-G8L.js => index.html-GFPyrhoV.js} (94%) rename assets/{index.html-GDKls1L1.js => index.html-GGbbhDjJ.js} (93%) rename assets/{index.html-w8grGS9G.js => index.html-GYlVtT_i.js} (93%) rename assets/{index.html-QThOMSe4.js => index.html-H1AzmvhU.js} (94%) rename assets/{index.html-dCuwV4c-.js => index.html-HOTiQ-yL.js} (93%) rename assets/{index.html-6PZm1DnQ.js => index.html-HZQfa0vK.js} (93%) rename assets/{index.html-_5kjpK31.js => index.html-Hr6EYV6k.js} (93%) rename assets/{index.html-Wr3ujhrK.js => index.html-I-71DhOf.js} (93%) rename assets/{index.html-BQ5qZrok.js => index.html-Ilj8DScN.js} (93%) rename assets/{index.html-8ChHX9NB.js => index.html-Io97aBuh.js} (98%) rename assets/{index.html-PD4FMCrk.js => index.html-Ith43-eG.js} (93%) rename assets/{index.html-HIFvKPWZ.js => index.html-J6YBbtvY.js} (98%) rename assets/{index.html-D8NQd95K.js => index.html-J8BMHg89.js} (97%) rename assets/{index.html-eYHlm8Wt.js => index.html-JF4gDM7D.js} (94%) rename assets/{index.html--pdyXLPg.js => index.html-JHMCqP3K.js} (93%) rename assets/{index.html-4IHlJjCx.js => index.html-JX1VErOL.js} (93%) rename assets/{index.html-4t0YWChX.js => index.html-JhGcsNxJ.js} (94%) rename assets/{index.html-gQEDS16t.js => index.html-JnfKE5ye.js} (94%) rename assets/{index.html-zNLvzmNu.js => index.html-JpugBYVz.js} (94%) rename assets/{index.html-vCptjdB4.js => index.html-JsjX07PL.js} (94%) rename assets/{index.html-OOLb7v7r.js => index.html-KAO7TBkB.js} (93%) rename assets/{index.html-Lu-6iPu6.js => index.html-KRoADKjE.js} (93%) rename assets/{index.html-L9JXX8_J.js => index.html-KmYW_B6k.js} (94%) rename assets/{index.html-VMaWReow.js => index.html-L7Ue2F8C.js} (98%) rename assets/{index.html-4T6lwsm_.js => index.html-Lt33W2fu.js} (94%) rename assets/{index.html-qkR6G051.js => index.html-MDmNSIgf.js} (93%) rename assets/{index.html-1wIIZvk4.js => index.html-MGvi-vgA.js} (97%) rename assets/{index.html-6QOAi_wy.js => index.html-MQIB_QpV.js} (93%) rename assets/{index.html-NsGWRbqf.js => index.html-MUvLrlGW.js} (93%) rename assets/{index.html-DVInEGrY.js => index.html-NJpwtthw.js} (93%) rename assets/{index.html-ReqWpZHA.js => index.html-NW49SvAU.js} (98%) rename assets/{index.html-7pQDueGH.js => index.html-NleAmsCg.js} (94%) rename assets/{index.html-shaRytHI.js => index.html-NtP5QAzU.js} (93%) rename assets/{index.html-xRFtv6mu.js => index.html-Nxu2qgD8.js} (93%) rename assets/{index.html-z0Rcj3zT.js => index.html-OOfR2c4H.js} (93%) rename assets/{index.html-6PkFsrKl.js => index.html-OfXkBPs5.js} (97%) rename assets/{index.html-qUwdIo1v.js => index.html-Otbm08-E.js} (94%) rename assets/{index.html--FWk7Vul.js => index.html-PSD82k6J.js} (94%) rename assets/{index.html-9AGhSKws.js => index.html-QW4gd68q.js} (93%) rename assets/{index.html-7xhgW9hM.js => index.html-QYtx_6GE.js} (95%) rename assets/{index.html-B1fEnyTH.js => index.html-QrgOJdpu.js} (94%) rename assets/{index.html-WUCyIDuT.js => index.html-RQO6tcOD.js} (94%) rename assets/{index.html-tLYxd7rz.js => index.html-RsY9uX7U.js} (94%) rename assets/{index.html-zHvTH7-y.js => index.html-S3OdPlRp.js} (93%) rename assets/{index.html-ybYFZQb-.js => index.html-STrbfrZI.js} (99%) rename assets/{index.html-XAb12k43.js => index.html-U4OrLyv3.js} (93%) rename assets/{index.html-O2Nw6hi-.js => index.html-U9VUqS42.js} (93%) rename assets/{index.html-UV9Smhks.js => index.html-UO9hy6Wg.js} (98%) rename assets/{index.html-vf9G2sX7.js => index.html-Ud0Zos-f.js} (94%) rename assets/{index.html-VqeFNyyk.js => index.html-Uu7Eupg5.js} (93%) rename assets/{index.html-98hJQE1V.js => index.html-VUoUY136.js} (94%) rename assets/{index.html-wEmbbtzu.js => index.html-Vht3PBEQ.js} (93%) rename assets/{index.html-moSu92Ti.js => index.html-VpRKBb5o.js} (94%) rename assets/{index.html-RrGBfii6.js => index.html-WASu2T95.js} (93%) rename assets/{index.html-dcS37JKq.js => index.html-X2Gi4GIY.js} (94%) rename assets/{index.html-UAdi2jtU.js => index.html-XMSDWYao.js} (95%) rename assets/{index.html-uY8tN_X4.js => index.html-X_CyS4d0.js} (96%) rename assets/{index.html-YcjenteE.js => index.html-XzAVJ3CG.js} (94%) rename assets/{index.html-hU-axrvG.js => index.html-YLj9MQpu.js} (94%) rename assets/{index.html-vBNZ4m0L.js => index.html-Y_H1tKQ_.js} (94%) rename assets/{index.html-xS9JslX3.js => index.html-Ym9lCym2.js} (93%) rename assets/{index.html-nG6FSSk5.js => index.html-ZauJualt.js} (94%) rename assets/{index.html-XZhO_x0W.js => index.html-_Ef4-0Of.js} (94%) rename assets/{index.html-ZMuIpS6c.js => index.html-_ln2i5-P.js} (93%) rename assets/{index.html-5H3zUw48.js => index.html-a_wSv45V.js} (93%) rename assets/{index.html-QkDQyo7Q.js => index.html-aesCbmQA.js} (93%) rename assets/{index.html-SjREii9h.js => index.html-bbwK6XkQ.js} (94%) rename assets/{index.html-OD32esEy.js => index.html-bt7UO1xo.js} (94%) rename assets/{index.html-VTuwfCCE.js => index.html-bxCqco6-.js} (93%) rename assets/{index.html-DhX6vdce.js => index.html-ctq9zSHa.js} (93%) rename assets/{index.html-pbQnLiRI.js => index.html-cwVFNAda.js} (93%) create mode 100644 assets/index.html-czHpBbp1.js rename assets/{index.html-IHiIz7ti.js => index.html-dIPTRAjj.js} (96%) rename assets/{index.html-9LWvYvJf.js => index.html-eDM5dFS5.js} (94%) rename assets/{index.html-TrCwWslF.js => index.html-eLzDRIQF.js} (93%) rename assets/{index.html-6z6s2ocp.js => index.html-ev38ZdxY.js} (93%) rename assets/{index.html-iOMix6mD.js => index.html-exQTTyLY.js} (93%) rename assets/{index.html-p5Pg_qkt.js => index.html-fjIZXpuo.js} (93%) rename assets/{index.html-OeaCJOYD.js => index.html-fjQs7H5E.js} (93%) rename assets/{index.html-VsrUWBLa.js => index.html-fnL6KmMG.js} (94%) rename assets/{index.html-yyvhfuS4.js => index.html-g-SNk94n.js} (93%) rename assets/{index.html-E9q0BpxL.js => index.html-g-lURbYW.js} (96%) rename assets/{index.html-yAAtfPRA.js => index.html-g7IFZ7G_.js} (94%) rename assets/{index.html-P-GVqPkq.js => index.html-gBD8K-X8.js} (94%) rename assets/{index.html-CU9BR9sP.js => index.html-gBdMXoqL.js} (94%) rename assets/{index.html-2XYbmDKB.js => index.html-h32hkhC5.js} (93%) rename assets/{index.html-SssOY4Zb.js => index.html-hE-Har5l.js} (94%) rename assets/{index.html-ZEfQwbxY.js => index.html-hsh4fjDy.js} (93%) rename assets/{index.html-o9wQA3cF.js => index.html-i-MMHlcp.js} (93%) rename assets/{index.html-kr7a12_R.js => index.html-i1mgSfOT.js} (94%) rename assets/{index.html-KME69s3l.js => index.html-ibC1JRbc.js} (94%) rename assets/{index.html-wCyt5Bog.js => index.html-idRdJbqu.js} (94%) rename assets/{index.html-agu9Tswz.js => index.html-iuNHJ9u0.js} (93%) rename assets/{index.html-PqQ0uo5u.js => index.html-jA6pdA_t.js} (93%) rename assets/{index.html-14cCgwtd.js => index.html-jV03Xo7p.js} (94%) rename assets/{index.html-Se9AuWN3.js => index.html-jbhoO6oS.js} (94%) rename assets/{index.html-luHOsFrI.js => index.html-kB5LT_k5.js} (97%) rename assets/{index.html-38UUtIUW.js => index.html-lXCBBac6.js} (93%) rename assets/{index.html-MCWjWsAw.js => index.html-mNqFLZ6A.js} (94%) rename assets/{index.html-hR7PYs57.js => index.html-myvTt2O1.js} (93%) rename assets/{index.html-nk-nrgVB.js => index.html-n-TQD5DG.js} (93%) rename assets/{index.html-r2UKxxc1.js => index.html-nBzh5_NL.js} (93%) rename assets/{index.html-Ce5yMMMw.js => index.html-nNjnaUOx.js} (94%) rename assets/{index.html-cTggcwJJ.js => index.html-nbHjCI4E.js} (94%) rename assets/{index.html-48RqkH9L.js => index.html-ndkFXjKu.js} (93%) rename assets/{index.html-omQNpfwb.js => index.html-oB5J5RJE.js} (93%) rename assets/{index.html-UZSmYhmx.js => index.html-oTNaI8Zq.js} (94%) rename assets/{index.html-vI6nL4gW.js => index.html-ogpErsaM.js} (93%) rename assets/{index.html-WGk49Tv5.js => index.html-oss9_NPr.js} (93%) rename assets/{index.html-xfPlmwnO.js => index.html-pW4WP2Sh.js} (94%) rename assets/{index.html-MJ0Gnn_F.js => index.html-poaCb2xU.js} (94%) rename assets/{index.html-NR6J1WpB.js => index.html-pvf-HGge.js} (93%) rename assets/{index.html-4QfykMhJ.js => index.html-pzCTWktT.js} (94%) rename assets/{index.html-OYEwVsMC.js => index.html-q0Xqqilw.js} (93%) rename assets/{index.html-CM4Qw_Xy.js => index.html-qHDzCwT5.js} (94%) rename assets/{index.html-24M_Uygr.js => index.html-qWcyy2kZ.js} (97%) rename assets/{index.html-NQxrG0fz.js => index.html-qcRlqlnK.js} (97%) rename assets/{index.html-6LZc6Qgc.js => index.html-qjj58GcY.js} (96%) rename assets/{index.html-y_SxEoYa.js => index.html-qmnTnY6r.js} (93%) rename assets/{index.html-BHYZ6wGh.js => index.html-qyCDq7xX.js} (93%) rename assets/{index.html-JS2QsVHb.js => index.html-rD4AKpx1.js} (96%) rename assets/{index.html-saQ_y99N.js => index.html-rDZW1GmE.js} (93%) rename assets/{index.html-biNtxuVy.js => index.html-rFvRzY47.js} (94%) rename assets/{index.html-R3RqRDu-.js => index.html-reC06NIi.js} (94%) rename assets/{index.html-0pMmJO2f.js => index.html-rkgsTpEx.js} (94%) rename assets/{index.html-g8q3PkXX.js => index.html-sUYrfL3B.js} (93%) rename assets/{index.html-5emhMzoK.js => index.html-sWh3vQXB.js} (93%) rename assets/{index.html-yMRZy3oz.js => index.html-tRPz2-E6.js} (93%) rename assets/{index.html-ONSG8EPU.js => index.html-tS5cu49v.js} (95%) rename assets/{index.html-oSCTgMYF.js => index.html-t_vO7joq.js} (94%) rename assets/{index.html-2DwvSX-3.js => index.html-tnhdXudS.js} (94%) rename assets/{index.html-GL-fUBiv.js => index.html-uBMV0KJZ.js} (94%) rename assets/{index.html-0st9ukgV.js => index.html-ullx7Kuy.js} (93%) rename assets/{index.html-6e8qEoMy.js => index.html-uvGUJw4d.js} (97%) rename assets/{index.html-8HQ8FKg-.js => index.html-v-DWFIuk.js} (93%) rename assets/{index.html-cUv3aHhf.js => index.html-v0Tcuabu.js} (93%) rename assets/{index.html-kN-Nsdix.js => index.html-vFZDFVW3.js} (94%) rename assets/{index.html-8QoYgqEV.js => index.html-vT57E_ru.js} (94%) rename assets/{index.html-6Pq7OcfA.js => index.html-vx0DB81j.js} (93%) rename assets/{index.html-QsjQIX8R.js => index.html-w8VQYI8z.js} (93%) rename assets/{index.html-P0LXao83.js => index.html-wg-1Cxci.js} (93%) rename assets/{index.html-UOTgR6zC.js => index.html-wuly5niv.js} (93%) rename assets/{index.html-ggqW-JQb.js => index.html-x1gEaREp.js} (94%) rename assets/{index.html-IwYPYSi0.js => index.html-xSha5ig2.js} (94%) rename assets/{index.html-pPFdIPqh.js => index.html-xbfU6A5W.js} (93%) rename assets/{index.html--GC_rvs-.js => index.html-xeADokS7.js} (97%) rename assets/{index.html-WktSnXxw.js => index.html-y5Coax85.js} (99%) rename assets/{index.html-NBSoPrCk.js => index.html-yHhtUDPD.js} (93%) rename assets/{index.html-UyhuCEdI.js => index.html-ySkr2bj2.js} (93%) rename assets/{index.html-s9VJ5-1w.js => index.html-yT7SX3kb.js} (93%) rename assets/{index.html-KBT_DBi1.js => index.html-yh9aPgpr.js} (94%) create mode 100644 assets/index.html-yt9Xge56.js rename assets/{index.html-SmPk6-es.js => index.html-yvodhWZV.js} (93%) rename assets/{index.html-3ImxJlYz.js => index.html-zQWoWdBH.js} (94%) rename assets/{index.html-h0Bglre2.js => index.html-zqRWhf8b.js} (93%) rename assets/{index.html-kKKFYoZo.js => index.html-zuhL_Xmm.js} (98%) rename assets/{infoDiagram-db7b18fc-dxX5pqOn.js => infoDiagram-db7b18fc-3Dvf5x-f.js} (98%) rename assets/{intro.html-oX3Ek7N2.js => intro.html-aVWLN24f.js} (96%) rename assets/{journeyDiagram-d5636530-d_UN-4yF.js => journeyDiagram-d5636530-oIxwWC6o.js} (98%) rename assets/{layout-vhfCKIw6.js => layout-c9rdiZ4H.js} (99%) rename assets/{line-0KVoflyH.js => line-mT-6NujG.js} (93%) rename assets/{linear-ZY3LUsi4.js => linear-HkO0wGww.js} (99%) rename assets/{mermaid.core-oTI0dw4V.js => mermaid.core-RdWnh729.js} (98%) rename assets/{mindmap-definition-377f8f1f-X6LAIWoO.js => mindmap-definition-377f8f1f-fZozfFch.js} (99%) rename assets/{pieDiagram-b0208e96-s3bLieF_.js => pieDiagram-b0208e96-klsHLmfx.js} (98%) rename assets/{quadrantDiagram-0332be45-gJWC5Gva.js => quadrantDiagram-0332be45-GeUBZ95u.js} (99%) rename assets/{requirementDiagram-bf7890df-oepJXSkv.js => requirementDiagram-bf7890df-giSaRfV5.js} (98%) rename assets/{sankeyDiagram-0acdec17-hfjkW-rC.js => sankeyDiagram-0acdec17-moTHnuw0.js} (99%) rename assets/{sequenceDiagram-c18d009d-GNUSKQJn.js => sequenceDiagram-c18d009d-n-wJomEG.js} (99%) rename assets/{slides.html-44inynfd.js => slides.html-54Ht2Ryt.js} (98%) rename assets/{stateDiagram-43596fc0-s2LDkwDs.js => stateDiagram-43596fc0-A4zK6RbX.js} (97%) rename assets/{stateDiagram-v2-2ead4f9c-_4YEus-U.js => stateDiagram-v2-2ead4f9c-GfOOeFYL.js} (90%) rename assets/{styles-6860f46c-QqbrbaNT.js => styles-6860f46c-_a1nXaH0.js} (99%) rename assets/{styles-7383a064-g88cDJLt.js => styles-7383a064-Mrp4_RJz.js} (97%) rename assets/{styles-b2c874b6-OQFbAfhn.js => styles-b2c874b6-n89kVm5z.js} (99%) rename assets/{svgDrawCommon-0ee1b4e9-UBeRZUOR.js => svgDrawCommon-0ee1b4e9-c7S2S_St.js} (95%) rename assets/{timeline-definition-d977decf-PV3T5b89.js => timeline-definition-d977decf-e99VZsQT.js} (99%) rename assets/{vue-repl-966AioC4.js => vue-repl-nQ-EEHLy.js} (99%) rename assets/{xychartDiagram-e50adddc-XrJ1y6Nb.js => xychartDiagram-e50adddc-sdb6I-2e.js} (99%) create mode 100644 reading/patterns/vanilla/06-mixin-pattern.html create mode 100644 reading/patterns/vanilla/07-module-pattern.html create mode 100644 tag/mixin-pattern/index.html create mode 100644 tag/module-pattern/index.html diff --git a/404.html b/404.html index 2d8f18d122..4edef48f52 100644 --- a/404.html +++ b/404.html @@ -30,11 +30,11 @@ - +
跳至主要內容

404

页面不存在

我们是怎么来到这儿的?

- + diff --git a/article/index.html b/article/index.html index 6ed771cf5d..10e055ef9a 100644 --- a/article/index.html +++ b/article/index.html @@ -30,11 +30,11 @@ 文章 - + -
跳至主要內容
享元模式

patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
中介者模式

patterns大约 2 分钟readingdesign patternvanillamediator-pattern
中间件模式

patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
- +
跳至主要內容
混入模式

patterns大约 3 分钟readingdesign patternvanillamixin-pattern
模块模式

patterns小于 1 分钟readingdesign patternvanillamodule-pattern
享元模式

patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
中介者模式

patterns大约 2 分钟readingdesign patternvanillamediator-pattern
中间件模式

patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
+ diff --git "a/assets/0001\343\200\201\344\272\214\345\217\211\346\240\221.html-4auqombs.js" "b/assets/0001\343\200\201\344\272\214\345\217\211\346\240\221.html-dZHoE2lD.js" similarity index 99% rename from "assets/0001\343\200\201\344\272\214\345\217\211\346\240\221.html-4auqombs.js" rename to "assets/0001\343\200\201\344\272\214\345\217\211\346\240\221.html-dZHoE2lD.js" index 0281d8d95e..2e738bb17e 100644 --- "a/assets/0001\343\200\201\344\272\214\345\217\211\346\240\221.html-4auqombs.js" +++ "b/assets/0001\343\200\201\344\272\214\345\217\211\346\240\221.html-dZHoE2lD.js" @@ -1,4 +1,4 @@ -import{_ as e,r as o,o as c,c as l,a as n,d as t,b as p,e as s}from"./app-2R243if7.js";const i={},u=s('

通常二叉树有两种做法,分别对应着回溯算法和动态规划:

  1. 一次遍历二叉树:用 traverse 函数配合外部变量,实质上是一个回溯框架
  2. 分解问题:通过分解为左右子树问题解决,实质上是动态规划

一次遍历(回溯)

',3),r={id:"二叉树的最大深度",tabindex:"-1"},k={class:"header-anchor",href:"#二叉树的最大深度"},d={href:"https://leetcode.cn/problems/maximum-depth-of-binary-tree/",target:"_blank",rel:"noopener noreferrer"},v=s(`

在前序位置(进入当前节点)中将当前深度 +1,并计算最大深度,再后序位置(离开当前节点)中将深度 -1。本质上就是一个回溯算法。

function maxDepth(root: TreeNode | null): number {
+import{_ as e,r as o,o as c,c as l,a as n,d as t,b as p,e as s}from"./app-I81jsmus.js";const i={},u=s('

通常二叉树有两种做法,分别对应着回溯算法和动态规划:

  1. 一次遍历二叉树:用 traverse 函数配合外部变量,实质上是一个回溯框架
  2. 分解问题:通过分解为左右子树问题解决,实质上是动态规划

一次遍历(回溯)

',3),r={id:"二叉树的最大深度",tabindex:"-1"},k={class:"header-anchor",href:"#二叉树的最大深度"},d={href:"https://leetcode.cn/problems/maximum-depth-of-binary-tree/",target:"_blank",rel:"noopener noreferrer"},v=s(`

在前序位置(进入当前节点)中将当前深度 +1,并计算最大深度,再后序位置(离开当前节点)中将深度 -1。本质上就是一个回溯算法。

function maxDepth(root: TreeNode | null): number {
   let depth: number = 0
   let res: number = 0
 
diff --git "a/assets/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html-OF0zcdo8.js" "b/assets/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html-BRHkwM8L.js"
similarity index 99%
rename from "assets/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html-OF0zcdo8.js"
rename to "assets/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html-BRHkwM8L.js"
index a11ce77b83..a12fbde248 100644
--- "a/assets/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html-OF0zcdo8.js"
+++ "b/assets/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html-BRHkwM8L.js"
@@ -1,4 +1,4 @@
-import{_ as p,r as o,o as c,c as l,a as n,d as a,b as t,e}from"./app-2R243if7.js";const i={},u=n("h2",{id:"特性",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#特性"},[n("span",null,"特性")])],-1),r=n("p",null,"二叉搜索树(BST)特性:",-1),k=n("ol",null,[n("li",null,"对于 BST 的每一个节点 node,左子树的节点都要比当前 node 小,右子树的节点都比当前 node 大;"),n("li",null,"所有左子树和右子树也都是二叉搜索树;"),n("li",null,"二叉搜索树的中序遍历为一个升序的数组。")],-1),d={id:"二叉搜索树中第-k-小的元素",tabindex:"-1"},v={class:"header-anchor",href:"#二叉搜索树中第-k-小的元素"},m={href:"https://leetcode.cn/problems/kth-smallest-element-in-a-bst/",target:"_blank",rel:"noopener noreferrer"},b=e(`

由于二叉搜索树的中序遍历是升序数组,所以找第 k 小的元素可以先生成一个中序遍历的数组,再返回数组中的第 k 个值。也可以直接在中序遍历中直接记录第 k 小的值,然后返回。

这里用第二种方法,利用外部变量保存第 k 大的值。

function kthSmallest(root: TreeNode | null, k: number): number {
+import{_ as p,r as o,o as c,c as l,a as n,d as a,b as t,e}from"./app-I81jsmus.js";const i={},u=n("h2",{id:"特性",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#特性"},[n("span",null,"特性")])],-1),r=n("p",null,"二叉搜索树(BST)特性:",-1),k=n("ol",null,[n("li",null,"对于 BST 的每一个节点 node,左子树的节点都要比当前 node 小,右子树的节点都比当前 node 大;"),n("li",null,"所有左子树和右子树也都是二叉搜索树;"),n("li",null,"二叉搜索树的中序遍历为一个升序的数组。")],-1),d={id:"二叉搜索树中第-k-小的元素",tabindex:"-1"},v={class:"header-anchor",href:"#二叉搜索树中第-k-小的元素"},m={href:"https://leetcode.cn/problems/kth-smallest-element-in-a-bst/",target:"_blank",rel:"noopener noreferrer"},b=e(`

由于二叉搜索树的中序遍历是升序数组,所以找第 k 小的元素可以先生成一个中序遍历的数组,再返回数组中的第 k 个值。也可以直接在中序遍历中直接记录第 k 小的值,然后返回。

这里用第二种方法,利用外部变量保存第 k 大的值。

function kthSmallest(root: TreeNode | null, k: number): number {
   let count = 0, res = 0;
 
   const inorder = function(root: TreeNode | null): number {
diff --git "a/assets/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html-BaRf7Si3.js" "b/assets/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html-U9YyrO12.js"
similarity index 99%
rename from "assets/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html-BaRf7Si3.js"
rename to "assets/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html-U9YyrO12.js"
index 1406519dc5..33b12bd913 100644
--- "a/assets/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html-BaRf7Si3.js"
+++ "b/assets/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html-U9YyrO12.js"
@@ -1,4 +1,4 @@
-import{_ as o,r as e,o as c,c as l,a as n,d as p,b as t,e as s}from"./app-2R243if7.js";const u={},i=s('

动态规划的一般形式是求最值,核心问题就是穷举。将所有可行的子问题答案穷举出来(二叉树的分解问题形式),然后在其中寻找最值。

动态规划需要判断问题是否具备最优子问题,还需要写出正确的状态转移方程,另外,由于动态规划存在重叠子问题,需要优化穷举过程(备忘录或 dp 数组),否则会超时。

基础

动态规划问题其实都可以使用暴力递归求解,如何消除重叠子问题就可以分成备忘录或 dp 数组优化。

',4),k={id:"斐波那契数",tabindex:"-1"},r={class:"header-anchor",href:"#斐波那契数"},d={href:"https://leetcode.cn/problems/fibonacci-number/",target:"_blank",rel:"noopener noreferrer"},m=s(`

暴力递归。

function fib(n: number): number {
+import{_ as o,r as e,o as c,c as l,a as n,d as p,b as t,e as s}from"./app-I81jsmus.js";const u={},i=s('

动态规划的一般形式是求最值,核心问题就是穷举。将所有可行的子问题答案穷举出来(二叉树的分解问题形式),然后在其中寻找最值。

动态规划需要判断问题是否具备最优子问题,还需要写出正确的状态转移方程,另外,由于动态规划存在重叠子问题,需要优化穷举过程(备忘录或 dp 数组),否则会超时。

基础

动态规划问题其实都可以使用暴力递归求解,如何消除重叠子问题就可以分成备忘录或 dp 数组优化。

',4),k={id:"斐波那契数",tabindex:"-1"},r={class:"header-anchor",href:"#斐波那契数"},d={href:"https://leetcode.cn/problems/fibonacci-number/",target:"_blank",rel:"noopener noreferrer"},m=s(`

暴力递归。

function fib(n: number): number {
   if (n == 0 || n == 1) return n
 
   return fib(n - 1) + fib(n - 2)
diff --git "a/assets/0004\343\200\201\351\223\276\350\241\250.html--ickDlYH.js" "b/assets/0004\343\200\201\351\223\276\350\241\250.html-DGNJio24.js"
similarity index 99%
rename from "assets/0004\343\200\201\351\223\276\350\241\250.html--ickDlYH.js"
rename to "assets/0004\343\200\201\351\223\276\350\241\250.html-DGNJio24.js"
index b93749ede7..5743de0468 100644
--- "a/assets/0004\343\200\201\351\223\276\350\241\250.html--ickDlYH.js"
+++ "b/assets/0004\343\200\201\351\223\276\350\241\250.html-DGNJio24.js"
@@ -1,4 +1,4 @@
-import{_ as p,r as o,o as c,c as l,a as n,d as a,b as e,e as t}from"./app-2R243if7.js";const i={},r={id:"反转链表",tabindex:"-1"},u={class:"header-anchor",href:"#反转链表"},d={href:"https://leetcode.cn/problems/reverse-linked-list/",target:"_blank",rel:"noopener noreferrer"},k=t(`
function reverseList(head: ListNode | null): ListNode | null {
+import{_ as p,r as o,o as c,c as l,a as n,d as a,b as e,e as t}from"./app-I81jsmus.js";const i={},r={id:"反转链表",tabindex:"-1"},u={class:"header-anchor",href:"#反转链表"},d={href:"https://leetcode.cn/problems/reverse-linked-list/",target:"_blank",rel:"noopener noreferrer"},k=t(`
function reverseList(head: ListNode | null): ListNode | null {
   let pre = null, cur = head
 
   while (cur) {
diff --git "a/assets/0007\343\200\201WebSocket.html-clDh-CAk.js" "b/assets/0007\343\200\201WebSocket.html-rjc6_IG0.js"
similarity index 99%
rename from "assets/0007\343\200\201WebSocket.html-clDh-CAk.js"
rename to "assets/0007\343\200\201WebSocket.html-rjc6_IG0.js"
index 4f16d56d05..7245ade1a0 100644
--- "a/assets/0007\343\200\201WebSocket.html-clDh-CAk.js"
+++ "b/assets/0007\343\200\201WebSocket.html-rjc6_IG0.js"
@@ -1,4 +1,4 @@
-import{_ as n,o as a,c as s,e}from"./app-2R243if7.js";const t={},p=e(`

WebSocket 是 HTML5 一种协议,是在 http 协议上实现了 socket 协议的长链接,只需要客户端和服务端建立一次连接,就可以互相传送数据。

主要应用在网页即时通讯和服务端消息推送中,使客户端和服务端之间的交互变得更加简单。

http 协议是客户端请求,服务端响应,而 socket 协议可以使服务端主动向客户端发送消息。

传统 ajax 对比

ajax 轮询,如果同时请求认输更多会出现高并发情况,

客户端可以让客户端和服务端链接,这个链接不会诶关闭,无序平凡建立同搭配,减小服务器压力

2. 主要应用场景和工作原理

3. 相关 API 介绍

创建ws对象, var ws = new WebSocket(url)

监听链接通道(事件)ws.onopen=function() {}

监听服务端消息

发送消息

监听通道关闭

4.案例

客户端使用开发socket

后端使用php

服务端启动方式

监听接口

if ("WebSocket" in window) {
+import{_ as n,o as a,c as s,e}from"./app-I81jsmus.js";const t={},p=e(`

WebSocket 是 HTML5 一种协议,是在 http 协议上实现了 socket 协议的长链接,只需要客户端和服务端建立一次连接,就可以互相传送数据。

主要应用在网页即时通讯和服务端消息推送中,使客户端和服务端之间的交互变得更加简单。

http 协议是客户端请求,服务端响应,而 socket 协议可以使服务端主动向客户端发送消息。

传统 ajax 对比

ajax 轮询,如果同时请求认输更多会出现高并发情况,

客户端可以让客户端和服务端链接,这个链接不会诶关闭,无序平凡建立同搭配,减小服务器压力

2. 主要应用场景和工作原理

3. 相关 API 介绍

创建ws对象, var ws = new WebSocket(url)

监听链接通道(事件)ws.onopen=function() {}

监听服务端消息

发送消息

监听通道关闭

4.案例

客户端使用开发socket

后端使用php

服务端启动方式

监听接口

if ("WebSocket" in window) {
   // 1. 船舰是对象
   var ws = new WebSocetker('')
   // 2.监听链接通道
diff --git "a/assets/0008\343\200\201WebStorage.html-LEVYFRc7.js" "b/assets/0008\343\200\201WebStorage.html-5kGJ81lf.js"
similarity index 99%
rename from "assets/0008\343\200\201WebStorage.html-LEVYFRc7.js"
rename to "assets/0008\343\200\201WebStorage.html-5kGJ81lf.js"
index c7dab574b7..289e814edd 100644
--- "a/assets/0008\343\200\201WebStorage.html-LEVYFRc7.js"
+++ "b/assets/0008\343\200\201WebStorage.html-5kGJ81lf.js"
@@ -1,4 +1,4 @@
-import{_ as n,o as s,c as a,e}from"./app-2R243if7.js";const t={},o=e(`

在使用 Vuex、Pinia 等状态管理库的时候,网页刷新会导致所有数据清空。因此需要用到本地存储,前端本地存储的方式有三种:cookie、localStorage 和 sessionStorage。

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

Cookie 主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

Cookie 的特点:

Cookie 的大小受限,一般为 4 KB;同一个域名下存放 Cookie 的个数是有限制的,不同浏览器的个数不一样,一般为 20 个;Cookie 支持设置过期时间,当过期时自动销毁;每次发起同域下的 HTTP 请求时,都会携带当前域名下的 Cookie;支持设置为 HttpOnly,防止 Cookie 被客户端的 JavaScript 访问。

document.cookie = "msg1=hello";
+import{_ as n,o as s,c as a,e}from"./app-I81jsmus.js";const t={},o=e(`

在使用 Vuex、Pinia 等状态管理库的时候,网页刷新会导致所有数据清空。因此需要用到本地存储,前端本地存储的方式有三种:cookie、localStorage 和 sessionStorage。

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

Cookie 主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

Cookie 的特点:

Cookie 的大小受限,一般为 4 KB;同一个域名下存放 Cookie 的个数是有限制的,不同浏览器的个数不一样,一般为 20 个;Cookie 支持设置过期时间,当过期时自动销毁;每次发起同域下的 HTTP 请求时,都会携带当前域名下的 Cookie;支持设置为 HttpOnly,防止 Cookie 被客户端的 JavaScript 访问。

document.cookie = "msg1=hello";
 document.cookie = "msg2=cookie";
 
 console.log(document.cookie); // msg1=hello;msg2=cookie
diff --git a/assets/001-character-encoding.html-cVILioj-.js b/assets/001-character-encoding.html-E_VDWDGh.js
similarity index 98%
rename from assets/001-character-encoding.html-cVILioj-.js
rename to assets/001-character-encoding.html-E_VDWDGh.js
index 26050e1109..1764602948 100644
--- a/assets/001-character-encoding.html-cVILioj-.js
+++ b/assets/001-character-encoding.html-E_VDWDGh.js
@@ -1 +1 @@
-import{_ as o,o as r,c as n,a as e,d as t}from"./app-2R243if7.js";const c={},a=e("p",null,"在计算机中,所有数据都是以二进制数的形式存储的,字符也不例外。为了表示字符,我们需要建立一套「字符集」,规定每个字符和二进制数之间的一一对应关系。有了字符集之后,计算机就可以通过查表完成二进制数到字符的转换。",-1),i=e("p",null,"Joel Spolsky",-1),l=e("p",null,[t("The Absolute"),e("br"),t(" Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and"),e("br"),t(" Character Sets (No Excuses!)")],-1),s=e("p",null,"Mathias Bynens",-1),p=e("p",null,[t("JavaScript’s Internal Character Encoding:"),e("br"),t(" UCS-2 or UTF-16?")],-1),m=[a,i,l,s,p];function d(u,h){return r(),n("div",null,m)}const y=o(c,[["render",d],["__file","001-character-encoding.html.vue"]]),_=JSON.parse('{"path":"/computer-science/operating-system/001-character-encoding.html","title":"字符编码","lang":"zh-CN","frontmatter":{"title":"字符编码","date":"2024-01-24T00:00:00.000Z","icon":"Encode-File","category":["operating-system"],"tag":["computer-science","basic-knowledge"],"description":"在计算机中,所有数据都是以二进制数的形式存储的,字符也不例外。为了表示字符,我们需要建立一套「字符集」,规定每个字符和二进制数之间的一一对应关系。有了字符集之后,计算机就可以通过查表完成二进制数到字符的转换。 Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, P...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/computer-science/operating-system/001-character-encoding.html"}],["meta",{"property":"og:title","content":"字符编码"}],["meta",{"property":"og:description","content":"在计算机中,所有数据都是以二进制数的形式存储的,字符也不例外。为了表示字符,我们需要建立一套「字符集」,规定每个字符和二进制数之间的一一对应关系。有了字符集之后,计算机就可以通过查表完成二进制数到字符的转换。 Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, P..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-04-19T05:03:42.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"computer-science"}],["meta",{"property":"article:tag","content":"basic-knowledge"}],["meta",{"property":"article:published_time","content":"2024-01-24T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-04-19T05:03:42.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"字符编码\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2024-01-24T00:00:00.000Z\\",\\"dateModified\\":\\"2024-04-19T05:03:42.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[],"git":{"createdTime":1679734257000,"updatedTime":1713503022000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":4}]},"readingTime":{"minutes":0.48,"words":145},"filePathRelative":"computer-science/operating-system/001-character-encoding.md","localizedDate":"2024年1月24日","excerpt":"","autoDesc":true}');export{y as comp,_ as data};
+import{_ as o,o as r,c as n,a as e,d as t}from"./app-I81jsmus.js";const c={},a=e("p",null,"在计算机中,所有数据都是以二进制数的形式存储的,字符也不例外。为了表示字符,我们需要建立一套「字符集」,规定每个字符和二进制数之间的一一对应关系。有了字符集之后,计算机就可以通过查表完成二进制数到字符的转换。",-1),i=e("p",null,"Joel Spolsky",-1),l=e("p",null,[t("The Absolute"),e("br"),t(" Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and"),e("br"),t(" Character Sets (No Excuses!)")],-1),s=e("p",null,"Mathias Bynens",-1),p=e("p",null,[t("JavaScript’s Internal Character Encoding:"),e("br"),t(" UCS-2 or UTF-16?")],-1),m=[a,i,l,s,p];function d(u,h){return r(),n("div",null,m)}const y=o(c,[["render",d],["__file","001-character-encoding.html.vue"]]),_=JSON.parse('{"path":"/computer-science/operating-system/001-character-encoding.html","title":"字符编码","lang":"zh-CN","frontmatter":{"title":"字符编码","date":"2024-01-24T00:00:00.000Z","icon":"Encode-File","category":["operating-system"],"tag":["computer-science","basic-knowledge"],"description":"在计算机中,所有数据都是以二进制数的形式存储的,字符也不例外。为了表示字符,我们需要建立一套「字符集」,规定每个字符和二进制数之间的一一对应关系。有了字符集之后,计算机就可以通过查表完成二进制数到字符的转换。 Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, P...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/computer-science/operating-system/001-character-encoding.html"}],["meta",{"property":"og:title","content":"字符编码"}],["meta",{"property":"og:description","content":"在计算机中,所有数据都是以二进制数的形式存储的,字符也不例外。为了表示字符,我们需要建立一套「字符集」,规定每个字符和二进制数之间的一一对应关系。有了字符集之后,计算机就可以通过查表完成二进制数到字符的转换。 Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, P..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-04-19T05:03:42.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"computer-science"}],["meta",{"property":"article:tag","content":"basic-knowledge"}],["meta",{"property":"article:published_time","content":"2024-01-24T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-04-19T05:03:42.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"字符编码\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2024-01-24T00:00:00.000Z\\",\\"dateModified\\":\\"2024-04-19T05:03:42.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[],"git":{"createdTime":1679734257000,"updatedTime":1713503022000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":4}]},"readingTime":{"minutes":0.48,"words":145},"filePathRelative":"computer-science/operating-system/001-character-encoding.md","localizedDate":"2024年1月24日","excerpt":"","autoDesc":true}');export{y as comp,_ as data};
diff --git a/assets/001-dnd-kit.html-2XGEbOiO.js b/assets/001-dnd-kit.html-jsyMYY9a.js
similarity index 99%
rename from assets/001-dnd-kit.html-2XGEbOiO.js
rename to assets/001-dnd-kit.html-jsyMYY9a.js
index 8d2356751e..571259f27f 100644
--- a/assets/001-dnd-kit.html-2XGEbOiO.js
+++ b/assets/001-dnd-kit.html-jsyMYY9a.js
@@ -1,4 +1,4 @@
-import{_ as p,r as o,o as c,c as i,a as n,d as a,b as t,e}from"./app-2R243if7.js";const l={},r=e(`

@dnd-kit - 用于 React 的轻量级、模块化、高性能、可访问和可扩展的拖放工具包。

Context Provider

const SortableItem = (props: {
+import{_ as p,r as o,o as c,c as i,a as n,d as a,b as t,e}from"./app-I81jsmus.js";const l={},r=e(`

@dnd-kit - 用于 React 的轻量级、模块化、高性能、可访问和可扩展的拖放工具包。

Context Provider

const SortableItem = (props: {
   id: string
   itemRender: () => ReactElement
 }) => {
diff --git a/assets/001-finalhandler.html-ovhKFVbX.js b/assets/001-finalhandler.html-s_PiC4wA.js
similarity index 98%
rename from assets/001-finalhandler.html-ovhKFVbX.js
rename to assets/001-finalhandler.html-s_PiC4wA.js
index 81051d94df..a00ee52c59 100644
--- a/assets/001-finalhandler.html-ovhKFVbX.js
+++ b/assets/001-finalhandler.html-s_PiC4wA.js
@@ -1 +1 @@
-import{_ as n,r,o as l,c as o,a as e,d as t,b as i,e as d}from"./app-2R243if7.js";const c={},p={href:"https://github.com/pillarjs/finalhandler",target:"_blank",rel:"noopener noreferrer"},h=d('

具体来说,finalhandler 模块实现了以下功能:

处理未匹配的路由

当请求经过所有中间件和路由后,finalhandler 会检查是否已经发送了响应。如果没有,则认为请求未被处理(即未匹配到任何路由),并返回一个 404 状态码("Not Found")。

处理未捕获的错误

如果请求处理过程中抛出了错误(无论是在中间件还是在路由处理程序中),而这些错误没有被处理,那么 finalhandler 会捕获到这些错误,并根据错误类型返回适当的 HTTP 状态码。常见的错误处理包括返回 500 状态码("Internal Server Error"),以及输出错误信息(在开发环境中)。

处理不同的响应类型

finalhandler 会根据请求的 Accept 头信息,决定返回纯文本错误信息还是返回 HTML 格式的错误页面。

日志记录

在处理错误时,finalhandler 可以记录错误日志,帮助开发者排查问题。

简而言之,finalhandler 是 Express 应用的最后一道防线,确保所有请求都能得到适当的处理,即使发生了未预料的错误或未匹配的路由。

',10);function s(m,f){const a=r("ExternalLinkIcon");return l(),o("div",null,[e("p",null,[e("a",p,[t("finalhandler"),i(a)]),t(" 模块在 Express.js 中用于处理未处理的请求或错误,是请求处理的最后一个步骤。它确保了当请求经过所有中间件和路由后,如果没有响应或者发生了错误,应用仍然能够正确地处理这些情况,并返回适当的 HTTP 响应。")]),h])}const g=n(c,[["render",s],["__file","001-finalhandler.html.vue"]]),b=JSON.parse('{"path":"/backend/node/module/001-finalhandler.html","title":"finalhandler","lang":"zh-CN","frontmatter":{"title":"finalhandler","date":"2024-08-27T00:00:00.000Z","icon":"handle","category":["node"],"tag":["module"],"description":"finalhandler 模块在 Express.js 中用于处理未处理的请求或错误,是请求处理的最后一个步骤。它确保了当请求经过所有中间件和路由后,如果没有响应或者发生了错误,应用仍然能够正确地处理这些情况,并返回适当的 HTTP 响应。 具体来说,finalhandler 模块实现了以下功能: 处理未匹配的路由 当请求经过所有中间件和路由后,fin...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/backend/node/module/001-finalhandler.html"}],["meta",{"property":"og:title","content":"finalhandler"}],["meta",{"property":"og:description","content":"finalhandler 模块在 Express.js 中用于处理未处理的请求或错误,是请求处理的最后一个步骤。它确保了当请求经过所有中间件和路由后,如果没有响应或者发生了错误,应用仍然能够正确地处理这些情况,并返回适当的 HTTP 响应。 具体来说,finalhandler 模块实现了以下功能: 处理未匹配的路由 当请求经过所有中间件和路由后,fin..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-08-27T08:07:17.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"module"}],["meta",{"property":"article:published_time","content":"2024-08-27T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-27T08:07:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"finalhandler\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2024-08-27T00:00:00.000Z\\",\\"dateModified\\":\\"2024-08-27T08:07:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 处理未匹配的路由","slug":"处理未匹配的路由","link":"#处理未匹配的路由","children":[]},{"level":2,"title":"2 处理未捕获的错误","slug":"处理未捕获的错误","link":"#处理未捕获的错误","children":[]},{"level":2,"title":"3 处理不同的响应类型","slug":"处理不同的响应类型","link":"#处理不同的响应类型","children":[]},{"level":2,"title":"4 日志记录","slug":"日志记录","link":"#日志记录","children":[]}],"git":{"createdTime":1724746037000,"updatedTime":1724746037000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":1.37,"words":410},"filePathRelative":"backend/node/module/001-finalhandler.md","localizedDate":"2024年8月27日","excerpt":"","autoDesc":true}');export{g as comp,b as data}; +import{_ as n,r,o as l,c as o,a as e,d as t,b as i,e as d}from"./app-I81jsmus.js";const c={},p={href:"https://github.com/pillarjs/finalhandler",target:"_blank",rel:"noopener noreferrer"},h=d('

具体来说,finalhandler 模块实现了以下功能:

处理未匹配的路由

当请求经过所有中间件和路由后,finalhandler 会检查是否已经发送了响应。如果没有,则认为请求未被处理(即未匹配到任何路由),并返回一个 404 状态码("Not Found")。

处理未捕获的错误

如果请求处理过程中抛出了错误(无论是在中间件还是在路由处理程序中),而这些错误没有被处理,那么 finalhandler 会捕获到这些错误,并根据错误类型返回适当的 HTTP 状态码。常见的错误处理包括返回 500 状态码("Internal Server Error"),以及输出错误信息(在开发环境中)。

处理不同的响应类型

finalhandler 会根据请求的 Accept 头信息,决定返回纯文本错误信息还是返回 HTML 格式的错误页面。

日志记录

在处理错误时,finalhandler 可以记录错误日志,帮助开发者排查问题。

简而言之,finalhandler 是 Express 应用的最后一道防线,确保所有请求都能得到适当的处理,即使发生了未预料的错误或未匹配的路由。

',10);function s(m,f){const a=r("ExternalLinkIcon");return l(),o("div",null,[e("p",null,[e("a",p,[t("finalhandler"),i(a)]),t(" 模块在 Express.js 中用于处理未处理的请求或错误,是请求处理的最后一个步骤。它确保了当请求经过所有中间件和路由后,如果没有响应或者发生了错误,应用仍然能够正确地处理这些情况,并返回适当的 HTTP 响应。")]),h])}const g=n(c,[["render",s],["__file","001-finalhandler.html.vue"]]),b=JSON.parse('{"path":"/backend/node/module/001-finalhandler.html","title":"finalhandler","lang":"zh-CN","frontmatter":{"title":"finalhandler","date":"2024-08-27T00:00:00.000Z","icon":"handle","category":["node"],"tag":["module"],"description":"finalhandler 模块在 Express.js 中用于处理未处理的请求或错误,是请求处理的最后一个步骤。它确保了当请求经过所有中间件和路由后,如果没有响应或者发生了错误,应用仍然能够正确地处理这些情况,并返回适当的 HTTP 响应。 具体来说,finalhandler 模块实现了以下功能: 处理未匹配的路由 当请求经过所有中间件和路由后,fin...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/backend/node/module/001-finalhandler.html"}],["meta",{"property":"og:title","content":"finalhandler"}],["meta",{"property":"og:description","content":"finalhandler 模块在 Express.js 中用于处理未处理的请求或错误,是请求处理的最后一个步骤。它确保了当请求经过所有中间件和路由后,如果没有响应或者发生了错误,应用仍然能够正确地处理这些情况,并返回适当的 HTTP 响应。 具体来说,finalhandler 模块实现了以下功能: 处理未匹配的路由 当请求经过所有中间件和路由后,fin..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-08-27T08:07:17.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"module"}],["meta",{"property":"article:published_time","content":"2024-08-27T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-27T08:07:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"finalhandler\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2024-08-27T00:00:00.000Z\\",\\"dateModified\\":\\"2024-08-27T08:07:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 处理未匹配的路由","slug":"处理未匹配的路由","link":"#处理未匹配的路由","children":[]},{"level":2,"title":"2 处理未捕获的错误","slug":"处理未捕获的错误","link":"#处理未捕获的错误","children":[]},{"level":2,"title":"3 处理不同的响应类型","slug":"处理不同的响应类型","link":"#处理不同的响应类型","children":[]},{"level":2,"title":"4 日志记录","slug":"日志记录","link":"#日志记录","children":[]}],"git":{"createdTime":1724746037000,"updatedTime":1724746037000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":1.37,"words":410},"filePathRelative":"backend/node/module/001-finalhandler.md","localizedDate":"2024年8月27日","excerpt":"","autoDesc":true}');export{g as comp,b as data}; diff --git a/assets/001-hello-database.html-aOK2afKr.js b/assets/001-hello-database.html-Zgc4Q_aW.js similarity index 98% rename from assets/001-hello-database.html-aOK2afKr.js rename to assets/001-hello-database.html-Zgc4Q_aW.js index 819490e230..1711e061c0 100644 --- a/assets/001-hello-database.html-aOK2afKr.js +++ b/assets/001-hello-database.html-Zgc4Q_aW.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,e as i}from"./app-2R243if7.js";const o={},n=i('

数据库系统

数据库:由「数据库管理系统(database management system, DBMS)」管理的数据的集合。

具有以下功能:

  1. 使用特殊的「数据定义语言」定义数据库,并说明数据的逻辑结构;
  2. 使用合适的「查询语言」为用户提供查询和更新数据的能力;
  3. 支持超大数据量;
  4. 具有持久性;
  5. 不允许一个用户的操作影响另一个用户(独立性)、不允许对数据的不完整操作(原子性)。

目前一般是关系型数据库和非关系型数据库。

提示

数据组织成表的形式呈现给用户,这种形式称为关系。

数据库问题的复杂性在于:「信息集成」,即如何把包含多个相关数据库中的信息连接在一起成为一整个数据库。

目前解决该问题的方法一般是:

  • 「数据仓库」:通过合适的转换技术,将来自多个遗留数据库的信息周期性的复制到中央数据库;
  • 「协调器」或「中间件」:支持各类数据库数据的整合模型,实现整合模型和实际数据库模型间的信息转换。

提示

一般可以使用 Node 实现中间件。

',10),l=[n];function r(c,s){return t(),a("div",null,l)}const d=e(o,[["render",r],["__file","001-hello-database.html.vue"]]),m=JSON.parse('{"path":"/backend/database/basic/001-hello-database.html","title":"数据库基础","lang":"zh-CN","frontmatter":{"title":"数据库基础","date":"2024-01-15T00:00:00.000Z","icon":"STARTUP","category":["database"],"tag":["backend"],"description":"数据库系统 数据库:由「数据库管理系统(database management system, DBMS)」管理的数据的集合。 具有以下功能: 使用特殊的「数据定义语言」定义数据库,并说明数据的逻辑结构; 使用合适的「查询语言」为用户提供查询和更新数据的能力; 支持超大数据量; 具有持久性; 不允许一个用户的操作影响另一个用户(独立性)、不允许对数据的...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/backend/database/basic/001-hello-database.html"}],["meta",{"property":"og:title","content":"数据库基础"}],["meta",{"property":"og:description","content":"数据库系统 数据库:由「数据库管理系统(database management system, DBMS)」管理的数据的集合。 具有以下功能: 使用特殊的「数据定义语言」定义数据库,并说明数据的逻辑结构; 使用合适的「查询语言」为用户提供查询和更新数据的能力; 支持超大数据量; 具有持久性; 不允许一个用户的操作影响另一个用户(独立性)、不允许对数据的..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T15:40:10.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"backend"}],["meta",{"property":"article:published_time","content":"2024-01-15T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-15T15:40:10.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"数据库基础\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2024-01-15T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-15T15:40:10.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 数据库系统","slug":"数据库系统","link":"#数据库系统","children":[]}],"git":{"createdTime":1705333210000,"updatedTime":1705333210000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":1.15,"words":344},"filePathRelative":"backend/database/basic/001-hello-database.md","localizedDate":"2024年1月15日","excerpt":"","autoDesc":true}');export{d as comp,m as data}; +import{_ as e,o as t,c as a,e as i}from"./app-I81jsmus.js";const o={},n=i('

数据库系统

数据库:由「数据库管理系统(database management system, DBMS)」管理的数据的集合。

具有以下功能:

  1. 使用特殊的「数据定义语言」定义数据库,并说明数据的逻辑结构;
  2. 使用合适的「查询语言」为用户提供查询和更新数据的能力;
  3. 支持超大数据量;
  4. 具有持久性;
  5. 不允许一个用户的操作影响另一个用户(独立性)、不允许对数据的不完整操作(原子性)。

目前一般是关系型数据库和非关系型数据库。

提示

数据组织成表的形式呈现给用户,这种形式称为关系。

数据库问题的复杂性在于:「信息集成」,即如何把包含多个相关数据库中的信息连接在一起成为一整个数据库。

目前解决该问题的方法一般是:

  • 「数据仓库」:通过合适的转换技术,将来自多个遗留数据库的信息周期性的复制到中央数据库;
  • 「协调器」或「中间件」:支持各类数据库数据的整合模型,实现整合模型和实际数据库模型间的信息转换。

提示

一般可以使用 Node 实现中间件。

',10),l=[n];function r(c,s){return t(),a("div",null,l)}const d=e(o,[["render",r],["__file","001-hello-database.html.vue"]]),m=JSON.parse('{"path":"/backend/database/basic/001-hello-database.html","title":"数据库基础","lang":"zh-CN","frontmatter":{"title":"数据库基础","date":"2024-01-15T00:00:00.000Z","icon":"STARTUP","category":["database"],"tag":["backend"],"description":"数据库系统 数据库:由「数据库管理系统(database management system, DBMS)」管理的数据的集合。 具有以下功能: 使用特殊的「数据定义语言」定义数据库,并说明数据的逻辑结构; 使用合适的「查询语言」为用户提供查询和更新数据的能力; 支持超大数据量; 具有持久性; 不允许一个用户的操作影响另一个用户(独立性)、不允许对数据的...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/backend/database/basic/001-hello-database.html"}],["meta",{"property":"og:title","content":"数据库基础"}],["meta",{"property":"og:description","content":"数据库系统 数据库:由「数据库管理系统(database management system, DBMS)」管理的数据的集合。 具有以下功能: 使用特殊的「数据定义语言」定义数据库,并说明数据的逻辑结构; 使用合适的「查询语言」为用户提供查询和更新数据的能力; 支持超大数据量; 具有持久性; 不允许一个用户的操作影响另一个用户(独立性)、不允许对数据的..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T15:40:10.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"backend"}],["meta",{"property":"article:published_time","content":"2024-01-15T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-15T15:40:10.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"数据库基础\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2024-01-15T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-15T15:40:10.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 数据库系统","slug":"数据库系统","link":"#数据库系统","children":[]}],"git":{"createdTime":1705333210000,"updatedTime":1705333210000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":1.15,"words":344},"filePathRelative":"backend/database/basic/001-hello-database.md","localizedDate":"2024年1月15日","excerpt":"","autoDesc":true}');export{d as comp,m as data}; diff --git a/assets/001-hello-rspack.html-bi8TfCOv.js b/assets/001-hello-rspack.html-hPXOzEdL.js similarity index 99% rename from assets/001-hello-rspack.html-bi8TfCOv.js rename to assets/001-hello-rspack.html-hPXOzEdL.js index b0c4153100..53c0f3e535 100644 --- a/assets/001-hello-rspack.html-bi8TfCOv.js +++ b/assets/001-hello-rspack.html-hPXOzEdL.js @@ -1,4 +1,4 @@ -import{_ as p,r,o as l,c as o,a,d as t,b as s,e as n}from"./app-2R243if7.js";const i={},c=n(`

Why Rspack?

面对大型项目,开发和生产环境的构建需要耗费很长时间。

组内实际项目在生产环境中构建需要接近 30 分钟。

按照官方说法,Rspack 拥有:

  • 快速的 Dev 启动性能
  • 高效的 Build 性能
  • 灵活的配置
  • 生产环境的优化能力

Rspack 创建项目

使用 Rspack CLI:

pnpm create rspack@latest
+import{_ as p,r,o as l,c as o,a,d as t,b as s,e as n}from"./app-I81jsmus.js";const i={},c=n(`

Why Rspack?

面对大型项目,开发和生产环境的构建需要耗费很长时间。

组内实际项目在生产环境中构建需要接近 30 分钟。

按照官方说法,Rspack 拥有:

  • 快速的 Dev 启动性能
  • 高效的 Build 性能
  • 灵活的配置
  • 生产环境的优化能力

Rspack 创建项目

使用 Rspack CLI:

pnpm create rspack@latest
 

目前支持三种模版:

  • react
  • react-ts
  • vue

用该命令创建的项目 Rspack 不是最新,因此选择从零开始。 (11 月 29 日 已适配为最新版本。)

从零开始

安装相关依赖。

pnpm init
 pnpm install react react-dom
 pnpm install -D typescript @types/react @types/react-dom
diff --git a/assets/001-hello-vite.html--F-BEmyI.js b/assets/001-hello-vite.html-7wlT7B5t.js
similarity index 99%
rename from assets/001-hello-vite.html--F-BEmyI.js
rename to assets/001-hello-vite.html-7wlT7B5t.js
index 4e27b9f41d..6395ca85c3 100644
--- a/assets/001-hello-vite.html--F-BEmyI.js
+++ b/assets/001-hello-vite.html-7wlT7B5t.js
@@ -1,4 +1,4 @@
-import{_ as p,r as i,o,c,a as s,d as n,b as a,w as d,e}from"./app-2R243if7.js";const u="/blog/assets/image/frontend/tool/vite/001/esm-problem.png",r="/blog/assets/image/frontend/tool/vite/001/esm-vite.png",v="/blog/assets/image/frontend/tool/vite/001/bundle.png",k="/blog/assets/image/frontend/tool/vite/001/vite.png",m={},g={href:"https://github.com/Stephen-wzw/vite-demo",target:"_blank",rel:"noopener noreferrer"},b=e(`

通过前面对 webpack 的学习,我们已经看到了它的强大,为什么还需要学习 Vite 呢?

Vite 官方文档中提到,当我们开始构建越来越大型的应用时,需要处理的 JavaScript 代码量也呈指数级增长。包含数千个模块的大型项目相当普遍。我们开始遇到性能瓶颈 —— 使用 JavaScript 开发的工具通常需要很长时间(甚至是几分钟!)才能启动开发服务器,即使使用 HMR,文件修改后的效果也需要几秒钟才能在浏览器中反映出来。如此循环往复,迟钝的反馈会极大地影响开发者的开发效率和幸福感。

事实也确实如此,webpack 虽好,但是每次重新打包或者热更新都需要比较长的时间,同时还需要繁琐的配置,每次使用 loader 或者 plugin 都需要写上配置文件。

Vite 给我们提供了开箱即用的配置,同时它也具有高度的可扩展性,并有完整的类型支持。它主要由两部分组成:

  • 一个开发服务器,它基于原生 ES 模块提供了丰富的内建功能,如速度快到惊人的模块热更新(HMR)。
  • 一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。

开始

新建项目,初始化 npm,然后本地安装 vite

mkdir vite-demo
+import{_ as p,r as i,o,c,a as s,d as n,b as a,w as d,e}from"./app-I81jsmus.js";const u="/blog/assets/image/frontend/tool/vite/001/esm-problem.png",r="/blog/assets/image/frontend/tool/vite/001/esm-vite.png",v="/blog/assets/image/frontend/tool/vite/001/bundle.png",k="/blog/assets/image/frontend/tool/vite/001/vite.png",m={},g={href:"https://github.com/Stephen-wzw/vite-demo",target:"_blank",rel:"noopener noreferrer"},b=e(`

通过前面对 webpack 的学习,我们已经看到了它的强大,为什么还需要学习 Vite 呢?

Vite 官方文档中提到,当我们开始构建越来越大型的应用时,需要处理的 JavaScript 代码量也呈指数级增长。包含数千个模块的大型项目相当普遍。我们开始遇到性能瓶颈 —— 使用 JavaScript 开发的工具通常需要很长时间(甚至是几分钟!)才能启动开发服务器,即使使用 HMR,文件修改后的效果也需要几秒钟才能在浏览器中反映出来。如此循环往复,迟钝的反馈会极大地影响开发者的开发效率和幸福感。

事实也确实如此,webpack 虽好,但是每次重新打包或者热更新都需要比较长的时间,同时还需要繁琐的配置,每次使用 loader 或者 plugin 都需要写上配置文件。

Vite 给我们提供了开箱即用的配置,同时它也具有高度的可扩展性,并有完整的类型支持。它主要由两部分组成:

  • 一个开发服务器,它基于原生 ES 模块提供了丰富的内建功能,如速度快到惊人的模块热更新(HMR)。
  • 一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。

开始

新建项目,初始化 npm,然后本地安装 vite

mkdir vite-demo
 cd vite-demo
 npm init -y
 npm install vite -D
diff --git a/assets/001-html-history.html-v0CXXyX7.js b/assets/001-html-history.html-tURB45U7.js
similarity index 99%
rename from assets/001-html-history.html-v0CXXyX7.js
rename to assets/001-html-history.html-tURB45U7.js
index 02e1c57582..461cb6c875 100644
--- a/assets/001-html-history.html-v0CXXyX7.js
+++ b/assets/001-html-history.html-tURB45U7.js
@@ -1 +1 @@
-import{_ as l,r,o as i,c as a,a as e,d as t,b as o,e as s}from"./app-2R243if7.js";const c={},p=s('

历史

1990 年,Tim Berners-Lee 创建了 HTML,旨在使科学研究人员可以更容易地在不同的计算机系统之间共享文档。

随着互联网的不断发展,HTML 不仅能插入普通的文本,还可以插入图片、音视频、链接等超文本内容,逐渐成为创建网页的标准语言。

在最初的五年(1990-1995)中,HTML 先后在 CERN(欧洲核子研究中心) 和 IETF(互联网工程任务组) 托管。

  • 1991-1993 年,由 IETF 发布各项草案。
  • 1995 年,HTML 2.0 发布。

在 IETF 主持下,HTML 的进一步发展由于利益冲突而停滞不前。因此,1994 年,Berners-Lee 为了 Web 发展而成立了 W3C,随后 HTML 标准由 W3C 指定。

',6),h={href:"https://zh.wikipedia.org/wiki/%E6%B5%8F%E8%A7%88%E5%99%A8%E5%A4%A7%E6%88%98",target:"_blank",rel:"noopener noreferrer"},d=e("li",null,[t("1997 年,"),e("strong",null,"HTML 3.2"),t(" 发布,它引入了一些重要的新特性,如表格、框架、样式表等。")],-1),m=e("li",null,[t("1998 年,"),e("strong",null,"HTML 4.0"),t(" 发布,它引入了一些新的特性,如嵌套标签、样式表、客户端脚本等。")],-1),T=e("li",null,[t("1999 年,"),e("strong",null,"HTML 4.01"),t(" 发布,它是 HTML 4.0 的一个修订版,它主要是修复了一些错误和不规范的用法。")],-1),u=e("p",null,"在 HTML 4.01 之后,W3C 决定停止发展 HTML,开始开发 XHTML(可扩展超文本标记语言),它是 HTML 的一个基于 XML 的变种。XHTML 更加严格,更加规范,具有更好的可读性和可维护性,但也更加复杂和冗长。",-1),_=e("p",null,"XHTML 1.0 对 HTML4 进行了重新表述,除了加入新的序列化之外,没有增加任何新特性,这项工作于 2000 年完成。在 XHTML 1.0 之后,W3C 的重点转向使其他组织更容易扩展 XHTML。与此同时,W3C 还开发了一种与早期 HTML 和 XHTML 语言不兼容的新语言,命名为 XHTML2。",-1),L=e("p",null,"2004 年,在 W3C 的一次研讨会上,Mozilla 和 Opera 联合向 W3C 提案认为应该重新发展 HTML。然而,由于该提案与之前选择的 Web 发展方向相冲突,该提案被拒绝,W3C 员工和成员投票决定继续开发基于 XML 的替代品。",-1),H=e("p",null,"此后不久,Apple、 Mozilla 和 Opera 共同宣布成立 WHATWG(Web Hypertext Application Technology Working Group,网页超文本应用技术工作小组)开始开发 HTML5。",-1),M=e("p",null,"2006 年,W3C 表示有兴趣参与 HTML5 的开发,并于 2007 年成立了一个特许工作组,与 WHATWG 合作开发 HTML5 规范。",-1),g=e("p",null,[t("2008 年,WHATWG 与 W3C 共同交付 "),e("strong",null,"HTML5"),t(",并于 2014 年 10 月 28 日完成标准化。")],-1),b={href:"https://html.spec.whatwg.org/multipage/",target:"_blank",rel:"noopener noreferrer"},y=e("div",{class:"hint-container tip"},[e("p",{class:"hint-container-title"},"总结"),e("p",null,"HTML 主要版本:"),e("ul",null,[e("li",null,"HTML 2.0"),e("li",null,"HTML 3.2"),e("li",null,"HTML 4.0"),e("li",null,"HTML 5")])],-1),W=e("h2",{id:"参考",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#参考"},[e("span",null,"参考")])],-1),f={href:"https://html.spec.whatwg.org/multipage/introduction.html#history-2",target:"_blank",rel:"noopener noreferrer"},w={href:"https://en.wikipedia.org/wiki/HTML",target:"_blank",rel:"noopener noreferrer"};function C(k,E){const n=r("ExternalLinkIcon");return i(),a("div",null,[p,e("ul",null,[e("li",null,[t("1995 年,W3C 第一次扩展 HTML 的尝试失败,该标准被称为 HTML 3.0,详情见 "),e("a",h,[t("浏览器大战"),o(n)]),t("。")]),d,m,T]),u,_,L,H,M,g,e("p",null,[t("2019 年,WHATWG 和 W3C 签署了一项协议,双方合作开发 HTML 的单一版本: "),e("a",b,[t("HTML Living Standard"),o(n)]),t("。")]),y,W,e("ul",null,[e("li",null,[e("a",f,[t("WHATWG"),o(n)])]),e("li",null,[e("a",w,[t("维基百科"),o(n)])])])])}const x=l(c,[["render",C],["__file","001-html-history.html.vue"]]),z=JSON.parse('{"path":"/frontend/basic/html/001-html-history.html","title":"历史","lang":"zh-CN","frontmatter":{"title":"历史","date":"2023-03-22T00:00:00.000Z","icon":"history","category":["HTML"],"tag":["frontend","html","basic-knowledge","history"],"description":"历史 1990 年,Tim Berners-Lee 创建了 HTML,旨在使科学研究人员可以更容易地在不同的计算机系统之间共享文档。 随着互联网的不断发展,HTML 不仅能插入普通的文本,还可以插入图片、音视频、链接等超文本内容,逐渐成为创建网页的标准语言。 在最初的五年(1990-1995)中,HTML 先后在 CERN(欧洲核子研究中心) 和 IE...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/basic/html/001-html-history.html"}],["meta",{"property":"og:title","content":"历史"}],["meta",{"property":"og:description","content":"历史 1990 年,Tim Berners-Lee 创建了 HTML,旨在使科学研究人员可以更容易地在不同的计算机系统之间共享文档。 随着互联网的不断发展,HTML 不仅能插入普通的文本,还可以插入图片、音视频、链接等超文本内容,逐渐成为创建网页的标准语言。 在最初的五年(1990-1995)中,HTML 先后在 CERN(欧洲核子研究中心) 和 IE..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-07T05:30:24.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:tag","content":"html"}],["meta",{"property":"article:tag","content":"basic-knowledge"}],["meta",{"property":"article:tag","content":"history"}],["meta",{"property":"article:published_time","content":"2023-03-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-07T05:30:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"历史\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-03-22T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-07T05:30:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 历史","slug":"历史","link":"#历史","children":[]},{"level":2,"title":"2 参考","slug":"参考","link":"#参考","children":[]}],"git":{"createdTime":1679457808000,"updatedTime":1707283824000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":3},{"name":"Stephen-wzw","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":2.48,"words":744},"filePathRelative":"frontend/basic/html/001-html-history.md","localizedDate":"2023年3月22日","excerpt":"","autoDesc":true}');export{x as comp,z as data}; +import{_ as l,r,o as i,c as a,a as e,d as t,b as o,e as s}from"./app-I81jsmus.js";const c={},p=s('

历史

1990 年,Tim Berners-Lee 创建了 HTML,旨在使科学研究人员可以更容易地在不同的计算机系统之间共享文档。

随着互联网的不断发展,HTML 不仅能插入普通的文本,还可以插入图片、音视频、链接等超文本内容,逐渐成为创建网页的标准语言。

在最初的五年(1990-1995)中,HTML 先后在 CERN(欧洲核子研究中心) 和 IETF(互联网工程任务组) 托管。

  • 1991-1993 年,由 IETF 发布各项草案。
  • 1995 年,HTML 2.0 发布。

在 IETF 主持下,HTML 的进一步发展由于利益冲突而停滞不前。因此,1994 年,Berners-Lee 为了 Web 发展而成立了 W3C,随后 HTML 标准由 W3C 指定。

',6),h={href:"https://zh.wikipedia.org/wiki/%E6%B5%8F%E8%A7%88%E5%99%A8%E5%A4%A7%E6%88%98",target:"_blank",rel:"noopener noreferrer"},d=e("li",null,[t("1997 年,"),e("strong",null,"HTML 3.2"),t(" 发布,它引入了一些重要的新特性,如表格、框架、样式表等。")],-1),m=e("li",null,[t("1998 年,"),e("strong",null,"HTML 4.0"),t(" 发布,它引入了一些新的特性,如嵌套标签、样式表、客户端脚本等。")],-1),T=e("li",null,[t("1999 年,"),e("strong",null,"HTML 4.01"),t(" 发布,它是 HTML 4.0 的一个修订版,它主要是修复了一些错误和不规范的用法。")],-1),u=e("p",null,"在 HTML 4.01 之后,W3C 决定停止发展 HTML,开始开发 XHTML(可扩展超文本标记语言),它是 HTML 的一个基于 XML 的变种。XHTML 更加严格,更加规范,具有更好的可读性和可维护性,但也更加复杂和冗长。",-1),_=e("p",null,"XHTML 1.0 对 HTML4 进行了重新表述,除了加入新的序列化之外,没有增加任何新特性,这项工作于 2000 年完成。在 XHTML 1.0 之后,W3C 的重点转向使其他组织更容易扩展 XHTML。与此同时,W3C 还开发了一种与早期 HTML 和 XHTML 语言不兼容的新语言,命名为 XHTML2。",-1),L=e("p",null,"2004 年,在 W3C 的一次研讨会上,Mozilla 和 Opera 联合向 W3C 提案认为应该重新发展 HTML。然而,由于该提案与之前选择的 Web 发展方向相冲突,该提案被拒绝,W3C 员工和成员投票决定继续开发基于 XML 的替代品。",-1),H=e("p",null,"此后不久,Apple、 Mozilla 和 Opera 共同宣布成立 WHATWG(Web Hypertext Application Technology Working Group,网页超文本应用技术工作小组)开始开发 HTML5。",-1),M=e("p",null,"2006 年,W3C 表示有兴趣参与 HTML5 的开发,并于 2007 年成立了一个特许工作组,与 WHATWG 合作开发 HTML5 规范。",-1),g=e("p",null,[t("2008 年,WHATWG 与 W3C 共同交付 "),e("strong",null,"HTML5"),t(",并于 2014 年 10 月 28 日完成标准化。")],-1),b={href:"https://html.spec.whatwg.org/multipage/",target:"_blank",rel:"noopener noreferrer"},y=e("div",{class:"hint-container tip"},[e("p",{class:"hint-container-title"},"总结"),e("p",null,"HTML 主要版本:"),e("ul",null,[e("li",null,"HTML 2.0"),e("li",null,"HTML 3.2"),e("li",null,"HTML 4.0"),e("li",null,"HTML 5")])],-1),W=e("h2",{id:"参考",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#参考"},[e("span",null,"参考")])],-1),f={href:"https://html.spec.whatwg.org/multipage/introduction.html#history-2",target:"_blank",rel:"noopener noreferrer"},w={href:"https://en.wikipedia.org/wiki/HTML",target:"_blank",rel:"noopener noreferrer"};function C(k,E){const n=r("ExternalLinkIcon");return i(),a("div",null,[p,e("ul",null,[e("li",null,[t("1995 年,W3C 第一次扩展 HTML 的尝试失败,该标准被称为 HTML 3.0,详情见 "),e("a",h,[t("浏览器大战"),o(n)]),t("。")]),d,m,T]),u,_,L,H,M,g,e("p",null,[t("2019 年,WHATWG 和 W3C 签署了一项协议,双方合作开发 HTML 的单一版本: "),e("a",b,[t("HTML Living Standard"),o(n)]),t("。")]),y,W,e("ul",null,[e("li",null,[e("a",f,[t("WHATWG"),o(n)])]),e("li",null,[e("a",w,[t("维基百科"),o(n)])])])])}const x=l(c,[["render",C],["__file","001-html-history.html.vue"]]),z=JSON.parse('{"path":"/frontend/basic/html/001-html-history.html","title":"历史","lang":"zh-CN","frontmatter":{"title":"历史","date":"2023-03-22T00:00:00.000Z","icon":"history","category":["HTML"],"tag":["frontend","html","basic-knowledge","history"],"description":"历史 1990 年,Tim Berners-Lee 创建了 HTML,旨在使科学研究人员可以更容易地在不同的计算机系统之间共享文档。 随着互联网的不断发展,HTML 不仅能插入普通的文本,还可以插入图片、音视频、链接等超文本内容,逐渐成为创建网页的标准语言。 在最初的五年(1990-1995)中,HTML 先后在 CERN(欧洲核子研究中心) 和 IE...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/basic/html/001-html-history.html"}],["meta",{"property":"og:title","content":"历史"}],["meta",{"property":"og:description","content":"历史 1990 年,Tim Berners-Lee 创建了 HTML,旨在使科学研究人员可以更容易地在不同的计算机系统之间共享文档。 随着互联网的不断发展,HTML 不仅能插入普通的文本,还可以插入图片、音视频、链接等超文本内容,逐渐成为创建网页的标准语言。 在最初的五年(1990-1995)中,HTML 先后在 CERN(欧洲核子研究中心) 和 IE..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-07T05:30:24.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:tag","content":"html"}],["meta",{"property":"article:tag","content":"basic-knowledge"}],["meta",{"property":"article:tag","content":"history"}],["meta",{"property":"article:published_time","content":"2023-03-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-07T05:30:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"历史\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-03-22T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-07T05:30:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 历史","slug":"历史","link":"#历史","children":[]},{"level":2,"title":"2 参考","slug":"参考","link":"#参考","children":[]}],"git":{"createdTime":1679457808000,"updatedTime":1707283824000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":3},{"name":"Stephen-wzw","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":2.48,"words":744},"filePathRelative":"frontend/basic/html/001-html-history.md","localizedDate":"2023年3月22日","excerpt":"","autoDesc":true}');export{x as comp,z as data}; diff --git a/assets/001-init-project.html-JrVvGhXT.js b/assets/001-init-project.html-9epaxP2F.js similarity index 99% rename from assets/001-init-project.html-JrVvGhXT.js rename to assets/001-init-project.html-9epaxP2F.js index ac5af7e5a1..2686e3b06e 100644 --- a/assets/001-init-project.html-JrVvGhXT.js +++ b/assets/001-init-project.html-9epaxP2F.js @@ -1,4 +1,4 @@ -import{_ as p,r as o,o as i,c as l,a as n,d as a,b as e,e as t}from"./app-2R243if7.js";const c={},r=t(`

初始化项目

新建 tyro-ui 项目并初始化。

mkdir tyro-ui && cd tyro-ui
+import{_ as p,r as o,o as i,c as l,a as n,d as a,b as e,e as t}from"./app-I81jsmus.js";const c={},r=t(`

初始化项目

新建 tyro-ui 项目并初始化。

mkdir tyro-ui && cd tyro-ui
 npm init -y
 

初始化 git 仓库,添加 .gitignore 文件。

git init
 

.gitignore

node_modules
diff --git a/assets/001-init-project.html-sp9TCZ05.js b/assets/001-init-project.html-txRST9Rg.js
similarity index 98%
rename from assets/001-init-project.html-sp9TCZ05.js
rename to assets/001-init-project.html-txRST9Rg.js
index 2eac4d8c96..8c56227f0b 100644
--- a/assets/001-init-project.html-sp9TCZ05.js
+++ b/assets/001-init-project.html-txRST9Rg.js
@@ -1,4 +1,4 @@
-import{_ as e,o as n,c as s,e as a}from"./app-2R243if7.js";const t={},i=a(`

实现一个 mini-vue-cli,首先需要用到命令行工具 commander.js

npm init -y

npm init -y
+import{_ as e,o as n,c as s,e as a}from"./app-I81jsmus.js";const t={},i=a(`

实现一个 mini-vue-cli,首先需要用到命令行工具 commander.js

npm init -y

npm init -y
 
  mini-vue-cli
   |- node_modules
   |- package-lock.json
diff --git a/assets/001-install-mysql.html-8EsZMsqk.js b/assets/001-install-mysql.html-qc7jqvu9.js
similarity index 99%
rename from assets/001-install-mysql.html-8EsZMsqk.js
rename to assets/001-install-mysql.html-qc7jqvu9.js
index bfe58b231b..d32d70de16 100644
--- a/assets/001-install-mysql.html-8EsZMsqk.js
+++ b/assets/001-install-mysql.html-qc7jqvu9.js
@@ -1,4 +1,4 @@
-import{_ as i,r as s,o as r,c as o,a as e,d as a,b as n,w as c,e as d}from"./app-2R243if7.js";const p={},m=e("p",null,"使用 Docker 安装 MySQL。",-1),u=e("h2",{id:"安装",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#安装"},[e("span",null,"安装")])],-1),h={href:"https://hub.docker.com/_/mysql/",target:"_blank",rel:"noopener noreferrer"},b=d(`

这里直接安装最新版本。

docker pull mysql
+import{_ as i,r as s,o as r,c as o,a as e,d as a,b as n,w as c,e as d}from"./app-I81jsmus.js";const p={},m=e("p",null,"使用 Docker 安装 MySQL。",-1),u=e("h2",{id:"安装",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#安装"},[e("span",null,"安装")])],-1),h={href:"https://hub.docker.com/_/mysql/",target:"_blank",rel:"noopener noreferrer"},b=d(`

这里直接安装最新版本。

docker pull mysql
 

等待一段时间安装完成后,启动 MySQL 容器:

docker run -d --name mysql-container -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 mysql
 

这个命令的参数解释如下:

  • -d: 后台运行容器。
  • --name mysql-container: 给容器起一个名字。
  • -e MYSQL_ROOT_PASSWORD=my-secret-pw: 设置 MySQL root 用户的密码。
  • -p 3306:3306: 将容器的 MySQL 服务端口(默认为 3306)映射到主机的 3306 端口。

启动容器后进入 MySQL 容器的命令行界面:

docker exec -it mysql-container bash
 

输入密码即可进入 MySQL 命令行界面。

设置 MySQL

进入到命令行界面后,设置一些基本的配置。

注意

MySQL 命令以 ; 表示一行结束。

  1. 登陆 MySQL
mysql -u root -p
diff --git a/assets/001-modularization.html-C5iw405Z.js b/assets/001-modularization.html-aVDXVF3p.js
similarity index 92%
rename from assets/001-modularization.html-C5iw405Z.js
rename to assets/001-modularization.html-aVDXVF3p.js
index d2989baf5d..e06176c413 100644
--- a/assets/001-modularization.html-C5iw405Z.js
+++ b/assets/001-modularization.html-aVDXVF3p.js
@@ -1,4 +1,4 @@
-import{_ as e,r as p,o,c,a as s,d as n,b as l,e as a}from"./app-2R243if7.js";const i={},u=a(`

早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,逐渐暴露出两个问题:

  • 全局污染:不同文件中的函数会相互污染;
  • 依赖混乱:各文件中的函数依赖非常混乱。

模块化就是为了解决上述问题,最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导出希望暴露的变量、函数、对象等,并能通过某种方式,导入其他模块中的变量、函数或对象等。

JavaScript 本身直到 ES2015 才推出了自己的模块化方案 —— ES Module。在此之前,为了让 JavaScript 支持模块化,社区中涌现了不同的模块化规范:AMD、CMD、CommonJS 等。

早期模块化方案

Window

在最开始的前端时期,JavaScript 文件之间的通信通常会依靠 window 对象。

utils.js

var utils = {
+import{_ as e,r as p,o,c,a as s,d as n,b as l,e as a}from"./app-I81jsmus.js";const i={},u=a(`

早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,逐渐暴露出两个问题:

  • 全局污染:不同文件中的函数会相互污染;
  • 依赖混乱:各文件中的函数依赖非常混乱。

模块化就是为了解决上述问题,最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导出希望暴露的变量、函数、对象等,并能通过某种方式,导入其他模块中的变量、函数或对象等。

JavaScript 本身直到 ES2015 才推出了自己的模块化方案 —— ES Module。在此之前,为了让 JavaScript 支持模块化,社区中涌现了不同的模块化规范:AMD、CMD、CommonJS 等。

早期模块化方案

Window

在最开始的前端时期,JavaScript 文件之间的通信通常会依靠 window 对象。

utils.js

var utils = {
   format(time) {
     console.log(time)
   }
@@ -224,4 +224,4 @@ module.forma
     // 逻辑代码
   })
 }
-

ESM VS CommonJS

CommonJS 模块加载 js 文件的过程是 运行时 加载的,并且是同步的:

  • 运行时加载意味着是 js 引擎在执行 js 代码的过程中加载模块;
  • 同步的就意味着一个文件没有加载结束之前,后面的代码都不会执行。

ES Module 加载 js 文件的过程是 编译(解析)时 加载的,并且是异步的:

  • 编译时(解析)时加载,意味着 import 关键字不能和运行时相关的内容放在一起使用;
  • 异步的意味着:JS 引擎在遇到 import 时会去获取这个 js 文件,但是这个获取的过程是异步的,并不会阻塞主线程继续执行。

CommonJS 通过 module.exports 导出的是一个对象,导出和导入指向的是同一块内存空间,两边修改会同时影响导出对象。

ES Module 通过 export 导出的是变量本身的引用:JS 引擎会创建模块环境记录,会和导出的变量进行绑定。所以在导出的模块中修改变化,导入的地方可以通过模块环境记录获取最新的值;但是在导入的地方不允许修改变量(直接报错),因为导入它时相当于给一个常量赋值。

如果 ESM 导出的是一个对象,那么导入的模块也能修改对象中的属性,因为他指向内存空间。

总结

本文主要介绍了模块化发展的历程,介绍各种规范如 CommonJS、AMD、CMD、ESM 的使用和对比。

`,33);function k(m,v){const t=p("ExternalLinkIcon");return o(),c("div",null,[u,s("p",null,[n("可见 "),s("a",r,[n("浏览器支持"),l(t)]),n("。")]),d])}const b=e(i,[["render",k],["__file","001-modularization.html.vue"]]),h=JSON.parse('{"path":"/frontend/engineering/basic/001-modularization.html","title":"模块化","lang":"zh-CN","frontmatter":{"title":"模块化","date":"2022-08-10T00:00:00.000Z","category":["工程化"],"tag":["模块化","ESM","CJS","AMD","CMD"],"description":"早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,逐渐暴露出两个问题: 全局污染:不同文件中的函数会相互污染; 依赖混乱:各文件中的函数依赖非常混乱。 模块化就是为了解决上述问题,最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/engineering/basic/001-modularization.html"}],["meta",{"property":"og:title","content":"模块化"}],["meta",{"property":"og:description","content":"早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,逐渐暴露出两个问题: 全局污染:不同文件中的函数会相互污染; 依赖混乱:各文件中的函数依赖非常混乱。 模块化就是为了解决上述问题,最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-07T08:28:24.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"模块化"}],["meta",{"property":"article:tag","content":"ESM"}],["meta",{"property":"article:tag","content":"CJS"}],["meta",{"property":"article:tag","content":"AMD"}],["meta",{"property":"article:tag","content":"CMD"}],["meta",{"property":"article:published_time","content":"2022-08-10T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-07T08:28:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"模块化\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2022-08-10T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-07T08:28:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 早期模块化方案","slug":"早期模块化方案","link":"#早期模块化方案","children":[{"level":3,"title":"1.1 Window","slug":"window","link":"#window","children":[]}]},{"level":2,"title":"2 IIFE","slug":"iife","link":"#iife","children":[]},{"level":2,"title":"3 CommonJS","slug":"commonjs","link":"#commonjs","children":[{"level":3,"title":"3.1 exports 和 module.exports","slug":"exports-和-module-exports","link":"#exports-和-module-exports","children":[]},{"level":3,"title":"3.2 require","slug":"require","link":"#require","children":[{"level":4,"title":"3.2.1 核心模块和文件模块","slug":"核心模块和文件模块","link":"#核心模块和文件模块","children":[]},{"level":4,"title":"3.2.2 优先从缓存中加载","slug":"优先从缓存中加载","link":"#优先从缓存中加载","children":[]},{"level":4,"title":"3.2.3 路径分析","slug":"路径分析","link":"#路径分析","children":[]},{"level":4,"title":"3.2.4 文件定位","slug":"文件定位","link":"#文件定位","children":[]}]},{"level":3,"title":"3.3 模块编译","slug":"模块编译","link":"#模块编译","children":[]},{"level":3,"title":"3.4 其他","slug":"其他","link":"#其他","children":[]},{"level":3,"title":"3.5 缺点","slug":"缺点","link":"#缺点","children":[]}]},{"level":2,"title":"4 AMD/CMD","slug":"amd-cmd","link":"#amd-cmd","children":[{"level":3,"title":"4.1 AMD","slug":"amd","link":"#amd","children":[]},{"level":3,"title":"4.2 CMD","slug":"cmd","link":"#cmd","children":[]}]},{"level":2,"title":"5 ESM","slug":"esm","link":"#esm","children":[{"level":3,"title":"5.1 兼容性","slug":"兼容性","link":"#兼容性","children":[]},{"level":3,"title":"5.2 导出","slug":"导出","link":"#导出","children":[{"level":4,"title":"5.2.1 方式一:分别导出","slug":"方式一-分别导出","link":"#方式一-分别导出","children":[]},{"level":4,"title":"5.2.2 方式二:统一导出","slug":"方式二-统一导出","link":"#方式二-统一导出","children":[]},{"level":4,"title":"5.2.3 方式三:别名导出","slug":"方式三-别名导出","link":"#方式三-别名导出","children":[]},{"level":4,"title":"5.2.4 方式四:默认导出","slug":"方式四-默认导出","link":"#方式四-默认导出","children":[]}]},{"level":3,"title":"5.3 导入","slug":"导入","link":"#导入","children":[{"level":4,"title":"5.3.1 方式一:统一导入","slug":"方式一-统一导入","link":"#方式一-统一导入","children":[]},{"level":4,"title":"5.3.2 方式二:整体导入","slug":"方式二-整体导入","link":"#方式二-整体导入","children":[]},{"level":4,"title":"5.3.3 方式三:别名导入","slug":"方式三-别名导入","link":"#方式三-别名导入","children":[]},{"level":4,"title":"5.3.4 方式四:默认导出的导入","slug":"方式四-默认导出的导入","link":"#方式四-默认导出的导入","children":[]}]},{"level":3,"title":"5.4 import()","slug":"import","link":"#import","children":[]},{"level":3,"title":"5.5 ESM VS CommonJS","slug":"esm-vs-commonjs","link":"#esm-vs-commonjs","children":[]}]},{"level":2,"title":"6 总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1704616104000,"updatedTime":1704616104000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":13.68,"words":4104},"filePathRelative":"frontend/engineering/basic/001-modularization.md","localizedDate":"2022年8月10日","excerpt":"","autoDesc":true}');export{b as comp,h as data}; +

ESM VS CommonJS

CommonJS 模块加载 js 文件的过程是 运行时 加载的,并且是同步的:

  • 运行时加载意味着是 js 引擎在执行 js 代码的过程中加载模块;
  • 同步的就意味着一个文件没有加载结束之前,后面的代码都不会执行。

ES Module 加载 js 文件的过程是 编译(解析)时 加载的,并且是异步的:

  • 编译时(解析)时加载,意味着 import 关键字不能和运行时相关的内容放在一起使用;
  • 异步的意味着:JS 引擎在遇到 import 时会去获取这个 js 文件,但是这个获取的过程是异步的,并不会阻塞主线程继续执行。

CommonJS 通过 module.exports 导出的是一个对象,导出和导入指向的是同一块内存空间,两边修改会同时影响导出对象。

ES Module 通过 export 导出的是变量本身的引用:JS 引擎会创建模块环境记录,会和导出的变量进行绑定。所以在导出的模块中修改变化,导入的地方可以通过模块环境记录获取最新的值;但是在导入的地方不允许修改变量(直接报错),因为导入它时相当于给一个常量赋值。

如果 ESM 导出的是一个对象,那么导入的模块也能修改对象中的属性,因为他指向内存空间。

总结

本文主要介绍了模块化发展的历程,介绍各种规范如 CommonJS、AMD、CMD、ESM 的使用和对比。

`,33);function k(m,v){const t=p("ExternalLinkIcon");return o(),c("div",null,[u,s("p",null,[n("可见 "),s("a",r,[n("浏览器支持"),l(t)]),n("。")]),d])}const b=e(i,[["render",k],["__file","001-modularization.html.vue"]]),h=JSON.parse('{"path":"/frontend/engineering/basic/001-modularization.html","title":"模块化","lang":"zh-CN","frontmatter":{"title":"模块化","date":"2022-08-10T00:00:00.000Z","icon":"box","category":["工程化"],"tag":["模块化","ESM","CJS","AMD","CMD"],"description":"早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,逐渐暴露出两个问题: 全局污染:不同文件中的函数会相互污染; 依赖混乱:各文件中的函数依赖非常混乱。 模块化就是为了解决上述问题,最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/engineering/basic/001-modularization.html"}],["meta",{"property":"og:title","content":"模块化"}],["meta",{"property":"og:description","content":"早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,逐渐暴露出两个问题: 全局污染:不同文件中的函数会相互污染; 依赖混乱:各文件中的函数依赖非常混乱。 模块化就是为了解决上述问题,最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-09-19T09:44:12.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"模块化"}],["meta",{"property":"article:tag","content":"ESM"}],["meta",{"property":"article:tag","content":"CJS"}],["meta",{"property":"article:tag","content":"AMD"}],["meta",{"property":"article:tag","content":"CMD"}],["meta",{"property":"article:published_time","content":"2022-08-10T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-09-19T09:44:12.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"模块化\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2022-08-10T00:00:00.000Z\\",\\"dateModified\\":\\"2024-09-19T09:44:12.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 早期模块化方案","slug":"早期模块化方案","link":"#早期模块化方案","children":[{"level":3,"title":"1.1 Window","slug":"window","link":"#window","children":[]}]},{"level":2,"title":"2 IIFE","slug":"iife","link":"#iife","children":[]},{"level":2,"title":"3 CommonJS","slug":"commonjs","link":"#commonjs","children":[{"level":3,"title":"3.1 exports 和 module.exports","slug":"exports-和-module-exports","link":"#exports-和-module-exports","children":[]},{"level":3,"title":"3.2 require","slug":"require","link":"#require","children":[{"level":4,"title":"3.2.1 核心模块和文件模块","slug":"核心模块和文件模块","link":"#核心模块和文件模块","children":[]},{"level":4,"title":"3.2.2 优先从缓存中加载","slug":"优先从缓存中加载","link":"#优先从缓存中加载","children":[]},{"level":4,"title":"3.2.3 路径分析","slug":"路径分析","link":"#路径分析","children":[]},{"level":4,"title":"3.2.4 文件定位","slug":"文件定位","link":"#文件定位","children":[]}]},{"level":3,"title":"3.3 模块编译","slug":"模块编译","link":"#模块编译","children":[]},{"level":3,"title":"3.4 其他","slug":"其他","link":"#其他","children":[]},{"level":3,"title":"3.5 缺点","slug":"缺点","link":"#缺点","children":[]}]},{"level":2,"title":"4 AMD/CMD","slug":"amd-cmd","link":"#amd-cmd","children":[{"level":3,"title":"4.1 AMD","slug":"amd","link":"#amd","children":[]},{"level":3,"title":"4.2 CMD","slug":"cmd","link":"#cmd","children":[]}]},{"level":2,"title":"5 ESM","slug":"esm","link":"#esm","children":[{"level":3,"title":"5.1 兼容性","slug":"兼容性","link":"#兼容性","children":[]},{"level":3,"title":"5.2 导出","slug":"导出","link":"#导出","children":[{"level":4,"title":"5.2.1 方式一:分别导出","slug":"方式一-分别导出","link":"#方式一-分别导出","children":[]},{"level":4,"title":"5.2.2 方式二:统一导出","slug":"方式二-统一导出","link":"#方式二-统一导出","children":[]},{"level":4,"title":"5.2.3 方式三:别名导出","slug":"方式三-别名导出","link":"#方式三-别名导出","children":[]},{"level":4,"title":"5.2.4 方式四:默认导出","slug":"方式四-默认导出","link":"#方式四-默认导出","children":[]}]},{"level":3,"title":"5.3 导入","slug":"导入","link":"#导入","children":[{"level":4,"title":"5.3.1 方式一:统一导入","slug":"方式一-统一导入","link":"#方式一-统一导入","children":[]},{"level":4,"title":"5.3.2 方式二:整体导入","slug":"方式二-整体导入","link":"#方式二-整体导入","children":[]},{"level":4,"title":"5.3.3 方式三:别名导入","slug":"方式三-别名导入","link":"#方式三-别名导入","children":[]},{"level":4,"title":"5.3.4 方式四:默认导出的导入","slug":"方式四-默认导出的导入","link":"#方式四-默认导出的导入","children":[]}]},{"level":3,"title":"5.4 import()","slug":"import","link":"#import","children":[]},{"level":3,"title":"5.5 ESM VS CommonJS","slug":"esm-vs-commonjs","link":"#esm-vs-commonjs","children":[]}]},{"level":2,"title":"6 总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1704616104000,"updatedTime":1726739052000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":2}]},"readingTime":{"minutes":13.69,"words":4106},"filePathRelative":"frontend/engineering/basic/001-modularization.md","localizedDate":"2022年8月10日","excerpt":"","autoDesc":true}');export{b as comp,h as data}; diff --git a/assets/001-module.html-0uMgtzmT.js b/assets/001-module.html-S6GWBUID.js similarity index 99% rename from assets/001-module.html-0uMgtzmT.js rename to assets/001-module.html-S6GWBUID.js index bfb16c604a..507ee093e6 100644 --- a/assets/001-module.html-0uMgtzmT.js +++ b/assets/001-module.html-S6GWBUID.js @@ -1,4 +1,4 @@ -import{_ as e,r as p,o,c,a as s,d as n,b as l,e as a}from"./app-2R243if7.js";const i={},u=a(`

模块化开发的最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导出希望暴露的变量、函数、对象等,并能通过某种方式,导入其他模块中的变量、函数或对象等。

然而在早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,需要通过模块化来减少代码的复杂度。

JavaScript 本身知道 ES2015 才推出了自己的模块化方案 —— ES Module。在此之前,为了让 JavaScript 支持模块化,社区中涌现了不同的模块化规范:AMD、CMD、CommonJS 等。

早期模块化方案

Window

在最开始的前端时期,JavaScript 文件之间的通信通常会依靠 window 对象。

utils.js

var utils = {
+import{_ as e,r as p,o,c,a as s,d as n,b as l,e as a}from"./app-I81jsmus.js";const i={},u=a(`

模块化开发的最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导出希望暴露的变量、函数、对象等,并能通过某种方式,导入其他模块中的变量、函数或对象等。

然而在早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,需要通过模块化来减少代码的复杂度。

JavaScript 本身知道 ES2015 才推出了自己的模块化方案 —— ES Module。在此之前,为了让 JavaScript 支持模块化,社区中涌现了不同的模块化规范:AMD、CMD、CommonJS 等。

早期模块化方案

Window

在最开始的前端时期,JavaScript 文件之间的通信通常会依靠 window 对象。

utils.js

var utils = {
   format(time) {
     console.log(time)
   }
diff --git a/assets/001-network-model.html-NoIFtNe7.js b/assets/001-network-model.html-AnQrVYyf.js
similarity index 98%
rename from assets/001-network-model.html-NoIFtNe7.js
rename to assets/001-network-model.html-AnQrVYyf.js
index ace804eaff..28b11d4a40 100644
--- a/assets/001-network-model.html-NoIFtNe7.js
+++ b/assets/001-network-model.html-AnQrVYyf.js
@@ -1,4 +1,4 @@
-import{_ as e,o as t,c as n,e as r}from"./app-2R243if7.js";const o={},i=r(`

TCP/IP 网络体系

TCP/IP 体系结构分为四层,是事实上的国际标准,各层如下所示:

--- 应用层 ---
+import{_ as e,o as t,c as n,e as r}from"./app-I81jsmus.js";const o={},i=r(`

TCP/IP 网络体系

TCP/IP 体系结构分为四层,是事实上的国际标准,各层如下所示:

--- 应用层 ---
 --- 运输层 ---
 --- 网络层 ---
 --- 网络接口层 ---
diff --git a/assets/001-quick-start.html-2zV3Q__R.js b/assets/001-quick-start.html-reK2EBPD.js
similarity index 99%
rename from assets/001-quick-start.html-2zV3Q__R.js
rename to assets/001-quick-start.html-reK2EBPD.js
index 9749c2154d..ddf1cf9e88 100644
--- a/assets/001-quick-start.html-2zV3Q__R.js
+++ b/assets/001-quick-start.html-reK2EBPD.js
@@ -1,4 +1,4 @@
-import{_ as p,r as c,o as d,c as r,a as n,d as s,b as a,w as e,e as t}from"./app-2R243if7.js";const u={},m=t('

CSS

层叠样式表(Cascading Style Sheet, CSS)是一种用于给网页添加样式的计算机语言,它并不是真正的编程语言,甚至不是标记语言,只是一种样式表语言。

历史

早期的网页是通过 HTML 编写的,随着 Web 的逐渐发展,人们希望 HTML 页面可以更加丰富,因此为浏览器增加了很多具备特殊样式的元素,比如 istrongdel 等。

后来不同的浏览器厂商实现各自的样式语言,但是没有统一的规划。CSS 的发展历史如下:

  • 1994 年,哈肯·维姆·莱和伯特·波斯一起合作设计 CSS,于 1996 年发布 CSS1;
  • 1997 年,W3C 成立 CSS 工作组,于 1998 年发布了 CSS2;
  • 2006 ~ 2009 年,div + css 布局方式逐渐成为网页内容布局的主流方案(2007 年出现 CSS2.1);
  • CSS3 将所有的 CSS 分成了不同的模块,每一个模块都有于 CSS2 中额外增加的功能,并且支持向后兼容。
',5),k={class:"hint-container tip"},h=n("p",{class:"hint-container-title"},"提示",-1),g={href:"https://www.w3.org/TR/css3-roadmap/",target:"_blank",rel:"noopener noreferrer"},v=n("h2",{id:"基本语法",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#基本语法"},[n("span",null,"基本语法")])],-1),b=n("p",null,[s("CSS 可以设置元素的样式,比如使用 "),n("code",null,"color: red"),s(" 将字体改为红色。")],-1),S=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("p")]),n("span",{class:"token punctuation"},">")]),s("我是一个段落"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),s(` +import{_ as p,r as c,o as d,c as r,a as n,d as s,b as a,w as e,e as t}from"./app-I81jsmus.js";const u={},m=t('

CSS

层叠样式表(Cascading Style Sheet, CSS)是一种用于给网页添加样式的计算机语言,它并不是真正的编程语言,甚至不是标记语言,只是一种样式表语言。

历史

早期的网页是通过 HTML 编写的,随着 Web 的逐渐发展,人们希望 HTML 页面可以更加丰富,因此为浏览器增加了很多具备特殊样式的元素,比如 istrongdel 等。

后来不同的浏览器厂商实现各自的样式语言,但是没有统一的规划。CSS 的发展历史如下:

  • 1994 年,哈肯·维姆·莱和伯特·波斯一起合作设计 CSS,于 1996 年发布 CSS1;
  • 1997 年,W3C 成立 CSS 工作组,于 1998 年发布了 CSS2;
  • 2006 ~ 2009 年,div + css 布局方式逐渐成为网页内容布局的主流方案(2007 年出现 CSS2.1);
  • CSS3 将所有的 CSS 分成了不同的模块,每一个模块都有于 CSS2 中额外增加的功能,并且支持向后兼容。
',5),k={class:"hint-container tip"},h=n("p",{class:"hint-container-title"},"提示",-1),g={href:"https://www.w3.org/TR/css3-roadmap/",target:"_blank",rel:"noopener noreferrer"},v=n("h2",{id:"基本语法",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#基本语法"},[n("span",null,"基本语法")])],-1),b=n("p",null,[s("CSS 可以设置元素的样式,比如使用 "),n("code",null,"color: red"),s(" 将字体改为红色。")],-1),S=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("p")]),n("span",{class:"token punctuation"},">")]),s("我是一个段落"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),s(` `)])]),n("div",{class:"line-numbers","aria-hidden":"true"},[n("div",{class:"line-number"})])],-1),_=n("div",{class:"language-css line-numbers-mode","data-ext":"css","data-title":"css"},[n("pre",{class:"language-css"},[n("code",null,[n("span",{class:"token selector"},"p"),s(),n("span",{class:"token punctuation"},"{"),s(` `),n("span",{class:"token property"},"color"),n("span",{class:"token punctuation"},":"),s(" red"),n("span",{class:"token punctuation"},";"),s(` `),n("span",{class:"token punctuation"},"}"),s(` diff --git a/assets/001-set-the-ssh.html-aEDPE2NO.js b/assets/001-set-the-ssh.html-_kRdhh4B.js similarity index 99% rename from assets/001-set-the-ssh.html-aEDPE2NO.js rename to assets/001-set-the-ssh.html-_kRdhh4B.js index 7242d57b6d..e9eb454432 100644 --- a/assets/001-set-the-ssh.html-aEDPE2NO.js +++ b/assets/001-set-the-ssh.html-_kRdhh4B.js @@ -1,4 +1,4 @@ -import{_ as n,r as i,o as r,c as o,a as e,d as t,b as c,e as a}from"./app-2R243if7.js";const l={},p=a('

提示

使用密码登录服务器并不安全,因此我们需要设置密钥登录。

创建密钥对

登录阿里云控制台 -> 云服务 ECS -> 网络与安全 -> 密钥对 -> 创建密钥对。

step1-create-ssh
step1-create-ssh

创建成功之后,浏览器会自动下载一个 .pem 私钥文件,记住这个文件的位置,之后要用。

绑定密钥对

选中刚才创建的密钥对,点击右侧绑定密钥对,将密钥对绑定到实例。

step2-bind-ssh
step2-bind-ssh

添加安全组规则

云服务 ECS -> 网络与安全 -> 安全组 -> 入方向 -> 手动添加。

step3-add-port
step3-add-port

执行完后重启实例。

密钥验证并禁用密码登录

',13),d=e("li",null,[e("p",null,"安装 MobaXterm")],-1),h={href:"https://help.aliyun.com/document_detail/51798.html#title-7je-5ba-sm2",target:"_blank",rel:"noopener noreferrer"},m=a(`
chmod 400 [.pem私钥文件在本地机上的存储路径]
+import{_ as n,r as i,o as r,c as o,a as e,d as t,b as c,e as a}from"./app-I81jsmus.js";const l={},p=a('

提示

使用密码登录服务器并不安全,因此我们需要设置密钥登录。

创建密钥对

登录阿里云控制台 -> 云服务 ECS -> 网络与安全 -> 密钥对 -> 创建密钥对。

step1-create-ssh
step1-create-ssh

创建成功之后,浏览器会自动下载一个 .pem 私钥文件,记住这个文件的位置,之后要用。

绑定密钥对

选中刚才创建的密钥对,点击右侧绑定密钥对,将密钥对绑定到实例。

step2-bind-ssh
step2-bind-ssh

添加安全组规则

云服务 ECS -> 网络与安全 -> 安全组 -> 入方向 -> 手动添加。

step3-add-port
step3-add-port

执行完后重启实例。

密钥验证并禁用密码登录

',13),d=e("li",null,[e("p",null,"安装 MobaXterm")],-1),h={href:"https://help.aliyun.com/document_detail/51798.html#title-7je-5ba-sm2",target:"_blank",rel:"noopener noreferrer"},m=a(`
chmod 400 [.pem私钥文件在本地机上的存储路径]
 
ssh -i [.pem私钥文件在本地机上的存储路径] root@[公网IP地址]
 
`,2),u=a(`
  • 输入以下命令修改 config 文件

    vi /etc/ssh/sshd_config
     
  • i 进入编辑模式

    #禁用密码验证
    diff --git a/assets/001-var-let-const.html-QE4xXk9s.js b/assets/001-var-let-const.html-s47UVxV9.js
    similarity index 98%
    rename from assets/001-var-let-const.html-QE4xXk9s.js
    rename to assets/001-var-let-const.html-s47UVxV9.js
    index bcac8100d5..d7179cc86f 100644
    --- a/assets/001-var-let-const.html-QE4xXk9s.js
    +++ b/assets/001-var-let-const.html-s47UVxV9.js
    @@ -1,4 +1,4 @@
    -import{_ as t,o as e,c as n,e as a}from"./app-2R243if7.js";const o={},s=a(`

    首先,三者都是 JavaScript 声明变量的方式。区别在于:

    varletconst
    作用域全局作用域和函数作用域块级作用域块级作用域
    变量提升自动提升到作用域顶部提升,暂时性死区提升,暂时性死区
    冗余声明允许冗余声明不允许不允许
    赋值可以重新赋值,且不需初始化可以重新赋值,且不需初始化不可以重新赋值,必须初始化
    全局声明成为 window 对象的属性不会不会

    关于变量提升,varletconst 三者 都存在变量提升,但是区别在于 letconst 存在暂时性死区。

    来看一个例子:

    var x = { x: x }
    +import{_ as t,o as e,c as n,e as a}from"./app-I81jsmus.js";const o={},s=a(`

    首先,三者都是 JavaScript 声明变量的方式。区别在于:

    varletconst
    作用域全局作用域和函数作用域块级作用域块级作用域
    变量提升自动提升到作用域顶部提升,暂时性死区提升,暂时性死区
    冗余声明允许冗余声明不允许不允许
    赋值可以重新赋值,且不需初始化可以重新赋值,且不需初始化不可以重新赋值,必须初始化
    全局声明成为 window 对象的属性不会不会

    关于变量提升,varletconst 三者 都存在变量提升,但是区别在于 letconst 存在暂时性死区。

    来看一个例子:

    var x = { x: x }
     console.log(x.x)
     
     let y = { y: y }
    diff --git a/assets/001-webpack-basic.html-pCqwATgK.js b/assets/001-webpack-basic.html-iANhhZl5.js
    similarity index 99%
    rename from assets/001-webpack-basic.html-pCqwATgK.js
    rename to assets/001-webpack-basic.html-iANhhZl5.js
    index e68d0bab2b..b2a67bc836 100644
    --- a/assets/001-webpack-basic.html-pCqwATgK.js
    +++ b/assets/001-webpack-basic.html-iANhhZl5.js
    @@ -1,4 +1,4 @@
    -import{_ as e,r as t,o as p,c as i,a as n,d as s,b as l,e as c}from"./app-2R243if7.js";const o={},d={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},u=c(`

    基本安装

    webpack 需要安装两个工具:webpack 和 webpack-cli(命令行接口)。

    webpack 在执行时依赖 webpack-CLI,webpack-cli 提供了许多命令来使 webpack 的工作变得更简单。如果没有安装,运行 webpack 命令时会报错。

    # 全局安装
    +import{_ as e,r as t,o as p,c as i,a as n,d as s,b as l,e as c}from"./app-I81jsmus.js";const o={},d={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},u=c(`

    基本安装

    webpack 需要安装两个工具:webpack 和 webpack-cli(命令行接口)。

    webpack 在执行时依赖 webpack-CLI,webpack-cli 提供了许多命令来使 webpack 的工作变得更简单。如果没有安装,运行 webpack 命令时会报错。

    # 全局安装
     npm install webpack webpack-cli -g
     
     # 局部安装
    diff --git "a/assets/0010\343\200\201WebWorker.html-QlxKBHVw.js" "b/assets/0010\343\200\201WebWorker.html-z-ry9p5x.js"
    similarity index 96%
    rename from "assets/0010\343\200\201WebWorker.html-QlxKBHVw.js"
    rename to "assets/0010\343\200\201WebWorker.html-z-ry9p5x.js"
    index b72df1d158..d8a5e3ee50 100644
    --- "a/assets/0010\343\200\201WebWorker.html-QlxKBHVw.js"
    +++ "b/assets/0010\343\200\201WebWorker.html-z-ry9p5x.js"
    @@ -1 +1 @@
    -import{_ as e,o as t,c as r}from"./app-2R243if7.js";const o={};function a(n,i){return t(),r("div")}const m=e(o,[["render",a],["__file","0010、WebWorker.html.vue"]]),l=JSON.parse('{"path":"/frontend/basic/html/0010%E3%80%81WebWorker.html","title":"Web Worker","lang":"zh-CN","frontmatter":{"title":"Web Worker","date":"2022-08-02T00:00:00.000Z","publish":false,"category":["HTML"],"tag":["Web Worker","HTML5"],"description":"","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/basic/html/0010%E3%80%81WebWorker.html"}],["meta",{"property":"og:title","content":"Web Worker"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-03-25T10:47:40.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"Web Worker"}],["meta",{"property":"article:tag","content":"HTML5"}],["meta",{"property":"article:published_time","content":"2022-08-02T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-03-25T10:47:40.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Web Worker\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2022-08-02T00:00:00.000Z\\",\\"dateModified\\":\\"2023-03-25T10:47:40.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[],"git":{"createdTime":1677733227000,"updatedTime":1679741260000,"contributors":[{"name":"Stephen-wzw","email":"wzw15292257101@163.com","commits":1},{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":0.05,"words":15},"filePathRelative":"frontend/basic/html/0010、WebWorker.md","localizedDate":"2022年8月2日","excerpt":"","autoDesc":true}');export{m as comp,l as data};
    +import{_ as e,o as t,c as r}from"./app-I81jsmus.js";const o={};function a(n,i){return t(),r("div")}const m=e(o,[["render",a],["__file","0010、WebWorker.html.vue"]]),l=JSON.parse('{"path":"/frontend/basic/html/0010%E3%80%81WebWorker.html","title":"Web Worker","lang":"zh-CN","frontmatter":{"title":"Web Worker","date":"2022-08-02T00:00:00.000Z","publish":false,"category":["HTML"],"tag":["Web Worker","HTML5"],"description":"","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/basic/html/0010%E3%80%81WebWorker.html"}],["meta",{"property":"og:title","content":"Web Worker"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-03-25T10:47:40.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"Web Worker"}],["meta",{"property":"article:tag","content":"HTML5"}],["meta",{"property":"article:published_time","content":"2022-08-02T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-03-25T10:47:40.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Web Worker\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2022-08-02T00:00:00.000Z\\",\\"dateModified\\":\\"2023-03-25T10:47:40.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[],"git":{"createdTime":1677733227000,"updatedTime":1679741260000,"contributors":[{"name":"Stephen-wzw","email":"wzw15292257101@163.com","commits":1},{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":0.05,"words":15},"filePathRelative":"frontend/basic/html/0010、WebWorker.md","localizedDate":"2022年8月2日","excerpt":"","autoDesc":true}');export{m as comp,l as data};
    diff --git "a/assets/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html-qhcibsAO.js" "b/assets/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html-Qe14ZYL2.js"
    similarity index 99%
    rename from "assets/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html-qhcibsAO.js"
    rename to "assets/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html-Qe14ZYL2.js"
    index 8d52024e4d..6e3e11320f 100644
    --- "a/assets/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html-qhcibsAO.js"
    +++ "b/assets/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html-Qe14ZYL2.js"
    @@ -1,4 +1,4 @@
    -import{_ as n,o as s,c as a,e as t}from"./app-2R243if7.js";const p={},e=t(`

    ES6 中有一个方法可以判断两个对象是否相等:Object.is(obj1, obj2),但是它和 === 一样,都是判断两个对象内存地址是否相同。

    const obj1 = {
    +import{_ as n,o as s,c as a,e as t}from"./app-I81jsmus.js";const p={},e=t(`

    ES6 中有一个方法可以判断两个对象是否相等:Object.is(obj1, obj2),但是它和 === 一样,都是判断两个对象内存地址是否相同。

    const obj1 = {
       a: 1,
     }
     
    diff --git "a/assets/0012\343\200\201AJAX.html-DQSqS6qA.js" "b/assets/0012\343\200\201AJAX.html-KSX5mbJA.js"
    similarity index 99%
    rename from "assets/0012\343\200\201AJAX.html-DQSqS6qA.js"
    rename to "assets/0012\343\200\201AJAX.html-KSX5mbJA.js"
    index 99185a02af..1ffdc4706f 100644
    --- "a/assets/0012\343\200\201AJAX.html-DQSqS6qA.js"
    +++ "b/assets/0012\343\200\201AJAX.html-KSX5mbJA.js"
    @@ -1,4 +1,4 @@
    -import{_ as n,o as s,c as a,e as t}from"./app-2R243if7.js";const e={},p=t(`

    AJAX,即 Asynchronous JavaScript + XML,通过 JavaScript 异步请求服务器 XML 文档(格式不一定是 XML),可以实现在不刷新页面的情况下从服务器获取数据。

    AJAX 最初是通过 XMLHttpRequest 对象实现,但是它的 API 比较难用。随着 Fetch API 的出现,它支持期约(promise)和服务线程(service worker),逐渐代替了 XHR 对象。

    XMLHttpRequest 对象

    基本 API

    所有现代浏览器都支持的对象,通过 XMLHttpRequest 构造函数支持 XHR 对象。

    let xhr = new XMLHttpRequest()
    +import{_ as n,o as s,c as a,e as t}from"./app-I81jsmus.js";const e={},p=t(`

    AJAX,即 Asynchronous JavaScript + XML,通过 JavaScript 异步请求服务器 XML 文档(格式不一定是 XML),可以实现在不刷新页面的情况下从服务器获取数据。

    AJAX 最初是通过 XMLHttpRequest 对象实现,但是它的 API 比较难用。随着 Fetch API 的出现,它支持期约(promise)和服务线程(service worker),逐渐代替了 XHR 对象。

    XMLHttpRequest 对象

    基本 API

    所有现代浏览器都支持的对象,通过 XMLHttpRequest 构造函数支持 XHR 对象。

    let xhr = new XMLHttpRequest()
     

    XHR 对象需要首先调用 open() 方法,这个方法接收3 个参数:请求类型("get"、"post"等)、请求 URL,以及表示请求是否异步的布尔值。

    xhr.open("get", "server.com", true);
     

    要发送定义好的请求,就需要调用 send() 方法,它接收一个参数,作为请求体发送的数据。如果不需要发送请求体,则必须传 null。

    xhr.send(null)
     

    收到响应后,XHR 对象的以下属性会被填充上数据。

    • responseText:作为响应体返回的文本;
    • responseXML:如果响应的内容类型是 "text/xml" 或 "application/xml",那就是包含响应数据的 XML DOM 文档;
    • status:响应的 HTTP 状态;
    • statusText:响应的 HTTP 状态描述。

    同时 XHR 对象还有一个 readyState 属性,表示当前处于请求/响应的哪个阶段:

    • 0:未初始化(Uninitialized)。尚未调用 open() 方法;
    • 1:已打开(Open)。已调用 open() 方法,尚未调用 send() 方法;
    • 2:已发送(Sent)。已调用 send() 方法,尚未收到响应;
    • 3:接收中(Receiving)。已经收到部分响应;
    • 4:完成(Complete)。已经收到所有响应,可以使用了;

    每次 readyState 从一个值变成另一个值,都会触发 readystatechange 事件。可以借此机会检查 readyState 的值。

    xhr.onreadystatechange = function() {
    diff --git "a/assets/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html-aQKjlhhK.js" "b/assets/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html-KNURvFJh.js"
    similarity index 99%
    rename from "assets/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html-aQKjlhhK.js"
    rename to "assets/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html-KNURvFJh.js"
    index d89fd48e36..0c1135c49c 100644
    --- "a/assets/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html-aQKjlhhK.js"
    +++ "b/assets/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html-KNURvFJh.js"
    @@ -1,4 +1,4 @@
    -import{_ as n,o as s,c as a,e as t}from"./app-2R243if7.js";const e={},p=t(`

    简单的赋值操作:

    • 基本数据类型:直接在栈中开辟一块新的内存,存储赋值的数据;
    • 引用数据类型:会在栈中开辟一块空间,存储赋值的数据对应的堆中的存储地址,源数据和拷贝的新数据对应的是同一块堆空间中的数据。

    浅拷贝与深拷贝的定义

    浅拷贝是指:堆栈各开辟一块新空间,栈中存储堆中新开辟的空间的地址。堆中赋值了源对象的数据。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,那么拷贝的就是它的存储地址。修改其中一个对象会影响另一个对象。

    深拷贝是值:堆栈各开辟一块新空间,栈中存储堆中新开辟的空间的地址。堆中存储的数据和源数据一样,但是二者没有任何联系,修改一个对象不会影响其他对象。

    实现浅拷贝

    Object.assign()

    Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。如果目标中有同名对象,则会覆盖前面的属性。

    let obj1 = { person: { name: "kobe", age: 41 }, sports:'basketball' };
    +import{_ as n,o as s,c as a,e as t}from"./app-I81jsmus.js";const e={},p=t(`

    简单的赋值操作:

    • 基本数据类型:直接在栈中开辟一块新的内存,存储赋值的数据;
    • 引用数据类型:会在栈中开辟一块空间,存储赋值的数据对应的堆中的存储地址,源数据和拷贝的新数据对应的是同一块堆空间中的数据。

    浅拷贝与深拷贝的定义

    浅拷贝是指:堆栈各开辟一块新空间,栈中存储堆中新开辟的空间的地址。堆中赋值了源对象的数据。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,那么拷贝的就是它的存储地址。修改其中一个对象会影响另一个对象。

    深拷贝是值:堆栈各开辟一块新空间,栈中存储堆中新开辟的空间的地址。堆中存储的数据和源数据一样,但是二者没有任何联系,修改一个对象不会影响其他对象。

    实现浅拷贝

    Object.assign()

    Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。如果目标中有同名对象,则会覆盖前面的属性。

    let obj1 = { person: { name: "kobe", age: 41 }, sports:'basketball' };
     let obj2 = Object.assign({}, obj1);
     obj2.person.name = "wade";
     obj2.sports = 'football'
    diff --git "a/assets/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html-CHv7YjC_.js" "b/assets/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html-RxwjAYeR.js"
    similarity index 98%
    rename from "assets/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html-CHv7YjC_.js"
    rename to "assets/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html-RxwjAYeR.js"
    index b1d5cd10d1..e958f748d0 100644
    --- "a/assets/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html-CHv7YjC_.js"
    +++ "b/assets/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html-RxwjAYeR.js"
    @@ -1 +1 @@
    -import{_ as t,o as e,c as i,e as a}from"./app-2R243if7.js";const o="/blog/assets/event-loop-3S7ql_ag.png",r={},l=a('

    浏览器的进程模型

    JavaScript 是一个单线程的脚本语言,同一时间只能做一件事情。而为了协调事件、用户交互、脚本、渲染、网络等等,每个浏览器都有一个相关联的事件循环。

    事件循环的一个循环将从宏任务队列中正在处理一个任务(这个队列在 WHATWG 规范中简称为任务队列)。在这个宏任务完成之后,所有可用的微任务都将被处理,即在同一个周期内。在处理这些微任务时,它们可以排列更多的微任务,这些任务将一个接一个地运行,直到微任务队列耗尽。

    一个事件循环有一些任务队列。微任务队列不是任务队列

    函数调用会形成一个调用栈,当函数调用结束后,当前函数会被弹出调用栈。

    在函数执行的过程中,如果有异步任务,它们会发送给 web APIs,比如 settimeout 函数,当它在栈中执行时,会发送给对应的浏览器 API,在等待相应的时间后,他就会将回调函数放入事件队列。

    JavaScript 本身是一个单线程的,但是 web APIs 相当于另一个线程。

    事件循环会总是检查调用栈是否为空,如果为空,它就会将队列最前面的任务出队,放入执行栈中调用,如果不为空,那么继续执行当前的函数调用。

    异步任务的返回结果会被放到一个任务队列中,根据异步事件的类型,这个事件实际上会被放到对应的宏任务和微任务队列中去。

    简单总结一下执行的顺序:

    1. 检查宏任务队列是否为空,不为空则取出一个任务执行,然后执行第 2 步;为空则判断当前执行栈是否为空,然后执行第 2 步;
    2. 检查微任务队列是否为空,不为空则取出任务执行,直到清空微任务队列,之后执行视图更新;为空则直接执行视图更新,并回到第一步。
    事件循环
    事件循环

    宏任务:

    1. 整个 script 中的代码
    2. setTimeout
    3. setInterval
    4. I/O
    5. UI 交互事件

    微任务:

    1. promise.then .catch
    2. mutationObserver
    3. async await
    ',16),p=[l];function c(n,s){return e(),i("div",null,p)}const d=t(r,[["render",c],["__file","0017、事件循环.html.vue"]]),h=JSON.parse('{"path":"/frontend/basic/javascript/0017%E3%80%81%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF.html","title":"事件循环","lang":"zh-CN","frontmatter":{"title":"事件循环","date":"2022-09-13T00:00:00.000Z","category":["JavaScript"],"tag":["事件循环"],"description":"浏览器的进程模型 JavaScript 是一个单线程的脚本语言,同一时间只能做一件事情。而为了协调事件、用户交互、脚本、渲染、网络等等,每个浏览器都有一个相关联的事件循环。 事件循环的一个循环将从宏任务队列中正在处理一个任务(这个队列在 WHATWG 规范中简称为任务队列)。在这个宏任务完成之后,所有可用的微任务都将被处理,即在同一个周期内。在处理这些...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/basic/javascript/0017%E3%80%81%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF.html"}],["meta",{"property":"og:title","content":"事件循环"}],["meta",{"property":"og:description","content":"浏览器的进程模型 JavaScript 是一个单线程的脚本语言,同一时间只能做一件事情。而为了协调事件、用户交互、脚本、渲染、网络等等,每个浏览器都有一个相关联的事件循环。 事件循环的一个循环将从宏任务队列中正在处理一个任务(这个队列在 WHATWG 规范中简称为任务队列)。在这个宏任务完成之后,所有可用的微任务都将被处理,即在同一个周期内。在处理这些..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-03-25T10:47:40.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"事件循环"}],["meta",{"property":"article:published_time","content":"2022-09-13T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-03-25T10:47:40.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"事件循环\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2022-09-13T00:00:00.000Z\\",\\"dateModified\\":\\"2023-03-25T10:47:40.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 浏览器的进程模型","slug":"浏览器的进程模型","link":"#浏览器的进程模型","children":[]}],"git":{"createdTime":1677733227000,"updatedTime":1679741260000,"contributors":[{"name":"Stephen-wzw","email":"wzw15292257101@163.com","commits":2},{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":2.06,"words":619},"filePathRelative":"frontend/basic/javascript/0017、事件循环.md","localizedDate":"2022年9月13日","excerpt":"","autoDesc":true}');export{d as comp,h as data}; +import{_ as t,o as e,c as i,e as a}from"./app-I81jsmus.js";const o="/blog/assets/event-loop-3S7ql_ag.png",r={},l=a('

    浏览器的进程模型

    JavaScript 是一个单线程的脚本语言,同一时间只能做一件事情。而为了协调事件、用户交互、脚本、渲染、网络等等,每个浏览器都有一个相关联的事件循环。

    事件循环的一个循环将从宏任务队列中正在处理一个任务(这个队列在 WHATWG 规范中简称为任务队列)。在这个宏任务完成之后,所有可用的微任务都将被处理,即在同一个周期内。在处理这些微任务时,它们可以排列更多的微任务,这些任务将一个接一个地运行,直到微任务队列耗尽。

    一个事件循环有一些任务队列。微任务队列不是任务队列

    函数调用会形成一个调用栈,当函数调用结束后,当前函数会被弹出调用栈。

    在函数执行的过程中,如果有异步任务,它们会发送给 web APIs,比如 settimeout 函数,当它在栈中执行时,会发送给对应的浏览器 API,在等待相应的时间后,他就会将回调函数放入事件队列。

    JavaScript 本身是一个单线程的,但是 web APIs 相当于另一个线程。

    事件循环会总是检查调用栈是否为空,如果为空,它就会将队列最前面的任务出队,放入执行栈中调用,如果不为空,那么继续执行当前的函数调用。

    异步任务的返回结果会被放到一个任务队列中,根据异步事件的类型,这个事件实际上会被放到对应的宏任务和微任务队列中去。

    简单总结一下执行的顺序:

    1. 检查宏任务队列是否为空,不为空则取出一个任务执行,然后执行第 2 步;为空则判断当前执行栈是否为空,然后执行第 2 步;
    2. 检查微任务队列是否为空,不为空则取出任务执行,直到清空微任务队列,之后执行视图更新;为空则直接执行视图更新,并回到第一步。
    事件循环
    事件循环

    宏任务:

    1. 整个 script 中的代码
    2. setTimeout
    3. setInterval
    4. I/O
    5. UI 交互事件

    微任务:

    1. promise.then .catch
    2. mutationObserver
    3. async await
    ',16),p=[l];function c(n,s){return e(),i("div",null,p)}const d=t(r,[["render",c],["__file","0017、事件循环.html.vue"]]),h=JSON.parse('{"path":"/frontend/basic/javascript/0017%E3%80%81%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF.html","title":"事件循环","lang":"zh-CN","frontmatter":{"title":"事件循环","date":"2022-09-13T00:00:00.000Z","category":["JavaScript"],"tag":["事件循环"],"description":"浏览器的进程模型 JavaScript 是一个单线程的脚本语言,同一时间只能做一件事情。而为了协调事件、用户交互、脚本、渲染、网络等等,每个浏览器都有一个相关联的事件循环。 事件循环的一个循环将从宏任务队列中正在处理一个任务(这个队列在 WHATWG 规范中简称为任务队列)。在这个宏任务完成之后,所有可用的微任务都将被处理,即在同一个周期内。在处理这些...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/basic/javascript/0017%E3%80%81%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF.html"}],["meta",{"property":"og:title","content":"事件循环"}],["meta",{"property":"og:description","content":"浏览器的进程模型 JavaScript 是一个单线程的脚本语言,同一时间只能做一件事情。而为了协调事件、用户交互、脚本、渲染、网络等等,每个浏览器都有一个相关联的事件循环。 事件循环的一个循环将从宏任务队列中正在处理一个任务(这个队列在 WHATWG 规范中简称为任务队列)。在这个宏任务完成之后,所有可用的微任务都将被处理,即在同一个周期内。在处理这些..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-03-25T10:47:40.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"事件循环"}],["meta",{"property":"article:published_time","content":"2022-09-13T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-03-25T10:47:40.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"事件循环\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2022-09-13T00:00:00.000Z\\",\\"dateModified\\":\\"2023-03-25T10:47:40.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 浏览器的进程模型","slug":"浏览器的进程模型","link":"#浏览器的进程模型","children":[]}],"git":{"createdTime":1677733227000,"updatedTime":1679741260000,"contributors":[{"name":"Stephen-wzw","email":"wzw15292257101@163.com","commits":2},{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":2.06,"words":619},"filePathRelative":"frontend/basic/javascript/0017、事件循环.md","localizedDate":"2022年9月13日","excerpt":"","autoDesc":true}');export{d as comp,h as data}; diff --git a/assets/002-HTTP-overview.html-t1eJ1tmB.js b/assets/002-HTTP-overview.html-yA9pf-8X.js similarity index 99% rename from assets/002-HTTP-overview.html-t1eJ1tmB.js rename to assets/002-HTTP-overview.html-yA9pf-8X.js index 27eb2514ae..d846b84079 100644 --- a/assets/002-HTTP-overview.html-t1eJ1tmB.js +++ b/assets/002-HTTP-overview.html-yA9pf-8X.js @@ -1,4 +1,4 @@ -import{_ as r,r as a,o,c as d,a as e,d as t,b as i,e as l}from"./app-2R243if7.js";const s={},c=l(`

    超文本传输协议(HyperText Transfer Protocol, HTTP)一般是用于浏览器和服务器之间传输文字、图片、音频视频等超文本数据的应用层协议。

    HTTP 协议特性

    • 简单:HTTP 基本的报文格式就是 header + body,头部信息也是 key-value 的简单文本形式,易于理解,降低了学习和使用的门槛。
    • 灵活易扩展:HTTP/1.0 出现的 HTTP headers 让协议扩展变得非常容易,只要服务端和客户端对新 headers 达成语义一致,新功能就可以被添加进来。
    • 无连接:每次连接只处理一个请求。服务器处理完客户端的请求,并收到客户端的应答后,就会断开连接,HTTP 1.1 可以开启长连接。
    • 无状态:对于事物处理没有记忆能力。因此浏览器无法保存用户的登录信息,每次进行需要登录才能执行的操作时,都需要输入用户名和密码。而 cookie 可以创建有状态的会话。好处在于服务器不会记忆 HTTP 的状态,能减轻服务器的压力。
    • 明文传输:给调试带来便利性,但是用户毫无隐私可言,不安全。

    HTTP 报文格式

    请求报文格式

    客户端发送 HTTP 请求到服务器的请求消息:请求行、请求头、空行和请求体四个部分组成。

    POST / HTTP1.1
    +import{_ as r,r as a,o,c as d,a as e,d as t,b as i,e as l}from"./app-I81jsmus.js";const s={},c=l(`

    超文本传输协议(HyperText Transfer Protocol, HTTP)一般是用于浏览器和服务器之间传输文字、图片、音频视频等超文本数据的应用层协议。

    HTTP 协议特性

    • 简单:HTTP 基本的报文格式就是 header + body,头部信息也是 key-value 的简单文本形式,易于理解,降低了学习和使用的门槛。
    • 灵活易扩展:HTTP/1.0 出现的 HTTP headers 让协议扩展变得非常容易,只要服务端和客户端对新 headers 达成语义一致,新功能就可以被添加进来。
    • 无连接:每次连接只处理一个请求。服务器处理完客户端的请求,并收到客户端的应答后,就会断开连接,HTTP 1.1 可以开启长连接。
    • 无状态:对于事物处理没有记忆能力。因此浏览器无法保存用户的登录信息,每次进行需要登录才能执行的操作时,都需要输入用户名和密码。而 cookie 可以创建有状态的会话。好处在于服务器不会记忆 HTTP 的状态,能减轻服务器的压力。
    • 明文传输:给调试带来便利性,但是用户毫无隐私可言,不安全。

    HTTP 报文格式

    请求报文格式

    客户端发送 HTTP 请求到服务器的请求消息:请求行、请求头、空行和请求体四个部分组成。

    POST / HTTP1.1
     Host:www.wrox.com
     User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
     Content-Type:application/x-www-form-urlencoded
    diff --git a/assets/002-annotation.html-oZ12-DLl.js b/assets/002-annotation.html-jSTF0IVD.js
    similarity index 99%
    rename from assets/002-annotation.html-oZ12-DLl.js
    rename to assets/002-annotation.html-jSTF0IVD.js
    index 598a598a9b..44848d4483 100644
    --- a/assets/002-annotation.html-oZ12-DLl.js
    +++ b/assets/002-annotation.html-jSTF0IVD.js
    @@ -1,4 +1,4 @@
    -import{_ as p,r as a,o as c,c as l,a as n,d as s,b as t,w as i,e as u}from"./app-2R243if7.js";const r={},k={class:"hint-container info"},d=n("p",{class:"hint-container-title"},"相关信息",-1),v={href:"https://codesandbox.io/p/sandbox/image-annotation-pht676?file=%2Fsrc%2FApp.js%3A210%2C56",target:"_blank",rel:"noopener noreferrer"},m=u(`

    实现图片批注有两种方案,一种是通过 SVG 绘制,一种是通过 Canvas 绘制。以下是两者对比:

    特点CanvasSVG
    控制级别像素级控制矢量图形级别控制
    编辑操作难以直接编辑已绘制的元素易于访问、操作和编辑 DOM 中的元素
    图形类型更适合复杂绘图和动画适合简单图形和图标
    性能处理大量图形和复杂交互时性能较好处理大规模动态变化时性能较差
    可保存状态绘制后的图像可以保存为图片图像以 XML 格式保存,易于修改和存储
    适用场景复杂交互和动态绘制静态或少量动态变化的图形

    综上,选择使用 Canvas 实现图片批注。

    加载图片

    实现图片批注的第一步是加载图片,这里使用 FileReader 读取图片文件,然后将图片绘制到 Canvas 上。

    这里需要注意的是图片绘制位置,如果图片的宽高比和容器的宽高比不一致,需要根据图片和容器的比例调整绘制位置和大小。

    注意

    这里需要存储当前图片,以便后续绘制批注时使用。

    const fillImage = (file) => {
    +import{_ as p,r as a,o as c,c as l,a as n,d as s,b as t,w as i,e as u}from"./app-I81jsmus.js";const r={},k={class:"hint-container info"},d=n("p",{class:"hint-container-title"},"相关信息",-1),v={href:"https://codesandbox.io/p/sandbox/image-annotation-pht676?file=%2Fsrc%2FApp.js%3A210%2C56",target:"_blank",rel:"noopener noreferrer"},m=u(`

    实现图片批注有两种方案,一种是通过 SVG 绘制,一种是通过 Canvas 绘制。以下是两者对比:

    特点CanvasSVG
    控制级别像素级控制矢量图形级别控制
    编辑操作难以直接编辑已绘制的元素易于访问、操作和编辑 DOM 中的元素
    图形类型更适合复杂绘图和动画适合简单图形和图标
    性能处理大量图形和复杂交互时性能较好处理大规模动态变化时性能较差
    可保存状态绘制后的图像可以保存为图片图像以 XML 格式保存,易于修改和存储
    适用场景复杂交互和动态绘制静态或少量动态变化的图形

    综上,选择使用 Canvas 实现图片批注。

    加载图片

    实现图片批注的第一步是加载图片,这里使用 FileReader 读取图片文件,然后将图片绘制到 Canvas 上。

    这里需要注意的是图片绘制位置,如果图片的宽高比和容器的宽高比不一致,需要根据图片和容器的比例调整绘制位置和大小。

    注意

    这里需要存储当前图片,以便后续绘制批注时使用。

    const fillImage = (file) => {
       const reader = new FileReader()
     
       reader.onload = (e) => {
    diff --git a/assets/002-build-git-server.html-C4U8vbpS.js b/assets/002-build-git-server.html-k7ZuvaaM.js
    similarity index 99%
    rename from assets/002-build-git-server.html-C4U8vbpS.js
    rename to assets/002-build-git-server.html-k7ZuvaaM.js
    index 41b94bb024..17c1e48f87 100644
    --- a/assets/002-build-git-server.html-C4U8vbpS.js
    +++ b/assets/002-build-git-server.html-k7ZuvaaM.js
    @@ -1,4 +1,4 @@
    -import{_ as d,r as i,o as c,c as o,a as e,d as s,b as a,w as r,e as t}from"./app-2R243if7.js";const p={},u=t(`

    提示

    git 私服作用:

    • 自己电脑和公司(或者实验室)电脑随时同步资料
    • GitHub、Gitee 私有仓库都是限流的,文件一旦多了,或者有图片文件,git pull 的时候半天拉不下来
    • 保存一些隐私文件

    开始搭建

    • 服务器:centos7.9
    • 本地电脑: Windows10

    如果服务器没装 git 可以使用以下命令安装:

    yum install git
    +import{_ as d,r as i,o as c,c as o,a as e,d as s,b as a,w as r,e as t}from"./app-I81jsmus.js";const p={},u=t(`

    提示

    git 私服作用:

    • 自己电脑和公司(或者实验室)电脑随时同步资料
    • GitHub、Gitee 私有仓库都是限流的,文件一旦多了,或者有图片文件,git pull 的时候半天拉不下来
    • 保存一些隐私文件

    开始搭建

    • 服务器:centos7.9
    • 本地电脑: Windows10

    如果服务器没装 git 可以使用以下命令安装:

    yum install git
     

    创建 git 用户

    `,6),h=t(`
    adduser git
     

    后面所有的操作都在 git 用户下进行:

    [root@instance-5fcyjde7 ~]su - git
     

    看一下自己所在的目录,是不是在 git 目录下面:

    [git@instance-5fcyjde7 ~]$ pwd
    diff --git a/assets/002-package-manager.html-ooVRb0tm.js b/assets/002-package-manager.html-8ga7lBMd.js
    similarity index 97%
    rename from assets/002-package-manager.html-ooVRb0tm.js
    rename to assets/002-package-manager.html-8ga7lBMd.js
    index 993898eccf..8860b6be56 100644
    --- a/assets/002-package-manager.html-ooVRb0tm.js
    +++ b/assets/002-package-manager.html-8ga7lBMd.js
    @@ -1 +1 @@
    -import{_ as n,r as a,o as r,c as o,a as e,d as c,b as i}from"./app-2R243if7.js";const p={},s=e("h2",{id:"npm",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#npm"},[e("span",null,"npm")])],-1),l={href:"https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally",target:"_blank",rel:"noopener noreferrer"};function m(g,d){const t=a("ExternalLinkIcon");return r(),o("div",null,[s,e("p",null,[e("a",l,[c("https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally"),i(t)])])])}const y=n(p,[["render",m],["__file","002-package-manager.html.vue"]]),b=JSON.parse('{"path":"/frontend/engineering/basic/002-package-manager.html","title":"包管理工具","lang":"zh-CN","frontmatter":{"title":"包管理工具","date":"2023-12-23T00:00:00.000Z","category":["工程化"],"tag":["frontend","npm","cnpm","yarn","pnpm"],"description":"npm https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally ","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/engineering/basic/002-package-manager.html"}],["meta",{"property":"og:title","content":"包管理工具"}],["meta",{"property":"og:description","content":"npm https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally "}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-07T05:30:24.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:tag","content":"npm"}],["meta",{"property":"article:tag","content":"cnpm"}],["meta",{"property":"article:tag","content":"yarn"}],["meta",{"property":"article:tag","content":"pnpm"}],["meta",{"property":"article:published_time","content":"2023-12-23T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-07T05:30:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"包管理工具\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-12-23T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-07T05:30:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 npm","slug":"npm","link":"#npm","children":[]}],"git":{"createdTime":1704616104000,"updatedTime":1707283824000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":2}]},"readingTime":{"minutes":0.1,"words":30},"filePathRelative":"frontend/engineering/basic/002-package-manager.md","localizedDate":"2023年12月23日","excerpt":"","autoDesc":true}');export{y as comp,b as data};
    +import{_ as n,r as a,o as r,c as o,a as e,d as c,b as i}from"./app-I81jsmus.js";const p={},s=e("h2",{id:"npm",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#npm"},[e("span",null,"npm")])],-1),l={href:"https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally",target:"_blank",rel:"noopener noreferrer"};function m(g,d){const t=a("ExternalLinkIcon");return r(),o("div",null,[s,e("p",null,[e("a",l,[c("https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally"),i(t)])])])}const y=n(p,[["render",m],["__file","002-package-manager.html.vue"]]),b=JSON.parse('{"path":"/frontend/engineering/basic/002-package-manager.html","title":"包管理工具","lang":"zh-CN","frontmatter":{"title":"包管理工具","date":"2023-12-23T00:00:00.000Z","category":["工程化"],"tag":["frontend","npm","cnpm","yarn","pnpm"],"description":"npm https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally ","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/engineering/basic/002-package-manager.html"}],["meta",{"property":"og:title","content":"包管理工具"}],["meta",{"property":"og:description","content":"npm https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally "}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-07T05:30:24.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:tag","content":"npm"}],["meta",{"property":"article:tag","content":"cnpm"}],["meta",{"property":"article:tag","content":"yarn"}],["meta",{"property":"article:tag","content":"pnpm"}],["meta",{"property":"article:published_time","content":"2023-12-23T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-07T05:30:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"包管理工具\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-12-23T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-07T05:30:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 npm","slug":"npm","link":"#npm","children":[]}],"git":{"createdTime":1704616104000,"updatedTime":1707283824000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":2}]},"readingTime":{"minutes":0.1,"words":30},"filePathRelative":"frontend/engineering/basic/002-package-manager.md","localizedDate":"2023年12月23日","excerpt":"","autoDesc":true}');export{y as comp,b as data};
    diff --git a/assets/002-quick-start.html-yQRWabdS.js b/assets/002-quick-start.html-GzDTnx7H.js
    similarity index 99%
    rename from assets/002-quick-start.html-yQRWabdS.js
    rename to assets/002-quick-start.html-GzDTnx7H.js
    index c3212b306e..c65e56771d 100644
    --- a/assets/002-quick-start.html-yQRWabdS.js
    +++ b/assets/002-quick-start.html-GzDTnx7H.js
    @@ -1,4 +1,4 @@
    -import{_ as d,r as c,o as u,c as r,b as a,w as e,a as t,d as n,e as l}from"./app-2R243if7.js";const h={},g=l('

    HTML

    超文本标记语言(HyperText Markup Language, HTML)是一种用于创建网页的标记语言。

    HTML 不是一个编程语言,而是一个用于定义文档内容结构的标记语言。由于它不仅能插入普通的文本,还可以插入图片、音频、视频、超链接等内容,因此被称为超文本标记语言。

    比如,对于一段文字,可以如下进行表示:

    ',3),m=t("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[t("pre",{class:"language-html"},[t("code",null,[t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"<"),n("p")]),t("span",{class:"token punctuation"},">")]),n("Neymar is one of the best footballers dribbling."),t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"")]),n(` +import{_ as d,r as c,o as u,c as r,b as a,w as e,a as t,d as n,e as l}from"./app-I81jsmus.js";const h={},g=l('

    HTML

    超文本标记语言(HyperText Markup Language, HTML)是一种用于创建网页的标记语言。

    HTML 不是一个编程语言,而是一个用于定义文档内容结构的标记语言。由于它不仅能插入普通的文本,还可以插入图片、音频、视频、超链接等内容,因此被称为超文本标记语言。

    比如,对于一段文字,可以如下进行表示:

    ',3),m=t("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[t("pre",{class:"language-html"},[t("code",null,[t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"<"),n("p")]),t("span",{class:"token punctuation"},">")]),n("Neymar is one of the best footballers dribbling."),t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"")]),n(` `)])]),t("div",{class:"line-numbers","aria-hidden":"true"},[t("div",{class:"line-number"})])],-1),k=l(`

    p 元素

    p 即为 paragraphs 的缩写,表示段落元素。

    HTML 元素语法

    HTML 文档由元素和文本组成,例如在上述的例子中:

    <p>Neymar is one of the best footballers dribbling.</p>
     

    这个 <p> 元素由开始标签 <p>、内容(content)和结束标签 </p> 组成。

    元素

    在 HTML 中,元素由三个部分组成:

    • 开始标签(Opening tag):包含元素的名称(本例为 p),被 <> 所包围。开头标签标志着元素开始或开始生效的地方。
    • 内容(Content):元素的内容,本例中就是段落的文本。
    • 结束标签(Closing tag):与开始标签相似,只是其在元素名之前包含了一个 /。这标志着该元素的结束。

    注意

    没有包含关闭标签会产生奇怪的结果。

    `,9),b={class:"hint-container tip"},v=t("p",{class:"hint-container-title"},"提示",-1),_={href:"https://html.spec.whatwg.org/multipage/syntax.html#optional-tags",target:"_blank",rel:"noopener noreferrer"},y=l('

    块级元素和内联元素

    块级元素在页面中以块的形式展现。一个块级元素出现在它前面的内容之后的新行上。任何跟在块级元素后面的内容也会出现在新的行上。

    块级元素通常是页面上的结构元素。例如,一个块级元素可能代表标题、段落、列表、导航菜单或页脚。

    一个块级元素不会嵌套在一个内联元素里面,但它可能嵌套在另一个块级元素里面。

    内联元素通常出现在块级元素中并环绕文档内容的一小部分,而不是一整个段落或者一组内容。内联元素不会导致文本换行。它通常与文本一起使用,例如,<a> 元素创建一个超链接,<em><strong> 等元素创建强调。

    ',5),T={class:"hint-container tip"},f=t("p",{class:"hint-container-title"},"提示",-1),x={href:"https://html.spec.whatwg.org/multipage/indices.html#element-content-categories",target:"_blank",rel:"noopener noreferrer"},L=t("p",null,"在这篇文章中提到的「块」和「内联」,不应该与 CSS 盒子的类型中的同名术语相混淆。尽管它们默认是相关的,但改变 CSS 显示类型并不会改变元素的分类,也不会影响它可以包含和被包含于哪些元素。防止这种混淆也是 HTML5 摒弃这些术语的原因之一。",-1),M={href:"https://developer.mozilla.org/zh-CN/docs/Glossary/Block-level_content",target:"_blank",rel:"noopener noreferrer"},H={href:"https://developer.mozilla.org/zh-CN/docs/Glossary/Inline-level_content",target:"_blank",rel:"noopener noreferrer"},q=t("h3",{id:"元素嵌套",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#元素嵌套"},[t("span",null,"元素嵌套")])],-1),E=t("p",null,"元素可以进行嵌套,比如:",-1),A=t("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[t("pre",{class:"language-html"},[t("code",null,[t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"<"),n("p")]),t("span",{class:"token punctuation"},">")]),n("Neymar is one of the best footballers "),t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"<"),n("strong")]),t("span",{class:"token punctuation"},">")]),n("dribbling"),t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"")]),n("."),t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"")]),n(` `)])]),t("div",{class:"line-numbers","aria-hidden":"true"},[t("div",{class:"line-number"})])],-1),C=t("h3",{id:"空元素",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#空元素"},[t("span",null,"空元素")])],-1),D=t("p",null,[n("不是所有的元素都拥有开始标签、内容合结束标签。一些元素只有一个标签,用来在此元素的位置插入/嵌入一些东西,这些元素称为"),t("strong",null,"空元素"),n("。")],-1),z=t("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[t("pre",{class:"language-html"},[t("code",null,[t("span",{class:"token tag"},[t("span",{class:"token tag"},[t("span",{class:"token punctuation"},"<"),n("img")]),n(),t("span",{class:"token attr-name"},"width"),t("span",{class:"token attr-value"},[t("span",{class:"token punctuation attr-equals"},"="),t("span",{class:"token punctuation"},'"'),n("50px"),t("span",{class:"token punctuation"},'"')]),n(),t("span",{class:"token attr-name"},"src"),t("span",{class:"token attr-value"},[t("span",{class:"token punctuation attr-equals"},"="),t("span",{class:"token punctuation"},'"'),n("/blog/assets/image/frontend/basic/html/002/avatar.jpg"),t("span",{class:"token punctuation"},'"')]),n(),t("span",{class:"token punctuation"},"/>")]),n(` diff --git a/assets/002-relation-model.html-GwrX2GKL.js b/assets/002-relation-model.html-eh9sdhEc.js similarity index 99% rename from assets/002-relation-model.html-GwrX2GKL.js rename to assets/002-relation-model.html-eh9sdhEc.js index fe3afd4db0..f4d611e57c 100644 --- a/assets/002-relation-model.html-GwrX2GKL.js +++ b/assets/002-relation-model.html-eh9sdhEc.js @@ -1,4 +1,4 @@ -import{_ as a,o as n,c as t,e as s}from"./app-2R243if7.js";const e={},l=s(`

    本文介绍最重要的数据模型之一:「二维表」,或者称为「关系」。

    数据模型概述

    什么是数据模型

    数据模型是用于描述数据或信息的标记,一般由三部分组成:

    • 数据结构:物理数据模型,也称概念模型;
    • 数据操作:查询、修改;
    • 数据约束。

    一些重要的数据模型

    现今,数据库系统中有两种比较重要的数据模型:

    • 关系数据模型,包括对象关系模型的拓展;
    • 半结构化数据模型,包括 XML 相关的标准。

    关系模型

    关系模型是一种基于「二维表」的数据模型,由 E.F.Codd 于 1970 年提出。

    以电影关系模型为例,这张表中会有大量的数据行,一部电影对应一行数据。

    titleyearlengthgenre
    The Godfather1972175Crime
    The Shawshank Redemption1994142Drama
    The Godfather: Part II1974202Crime

    关系模型具有 高效性易用性

    • 提供简单的方法进行建模;
    • 提供了一套有限但有效的操作集。

    半结构化模型

    目前半结构话模型最主要的体现就是 XML,标签与 HTML 类似。

    <Movies>
    +import{_ as a,o as n,c as t,e as s}from"./app-I81jsmus.js";const e={},l=s(`

    本文介绍最重要的数据模型之一:「二维表」,或者称为「关系」。

    数据模型概述

    什么是数据模型

    数据模型是用于描述数据或信息的标记,一般由三部分组成:

    • 数据结构:物理数据模型,也称概念模型;
    • 数据操作:查询、修改;
    • 数据约束。

    一些重要的数据模型

    现今,数据库系统中有两种比较重要的数据模型:

    • 关系数据模型,包括对象关系模型的拓展;
    • 半结构化数据模型,包括 XML 相关的标准。

    关系模型

    关系模型是一种基于「二维表」的数据模型,由 E.F.Codd 于 1970 年提出。

    以电影关系模型为例,这张表中会有大量的数据行,一部电影对应一行数据。

    titleyearlengthgenre
    The Godfather1972175Crime
    The Shawshank Redemption1994142Drama
    The Godfather: Part II1974202Crime

    关系模型具有 高效性易用性

    • 提供简单的方法进行建模;
    • 提供了一套有限但有效的操作集。

    半结构化模型

    目前半结构话模型最主要的体现就是 XML,标签与 HTML 类似。

    <Movies>
       <Movie>
         <title>The Godfather</title>
         <year>1972</year>
    diff --git a/assets/002-selector.html-_GCwigBR.js b/assets/002-selector.html-Y8lG2Qy6.js
    similarity index 99%
    rename from assets/002-selector.html-_GCwigBR.js
    rename to assets/002-selector.html-Y8lG2Qy6.js
    index 58c4bb472b..1a99d0127d 100644
    --- a/assets/002-selector.html-_GCwigBR.js
    +++ b/assets/002-selector.html-Y8lG2Qy6.js
    @@ -1,4 +1,4 @@
    -import{_ as p,r as o,o as i,c as u,b as a,w as e,a as n,d as s,e as c}from"./app-2R243if7.js";const r={},d=c(`

    CSS 中可以通过选择器来选中 HTML 文档中的元素。

    种类

    CSS 的选择器一共分为四种,分别是:

    1. 基本选择器
    2. 选择符
    3. 伪类
    4. 伪元素

    基本选择器

    基本选择器共五个,是指平时使用的通配符选择器、标签选择器、ID 选择器、类选择器、属性选择器。

    /* 通配符选择器,效率较低 */
    +import{_ as p,r as o,o as i,c as u,b as a,w as e,a as n,d as s,e as c}from"./app-I81jsmus.js";const r={},d=c(`

    CSS 中可以通过选择器来选中 HTML 文档中的元素。

    种类

    CSS 的选择器一共分为四种,分别是:

    1. 基本选择器
    2. 选择符
    3. 伪类
    4. 伪元素

    基本选择器

    基本选择器共五个,是指平时使用的通配符选择器、标签选择器、ID 选择器、类选择器、属性选择器。

    /* 通配符选择器,效率较低 */
     * {} 
     
     /* 标签选择器 */
    diff --git a/assets/002-types.html-252gQD2-.js b/assets/002-types.html-X5moh2oe.js
    similarity index 99%
    rename from assets/002-types.html-252gQD2-.js
    rename to assets/002-types.html-X5moh2oe.js
    index 52d55b1e47..8807c7cf08 100644
    --- a/assets/002-types.html-252gQD2-.js
    +++ b/assets/002-types.html-X5moh2oe.js
    @@ -1,4 +1,4 @@
    -import{_ as e,r as t,o,c as p,a as c,d as n,b as l,w as i,e as s}from"./app-2R243if7.js";const d={},u=s("

    ECMAScript 有 7 种简单数据类型(也称为原始类型):UndefinedNullBooleanNumberStringSymbolBigInt

    Symbol(符号)是 ES6 新增的,BigInt 是 ES10 新增。

    还有一种复杂数据类型叫 Object(对象)。Object 是一种 无序 键值对的集合。

    不同的数据存放在不同的空间中:

    • 栈空间:JavaScript 对于 基本数据类型 内存的分配会在执行时直接在栈空间进行分配;
    • 堆空间:JavaScript 对于 复杂数据类型 内存的分配会在堆内存中开辟一块空间,并且将这块空间的指针(地址)返回给变量引用(存放在栈空间)。
    ",5),r=s(`

    因此,栈空间不会设置太大,主要用来存放基本数据类型(占用空间小),而像复杂数据类型,因为他们的占用空间一般较大,因此会被存放在堆空间中。

    Undefined

    该类型只有一个值,即 undefined,当时用 varlet 没有初始化时,就相当于给变量赋值为了 undefined

    Null

    该类型同样只有一个值 null,表示一个空对象指针,因此使用 typeof 操作符判断会返回 object

    let car = null
    +import{_ as e,r as t,o,c as p,a as c,d as n,b as l,w as i,e as s}from"./app-I81jsmus.js";const d={},u=s("

    ECMAScript 有 7 种简单数据类型(也称为原始类型):UndefinedNullBooleanNumberStringSymbolBigInt

    Symbol(符号)是 ES6 新增的,BigInt 是 ES10 新增。

    还有一种复杂数据类型叫 Object(对象)。Object 是一种 无序 键值对的集合。

    不同的数据存放在不同的空间中:

    • 栈空间:JavaScript 对于 基本数据类型 内存的分配会在执行时直接在栈空间进行分配;
    • 堆空间:JavaScript 对于 复杂数据类型 内存的分配会在堆内存中开辟一块空间,并且将这块空间的指针(地址)返回给变量引用(存放在栈空间)。
    ",5),r=s(`

    因此,栈空间不会设置太大,主要用来存放基本数据类型(占用空间小),而像复杂数据类型,因为他们的占用空间一般较大,因此会被存放在堆空间中。

    Undefined

    该类型只有一个值,即 undefined,当时用 varlet 没有初始化时,就相当于给变量赋值为了 undefined

    Null

    该类型同样只有一个值 null,表示一个空对象指针,因此使用 typeof 操作符判断会返回 object

    let car = null
     console.log(car) // 'object'
     

    在定义将来要保存对象值的变量时,建议使用 null 来初始化,不要使用其他值(如 undefined)。

    这样,只要检查这个变量的值是不是 null 就可以知道这个变量是否在后来被重新赋予了一个对象的引用,比如:

    if (car !== null) {
       // car 是一个对象的引用
    diff --git a/assets/002-webpack-css.html-QMyYbPPn.js b/assets/002-webpack-css.html-C0hFA9Ag.js
    similarity index 99%
    rename from assets/002-webpack-css.html-QMyYbPPn.js
    rename to assets/002-webpack-css.html-C0hFA9Ag.js
    index 59a44632e3..b98e02b29e 100644
    --- a/assets/002-webpack-css.html-QMyYbPPn.js
    +++ b/assets/002-webpack-css.html-C0hFA9Ag.js
    @@ -1,4 +1,4 @@
    -import{_ as c,r as l,o as d,c as o,a as n,d as s,b as e,w as i,e as p}from"./app-2R243if7.js";const r={},u={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},v=p(`

    index.html

     <!DOCTYPE html>
    +import{_ as c,r as l,o as d,c as o,a as n,d as s,b as e,w as i,e as p}from"./app-I81jsmus.js";const r={},u={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},v=p(`

    index.html

     <!DOCTYPE html>
      <html lang="en">
      <head>
        <meta charset="UTF-8">
    diff --git a/assets/003-box-model.html-XDv8wKIC.js b/assets/003-box-model.html-FIoUn3l-.js
    similarity index 99%
    rename from assets/003-box-model.html-XDv8wKIC.js
    rename to assets/003-box-model.html-FIoUn3l-.js
    index 9a4f9c7834..255f5bfa8a 100644
    --- a/assets/003-box-model.html-XDv8wKIC.js
    +++ b/assets/003-box-model.html-FIoUn3l-.js
    @@ -1,4 +1,4 @@
    -import{_ as l,r as c,o as d,c as p,a as e,d as n,b as s,w as a,e as t}from"./app-2R243if7.js";const r="/blog/assets/image/frontend/basic/css/003/box.png",u="/blog/assets/image/frontend/basic/css/003/normal-box.png",g="/blog/assets/image/frontend/basic/css/003/abnormal-box.png",b={},m=t('

    盒模型

    所有的 HTML 元素都可以看作一个盒子,他由外边距 margin、边框 border、内边距 padding和内容区 content 组成。

    盒模型
    盒模型

    标准盒模型和怪异盒模型

    ',4),h=t('

    他们表现在盒模型中差异:

    • 标准盒模型:widthheight 的计算值都不包含 borderpadding,而只会应用到这个元素的 content
    标准盒模型
    标准盒模型
    • 怪异盒模型:widthheight 属性包括 contentpaddingborder,不算 margin
    怪异盒模型
    怪异盒模型

    box-sizing

    在 CSS 中,可以设置 box-sizing 属性来设置盒子模型。语法如下:

    box-sizing: content-box|border-box|inherit;
    +import{_ as l,r as c,o as d,c as p,a as e,d as n,b as s,w as a,e as t}from"./app-I81jsmus.js";const r="/blog/assets/image/frontend/basic/css/003/box.png",u="/blog/assets/image/frontend/basic/css/003/normal-box.png",g="/blog/assets/image/frontend/basic/css/003/abnormal-box.png",b={},m=t('

    盒模型

    所有的 HTML 元素都可以看作一个盒子,他由外边距 margin、边框 border、内边距 padding和内容区 content 组成。

    盒模型
    盒模型

    标准盒模型和怪异盒模型

    ',4),h=t('

    他们表现在盒模型中差异:

    • 标准盒模型:widthheight 的计算值都不包含 borderpadding,而只会应用到这个元素的 content
    标准盒模型
    标准盒模型
    • 怪异盒模型:widthheight 属性包括 contentpaddingborder,不算 margin
    怪异盒模型
    怪异盒模型

    box-sizing

    在 CSS 中,可以设置 box-sizing 属性来设置盒子模型。语法如下:

    box-sizing: content-box|border-box|inherit;
     
    • content-box:标准盒模型;
    • border-box:怪异盒模型;
    • inherit:规定应从父元素继承 box-sizing 属性的值。

    一般希望将 box-sizing 设置为 border-box,能使我们更容易地设定一个元素的宽高:

    * {
       box-sizing: border-box;
     }
    diff --git a/assets/003-configure-bt.html-3veiWlcs.js b/assets/003-configure-bt.html-3e4O9NhM.js
    similarity index 99%
    rename from assets/003-configure-bt.html-3veiWlcs.js
    rename to assets/003-configure-bt.html-3e4O9NhM.js
    index 3d2d0f0cb5..b0564460b4 100644
    --- a/assets/003-configure-bt.html-3veiWlcs.js
    +++ b/assets/003-configure-bt.html-3e4O9NhM.js
    @@ -1,4 +1,4 @@
    -import{_ as s,r,o,c as i,a as e,d as t,b as a,e as l}from"./app-2R243if7.js";const c={},p={class:"hint-container tip"},d=e("p",{class:"hint-container-title"},"提示",-1),m=e("p",null,"服务器系统:centos 7.9。",-1),u={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},h=e("p",null,"为了方便一键配置部署环境,因此选择宝塔面板。",-1),g=l(`

    安装宝塔面板

    yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
    +import{_ as s,r,o,c as i,a as e,d as t,b as a,e as l}from"./app-I81jsmus.js";const c={},p={class:"hint-container tip"},d=e("p",{class:"hint-container-title"},"提示",-1),m=e("p",null,"服务器系统:centos 7.9。",-1),u={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},h=e("p",null,"为了方便一键配置部署环境,因此选择宝塔面板。",-1),g=l(`

    安装宝塔面板

    yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
     

    大概过两分钟即可安装成功,复制外网面板地址到浏览器打开,输入下面的 usernamepassword。进去之后会弹出 推荐安装套件,因为只要部署 vuepress, 因此这里安装 nginx 就好。选择编译安装,更加稳定。

    step1-install-bt
    step1-install-bt
    step2-install-nginx
    step2-install-nginx

    如果之后忘记用户名和密码,可以通过以下命令查找:

    [root@xxxx ~]# bt
     [root@xxxx ~]# 14
     

    参考链接

    `,8),b={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://www.bilibili.com/video/BV12T4y1N7T9?from=search&seid=2220018938681661072&spm_id_from=333.337.0.0",target:"_blank",rel:"noopener noreferrer"};function f(x,y){const n=r("ExternalLinkIcon");return o(),i("div",null,[e("div",p,[d,m,e("p",null,[t("其他系统可以参照 "),e("a",u,[t("官网"),a(n)]),t(" 进行搭建。")]),h]),g,e("ul",null,[e("li",null,[e("a",b,[t("宝塔 Linux 面板安装教程"),a(n)])]),e("li",null,[e("a",_,[t("阿里云服务器 ECS 新手搭建网站视频教程(详细版)"),a(n)])])])])}const w=s(c,[["render",f],["__file","003-configure-bt.html.vue"]]),k=JSON.parse('{"path":"/backend/linux/practice/003-configure-bt.html","title":"配置宝塔面板","lang":"zh-CN","frontmatter":{"title":"配置宝塔面板","date":"2021-05-12T00:00:00.000Z","icon":"baota","category":["linux"],"tag":["项目部署","bt"],"description":" 提示 服务器系统:centos 7.9。 其他系统可以参照 官网 进行搭建。 为了方便一键配置部署环境,因此选择宝塔面板。 安装宝塔面板 大概过两分钟即可安装成功,复制外网面板地址到浏览器打开,输入下面的 username 和 password。进去之后会弹出 推荐安装套件,因为只要部署 vuepress, 因此这里安装 nginx 就好。选择编译安...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/backend/linux/practice/003-configure-bt.html"}],["meta",{"property":"og:title","content":"配置宝塔面板"}],["meta",{"property":"og:description","content":" 提示 服务器系统:centos 7.9。 其他系统可以参照 官网 进行搭建。 为了方便一键配置部署环境,因此选择宝塔面板。 安装宝塔面板 大概过两分钟即可安装成功,复制外网面板地址到浏览器打开,输入下面的 username 和 password。进去之后会弹出 推荐安装套件,因为只要部署 vuepress, 因此这里安装 nginx 就好。选择编译安..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/step1-install-bt.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-09T04:30:54.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"配置宝塔面板"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"项目部署"}],["meta",{"property":"article:tag","content":"bt"}],["meta",{"property":"article:published_time","content":"2021-05-12T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-09T04:30:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"配置宝塔面板\\",\\"image\\":[\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/step1-install-bt.png\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/step2-install-nginx.png\\"],\\"datePublished\\":\\"2021-05-12T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-09T04:30:54.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 安装宝塔面板","slug":"安装宝塔面板","link":"#安装宝塔面板","children":[]},{"level":2,"title":"2 参考链接","slug":"参考链接","link":"#参考链接","children":[]}],"git":{"createdTime":1704774654000,"updatedTime":1704774654000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":0.83,"words":250},"filePathRelative":"backend/linux/practice/003-configure-bt.md","localizedDate":"2021年5月12日","excerpt":"","autoDesc":true}');export{w as comp,k as data}; diff --git a/assets/003-db-design.html-xMFrXx79.js b/assets/003-db-design.html-Oji9hdtE.js similarity index 99% rename from assets/003-db-design.html-xMFrXx79.js rename to assets/003-db-design.html-Oji9hdtE.js index 78413e216f..f6f7ff1a6b 100644 --- a/assets/003-db-design.html-xMFrXx79.js +++ b/assets/003-db-design.html-Oji9hdtE.js @@ -1,3 +1,3 @@ -import{_ as t,o as e,c as d,e as l}from"./app-2R243if7.js";const n={},a=l(`

    关系数据库有一个成熟的理论——依赖。它涉及到如何构建一个良好的关系型数据库模式,以及当一个模式存在缺陷时应该如何改进。

    函数依赖

    定义

    函数依赖:设 R 是一个关系模式,XYR 的属性集,如果对于 R 的任意两个元组 t1t2,如果 t1t2X 上的分量相等,则 t1t2Y 上的分量也相等,那么我们说 Y 函数依赖于 X,记作 X -> Y

    以关系 Movies1 为例。

    titleyearlengthgenrestudioNamestarName
    The Godfather1972175CrimeParamountMarlon Brando
    The Godfather1972175CrimeParamountAl Pacino
    The Godfather1972175CrimeParamountJames Caan

    Movies1 包含了更多的属性,这种模式设计并不是很好。

    该关系有如下 FD:

    title year --> length genre studioName
    +import{_ as t,o as e,c as d,e as l}from"./app-I81jsmus.js";const n={},a=l(`

    关系数据库有一个成熟的理论——依赖。它涉及到如何构建一个良好的关系型数据库模式,以及当一个模式存在缺陷时应该如何改进。

    函数依赖

    定义

    函数依赖:设 R 是一个关系模式,XYR 的属性集,如果对于 R 的任意两个元组 t1t2,如果 t1t2X 上的分量相等,则 t1t2Y 上的分量也相等,那么我们说 Y 函数依赖于 X,记作 X -> Y

    以关系 Movies1 为例。

    titleyearlengthgenrestudioNamestarName
    The Godfather1972175CrimeParamountMarlon Brando
    The Godfather1972175CrimeParamountAl Pacino
    The Godfather1972175CrimeParamountJames Caan

    Movies1 包含了更多的属性,这种模式设计并不是很好。

    该关系有如下 FD:

    title year --> length genre studioName
     

    这个 FD 的含义是:如果两个元组在 titleyear 上的分量相等,则它们在 lengthgenrestudioName 上的分量也相等。

    因此,希望给定 titleyear 就能确定一部电影,进而确定 lengthgenrestudioName

    另外,可以看到下面的 FD,是错误的,它不是一个函数依赖。

    title year --> starName
     

    给定一个 titleyear,可能有多个 starName,因此 starName 不是函数依赖于 titleyear

    关系的键

    :如下面条件满足,则认为一个或多个属性集 {A1, A2, ..., An} 是关系 R 的键。

    • 这些属性函数决定关系的所有其他属性;
    • {A1, A2, ..., An} 的真子集中,没有一个函数能决定 R 的所有其他属性。

    当键只包括一个单独的属性 A 时,称 A 而不是 {A} 是键。

    提示

    一般使用 id 确定唯一主键。

    关系数据库模式设计

    不仔细选择关系数据库模式会带来冗余和相应的异常,关系 Movies1 为例。

    电影 The Godfather 的长度和流派对参演的每个影星都重复了一次,这些信息的重复是冗余的。

    异常

    当试图在一个关系中包含过多的信息时,产生的问题称为冗余,冗余数据会导致以下三种异常:

    • 冗余,信息没有必要在多个元组中重复。
    • 更新异常,如果信息在多个元组中重复,那么更新数据库时就必须在多个地方进行更新,否则会导致不一致。
    • 删除异常,如果从影星集删除 Al Pacino,则数据库中将不在包含这部电影的影星,关系 Movies1 中关于 Al Pacino 的元组就会消失,而且他包含的其他信息如片长 175 分钟等也会在数据库中消失。

    分解关系

    一般用分解关系的办法消除异常。关系 R 的分解涉及分离 R 的属性,以构造两个新的关系模式。

    将关系 Movies1 分解成 关系 Movies2 和关系 Movies3

    • Movies2 包含了除 starName 外的其他所有属性。
    • Movies3 包含了属性 titleyearsstarName

    Movies2

    titleyearlengthgenrestudioName
    The Godfather1972175CrimeParamount

    Movies3

    titleyearstarName
    The Godfather1972Marlon Brando
    The Godfather1972Al Pacino
    The Godfather1972James Caan

    上述所说三种异常都被解决了:

    • 冗余被消除了,关系 Movies2 中电影的片长只出现了一次。
    • 更新异常的风险被消除了,因为关系 Movies2 中的每个电影只出现一次,所以只需要在一个地方更新。
    • 删除异常的风险也被消除了,因为关系 Movies3 中的每个影星只出现一次,所以只需要在一个地方删除。

    设计范式

    第一范式

    第一范式(first normal form, 1NF)只简单地要求每个元组的每个属性都是不可分的(属性具有原子性)。

    第一范式需要根据系统的实际需求决定。比如某些数据库系统中需要用到「地址」这个属性,本来直接将「地址」属性设计成一个数据库表的字段就行。

    但如果系统经常会访问「地址」属性中的「城市」部分,那么就需要将「地址」这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。

    这样设计才算满足了数据库的第一范式。

    编号姓名性别年龄联系电话省份城市详细地址
    1张三201234567湖北武汉123 号
    2李四181234568湖北武汉456 号
    3王五221234569湖北武汉789 号

    第二范式

    第二范式(second normal form, 2NF)要求关系模式必须是 1NF,并且每个非主属性完全函数依赖于任何一个候选键。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

    提示

    候选键(candidate key):由关系的一个或多个属性组成,候选键都具备键的特征,都有资格成为主键。

    比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键。

    订单编号商品编号商品名称商品价格商品数量单位客户所属单位联系方式
    0011苹果510张三单位 11234567
    0022香蕉320张三单位 11234567
    0033苹果510李四单位 21234568

    这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。

    而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。

    订单信息表

    订单编号客户所属单位联系方式
    001张三单位 11234567
    002张三单位 11234567
    003李四单位 21234568

    商品信息表

    商品编号商品名称商品价格单位
    1苹果5
    2香蕉3
    3苹果5

    订单项目表

    订单编号商品编号商品数量
    001110
    002220
    003310

    第三范式

    第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

    上述表中存在一个问题:订单信息表中的客户和联系方式与订单编号直接相关,而与主键无关。所以这里违反了第三范式的设计原则。

    所以需要将订单信息表进行拆分,把客户信息分离到另一个表中,把订单信息表也分离到另一个表中,就非常完美了。如下所示。

    客户信息表

    客户编号客户联系方式
    1张三1234567
    2李四1234568
    `,61),r=[a];function c(i,s){return e(),d("div",null,r)}const g=t(n,[["render",c],["__file","003-db-design.html.vue"]]),h=JSON.parse('{"path":"/backend/database/basic/003-db-design.html","title":"关系数据库设计理论","lang":"zh-CN","frontmatter":{"title":"关系数据库设计理论","date":"2024-01-17T00:00:00.000Z","icon":"theory","category":["database"],"tag":["backend","数据库设计理论"],"description":"关系数据库有一个成熟的理论——依赖。它涉及到如何构建一个良好的关系型数据库模式,以及当一个模式存在缺陷时应该如何改进。 函数依赖 定义 函数依赖:设 R 是一个关系模式,X 和 Y 是 R 的属性集,如果对于 R 的任意两个元组 t1 和 t2,如果 t1 和 t2 在 X 上的分量相等,则 t1 和 t2 在 Y 上的分量也相等,那么我们说 Y 函数...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/backend/database/basic/003-db-design.html"}],["meta",{"property":"og:title","content":"关系数据库设计理论"}],["meta",{"property":"og:description","content":"关系数据库有一个成熟的理论——依赖。它涉及到如何构建一个良好的关系型数据库模式,以及当一个模式存在缺陷时应该如何改进。 函数依赖 定义 函数依赖:设 R 是一个关系模式,X 和 Y 是 R 的属性集,如果对于 R 的任意两个元组 t1 和 t2,如果 t1 和 t2 在 X 上的分量相等,则 t1 和 t2 在 Y 上的分量也相等,那么我们说 Y 函数..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-23T14:35:46.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"backend"}],["meta",{"property":"article:tag","content":"数据库设计理论"}],["meta",{"property":"article:published_time","content":"2024-01-17T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-23T14:35:46.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"关系数据库设计理论\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2024-01-17T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-23T14:35:46.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 函数依赖","slug":"函数依赖","link":"#函数依赖","children":[{"level":3,"title":"1.1 定义","slug":"定义","link":"#定义","children":[]},{"level":3,"title":"1.2 关系的键","slug":"关系的键","link":"#关系的键","children":[]}]},{"level":2,"title":"2 关系数据库模式设计","slug":"关系数据库模式设计","link":"#关系数据库模式设计","children":[{"level":3,"title":"2.1 异常","slug":"异常","link":"#异常","children":[]},{"level":3,"title":"2.2 分解关系","slug":"分解关系","link":"#分解关系","children":[]}]},{"level":2,"title":"3 设计范式","slug":"设计范式","link":"#设计范式","children":[{"level":3,"title":"3.1 第一范式","slug":"第一范式","link":"#第一范式","children":[]},{"level":3,"title":"3.2 第二范式","slug":"第二范式","link":"#第二范式","children":[]},{"level":3,"title":"3.3 第三范式","slug":"第三范式","link":"#第三范式","children":[]}]}],"git":{"createdTime":1706020546000,"updatedTime":1706020546000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":6.11,"words":1832},"filePathRelative":"backend/database/basic/003-db-design.md","localizedDate":"2024年1月17日","excerpt":"","autoDesc":true}');export{g as comp,h as data}; diff --git a/assets/003-doctype.html-slx-qvH9.js b/assets/003-doctype.html-3ssLfMA4.js similarity index 99% rename from assets/003-doctype.html-slx-qvH9.js rename to assets/003-doctype.html-3ssLfMA4.js index 84e029ace7..05c3f29487 100644 --- a/assets/003-doctype.html-slx-qvH9.js +++ b/assets/003-doctype.html-3ssLfMA4.js @@ -1,4 +1,4 @@ -import{_ as t,o as e,c as a,e as n}from"./app-2R243if7.js";const s={},o=n(`

    在 HTML 中,每个 HTML 文档必须以 DOCTYPE 开头,它的目的在于告诉浏览器应该以什么样的文档类型定义(Document Type Definition, DTD)来解析文档。

    DTD

    DTD:文档类型定义,是一套关于标记符的语法规则。

    在 HTML5 以前,HTML 都是基于标准通用标记语言(Standard Generalized Markup Language,SGML)来实现的,而 SGML 使用 DTD 来定义不同版本的语法。

    那么不同的 DOCTYPE 有什么区别呢,这就涉及到了浏览器的渲染模式。

    浏览器渲染模式

    目前浏览器的排版引擎使用三种渲染模式,之所以会出现三种渲染模式,是因为以前并没有一个统一的标准,当 W3C 创立网络标准后,现在需要兼容以前的页面,因此出现了不同的渲染模式。

    • 怪异模式(Quirks mode):以一种宽松的向后兼容的方式解析页面;
    • 接近标准模式(Almost standards mode):尝试以新标准处理旧标准的页面;
    • 标准模式(Standards mode):遵循浏览器支持的最新标准渲染解析页面。

    不同的 DOCTYPE 会决定浏览器以不同的渲染模式解析页面,如果文档没有声明或者使用了错误的 DOCTYPE,那么会导致浏览器以怪异模式来渲染页面。

    HTML4 DOCTYPE

    HTML4 的 DOCTYPE 类型一共有三种:

    HTML4 Strict

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    +import{_ as t,o as e,c as a,e as n}from"./app-I81jsmus.js";const s={},o=n(`

    在 HTML 中,每个 HTML 文档必须以 DOCTYPE 开头,它的目的在于告诉浏览器应该以什么样的文档类型定义(Document Type Definition, DTD)来解析文档。

    DTD

    DTD:文档类型定义,是一套关于标记符的语法规则。

    在 HTML5 以前,HTML 都是基于标准通用标记语言(Standard Generalized Markup Language,SGML)来实现的,而 SGML 使用 DTD 来定义不同版本的语法。

    那么不同的 DOCTYPE 有什么区别呢,这就涉及到了浏览器的渲染模式。

    浏览器渲染模式

    目前浏览器的排版引擎使用三种渲染模式,之所以会出现三种渲染模式,是因为以前并没有一个统一的标准,当 W3C 创立网络标准后,现在需要兼容以前的页面,因此出现了不同的渲染模式。

    • 怪异模式(Quirks mode):以一种宽松的向后兼容的方式解析页面;
    • 接近标准模式(Almost standards mode):尝试以新标准处理旧标准的页面;
    • 标准模式(Standards mode):遵循浏览器支持的最新标准渲染解析页面。

    不同的 DOCTYPE 会决定浏览器以不同的渲染模式解析页面,如果文档没有声明或者使用了错误的 DOCTYPE,那么会导致浏览器以怪异模式来渲染页面。

    HTML4 DOCTYPE

    HTML4 的 DOCTYPE 类型一共有三种:

    HTML4 Strict

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
     

    HTML4 Transitional

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     

    HTML4 Frameset

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
     

    HTML5 DOCTYPE

    因为 HTML5 不基于 SGML,没有为之定义的 DTD,所以理论上 HTML5 不需要再声明 DOCTYPE。

    但是前面提到了:如果文档没有声明或者使用了错误的 DOCTYPE,那么会导致浏览器以怪异模式来渲染页面。因此,HTML5 使用了以下 DOCTYPE:

    <!DOCTYPE html>
    diff --git a/assets/003-file-upload.html-aXCMPaU8.js b/assets/003-file-upload.html-PdEE_gdK.js
    similarity index 99%
    rename from assets/003-file-upload.html-aXCMPaU8.js
    rename to assets/003-file-upload.html-PdEE_gdK.js
    index eab0fced6a..f55493a826 100644
    --- a/assets/003-file-upload.html-aXCMPaU8.js
    +++ b/assets/003-file-upload.html-PdEE_gdK.js
    @@ -1,4 +1,4 @@
    -import{_ as l,r as p,o as i,c as u,b as a,w as o,a as n,d as s,e as c}from"./app-2R243if7.js";const r={},k=c('

    文件上传是前端开发中常见的需求,不管业务如何复杂,最关键的步骤在于如何获取文件数据,这里介绍几种常见的文件上传场景。

    • 选择上传
    • 拖拽上传
    • 粘贴上传

    选择上传

    单文件

    通过 input 标签的 type 属性设置为 file,然后监听 change 事件,获取文件数据。

    ',5),d=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("input")]),s(),n("span",{class:"token attr-name"},"type"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("file"),n("span",{class:"token punctuation"},'"')]),s(),n("span",{class:"token punctuation"},"/>")]),s(` +import{_ as l,r as p,o as i,c as u,b as a,w as o,a as n,d as s,e as c}from"./app-I81jsmus.js";const r={},k=c('

    文件上传是前端开发中常见的需求,不管业务如何复杂,最关键的步骤在于如何获取文件数据,这里介绍几种常见的文件上传场景。

    • 选择上传
    • 拖拽上传
    • 粘贴上传

    选择上传

    单文件

    通过 input 标签的 type 属性设置为 file,然后监听 change 事件,获取文件数据。

    ',5),d=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("input")]),s(),n("span",{class:"token attr-name"},"type"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("file"),n("span",{class:"token punctuation"},'"')]),s(),n("span",{class:"token punctuation"},"/>")]),s(` `),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("div")]),n("span",{class:"token punctuation"},">")]),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),s(` `)])]),n("div",{class:"line-numbers","aria-hidden":"true"},[n("div",{class:"line-number"}),n("div",{class:"line-number"})])],-1),m=n("div",{class:"language-javascript line-numbers-mode","data-ext":"js","data-title":"js"},[n("pre",{class:"language-javascript"},[n("code",null,[n("span",{class:"token keyword"},"const"),s(" input "),n("span",{class:"token operator"},"="),s(" document"),n("span",{class:"token punctuation"},"."),n("span",{class:"token function"},"querySelector"),n("span",{class:"token punctuation"},"("),n("span",{class:"token string"},"'input'"),n("span",{class:"token punctuation"},")"),s(` `),n("span",{class:"token keyword"},"const"),s(" div "),n("span",{class:"token operator"},"="),s(" document"),n("span",{class:"token punctuation"},"."),n("span",{class:"token function"},"querySelector"),n("span",{class:"token punctuation"},"("),n("span",{class:"token string"},"'div'"),n("span",{class:"token punctuation"},")"),s(` diff --git a/assets/003-get-post-difference.html-AcYlQkUc.js b/assets/003-get-post-difference.html-y7Gjbjjy.js similarity index 99% rename from assets/003-get-post-difference.html-AcYlQkUc.js rename to assets/003-get-post-difference.html-y7Gjbjjy.js index 1ad9b9a6d6..a18b811661 100644 --- a/assets/003-get-post-difference.html-AcYlQkUc.js +++ b/assets/003-get-post-difference.html-y7Gjbjjy.js @@ -1 +1 @@ -import{_ as r,r as a,o as l,c as o,a as e,d as n,b as i,e as s}from"./app-2R243if7.js";const c={},p=s('

    概述

    GET 和 POST 是 HTTP 协议中发送请求的方法。

    • GET:请求资源,从服务器获取数据;
    • POST:将数据提交到指定地址。

    二者本质上都是 TCP 链接,因此本质上没有区别,但由于 HTTP 规定和浏览器/服务器的限制,导致它们在实际操作中会有一定区别。

    区别

    • GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
    • GET 产生的 URL 地址可以被 Bookmarked,而 POST 不可以。
    • GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
    • GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
    • GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
    • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。
    • 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
    • GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
    • GET 参数通过 URL 传递,POST 放在 Request body 中。
    • GET 方法是安全且幂等的,POST 方法是不安全且不幂等的。

    提示

    • 安全:请求方法不会破坏服务器上的资源;
    • 幂等:执行多次相同的操作,结果都是相同的。

    误区

    参数长度

    GET 参数有长度限制,但这是因为浏览器对 URL 的长度限制,而不是 HTTP 协议本身对参数长度的限制。HTTP 同样对 POST 参数长度没有限制,而是靠服务器的设置来限制大小的。

    安全性

    POST 相对比 GET 安全性要高。

    通过 GET 提交的请求都将显示到 URL 上,页面会被浏览器缓存,其他人查看历史记录会看到提交的数据。

    这里的相对在于:HTTP 本身是明文传输的协议,无论使用 GET 还是 POST 都有可能受到中间人攻击而造成数据泄露。

    如果 HTTP 链接使用 SSL/TLS,那么 GET 参数也会被加密,但是仍然会在某些地方出现,比如服务器日志、浏览器插件和其他应用。而 POST 数据会被加密并且不会被任何方式泄露。

    提示

    因此如果想要保证总是安全地传输数据,需要使用 HTTPS 上的 POST。

    Request Body

    GET 可以带 Request Body,但不能保证一定能被接收到。如果你用 GET 请求,在 Request Body 携带数据,不同服务器的处理方式也是不同的,有些服务器会帮你读出数据,有些服务器直接忽略。

    数据包

    对于 GET 请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据)。

    对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok。

    并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。

    参考链接

    ',23),T={href:"https://stackoverflow.com/questions/3063530/what-is-the-difference-between-get-and-post-encryption",target:"_blank",rel:"noopener noreferrer"},d={href:"https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/febobo/web-interview/issues/145",target:"_blank",rel:"noopener noreferrer"};function u(m,P){const t=a("ExternalLinkIcon");return l(),o("div",null,[p,e("ul",null,[e("li",null,[e("a",T,[n("https - What is the difference between GET and POST encryption? - Stack Overflow"),i(t)])]),e("li",null,[e("a",d,[n("99%的人都理解错了 HTTP 中 GET 与 POST 的区别 (qq.com)"),i(t)])]),e("li",null,[e("a",h,[n("面试官:说一下 GET 和 POST 的区别? · Issue #145 · febobo/web-interview (github.com)"),i(t)])])])])}const f=r(c,[["render",u],["__file","003-get-post-difference.html.vue"]]),b=JSON.parse('{"path":"/computer-science/networking/003-get-post-difference.html","title":"GET 和 POST 的区别","lang":"zh-CN","frontmatter":{"title":"GET 和 POST 的区别","date":"2022-04-24T00:00:00.000Z","icon":"vs","category":["计算机网络"],"tag":["HTTP"],"description":"概述 GET 和 POST 是 HTTP 协议中发送请求的方法。 GET:请求资源,从服务器获取数据; POST:将数据提交到指定地址。 二者本质上都是 TCP 链接,因此本质上没有区别,但由于 HTTP 规定和浏览器/服务器的限制,导致它们在实际操作中会有一定区别。 区别 GET 在浏览器回退时是无害的,而 POST 会再次提交请求。 GET 产生的...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/computer-science/networking/003-get-post-difference.html"}],["meta",{"property":"og:title","content":"GET 和 POST 的区别"}],["meta",{"property":"og:description","content":"概述 GET 和 POST 是 HTTP 协议中发送请求的方法。 GET:请求资源,从服务器获取数据; POST:将数据提交到指定地址。 二者本质上都是 TCP 链接,因此本质上没有区别,但由于 HTTP 规定和浏览器/服务器的限制,导致它们在实际操作中会有一定区别。 区别 GET 在浏览器回退时是无害的,而 POST 会再次提交请求。 GET 产生的..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-07T05:30:24.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"HTTP"}],["meta",{"property":"article:published_time","content":"2022-04-24T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-07T05:30:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"GET 和 POST 的区别\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2022-04-24T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-07T05:30:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 概述","slug":"概述","link":"#概述","children":[]},{"level":2,"title":"2 区别","slug":"区别","link":"#区别","children":[]},{"level":2,"title":"3 误区","slug":"误区","link":"#误区","children":[{"level":3,"title":"3.1 参数长度","slug":"参数长度","link":"#参数长度","children":[]},{"level":3,"title":"3.2 安全性","slug":"安全性","link":"#安全性","children":[]},{"level":3,"title":"3.3 Request Body","slug":"request-body","link":"#request-body","children":[]},{"level":3,"title":"3.4 数据包","slug":"数据包","link":"#数据包","children":[]}]},{"level":2,"title":"4 参考链接","slug":"参考链接","link":"#参考链接","children":[]}],"git":{"createdTime":1707283824000,"updatedTime":1707283824000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":2.89,"words":866},"filePathRelative":"computer-science/networking/003-get-post-difference.md","localizedDate":"2022年4月24日","excerpt":"","autoDesc":true}');export{f as comp,b as data}; +import{_ as r,r as a,o as l,c as o,a as e,d as n,b as i,e as s}from"./app-I81jsmus.js";const c={},p=s('

    概述

    GET 和 POST 是 HTTP 协议中发送请求的方法。

    • GET:请求资源,从服务器获取数据;
    • POST:将数据提交到指定地址。

    二者本质上都是 TCP 链接,因此本质上没有区别,但由于 HTTP 规定和浏览器/服务器的限制,导致它们在实际操作中会有一定区别。

    区别

    • GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
    • GET 产生的 URL 地址可以被 Bookmarked,而 POST 不可以。
    • GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
    • GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
    • GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
    • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。
    • 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
    • GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
    • GET 参数通过 URL 传递,POST 放在 Request body 中。
    • GET 方法是安全且幂等的,POST 方法是不安全且不幂等的。

    提示

    • 安全:请求方法不会破坏服务器上的资源;
    • 幂等:执行多次相同的操作,结果都是相同的。

    误区

    参数长度

    GET 参数有长度限制,但这是因为浏览器对 URL 的长度限制,而不是 HTTP 协议本身对参数长度的限制。HTTP 同样对 POST 参数长度没有限制,而是靠服务器的设置来限制大小的。

    安全性

    POST 相对比 GET 安全性要高。

    通过 GET 提交的请求都将显示到 URL 上,页面会被浏览器缓存,其他人查看历史记录会看到提交的数据。

    这里的相对在于:HTTP 本身是明文传输的协议,无论使用 GET 还是 POST 都有可能受到中间人攻击而造成数据泄露。

    如果 HTTP 链接使用 SSL/TLS,那么 GET 参数也会被加密,但是仍然会在某些地方出现,比如服务器日志、浏览器插件和其他应用。而 POST 数据会被加密并且不会被任何方式泄露。

    提示

    因此如果想要保证总是安全地传输数据,需要使用 HTTPS 上的 POST。

    Request Body

    GET 可以带 Request Body,但不能保证一定能被接收到。如果你用 GET 请求,在 Request Body 携带数据,不同服务器的处理方式也是不同的,有些服务器会帮你读出数据,有些服务器直接忽略。

    数据包

    对于 GET 请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据)。

    对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok。

    并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。

    参考链接

    ',23),T={href:"https://stackoverflow.com/questions/3063530/what-is-the-difference-between-get-and-post-encryption",target:"_blank",rel:"noopener noreferrer"},d={href:"https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/febobo/web-interview/issues/145",target:"_blank",rel:"noopener noreferrer"};function u(m,P){const t=a("ExternalLinkIcon");return l(),o("div",null,[p,e("ul",null,[e("li",null,[e("a",T,[n("https - What is the difference between GET and POST encryption? - Stack Overflow"),i(t)])]),e("li",null,[e("a",d,[n("99%的人都理解错了 HTTP 中 GET 与 POST 的区别 (qq.com)"),i(t)])]),e("li",null,[e("a",h,[n("面试官:说一下 GET 和 POST 的区别? · Issue #145 · febobo/web-interview (github.com)"),i(t)])])])])}const f=r(c,[["render",u],["__file","003-get-post-difference.html.vue"]]),b=JSON.parse('{"path":"/computer-science/networking/003-get-post-difference.html","title":"GET 和 POST 的区别","lang":"zh-CN","frontmatter":{"title":"GET 和 POST 的区别","date":"2022-04-24T00:00:00.000Z","icon":"vs","category":["计算机网络"],"tag":["HTTP"],"description":"概述 GET 和 POST 是 HTTP 协议中发送请求的方法。 GET:请求资源,从服务器获取数据; POST:将数据提交到指定地址。 二者本质上都是 TCP 链接,因此本质上没有区别,但由于 HTTP 规定和浏览器/服务器的限制,导致它们在实际操作中会有一定区别。 区别 GET 在浏览器回退时是无害的,而 POST 会再次提交请求。 GET 产生的...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/computer-science/networking/003-get-post-difference.html"}],["meta",{"property":"og:title","content":"GET 和 POST 的区别"}],["meta",{"property":"og:description","content":"概述 GET 和 POST 是 HTTP 协议中发送请求的方法。 GET:请求资源,从服务器获取数据; POST:将数据提交到指定地址。 二者本质上都是 TCP 链接,因此本质上没有区别,但由于 HTTP 规定和浏览器/服务器的限制,导致它们在实际操作中会有一定区别。 区别 GET 在浏览器回退时是无害的,而 POST 会再次提交请求。 GET 产生的..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-07T05:30:24.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"HTTP"}],["meta",{"property":"article:published_time","content":"2022-04-24T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-07T05:30:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"GET 和 POST 的区别\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2022-04-24T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-07T05:30:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 概述","slug":"概述","link":"#概述","children":[]},{"level":2,"title":"2 区别","slug":"区别","link":"#区别","children":[]},{"level":2,"title":"3 误区","slug":"误区","link":"#误区","children":[{"level":3,"title":"3.1 参数长度","slug":"参数长度","link":"#参数长度","children":[]},{"level":3,"title":"3.2 安全性","slug":"安全性","link":"#安全性","children":[]},{"level":3,"title":"3.3 Request Body","slug":"request-body","link":"#request-body","children":[]},{"level":3,"title":"3.4 数据包","slug":"数据包","link":"#数据包","children":[]}]},{"level":2,"title":"4 参考链接","slug":"参考链接","link":"#参考链接","children":[]}],"git":{"createdTime":1707283824000,"updatedTime":1707283824000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":2.89,"words":866},"filePathRelative":"computer-science/networking/003-get-post-difference.md","localizedDate":"2022年4月24日","excerpt":"","autoDesc":true}');export{f as comp,b as data}; diff --git a/assets/003-judge-type.html-88H_u1XZ.js b/assets/003-judge-type.html-0nLfDuM_.js similarity index 99% rename from assets/003-judge-type.html-88H_u1XZ.js rename to assets/003-judge-type.html-0nLfDuM_.js index 5a47f26fde..fed5d90375 100644 --- a/assets/003-judge-type.html-88H_u1XZ.js +++ b/assets/003-judge-type.html-0nLfDuM_.js @@ -1,4 +1,4 @@ -import{_ as n,o as s,c as a,e}from"./app-2R243if7.js";const t={},o=e(`

    ECMAScript 有 8 种基本的数据类型( 7 种原始类型和 1 种引用类型)。

    • 原始类型:UndefinedNullBooleanNumberStringSymbolBigInt
    • 引用类型:Object

    下面介绍几种判断变量数据类型的几种方法。

    typeof

    用来返回操作数类型的字符串。语法:

    typeof operand
    +import{_ as n,o as s,c as a,e}from"./app-I81jsmus.js";const t={},o=e(`

    ECMAScript 有 8 种基本的数据类型( 7 种原始类型和 1 种引用类型)。

    • 原始类型:UndefinedNullBooleanNumberStringSymbolBigInt
    • 引用类型:Object

    下面介绍几种判断变量数据类型的几种方法。

    typeof

    用来返回操作数类型的字符串。语法:

    typeof operand
     

    但是由于 JavaScript 设计的缺陷,typeof 基本上不能得到想要的结果。它只有一个实际应用场景:检测一个对象是否已经定义或者是否已经赋值

    特点:

    • 对于基本类型,除 null 外,均可以返回正确结果;
    • 对于引用类型,除 function 外,一律返回 "object"
    • 对于 null,返回 "object" 类型;
    • 对于 function,返回 "function"
    • 对于 array, 返回 "object"
    const fn = function () {}
     
     typeof null // "object",得不到想要的值
    diff --git a/assets/003-tool.html-k6pbBUqo.js b/assets/003-tool.html-DLnZqT_R.js
    similarity index 98%
    rename from assets/003-tool.html-k6pbBUqo.js
    rename to assets/003-tool.html-DLnZqT_R.js
    index bae8f8a106..c1fbf901f6 100644
    --- a/assets/003-tool.html-k6pbBUqo.js
    +++ b/assets/003-tool.html-DLnZqT_R.js
    @@ -1 +1 @@
    -import{_ as a,r as o,o as s,c as i,a as e,d as t,b as r,w as c,e as p}from"./app-2R243if7.js";const d={},h=p('

    JavaScript

    问题:

    • API 兼容,polyfill: core.js
    • 语法增强(compiler),syntax transformer(regenerator),jsx,tsc...

    babel 代码编译工具

    • @babel/core
    • @babel/preset-env

    source code -- ast

    swc(rust) 对标 babel

    ',7),m={href:"https://github.com/estree/estree",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/bramblex/jsjs",target:"_blank",rel:"noopener noreferrer"},b=e("h2",{id:"css",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#css"},[e("span",null,"CSS")])],-1),g=e("p",null,"问题:",-1),_=e("ul",null,[e("li",null,"语法缺失(循环、判断、拼接)"),e("li",null,"功能缺失(颜色函数、数学函数、自定义函数)")],-1),f=e("p",null,"sass/less/stylus --> 预处理器 --> css --> postcss(后处理器) --> polyfill、代码压缩、剪枝",-1),y={href:"https://postcss.org/",target:"_blank",rel:"noopener noreferrer"},j=e("figure",null,[e("img",{src:"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20231223162446.png",alt:"20231223162446",tabindex:"0",loading:"lazy"}),e("figcaption",null,"20231223162446")],-1),v=e("h2",{id:"构建工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#构建工具"},[e("span",null,"构建工具")])],-1),x=e("p",null,"以 webpack 为例。",-1),w=e("li",null,"入口:通过入口分析依赖关系;",-1),k=e("li",null,"开发服务器:webpack serve --> webpack dev server --> express --> 源码变更 --> 浏览器刷新(强制刷新、HMR)websocket",-1),T=e("li",null,"sourcemap",-1),S=e("li",null,"...",-1),P=e("h2",{id:"脚手架",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#脚手架"},[e("span",null,"脚手架")])],-1),z=e("p",null,"提供界面与交互、提供工程模版",-1),C=e("ul",null,[e("li",null,"cra:深度定制,配置需要 eject 或使用 react-rewired 和 customize-cra"),e("li",null,"vue-cli:支持配置覆盖,折中方案"),e("li",null,"...")],-1);function N(Z,E){const n=o("ExternalLinkIcon"),l=o("RouteLink");return s(),i("div",null,[h,e("p",null,[e("a",m,[t("https://github.com/estree/estree"),r(n)])]),e("p",null,[e("a",u,[t("https://github.com/bramblex/jsjs"),r(n)])]),b,g,_,f,e("p",null,[e("a",y,[t("https://postcss.org/"),r(n)])]),j,v,x,e("ol",null,[w,k,e("li",null,[t("文件指纹(hash),涉及到缓存,类似 "),r(l,{to:"/frontend/computer-science/networking/005-HTTP-cache.html#etag-%E5%92%8C-if-none-match"},{default:c(()=>[t("HTTP ETag")]),_:1})]),T,S]),P,z,C])}const J=a(d,[["render",N],["__file","003-tool.html.vue"]]),A=JSON.parse('{"path":"/frontend/engineering/basic/003-tool.html","title":"工具链","lang":"zh-CN","frontmatter":{"title":"工具链","date":"2023-12-23T00:00:00.000Z","category":["工程化"],"tag":["frontend"],"description":"JavaScript 问题: API 兼容,polyfill: core.js 语法增强(compiler),syntax transformer(regenerator),jsx,tsc... babel 代码编译工具 @babel/core @babel/preset-env source code -- ast swc(rust) 对标 babe...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/engineering/basic/003-tool.html"}],["meta",{"property":"og:title","content":"工具链"}],["meta",{"property":"og:description","content":"JavaScript 问题: API 兼容,polyfill: core.js 语法增强(compiler),syntax transformer(regenerator),jsx,tsc... babel 代码编译工具 @babel/core @babel/preset-env source code -- ast swc(rust) 对标 babe..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20231223162446.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-07T08:28:24.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"工具链"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:published_time","content":"2023-12-23T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-07T08:28:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"工具链\\",\\"image\\":[\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20231223162446.png\\"],\\"datePublished\\":\\"2023-12-23T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-07T08:28:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 JavaScript","slug":"javascript","link":"#javascript","children":[]},{"level":2,"title":"2 CSS","slug":"css","link":"#css","children":[]},{"level":2,"title":"3 构建工具","slug":"构建工具","link":"#构建工具","children":[]},{"level":2,"title":"4 脚手架","slug":"脚手架","link":"#脚手架","children":[]}],"git":{"createdTime":1704616104000,"updatedTime":1704616104000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":0.77,"words":232},"filePathRelative":"frontend/engineering/basic/003-tool.md","localizedDate":"2023年12月23日","excerpt":"","autoDesc":true}');export{J as comp,A as data}; +import{_ as a,r as o,o as s,c as i,a as e,d as t,b as r,w as c,e as p}from"./app-I81jsmus.js";const d={},h=p('

    JavaScript

    问题:

    • API 兼容,polyfill: core.js
    • 语法增强(compiler),syntax transformer(regenerator),jsx,tsc...

    babel 代码编译工具

    • @babel/core
    • @babel/preset-env

    source code -- ast

    swc(rust) 对标 babel

    ',7),m={href:"https://github.com/estree/estree",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/bramblex/jsjs",target:"_blank",rel:"noopener noreferrer"},b=e("h2",{id:"css",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#css"},[e("span",null,"CSS")])],-1),g=e("p",null,"问题:",-1),_=e("ul",null,[e("li",null,"语法缺失(循环、判断、拼接)"),e("li",null,"功能缺失(颜色函数、数学函数、自定义函数)")],-1),f=e("p",null,"sass/less/stylus --> 预处理器 --> css --> postcss(后处理器) --> polyfill、代码压缩、剪枝",-1),y={href:"https://postcss.org/",target:"_blank",rel:"noopener noreferrer"},j=e("figure",null,[e("img",{src:"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20231223162446.png",alt:"20231223162446",tabindex:"0",loading:"lazy"}),e("figcaption",null,"20231223162446")],-1),v=e("h2",{id:"构建工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#构建工具"},[e("span",null,"构建工具")])],-1),x=e("p",null,"以 webpack 为例。",-1),w=e("li",null,"入口:通过入口分析依赖关系;",-1),k=e("li",null,"开发服务器:webpack serve --> webpack dev server --> express --> 源码变更 --> 浏览器刷新(强制刷新、HMR)websocket",-1),T=e("li",null,"sourcemap",-1),S=e("li",null,"...",-1),P=e("h2",{id:"脚手架",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#脚手架"},[e("span",null,"脚手架")])],-1),z=e("p",null,"提供界面与交互、提供工程模版",-1),C=e("ul",null,[e("li",null,"cra:深度定制,配置需要 eject 或使用 react-rewired 和 customize-cra"),e("li",null,"vue-cli:支持配置覆盖,折中方案"),e("li",null,"...")],-1);function N(Z,E){const n=o("ExternalLinkIcon"),l=o("RouteLink");return s(),i("div",null,[h,e("p",null,[e("a",m,[t("https://github.com/estree/estree"),r(n)])]),e("p",null,[e("a",u,[t("https://github.com/bramblex/jsjs"),r(n)])]),b,g,_,f,e("p",null,[e("a",y,[t("https://postcss.org/"),r(n)])]),j,v,x,e("ol",null,[w,k,e("li",null,[t("文件指纹(hash),涉及到缓存,类似 "),r(l,{to:"/frontend/computer-science/networking/005-HTTP-cache.html#etag-%E5%92%8C-if-none-match"},{default:c(()=>[t("HTTP ETag")]),_:1})]),T,S]),P,z,C])}const J=a(d,[["render",N],["__file","003-tool.html.vue"]]),A=JSON.parse('{"path":"/frontend/engineering/basic/003-tool.html","title":"工具链","lang":"zh-CN","frontmatter":{"title":"工具链","date":"2023-12-23T00:00:00.000Z","category":["工程化"],"tag":["frontend"],"description":"JavaScript 问题: API 兼容,polyfill: core.js 语法增强(compiler),syntax transformer(regenerator),jsx,tsc... babel 代码编译工具 @babel/core @babel/preset-env source code -- ast swc(rust) 对标 babe...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/engineering/basic/003-tool.html"}],["meta",{"property":"og:title","content":"工具链"}],["meta",{"property":"og:description","content":"JavaScript 问题: API 兼容,polyfill: core.js 语法增强(compiler),syntax transformer(regenerator),jsx,tsc... babel 代码编译工具 @babel/core @babel/preset-env source code -- ast swc(rust) 对标 babe..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20231223162446.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-07T08:28:24.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"工具链"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:published_time","content":"2023-12-23T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-07T08:28:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"工具链\\",\\"image\\":[\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20231223162446.png\\"],\\"datePublished\\":\\"2023-12-23T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-07T08:28:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 JavaScript","slug":"javascript","link":"#javascript","children":[]},{"level":2,"title":"2 CSS","slug":"css","link":"#css","children":[]},{"level":2,"title":"3 构建工具","slug":"构建工具","link":"#构建工具","children":[]},{"level":2,"title":"4 脚手架","slug":"脚手架","link":"#脚手架","children":[]}],"git":{"createdTime":1704616104000,"updatedTime":1704616104000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":0.77,"words":232},"filePathRelative":"frontend/engineering/basic/003-tool.md","localizedDate":"2023年12月23日","excerpt":"","autoDesc":true}');export{J as comp,A as data}; diff --git a/assets/003-webpack-assets.html-NHLlXkyd.js b/assets/003-webpack-assets.html-kB2bMhYm.js similarity index 99% rename from assets/003-webpack-assets.html-NHLlXkyd.js rename to assets/003-webpack-assets.html-kB2bMhYm.js index f6599e2191..c455a37db3 100644 --- a/assets/003-webpack-assets.html-NHLlXkyd.js +++ b/assets/003-webpack-assets.html-kB2bMhYm.js @@ -1,4 +1,4 @@ -import{_ as c,r as i,o as t,c as d,a as s,d as n,b as e,w as o,e as l}from"./app-2R243if7.js";const r={},u={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},k=l(`

    打包图片资源

    在项目中引入图片文件夹,并添加两张图片:

    project

      webpack-demo
    +import{_ as c,r as i,o as t,c as d,a as s,d as n,b as e,w as o,e as l}from"./app-I81jsmus.js";const r={},u={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},k=l(`

    打包图片资源

    在项目中引入图片文件夹,并添加两张图片:

    project

      webpack-demo
       |- node_modules
       |- package-lock.json
       |- package.json
    diff --git a/assets/004-HTTP-development.html-fXKTMLP5.js b/assets/004-HTTP-development.html-BBWBnLvD.js
    similarity index 99%
    rename from assets/004-HTTP-development.html-fXKTMLP5.js
    rename to assets/004-HTTP-development.html-BBWBnLvD.js
    index d1c168b19f..7fc00e9aaa 100644
    --- a/assets/004-HTTP-development.html-fXKTMLP5.js
    +++ b/assets/004-HTTP-development.html-BBWBnLvD.js
    @@ -1,4 +1,4 @@
    -import{_ as n,r as a,o as r,c as o,a as e,d as i,b as l,e as T}from"./app-2R243if7.js";const s={},d=T(`

    整个 HTTP 的演变史就是一个在不断优化性能的过程。

    HTTP/0.9 - 单行协议

    最初版本的 HTTP 协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。

    HTTP/0.9 极其简单:请求由单行指令构成,以唯一可用方法 GET 开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。

    GET /mypage.html
    +import{_ as n,r as a,o as r,c as o,a as e,d as i,b as l,e as T}from"./app-I81jsmus.js";const s={},d=T(`

    整个 HTTP 的演变史就是一个在不断优化性能的过程。

    HTTP/0.9 - 单行协议

    最初版本的 HTTP 协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。

    HTTP/0.9 极其简单:请求由单行指令构成,以唯一可用方法 GET 开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。

    GET /mypage.html
     

    HTTP/0.9 的响应内容不包含 HTTP 头,这意味着只有 HTML 文件可以传送,无法传送其他类型的文件;也没有状态码或错误代码;一旦出现问题,一个特殊的包含问题描述信息的 HTML 文件将会被返回。

    <HTML>
     这是一个非常简单的HTML页面
     </HTML>
    diff --git a/assets/004-advanced-db-model.html-ruy78wNd.js b/assets/004-advanced-db-model.html-tGr-G7p6.js
    similarity index 99%
    rename from assets/004-advanced-db-model.html-ruy78wNd.js
    rename to assets/004-advanced-db-model.html-tGr-G7p6.js
    index cdf8d46053..1ecdc2dbda 100644
    --- a/assets/004-advanced-db-model.html-ruy78wNd.js
    +++ b/assets/004-advanced-db-model.html-tGr-G7p6.js
    @@ -1,2 +1,2 @@
    -import{_ as e,o as t,c as i,e as a}from"./app-2R243if7.js";const l={},r=a(`

    数据库建立的过程从设计阶段开始,需要提出并回答存储什么信息,信息元素之间如何关联,假定有什么样的约束,诸如键或者参考的完整性等等。

    思考 ---> 高级设计 ---> 关系数据库模式 ---> 关系 DBMS
    +import{_ as e,o as t,c as i,e as a}from"./app-I81jsmus.js";const l={},r=a(`

    数据库建立的过程从设计阶段开始,需要提出并回答存储什么信息,信息元素之间如何关联,假定有什么样的约束,诸如键或者参考的完整性等等。

    思考 ---> 高级设计 ---> 关系数据库模式 ---> 关系 DBMS
     

    有几种用符号表达设计的方法。

    • 实体-关系图(E-R 图)
    • UML(统一建模语言)
    • ODL(对象描述语言)

    E/R 模型

    在「实体-联系(entity-relationship model)」 E/R 模型中,数据的结构使用图形化的方式表达,即「实体-联系图」,用到以下三个主要的元素类型:

    1. 实体集——矩形
    2. 属性——椭圆
    3. 联系——菱形

    实体集

    实体是某种抽象对象,相似实体的集合形成实体集。E/R 模型是静态的概念,所以尽管实体类似对象类,但是不会像类一样具有方法。

    例如,每个电影是一个实体,所有电影的集合构成实体集。

    属性

    属性是实体具有的性质,比如电影集中可能有电影名或时长等属性。

    联系

    联系是两个或多个实体集的连接。比如电影 Movies 和影星 Stars 是两个实体集,那么 Stars-in 就是连接 Movies 和 Stars 的联系。

    E/R 模型允许连接任意数目的实体集。

    实体的三种联系

    包含一对一,一对多,多对多三种。

    • 如果 A 到 B 是多对一关系,那么画个带箭头的线段指向 B;
    • 如果是一对一,画两个带箭头的线段;
    • 如果是多对多,画两个不带箭头的线段。
    一对多
    一对多

    提示

    箭头表示最多一个。

    多路联系

    虽然老师可以开设多门课,并且可以教授多名学生,但是对于特定的学生和课程,只有一个老师教授,这就构成了一个三元联系。

    三元联系
    三元联系

    一般只使用二元联系,可以把多元联系转换为二元联系。

    二元联系
    二元联系

    联系中的角色

    一个实体在联系出现几次,就要用几条线连接。

    下图表示一个课程的先修关系,先修关系出现两个 Course 实体,第一个是先修课程,后一个是后修课程,因此需要用两条线来表示这种关系。

    带有角色的联系
    带有角色的联系

    E/R 模型中的子类

    一个实体集中含有一些实体,这些实体有一些共同的属性,可以把这些实体集合成一个父类,然后再把这些实体分成几个子类。

    用一个三角形和两条线来连接类和子类,与子类有关的属性和联系都连到子类上,而与父类和子类都有关的连到父类上。

    子类
    子类

    从 E/R 图到关系设计

    E/R 图是一种概念模型,而关系模式是一种逻辑模型。

    设计原则:

    • 忠实性:实体集和它们的属性应当反映现实
    • 避免冗余:不要重复存储相同的信息
    • 简单性:尽量简化模型,除必要,不添加多余的实体集和联系
    • 选择正确的联系:选择合适的联系类型
    • 选择正确的元素种类:选择合适的实体集和属性

    具体步骤:

    • 明确「宏观行为」:数据库是用来做什么的?比如,管理雇员的信息。
    • 确定「实体集」:对于一系列的行为,确定所管理信息所涉及到的主题范围。这将变成 table,比如,雇用员工,指定具体部门,确定技能等级。
    • 确定「联系」:分析行为,确定 tables 之间有何种关系。比如,部门与雇员之间存在一种关系。给这种关系命名。
    • 细化「行为」:从宏观行为开始,现在仔细检查这些行为,看有哪些行为能转为微观行为。比如,管理雇员的信息可细化为:
      • 增加新员工
      • 修改存在员工信息
      • 删除调走的员工
    • 确定「业务规则」:分析业务规则,确定你要采取哪种。比如,可能有这样一种规则,一个部门有且只能有一个部门领导。这些规则将被设计到数据库的结构中。

    下面举个例子,需求如下: ACME 是一个小公司,在 5 个地方都设有办事处。当前,有 75 名员工。公司准备快速扩大规模,划分了 9 个部门,每个部门都有其领导。为有助于寻求新的员工,人事部门规划了 68 种技能,为将来人事管理作好准备。员工被招进时,每一种技能的专业等级都被确定。

    定义「宏观行为」

    ACME 公司的一些宏观行为包括:

    • 招聘员工
    • 解雇员工
    • 管理员工个人信息
    • 管理公司所需的技能信息
    • 管理哪位员工有哪些技能
    • 管理部门信息
    • 管理办事处信息

    确定「实体集」和「联系」

    可以确定要存放信息的主题领域(表)及其关系,并创建一个基于宏观行为及描述的图表。确定哪些 relationship 是一对多,一对一,及多对多联系。这是一个 E/R 草图,以后会细化。

    确定「实体集」和「联系」
    确定「实体集」和「联系」

    细化宏观行为

    以下微观行为基于上面宏观行为而形成:

    • 增加或删除一个员工
    • 增加或删除一个办事处
    • 列出一个部门中的所有员工
    • 增加一项技能
    • 增加一个员工的一项技能
    • 确定一个员工的技能
    • 确定一个员工每项技能的等级
    • 确定所有拥有相同等级的某项技能的员工
    • 修改员工的技能等级

    这些微观行为可用来确定需要哪些 tablerelationship

    确定业务规则

    业务规则常用于确定一对多,一对一,及多对多关系。

    相关的业务规则可能有:

    • 现在有 5 个办事处;最多允许扩展到 10 个
    • 员工可以改变部门或办事处
    • 每个部门有一个部门领导
    • 每个办事处至多有 3 个电话号码
    • 每个电话号码有一个或多个扩展
    • 员工被招进时,每一种技能的专业等级都被确定
    • 每位员工拥有 3 到 20 个技能
    • 某位员工可能被安排在一个办事处,也可能不安排办事处
    `,54),n=[r];function o(p,s){return t(),i("div",null,n)}const d=e(l,[["render",o],["__file","004-advanced-db-model.html.vue"]]),g=JSON.parse('{"path":"/backend/database/basic/004-advanced-db-model.html","title":"高级数据库模型","lang":"zh-CN","frontmatter":{"title":"高级数据库模型","date":"2024-01-24T00:00:00.000Z","icon":"advanced-model","category":["database"],"tag":["backend","数据库设计理论"],"description":"数据库建立的过程从设计阶段开始,需要提出并回答存储什么信息,信息元素之间如何关联,假定有什么样的约束,诸如键或者参考的完整性等等。 有几种用符号表达设计的方法。 实体-关系图(E-R 图) UML(统一建模语言) ODL(对象描述语言) E/R 模型 在「实体-联系(entity-relationship model)」 E/R 模型中,数据的结构使用...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/backend/database/basic/004-advanced-db-model.html"}],["meta",{"property":"og:title","content":"高级数据库模型"}],["meta",{"property":"og:description","content":"数据库建立的过程从设计阶段开始,需要提出并回答存储什么信息,信息元素之间如何关联,假定有什么样的约束,诸如键或者参考的完整性等等。 有几种用符号表达设计的方法。 实体-关系图(E-R 图) UML(统一建模语言) ODL(对象描述语言) E/R 模型 在「实体-联系(entity-relationship model)」 E/R 模型中,数据的结构使用..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20240225223249.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-27T08:39:09.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"高级数据库模型"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"backend"}],["meta",{"property":"article:tag","content":"数据库设计理论"}],["meta",{"property":"article:published_time","content":"2024-01-24T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-27T08:39:09.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"高级数据库模型\\",\\"image\\":[\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20240225223249.png\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20240225224137.png\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20240225224530.png\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20240225224001.png\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20240225224952.png\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/20240226124732.png\\"],\\"datePublished\\":\\"2024-01-24T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-27T08:39:09.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 E/R 模型","slug":"e-r-模型","link":"#e-r-模型","children":[{"level":3,"title":"1.1 实体的三种联系","slug":"实体的三种联系","link":"#实体的三种联系","children":[]},{"level":3,"title":"1.2 多路联系","slug":"多路联系","link":"#多路联系","children":[]},{"level":3,"title":"1.3 联系中的角色","slug":"联系中的角色","link":"#联系中的角色","children":[]},{"level":3,"title":"1.4 E/R 模型中的子类","slug":"e-r-模型中的子类","link":"#e-r-模型中的子类","children":[]}]},{"level":2,"title":"2 从 E/R 图到关系设计","slug":"从-e-r-图到关系设计","link":"#从-e-r-图到关系设计","children":[{"level":3,"title":"2.1 定义「宏观行为」","slug":"定义「宏观行为」","link":"#定义「宏观行为」","children":[]},{"level":3,"title":"2.2 确定「实体集」和「联系」","slug":"确定「实体集」和「联系」","link":"#确定「实体集」和「联系」","children":[]},{"level":3,"title":"2.3 细化宏观行为","slug":"细化宏观行为","link":"#细化宏观行为","children":[]},{"level":3,"title":"2.4 确定业务规则","slug":"确定业务规则","link":"#确定业务规则","children":[]}]}],"git":{"createdTime":1709023149000,"updatedTime":1709023149000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":5.69,"words":1706},"filePathRelative":"backend/database/basic/004-advanced-db-model.md","localizedDate":"2024年1月24日","excerpt":"","autoDesc":true}');export{d as comp,g as data}; diff --git a/assets/004-automated-deployment.html-gtM4lpgE.js b/assets/004-automated-deployment.html-wjHFQrWt.js similarity index 99% rename from assets/004-automated-deployment.html-gtM4lpgE.js rename to assets/004-automated-deployment.html-wjHFQrWt.js index ad63e68077..e084a96ca8 100644 --- a/assets/004-automated-deployment.html-gtM4lpgE.js +++ b/assets/004-automated-deployment.html-wjHFQrWt.js @@ -1,4 +1,4 @@ -import{_ as c,r as o,o as r,c as d,a as e,d as n,b as s,w as l,e as t}from"./app-2R243if7.js";const p={},m=t('

    提示

    服务器:centos 7.9

    本地电脑:Windows 10

    服务器端

    配置 nginx

    ',3),u=e("figure",null,[e("img",{src:"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/step1-add-site.png",alt:"step1-add-site",tabindex:"0",loading:"lazy"}),e("figcaption",null,"step1-add-site")],-1),v=e("code",null,"root",-1),h=t(`
    step2-nginx-conf
    step2-nginx-conf

    先测试下 nginx 有没有配置成功,本地打包文件:

    yarn build
    +import{_ as c,r as o,o as r,c as d,a as e,d as n,b as s,w as l,e as t}from"./app-I81jsmus.js";const p={},m=t('

    提示

    服务器:centos 7.9

    本地电脑:Windows 10

    服务器端

    配置 nginx

    ',3),u=e("figure",null,[e("img",{src:"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/step1-add-site.png",alt:"step1-add-site",tabindex:"0",loading:"lazy"}),e("figcaption",null,"step1-add-site")],-1),v=e("code",null,"root",-1),h=t(`
    step2-nginx-conf
    step2-nginx-conf

    先测试下 nginx 有没有配置成功,本地打包文件:

    yarn build
     

    然后将生成的 dist 文件里的内容复制到刚才设置的项目根目录下。

    接着输入 http://xxx.xxx.xxx.xxx:端口号,就能访问成功了。

    提示

    地址得用 http 协议,因为我们还没有配置 ssl 证书。

    配置 git 仓库

    `,7),b=e("code",null,"vuepress.git",-1),g=t(`
    cd /home/git
     mkdir vuepress.git
     cd vuepress.git
    diff --git a/assets/004-common-element.html-Xjzjjmz0.js b/assets/004-common-element.html-q8tUaFIS.js
    similarity index 99%
    rename from assets/004-common-element.html-Xjzjjmz0.js
    rename to assets/004-common-element.html-q8tUaFIS.js
    index ecd567516f..d36ed088ef 100644
    --- a/assets/004-common-element.html-Xjzjjmz0.js
    +++ b/assets/004-common-element.html-q8tUaFIS.js
    @@ -1,4 +1,4 @@
    -import{_ as o,r as c,o as p,c as i,b as t,w as e,e as l,a as n,d as a}from"./app-2R243if7.js";const u={},d=l('

    HTML 中包含大量元素,本文将介绍一些常用元素。

    标题和段落

    网页通常由标题和段落组成,在 HTML 中,通过 <h1> ~ <h6> 表示 6 个不同级别的标题,通过 <p> 元素表示基本段落。

    提示

    h 是 heading 的缩写,p 是 paragraph 的缩写。

    ',4),k=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("h1")]),n("span",{class:"token punctuation"},">")]),a("h1标题"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),a(` +import{_ as o,r as c,o as p,c as i,b as t,w as e,e as l,a as n,d as a}from"./app-I81jsmus.js";const u={},d=l('

    HTML 中包含大量元素,本文将介绍一些常用元素。

    标题和段落

    网页通常由标题和段落组成,在 HTML 中,通过 <h1> ~ <h6> 表示 6 个不同级别的标题,通过 <p> 元素表示基本段落。

    提示

    h 是 heading 的缩写,p 是 paragraph 的缩写。

    ',4),k=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("h1")]),n("span",{class:"token punctuation"},">")]),a("h1标题"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),a(` `),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("h2")]),n("span",{class:"token punctuation"},">")]),a("h2标题"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),a(` `),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("h3")]),n("span",{class:"token punctuation"},">")]),a("h3标题"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),a(` `),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("h4")]),n("span",{class:"token punctuation"},">")]),a("h4标题"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),a(` diff --git a/assets/004-global-upload.html-_IRYzqKH.js b/assets/004-global-upload.html-2q23fxm8.js similarity index 99% rename from assets/004-global-upload.html-_IRYzqKH.js rename to assets/004-global-upload.html-2q23fxm8.js index b880ba8de1..1095a5d721 100644 --- a/assets/004-global-upload.html-_IRYzqKH.js +++ b/assets/004-global-upload.html-2q23fxm8.js @@ -1,4 +1,4 @@ -import{_ as p,r as e,o,c,a as n,d as s,b as l,w as i,e as a}from"./app-2R243if7.js";const u={},r=a(`

    上传需要涉及到各个页面,因此需要实现一个全局上传组件,同时支持拖拽上传。

    根据产品 PRD,整理出如下几个重点部分:

    1. 管理全局的上传任务状态
    2. 文件上传需要绑定每次上传任务的回调
    3. 拖拽内容区域上传
    4. 上传文件时进度以文件夹为单位进行展示

    管理全局的上传任务状态

    第一个问题可以使用 Context 或着 Redux 解决,在这里由于没有涉及到其他更复杂的状态管理,因此使用更轻量的 Context。

    每当添加上传任务,都可以通过 Context 提供的方法更新状态,同时所有引用了此状态的组件(如全局上传抽屉)都会被重新渲染以显示最新的状态。

    在切换页面时需要保留全局上传组件的状态。 因此应将其定义在一个比页面组件生命周期更长的地方,页面切换时,只是 Router 的子组件(即页面组件)在发生变化,而 Router 和它的父组件 App 并未发生变化,也就不会触发重新渲染。

    <UploadContextProvider>
    +import{_ as p,r as e,o,c,a as n,d as s,b as l,w as i,e as a}from"./app-I81jsmus.js";const u={},r=a(`

    上传需要涉及到各个页面,因此需要实现一个全局上传组件,同时支持拖拽上传。

    根据产品 PRD,整理出如下几个重点部分:

    1. 管理全局的上传任务状态
    2. 文件上传需要绑定每次上传任务的回调
    3. 拖拽内容区域上传
    4. 上传文件时进度以文件夹为单位进行展示

    管理全局的上传任务状态

    第一个问题可以使用 Context 或着 Redux 解决,在这里由于没有涉及到其他更复杂的状态管理,因此使用更轻量的 Context。

    每当添加上传任务,都可以通过 Context 提供的方法更新状态,同时所有引用了此状态的组件(如全局上传抽屉)都会被重新渲染以显示最新的状态。

    在切换页面时需要保留全局上传组件的状态。 因此应将其定义在一个比页面组件生命周期更长的地方,页面切换时,只是 Router 的子组件(即页面组件)在发生变化,而 Router 和它的父组件 App 并未发生变化,也就不会触发重新渲染。

    <UploadContextProvider>
       <AppRouting />
       <GlobalUploadDrawer />
     </UploadContextProvider>
    diff --git a/assets/004-primitive-value-reference-value.html-zZRxOtGZ.js b/assets/004-primitive-value-reference-value.html-MLxMLvib.js
    similarity index 99%
    rename from assets/004-primitive-value-reference-value.html-zZRxOtGZ.js
    rename to assets/004-primitive-value-reference-value.html-MLxMLvib.js
    index 11b5e2c7ab..7d6908a2fe 100644
    --- a/assets/004-primitive-value-reference-value.html-zZRxOtGZ.js
    +++ b/assets/004-primitive-value-reference-value.html-MLxMLvib.js
    @@ -1,4 +1,4 @@
    -import{_ as n,o as a,c as e,e as s}from"./app-2R243if7.js";const t={},o=s(`

    按值访问和按引用访问

    ECMAScript 变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。

    在把一个值赋给变量时,JavaScript 引擎必须确定这个值是原始值还是引用值。

    保存原始值的变量是 按值(by value)访问的,因为我们操作的就是存储在变量中的实际值。引用值是保存在内存中的对象。

    与其他语言不同,JavaScript 不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的 引用(reference)而非实际的对象本身。为此,保存引用值的变量是 按引用(by reference)访问的。

    按值访问和按引用访问
    按值访问和按引用访问

    传递参数

    ECMAScript 中所有函数的参数都是按值传递的。这意味着函数外的值会被复制到函数内部的参数中,就像从一个变量复制到另一个变量一样。

    如果是原始值,那么就跟原始值变量的复制一样,如果是引用值,那么就跟引用值变量的复制一样。

    注意

    变量有按值和按引用访问,而传参则只有按值传递。

    在按值传递参数时,值会被复制到一个局部变量(即一个命名参数,arguments 对象中的一个槽位)。来看几个例子。

    参数为基本类型

    let a = 1
    +import{_ as n,o as a,c as e,e as s}from"./app-I81jsmus.js";const t={},o=s(`

    按值访问和按引用访问

    ECMAScript 变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。

    在把一个值赋给变量时,JavaScript 引擎必须确定这个值是原始值还是引用值。

    保存原始值的变量是 按值(by value)访问的,因为我们操作的就是存储在变量中的实际值。引用值是保存在内存中的对象。

    与其他语言不同,JavaScript 不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的 引用(reference)而非实际的对象本身。为此,保存引用值的变量是 按引用(by reference)访问的。

    按值访问和按引用访问
    按值访问和按引用访问

    传递参数

    ECMAScript 中所有函数的参数都是按值传递的。这意味着函数外的值会被复制到函数内部的参数中,就像从一个变量复制到另一个变量一样。

    如果是原始值,那么就跟原始值变量的复制一样,如果是引用值,那么就跟引用值变量的复制一样。

    注意

    变量有按值和按引用访问,而传参则只有按值传递。

    在按值传递参数时,值会被复制到一个局部变量(即一个命名参数,arguments 对象中的一个槽位)。来看几个例子。

    参数为基本类型

    let a = 1
     function foo(value) {
       value = 2
       console.log(value) // 输出: 2
    diff --git a/assets/004-project-standards.html-IEck58m4.js b/assets/004-project-standards.html-2vM9DZTK.js
    similarity index 99%
    rename from assets/004-project-standards.html-IEck58m4.js
    rename to assets/004-project-standards.html-2vM9DZTK.js
    index d6017feda4..6555c5529c 100644
    --- a/assets/004-project-standards.html-IEck58m4.js
    +++ b/assets/004-project-standards.html-2vM9DZTK.js
    @@ -1,4 +1,4 @@
    -import{_ as o,r as p,o as i,c,a as n,d as s,b as e,e as t}from"./app-2R243if7.js";const l={},r=t(`

    代码规范

    editorconfig

    EditorConfig 有助于跨不同编辑器和 IDE 为处理同一项目的多个开发人员维护一致的编码风格。

    VSCode 需要安装 EditorConfig for VS Code 插件。

    .editorconfig

    # http://editorconfig.org
    +import{_ as o,r as p,o as i,c,a as n,d as s,b as e,e as t}from"./app-I81jsmus.js";const l={},r=t(`

    代码规范

    editorconfig

    EditorConfig 有助于跨不同编辑器和 IDE 为处理同一项目的多个开发人员维护一致的编码风格。

    VSCode 需要安装 EditorConfig for VS Code 插件。

    .editorconfig

    # http://editorconfig.org
     
     root = true
     
    diff --git a/assets/004-text-font.html-7LU7lsoM.js b/assets/004-text-font.html-ldUSeidH.js
    similarity index 99%
    rename from assets/004-text-font.html-7LU7lsoM.js
    rename to assets/004-text-font.html-ldUSeidH.js
    index ff4de1a5dc..ffc908d637 100644
    --- a/assets/004-text-font.html-7LU7lsoM.js
    +++ b/assets/004-text-font.html-ldUSeidH.js
    @@ -1,4 +1,4 @@
    -import{_ as i,r as c,o as p,c as u,a as n,d as s,b as a,w as e,e as o}from"./app-2R243if7.js";const d={},r={class:"hint-container tip"},k=n("p",{class:"hint-container-title"},"提示",-1),m={href:"https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference",target:"_blank",rel:"noopener noreferrer"},g=o('

    文本布局

    文本布局可以作用于文本的间距以及其他布局功能的属性,比如,允许操纵行与字之间的空间,以及在内容框中,文本如何对齐。

    text-align

    text-align 用来定义行内内容(例如文字)如何相对它的块父元素对齐,比如左对齐、居中、右对齐等等。

    • left:左对齐
    • right:右对齐;
    • center:居中对齐
    • justify:两端对齐。

    注意

    text-align 并不控制块元素自己的对齐,只控制它的行内内容的对齐。

    常用于做行内元素的居中效果。

    ',6),h=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("p")]),n("span",{class:"token punctuation"},">")]),s("左对齐"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),s(` +import{_ as i,r as c,o as p,c as u,a as n,d as s,b as a,w as e,e as o}from"./app-I81jsmus.js";const d={},r={class:"hint-container tip"},k=n("p",{class:"hint-container-title"},"提示",-1),m={href:"https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference",target:"_blank",rel:"noopener noreferrer"},g=o('

    文本布局

    文本布局可以作用于文本的间距以及其他布局功能的属性,比如,允许操纵行与字之间的空间,以及在内容框中,文本如何对齐。

    text-align

    text-align 用来定义行内内容(例如文字)如何相对它的块父元素对齐,比如左对齐、居中、右对齐等等。

    • left:左对齐
    • right:右对齐;
    • center:居中对齐
    • justify:两端对齐。

    注意

    text-align 并不控制块元素自己的对齐,只控制它的行内内容的对齐。

    常用于做行内元素的居中效果。

    ',6),h=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("p")]),n("span",{class:"token punctuation"},">")]),s("左对齐"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),s(` `)])]),n("div",{class:"line-numbers","aria-hidden":"true"},[n("div",{class:"line-number"})])],-1),f=n("div",{class:"language-css line-numbers-mode","data-ext":"css","data-title":"css"},[n("pre",{class:"language-css"},[n("code",null,[n("span",{class:"token selector"},"p"),s(),n("span",{class:"token punctuation"},"{"),s(` `),n("span",{class:"token property"},"text-align"),n("span",{class:"token punctuation"},":"),s(" left"),n("span",{class:"token punctuation"},";"),s(` `),n("span",{class:"token punctuation"},"}"),s(` diff --git a/assets/004-webpack-plugin.html-9kEyMOsf.js b/assets/004-webpack-plugin.html-n3ujVQXJ.js similarity index 99% rename from assets/004-webpack-plugin.html-9kEyMOsf.js rename to assets/004-webpack-plugin.html-n3ujVQXJ.js index 61ac0daf1e..591bb91f5e 100644 --- a/assets/004-webpack-plugin.html-9kEyMOsf.js +++ b/assets/004-webpack-plugin.html-n3ujVQXJ.js @@ -1,4 +1,4 @@ -import{_ as e,r as p,o as i,c as l,a as n,d as s,b as t,e as c}from"./app-2R243if7.js";const o="/blog/assets/image/frontend/tool/webpack/004/mode.png",d="/blog/assets/image/frontend/tool/webpack/004/source-map-1.png",u="/blog/assets/image/frontend/tool/webpack/004/source-map-2.png",r={},k={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},g=c(`

    前面介绍了 webpack loader 打包 JavaScript、CSS、图片和字体等模块资源,这次介绍 webpack 中的另外一个核心:插件

    webpack 官方文档描述了二者区别:loader 用于转换某些类型的模块,而插件可以执行范围更广的任务,包括:打包优化、资源管理、注入环境变量等。

    清理 dist 文件

    在前面的项目中,每次重新打包其实都略去了一步:手动删除 dist 文件夹。在 webpack5 以前,可以借助 CleanWebpackPlugin 来帮我们完成这个操作。而 webpack5 中,在 output 中设置 clean: true 即可。

      const path = require("path");
    +import{_ as e,r as p,o as i,c as l,a as n,d as s,b as t,e as c}from"./app-I81jsmus.js";const o="/blog/assets/image/frontend/tool/webpack/004/mode.png",d="/blog/assets/image/frontend/tool/webpack/004/source-map-1.png",u="/blog/assets/image/frontend/tool/webpack/004/source-map-2.png",r={},k={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},g=c(`

    前面介绍了 webpack loader 打包 JavaScript、CSS、图片和字体等模块资源,这次介绍 webpack 中的另外一个核心:插件

    webpack 官方文档描述了二者区别:loader 用于转换某些类型的模块,而插件可以执行范围更广的任务,包括:打包优化、资源管理、注入环境变量等。

    清理 dist 文件

    在前面的项目中,每次重新打包其实都略去了一步:手动删除 dist 文件夹。在 webpack5 以前,可以借助 CleanWebpackPlugin 来帮我们完成这个操作。而 webpack5 中,在 output 中设置 clean: true 即可。

      const path = require("path");
       
       module.exports = {
         entry: "./src/index.js",
    diff --git a/assets/005-HTTP-cache.html-93Z7vex3.js b/assets/005-HTTP-cache.html-KgXwqlEv.js
    similarity index 99%
    rename from assets/005-HTTP-cache.html-93Z7vex3.js
    rename to assets/005-HTTP-cache.html-KgXwqlEv.js
    index 734a975bff..5ad6572a26 100644
    --- a/assets/005-HTTP-cache.html-93Z7vex3.js
    +++ b/assets/005-HTTP-cache.html-KgXwqlEv.js
    @@ -1,4 +1,4 @@
    -import{_ as o,r as t,o as c,c as i,a,d as e,b as r,e as n}from"./app-2R243if7.js";const l={},p=n(`

    对于一些相同的请求,通过复用以前获取的资源,显著提高网页的性能。Web 缓存减少了等待时间和流量,因此减少了显示资源的渲染时间。

    HTTP 缓存的实现有两种方式,分别是强制缓存协商缓存

    强缓存

    强缓存是指:只要浏览器判断缓存没有过期,则直接使用本地缓存,不会向服务器发送请求。

    强缓存是利用下面这两个字段实现的,它们都用来表示资源在客户端缓存的有效期。

    • Expires:绝对时间;
    • Cache-Control:缓存指令。

    Expires

    响应头包含的日期时间,在这个时间前,浏览器都不会再发起请求,而是直接使用缓存资源。

    Expires: Wed, 21 Oct 2015 07:28:00 GMT
    +import{_ as o,r as t,o as c,c as i,a,d as e,b as r,e as n}from"./app-I81jsmus.js";const l={},p=n(`

    对于一些相同的请求,通过复用以前获取的资源,显著提高网页的性能。Web 缓存减少了等待时间和流量,因此减少了显示资源的渲染时间。

    HTTP 缓存的实现有两种方式,分别是强制缓存协商缓存

    强缓存

    强缓存是指:只要浏览器判断缓存没有过期,则直接使用本地缓存,不会向服务器发送请求。

    强缓存是利用下面这两个字段实现的,它们都用来表示资源在客户端缓存的有效期。

    • Expires:绝对时间;
    • Cache-Control:缓存指令。

    Expires

    响应头包含的日期时间,在这个时间前,浏览器都不会再发起请求,而是直接使用缓存资源。

    Expires: Wed, 21 Oct 2015 07:28:00 GMT
     

    Cache-Control

    通用消息头字段,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。

    Cache-Control: max-age=20000
     

    max-age=<seconds> 可以设置过期时间(单位秒),相对于请求的时间计算。

    具体流程:

    1. 当浏览器第一次向服务器发起请求时,服务器响应头会带上 Cache-Control,其中设置了过期时间 max-age
    2. 浏览器再次向服务器发起请求后,会计算当前请求时间和过期时间差值,来判断是否过期,如果过期则重新请求服务器,否则使用本地缓存;
    3. 如果已经过期,服务器再次收到请求后,会更新响应头的 Cache-Control
    `,15),d=a("code",null,"max-age",-1),h={href:"https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control",target:"_blank",rel:"noopener noreferrer"},m=n(`

    优先级

    当同时有 ExpiresCache-Control 字段时,如果 Cache-Control 响应头设置了 max-ages-maxage 指令,那么 Expires 会被忽略。

    协商缓存

    为了知道服务器有没有更新内容,必须和服务器沟通,然后根据服务器返回的信息判断是否使用本地缓存,这种方式称为协商缓存

    协商缓存通过两种头部实现:

    • 请求头部的 If-Modified-Since 和响应头部的 Last-Modified
    • 请求头部的 If-None-Match 和响应头部的 ETag

    If-Modified-SinceLast-Modified

    这种方式是基于时间实现的。

    响应头 Last-Modified 存放的是资源最后修改时间:

    Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
     

    请求头中的 If-Modified-Since 含义为资源从 xxx 时间后是否有更新:

    If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
    diff --git a/assets/005-advanced-element.html-Iw8_OFlN.js b/assets/005-advanced-element.html-LXvnYZdN.js
    similarity index 99%
    rename from assets/005-advanced-element.html-Iw8_OFlN.js
    rename to assets/005-advanced-element.html-LXvnYZdN.js
    index d242e5f7e2..ec2b25b57d 100644
    --- a/assets/005-advanced-element.html-Iw8_OFlN.js
    +++ b/assets/005-advanced-element.html-LXvnYZdN.js
    @@ -1,4 +1,4 @@
    -import{_ as p,r as o,o as u,c as i,b as s,w as e,a as n,d as a,e as c}from"./app-2R243if7.js";const k={},r=c('

    除了标题、超链接等元素,还有一些比较复杂的元素:表格和表单。

    表格

    HTML 表格是一种用于结构化数据的方式,使用 HTML 的标签 <table> 来创建。一个基本的 HTML 表格包含以下组成部分:

    • <table>:表格开始的标签。
    • <tr>:表示行(table row)。
    • <td>:表示列/单元格(table data)。

    此外,还有几个其他的标签可以用来更精确地定义表格:

    • <thead>:用于表示表格的头部区域。
    • <tbody>:表示主体内容区域。
    • <tfoot>:表示底部总结区域。
    • <th>:表示表头。

    这些标签使得你可以更清晰地定义表格的结构,并且可能会使你的表格获得更好的可访问性。

    提示

    即使你不给表格添加你自己的样式,表格标题也会带有一些默认样式:加粗和居中,让标题可以突出显示。

    以下是一个基本的 HTML 表格结构的例子:

    ',9),d=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("table")]),n("span",{class:"token punctuation"},">")]),a(` +import{_ as p,r as o,o as u,c as i,b as s,w as e,a as n,d as a,e as c}from"./app-I81jsmus.js";const k={},r=c('

    除了标题、超链接等元素,还有一些比较复杂的元素:表格和表单。

    表格

    HTML 表格是一种用于结构化数据的方式,使用 HTML 的标签 <table> 来创建。一个基本的 HTML 表格包含以下组成部分:

    • <table>:表格开始的标签。
    • <tr>:表示行(table row)。
    • <td>:表示列/单元格(table data)。

    此外,还有几个其他的标签可以用来更精确地定义表格:

    • <thead>:用于表示表格的头部区域。
    • <tbody>:表示主体内容区域。
    • <tfoot>:表示底部总结区域。
    • <th>:表示表头。

    这些标签使得你可以更清晰地定义表格的结构,并且可能会使你的表格获得更好的可访问性。

    提示

    即使你不给表格添加你自己的样式,表格标题也会带有一些默认样式:加粗和居中,让标题可以突出显示。

    以下是一个基本的 HTML 表格结构的例子:

    ',9),d=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("table")]),n("span",{class:"token punctuation"},">")]),a(` `),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("thead")]),n("span",{class:"token punctuation"},">")]),a(` `),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("tr")]),n("span",{class:"token punctuation"},">")]),a(` `),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),a("th")]),n("span",{class:"token punctuation"},">")]),a("表头 1"),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"")]),a(` diff --git a/assets/005-cascade-inheritance.html-PJNtVfy1.js b/assets/005-cascade-inheritance.html-5BhjxfCj.js similarity index 99% rename from assets/005-cascade-inheritance.html-PJNtVfy1.js rename to assets/005-cascade-inheritance.html-5BhjxfCj.js index b0a7c41f49..018c9aa5dd 100644 --- a/assets/005-cascade-inheritance.html-PJNtVfy1.js +++ b/assets/005-cascade-inheritance.html-5BhjxfCj.js @@ -1 +1 @@ -import{_ as i,r as s,o as d,c as o,a as e,d as t,b as a,w as r,e as l}from"./app-2R243if7.js";const h={},p={class:"hint-container tip"},u=e("p",{class:"hint-container-title"},"W3C 规范",-1),g={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211",target:"_blank",rel:"noopener noreferrer"},f=e("p",null,[t("CSS 的基本设计原则之一是 "),e("a",{href:"#%E5%B1%82%E5%8F%A0"},"层叠"),t(",它允许多个样式表影响文档的表示。")],-1),x=e("p",null,"当不同的声明尝试为同一元素设置值时,必须以某种方式解决冲突。",-1),_=e("p",null,[t("而在默认情况下,若没有声明为元素设置值时,则会通过 "),e("a",{href:"#%E7%BB%A7%E6%89%BF"},"继承"),t(" 或使用属性的默认值来计算最终的结果。")],-1),v={class:"hint-container info"},b=e("p",{class:"hint-container-title"},"相关信息",-1),m=l('

    值的计算过程

    一旦浏览器将 HTML 文档解析并生成了 DOM Tree,那么必须给每一个元素都设置对应的样式。

    最终的 CSS 属性值会经过多个步骤的计算:

    • 首先,收集每个元素上每一个属性应用的所有 声明值
    • 层叠产生 层叠值,每个元素的每个属性最多有一个层叠值;
    • 默认值将产生 指定值,每个元素的每个属性正好有一个指定值;
    • 解析值的依赖关系将产生 计算值,每个元素的每个属性正好有一个计算值;
    • 格式化文档会生成 使用值,一个元素只有在一个给定的属性适用于该元素时才具有该属性的使用值;

      我的理解是:若一个元素没有该属性,则没有使用值。

    • 最后,根据显示环境的不同,将使用值转换为 实际值。与使用值一样,元素上的给定属性可能有也可能没有实际值。

    声明值 Declared Values

    每个应用于元素的属性声明都会给该属性提供一个声明值,这些值会被层叠处理以选择一个单一的「获胜值」。

    层叠值 Cascaded Values

    层叠值代表层叠的结果:它是赢得层叠的声明值(在层叠的输出中被排序在前面)。如果层叠的输出是一个空列表,那就没有层叠值。

    指定值 Specified Values

    指定值是一个给定的属性值,是样式表作者为该元素设置的。它是把层叠值通过默认过程处理的结果,保证每个元素上的每个属性都有一个指定的值。

    在许多情况下,指定值是层叠的值。然而,如果根本没有层叠值,那么就会取默认的值。

    计算值 Computed Values

    计算值是对指定值进行解析的结果,通常是将其绝对化以准备继承。

    注意

    计算值是在继承过程中父代传递给子代的值。由于历史原因,它不一定是 getComputedStyle() 函数返回的值,该函数有可能会返回 使用值CSSOM 除外,计算值是一个抽象的数据表示:它们的定义反映了该数据表示,而不是该数据如何被序列化。例如,序列化规则通常允许省略某些在解析过程中隐含的值,但这些值仍然是计算值的一部分。

    EXAMPLE

    一个指定的值可以是绝对的(如 red2px),也可以是相对的(如 auto2em)。计算一个相对值通常会将其绝对化:

    • 相对单位的值(emexvhvw)必须通过与合适的参考尺寸相乘而成为绝对值
    • 某些关键字(如 smallerbloder)必须根据其定义进行替换
    • 某些属性的百分比必须乘以一个参考值(由属性定义)
    • 有效的相对 URL 必须被解析为绝对值

    注意

    一般来说,计算值会尽可能地解析指定值,而不需要执行其他难以并行的操作,例如解析网络请求或从元素和它的父级元素以外的地方检索值。

    即使该属性不适用,计算值也会存在。然而一些属性可能会根据该属性是否适用于该元素而改变它们确定计算值的方式。

    使用值 Used Values

    使用值是将计算值和完成任何剩余计算的结果,使其成为文档格式化中使用的绝对理论值。

    EXAMPLE

    比如,在不知道该元素的祖先布局的情况下,width: auto 声明不能被解析为一个长度,所以计算值是 auto,而使用值是一个绝对长度,如 100px

    如果一个属性不适用于这个元素或盒子类型,那么它对该类型的盒子或元素没有直接的格式化效果,因此对该属性没有使用值。

    EXAMPLE

    例如,flex 属性在不是 flex 项目的元素上没有使用值。

    注意

    定义为适用于「所有元素」的属性适用于所有元素和显示类型,但不一定适用于所有伪元素类型,因为伪元素通常有自己的特定渲染模型或其他限制。然而,::before::after 伪元素被定义为几乎完全像普通元素一样,因此被定义为接受所有适用于「所有元素」的属性。

    实际值 Actual Values

    原则上,一个使用值是可以被使用的,但是用户代理可能无法在特定的环境中使用这个值。

    例如,用户代理可能只能呈现整数像素宽度的边框,因此必须近似宽度的使用值。

    另外,一个元素的字体大小可能需要根据字体的可用性和字体大小调整属性的值来调整。

    实际值就是进行此类调整后的使用值。

    例子

    ',29),E={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#stages-examples",target:"_blank",rel:"noopener noreferrer"},y=l('
    属性获胜值层叠值指定值计算值使用值实际值
    text-aligntext-align: leftleftleftleftleftleft
    width(none)(none)auto(继承的值)auto120px120px
    border-widthborder-width: inheritinherit4.2px4.2px4.2px4px
    font-sizefont-size: 1.2em1.2em1.2em14.1px14.1px14px
    widthwidth: 80%80%80%80%354.2px354px

    层叠

    层叠接收一个无序的列表,该列表是给定元素上给定属性的声明值,按照下面确定的声明优先级对它们进行排序,然后输出一个单一的 层叠值

    层叠排列顺序

    层叠根据以下标准对声明进行排序,其优先级由高到低排列:

    起源和重要性

    一个声明的起源是基于它的来源,而它的重要性是指它是否用 !important 声明(见 下文)。各种起源的优先级按降序排列如下:

    ',7),w={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#biblio-css-transitions-1",target:"_blank",rel:"noopener noreferrer"},C=e("li",null,"重要的用户代理声明",-1),k=e("li",null,"重要的用户声明",-1),S=e("li",null,"重要的作者声明",-1),A={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#biblio-css-animations-1",target:"_blank",rel:"noopener noreferrer"},B=e("li",null,"正常的作者声明",-1),T=e("li",null,"正常的用户声明",-1),R=e("li",null,"正常的用户代理声明",-1),V=e("p",null,"来自这个列表中较早起源的声明胜过来自较晚起源的声明。",-1),M=e("h4",{id:"特异性",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#特异性"},[e("span",null,"特异性")])],-1),L={href:"https://www.w3.org/TR/selectors-3/#specificity",target:"_blank",rel:"noopener noreferrer"},D=l('

    出现顺序

    文档中最后一个出现的声明获胜。这是为了:

    • 来自导入的样式表的声明被排序,就像它们的样式表被替换成了 @import 规则。
    • 来自独立于原生文档的样式表的声明被视为按照链接顺序连接起来的,由主文档语言决定。
    • 来自样式属性的声明是根据样式属性出现的元素的文档顺序来排序的,并且都放在任何样式表之后。

    级联的输出是一个(可能是空的)排序的列表,其中包括每个元素上的每个属性的声明值。

    层叠来源

    每个样式规则都有一个级联原点,它决定了它在哪里进入级联。CSS定义了三个核心原点:

    作者起源

    作者根据文档语言的惯例为一个源文档指定样式表。例如,在HTML中,样式表可以包含在文档中,也可以从外部链接。

    用户起源

    用户可能能够为一个特定的文档指定样式信息。例如,用户可以指定一个包含样式表的文件,或者用户代理可以提供一个生成用户样式表的界面(或者表现得像它一样)。

    用户代理的起源

    符合要求的用户代理必须应用一个默认的样式表(或者表现得像他们一样)。一个用户代理的默认样式表应该以满足文档语言的一般表现期望的方式呈现文档语言的元素(例如,对于视觉浏览器,HTML中的EM元素使用斜体字呈现)。例如,见HTML用户代理样式表。[HTML]

    对CSS的扩展定义了以下额外的起源:

    动画起源
    ',14),z={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#biblio-css-animations-1",target:"_blank",rel:"noopener noreferrer"},H=e("h5",{id:"过渡起源",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#过渡起源"},[e("span",null,"过渡起源")])],-1),N={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#biblio-css-transitions-1",target:"_blank",rel:"noopener noreferrer"},j=l('

    重要声明: !important 注释

    CSS 试图在作者和用户的样式表之间建立一种权力平衡。

    默认情况下,作者的样式表中的规则优先于用户的样式表中的规则,而用户的样式表又优先于用户代理的默认样式表中的规则。

    为了平衡这一点,一个声明可以被标记为重要的,这将增加它在级联中的权重并颠倒优先顺序。

    一个重要的声明优先于一个普通的声明。作者和用户的样式表都可以包含重要声明,用户源的重要声明优先于作者源的重要声明。

    这个CSS特性通过让有特殊要求的用户(大字体、颜色组合等)控制表现形式来提高文档的可访问性。

    所有来源的重要声明都优先于动画的声明。这允许作者在重要情况下覆盖动画值。(动画值通常优先于所有其他规则)。

    用户代理样式表也可能包含重要的声明。这些声明覆盖了所有作者和用户的声明。

    继承

    当级联不产生一个值时,必须以其他方式找到指定的值。

    继承的属性通过继承从它们的父元素中获取它们的默认值;所有其它的属性都采取它们的初始值。

    作者可以通过inherit和initial关键字明确要求继承或初始化。

    初始值

    每个属性都有一个初始值,在该属性的定义表中定义。如果该属性不是一个继承的属性,并且级联没有产生一个值,那么该属性的指定值就是其初始值。

    继承性

    继承将属性值从父元素传播到它们的子元素。一个元素上的属性的继承值是该元素的父元素上的属性的计算值。对于根元素,它没有父元素,继承值是属性的初始值。

    伪元素根据为每个伪元素描述的虚构的标签序列来继承。

    有些属性是继承的属性,这在其属性定义表中有定义。这意味着,除非层叠的结果是一个值,否则该值将由继承来决定。

    ',18),F={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#valdef-all-inherit",target:"_blank",rel:"noopener noreferrer"},P={class:"hint-container tip"},Z=e("p",{class:"hint-container-title"},"注意",-1),q={href:"https://www.w3.org/TR/CSS2/visuren.html#box-gen",target:"_blank",rel:"noopener noreferrer"},I=l('

    明确默认

    下面定义了几个 CSS 范围内的属性值;声明一个属性拥有这些值,明确地指定了一个特定的默认行为。所有的CSS属性都可以接受这些值。

    重置一个属性:initial 关键字

    如果一个属性的层叠值是 initial 关键字,那么该属性的 指定值 就是其初始值。

    显式继承:inherit 关键字

    如果一个属性的层叠值是 inherit 关键字,那么该属性的指定值和计算值就是继承值。

    擦除所有声明:unset 关键字

    如果一个属性的层叠值是 unset关键字,那么如果它是一个继承的属性,这将被视为继承,如果它不是,这将被视为初始。

    这个关键字有效地抹去了在层叠中较早出现的所有声明的值,正确地继承或不继承都适合于该属性(或一个速记的所有长文)。

    ',9);function O(U,W){const n=s("ExternalLinkIcon"),c=s("RouteLink");return d(),o("div",null,[e("div",p,[u,e("p",null,[e("a",g,[t("REC-css-cascade-3"),a(n)]),t("。")])]),f,x,_,e("div",v,[b,e("p",null,[t("与层叠密切相关的概念是 "),a(c,{to:"/frontend/basic/css/002-selector.md/#%E4%BC%98%E5%85%88%E7%BA%A7"},{default:r(()=>[t("优先级")]),_:1}),t("。")])]),m,e("blockquote",null,[e("p",null,[t("完整例子见 "),e("a",E,[t("Examples"),a(n)])])]),y,e("ol",null,[e("li",null,[t("过渡声明 "),e("a",w,[t("css-transitions-1"),a(n)])]),C,k,S,e("li",null,[t("动画声明 "),e("a",A,[t("css-animations-1"),a(n)])]),B,T,R]),V,M,e("p",null,[t("选择器模块 "),e("a",L,[t("Calculating a selector's specificity"),a(n)]),t(" 描述了如何计算一个选择器的特异性。具有最高特异性的声明获胜。")]),D,e("p",null,[t("CSS动画 "),e("a",z,[t("css-animations-1"),a(n)]),t(' 在运行时产生代表其效果的 "虚拟 "规则。')]),H,e("p",null,[t("与CSS动画一样,CSS过渡 "),e("a",N,[t("css-transitions-1"),a(n)]),t(' 在运行时产生代表其效果的 "虚拟 "规则。')]),j,e("p",null,[t("一个属性也可以明确地被继承。参见 "),e("a",F,[t("继承关键字"),a(n)]),t("。")]),e("div",P,[Z,e("p",null,[t("继承遵循文档树,不被 "),e("a",q,[t("匿名盒子"),a(n)]),t(" 拦截,也不被盒子树的其他操作所影响。")])]),I])}const J=i(h,[["render",O],["__file","005-cascade-inheritance.html.vue"]]),G=JSON.parse('{"path":"/frontend/basic/css/005-cascade-inheritance.html","title":"层叠和继承","lang":"zh-CN","frontmatter":{"title":"层叠和继承","date":"2023-03-28T00:00:00.000Z","icon":"cascades","category":["CSS"],"tag":["frontend","css","basic-knowledge"],"description":" W3C 规范 REC-css-cascade-3。 CSS 的基本设计原则之一是 层叠,它允许多个样式表影响文档的表示。 当不同的声明尝试为同一元素设置值时,必须以某种方式解决冲突。 而在默认情况下,若没有声明为元素设置值时,则会通过 继承 或使用属性的默认值来计算最终的结果。 相关信息 与层叠密切相关的概念是 。 值的计算过程 一旦浏览器将 HTM...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/basic/css/005-cascade-inheritance.html"}],["meta",{"property":"og:title","content":"层叠和继承"}],["meta",{"property":"og:description","content":" W3C 规范 REC-css-cascade-3。 CSS 的基本设计原则之一是 层叠,它允许多个样式表影响文档的表示。 当不同的声明尝试为同一元素设置值时,必须以某种方式解决冲突。 而在默认情况下,若没有声明为元素设置值时,则会通过 继承 或使用属性的默认值来计算最终的结果。 相关信息 与层叠密切相关的概念是 。 值的计算过程 一旦浏览器将 HTM..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-25T03:55:49.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:tag","content":"css"}],["meta",{"property":"article:tag","content":"basic-knowledge"}],["meta",{"property":"article:published_time","content":"2023-03-28T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-25T03:55:49.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"层叠和继承\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-03-28T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-25T03:55:49.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 值的计算过程","slug":"值的计算过程","link":"#值的计算过程","children":[{"level":3,"title":"1.1 声明值 Declared Values","slug":"声明值-declared-values","link":"#声明值-declared-values","children":[]},{"level":3,"title":"1.2 层叠值 Cascaded Values","slug":"层叠值-cascaded-values","link":"#层叠值-cascaded-values","children":[]},{"level":3,"title":"1.3 指定值 Specified Values","slug":"指定值-specified-values","link":"#指定值-specified-values","children":[]},{"level":3,"title":"1.4 计算值 Computed Values","slug":"计算值-computed-values","link":"#计算值-computed-values","children":[]},{"level":3,"title":"1.5 使用值 Used Values","slug":"使用值-used-values","link":"#使用值-used-values","children":[]},{"level":3,"title":"1.6 实际值 Actual Values","slug":"实际值-actual-values","link":"#实际值-actual-values","children":[]},{"level":3,"title":"1.7 例子","slug":"例子","link":"#例子","children":[]}]},{"level":2,"title":"2 层叠","slug":"层叠","link":"#层叠","children":[{"level":3,"title":"2.1 层叠排列顺序","slug":"层叠排列顺序","link":"#层叠排列顺序","children":[{"level":4,"title":"2.1.1 起源和重要性","slug":"起源和重要性","link":"#起源和重要性","children":[]},{"level":4,"title":"2.1.2 特异性","slug":"特异性","link":"#特异性","children":[]},{"level":4,"title":"2.1.3 出现顺序","slug":"出现顺序","link":"#出现顺序","children":[]}]},{"level":3,"title":"2.2 层叠来源","slug":"层叠来源","link":"#层叠来源","children":[]},{"level":3,"title":"2.3 重要声明: !important 注释","slug":"重要声明-important-注释","link":"#重要声明-important-注释","children":[]}]},{"level":2,"title":"3 继承","slug":"继承","link":"#继承","children":[{"level":3,"title":"3.1 初始值","slug":"初始值","link":"#初始值","children":[]},{"level":3,"title":"3.2 继承性","slug":"继承性","link":"#继承性","children":[]},{"level":3,"title":"3.3 明确默认","slug":"明确默认","link":"#明确默认","children":[{"level":4,"title":"3.3.1 重置一个属性:initial 关键字","slug":"重置一个属性-initial-关键字","link":"#重置一个属性-initial-关键字","children":[]},{"level":4,"title":"3.3.2 显式继承:inherit 关键字","slug":"显式继承-inherit-关键字","link":"#显式继承-inherit-关键字","children":[]},{"level":4,"title":"3.3.3 擦除所有声明:unset 关键字","slug":"擦除所有声明-unset-关键字","link":"#擦除所有声明-unset-关键字","children":[]}]}]}],"git":{"createdTime":1682394949000,"updatedTime":1682394949000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":11.1,"words":3331},"filePathRelative":"frontend/basic/css/005-cascade-inheritance.md","localizedDate":"2023年3月28日","excerpt":"","autoDesc":true}');export{J as comp,G as data}; +import{_ as i,r as s,o as d,c as o,a as e,d as t,b as a,w as r,e as l}from"./app-I81jsmus.js";const h={},p={class:"hint-container tip"},u=e("p",{class:"hint-container-title"},"W3C 规范",-1),g={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211",target:"_blank",rel:"noopener noreferrer"},f=e("p",null,[t("CSS 的基本设计原则之一是 "),e("a",{href:"#%E5%B1%82%E5%8F%A0"},"层叠"),t(",它允许多个样式表影响文档的表示。")],-1),x=e("p",null,"当不同的声明尝试为同一元素设置值时,必须以某种方式解决冲突。",-1),_=e("p",null,[t("而在默认情况下,若没有声明为元素设置值时,则会通过 "),e("a",{href:"#%E7%BB%A7%E6%89%BF"},"继承"),t(" 或使用属性的默认值来计算最终的结果。")],-1),v={class:"hint-container info"},b=e("p",{class:"hint-container-title"},"相关信息",-1),m=l('

    值的计算过程

    一旦浏览器将 HTML 文档解析并生成了 DOM Tree,那么必须给每一个元素都设置对应的样式。

    最终的 CSS 属性值会经过多个步骤的计算:

    • 首先,收集每个元素上每一个属性应用的所有 声明值
    • 层叠产生 层叠值,每个元素的每个属性最多有一个层叠值;
    • 默认值将产生 指定值,每个元素的每个属性正好有一个指定值;
    • 解析值的依赖关系将产生 计算值,每个元素的每个属性正好有一个计算值;
    • 格式化文档会生成 使用值,一个元素只有在一个给定的属性适用于该元素时才具有该属性的使用值;

      我的理解是:若一个元素没有该属性,则没有使用值。

    • 最后,根据显示环境的不同,将使用值转换为 实际值。与使用值一样,元素上的给定属性可能有也可能没有实际值。

    声明值 Declared Values

    每个应用于元素的属性声明都会给该属性提供一个声明值,这些值会被层叠处理以选择一个单一的「获胜值」。

    层叠值 Cascaded Values

    层叠值代表层叠的结果:它是赢得层叠的声明值(在层叠的输出中被排序在前面)。如果层叠的输出是一个空列表,那就没有层叠值。

    指定值 Specified Values

    指定值是一个给定的属性值,是样式表作者为该元素设置的。它是把层叠值通过默认过程处理的结果,保证每个元素上的每个属性都有一个指定的值。

    在许多情况下,指定值是层叠的值。然而,如果根本没有层叠值,那么就会取默认的值。

    计算值 Computed Values

    计算值是对指定值进行解析的结果,通常是将其绝对化以准备继承。

    注意

    计算值是在继承过程中父代传递给子代的值。由于历史原因,它不一定是 getComputedStyle() 函数返回的值,该函数有可能会返回 使用值CSSOM 除外,计算值是一个抽象的数据表示:它们的定义反映了该数据表示,而不是该数据如何被序列化。例如,序列化规则通常允许省略某些在解析过程中隐含的值,但这些值仍然是计算值的一部分。

    EXAMPLE

    一个指定的值可以是绝对的(如 red2px),也可以是相对的(如 auto2em)。计算一个相对值通常会将其绝对化:

    • 相对单位的值(emexvhvw)必须通过与合适的参考尺寸相乘而成为绝对值
    • 某些关键字(如 smallerbloder)必须根据其定义进行替换
    • 某些属性的百分比必须乘以一个参考值(由属性定义)
    • 有效的相对 URL 必须被解析为绝对值

    注意

    一般来说,计算值会尽可能地解析指定值,而不需要执行其他难以并行的操作,例如解析网络请求或从元素和它的父级元素以外的地方检索值。

    即使该属性不适用,计算值也会存在。然而一些属性可能会根据该属性是否适用于该元素而改变它们确定计算值的方式。

    使用值 Used Values

    使用值是将计算值和完成任何剩余计算的结果,使其成为文档格式化中使用的绝对理论值。

    EXAMPLE

    比如,在不知道该元素的祖先布局的情况下,width: auto 声明不能被解析为一个长度,所以计算值是 auto,而使用值是一个绝对长度,如 100px

    如果一个属性不适用于这个元素或盒子类型,那么它对该类型的盒子或元素没有直接的格式化效果,因此对该属性没有使用值。

    EXAMPLE

    例如,flex 属性在不是 flex 项目的元素上没有使用值。

    注意

    定义为适用于「所有元素」的属性适用于所有元素和显示类型,但不一定适用于所有伪元素类型,因为伪元素通常有自己的特定渲染模型或其他限制。然而,::before::after 伪元素被定义为几乎完全像普通元素一样,因此被定义为接受所有适用于「所有元素」的属性。

    实际值 Actual Values

    原则上,一个使用值是可以被使用的,但是用户代理可能无法在特定的环境中使用这个值。

    例如,用户代理可能只能呈现整数像素宽度的边框,因此必须近似宽度的使用值。

    另外,一个元素的字体大小可能需要根据字体的可用性和字体大小调整属性的值来调整。

    实际值就是进行此类调整后的使用值。

    例子

    ',29),E={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#stages-examples",target:"_blank",rel:"noopener noreferrer"},y=l('
    属性获胜值层叠值指定值计算值使用值实际值
    text-aligntext-align: leftleftleftleftleftleft
    width(none)(none)auto(继承的值)auto120px120px
    border-widthborder-width: inheritinherit4.2px4.2px4.2px4px
    font-sizefont-size: 1.2em1.2em1.2em14.1px14.1px14px
    widthwidth: 80%80%80%80%354.2px354px

    层叠

    层叠接收一个无序的列表,该列表是给定元素上给定属性的声明值,按照下面确定的声明优先级对它们进行排序,然后输出一个单一的 层叠值

    层叠排列顺序

    层叠根据以下标准对声明进行排序,其优先级由高到低排列:

    起源和重要性

    一个声明的起源是基于它的来源,而它的重要性是指它是否用 !important 声明(见 下文)。各种起源的优先级按降序排列如下:

    ',7),w={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#biblio-css-transitions-1",target:"_blank",rel:"noopener noreferrer"},C=e("li",null,"重要的用户代理声明",-1),k=e("li",null,"重要的用户声明",-1),S=e("li",null,"重要的作者声明",-1),A={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#biblio-css-animations-1",target:"_blank",rel:"noopener noreferrer"},B=e("li",null,"正常的作者声明",-1),T=e("li",null,"正常的用户声明",-1),R=e("li",null,"正常的用户代理声明",-1),V=e("p",null,"来自这个列表中较早起源的声明胜过来自较晚起源的声明。",-1),M=e("h4",{id:"特异性",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#特异性"},[e("span",null,"特异性")])],-1),L={href:"https://www.w3.org/TR/selectors-3/#specificity",target:"_blank",rel:"noopener noreferrer"},D=l('

    出现顺序

    文档中最后一个出现的声明获胜。这是为了:

    • 来自导入的样式表的声明被排序,就像它们的样式表被替换成了 @import 规则。
    • 来自独立于原生文档的样式表的声明被视为按照链接顺序连接起来的,由主文档语言决定。
    • 来自样式属性的声明是根据样式属性出现的元素的文档顺序来排序的,并且都放在任何样式表之后。

    级联的输出是一个(可能是空的)排序的列表,其中包括每个元素上的每个属性的声明值。

    层叠来源

    每个样式规则都有一个级联原点,它决定了它在哪里进入级联。CSS定义了三个核心原点:

    作者起源

    作者根据文档语言的惯例为一个源文档指定样式表。例如,在HTML中,样式表可以包含在文档中,也可以从外部链接。

    用户起源

    用户可能能够为一个特定的文档指定样式信息。例如,用户可以指定一个包含样式表的文件,或者用户代理可以提供一个生成用户样式表的界面(或者表现得像它一样)。

    用户代理的起源

    符合要求的用户代理必须应用一个默认的样式表(或者表现得像他们一样)。一个用户代理的默认样式表应该以满足文档语言的一般表现期望的方式呈现文档语言的元素(例如,对于视觉浏览器,HTML中的EM元素使用斜体字呈现)。例如,见HTML用户代理样式表。[HTML]

    对CSS的扩展定义了以下额外的起源:

    动画起源
    ',14),z={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#biblio-css-animations-1",target:"_blank",rel:"noopener noreferrer"},H=e("h5",{id:"过渡起源",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#过渡起源"},[e("span",null,"过渡起源")])],-1),N={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#biblio-css-transitions-1",target:"_blank",rel:"noopener noreferrer"},j=l('

    重要声明: !important 注释

    CSS 试图在作者和用户的样式表之间建立一种权力平衡。

    默认情况下,作者的样式表中的规则优先于用户的样式表中的规则,而用户的样式表又优先于用户代理的默认样式表中的规则。

    为了平衡这一点,一个声明可以被标记为重要的,这将增加它在级联中的权重并颠倒优先顺序。

    一个重要的声明优先于一个普通的声明。作者和用户的样式表都可以包含重要声明,用户源的重要声明优先于作者源的重要声明。

    这个CSS特性通过让有特殊要求的用户(大字体、颜色组合等)控制表现形式来提高文档的可访问性。

    所有来源的重要声明都优先于动画的声明。这允许作者在重要情况下覆盖动画值。(动画值通常优先于所有其他规则)。

    用户代理样式表也可能包含重要的声明。这些声明覆盖了所有作者和用户的声明。

    继承

    当级联不产生一个值时,必须以其他方式找到指定的值。

    继承的属性通过继承从它们的父元素中获取它们的默认值;所有其它的属性都采取它们的初始值。

    作者可以通过inherit和initial关键字明确要求继承或初始化。

    初始值

    每个属性都有一个初始值,在该属性的定义表中定义。如果该属性不是一个继承的属性,并且级联没有产生一个值,那么该属性的指定值就是其初始值。

    继承性

    继承将属性值从父元素传播到它们的子元素。一个元素上的属性的继承值是该元素的父元素上的属性的计算值。对于根元素,它没有父元素,继承值是属性的初始值。

    伪元素根据为每个伪元素描述的虚构的标签序列来继承。

    有些属性是继承的属性,这在其属性定义表中有定义。这意味着,除非层叠的结果是一个值,否则该值将由继承来决定。

    ',18),F={href:"https://www.w3.org/TR/2021/REC-css-cascade-3-20210211/#valdef-all-inherit",target:"_blank",rel:"noopener noreferrer"},P={class:"hint-container tip"},Z=e("p",{class:"hint-container-title"},"注意",-1),q={href:"https://www.w3.org/TR/CSS2/visuren.html#box-gen",target:"_blank",rel:"noopener noreferrer"},I=l('

    明确默认

    下面定义了几个 CSS 范围内的属性值;声明一个属性拥有这些值,明确地指定了一个特定的默认行为。所有的CSS属性都可以接受这些值。

    重置一个属性:initial 关键字

    如果一个属性的层叠值是 initial 关键字,那么该属性的 指定值 就是其初始值。

    显式继承:inherit 关键字

    如果一个属性的层叠值是 inherit 关键字,那么该属性的指定值和计算值就是继承值。

    擦除所有声明:unset 关键字

    如果一个属性的层叠值是 unset关键字,那么如果它是一个继承的属性,这将被视为继承,如果它不是,这将被视为初始。

    这个关键字有效地抹去了在层叠中较早出现的所有声明的值,正确地继承或不继承都适合于该属性(或一个速记的所有长文)。

    ',9);function O(U,W){const n=s("ExternalLinkIcon"),c=s("RouteLink");return d(),o("div",null,[e("div",p,[u,e("p",null,[e("a",g,[t("REC-css-cascade-3"),a(n)]),t("。")])]),f,x,_,e("div",v,[b,e("p",null,[t("与层叠密切相关的概念是 "),a(c,{to:"/frontend/basic/css/002-selector.md/#%E4%BC%98%E5%85%88%E7%BA%A7"},{default:r(()=>[t("优先级")]),_:1}),t("。")])]),m,e("blockquote",null,[e("p",null,[t("完整例子见 "),e("a",E,[t("Examples"),a(n)])])]),y,e("ol",null,[e("li",null,[t("过渡声明 "),e("a",w,[t("css-transitions-1"),a(n)])]),C,k,S,e("li",null,[t("动画声明 "),e("a",A,[t("css-animations-1"),a(n)])]),B,T,R]),V,M,e("p",null,[t("选择器模块 "),e("a",L,[t("Calculating a selector's specificity"),a(n)]),t(" 描述了如何计算一个选择器的特异性。具有最高特异性的声明获胜。")]),D,e("p",null,[t("CSS动画 "),e("a",z,[t("css-animations-1"),a(n)]),t(' 在运行时产生代表其效果的 "虚拟 "规则。')]),H,e("p",null,[t("与CSS动画一样,CSS过渡 "),e("a",N,[t("css-transitions-1"),a(n)]),t(' 在运行时产生代表其效果的 "虚拟 "规则。')]),j,e("p",null,[t("一个属性也可以明确地被继承。参见 "),e("a",F,[t("继承关键字"),a(n)]),t("。")]),e("div",P,[Z,e("p",null,[t("继承遵循文档树,不被 "),e("a",q,[t("匿名盒子"),a(n)]),t(" 拦截,也不被盒子树的其他操作所影响。")])]),I])}const J=i(h,[["render",O],["__file","005-cascade-inheritance.html.vue"]]),G=JSON.parse('{"path":"/frontend/basic/css/005-cascade-inheritance.html","title":"层叠和继承","lang":"zh-CN","frontmatter":{"title":"层叠和继承","date":"2023-03-28T00:00:00.000Z","icon":"cascades","category":["CSS"],"tag":["frontend","css","basic-knowledge"],"description":" W3C 规范 REC-css-cascade-3。 CSS 的基本设计原则之一是 层叠,它允许多个样式表影响文档的表示。 当不同的声明尝试为同一元素设置值时,必须以某种方式解决冲突。 而在默认情况下,若没有声明为元素设置值时,则会通过 继承 或使用属性的默认值来计算最终的结果。 相关信息 与层叠密切相关的概念是 。 值的计算过程 一旦浏览器将 HTM...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/basic/css/005-cascade-inheritance.html"}],["meta",{"property":"og:title","content":"层叠和继承"}],["meta",{"property":"og:description","content":" W3C 规范 REC-css-cascade-3。 CSS 的基本设计原则之一是 层叠,它允许多个样式表影响文档的表示。 当不同的声明尝试为同一元素设置值时,必须以某种方式解决冲突。 而在默认情况下,若没有声明为元素设置值时,则会通过 继承 或使用属性的默认值来计算最终的结果。 相关信息 与层叠密切相关的概念是 。 值的计算过程 一旦浏览器将 HTM..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-25T03:55:49.000Z"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:tag","content":"css"}],["meta",{"property":"article:tag","content":"basic-knowledge"}],["meta",{"property":"article:published_time","content":"2023-03-28T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-25T03:55:49.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"层叠和继承\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-03-28T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-25T03:55:49.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 值的计算过程","slug":"值的计算过程","link":"#值的计算过程","children":[{"level":3,"title":"1.1 声明值 Declared Values","slug":"声明值-declared-values","link":"#声明值-declared-values","children":[]},{"level":3,"title":"1.2 层叠值 Cascaded Values","slug":"层叠值-cascaded-values","link":"#层叠值-cascaded-values","children":[]},{"level":3,"title":"1.3 指定值 Specified Values","slug":"指定值-specified-values","link":"#指定值-specified-values","children":[]},{"level":3,"title":"1.4 计算值 Computed Values","slug":"计算值-computed-values","link":"#计算值-computed-values","children":[]},{"level":3,"title":"1.5 使用值 Used Values","slug":"使用值-used-values","link":"#使用值-used-values","children":[]},{"level":3,"title":"1.6 实际值 Actual Values","slug":"实际值-actual-values","link":"#实际值-actual-values","children":[]},{"level":3,"title":"1.7 例子","slug":"例子","link":"#例子","children":[]}]},{"level":2,"title":"2 层叠","slug":"层叠","link":"#层叠","children":[{"level":3,"title":"2.1 层叠排列顺序","slug":"层叠排列顺序","link":"#层叠排列顺序","children":[{"level":4,"title":"2.1.1 起源和重要性","slug":"起源和重要性","link":"#起源和重要性","children":[]},{"level":4,"title":"2.1.2 特异性","slug":"特异性","link":"#特异性","children":[]},{"level":4,"title":"2.1.3 出现顺序","slug":"出现顺序","link":"#出现顺序","children":[]}]},{"level":3,"title":"2.2 层叠来源","slug":"层叠来源","link":"#层叠来源","children":[]},{"level":3,"title":"2.3 重要声明: !important 注释","slug":"重要声明-important-注释","link":"#重要声明-important-注释","children":[]}]},{"level":2,"title":"3 继承","slug":"继承","link":"#继承","children":[{"level":3,"title":"3.1 初始值","slug":"初始值","link":"#初始值","children":[]},{"level":3,"title":"3.2 继承性","slug":"继承性","link":"#继承性","children":[]},{"level":3,"title":"3.3 明确默认","slug":"明确默认","link":"#明确默认","children":[{"level":4,"title":"3.3.1 重置一个属性:initial 关键字","slug":"重置一个属性-initial-关键字","link":"#重置一个属性-initial-关键字","children":[]},{"level":4,"title":"3.3.2 显式继承:inherit 关键字","slug":"显式继承-inherit-关键字","link":"#显式继承-inherit-关键字","children":[]},{"level":4,"title":"3.3.3 擦除所有声明:unset 关键字","slug":"擦除所有声明-unset-关键字","link":"#擦除所有声明-unset-关键字","children":[]}]}]}],"git":{"createdTime":1682394949000,"updatedTime":1682394949000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":11.1,"words":3331},"filePathRelative":"frontend/basic/css/005-cascade-inheritance.md","localizedDate":"2023年3月28日","excerpt":"","autoDesc":true}');export{J as comp,G as data}; diff --git a/assets/005-execution-context.html-h2_naATY.js b/assets/005-execution-context.html-salfrApg.js similarity index 99% rename from assets/005-execution-context.html-h2_naATY.js rename to assets/005-execution-context.html-salfrApg.js index b520cbabb0..0a53afdc4a 100644 --- a/assets/005-execution-context.html-h2_naATY.js +++ b/assets/005-execution-context.html-salfrApg.js @@ -1,4 +1,4 @@ -import{_ as p,r as t,o as i,c as l,a as n,d as s,b as a,w as u,e as o}from"./app-2R243if7.js";const r={},d=o(`

    执行上下文

    执行上下文(Execution Context)是 JavaScript 代码执行时所在的环境,一共有三种不同的执行上下文:

    • 全局执行上下文(Global Execution Context, GEC):最基本的执行上下文,在一开始就会进行初始化:创建全局上下文,将 this 指向这个对象;一个 JavaScript 程序只有一个 GEC;浏览器环境中的全局对象是 window,在 Node 环境中全局对象是 global
    • 函数执行上下文(Function Execution Context, FEC):函数只有在调用时才会产生一个函数执行上下文;
    • Eval 执行上下文(Eval Execution Context, EEC):eval 函数执行时产生的执行上下文。

    下面是一个简单的例子:

    /* global execution context */
    +import{_ as p,r as t,o as i,c as l,a as n,d as s,b as a,w as u,e as o}from"./app-I81jsmus.js";const r={},d=o(`

    执行上下文

    执行上下文(Execution Context)是 JavaScript 代码执行时所在的环境,一共有三种不同的执行上下文:

    • 全局执行上下文(Global Execution Context, GEC):最基本的执行上下文,在一开始就会进行初始化:创建全局上下文,将 this 指向这个对象;一个 JavaScript 程序只有一个 GEC;浏览器环境中的全局对象是 window,在 Node 环境中全局对象是 global
    • 函数执行上下文(Function Execution Context, FEC):函数只有在调用时才会产生一个函数执行上下文;
    • Eval 执行上下文(Eval Execution Context, EEC):eval 函数执行时产生的执行上下文。

    下面是一个简单的例子:

    /* global execution context */
     function baz() {
       // FEC of baz
       var foo = 3
    diff --git a/assets/005-install-docker.html-0N1qwABW.js b/assets/005-install-docker.html-gBSt4qi-.js
    similarity index 99%
    rename from assets/005-install-docker.html-0N1qwABW.js
    rename to assets/005-install-docker.html-gBSt4qi-.js
    index b038527576..87f7c6e88a 100644
    --- a/assets/005-install-docker.html-0N1qwABW.js
    +++ b/assets/005-install-docker.html-gBSt4qi-.js
    @@ -1,4 +1,4 @@
    -import{_ as c,r as l,o as r,c as d,b as p,w as s,e as o,d as n,a as e}from"./app-2R243if7.js";const u={},m=o(`

    提示

    需要保证 centos 版本:

    • centos 7
    • centos 8
    • centos 9

    卸载旧版本

    注意

    必须先完成这一步,否则会出现不可预见的错误。

    运行下列命令:

    sudo yum remove docker \\
    +import{_ as c,r as l,o as r,c as d,b as p,w as s,e as o,d as n,a as e}from"./app-I81jsmus.js";const u={},m=o(`

    提示

    需要保证 centos 版本:

    • centos 7
    • centos 8
    • centos 9

    卸载旧版本

    注意

    必须先完成这一步,否则会出现不可预见的错误。

    运行下列命令:

    sudo yum remove docker \\
                       docker-client \\
                       docker-client-latest \\
                       docker-common \\
    diff --git a/assets/005-postcss-px-to-viewport.html-NXFQc7im.js b/assets/005-postcss-px-to-viewport.html-1cqOLJHS.js
    similarity index 99%
    rename from assets/005-postcss-px-to-viewport.html-NXFQc7im.js
    rename to assets/005-postcss-px-to-viewport.html-1cqOLJHS.js
    index e04e7410a8..85229dd93d 100644
    --- a/assets/005-postcss-px-to-viewport.html-NXFQc7im.js
    +++ b/assets/005-postcss-px-to-viewport.html-1cqOLJHS.js
    @@ -1,4 +1,4 @@
    -import{_ as e,r as t,o as p,c as o,a as n,d as s,b as r,e as c}from"./app-2R243if7.js";const l={},i=c(`

    由于 px 是固定单位,所以在不同设备上显示的大小是固定的,而不同设备又有不同大小,为了适配不同设备的单位大小,需要将 px 转换为视口单位。

    确定方案之后,那么思考如何将 px 转为视口单位呢,一个一个算?不太可能,因为你事先并不知道用户手中的设备是什么大小,这样换算得到的结果并不能满足所有用户的需求,因此需要一个更为适用的方法。

    这就需要用到一个插件:postcss-px-to-viewport

    安装

    npm install postcss-px-to-viewport --save-dev
    +import{_ as e,r as t,o as p,c as o,a as n,d as s,b as r,e as c}from"./app-I81jsmus.js";const l={},i=c(`

    由于 px 是固定单位,所以在不同设备上显示的大小是固定的,而不同设备又有不同大小,为了适配不同设备的单位大小,需要将 px 转换为视口单位。

    确定方案之后,那么思考如何将 px 转为视口单位呢,一个一个算?不太可能,因为你事先并不知道用户手中的设备是什么大小,这样换算得到的结果并不能满足所有用户的需求,因此需要一个更为适用的方法。

    这就需要用到一个插件:postcss-px-to-viewport

    安装

    npm install postcss-px-to-viewport --save-dev
     

    参数配置

    新建 postcss.config.js,默认配置如下:

    module.exports = {
       plugins: {
         'postcss-px-to-viewport': {
    diff --git a/assets/005-qwik.html-TahGLhP-.js b/assets/005-qwik.html-U4rDkWuK.js
    similarity index 99%
    rename from assets/005-qwik.html-TahGLhP-.js
    rename to assets/005-qwik.html-U4rDkWuK.js
    index 4d675afe4c..d6c90a3882 100644
    --- a/assets/005-qwik.html-TahGLhP-.js
    +++ b/assets/005-qwik.html-U4rDkWuK.js
    @@ -1 +1 @@
    -import{_ as i,r as n,o,c as p,a as e,d as r,b as a,e as s}from"./app-2R243if7.js";const l={},c=s('

    Web Apps 历史

    在了解 Qwik 之前,有必要了解 Web 应用程序的历史。

    第一代

    第一代应用程序采用 MPA 技术,是在服务器上通过 PHP 等技术完成的。

    服务器会渲染一系列包含 HTML 和 JavaScript 的文档,客户端使用 jQuery 在模板中添加交互。

    这种方法的问题在于必须处理两种语言,一种在服务器端(如 PHP),另一种在客户端(JavaScript),这可能会导致在 PHP 中编写的元素与其在 JavaScript 中的行为之间产生混淆,从而导致多次编写一个功能。

    这就是这种方法难以扩展的原因。

    第二代

    第二代应用程序就是 SPA,即 AngularJS、Angular、React、Vue.js 等现代框架,这些框架都基于 MVC 架构。

    SPA 只在客户端向服务器发起请求更新状态,但是在首次加载时,浏览器会下载所有 JavaScript 代码。

    SPA 在首次加载时会是一个空白页,需要很长时间才能加载,而且如果想开发大型应用程序,它不具备可扩展性。

    client renderin - Adservio
    client renderin - Adservio

    SSR

    处于第二代和第三代的技术就是服务端渲染,比如 Next.js 或 Svelte。

    在 SSR 中,仍然构建 SPA 应用程序,然而步骤略有不同:

    1. 服务端拼接 HTML

      用户请求某个页面时,服务端会拼接好一个页面的 HTML 结构返回给客户端。

    2. 客户端对 HTML 进行预渲染

      HTML 结构加载显示,但是 JavaScript 代码还未加载,此时页面还不能进行交互。

    3. 进行 hydration(水合)处理

      通过 JavaScript 代码的执行,动态地为当前页面上的 DOM 绑定事件。

    HTML 相当于一个干货海参,JavaScript 代码理解为水,hydration 过程就是用水把海参泡发,即达到页面可正常交互的状态。

    SSR 确实将首屏加载速度变快,但仍有一些缺点:

    1. 在水合之前,此时页面仍然不可交互,所以 tti(页面可交互时间)并没有太多优化。
    2. 下载的 JavaScript 代码仍然是比较全量的代码。
    3. 比较耗费服务器资源,维护成本也较高。
    server renderin - Adservio
    server renderin - Adservio

    为了减少加载 JavaScript 代码所需的时间,Astro 框架出现了。

    Astro 有一个名为「部分水合」的概念,因此在页面可见之前,它不会对页面进行水合。

    例如,如果联系表单位于页面底部,而我们位于页面顶部,那么联系表单将不可见,这样就不需要加载表单所需的 JavaScript。

    只有当页面向下滚动到有联系表单的部分时,才会进行水合,将表单中的组件与所需的 JavaScript 水合。

    Qwik 介绍

    Qwik 可以理解为一个语法接近 React 的前端 SSR 框架,但是相比于 Astro,它的优化更加彻底:「0 水合」和「0 JavaScript」

    例如,如果我们在页面底部有一个联系表单,Angular、React 或 Vue 会在首次加载时加载所需的 JavaScript,Astro 会在我们向下滚动时加载,而 Qwik 只有在点击表单的发送按钮时才会加载,它不是在页面出现表单时加载 JavaScript,而是在与表单交互时加载

    Qwik 的核心理念:to do it faster by doing nothing。

    Resumability

    现代的框架都在尝试优化水合作用,Qwik 的独特之处在于 可恢复性 (no eager JS execution and no hydration)。

    resumability in qwik framework
    resumability in qwik framework

    如果有一个庞大的应用程序,那么加载水合将会耗费大量时间,即使使用部分水合技术,也会面临挑战。而使用可恢复性的 Qwik 技术,只加载 HTML,则不会耗费大量时间。

    思考

    从概念上看,Qwik 确实会大幅提升庞大应用程序的性能,能提供最快的首次渲染和交互性能。然而,作为一个新技术,尽管它有潜力成为未来广泛使用的框架之一,仍然需要时间和社区支持。

    参考资料

    ',35),d={href:"https://www.adservio.fr/post/a-brief-history-of-web-apps-why-qwik-is-innovative",target:"_blank",rel:"noopener noreferrer"},h={href:"https://www.adservio.fr/post/qwik-the-post-modern-framework",target:"_blank",rel:"noopener noreferrer"},m={href:"https://segmentfault.com/a/1190000042250628",target:"_blank",rel:"noopener noreferrer"};function g(b,u){const t=n("ExternalLinkIcon");return o(),p("div",null,[c,e("ol",null,[e("li",null,[e("a",d,[r("A Brief History of Web Apps – Why Qwik is Innovative"),a(t)])]),e("li",null,[e("a",h,[r("Qwik – The Post-Modern Framework"),a(t)])]),e("li",null,[e("a",m,[r("Qwik.js框架是如何追求极致性能的?!"),a(t)])])])])}const k=i(l,[["render",g],["__file","005-qwik.html.vue"]]),f=JSON.parse('{"path":"/frontend/engineering/ssr/005-qwik.html","title":"Qwik","lang":"zh-CN","frontmatter":{"title":"Qwik","date":"2024-01-03T00:00:00.000Z","icon":"STARTUP","category":["工程化"],"tag":["frontend","SSR"],"description":"Web Apps 历史 在了解 Qwik 之前,有必要了解 Web 应用程序的历史。 第一代 第一代应用程序采用 MPA 技术,是在服务器上通过 PHP 等技术完成的。 服务器会渲染一系列包含 HTML 和 JavaScript 的文档,客户端使用 jQuery 在模板中添加交互。 这种方法的问题在于必须处理两种语言,一种在服务器端(如 PHP),另一...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/engineering/ssr/005-qwik.html"}],["meta",{"property":"og:title","content":"Qwik"}],["meta",{"property":"og:description","content":"Web Apps 历史 在了解 Qwik 之前,有必要了解 Web 应用程序的历史。 第一代 第一代应用程序采用 MPA 技术,是在服务器上通过 PHP 等技术完成的。 服务器会渲染一系列包含 HTML 和 JavaScript 的文档,客户端使用 jQuery 在模板中添加交互。 这种方法的问题在于必须处理两种语言,一种在服务器端(如 PHP),另一..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/63e3d6905bacd65c5da3920b_Client%20Rendering-min.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-07T08:28:24.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Qwik"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:tag","content":"SSR"}],["meta",{"property":"article:published_time","content":"2024-01-03T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-07T08:28:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Qwik\\",\\"image\\":[\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/63e3d6905bacd65c5da3920b_Client%20Rendering-min.jpg\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/63e3d6905bacd612ada3920c_Server%20Rendering-min%20(1\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/63e3d6905bacd6233ba391e2_Hydration%20-%20Ready-min.jpg\\"],\\"datePublished\\":\\"2024-01-03T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-07T08:28:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 Web Apps 历史","slug":"web-apps-历史","link":"#web-apps-历史","children":[{"level":3,"title":"1.1 第一代","slug":"第一代","link":"#第一代","children":[]},{"level":3,"title":"1.2 第二代","slug":"第二代","link":"#第二代","children":[]},{"level":3,"title":"1.3 SSR","slug":"ssr","link":"#ssr","children":[]}]},{"level":2,"title":"2 Qwik 介绍","slug":"qwik-介绍","link":"#qwik-介绍","children":[{"level":3,"title":"2.1 Resumability","slug":"resumability","link":"#resumability","children":[]}]},{"level":2,"title":"3 思考","slug":"思考","link":"#思考","children":[]},{"level":2,"title":"4 参考资料","slug":"参考资料","link":"#参考资料","children":[]}],"git":{"createdTime":1704616104000,"updatedTime":1704616104000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":3.77,"words":1130},"filePathRelative":"frontend/engineering/ssr/005-qwik.md","localizedDate":"2024年1月3日","excerpt":"","autoDesc":true}');export{k as comp,f as data}; +import{_ as i,r as n,o,c as p,a as e,d as r,b as a,e as s}from"./app-I81jsmus.js";const l={},c=s('

    Web Apps 历史

    在了解 Qwik 之前,有必要了解 Web 应用程序的历史。

    第一代

    第一代应用程序采用 MPA 技术,是在服务器上通过 PHP 等技术完成的。

    服务器会渲染一系列包含 HTML 和 JavaScript 的文档,客户端使用 jQuery 在模板中添加交互。

    这种方法的问题在于必须处理两种语言,一种在服务器端(如 PHP),另一种在客户端(JavaScript),这可能会导致在 PHP 中编写的元素与其在 JavaScript 中的行为之间产生混淆,从而导致多次编写一个功能。

    这就是这种方法难以扩展的原因。

    第二代

    第二代应用程序就是 SPA,即 AngularJS、Angular、React、Vue.js 等现代框架,这些框架都基于 MVC 架构。

    SPA 只在客户端向服务器发起请求更新状态,但是在首次加载时,浏览器会下载所有 JavaScript 代码。

    SPA 在首次加载时会是一个空白页,需要很长时间才能加载,而且如果想开发大型应用程序,它不具备可扩展性。

    client renderin - Adservio
    client renderin - Adservio

    SSR

    处于第二代和第三代的技术就是服务端渲染,比如 Next.js 或 Svelte。

    在 SSR 中,仍然构建 SPA 应用程序,然而步骤略有不同:

    1. 服务端拼接 HTML

      用户请求某个页面时,服务端会拼接好一个页面的 HTML 结构返回给客户端。

    2. 客户端对 HTML 进行预渲染

      HTML 结构加载显示,但是 JavaScript 代码还未加载,此时页面还不能进行交互。

    3. 进行 hydration(水合)处理

      通过 JavaScript 代码的执行,动态地为当前页面上的 DOM 绑定事件。

    HTML 相当于一个干货海参,JavaScript 代码理解为水,hydration 过程就是用水把海参泡发,即达到页面可正常交互的状态。

    SSR 确实将首屏加载速度变快,但仍有一些缺点:

    1. 在水合之前,此时页面仍然不可交互,所以 tti(页面可交互时间)并没有太多优化。
    2. 下载的 JavaScript 代码仍然是比较全量的代码。
    3. 比较耗费服务器资源,维护成本也较高。
    server renderin - Adservio
    server renderin - Adservio

    为了减少加载 JavaScript 代码所需的时间,Astro 框架出现了。

    Astro 有一个名为「部分水合」的概念,因此在页面可见之前,它不会对页面进行水合。

    例如,如果联系表单位于页面底部,而我们位于页面顶部,那么联系表单将不可见,这样就不需要加载表单所需的 JavaScript。

    只有当页面向下滚动到有联系表单的部分时,才会进行水合,将表单中的组件与所需的 JavaScript 水合。

    Qwik 介绍

    Qwik 可以理解为一个语法接近 React 的前端 SSR 框架,但是相比于 Astro,它的优化更加彻底:「0 水合」和「0 JavaScript」

    例如,如果我们在页面底部有一个联系表单,Angular、React 或 Vue 会在首次加载时加载所需的 JavaScript,Astro 会在我们向下滚动时加载,而 Qwik 只有在点击表单的发送按钮时才会加载,它不是在页面出现表单时加载 JavaScript,而是在与表单交互时加载

    Qwik 的核心理念:to do it faster by doing nothing。

    Resumability

    现代的框架都在尝试优化水合作用,Qwik 的独特之处在于 可恢复性 (no eager JS execution and no hydration)。

    resumability in qwik framework
    resumability in qwik framework

    如果有一个庞大的应用程序,那么加载水合将会耗费大量时间,即使使用部分水合技术,也会面临挑战。而使用可恢复性的 Qwik 技术,只加载 HTML,则不会耗费大量时间。

    思考

    从概念上看,Qwik 确实会大幅提升庞大应用程序的性能,能提供最快的首次渲染和交互性能。然而,作为一个新技术,尽管它有潜力成为未来广泛使用的框架之一,仍然需要时间和社区支持。

    参考资料

    ',35),d={href:"https://www.adservio.fr/post/a-brief-history-of-web-apps-why-qwik-is-innovative",target:"_blank",rel:"noopener noreferrer"},h={href:"https://www.adservio.fr/post/qwik-the-post-modern-framework",target:"_blank",rel:"noopener noreferrer"},m={href:"https://segmentfault.com/a/1190000042250628",target:"_blank",rel:"noopener noreferrer"};function g(b,u){const t=n("ExternalLinkIcon");return o(),p("div",null,[c,e("ol",null,[e("li",null,[e("a",d,[r("A Brief History of Web Apps – Why Qwik is Innovative"),a(t)])]),e("li",null,[e("a",h,[r("Qwik – The Post-Modern Framework"),a(t)])]),e("li",null,[e("a",m,[r("Qwik.js框架是如何追求极致性能的?!"),a(t)])])])])}const k=i(l,[["render",g],["__file","005-qwik.html.vue"]]),f=JSON.parse('{"path":"/frontend/engineering/ssr/005-qwik.html","title":"Qwik","lang":"zh-CN","frontmatter":{"title":"Qwik","date":"2024-01-03T00:00:00.000Z","icon":"STARTUP","category":["工程化"],"tag":["frontend","SSR"],"description":"Web Apps 历史 在了解 Qwik 之前,有必要了解 Web 应用程序的历史。 第一代 第一代应用程序采用 MPA 技术,是在服务器上通过 PHP 等技术完成的。 服务器会渲染一系列包含 HTML 和 JavaScript 的文档,客户端使用 jQuery 在模板中添加交互。 这种方法的问题在于必须处理两种语言,一种在服务器端(如 PHP),另一...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/frontend/engineering/ssr/005-qwik.html"}],["meta",{"property":"og:title","content":"Qwik"}],["meta",{"property":"og:description","content":"Web Apps 历史 在了解 Qwik 之前,有必要了解 Web 应用程序的历史。 第一代 第一代应用程序采用 MPA 技术,是在服务器上通过 PHP 等技术完成的。 服务器会渲染一系列包含 HTML 和 JavaScript 的文档,客户端使用 jQuery 在模板中添加交互。 这种方法的问题在于必须处理两种语言,一种在服务器端(如 PHP),另一..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/63e3d6905bacd65c5da3920b_Client%20Rendering-min.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-07T08:28:24.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Qwik"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"frontend"}],["meta",{"property":"article:tag","content":"SSR"}],["meta",{"property":"article:published_time","content":"2024-01-03T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-07T08:28:24.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Qwik\\",\\"image\\":[\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/63e3d6905bacd65c5da3920b_Client%20Rendering-min.jpg\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/63e3d6905bacd612ada3920c_Server%20Rendering-min%20(1\\",\\"https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/63e3d6905bacd6233ba391e2_Hydration%20-%20Ready-min.jpg\\"],\\"datePublished\\":\\"2024-01-03T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-07T08:28:24.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 Web Apps 历史","slug":"web-apps-历史","link":"#web-apps-历史","children":[{"level":3,"title":"1.1 第一代","slug":"第一代","link":"#第一代","children":[]},{"level":3,"title":"1.2 第二代","slug":"第二代","link":"#第二代","children":[]},{"level":3,"title":"1.3 SSR","slug":"ssr","link":"#ssr","children":[]}]},{"level":2,"title":"2 Qwik 介绍","slug":"qwik-介绍","link":"#qwik-介绍","children":[{"level":3,"title":"2.1 Resumability","slug":"resumability","link":"#resumability","children":[]}]},{"level":2,"title":"3 思考","slug":"思考","link":"#思考","children":[]},{"level":2,"title":"4 参考资料","slug":"参考资料","link":"#参考资料","children":[]}],"git":{"createdTime":1704616104000,"updatedTime":1704616104000,"contributors":[{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":1}]},"readingTime":{"minutes":3.77,"words":1130},"filePathRelative":"frontend/engineering/ssr/005-qwik.md","localizedDate":"2024年1月3日","excerpt":"","autoDesc":true}');export{k as comp,f as data}; diff --git a/assets/005-webpack-babel.html-1lDmfMgr.js b/assets/005-webpack-babel.html-Fqs9mfmk.js similarity index 99% rename from assets/005-webpack-babel.html-1lDmfMgr.js rename to assets/005-webpack-babel.html-Fqs9mfmk.js index 64d6434be6..85276f37b6 100644 --- a/assets/005-webpack-babel.html-1lDmfMgr.js +++ b/assets/005-webpack-babel.html-Fqs9mfmk.js @@ -1,4 +1,4 @@ -import{_ as e,r as p,o as l,c as t,a as n,d as s,b as i,e as c}from"./app-2R243if7.js";const o={},d={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},r=c(`

    babel 是一个工具链,主要用于旧浏览器或环境中将 ECMAScript 2015+ 的代码转换成向后兼容版本的 JavaScript。

    [1, 2, 3].map((n) => n + 1);
    +import{_ as e,r as p,o as l,c as t,a as n,d as s,b as i,e as c}from"./app-I81jsmus.js";const o={},d={href:"https://github.com/Stephen-wzw/webpack-demo",target:"_blank",rel:"noopener noreferrer"},r=c(`

    babel 是一个工具链,主要用于旧浏览器或环境中将 ECMAScript 2015+ 的代码转换成向后兼容版本的 JavaScript。

    [1, 2, 3].map((n) => n + 1);
     
     // babel 转换后
     [1, 2, 3].map(function(n) {
    diff --git a/assets/005-yeoman.html-9wj3v3oe.js b/assets/005-yeoman.html-KxN9wacd.js
    similarity index 99%
    rename from assets/005-yeoman.html-9wj3v3oe.js
    rename to assets/005-yeoman.html-KxN9wacd.js
    index ad3826acca..aaf013bdee 100644
    --- a/assets/005-yeoman.html-9wj3v3oe.js
    +++ b/assets/005-yeoman.html-KxN9wacd.js
    @@ -1,4 +1,4 @@
    -import{_ as i,r as s,o as r,c as l,a as e,d as n,b as t,e as o}from"./app-2R243if7.js";const d={},c=e("p",null,"::: waring",-1),p=e("code",null,"yo@5.0.0",-1),m={href:"https://github.com/yeoman/generator-generator/issues/258",target:"_blank",rel:"noopener noreferrer"},h=e("code",null,"@4.x",-1),u=o(`

    降级后仍有报错,可能是 generator-node 的问题,垃圾项目没人维护。

    :::

    Yeoman 是一个通用的脚手架系统,允许创建任何类型的应用程序。它可以快速启动新项目,并简化现有项目的维护工作。

    Yeoman 与语言无关。它可以生成任何语言(Web、Java、Python、C# 等)的项目。

    Yeoman 本身不做任何决定。所有决定都由生成器做出,而生成器基本上就是 Yeoman 环境中的插件。有很多公开可用的生成器,创建一个新的生成器来匹配任何工作流程也很容易。Yeoman 始终是满足脚手架需求的正确选择。

    以下是一些常见的使用案例:

    • 快速创建新项目
    • 创建项目的新部分,如带有单元测试的新控制器
    • 创建模块或软件包
    • 引导新服务
    • 执行标准、最佳实践和风格指南
    • 通过让用户使用示例应用程序来推广新项目
    • ...

    开始

    yo 是一款 Yeoman 命令行实用程序,允许使用脚手架模板(简称为生成器)创建项目。使用 npm 安装 yo 和生成器:

    npm install -g yo
    +import{_ as i,r as s,o as r,c as l,a as e,d as n,b as t,e as o}from"./app-I81jsmus.js";const d={},c=e("p",null,"::: waring",-1),p=e("code",null,"yo@5.0.0",-1),m={href:"https://github.com/yeoman/generator-generator/issues/258",target:"_blank",rel:"noopener noreferrer"},h=e("code",null,"@4.x",-1),u=o(`

    降级后仍有报错,可能是 generator-node 的问题,垃圾项目没人维护。

    :::

    Yeoman 是一个通用的脚手架系统,允许创建任何类型的应用程序。它可以快速启动新项目,并简化现有项目的维护工作。

    Yeoman 与语言无关。它可以生成任何语言(Web、Java、Python、C# 等)的项目。

    Yeoman 本身不做任何决定。所有决定都由生成器做出,而生成器基本上就是 Yeoman 环境中的插件。有很多公开可用的生成器,创建一个新的生成器来匹配任何工作流程也很容易。Yeoman 始终是满足脚手架需求的正确选择。

    以下是一些常见的使用案例:

    • 快速创建新项目
    • 创建项目的新部分,如带有单元测试的新控制器
    • 创建模块或软件包
    • 引导新服务
    • 执行标准、最佳实践和风格指南
    • 通过让用户使用示例应用程序来推广新项目
    • ...

    开始

    yo 是一款 Yeoman 命令行实用程序,允许使用脚手架模板(简称为生成器)创建项目。使用 npm 安装 yo 和生成器:

    npm install -g yo
     

    然后可以安装一些生成器:

    `,11),g={class:"hint-container info"},b=e("p",{class:"hint-container-title"},"相关信息",-1),v={href:"https://yeoman.io/generators/",target:"_blank",rel:"noopener noreferrer"},y=o(`
    npm install -g generator-node
     

    基本脚手架

    搭建基本脚手架,只需要去除生成器前缀 generator-

    yo node
     

    大多数生成器会提出一系列问题来定制新项目。要查看哪些选项可用,请使用 help 命令:

    yo node --help
    diff --git a/assets/006-HTTPS-overview.html-dTO_M_73.js b/assets/006-HTTPS-overview.html-SYoh5fQX.js
    similarity index 99%
    rename from assets/006-HTTPS-overview.html-dTO_M_73.js
    rename to assets/006-HTTPS-overview.html-SYoh5fQX.js
    index 292663b7fb..518bc01901 100644
    --- a/assets/006-HTTPS-overview.html-dTO_M_73.js
    +++ b/assets/006-HTTPS-overview.html-SYoh5fQX.js
    @@ -1 +1 @@
    -import{_ as l,r,o,c as a,a as t,d as i,b as n,e as s}from"./app-2R243if7.js";const p="/blog/assets/image/computer-science/networking/006/HTTP.png",c="/blog/assets/image/computer-science/networking/006/HTTPS.png",T="/blog/assets/image/computer-science/networking/006/mid-attack.png",g="/blog/assets/image/computer-science/networking/006/https-flow.png",h={},m=s('

    HTTP 和 HTTPS

    区别

    • HTTP 是明文传输,不安全,而 HTTPS 加入了 SSL/TLS 安全协议,使得报文能加密传输;
    • HTTP 建立连接只需 TCP 三次握手,而 HTTPS 在三次握手后,还需要进行 SSL/TLS 握手;
    • HTTP 端口号为 80,HTTPS 端口号为 443;
    • HTTPS 需要向 CA 申请数字证书。
    http
    http
    https
    https

    HTTPS 缺点

    • 在相同网络环境中,HTTPS 相比 HTTP 无论是响应时间还是耗电量都有大幅度上升;
    • HTTPS 的安全是有范围的,在黑客攻击、服务器劫持等情况下几乎起不到作用;
    • 在现有的证书机制下,中间人攻击依然有可能发生;
    • HTTPS 需要更多的服务器资源,也会导致成本的升高。

    加密算法

    HTTPS 使用混合加密算法解决数据安全传输问题,即对称加密非对称加密混合使用。

    对称加密

    加密和解密都是同一个密钥,优缺点如下:

    优点:

    1. 由于密钥相同,因此加密解密速度快,适合加密比较大的数据。

    缺点:

    1. 交易双方在传输过程中需要使用相同的密钥,因此需要在首次传输过程中必然需要由一方将密钥传给另一方,这样就无法保证保证密钥的安全性,有可能会被截获;
    2. 不同用户访问的密钥需要不同,这会造成服务器管理密钥困难,成本高。

    非对称加密

    加密和解密使用不同的密钥:公钥(public key)加密和私钥(private key)解密。流程如下:

    1. 发送方向接收方请求一个公钥;
    2. 发送方使用公钥加密,公钥和加密的数据泄露并没有关系,因为只有私钥才能解密;
    3. 接收方用私钥解密消息。

    优点:

    1. 加密和解密使用不同的密钥,私钥不需要通过网络传输,安全性高。

    缺点:

    1. 计算量比较大,加密解密速度比对称加密慢;
    2. 中间人攻击:中间人进行拦截,无法保证公钥是接收方提供的。
    中间人攻击
    中间人攻击

    数字证书和数字签名

    中间人攻击使我们无法验证公钥的真假。因此引入数字证书,用它来证明身份是真实的,并且防止被中间人攻击。

    由数字证书认证机构(Certificate Authority,简称 CA)负责给用户签发数字证书,证书中包括:签发者、使用者公钥、使用的 HASH 算法、证书到期时间等。

    但是问题来了,如果中间人篡改了证书,如何保证身份证明是有效的?这时需要引进数字签名

    首先使用 CA 自带的 HASH 算法对证书的内容进行 HASH 得到一个信息摘要,再用 CA 的私钥进行加密,最终组成数字签名。当服务器将原始信息和数字签名发送过来时,客户端先使用 CA 的公钥对数字签名进行解密,得到 CA 创建的信息摘要,再使用同样的 HASH 算法生成原始信息的信息摘要,两者进行对比,就知道证书是否被篡改了。

    通过数字签名的证书验证,能最大程度的保证数据传输安全。

    HTTPS 工作流程

    前面提到,HTTPS 使用了混合加密解决安全传输问题,整个工作过程分为三大步:证书验证、非对称加密和对称加密。

    https工作流程
    https工作流程

    证书验证:

    1. Client 发起一个 HTTPS 的请求;
    2. Server 把事先配置好的公钥证书返回给客户端;
    3. Client 验证公钥证书:如果验证通过则继续,不通过则显示警告信息;

    非对称加密:

    1. Client 生成加密所使用的会话密钥,然后用证书的公钥加密这个会话密钥,发给 Server。
    2. Server 使用自己的私钥解密这个消息,得到会话密钥。至此,Client 和 Server 双方都持有了相同的会话密钥。

    对称加密:

    1. Server 使用会话密钥加密“明文内容 A”,发送给 Client。
    2. Client 使用会话密钥解密响应的密文,得到“明文内容 A”。
    3. Client 再次发起 HTTPS 的请求,使用会话密钥加密请求的“明文内容 B”,然后 Server 使用会话密钥解密密文,得到“明文内容 B”。

    参考链接

    ',39),d={href:"https://www.cnblogs.com/linianhui/p/security-based-toolbox.html",target:"_blank",rel:"noopener noreferrer"},S={href:"https://www.cnblogs.com/linianhui/p/security-complex-toolbox.html",target:"_blank",rel:"noopener noreferrer"},H={href:"https://www.cnblogs.com/linianhui/p/security-https-workflow.html",target:"_blank",rel:"noopener noreferrer"},u={href:"https://segmentfault.com/a/1190000021494676",target:"_blank",rel:"noopener noreferrer"};function P(b,f){const e=r("ExternalLinkIcon");return o(),a("div",null,[m,t("p",null,[t("a",d,[i("[信息安全] 1.密码工具箱 "),n(e)])]),t("p",null,[t("a",S,[i("[信息安全] 2.密码工具箱(续)"),n(e)])]),t("p",null,[t("a",H,[i("[信息安全] 3.HTTPS 工作流程"),n(e)])]),t("p",null,[t("a",u,[i("HTTPS 详解一:附带最精美详尽的 HTTPS 原理图"),n(e)])])])}const w=l(h,[["render",P],["__file","006-HTTPS-overview.html.vue"]]),k=JSON.parse('{"path":"/computer-science/networking/006-HTTPS-overview.html","title":"HTTPS 略解","lang":"zh-CN","frontmatter":{"title":"HTTPS 略解","date":"2022-05-05T00:00:00.000Z","icon":"STARTUP","category":["计算机网络"],"tag":["HTTP","HTTPS"],"description":"HTTP 和 HTTPS 区别 HTTP 是明文传输,不安全,而 HTTPS 加入了 SSL/TLS 安全协议,使得报文能加密传输; HTTP 建立连接只需 TCP 三次握手,而 HTTPS 在三次握手后,还需要进行 SSL/TLS 握手; HTTP 端口号为 80,HTTPS 端口号为 443; HTTPS 需要向 CA 申请数字证书。 httpht...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/computer-science/networking/006-HTTPS-overview.html"}],["meta",{"property":"og:title","content":"HTTPS 略解"}],["meta",{"property":"og:description","content":"HTTP 和 HTTPS 区别 HTTP 是明文传输,不安全,而 HTTPS 加入了 SSL/TLS 安全协议,使得报文能加密传输; HTTP 建立连接只需 TCP 三次握手,而 HTTPS 在三次握手后,还需要进行 SSL/TLS 握手; HTTP 端口号为 80,HTTPS 端口号为 443; HTTPS 需要向 CA 申请数字证书。 httpht..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/HTTP.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-07T06:34:07.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"HTTPS 略解"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"HTTP"}],["meta",{"property":"article:tag","content":"HTTPS"}],["meta",{"property":"article:published_time","content":"2022-05-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-07T06:34:07.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"HTTPS 略解\\",\\"image\\":[\\"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/HTTP.png\\",\\"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/HTTPS.png\\",\\"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/mid-attack.png\\",\\"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/https-flow.png\\"],\\"datePublished\\":\\"2022-05-05T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-07T06:34:07.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 HTTP 和 HTTPS","slug":"http-和-https","link":"#http-和-https","children":[{"level":3,"title":"1.1 区别","slug":"区别","link":"#区别","children":[]},{"level":3,"title":"1.2 HTTPS 缺点","slug":"https-缺点","link":"#https-缺点","children":[]}]},{"level":2,"title":"2 加密算法","slug":"加密算法","link":"#加密算法","children":[{"level":3,"title":"2.1 对称加密","slug":"对称加密","link":"#对称加密","children":[]},{"level":3,"title":"2.2 非对称加密","slug":"非对称加密","link":"#非对称加密","children":[]}]},{"level":2,"title":"3 数字证书和数字签名","slug":"数字证书和数字签名","link":"#数字证书和数字签名","children":[]},{"level":2,"title":"4 HTTPS 工作流程","slug":"https-工作流程","link":"#https-工作流程","children":[]},{"level":2,"title":"5 参考链接","slug":"参考链接","link":"#参考链接","children":[]}],"git":{"createdTime":1677733227000,"updatedTime":1707287647000,"contributors":[{"name":"Stephen-wzw","email":"wzw15292257101@163.com","commits":2},{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":2}]},"readingTime":{"minutes":4.1,"words":1231},"filePathRelative":"computer-science/networking/006-HTTPS-overview.md","localizedDate":"2022年5月5日","excerpt":"","autoDesc":true}');export{w as comp,k as data}; +import{_ as l,r,o,c as a,a as t,d as i,b as n,e as s}from"./app-I81jsmus.js";const p="/blog/assets/image/computer-science/networking/006/HTTP.png",c="/blog/assets/image/computer-science/networking/006/HTTPS.png",T="/blog/assets/image/computer-science/networking/006/mid-attack.png",g="/blog/assets/image/computer-science/networking/006/https-flow.png",h={},m=s('

    HTTP 和 HTTPS

    区别

    • HTTP 是明文传输,不安全,而 HTTPS 加入了 SSL/TLS 安全协议,使得报文能加密传输;
    • HTTP 建立连接只需 TCP 三次握手,而 HTTPS 在三次握手后,还需要进行 SSL/TLS 握手;
    • HTTP 端口号为 80,HTTPS 端口号为 443;
    • HTTPS 需要向 CA 申请数字证书。
    http
    http
    https
    https

    HTTPS 缺点

    • 在相同网络环境中,HTTPS 相比 HTTP 无论是响应时间还是耗电量都有大幅度上升;
    • HTTPS 的安全是有范围的,在黑客攻击、服务器劫持等情况下几乎起不到作用;
    • 在现有的证书机制下,中间人攻击依然有可能发生;
    • HTTPS 需要更多的服务器资源,也会导致成本的升高。

    加密算法

    HTTPS 使用混合加密算法解决数据安全传输问题,即对称加密非对称加密混合使用。

    对称加密

    加密和解密都是同一个密钥,优缺点如下:

    优点:

    1. 由于密钥相同,因此加密解密速度快,适合加密比较大的数据。

    缺点:

    1. 交易双方在传输过程中需要使用相同的密钥,因此需要在首次传输过程中必然需要由一方将密钥传给另一方,这样就无法保证保证密钥的安全性,有可能会被截获;
    2. 不同用户访问的密钥需要不同,这会造成服务器管理密钥困难,成本高。

    非对称加密

    加密和解密使用不同的密钥:公钥(public key)加密和私钥(private key)解密。流程如下:

    1. 发送方向接收方请求一个公钥;
    2. 发送方使用公钥加密,公钥和加密的数据泄露并没有关系,因为只有私钥才能解密;
    3. 接收方用私钥解密消息。

    优点:

    1. 加密和解密使用不同的密钥,私钥不需要通过网络传输,安全性高。

    缺点:

    1. 计算量比较大,加密解密速度比对称加密慢;
    2. 中间人攻击:中间人进行拦截,无法保证公钥是接收方提供的。
    中间人攻击
    中间人攻击

    数字证书和数字签名

    中间人攻击使我们无法验证公钥的真假。因此引入数字证书,用它来证明身份是真实的,并且防止被中间人攻击。

    由数字证书认证机构(Certificate Authority,简称 CA)负责给用户签发数字证书,证书中包括:签发者、使用者公钥、使用的 HASH 算法、证书到期时间等。

    但是问题来了,如果中间人篡改了证书,如何保证身份证明是有效的?这时需要引进数字签名

    首先使用 CA 自带的 HASH 算法对证书的内容进行 HASH 得到一个信息摘要,再用 CA 的私钥进行加密,最终组成数字签名。当服务器将原始信息和数字签名发送过来时,客户端先使用 CA 的公钥对数字签名进行解密,得到 CA 创建的信息摘要,再使用同样的 HASH 算法生成原始信息的信息摘要,两者进行对比,就知道证书是否被篡改了。

    通过数字签名的证书验证,能最大程度的保证数据传输安全。

    HTTPS 工作流程

    前面提到,HTTPS 使用了混合加密解决安全传输问题,整个工作过程分为三大步:证书验证、非对称加密和对称加密。

    https工作流程
    https工作流程

    证书验证:

    1. Client 发起一个 HTTPS 的请求;
    2. Server 把事先配置好的公钥证书返回给客户端;
    3. Client 验证公钥证书:如果验证通过则继续,不通过则显示警告信息;

    非对称加密:

    1. Client 生成加密所使用的会话密钥,然后用证书的公钥加密这个会话密钥,发给 Server。
    2. Server 使用自己的私钥解密这个消息,得到会话密钥。至此,Client 和 Server 双方都持有了相同的会话密钥。

    对称加密:

    1. Server 使用会话密钥加密“明文内容 A”,发送给 Client。
    2. Client 使用会话密钥解密响应的密文,得到“明文内容 A”。
    3. Client 再次发起 HTTPS 的请求,使用会话密钥加密请求的“明文内容 B”,然后 Server 使用会话密钥解密密文,得到“明文内容 B”。

    参考链接

    ',39),d={href:"https://www.cnblogs.com/linianhui/p/security-based-toolbox.html",target:"_blank",rel:"noopener noreferrer"},S={href:"https://www.cnblogs.com/linianhui/p/security-complex-toolbox.html",target:"_blank",rel:"noopener noreferrer"},H={href:"https://www.cnblogs.com/linianhui/p/security-https-workflow.html",target:"_blank",rel:"noopener noreferrer"},u={href:"https://segmentfault.com/a/1190000021494676",target:"_blank",rel:"noopener noreferrer"};function P(b,f){const e=r("ExternalLinkIcon");return o(),a("div",null,[m,t("p",null,[t("a",d,[i("[信息安全] 1.密码工具箱 "),n(e)])]),t("p",null,[t("a",S,[i("[信息安全] 2.密码工具箱(续)"),n(e)])]),t("p",null,[t("a",H,[i("[信息安全] 3.HTTPS 工作流程"),n(e)])]),t("p",null,[t("a",u,[i("HTTPS 详解一:附带最精美详尽的 HTTPS 原理图"),n(e)])])])}const w=l(h,[["render",P],["__file","006-HTTPS-overview.html.vue"]]),k=JSON.parse('{"path":"/computer-science/networking/006-HTTPS-overview.html","title":"HTTPS 略解","lang":"zh-CN","frontmatter":{"title":"HTTPS 略解","date":"2022-05-05T00:00:00.000Z","icon":"STARTUP","category":["计算机网络"],"tag":["HTTP","HTTPS"],"description":"HTTP 和 HTTPS 区别 HTTP 是明文传输,不安全,而 HTTPS 加入了 SSL/TLS 安全协议,使得报文能加密传输; HTTP 建立连接只需 TCP 三次握手,而 HTTPS 在三次握手后,还需要进行 SSL/TLS 握手; HTTP 端口号为 80,HTTPS 端口号为 443; HTTPS 需要向 CA 申请数字证书。 httpht...","head":[["meta",{"property":"og:url","content":"https://dribble-njr.github.io/blog/blog/computer-science/networking/006-HTTPS-overview.html"}],["meta",{"property":"og:title","content":"HTTPS 略解"}],["meta",{"property":"og:description","content":"HTTP 和 HTTPS 区别 HTTP 是明文传输,不安全,而 HTTPS 加入了 SSL/TLS 安全协议,使得报文能加密传输; HTTP 建立连接只需 TCP 三次握手,而 HTTPS 在三次握手后,还需要进行 SSL/TLS 握手; HTTP 端口号为 80,HTTPS 端口号为 443; HTTPS 需要向 CA 申请数字证书。 httpht..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/HTTP.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-07T06:34:07.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"HTTPS 略解"}],["meta",{"property":"article:author","content":"njr"}],["meta",{"property":"article:tag","content":"HTTP"}],["meta",{"property":"article:tag","content":"HTTPS"}],["meta",{"property":"article:published_time","content":"2022-05-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-07T06:34:07.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"HTTPS 略解\\",\\"image\\":[\\"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/HTTP.png\\",\\"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/HTTPS.png\\",\\"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/mid-attack.png\\",\\"https://dribble-njr.github.io/blog/blog/assets/image/computer-science/networking/006/https-flow.png\\"],\\"datePublished\\":\\"2022-05-05T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-07T06:34:07.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"njr\\",\\"url\\":\\"https://github.com/dribble-njr/blog\\",\\"email\\":\\"wzw15292257101@163.com\\"}]}"]]},"headers":[{"level":2,"title":"1 HTTP 和 HTTPS","slug":"http-和-https","link":"#http-和-https","children":[{"level":3,"title":"1.1 区别","slug":"区别","link":"#区别","children":[]},{"level":3,"title":"1.2 HTTPS 缺点","slug":"https-缺点","link":"#https-缺点","children":[]}]},{"level":2,"title":"2 加密算法","slug":"加密算法","link":"#加密算法","children":[{"level":3,"title":"2.1 对称加密","slug":"对称加密","link":"#对称加密","children":[]},{"level":3,"title":"2.2 非对称加密","slug":"非对称加密","link":"#非对称加密","children":[]}]},{"level":2,"title":"3 数字证书和数字签名","slug":"数字证书和数字签名","link":"#数字证书和数字签名","children":[]},{"level":2,"title":"4 HTTPS 工作流程","slug":"https-工作流程","link":"#https-工作流程","children":[]},{"level":2,"title":"5 参考链接","slug":"参考链接","link":"#参考链接","children":[]}],"git":{"createdTime":1677733227000,"updatedTime":1707287647000,"contributors":[{"name":"Stephen-wzw","email":"wzw15292257101@163.com","commits":2},{"name":"dribble-njr","email":"wzw15292257101@163.com","commits":2}]},"readingTime":{"minutes":4.1,"words":1231},"filePathRelative":"computer-science/networking/006-HTTPS-overview.md","localizedDate":"2022年5月5日","excerpt":"","autoDesc":true}');export{w as comp,k as data}; diff --git a/assets/006-animation-svg.html-JwE1dpsg.js b/assets/006-animation-svg.html-8eIQ6Ihw.js similarity index 99% rename from assets/006-animation-svg.html-JwE1dpsg.js rename to assets/006-animation-svg.html-8eIQ6Ihw.js index 3ad41a2b0d..4c25b9fe23 100644 --- a/assets/006-animation-svg.html-JwE1dpsg.js +++ b/assets/006-animation-svg.html-8eIQ6Ihw.js @@ -1,4 +1,4 @@ -import{_ as c,r as e,o as l,c as i,a as n,d as s,b as a,w as u,e as p}from"./app-2R243if7.js";const r={},k={href:"https://antfu.me/posts/animated-svg-logo",target:"_blank",rel:"noopener noreferrer"},d=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("svg")]),s(),n("span",{class:"token attr-name"},"height"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("55"),n("span",{class:"token punctuation"},'"')]),s(),n("span",{class:"token attr-name"},"xmlns"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("http://www.w3.org/2000/svg"),n("span",{class:"token punctuation"},'"')]),s(),n("span",{class:"token attr-name"},"viewBox"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("-10 -15 700 620"),n("span",{class:"token punctuation"},'"')]),n("span",{class:"token punctuation"},">")]),s(` +import{_ as c,r as e,o as l,c as i,a as n,d as s,b as a,w as u,e as p}from"./app-I81jsmus.js";const r={},k={href:"https://antfu.me/posts/animated-svg-logo",target:"_blank",rel:"noopener noreferrer"},d=n("div",{class:"language-html line-numbers-mode","data-ext":"html","data-title":"html"},[n("pre",{class:"language-html"},[n("code",null,[n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("svg")]),s(),n("span",{class:"token attr-name"},"height"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("55"),n("span",{class:"token punctuation"},'"')]),s(),n("span",{class:"token attr-name"},"xmlns"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("http://www.w3.org/2000/svg"),n("span",{class:"token punctuation"},'"')]),s(),n("span",{class:"token attr-name"},"viewBox"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("-10 -15 700 620"),n("span",{class:"token punctuation"},'"')]),n("span",{class:"token punctuation"},">")]),s(` `),n("span",{class:"token tag"},[n("span",{class:"token tag"},[n("span",{class:"token punctuation"},"<"),s("path")]),s(` `),n("span",{class:"token attr-name"},"id"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("path1"),n("span",{class:"token punctuation"},'"')]),s(` `),n("span",{class:"token attr-name"},"d"),n("span",{class:"token attr-value"},[n("span",{class:"token punctuation attr-equals"},"="),n("span",{class:"token punctuation"},'"'),s("M184.42,387.69a25,25,0,0,1-11-7.18c-4.43-5.17-5.2-10.95-5.86-14.76-.21-1.2-5.31-14.92-15.51-42.36-4.38-11.79-5.8-15.18-8.89-19.67-5.28-7.66-8.9-14.55-14.75-14.94-7.4-.5-14.11,9.19-16.84,15.89-6,14.72-1.44,36.36,14.38,46.14,10.94,6.77,22.73,5,26.29,4.35,14.59-2.51,23.58-12.25,37.58-27.85,2.81-3.13,5.53-6.49,23.15-31.75,12.15-17.41,18.22-26.12,20.54-29.74,11.81-18.53,18.52-33.27,27.86-54,8.42-18.7,16.27-36.29,23.74-60.9,8.64-28.44,9.71-43,8.61-56.08-1.75-20.67-8.21-29-10.35-31.56-9.89-11.77-24.18-14.44-29.85-15.5-31.47-5.88-85.62,22.81-136.07,72.92C107,131.08,43.84,195.31,14.71,297.51,1,345.61,4.27,369,13.56,387.07c2.17,4.21,16.6,31.82,45.81,41.49a77.54,77.54,0,0,0,16.75,3.24C152.84,437.2,315,348.56,315,348.56c34.55-18.88,76.19-40.52,159.47-83.79,57.73-30,105.23-53.81,136.21-69.19"),n("span",{class:"token punctuation"},'"')]),s(` diff --git a/assets/006-background-border.html-pQQrVWCp.js b/assets/006-background-border.html-RCrBWyb-.js similarity index 99% rename from assets/006-background-border.html-pQQrVWCp.js rename to assets/006-background-border.html-RCrBWyb-.js index af1bcc1887..ee8ce5b6e4 100644 --- a/assets/006-background-border.html-pQQrVWCp.js +++ b/assets/006-background-border.html-RCrBWyb-.js @@ -1,4 +1,4 @@ -import{_ as l,r as o,o as i,c as u,a as n,d as s,b as a,w as e,e as c}from"./app-2R243if7.js";const r={},d=c(`

    在网页开发中,背景和边框是常用的 CSS 属性,可以帮助我们美化网页的外观和布局。

    背景属性

    CSS 中的 background 属性可以为元素设置背景颜色、图片、渐变色、重复模式等。下面是一些常见的 CSS 背景属性。

    background-color

    background-color 属性用于设置元素的背景颜色。它可以接受各种颜色值,例如颜色名称、十六进制颜色码、RGB 颜色等。例如,我们可以使用以下代码为一个段落元素设置背景颜色:

    p {
    +import{_ as l,r as o,o as i,c as u,a as n,d as s,b as a,w as e,e as c}from"./app-I81jsmus.js";const r={},d=c(`

    在网页开发中,背景和边框是常用的 CSS 属性,可以帮助我们美化网页的外观和布局。

    背景属性

    CSS 中的 background 属性可以为元素设置背景颜色、图片、渐变色、重复模式等。下面是一些常见的 CSS 背景属性。

    background-color

    background-color 属性用于设置元素的背景颜色。它可以接受各种颜色值,例如颜色名称、十六进制颜色码、RGB 颜色等。例如,我们可以使用以下代码为一个段落元素设置背景颜色:

    p {
       background-color: #f0f0f0;
     }
     

    background-image

    background-image 属性用于设置元素的背景图片。它可以接受一个图片的 URL 地址作为值。例如,我们可以使用以下代码为一个 div 元素设置背景图片:

    div {
    diff --git a/assets/006-react-server-component.html-R-ash7ca.js b/assets/006-react-server-component.html-k-YETDuh.js
    similarity index 99%
    rename from assets/006-react-server-component.html-R-ash7ca.js
    rename to assets/006-react-server-component.html-k-YETDuh.js
    index 3c0a76d89a..200f7dc038 100644
    --- a/assets/006-react-server-component.html-R-ash7ca.js
    +++ b/assets/006-react-server-component.html-k-YETDuh.js
    @@ -1,4 +1,4 @@
    -import{_ as e,r as p,o,c,a as n,d as a,b as t,e as l}from"./app-2R243if7.js";const i={},u=l(`

    React Server Component 是一种新的组件类型,它允许 React 应用在后端服务器上运行部分组件逻辑。传统的客户端渲染将渲染和处理放在前端。服务器组件的引入,旨在优化应用性能,减小传输给客户端的数据量,提高加载速度,提升用户体验。

    服务器和客户端组件允许开发人员构建跨越服务器和客户端的应用程序,将客户端应用程序的丰富交互性与传统服务器渲染的更高性能结合起来。

    Why Server Components

    注意看下面的例子:

    const App = () => {
    +import{_ as e,r as p,o,c,a as n,d as a,b as t,e as l}from"./app-I81jsmus.js";const i={},u=l(`

    React Server Component 是一种新的组件类型,它允许 React 应用在后端服务器上运行部分组件逻辑。传统的客户端渲染将渲染和处理放在前端。服务器组件的引入,旨在优化应用性能,减小传输给客户端的数据量,提高加载速度,提升用户体验。

    服务器和客户端组件允许开发人员构建跨越服务器和客户端的应用程序,将客户端应用程序的丰富交互性与传统服务器渲染的更高性能结合起来。

    Why Server Components

    注意看下面的例子:

    const App = () => {
       return (
         <Wrapper>
           <ComponentA />
    diff --git a/assets/006-semantically-meaningful-tags.html-antLdR07.js b/assets/006-semantically-meaningful-tags.html-WThMFqDm.js
    similarity index 98%
    rename from assets/006-semantically-meaningful-tags.html-antLdR07.js
    rename to assets/006-semantically-meaningful-tags.html-WThMFqDm.js
    index f6e973314f..86804903da 100644
    --- a/assets/006-semantically-meaningful-tags.html-antLdR07.js
    +++ b/assets/006-semantically-meaningful-tags.html-WThMFqDm.js
    @@ -1 +1 @@
    -import{_ as t,o as e,c as a,e as i}from"./app-2R243if7.js";const o={},n=i('

    HTML5 中加入了一些语义化标签,来更清晰的表达文档结构。

    语义化标签
    语义化标签
    • <header>:页眉。
    • <nav>:导航栏。
    • <main>:主内容。主内容中还可以有各种子内容区段,可用 <article><section><div> 等元素表示。
    • <aside>:侧边栏,经常嵌套在 <main> 中。
    • <footer>:页脚。

    语义化优点:

    • 易于用户阅读,在丢失 CSS 样式的时候仍能呈现清晰的结构;
    • 方便屏幕阅读器解析,如盲人阅读器根据标签渲染网页;
    • 提升用户体验,例如 title、alt 可以用于解释名称或图片信息;
    • 便于 SEO 搜索引擎优化,搜索引擎根据标签来确定上下文和关键字的权重;
    • 有利于开发人员维护。

    缺点:

    • 存在兼容性问题,HTML5 语义化标签在 IE8 下,默认当成行内元素展示。
    ',7),r=[n];function l(c,m){return e(),a("div",null,r)}const g=t(o,[["render",l],["__file","006-semantically-meaningful-tags.html.vue"]]),p=JSON.parse('{"path":"/frontend/basic/html/006-semantically-meaningful-tags.html","title":"语义化标签","lang":"zh-CN","frontmatter":{"title":"语义化标签","date":"2022-04-30T00:00:00.000Z","icon":"tag","category":["HTML"],"tag":["HTML5"],"description":"HTML5 中加入了一些语义化标签,来更清晰的表达文档结构。 语义化标签语义化标签
    :页眉。
    1. 刷新权限
    FLUSH PRIVILEGES;
     

    注意

    必要步骤,否则权限会不生效。

    做完基本的配置之后,就可以使用下面命令退出命令行界面:

    exit;
     

    服务器开放端口

    参考 添加安全组规则

    接下来就可以使用 Navicat 连接数据库了。

    - + diff --git a/backend/database/mysql/index.html b/backend/database/mysql/index.html index fa1ac22c32..e2b4c1c14b 100644 --- a/backend/database/mysql/index.html +++ b/backend/database/mysql/index.html @@ -30,11 +30,11 @@ Mysql - +
    跳至主要內容

    Mysql

    njr小于 1 分钟约 1 字

    - + diff --git a/backend/database/sql/01-quick-start.html b/backend/database/sql/01-quick-start.html index 1b1492c841..3053c7e0b0 100644 --- a/backend/database/sql/01-quick-start.html +++ b/backend/database/sql/01-quick-start.html @@ -30,11 +30,11 @@ 快速开始 - +
    跳至主要內容

    快速开始

    njrdatabasesql大约 4 分钟约 1062 字

    SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统。

    SQL 通过一系列的语句和命令来执行数据定义、数据查询、数据操作和数据控制等功能,包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。

    SQL 是什么?

    • SQL 指结构化查询语言,全称是 Structured Query Language。
    • SQL 让您可以访问和处理数据库,包括数据插入、查询、更新和删除。
    • SQL 语言采用英语关键词,使其易读易写。
    • SQL 由国际标准化组织(ISO)和美国国家标准协会(ANSI)标准化。
    • SQL 提供了丰富的操作数据的功能,从简单的查询到复杂的数据库管理操作。

    SQL 能做什么?

    • SQL 面向数据库执行查询
    • SQL 可从数据库取回数据
    • SQL 可在数据库中插入新的记录
    • SQL 可更新数据库中的数据
    • SQL 可从数据库删除记录
    • SQL 可创建新数据库
    • SQL 可在数据库中创建新表
    • SQL 可在数据库中创建存储过程
    • SQL 可在数据库中创建视图
    • SQL 可以设置表、存储过程和视图的权限

    注意

    虽然 SQL 是一门 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言,但是仍然存在着多种不同版本的 SQL 语言。

    然而,为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的命令(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。

    SQL 发展历史

    以下是 SQL 发展历史的关键节点:

    1970s: 起源与早期发展

    1. 1970 年:埃德加·科德(Edgar F. Codd)发表了《A Relational Model of Data for Large Shared Data Banks》论文,提出了关系数据库的概念,为 SQL 的发展奠定了理论基础。
    2. 1973 年-1974 年:IBM 的研究人员 Donald D. Chamberlin 和 Raymond F. Boyce 在科德的理论基础上开发了一种名为 SEQUEL(Structured English Query Language)的语言,用于操作和管理 IBM 的 System R 关系数据库。
    3. 1976 年:SEQUEL 更名为 SQL(Structured Query Language)。

    1980s: 标准化与商业化

    1. 1981 年:IBM 推出了商用关系数据库系统 SQL/DS(Database System)和 DB2(Database 2)。
    2. 1986 年:美国国家标准协会(ANSI)发布了第一个 SQL 标准 ANSI SQL-86(SQL-87)。
    3. 1987 年:国际标准化组织(ISO)也采纳了 ANSI SQL-86 作为国际标准。

    1990s: 扩展与改进

    1. 1992 年:发布了 SQL-92(SQL2)标准,显著扩展了 SQL 语言的功能,包括对新数据类型、嵌套查询和连接的支持。
    2. 1999 年:发布了 SQL:1999(SQL3)标准,引入了对象关系数据库(ORDBMS)特性、递归查询、触发器和用户定义函数。

    2000s: 持续演进与新特性

    1. 2003 年:发布了 SQL:2003 标准,引入了 XML 相关特性和窗口函数。
    2. 2006 年:发布了 SQL:2006 标准,主要增强了对 XML 的支持。
    3. 2008 年:发布了 SQL:2008 标准,进一步改进了语法和性能优化。

    2010s: 新功能与大数据支持

    1. 2011 年:发布了 SQL:2011 标准,增加了对时间数据类型和时间旅行(temporal data)的支持。
    2. 2016 年:发布了 SQL:2016 标准,引入了 JSON 数据类型和相关操作函数,适应了 NoSQL 数据库和大数据处理需求。

    2020s: 现代化与标准更新

    1. 2023 年:最新的 SQL 标准持续改进,增加了对更现代化的数据库需求和特性的支持。

    总结

    SQL 从一种基于关系模型的查询语言发展成为现代数据库管理的核心语言,其标准在不断演进和扩展。

    各大数据库管理系统(如 MySQL、PostgreSQL、SQLite、SQL Server、Oracle 等)在遵循 SQL 标准的基础上,加入了自身的扩展和优化,使 SQL 成为数据操作和管理的强大工具。

    SQL 的发展不仅体现了技术的进步,也反映了数据管理需求的变化和增长。

    - + diff --git a/backend/database/sql/index.html b/backend/database/sql/index.html index 958f77a13e..3945b2ff61 100644 --- a/backend/database/sql/index.html +++ b/backend/database/sql/index.html @@ -30,11 +30,11 @@ Sql - +
    跳至主要內容

    Sql

    njr小于 1 分钟约 1 字

    - + diff --git a/backend/index.html b/backend/index.html index 2459113fe0..4170c8ccfb 100644 --- a/backend/index.html +++ b/backend/index.html @@ -30,11 +30,11 @@ 后端指北 - +
    跳至主要內容

    后端指北

    njr小于 1 分钟约 15 字

    - + diff --git a/backend/java/index.html b/backend/java/index.html index 734fe3cd7d..bf2b84c2a9 100644 --- a/backend/java/index.html +++ b/backend/java/index.html @@ -30,11 +30,11 @@ Java - +
    跳至主要內容

    Java

    njr小于 1 分钟约 1 字

    - + diff --git a/backend/java/tool/01-maven.html b/backend/java/tool/01-maven.html index 1b7a174b3e..d167f44022 100644 --- a/backend/java/tool/01-maven.html +++ b/backend/java/tool/01-maven.html @@ -30,7 +30,7 @@ Maven - + @@ -69,6 +69,6 @@

    由于 X(2.0) 路径最短,所以使用 X(2.0)。

    1. 声明顺序优先原则:
    A -> B -> X(1.0)
     A -> C -> X(2.0)
     

    在 POM 中最先声明的优先,上面的两个依赖如果先声明 B,那么最后使用 X(1.0)。

    1. 覆写优先原则:

    子 POM 内声明的依赖优先于父 POM 中声明的依赖。

    - + diff --git a/backend/java/tool/index.html b/backend/java/tool/index.html index 04e38066d9..a76648cad4 100644 --- a/backend/java/tool/index.html +++ b/backend/java/tool/index.html @@ -30,11 +30,11 @@ Tool - +
    跳至主要內容

    Tool

    njr小于 1 分钟约 1 字

    目录

    - + diff --git a/backend/linux/index.html b/backend/linux/index.html index d7925cf233..37e3a16e7d 100644 --- a/backend/linux/index.html +++ b/backend/linux/index.html @@ -30,11 +30,11 @@ Linux - + - + diff --git a/backend/linux/practice/001-set-the-ssh.html b/backend/linux/practice/001-set-the-ssh.html index 9f9c0aca13..39d0057829 100644 --- a/backend/linux/practice/001-set-the-ssh.html +++ b/backend/linux/practice/001-set-the-ssh.html @@ -30,7 +30,7 @@ 服务器设置 ssh 密钥登录 - + @@ -43,6 +43,6 @@ PubkeyAuthentication yes
  • 重启 ssh 服务

    service sshd restart
     
  • 接下来在阿里云控制台使用 Workbench 远程连接,可以发现密码登录已经被禁用了,只能使用密钥登录。

    step4-pw-fail
    step4-pw-fail
    - + diff --git a/backend/linux/practice/002-build-git-server.html b/backend/linux/practice/002-build-git-server.html index 3021c18fd7..c22f60095c 100644 --- a/backend/linux/practice/002-build-git-server.html +++ b/backend/linux/practice/002-build-git-server.html @@ -30,7 +30,7 @@ 搭建 git 私服 - + @@ -81,6 +81,6 @@

    将本地仓库和远端仓库同步:

    git remote add origin git@服务器 ip:world.git
     git push -u origin master
     

    此时这个 test 测试文件就已经提交到我们的 Git 远端私服上了。

    参考链接

    - + diff --git a/backend/linux/practice/003-configure-bt.html b/backend/linux/practice/003-configure-bt.html index 21609b6aa3..dcf56a6eff 100644 --- a/backend/linux/practice/003-configure-bt.html +++ b/backend/linux/practice/003-configure-bt.html @@ -30,7 +30,7 @@ 配置宝塔面板 - + @@ -38,6 +38,6 @@

    大概过两分钟即可安装成功,复制外网面板地址到浏览器打开,输入下面的 usernamepassword。进去之后会弹出 推荐安装套件,因为只要部署 vuepress, 因此这里安装 nginx 就好。选择编译安装,更加稳定。

    step1-install-bt
    step1-install-bt
    step2-install-nginx
    step2-install-nginx

    如果之后忘记用户名和密码,可以通过以下命令查找:

    [root@xxxx ~]# bt
     [root@xxxx ~]# 14
     

    参考链接

    - + diff --git a/backend/linux/practice/004-automated-deployment.html b/backend/linux/practice/004-automated-deployment.html index 7d2e7d91d5..3e43a6bf23 100644 --- a/backend/linux/practice/004-automated-deployment.html +++ b/backend/linux/practice/004-automated-deployment.html @@ -30,7 +30,7 @@ 自动部署 Vuepress 到服务器 - + @@ -97,6 +97,6 @@

    提示

    了解更多 git 命令,可以查询官方文档open in new window

    测试

    vscode 终端中输入 sh depoly.sh,报错:

    sh : 无法将“sh”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
     请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
     

    了解到 windows 上可以使用 git bash 执行 shell 脚本,但我可不想每次执行的时候都打开 git bash,当然得找如何在 vscode 中执行 shell 脚本的办法。

    1. 首先得在 vscode 中安装 code runner,之前一直用它来调试力扣上的题,已经安装过了。
    2. 安装 git bash,这个不用说,安装 git 的时候就已经有了
    3. 配置 bash 环境,找到 bash.exe 的安装目录,将它的位置添加到系统的环境变量中。
    4. 配置 code runner:文件 -> 首选项 -> 设置 -> 搜索 code runner
    5. 打开终端,输入 bash 切换到 bash 环境,点击右上角的三角形即可运行。
    step3-code-runner
    step3-code-runner

    现在随便更新点内容,并执行 deploy.sh 脚本:

    step4-complete
    step4-complete

    再次访问 http://xxx.xxx.xxx.xxx:端口号 发现已经更新了。

    参考链接

    - + diff --git a/backend/linux/practice/005-install-docker.html b/backend/linux/practice/005-install-docker.html index dfdfa393d1..2b2f5a3e80 100644 --- a/backend/linux/practice/005-install-docker.html +++ b/backend/linux/practice/005-install-docker.html @@ -30,7 +30,7 @@ centos 安装 docker - + @@ -54,6 +54,6 @@

    这条命令会安装 Docker,但不会启动 Docker。它还会创建一个 docker 组,但默认情况下不会向该组添加任何用户。

    1. 启动 docker
    sudo systemctl start docker
     
    1. 运行 hello-world 映像,验证 Docker Engine 安装是否成功。
    sudo docker run hello-world
     

    这条命令会下载一个测试镜像,并在一个容器中运行。当容器运行时,它会打印一条确认信息并退出。

    提示

    可以不去执行,只要安装过程不报错就表明成功。

    - + diff --git a/backend/linux/practice/index.html b/backend/linux/practice/index.html index 136e355fd7..86836a3553 100644 --- a/backend/linux/practice/index.html +++ b/backend/linux/practice/index.html @@ -30,11 +30,11 @@ Practice - + - + diff --git a/backend/node/express/01-overview-architecture.html b/backend/node/express/01-overview-architecture.html index 1c79b37e5d..e9add6b193 100644 --- a/backend/node/express/01-overview-architecture.html +++ b/backend/node/express/01-overview-architecture.html @@ -30,7 +30,7 @@ 总体架构 - + @@ -68,6 +68,6 @@ ├── utils.js └── view.js
    • application.js: 定义了 Express 应用的核心功能,如 app.use()app.get() 等方法。
    • express.js: 主入口文件,导出了核心的 express() 函数。
    • middleware/: 包含 Express 内置的 middleware,例如 init.js 用于初始化中间件,query.js 用于解析查询字符串。
    • request.js: 定义了 req 对象的扩展和辅助方法。
    • response.js: 定义了 res 对象的扩展和辅助方法。
    • router/: 包含与路由相关的代码,其中 index.js 是路由器的主模块,layer.jsroute.js 用于处理路由层次和路径匹配。
    • utils.js: 一些工具函数,用于简化内部实现。
    • view.js: 处理视图渲染相关的逻辑。

    接下来会对每个文件进行详细分析。

    - + diff --git a/backend/node/express/02-express.js.html b/backend/node/express/02-express.js.html index d443eae9eb..494ac05292 100644 --- a/backend/node/express/02-express.js.html +++ b/backend/node/express/02-express.js.html @@ -30,7 +30,7 @@ express.js - + @@ -113,6 +113,6 @@ }) })

    总结

    express.js 文件的核心功能是创建并返回一个 Express 应用实例,并提供了一些内置的中间件和路由工具。移除的中间件部分提醒开发者需要手动安装以前版本中内置的中间件。

    - + diff --git a/backend/node/express/index.html b/backend/node/express/index.html index 4874c12eb7..83cf7836a1 100644 --- a/backend/node/express/index.html +++ b/backend/node/express/index.html @@ -30,11 +30,11 @@ Express - +
    跳至主要內容

    Express

    njr小于 1 分钟约 1 字

    - + diff --git a/backend/node/index.html b/backend/node/index.html index ca100e57d2..22d4c41cc3 100644 --- a/backend/node/index.html +++ b/backend/node/index.html @@ -30,11 +30,11 @@ Node - +
    跳至主要內容

    Node

    njr小于 1 分钟约 1 字

    - + diff --git a/backend/node/module/001-finalhandler.html b/backend/node/module/001-finalhandler.html index 5c68ddff44..2928960672 100644 --- a/backend/node/module/001-finalhandler.html +++ b/backend/node/module/001-finalhandler.html @@ -30,11 +30,11 @@ finalhandler - +
    跳至主要內容

    finalhandler

    njrnodemodule大约 1 分钟约 410 字

    finalhandleropen in new window 模块在 Express.js 中用于处理未处理的请求或错误,是请求处理的最后一个步骤。它确保了当请求经过所有中间件和路由后,如果没有响应或者发生了错误,应用仍然能够正确地处理这些情况,并返回适当的 HTTP 响应。

    具体来说,finalhandler 模块实现了以下功能:

    处理未匹配的路由

    当请求经过所有中间件和路由后,finalhandler 会检查是否已经发送了响应。如果没有,则认为请求未被处理(即未匹配到任何路由),并返回一个 404 状态码("Not Found")。

    处理未捕获的错误

    如果请求处理过程中抛出了错误(无论是在中间件还是在路由处理程序中),而这些错误没有被处理,那么 finalhandler 会捕获到这些错误,并根据错误类型返回适当的 HTTP 状态码。常见的错误处理包括返回 500 状态码("Internal Server Error"),以及输出错误信息(在开发环境中)。

    处理不同的响应类型

    finalhandler 会根据请求的 Accept 头信息,决定返回纯文本错误信息还是返回 HTML 格式的错误页面。

    日志记录

    在处理错误时,finalhandler 可以记录错误日志,帮助开发者排查问题。

    简而言之,finalhandler 是 Express 应用的最后一道防线,确保所有请求都能得到适当的处理,即使发生了未预料的错误或未匹配的路由。

    - + diff --git a/backend/node/module/index.html b/backend/node/module/index.html index 9e11fb8ede..f15ddc16a3 100644 --- a/backend/node/module/index.html +++ b/backend/node/module/index.html @@ -30,11 +30,11 @@ Module - +
    跳至主要內容

    Module

    njr小于 1 分钟约 1 字

    - + diff --git a/category/algorithm/index.html b/category/algorithm/index.html index ec0095af93..3b331cac00 100644 --- a/category/algorithm/index.html +++ b/category/algorithm/index.html @@ -30,11 +30,11 @@ algorithm 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/browser/index.html b/category/browser/index.html index bb817b8e81..8ebd09a425 100644 --- a/category/browser/index.html +++ b/category/browser/index.html @@ -30,11 +30,11 @@ browser 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/chakra/index.html b/category/chakra/index.html index af052cb6a2..bcf5899609 100644 --- a/category/chakra/index.html +++ b/category/chakra/index.html @@ -30,11 +30,11 @@ chakra 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/css/index.html b/category/css/index.html index e50a60a0a8..dd9542a84e 100644 --- a/category/css/index.html +++ b/category/css/index.html @@ -30,11 +30,11 @@ CSS 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/database/index.html b/category/database/index.html index 4644c6d594..8e575bedd3 100644 --- a/category/database/index.html +++ b/category/database/index.html @@ -30,11 +30,11 @@ database 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/html/index.html b/category/html/index.html index 45029797d4..c30346db3f 100644 --- a/category/html/index.html +++ b/category/html/index.html @@ -30,11 +30,11 @@ HTML 分类 - + -
    跳至主要內容
    历史

    njr大约 2 分钟HTMLfrontendhtmlbasic-knowledgehistory
    DOCTYPE

    njr大约 2 分钟HTMLfrontendhtmlbasic-knowledge
    - +
    跳至主要內容
    历史

    njr大约 2 分钟HTMLfrontendhtmlbasic-knowledgehistory
    DOCTYPE

    njr大约 2 分钟HTMLfrontendhtmlbasic-knowledge
    + diff --git a/category/index.html b/category/index.html index c782b68480..80d1e54a40 100644 --- a/category/index.html +++ b/category/index.html @@ -30,11 +30,11 @@ 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/javascript/index.html b/category/javascript/index.html index 2d51dfbf16..f4b7e2db1f 100644 --- a/category/javascript/index.html +++ b/category/javascript/index.html @@ -30,11 +30,11 @@ JavaScript 分类 - + -
    跳至主要內容

    njr大约 6 分钟JavaScript面向对象
    - +
    跳至主要內容

    njr大约 6 分钟JavaScript面向对象
    + diff --git a/category/leetcode/index.html b/category/leetcode/index.html index 4586cc6239..2e4f0f1ff2 100644 --- a/category/leetcode/index.html +++ b/category/leetcode/index.html @@ -30,11 +30,11 @@ LeetCode 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/linux/index.html b/category/linux/index.html index 30e7af2077..b293e1acff 100644 --- a/category/linux/index.html +++ b/category/linux/index.html @@ -30,11 +30,11 @@ linux 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/next/index.html b/category/next/index.html index 1599add40c..57e5685add 100644 --- a/category/next/index.html +++ b/category/next/index.html @@ -30,11 +30,11 @@ next 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/node/index.html b/category/node/index.html index d28faaf144..093034cbc6 100644 --- a/category/node/index.html +++ b/category/node/index.html @@ -30,11 +30,11 @@ node 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/operating-system/index.html b/category/operating-system/index.html index 905440dca1..53f33326c8 100644 --- a/category/operating-system/index.html +++ b/category/operating-system/index.html @@ -30,11 +30,11 @@ operating-system 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/pixi/index.html b/category/pixi/index.html index 65212eb281..7498373a4d 100644 --- a/category/pixi/index.html +++ b/category/pixi/index.html @@ -30,11 +30,11 @@ Pixi 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/practice/index.html b/category/practice/index.html index 897ff68703..1be68689a3 100644 --- a/category/practice/index.html +++ b/category/practice/index.html @@ -30,11 +30,11 @@ practice 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/project/index.html b/category/project/index.html index b7d838941d..539f0dfdfb 100644 --- a/category/project/index.html +++ b/category/project/index.html @@ -30,11 +30,11 @@ Project 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/react/index.html b/category/react/index.html index d57e217575..e3384791b8 100644 --- a/category/react/index.html +++ b/category/react/index.html @@ -30,11 +30,11 @@ react 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/category/reading/index.html b/category/reading/index.html index 5913011eb2..647435f6b2 100644 --- a/category/reading/index.html +++ b/category/reading/index.html @@ -30,11 +30,11 @@ reading 分类 - + -
    跳至主要內容
    享元模式

    patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
    中介者模式

    patterns大约 2 分钟readingdesign patternvanillamediator-pattern
    中间件模式

    patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
    命令模式

    patterns大约 2 分钟readingdesign patternvanillacommand-pattern
    工厂模式

    patterns大约 2 分钟readingdesign patternvanillafactory-pattern
    介绍

    patterns大约 1 分钟readingdesign patternvanilla
    - +
    跳至主要內容
    混入模式

    patterns大约 3 分钟readingdesign patternvanillamixin-pattern
    模块模式

    patterns小于 1 分钟readingdesign patternvanillamodule-pattern
    享元模式

    patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
    中介者模式

    patterns大约 2 分钟readingdesign patternvanillamediator-pattern
    中间件模式

    patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
    命令模式

    patterns大约 2 分钟readingdesign patternvanillacommand-pattern
    工厂模式

    patterns大约 2 分钟readingdesign patternvanillafactory-pattern
    介绍

    patterns大约 1 分钟readingdesign patternvanilla
    + diff --git a/category/vue/index.html b/category/vue/index.html index 6be749ec4c..f1d012d7ee 100644 --- a/category/vue/index.html +++ b/category/vue/index.html @@ -30,11 +30,11 @@ Vue 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/category/\345\267\245\347\250\213\345\214\226/index.html" "b/category/\345\267\245\347\250\213\345\214\226/index.html" index 802a5d8032..6a8248a6ec 100644 --- "a/category/\345\267\245\347\250\213\345\214\226/index.html" +++ "b/category/\345\267\245\347\250\213\345\214\226/index.html" @@ -30,11 +30,11 @@ 工程化 分类 - + -
    跳至主要內容
    Qwik

    njr大约 4 分钟工程化frontendSSR
    Rspack

    njr大约 5 分钟工程化项目打包rspack
    - +
    跳至主要內容
    Qwik

    njr大约 4 分钟工程化frontendSSR
    Rspack

    njr大约 5 分钟工程化项目打包rspack
    + diff --git "a/category/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" "b/category/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" index f81ac1cc58..48fdb466d3 100644 --- "a/category/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" +++ "b/category/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" @@ -30,11 +30,11 @@ 计算机网络 分类 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/computer-science/algorithm/0001\343\200\201\344\272\214\345\217\211\346\240\221.html" "b/computer-science/algorithm/0001\343\200\201\344\272\214\345\217\211\346\240\221.html" index 39f1ef38a6..4d8bc6e632 100644 --- "a/computer-science/algorithm/0001\343\200\201\344\272\214\345\217\211\346\240\221.html" +++ "b/computer-science/algorithm/0001\343\200\201\344\272\214\345\217\211\346\240\221.html" @@ -30,7 +30,7 @@ 二叉树 - + @@ -561,6 +561,6 @@ return build(nodes) };
    - + diff --git "a/computer-science/algorithm/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html" "b/computer-science/algorithm/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html" index 35309376a3..6faa600903 100644 --- "a/computer-science/algorithm/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html" +++ "b/computer-science/algorithm/0002\343\200\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.html" @@ -30,7 +30,7 @@ 二叉搜索树 - + @@ -310,6 +310,6 @@ return build(head, null) };
    - + diff --git "a/computer-science/algorithm/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html" "b/computer-science/algorithm/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html" index 125f33b6e2..de5e703789 100644 --- "a/computer-science/algorithm/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html" +++ "b/computer-science/algorithm/0003\343\200\201\345\212\250\346\200\201\350\247\204\345\210\222.html" @@ -30,7 +30,7 @@ 动态规划 - + @@ -541,6 +541,6 @@ return sum - 2 * dp[n][target] };
    - + diff --git "a/computer-science/algorithm/0004\343\200\201\351\223\276\350\241\250.html" "b/computer-science/algorithm/0004\343\200\201\351\223\276\350\241\250.html" index e03dd84a02..228667962d 100644 --- "a/computer-science/algorithm/0004\343\200\201\351\223\276\350\241\250.html" +++ "b/computer-science/algorithm/0004\343\200\201\351\223\276\350\241\250.html" @@ -30,7 +30,7 @@ 链表 - + @@ -83,6 +83,6 @@ } }
    - + diff --git a/computer-science/algorithm/01-array.html b/computer-science/algorithm/01-array.html index 2b4a986aef..9935457193 100644 --- a/computer-science/algorithm/01-array.html +++ b/computer-science/algorithm/01-array.html @@ -30,7 +30,7 @@ 数组 - + @@ -316,6 +316,6 @@ } }
    - + diff --git a/computer-science/algorithm/index.html b/computer-science/algorithm/index.html index e69bee73e2..9590cf7fb7 100644 --- a/computer-science/algorithm/index.html +++ b/computer-science/algorithm/index.html @@ -30,11 +30,11 @@ Algorithm - +
    跳至主要內容

    Algorithm

    njr小于 1 分钟约 34 字

    使用 TypeScript,按照数据结构和算法的分类,整理了一些常见的算法题。

    - + diff --git a/computer-science/index.html b/computer-science/index.html index 644aaeb8a4..4f7888dbc7 100644 --- a/computer-science/index.html +++ b/computer-science/index.html @@ -30,11 +30,11 @@ 计算机基础 - +
    跳至主要內容

    计算机基础

    njr小于 1 分钟约 99 字

    - + diff --git a/computer-science/networking/001-network-model.html b/computer-science/networking/001-network-model.html index 7bb2de1fb0..c8c5e98236 100644 --- a/computer-science/networking/001-network-model.html +++ b/computer-science/networking/001-network-model.html @@ -30,7 +30,7 @@ 网络模型 - + @@ -39,6 +39,6 @@ --- 网络层 --- --- 网络接口层 ---

    举例:浏览器与服务器

    客户端与服务器之间的基于网络的通信,实际上就是客户端浏览器进程(如 Chrome)和服务器中的服务器进程(如 Apache)之间的基于网络的通信。

    应用层按 HTTP 协议的规定,构建一个 HTTP 请求报文,应用层将该报文交给运输层处理;

    运输层给 HTTP 报文添加一个 TCP 首部,该首部的作用主要是为了区分应用进程以及实现可靠传输,使之成为 TCP 报文段,然后将其交给网络层处理;

    网络层给 TCP 报文段添加一个 IP 首部,使之成为 IP 数据报,该首部的作用是为了使 IP 数据报在互联网上选择合适的路由进行传输(被路由器转发),然后将其交给网络接口层处理;

    网络接口层在 IP 数据报的前面加上 MAC 头部(作用是为了找到目标主机),并封装成数据帧(Data frame)发送到网络上。

    - + diff --git a/computer-science/networking/002-HTTP-overview.html b/computer-science/networking/002-HTTP-overview.html index 05f729bbd5..93900ef27c 100644 --- a/computer-science/networking/002-HTTP-overview.html +++ b/computer-science/networking/002-HTTP-overview.html @@ -30,7 +30,7 @@ HTTP 概述 - + @@ -53,6 +53,6 @@ </body> </html>

    HTTP 常见状态码

    常见状态码状态描述
    200 OK客户端请求成功
    400 Bad Request客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
    403 Forbidden服务器收到请求,但是拒绝提供服务
    404 Not Found请求资源不存在,举个例子:输入了错误的 URL
    500 Internal Server Error服务器发生不可预期的错误
    503 Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    提示

    详细状态码请见MDN 文档open in new window

    HTTP 常见的字段

    提示

    详细字段请见MDN 文档open in new window

    - + diff --git a/computer-science/networking/003-get-post-difference.html b/computer-science/networking/003-get-post-difference.html index fc4f0452f7..4cd6ab8e29 100644 --- a/computer-science/networking/003-get-post-difference.html +++ b/computer-science/networking/003-get-post-difference.html @@ -30,11 +30,11 @@ GET 和 POST 的区别 - +
    跳至主要內容

    GET 和 POST 的区别

    njr计算机网络HTTP大约 3 分钟约 866 字

    概述

    GET 和 POST 是 HTTP 协议中发送请求的方法。

    • GET:请求资源,从服务器获取数据;
    • POST:将数据提交到指定地址。

    二者本质上都是 TCP 链接,因此本质上没有区别,但由于 HTTP 规定和浏览器/服务器的限制,导致它们在实际操作中会有一定区别。

    区别

    • GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
    • GET 产生的 URL 地址可以被 Bookmarked,而 POST 不可以。
    • GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
    • GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
    • GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
    • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。
    • 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
    • GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
    • GET 参数通过 URL 传递,POST 放在 Request body 中。
    • GET 方法是安全且幂等的,POST 方法是不安全且不幂等的。

    提示

    • 安全:请求方法不会破坏服务器上的资源;
    • 幂等:执行多次相同的操作,结果都是相同的。

    误区

    参数长度

    GET 参数有长度限制,但这是因为浏览器对 URL 的长度限制,而不是 HTTP 协议本身对参数长度的限制。HTTP 同样对 POST 参数长度没有限制,而是靠服务器的设置来限制大小的。

    安全性

    POST 相对比 GET 安全性要高。

    通过 GET 提交的请求都将显示到 URL 上,页面会被浏览器缓存,其他人查看历史记录会看到提交的数据。

    这里的相对在于:HTTP 本身是明文传输的协议,无论使用 GET 还是 POST 都有可能受到中间人攻击而造成数据泄露。

    如果 HTTP 链接使用 SSL/TLS,那么 GET 参数也会被加密,但是仍然会在某些地方出现,比如服务器日志、浏览器插件和其他应用。而 POST 数据会被加密并且不会被任何方式泄露。

    提示

    因此如果想要保证总是安全地传输数据,需要使用 HTTPS 上的 POST。

    Request Body

    GET 可以带 Request Body,但不能保证一定能被接收到。如果你用 GET 请求,在 Request Body 携带数据,不同服务器的处理方式也是不同的,有些服务器会帮你读出数据,有些服务器直接忽略。

    数据包

    对于 GET 请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据)。

    对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok。

    并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。

    参考链接

    - + diff --git a/computer-science/networking/004-HTTP-development.html b/computer-science/networking/004-HTTP-development.html index c8651dc58e..ada964560c 100644 --- a/computer-science/networking/004-HTTP-development.html +++ b/computer-science/networking/004-HTTP-development.html @@ -30,7 +30,7 @@ HTTP 性能演变 - + @@ -52,6 +52,6 @@ <IMG SRC="/myimage.gif"> </HTML>

    HTTP/1.1

    HTTP/1.0 采用短连接方式,即每次请求一个文件都需要和浏览器建立 TCP 连接,当收到响应后就会立即关闭连接,这样会造成不必要的时间开销。

    为了减少时延,浏览器通常会建立多个并行的 TCP 连接同时请求多个对象。但是这会占用大量服务器的资源。

    HTTP/1.1 相比于 HTTP/1.0 性能上的改进:

    但是 HTTP/1.1 还是有性能瓶颈:

    HTTP/2.0

    HTTP/2.0 是基于 HTTPS 的,所以安全性有所保证。HTTP/2.0 相比 HTTP/1.1 性能上的改进:

    缺陷在于:多个 HTTP 请求复用一个 TCP 连接,一旦发生丢包现象,就会触发 TCP 的重传机制,这样在一个 TCP 连接中的所有 HTTP 请求都必须等待这个丢了的包被重传回来。

    HTTP/3.0

    HTTP/2.0 基于 TCP 传输层,导致丢包下阻塞所有 HTTP 请求的问题,因此 HTTP/3.0 把 HTTP 下层的 TCP 协议改成了 UDP。

    UDP 是不可靠传输,但是基于 UDP 的 QUIC 协议可以实现类似 TCP 的可靠传输。

    参考链接

    3.1 HTTP 常见面试题 | 小林 coding (xiaolincoding.com)open in new window

    HTTP 的发展 - HTTP | MDN (mozilla.org)open in new window

    计算机网络微课堂(有字幕无背景音乐版)_哔哩哔哩_bilibiliopen in new window

    - + diff --git a/computer-science/networking/005-HTTP-cache.html b/computer-science/networking/005-HTTP-cache.html index fd7c82b9ae..daa9ab86e8 100644 --- a/computer-science/networking/005-HTTP-cache.html +++ b/computer-science/networking/005-HTTP-cache.html @@ -30,7 +30,7 @@ HTTP 缓存 - + @@ -41,6 +41,6 @@

    当服务器收到浏览器这个请求头后,会跟当前版本的时间进行比较:

    1. 当前版本的修改时间比这个晚,也就是内容发生变化了,那么会返回 200 和新的内容;
    2. 若当前版本的修改时间较早,也就是没有更新,那么会返回 304,浏览器会从缓存中读取内容。

    ETagIf-None-Match

    这种方式是通过唯一标识实现。

    ETag 是资源的特定版本的标识符,响应头会根据返回内容返回一个标识符,具体返回值看服务器的计算策略,可能如下所示:

    ETag: '33a64df551425fcc55e4d42a148795d9f25f89d4'
     

    当客户端收到这个响应后,会将这个 ETag 保存起来,等下个请求时,会将它放到请求体的 If-None-Match 字段中:

    If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
     

    当服务器收到浏览器这个请求头后,会跟当前版本的 ETag 进行比较:

    1. 如果标识符不一致,也就是内容发生变化了,那么会返回 200 和新的内容;
    2. 如果标识符一致,也就是没有更新,那么会返回 304,浏览器会从缓存中读取内容。

    优先级

    协商缓存先检查上一次响应头中是否有 ETag,如果有,则发起请求中请求头带上 If-None-Match 字段;如果没有,则检查上一次响应头中是否有 Last-Modified 字段,发起请求中请求头带上 If-Modified-Since 字段。

    总结

    HTTP 缓存机制分为两种:强缓存和协商缓存。

    浏览器会首先判断强缓存,如果强缓存生效,那么直接从缓存中获取资源;若没有生效,则会使用协商缓存,发送请求与服务器协商。

    - + diff --git a/computer-science/networking/006-HTTPS-overview.html b/computer-science/networking/006-HTTPS-overview.html index b80b5324a8..76021e78f7 100644 --- a/computer-science/networking/006-HTTPS-overview.html +++ b/computer-science/networking/006-HTTPS-overview.html @@ -30,11 +30,11 @@ HTTPS 略解 - +
    跳至主要內容

    HTTPS 略解

    njr计算机网络HTTPHTTPS大约 4 分钟约 1231 字

    HTTP 和 HTTPS

    区别

    • HTTP 是明文传输,不安全,而 HTTPS 加入了 SSL/TLS 安全协议,使得报文能加密传输;
    • HTTP 建立连接只需 TCP 三次握手,而 HTTPS 在三次握手后,还需要进行 SSL/TLS 握手;
    • HTTP 端口号为 80,HTTPS 端口号为 443;
    • HTTPS 需要向 CA 申请数字证书。
    http
    http
    https
    https

    HTTPS 缺点

    • 在相同网络环境中,HTTPS 相比 HTTP 无论是响应时间还是耗电量都有大幅度上升;
    • HTTPS 的安全是有范围的,在黑客攻击、服务器劫持等情况下几乎起不到作用;
    • 在现有的证书机制下,中间人攻击依然有可能发生;
    • HTTPS 需要更多的服务器资源,也会导致成本的升高。

    加密算法

    HTTPS 使用混合加密算法解决数据安全传输问题,即对称加密非对称加密混合使用。

    对称加密

    加密和解密都是同一个密钥,优缺点如下:

    优点:

    1. 由于密钥相同,因此加密解密速度快,适合加密比较大的数据。

    缺点:

    1. 交易双方在传输过程中需要使用相同的密钥,因此需要在首次传输过程中必然需要由一方将密钥传给另一方,这样就无法保证保证密钥的安全性,有可能会被截获;
    2. 不同用户访问的密钥需要不同,这会造成服务器管理密钥困难,成本高。

    非对称加密

    加密和解密使用不同的密钥:公钥(public key)加密和私钥(private key)解密。流程如下:

    1. 发送方向接收方请求一个公钥;
    2. 发送方使用公钥加密,公钥和加密的数据泄露并没有关系,因为只有私钥才能解密;
    3. 接收方用私钥解密消息。

    优点:

    1. 加密和解密使用不同的密钥,私钥不需要通过网络传输,安全性高。

    缺点:

    1. 计算量比较大,加密解密速度比对称加密慢;
    2. 中间人攻击:中间人进行拦截,无法保证公钥是接收方提供的。
    中间人攻击
    中间人攻击

    数字证书和数字签名

    中间人攻击使我们无法验证公钥的真假。因此引入数字证书,用它来证明身份是真实的,并且防止被中间人攻击。

    由数字证书认证机构(Certificate Authority,简称 CA)负责给用户签发数字证书,证书中包括:签发者、使用者公钥、使用的 HASH 算法、证书到期时间等。

    但是问题来了,如果中间人篡改了证书,如何保证身份证明是有效的?这时需要引进数字签名

    首先使用 CA 自带的 HASH 算法对证书的内容进行 HASH 得到一个信息摘要,再用 CA 的私钥进行加密,最终组成数字签名。当服务器将原始信息和数字签名发送过来时,客户端先使用 CA 的公钥对数字签名进行解密,得到 CA 创建的信息摘要,再使用同样的 HASH 算法生成原始信息的信息摘要,两者进行对比,就知道证书是否被篡改了。

    通过数字签名的证书验证,能最大程度的保证数据传输安全。

    HTTPS 工作流程

    前面提到,HTTPS 使用了混合加密解决安全传输问题,整个工作过程分为三大步:证书验证、非对称加密和对称加密。

    https工作流程
    https工作流程

    证书验证:

    1. Client 发起一个 HTTPS 的请求;
    2. Server 把事先配置好的公钥证书返回给客户端;
    3. Client 验证公钥证书:如果验证通过则继续,不通过则显示警告信息;

    非对称加密:

    1. Client 生成加密所使用的会话密钥,然后用证书的公钥加密这个会话密钥,发给 Server。
    2. Server 使用自己的私钥解密这个消息,得到会话密钥。至此,Client 和 Server 双方都持有了相同的会话密钥。

    对称加密:

    1. Server 使用会话密钥加密“明文内容 A”,发送给 Client。
    2. Client 使用会话密钥解密响应的密文,得到“明文内容 A”。
    3. Client 再次发起 HTTPS 的请求,使用会话密钥加密请求的“明文内容 B”,然后 Server 使用会话密钥解密密文,得到“明文内容 B”。

    参考链接

    [信息安全] 1.密码工具箱 open in new window

    [信息安全] 2.密码工具箱(续)open in new window

    [信息安全] 3.HTTPS 工作流程open in new window

    HTTPS 详解一:附带最精美详尽的 HTTPS 原理图open in new window

    - + diff --git a/computer-science/networking/007-TCP-three-handshakes-and-four-waves.html b/computer-science/networking/007-TCP-three-handshakes-and-four-waves.html index 1b91374a7c..4e1478c35d 100644 --- a/computer-science/networking/007-TCP-three-handshakes-and-four-waves.html +++ b/computer-science/networking/007-TCP-three-handshakes-and-four-waves.html @@ -30,11 +30,11 @@ TCP 三次握手与四次挥手 - +
    跳至主要內容

    TCP 三次握手与四次挥手

    njr计算机网络TCP大约 4 分钟约 1271 字

    传输层控制协议(Transmission Control Protocol, TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

    三次握手

    三报文握手具体过程(客户端和服务端交换三个报文段):

    三次握手
    三次握手

    第一次握手:

    起初两端都处于 CLOSED 关闭状态。一开始,服务器就进入监听状态,被动等待客户端的连接请求。

    在打算建立 TCP 连接时,客户端将同步请求标志 SYN=1 和随机初始序号 seq=x 发送给服务器,客户端进入 SYN-SENT (同步已发送)状态,等待服务器确认。

    第二次握手:

    服务器收到数据包后由同步位 SYN=1 得知客户端请求建立连接。

    服务器发送同步请求标志 SYN=1、确认标志 ACK=1、随机初始序号 seq=y 以及确认号字段 ack=x+1,发送给客户端,并进入 SYN-RCVD (同步已接收)状态。

    第三次握手:

    客户端收到确认后,检查 ack 是否为 x+1ACK 是否为 1,如果正确则发送确认标志 ACK=1、序号 seq=x+1 以及确认号 ack=y+1,并进入连接已建立状态 ESTABLISHED

    服务器收到消息后,检查 ack 是否为 y+1ACK 是否为 1,如果成功则建立连接。 进入连接已建立状态 ESTABLISHED

    能否采用两报文握手?

    如果客户端发出连接请求,但因网络延迟而未收到确认,于是客户端再次发送一个连接请求,服务端收到确认,由于是两次握手,此时就会建立连接,等数据传输完毕后,释放连接。

    此时第一个请求报文经过一段时间到达服务端,于是服务端收到确认,由于采用两次握手,此时就已同意建立连接,客户端不需要对服务端的确认报文发出响应,也不继续发送数据,导致连接一直建立,浪费资源。

    四次挥手

    四报文挥手来释放连接(现二者均处于连接已建立状态,假设客户端主动关闭 TCP 连接):

    四次挥手
    四次挥手

    第一次挥手:

    客户端发送 TCP 连接释放报文段,并进入终止等待 1 状态

    该报文段首部种的终止位 FIN 和确认位 ACK 都设置为 1 ,表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。

    序号 seq = u,它等于之前客户端已经传送过的数据的最后一个字节的序号加 1 。确认号 ack 的值设置为 v ,它等于 TCP 客户进程之前已收到的数据的最后一个字节的序号加 1 。

    第二次挥手:

    服务端收到连接释放报文段后,会发送一个普通的 TCP 确认报文段并进入关闭等待状态

    该报文段首部中的确认位 ACK 被设置为 1;seq 设置为 v,它等于服务端之前已传送过的数据的最后一个字节的序号加 1 。确认号 ack 字段的值被设置为 u + 1,这是对连接释放报文的确认。

    这个时候,客户端不能给服务端发送信息报文,只能接收。但是服务端要是还有信息要传给客户端,仍能传送。

    第三次挥手:

    客户端收到确认报文段后就进入终止等待 2 状态,当服务器数据发送完毕后,给客户端发送 TCP 连接释放报文段并进入最后确认状态

    该报文段首部中的终止位 FIN 和确认位 ACK 的值都设置为 1 ,seq = w ,ack = u + 1 。

    第四次挥手:

    客户端收到连接释放报文段后,需要向服务端发送 TCP 确认报文段,并进入时间等待状态

    首部中的确认位 ACK = 1 ,seq = u + 1 ,ack = w + 1 ,这是对 TCP 连接释放报文段的确认。

    服务端 收到该报文后就进入关闭状态,而 客户端 还要经过 2MSL 后才能进入关闭状态

    MSL,最长报文段寿命,一般为 2 分钟。

    为什么最后还要等待两个时间周期呢?

    • 客户端的最后一个 ACK 报文在传输的时候丢失,服务器并没有接收到这个报文。这个候时候服务器就会超时重传这个 FIN 消息,然后客户端就会重新返回最后一个 ACK 报文,等待两个时间周期,完成关闭。
    • 如果不等待这两个时间周期,服务器重传的那条消息就不会收到。服务器就因为接收不到客户端的信息而无法正常关闭。

    参考链接

    计算机网络微课堂open in new window

    - + diff --git a/computer-science/networking/008-tcp-udp.html b/computer-science/networking/008-tcp-udp.html index 7aec6904ea..a95024ac2d 100644 --- a/computer-science/networking/008-tcp-udp.html +++ b/computer-science/networking/008-tcp-udp.html @@ -30,11 +30,11 @@ TCP 与 UDP 的区别 - +
    跳至主要內容

    TCP 与 UDP 的区别

    njr计算机网络TCPUDP大约 3 分钟约 782 字

    TCP 和 UDP 都是传输层协议,属于 TCP/IP 协议族。

    UDP

    用户数据报协议(User Datagram Protocol,UDP)用来处理数据包,是一种无连接的协议,它的特点如下:

    无连接

    不需要像 TCP 一样进行三次握手进行连接,并且也只是数据报文的搬运工,不会对报文进行任何的加工处理。

    单播、多播、广播

    UDP 支持一对一、一对多、多对多、多对一的传输方式。

    面向报文

    在发送端,应用层将数据传递给传输层,UDP 只会给数据增加一个 UDP 头标识这是一个 UDP 协议报文,然后就传给网络层,对应用层交付的报文既不合并也不拆分,保留报文的边界,一次发送一个报文。

    在接收端,网络层将 UDP 数据报传输给 UDP,UDP 去除首部后就会将数据原封不动地传递给应用层,一次交付一个完整的报文。

    不可靠

    首先体现在无连接上,通信双方想发就发,必然不可靠。没有像 TCP 做重传机制、流量控制和拥塞控制。

    头部开销小

    UDP 头部只有 8 字节,相比 TCP 20 个字节少得多,传输数据时比较高效。

    应用场景

    UDP 应用于效率要求高,但可靠性要求相对较低的场景,例如:即时通讯,速度要求高,但是偶尔出现断续不是太大问题,完全可以不使用重传机制,场景有在线视频、网络语音通话、广播通信等。

    TCP

    传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通讯协议,它的特点如下:

    面向连接

    在发送前必须进行 TCP 三次握手在两端建立连接。

    仅支持单播传输

    每个 TCP 只能进行一对一传输,不支持多播和广播的形式。

    面向字节流

    TCP 不像 UDP 那样一个一个报文独立传输,而是在不保留报文边界的情况下以字节流方式进行传输。

    可靠传输

    TCP 为了实现可靠传输,使用了重传机制、流量控制和拥塞控制。

    头部开销大

    TCP 头部最小 20 个字节,最大 60 个字节,传输效率慢。

    应用场景

    TCP 应用于效率要求相对低,但可靠性要求高的场景,例如:文件传输、邮件传输等。

    区别

    UDPTCP
    是否连接无连接面向连接
    是否可靠不可靠使用重传机制、流量控制和拥塞控制保证可靠传输
    连接对象个数单播、多播、广播单播
    传输方式面向报文面向字节流
    头部大小头部开销小,仅 8 字节头部最小 20 个字节,最大 60 个字节
    应用场景适用于实时应用适用于要求可靠传输的应用
    - + diff --git a/computer-science/networking/009-http-code-when-authorized-refused.html b/computer-science/networking/009-http-code-when-authorized-refused.html index 12f85b4a7f..0721f81783 100644 --- a/computer-science/networking/009-http-code-when-authorized-refused.html +++ b/computer-science/networking/009-http-code-when-authorized-refused.html @@ -30,11 +30,11 @@ 登陆失败 HTTP 状态码 - +
    跳至主要內容

    登陆失败 HTTP 状态码

    njr计算机网络HTTP code大约 1 分钟约 303 字

    如果用户尝试登陆,但用户名或密码不正确,应该返回什么状态码?

    这个问题在社区中有一定争议,有些人认为应该返回 403 Forbidden,有些人认为应该返回 404 Not Found,有些人认为应该返回 400 Bad Request,有些人认为应该返回 401 Unauthorized

    403 Forbidden 表示拒绝访问,但是请求接口是可以访问的,因此该状态码肯定不正确。

    404 Not Found 表示请求的资源不存在,但是请求接口是存在的,因此该状态码也不正确。

    400 Bad Request 表示请求参数错误,但是用户输入的数据格式也是完全正确的,因此也不应该用该状态码。

    而根据 What's the appropriate HTTP status code to return if a user tries logging in with an incorrect username / password, but correct format?open in new window 讨论,应该返回 401 Unauthorized

    根据 RFC7235open in new window:如果请求中包含身份验证凭据,则 401 响应表示拒绝对这些凭据进行授权。

    - + diff --git a/computer-science/networking/index.html b/computer-science/networking/index.html index a7204142a6..67fc6336db 100644 --- a/computer-science/networking/index.html +++ b/computer-science/networking/index.html @@ -30,11 +30,11 @@ 计算机网络 - +
    跳至主要內容

    计算机网络

    njr小于 1 分钟约 96 字

    - + diff --git a/computer-science/operating-system/001-character-encoding.html b/computer-science/operating-system/001-character-encoding.html index ab9582b91d..dfe24717fb 100644 --- a/computer-science/operating-system/001-character-encoding.html +++ b/computer-science/operating-system/001-character-encoding.html @@ -30,11 +30,11 @@ 字符编码 - +
    跳至主要內容

    字符编码

    njroperating-systemcomputer-sciencebasic-knowledge小于 1 分钟约 145 字

    在计算机中,所有数据都是以二进制数的形式存储的,字符也不例外。为了表示字符,我们需要建立一套「字符集」,规定每个字符和二进制数之间的一一对应关系。有了字符集之后,计算机就可以通过查表完成二进制数到字符的转换。

    Joel Spolsky

    The Absolute
    Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and
    Character Sets (No Excuses!)

    Mathias Bynens

    JavaScript’s Internal Character Encoding:
    UCS-2 or UTF-16?

    - + diff --git a/computer-science/operating-system/index.html b/computer-science/operating-system/index.html index a68dd17f03..4078a54edc 100644 --- a/computer-science/operating-system/index.html +++ b/computer-science/operating-system/index.html @@ -30,11 +30,11 @@ 操作系统 - +
    跳至主要內容

    操作系统

    njr小于 1 分钟约 15 字

    待更新...

    - + diff --git a/feed.json b/feed.json index 63d345d3c4..012bedd52d 100644 --- a/feed.json +++ b/feed.json @@ -6,6 +6,40 @@ "description": "Personal frontend knowledge base", "favicon": "https://dribble-njr.github.io/blog/blog/favicon.ico", "items": [ + { + "title": "模块模式", + "url": "https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/07-module-pattern.html", + "id": "https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/07-module-pattern.html", + "summary": "随着应用程序和代码库的增长,保持代码的可维护性和分离性变得越来越重要。模块模式可以将代码分割成更小的、可重复使用的片段。 除了可以将代码分割成更小的、可重复使用的片段外,模块还可以将文件中的某些值保持私有。默认情况下,模块中的声明会被作用域(封装)到该模块。如果我们没有明确导出某个值,那么该值在该模块之外就不可用。这就降低了代码库其他部分声明的值发生名...", + "content_html": "

    随着应用程序和代码库的增长,保持代码的可维护性和分离性变得越来越重要。模块模式可以将代码分割成更小的、可重复使用的片段。

    \n

    除了可以将代码分割成更小的、可重复使用的片段外,模块还可以将文件中的某些值保持私有。默认情况下,模块中的声明会被作用域(封装)到该模块。如果我们没有明确导出某个值,那么该值在该模块之外就不可用。这就降低了代码库其他部分声明的值发生名称冲突的风险,因为这些值在全局范围内不可用。

    \n

    更详细的内容可以见 。

    \n", + "date_published": "2024-09-19T00:00:00.000Z", + "date_modified": "2024-09-19T09:44:12.000Z", + "authors": [ + { + "name": "patterns" + } + ], + "tags": [ + "reading" + ] + }, + { + "title": "混入模式", + "url": "https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/06-mixin-pattern.html", + "id": "https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/06-mixin-pattern.html", + "summary": "混入模式 mixin 是一种对象,我们可以使用它为另一个对象或类添加可重复使用的功能,而无需使用继承。我们不能单独使用 mixins:mixins 的唯一目的是在不使用继承的情况下为对象或类添加功能。 假设我们的应用程序需要创建多条狗。然而,我们创建的基本狗没有任何属性,只有一个名称属性。 狗不应该只有名字。它应该会 bark、wagTail 和 pl...", + "content_html": "

    混入模式

    \n

    mixin 是一种对象,我们可以使用它为另一个对象或类添加可重复使用的功能,而无需使用继承。我们不能单独使用 mixins:mixins 的唯一目的是在不使用继承的情况下为对象或类添加功能。

    \n

    假设我们的应用程序需要创建多条狗。然而,我们创建的基本狗没有任何属性,只有一个名称属性。

    \n
    class Dog {\n  constructor(name) {\n    this.name = name\n  }\n}\n

    狗不应该只有名字。它应该会 barkwagTailplay! 我们可以创建一个 mixin,而不是直接将其添加到 Dog 中。

    \n
    const dogFunctionality = {\n  bark: () => console.log('Woof!'),\n  wagTail: () => console.log('Wagging my tail!'),\n  play: () => console.log('Playing!')\n}\n

    我们可以使用 Object.assign 方法将 dogFunctionality 混合元素添加到 Dog 原型中。通过该方法,我们可以向目标对象添加属性:本例中为 Dog.prototypeDog 的每个新实例都可以访问 dogFunctionality 的属性,因为它们都被添加到了 Dog 的原型中!

    \n
    class Dog {\n  constructor(name) {\n    this.name = name\n  }\n}\n\nconst dogFunctionality = {\n  bark: () => console.log('Woof!'),\n  wagTail: () => console.log('Wagging my tail!'),\n  play: () => console.log('Playing!')\n}\n\nObject.assign(Dog.prototype, dogFunctionality)\n\nconst pet1 = new Dog('Daisy')\n\npet1.name // Daisy\npet1.bark() // Woof!\npet1.play() // Playing!\n

    虽然我们可以在不使用继承的情况下使用 mixin 添加功能,但 mixin 本身也可以使用继承!大多数哺乳动物(除了海豚,也许还有其他动物)都会走路和睡觉。狗是哺乳动物,应该会走路和睡觉!

    \n
    const animalFunctionality = {\n  walk: () => console.log('Walking!'),\n  sleep: () => console.log('Sleeping!')\n}\n

    我们可以使用 Object.assign 将这些属性添加到 dogFunctionality 原型中。在本例中,目标对象是 dogFunctionality

    \n
    const animalFunctionality = {\n  walk: () => console.log('Walking!'),\n  sleep: () => console.log('Sleeping!')\n}\n\nconst dogFunctionality = {\n  bark: () => console.log('Woof!'),\n  wagTail: () => console.log('Wagging my tail!'),\n  play: () => console.log('Playing!'),\n  walk() {\n    super.walk()\n  },\n  sleep() {\n    super.sleep()\n  }\n}\n\nObject.assign(dogFunctionality, animalFunctionality)\nObject.assign(Dog.prototype, dogFunctionality)\n

    在现实世界中,浏览器环境中的 Window 就是一个 mixin 的例子。 Window 对象从 WindowOrWorkerGlobalScopeWindowEventHandlers mixins 中实现了许多属性,这使我们可以访问 setTimeoutsetIntervalindexedDBisSecureContext 等属性。

    \n

    由于它是一个 mixin,因此只能用于为对象添加功能,您将无法创建 WindowOrWorkerGlobalScope 类型的对象。

    \n\n

    总结

    \n

    在引入 ES6 类之前,mixins 通常用于为 React 组件添加功能。 React 团队不鼓励使用 mixins,因为它很容易给组件增加不必要的复杂性,使其难以维护和重用。React 团队鼓励使用高阶组件,现在这些组件通常可以被 Hooks 代替。

    \n

    混入模式看起来和继承非常类似,但是有一点区别:

    \n\n

    因此上面的实现仍然是混入模式。

    \n
    \n

    提示

    \n

    虽然你修改了原型,但混入模式的本质是将多个功能组合到一个类或对象中,而不强制遵循严格的继承层次结构。因此,它依然可以被认为是混入模式。

    \n
    \n

    如果不想直接修改原型,可以选择实例级别的混入:

    \n
    class Dog {\n  constructor(name) {\n    this.name = name\n  }\n}\n\nconst dogFunctionality = {\n  bark: () => console.log('Woof!'),\n  wagTail: () => console.log('Wagging my tail!'),\n  play: () => console.log('Playing!')\n}\n\nconst pet1 = new Dog('Daisy')\n\n// 仅将功能混入特定实例,而不是修改原型\nObject.assign(pet1, dogFunctionality)\n\npet1.bark() // Woof!\n
    \n

    提示

    \n

    通过向对象的原型注入功能,mixins 可以让我们在没有继承的情况下为对象轻松添加功能。修改对象的原型被认为是一种不好的做法,因为这会导致原型污染和函数来源的不确定性。

    \n
    \n", + "date_published": "2024-09-19T00:00:00.000Z", + "date_modified": "2024-09-19T09:21:50.000Z", + "authors": [ + { + "name": "patterns" + } + ], + "tags": [ + "reading" + ] + }, { "title": "中间件模式", "url": "https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/05-middleware-pattern.html", @@ -1321,33 +1355,6 @@ "tags": [ "linux" ] - }, - { - "title": "自动部署 Vuepress 到服务器", - "url": "https://dribble-njr.github.io/blog/blog/backend/linux/practice/004-automated-deployment.html", - "id": "https://dribble-njr.github.io/blog/blog/backend/linux/practice/004-automated-deployment.html", - "summary": " 提示 服务器:centos 7.9 本地电脑:Windows 10 服务器端 配置 nginx 登录宝塔面板,可以参考 。点击左侧网站 -> 添加站点。 step1-add-sitestep1-add-site 新增之后,点击设置 -> 配置文件。这三项按自己的情况配置,在后面 中会将 dist 文件推送到 root 配置项设置的文件夹下。 step...", - "content_html": "
    \n

    提示

    \n

    服务器:centos 7.9

    \n

    本地电脑:Windows 10

    \n
    \n

    服务器端

    \n

    配置 nginx

    \n

    登录宝塔面板,可以参考 。点击左侧网站 -> 添加站点。

    \n
    \"step1-add-site\"
    step1-add-site
    \n

    新增之后,点击设置 -> 配置文件。这三项按自己的情况配置,在后面 中会将 dist 文件推送到 root 配置项设置的文件夹下。

    \n
    \"step2-nginx-conf\"
    step2-nginx-conf
    \n

    先测试下 nginx 有没有配置成功,本地打包文件:

    \n
    yarn build\n

    然后将生成的 dist 文件里的内容复制到刚才设置的项目根目录下。

    \n

    接着输入 http://xxx.xxx.xxx.xxx:端口号,就能访问成功了。

    \n
    \n

    提示

    \n

    地址得用 http 协议,因为我们还没有配置 ssl 证书。

    \n
    \n

    配置 git 仓库

    \n

    在 中已经搭建好了 git 私服,因此只需要初始化 vuepress.git 仓库即可。

    \n
    cd /home/git\nmkdir vuepress.git\ncd vuepress.git\ngit init --bare vuepress.git\n

    配置 hooks

    \n

    先切换到 root 用户(ctrl + d),在 home 文件夹下创建一个临时存放 dist 文件夹的地方。

    \n
    \n

    提示

    \n

    我这里选择存放到 home 文件夹下,但是 git 用户是没有权限的,因此切换到 root 用户,也可以存放到其他文件夹。

    \n
    \n
    cd /home\nmkdir tmp\ncd tmp\nmkdir vuepress\n

    接着将文件的所有权换成 git:

    \n
    sudo chown git:git -R vuepress\n

    然后,有一个关键的地方,要将 /www/wwwroot 的所有权换成 git:

    \n
    sudo chown git:git /www/wwwroot\n

    做好这些准备之后,就可以开始配置 hooks 了。

    \n
    cd /home/git/vuepress.git/hooks\n# 通过 copy 新建 post-update 文件\ncp post-update.sample post-update\nvim post-update\n

    接着将下面代码复制进去:

    \n
    echo \"auto deploy start ===================================\"\nunset GIT_DIR\n\n# 项目文件夹\nPUBLIC_WWW=/www/wwwroot/vuepress\n# git 仓库文件夹\nGIT_REPO=/home/git/vuepress.git\n# 临时文件夹\nTMP_GIT_CLONE=/home/tmp/vuepress\n\n# 移除临时文件夹\nrm -rf ${TMP_GIT_CLONE}\n# 克隆 git 仓库到临时文件夹\ngit clone $GIT_REPO $TMP_GIT_CLONE\n# 移除项目文件夹\n# 宝塔为了安全,为自动在项目文件夹下新增 .user.ini 文件\n# 需要先关闭这个文件的功能才能删除项目文件夹\ncd ${PUBLIC_WWW}\nchattr -i .user.ini\nrm -rf ${PUBLIC_WWW}\n# 将临时文件夹复制到项目文件夹\ncp -rf ${TMP_GIT_CLONE} ${PUBLIC_WWW}\n\necho \"auto deploy end ====================================\"\n

    现在服务器端的准备工作已经完成了,接下来看看本地电脑的配置。

    \n

    本地电脑

    \n

    在本地项目根目录下新建 deploy.sh 脚本文件,内容如下:

    \n
    #!/usr/bin/env sh\n\n# 确保脚本抛出遇到的错误\nset -e\n\n# 生成静态文件\nyarn build\n\n# 进入生成的文件夹\ncd docs/.vuepress/dist\n\n# 初始化 git 仓库,并提交修改\ngit init\ngit add -A\ngit commit -m 'deploy'\n\n# 发布到 git 私服, -f 强制覆盖\ngit remote add origin git@119.23.65.118:/home/git/vuepress.git\ngit push -f git@119.23.65.118:/home/git/vuepress.git master\n\ncd -\n
    \n

    提示

    \n

    了解更多 git 命令,可以查询官方文档

    \n
    \n

    测试

    \n

    vscode 终端中输入 sh depoly.sh,报错:

    \n
    sh : 无法将“sh”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。\n请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。\n

    了解到 windows 上可以使用 git bash 执行 shell 脚本,但我可不想每次执行的时候都打开 git bash,当然得找如何在 vscode 中执行 shell 脚本的办法。

    \n
      \n
    1. 首先得在 vscode 中安装 code runner,之前一直用它来调试力扣上的题,已经安装过了。
    2. \n
    3. 安装 git bash,这个不用说,安装 git 的时候就已经有了
    4. \n
    5. 配置 bash 环境,找到 bash.exe 的安装目录,将它的位置添加到系统的环境变量中。
    6. \n
    7. 配置 code runner:文件 -> 首选项 -> 设置 -> 搜索 code runner
    8. \n
    9. 打开终端,输入 bash 切换到 bash 环境,点击右上角的三角形即可运行。
    10. \n
    \n
    \"step3-code-runner\"
    step3-code-runner
    \n

    现在随便更新点内容,并执行 deploy.sh 脚本:

    \n
    \"step4-complete\"
    step4-complete
    \n

    再次访问 http://xxx.xxx.xxx.xxx:端口号 发现已经更新了。

    \n

    参考链接

    \n\n", - "image": "https://raw.githubusercontent.com/dribble-njr/typora-njr/master/img/step1-add-site.png", - "date_published": "2021-05-12T00:00:00.000Z", - "date_modified": "2024-01-09T04:30:54.000Z", - "authors": [], - "tags": [ - "linux" - ] - }, - { - "title": "图片批注", - "url": "https://dribble-njr.github.io/blog/blog/frontend/practice/002-annotation.html", - "id": "https://dribble-njr.github.io/blog/blog/frontend/practice/002-annotation.html", - "summary": " 相关信息 demo: https://codesandbox.io/p/sandbox/image-annotation-pht676?file=%2Fsrc%2FApp.js%3A210%2C56 实现图片批注有两种方案,一种是通过 SVG 绘制,一种是通过 Canvas 绘制。以下是两者对比: 综上,选择使用 Canvas 实现图片批注。 加载图...", - "content_html": "
    \n

    相关信息

    \n

    demo: https://codesandbox.io/p/sandbox/image-annotation-pht676?file=%2Fsrc%2FApp.js%3A210%2C56

    \n
    \n

    实现图片批注有两种方案,一种是通过 SVG 绘制,一种是通过 Canvas 绘制。以下是两者对比:

    \n

    | 特点 | Canvas | SVG |
    \n|

    \n", - "date_published": "2023-12-28T00:00:00.000Z", - "date_modified": "2024-07-10T03:00:38.000Z", - "authors": [], - "tags": [ - "practice" - ] } ] } \ No newline at end of file diff --git a/frontend/basic/css/001-quick-start.html b/frontend/basic/css/001-quick-start.html index a4d362709c..0d0c8c8584 100644 --- a/frontend/basic/css/001-quick-start.html +++ b/frontend/basic/css/001-quick-start.html @@ -30,7 +30,7 @@ 快速开始 - + @@ -94,6 +94,6 @@ }
    - + diff --git a/frontend/basic/css/002-selector.html b/frontend/basic/css/002-selector.html index fc3b8d5182..73a071765f 100644 --- a/frontend/basic/css/002-selector.html +++ b/frontend/basic/css/002-selector.html @@ -30,7 +30,7 @@ 选择器 - + @@ -328,6 +328,6 @@ color: blue; }

    注意

    当使用选择器列表时,如果任何一个选择器无效 (存在语法错误),那么整条规则都会被忽略。

    优先级

    CSS 优先级可以分为 0~5 级共 6 个等级,前 4 个等级由选择器决定,后 2 个等级由书写形式和特定语法决定。

    优先级大小可以由数值计算出,出现一个 0 级选择器,优先值数值加 0,1 级选择器加 1,2 级选择器加 10,3 级选择器加 100,以此类推。

    0 级优先级包括:通配符选择器、选择符(5 种)和逻辑组合伪类(:not() :is() :where)。

    1 级优先级就是标签选择器。

    2 级优先级包括:类选择器、属性选择器和其他伪类。

    3 级优先级为 ID 选择器。

    4 级优先级为内联样式。

    5 级优先级为 !important

    - + diff --git a/frontend/basic/css/003-box-model.html b/frontend/basic/css/003-box-model.html index a2e2453965..b9f2c04a24 100644 --- a/frontend/basic/css/003-box-model.html +++ b/frontend/basic/css/003-box-model.html @@ -30,7 +30,7 @@ 盒模型 - + @@ -71,6 +71,6 @@ width: 150px; }
    - + diff --git a/frontend/basic/css/004-text-font.html b/frontend/basic/css/004-text-font.html index 1bec481815..85b2addb94 100644 --- a/frontend/basic/css/004-text-font.html +++ b/frontend/basic/css/004-text-font.html @@ -30,7 +30,7 @@ 文本和字体 - + @@ -152,6 +152,6 @@ font: bold 20px/1.5 '楷体'; }
    - + diff --git a/frontend/basic/css/005-cascade-inheritance.html b/frontend/basic/css/005-cascade-inheritance.html index 5b213d45cd..9a539fdbbf 100644 --- a/frontend/basic/css/005-cascade-inheritance.html +++ b/frontend/basic/css/005-cascade-inheritance.html @@ -30,11 +30,11 @@ 层叠和继承 - +
    跳至主要內容

    层叠和继承

    njrCSSfrontendcssbasic-knowledge大约 11 分钟约 3331 字

    CSS 的基本设计原则之一是 层叠,它允许多个样式表影响文档的表示。

    当不同的声明尝试为同一元素设置值时,必须以某种方式解决冲突。

    而在默认情况下,若没有声明为元素设置值时,则会通过 继承 或使用属性的默认值来计算最终的结果。

    相关信息

    与层叠密切相关的概念是 优先级

    值的计算过程

    一旦浏览器将 HTML 文档解析并生成了 DOM Tree,那么必须给每一个元素都设置对应的样式。

    最终的 CSS 属性值会经过多个步骤的计算:

    • 首先,收集每个元素上每一个属性应用的所有 声明值
    • 层叠产生 层叠值,每个元素的每个属性最多有一个层叠值;
    • 默认值将产生 指定值,每个元素的每个属性正好有一个指定值;
    • 解析值的依赖关系将产生 计算值,每个元素的每个属性正好有一个计算值;
    • 格式化文档会生成 使用值,一个元素只有在一个给定的属性适用于该元素时才具有该属性的使用值;

      我的理解是:若一个元素没有该属性,则没有使用值。

    • 最后,根据显示环境的不同,将使用值转换为 实际值。与使用值一样,元素上的给定属性可能有也可能没有实际值。

    声明值 Declared Values

    每个应用于元素的属性声明都会给该属性提供一个声明值,这些值会被层叠处理以选择一个单一的「获胜值」。

    层叠值 Cascaded Values

    层叠值代表层叠的结果:它是赢得层叠的声明值(在层叠的输出中被排序在前面)。如果层叠的输出是一个空列表,那就没有层叠值。

    指定值 Specified Values

    指定值是一个给定的属性值,是样式表作者为该元素设置的。它是把层叠值通过默认过程处理的结果,保证每个元素上的每个属性都有一个指定的值。

    在许多情况下,指定值是层叠的值。然而,如果根本没有层叠值,那么就会取默认的值。

    计算值 Computed Values

    计算值是对指定值进行解析的结果,通常是将其绝对化以准备继承。

    注意

    计算值是在继承过程中父代传递给子代的值。由于历史原因,它不一定是 getComputedStyle() 函数返回的值,该函数有可能会返回 使用值CSSOM 除外,计算值是一个抽象的数据表示:它们的定义反映了该数据表示,而不是该数据如何被序列化。例如,序列化规则通常允许省略某些在解析过程中隐含的值,但这些值仍然是计算值的一部分。

    EXAMPLE

    一个指定的值可以是绝对的(如 red2px),也可以是相对的(如 auto2em)。计算一个相对值通常会将其绝对化:

    • 相对单位的值(emexvhvw)必须通过与合适的参考尺寸相乘而成为绝对值
    • 某些关键字(如 smallerbloder)必须根据其定义进行替换
    • 某些属性的百分比必须乘以一个参考值(由属性定义)
    • 有效的相对 URL 必须被解析为绝对值

    注意

    一般来说,计算值会尽可能地解析指定值,而不需要执行其他难以并行的操作,例如解析网络请求或从元素和它的父级元素以外的地方检索值。

    即使该属性不适用,计算值也会存在。然而一些属性可能会根据该属性是否适用于该元素而改变它们确定计算值的方式。

    使用值 Used Values

    使用值是将计算值和完成任何剩余计算的结果,使其成为文档格式化中使用的绝对理论值。

    EXAMPLE

    比如,在不知道该元素的祖先布局的情况下,width: auto 声明不能被解析为一个长度,所以计算值是 auto,而使用值是一个绝对长度,如 100px

    如果一个属性不适用于这个元素或盒子类型,那么它对该类型的盒子或元素没有直接的格式化效果,因此对该属性没有使用值。

    EXAMPLE

    例如,flex 属性在不是 flex 项目的元素上没有使用值。

    注意

    定义为适用于「所有元素」的属性适用于所有元素和显示类型,但不一定适用于所有伪元素类型,因为伪元素通常有自己的特定渲染模型或其他限制。然而,::before::after 伪元素被定义为几乎完全像普通元素一样,因此被定义为接受所有适用于「所有元素」的属性。

    实际值 Actual Values

    原则上,一个使用值是可以被使用的,但是用户代理可能无法在特定的环境中使用这个值。

    例如,用户代理可能只能呈现整数像素宽度的边框,因此必须近似宽度的使用值。

    另外,一个元素的字体大小可能需要根据字体的可用性和字体大小调整属性的值来调整。

    实际值就是进行此类调整后的使用值。

    例子

    完整例子见 Examplesopen in new window

    属性获胜值层叠值指定值计算值使用值实际值
    text-aligntext-align: leftleftleftleftleftleft
    width(none)(none)auto(继承的值)auto120px120px
    border-widthborder-width: inheritinherit4.2px4.2px4.2px4px
    font-sizefont-size: 1.2em1.2em1.2em14.1px14.1px14px
    widthwidth: 80%80%80%80%354.2px354px

    层叠

    层叠接收一个无序的列表,该列表是给定元素上给定属性的声明值,按照下面确定的声明优先级对它们进行排序,然后输出一个单一的 层叠值

    层叠排列顺序

    层叠根据以下标准对声明进行排序,其优先级由高到低排列:

    起源和重要性

    一个声明的起源是基于它的来源,而它的重要性是指它是否用 !important 声明(见 下文)。各种起源的优先级按降序排列如下:

    1. 过渡声明 css-transitions-1open in new window
    2. 重要的用户代理声明
    3. 重要的用户声明
    4. 重要的作者声明
    5. 动画声明 css-animations-1open in new window
    6. 正常的作者声明
    7. 正常的用户声明
    8. 正常的用户代理声明

    来自这个列表中较早起源的声明胜过来自较晚起源的声明。

    特异性

    选择器模块 Calculating a selector's specificityopen in new window 描述了如何计算一个选择器的特异性。具有最高特异性的声明获胜。

    出现顺序

    文档中最后一个出现的声明获胜。这是为了:

    • 来自导入的样式表的声明被排序,就像它们的样式表被替换成了 @import 规则。
    • 来自独立于原生文档的样式表的声明被视为按照链接顺序连接起来的,由主文档语言决定。
    • 来自样式属性的声明是根据样式属性出现的元素的文档顺序来排序的,并且都放在任何样式表之后。

    级联的输出是一个(可能是空的)排序的列表,其中包括每个元素上的每个属性的声明值。

    层叠来源

    每个样式规则都有一个级联原点,它决定了它在哪里进入级联。CSS定义了三个核心原点:

    作者起源

    作者根据文档语言的惯例为一个源文档指定样式表。例如,在HTML中,样式表可以包含在文档中,也可以从外部链接。

    用户起源

    用户可能能够为一个特定的文档指定样式信息。例如,用户可以指定一个包含样式表的文件,或者用户代理可以提供一个生成用户样式表的界面(或者表现得像它一样)。

    用户代理的起源

    符合要求的用户代理必须应用一个默认的样式表(或者表现得像他们一样)。一个用户代理的默认样式表应该以满足文档语言的一般表现期望的方式呈现文档语言的元素(例如,对于视觉浏览器,HTML中的EM元素使用斜体字呈现)。例如,见HTML用户代理样式表。[HTML]

    对CSS的扩展定义了以下额外的起源:

    动画起源

    CSS动画 css-animations-1open in new window 在运行时产生代表其效果的 "虚拟 "规则。

    过渡起源

    与CSS动画一样,CSS过渡 css-transitions-1open in new window 在运行时产生代表其效果的 "虚拟 "规则。

    重要声明: !important 注释

    CSS 试图在作者和用户的样式表之间建立一种权力平衡。

    默认情况下,作者的样式表中的规则优先于用户的样式表中的规则,而用户的样式表又优先于用户代理的默认样式表中的规则。

    为了平衡这一点,一个声明可以被标记为重要的,这将增加它在级联中的权重并颠倒优先顺序。

    一个重要的声明优先于一个普通的声明。作者和用户的样式表都可以包含重要声明,用户源的重要声明优先于作者源的重要声明。

    这个CSS特性通过让有特殊要求的用户(大字体、颜色组合等)控制表现形式来提高文档的可访问性。

    所有来源的重要声明都优先于动画的声明。这允许作者在重要情况下覆盖动画值。(动画值通常优先于所有其他规则)。

    用户代理样式表也可能包含重要的声明。这些声明覆盖了所有作者和用户的声明。

    继承

    当级联不产生一个值时,必须以其他方式找到指定的值。

    继承的属性通过继承从它们的父元素中获取它们的默认值;所有其它的属性都采取它们的初始值。

    作者可以通过inherit和initial关键字明确要求继承或初始化。

    初始值

    每个属性都有一个初始值,在该属性的定义表中定义。如果该属性不是一个继承的属性,并且级联没有产生一个值,那么该属性的指定值就是其初始值。

    继承性

    继承将属性值从父元素传播到它们的子元素。一个元素上的属性的继承值是该元素的父元素上的属性的计算值。对于根元素,它没有父元素,继承值是属性的初始值。

    伪元素根据为每个伪元素描述的虚构的标签序列来继承。

    有些属性是继承的属性,这在其属性定义表中有定义。这意味着,除非层叠的结果是一个值,否则该值将由继承来决定。

    一个属性也可以明确地被继承。参见 继承关键字open in new window

    注意

    继承遵循文档树,不被 匿名盒子open in new window 拦截,也不被盒子树的其他操作所影响。

    明确默认

    下面定义了几个 CSS 范围内的属性值;声明一个属性拥有这些值,明确地指定了一个特定的默认行为。所有的CSS属性都可以接受这些值。

    重置一个属性:initial 关键字

    如果一个属性的层叠值是 initial 关键字,那么该属性的 指定值 就是其初始值。

    显式继承:inherit 关键字

    如果一个属性的层叠值是 inherit 关键字,那么该属性的指定值和计算值就是继承值。

    擦除所有声明:unset 关键字

    如果一个属性的层叠值是 unset关键字,那么如果它是一个继承的属性,这将被视为继承,如果它不是,这将被视为初始。

    这个关键字有效地抹去了在层叠中较早出现的所有声明的值,正确地继承或不继承都适合于该属性(或一个速记的所有长文)。

    - + diff --git a/frontend/basic/css/006-background-border.html b/frontend/basic/css/006-background-border.html index 873c551952..ed5866a47d 100644 --- a/frontend/basic/css/006-background-border.html +++ b/frontend/basic/css/006-background-border.html @@ -30,7 +30,7 @@ 背景和边框 - + @@ -301,6 +301,6 @@ border-left: 60px solid transparent; }
    - + diff --git a/frontend/basic/css/007-position.html b/frontend/basic/css/007-position.html index 134c39e379..4289e2af04 100644 --- a/frontend/basic/css/007-position.html +++ b/frontend/basic/css/007-position.html @@ -30,7 +30,7 @@ 定位 - + @@ -50,6 +50,6 @@ top: 10px; }

    在屏幕视口滚动到元素 top 距离小于 10px 之前,元素为相对定位。之后,元素将固定在与顶部距离 10px 的位置,直到屏幕回滚到阈值以下。常用来做吸顶效果

    总结

    脱离标准流定位元素绝对定位元素定位参考对象
    static
    relative元素原来的位置
    absolute最近的定位祖先元素
    fixed视口
    - + diff --git a/frontend/basic/css/008-float.html b/frontend/basic/css/008-float.html index abb9868532..80bcfc9daf 100644 --- a/frontend/basic/css/008-float.html +++ b/frontend/basic/css/008-float.html @@ -30,7 +30,7 @@ 浮动 - + @@ -433,6 +433,6 @@ background-color: skyblue; }

    对比

    圣杯布局双飞翼布局
    HTML包裹三栏只包裹中间一栏
    是否定位相对定位无需定位
    左右栏的空间使用 padding 预留使用 margin 预留
    左栏处理positon + margin-leftmargin-left
    右栏处理margin-rightmargin-left
    - + diff --git a/frontend/basic/css/009-flex.html b/frontend/basic/css/009-flex.html index 85d3ff4670..6d88a8b131 100644 --- a/frontend/basic/css/009-flex.html +++ b/frontend/basic/css/009-flex.html @@ -30,7 +30,7 @@ Flex 布局 - + @@ -83,6 +83,6 @@ margin: 0 10px; }

    三、项目属性

    项目属性针对子元素。

    3.1 order

    order 属性定义项目的排列顺序,数值越小,排列越靠前。

    取值

    3.2 flex-grow

    flex-grow 定义项目放大比例,放大的前提是父元素有足够空间。实际上是定义子元素占容器空间的份数。若没定义此属性,则空间按自己本身内容撑开。

    grow 是扩展的意思,扩展的就是 flex 子项所占据的宽度,扩展所侵占的空间就是除去元素外的剩余的空白间隙。

    注意:即使设置了固定宽度,若有剩余空间依旧会放大。

    取值

    3.3 flex-shrink

    flex-shrink 定义项目缩小比例,默认为 1,即如果空间不足,该项目将缩小。

    注意:即使设置了固定宽度,也会缩小。

    但如果某个项目的 flex-shrink 属性设置为 0 ,即使空间不足,自身也不缩小。

    取值

    3.4 flex-basis

    用于设置项目宽度,定义了在分配剩余空间之前元素的默认大小。默认 auto 时,项目会保持默认宽度,或者以 width 为自身的宽度,但如果设置了 flex-basis,权重会 width 属性高,因此会覆盖 width 属性。

    实际上不建议对 flex 子项使用width属性,因为不够弹性。

    取值

    3.5 flex

    flex 属性是 flex-growflex-shrinkflex-basis 三个属性的简写,用于定义项目放大,缩小与宽度。默认为 flex: 0 1 auto;后两个属性值可以简写。

    常用:flex: 1 等分容器空间。

    3.6 align-self

    align-self 指控制单独某一个 flex 子项的垂直对齐方式,写在 flex 容器上的这个 align-items 属性,后面是 items,有个 s,表示子项们,是全体;这里是 self,单独一个个体。其他区别不大,语法几乎一样:

    align-self: auto | flex-start | flex-end | center | baseline | stretch;

    唯一区别就是align-self多了个auto(默认值),表示继承自 flex 容器的align-items属性值。其他属性值含义一模一样。

    - + diff --git a/frontend/basic/css/010-unit.html b/frontend/basic/css/010-unit.html index f67c07fc40..cc554198f1 100644 --- a/frontend/basic/css/010-unit.html +++ b/frontend/basic/css/010-unit.html @@ -30,11 +30,11 @@ 样式单位 - +
    跳至主要內容

    样式单位

    njrCSS布局frontendbasic-knowledge小于 1 分钟约 128 字

    相关信息

    更详细的内容可见 MDN。

    CSS 布局里有一些不同的样式单位,常见如下:

    • px:绝对单位,像素;
    • em:相对于自身字体大小的单位;
    • rem:相对于 html 标签字体大小的单位;
    • vh:相对于视口高度大小的单位,20vh == (视口高度/100)*20;
    • vw:相对于视口宽度大小的单位, 20vw == (视口宽度/100)*20;
    • %:父元素的百分比。
    - + diff --git a/frontend/basic/css/011-center.html b/frontend/basic/css/011-center.html index 3f0aec4f35..abd01f2286 100644 --- a/frontend/basic/css/011-center.html +++ b/frontend/basic/css/011-center.html @@ -30,7 +30,7 @@ 居中 - + @@ -163,6 +163,6 @@ height: 100px; }
    - + diff --git a/frontend/basic/css/012-grid.html b/frontend/basic/css/012-grid.html index 4db371a88e..29ee0ebf84 100644 --- a/frontend/basic/css/012-grid.html +++ b/frontend/basic/css/012-grid.html @@ -30,7 +30,7 @@ Grid 布局 - + @@ -1467,6 +1467,6 @@ }

    place-self 属性是 align-self 属性和 justify-self 属性的合并简写形式。

    place-self: <align-self> <justify-self>;
     

    如果省略第二个值,place-self 属性会认为这两个值相等。

    参考指南

    提示

    可以尝试 技能测试:网格布局open in new window 查看掌握程度。

    - + diff --git a/frontend/basic/css/013-BFC.html b/frontend/basic/css/013-BFC.html index 6f0a812f2f..5d209a12ec 100644 --- a/frontend/basic/css/013-BFC.html +++ b/frontend/basic/css/013-BFC.html @@ -30,7 +30,7 @@ BFC 块级格式化上下文 - + @@ -269,6 +269,6 @@ background-color: #ccc; }

    常见触发方式的优缺点

    - + diff --git a/frontend/basic/css/014-responsive-design-intro.html b/frontend/basic/css/014-responsive-design-intro.html index a7b4a35502..e4fd179179 100644 --- a/frontend/basic/css/014-responsive-design-intro.html +++ b/frontend/basic/css/014-responsive-design-intro.html @@ -30,7 +30,7 @@ 响应式设计介绍 - + @@ -495,6 +495,6 @@ } }
    - + diff --git a/frontend/basic/css/015-responsive-design.html b/frontend/basic/css/015-responsive-design.html index 543d5fc2ed..4062ef56aa 100644 --- a/frontend/basic/css/015-responsive-design.html +++ b/frontend/basic/css/015-responsive-design.html @@ -30,7 +30,7 @@ 响应式设计 - + @@ -2270,6 +2270,6 @@ Your browser does not support HTML5 video. </video>

    参考

    - + diff --git a/frontend/basic/css/016-how-to-responsive.html b/frontend/basic/css/016-how-to-responsive.html index c4f12d91ad..0df7c0ee6b 100644 --- a/frontend/basic/css/016-how-to-responsive.html +++ b/frontend/basic/css/016-how-to-responsive.html @@ -30,7 +30,7 @@ 怎样实现响应式网页布局 - + @@ -125,6 +125,6 @@ } }

    在基于百分比的方法中,float 属性控制元素显示在屏幕的左侧或右侧。

    如果要完成响应式设计,还需要熟悉 CSS 的 flex 布局及其它属性,如 box-sizing

    响应式图片

    响应式图片

    响应式文字

    响应式网页设计的重点在于布局块、元素和媒体的响应性。文字往往是事后才考虑的问题。

    但要实现真正的响应式设计,还应该根据屏幕尺寸适当调整字体大小。

    最简单的方法是为字体大小设置一个静态值,如 22px,并在每个媒体查询中进行调整。

    Font size vs view size scatter points
    Font size vs view size scatter points

    提示

    一般设置 html 字体大小,并使用 rem 单位,或使用插件转换为「视口」单位。

    相关阅读:

    - + diff --git a/frontend/basic/css/017-loading-spinner.html b/frontend/basic/css/017-loading-spinner.html index f4ad58dce3..2f3a28dfca 100644 --- a/frontend/basic/css/017-loading-spinner.html +++ b/frontend/basic/css/017-loading-spinner.html @@ -30,7 +30,7 @@ 实现 loading spinner - + @@ -71,6 +71,6 @@ animation: spin 1s linear infinite; }
    - + diff --git a/frontend/basic/css/018-autofill.html b/frontend/basic/css/018-autofill.html index dfff03ba08..5b3cec47b8 100644 --- a/frontend/basic/css/018-autofill.html +++ b/frontend/basic/css/018-autofill.html @@ -30,7 +30,7 @@ 覆盖输入框 autofill 样式 - + @@ -42,6 +42,6 @@ transition: background-color 5000s ease-in-out 0s; }

    但是如果停留时间过久,也会有问题,但是目前好像没有更好的解决方法。

    - + diff --git a/frontend/basic/css/index.html b/frontend/basic/css/index.html index 13459765e7..27d7b4d420 100644 --- a/frontend/basic/css/index.html +++ b/frontend/basic/css/index.html @@ -30,11 +30,11 @@ CSS - +
    跳至主要內容

    CSS

    njr小于 1 分钟约 227 字

    - + diff --git "a/frontend/basic/html/0007\343\200\201WebSocket.html" "b/frontend/basic/html/0007\343\200\201WebSocket.html" index 8d4cbbffc5..3ba1b0cc14 100644 --- "a/frontend/basic/html/0007\343\200\201WebSocket.html" +++ "b/frontend/basic/html/0007\343\200\201WebSocket.html" @@ -30,7 +30,7 @@ WebSocket - + @@ -53,6 +53,6 @@ alert('shibai ') }
    - + diff --git "a/frontend/basic/html/0008\343\200\201WebStorage.html" "b/frontend/basic/html/0008\343\200\201WebStorage.html" index 9f6f12891f..b7cec3b6ba 100644 --- "a/frontend/basic/html/0008\343\200\201WebStorage.html" +++ "b/frontend/basic/html/0008\343\200\201WebStorage.html" @@ -30,7 +30,7 @@ cookie、localStorage 和 sessionStorage - + @@ -62,6 +62,6 @@ sessionStorage.clear();

    存储事件

    每当 Storage 对象发生变化时,都会在文档上触发 storage 事件。使用属性或 setItem() 设置值、使用 delete 或 removeItem() 删除值,以及每次调用 clear() 时都会触发这个事件。这个事件的事件对象有如下 4 个属性。

    可以使用如下代码监听storage 事件:

    window.addEventListener("storage", (event) => alert('Storage changed for ${event.domain}'));
     

    三者异同

    过期时间

    localStorage 和 sessionStorage 也可以通过封装设置过期时间,一旦到达这个时间,则调用 API 清除数据。

    存储大小

    http 请求是否携带

    - + diff --git a/frontend/basic/html/001-html-history.html b/frontend/basic/html/001-html-history.html index 891dc5cc94..465bf6bb27 100644 --- a/frontend/basic/html/001-html-history.html +++ b/frontend/basic/html/001-html-history.html @@ -30,11 +30,11 @@ 历史 - +
    跳至主要內容

    历史

    njrHTMLfrontendhtmlbasic-knowledgehistory大约 2 分钟约 744 字

    历史

    1990 年,Tim Berners-Lee 创建了 HTML,旨在使科学研究人员可以更容易地在不同的计算机系统之间共享文档。

    随着互联网的不断发展,HTML 不仅能插入普通的文本,还可以插入图片、音视频、链接等超文本内容,逐渐成为创建网页的标准语言。

    在最初的五年(1990-1995)中,HTML 先后在 CERN(欧洲核子研究中心) 和 IETF(互联网工程任务组) 托管。

    • 1991-1993 年,由 IETF 发布各项草案。
    • 1995 年,HTML 2.0 发布。

    在 IETF 主持下,HTML 的进一步发展由于利益冲突而停滞不前。因此,1994 年,Berners-Lee 为了 Web 发展而成立了 W3C,随后 HTML 标准由 W3C 指定。

    • 1995 年,W3C 第一次扩展 HTML 的尝试失败,该标准被称为 HTML 3.0,详情见 浏览器大战open in new window
    • 1997 年,HTML 3.2 发布,它引入了一些重要的新特性,如表格、框架、样式表等。
    • 1998 年,HTML 4.0 发布,它引入了一些新的特性,如嵌套标签、样式表、客户端脚本等。
    • 1999 年,HTML 4.01 发布,它是 HTML 4.0 的一个修订版,它主要是修复了一些错误和不规范的用法。

    在 HTML 4.01 之后,W3C 决定停止发展 HTML,开始开发 XHTML(可扩展超文本标记语言),它是 HTML 的一个基于 XML 的变种。XHTML 更加严格,更加规范,具有更好的可读性和可维护性,但也更加复杂和冗长。

    XHTML 1.0 对 HTML4 进行了重新表述,除了加入新的序列化之外,没有增加任何新特性,这项工作于 2000 年完成。在 XHTML 1.0 之后,W3C 的重点转向使其他组织更容易扩展 XHTML。与此同时,W3C 还开发了一种与早期 HTML 和 XHTML 语言不兼容的新语言,命名为 XHTML2。

    2004 年,在 W3C 的一次研讨会上,Mozilla 和 Opera 联合向 W3C 提案认为应该重新发展 HTML。然而,由于该提案与之前选择的 Web 发展方向相冲突,该提案被拒绝,W3C 员工和成员投票决定继续开发基于 XML 的替代品。

    此后不久,Apple、 Mozilla 和 Opera 共同宣布成立 WHATWG(Web Hypertext Application Technology Working Group,网页超文本应用技术工作小组)开始开发 HTML5。

    2006 年,W3C 表示有兴趣参与 HTML5 的开发,并于 2007 年成立了一个特许工作组,与 WHATWG 合作开发 HTML5 规范。

    2008 年,WHATWG 与 W3C 共同交付 HTML5,并于 2014 年 10 月 28 日完成标准化。

    2019 年,WHATWG 和 W3C 签署了一项协议,双方合作开发 HTML 的单一版本: HTML Living Standardopen in new window

    总结

    HTML 主要版本:

    • HTML 2.0
    • HTML 3.2
    • HTML 4.0
    • HTML 5

    参考

    - + diff --git "a/frontend/basic/html/0010\343\200\201WebWorker.html" "b/frontend/basic/html/0010\343\200\201WebWorker.html" index 2a609bb980..095bd05e6f 100644 --- "a/frontend/basic/html/0010\343\200\201WebWorker.html" +++ "b/frontend/basic/html/0010\343\200\201WebWorker.html" @@ -30,11 +30,11 @@ Web Worker - +
    跳至主要內容

    Web Worker

    njrHTMLWeb WorkerHTML5小于 1 分钟约 15 字

    - + diff --git a/frontend/basic/html/002-quick-start.html b/frontend/basic/html/002-quick-start.html index 0e1975509d..49752c9789 100644 --- a/frontend/basic/html/002-quick-start.html +++ b/frontend/basic/html/002-quick-start.html @@ -30,7 +30,7 @@ 快速开始 - + @@ -85,6 +85,6 @@ <p>HTML 中用 &lt;p&gt; 来定义段落元素</p>

    下面是一些常用的字符引用

    原义字符等价字符引用
    <&lt;
    >&gt;
    "&quot;
    'apos
    &&amp;

    备注

    不需要为任何其他符号使用实体引用,因为只要你的 HTML 的字符编码设置为 UTF-8,现代浏览器就能很好地处理实际符号。

    总结

    - + diff --git a/frontend/basic/html/003-doctype.html b/frontend/basic/html/003-doctype.html index c39fae3717..ee1ddfd0c2 100644 --- a/frontend/basic/html/003-doctype.html +++ b/frontend/basic/html/003-doctype.html @@ -30,7 +30,7 @@ DOCTYPE - + @@ -39,6 +39,6 @@

    HTML4 Frameset

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
     

    HTML5 DOCTYPE

    因为 HTML5 不基于 SGML,没有为之定义的 DTD,所以理论上 HTML5 不需要再声明 DOCTYPE。

    但是前面提到了:如果文档没有声明或者使用了错误的 DOCTYPE,那么会导致浏览器以怪异模式来渲染页面。因此,HTML5 使用了以下 DOCTYPE:

    <!DOCTYPE html>
     
    - + diff --git a/frontend/basic/html/004-common-element.html b/frontend/basic/html/004-common-element.html index 2aa3d86743..3566104ea3 100644 --- a/frontend/basic/html/004-common-element.html +++ b/frontend/basic/html/004-common-element.html @@ -30,7 +30,7 @@ 常见元素 - + @@ -177,6 +177,6 @@ <span>范围二</span> <span>范围三</span>
    - + diff --git a/frontend/basic/html/005-advanced-element.html b/frontend/basic/html/005-advanced-element.html index e1ddb9b6b5..7e11211e96 100644 --- a/frontend/basic/html/005-advanced-element.html +++ b/frontend/basic/html/005-advanced-element.html @@ -30,7 +30,7 @@ 高级元素 - + @@ -237,6 +237,6 @@ <button type="submit">提交</button> </form>

    <form> 元素

    <form> 元素用于创建 HTML 表单,它有两个重要的属性:

    <label><input><textarea><button> 元素

    <label> 元素用于定义表单元素的标签,它有一个重要的属性:

    <input> 元素用于创建表单元素,它有一个重要的属性:

    <textarea> 元素用于创建多行文本输入框。

    <button> 元素用于创建按钮,它有一个重要的属性:

    提示

    各元素包含的属性详见 MDN 文档:https://developer.mozilla.org/zh-CN/open in new window

    - + diff --git a/frontend/basic/html/006-semantically-meaningful-tags.html b/frontend/basic/html/006-semantically-meaningful-tags.html index 2203239092..6286ed43a7 100644 --- a/frontend/basic/html/006-semantically-meaningful-tags.html +++ b/frontend/basic/html/006-semantically-meaningful-tags.html @@ -30,11 +30,11 @@ 语义化标签 - +
    跳至主要內容

    语义化标签

    njrHTMLHTML5小于 1 分钟约 241 字

    HTML5 中加入了一些语义化标签,来更清晰的表达文档结构。

    语义化标签
    语义化标签
    • <header>:页眉。
    • <nav>:导航栏。
    • <main>:主内容。主内容中还可以有各种子内容区段,可用 <article><section><div> 等元素表示。
    • <aside>:侧边栏,经常嵌套在 <main> 中。
    • <footer>:页脚。

    语义化优点:

    • 易于用户阅读,在丢失 CSS 样式的时候仍能呈现清晰的结构;
    • 方便屏幕阅读器解析,如盲人阅读器根据标签渲染网页;
    • 提升用户体验,例如 title、alt 可以用于解释名称或图片信息;
    • 便于 SEO 搜索引擎优化,搜索引擎根据标签来确定上下文和关键字的权重;
    • 有利于开发人员维护。

    缺点:

    • 存在兼容性问题,HTML5 语义化标签在 IE8 下,默认当成行内元素展示。
    - + diff --git a/frontend/basic/html/007-media-tag.html b/frontend/basic/html/007-media-tag.html index c247b6fd79..c54a2ea92f 100644 --- a/frontend/basic/html/007-media-tag.html +++ b/frontend/basic/html/007-media-tag.html @@ -30,7 +30,7 @@ 视频和音频 - + @@ -42,6 +42,6 @@ Sorry, your browser doesn't support embedded videos. </video>
    - + diff --git a/frontend/basic/html/008-canvas-svg.html b/frontend/basic/html/008-canvas-svg.html index 39c921d870..9337eec954 100644 --- a/frontend/basic/html/008-canvas-svg.html +++ b/frontend/basic/html/008-canvas-svg.html @@ -30,7 +30,7 @@ Canvas 和 SVG 的区别 - + @@ -90,6 +90,6 @@ </text> </svg>

    其特点如下:

    - + diff --git a/frontend/basic/html/009-src-vs-href.html b/frontend/basic/html/009-src-vs-href.html index c630191436..9baba8e594 100644 --- a/frontend/basic/html/009-src-vs-href.html +++ b/frontend/basic/html/009-src-vs-href.html @@ -30,13 +30,13 @@ src 和 href 的区别 - +
    跳至主要內容

    src 和 href 的区别

    njrHTMLHTML大约 1 分钟约 390 字

    srchref 之间存在区别,不能互换使用。

    • src:表示对资源的 引入,它指向的内容会被浏览器替换,嵌入到当前标签所在的位置;
    • href:表示对资源的 引用,建立当前元素或当前文档和外部资源之间的链接关系。

    src

    src(Source) 属性仅仅表示会在此文档当前元素的位置上嵌入资源,它会 暂停其他资源的下载和处理。比如,当浏览器读到:

    <script src="script.js"></script>
     

    那么浏览器会暂停当前页面的加载,直到获取、解析并执行完这个 JS 文件。它类似于将 JS 文件的内容转存到 <script> 标签中。

    提示

    这就是为什么需要将 <script> 标签放到最后。

    <img> 标签也类似,它是一个空标签,包含的内容由 src 属性定义,当遇到这个标签,浏览器也会停止加载页面,直到获取并加载这个图片。

    类似的,<iframe> 标签也一样。

    href

    href(Hypertext Reference) 属性即超文本引用,它会指定 Web 资源的位置,从而定义当前链接(<a> 标签)或当前文档(link 标签)与目标之间的联系,不会暂停对当前文档的解析

    比如:

    <link href="style.css" rel="stylesheet" />
     

    浏览器会知道这是个 CSS 文件,HTML 的解析 不会 暂停,但是渲染有可能暂停,因为浏览器需要知道样式规则。

    - + diff --git a/frontend/basic/html/010-html5.html b/frontend/basic/html/010-html5.html index 94d3a8428f..91da42107b 100644 --- a/frontend/basic/html/010-html5.html +++ b/frontend/basic/html/010-html5.html @@ -30,11 +30,11 @@ HTML5 新特性 - +
    跳至主要內容

    HTML5 新特性

    njrHTMLHTML5小于 1 分钟约 85 字

    HTML5 总共以下新特性,但不支持 IE8 及以下版本浏览器。

    1. 语义化标签
    2. 增强型表单
    3. 视频和音频
    4. Canvas 绘图
    5. SVG 绘图
    6. 地理定位 API
    7. 拖拽 API
    8. WebWorker
    9. WebStorage
    10. WebSocket
    11. 选择器 query.selectorquery.selectorAll
    - + diff --git a/frontend/basic/html/011-defer-vs-async.html b/frontend/basic/html/011-defer-vs-async.html index 3f4f36842c..c38e0737d8 100644 --- a/frontend/basic/html/011-defer-vs-async.html +++ b/frontend/basic/html/011-defer-vs-async.html @@ -30,11 +30,11 @@ defer 和 async 的区别 - +
    跳至主要內容

    defer 和 async 的区别

    njrHTMLHTML小于 1 分钟约 254 字

    HTML 中在页面插入 JavaScript 的主要方式就是使用 <script> 元素,可以直接在页面中嵌入 JavaScript 代码,但是一般来说,通常会通过 src 属性来引入外部脚本。

    src 和 href 的区别 中提到了 src 会暂停当前页面的加载,直到获取、解析并执行完这个 JS 文件。这样就会阻塞后续文档的加载。

    而使用 deferasync 都可以 异步加载 外部的 JavaScript 脚本,主要区别如下:

    • 执行顺序:多个带 async 属性的标签,不能保证加载的顺序;多个带 defer 属性的标签,按照加载顺序执行;
    • 脚本何时执行async 属性表示脚本加载完成后立即执行,不会等到文档解析完成。defer 属性表示脚本加载完成后还需等到所有元素解析完成,即 DOMContentLoaded 事件触发前完成。
    - + diff --git a/frontend/basic/html/012-form-validation.html b/frontend/basic/html/012-form-validation.html index 4d0d60011f..36c725adf1 100644 --- a/frontend/basic/html/012-form-validation.html +++ b/frontend/basic/html/012-form-validation.html @@ -30,7 +30,7 @@ 表单数据校验 - + @@ -494,6 +494,6 @@ false )

    一些校验库

    - + diff --git a/frontend/basic/html/013-seo.html b/frontend/basic/html/013-seo.html index 4e0c1521ae..a1cf26dd81 100644 --- a/frontend/basic/html/013-seo.html +++ b/frontend/basic/html/013-seo.html @@ -30,11 +30,11 @@ SEO - +
    跳至主要內容

    SEO

    njrHTMLseo大约 4 分钟约 1109 字

    什么是 SEO

    SEO(Search Engine Optimization,搜索引擎优化)。这是一套指导原则,旨在使网站在搜索结果中的排名高于其他网站。特别是针对有机(未付费)搜索结果。

    提示

    谷歌是迄今为止全球最主要的搜索引擎。作为行业领导者,谷歌为其他搜索引擎定下了基调。

    过去

    在 2000 年代,搜索引擎优化意味着通过一系列肮脏的手段来提高网站在谷歌上的排名。

    例如,人们在网页底部放置大量关键词列表。有时,他们还会将关键词重复 1000 次,并将其放在白色区域或隐形 div 内。谷歌被欺骗了,从而提高了他们的排名。

    这种时代已经一去不复返了。谷歌聘请了世界上最优秀的人才,确保用户只能搜索到最有用的网页。

    上述漏洞以及更多漏洞在 谷歌质量指南open in new window 中都有详细说明。

    如果您的产品出于某种原因包含任何违反这些指南的内容,即使它们是不小心出现的,我也强烈建议将其删除,因为谷歌现在会对违反指南的网站进行惩罚。

    搜索引擎优化

    谷歌的排名算法非常复杂。谷歌的专家多年来一直在研究这些算法。如今,谷歌每天都会进行更新,更大的更新每年发布一到两次。

    有关 Google 如何对网页进行排名的信息一直在发布,有时还会有额外的信息泄露。一些网站试图跟踪这些更新,了解更新对搜索引擎优化的影响。

    对于开发人员来说,许多工具都可以抓取网站,并生成一份可以改进的网站技术方面的清单。例如,如果你没有使用正确的标题或状态代码。以下是其中几种工具:

    最佳实践

    作为开发人员,应该考虑:快速,可访问性,使用正确的语义 html 标签,包括正确的结构化数据,移动友好,使用 httpsurl 清晰,等等。

    谷歌 SEO 指南open in new window 有详细介绍,下面是一些较为重要的最佳实践。

    • <title><meta name="description"> 是控制网页在 Google 结果页面上显示方式的标签。
    • HTML 标签(如标题标签 h1h2)和 HTML 属性(如 <img> 标签上的 alt 属性)可帮助创建网页结构,以便爬虫更好地解读内容。
    • 结构化数据将网页中的信息,如排名、位置、营业时间和价格等,显示在谷歌搜索页面上。搜索页面上出现的信息越多,网页被点击的几率就越高。
    • 使网站对移动设备友好。
    • 使用 HTTPS 协议。
    • 让残疾人也能访问您的网站。这样不仅能让更多人访问你的网站,谷歌也会给你更高的排名。
    • 使用合理且有意义的网站分层。example.com/RunningShoes/Womens而不是 example.com/123123/123123
    • 注意你的 <a href> 链接
      • 每个链接都必须包含有意义的文本。
      • 使用 <a> 标签上的额外属性告诉谷歌你的外部网站链接的性质。例如,rel="nofollow" 用于让谷歌知道你与链接的网站没有关联。
      • 确保您希望谷歌抓取的每个页面都通过 <a href> 从主页链接(可能通过多个链接)。
    • 确保不同版本之间的内容不重复,以免相互竞争:
      • 如果您对网站进行了结构调整,请使用 301 重定向,这样两个版本就不会被分别收录,也不会相互竞争。
      • 坚持使用一个版本的网站链接:
      • 使用 <meta rel="canonical"> 标签来表示不同的页面和 URL 包含相同的内容。
    • 本地化——使用 hreflang meta 标签告诉谷歌一个网页在不同语言中有不同的版本。
    • 提高网站速度,在 Google PageSpeed Insightsopen in new window 上获得高分。

    提示

    网站响应速度会影响搜索引擎排名,这一部分涉及到性能优化。

    - + diff --git a/frontend/basic/html/index.html b/frontend/basic/html/index.html index 1f8e34b29e..68311e4688 100644 --- a/frontend/basic/html/index.html +++ b/frontend/basic/html/index.html @@ -30,11 +30,11 @@ HTML - +
    跳至主要內容

    HTML

    njr小于 1 分钟约 146 字

    - + diff --git a/frontend/basic/index.html b/frontend/basic/index.html index 61bffd0468..d2487b4bb4 100644 --- a/frontend/basic/index.html +++ b/frontend/basic/index.html @@ -30,11 +30,11 @@ 前端基础知识 - +
    跳至主要內容

    前端基础知识

    njr小于 1 分钟约 20 字

    前端基础知识

    这里是关于前端基础知识的文章。

    - + diff --git a/frontend/basic/javascript/001-var-let-const.html b/frontend/basic/javascript/001-var-let-const.html index ad0faa33c5..1d190d08d6 100644 --- a/frontend/basic/javascript/001-var-let-const.html +++ b/frontend/basic/javascript/001-var-let-const.html @@ -30,7 +30,7 @@ var、let、const 区别 - + @@ -40,6 +40,6 @@ let y = { y: y } console.log(y.y)

    此时第一个会打印 undefined,第二个会报错。这是由于 var 有变量提升,而 let 存在暂时性死区。

    暂时性死区

    letconst 在声明变量之前,不能以任何方式使用该变量。在 letconst 声明之前的执行瞬间被称为「暂时性死区」。

    在此阶段引用任何后面才声明的变量都会抛出错误。

    总结

    总之,使用 letconst 即可。

    - + diff --git "a/frontend/basic/javascript/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html" "b/frontend/basic/javascript/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html" index eac5c4cc5b..1361d48e74 100644 --- "a/frontend/basic/javascript/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html" +++ "b/frontend/basic/javascript/0011\343\200\201\345\210\244\346\226\255\345\257\271\350\261\241\345\200\274\347\233\270\347\255\211.html" @@ -30,7 +30,7 @@ 判断对象值相等 - + @@ -70,6 +70,6 @@ return Object.prototype.toString.call(obj).slice(8, -1); }

    检查对象的“值相等”最好还是依靠完善的工具库,涵盖了各种边界情况。比如 Underscore 和 Lodash。

    - + diff --git "a/frontend/basic/javascript/0012\343\200\201AJAX.html" "b/frontend/basic/javascript/0012\343\200\201AJAX.html" index e2b84115fe..ac4ffcd002 100644 --- "a/frontend/basic/javascript/0012\343\200\201AJAX.html" +++ "b/frontend/basic/javascript/0012\343\200\201AJAX.html" @@ -30,7 +30,7 @@ AJAX - + @@ -75,6 +75,6 @@ } }
    - + diff --git "a/frontend/basic/javascript/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html" "b/frontend/basic/javascript/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html" index 5aa9193ef8..908cab5b38 100644 --- "a/frontend/basic/javascript/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html" +++ "b/frontend/basic/javascript/0014\343\200\201\346\265\205\346\213\267\350\264\235\344\270\216\346\267\261\346\213\267\350\264\235.html" @@ -30,7 +30,7 @@ 浅拷贝与深拷贝 - + @@ -109,6 +109,6 @@ ^ RangeError: Maximum call stack size exceeded
    - + diff --git "a/frontend/basic/javascript/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html" "b/frontend/basic/javascript/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html" index 297fbbf6e9..a531ee4b35 100644 --- "a/frontend/basic/javascript/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html" +++ "b/frontend/basic/javascript/0017\343\200\201\344\272\213\344\273\266\345\276\252\347\216\257.html" @@ -30,11 +30,11 @@ 事件循环 - +
    跳至主要內容

    事件循环

    njrJavaScript事件循环大约 2 分钟约 619 字

    浏览器的进程模型

    JavaScript 是一个单线程的脚本语言,同一时间只能做一件事情。而为了协调事件、用户交互、脚本、渲染、网络等等,每个浏览器都有一个相关联的事件循环。

    事件循环的一个循环将从宏任务队列中正在处理一个任务(这个队列在 WHATWG 规范中简称为任务队列)。在这个宏任务完成之后,所有可用的微任务都将被处理,即在同一个周期内。在处理这些微任务时,它们可以排列更多的微任务,这些任务将一个接一个地运行,直到微任务队列耗尽。

    一个事件循环有一些任务队列。微任务队列不是任务队列

    函数调用会形成一个调用栈,当函数调用结束后,当前函数会被弹出调用栈。

    在函数执行的过程中,如果有异步任务,它们会发送给 web APIs,比如 settimeout 函数,当它在栈中执行时,会发送给对应的浏览器 API,在等待相应的时间后,他就会将回调函数放入事件队列。

    JavaScript 本身是一个单线程的,但是 web APIs 相当于另一个线程。

    事件循环会总是检查调用栈是否为空,如果为空,它就会将队列最前面的任务出队,放入执行栈中调用,如果不为空,那么继续执行当前的函数调用。

    异步任务的返回结果会被放到一个任务队列中,根据异步事件的类型,这个事件实际上会被放到对应的宏任务和微任务队列中去。

    简单总结一下执行的顺序:

    1. 检查宏任务队列是否为空,不为空则取出一个任务执行,然后执行第 2 步;为空则判断当前执行栈是否为空,然后执行第 2 步;
    2. 检查微任务队列是否为空,不为空则取出任务执行,直到清空微任务队列,之后执行视图更新;为空则直接执行视图更新,并回到第一步。
    事件循环
    事件循环

    宏任务:

    1. 整个 script 中的代码
    2. setTimeout
    3. setInterval
    4. I/O
    5. UI 交互事件

    微任务:

    1. promise.then .catch
    2. mutationObserver
    3. async await
    - + diff --git a/frontend/basic/javascript/002-types.html b/frontend/basic/javascript/002-types.html index 4684cc1b16..d7e5aed7a4 100644 --- a/frontend/basic/javascript/002-types.html +++ b/frontend/basic/javascript/002-types.html @@ -30,7 +30,7 @@ 数据类型 - + @@ -136,6 +136,6 @@ // ↪ 9007199254740991n

    因为 BigIntNumber 是两种不同的类型,因此:

    Object

    可以通过创建 Object 类型的实例来创建自己的对象,然后再给对象添加属性和方法:

    let o = new Object();
     

    每个 Object 实例都有如下属性和方法:

    注意

    严格来讲,ECMA-262 中对象的行为不一定适合 JavaScript 中的其他对象。

    比如浏览器环境中的 BOM 和 DOM 对象,都是由宿主环境定义和提供的宿主对象。

    而宿主对象不受 ECMA-262 约束,所以它们可能会也可能不会继承 Object

    - + diff --git a/frontend/basic/javascript/003-judge-type.html b/frontend/basic/javascript/003-judge-type.html index aab96d39ae..8d3932118b 100644 --- a/frontend/basic/javascript/003-judge-type.html +++ b/frontend/basic/javascript/003-judge-type.html @@ -30,7 +30,7 @@ 判断数据类型 - + @@ -83,6 +83,6 @@ return Object.prototype.toString.call(obj).slice(8, -1) }
    - + diff --git a/frontend/basic/javascript/004-primitive-value-reference-value.html b/frontend/basic/javascript/004-primitive-value-reference-value.html index 3ab91dcacb..9623fb5579 100644 --- a/frontend/basic/javascript/004-primitive-value-reference-value.html +++ b/frontend/basic/javascript/004-primitive-value-reference-value.html @@ -30,7 +30,7 @@ 原始值和引用值 - + @@ -67,6 +67,6 @@ foo: | - o: 0x01 ->

    这里也声明了一个对象,不同的是,foo 函数直接修改了 o 的值,将内存地址变为一个普通原始值 2,但是这里并没有对外部的 obj 地址进行修改,因此 console.log(obj.value) 仍然打印 1

    - + diff --git a/frontend/basic/javascript/005-execution-context.html b/frontend/basic/javascript/005-execution-context.html index c2917083e8..5823b6b417 100644 --- a/frontend/basic/javascript/005-execution-context.html +++ b/frontend/basic/javascript/005-execution-context.html @@ -30,7 +30,7 @@ 执行上下文 - + @@ -159,6 +159,6 @@ bar(123) console.log(foo) // 1

    运行 bar 函数的时候将 123 数字作为实参传入,所以操作的还是本地作用域的 foo

    参考链接

    - + diff --git a/frontend/basic/javascript/006-toString-toLocalString-valueOf.html b/frontend/basic/javascript/006-toString-toLocalString-valueOf.html index 9aad12b704..d38cbabdd4 100644 --- a/frontend/basic/javascript/006-toString-toLocalString-valueOf.html +++ b/frontend/basic/javascript/006-toString-toLocalString-valueOf.html @@ -30,7 +30,7 @@ 对象转换方法 - + @@ -52,6 +52,6 @@ console.log(obj.valueOf()) // 输出 123

    自动调用顺序

    在 JavaScript 内部,当需要将对象转换为原始值时(比如在算术运算、逻辑运算、字符串拼接等情况下),会自动调用对象的 valueOf()toString() 方法来获取原始值。它们的调用顺序如下:

    1. 如果对象具有 valueOf() 方法且返回的是原始值(非对象),则直接使用该值。
    2. 如果对象没有 valueOf() 方法,或者 valueOf() 返回的是对象,那么会调用对象的 toString() 方法。
    3. 如果对象没有 toString() 方法,或者 toString() 返回的是对象,那么会抛出 TypeError 错误。

    注意

    valueOf()toString() 方法在不同的上下文中可能会有不同的表现,具体取决于 JavaScript 引擎的实现和调用方式。

    总结

    这三种方法用于获得对象的字符串或原始值,在一些情况下会被 JavaScript 引擎自动调用,区别如下:

    - + diff --git a/frontend/basic/javascript/007-basic-reference-type.html b/frontend/basic/javascript/007-basic-reference-type.html index 6b887f5f39..c7181c13bc 100644 --- a/frontend/basic/javascript/007-basic-reference-type.html +++ b/frontend/basic/javascript/007-basic-reference-type.html @@ -30,7 +30,7 @@ 基本引用类型 - + @@ -142,6 +142,6 @@ console.log(message.includes('bar')) // true console.log(message.includes('qux')) // false
    - + diff --git a/frontend/basic/javascript/008-collection-reference-type.html b/frontend/basic/javascript/008-collection-reference-type.html index e93dc8e42d..12235de645 100644 --- a/frontend/basic/javascript/008-collection-reference-type.html +++ b/frontend/basic/javascript/008-collection-reference-type.html @@ -30,7 +30,7 @@ 集合引用类型 - + @@ -263,6 +263,6 @@ // 通过加入对应集合,给这个节点打上“禁用”标签 disabledElements.add(loginButton);

    这样,只要 WeakSet 中任何元素从 DOM 树中被删除,垃圾回收程序就可以忽略其存在,而立即释放其内存(假设没有其他地方引用这个对象)。

    - + diff --git a/frontend/basic/javascript/009-array-like-object.html b/frontend/basic/javascript/009-array-like-object.html index 093c1d3589..07034d8620 100644 --- a/frontend/basic/javascript/009-array-like-object.html +++ b/frontend/basic/javascript/009-array-like-object.html @@ -30,7 +30,7 @@ 类数组对象 - + @@ -69,6 +69,6 @@ // 展开运算符 [...arrLike]
    - + diff --git a/frontend/basic/javascript/010-object-property.html b/frontend/basic/javascript/010-object-property.html index 9ac4d54924..3a4d931830 100644 --- a/frontend/basic/javascript/010-object-property.html +++ b/frontend/basic/javascript/010-object-property.html @@ -30,7 +30,7 @@ 对象属性 - + @@ -90,6 +90,6 @@ // configurable: false // }

    提示

    Vue 中的计算属性就是访问器属性中的 getter()setter

    - + diff --git a/frontend/basic/javascript/011-create-object.html b/frontend/basic/javascript/011-create-object.html index fd20f6b168..fe2d6edb65 100644 --- a/frontend/basic/javascript/011-create-object.html +++ b/frontend/basic/javascript/011-create-object.html @@ -30,7 +30,7 @@ 创建对象 - + @@ -185,6 +185,6 @@ console.log(person1.friends) // [ 'neymar', 'hou' ] console.log(person2.friends) // [ 'messi', 'wang' ]

    此时不仅可以传递初始化参数,而且修改各自的 friends 属性都互不影响。

    总结

    以上就是 JavaScript 中创建对象的四种主要方式,包括工厂模式、构造函数模式、原型模式及组合使用构造函数和原型模式。让我们来回忆一下前面三种各自的缺点:

    - + diff --git a/frontend/basic/javascript/012-extends.html b/frontend/basic/javascript/012-extends.html index 570214800e..2d980266a7 100644 --- a/frontend/basic/javascript/012-extends.html +++ b/frontend/basic/javascript/012-extends.html @@ -30,7 +30,7 @@ 继承 - + @@ -228,6 +228,6 @@ console.log(this.name, ' studying~') }













     
     



     
     




    寄生式组合继承即使用盗用构造函数继承属性,使用寄生式继承避免调用父类构造函数,效率更高。

    - + diff --git a/frontend/basic/javascript/013-class.html b/frontend/basic/javascript/013-class.html index 23622c93bf..e04e909b7b 100644 --- a/frontend/basic/javascript/013-class.html +++ b/frontend/basic/javascript/013-class.html @@ -30,7 +30,7 @@ - + @@ -228,6 +228,6 @@ b.bar() // bar b.baz() // baz

    注意

    很多 JavaScript 框架(特别是 React)已经抛弃混入模式,转向了组合模式(把方法提取到独立的类和辅助对象中,然后把它们组合起来,但不使用继承)。

    这反映了那个众所周知的软件设计原则:「组合胜过继承(composition over inheritance)。」这个设计原则被很多人遵循,在代码设计中能提供极大的灵活性。

    - + diff --git a/frontend/basic/javascript/014-implement-new.html b/frontend/basic/javascript/014-implement-new.html index abfbb93475..23c4b87b12 100644 --- a/frontend/basic/javascript/014-implement-new.html +++ b/frontend/basic/javascript/014-implement-new.html @@ -30,7 +30,7 @@ 手写 new 操作符 - + @@ -57,6 +57,6 @@ const person = newOperator(Person, 'wang', 18) console.log(person) // Person { name: 'wang', age: 18 }
    - + diff --git a/frontend/basic/javascript/015-function.html b/frontend/basic/javascript/015-function.html index a8f3de7ad3..0f8ddb9a7e 100644 --- a/frontend/basic/javascript/015-function.html +++ b/frontend/basic/javascript/015-function.html @@ -30,7 +30,7 @@ 函数 - + @@ -264,6 +264,6 @@ return object })()
    - + diff --git a/frontend/basic/javascript/016-this.html b/frontend/basic/javascript/016-this.html index f44d5e713f..3052970519 100644 --- a/frontend/basic/javascript/016-this.html +++ b/frontend/basic/javascript/016-this.html @@ -30,7 +30,7 @@ this 指向 - + @@ -181,6 +181,6 @@ this.data = result }, 2000)

    参考链接

    - + diff --git a/frontend/basic/javascript/017-implement-call-apply-bind.html b/frontend/basic/javascript/017-implement-call-apply-bind.html index 669c466ed5..607c282269 100644 --- a/frontend/basic/javascript/017-implement-call-apply-bind.html +++ b/frontend/basic/javascript/017-implement-call-apply-bind.html @@ -30,7 +30,7 @@ 手写 call、apply、bind - + @@ -86,6 +86,6 @@ } }

    总结

    手写 callapplybind 的步骤大致相同,只是 bind 多了一个收集参数的过程:

    1. 处理 thisArg;
    2. 获取待执行函数;
    3. 执行函数(bind() 还有一个收集参数的过程)。

    无论是在获取函数还是执行函数(改变 this)的过程中,都是利用了隐式绑定改变 this 指向的规则。

    - + diff --git a/frontend/basic/javascript/index.html b/frontend/basic/javascript/index.html index e9d971bc3e..82a806bc7f 100644 --- a/frontend/basic/javascript/index.html +++ b/frontend/basic/javascript/index.html @@ -30,11 +30,11 @@ JavaScript - +
    跳至主要內容

    JavaScript

    njr小于 1 分钟约 108 字

    - + diff --git a/frontend/browser/01-how-browser-rendering-works.html b/frontend/browser/01-how-browser-rendering-works.html index df31f8eaba..34c75c6b26 100644 --- a/frontend/browser/01-how-browser-rendering-works.html +++ b/frontend/browser/01-how-browser-rendering-works.html @@ -30,7 +30,7 @@ 浏览器渲染原理 - + @@ -41,6 +41,6 @@ </body> </html>
    dom-tree
    dom-tree

    HTML 解析算法包括两个阶段:

    1. 标记化:词法分析,将输入解析为标记。HTML 标记包括开始标记、结束标记、属性名称和属性值。标记器识别 token,将它传递给树构造器,然后接受下一个字符以识别下一个标记,直到输入的结束。
    2. 树构建:构建成 DOM 树。
    html-parse
    html-parse

    CSS 解析器

    解析器都会将 CSS 文件解析成 StyleSheet 对象,且每个对象都包含 CSS 规则。CSS 规则对象则包含选择器和声明对象,以及其他与 CSS 语法对应的对象。

    css-parse
    css-parse

    Render Tree

    在 DOM 树构建的同时,浏览器还会构建另一个树结构:呈现树。这是由可视化元素按照其显示顺序而组成的树,也是文档的可视化表示。它的作用是让您按照正确的顺序绘制内容。

    Render Tree 和 DOM Tree 并不是一一对应的,非可视化的 DOM 元素不会插入呈现树中,例如 head 元素。如果元素的 display 属性值为 none,那么也不会显示在呈现树中(但是 visibility 属性值为 hidden 的元素仍会显示)。

    render-tree
    render-tree

    接下来浏览器需要做的就是计算样式,将每一个 Render 对象的可视化属性计算(根据一系列规则,如层叠性、选择器权重等)出来,但是在这个过程中,并不包含位置和大小信息。计算这些值的过程叫做布局或回流。

    总之,到目前为止,渲染引擎已经经历了一系列的工作,可以将页面展示到浏览器上了。

    参考链接

    1. How Browsers Work: Behind the scenes of modern web browsers - HTML5 Rocksopen in new window
    2. 浏览器的渲染原理简介open in new window
    3. JavaScript 引擎 - 维基百科open in new window
    4. 浏览器引擎 - 维基百科open in new window
    5. 浏览器内核及分类 - 腾讯云社区open in new window
    - + diff --git a/frontend/browser/02-V8.html b/frontend/browser/02-V8.html index cf7d7d1a9a..af5f6bdea3 100644 --- a/frontend/browser/02-V8.html +++ b/frontend/browser/02-V8.html @@ -30,7 +30,7 @@ V8 引擎 - + @@ -52,6 +52,6 @@ add(1, 1) add('1', '2')

    到此,V8 引擎的工作流程就已经完成了,但是还没有细究里面的执行细节,只是大概地了解了工作流程,等以后能完全看懂官方文章了再回来更新。

    参考链接

    1. JavaScript 引擎 - 维基百科open in new window
    2. JavaScript 深入浅出第 4 课:V8 引擎是如何工作的?open in new window
    3. Blazingly fast parsing, part 1: optimizing the scanneropen in new window
    4. Blazingly fast parsing, part 2: lazy parsing · V8open in new window
    5. Firing up the Ignition interpreter · V8open in new window
    6. JavaScript 引擎 V8 执行流程概述open in new window
    - + diff --git a/frontend/browser/03-memory-management.html b/frontend/browser/03-memory-management.html index cb531123c5..cd89dbe585 100644 --- a/frontend/browser/03-memory-management.html +++ b/frontend/browser/03-memory-management.html @@ -30,7 +30,7 @@ 内存管理 - + @@ -50,6 +50,6 @@ f()

    在执行 f() 时,创建了两个对象并相互引用。函数执行结束后,会离开函数作用域,因此它们已经没有用了,按照常理来说应该被销毁。但是因为它们至少都有一次引用,所以不会被回收,造成内存泄露。

    标记清除算法

    这个算法把「对象是否不再需要」简化定义为「对象是否可以获得」,简称「可达性」。

    这个算法假定设置一个叫做根(root)的对象(在 Javascript 里,根是全局对象)。垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象。

    在上图中,gh 对象互相引用,如果采用 引用计数算法,那么这两个对象将不会被垃圾回收。但是使用标记清除算法,因为根对象没有对它们引用,因此会被垃圾回收。这样,循环引用的问题就不存在了。

    V8 垃圾回收机制

    在过去几年,V8 垃圾回收发生了很多变化。以前的垃圾回收器是一个连续的过程,在进行垃圾回收的过程中会暂停其他活动(全停顿,stop-the-world),而现在 V8 的垃圾回收器转变成了具有 增量回退并行并发 垃圾回收器。

    任何垃圾回收器都会执行下面几个基本任务:

    1. 标记 活动对象和非活动对象

    2. 回收或者重排 非活动对象占据的内存

    3. 合并或者整理 内存(可选)

    这些任务可以按顺序执行,也可以任意交错执行。一种直接的方法是暂停 JavaScript 执行,并在主线程上按顺序执行这些任务。这可能会导致主线程出现卡顿和延迟问题,并降低程序吞吐量。

    V8 内存限制

    在介绍 V8 垃圾回收机制之前,我们先来探讨一下为什么需要垃圾回收。

    分代堆布局

    V8 中的堆被分成不同的区域,称为代:分为新生代(进一步分为 nurseryintermediate),和一个老生代。对象首先被分配到 nursery。如果它们在下一个 GC 中幸存下来,这时候我们把它们移动到 intermediate 子代,如果再经过下一次垃圾回收这个对象仍然存活,这时候我们就会把这个对象移动到老生代(这个策略称为 对象晋升策略)。

    generations
    generations

    提示

    在垃圾回收中有一个重要的术语:「代际假说」,指大多数对象在新生代就会被回收。从垃圾回收的角度来看,大部分对象一经分配之后就几乎马上变成不可达状态。

    根据 V8 堆中分为不同的区域,可以容易地想到 V8 有两个不同的垃圾回收器:清理新生区的副垃圾回收器和清理老生区的主垃圾回收器。

    下面就一一介绍 V8 中的两个垃圾回收器。

    副垃圾回收器——清道夫(Scavenge)

    副垃圾回收器(Scavenger)从新生代中回收垃圾。

    在清理时,初始的空闲区域称之为 To-Space,复制对象过来的区域称之为 From-Space;在最坏的情况下,如果每一个对象在清理的时候存活了下来,那我们就要从 From-Space 复制每一个对象到 To-Space 中。

    清除步骤(Evacuation)会将所有的活动对象移动到连续的一块内存中,并且标记它们(图中的小圆圈,代表已经经历过一次 GC);然后会将两块内存空间互换,即把 To-Space 变成 From-SpaceFrom-Space 变成 To-Space

    Scavenge-1
    Scavenge-1

    如果仅仅是凭借这一策略,我们就会很快的耗尽新生代的内存空间;为了新生代的内存空间不被耗尽,在下一次垃圾回收的时候,我们会把活动对象移动(evacuate)到老生代,而不是 To-Space

    在下图中,两块内存空间已经互换,而且 From-Space 又有一个新的对象,假定这个对象在第一次 GC 时存活了下来,那么它将被复制到 To-Space 中。而 From-Space 中已经经历过一次 GC 的对象(通过这个小圆圈的标记得知),假如它们又存活下来,则会被复制到老生区(对象晋升策略)。

    Scavenge 的最后一步是把移动后的对象的指针地址更新,每一个被复制对象都会留下一个转发地址(forwarding-address),用于更新指针以指向新的地址。

    Scavenge-2
    Scavenge-2

    在副垃圾回收器回收过程中,实际上执行了三个步骤:标记、清除和指针更新。

    主垃圾回收器 —— 全量标记和整理(Full Mark-Compact)

    主垃圾回收器从整个堆(heap)中收集垃圾。

    three-phases
    three-phases

    标记阶段是利用对象的可达性确定对象是否活跃。从初始的根对象开始,垃圾回收器会跟踪每一个指向其他对象的指针,将其标记为可访问的,同时跟踪对象中每一个属性的指针。整个过程递归进行,直到标记到运行时每一个可访问的对象。

    marking
    marking

    清除阶段将非活动对象进行清除。

    sweeping
    sweeping

    一般来说,频繁回收对象后,内存中就会存在大量不连续空间,我们把这些不连续的内存空间称为内存碎片。当内存中出现了大量的内存碎片之后,如果需要分配较大连续内存的时候,就有可能出现内存不足的情况。所以最后一步需要整理这些内存碎片,但这步其实是可选的,因为有的垃圾回收器不会产生内存碎片。

    compaction
    compaction

    Orinoco

    Orinoco 是 V8 垃圾回收器项目的代号,它利用最新的和最好的垃圾回收技术来降低主线程挂起的时间, 比如:并行(parallel)垃圾回收,增量(incremental)垃圾回收和并发(concurrent)垃圾回收。

    2011 年,V8 从 stop-the-world 标记切换到增量标记。

    2018 年,GC 技术又有了一个重大突破,这项技术名为并发标记。在 Chrome 64 和 Node.js v10 中已启用,它将标记时间缩短了 60%~70%。还有并行技术,它将新生代的垃圾回收时间缩短了 20%~50%。

    并行垃圾回收(Parallel)

    并行是主线程和协助线程同时执行同样的工作,但是这仍然是一种 stop-the-world 的垃圾回收方式,但是垃圾回收全停顿时间等于总时间除以参与的线程数量(加上一些同步开销)。

    parallel
    parallel

    增量垃圾回收(Incremental)

    增量式垃圾回收是主线程间歇性的去做少量的垃圾回收的方式。同时让垃圾回收和 JavaScript 应用逻辑交替进行,这意味着堆的状态可能已经发生了变化,有可能会导致之前的增量回收工作完全无效。

    从图中可以看出并没有减少主线程暂停的总时间(事实上,通常会略微增加)。通过允许 JavaScript 间歇执行,同时也间歇性地去做垃圾回收工作,应用程序仍然可以在用户输入或者执行动画的时候得到及时的响应。

    incremental
    incremental

    并发垃圾回收(Concurrent)

    并发是主线程持续执行 JavaScript,而辅助线程完全在后台执行垃圾回收。这种方式是这三种技术中最难的一种:JavaScript 堆里面的内容随时都有可能发生变化,从而使之前做的工作完全无效,主线程和辅助线程极有可能在同一时间去更改同一个对象。这种方式的优势也非常明显,主线程不会被挂起,JavaScript 可以自由地执行。

    concurrent
    concurrent

    总结

    首先介绍了内存管理的一般流程,分为三大步:分配、使用、释放。

    然后是 V8 如何分配内存:基本数据类型存放在栈空间,复杂数据类型存放在堆空间,以及为什么要这样做。

    接着又介绍了常见的垃圾回收算法,主要包括引用计数法和标记清除法。

    最后介绍了 V8 的垃圾回收机制以及做出的优化。

    参考链接

    - + diff --git a/frontend/browser/04-cross-domain.html b/frontend/browser/04-cross-domain.html index 8ae488f038..de45532ea7 100644 --- a/frontend/browser/04-cross-domain.html +++ b/frontend/browser/04-cross-domain.html @@ -30,7 +30,7 @@ 跨域 - + @@ -46,6 +46,6 @@ Access-Control-Allow-Headers: FooBar Access-Control-Max-Age: 1728000 本次预检的有效期,秒
    - + diff --git a/frontend/browser/05-what-happens-after-entering-the-URL.html b/frontend/browser/05-what-happens-after-entering-the-URL.html index b6d7013fc8..5aeee09298 100644 --- a/frontend/browser/05-what-happens-after-entering-the-URL.html +++ b/frontend/browser/05-what-happens-after-entering-the-URL.html @@ -30,11 +30,11 @@ 输入 URL 后发生了什么 - +
    跳至主要內容

    输入 URL 后发生了什么

    njrbrowsernetwork大约 3 分钟约 899 字

    先看看大致流程:

    1. 生成 HTTP 请求消息:当用户在浏览器中输入网址,浏览器就会对 URL 进行解析;然后浏览器会根据网址的含义来生成请求消息;
    2. 向 DNS 服务器查询 Web 服务器的 IP 地址:请求消息生成后,浏览器向 DNS 服务器查询域名对应的 IP 地址,然后委托操作系统(浏览器本身并没有网络通讯的能力)向 Web 服务器发送请求。
    3. 委托协议栈发送消息:查询到 IP 地址之后,浏览器就可以将消息委托给操作系统的协议栈(TCP/IP)发送给服务器。
    4. 数字信息转换为电信号:通过协议栈将数据变成网络包后,网卡负责将数字信号转换为电信号。

    生成 HTTP 请求消息

    浏览器要做的第一步工作就是对 URL 进行解析,从而生成发送给 Web 服务器的请求消息。

    Web浏览器解析URL

    省略文件名的情况

    1. http://www.lab.glasscom.com/dir/open in new window

      / 结尾代表访问默认文件,大多数情况下是 index.html 或者 default.htm 之类的文件。

    2. http://www.lab.glasscom.comopen in new window

      省略结尾的 / 符,代表访问服务器根目录下的默认文件,也就是 index.html 或者 default.htm

    3. http://www.lab.glasscom.com/whatisthisopen in new window

      如果 Web 服务器上存在名 whatisthis 的文件,则作为文件名来处理;如果存在名为 whatisthis 的目录,则作为目录名来处。

    生成请求消息

    对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。

    消息格式

    向 DNS 服务器查询域名 IP 地址

    浏览器解析完 URL 并生成请求消息后,需要委托操作系统向服务器发送请求消息。

    但是在这之前,还需要知道服务器域名对应的 IP 地址。因此需要使用 DNS 服务器查询 IP 地址。

    DNS 服务器保存了域名和 IP 的对应关系。

    域名中用 . 来分隔,比如 www.lab.glasscom.com.,越往右层级越高,最后的一个点代表根域名,一般可以省略。

    根域的服务器信息保存在互联网中的所有 DNS 服务器中,这样任意一台服务器都可以找到并访问根服务器,从而找到其它服务器。

    DNS
    DNS

    协议栈

    通过 DNS 获取到服务器的 IP 地址后,浏览器就可以通过 socket 库把 HTTP 报文的传输工作委托给操作系统中的协议栈

    客户端
    客户端

    其中应用程序当然为应用层,协议栈中的 TCP/UDP 为传输层,他们会接收应用程序的委托执行收发数据的操作。

    像浏览器、邮件等一般的应用程序都是使用 TCP 收发数据的,而像 DNS 查询等收发较短的控制数据的时候则使用 UDP。

    在传送数据时,数据会切分成一个个网络包,而 IP 协议为网络层,负责控制网络包的发给通信对象。

    IP 中还包括 ICMP 协议和 ARP 协议。ICMP 用于告知网络包传输过程中产生的错误及各种控制消息,ARP 用于根据 IP 地址查询相应的 MAC 地址。

    网卡

    - + diff --git a/frontend/browser/index.html b/frontend/browser/index.html index 4d98bec6f5..89b1ee1a83 100644 --- a/frontend/browser/index.html +++ b/frontend/browser/index.html @@ -30,11 +30,11 @@ 浏览器 - +
    跳至主要內容

    浏览器

    njr大约 1 分钟约 382 字

    浏览器内核

    浏览器内核是浏览器的核心,也就是浏览器的 排版引擎,分为两部分:

    • 将 HTML 和 CSS 渲染到浏览器上的 渲染引擎
    • 解析 JavaScript 的 JavaScript 引擎

    最开始渲染引擎和 JS 引擎并没有明确的区分,后来 JS 引擎开始独立起来,慢慢发展到现在,内核一般指的是渲染引擎。

    不同的浏览器有不同的内核组成:

    • Gecko:早期是 Netscape 和 Firefox 浏览器的内核;
    • Trident:IE4 - IE11 的内核;
    • Webkit:Safari 内核,Google Chrome 之前也使用过;
    • Blink: Webkit 的一个分支,目前用于 Chrome、Edge、Opera 等。

    JavaScript 引擎

    JavaScript 引擎 是一个专门处理 JavaScript 脚本的虚拟机,一般会附带在网页浏览器之中,能为程序员提供部分操作浏览器的功能(网络、DOM、外部事件、HTML5 视频、canvas 和存储),并且用于将 JavaScript 代码翻译成 CPU 指令。比较常见的引擎有:

    • SpiderMonkey:第一款 JavaScript 引擎,由 Brendan Eich 开发(也就是 JavaScript 作者);
    • Chakra(JScript 引擎):微软开发,用于 IE 浏览器;
    • Chakra(JavaScript 引擎):微软开发,用于 Edge 浏览器;
    • JavaScriptCore:WebKit 中的 JavaScript 引擎,Apple 公司开发,用于 Safari;
    • V8:Google 开发的强大 JavaScript 引擎,C++ 编写。

    目录

    - + diff --git a/frontend/engineering/basic/001-modularization.html b/frontend/engineering/basic/001-modularization.html index 4a9fc0866e..3a6fe9b0b1 100644 --- a/frontend/engineering/basic/001-modularization.html +++ b/frontend/engineering/basic/001-modularization.html @@ -28,13 +28,13 @@ document.documentElement.setAttribute("data-theme", "dark"); } - 模块化 + 模块化 - + -
    跳至主要內容

    模块化

    njr工程化模块化ESMCJSAMDCMD大约 14 分钟约 4104 字

    早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,逐渐暴露出两个问题:

    • 全局污染:不同文件中的函数会相互污染;
    • 依赖混乱:各文件中的函数依赖非常混乱。

    模块化就是为了解决上述问题,最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导出希望暴露的变量、函数、对象等,并能通过某种方式,导入其他模块中的变量、函数或对象等。

    JavaScript 本身直到 ES2015 才推出了自己的模块化方案 —— ES Module。在此之前,为了让 JavaScript 支持模块化,社区中涌现了不同的模块化规范:AMD、CMD、CommonJS 等。

    早期模块化方案

    Window

    在最开始的前端时期,JavaScript 文件之间的通信通常会依靠 window 对象。

    utils.js

    var utils = {
    +    
    跳至主要內容

    模块化

    njr工程化模块化ESMCJSAMDCMD大约 14 分钟约 4106 字

    早期 JavaScript 仅仅作为一个脚本语言,所需的代码通常不会很大。然而随着前端和 JavaScript 的发展,逐渐暴露出两个问题:

    • 全局污染:不同文件中的函数会相互污染;
    • 依赖混乱:各文件中的函数依赖非常混乱。

    模块化就是为了解决上述问题,最终目的是为了将程序拆分为可按需导入的单独模块。在模块中编写属于自己的逻辑代码,拥有自己的作用域,能够导出希望暴露的变量、函数、对象等,并能通过某种方式,导入其他模块中的变量、函数或对象等。

    JavaScript 本身直到 ES2015 才推出了自己的模块化方案 —— ES Module。在此之前,为了让 JavaScript 支持模块化,社区中涌现了不同的模块化规范:AMD、CMD、CommonJS 等。

    早期模块化方案

    Window

    在最开始的前端时期,JavaScript 文件之间的通信通常会依靠 window 对象。

    utils.js

    var utils = {
       format(time) {
         console.log(time)
       }
    @@ -261,6 +261,6 @@
       })
     }
     

    ESM VS CommonJS

    CommonJS 模块加载 js 文件的过程是 运行时 加载的,并且是同步的:

    • 运行时加载意味着是 js 引擎在执行 js 代码的过程中加载模块;
    • 同步的就意味着一个文件没有加载结束之前,后面的代码都不会执行。

    ES Module 加载 js 文件的过程是 编译(解析)时 加载的,并且是异步的:

    • 编译时(解析)时加载,意味着 import 关键字不能和运行时相关的内容放在一起使用;
    • 异步的意味着:JS 引擎在遇到 import 时会去获取这个 js 文件,但是这个获取的过程是异步的,并不会阻塞主线程继续执行。

    CommonJS 通过 module.exports 导出的是一个对象,导出和导入指向的是同一块内存空间,两边修改会同时影响导出对象。

    ES Module 通过 export 导出的是变量本身的引用:JS 引擎会创建模块环境记录,会和导出的变量进行绑定。所以在导出的模块中修改变化,导入的地方可以通过模块环境记录获取最新的值;但是在导入的地方不允许修改变量(直接报错),因为导入它时相当于给一个常量赋值。

    如果 ESM 导出的是一个对象,那么导入的模块也能修改对象中的属性,因为他指向内存空间。

    总结

    本文主要介绍了模块化发展的历程,介绍各种规范如 CommonJS、AMD、CMD、ESM 的使用和对比。

    - + diff --git a/frontend/engineering/basic/002-package-manager.html b/frontend/engineering/basic/002-package-manager.html index 38a475eb15..b87ac05a66 100644 --- a/frontend/engineering/basic/002-package-manager.html +++ b/frontend/engineering/basic/002-package-manager.html @@ -30,11 +30,11 @@ 包管理工具 - + -
    跳至主要內容

    包管理工具

    njr工程化frontendnpmcnpmyarnpnpm小于 1 分钟约 30 字

    - +
    跳至主要內容

    包管理工具

    njr工程化frontendnpmcnpmyarnpnpm小于 1 分钟约 30 字

    + diff --git a/frontend/engineering/basic/003-tool.html b/frontend/engineering/basic/003-tool.html index ddb278a0ff..8a30f21177 100644 --- a/frontend/engineering/basic/003-tool.html +++ b/frontend/engineering/basic/003-tool.html @@ -30,11 +30,11 @@ 工具链 - + -
    跳至主要內容

    工具链

    njr工程化frontend小于 1 分钟约 232 字

    JavaScript

    问题:

    • API 兼容,polyfill: core.js
    • 语法增强(compiler),syntax transformer(regenerator),jsx,tsc...

    babel 代码编译工具

    • @babel/core
    • @babel/preset-env

    source code -- ast

    swc(rust) 对标 babel

    https://github.com/estree/estreeopen in new window

    https://github.com/bramblex/jsjsopen in new window

    CSS

    问题:

    • 语法缺失(循环、判断、拼接)
    • 功能缺失(颜色函数、数学函数、自定义函数)

    sass/less/stylus --> 预处理器 --> css --> postcss(后处理器) --> polyfill、代码压缩、剪枝

    https://postcss.org/open in new window

    20231223162446
    20231223162446

    构建工具

    以 webpack 为例。

    1. 入口:通过入口分析依赖关系;
    2. 开发服务器:webpack serve --> webpack dev server --> express --> 源码变更 --> 浏览器刷新(强制刷新、HMR)websocket
    3. 文件指纹(hash),涉及到缓存,类似 HTTP ETag
    4. sourcemap
    5. ...

    脚手架

    提供界面与交互、提供工程模版

    • cra:深度定制,配置需要 eject 或使用 react-rewired 和 customize-cra
    • vue-cli:支持配置覆盖,折中方案
    • ...
    - +
    跳至主要內容

    工具链

    njr工程化frontend小于 1 分钟约 232 字

    JavaScript

    问题:

    • API 兼容,polyfill: core.js
    • 语法增强(compiler),syntax transformer(regenerator),jsx,tsc...

    babel 代码编译工具

    • @babel/core
    • @babel/preset-env

    source code -- ast

    swc(rust) 对标 babel

    https://github.com/estree/estreeopen in new window

    https://github.com/bramblex/jsjsopen in new window

    CSS

    问题:

    • 语法缺失(循环、判断、拼接)
    • 功能缺失(颜色函数、数学函数、自定义函数)

    sass/less/stylus --> 预处理器 --> css --> postcss(后处理器) --> polyfill、代码压缩、剪枝

    https://postcss.org/open in new window

    20231223162446
    20231223162446

    构建工具

    以 webpack 为例。

    1. 入口:通过入口分析依赖关系;
    2. 开发服务器:webpack serve --> webpack dev server --> express --> 源码变更 --> 浏览器刷新(强制刷新、HMR)websocket
    3. 文件指纹(hash),涉及到缓存,类似 HTTP ETag
    4. sourcemap
    5. ...

    脚手架

    提供界面与交互、提供工程模版

    • cra:深度定制,配置需要 eject 或使用 react-rewired 和 customize-cra
    • vue-cli:支持配置覆盖,折中方案
    • ...
    + diff --git a/frontend/engineering/basic/004-project-standards.html b/frontend/engineering/basic/004-project-standards.html index 55d950170e..3921777d1c 100644 --- a/frontend/engineering/basic/004-project-standards.html +++ b/frontend/engineering/basic/004-project-standards.html @@ -30,11 +30,11 @@ 项目规范 - + -
    跳至主要內容

    项目规范

    njr工程化frontend代码规范大约 8 分钟约 2332 字

    代码规范

    editorconfig

    EditorConfig 有助于跨不同编辑器和 IDE 为处理同一项目的多个开发人员维护一致的编码风格。

    VSCode 需要安装 EditorConfig for VS Code 插件。

    .editorconfig

    # http://editorconfig.org
    +    
    跳至主要內容

    项目规范

    njr工程化frontend代码规范大约 8 分钟约 2332 字

    代码规范

    editorconfig

    EditorConfig 有助于跨不同编辑器和 IDE 为处理同一项目的多个开发人员维护一致的编码风格。

    VSCode 需要安装 EditorConfig for VS Code 插件。

    .editorconfig

    # http://editorconfig.org
     
     root = true
     
    @@ -207,6 +207,6 @@
       ]
     }
     
    - + diff --git a/frontend/engineering/basic/005-yeoman.html b/frontend/engineering/basic/005-yeoman.html index 6eb046fee4..7d6e96a8a1 100644 --- a/frontend/engineering/basic/005-yeoman.html +++ b/frontend/engineering/basic/005-yeoman.html @@ -30,11 +30,11 @@ yeoman 基础使用 - + -
    跳至主要內容

    yeoman 基础使用

    njr工程化frontendcliyeoman大约 3 分钟约 801 字

    ::: waring

    yo@5.0.0 引入了一个破坏性的更新,会导致 instantiatedGenerator.run is not a functionopen in new window,需要降级到 @4.x

    降级后仍有报错,可能是 generator-node 的问题,垃圾项目没人维护。

    :::

    Yeoman 是一个通用的脚手架系统,允许创建任何类型的应用程序。它可以快速启动新项目,并简化现有项目的维护工作。

    Yeoman 与语言无关。它可以生成任何语言(Web、Java、Python、C# 等)的项目。

    Yeoman 本身不做任何决定。所有决定都由生成器做出,而生成器基本上就是 Yeoman 环境中的插件。有很多公开可用的生成器,创建一个新的生成器来匹配任何工作流程也很容易。Yeoman 始终是满足脚手架需求的正确选择。

    以下是一些常见的使用案例:

    • 快速创建新项目
    • 创建项目的新部分,如带有单元测试的新控制器
    • 创建模块或软件包
    • 引导新服务
    • 执行标准、最佳实践和风格指南
    • 通过让用户使用示例应用程序来推广新项目
    • ...

    开始

    yo 是一款 Yeoman 命令行实用程序,允许使用脚手架模板(简称为生成器)创建项目。使用 npm 安装 yo 和生成器:

    npm install -g yo
    +    
    跳至主要內容

    yeoman 基础使用

    njr工程化frontendcliyeoman大约 3 分钟约 801 字

    ::: waring

    yo@5.0.0 引入了一个破坏性的更新,会导致 instantiatedGenerator.run is not a functionopen in new window,需要降级到 @4.x

    降级后仍有报错,可能是 generator-node 的问题,垃圾项目没人维护。

    :::

    Yeoman 是一个通用的脚手架系统,允许创建任何类型的应用程序。它可以快速启动新项目,并简化现有项目的维护工作。

    Yeoman 与语言无关。它可以生成任何语言(Web、Java、Python、C# 等)的项目。

    Yeoman 本身不做任何决定。所有决定都由生成器做出,而生成器基本上就是 Yeoman 环境中的插件。有很多公开可用的生成器,创建一个新的生成器来匹配任何工作流程也很容易。Yeoman 始终是满足脚手架需求的正确选择。

    以下是一些常见的使用案例:

    • 快速创建新项目
    • 创建项目的新部分,如带有单元测试的新控制器
    • 创建模块或软件包
    • 引导新服务
    • 执行标准、最佳实践和风格指南
    • 通过让用户使用示例应用程序来推广新项目
    • ...

    开始

    yo 是一款 Yeoman 命令行实用程序,允许使用脚手架模板(简称为生成器)创建项目。使用 npm 安装 yo 和生成器:

    npm install -g yo
     

    然后可以安装一些生成器:

    相关信息

    可以在 生成器open in new window 中搜索想要的生成器。

    npm install -g generator-node
     

    基本脚手架

    搭建基本脚手架,只需要去除生成器前缀 generator-

    yo node
     

    大多数生成器会提出一系列问题来定制新项目。要查看哪些选项可用,请使用 help 命令:

    yo node --help
    @@ -42,6 +42,6 @@
     

    为复杂框架搭建脚手架的生成器可能会提供额外的生成器,为项目的较小部分搭建脚手架。这些生成器通常被称为子生成器,访问方式为 generator:sub-generator

    generator-node 为例。一旦生成了完整的 node 应用程序,就可以添加其他功能。要在项目中添加新控制器,请运行控制器子生成器:

    yo node:cli
     

    其他 yo 命令

    除了上一节介绍的基础知识,yo 还是一个完全交互式的工具。只需在终端键入 yo,就能看到一系列选项,用于管理与生成器有关的一切:运行、更新、安装、帮助和其他实用程序。

    yo 还提供以下命令。

    • yo --help 访问完整的帮助界面
    • yo --generators 列出所有已安装的生成器
    • yo --version 获取版本

    故障排除

    大多数问题都可以通过运行:

    yo doctor
     

    doctor 命令将诊断并提供解决最常见问题的步骤。

    - + diff --git a/frontend/engineering/basic/index.html b/frontend/engineering/basic/index.html index d35362d659..780190104b 100644 --- a/frontend/engineering/basic/index.html +++ b/frontend/engineering/basic/index.html @@ -30,11 +30,11 @@ Basic - + -
    跳至主要內容

    Basic

    njr小于 1 分钟约 1 字

    - +
    跳至主要內容

    Basic

    njr小于 1 分钟约 1 字

    + diff --git a/frontend/engineering/build-tool/index.html b/frontend/engineering/build-tool/index.html index 9bb65a7ae3..5f1b80c568 100644 --- a/frontend/engineering/build-tool/index.html +++ b/frontend/engineering/build-tool/index.html @@ -30,11 +30,11 @@ Build Tool - +
    跳至主要內容

    Build Tool

    njr小于 1 分钟约 1 字

    - + diff --git a/frontend/engineering/build-tool/rspack/001-hello-rspack.html b/frontend/engineering/build-tool/rspack/001-hello-rspack.html index 6c13882826..b0786e58f2 100644 --- a/frontend/engineering/build-tool/rspack/001-hello-rspack.html +++ b/frontend/engineering/build-tool/rspack/001-hello-rspack.html @@ -30,7 +30,7 @@ Rspack - + @@ -72,6 +72,6 @@ ] }

    Rspack VS Webpack

    常见语言与资源模块支持对比如下:

    语言/资源支持(Rspack/Webpack)
    CSS"style-loader", "css-loader"
    PostCSS"postcss-loader", "style-loader", "css-loader", "postcss-loader"
    Less"less-loader", "style-loader", "css-loader", "postcss-loader", "less-loader"
    Sass"sass-loader", "style-loader", "css-loader", "postcss-loader", "sass-loader"
    图片type: "asset", type: "asset"
    TS内置 SWC, "ts-loader" or "babel-loader"
    JSX/TSX"babel-loader", "presets": ["@babel/preset-react", "@babel/preset-typescript"]

    阅读 - Bundler 的设计取舍

    原文地址:Bundler 的设计取舍open in new window

    Why We Build Rspack

    原文

    性能始终是 Webpack 绕不开的话题,虽然我们尝试了各种 Webpack 的优化方式,如 swc-loader、esbuild-loader、thread-loader、cache-loader、MFSU、Persistent Cache 等等。

    但是最终就是这些方案虽然可能缓解一部分的性能问题,面对大型项目仍然捉襟见肘,另一方面这些方案导致构建过程更加黑盒化。

    如 Persistent Cache 依赖业务配置良好的 build dependencies,esbuild-loader 不支持 es5 的降级,cache-loader 忘记清理 cache 导致产物没更新。

    优化方式优点缺点
    swc-loaderSWC 是一个用 Rust 编写的超快的 JavaScript/TypeScript 编译器。swc-loader 使 Webpack 可用 SWC 作为编译器,取代 Babel。在处理老版本(如 ES5)的 JavaScript 语法兼容性问题时,可能表现不如 Babel.
    esbuild-loaderesbuild 是一个 JavaScript 打包器和压缩器,速度极快。esbuild-loader 同样替代 Babel,性能提升更大。同上
    thread-loaderthread-loader 允许 Webpack 使用多线程加载和编译,提升构建速度。可能会增加硬件资源(如 CPU 和内存)的使用。对于资源受限的环境(如某些 CI/CD 环境或者低端硬件),可能导致构建失败。
    cache-loadercache-loader 缓存其他 loader 的执行结果。当源文件没有变化时,Webpack 可以直接使用缓存的结果,避免重复工作。忘记清理 cache 导致产物没更新
    MFSU对于不常改变的模块,通过 MFSU 可以预编译并复用它们,缩短构建时间。如果模块数量较大或模块本身较大,预编译所需的时间可能较长,甚至可能导致构建速度下降而非提升。此外,这种优化可能使得代码的调试更为困难。
    Persistent Cache从 Webpack 5 开始,提供了持久化缓存特性。它会在硬盘上保存一些构建信息,对于经常进行的构建任务,来自持久化缓存的信息可使构建速度快很多。如果业务的构建依赖项配置不恰当,Persistent Cache 有可能导致产物与预期不一致,使得构建过程更加“黑盒化”。

    原文

    Rollup 的产物优化能力相比弱了不少,尤其是缺失 Bundle Splitting 等能力导致业务很难做精细的优化,因此内部有不少业务是 dev 下运行 Vite,生产环境用 Webpack,这导致开发和生产存在着较大的差异。

    「产物优化能力」通常指的是一种工具在构建后产生的代码中应用优化的能力。这类优化可以包括 代码压缩(移除无用的代码或者空格、注释)、代码拆分(将大的代码块拆分为多个较小的模块,以实现并行加载或延迟加载)、抽取公共的模块(例如将多次使用的库抽取出来,避免重复打包)、树摇(剔除项目中未引用的代码)等等。

    由于 Rollup 设计之初主要为库作者服务,其支持的一些功能可能没有 Webpack 那么强大。比如,Webpack 提供了非常强大的代码分割(code splitting)和长缓存优化(long term caching optimisation)功能,即你提到的 Bundle Splitting 能力。这些功能对于构建大型、复杂的应用程序非常有用。

    Vite 使用 Rollup 作为生产环境构建工具,它非常适合于小型到中型项目,因为它速度快。但当你面对一个大型项目,可能需要用到更高级的优化手段时,Webpack 可能会是更好的选择。

    How We Build Rspack

    原文

    最终导致转向了 Webpack 架构。

    一等公民

    Rollup 则是只有 Javascript 才是一等公民,而 Webpack 5 支持了更多的一等公民模块。

    插件 API 设计

    插件设计对比:

    插件机制RollupWebpack
    模块转换
    过滤器(filter):即过滤哪些模块进行转换。
    转换器(transformer): 即对过滤模块进行怎样的转换。
    模块类型转换(change module type): 即我们可能需要将一个模块从 A 类型转换成 B 类型。
    三个维度揉进了一个 transform hook 里:
    - 高频的 callback 通信
    - 用户灵活性的丧失
    - 丧失了模块转换逻辑的组合性
    过滤器:rule.test
    转换器:@svgr/webpack loader
    类型转换:inlineMatchResource
    AST 复用--

    Beyond Webpack

    使用 Rust 来实现一套 Webpack 架构(最好能复用 Webpack 生态的插件/loader)的、同时又通过自定义一些具体实现(例如缓存和 swc)来提升构建效率的工具。

    - + diff --git a/frontend/engineering/build-tool/rspack/index.html b/frontend/engineering/build-tool/rspack/index.html index 4ded2370e4..a6956818a1 100644 --- a/frontend/engineering/build-tool/rspack/index.html +++ b/frontend/engineering/build-tool/rspack/index.html @@ -30,11 +30,11 @@ Rspack - +
    跳至主要內容

    Rspack

    njr小于 1 分钟约 1 字

    目录

    - + diff --git a/frontend/engineering/build-tool/vite/001-hello-vite.html b/frontend/engineering/build-tool/vite/001-hello-vite.html index d932defc86..cd51915bf9 100644 --- a/frontend/engineering/build-tool/vite/001-hello-vite.html +++ b/frontend/engineering/build-tool/vite/001-hello-vite.html @@ -30,7 +30,7 @@ Vite 初体验 - + @@ -247,6 +247,6 @@ + "preview": "vite preview" },
    • vite:启动服务。
    • vite build:给项目进行打包。
    • vite preview:打包后进行预览。

    在进行 npm run build 打包后使用 live server 打开后页面显示空白,浏览器报错。需要在 vite.config.js 下配置 base: './'

    总结

    通过上面的体验,可以发现 Vite 是真的很快,而且不需要像 webpack 那样大量的配置。

    以前的打包模式,项目启动时,需要先将所有文件打包成一个文件 bundle.js ,然后在 html 引入,这个 多文件 -> bundle.js 的过程是非常耗时间的。

    bundle
    bundle

    而 Vite 以原生 ESM 方式提供源码,Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入代码,即只在当前屏幕上实际使用时才会被处理。

    vite
    vite
    - + diff --git a/frontend/engineering/build-tool/vite/index.html b/frontend/engineering/build-tool/vite/index.html index 53ceefd823..d02eb8a665 100644 --- a/frontend/engineering/build-tool/vite/index.html +++ b/frontend/engineering/build-tool/vite/index.html @@ -30,11 +30,11 @@ Vite - +
    跳至主要內容

    Vite

    njr小于 1 分钟约 1 字

    - + diff --git a/frontend/engineering/build-tool/webpack/001-webpack-basic.html b/frontend/engineering/build-tool/webpack/001-webpack-basic.html index b3bfca8ff4..845e978be8 100644 --- a/frontend/engineering/build-tool/webpack/001-webpack-basic.html +++ b/frontend/engineering/build-tool/webpack/001-webpack-basic.html @@ -30,7 +30,7 @@ webpack 基础打包 - + @@ -152,6 +152,6 @@ }

    之后可以使用 npm run build 来代替之前的 npx webpack 命令。注意:npm scripts 会优先使用局部安装的包。

    npm run build
     

    浏览器打开 index.html 后,仍能正常显示正确结果。

    总结

    从这个案例中,我们首先安装了 webpack,并使用它对 JS 两种模块风格的代码进行了打包。

    而打包又可以使用 webpack 命令使用全局安装的 webpack 进行打包,也可以使用 npx webpack 使用局部安装的 webpack 进行打包。

    最后又引入了配置文件,并使用 npm scripts 来执行 webpack 命令。

    - + diff --git a/frontend/engineering/build-tool/webpack/002-webpack-css.html b/frontend/engineering/build-tool/webpack/002-webpack-css.html index bbda7cfcf8..1b566352f4 100644 --- a/frontend/engineering/build-tool/webpack/002-webpack-css.html +++ b/frontend/engineering/build-tool/webpack/002-webpack-css.html @@ -30,7 +30,7 @@ webpack 打包 CSS - + @@ -257,6 +257,6 @@ ] };

    重新打包后打开浏览器样式依然生效。

    postcss-px-to-viewport

    这个插件可以帮助我们将 px 单位转换为视口单位,这在进行移动端适配时尤为重要。详细使用见 postcss-px-to-view

    总结

    在这个案例里,我们分别使用了 style-loader 加载 css 样式, css-loader 处理 .css 文件, less-loader 处理 .less 文件,以及使用 postcss 给样式自动添加前缀。

    loader 的执行顺序是从后往前的,因此需要配置规则中写成 use: ["style-loader", "css-loader", "postcss-loader", "less-loader"]

    - + diff --git a/frontend/engineering/build-tool/webpack/003-webpack-assets.html b/frontend/engineering/build-tool/webpack/003-webpack-assets.html index ae7e0375af..2ea6a2f80e 100644 --- a/frontend/engineering/build-tool/webpack/003-webpack-assets.html +++ b/frontend/engineering/build-tool/webpack/003-webpack-assets.html @@ -30,7 +30,7 @@ webpack 打包其他资源 - + @@ -213,6 +213,6 @@ }, };

    执行 npm run build 打包,接下来打开浏览器可以看到 i 元素正常加载,控制台也未报错。

    总结

    webpack5 提供四种资源模块类型代替之前的 loader,可以对图片、字体等资源进行打包。

    - + diff --git a/frontend/engineering/build-tool/webpack/004-webpack-plugin.html b/frontend/engineering/build-tool/webpack/004-webpack-plugin.html index 2f26bb3fdd..64e8fe72e6 100644 --- a/frontend/engineering/build-tool/webpack/004-webpack-plugin.html +++ b/frontend/engineering/build-tool/webpack/004-webpack-plugin.html @@ -30,7 +30,7 @@ webpack 插件 - + @@ -217,6 +217,6 @@ + devtool: "source-map" }

    其中 source-map 可以帮我们快速定位错误位置,在开发模式中,会默认设置 devtool: "source-map"

    此时重新打包后,在控制台就会出现错误的具体位置,能够快速帮我们解决 bug。

    with-source-map
    with-source-map

    总结

    webpack5 除了 loader 外,还有插件这一核心概念,他能执行范围更广的任务。

    在这个案例中,我们首先介绍了如何清理 dist 文件夹;然后介绍如何打包 index.html 文件;接着是两个插件 DefinePluginCopyWebpackPlugin 的使用,它们可以帮助我们实现 Vue 打包中的一些功能;最后介绍了 webpack 的 mode 配置。

    - + diff --git a/frontend/engineering/build-tool/webpack/005-webpack-babel.html b/frontend/engineering/build-tool/webpack/005-webpack-babel.html index 3aee95f2df..a1f9af8acd 100644 --- a/frontend/engineering/build-tool/webpack/005-webpack-babel.html +++ b/frontend/engineering/build-tool/webpack/005-webpack-babel.html @@ -30,7 +30,7 @@ webpack-babel - + @@ -130,6 +130,6 @@ + loader: "babel-loader" + }

    重新打包后,语法转换仍然生效。

    总结

    webpack 中的 babel-loader 依赖于 @babel/core,而他生效需要借助不同的语法转换插件,当需要转换的内容过多时,可以使用 babel 提供的预设完成。同时 babel 还能单独写一个配置文件。

    - + diff --git a/frontend/engineering/build-tool/webpack/006-webpack-vue.html b/frontend/engineering/build-tool/webpack/006-webpack-vue.html index e970841852..f5edd40254 100644 --- a/frontend/engineering/build-tool/webpack/006-webpack-vue.html +++ b/frontend/engineering/build-tool/webpack/006-webpack-vue.html @@ -30,7 +30,7 @@ webpack-vue - + @@ -164,6 +164,6 @@ ] }

    这时重新打包后,浏览器控制台的警告就会消除了。

    总结

    在这个案例中对 .vue 单文件进行了解析:安装 vue-loader@vue/compiler-sfc,同时配置 VueLoaderPlugin,在重新打包后浏览器控制台会报一个全局标识的警告,通过配置 DefinePlugin 手动配置全局标识消除全局标识警告。

    - + diff --git a/frontend/engineering/build-tool/webpack/007-webpack-dev-server.html b/frontend/engineering/build-tool/webpack/007-webpack-dev-server.html index 87db1df575..b460273f2f 100644 --- a/frontend/engineering/build-tool/webpack/007-webpack-dev-server.html +++ b/frontend/engineering/build-tool/webpack/007-webpack-dev-server.html @@ -30,7 +30,7 @@ webpack-server - + @@ -83,6 +83,6 @@ } }

    关于 changeOrigin:因为我们真实的请求虽然是通过 http://localhost:8888open in new window 来代理的,但是默认情况下 host 的值还会是 http://localhost:8000open in new window,如果我们需要修改为 http://localhost:8888open in new window,那么可以将 changeOrigin 设置为 true 即可。
    修改 host 的原因在于有些服务器可能为了防止爬虫,在服务器中做了关于 headers 的校验,因此一般将 changeOrigin 设置为 true。

    总结

    这个案例中搭建了本地开发服务器,有两种方式:watchwebpack-dev-serverwebpack-dev-server 中自带 HMR,可以指定某个模块开启 HMR,以及 dev-server 中的一些其他配置。

    - + diff --git a/frontend/engineering/build-tool/webpack/008-webpack-resolve.html b/frontend/engineering/build-tool/webpack/008-webpack-resolve.html index 51dfc4b096..66d9c4ab47 100644 --- a/frontend/engineering/build-tool/webpack/008-webpack-resolve.html +++ b/frontend/engineering/build-tool/webpack/008-webpack-resolve.html @@ -30,7 +30,7 @@ webpack-resolve - + @@ -49,6 +49,6 @@ } }
    - + diff --git a/frontend/engineering/build-tool/webpack/009-webpack-env-split.html b/frontend/engineering/build-tool/webpack/009-webpack-env-split.html index c4834403eb..da7667f35d 100644 --- a/frontend/engineering/build-tool/webpack/009-webpack-env-split.html +++ b/frontend/engineering/build-tool/webpack/009-webpack-env-split.html @@ -30,7 +30,7 @@ webpack 环境分离 - + @@ -168,6 +168,6 @@ + "serve": "webpack serve --config webpack.dev.js" },
    - + diff --git a/frontend/engineering/build-tool/webpack/index.html b/frontend/engineering/build-tool/webpack/index.html index be94e8bfc0..75bbe24011 100644 --- a/frontend/engineering/build-tool/webpack/index.html +++ b/frontend/engineering/build-tool/webpack/index.html @@ -30,11 +30,11 @@ Webpack - +
    跳至主要內容

    Webpack

    njr小于 1 分钟约 1 字

    - + diff --git a/frontend/engineering/index.html b/frontend/engineering/index.html index d5ee78785d..c87a18e773 100644 --- a/frontend/engineering/index.html +++ b/frontend/engineering/index.html @@ -30,11 +30,11 @@ 前端工程化 - +
    跳至主要內容

    前端工程化

    njr工程化小于 1 分钟约 148 字

    开发、部署、线上过程中的管理工具,降低开发成本、提高开发效率。

    开发环节

    • 模块化:按职责划分功能,降低耦合
    • 组件化
    • 规范化:代码规范,打包规范,目录结构,文件命名

    构建环节

    各种打包工具:Webpack/Vite|Rollup/Rspack....

    性能优化等等

    部署及线上

    • 自动化:CI/CD
    • 可衡量:支持灰度、页面性能指标
    • 可恢复:快速定位、可回滚

    开发上线流程

    联调 ---> 测试 ---> MR + Review ---> Merge ---> CI/CD

    - + diff --git a/frontend/engineering/ssr/005-qwik.html b/frontend/engineering/ssr/005-qwik.html index a511716c93..fe190c6181 100644 --- a/frontend/engineering/ssr/005-qwik.html +++ b/frontend/engineering/ssr/005-qwik.html @@ -30,11 +30,11 @@ Qwik - +
    跳至主要內容

    Qwik

    njr工程化frontendSSR大约 4 分钟约 1130 字

    Web Apps 历史

    在了解 Qwik 之前,有必要了解 Web 应用程序的历史。

    第一代

    第一代应用程序采用 MPA 技术,是在服务器上通过 PHP 等技术完成的。

    服务器会渲染一系列包含 HTML 和 JavaScript 的文档,客户端使用 jQuery 在模板中添加交互。

    这种方法的问题在于必须处理两种语言,一种在服务器端(如 PHP),另一种在客户端(JavaScript),这可能会导致在 PHP 中编写的元素与其在 JavaScript 中的行为之间产生混淆,从而导致多次编写一个功能。

    这就是这种方法难以扩展的原因。

    第二代

    第二代应用程序就是 SPA,即 AngularJS、Angular、React、Vue.js 等现代框架,这些框架都基于 MVC 架构。

    SPA 只在客户端向服务器发起请求更新状态,但是在首次加载时,浏览器会下载所有 JavaScript 代码。

    SPA 在首次加载时会是一个空白页,需要很长时间才能加载,而且如果想开发大型应用程序,它不具备可扩展性。

    client renderin - Adservio
    client renderin - Adservio

    SSR

    处于第二代和第三代的技术就是服务端渲染,比如 Next.js 或 Svelte。

    在 SSR 中,仍然构建 SPA 应用程序,然而步骤略有不同:

    1. 服务端拼接 HTML

      用户请求某个页面时,服务端会拼接好一个页面的 HTML 结构返回给客户端。

    2. 客户端对 HTML 进行预渲染

      HTML 结构加载显示,但是 JavaScript 代码还未加载,此时页面还不能进行交互。

    3. 进行 hydration(水合)处理

      通过 JavaScript 代码的执行,动态地为当前页面上的 DOM 绑定事件。

    HTML 相当于一个干货海参,JavaScript 代码理解为水,hydration 过程就是用水把海参泡发,即达到页面可正常交互的状态。

    SSR 确实将首屏加载速度变快,但仍有一些缺点:

    1. 在水合之前,此时页面仍然不可交互,所以 tti(页面可交互时间)并没有太多优化。
    2. 下载的 JavaScript 代码仍然是比较全量的代码。
    3. 比较耗费服务器资源,维护成本也较高。
    server renderin - Adservio
    server renderin - Adservio

    为了减少加载 JavaScript 代码所需的时间,Astro 框架出现了。

    Astro 有一个名为「部分水合」的概念,因此在页面可见之前,它不会对页面进行水合。

    例如,如果联系表单位于页面底部,而我们位于页面顶部,那么联系表单将不可见,这样就不需要加载表单所需的 JavaScript。

    只有当页面向下滚动到有联系表单的部分时,才会进行水合,将表单中的组件与所需的 JavaScript 水合。

    Qwik 介绍

    Qwik 可以理解为一个语法接近 React 的前端 SSR 框架,但是相比于 Astro,它的优化更加彻底:「0 水合」和「0 JavaScript」

    例如,如果我们在页面底部有一个联系表单,Angular、React 或 Vue 会在首次加载时加载所需的 JavaScript,Astro 会在我们向下滚动时加载,而 Qwik 只有在点击表单的发送按钮时才会加载,它不是在页面出现表单时加载 JavaScript,而是在与表单交互时加载

    Qwik 的核心理念:to do it faster by doing nothing。

    Resumability

    现代的框架都在尝试优化水合作用,Qwik 的独特之处在于 可恢复性 (no eager JS execution and no hydration)。

    resumability in qwik framework
    resumability in qwik framework

    如果有一个庞大的应用程序,那么加载水合将会耗费大量时间,即使使用部分水合技术,也会面临挑战。而使用可恢复性的 Qwik 技术,只加载 HTML,则不会耗费大量时间。

    思考

    从概念上看,Qwik 确实会大幅提升庞大应用程序的性能,能提供最快的首次渲染和交互性能。然而,作为一个新技术,尽管它有潜力成为未来广泛使用的框架之一,仍然需要时间和社区支持。

    参考资料

    1. A Brief History of Web Apps – Why Qwik is Innovativeopen in new window
    2. Qwik – The Post-Modern Frameworkopen in new window
    3. Qwik.js框架是如何追求极致性能的?!open in new window
    - + diff --git a/frontend/engineering/ssr/006-react-server-component.html b/frontend/engineering/ssr/006-react-server-component.html index 0468500f29..4af74ac699 100644 --- a/frontend/engineering/ssr/006-react-server-component.html +++ b/frontend/engineering/ssr/006-react-server-component.html @@ -30,7 +30,7 @@ React Server Component - + @@ -230,6 +230,6 @@ return (/* render note here... */); }

    服务器组件不再需要客户端到服务器的获取调用,而是将这一逻辑迁移至服务器。并且,还可以将数据获取转移到服务器上(直接访问后台资源)。这些操作可以减少请求延迟并提高性能。

    The Disadvantages of Server Components

    服务器组件可以大大提升应用程序的性能,但是还有一些弊端:

    Server Components vs SSR

    服务器组件并不是传统意义上的服务端渲染,虽然它们都在服务器端进行组件渲染,但是它们之间有一些关键区别。

    服务器端渲染将整个页面的组件在服务器端生成并渲染,生成完整的 HTML,然后将这些 HTML 发送到客户端。客户端再对这些内容进行加载、展示和处理。SSR 可以提高首屏渲染的速度,对 SEO 有很好的支持。但是,SSR 生成的页面仍然需要在浏览器端执行与数据解析和交互相关的 JavaScript 代码。

    虽然首屏展示的速度快了,但是不可交互,所以他的 tti(页面可交互时间)并没有太大的优化。

    而 React Server Component 是在服务器端只渲染部分组件,将不涉及到交互操作的组件在服务器端生成,从而减轻客户端的计算负担。它提供一种更细粒度的控制方式,可以同时利用客户端渲染和服务器渲染的优势。同时,React Server Component 的数据获取和处理也发生在服务器端,进一步降低加载时间。

    综合来说,React Server Component 是一种新的服务器端组件渲染策略,与传统的 SSR 有一定差别,更加注重细粒度的性能优化和资源利用。

    参考资料

    1. How to Use React Server Components – A Beginner's Guideopen in new window
    2. Server Componentsopen in new window
    - + diff --git a/frontend/engineering/ssr/007-hydration-is-pure-overhead.html b/frontend/engineering/ssr/007-hydration-is-pure-overhead.html index 12ac5be79c..77b6c1b9e3 100644 --- a/frontend/engineering/ssr/007-hydration-is-pure-overhead.html +++ b/frontend/engineering/ssr/007-hydration-is-pure-overhead.html @@ -30,7 +30,7 @@ Hydration is Pure Overhead - + @@ -68,6 +68,6 @@ <script>/* code that sets up global listeners */</script> <script type="text/qwik">/* JSON representing APP_STATE, FRAMEWORK_STATE */</script>

    当浏览器加载上述 HTML 代码时,它会立即执行内联脚本,以设置全局监听器。应用程序已准备好接受事件,但浏览器尚未执行任何应用程序代码。这是最接近零 JS 的做法。

    HTML 包含作为元素属性编码的 WHERE。当用户触发一个事件时,框架可以使用 DOM 中的信息惰性地创建事件处理程序。创建过程包括对 APP_STATEFRAMEWORK_STATE 进行懒惰反序列化,以完成 WHAT。一旦该框架惰性地创建了事件处理程序,事件处理程序就可以处理事件了。请注意,客户端不会重做服务器已经完成的任何工作。

    img
    img

    内存使用说明

    DOM 元素在其生命周期内会保留事件处理程序。Hydration 会急切地创建所有监听器。因此,水合需要在启动时分配内存。

    可恢复框架在事件触发后才会创建事件处理程序。因此,可恢复框架消耗的内存将少于水合框架。此外,可恢复方法不会在执行后保留事件处理程序。事件处理程序在执行后会被释放,并返回内存。

    在某种程度上,释放内存与水合正好相反。这就好比框架惰性地为特定 WHAT 补充水分,执行后再将其脱水。处理程序的第一次执行和第 n 次执行并无太大区别。事件处理程序的惰性创建和释放不符合水合心理模型。

    结论

    水合是一种开销,因为它会重复工作。服务器会建立 WHEREWHATAPP_STATEFRAMEWORK_STATE),但这些信息会被丢弃,而不是序列化给客户端。这样,客户端就会收到没有足够信息来重建应用程序的 HTML。信息的缺乏迫使客户端急于下载应用程序并执行它,以恢复 WHEREWHATAPP_STATEFRAMEWORK_STATE)。

    另一种方法是可恢复性。可重复性侧重于将所有信息从服务器传输到客户端。这些信息包括 WHEREWHATAPP_STATEFRAMEWORK_STATE)。附加信息允许客户端在不急于下载应用程序代码的情况下对应用程序进行推理。只有用户交互会迫使客户端下载代码来处理特定的交互。客户端不会重复服务器的任何工作,因此不会产生开销。

    为了将这一想法付诸实践,我们创建了 Qwik,这是一个围绕可恢复性设计的框架,具有出色的启动性能。我们也很高兴听到您的意见!让我们继续交流,共同为用户打造更快的网络应用程序。

    Q&A

    1. 为什么要创造一个新名词?

      可重复性并没有一个明确的界限来表明组件是否水合。如果你坚持说 Qwik 水合,那么你有两个选择:

      当全局事件处理程序被注册时,Qwik 应用程序就水合了。这感觉不对,因为没有下载应用程序代码,也没有执行任何工作。
      当第一次交互解析序列化状态时,Qwik 应用程序就完成了水合。水合是为交互附加事件监听器。反序列化状态是为了恢复应用程序的状态,与注册事件处理程序无关。在某些情况下,不需要进行反序列化,如果需要,也是在事件触发后进行。另一个问题是,对状态的反序列化甚至会恢复那些尚未下载或永远不会下载的组件的状态。因此,虽然我们很想假设这就是水合的意义所在,但我们认为这只是应用程序状态的懒惰反序列化,因为它与事件处理没有直接关系。
      这两种方案都不能令人满意,因此我们创造了一个新名词。您可以将水合定义为使应用程序具有交互性,但这样的定义过于宽泛,以至于适用于所有人,从而降低了它的价值。因此,虽然听起来像是在分化,但我们还是喜欢谈论水合性与可恢复性,因为我们相信它能更好地捕捉到使应用程序具有交互性所需的大量工作之间的巨大差异。

    2. 恢复能力仅仅是事后补充水分吗?

      这当然是一个有效的方法。不过,这两者之间有一个很大的区别。可重复性并不要求框架下载并执行组件来了解组件层次结构。可重复性要求将框架的所有信息序列化到 HTML 中,包括

      由于框架会反序列化所有这些信息,并在服务器中断的地方继续执行,因此「可恢复」(resumable)是一个更好的词。

    3. 实际效果如何?我在哪里可以看到使用可恢复战略的网站?

      Builder.ioopen in new window 使用 resumable 策略(和 Qwik)重做了我们的网站。我们在启动过程中删除了 99% 的 JavaScript,由此产生的应用程序即使在移动设备上也感觉非常灵敏。通过使用 Qwik 和 Partytown,我们减少了网站中 99% 的 JavaScript,并获得了 100/100 的 PageSpeed 分数。(您仍然可以访问使用 hydration [PageSpeed 50/100]的旧页面,并与使用 resumability [PageSpeed 100/100]的新页面进行比较,亲自体验性能差异)。

      Qwik 的文档是在 Qwik 上运行的。你可以通过在浏览器中打开开发工具(隐身)来查看引擎盖下的情况,并注意到启动时没有使用 Javascript。(该页面还使用 Partytown 将第三方分析移至 Web Worker)。

      最后,看看在 Cloudflare edge 上运行的待办事项应用程序演示。该页面可在 50 毫秒内完成交互!

    4. 我的框架知道如何进行渐进式和/或懒惰式补水。这是一码事吗?

      不一样,因为渐进式/懒惰式水合仍无法继续执行服务器中断的操作。所有组件代码都需要下载并执行,以恢复和安装事件处理程序。

      有了可恢复性,许多组件将永远不会下载,因为它们永远不会改变。但这些组件可以向子组件传递道具,或创建子组件投射的内容。因此,即使不交互,也需要通过重新执行来恢复组件的状态。这就是为什么支持渐进/快速水合的岛屿不能任意缩小的原因。

      简而言之,与水合相比,可恢复性在处理用户交互时需要下载和执行的代码要少得多。

    5. 我的框架知道如何创建岛屿。这是一码事吗?

      岛屿架构将应用程序分割成多个岛屿。然后,每个岛都可以独立水合。现在,总工作量不再是一次大的水合,而是分散到许多较小的水合事件中。通常情况下,触发器会使岛在启动时懒散地水合,而不是急切地水合。

      这意味着基于孤岛的水合是一种改进,因为它可以将工作分解成更小的块并延迟执行,但这仍然是水合,与可恢复性不同。

    6. 我的框架知道如何序列化状态。它会产生开销吗?

      这里的问题是,state 一词被超载了。是的,有些元框架可以序列化状态。但这里的「状态 」指的是 APP_STATE,而不是 FRAMEWORK_STATE。我不知道有哪个流行的框架(或元框架)可以序列化 FRAMEWORK_STATE。此外,即使 FRAMEWORK_STATE 序列化了,WHAT 和 WHERE 也没有序列化。

      是的,状态(APP_STATE)的序列化很有用,可以避免客户端的大量工作。但它仍然会导致水合。

    7. 组件在首次交互时是否水合?

      如果你查看一下可恢复框架的内部状态,就会发现组件的首次交互与后续交互并无不同。唯一的区别是框架已经解析了序列化状态。一旦状态被解析,它就适用于所有组件,而不仅仅是用户与之交互的组件。在任何时候,框架都可以将状态序列化回 HTML。这是否意味着应用程序不再水合?从这个角度来看,状态的反序列化会使所有组件水合,即使它们的代码尚未被下载。

    8. 今天我如何利用可恢复性的优势?

      框架控制着应用程序交互所使用的恢复策略类型。因此,要利用可恢复性,您的应用程序必须使用支持它的框架之一。目前,我们只知道 Qwik 明确支持可恢复性。可重续性的优势不容忽视,因此我相信未来其他框架也会开始使用这一策略,无论是新框架还是选择迁移到可重续性的现有框架。

    9. 第一次互动会有延迟吗?

      使用预取就不会。Qwik 对预取没有任何主见--我们使用过多种预取策略(急切、可见、分析驱动),效果都很好。在大多数情况下,我们发现在 Web Worker(如 Partytown)中进行预取可实现 0 成本和高速度的最佳平衡。我们将在框架中加入最佳实践,并逐步提供具有推荐模式的示例。

    10. 我可以在 Qwik 中使用我的 React/Angular/Vue/Svelte 组件吗?

      重写应用程序是一项巨大的工程。为了降低入门门槛,我们正在研究与当今一些更流行的框架建立互操作性。Qwik 将成为您的协调器,提供即时的应用程序启动,但它仍将与大部分现有的代码投资一起使用。可以将 Qwik 视为您当前应用程序的协调器。这样,您就不必重写整个应用程序,但仍能获得一些好处。这项工作还在进行中,敬请期待。

    - + diff --git a/frontend/engineering/ssr/index.html b/frontend/engineering/ssr/index.html index 4afbb1cd60..da3d42a841 100644 --- a/frontend/engineering/ssr/index.html +++ b/frontend/engineering/ssr/index.html @@ -30,11 +30,11 @@ Ssr - +
    跳至主要內容

    Ssr

    njr小于 1 分钟约 1 字

    - + diff --git a/frontend/framework/chakra/01-getting-started.html b/frontend/framework/chakra/01-getting-started.html index 512b6c895a..593098d252 100644 --- a/frontend/framework/chakra/01-getting-started.html +++ b/frontend/framework/chakra/01-getting-started.html @@ -30,7 +30,7 @@ 快速开始 - + @@ -38,6 +38,6 @@

    Chakra UI:以非常简单直观的方式创建响应式样式。可以使用数组或对象符号:

    <Img w={[16, 32, 48]} src="...">
     <Img w={{ base:16, md:32, lg:48 }} src="..." />
     

    样式覆盖

    在大多数应用中,为满足设计要求而覆盖特定上下文的样式是一项常见的挑战。

    Tailwind CSS:鉴于 Tailwind 是一个 CSS 实用框架,你可能需要找出覆盖特定 classNames 或编写自定义 CSS 的最佳方法。

    Chakra UI:Chakra UI 的样式是基于 prop 的,因此覆盖就像传递 prop 一样简单。

    可访问性

    如前所述,Tailwind CSS 只是一个 CSS 框架,类似于 Bootstrap 或 Bulma CSS。这样,用户就可以处理语义 html 结构、满足 WAI-ARIA 要求、键盘导航等。

    Chakra 不仅提供了 Tailwind 的便利性,还具有其他所有优点。

    暗色模式

    Tailwind CSS:所有组件均与暗色模式兼容。

    Chakra UI:所有组件均兼容明暗模式。还可以在整个应用程序中创建自己的明暗模式体验。

    Theme UI

    Chakra UI 深受 Theme UI 的启发,并遵循系统 UI 规范。

    与 Theme UI 相比,Chakra UI 提供了更多组件、改进的样式 API、可访问性和直观的组件 API。

    可以将 Chakra 视为更强大的 Theme UI 版本,它充分利用了 styled-system 的全部功能,提供更好的组件样式和主题。

    Material UI

    Material UI React 库为用户提供了大量 UI 布局工具,但其最著名的地方在于它提供了大量预设样式的 UI 组件,开发人员可以在这些组件上应用自定义样式来覆盖开箱即用的基础样式。

    Chakra UI 是一个更强大、更注重布局的库,它也为开发人员提供了与 Material UI 类似的 UI 组件,但更注重创建灵活、可组合和可扩展的代码。

    在比较这两个框架时,需要考虑的一个核心概念是 "易于修改"。

    相比之下,Material UI 为与导出组件和布局相关的单个 HTML 标签添加了更多的类,这迫使开发人员在定制界面时不得不与基本样式作斗争。

    Chakra 为开发人员提供了更大的自由度来操作导出组件和布局的 CSS 类,而且通常只需较少的代码即可完成。

    例如,Material UI 需要单独的代码来控制基于视口变化的响应式样式,而 Chakra 提供了内置的响应式样式支持,无需创建 CSS 类或媒体查询。

    如果自定义样式并不是项目的主要关注点,Material UI 则是有益的,因为您可以避免创建该库所提供的自定义组件。

    如果可扩展的自定义设计对您的项目很重要(很多时候确实如此),Chakra 对开发人员的便利性比 Material UI 更为突出,尤其是在项目随时间扩展的情况下。

    Ant Design

    Ant Design React 库是 ant.design 设计语言的实现。这意味着组件遵循现有的设计规则和值,只允许在有限的范围内自定义某些变量。

    Chakra 不受任何设计系统的束缚,可以更自由地定制组件,实现自己的设计。

    样式组件

    Ant Design 组件是为开箱即用而构建的,因此它们的特定样式 prop 和自定义功能非常有限。

    另一方面,Chakra 组件的主要风格化方式是将样式作为 prop

    以按钮组件为例。Chakra Button 的 colorScheme(色彩主题)道具在默认情况下有许多不同的值,您可以对其进行自定义和/或扩展,以应用自己的设计。

    相比之下,您需要记住,Antd Design 按钮只有在拥有 primary propdanger prop 的情况下才能着色,而不能因为 Ant Design 的现有设计值而着色。

    同样的模式也可以在布局、表单和排版等其他组件中看到。

    设置和自定义

    Ant Design 有一长串可修改的默认变量,包括颜色、页边距、边距、动画、阴影、边框、屏幕尺寸、尺寸等,有些是通用变量,有些则是用户界面组件的特定变量。为了尊重底层设计规范,除修改这些现有变量外,不建议进行其他自定义操作。

    Chakra 的特点是所有全局和组件样式默认值都可以轻松定制/扩展。可以为每个组件定义新的尺寸或变体。此外,您还可以使用 Chakra Factory 从现有组件甚至非 Chakra 组件中组合出新的组件。

    - + diff --git a/frontend/framework/chakra/02-style-props.html b/frontend/framework/chakra/02-style-props.html index d70b7a65f1..3d408c4b8f 100644 --- a/frontend/framework/chakra/02-style-props.html +++ b/frontend/framework/chakra/02-style-props.html @@ -30,7 +30,7 @@ Style Props - + @@ -290,6 +290,6 @@ Hello </Button>
    - + diff --git a/frontend/framework/chakra/index.html b/frontend/framework/chakra/index.html index eca025bde8..3551d87350 100644 --- a/frontend/framework/chakra/index.html +++ b/frontend/framework/chakra/index.html @@ -30,11 +30,11 @@ chakra - +
    跳至主要內容

    chakra

    njr小于 1 分钟约 4 字

    - + diff --git a/frontend/framework/index.html b/frontend/framework/index.html index 9ec207b86a..2d2b77a13d 100644 --- a/frontend/framework/index.html +++ b/frontend/framework/index.html @@ -30,11 +30,11 @@ 前端框架 - +
    跳至主要內容

    前端框架

    njr小于 1 分钟约 16 字

    前端框架

    这里是关于前端框架的文章。

    - + diff --git a/frontend/framework/next/index.html b/frontend/framework/next/index.html index 955ffe4d9f..5c5b6e954d 100644 --- a/frontend/framework/next/index.html +++ b/frontend/framework/next/index.html @@ -30,11 +30,11 @@ Next - +
    跳至主要內容

    Next

    njr小于 1 分钟约 1 字

    - + diff --git a/frontend/framework/next/pages-router/01-pages-layouts.html b/frontend/framework/next/pages-router/01-pages-layouts.html index 23eae632ba..212fc1a7c7 100644 --- a/frontend/framework/next/pages-router/01-pages-layouts.html +++ b/frontend/framework/next/pages-router/01-pages-layouts.html @@ -30,7 +30,7 @@ 页面和布局 - + @@ -135,6 +135,6 @@ ) }
    - + diff --git a/frontend/framework/next/pages-router/index.html b/frontend/framework/next/pages-router/index.html index 5ecf99dd17..5e08cdde21 100644 --- a/frontend/framework/next/pages-router/index.html +++ b/frontend/framework/next/pages-router/index.html @@ -30,11 +30,11 @@ Pages Router - +
    跳至主要內容

    Pages Router

    njr小于 1 分钟约 56 字

    页面路由器(Pages Router)是基于页面概念的文件系统路由器。当一个文件被添加到页面目录时,它就会自动成为一个路由。

    - + diff --git a/frontend/framework/node/001-module.html b/frontend/framework/node/001-module.html index 1181d81127..e743298614 100644 --- a/frontend/framework/node/001-module.html +++ b/frontend/framework/node/001-module.html @@ -30,7 +30,7 @@ 模块化 - + @@ -267,6 +267,6 @@ }) }

    ESM VS CommonJS

    CommonJS 模块加载 js 文件的过程是运行时加载的,并且是同步的:

    ES Module 加载 js 文件的过程是编译(解析)时加载的,并且是异步的:

    CommonJS 通过 module.exports 导出的是一个对象,导出和导入指向的是同一块内存空间,两边修改会同时影响导出对象。

    ES Module 通过 export 导出的是变量本身的引用:JS 引擎会创建模块环境记录,会和导出的变量进行绑定。所以在导出的模块中修改变化,导入的地方可以通过模块环境记录获取最新的值;但是在导入的地方不允许修改变量(直接报错),因为导入它时相当于给一个常量赋值。

    如果 ESM 导出的是一个对象,那么导入的模块也能修改对象中的属性,因为他指向内存空间。

    总结

    本文主要介绍了模块化发展的历程,介绍各种规范如 CommonJS、AMD、CMD、ESM 的使用和对比。

    - + diff --git a/frontend/framework/node/index.html b/frontend/framework/node/index.html index 6a06593683..a4b6682682 100644 --- a/frontend/framework/node/index.html +++ b/frontend/framework/node/index.html @@ -30,11 +30,11 @@ Node - +
    跳至主要內容

    Node

    njr小于 1 分钟约 4 字

    - + diff --git a/frontend/framework/pixi/01-quick-start.html b/frontend/framework/pixi/01-quick-start.html index d43762e3c4..3eb25c8be5 100644 --- a/frontend/framework/pixi/01-quick-start.html +++ b/frontend/framework/pixi/01-quick-start.html @@ -30,7 +30,7 @@ 快速开始 - + @@ -94,6 +94,6 @@ </body> </html>
    - + diff --git a/frontend/framework/pixi/02-architecture-overview.html b/frontend/framework/pixi/02-architecture-overview.html index 8d4084b287..e5b0d67aa7 100644 --- a/frontend/framework/pixi/02-architecture-overview.html +++ b/frontend/framework/pixi/02-architecture-overview.html @@ -30,11 +30,11 @@ 架构概述 - +
    跳至主要內容

    架构概述

    njrPixibasic-knowledge小于 1 分钟约 211 字

    PixiJSopen in new window 源代码中主要模块的关系如下:

    模块说明
    Renderer渲染器,PixiJS 系统核心,用于显示场景树,并将其绘制到屏幕上。
    Container容器,主要场景对象,用于创建场景树,如精灵、图形和文本。
    Assets为异步加载资源提供工具。
    Ticker基于时钟的周期性回调。游戏更新逻辑将通常在每帧的响应中运行。
    Application一个简单的帮助对象,包装了一个加载器,一个时钟和一个渲染器。
    EventsPixiJS 支持基于指针的交互,使对象可以被点击,触发悬停事件等。
    Accessibility通过我们的显示系统我们拥有了一个丰富的键盘和屏幕阅读器的工具。
    - + diff --git a/frontend/framework/pixi/03-render-loop.html b/frontend/framework/pixi/03-render-loop.html index e217129f6b..48df38e25f 100644 --- a/frontend/framework/pixi/03-render-loop.html +++ b/frontend/framework/pixi/03-render-loop.html @@ -30,11 +30,11 @@ 渲染循环 - +
    跳至主要內容

    渲染循环

    njrPixibasic-knowledge大约 3 分钟约 761 字

    现在您已经了解了系统的主要部分,让我们来看看这些部分是如何协同工作,将您的项目呈现在屏幕上的。 与网页不同的是,PixiJS 会不断更新和重新绘制,一遍又一遍。 你更新对象,然后 PixiJS 将它们渲染到屏幕上,然后重复这个过程。 我们称这个循环为渲染循环。

    任何 PixiJS 项目最主要的部分包含更新 + 渲染循环,编写更新,PixiJS 会处理整个渲染。

    发生在渲染循环中的每一帧主要包含三个部分。

    运行 Ticker 回调

    第一步是计算从上一帧开始已经过去了多长时间,然后根据时间差调用应用程序对象的 ticker 回调。 这样,项目代码就可以制作动画并更新舞台上的精灵等,为渲染做好准备。

    更新场景图像

    场景图包含您正在绘制的事物(精灵、文本等),并且这些对象处于树状层次结构中。这些对象处于树状层次结构中。 通过移动、旋转等方式更新游戏对象后,PixiJS 需要计算场景中每个对象的新位置和状态,然后才能开始绘制。

    渲染场景图像

    现在我们的游戏状态已经更新,是时候将其绘制到屏幕上了。渲染系统会从场景图的根节点(app.stage)开始,渲染每个对象及其子节点,直到绘制完所有对象。 在此过程中不会进行剔除或其他巧妙的处理。如果在舞台的可见部分之外有大量对象,则需要将其禁用作为一种优化方法(视椎体剔除)。

    帧频

    渲染循环不可能无限快地运行--在屏幕上绘制图像需要时间。此外,每次屏幕更新(通常为 60fps,但较新的显示器可支持 144fps 或更高)时,帧的更新次数一般不会超过一次。最后,PixiJS 是在 Chrome 或 Firefox 等网络浏览器的环境中运行的。浏览器本身必须平衡各种内部操作的需要和为任何打开的标签页提供服务的需要。综上所述,确定何时绘制帧是一个复杂的问题。

    如果您想调整该行为,可以在 Ticker 上设置 minFPSmaxFPS 属性。请注意,由于环境复杂,项目无法保证给定的 FPS。 在 ticker 回调中使用传递的 ticker.deltaTime 值来缩放任何动画,以确保流畅播放。

    自定义渲染循环

    以上介绍的是应用程序辅助类开箱即用的默认呈现循环。对于希望解决特定问题的高级用户来说,创建呈现循环还有许多其他方法。在制作原型和学习 PixiJS 的过程中,建议使用应用程序提供的系统。

    - + diff --git a/frontend/framework/pixi/04-scene-graph.html b/frontend/framework/pixi/04-scene-graph.html index e83e47c7dc..0998cc5db7 100644 --- a/frontend/framework/pixi/04-scene-graph.html +++ b/frontend/framework/pixi/04-scene-graph.html @@ -30,7 +30,7 @@ 场景图像 - + @@ -140,6 +140,6 @@
    render order
    render order

    如果想对子对象重新排序,可以使用 setChildIndex()。 要在父对象列表的给定位置添加子对象,可以使用 addChildAt()。 最后,您可以使用 sortableChildren 选项,结合设置每个子对象的 zIndex 属性,对对象的子对象进行自动排序。

    渲染组

    当你深入研究 PixiJS 时,你会遇到一个强大的功能,即渲染组。 将渲染组视为场景图中的专门容器,其本身就像迷你场景图。 以下是在项目中有效使用渲染组的必要知识。 更多信息,请查看 渲染组概述open in new window

    剔除

    如果您正在构建的项目中,大部分场景对象都不在屏幕上(例如,一个横版游戏),那么您就需要对这些对象进行剔除。

    剔除是一个评估对象(或其子代!)是否在屏幕上的过程,如果不在屏幕上,则关闭对其的渲染。

    如果不对屏幕外的对象进行剔除,即使它们的像素最终都不在屏幕上,渲染器仍会绘制它们。

    PixiJS 并不提供视口剔除的内置支持,但你可以找到第三方插件来满足你的需求。另外,如果你想建立自己的剔除系统,只需在每个 tick 期间运行对象,并将任何不需要绘制的对象的 renderable 设置为 false 即可。

    局部坐标 vs 全局坐标

    如果在舞台上添加一个精灵,默认情况下它会显示在屏幕的左上角。这是 PixiJS 使用的全局坐标空间的原点。

    如果你的所有对象都是舞台的子对象,那么你只需要担心这个坐标。但是一旦引入容器和子对象,事情就变得复杂了。

    位于 [50, 100] 处的子对象距离父对象向右 50 像素,向下 100 像素。我们称这两个坐标系为「全局坐标」和「局部坐标」。当你在一个对象上使用 position.set(x, y) 时,你总是在局部坐标系下工作,相对于对象的父对象。

    问题是,很多时候你都想知道某个对象的全局位置。例如,如果您想剔除屏幕外的对象以节省渲染时间,您需要知道给定的子对象是否在视图矩形之外。

    要将本地坐标转换为全局坐标,您需要使用 toGlobal() 函数。下面是一个使用示例:

    // Get the global position of an object, relative to the top-left of the screen
     let globalPos = obj.toGlobal(new Point(0, 0))
     

    这段代码会将 globalPos 设置为子对象的全局坐标,相对于全局坐标系中的 [0, 0]。

    全局坐标 vs 屏幕坐标

    当您的项目与主机操作系统或浏览器协同工作时,还有第三个坐标系——「屏幕坐标」(又称「视口坐标」)会发挥作用。屏幕坐标表示相对于 PixiJS 正在呈现的画布元素左上角的位置。DOM 和本地鼠标点击事件等都在屏幕空间中工作。

    现在,在很多情况下,屏幕空间等同于世界空间。如果画布的大小与创建应用程序时指定的呈现视图大小相同,就属于这种情况。 默认情况下就是这样——例如,您将创建一个 800x600 的应用程序窗口并将其添加到 HTML 页面,它就会保持这个大小。世界坐标中的 100 像素等于屏幕空间中的 100 像素。

    但是!常见的情况是拉伸呈现视图,使其充满整个屏幕,或者以较低分辨率呈现,然后放大以提高速度。在这种情况下,画布元素的屏幕尺寸会发生变化(例如通过 CSS),但底层呈现视图不会,从而导致世界坐标和屏幕坐标不匹配。

    - + diff --git a/frontend/framework/pixi/index.html b/frontend/framework/pixi/index.html index 2638bdaed7..adf55ad163 100644 --- a/frontend/framework/pixi/index.html +++ b/frontend/framework/pixi/index.html @@ -30,11 +30,11 @@ PixiJS - +
    跳至主要內容

    PixiJS

    njr小于 1 分钟约 8 字

    - + diff --git a/frontend/framework/react/01-useState.html b/frontend/framework/react/01-useState.html index aeffd014bc..40ceff8a82 100644 --- a/frontend/framework/react/01-useState.html +++ b/frontend/framework/react/01-useState.html @@ -30,7 +30,7 @@ useState - + @@ -319,6 +319,6 @@ setAge((a) => a + 1) // setAge(44 => 45) }

    上述代码的处理过程如下:

    1. a => a + 1 将接收 42 作为待处理状态,并返回 43 作为下一状态。
    2. a => a + 1 将接收 43 作为待处理状态,并返回 44 作为下一个状态。
    3. a => a + 1 将接收 44 作为待处理状态,并返回 45 作为下一个状态。

    没有其他队列更新,所以 React 会将 45 作为当前状态保存。

    提示

    按照惯例,通常以状态变量名称的首字母来命名待处理状态参数,如年龄的 a,也可以使用更加清晰的名称 prevAge

    注意

    Usage

    - + diff --git a/frontend/framework/react/02-useEffect.html b/frontend/framework/react/02-useEffect.html index 0e53ce3e92..2e43c95449 100644 --- a/frontend/framework/react/02-useEffect.html +++ b/frontend/framework/react/02-useEffect.html @@ -30,7 +30,7 @@ useEffect - + @@ -590,6 +590,6 @@ ) }

    useEffect 完整指南

    useEffect 完整指南open in new window

    每一次渲染都有自己的 props 和 state

    和 Vue 不同,Vue 的基本原理是数据绑定、观察者模式、proxy。

    React 在状态变更时会重新渲染组件,状态并没有任何的数据绑定。

    每一次组件调用引起的渲染,props 和 state 都独立于其他渲染。

    每一次渲染都有自己的事件处理程序

    事件处理函数会记住当前渲染的 propsstate,从这个角度来说可以印证第一点。

    每一次渲染都有自己的 Effects

    每次渲染都是一个 不同的函数 ,每一个 effect 版本「看到」的 propsstate 值都来自于它属于的那次特定渲染。

    从官方文档中的描述中也可以确认这一点:在每次重新渲染依赖关系发生变化后,React 将首先使用旧值运行清理函数,然后使用新值运行设置函数。

    每一次渲染的任何东西都是独立的。**在组件内什么时候去读取 props 或者 state 是无关紧要的。**因为在单次渲染的范围内,props 和 state 始终保持不变。

    - + diff --git a/frontend/framework/react/index.html b/frontend/framework/react/index.html index a680d3aeb4..7bbac30428 100644 --- a/frontend/framework/react/index.html +++ b/frontend/framework/react/index.html @@ -30,11 +30,11 @@ React - +
    跳至主要內容

    React

    njr小于 1 分钟约 244 字

    React

    Hooks

    State Hooks

    状态可以让组件「记住」用户输入等信息,以下钩子可以为组件添加状态:

    • useState:声明一个可以直接更新的状态变量。
    • useReducer:声明一个状态变量,其更新逻辑在一个 reducer 函数中。

    Effect Hooks

    Effects 允许组件连接到外部系统并与之同步,包括处理网络、浏览器 DOM、动画、使用不同 UI 库编写的部件以及其他非 React 代码。

    Effects 是 React 范式的 「逃生舱门」。不要使用 Effects 来协调应用程序的数据流。如果不需要与外部系统交互,可能不需要 Effect

    useEffect 有两种很少使用的变体,它们在时间上有所不同:

    • useLayoutEffect 在浏览器重绘屏幕之前触发。您可以在此处测量布局。

    • useInsertionEffect 在 React 更改 DOM 之前触发。库可以在此处插入动态 CSS。

    • useEffect

    React Dom

    - + diff --git "a/frontend/framework/vue/01\343\200\201\347\210\266\345\255\220\347\273\204\344\273\266\351\200\232\344\277\241.html" "b/frontend/framework/vue/01\343\200\201\347\210\266\345\255\220\347\273\204\344\273\266\351\200\232\344\277\241.html" index 48dd59eb22..a01ef95279 100644 --- "a/frontend/framework/vue/01\343\200\201\347\210\266\345\255\220\347\273\204\344\273\266\351\200\232\344\277\241.html" +++ "b/frontend/framework/vue/01\343\200\201\347\210\266\345\255\220\347\273\204\344\273\266\351\200\232\344\277\241.html" @@ -30,7 +30,7 @@ 父子组件通信 - + @@ -148,6 +148,6 @@ } })
    - + diff --git "a/frontend/framework/vue/02\343\200\201Vuex \345\216\237\347\220\206.html" "b/frontend/framework/vue/02\343\200\201Vuex \345\216\237\347\220\206.html" index 31032cbbb3..a39fb92680 100644 --- "a/frontend/framework/vue/02\343\200\201Vuex \345\216\237\347\220\206.html" +++ "b/frontend/framework/vue/02\343\200\201Vuex \345\216\237\347\220\206.html" @@ -30,7 +30,7 @@ Vuex 原理及源码阅读 - + @@ -169,6 +169,6 @@ // and collects all module getters inside this._wrappedGetters installModule(this, state, [], this._modules.root)
    - + diff --git "a/frontend/framework/vue/02\343\200\201provide-inject.html" "b/frontend/framework/vue/02\343\200\201provide-inject.html" index e2c464a7a7..c42ddb03ba 100644 --- "a/frontend/framework/vue/02\343\200\201provide-inject.html" +++ "b/frontend/framework/vue/02\343\200\201provide-inject.html" @@ -30,7 +30,7 @@ provide 和 inject - + @@ -159,6 +159,6 @@ } </script>

    经过上述处理,任何对 content.length 的改变都会被正确地反映在注入 length 的组件中。

    - + diff --git "a/frontend/framework/vue/03\343\200\201\346\217\222\346\247\275.html" "b/frontend/framework/vue/03\343\200\201\346\217\222\346\247\275.html" index d2bc608587..285ca6f31c 100644 --- "a/frontend/framework/vue/03\343\200\201\346\217\222\346\247\275.html" +++ "b/frontend/framework/vue/03\343\200\201\346\217\222\346\247\275.html" @@ -30,7 +30,7 @@ 插槽 - + @@ -197,6 +197,6 @@ <span class="green">{{ item }}</span> </todo-list>
    - + diff --git "a/frontend/framework/vue/04\343\200\201\345\212\250\346\200\201\347\273\204\344\273\266\345\222\214\345\274\202\346\255\245\347\273\204\344\273\266.html" "b/frontend/framework/vue/04\343\200\201\345\212\250\346\200\201\347\273\204\344\273\266\345\222\214\345\274\202\346\255\245\347\273\204\344\273\266.html" index b03c6154e6..964cbbd60b 100644 --- "a/frontend/framework/vue/04\343\200\201\345\212\250\346\200\201\347\273\204\344\273\266\345\222\214\345\274\202\346\255\245\347\273\204\344\273\266.html" +++ "b/frontend/framework/vue/04\343\200\201\345\212\250\346\200\201\347\273\204\344\273\266\345\222\214\345\274\202\346\255\245\347\273\204\344\273\266.html" @@ -30,7 +30,7 @@ 动态组件和异步组件 - + @@ -69,6 +69,6 @@ } })
    - + diff --git "a/frontend/framework/vue/05\343\200\201\347\273\204\344\273\266\347\232\204v-model.html" "b/frontend/framework/vue/05\343\200\201\347\273\204\344\273\266\347\232\204v-model.html" index 3974a119e1..7267a503f8 100644 --- "a/frontend/framework/vue/05\343\200\201\347\273\204\344\273\266\347\232\204v-model.html" +++ "b/frontend/framework/vue/05\343\200\201\347\273\204\344\273\266\347\232\204v-model.html" @@ -30,7 +30,7 @@ 组件的 v-model - + @@ -79,6 +79,6 @@ ` })
    - + diff --git "a/frontend/framework/vue/06\343\200\201Mixin.html" "b/frontend/framework/vue/06\343\200\201Mixin.html" index b4a7a243e4..3d9465cda7 100644 --- "a/frontend/framework/vue/06\343\200\201Mixin.html" +++ "b/frontend/framework/vue/06\343\200\201Mixin.html" @@ -30,7 +30,7 @@ Mixin - + @@ -162,6 +162,6 @@ // => 全局 mixin // => app
    - + diff --git "a/frontend/framework/vue/07\343\200\201\347\273\204\345\220\210\345\274\217API\345\237\272\347\241\200.html" "b/frontend/framework/vue/07\343\200\201\347\273\204\345\220\210\345\274\217API\345\237\272\347\241\200.html" index 6de8c7efbe..54d4da703c 100644 --- "a/frontend/framework/vue/07\343\200\201\347\273\204\345\220\210\345\274\217API\345\237\272\347\241\200.html" +++ "b/frontend/framework/vue/07\343\200\201\347\273\204\345\220\210\345\274\217API\345\237\272\347\241\200.html" @@ -30,7 +30,7 @@ 组合式 API 基础 - + @@ -228,6 +228,6 @@ } </script>
    - + diff --git "a/frontend/framework/vue/08\343\200\201\347\273\204\345\220\210\345\274\217\345\207\275\346\225\260.html" "b/frontend/framework/vue/08\343\200\201\347\273\204\345\220\210\345\274\217\345\207\275\346\225\260.html" index 79a87d9a25..1ab50d8979 100644 --- "a/frontend/framework/vue/08\343\200\201\347\273\204\345\220\210\345\274\217\345\207\275\346\225\260.html" +++ "b/frontend/framework/vue/08\343\200\201\347\273\204\345\220\210\345\274\217\345\207\275\346\225\260.html" @@ -30,7 +30,7 @@ 组合式函数 - + @@ -132,6 +132,6 @@ } </script>

    mixin 比较

    mixin 主要有三个缺点:

    1. 不清楚属性的来源:当使用许多 mixin 时,不清楚 property 是由哪个 mixin 注入的,使得跟踪实现和理解组件的行为变得困难。
    2. 命名冲突:来自不同 mixin 可能注册相同的属性键,从而导致命名冲突。
    3. 隐式依赖:mixin 与 mixin 之间的依赖是隐式的,当 A mixin 中的函数依赖 B mixin 中的函数时,这种关系不是通过显示的声明(import 语句或依赖注入)取得的,也不是通过公共约定(如全局上的方法)确定的,就会给代码造成困扰。

    因此,Vue@3.x 中不再推荐使用 mixin。

    - + diff --git "a/frontend/framework/vue/09\343\200\201\346\214\207\344\273\244.html" "b/frontend/framework/vue/09\343\200\201\346\214\207\344\273\244.html" index 8bf42b284b..54de9a708b 100644 --- "a/frontend/framework/vue/09\343\200\201\346\214\207\344\273\244.html" +++ "b/frontend/framework/vue/09\343\200\201\346\214\207\344\273\244.html" @@ -30,11 +30,11 @@ - +
    跳至主要內容

    njr小于 1 分钟约 0 字

    - + diff --git "a/frontend/framework/vue/10\343\200\201\346\217\222\344\273\266.html" "b/frontend/framework/vue/10\343\200\201\346\217\222\344\273\266.html" index 6d0c4ea87c..8574d3b2ad 100644 --- "a/frontend/framework/vue/10\343\200\201\346\217\222\344\273\266.html" +++ "b/frontend/framework/vue/10\343\200\201\346\217\222\344\273\266.html" @@ -30,11 +30,11 @@ - +
    跳至主要內容

    njr小于 1 分钟约 0 字

    - + diff --git a/frontend/framework/vue/index.html b/frontend/framework/vue/index.html index 768963fac3..b61377af2c 100644 --- a/frontend/framework/vue/index.html +++ b/frontend/framework/vue/index.html @@ -30,11 +30,11 @@ Vue - +
    跳至主要內容

    Vue

    njr小于 1 分钟约 88 字

    - + diff --git a/frontend/index.html b/frontend/index.html index a5e91cedb2..1714c7e830 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -30,11 +30,11 @@ 前端指南 - +
    跳至主要內容

    前端指南

    njr小于 1 分钟约 155 字

    - + diff --git a/frontend/practice/001-dnd-kit.html b/frontend/practice/001-dnd-kit.html index ae02ba2008..174d2dfa96 100644 --- a/frontend/practice/001-dnd-kit.html +++ b/frontend/practice/001-dnd-kit.html @@ -30,7 +30,7 @@ dnd-kit 踩坑 - + @@ -84,6 +84,6 @@ </div>

    拖拽动画异常

    排序策略

    需要选择默认

    无限拖拽出现滚动条

    modifiers={[restrictToFirstScrollableAncestor]}
     

    鼠标跟手

    https://github.com/clauderic/dnd-kit/issues/122open in new window
    https://github.com/clauderic/dnd-kit/pull/334open in new window

    https://github.com/clauderic/dnd-kit/blob/master/stories/components/Draggable/DraggableOverlay.tsxopen in new window

    - + diff --git a/frontend/practice/002-annotation.html b/frontend/practice/002-annotation.html index 539cd002b0..3924609ab0 100644 --- a/frontend/practice/002-annotation.html +++ b/frontend/practice/002-annotation.html @@ -30,7 +30,7 @@ 图片批注 - + @@ -1146,6 +1146,6 @@ ) }
    - + diff --git a/frontend/practice/003-file-upload.html b/frontend/practice/003-file-upload.html index e0dc0163c9..134bc973ef 100644 --- a/frontend/practice/003-file-upload.html +++ b/frontend/practice/003-file-upload.html @@ -30,7 +30,7 @@ 常见文件上传场景 - + @@ -1494,6 +1494,6 @@ color: #ccc; }

    注意

    粘贴上传一般不会有特别复杂的场景,一般是粘贴一个图片或者文件,因此这里没考虑文件夹上传等场景。

    - + diff --git a/frontend/practice/004-global-upload.html b/frontend/practice/004-global-upload.html index 1b1b20f812..c57d69f04a 100644 --- a/frontend/practice/004-global-upload.html +++ b/frontend/practice/004-global-upload.html @@ -30,7 +30,7 @@ 全局上传组件 - + @@ -442,6 +442,6 @@ }) }
    - + diff --git a/frontend/practice/005-postcss-px-to-viewport.html b/frontend/practice/005-postcss-px-to-viewport.html index 6712251146..b1c9017880 100644 --- a/frontend/practice/005-postcss-px-to-viewport.html +++ b/frontend/practice/005-postcss-px-to-viewport.html @@ -30,7 +30,7 @@ 移动端适配方案 postcss-px-to-viewport - + @@ -57,6 +57,6 @@ } }

    详细配置见 postcss-px-to-viewportopen in new window

    当全部设置完成后,重新运行项目,查看 css 属性,即可发现所有 px 单位全部变成了 vw 单位。

    切换不同的设备时,大小会随之发生变化。

    - + diff --git a/frontend/practice/006-animation-svg.html b/frontend/practice/006-animation-svg.html index 22a6a4ca9e..a622d76fa0 100644 --- a/frontend/practice/006-animation-svg.html +++ b/frontend/practice/006-animation-svg.html @@ -30,7 +30,7 @@ SVG 实现签名动画效果 - + @@ -319,6 +319,6 @@ console.log(isDarkMode.value, '---')
    - + diff --git a/frontend/practice/007-offline-export-in-highcharts.html b/frontend/practice/007-offline-export-in-highcharts.html index 72e00b6a9c..a1378a4b03 100644 --- a/frontend/practice/007-offline-export-in-highcharts.html +++ b/frontend/practice/007-offline-export-in-highcharts.html @@ -30,7 +30,7 @@ HighCharts 客户端导出图片 - + @@ -53,6 +53,6 @@ <HighchartsReact ref={chartRef} highcharts={Highcharts} options={options} callback={(chart: Chart) => setChartState(chart)} />

    上面这个代码使用 callbackhighcharts 实例化后将实例设置为 state,保证自定义操作组件能够获取到实例对象,在该组件中使用 exportChartLocal() 方法即可实现客户端导出。

    注意

    1. 如果简单地传递 chartRef.current.chart,子组件不会重新渲染导致获取到 chart 实例为 undefined
    2. 必须使用 exportChartLocal() 方法,若使用 exportChart() 方法仍然会使用服务器导出。
    - + diff --git a/frontend/practice/010-antd-textarea-placeholder-pre-line.html b/frontend/practice/010-antd-textarea-placeholder-pre-line.html index 4d7d622d15..82fdb52b0c 100644 --- a/frontend/practice/010-antd-textarea-placeholder-pre-line.html +++ b/frontend/practice/010-antd-textarea-placeholder-pre-line.html @@ -30,7 +30,7 @@ placeholder 支持换行展示 - + @@ -48,6 +48,6 @@ placeholder={`多个关键词请使用逗号分隔\nShift+Enter换行,Enter搜索`} />
    JSX
    JSX
    - + diff --git a/frontend/practice/015-auto-change-node.html b/frontend/practice/015-auto-change-node.html index 93b8c0afce..6900e837dc 100644 --- a/frontend/practice/015-auto-change-node.html +++ b/frontend/practice/015-auto-change-node.html @@ -30,7 +30,7 @@ 自动切换 node 版本 - + @@ -63,6 +63,6 @@ add-zsh-hook chpwd load-nvmrc load-nvmrc

    保存 .zshrc 文件后,重启终端或重新加载配置:source ~/.zshrc

    提示

    oh-my-zsh 中的 nvm 提供了一些快捷命令和自动补全功能,使得使用 nvm (Node Version Manager) 更加便捷。

    添加 .nvmrc

    项目根目录下创建 .nvmrc 文件,内容为 v20.10.0

    auto-change-node
    auto-change-node
    - + diff --git a/frontend/practice/016-rest-client-error.html b/frontend/practice/016-rest-client-error.html index 4dfc5dcdae..6261cf2aa1 100644 --- a/frontend/practice/016-rest-client-error.html +++ b/frontend/practice/016-rest-client-error.html @@ -30,13 +30,13 @@ rest client 无法调试 localhost - +
    跳至主要內容

    rest client 无法调试 localhost

    njrpracticevscode小于 1 分钟约 153 字

    故障描述

    REST Client 插件无法调试 localhost。

    • REST Client: v0.25.1
    • VS code: 1.91.1

    本地启动 node 服务,使用 REST Client 发送请求:

    GET http://127.0.0.1:8000/ HTTP/1.1
     
    报错
    报错

    排查

    初步怀疑是走了代理,但是查看代理软件日志,发现并没有可疑请求走了国外代理。

    最终在 github 中找到了一个 issue: Rest client ceased to workopen in new window

    并在下方回答中找到:ECONNREFUSED - Connection was Rejectedopen in new window

    将代码改为以下即可成功:

    GET http://[::1]:8000/ HTTP/1.1
     
    - + diff --git a/frontend/practice/017-whistle-debug-real-phone.html b/frontend/practice/017-whistle-debug-real-phone.html index 381debc363..8f49e24051 100644 --- a/frontend/practice/017-whistle-debug-real-phone.html +++ b/frontend/practice/017-whistle-debug-real-phone.html @@ -30,7 +30,7 @@ whistle 调试真机 - + @@ -41,6 +41,6 @@

    注入 eruda

    安装 whistle.inspect 插件,该插件即成了 erudaopen in new window 等调试工具,用来在移动端页面上模拟 Chrome 开发者工具功能的模块。

    w2 i whistle.inspect
     

    配置如下:

    https://localhost:3000/index.html whistle.inspect://eruda disable://cache
     

    这个配置的作用是当访问到 localhost:3000 时,页面会自动注入 eruda 调试工具。

    Chrome inspect

    有些时候,使用 whistle 注入调试工具的效果并不是很好,因此我们可以使用 Chrome inspect 来替代。

    准备工作

    需要的工具:

    操作步骤

    打开手机开发者选项,允许 USB 调试。

    提示

    不同安卓设备打开方式不同,根据品牌谷歌搜索打开方式。

    谷歌浏览器输入 chrome://inspect/ 打开调试工具,点击 inspect 按钮即可调试网页。

    inspect
    inspect

    注意

    应该只能调试 chrome 内核的浏览器。

    - + diff --git a/frontend/practice/018-monaco-editor-react.html b/frontend/practice/018-monaco-editor-react.html index 3034ed6b4d..c1f1ada17b 100644 --- a/frontend/practice/018-monaco-editor-react.html +++ b/frontend/practice/018-monaco-editor-react.html @@ -30,7 +30,7 @@ monaco-editor/react - + @@ -108,6 +108,6 @@ } })
    - + diff --git a/frontend/practice/019-ios-prevent-touch.html b/frontend/practice/019-ios-prevent-touch.html index f19c0e97d4..a924265c43 100644 --- a/frontend/practice/019-ios-prevent-touch.html +++ b/frontend/practice/019-ios-prevent-touch.html @@ -30,7 +30,7 @@ iOS 阻止 touch 事件默认行为 - + @@ -64,6 +64,6 @@ export default usePreventTouchEvent















     













    注意

    在 iOS 上,需要增加 { passive: false } 参数,否则会导致 touch 事件的 preventDefault() 行为失效。

    详细见:addEventListener#passiveopen in new window

    - + diff --git a/frontend/practice/020-ios-img.html b/frontend/practice/020-ios-img.html index fb28a383b9..82ae09c5fd 100644 --- a/frontend/practice/020-ios-img.html +++ b/frontend/practice/020-ios-img.html @@ -30,7 +30,7 @@ iOS 图片兼容 - + @@ -45,6 +45,6 @@ -webkit-tap-highlight-color: transparent; }
    - + diff --git a/frontend/practice/index.html b/frontend/practice/index.html index ad844c54e0..3174b93be4 100644 --- a/frontend/practice/index.html +++ b/frontend/practice/index.html @@ -30,11 +30,11 @@ 实践 - +
    跳至主要內容

    实践

    njr小于 1 分钟约 14 字

    实践

    这里是关于前端实践的文章。

    - + diff --git a/index.html b/index.html index b34fc0d74d..17de7aa4ce 100644 --- a/index.html +++ b/index.html @@ -30,11 +30,11 @@ Home - + -
    跳至主要內容

    Frontend knowledge base

    Enquanto houver 1% de chance, teremo 99% fé.

    Vuepress Plugin Ordered Header
    A vuepress plugin for ordering headers in the sidebar.
    link name
    link detailed description
    book name
    Detailed description of the book
    article name
    Detailed description of the article
    杨小白
    杨小白
    The best way to predict the future is to invent it.
    YanZJNNFF
    YanZJNNFF
    No tomato sauce, please.
    ZXX
    ZXX
    后台技术分享
    享元模式

    patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
    中介者模式

    patterns大约 2 分钟readingdesign patternvanillamediator-pattern
    中间件模式

    patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
    - +
    跳至主要內容

    Frontend knowledge base

    Enquanto houver 1% de chance, teremo 99% fé.

    Vuepress Plugin Ordered Header
    A vuepress plugin for ordering headers in the sidebar.
    link name
    link detailed description
    book name
    Detailed description of the book
    article name
    Detailed description of the article
    杨小白
    杨小白
    The best way to predict the future is to invent it.
    YanZJNNFF
    YanZJNNFF
    No tomato sauce, please.
    ZXX
    ZXX
    后台技术分享
    混入模式

    patterns大约 3 分钟readingdesign patternvanillamixin-pattern
    模块模式

    patterns小于 1 分钟readingdesign patternvanillamodule-pattern
    享元模式

    patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
    中介者模式

    patterns大约 2 分钟readingdesign patternvanillamediator-pattern
    中间件模式

    patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
    + diff --git a/intro.html b/intro.html index 0581de9ad2..fa5802f100 100644 --- a/intro.html +++ b/intro.html @@ -30,11 +30,11 @@ Intro Page - +
    跳至主要內容

    Intro Page

    njr小于 1 分钟约 10 字

    Intro Page

    Place your introduction and profile here.

    - + diff --git a/project/RSSHub/index.html b/project/RSSHub/index.html index b094eac489..35d49957ad 100644 --- a/project/RSSHub/index.html +++ b/project/RSSHub/index.html @@ -30,7 +30,7 @@ 集中管理碎片化知识 - + @@ -150,6 +150,6 @@ } }

    调试

    运行 pnpm dev 命令:

    debug
    debug

    输入对应路由:

    router
    router
    - + diff --git a/project/github-auto-commit/index.html b/project/github-auto-commit/index.html index 90b72ba839..0a9741cf24 100644 --- a/project/github-auto-commit/index.html +++ b/project/github-auto-commit/index.html @@ -30,7 +30,7 @@ 自动点亮 GitHub 热点图 - + @@ -107,6 +107,6 @@ echo "Commits found today." fi
    - + diff --git a/project/imperial-kitchen/01-init.html b/project/imperial-kitchen/01-init.html index 4db3913184..592a9aac4a 100644 --- a/project/imperial-kitchen/01-init.html +++ b/project/imperial-kitchen/01-init.html @@ -30,7 +30,7 @@ 初始化项目 - + @@ -43,6 +43,6 @@ - package.json

    init mobile

    以下按照 Work with monoreposopen in new window 搭建项目。

    在 imperial-kitchen 文件夹中 使用以下命令初始化 expo 项目

    npx create-expo-app apps/mobile
     

    注意

    使用 expo router,必须添加环境变量:EXPO_USE_METRO_WORKSPACE_ROOT=1

    init server

    后端服务选择使用原生 node 开发,详见 服务器架构设计

    配置 lint

    配置 eslintprettiercommitlinthusky

    - + diff --git a/project/imperial-kitchen/02-server.html b/project/imperial-kitchen/02-server.html index 91aa3ad4ee..7d8f38e12b 100644 --- a/project/imperial-kitchen/02-server.html +++ b/project/imperial-kitchen/02-server.html @@ -30,7 +30,7 @@ 服务器架构设计 - + @@ -323,6 +323,6 @@ return { route: notFound, params: {} } }














     

















































    - + diff --git a/project/imperial-kitchen/03-database.html b/project/imperial-kitchen/03-database.html index 21fd00da2e..31c6657ba9 100644 --- a/project/imperial-kitchen/03-database.html +++ b/project/imperial-kitchen/03-database.html @@ -30,7 +30,7 @@ 数据库结构设计 - + @@ -58,6 +58,6 @@ FOREIGN KEY (category_id) REFERENCES category(id) );
    - + diff --git a/project/imperial-kitchen/04-api.html b/project/imperial-kitchen/04-api.html index 80a7f69f05..95b71b071c 100644 --- a/project/imperial-kitchen/04-api.html +++ b/project/imperial-kitchen/04-api.html @@ -30,7 +30,7 @@ 接口设计 - + @@ -48,6 +48,6 @@ description?: string; }

    create

    请求方法:POST

    描述:创建分类。

    请求参数:Category

    响应数据:category_id: number

    - + diff --git a/project/imperial-kitchen/index.html b/project/imperial-kitchen/index.html index 98a2d3a6ca..077ffc0c14 100644 --- a/project/imperial-kitchen/index.html +++ b/project/imperial-kitchen/index.html @@ -30,7 +30,7 @@ Imperial Kitchen 御膳房 - + @@ -40,6 +40,6 @@
    1. 启动前端应用:
    yarn workspace mobile start
     
    1. 启动后端服务器:
    yarn workspace server start
     

    贡献

    欢迎贡献代码!如果您有任何建议或发现了问题,请在 GitHub 上提出问题或提交拉取请求。

    - + diff --git a/project/index.html b/project/index.html index 9353fa8e08..0d76194c27 100644 --- a/project/index.html +++ b/project/index.html @@ -30,11 +30,11 @@ Project - +
    跳至主要內容

    Project

    njr小于 1 分钟约 28 字

    - + diff --git a/project/mini-vue-cli/001-init-project.html b/project/mini-vue-cli/001-init-project.html index d6f764fba0..b128ff3347 100644 --- a/project/mini-vue-cli/001-init-project.html +++ b/project/mini-vue-cli/001-init-project.html @@ -30,7 +30,7 @@ 实现脚手架 ————(一)项目初始化 - + @@ -46,6 +46,6 @@ + |- math.js + |- index.js
    - + diff --git a/project/mini-vue-cli/index.html b/project/mini-vue-cli/index.html index f0a3947d16..5711e7fd40 100644 --- a/project/mini-vue-cli/index.html +++ b/project/mini-vue-cli/index.html @@ -30,11 +30,11 @@ Mini Vue Cli - +
    跳至主要內容

    Mini Vue Cli

    njr小于 1 分钟约 1 字

    - + diff --git a/project/plugin/01.vuepress-plugin-ordered-header.html b/project/plugin/01.vuepress-plugin-ordered-header.html index 5d5358dec9..721159b81b 100644 --- a/project/plugin/01.vuepress-plugin-ordered-header.html +++ b/project/plugin/01.vuepress-plugin-ordered-header.html @@ -30,7 +30,7 @@ Vuepress Plugin Ordered Header - + @@ -96,6 +96,6 @@ } }
    - + diff --git a/project/plugin/index.html b/project/plugin/index.html index b35f4d9821..3c9f5bbe95 100644 --- a/project/plugin/index.html +++ b/project/plugin/index.html @@ -30,11 +30,11 @@ Plugin - +
    跳至主要內容

    Plugin

    njr小于 1 分钟约 12 字

    - + diff --git a/project/ssg/index.html b/project/ssg/index.html index 966bf86f13..1c1763aa30 100644 --- a/project/ssg/index.html +++ b/project/ssg/index.html @@ -30,11 +30,11 @@ 静态站点生成器 - +
    跳至主要內容

    静态站点生成器

    njrProjectssg大约 1 分钟约 395 字

    静态站点生成器(static site generation, ssg)。

    VuePress

    Docusaurus

    Docusaurusopen in new window 是一款静态网站生成器。

    它利用 React 的全部功能来构建具有快速客户端导航功能的单页应用程序,从而使您的网站具有交互性。

    它提供开箱即用的文档功能,但也可用于创建任何类型的网站(个人网站、产品、博客、营销登陆页面等)。

    对比

    Gatsby​

    Gatsbyopen in new window 功能丰富,拥有丰富的插件生态系统,可以实现 Docusaurus 的所有功能。

    当然,这带来了较陡的学习曲线。 Gatsby 在许多方面做得都很出色,适合构建许多类型的网站。另一方面,Docusaurus 力图将一件事做到尽善尽美——成为最好的内容撰写与发布工具。

    GraphQL 是 Gatsby 的核心,但搭建 Gatsby 网站不一定要用到它。 而在大多数静态网站中,你更不需要 GraphQL 所提供的灵活性。

    Docusaurus v2+ 的许多方面都被 Gatsby 的出色之处所启发,这是一个优秀的替代品。

    Docz is a Gatsby theme to build documentation websites. 它的功能与 Docusaurus 相比要匮乏。

    VuePress

    VuePress 与 Docusaurus 有许多相似之处--两者都非常重视以内容为中心的网站,并提供开箱即用的定制文档功能。

    但是,VuePress 是 Vue 驱动的,而 Docusaurus 则是 React 驱动的。

    如果你想要一个基于 Vue 的解决方案,VuePress 是个不错的选择。

    - + diff --git a/project/tyro-ui/001-init-project.html b/project/tyro-ui/001-init-project.html index 075c0744c3..c11fcc02a0 100644 --- a/project/tyro-ui/001-init-project.html +++ b/project/tyro-ui/001-init-project.html @@ -30,7 +30,7 @@ 从零开发组件库(一):搭建项目 - + @@ -269,6 +269,6 @@

    质量

    jest

    安装

    pnpm add jest -D
     

    构建工具

    使用 webpack 作为构建工具。

    pnpm add webpack webpack-cli -D
     
    - + diff --git a/project/tyro-ui/index.html b/project/tyro-ui/index.html index e2fa89bf00..9f73bf6d8a 100644 --- a/project/tyro-ui/index.html +++ b/project/tyro-ui/index.html @@ -30,11 +30,11 @@ Tyro Ui - +
    跳至主要內容

    Tyro Ui

    njr小于 1 分钟约 1 字

    - + diff --git a/reading/index.html b/reading/index.html index 66b93780f1..0440b4663e 100644 --- a/reading/index.html +++ b/reading/index.html @@ -30,11 +30,11 @@ 阅读笔记 - +
    跳至主要內容

    阅读笔记

    njr小于 1 分钟约 12 字

    阅读笔记

    经典书籍阅读笔记。

    - + diff --git a/reading/patterns/index.html b/reading/patterns/index.html index f5c6973143..83b3907790 100644 --- a/reading/patterns/index.html +++ b/reading/patterns/index.html @@ -30,11 +30,11 @@ Patterns - + -
    跳至主要內容

    Patterns

    njr小于 1 分钟约 1 字

    - +
    跳至主要內容

    Patterns

    njr小于 1 分钟约 1 字

    + diff --git a/reading/patterns/vanilla/01-command-pattern.html b/reading/patterns/vanilla/01-command-pattern.html index da45207452..6c646d44c4 100644 --- a/reading/patterns/vanilla/01-command-pattern.html +++ b/reading/patterns/vanilla/01-command-pattern.html @@ -30,11 +30,11 @@ 命令模式 - + -
    跳至主要內容

    命令模式

    patternsreadingdesign patternvanillacommand-pattern大约 2 分钟约 723 字

    命令模式

    通过命令模式,我们可以将执行特定任务的对象与调用方法的对象 解耦

    假设我们有一个在线食品配送平台。用户可以下单、跟踪和取消订单。

    class OrderManager() {
    +    
    跳至主要內容

    命令模式

    patternsreadingdesign patternvanillacommand-pattern大约 2 分钟约 723 字

    命令模式

    通过命令模式,我们可以将执行特定任务的对象与调用方法的对象 解耦

    假设我们有一个在线食品配送平台。用户可以下单、跟踪和取消订单。

    class OrderManager() {
       constructor() {
         this.orders = []
       }
    @@ -173,6 +173,6 @@
     manager.execute(new TrackOrderCommand('1234'))
     manager.execute(new CancelOrderCommand('1234'))
     

    优点

    命令模式允许我们将方法与执行操作的对象解耦。如果您要处理的命令有一定的生命周期,或者命令需要排队并在特定时间执行,那么它能让您获得更多控制权。

    缺点

    命令模式的用例非常有限,而且往往会给应用程序增加不必要的模板。

    参考

    - + diff --git a/reading/patterns/vanilla/02-factory-pattern.html b/reading/patterns/vanilla/02-factory-pattern.html index 8bce8850ff..0567c5ef0a 100644 --- a/reading/patterns/vanilla/02-factory-pattern.html +++ b/reading/patterns/vanilla/02-factory-pattern.html @@ -30,11 +30,11 @@ 工厂模式 - + -
    跳至主要內容

    工厂模式

    patternsreadingdesign patternvanillafactory-pattern大约 2 分钟约 521 字

    通过工厂模式,我们可以使用工厂函数来创建新对象。当一个函数在不使用 new 关键字的情况下返回一个新对象时,它就是一个工厂函数!

    假设我们的应用程序需要许多用户。我们可以创建带有名、姓和电子邮件属性的新用户。工厂函数还会为新创建的对象添加一个 fullName 属性,并返回 namelastName

    const createUser = ({ firstName, lastName, email }) => ({
    +    
    跳至主要內容

    工厂模式

    patternsreadingdesign patternvanillafactory-pattern大约 2 分钟约 521 字

    通过工厂模式,我们可以使用工厂函数来创建新对象。当一个函数在不使用 new 关键字的情况下返回一个新对象时,它就是一个工厂函数!

    假设我们的应用程序需要许多用户。我们可以创建带有名、姓和电子邮件属性的新用户。工厂函数还会为新创建的对象添加一个 fullName 属性,并返回 namelastName

    const createUser = ({ firstName, lastName, email }) => ({
       firstName,
       lastName,
       email,
    @@ -118,6 +118,6 @@
       email: 'jane@doe.com'
     })
     

    参考

    - + diff --git a/reading/patterns/vanilla/03-flyweight-pattern.html b/reading/patterns/vanilla/03-flyweight-pattern.html index 964a3dede7..96f063a238 100644 --- a/reading/patterns/vanilla/03-flyweight-pattern.html +++ b/reading/patterns/vanilla/03-flyweight-pattern.html @@ -30,11 +30,11 @@ 享元模式 - + -
    跳至主要內容

    享元模式

    patternsreadingdesign patternvanillaflyweight-pattern大约 5 分钟约 1354 字

    享元模式

    当我们创建大量对象时,我们可以使用享元模式来减少内存使用。

    在我们的应用程序中,我们希望用户能够添加书籍。所有书籍都有 titleauthorisbn!然而,一个图书馆通常不会只有一本书:它通常有同一本书的多本副本。

    如果有多本完全相同的书,每次创建一个新的图书实例并不是很有用。相反,我们希望创建多个 Book 构造函数实例,代表一本书。

    class Book {
    +    
    跳至主要內容

    享元模式

    patternsreadingdesign patternvanillaflyweight-pattern大约 5 分钟约 1354 字

    享元模式

    当我们创建大量对象时,我们可以使用享元模式来减少内存使用。

    在我们的应用程序中,我们希望用户能够添加书籍。所有书籍都有 titleauthorisbn!然而,一个图书馆通常不会只有一本书:它通常有同一本书的多本副本。

    如果有多本完全相同的书,每次创建一个新的图书实例并不是很有用。相反,我们希望创建多个 Book 构造函数实例,代表一本书。

    class Book {
       constructor(title, author, isbn) {
         this.title = title
         this.author = author
    @@ -81,6 +81,6 @@
     addBook('To Kill a Mockingbird', 'Harper Lee', 'CD345', false, 20)
     addBook('The Great Gatsby', 'F. Scott Fitzgerald', 'EF567', false, 20)
     

    特点

    享元模式是一种结构型设计模式,其核心思想是通过共享已经存在的对象来减少内存占用,从而提高性能。有两个特点:

    • 对象共享:避免重复创建相同状态的对象,节省内存。
    • 不可变部分与可变部分分离:将对象分为共享的、不可变的部分(如 titleauthorisbn)和非共享的、可变的部分(如 availabilitysales)。

    上述代码体现了这两个特点:

    Book 类实例化了书籍的基本信息(titleauthorisbn),并通过 Map 存储,确保同样的 isbn 只会创建一次。这部分相当于享元对象的内部状态(不可变且可以被多个实例共享)。

    addBook 函数添加了一些书籍的可变信息(salesavailability),这些信息属于享元对象的外部状态(每次使用时可以独立指定)。

    优点

    • 减少内存占用:避免了为每个新书籍对象重复创建相同的 Book 实例。如果书籍的 isbn 相同,那么不再创建新的实例,而是共享现有的对象。
    • 提高性能:通过共享已有对象,减少对象的创建和销毁,特别是在大量数据处理的场景中能显著提高性能。
    • 更好的管理:将不可变的数据与可变数据分开,代码逻辑更加清晰,易于维护。

    适用场景

    在本例中,由于 titleauthorisbn 都是基本数据类型(字符串),享元模式带来的优化可能会非常有限,甚至没有明显的优势,原因如下:

    • 内存优化有限:由于字符串本身是不可变且通常由引擎优化处理,JavaScript 已经会对相同的字符串进行共享存储(类似于享元模式),这意味着手动实现的享元模式在这方面并没有太大的额外好处。
    • 重复实例减少不明显:与对象不同,基本类型的重复实例在内存中通常不会像对象那样占用大量空间。因此,避免创建多个基本类型的实例不会有明显的内存节省。

    因此,享元模式适用于有大量公共内在属性的场景,如:粒子系统,在这种情况下,每个粒子都有一些共同的属性,如颜色、精灵图等。通过享元模式,我们可以共享这些属性,从而节省内存。

    注意

    实际上享元模式是共享一些内在的公共状态,而不是共享所有的状态。

    在 JavaScript 中,我们可以通过原型继承轻松解决这个问题。

    在享元模式中,虽然最后创建的对象数量和之前一样多,但会大量节省内存。在本例中可能没有体现出这个好处,但是如果共享的内在状态是对象,那么享元模式就可以发挥作用。

    - + diff --git a/reading/patterns/vanilla/04-mediator-pattern.html b/reading/patterns/vanilla/04-mediator-pattern.html index e155c68579..29b9c6f7c5 100644 --- a/reading/patterns/vanilla/04-mediator-pattern.html +++ b/reading/patterns/vanilla/04-mediator-pattern.html @@ -30,11 +30,11 @@ 中介者模式 - + -
    跳至主要內容

    中介者模式

    patternsreadingdesign patternvanillamediator-pattern大约 2 分钟约 516 字

    中介者模式使组件之间通过一个中心点(调解器)进行交互成为可能。它允许组件接收请求并将其发送出去,而不是彼此直接对话!在 JavaScript 中,中介者通常只是一个对象字面或函数。

    你可以把这种模式比作空中交通管制员和飞行员之间的关系。飞行员与空中交通管制员之间的对话可能会导致混乱,而不是让飞行员直接对话。空中交通管制员确保所有飞机都能收到所需的信息,以便安全飞行,不撞击其他飞机。

    虽然我们不希望在 JavaScript 中控制飞机,但我们经常需要处理对象之间的多向数据。如果组件数量较多,组件之间的通信可能会变得相当混乱。

    20240918170836
    20240918170836

    与让每个对象直接与其他对象对话从而形成多对多的关系不同,对象的请求由调解器处理。调解器处理请求,并将其发送到需要的地方。

    20240918170920
    20240918170920

    聊天室就是中间件模式的一个很好的用例!聊天室中的用户不会直接对话。聊天室只是用户之间的中介。

    聊天室示例
    跳至主要內容

    中介者模式

    patternsreadingdesign patternvanillamediator-pattern大约 2 分钟约 516 字

    中介者模式使组件之间通过一个中心点(调解器)进行交互成为可能。它允许组件接收请求并将其发送出去,而不是彼此直接对话!在 JavaScript 中,中介者通常只是一个对象字面或函数。

    你可以把这种模式比作空中交通管制员和飞行员之间的关系。飞行员与空中交通管制员之间的对话可能会导致混乱,而不是让飞行员直接对话。空中交通管制员确保所有飞机都能收到所需的信息,以便安全飞行,不撞击其他飞机。

    虽然我们不希望在 JavaScript 中控制飞机,但我们经常需要处理对象之间的多向数据。如果组件数量较多,组件之间的通信可能会变得相当混乱。

    20240918170836
    20240918170836

    与让每个对象直接与其他对象对话从而形成多对多的关系不同,对象的请求由调解器处理。调解器处理请求,并将其发送到需要的地方。

    20240918170920
    20240918170920

    聊天室就是中间件模式的一个很好的用例!聊天室中的用户不会直接对话。聊天室只是用户之间的中介。

    聊天室示例.send('Hello, Bob!', user2) user3.send('Hi everyone!')
    - + diff --git a/reading/patterns/vanilla/05-middleware-pattern.html b/reading/patterns/vanilla/05-middleware-pattern.html index fc8d926f05..d018455f1d 100644 --- a/reading/patterns/vanilla/05-middleware-pattern.html +++ b/reading/patterns/vanilla/05-middleware-pattern.html @@ -30,11 +30,11 @@ 中间件模式 - + -
    跳至主要內容

    中间件模式

    patternsreadingdesign patternvanillamiddleware-pattern大约 1 分钟约 363 字

    中间件模式

    中间件模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。

    相关信息

    Express 就使用了中间件模式处理请求。中间件模式是 Express 核心架构的一部分,它允许你在处理请求的过程中,通过一系列中间件函数来对请求和响应对象进行操作。中间件在请求-响应生命周期中充当「处理链」中的一个节点,既可以终止请求(发送响应),也可以将请求传递给下一个中间件。

    function middleware(req, res, next) {
    +    
    跳至主要內容

    中间件模式

    patternsreadingdesign patternvanillamiddleware-pattern大约 1 分钟约 363 字

    中间件模式

    中间件模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。

    相关信息

    Express 就使用了中间件模式处理请求。中间件模式是 Express 核心架构的一部分,它允许你在处理请求的过程中,通过一系列中间件函数来对请求和响应对象进行操作。中间件在请求-响应生命周期中充当「处理链」中的一个节点,既可以终止请求(发送响应),也可以将请求传递给下一个中间件。

    function middleware(req, res, next) {
       // 执行某些逻辑
       next(); // 调用 next() 将请求传递给下一个中间件
     }
    @@ -75,7 +75,7 @@
         runner(0);
       }
     }
    -
    - +
    + diff --git a/reading/patterns/vanilla/06-mixin-pattern.html b/reading/patterns/vanilla/06-mixin-pattern.html new file mode 100644 index 0000000000..a0a9e9e890 --- /dev/null +++ b/reading/patterns/vanilla/06-mixin-pattern.html @@ -0,0 +1,145 @@ + + + + + + + + + + 混入模式 + + + + + +
    跳至主要內容

    混入模式

    patternsreadingdesign patternvanillamixin-pattern大约 3 分钟约 1010 字

    混入模式

    mixin 是一种对象,我们可以使用它为另一个对象或类添加可重复使用的功能,而无需使用继承。我们不能单独使用 mixins:mixins 的唯一目的是在不使用继承的情况下为对象或类添加功能。

    假设我们的应用程序需要创建多条狗。然而,我们创建的基本狗没有任何属性,只有一个名称属性。

    class Dog {
    +  constructor(name) {
    +    this.name = name
    +  }
    +}
    +

    狗不应该只有名字。它应该会 barkwagTailplay! 我们可以创建一个 mixin,而不是直接将其添加到 Dog 中。

    const dogFunctionality = {
    +  bark: () => console.log('Woof!'),
    +  wagTail: () => console.log('Wagging my tail!'),
    +  play: () => console.log('Playing!')
    +}
    +

    我们可以使用 Object.assign 方法将 dogFunctionality 混合元素添加到 Dog 原型中。通过该方法,我们可以向目标对象添加属性:本例中为 Dog.prototypeDog 的每个新实例都可以访问 dogFunctionality 的属性,因为它们都被添加到了 Dog 的原型中!

    class Dog {
    +  constructor(name) {
    +    this.name = name
    +  }
    +}
    +
    +const dogFunctionality = {
    +  bark: () => console.log('Woof!'),
    +  wagTail: () => console.log('Wagging my tail!'),
    +  play: () => console.log('Playing!')
    +}
    +
    +Object.assign(Dog.prototype, dogFunctionality)
    +
    +const pet1 = new Dog('Daisy')
    +
    +pet1.name // Daisy
    +pet1.bark() // Woof!
    +pet1.play() // Playing!
    +

    虽然我们可以在不使用继承的情况下使用 mixin 添加功能,但 mixin 本身也可以使用继承!大多数哺乳动物(除了海豚,也许还有其他动物)都会走路和睡觉。狗是哺乳动物,应该会走路和睡觉!

    const animalFunctionality = {
    +  walk: () => console.log('Walking!'),
    +  sleep: () => console.log('Sleeping!')
    +}
    +

    我们可以使用 Object.assign 将这些属性添加到 dogFunctionality 原型中。在本例中,目标对象是 dogFunctionality

    const animalFunctionality = {
    +  walk: () => console.log('Walking!'),
    +  sleep: () => console.log('Sleeping!')
    +}
    +
    +const dogFunctionality = {
    +  bark: () => console.log('Woof!'),
    +  wagTail: () => console.log('Wagging my tail!'),
    +  play: () => console.log('Playing!'),
    +  walk() {
    +    super.walk()
    +  },
    +  sleep() {
    +    super.sleep()
    +  }
    +}
    +
    +Object.assign(dogFunctionality, animalFunctionality)
    +Object.assign(Dog.prototype, dogFunctionality)
    +

    在现实世界中,浏览器环境中的 Window 就是一个 mixin 的例子。 Window 对象从 WindowOrWorkerGlobalScopeWindowEventHandlers mixins 中实现了许多属性,这使我们可以访问 setTimeoutsetIntervalindexedDBisSecureContext 等属性。

    由于它是一个 mixin,因此只能用于为对象添加功能,您将无法创建 WindowOrWorkerGlobalScope 类型的对象。

    indexedDB
    window.indexedDB.open('toDoList')
    +
    +window.addEventListener('beforeunload', (event) => {
    +  event.preventDefault()
    +  event.returnValue = ''
    +})
    +
    +window.onbeforeunload = function () {
    +  console.log('Unloading!')
    +}
    +
    +console.log('From WindowEventHandlers mixin: onbeforeunload', window.onbeforeunload)
    +
    +console.log('From WindowOrWorkerGlobalScope mixin: isSecureContext', window.isSecureContext)
    +
    +console.log('WindowEventHandlers itself is undefined', window.WindowEventHandlers)
    +
    +console.log('WindowOrWorkerGlobalScope itself is undefined', window.WindowOrWorkerGlobalScope)
    +

    总结

    在引入 ES6 类之前,mixins 通常用于为 React 组件添加功能。 React 团队不鼓励使用 mixins,因为它很容易给组件增加不必要的复杂性,使其难以维护和重用。React 团队鼓励使用高阶组件,现在这些组件通常可以被 Hooks 代替。

    混入模式看起来和继承非常类似,但是有一点区别:

    • 继承:继承通常是在类定义时确定的,子类会继承父类的所有方法和属性,并且可以覆盖或扩展它们。
    • 混入:混入是动态的、灵活的,你可以在对象或类实例创建后将某些行为混入,而不必在定义时就确定继承关系。混入只是通过组合而不是创建严格的继承链。

    因此上面的实现仍然是混入模式。

    提示

    虽然你修改了原型,但混入模式的本质是将多个功能组合到一个类或对象中,而不强制遵循严格的继承层次结构。因此,它依然可以被认为是混入模式。

    如果不想直接修改原型,可以选择实例级别的混入:

    class Dog {
    +  constructor(name) {
    +    this.name = name
    +  }
    +}
    +
    +const dogFunctionality = {
    +  bark: () => console.log('Woof!'),
    +  wagTail: () => console.log('Wagging my tail!'),
    +  play: () => console.log('Playing!')
    +}
    +
    +const pet1 = new Dog('Daisy')
    +
    +// 仅将功能混入特定实例,而不是修改原型
    +Object.assign(pet1, dogFunctionality)
    +
    +pet1.bark() // Woof!
    +

    提示

    通过向对象的原型注入功能,mixins 可以让我们在没有继承的情况下为对象轻松添加功能。修改对象的原型被认为是一种不好的做法,因为这会导致原型污染和函数来源的不确定性。

    + + + diff --git a/reading/patterns/vanilla/07-module-pattern.html b/reading/patterns/vanilla/07-module-pattern.html new file mode 100644 index 0000000000..71c95dd972 --- /dev/null +++ b/reading/patterns/vanilla/07-module-pattern.html @@ -0,0 +1,40 @@ + + + + + + + + + + 模块模式 + + + + + +
    跳至主要內容

    模块模式

    patternsreadingdesign patternvanillamodule-pattern小于 1 分钟约 218 字

    随着应用程序和代码库的增长,保持代码的可维护性和分离性变得越来越重要。模块模式可以将代码分割成更小的、可重复使用的片段。

    除了可以将代码分割成更小的、可重复使用的片段外,模块还可以将文件中的某些值保持私有。默认情况下,模块中的声明会被作用域(封装)到该模块。如果我们没有明确导出某个值,那么该值在该模块之外就不可用。这就降低了代码库其他部分声明的值发生名称冲突的风险,因为这些值在全局范围内不可用。

    更详细的内容可以见 模块化

    + + + diff --git a/reading/patterns/vanilla/index.html b/reading/patterns/vanilla/index.html index c62f6d17c8..ee53cfe5e6 100644 --- a/reading/patterns/vanilla/index.html +++ b/reading/patterns/vanilla/index.html @@ -30,11 +30,11 @@ 介绍 - + -
    跳至主要內容

    介绍

    patternsreadingdesign patternvanilla大约 1 分钟约 427 字

    提示

    内容来自:patternsopen in new window

    设计模式是软件开发的基本组成部分,因为它们为软件设计中经常出现的问题提供了典型的解决方案。

    与其说设计模式提供了具体的软件,不如说设计模式只是一种概念,可以用一种优化的方式处理重复出现的问题。

    在过去几年中,Web 开发的生态系统发生了巨大的变化。一些众所周知的设计模式可能已经不再像以前那样有价值,而另一些设计模式则已经发展到可以利用新技术解决现代问题。

    Facebook 的 JavaScript 库 React 在过去五年中取得了巨大的发展,与 Angularopen in new windowVueopen in new windowEmberopen in new windowSvelteopen in new window 等相比,React 是目前 NPM 上下载次数最多open in new window 的框架。

    由于 React 的流行,设计模式不断被修改、优化和创建,以便为当前的现代网络开发生态系统提供价值。最新版本的 React 引入了名为 Hooks 的新功能,它在应用程序设计中扮演着非常重要的角色,可以取代许多传统的设计模式。

    现代网络开发涉及许多不同类型的模式。本项目涵盖使用 ES2015+ 的常见设计模式的实现、优点和缺陷,React 特有的设计模式及其可能的修改和使用 React Hooks 的实现,以及更多有助于改进现代网络应用程序的模式和优化!

    - +
    跳至主要內容

    介绍

    patternsreadingdesign patternvanilla大约 1 分钟约 427 字

    提示

    内容来自:patternsopen in new window

    设计模式是软件开发的基本组成部分,因为它们为软件设计中经常出现的问题提供了典型的解决方案。

    与其说设计模式提供了具体的软件,不如说设计模式只是一种概念,可以用一种优化的方式处理重复出现的问题。

    在过去几年中,Web 开发的生态系统发生了巨大的变化。一些众所周知的设计模式可能已经不再像以前那样有价值,而另一些设计模式则已经发展到可以利用新技术解决现代问题。

    Facebook 的 JavaScript 库 React 在过去五年中取得了巨大的发展,与 Angularopen in new windowVueopen in new windowEmberopen in new windowSvelteopen in new window 等相比,React 是目前 NPM 上下载次数最多open in new window 的框架。

    由于 React 的流行,设计模式不断被修改、优化和创建,以便为当前的现代网络开发生态系统提供价值。最新版本的 React 引入了名为 Hooks 的新功能,它在应用程序设计中扮演着非常重要的角色,可以取代许多传统的设计模式。

    现代网络开发涉及许多不同类型的模式。本项目涵盖使用 ES2015+ 的常见设计模式的实现、优点和缺陷,React 特有的设计模式及其可能的修改和使用 React Hooks 的实现,以及更多有助于改进现代网络应用程序的模式和优化!

    + diff --git a/reading/pragmatic-programmer/01-a-pragmatic-philosophy.html b/reading/pragmatic-programmer/01-a-pragmatic-philosophy.html index dbcd9c172c..80a13288f1 100644 --- a/reading/pragmatic-programmer/01-a-pragmatic-philosophy.html +++ b/reading/pragmatic-programmer/01-a-pragmatic-philosophy.html @@ -30,11 +30,11 @@ 务实的哲学 - +
    跳至主要內容

    务实的哲学

    njrREADINGpragmatic大约 2 分钟约 545 字

    人生是你的

    我活着不是为了满足你的期望,正如你活着也不是为了满足我的期望。——李小龙

    你有权选择。

    • 工作无聊,技术过时,尝试主动改变,为此而加班才是合理的。
    • 这个行业给了你一系列非凡的机遇。积极主动点,掌控这些机遇。

    我的源码被猫吃了

    • 为问题负责,提供解决方案。
    • 增强自己在团队中的信任力。

    软件的熵

    破窗——糟糕的设计、错误的决定、低劣的代码。

    • 不要容忍破窗。
    • 不要打破窗户。

    石头汤与煮青蛙

    • 主动 Own 一件事情,做变革的催化剂。
    • 留意大局,持续观察周围的事情,不局限于自己的工作。

    够好即可的软件

    写出够好的软件即可。

    • 让质量成为需求问题(先交付再持续根据用户反馈进行优化)。
    • 不要过度设计。

    知识资产

    经营你的资产:

    • 不断学习,不断提升自己的技能。
    • 保持学习的广度。
    • 在新的技术流行之前学习。

    目标:

    • 每年至少学习一种新语言(或框架)。
    • 每季度阅读一本技术书籍。
    • 也要阅读一些非技术类的书籍。
    • 上课。
    • 参加技术会议。
    • 试验不同的环境。
    • 订阅技术杂志,与时俱进。

    在学习时,需要批判地进行思考,不要盲目地接受。

    • 问「五个为什么」。
    • 谁从中受益。
    • 有什么背景。
    • 什么时候在哪里可以工作。
    • 为什么这是个问题。

    交流

    作为开发人员,我们必须在多个层次上进行交流。

    • 知道你要说什么。
    • 了解你的听众。
    • 选择时机。
    • 选择风格。
    • 让文档美观。
    • 让听众参与。
    • 做倾听者,如果你不听观众说话,那观众也不会听你说话。
    • 记得回复他人。

    注释源码,建议给模块和导出函数都加上注释,这能在其他开发者使用的时候,给他们很大的助力。

    - + diff --git a/reading/pragmatic-programmer/02-a-pragmatic-approach.html b/reading/pragmatic-programmer/02-a-pragmatic-approach.html index 47d339f06f..a59323913b 100644 --- a/reading/pragmatic-programmer/02-a-pragmatic-approach.html +++ b/reading/pragmatic-programmer/02-a-pragmatic-approach.html @@ -30,11 +30,11 @@ 务实的方法 - +
    跳至主要內容

    务实的方法

    njrREADINGpragmatic大约 3 分钟约 787 字

    优秀设计的精髓

    ETC 原则(Easier To Change):

    • 解耦:隔离关注焦点,可以更容易地进行修改。
    • 单一职责原则:一个需求的变化只会影响一个模块。
    • 命名:良好的命名可以使代码更容易阅读。

    DRY——邪恶的重复

    DRY(Don't Repeat Yourself)原则:

    • 代码中的重复。
    • 文档中的重复。
    • 数据中的重复。

    正交性

    对于两个或多个事物,如果它们的行为不会相互影响,那么它们就是正交的。

    象征着独立性和解耦。

    • 保持代码解耦。
    • 避免全局数据。
    • 避免相似的函数,每个函数都有不同的中心算法,可以使用「策略模式」进行优化。
    • 编写单元测试。

    可逆性

    • 将第三方的 API 隐藏在自己的抽象层之后。
    • 将代码分解为多个组件。

    曳光弹

    先实现最小可行产品(MVP)。

    原型与便签

    你可以为下列事物做原型:

    • 架构
    • 已存在的系统中的新功能
    • 数据结构或外部数据的内容
    • 第三方工具或组件
    • 性能问题
    • 用户界面设计

    当制作一个原型时,下面几个方面可以忽略:

    • 正确性:你可以在适当的地方使用替代数据。
    • 完整性:原型只需要满足有限的功能,可能只有一个预先选好的输入数据片段及单个菜单选项。
    • 健壮性:错误检查可以不完整,甚至完全没有都行。如果你偏离了预定的航线,原型机很可能烧毁在绚丽的烟火中——那又如何!
    • 格式:原型代码可能并不需要太多注释和文档(尽管围绕从原型中获取的经验,可能会产生大量文档,但是相对而言,原型系统本身的文档要少得多)。

    制作架构原型:

    • 主要组件的职责是否恰当,有没有定义清晰?
    • 主要组件之间的协作是否定义清晰?
    • 耦合度最小化了吗?
    • 你能确定重复的潜在来源吗?
    • 接口的定义和约束能否接受?
    • 在执行过程中是否每个模块都有访问所需数据的途径?在需要数据的时候,能访问到吗?

    领域语言

    计算机的语言会影响你怎样思考问题,影响你怎样看待信息的传播。

    每一门语言都有一个特性列表——比如这些时髦的术语:静态类型还是动态类型,早期绑定还是晚期绑定,函数式还是面向对象,继承模型,mixin,宏机制——所有这些对问题的解决方案,既可能提供建议也可能扰乱视听。

    同样是设计解决方案,用 C++ 的方式和用 Haskell 的思想,得到的结果会大为不同,反之亦然。

    估算

    通过估算来避免意外。

    估算项目进度,根据代码不断迭代项目进度表。(TODO 看板?)

    - + diff --git a/reading/pragmatic-programmer/03-basic-tool.html b/reading/pragmatic-programmer/03-basic-tool.html index 553346e5e8..5fddc849a8 100644 --- a/reading/pragmatic-programmer/03-basic-tool.html +++ b/reading/pragmatic-programmer/03-basic-tool.html @@ -30,11 +30,11 @@ 基础工具 - +
    跳至主要內容

    基础工具

    njrREADINGpragmatic大约 2 分钟约 578 字

    让需求来驱使你不断选购新的工具。

    纯文本的威力

    用纯文本保存知识。

    shell 游戏

    发挥 shell 命令的优势。花费一些精力熟悉 shell。

    加强编辑器能力

    熟悉编辑器:

    • 当编辑文本时,以字符、单词、行、段落为单位移动光标及进行选择。
    • 当编辑代码时,在各种语法单元(配对的分隔符、函数、模块……)之间移动。
    • 做完修改后,重新缩进代码。
    • 用单个指令完成代码块的注释或取消注释。
    • Undo 并 Redo 变更。
    • 把编辑窗口切割成多个面板,然后在它们之间跳转。
    • 跳转到特定的行号。
    • 对选出的多行进行排序。
    • 搜索普通字符串,或用正则表达式搜索,然后重复上一次的搜索。
    • 基于框选或某个模式匹配的结果,临时创建多个光标,并行地在多个光标处编辑文本。
    • 显示当前项目的编译错误。
    • 跑一下当前项目的测试。

    编辑时要自省。每次发现自己又在重复做某件事情的时候,要习惯性地想到「或许有更好的方法」,然后找到这个方法。

    一旦你发掘出一个新的有用的特性,需要尽快把它内化成一种肌肉记忆,这样在使用的时候就能不假思索。

    当你在使用编辑器过程中遇到明显的限制时,可以四处找找有什么扩展可以解决问题。

    更进一步,深入研究一下编辑器的扩展语言。搞明白怎样用它来将一些重复工作自动化——通常也就是一两行代码的事情。

    有时你还会走得更远,不知不觉就写出一个完整的扩展。那么,不妨发布出去:你需要它,其他人也会需要的。

    版本控制

    永远使用版本控制。

    调试

    • 复现
    • 阅读错误信息

    文本处理

    学习一门文本处理语言,pyjsruby

    工程日记

    记录所做的事情、所学的东西、想法的草图——基本上都是各种与工作有关的东西。

    - + diff --git a/reading/pragmatic-programmer/04-pragmatic-paranoid.html b/reading/pragmatic-programmer/04-pragmatic-paranoid.html index b3a1eef108..e5a1c9b572 100644 --- a/reading/pragmatic-programmer/04-pragmatic-paranoid.html +++ b/reading/pragmatic-programmer/04-pragmatic-paranoid.html @@ -30,11 +30,11 @@ 务实的偏执 - +
    跳至主要內容

    务实的偏执

    njrREADINGpragmatic大约 1 分钟约 316 字

    契约式设计

    文档化及对主张进行检验是契约式设计(缩写为 DBC)的核心。

    提示

    前置条件

    为调用这个例程,必须为真的是什么?例程的需求。一个例程永远不应该在前置条件被违反的时候被调用。传递良好的数据是调用者的责任。

    后置条件

    例程保证要做的是什么?例程完成时世界的状态。例程有后置条件这个事实,意味着能得出这样的结论——不允许无限循环。

    类的不变式

    从调用者的角度来看,类会确保该条件始终为真。在例程的内部处理期间,可以不遵守不变式,但是当例程退出并将控制权返回给调用者时,不变式必须为真。(注意,一个类不能给参与不变式的任何数据成员不受限制的写访问权限。)

    通过契约进行设计

    如果你订的契约是可以接受任何东西,并且承诺要回报整个世界,那么你就有很多代码要写!

    提示

    是不是这就是需要解耦?

    - + diff --git a/reading/pragmatic-programmer/05-work-around.html b/reading/pragmatic-programmer/05-work-around.html index 387185461f..61fe3a7113 100644 --- a/reading/pragmatic-programmer/05-work-around.html +++ b/reading/pragmatic-programmer/05-work-around.html @@ -30,11 +30,11 @@ 宁弯不折 - +
    跳至主要內容

    宁弯不折

    njrREADINGpragmatic大约 1 分钟约 318 字

    尽量编写宽松灵活的代码,增强代码的健壮性。

    有一个保持灵活性的好方法,那就是编写更少的代码。修改代码可能会引入新的 Bug

    解耦

    代码耦合会导致「一改都改」。

    • 解耦让改变代码更容易;
    • 避免全局数据。

    在现实世界抛球杂耍

    利用下面四种策略编写更好的程序:

    1. 有限状态机
    2. 观察者模式
    3. 发布/订阅
    4. 响应式编程与流

    变换式编程

    把程序视为从输入到输出的一个变换。

    • 编程谈的是代码,但程序谈的是数据;
    • 将代码看作是一系列的变换。

    继承税

    继承就是耦合。

    更好的替代方案:

    • 接口:尽量使用接口来表达多态
    • 委托
    • mixin 与特征

    提示

    所以 React、Vue 都走向了函数式编程?

    配置

    使用外部配置参数化应用程序,使用 json, yml 等。

    - + diff --git a/reading/pragmatic-programmer/06-concurrent.html b/reading/pragmatic-programmer/06-concurrent.html index 6fbff4acb5..5a1f7c1f3b 100644 --- a/reading/pragmatic-programmer/06-concurrent.html +++ b/reading/pragmatic-programmer/06-concurrent.html @@ -30,11 +30,11 @@ 并发 - +
    跳至主要內容

    并发

    njrREADINGpragmatic小于 1 分钟约 130 字

    打破时域耦合

    时域耦合——在时间范畴上产生耦合:A 方法必须在 B 方法之前调用;一次只能运行一个报告;在按钮按下前必须等屏幕先重绘;“嘀嘀”一定在“嗒嗒”之前发生。

    我们需要考虑并发性,并且考虑对时间依赖或顺序依赖解耦。

    • 通过分析工作流来提高并发性
    • 做事也需要思考如何解耦
    - + diff --git a/reading/pragmatic-programmer/07-when-coding.html b/reading/pragmatic-programmer/07-when-coding.html index 9d259aa9f9..e42f9efbc7 100644 --- a/reading/pragmatic-programmer/07-when-coding.html +++ b/reading/pragmatic-programmer/07-when-coding.html @@ -30,11 +30,11 @@ 当你编码时 - +
    跳至主要內容

    当你编码时

    njrREADINGpragmatic大约 1 分钟约 371 字

    对所有代码进行批判性思考,包括自己的代码。不断看到程序和设计的改进空间。

    听从蜥蜴脑

    一种有效的脑力突破的方法:

    1. 在便签上写下「我正在做 xx」,然后贴在屏幕的一侧。
    2. 提醒自己,「xx」注定要出问题。提醒自己,「xx」即使没有出问题也会被扔掉。这样做没有坏处。
    3. 在空编辑器窗口中,写一条注释,用一句话描述你想学点什么或做点什么。
    4. 开始编码。

    如果在实验结束后仍旧不舒服,那就重新从散步、谈话和休息开始。

    阅读别人的代码。

    重构

    重组现有代码实体、改变其内部结构而不改变其外部行为的规范式技术。

    重构是一项日复一日的工作,需要采取低风险的小步骤进行,它更像是耙松和除草这类活动。这是一种有针对性的、精确的方法,有助于保持代码易于更改,而不是对代码库进行自由的、大规模的重写。

    为了保证外部行为没有改变,你需要良好的自动化单元测试来验证代码的行为。

    • 尽早重构,尽快重构

    注意安全

    • 保持代码简洁,让攻击面更小
    • 尽早打上安全补丁
    - + diff --git a/reading/pragmatic-programmer/08-before-start-project.html b/reading/pragmatic-programmer/08-before-start-project.html index 6a64862d99..cdadb14a8a 100644 --- a/reading/pragmatic-programmer/08-before-start-project.html +++ b/reading/pragmatic-programmer/08-before-start-project.html @@ -30,11 +30,11 @@ 项目启动前 - +
    跳至主要內容

    项目启动前

    njrREADINGpragmatic大约 1 分钟约 401 字

    在项目的最早期,你和团队需要了解需求。仅仅是被人告知要做什么或是倾听用户是不够的:读一下需求之坑,学习如何避免常见的陷阱。

    需求之坑

    需求很少停留在表面。通常情况下,它们被埋在层层的假设、误解和政治之下。更糟糕的是,需求通常根本不存在。

    • 无人确切知道自己想要什么
    • 程序员帮助人们理解他们想要什么
    • 需求是从反馈循环中学到的
    • 和用户一起工作以便从用户角度思考
    • 使用项目术语表

    处理无法解决的难题

    偶尔也会出现一个真的非常困难的问题,你会发现自己顿时被卷入项目之中:一些工程问题你把握不了,或者某些代码比你想象的更难写,也许看起来根本做不到。但这些真的像看起来那么难吗?

    解决谜题的关键是,认识到你所受到的约束和你所拥有的自由度,因为认识到这些就会找到答案。

    • 不要跳出框框思考——找到框框
    • 跳出自身的局限
    • 幸运眷顾有准备的人

    携手共建

    「一起工作」的真正含义:不仅仅是提问、讨论、做笔记,还要在真正编码的同一时刻提问和讨论。

    • 结对编程
    • 集体编程
    • 不要一个人埋头钻进代码中
    - + diff --git a/reading/pragmatic-programmer/09-pragmatic-project.html b/reading/pragmatic-programmer/09-pragmatic-project.html index 4911083f3b..edff0c5bd9 100644 --- a/reading/pragmatic-programmer/09-pragmatic-project.html +++ b/reading/pragmatic-programmer/09-pragmatic-project.html @@ -30,11 +30,11 @@ 务实的项目 - +
    跳至主要內容

    务实的项目

    njrREADINGpragmatic小于 1 分钟约 231 字

    一旦项目不只你一个人,就需要建立一些基本规则,并依次将项目的各部分分配出去。

    务实的团队

    • 维持小而稳定的团队
    • 禁止破窗
    • 团队的工作不应仅致力于开发新功能,还可能包括:
      • 旧系统的维护
      • 流程的反思与精炼
      • 实验新技术
      • 学习和提升技能
    • 做能起作用的事,别赶时髦

    务实的入门套件

    • 版本控制
    • 回归测试
    • 完全自动化

    傲慢与偏见

    在作品上签名。

    保持匿名会滋生粗心、错误、懒惰和糟糕的代码,特别是在大型项目中——很容易把自己看成只是大齿轮上的一个小齿,在无休止的工作汇报中制造蹩脚的借口,而不是写出好的代码。

    - + diff --git a/reading/pragmatic-programmer/index.html b/reading/pragmatic-programmer/index.html index ee8eab95c9..304214dc6c 100644 --- a/reading/pragmatic-programmer/index.html +++ b/reading/pragmatic-programmer/index.html @@ -30,11 +30,11 @@ 程序员修炼之道:从小工到专家 - + - + diff --git a/reading/pro-git/01-getting-started.html b/reading/pro-git/01-getting-started.html index 7675f80261..57d773429c 100644 --- a/reading/pro-git/01-getting-started.html +++ b/reading/pro-git/01-getting-started.html @@ -30,7 +30,7 @@ 起步 - + @@ -40,6 +40,6 @@ git config --global user.email johndoe@example.com

    检查配置信息

    可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。

    git config --list
     

    获取帮助

    使用 git help 获取 Git 命令的全面帮助手册。

    使用 git -h 获取更加简明的输出。

    - + diff --git a/reading/pro-git/02-git-basics.html b/reading/pro-git/02-git-basics.html index 23c35749e8..edba849218 100644 --- a/reading/pro-git/02-git-basics.html +++ b/reading/pro-git/02-git-basics.html @@ -30,7 +30,7 @@ Git 基础 - + @@ -304,6 +304,6 @@

    检出标签

    如果你想查看某个标签所指向的文件版本,可以使用 git checkout 命令, 虽然这会使你的仓库处于“分离头指针(detached HEAD)”的状态——这个状态有些不好的副作用。

    在「分离头指针」状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支:

    $ git checkout -b version2 v2.0.0
     Switched to a new branch 'version2'
     

    如果在这之后又进行了一次提交,version2 分支就会因为这个改动向前移动, 此时它就会和 v2.0.0 标签稍微有些不同,这时就要当心了。

    Git 别名

    推荐使用 oh-my-zsh,其中内置了 git 插件,包含别名和一些其他内容。

    - + diff --git a/reading/pro-git/03-git-branch.html b/reading/pro-git/03-git-branch.html index 4d2f851f80..0cd4f8c9df 100644 --- a/reading/pro-git/03-git-branch.html +++ b/reading/pro-git/03-git-branch.html @@ -30,7 +30,7 @@ Git 分支 - + @@ -171,6 +171,6 @@

    它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。

    将 C4 中的修改变基到 C3 上
    将 C4 中的修改变基到 C3 上

    现在回到 master 分支,进行一次快进合并。

    $ git checkout master
     $ git merge experiment
     
    master 分支的快进合并
    master 分支的快进合并

    这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。

    请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

    变基的风险

    呃,奇妙的变基也并非完美无缺,要用它得遵守一条准则:

    如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

    因为 rebase 会修改 commit,若你拉取的是 rebase 后的代码,则会遇到冲突。

    若发生 git pull 拉取冲突,需要使用 git pull --rebase 解决。

    变基 vs. 合并

    有一种观点认为,仓库的提交历史即是 记录实际发生过什么。 它是针对历史的文档,本身就有价值,不能乱改。从这个角度看来,改变提交历史是一种亵渎,你使用 谎言 掩盖了实际发生过的事情。 如果由合并产生的提交历史是一团糟怎么办? 既然事实就是如此,那么这些痕迹就应该被保留下来,让后人能够查阅。

    另一种观点则正好相反,他们认为提交历史是 项目过程中发生的事。 没人会出版一本书的第一版草稿,软件维护手册也是需要反复修订才能方便使用。 持这一观点的人会使用 rebasefilter-branch 等工具来编写故事,怎么方便后来的读者就怎么写。

    总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。

    - + diff --git a/reading/pro-git/04-git-server.html b/reading/pro-git/04-git-server.html index f51a7f713a..8acebe9aac 100644 --- a/reading/pro-git/04-git-server.html +++ b/reading/pro-git/04-git-server.html @@ -30,11 +30,11 @@ 服务器上的 Git - +
    跳至主要內容

    服务器上的 Git

    njrREADINGgit小于 1 分钟约 75 字

    - + diff --git a/reading/pro-git/06-change-commit.html b/reading/pro-git/06-change-commit.html index 5ff112d218..f333285e66 100644 --- a/reading/pro-git/06-change-commit.html +++ b/reading/pro-git/06-change-commit.html @@ -30,12 +30,12 @@ 修改提交 - +
    跳至主要內容

    修改提交

    njrREADINGgitgithub小于 1 分钟约 178 字

    修改提交信息

    在 Git 中,修改提交是通过 git commit --amend 命令来完成的。

    git commit --amend
     

    此时就能出现一个交互式的修改提交窗口,可以修改提交信息,添加文件,或者删除文件。

    修改作者信息

    由于某次提交时不小心将 git user 改成了其他账户,在后续 commit 时提交了错误的用户信息,需要手动修改:git rebase -i <commit-hash>

    意为从当前 commit 后的所有提交。将 pick 改为 edit,并使用 git commit --amend --author="Author Name <email>" 修改用户。

    满意后使用 git rebase --continue 关闭本次修改。

    - + diff --git a/reading/pro-git/index.html b/reading/pro-git/index.html index 738c2dec90..4a1ad0ff0e 100644 --- a/reading/pro-git/index.html +++ b/reading/pro-git/index.html @@ -30,11 +30,11 @@ Pro Git - +
    跳至主要內容

    Pro Git

    njr小于 1 分钟约 50 字

    - + diff --git a/rss.xml b/rss.xml index 8525634bdf..1ffff44eee 100644 --- a/rss.xml +++ b/rss.xml @@ -6,8 +6,8 @@ https://dribble-njr.github.io/blog/blog/ Personal frontend knowledge base zh-CN - Thu, 19 Sep 2024 04:35:50 GMT - Thu, 19 Sep 2024 04:35:50 GMT + Thu, 19 Sep 2024 09:45:56 GMT + Thu, 19 Sep 2024 09:45:56 GMT @vuepress/plugin-feed https://validator.w3.org/feed/docs/rss2.html reading @@ -28,6 +28,126 @@ algorithm linux 工程化 + + 模块模式 + https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/07-module-pattern.html + https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/07-module-pattern.html + 模块模式 + 随着应用程序和代码库的增长,保持代码的可维护性和分离性变得越来越重要。模块模式可以将代码分割成更小的、可重复使用的片段。 除了可以将代码分割成更小的、可重复使用的片段外,模块还可以将文件中的某些值保持私有。默认情况下,模块中的声明会被作用域(封装)到该模块。如果我们没有明确导出某个值,那么该值在该模块之外就不可用。这就降低了代码库其他部分声明的值发生名... + reading + Thu, 19 Sep 2024 00:00:00 GMT + 随着应用程序和代码库的增长,保持代码的可维护性和分离性变得越来越重要。模块模式可以将代码分割成更小的、可重复使用的片段。

    +

    除了可以将代码分割成更小的、可重复使用的片段外,模块还可以将文件中的某些值保持私有。默认情况下,模块中的声明会被作用域(封装)到该模块。如果我们没有明确导出某个值,那么该值在该模块之外就不可用。这就降低了代码库其他部分声明的值发生名称冲突的风险,因为这些值在全局范围内不可用。

    +

    更详细的内容可以见 。

    +]]>
    +
    + + 混入模式 + https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/06-mixin-pattern.html + https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/06-mixin-pattern.html + 混入模式 + 混入模式 mixin 是一种对象,我们可以使用它为另一个对象或类添加可重复使用的功能,而无需使用继承。我们不能单独使用 mixins:mixins 的唯一目的是在不使用继承的情况下为对象或类添加功能。 假设我们的应用程序需要创建多条狗。然而,我们创建的基本狗没有任何属性,只有一个名称属性。 狗不应该只有名字。它应该会 bark、wagTail 和 pl... + reading + Thu, 19 Sep 2024 00:00:00 GMT + 混入模式 +

    mixin 是一种对象,我们可以使用它为另一个对象或类添加可重复使用的功能,而无需使用继承。我们不能单独使用 mixins:mixins 的唯一目的是在不使用继承的情况下为对象或类添加功能。

    +

    假设我们的应用程序需要创建多条狗。然而,我们创建的基本狗没有任何属性,只有一个名称属性。

    +
    class Dog {
    +  constructor(name) {
    +    this.name = name
    +  }
    +}
    +

    狗不应该只有名字。它应该会 barkwagTailplay! 我们可以创建一个 mixin,而不是直接将其添加到 Dog 中。

    +
    const dogFunctionality = {
    +  bark: () => console.log('Woof!'),
    +  wagTail: () => console.log('Wagging my tail!'),
    +  play: () => console.log('Playing!')
    +}
    +

    我们可以使用 Object.assign 方法将 dogFunctionality 混合元素添加到 Dog 原型中。通过该方法,我们可以向目标对象添加属性:本例中为 Dog.prototypeDog 的每个新实例都可以访问 dogFunctionality 的属性,因为它们都被添加到了 Dog 的原型中!

    +
    class Dog {
    +  constructor(name) {
    +    this.name = name
    +  }
    +}
    +
    +const dogFunctionality = {
    +  bark: () => console.log('Woof!'),
    +  wagTail: () => console.log('Wagging my tail!'),
    +  play: () => console.log('Playing!')
    +}
    +
    +Object.assign(Dog.prototype, dogFunctionality)
    +
    +const pet1 = new Dog('Daisy')
    +
    +pet1.name // Daisy
    +pet1.bark() // Woof!
    +pet1.play() // Playing!
    +

    虽然我们可以在不使用继承的情况下使用 mixin 添加功能,但 mixin 本身也可以使用继承!大多数哺乳动物(除了海豚,也许还有其他动物)都会走路和睡觉。狗是哺乳动物,应该会走路和睡觉!

    +
    const animalFunctionality = {
    +  walk: () => console.log('Walking!'),
    +  sleep: () => console.log('Sleeping!')
    +}
    +

    我们可以使用 Object.assign 将这些属性添加到 dogFunctionality 原型中。在本例中,目标对象是 dogFunctionality

    +
    const animalFunctionality = {
    +  walk: () => console.log('Walking!'),
    +  sleep: () => console.log('Sleeping!')
    +}
    +
    +const dogFunctionality = {
    +  bark: () => console.log('Woof!'),
    +  wagTail: () => console.log('Wagging my tail!'),
    +  play: () => console.log('Playing!'),
    +  walk() {
    +    super.walk()
    +  },
    +  sleep() {
    +    super.sleep()
    +  }
    +}
    +
    +Object.assign(dogFunctionality, animalFunctionality)
    +Object.assign(Dog.prototype, dogFunctionality)
    +

    在现实世界中,浏览器环境中的 Window 就是一个 mixin 的例子。 Window 对象从 WindowOrWorkerGlobalScopeWindowEventHandlers mixins 中实现了许多属性,这使我们可以访问 setTimeoutsetIntervalindexedDBisSecureContext 等属性。

    +

    由于它是一个 mixin,因此只能用于为对象添加功能,您将无法创建 WindowOrWorkerGlobalScope 类型的对象。

    + +

    总结

    +

    在引入 ES6 类之前,mixins 通常用于为 React 组件添加功能。 React 团队不鼓励使用 mixins,因为它很容易给组件增加不必要的复杂性,使其难以维护和重用。React 团队鼓励使用高阶组件,现在这些组件通常可以被 Hooks 代替。

    +

    混入模式看起来和继承非常类似,但是有一点区别:

    + +

    因此上面的实现仍然是混入模式。

    +
    +

    提示

    +

    虽然你修改了原型,但混入模式的本质是将多个功能组合到一个类或对象中,而不强制遵循严格的继承层次结构。因此,它依然可以被认为是混入模式。

    +
    +

    如果不想直接修改原型,可以选择实例级别的混入:

    +
    class Dog {
    +  constructor(name) {
    +    this.name = name
    +  }
    +}
    +
    +const dogFunctionality = {
    +  bark: () => console.log('Woof!'),
    +  wagTail: () => console.log('Wagging my tail!'),
    +  play: () => console.log('Playing!')
    +}
    +
    +const pet1 = new Dog('Daisy')
    +
    +// 仅将功能混入特定实例,而不是修改原型
    +Object.assign(pet1, dogFunctionality)
    +
    +pet1.bark() // Woof!
    +
    +

    提示

    +

    通过向对象的原型注入功能,mixins 可以让我们在没有继承的情况下为对象轻松添加功能。修改对象的原型被认为是一种不好的做法,因为这会导致原型污染和函数来源的不确定性。

    +
    +]]>
    +
    中间件模式 https://dribble-njr.github.io/blog/blog/reading/patterns/vanilla/05-middleware-pattern.html @@ -8891,153 +9011,5 @@ Host key verification failed. ]]> - - 自动部署 Vuepress 到服务器 - https://dribble-njr.github.io/blog/blog/backend/linux/practice/004-automated-deployment.html - https://dribble-njr.github.io/blog/blog/backend/linux/practice/004-automated-deployment.html - 自动部署 Vuepress 到服务器 - 提示 服务器:centos 7.9 本地电脑:Windows 10 服务器端 配置 nginx 登录宝塔面板,可以参考 。点击左侧网站 -&gt; 添加站点。 step1-add-sitestep1-add-site 新增之后,点击设置 -&gt; 配置文件。这三项按自己的情况配置,在后面 中会将 dist 文件推送到 root 配置项设置的文件夹下。 step... - linux - Wed, 12 May 2021 00:00:00 GMT - -

    提示

    -

    服务器:centos 7.9

    -

    本地电脑:Windows 10

    - -

    服务器端

    -

    配置 nginx

    -

    登录宝塔面板,可以参考 。点击左侧网站 -> 添加站点。

    -
    step1-add-site
    step1-add-site
    -

    新增之后,点击设置 -> 配置文件。这三项按自己的情况配置,在后面 中会将 dist 文件推送到 root 配置项设置的文件夹下。

    -
    step2-nginx-conf
    step2-nginx-conf
    -

    先测试下 nginx 有没有配置成功,本地打包文件:

    -
    yarn build
    -

    然后将生成的 dist 文件里的内容复制到刚才设置的项目根目录下。

    -

    接着输入 http://xxx.xxx.xxx.xxx:端口号,就能访问成功了。

    -
    -

    提示

    -

    地址得用 http 协议,因为我们还没有配置 ssl 证书。

    -
    -

    配置 git 仓库

    -

    在 中已经搭建好了 git 私服,因此只需要初始化 vuepress.git 仓库即可。

    -
    cd /home/git
    -mkdir vuepress.git
    -cd vuepress.git
    -git init --bare vuepress.git
    -

    配置 hooks

    -

    先切换到 root 用户(ctrl + d),在 home 文件夹下创建一个临时存放 dist 文件夹的地方。

    -
    -

    提示

    -

    我这里选择存放到 home 文件夹下,但是 git 用户是没有权限的,因此切换到 root 用户,也可以存放到其他文件夹。

    -
    -
    cd /home
    -mkdir tmp
    -cd tmp
    -mkdir vuepress
    -

    接着将文件的所有权换成 git:

    -
    sudo chown git:git -R vuepress
    -

    然后,有一个关键的地方,要将 /www/wwwroot 的所有权换成 git:

    -
    sudo chown git:git /www/wwwroot
    -

    做好这些准备之后,就可以开始配置 hooks 了。

    -
    cd /home/git/vuepress.git/hooks
    -# 通过 copy 新建 post-update 文件
    -cp post-update.sample post-update
    -vim post-update
    -

    接着将下面代码复制进去:

    -
    echo "auto deploy start ==================================="
    -unset GIT_DIR
    -
    -# 项目文件夹
    -PUBLIC_WWW=/www/wwwroot/vuepress
    -# git 仓库文件夹
    -GIT_REPO=/home/git/vuepress.git
    -# 临时文件夹
    -TMP_GIT_CLONE=/home/tmp/vuepress
    -
    -# 移除临时文件夹
    -rm -rf ${TMP_GIT_CLONE}
    -# 克隆 git 仓库到临时文件夹
    -git clone $GIT_REPO $TMP_GIT_CLONE
    -# 移除项目文件夹
    -# 宝塔为了安全,为自动在项目文件夹下新增 .user.ini 文件
    -# 需要先关闭这个文件的功能才能删除项目文件夹
    -cd ${PUBLIC_WWW}
    -chattr -i .user.ini
    -rm -rf ${PUBLIC_WWW}
    -# 将临时文件夹复制到项目文件夹
    -cp -rf ${TMP_GIT_CLONE} ${PUBLIC_WWW}
    -
    -echo "auto deploy end ===================================="
    -

    现在服务器端的准备工作已经完成了,接下来看看本地电脑的配置。

    -

    本地电脑

    -

    在本地项目根目录下新建 deploy.sh 脚本文件,内容如下:

    -
    #!/usr/bin/env sh
    -
    -# 确保脚本抛出遇到的错误
    -set -e
    -
    -# 生成静态文件
    -yarn build
    -
    -# 进入生成的文件夹
    -cd docs/.vuepress/dist
    -
    -# 初始化 git 仓库,并提交修改
    -git init
    -git add -A
    -git commit -m 'deploy'
    -
    -# 发布到 git 私服, -f 强制覆盖
    -git remote add origin git@119.23.65.118:/home/git/vuepress.git
    -git push -f git@119.23.65.118:/home/git/vuepress.git master
    -
    -cd -
    -
    -

    提示

    -

    了解更多 git 命令,可以查询官方文档

    -
    -

    测试

    -

    vscode 终端中输入 sh depoly.sh,报错:

    -
    sh : 无法将“sh”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
    -请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
    -

    了解到 windows 上可以使用 git bash 执行 shell 脚本,但我可不想每次执行的时候都打开 git bash,当然得找如何在 vscode 中执行 shell 脚本的办法。

    -
      -
    1. 首先得在 vscode 中安装 code runner,之前一直用它来调试力扣上的题,已经安装过了。
    2. -
    3. 安装 git bash,这个不用说,安装 git 的时候就已经有了
    4. -
    5. 配置 bash 环境,找到 bash.exe 的安装目录,将它的位置添加到系统的环境变量中。
    6. -
    7. 配置 code runner:文件 -> 首选项 -> 设置 -> 搜索 code runner
    8. -
    9. 打开终端,输入 bash 切换到 bash 环境,点击右上角的三角形即可运行。
    10. -
    -
    step3-code-runner
    step3-code-runner
    -

    现在随便更新点内容,并执行 deploy.sh 脚本:

    -
    step4-complete
    step4-complete
    -

    再次访问 http://xxx.xxx.xxx.xxx:端口号 发现已经更新了。

    -

    参考链接

    - -]]>
    - -
    - - 图片批注 - https://dribble-njr.github.io/blog/blog/frontend/practice/002-annotation.html - https://dribble-njr.github.io/blog/blog/frontend/practice/002-annotation.html - 图片批注 - 相关信息 demo: https://codesandbox.io/p/sandbox/image-annotation-pht676?file=%2Fsrc%2FApp.js%3A210%2C56 实现图片批注有两种方案,一种是通过 SVG 绘制,一种是通过 Canvas 绘制。以下是两者对比: 综上,选择使用 Canvas 实现图片批注。 加载图... - practice - Thu, 28 Dec 2023 00:00:00 GMT - -

    相关信息

    -

    demo: https://codesandbox.io/p/sandbox/image-annotation-pht676?file=%2Fsrc%2FApp.js%3A210%2C56

    - -

    实现图片批注有两种方案,一种是通过 SVG 绘制,一种是通过 Canvas 绘制。以下是两者对比:

    -

    | 特点 | Canvas | SVG |
    -|

    -]]>
    -
    \ No newline at end of file diff --git a/service-worker.js b/service-worker.js index c1554dc1e3..3e660fae05 100644 --- a/service-worker.js +++ b/service-worker.js @@ -1,2 +1,2 @@ -if(!self.define){let e,s={};const a=(a,i)=>(a=new URL(a+".js",i).href,s[a]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()})).then((()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e})));self.define=(i,r)=>{const d=e||("document"in self?document.currentScript.src:"")||location.href;if(s[d])return;let c={};const t=e=>a(e,d),n={module:{uri:d},exports:c,require:t};s[d]=Promise.all(i.map((e=>n[e]||t(e)))).then((e=>(r(...e),c)))}}define(["./workbox-dbb64b4e"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.clientsClaim(),e.precacheAndRoute([{url:"assets/0001、二叉树.html-4auqombs.js",revision:"9839094dbd6813785c65a18f1c99c393"},{url:"assets/0002、二叉搜索树.html-OF0zcdo8.js",revision:"6c7ebb95f90e310b21e9960952192046"},{url:"assets/0003、动态规划.html-BaRf7Si3.js",revision:"6d46c662b86820e365a61bd82a89f065"},{url:"assets/0004、链表.html--ickDlYH.js",revision:"515d944e71b88e6cd3743970dab439c8"},{url:"assets/0007、WebSocket.html-clDh-CAk.js",revision:"65dfea85efa2490db4408756cb1234ba"},{url:"assets/0008、WebStorage.html-LEVYFRc7.js",revision:"9daf612fcd1d4e01d79c79cf2ad7f06e"},{url:"assets/001-character-encoding.html-cVILioj-.js",revision:"ecb63a3f57fce7c3e68ddb8ff85f0716"},{url:"assets/001-dnd-kit.html-2XGEbOiO.js",revision:"94ed47ad6d8f385cb246d1b90df33eb3"},{url:"assets/001-finalhandler.html-ovhKFVbX.js",revision:"e579281219b68710a5c204f7e2b80d79"},{url:"assets/001-hello-database.html-aOK2afKr.js",revision:"d758adae6258f9236e65a606405f1f0b"},{url:"assets/001-hello-rspack.html-bi8TfCOv.js",revision:"0f0fac6e43f45bf63ccc41a96afadb38"},{url:"assets/001-hello-vite.html--F-BEmyI.js",revision:"42cdd043bdf62ca67f374f70c7890ff7"},{url:"assets/001-html-history.html-v0CXXyX7.js",revision:"51efa6af8ac35a95be6630beedececf6"},{url:"assets/001-init-project.html-JrVvGhXT.js",revision:"ff341ae08e220c5c305a5fe44597a7fa"},{url:"assets/001-init-project.html-sp9TCZ05.js",revision:"95e75b60fa553a7e311df04b1d6922be"},{url:"assets/001-install-mysql.html-8EsZMsqk.js",revision:"830495e1b94f07c971de891df17b02f8"},{url:"assets/001-modularization.html-C5iw405Z.js",revision:"5c7800c0ee7014f3c92b2448d76502a1"},{url:"assets/001-module.html-0uMgtzmT.js",revision:"69859e2347500691430389928beda30c"},{url:"assets/001-network-model.html-NoIFtNe7.js",revision:"e41b75ed3edd00647dbade9e3bf44217"},{url:"assets/001-quick-start.html-2zV3Q__R.js",revision:"9be2c85fa38ab4f0cf09c70817ac6448"},{url:"assets/001-set-the-ssh.html-aEDPE2NO.js",revision:"162817720fe971b2c1c9e51e05ebe09d"},{url:"assets/001-var-let-const.html-QE4xXk9s.js",revision:"c6278ee3827ee094671d047388efe181"},{url:"assets/001-webpack-basic.html-pCqwATgK.js",revision:"afaaafed53ad6728be1a3aaa8d9909e8"},{url:"assets/0010、WebWorker.html-QlxKBHVw.js",revision:"b897d9506d5bc7947cd2c28510898952"},{url:"assets/0011、判断对象值相等.html-qhcibsAO.js",revision:"95b5e998495df1bff2819e0b02e4eb82"},{url:"assets/0012、AJAX.html-DQSqS6qA.js",revision:"75508abf55bde99707aa7f07bf8b4d1b"},{url:"assets/0014、浅拷贝与深拷贝.html-aQKjlhhK.js",revision:"7c5bffa464c855e331deb560c7792eaf"},{url:"assets/0017、事件循环.html-CHv7YjC_.js",revision:"049cbcee2ef610819ff4ab7966941b6c"},{url:"assets/002-annotation.html-oZ12-DLl.js",revision:"f19be67ecf0b7b2d1d8ee250cbe270f7"},{url:"assets/002-build-git-server.html-C4U8vbpS.js",revision:"f6928ccf90ad1c721a37dc4ae0d9c98b"},{url:"assets/002-HTTP-overview.html-t1eJ1tmB.js",revision:"8b602fb1effbf5d5e0272af5acdd46f9"},{url:"assets/002-package-manager.html-ooVRb0tm.js",revision:"2e40226bf8f5465443764ab9efd4fbe9"},{url:"assets/002-quick-start.html-yQRWabdS.js",revision:"bb108f5edd4fe7e0ebd9986bdff030c5"},{url:"assets/002-relation-model.html-GwrX2GKL.js",revision:"f38ca0d4f06e796d2cac35078f60cae8"},{url:"assets/002-selector.html-_GCwigBR.js",revision:"7b9072a35fbc867de4db95e56dba9b10"},{url:"assets/002-types.html-252gQD2-.js",revision:"a3444b7332c15298e65615954d81183a"},{url:"assets/002-webpack-css.html-QMyYbPPn.js",revision:"69e3dadac53350fe5a877a3d8eda8d69"},{url:"assets/003-box-model.html-XDv8wKIC.js",revision:"cbf01273f23056b97dcdec204fbc32e4"},{url:"assets/003-configure-bt.html-3veiWlcs.js",revision:"5db4c302463a5c89a792dd1f8ade2bfb"},{url:"assets/003-db-design.html-xMFrXx79.js",revision:"bbb0a0d75fed666e319685f416d2b250"},{url:"assets/003-doctype.html-slx-qvH9.js",revision:"beed2814d43d24a192ea5b8002e7f76d"},{url:"assets/003-file-upload.html-aXCMPaU8.js",revision:"24f3d5539854d71946c138f75f112e32"},{url:"assets/003-get-post-difference.html-AcYlQkUc.js",revision:"7d47b113d059317fba8f1d89c50a2ade"},{url:"assets/003-judge-type.html-88H_u1XZ.js",revision:"cb74964bc92773d270b19fe3af15d4f0"},{url:"assets/003-tool.html-k6pbBUqo.js",revision:"c4ed6676626cb8fdeb2151f6b50afb79"},{url:"assets/003-webpack-assets.html-NHLlXkyd.js",revision:"99783b5873a6f6c16d1b180e59a35411"},{url:"assets/004-advanced-db-model.html-ruy78wNd.js",revision:"445bc359da31477289afd72293a6a592"},{url:"assets/004-automated-deployment.html-gtM4lpgE.js",revision:"ed36903ca2d7fa9af06335308bc6e053"},{url:"assets/004-common-element.html-Xjzjjmz0.js",revision:"064d6fc1c3904940cae839a10c47c343"},{url:"assets/004-global-upload.html-_IRYzqKH.js",revision:"1bcc15a80b22a5eeb5b38bfed1fb7dbb"},{url:"assets/004-HTTP-development.html-fXKTMLP5.js",revision:"be9773fa3f35e53b1c1e6545810cc0ac"},{url:"assets/004-primitive-value-reference-value.html-zZRxOtGZ.js",revision:"b48c801c5bdca985fbe27d74ad05de93"},{url:"assets/004-project-standards.html-IEck58m4.js",revision:"fb21a5f62705d327d2d90b150fb2b547"},{url:"assets/004-text-font.html-7LU7lsoM.js",revision:"b7ff9f2d76efc92d3fb49f9b7e207727"},{url:"assets/004-webpack-plugin.html-9kEyMOsf.js",revision:"63bf82ea2e3aed7008e59b949a3b2352"},{url:"assets/005-advanced-element.html-Iw8_OFlN.js",revision:"cef9ca3aefc0c1733a87ded7cb946a07"},{url:"assets/005-cascade-inheritance.html-PJNtVfy1.js",revision:"e77c32ede7cb0ea222520327e85fa0ee"},{url:"assets/005-execution-context.html-h2_naATY.js",revision:"3eaf4b34c8fad9f79b2263c4544cccd5"},{url:"assets/005-HTTP-cache.html-93Z7vex3.js",revision:"005bc60c38f585702d4ced6ba3c5b5af"},{url:"assets/005-install-docker.html-0N1qwABW.js",revision:"1ad4a5c4267aebca14c9df2f579cada3"},{url:"assets/005-postcss-px-to-viewport.html-NXFQc7im.js",revision:"378bad040be6014f6245353320d5c217"},{url:"assets/005-qwik.html-TahGLhP-.js",revision:"64bfe43780c7d2e5ea3691cece3a7c23"},{url:"assets/005-webpack-babel.html-1lDmfMgr.js",revision:"45ebad5301c407b80a8a5b8b0d4ee182"},{url:"assets/005-yeoman.html-9wj3v3oe.js",revision:"86aab5953160786016792975ade6c6c4"},{url:"assets/006-animation-svg.html-JwE1dpsg.js",revision:"f9fd1c2ad33122f0cc1914bc38cf07fd"},{url:"assets/006-background-border.html-pQQrVWCp.js",revision:"7971e1cb91951bed5d535c02630b6ac7"},{url:"assets/006-HTTPS-overview.html-dTO_M_73.js",revision:"e7872511cd82237e228f994b934c9a3b"},{url:"assets/006-react-server-component.html-R-ash7ca.js",revision:"35ce60ca8c115b4e4d14a943d66893a5"},{url:"assets/006-semantically-meaningful-tags.html-antLdR07.js",revision:"4ae633baac9dcf84b40b800856415561"},{url:"assets/006-toString-toLocalString-valueOf.html-chx5Y-eq.js",revision:"93c6b2e8d3c225f2532d3308c2007ced"},{url:"assets/006-webpack-vue.html-la6H1Wb9.js",revision:"0d7d4cc74209d35f6c2296ebfbbf6c10"},{url:"assets/007-basic-reference-type.html-ye_NfEZd.js",revision:"c46fe1dd1dd65ef3d64023226e6b8c6e"},{url:"assets/007-hydration-is-pure-overhead.html-SvnUqg0L.js",revision:"757686fefcb27a7d3fc7a96742b34ba4"},{url:"assets/007-media-tag.html-8v4cFuX3.js",revision:"c1dd241c7b963c3fa126359914f0564a"},{url:"assets/007-offline-export-in-highcharts.html-UrRUULFr.js",revision:"d969e6973496d88065885579e286c618"},{url:"assets/007-position.html-xnmzeXYe.js",revision:"cc6f70c4c7670a281de9aa3ff1c7b7ca"},{url:"assets/007-TCP-three-handshakes-and-four-waves.html-DvEKPAYq.js",revision:"936f5a188c1916e5b40ebbc4ae3bf8e8"},{url:"assets/007-webpack-dev-server.html-UoW4CmYC.js",revision:"4ac062752d07018982244dec9361bf3b"},{url:"assets/008-canvas-svg.html-Afq3qZFA.js",revision:"0a3372fdf685228583b7557d575550d7"},{url:"assets/008-collection-reference-type.html-aot29-MR.js",revision:"49fc1123cbeee7541ab62dbd4dc92312"},{url:"assets/008-float.html-cC7j6Fly.js",revision:"7c7e75d7f715d61699e7ab47f6ecf4ac"},{url:"assets/008-tcp-udp.html-JhmI5mFu.js",revision:"6147a7e723c3ead4f78f9173c356f851"},{url:"assets/008-webpack-resolve.html-Iqw5UzOE.js",revision:"bf7fefe6be3ff66df13d5b0361d47c8e"},{url:"assets/009-array-like-object.html-3HK1Wx8D.js",revision:"df43674cdcb156b74038f1b70618943c"},{url:"assets/009-flex.html-SyAmrX4g.js",revision:"191ffd9e3b6751191fc53012ccda14a8"},{url:"assets/009-http-code-when-authorized-refused.html-wOR2ePmW.js",revision:"98e19fbeb4b6a76277dc53f1ffe57f68"},{url:"assets/009-src-vs-href.html-R_B9c0oQ.js",revision:"12bc2a1c28abf93f830c5b2c2787d891"},{url:"assets/009-webpack-env-split.html-4VesWHbQ.js",revision:"25c25f22b0c8789b7578cd2c9ae083fd"},{url:"assets/01-a-pragmatic-philosophy.html-nlUzlsGE.js",revision:"9366d7b927b21d434add633a0eb047d2"},{url:"assets/01-array.html-eSTvuSoN.js",revision:"5470a0d35594a0fd66ed2af855fe1a0f"},{url:"assets/01-command-pattern.html-sJvJ55xh.js",revision:"47a618681125a125c56e46cddba526f8"},{url:"assets/01-getting-started.html-BoyDoh_2.js",revision:"a2e51e3568c20f5366239a220ae064c3"},{url:"assets/01-getting-started.html-XlgIMo6A.js",revision:"ea2e603ab34612d4a314f049291f519a"},{url:"assets/01-how-browser-rendering-works.html-yfqVgOrF.js",revision:"182a6d874b2410114926342ab57ba256"},{url:"assets/01-init.html-ecnfoh5n.js",revision:"641761a1ea8a37b0f4503996ff1ed800"},{url:"assets/01-maven.html-F0K_vhBd.js",revision:"a197c068299800f002a4fc10f25d381e"},{url:"assets/01-overview-architecture.html-pqHY5Qm9.js",revision:"12d59ed525dc26495895f42359074129"},{url:"assets/01-pages-layouts.html-tbsDBwEp.js",revision:"dc16fd78790d78e34492ef9984b4f78f"},{url:"assets/01-quick-start.html-1kCTwmGo.js",revision:"e5dbb68bf7ac9e330ac7259d44a4a947"},{url:"assets/01-quick-start.html-cNfJxtYv.js",revision:"c6c2ff8fa0912c89ef807ccca530eb59"},{url:"assets/01-useState.html-jaIUYZlb.js",revision:"391208c51a4650e277ebfddded3f884c"},{url:"assets/01、父子组件通信.html-Ur3YppQN.js",revision:"199f341f27110a182a588d695047fdcc"},{url:"assets/01.vuepress-plugin-ordered-header.html-G4Pomedj.js",revision:"13907947d51a0b4b66cf238ad01b5d1e"},{url:"assets/010-antd-textarea-placeholder-pre-line.html-dyz4BBJw.js",revision:"fc3c72e56755d0d23cfe43557ecd85bb"},{url:"assets/010-html5.html-ov7DEVBH.js",revision:"28c7bc6565e6317b9076c3aa6da89098"},{url:"assets/010-object-property.html-4o3XoTEX.js",revision:"b53344239e9d23ef69b454b864eda371"},{url:"assets/010-unit.html-Mmr-V3cT.js",revision:"57a9b2eeff01745789db6df546301346"},{url:"assets/011-center.html-C5Xit3Oi.js",revision:"07e301627151a7bb070003efcd7a2e1f"},{url:"assets/011-create-object.html-R-m-KNNj.js",revision:"583ba010705ea0204300863ac279bf78"},{url:"assets/011-defer-vs-async.html-VM1cIXwT.js",revision:"6e97bbecd746bb07091f85a9a9d60e63"},{url:"assets/012-extends.html-oILfr47G.js",revision:"27b9c950404ccc797b3d60c8776c964b"},{url:"assets/012-form-validation.html-5UKN3JjB.js",revision:"b85c8822a64474cd5c8f794a5fb29e94"},{url:"assets/012-grid.html-3XqGR-dj.js",revision:"3630ba6a2e824b130ea3745107ae68cd"},{url:"assets/013-BFC.html-oRnppy7q.js",revision:"c1f5ffac486f93ef541b33e176bc6576"},{url:"assets/013-class.html-IiH58Ic4.js",revision:"220da5fed0d8b2c68fb594ae7d768978"},{url:"assets/013-seo.html-iv5Q82Xp.js",revision:"b4deae7b3c779d8e25e87c97db3d4105"},{url:"assets/014-implement-new.html-sKoB2ySS.js",revision:"f915faa526153b2d79f2f5b445b73d79"},{url:"assets/014-responsive-design-intro.html-iPsvIRFt.js",revision:"6dbc51ae0fe45dc8a47c268d7167ad6c"},{url:"assets/015-auto-change-node.html-a3AMX6nS.js",revision:"686b50bde4f60a412a8979597a4759d8"},{url:"assets/015-function.html-lE3ghf05.js",revision:"ae869a031da3cd3d922e06fe87434788"},{url:"assets/015-responsive-design.html-4WzXXkGD.js",revision:"714dd3cb1fa0fd353631b797f445e4b6"},{url:"assets/016-how-to-responsive.html-M9Iwp3xZ.js",revision:"b0d80a6e79b703738ce87846b15eb6aa"},{url:"assets/016-rest-client-error.html-p-eY-lWi.js",revision:"33df1f52fd15863e4f8f5c1ba8f34b61"},{url:"assets/016-this.html-BWOVpThp.js",revision:"8567cefe930cc94f69d6269e3157b334"},{url:"assets/017-implement-call-apply-bind.html-pF9-IIfp.js",revision:"fb5ef29e14534223046897477ea1ea2b"},{url:"assets/017-loading-spinner.html-NrAgtaAG.js",revision:"0b3ffacef4a20659d1d185801b2a5881"},{url:"assets/017-whistle-debug-real-phone.html-cdCQQvjc.js",revision:"299633f41cc9cc0246a8e7ddee69f9cb"},{url:"assets/018-autofill.html-d9_0qC3m.js",revision:"8b1686142194713fc84123f76c7dfe4c"},{url:"assets/018-monaco-editor-react.html-_kPxgArL.js",revision:"f5cc171d4bd2c5104122666fdaf4bf9f"},{url:"assets/019-ios-prevent-touch.html-WrR4-Zb-.js",revision:"bc1a071dbb23cf1dee328341f455077d"},{url:"assets/02-a-pragmatic-approach.html-6wOj4UWX.js",revision:"5f0220e07f8e1ce86e024fcc86551d11"},{url:"assets/02-architecture-overview.html-8ZZdthIG.js",revision:"33ca1964c7c9eb87eb88b0f57b096c87"},{url:"assets/02-express.js.html-pkHCz992.js",revision:"ad93b2c32b37b814edccb3b02a552ffa"},{url:"assets/02-factory-pattern.html-XSFhUFpy.js",revision:"7b5060cc7f7d68e8b190b029a4382a6b"},{url:"assets/02-git-basics.html-uhff1ajs.js",revision:"de0436c06e57964fd38e0b4e99c4271a"},{url:"assets/02-server.html-nDPPJ1I0.js",revision:"19912abf474e2b7fd79c9363a3360b35"},{url:"assets/02-style-props.html-KG0Fp9UW.js",revision:"3d62625318dfaa20b1140126244bad75"},{url:"assets/02-useEffect.html-3NUC6b79.js",revision:"22eeeeb711834e5a548a5160316fcc72"},{url:"assets/02-V8.html-IZr6VCnt.js",revision:"891b0fcf05fa324a786b2026cdc25de1"},{url:"assets/02、provide-inject.html-OTYzp_vx.js",revision:"75d2f43547c9676c811ab579e590c23d"},{url:"assets/02、Vuex 原理.html-NnrN3jKK.js",revision:"783f0509d2ee3d9048ff293c4b756c46"},{url:"assets/020-ios-img.html-XvCdcFCF.js",revision:"e746ec591d2dff696336006f288667b8"},{url:"assets/03-basic-tool.html-5ZYgKkhx.js",revision:"2e8c0d705e063f5688b3f4ca8b2b60c0"},{url:"assets/03-database.html-iZ8Pz1RB.js",revision:"27f80897ff263470d9a01338552c49fd"},{url:"assets/03-flyweight-pattern.html-8q_3lsgm.js",revision:"2e433705522b79ed31ed9c955f68538e"},{url:"assets/03-git-branch.html-X-MvpUVr.js",revision:"61e17abcb6fdc9386a95ec86dc9a797e"},{url:"assets/03-memory-management.html-1tFtncAW.js",revision:"0413b44c2c5462572ba814cda1467598"},{url:"assets/03-render-loop.html-qGaAgyJD.js",revision:"0844f992e3fe88884c58cf95cce244cc"},{url:"assets/03、插槽.html-IZ-NFkUC.js",revision:"34c9d01b0bf82d37c76737f2846cc225"},{url:"assets/04-api.html-pkUj-_Sw.js",revision:"3bed3cc6f3cbdc13a20fc510c629edb7"},{url:"assets/04-cross-domain.html-SnbAooaC.js",revision:"139013a9d945990a9a1338a7d2436b9d"},{url:"assets/04-git-server.html-saxeUmXQ.js",revision:"94f9f9ac74085d06c3b77d3ca71f63ad"},{url:"assets/04-mediator-pattern.html-P4FmQ5sb.js",revision:"1fe6495ffce54d25c334209b75a7539b"},{url:"assets/04-pragmatic-paranoid.html-XFMDx0LS.js",revision:"a672348e980626e173eb4f1465bcd073"},{url:"assets/04-scene-graph.html-yMu1RW29.js",revision:"7b783809c97f6227240c0acc8914f251"},{url:"assets/04、动态组件和异步组件.html-xMkS9nHj.js",revision:"d9c55ef6c6a31d5242535a6092a23fb6"},{url:"assets/05-middleware-pattern.html-wkcOGRem.js",revision:"5dfc8fa7bb73fa5217bfe92c8486c392"},{url:"assets/05-what-happens-after-entering-the-URL.html-k-e2Q0RE.js",revision:"ea1988f331a25d6e007610b9e13dd9e8"},{url:"assets/05-work-around.html-AZ__xLsT.js",revision:"ac6d69e1010f49a11dadbdf48281cddd"},{url:"assets/05、组件的v-model.html-hymI2g5O.js",revision:"728ade60c6141ef3990225702abe8526"},{url:"assets/06-change-commit.html-rZc35dXJ.js",revision:"a9dfa865c3b60f1f99ed8b4ce175c404"},{url:"assets/06-concurrent.html-R5x_sgEh.js",revision:"d1dd62336c42a27023cee595743e10e8"},{url:"assets/06、Mixin.html-LXvYo5XJ.js",revision:"a50eb4e1282839bf2ef2faa8c2509c32"},{url:"assets/07-when-coding.html-VHzO1FuP.js",revision:"0eb7fa583afe2b57b6a537f0054a3efe"},{url:"assets/07、组合式API基础.html-fzqdzynD.js",revision:"a1fb68d5c7baf2ae3a7d350e128d3c8b"},{url:"assets/08-before-start-project.html-RLsfigWB.js",revision:"4e37870aed41c5dd0c78162d0221b607"},{url:"assets/08、组合式函数.html-I7pt9eZc.js",revision:"8a4d93a4a18376df6c97c81487f3ce2b"},{url:"assets/09-pragmatic-project.html-PVXGEU7u.js",revision:"d5744f64dfef57696ae950d6ea99c55b"},{url:"assets/09、指令.html-z9tsn97x.js",revision:"3dd86004eb5060a68652aa688b020fbb"},{url:"assets/10、插件.html-oMYOdKlX.js",revision:"89e499e72cd68f6220285bc2b4e03e08"},{url:"assets/2023.html-t3q06end.js",revision:"e95ee3022d025f7b84b10475efa9cb7b"},{url:"assets/2024.html-dchrgZ6a.js",revision:"b83ecebe6b8478ff19a621eb98486d4f"},{url:"assets/404.html-uIvc4tSN.js",revision:"f4fd96513f8e6104f4c48ae06e68b7fb"},{url:"assets/app-2R243if7.js",revision:"55e3fae7752ccbece086024730b908e0"},{url:"assets/arc-FolFS303.js",revision:"7e9e8db68e724497d12af030b096ba6f"},{url:"assets/array-Nw74a44z.js",revision:"17dcebeaf673b09a1ca5da014d20022f"},{url:"assets/auto-XYC5A0Ix.js",revision:"786b1aef9a90923f3aa3bab127b99c2c"},{url:"assets/blockDiagram-6b2b5046-VcrT_T_C.js",revision:"02f5b95c5feb9e206ce1dcf109f4916e"},{url:"assets/c4Diagram-b947cdbb-g3DAk4Ib.js",revision:"278e49350b0a017839840fbb9d755572"},{url:"assets/channel-E06Uohc9.js",revision:"c9cab79528a85130a906e3505c7a9f92"},{url:"assets/classDiagram-35230388-D24NGFi-.js",revision:"5ee2e8cddfd4769187038d8c9596d741"},{url:"assets/classDiagram-v2-412acd34-MgRZZr-Z.js",revision:"ae160bd263d85a36caa4e28bf950dcf0"},{url:"assets/clone-hs9N3Qmu.js",revision:"12dcbd08da1a81ac851e50f61bf64631"},{url:"assets/codemirror-editor-GJMQnzmw.js",revision:"fc3f4abcdc6c2e0e44313ebe78d609a0"},{url:"assets/createText-423428c9-JBHtRGoK.js",revision:"987ab7b82c9606c6da73bce4e1dd2c39"},{url:"assets/docsearch-w40geAFS.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/edges-d417c7a0-uTLZ61Cj.js",revision:"2d4c761c0b250c900d7eec61bef8b04e"},{url:"assets/erDiagram-0ea73325-O1f0-Gcb.js",revision:"88927584f0100cbc3e1330a8029f7877"},{url:"assets/flowchart-elk-definition-27cc417a-gvB_jGnE.js",revision:"109f9a45e0967791123cdaea2ba94afe"},{url:"assets/flowchart-tiWkQJPF.js",revision:"22ae562fadded7c906d7297d1f7c64f0"},{url:"assets/flowDb-d35e309a-d79xoTHo.js",revision:"001b301299f2e3225be77f8af218713e"},{url:"assets/flowDiagram-d949d7c1-9DQ3Nn7L.js",revision:"0f26ad93fd0470351384fca7a906ad98"},{url:"assets/flowDiagram-v2-49332944-jpRhKRK7.js",revision:"964eb067b41fc42b9030a0372ad7ad97"},{url:"assets/ganttDiagram-5c869e3b-7C6Fd_5I.js",revision:"f4ceafe1fadc14c6e8a18abbc7017a43"},{url:"assets/giscus-hHrgKA30.js",revision:"dae7c2db562e417dc4bde3be5134780b"},{url:"assets/gitGraphDiagram-b9d81de9-pTfZTwrI.js",revision:"7fe6aa0ce9e93d7f90cb7fe1f595fa2e"},{url:"assets/graph-vDJi9agi.js",revision:"0cc6b025219daccf2351708201fc1cf9"},{url:"assets/highlight.esm-qL7kkCul.js",revision:"62b5f024c0d2737c1370675313dc2efe"},{url:"assets/index-7IwC0DkA.js",revision:"a0a6a74537488342822dc33151252ce7"},{url:"assets/index-7SG8bi1h.js",revision:"46a193641571106d3b7b43f9bc2a2735"},{url:"assets/index-8fae9850-mHY5htT3.js",revision:"7ca76a296f91bd286306191c71061637"},{url:"assets/index-QOy62Fup.js",revision:"fa112b5cda5ee3c969c504c6a3080b4c"},{url:"assets/index.html-_5kjpK31.js",revision:"8fdde7e741b250675d0e0f10a51bba87"},{url:"assets/index.html-_qN0xDFh.js",revision:"6b42f76f655a86d91154fa06a5df73b2"},{url:"assets/index.html--FWk7Vul.js",revision:"1f36dc9a17eea6ddaefa1dfa07c00b36"},{url:"assets/index.html--GC_rvs-.js",revision:"dc42c98f1612ad4b6da55d2aae1f2be3"},{url:"assets/index.html--pdyXLPg.js",revision:"acf808f2a9b7c674c931de1b5ffd12ee"},{url:"assets/index.html--rq-pZBd.js",revision:"4deb2b76dc7345967542cb4dd6c3fd5e"},{url:"assets/index.html-0DpfjzBl.js",revision:"a24c7fba4c036e38d7373eb1bb7b0844"},{url:"assets/index.html-0pMmJO2f.js",revision:"5c416a44fad48166d69b343888f8ea50"},{url:"assets/index.html-0st9ukgV.js",revision:"c25982bc3999115dc309f12a796055c5"},{url:"assets/index.html-14cCgwtd.js",revision:"2dd990d4af0c0dcc433babcb0a8bbcbe"},{url:"assets/index.html-1nC4QyoR.js",revision:"85a6364e209298e2e2e6b666f80bd21e"},{url:"assets/index.html-1qS3_eHk.js",revision:"736cbbc42d81314a653e11845065c255"},{url:"assets/index.html-1wIIZvk4.js",revision:"31eb734ed7b629639e920a5729d44a26"},{url:"assets/index.html-24M_Uygr.js",revision:"b21a0239072cbfbac35a861c7dd5af7d"},{url:"assets/index.html-2DwvSX-3.js",revision:"862603d63e2d169c910e7d52f16beb8b"},{url:"assets/index.html-2XB4vSRh.js",revision:"898ae423ffbb7066038ad60fbf19f255"},{url:"assets/index.html-2XYbmDKB.js",revision:"867ad5b2b3ada8a02a58846891660177"},{url:"assets/index.html-2ZEvTyqm.js",revision:"c26d85ed900f55c6c348db066a0ff1be"},{url:"assets/index.html-38UUtIUW.js",revision:"80bad5d4ca42d5f9bd23b390131fe58b"},{url:"assets/index.html-3CUydp4K.js",revision:"dd5b325e0a4fe3e12843f81ad9690db4"},{url:"assets/index.html-3ImxJlYz.js",revision:"4740759f70a7acf70245d7326c51b233"},{url:"assets/index.html-48RqkH9L.js",revision:"e95e1dbbf2698a578dcdd86f8b16de36"},{url:"assets/index.html-4CQRZNtv.js",revision:"3ad4f1ae64134d91a0fd816bdfac3dd0"},{url:"assets/index.html-4IHlJjCx.js",revision:"9d320d7d21ef8a5ddedcfefc0334f164"},{url:"assets/index.html-4QfykMhJ.js",revision:"1e82587ae488cf0e5f4bb0be01a45675"},{url:"assets/index.html-4t0YWChX.js",revision:"a61a03762476a486ecc5cca633e8a96b"},{url:"assets/index.html-4T6lwsm_.js",revision:"1a2ff80b387d52251553f413dfdd554f"},{url:"assets/index.html-515f-G8L.js",revision:"198a087a47e34c90bf2e212ca348ddd6"},{url:"assets/index.html-5emhMzoK.js",revision:"022955be2b20edf73e426354af5d8a1a"},{url:"assets/index.html-5H3zUw48.js",revision:"ad6f84cd91b2e420d181bb86faf05033"},{url:"assets/index.html-5XHgOxjy.js",revision:"85823e3965bb5b25fab782bf454aefe1"},{url:"assets/index.html-6e8qEoMy.js",revision:"1d88210f05297657ccd2dde6f8ea75a7"},{url:"assets/index.html-6LZc6Qgc.js",revision:"9e914d8f791d630beefcf5d52c56cd21"},{url:"assets/index.html-6nX5abh5.js",revision:"b218623bc6b14b4d032f35812b5d210e"},{url:"assets/index.html-6PkFsrKl.js",revision:"163f829591223c2beb3671a490bbbe17"},{url:"assets/index.html-6Pq7OcfA.js",revision:"20078cfde2e04a254b571c60d14e70fc"},{url:"assets/index.html-6PZm1DnQ.js",revision:"c8124b90d71802265a36cac0c46a6966"},{url:"assets/index.html-6QOAi_wy.js",revision:"dcb54d6bc75dca1922e70b7fc84c1f85"},{url:"assets/index.html-6z6s2ocp.js",revision:"cde61251acd9242bf0ef1350092a0faa"},{url:"assets/index.html-7J1SFePC.js",revision:"aedb50d291f316c58353408460cb0164"},{url:"assets/index.html-7kHbRdSg.js",revision:"34dead9b6e069b7cab7a8dfeb5d9fdbb"},{url:"assets/index.html-7pQDueGH.js",revision:"93a7d59f1de18316edc901af9fda66ca"},{url:"assets/index.html-7xhgW9hM.js",revision:"42cb1efb3751c9709d9e90a497b76ac6"},{url:"assets/index.html-8ChHX9NB.js",revision:"1c97bf44f66cf8dd4889d31cf69a07a3"},{url:"assets/index.html-8HQ8FKg-.js",revision:"8330748c37102920037bfe1224977902"},{url:"assets/index.html-8QoYgqEV.js",revision:"0278694c7c2c89a09558042bfc61534f"},{url:"assets/index.html-8TNIbXKM.js",revision:"b45af93fafb3592d4d624fb8265e2177"},{url:"assets/index.html-98hJQE1V.js",revision:"0d51968ecfc4264a9013035d9df11044"},{url:"assets/index.html-9AGhSKws.js",revision:"8607696cf37121154fec61d91e8f3b1a"},{url:"assets/index.html-9LWvYvJf.js",revision:"5d12b00025396ea2e5018ced2fc00688"},{url:"assets/index.html-agu9Tswz.js",revision:"0fd0e04a54dbc88da2d1fa5db8c24d92"},{url:"assets/index.html-aH_uGVqv.js",revision:"246b97961d192bce61dbc4c0a706e45e"},{url:"assets/index.html-B1fEnyTH.js",revision:"8b11a2ea8dbb48aa410a8f1cdb4c5348"},{url:"assets/index.html-BHYZ6wGh.js",revision:"8e6a4d88b84f91a3c53b2d3e44981f09"},{url:"assets/index.html-biNtxuVy.js",revision:"08b944895a14adb28a28a49610578973"},{url:"assets/index.html-bOd4CKkV.js",revision:"3687be16d3c50e3f7993460d37ce5605"},{url:"assets/index.html-BQ5qZrok.js",revision:"3dd0fdf687f3d736c9a9f9d1f3756338"},{url:"assets/index.html-c4rRs-NN.js",revision:"668adab6088a8d820063170de59e2b23"},{url:"assets/index.html-cbiocN7z.js",revision:"fac560b8f07263955780212e74b2b0cb"},{url:"assets/index.html-Ce5yMMMw.js",revision:"bd8e64b591779eddb7041370531c3f5a"},{url:"assets/index.html-CM4Qw_Xy.js",revision:"56885374b9dfeffb3eda6bc5f1b4baf6"},{url:"assets/index.html-cTdgF5uu.js",revision:"c461fa5d9845d1c271b2d31d6f986d9b"},{url:"assets/index.html-cTggcwJJ.js",revision:"ebd54e4463251ce2d25e5836dc164232"},{url:"assets/index.html-CU9BR9sP.js",revision:"ea0f6894cb2f293e31aca6c6c77f5993"},{url:"assets/index.html-cUv3aHhf.js",revision:"14102e31b645146ae55e3abb71b5a9bb"},{url:"assets/index.html-d38JKPow.js",revision:"90f2da83f53fdf960fe6e6af96a07bd6"},{url:"assets/index.html-D8NQd95K.js",revision:"d576e3b22d2ae724dca00421f8947acf"},{url:"assets/index.html-dcS37JKq.js",revision:"486697e1540fc038f2c923681588431a"},{url:"assets/index.html-dCuwV4c-.js",revision:"cbf2371be44d91b58ebfc500c7a64f55"},{url:"assets/index.html-DfbYiCSB.js",revision:"79d43d99c4cd0438a8441ba64a240dc9"},{url:"assets/index.html-DhX6vdce.js",revision:"15ed403151fce8c8dd323aa25af4ba98"},{url:"assets/index.html-DVInEGrY.js",revision:"9e039a9d9aa533606f89bc2a494185c7"},{url:"assets/index.html-E9q0BpxL.js",revision:"80474bf46de06571ae7cb6757bb2d468"},{url:"assets/index.html-eYHlm8Wt.js",revision:"8ec1f76da1187481fa5abb8e597e5340"},{url:"assets/index.html-Ez0b591v.js",revision:"c3e8b69685e5c12a39ec561b3e116eb7"},{url:"assets/index.html-fXiqRdON.js",revision:"7231ca3cf6eb039644a05bffdde3ff1d"},{url:"assets/index.html-FZuIpOY_.js",revision:"c0202b34b0aed7903de95076995fe029"},{url:"assets/index.html-g2XThmuH.js",revision:"d6b2e434d8b44d301f272da3bccd34bd"},{url:"assets/index.html-g8q3PkXX.js",revision:"aed50a98e4bb37b75e98c6008ef0e8c4"},{url:"assets/index.html-G90Ce1_P.js",revision:"c09e5a9ea3dee6068849bb4a31781ff4"},{url:"assets/index.html-GDKls1L1.js",revision:"6149f7efd15559f54feec36b779cf45d"},{url:"assets/index.html-ggqW-JQb.js",revision:"0f0d6e327e71820244c8285623fd999b"},{url:"assets/index.html-GL-fUBiv.js",revision:"8f21ae43d90f6a8261901040018a98ab"},{url:"assets/index.html-GPGqn-oS.js",revision:"d040f8bd1610708596780706f0e23c79"},{url:"assets/index.html-gQEDS16t.js",revision:"41eef8d3ef2e56c39445bf9f70aadf13"},{url:"assets/index.html-gUBfRxr2.js",revision:"a096125133cb1e54c5210428282d794b"},{url:"assets/index.html-h0Bglre2.js",revision:"7ec98706b9e09b994abe27244bd024a8"},{url:"assets/index.html-HIFvKPWZ.js",revision:"e6d72b69e522365b907af39c5fb47ea8"},{url:"assets/index.html-HOdxw-79.js",revision:"60f31a3070509b0b1fb985f198569365"},{url:"assets/index.html-hR7PYs57.js",revision:"d83424b461c7dc276cbe705ea764e93b"},{url:"assets/index.html-hU-axrvG.js",revision:"7a48b2e397688b98f80c2648843f1c42"},{url:"assets/index.html-ig41yThJ.js",revision:"a7d22c02d5258b7d1acdd99d06b3eaa0"},{url:"assets/index.html-IHiIz7ti.js",revision:"856a67b3e0536d70e4d508120c2a70c5"},{url:"assets/index.html-iOMix6mD.js",revision:"12efb9b0191a5012412ef3060647a52c"},{url:"assets/index.html-IwYPYSi0.js",revision:"d3443b4ec85654b260761c31547831d4"},{url:"assets/index.html-JS2QsVHb.js",revision:"fd121690c46fb66cd13a6b5d4f1ec11b"},{url:"assets/index.html-KBT_DBi1.js",revision:"776fc3a6bd4389480bb524c4a059c12b"},{url:"assets/index.html-KdTxVzQB.js",revision:"c24d96befa79f50675a5d66f46bae3f4"},{url:"assets/index.html-kKKFYoZo.js",revision:"1661d24ae6f5b8c2a96883536383fd69"},{url:"assets/index.html-KME69s3l.js",revision:"d573549e3157fdeb8df5af8993ffe898"},{url:"assets/index.html-kN-Nsdix.js",revision:"bbb48e71698dd365aad5aa06a662032b"},{url:"assets/index.html-kr7a12_R.js",revision:"85474083242baa918d67733597a5b9e8"},{url:"assets/index.html-KZiYdgNN.js",revision:"5cf7e7eeee6c8bc5d07d7095d0905d1b"},{url:"assets/index.html-L9JXX8_J.js",revision:"fa33e09ddf676c28bc4cd7553ae32557"},{url:"assets/index.html-LGd4fJ-7.js",revision:"06e79cc58c6a90991975f6aff1af919c"},{url:"assets/index.html-Lu-6iPu6.js",revision:"071e23dc442dcccdd8974eba89526f7a"},{url:"assets/index.html-luHOsFrI.js",revision:"dddc75a2997e4962d9ec338ef1c1b046"},{url:"assets/index.html-MCWjWsAw.js",revision:"a52efa10a4623fac6dd6cec8b4b42e96"},{url:"assets/index.html-mGdiLQP4.js",revision:"03ca9d0e95cbba17b732f5f11edd2500"},{url:"assets/index.html-MGEj_GPV.js",revision:"e87add372505c9dd78a1e4eec2bc3cb2"},{url:"assets/index.html-MJ0Gnn_F.js",revision:"ed8b9579fa4f456b82a06c72db03f710"},{url:"assets/index.html-moSu92Ti.js",revision:"35e99eef718dfafdb48618397e6efb2b"},{url:"assets/index.html-MtNsNwRx.js",revision:"f78d8a9d62038ad5c17e4f1bd33d6593"},{url:"assets/index.html-N_kW9YLo.js",revision:"61105dc22e7c40b565b111bf40aa93d9"},{url:"assets/index.html-n3UBXl_A.js",revision:"781efaabe62ac6adb89e24ed23ceb91e"},{url:"assets/index.html-n8R1JMtH.js",revision:"abc5dd6f10a432cab4b95058c4f7bfb4"},{url:"assets/index.html-NBSoPrCk.js",revision:"501131a3ad6eee73d620fcd2060b20b9"},{url:"assets/index.html-NcsXm3WC.js",revision:"5c2b62d44fd03d497f7fa9625e6acb32"},{url:"assets/index.html-nG6FSSk5.js",revision:"84d7ee6aa7f6043c5cfa42f7404338b2"},{url:"assets/index.html-nk-nrgVB.js",revision:"99ecad797f3623423b84e86adbcf5547"},{url:"assets/index.html-NQxrG0fz.js",revision:"88f34d9e39c5c6d1073f027a2521ac99"},{url:"assets/index.html-NR6J1WpB.js",revision:"8cd084d0fcc88a77e0600249c7c2c080"},{url:"assets/index.html-NsGWRbqf.js",revision:"a154757a35ac44404b8ff550d45c7b75"},{url:"assets/index.html-O2Nw6hi-.js",revision:"3efa284ffcc4b4e628bccaaebe31e146"},{url:"assets/index.html-o9wQA3cF.js",revision:"42fb5aa4052ddc480c6eb370828293e0"},{url:"assets/index.html-OD32esEy.js",revision:"6bda2c23d2421969be220e4d435b8ada"},{url:"assets/index.html-OeaCJOYD.js",revision:"b18c598fd0d4a7f38424f43c25cfebe1"},{url:"assets/index.html-omQNpfwb.js",revision:"7b7ef1a9fd7008f344b2ea17bb6143ea"},{url:"assets/index.html-ONSG8EPU.js",revision:"a803e74b2c5b353051b0ecd8f56c55db"},{url:"assets/index.html-OOLb7v7r.js",revision:"451668cbed06071c94da16e018f0b4ad"},{url:"assets/index.html-oSCTgMYF.js",revision:"cd0c45c0a5abff0580e618dd92142ace"},{url:"assets/index.html-OYEwVsMC.js",revision:"fce210f7b784e3d3fb5ef3fc03164ab1"},{url:"assets/index.html-P-GVqPkq.js",revision:"32b90384f6b7ab1096b3b8d1aec0312e"},{url:"assets/index.html-P0LXao83.js",revision:"16cca56eb33a0c1646e2576423dc77f7"},{url:"assets/index.html-p5Pg_qkt.js",revision:"dc560c537e65924d79a8473f7705068c"},{url:"assets/index.html-pbQnLiRI.js",revision:"001070221da65b59c660d765cdbab4ff"},{url:"assets/index.html-PD4FMCrk.js",revision:"92dcb47cfcdc1e1f30ad75f7f1253c96"},{url:"assets/index.html-pHT5J-DB.js",revision:"cdef5fb648b1c9277a5bd91147ea48eb"},{url:"assets/index.html-pOmA5x9t.js",revision:"30e92183c7f9bb0cdc28d4d7703dae86"},{url:"assets/index.html-pPFdIPqh.js",revision:"b27ed965b626326ffa92ab58dce150d3"},{url:"assets/index.html-PqQ0uo5u.js",revision:"a83d81cee901696f081dcb5babe93d2f"},{url:"assets/index.html-QjGLyWCs.js",revision:"4a391a73fb4661854172af19bd44a9f6"},{url:"assets/index.html-QkDQyo7Q.js",revision:"6a3b77b32862815aafecbe2cb403061a"},{url:"assets/index.html-qkR6G051.js",revision:"d3162ee1fca43fd37403db9a0d767fce"},{url:"assets/index.html-QsjQIX8R.js",revision:"06dbcf7137d2cf00557f0fdc1ca47cf2"},{url:"assets/index.html-QThOMSe4.js",revision:"e1b0ca2161be6c1368cf400e7877f9a6"},{url:"assets/index.html-qu3zlAs0.js",revision:"3d3677b0b5f39888a6ba9c54cf853138"},{url:"assets/index.html-qUwdIo1v.js",revision:"df943ba530f5ecc88f59a1c4feb04dec"},{url:"assets/index.html-r2UKxxc1.js",revision:"7c09997ec4eb63288e3dad52493cf6d5"},{url:"assets/index.html-R3RqRDu-.js",revision:"5222b71fc7ad8302ca8e3e5d30a2ca0e"},{url:"assets/index.html-RE83hP6O.js",revision:"57d1df83ae8c20ef475c11ecfde21219"},{url:"assets/index.html-ReqWpZHA.js",revision:"ca0e6f45cf0092639e0b4a5da6dfe630"},{url:"assets/index.html-rNq1W2Zl.js",revision:"6476f9abdf21231ba2066d2b02beef13"},{url:"assets/index.html-rr2e2a2C.js",revision:"d00dfced59ee7e91e65d4da97c962a94"},{url:"assets/index.html-RrGBfii6.js",revision:"40f8077619643496fa8be89b27c9560e"},{url:"assets/index.html-s9VJ5-1w.js",revision:"cf1cf48a68bffc0a67100fb127786104"},{url:"assets/index.html-saQ_y99N.js",revision:"639d989cffcdb75c60db2810ceb6972c"},{url:"assets/index.html-Se9AuWN3.js",revision:"aa4f95411d81bddb5c93fd6203e64554"},{url:"assets/index.html-shaRytHI.js",revision:"3fd3b1aae184d672f75886d540faa139"},{url:"assets/index.html-SjREii9h.js",revision:"45d478c0912967d17077c52922330a4d"},{url:"assets/index.html-SmPk6-es.js",revision:"38a5158f4f82165b60521094822327a0"},{url:"assets/index.html-SssOY4Zb.js",revision:"b8096f09eb2b8a67402738dcb62b460e"},{url:"assets/index.html-SuQyXgcv.js",revision:"d7b7ac31c636a9902efd2c983e4d2d97"},{url:"assets/index.html-tLYxd7rz.js",revision:"0904b610354e467cb42091bfc5f02290"},{url:"assets/index.html-TrCwWslF.js",revision:"9fb3fc053cbc749734d525c47b93a23b"},{url:"assets/index.html-UAdi2jtU.js",revision:"bd9e7f480b590e2fdd1ffa618c018552"},{url:"assets/index.html-UK93Vd89.js",revision:"66ce47ca5a5386a37b25d584d9ec2d9c"},{url:"assets/index.html-UOTgR6zC.js",revision:"45a5ecbf01f6dbc3617f549640b0ba26"},{url:"assets/index.html-UV9Smhks.js",revision:"eae4a85564d23354f8a278a86ed036f0"},{url:"assets/index.html-uY8tN_X4.js",revision:"e10b7e8e8344fbbcddcc837ebb1c2d37"},{url:"assets/index.html-UyhuCEdI.js",revision:"b6bf42fb65d1ea6e75547707872b2289"},{url:"assets/index.html-UZSmYhmx.js",revision:"ab9007102ab1a41cd1205272726ab7cb"},{url:"assets/index.html-vBNZ4m0L.js",revision:"9d9a646f8e3afdfcd956c53f6e6389e1"},{url:"assets/index.html-vCptjdB4.js",revision:"11d16f09cfee5722a820a4c2cc65a3a1"},{url:"assets/index.html-vCzwf0Sn.js",revision:"65a439f4a7651b30d2f7a806a94a8212"},{url:"assets/index.html-vf9G2sX7.js",revision:"87adb4c0cadf2f47bc88d9172f345856"},{url:"assets/index.html-VFFAf27P.js",revision:"4225f875ed57cd08d84365c29a09d7fb"},{url:"assets/index.html-vI6nL4gW.js",revision:"a01b60de357c0fab9a3150bebac74480"},{url:"assets/index.html-VMaWReow.js",revision:"7a0b1729117554505f8b026a0563e4ff"},{url:"assets/index.html-VqeFNyyk.js",revision:"88207e9b4ddeb9eb2154ba8a6d973ffa"},{url:"assets/index.html-VsrUWBLa.js",revision:"ac17a4d862494203ad3f25f6d074e7b1"},{url:"assets/index.html-VTuwfCCE.js",revision:"e0ccc19e405c953d05c9f9bbde3cb6bb"},{url:"assets/index.html-w49iT_oy.js",revision:"f25590efb82e4a8f086ef9c9fecd11ca"},{url:"assets/index.html-w8grGS9G.js",revision:"7bf84dbff0c5b1208341e4b716d73d11"},{url:"assets/index.html-wCyt5Bog.js",revision:"3a4e13b3294f557317713a99837d3a9c"},{url:"assets/index.html-wEmbbtzu.js",revision:"92bf32e1090617f4a5ac651ecb58560d"},{url:"assets/index.html-WGk49Tv5.js",revision:"18e53d3cbd91c90d7e78d51081a64ea2"},{url:"assets/index.html-WktSnXxw.js",revision:"703d92f3b20e0b1e46b1f90c3f5cae3b"},{url:"assets/index.html-Wr3ujhrK.js",revision:"a39b32784217fc8945962d449c2fb766"},{url:"assets/index.html-WUCyIDuT.js",revision:"000dcae9e5bcb6edb85bfa318a78ccbf"},{url:"assets/index.html-WXkd1m1L.js",revision:"a0d256bbb8cc27cd39157df6be25eb20"},{url:"assets/index.html-wYo71ybu.js",revision:"d1b00b3a4f73d3cde32cd9f50e32493f"},{url:"assets/index.html-wz0pq5zC.js",revision:"17b0ab77269dc41a6730d1ffff60825b"},{url:"assets/index.html-X759pPU_.js",revision:"d511d19368c0866bc2b03689a4882119"},{url:"assets/index.html-XAb12k43.js",revision:"f6f38d646cb9e3ef39b1c9dde5a97025"},{url:"assets/index.html-xfPlmwnO.js",revision:"35c165aa499e748bbdf402f0376d8a27"},{url:"assets/index.html-xgR8-wRj.js",revision:"f71ddf1c0c50bd41ac54891a1131a99f"},{url:"assets/index.html-xRFtv6mu.js",revision:"68253e057409050f135fefc60f1540e5"},{url:"assets/index.html-xS9JslX3.js",revision:"f9978583bce5e2b7937ce7a7f397922d"},{url:"assets/index.html-XZhO_x0W.js",revision:"49f7bfd0b07223649f67df8b8bf95cac"},{url:"assets/index.html-y_SxEoYa.js",revision:"4d4d909f0950f8908990eb2d17e98600"},{url:"assets/index.html-yAAtfPRA.js",revision:"263e6aa56f10c827bdc4fb9abe19c764"},{url:"assets/index.html-ybYFZQb-.js",revision:"6161db77df0e61a8a2cefdeeef7d03d4"},{url:"assets/index.html-YcjenteE.js",revision:"7a05d88e87cfb466fb4feefad000b27f"},{url:"assets/index.html-yMRZy3oz.js",revision:"8b14593c0e7263b4ba54723836329c8c"},{url:"assets/index.html-YpHE7Cx_.js",revision:"fd647836248c41ff100c4db5958478f9"},{url:"assets/index.html-yTMqUL6z.js",revision:"fdb0f57827c3e321531123011af936f1"},{url:"assets/index.html-yyvhfuS4.js",revision:"c75fed971385f0bdfae5c0d5df380adb"},{url:"assets/index.html-z0Rcj3zT.js",revision:"1e6f450ab9f9b77f5bd764cf0e0b03d4"},{url:"assets/index.html-z0YzqgrC.js",revision:"7c8513b0e60ceb2c9b05f1fdb8646710"},{url:"assets/index.html-ZaikQdSp.js",revision:"4f929f5eb32132349ea3e75cde1c6545"},{url:"assets/index.html-ZEfQwbxY.js",revision:"15e8a3449cc2a799314fcc3e1da2fd15"},{url:"assets/index.html-zHvTH7-y.js",revision:"72ae82f1fa17587c369814fa5d4f03a5"},{url:"assets/index.html-ZMuIpS6c.js",revision:"53a822b6b78b2aa16e8569b66c30ab0a"},{url:"assets/index.html-zNLvzmNu.js",revision:"85f9c6a4b16975396c968a4ce6eaba80"},{url:"assets/index.html-zWMKsbfL.js",revision:"f123ea1f838e452d4c262e1786b14bb0"},{url:"assets/infoDiagram-db7b18fc-dxX5pqOn.js",revision:"4e5e6f29e8cb2668dbda5410330514b4"},{url:"assets/init-Hi12RPRh.js",revision:"3ce28180466443e9b617d7b96e9f7b8f"},{url:"assets/intro.html-oX3Ek7N2.js",revision:"924c97663e3cec3eb1899b2b6800dd84"},{url:"assets/journeyDiagram-d5636530-d_UN-4yF.js",revision:"d882c21438dc7fd463d5b6bf02ace04e"},{url:"assets/KaTeX_AMS-Regular-0YIAJWTb.ttf",revision:"56573229753fad48910bda2ea1a6dd54"},{url:"assets/KaTeX_AMS-Regular-UIXRTGNW.woff2",revision:"66c678209ce93b6e2b583f02ce41529e"},{url:"assets/KaTeX_AMS-Regular-zJvWDgGp.woff",revision:"10824af77e9961cfd548c8a458f10851"},{url:"assets/KaTeX_Caligraphic-Bold-6vyEfazt.woff2",revision:"a9e9b0953b078cd40f5e19ef4face6fc"},{url:"assets/KaTeX_Caligraphic-Bold-AE18XbF9.ttf",revision:"497bf407c4c609c6cf1f1ad38f437f7f"},{url:"assets/KaTeX_Caligraphic-Bold-RIlxi71x.woff",revision:"de2ba279933d60f7819ff61f71c17bed"},{url:"assets/KaTeX_Caligraphic-Regular-4uo0fsfh.woff2",revision:"08d95d99bf4a2b2dc7a876653857f154"},{url:"assets/KaTeX_Caligraphic-Regular-k0QPq0y-.woff",revision:"a25140fbe6692bffe71a2ab861572eb3"},{url:"assets/KaTeX_Caligraphic-Regular-MF_e1AYw.ttf",revision:"e6fb499fc8f9925eea3138cccba17fff"},{url:"assets/KaTeX_Fraktur-Bold-bAz-dThZ.woff",revision:"40934fc076960bb989d590db044fef62"},{url:"assets/KaTeX_Fraktur-Bold-i-oP291Y.woff2",revision:"796f3797cdf36fcaea18c3070a608378"},{url:"assets/KaTeX_Fraktur-Bold-XZxETTVq.ttf",revision:"b9d7c4497cab3702487214651ab03744"},{url:"assets/KaTeX_Fraktur-Regular-8XXOHEfX.woff",revision:"e435cda5784e21b26ab2d03fbcb56a99"},{url:"assets/KaTeX_Fraktur-Regular-gf8Lq3rE.ttf",revision:"97a699d83318e9334a0deaea6ae5eda2"},{url:"assets/KaTeX_Fraktur-Regular-k2IhepQP.woff2",revision:"f9e6a99f4a543b7d6cad1efb6cf1e4b1"},{url:"assets/KaTeX_Main-Bold-CZtwCMuf.woff",revision:"4cdba6465ab9fac5d3833c6cdba7a8c3"},{url:"assets/KaTeX_Main-Bold-MGqDlVzd.ttf",revision:"8e431f7ece346b6282dae3d9d0e7a970"},{url:"assets/KaTeX_Main-Bold-sffOiHVw.woff2",revision:"a9382e25bcf75d856718fcef54d7acdb"},{url:"assets/KaTeX_Main-BoldItalic-88TzJhul.ttf",revision:"52fb39b0434c463d5df32419608ab08a"},{url:"assets/KaTeX_Main-BoldItalic-8QydwDku.woff2",revision:"d873734390c716d6e18ff3f71ac6eb8b"},{url:"assets/KaTeX_Main-BoldItalic-EqUi0SPe.woff",revision:"5f875f986a9bce1264e8c42417b56f74"},{url:"assets/KaTeX_Main-Italic-DVgO3ulm.woff2",revision:"652970624cde999882102fa2b6a8871f"},{url:"assets/KaTeX_Main-Italic-N1npxqDf.ttf",revision:"39349e0a2b366f38e2672b45aded2030"},{url:"assets/KaTeX_Main-Italic-TCzgZvdR.woff",revision:"8ffd28f6390231548ead99d7835887fa"},{url:"assets/KaTeX_Main-Regular-6_eCWgYQ.woff",revision:"f1cdb692ee31c10b37262caffced5271"},{url:"assets/KaTeX_Main-Regular-dtjb4qKe.woff2",revision:"f8a7f19f45060f7a177314855b8c7aa3"},{url:"assets/KaTeX_Main-Regular-MqWbzbVV.ttf",revision:"818582dae57e6fac46202cfd844afabb"},{url:"assets/KaTeX_Math-BoldItalic-d10o37uD.ttf",revision:"6589c4f1f587f73f0ad0af8ae35ccb53"},{url:"assets/KaTeX_Math-BoldItalic-ImPtsMme.woff",revision:"48155e43d9a284b54753e50e4ba586dc"},{url:"assets/KaTeX_Math-BoldItalic-mZ7zbAmZ.woff2",revision:"1320454d951ec809a7dbccb4f23fccf0"},{url:"assets/KaTeX_Math-Italic-H5Tq_9FA.ttf",revision:"fe5ed5875d95b18c98546cb4f47304ff"},{url:"assets/KaTeX_Math-Italic-LedwBEzP.woff2",revision:"d8b7a801bd87b324efcbae7394119c24"},{url:"assets/KaTeX_Math-Italic-wNP_z16f.woff",revision:"ed7aea12d765f9e2d0f9bc7fa2be626c"},{url:"assets/KaTeX_SansSerif-Bold-2yISjogg.woff",revision:"0e897d27f063facef504667290e408bd"},{url:"assets/KaTeX_SansSerif-Bold-9bFEtBg9.woff2",revision:"ad546b4719bcf690a3604944b90b7e42"},{url:"assets/KaTeX_SansSerif-Bold-hTHqZ76u.ttf",revision:"f2ac73121357210d91e5c3eaa42f72ea"},{url:"assets/KaTeX_SansSerif-Italic-Azdo-3Wm.woff",revision:"ef725de572b71381dccf53918e300744"},{url:"assets/KaTeX_SansSerif-Italic-GGIydc0p.ttf",revision:"f60b4a34842bb524b562df092917a542"},{url:"assets/KaTeX_SansSerif-Italic-tx9FahgZ.woff2",revision:"e934cbc86e2d59ceaf04102c43dc0b50"},{url:"assets/KaTeX_SansSerif-Regular-kun6lKiW.woff",revision:"5f8637ee731482c44a37789723f5e499"},{url:"assets/KaTeX_SansSerif-Regular-TaO4USHJ.ttf",revision:"3243452ee6817acd761c9757aef93c29"},{url:"assets/KaTeX_SansSerif-Regular-wwQp5Se8.woff2",revision:"1ac3ed6ebe34e473519ca1da86f7a384"},{url:"assets/KaTeX_Script-Regular--ckFYqpa.woff",revision:"a82fa2a7e18b8c7a1a9f6069844ebfb9"},{url:"assets/KaTeX_Script-Regular-98CFnxev.woff2",revision:"1b3161eb8cc67462d6e8c2fb96c68507"},{url:"assets/KaTeX_Script-Regular-uSZBlqPg.ttf",revision:"a189c37d73ffce63464635dc12cbbc96"},{url:"assets/KaTeX_Size1-Regular-27J7nvyK.ttf",revision:"0d8d9204004bdf126342605f7bbdffe6"},{url:"assets/KaTeX_Size1-Regular-Jgg_JgPA.woff2",revision:"82ef26dc680ba60d884e051c73d9a42d"},{url:"assets/KaTeX_Size1-Regular-tfebZ-uE.woff",revision:"4788ba5b6247e336f734b742fe9900d5"},{url:"assets/KaTeX_Size2-Regular-8uHcfdJu.woff2",revision:"95a1da914c20455a07b7c9e2dcf2836d"},{url:"assets/KaTeX_Size2-Regular-e4ClFoQr.ttf",revision:"1fdda0e59ed35495ebac28badf210574"},{url:"assets/KaTeX_Size2-Regular-KA9bXP1N.woff",revision:"b0628bfd27c979a09f702a2277979888"},{url:"assets/KaTeX_Size3-Regular-4KV7NJM_.ttf",revision:"963af864cbb10611ba33267ba7953777"},{url:"assets/KaTeX_Size3-Regular-k6uTKqBB.woff",revision:"4de844d4552e941f6b9c38837a8d487b"},{url:"assets/KaTeX_Size4-Regular-1hQb9ONy.ttf",revision:"27a23ee69999affa55491c7dab8e53bf"},{url:"assets/KaTeX_Size4-Regular-5eZcWcVX.woff2",revision:"61522cd3d9043622e235ab57762754f2"},{url:"assets/KaTeX_Size4-Regular-RfuIJGSk.woff",revision:"3045a61f722bc4b198450ce69b3e3824"},{url:"assets/KaTeX_Typewriter-Regular-9yG-_x36.ttf",revision:"6bf4287568e1d3004b54d5d60f9f08f9"},{url:"assets/KaTeX_Typewriter-Regular-juq-IZ9c.woff2",revision:"b8b8393d2e65fcebda5fa99fa3264f41"},{url:"assets/KaTeX_Typewriter-Regular-tMUvZjwd.woff",revision:"0e0460587676d22eae09accd6dcfebc6"},{url:"assets/layout-vhfCKIw6.js",revision:"b05284101041d9331034f0ee2a004f68"},{url:"assets/league-gothic-h3edOfrm.eot",revision:"9900a4643cc63c5d8f969d2196f72572"},{url:"assets/league-gothic-oOjv4w16.ttf",revision:"91295fa87df918411b49b7531da5d558"},{url:"assets/league-gothic-wxYXAA-7.woff",revision:"cd382dc8a9d6317864b5810a320effc5"},{url:"assets/line-0KVoflyH.js",revision:"de1f1567d0ded6b8327bad63816059eb"},{url:"assets/linear-ZY3LUsi4.js",revision:"9b89806f8a9d660699f79b423293b48e"},{url:"assets/markdown.esm-ldiezHYe.js",revision:"dfebc8121864151002204ef714f81472"},{url:"assets/math.esm--eqzfLue.js",revision:"c5f77dc064ac53005c0e5446bb6715b0"},{url:"assets/mermaid.core-oTI0dw4V.js",revision:"6fe87effa53fd4fbe2235e077aee7544"},{url:"assets/mindmap-definition-377f8f1f-X6LAIWoO.js",revision:"815773d8c77b93257b7c2e6c394fe3e1"},{url:"assets/notes.esm--_TQ5Wr4.js",revision:"12d7e35985a640e2ff8300c7cedb5983"},{url:"assets/ordinal-wXG5obU4.js",revision:"a72e57060c4f6a7606baa78dc6e9ad02"},{url:"assets/path-aUcfwwLI.js",revision:"f86c0243cb45746453c6b4f7dbd9f34d"},{url:"assets/photoswipe.esm-08_zHRDQ.js",revision:"481d5342d9bb799640b63b15b698dcd4"},{url:"assets/pieDiagram-b0208e96-s3bLieF_.js",revision:"cdd8f55ed83bc863d1e6c67e1075140b"},{url:"assets/quadrantDiagram-0332be45-gJWC5Gva.js",revision:"2e592624ff62a7975a789c7d65d7f3c2"},{url:"assets/requirementDiagram-bf7890df-oepJXSkv.js",revision:"9f1c1cf6e630219079402226952e43d5"},{url:"assets/reveal.esm-QxxCNeuR.js",revision:"0b31bd04921a05d8df6da2d9faca8c70"},{url:"assets/sankeyDiagram-0acdec17-hfjkW-rC.js",revision:"c9df93c981ba537fe19690a396961673"},{url:"assets/search.esm-I_xTZtXh.js",revision:"d39092c5e0d9959995df72297767dc3f"},{url:"assets/sequenceDiagram-c18d009d-GNUSKQJn.js",revision:"9c3bf767f68f7713c749d91e8a08fed4"},{url:"assets/slides.html-44inynfd.js",revision:"ec397fccb1ec8e0554c7a2dd6a10dcee"},{url:"assets/source-sans-pro-italic-kXLDr8ko.ttf",revision:"8256cfd7e4017a7690814879409212cd"},{url:"assets/source-sans-pro-italic-r_ZvIQue.woff",revision:"e74f0128884561828ce8c9cf5c284ab8"},{url:"assets/source-sans-pro-italic-URCxwoo9.eot",revision:"72217712eb8d28872e7069322f3fda23"},{url:"assets/source-sans-pro-regular-1WEW6-y9.ttf",revision:"2da39ecf9246383937da11b44b7bd9b4"},{url:"assets/source-sans-pro-regular-7ugzKlOX.woff",revision:"e7acc589bb558fe58936a853f570193c"},{url:"assets/source-sans-pro-regular-vMQH-Lno.eot",revision:"1d71438462d532b62b05cdd7e6d7197d"},{url:"assets/source-sans-pro-semibold-8K4hAz36.woff",revision:"1cb8e94f1185f1131a0c895165998f2b"},{url:"assets/source-sans-pro-semibold-CdFA3Jgq.ttf",revision:"f3565095e6c9158140444970f5a2c5ed"},{url:"assets/source-sans-pro-semibold-yZBXeD4J.eot",revision:"0f3da1edf1b5c6a94a6ad948a7664451"},{url:"assets/source-sans-pro-semibolditalic-0pB0ab1n.woff",revision:"6b058fc2634b01d837c3432316c3141f"},{url:"assets/source-sans-pro-semibolditalic-R0KDpyfN.ttf",revision:"c7e698a4d0956f4a939f42a05685bbf5"},{url:"assets/source-sans-pro-semibolditalic-wk7IoV6c.eot",revision:"58153ac7194e141d1e73ea88c6b63861"},{url:"assets/stateDiagram-43596fc0-s2LDkwDs.js",revision:"395253b3c128cfa779c0c9691aa9c1e4"},{url:"assets/stateDiagram-v2-2ead4f9c-_4YEus-U.js",revision:"a865d7986814e9ce52efe6997ac4799f"},{url:"assets/style-0ILgEizb.css",revision:"49819ef9f8c3444f5c699133a2b3ed0c"},{url:"assets/style-w40geAFS.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/styles-6860f46c-QqbrbaNT.js",revision:"be46eda225b90dd8d40160d2ba856611"},{url:"assets/styles-7383a064-g88cDJLt.js",revision:"26c3052ed3028d8c6a757a962bee0123"},{url:"assets/styles-b2c874b6-OQFbAfhn.js",revision:"97b98ff0bb9ea9ede89d5725a38e3d96"},{url:"assets/svgDrawCommon-0ee1b4e9-UBeRZUOR.js",revision:"377656e1b9a107a2a698d37a513e51fb"},{url:"assets/Tableau10-Fgclqpgn.js",revision:"f2197f44250cada74e1e663d3abfba3e"},{url:"assets/timeline-definition-d977decf-PV3T5b89.js",revision:"3cd627dd3c3b145c82ddb728adb48295"},{url:"assets/utils-obz1_5fQ-XOQqDqQW.js",revision:"5adeaa99226a6e92519556c9acd3f636"},{url:"assets/vue-repl-966AioC4.js",revision:"ec7f13030691a1bb7c968e812f395cdc"},{url:"assets/xychartDiagram-e50adddc-XrJ1y6Nb.js",revision:"a43b89eb4e94d3d9b821eb910826c7b5"},{url:"assets/zoom.esm-w3VbP3hY.js",revision:"e6e8f9a61302e3ca14aa4dbeec242607"},{url:"404.html",revision:"08708c1987af0471c682c9e91c448130"},{url:"article/index.html",revision:"255a961c56cfcf5d1f3ad10d000aae25"},{url:"backend/database/basic/001-hello-database.html",revision:"99976fa7f2053e75fa56fc06f54fd38c"},{url:"backend/database/basic/002-relation-model.html",revision:"d7d3d6fe204ed539d9956f41f03e57ae"},{url:"backend/database/basic/003-db-design.html",revision:"85e5bc49986f11512740d0a12f7bc239"},{url:"backend/database/basic/004-advanced-db-model.html",revision:"6dd31f7f6c754fae1dbd2dd6322f063e"},{url:"backend/database/basic/index.html",revision:"cb64ea216251e6894a0a4bad16dba673"},{url:"backend/database/index.html",revision:"46a542b6817a0bacf9a74852642b2ee0"},{url:"backend/database/mysql/001-install-mysql.html",revision:"7c7ed2262919b5cbb89cd2a8764a44b8"},{url:"backend/database/mysql/index.html",revision:"e0bc17d843de64b0aa41c7c3a1b62217"},{url:"backend/database/sql/01-quick-start.html",revision:"71797bea5c735b74ff2c55fb5d4267ec"},{url:"backend/database/sql/index.html",revision:"e4a0077a1c9dd63ee48867812952deaa"},{url:"backend/index.html",revision:"9f73a5939919ec89ab56ec3510060959"},{url:"backend/java/index.html",revision:"85a340f17225eb301395f05cf59fab03"},{url:"backend/java/tool/01-maven.html",revision:"21291c4a9cc0ba760bdd52322f0e4962"},{url:"backend/java/tool/index.html",revision:"8107aac2f639bef5c1d018a37d774f8d"},{url:"backend/linux/index.html",revision:"96ab6619ec5ea253f60c73cafdfa5229"},{url:"backend/linux/practice/001-set-the-ssh.html",revision:"7457ad91b21338ef25e66204e13ab0c0"},{url:"backend/linux/practice/002-build-git-server.html",revision:"54df5ca3d6f78080050c1bef601aefac"},{url:"backend/linux/practice/003-configure-bt.html",revision:"ab82a1ab65ae80ad2d8bb6e5e684c0de"},{url:"backend/linux/practice/004-automated-deployment.html",revision:"f73ad184e6a40b5eb22e17ad55ce04eb"},{url:"backend/linux/practice/005-install-docker.html",revision:"28274c38afcfb8017aa8306b55efd6fc"},{url:"backend/linux/practice/index.html",revision:"0bb54e3d8beb670abe39aaad56bdf92c"},{url:"backend/node/express/01-overview-architecture.html",revision:"7e77c35220fea005c6ec3bb63559de07"},{url:"backend/node/express/02-express.js.html",revision:"9c6c5e27a9ee3e1fe6929f4bf9f2429c"},{url:"backend/node/express/index.html",revision:"06f059b4e626e011c770c784fef63ca9"},{url:"backend/node/index.html",revision:"8027d55338bb7a69690c049b2614d802"},{url:"backend/node/module/001-finalhandler.html",revision:"9a76460840995a877f1cea6a414de062"},{url:"backend/node/module/index.html",revision:"509146ed71120b7e9bdb76129c7de95e"},{url:"category/algorithm/index.html",revision:"809bf5c16224e6b3e6082b1c89c5d0c1"},{url:"category/browser/index.html",revision:"d0c5ad80684257da5f0c22fe3fb475b4"},{url:"category/chakra/index.html",revision:"e2bb366a73d984cccb9513e617f366f8"},{url:"category/css/index.html",revision:"e6531a008f22c28430e8e8214170887b"},{url:"category/database/index.html",revision:"6177bce4e3b8e6332b676e34529fa94f"},{url:"category/html/index.html",revision:"ed5fadce2eb3b489b04426f647f8e728"},{url:"category/index.html",revision:"9107c23a8cfd916ffd19c7e7cf988fa5"},{url:"category/javascript/index.html",revision:"2a3e5b41a29ef33bc7b642ac28555660"},{url:"category/leetcode/index.html",revision:"199786cb111051e2d1c1cfe740ad4cf7"},{url:"category/linux/index.html",revision:"36e5e91dd77c24f7549f4879ea6b21b2"},{url:"category/next/index.html",revision:"d29baf9617a8af064783d4cd2af55c56"},{url:"category/node/index.html",revision:"a7ece156ad7eaf2c5c484ba327eb857e"},{url:"category/operating-system/index.html",revision:"2eb695ab2f93a7a3026ec85da71fb820"},{url:"category/pixi/index.html",revision:"760a12f247c8a65b2731fdaed210154e"},{url:"category/practice/index.html",revision:"c6c645829550d527cd89c1b4f3ae94dd"},{url:"category/project/index.html",revision:"93ed7825427984129af5ffd0de1e818f"},{url:"category/react/index.html",revision:"1a4cd214c74d15094d81f715a3747417"},{url:"category/reading/index.html",revision:"352a0654a10fb90e3e5492d3dc20ef53"},{url:"category/vue/index.html",revision:"c4a53beb90572e083fa7e5fec76a376a"},{url:"category/工程化/index.html",revision:"34743380e54dd714ee32938e6996e04e"},{url:"category/计算机网络/index.html",revision:"5b309c0acd125fe93ab742cf894fe408"},{url:"computer-science/algorithm/0001、二叉树.html",revision:"bb451afea3f1a7407c6a36e626cd42b0"},{url:"computer-science/algorithm/0002、二叉搜索树.html",revision:"efb2831ca4a4e45be31dfaabbc01c42c"},{url:"computer-science/algorithm/0003、动态规划.html",revision:"897406df651c8aa9f091d893512c58fc"},{url:"computer-science/algorithm/0004、链表.html",revision:"1805546b31622d9b8737224a2d53a898"},{url:"computer-science/algorithm/01-array.html",revision:"1e3b88beea5bee6189ecb3ead43ad21d"},{url:"computer-science/algorithm/index.html",revision:"8b53310db6cea06603597035df37d435"},{url:"computer-science/index.html",revision:"6c3014b786d4f3b98300bc43e4b1bd40"},{url:"computer-science/networking/001-network-model.html",revision:"7714af327f82cae80424a805d512b25c"},{url:"computer-science/networking/002-HTTP-overview.html",revision:"a3d3d17714b0e57fce17d33e85fa3846"},{url:"computer-science/networking/003-get-post-difference.html",revision:"0fafb089ec8dec201a3852ee7e043d0b"},{url:"computer-science/networking/004-HTTP-development.html",revision:"c137d654ae959d0f6233684a160256ed"},{url:"computer-science/networking/005-HTTP-cache.html",revision:"7cd8ed47866f37f94a9bb57aad9d5f14"},{url:"computer-science/networking/006-HTTPS-overview.html",revision:"b89d26cc12c14bd3fc75a8a47ef456aa"},{url:"computer-science/networking/007-TCP-three-handshakes-and-four-waves.html",revision:"b5c42635568ab5505d7b9dfafbea4ef9"},{url:"computer-science/networking/008-tcp-udp.html",revision:"0099411d54103d831de356a9c608151b"},{url:"computer-science/networking/009-http-code-when-authorized-refused.html",revision:"23219ccbcbd7270980addca147f4c2b3"},{url:"computer-science/networking/index.html",revision:"129555c6c9eb68f1370e9a2d9e87b140"},{url:"computer-science/operating-system/001-character-encoding.html",revision:"614828c4b2ed21e2bbe677074f2a8489"},{url:"computer-science/operating-system/index.html",revision:"0de90428fb52c41259fa8034888dd830"},{url:"frontend/basic/css/001-quick-start.html",revision:"d514f0302e8907ccaede6220300f864d"},{url:"frontend/basic/css/002-selector.html",revision:"52f115790a24c4dbef934ea055eb807a"},{url:"frontend/basic/css/003-box-model.html",revision:"79695cb16383f9345bde3d39c99d232a"},{url:"frontend/basic/css/004-text-font.html",revision:"12e7ad4023260d2150703871256d311f"},{url:"frontend/basic/css/005-cascade-inheritance.html",revision:"ce408ae2611bbc8cd1194bf04c749c2c"},{url:"frontend/basic/css/006-background-border.html",revision:"968ccfc1f93886a73119fe0f602473ae"},{url:"frontend/basic/css/007-position.html",revision:"35bd97d66b7b997388a376b7b0e97209"},{url:"frontend/basic/css/008-float.html",revision:"8a5fac2c3e48b5e92e1ea3ffd7b388a2"},{url:"frontend/basic/css/009-flex.html",revision:"eb4541395a47293ff43b438f16476cb6"},{url:"frontend/basic/css/010-unit.html",revision:"8a3f34b1d074ac345cff6c837c65c4fb"},{url:"frontend/basic/css/011-center.html",revision:"310758599991b6ad2c5e52ce2fc78c43"},{url:"frontend/basic/css/012-grid.html",revision:"a2d7f7d6bd0a4be7f88625cd3d0399f7"},{url:"frontend/basic/css/013-BFC.html",revision:"8fef6bee4634bf8af7defc7d23f26073"},{url:"frontend/basic/css/014-responsive-design-intro.html",revision:"93bb0697812cf07e4e545b944bdd4b6c"},{url:"frontend/basic/css/015-responsive-design.html",revision:"b9b04781d8a14ed76a0d21273b91da18"},{url:"frontend/basic/css/016-how-to-responsive.html",revision:"2058c83d080a634c4e064865d7980620"},{url:"frontend/basic/css/017-loading-spinner.html",revision:"2a92bd93cc56e491b6ceab5fd577718c"},{url:"frontend/basic/css/018-autofill.html",revision:"c309e857ee6a888580a71dd554436bc1"},{url:"frontend/basic/css/index.html",revision:"946a41c1c7e92e4f78a9d87ba654e7f2"},{url:"frontend/basic/html/0007、WebSocket.html",revision:"2e628471c3dd50b984e7003627ef6882"},{url:"frontend/basic/html/0008、WebStorage.html",revision:"79b01a7cca179c376cd8da2b1c1a3682"},{url:"frontend/basic/html/001-html-history.html",revision:"2ee044770ba494987b49eae39711821f"},{url:"frontend/basic/html/0010、WebWorker.html",revision:"ba3b8c78066bc71db9de157c03ca670f"},{url:"frontend/basic/html/002-quick-start.html",revision:"ddb8746450fb34435b6187a7b9f73a6a"},{url:"frontend/basic/html/003-doctype.html",revision:"2d260e9b7761b1dcfacd0bc8d201ba1e"},{url:"frontend/basic/html/004-common-element.html",revision:"f9f2b6ec8ff4cafbc0ff5b9a55b4d160"},{url:"frontend/basic/html/005-advanced-element.html",revision:"047b57ce1a05a01c33557cc2b19047e6"},{url:"frontend/basic/html/006-semantically-meaningful-tags.html",revision:"081caddf078d418f46c6566a1c5d4f2b"},{url:"frontend/basic/html/007-media-tag.html",revision:"5338c891c57a4acb7614f66a28f058f4"},{url:"frontend/basic/html/008-canvas-svg.html",revision:"29613ba522119bf585b5d8aa21822e52"},{url:"frontend/basic/html/009-src-vs-href.html",revision:"9322b0a17bc917e584fc2bd76f57c7ad"},{url:"frontend/basic/html/010-html5.html",revision:"cf2832fc230792dde55001d2d959b252"},{url:"frontend/basic/html/011-defer-vs-async.html",revision:"48a37233afa8ef202f546983bdf820c4"},{url:"frontend/basic/html/012-form-validation.html",revision:"39bce42ac2dcd08079bdc00f39be6355"},{url:"frontend/basic/html/013-seo.html",revision:"bc70b30fb528a31453dba2bbe625ae06"},{url:"frontend/basic/html/index.html",revision:"8e7064d5d67a6be01c74e0de887fac91"},{url:"frontend/basic/index.html",revision:"6ef86bdcef3fe33cd76747f2fa68ee73"},{url:"frontend/basic/javascript/001-var-let-const.html",revision:"acbe587de61bed9e3f926c609afa2bbd"},{url:"frontend/basic/javascript/0011、判断对象值相等.html",revision:"c35fba691d454428d3ad46bfc1e5ac7b"},{url:"frontend/basic/javascript/0012、AJAX.html",revision:"e105c0b9a95919de7e92b860869945b4"},{url:"frontend/basic/javascript/0014、浅拷贝与深拷贝.html",revision:"0bb18d1b8f700ad0a3b6733337d249cf"},{url:"frontend/basic/javascript/0017、事件循环.html",revision:"bd2883947f1c2761e092e461a66ba359"},{url:"frontend/basic/javascript/002-types.html",revision:"47f83e801fe34442f7521685a9ffaec1"},{url:"frontend/basic/javascript/003-judge-type.html",revision:"d9a73ffa05c11e27b37e3f5e5720341a"},{url:"frontend/basic/javascript/004-primitive-value-reference-value.html",revision:"c7083bfc9d063119e78aba056c1d7254"},{url:"frontend/basic/javascript/005-execution-context.html",revision:"aaa27db42df091cefac90f574d5540e7"},{url:"frontend/basic/javascript/006-toString-toLocalString-valueOf.html",revision:"72f60743d9689ed2b3202a6eba397e3f"},{url:"frontend/basic/javascript/007-basic-reference-type.html",revision:"a46b157d6731eccbd5670eb1bd3353d1"},{url:"frontend/basic/javascript/008-collection-reference-type.html",revision:"fc399248445fcebd433996c78b2e3c6f"},{url:"frontend/basic/javascript/009-array-like-object.html",revision:"8fe9013199415adb75114774ed9beb45"},{url:"frontend/basic/javascript/010-object-property.html",revision:"ab9aaa1c21b69307537d24e1147e56c1"},{url:"frontend/basic/javascript/011-create-object.html",revision:"73150aaf4d8dd6862b56e83268915adc"},{url:"frontend/basic/javascript/012-extends.html",revision:"ecb74d2f4d8d85acae8463b5d363f67f"},{url:"frontend/basic/javascript/013-class.html",revision:"577b27ecf61d7634e304e234bbf325cf"},{url:"frontend/basic/javascript/014-implement-new.html",revision:"e7de927ce23617808fa2a6cd5e1d2586"},{url:"frontend/basic/javascript/015-function.html",revision:"ea545e7358f101d789108dbe1bdae7ef"},{url:"frontend/basic/javascript/016-this.html",revision:"40a5643d9f1e5ce4da96a764124bf78c"},{url:"frontend/basic/javascript/017-implement-call-apply-bind.html",revision:"56bbf2febbd5027bf15d4dc61a56059e"},{url:"frontend/basic/javascript/index.html",revision:"4f99cf5223b32835e88ea9097c17a87a"},{url:"frontend/browser/01-how-browser-rendering-works.html",revision:"356f592c4e3b2f2d4170d0c593490950"},{url:"frontend/browser/02-V8.html",revision:"00c6b975d78490fd55b536ade144e54c"},{url:"frontend/browser/03-memory-management.html",revision:"96b709b823f02eaee94c1d7ed4c0405e"},{url:"frontend/browser/04-cross-domain.html",revision:"2bf9b671bcb6b078f2e0be68e2188909"},{url:"frontend/browser/05-what-happens-after-entering-the-URL.html",revision:"5090165647fc7d4a1ef1ab0b2a9b5797"},{url:"frontend/browser/index.html",revision:"924080224481e0adf1e1bb23991bc8f1"},{url:"frontend/engineering/basic/001-modularization.html",revision:"1e3370b8640cd433da957a16594395d8"},{url:"frontend/engineering/basic/002-package-manager.html",revision:"2c4c051b35f8d474433f0f204ba6e474"},{url:"frontend/engineering/basic/003-tool.html",revision:"18de5ffd7c69f88bd121806047fc44d3"},{url:"frontend/engineering/basic/004-project-standards.html",revision:"85b1b4eb35d3bcee3ef9e2f2cd933888"},{url:"frontend/engineering/basic/005-yeoman.html",revision:"977d2bc81a6ec049f64172f932de25d2"},{url:"frontend/engineering/basic/index.html",revision:"8a60c3098a261865e524620f7379321b"},{url:"frontend/engineering/build-tool/index.html",revision:"98b046eb4e62106e4d280ee1757e7dfc"},{url:"frontend/engineering/build-tool/rspack/001-hello-rspack.html",revision:"9c75fbc41368cb6b6b1e66bedc65c7a3"},{url:"frontend/engineering/build-tool/rspack/index.html",revision:"6492850a4485c40498dbacb119adaf29"},{url:"frontend/engineering/build-tool/vite/001-hello-vite.html",revision:"6fc1570c77f92556bf23245985d13f4d"},{url:"frontend/engineering/build-tool/vite/index.html",revision:"f8b4b83a876702013315b3c4f54846a9"},{url:"frontend/engineering/build-tool/webpack/001-webpack-basic.html",revision:"23194131998d89a3cff22b045d38e9c5"},{url:"frontend/engineering/build-tool/webpack/002-webpack-css.html",revision:"2746f6f108bb28d1b3a6ad3942d8e2d5"},{url:"frontend/engineering/build-tool/webpack/003-webpack-assets.html",revision:"b40cfe4154a0287ba1355cfe4fa48583"},{url:"frontend/engineering/build-tool/webpack/004-webpack-plugin.html",revision:"78553bcdba199aa85c0e730b70cce9b6"},{url:"frontend/engineering/build-tool/webpack/005-webpack-babel.html",revision:"cc43b1d0ddc28856341d6a789dd68f28"},{url:"frontend/engineering/build-tool/webpack/006-webpack-vue.html",revision:"050f386145a075c4476a9ad6562746d5"},{url:"frontend/engineering/build-tool/webpack/007-webpack-dev-server.html",revision:"920f6a00056fa665877be0b02c604461"},{url:"frontend/engineering/build-tool/webpack/008-webpack-resolve.html",revision:"f39515359839260701ee8330a295abd8"},{url:"frontend/engineering/build-tool/webpack/009-webpack-env-split.html",revision:"b5decffbe016be745650b2c435f2fa7b"},{url:"frontend/engineering/build-tool/webpack/index.html",revision:"91ce5f2e4d11b3caf42eefef0437b578"},{url:"frontend/engineering/index.html",revision:"e5ae9a33056135baeda559d7ad8f695b"},{url:"frontend/engineering/ssr/005-qwik.html",revision:"57bef5222ad8b6048cb3048ca81833d7"},{url:"frontend/engineering/ssr/006-react-server-component.html",revision:"6c4fe8c9799ceb55f8be72713ddc2c00"},{url:"frontend/engineering/ssr/007-hydration-is-pure-overhead.html",revision:"983b992029659bc74cb1496bb1b9dce6"},{url:"frontend/engineering/ssr/index.html",revision:"c58a9bc364f3997905b3045870c26c3c"},{url:"frontend/framework/chakra/01-getting-started.html",revision:"7c1ba6c0b32b81415c6c83232bd44bcc"},{url:"frontend/framework/chakra/02-style-props.html",revision:"af7c4cc995172b1c915be5282f7c0e7b"},{url:"frontend/framework/chakra/index.html",revision:"0ad5f499e98a012f05ea2c028a9e0e4f"},{url:"frontend/framework/index.html",revision:"1dd22dcdd957cf472b44436f4bc560a2"},{url:"frontend/framework/next/index.html",revision:"147c87d914d0599e7b20b50f1efb76dc"},{url:"frontend/framework/next/pages-router/01-pages-layouts.html",revision:"204409cc3de3a63525048bb65dc15883"},{url:"frontend/framework/next/pages-router/index.html",revision:"76ce4782ba3cd2f7133f53a97ee73215"},{url:"frontend/framework/node/001-module.html",revision:"66a9666fe26593ed2aeeef7dc1564795"},{url:"frontend/framework/node/index.html",revision:"b3fde319365d0bb619d1bda5bdc6ca90"},{url:"frontend/framework/pixi/01-quick-start.html",revision:"10e15a2e289f6c4ebb17e998e8a751f8"},{url:"frontend/framework/pixi/02-architecture-overview.html",revision:"5d13ad09815ce8b4f324fa675ca18c25"},{url:"frontend/framework/pixi/03-render-loop.html",revision:"c4f76473d94a1cc1fded3cd7b0f030b9"},{url:"frontend/framework/pixi/04-scene-graph.html",revision:"ed3f8f41c0048a4aa9dd088c564760ea"},{url:"frontend/framework/pixi/index.html",revision:"c6203651eeb31ddafd91c6f1d8f23c56"},{url:"frontend/framework/react/01-useState.html",revision:"a35e69479a97b4013f1b4d199938893d"},{url:"frontend/framework/react/02-useEffect.html",revision:"e25f2222b4e1440fab23010f3a5fa2dc"},{url:"frontend/framework/react/index.html",revision:"f73853491effee83ff5e108d7f8632e5"},{url:"frontend/framework/vue/01、父子组件通信.html",revision:"20c3272799c3fcf638b6a898fac80a4e"},{url:"frontend/framework/vue/02、provide-inject.html",revision:"f2799883f7b9a1f870301624592c1a87"},{url:"frontend/framework/vue/02、Vuex 原理.html",revision:"b90d4f746ef547180e18aa84e1c5142d"},{url:"frontend/framework/vue/03、插槽.html",revision:"bfa6f284bf95eeab720a7322f20f40d8"},{url:"frontend/framework/vue/04、动态组件和异步组件.html",revision:"72f18139fb3bd349a06ba86eb395b076"},{url:"frontend/framework/vue/05、组件的v-model.html",revision:"37f1d4b41886fd9400c69fd9370628fe"},{url:"frontend/framework/vue/06、Mixin.html",revision:"d75b8a0aeacd740a138e3ec5e2a8fed1"},{url:"frontend/framework/vue/07、组合式API基础.html",revision:"00eefacd33a6c259be17709ced7825e4"},{url:"frontend/framework/vue/08、组合式函数.html",revision:"04bb27758919cd2c3b864c08ff015a98"},{url:"frontend/framework/vue/09、指令.html",revision:"6547015238f64ad4d136e0d3c9a4929a"},{url:"frontend/framework/vue/10、插件.html",revision:"5b24847929d6e49e377096a305342963"},{url:"frontend/framework/vue/index.html",revision:"cacbcea56a82bffb830cbbf0145b8a44"},{url:"frontend/index.html",revision:"57fa467dc3c8ef939119db23f80bcea8"},{url:"frontend/practice/001-dnd-kit.html",revision:"31985545925b92bdbfeba4836b7cdbd7"},{url:"frontend/practice/002-annotation.html",revision:"7f6cceb66d1784164e2dbcb8038edd2b"},{url:"frontend/practice/003-file-upload.html",revision:"f71998d4425aa6481f9a223e5f83f95a"},{url:"frontend/practice/004-global-upload.html",revision:"623e5677f49762b9d73deba0b4582520"},{url:"frontend/practice/005-postcss-px-to-viewport.html",revision:"3f8bfc47c8de955ccd780bd1fc29e5a0"},{url:"frontend/practice/006-animation-svg.html",revision:"0ec9fbc304d51ba0b4729ca90b9eabf0"},{url:"frontend/practice/007-offline-export-in-highcharts.html",revision:"5afefd2bfc23249548e1d36f274fadbe"},{url:"frontend/practice/010-antd-textarea-placeholder-pre-line.html",revision:"289a3855c8897bd4dfb3c56e7742c70b"},{url:"frontend/practice/015-auto-change-node.html",revision:"56832df3aa640736aac283e9ccdd0815"},{url:"frontend/practice/016-rest-client-error.html",revision:"f0dd39b9e9a006890c7ead10bbc11c36"},{url:"frontend/practice/017-whistle-debug-real-phone.html",revision:"c226e80a3220b84588fbb81e0d3e455d"},{url:"frontend/practice/018-monaco-editor-react.html",revision:"368a82f2cab743f2d40561ec3d9e217f"},{url:"frontend/practice/019-ios-prevent-touch.html",revision:"6bc6ac4ece7b6ffcbb4f9bc868696f8d"},{url:"frontend/practice/020-ios-img.html",revision:"d1334bc360ca57d9729a6346c754576b"},{url:"frontend/practice/index.html",revision:"10adaab8b2a6deb431f8344cc697da20"},{url:"index.html",revision:"26dfff6f3b357c6efc5ace9b630d69da"},{url:"intro.html",revision:"558b6f4c2368bc40a7a93b6a7f6c09a9"},{url:"project/github-auto-commit/index.html",revision:"52ee2016e0951a452198dbfc93be7c0f"},{url:"project/imperial-kitchen/01-init.html",revision:"6d07c2b034470cba6d14fafcc089d6dd"},{url:"project/imperial-kitchen/02-server.html",revision:"ef6fcf08c47030a74fe95ccdef70fcce"},{url:"project/imperial-kitchen/03-database.html",revision:"805530451c1ae4332d62e7a1bfbe22bb"},{url:"project/imperial-kitchen/04-api.html",revision:"ec77eed3c094c7a2f5742ec8657bb34e"},{url:"project/imperial-kitchen/index.html",revision:"505260a565f18445e07e859d86d04a7b"},{url:"project/index.html",revision:"b5234c878a544216198d32202da07d58"},{url:"project/mini-vue-cli/001-init-project.html",revision:"47d3dc1e7be79b274df279e6775fbe1b"},{url:"project/mini-vue-cli/index.html",revision:"6ab80edb5b909be88886109105561dae"},{url:"project/plugin/01.vuepress-plugin-ordered-header.html",revision:"f913a2b7e2c986bb5d8cbfec6947f747"},{url:"project/plugin/index.html",revision:"feadf577d7d7a7cc13add154b8ac76de"},{url:"project/RSSHub/index.html",revision:"c5aa0dce8715a137037210db4b728b2d"},{url:"project/ssg/index.html",revision:"8fc491591a0f017e914ee4a0071e6aa9"},{url:"project/tyro-ui/001-init-project.html",revision:"2ca6f6b8feb8f822978fc172f013fb29"},{url:"project/tyro-ui/index.html",revision:"5bb0a5c1d847bcf41da218c770841f91"},{url:"reading/index.html",revision:"c4a27808c6dd4ede8dfa8121bb36361f"},{url:"reading/patterns/index.html",revision:"161ba9e40052d74ea095af1da9c663fb"},{url:"reading/patterns/vanilla/01-command-pattern.html",revision:"3b5eea706ff15b1beadc7c9ee971737a"},{url:"reading/patterns/vanilla/02-factory-pattern.html",revision:"3fb780373be51ee82a209aa2202977d0"},{url:"reading/patterns/vanilla/03-flyweight-pattern.html",revision:"105a4bac4b65e811f7b3edc955b7b846"},{url:"reading/patterns/vanilla/04-mediator-pattern.html",revision:"426dedcada93987144a220fd1c3e9c37"},{url:"reading/patterns/vanilla/05-middleware-pattern.html",revision:"5a0a215da9ff8ad22eafc576ec42997c"},{url:"reading/patterns/vanilla/index.html",revision:"c193c1b77261c6490b8b107565fb1826"},{url:"reading/pragmatic-programmer/01-a-pragmatic-philosophy.html",revision:"99ed1a54fe899481c7895f1ddeb99639"},{url:"reading/pragmatic-programmer/02-a-pragmatic-approach.html",revision:"ffee17b14937a20e41cf4c31ff5047be"},{url:"reading/pragmatic-programmer/03-basic-tool.html",revision:"711bf42ad667371953271eb7b9fc36f6"},{url:"reading/pragmatic-programmer/04-pragmatic-paranoid.html",revision:"03f89dc0582527278e16c6ba821a5355"},{url:"reading/pragmatic-programmer/05-work-around.html",revision:"5447bf871603c7854fd18c7dfe0258c2"},{url:"reading/pragmatic-programmer/06-concurrent.html",revision:"a7464d4b52b15c8c155dd090711ae944"},{url:"reading/pragmatic-programmer/07-when-coding.html",revision:"8b9bfa224f41acd74af45a89666e70f8"},{url:"reading/pragmatic-programmer/08-before-start-project.html",revision:"91ea87ce4740b87f3b10a455bebccacf"},{url:"reading/pragmatic-programmer/09-pragmatic-project.html",revision:"cfc67aac4a32251e78c100762220d93e"},{url:"reading/pragmatic-programmer/index.html",revision:"ff6613e52f078982dd2ead111aee51dd"},{url:"reading/pro-git/01-getting-started.html",revision:"8e050a22ae2c0384564f92505fbbd3b9"},{url:"reading/pro-git/02-git-basics.html",revision:"7eb3c862d28fb079a40aedbd210aca80"},{url:"reading/pro-git/03-git-branch.html",revision:"b35c0e99c084306d0eb6922992d78161"},{url:"reading/pro-git/04-git-server.html",revision:"2ba2ae58e6b335b787347a8caaa2c474"},{url:"reading/pro-git/06-change-commit.html",revision:"d735d10b2165ac4dad6b911575959978"},{url:"reading/pro-git/index.html",revision:"a27d8323e9070dce3154be7197c07d5b"},{url:"slides.html",revision:"34e26d54141942e790b288845dc14d04"},{url:"star/index.html",revision:"b23d3853b8ba29ebba3c61ce346a61b8"},{url:"survival/index.html",revision:"99dfd3d1c46299d92e3a239c4d5b2883"},{url:"survival/okr/2023.html",revision:"cd193e8878b5985d072addf6ec1ee713"},{url:"survival/okr/2024.html",revision:"3ed2bde16e15049e417d652ac4b21fba"},{url:"survival/okr/index.html",revision:"1d9199418c42786530e7982660497fc9"},{url:"survival/week/index.html",revision:"97fe90320dec7f9732a366431527794f"},{url:"tag/amd/index.html",revision:"a0a75beb23b72c929ebc6ebb7655e07e"},{url:"tag/animation/index.html",revision:"ea8afffe39fde4fa9bfa08f9b7f9865c"},{url:"tag/antd/index.html",revision:"c24ae29dcb3f971674a779af17e1cc71"},{url:"tag/architecture/index.html",revision:"bfa9e11fc764baea4f410127510c80e8"},{url:"tag/atomic-css/index.html",revision:"f54da06a609f0d896736926dea335c45"},{url:"tag/backend/index.html",revision:"2997ef0abd75005724f9c333c53f3aa1"},{url:"tag/basic-knowledge/index.html",revision:"d30a418bff2915394fc25d563c0b9c0b"},{url:"tag/branch/index.html",revision:"e951ac4c2e7c48440e697c8f0ac51915"},{url:"tag/bt/index.html",revision:"2b1a5eabe776fe0637a1b3bb8c83a0ba"},{url:"tag/canvas/index.html",revision:"3f2f84324022a128b77c4d59cff96873"},{url:"tag/centos/index.html",revision:"0027e2dac09aceb399ed6b2d039184ba"},{url:"tag/chakra/index.html",revision:"7190465bae3e2fb52947f4d12ca750a0"},{url:"tag/cjs/index.html",revision:"405dbd1747ef9607e5cfd2a1e336175c"},{url:"tag/cli/index.html",revision:"68961ccf0506f787e9c5b542040ab7b7"},{url:"tag/cmd/index.html",revision:"141b374e5d40111992c4cf1e7db65e1c"},{url:"tag/cnpm/index.html",revision:"f6ba1d5678c523a366b42f4fc01f73d6"},{url:"tag/code-editor/index.html",revision:"399fad1eb16c50f2a1709068140df8f5"},{url:"tag/command-pattern/index.html",revision:"3bae9f47e10cc100d8c6991323600138"},{url:"tag/commit/index.html",revision:"475080803a9789c2aec6123e2f107ec2"},{url:"tag/computer-science/index.html",revision:"36585f8c880fe40c016c22e87009b558"},{url:"tag/css/index.html",revision:"b7593ce0d01ebc4d727ca200cc00ffa8"},{url:"tag/data-model/index.html",revision:"0192efc223abce6d4cdbfbb5a3344b91"},{url:"tag/debug/index.html",revision:"c0f2a67018b5ed4cd98b2c2dc5ef7f7e"},{url:"tag/design-pattern/index.html",revision:"c03eb1755906108e39a259b5b8271518"},{url:"tag/dnd-kit/index.html",revision:"8447c30e3511bf9a601350e2cb3de452"},{url:"tag/docker/index.html",revision:"6063d8a5c57d524a13a5b2e4872d50d4"},{url:"tag/effect-hooks/index.html",revision:"84113570518c17d2078a91b859a65e24"},{url:"tag/efficiency/index.html",revision:"a13c183efe3af7ef4a7f3b00817e0319"},{url:"tag/esm/index.html",revision:"c6bbbd58d4049fb9e87d4b2b442ef935"},{url:"tag/express/index.html",revision:"e0f52a63436b3a1007992cd56685a6f8"},{url:"tag/factory-pattern/index.html",revision:"f26df47416ea56b3b4607c1601da045f"},{url:"tag/flyweight-pattern/index.html",revision:"305afd649ea56a260e99528f4ae813a8"},{url:"tag/form/index.html",revision:"3e0afaf69216cd8559a79e96ee29e40b"},{url:"tag/frontend/index.html",revision:"b4898e63801a76ef301d3c250405e70e"},{url:"tag/git/index.html",revision:"4f2b70b98b1f4476ab8461777d01c7b3"},{url:"tag/github-auto-commit/index.html",revision:"1b39da02a70f33bc163ab077be4c969f"},{url:"tag/github/index.html",revision:"e35e693f453beb6b46a8fa13a6bf6bf5"},{url:"tag/grid/index.html",revision:"42228025336d14cafbb2d3577fe73a28"},{url:"tag/highcharts/index.html",revision:"36821b95ddf82981e2e1cbdb4ffbef4c"},{url:"tag/history/index.html",revision:"c9df216f77fd2ddadaf0bd1cd6cd02c9"},{url:"tag/hooks/index.html",revision:"97a58ef8cae6d878b2114418c05f41df"},{url:"tag/html/index.html",revision:"d956521e8dff0823aae87c373d582587"},{url:"tag/html5/index.html",revision:"82cb2847b3828c536b26126b8c72fe6a"},{url:"tag/http-code/index.html",revision:"b587a3245ed112bbefbedc69a9ac7733"},{url:"tag/http/index.html",revision:"174b944934b6e64c8831f25a4ba8c31d"},{url:"tag/https/index.html",revision:"c97d3098cab49c94e4450d9b0db3346a"},{url:"tag/index.html",revision:"6de5865f0f86518657ebdeeaa7466ee1"},{url:"tag/init-project/index.html",revision:"c6875ce8fbc20dccf0b69a3851a071b9"},{url:"tag/kitchen/index.html",revision:"9c1aca3d22b6e2c22f1c7e8992b65891"},{url:"tag/langchain/index.html",revision:"d3d17bf51c6a230a9eabe12d58ee14b2"},{url:"tag/language-advanced/index.html",revision:"a3253ea45b1a1a229994a4a69eb0e11d"},{url:"tag/language-basic/index.html",revision:"9a170fa4f840c909a56706ccdb260d2b"},{url:"tag/mediator-pattern/index.html",revision:"7d442c92680782c006dbbe88f6a9710a"},{url:"tag/middleware-pattern/index.html",revision:"f210478e65516002afb49130df3ce97e"},{url:"tag/module/index.html",revision:"7d657dfb258bf8aeef4618355b26cf51"},{url:"tag/mysql/index.html",revision:"67ffd1f7389b43d031492eb0288b4b1e"},{url:"tag/network/index.html",revision:"00a0cc3ed1a45a1a82a2c978af2ab8bd"},{url:"tag/new/index.html",revision:"11ac644494cfb80d25a1a4eabdaaf1aa"},{url:"tag/next.js/index.html",revision:"68e13485de43a7a3af03b5cc1f1816b9"},{url:"tag/node/index.html",revision:"42069603449012caffc58e1aef0c97ad"},{url:"tag/npm/index.html",revision:"f527ebdff5341674b4d4f59e0a3edd76"},{url:"tag/object/index.html",revision:"392d876e6913639acad8f6ca6a55ed3e"},{url:"tag/openai/index.html",revision:"120895296f0f4aad81c80aaf8c605edc"},{url:"tag/pages-router/index.html",revision:"0a298d830eeaeef8eb0b261a75f68c66"},{url:"tag/pnpm/index.html",revision:"4c9f4aaff18095341fc91ec1b6b712ab"},{url:"tag/postcss/index.html",revision:"0d8df8880182691ed3d5102142f7d201"},{url:"tag/pragmatic/index.html",revision:"9aca1e6123106b88d6398b404454bccb"},{url:"tag/react-core/index.html",revision:"55af43b6a695293583f96c5d966a35a8"},{url:"tag/react/index.html",revision:"313e2720a0ae3389a1f471b47974b4ed"},{url:"tag/rspack/index.html",revision:"96e6910d39944614b1269df33aa9f90f"},{url:"tag/rss/index.html",revision:"3c615b5fd1e3118f078202f702752d2e"},{url:"tag/selector/index.html",revision:"6ee1356946918726f700f7ebcc5ccb54"},{url:"tag/seo/index.html",revision:"a8eeff60ccf5ed2e2df14ff7d32e38f6"},{url:"tag/sql/index.html",revision:"18e1e93bd4896b60c5b745c395c90e95"},{url:"tag/ssg/index.html",revision:"3fa6efb60cfd456cfdcd431756582e0f"},{url:"tag/ssh/index.html",revision:"b343a3009b7d3caa4d3e5ba107f34e4f"},{url:"tag/ssr/index.html",revision:"5c53972ffbe3c1fc270fde7ad13208d4"},{url:"tag/state-hooks/index.html",revision:"9dbf7512ebb9768849b65c9068f6425e"},{url:"tag/styled-system/index.html",revision:"270fdc10565241b89e4eb36ec16ce2d5"},{url:"tag/svg/index.html",revision:"f95084de8e2c837f71bccdff911676fc"},{url:"tag/tcp/index.html",revision:"9deb979da59e0270c001db08a0ca20f0"},{url:"tag/tcpip-模型/index.html",revision:"7080bd7d8c1b5e68bb08175adfa255d4"},{url:"tag/this/index.html",revision:"eaec68f7129c758cedc9f4962112758c"},{url:"tag/trick/index.html",revision:"47fe52370f2f46fd6862a30e3af6a1fc"},{url:"tag/typescript/index.html",revision:"fdd573c2db9edf2caef456238e093622"},{url:"tag/udp/index.html",revision:"0ef7609bc3db13fc997c8e9fe9762ac9"},{url:"tag/v8-引擎/index.html",revision:"0bc7cfc47c5050a9a7b301a04397f2c1"},{url:"tag/vanilla/index.html",revision:"c1a38ac938018a22cf27077442fdc240"},{url:"tag/vite/index.html",revision:"6366849d8f493d49184a0ec60c0fa316"},{url:"tag/vscode/index.html",revision:"543dfbcd728bc0c2724f53bcda974b40"},{url:"tag/vuepress/index.html",revision:"f0f5282a1dda43efe07b255f6990edb2"},{url:"tag/vuex/index.html",revision:"a702c90fd78bc773799f310c585b62c8"},{url:"tag/web-worker/index.html",revision:"3ecd75198e74495a836178b88a028631"},{url:"tag/webpack/index.html",revision:"b618e22384c694d5a80a8e68a19fa671"},{url:"tag/yarn/index.html",revision:"6a3d790c07e3f39a6c2f4ecec53eec1c"},{url:"tag/yeoman/index.html",revision:"c387f8b30e386e571cfcedabb90308b5"},{url:"tag/zsh/index.html",revision:"447ec7c6f18f6c68ad765a066edb5cb4"},{url:"tag/事件循环/index.html",revision:"bad5acd6ea64ee7fd1ac62cf56211bd2"},{url:"tag/二分查找/index.html",revision:"9febf8271535b70c5a20802732eee86e"},{url:"tag/二叉搜索树/index.html",revision:"35e5015b66343140d8d7cbb952149112"},{url:"tag/二叉树/index.html",revision:"fa9e734bea97078e79d30be68f4a9bd6"},{url:"tag/代码规范/index.html",revision:"adbe4317d68833cfc5295ac09796827d"},{url:"tag/关系数据库模型/index.html",revision:"6bc829fcdb01454b6d3e717c87ab3750"},{url:"tag/兼容/index.html",revision:"767f13b2c04ff3ea7883968aff719821"},{url:"tag/函数/index.html",revision:"f6366be667056d1f726ed3c01cf09ee6"},{url:"tag/前端存储/index.html",revision:"58cf6d63eac9a05c405a40c9eaf3ae7d"},{url:"tag/动态规划/index.html",revision:"d6cb08441ca44d876ce94098e138280d"},{url:"tag/双指针/index.html",revision:"908d7a8e2344394fdcd07c57ee52b4d6"},{url:"tag/图片批注/index.html",revision:"bc3461c09148cb995674f8882ace3392"},{url:"tag/垃圾回收/index.html",revision:"555d6726a8389b9c550bc22e84b0d0c4"},{url:"tag/工程化/index.html",revision:"0b0e0a1957967f4a7b1a791a326cb257"},{url:"tag/布局/index.html",revision:"73a386051c56b0b669fcf6a15196e4ce"},{url:"tag/弹性盒/index.html",revision:"bca474cffe4975acf356d3d7f39cb179"},{url:"tag/御膳房/index.html",revision:"e56eacb452e8aa52eaa9216493cc0cbc"},{url:"tag/手写代码/index.html",revision:"98a826349738aef6c73de2b055f26859"},{url:"tag/拖拽排序/index.html",revision:"d79c8fe38a157ea21e45aeb3c748eaa0"},{url:"tag/数据库设计理论/index.html",revision:"37e4326eb4f1a1aa021662f45cf64b93"},{url:"tag/数据类型/index.html",revision:"e16fac69f2459c361d3152461bc7d5b2"},{url:"tag/数组/index.html",revision:"c97f4c13826ce9de76e5646f778c3215"},{url:"tag/文件上传/index.html",revision:"1c3698e91a4758be26582080c78427a4"},{url:"tag/模块化/index.html",revision:"730383ebbb22a337b2228bfafdc88b92"},{url:"tag/浅拷贝/index.html",revision:"748a8ed6a07b1ebdc5e4dc04725c2b2b"},{url:"tag/浏览器渲染/index.html",revision:"a01cf4770385eee04ad78d0dd080d9cc"},{url:"tag/浮动/index.html",revision:"d6abb2d9b54aa43ec9513c4f48d30ce6"},{url:"tag/深入组件/index.html",revision:"00054c869f10b44963fe28f22d2d18c8"},{url:"tag/深拷贝/index.html",revision:"6737031a6e440898ddea51ef4f94027c"},{url:"tag/源码阅读/index.html",revision:"9eda7445b9a983f6c5e41b43bb649f86"},{url:"tag/移动端适配/index.html",revision:"3d8bd7ab6b22a0a6b821f7906770dfa7"},{url:"tag/组件库/index.html",revision:"9a5ffa4ab8bbb580f2cb8836cc7181e2"},{url:"tag/组件通信/index.html",revision:"08a7e2bbc90c585e7babd35bfa527f8b"},{url:"tag/组合式-api/index.html",revision:"8250ae1e59c51a68a3f0415587d2a831"},{url:"tag/网络请求/index.html",revision:"5686ae20c13809b86a679b90c5ef9d17"},{url:"tag/链表/index.html",revision:"e1a8897d0540fbdf1d9bd981a9ac6a3c"},{url:"tag/面向对象/index.html",revision:"256bb94542b161c6ba9e4788f5e263db"},{url:"tag/项目/index.html",revision:"54808994002152a9780acb50dcbd6a01"},{url:"tag/项目打包/index.html",revision:"f62f7a60386b887167658536161617a5"},{url:"tag/项目部署/index.html",revision:"b3bd33d849649715def1f815ff2bd8a1"},{url:"timeline/index.html",revision:"25afb1354720802c919629bdfc1fa77e"},{url:"assets/event-loop-3S7ql_ag.png",revision:"73c49f2d9fbee1024bb5514bda223259"},{url:"assets/image/computer-science/networking/006/HTTP.png",revision:"696f03139b0a7cd58f61fbda9ca71569"},{url:"assets/image/computer-science/networking/006/https-flow.png",revision:"530732dac1410693cbdbcfeaf8616bcc"},{url:"assets/image/computer-science/networking/006/HTTPS.png",revision:"b7b94c88fd268426680a0c6ca45de5c6"},{url:"assets/image/computer-science/networking/006/mid-attack.png",revision:"f101a27ef11244840aeeca965614da8a"},{url:"assets/image/computer-science/networking/007/four.png",revision:"91ec936c98b288f6f03fec1feeb56bf9"},{url:"assets/image/computer-science/networking/007/three.png",revision:"3d375830b92323a4dab374dcb488ce95"},{url:"assets/image/computer-science/networking/010/DNS.png",revision:"5754e327ee776e651564ad67510a9f66"},{url:"assets/image/computer-science/networking/010/message.png",revision:"fdc1dde481eeae37518ec1a75e964463"},{url:"assets/image/computer-science/networking/010/parse-url.png",revision:"68e965d160d8a8728680356d5e5304e0"},{url:"assets/image/computer-science/networking/010/TCP-IP.png",revision:"eaabb9a2407bfcca4c2e4fb8834b52d6"},{url:"assets/image/frontend/basic/css/003/abnormal-box.png",revision:"f71a1ccfe4bdcff13ae3b08f24b0ddf9"},{url:"assets/image/frontend/basic/css/003/box.png",revision:"663746ae4c9c718590e09adb1fa72caf"},{url:"assets/image/frontend/basic/css/003/normal-box.png",revision:"d7567d94ca78a57d31bcc40a20c5cefd"},{url:"assets/image/frontend/basic/html/002/avatar.jpg",revision:"bcd2b5352170f5d515b1dd8d969bc872"},{url:"assets/image/frontend/tool/vite/001/bundle.png",revision:"9affcc8711ebfcd3d3cc7269c57ced52"},{url:"assets/image/frontend/tool/vite/001/esm-problem.png",revision:"836cb8a52a868faa0474ff52b04e28a0"},{url:"assets/image/frontend/tool/vite/001/esm-vite.png",revision:"cc374f5589cb7c50a73440e53cad1d41"},{url:"assets/image/frontend/tool/vite/001/vite.png",revision:"916a6df6ac5972e0594a1be4c5fff31c"},{url:"assets/image/frontend/tool/webpack/004/mode.png",revision:"c5b190fa1356dde8cf0f9c54cb9b759d"},{url:"assets/image/frontend/tool/webpack/004/source-map-1.png",revision:"9edcbdb60792b9cccef52ee3e4e7e197"},{url:"assets/image/frontend/tool/webpack/004/source-map-2.png",revision:"9087a9aa58eb580e0298f0cd4b59b5c2"},{url:"assets/provide-inject-m2qurnhp.png",revision:"f7110a1bae2d0744997012ca656d8fa1"},{url:"assets/scope-XtMnboSO.png",revision:"00cf6bd787014eb22b2821d72b80212a"},{url:"assets/scoped-slot-zLA5fzs5.png",revision:"c6ef14ba02eac288245c5c5009d966cc"},{url:"avatar.jpeg",revision:"c74016a1dc6691fefe6ad212f1034757"},{url:"hero.webp",revision:"73886f53045fdd0606a196548e42e9a0"}],{}),e.cleanupOutdatedCaches()})); +if(!self.define){let e,s={};const a=(a,i)=>(a=new URL(a+".js",i).href,s[a]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()})).then((()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e})));self.define=(i,r)=>{const d=e||("document"in self?document.currentScript.src:"")||location.href;if(s[d])return;let c={};const t=e=>a(e,d),n={module:{uri:d},exports:c,require:t};s[d]=Promise.all(i.map((e=>n[e]||t(e)))).then((e=>(r(...e),c)))}}define(["./workbox-dbb64b4e"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.clientsClaim(),e.precacheAndRoute([{url:"assets/0001、二叉树.html-dZHoE2lD.js",revision:"15fd474c3d0188a96cd33bb91bb487d5"},{url:"assets/0002、二叉搜索树.html-BRHkwM8L.js",revision:"2be42b3cef65c86bd2f759b59d13682e"},{url:"assets/0003、动态规划.html-U9YyrO12.js",revision:"ca86d230902e47e6fb2e9e7d7ef91303"},{url:"assets/0004、链表.html-DGNJio24.js",revision:"496946c245ac4a2d7f0010cf2472875a"},{url:"assets/0007、WebSocket.html-rjc6_IG0.js",revision:"54bf0b967f704406ca96cf9387203709"},{url:"assets/0008、WebStorage.html-5kGJ81lf.js",revision:"ea472f50f866de9325645e4c829eb873"},{url:"assets/001-character-encoding.html-E_VDWDGh.js",revision:"d4b468cd206317571bebcf9dbec86971"},{url:"assets/001-dnd-kit.html-jsyMYY9a.js",revision:"15de68d64b6aaeca8e6827284f2cad3c"},{url:"assets/001-finalhandler.html-s_PiC4wA.js",revision:"565ea6b8f25f1c28b5706ef694bc7e42"},{url:"assets/001-hello-database.html-Zgc4Q_aW.js",revision:"2e7f6a9fe29f7d0b14f51ff96b06b76b"},{url:"assets/001-hello-rspack.html-hPXOzEdL.js",revision:"3736f810cce11a7df18c20ce2ff93e9a"},{url:"assets/001-hello-vite.html-7wlT7B5t.js",revision:"a2cecf32aa0ee2b577c31ad4f5a99526"},{url:"assets/001-html-history.html-tURB45U7.js",revision:"29edf4b02b766925b696ad787c01da4c"},{url:"assets/001-init-project.html-9epaxP2F.js",revision:"b8daffe7c13abc0804a09026f48b631e"},{url:"assets/001-init-project.html-txRST9Rg.js",revision:"ba881fa2eb6a39a6abe53e9d1c66c65a"},{url:"assets/001-install-mysql.html-qc7jqvu9.js",revision:"7b88aa29bd8e367fa8f6508397848061"},{url:"assets/001-modularization.html-aVDXVF3p.js",revision:"74547084094359cf28f715ea1ba41703"},{url:"assets/001-module.html-S6GWBUID.js",revision:"f04b24811cbd5d235c1c2dc92103152b"},{url:"assets/001-network-model.html-AnQrVYyf.js",revision:"a762ba567a56ddd795b1b245415edd05"},{url:"assets/001-quick-start.html-reK2EBPD.js",revision:"b592888c895668f79a82d7f0f8a40a0f"},{url:"assets/001-set-the-ssh.html-_kRdhh4B.js",revision:"8a40054f5ae5d4a8cedef530b590548e"},{url:"assets/001-var-let-const.html-s47UVxV9.js",revision:"aec159ca1ef535312b5cae0800109685"},{url:"assets/001-webpack-basic.html-iANhhZl5.js",revision:"ee9a5fc97eddedb8d02810a42c9571fa"},{url:"assets/0010、WebWorker.html-z-ry9p5x.js",revision:"d8267a701712bb7bd95829c465101350"},{url:"assets/0011、判断对象值相等.html-Qe14ZYL2.js",revision:"e56d97491be7ff016fb83294060bdf15"},{url:"assets/0012、AJAX.html-KSX5mbJA.js",revision:"a26ef0ad13b448d35ed4c5a8b176f546"},{url:"assets/0014、浅拷贝与深拷贝.html-KNURvFJh.js",revision:"29fdd29e2514381a6b562d16674d4c7b"},{url:"assets/0017、事件循环.html-RxwjAYeR.js",revision:"fd45a9cf4bb99d582a38863de38910c2"},{url:"assets/002-annotation.html-jSTF0IVD.js",revision:"9b8197d5f35630d77f4df2e77d00cb11"},{url:"assets/002-build-git-server.html-k7ZuvaaM.js",revision:"7394ca89ec8b24b63d502007107b4cc4"},{url:"assets/002-HTTP-overview.html-yA9pf-8X.js",revision:"dab8d3a5d31e9d73853478edea7f9977"},{url:"assets/002-package-manager.html-8ga7lBMd.js",revision:"7500a1026a3bb5ca8713a66eaa92a0f2"},{url:"assets/002-quick-start.html-GzDTnx7H.js",revision:"55e60cf7be76908eea9135aeda216ec7"},{url:"assets/002-relation-model.html-eh9sdhEc.js",revision:"9ec4a83fdf0a05a6cce7780a3786249b"},{url:"assets/002-selector.html-Y8lG2Qy6.js",revision:"1355a11dc11beb4f2a564f71fdc68d77"},{url:"assets/002-types.html-X5moh2oe.js",revision:"0230c5fef5b43a35e55b18c801e7e44d"},{url:"assets/002-webpack-css.html-C0hFA9Ag.js",revision:"4719685633a9f488c311a88eed312833"},{url:"assets/003-box-model.html-FIoUn3l-.js",revision:"3973a7ee035aa9dacbd0b1e929f87408"},{url:"assets/003-configure-bt.html-3e4O9NhM.js",revision:"45214c50b54fed11ff1d0c3bbae5bdf5"},{url:"assets/003-db-design.html-Oji9hdtE.js",revision:"dd2b108e9b491419be977e365665fe2b"},{url:"assets/003-doctype.html-3ssLfMA4.js",revision:"051b61987492a4df5db481ceb8aa65a4"},{url:"assets/003-file-upload.html-PdEE_gdK.js",revision:"9fef03b61b897a248096119dc224eafd"},{url:"assets/003-get-post-difference.html-y7Gjbjjy.js",revision:"340a60b11131957a4d01d6c38bf29ceb"},{url:"assets/003-judge-type.html-0nLfDuM_.js",revision:"c9d766db05d4896f07d6298709841093"},{url:"assets/003-tool.html-DLnZqT_R.js",revision:"b4caa596ac9bc2e0d77175633131f7a1"},{url:"assets/003-webpack-assets.html-kB2bMhYm.js",revision:"fbd998fbdb2403d546c9d1183042e3bc"},{url:"assets/004-advanced-db-model.html-tGr-G7p6.js",revision:"2809dcda2e64d891c5ca0b435b91b5f7"},{url:"assets/004-automated-deployment.html-wjHFQrWt.js",revision:"a8601798fcacde289fb76fee4543c271"},{url:"assets/004-common-element.html-q8tUaFIS.js",revision:"a5a1c5f4ea423a9ea978c48ebcaa87b2"},{url:"assets/004-global-upload.html-2q23fxm8.js",revision:"d40b72b4c172ee55bd6752baee421d5f"},{url:"assets/004-HTTP-development.html-BBWBnLvD.js",revision:"bc74c5ecc3d61084f84dcef130b46428"},{url:"assets/004-primitive-value-reference-value.html-MLxMLvib.js",revision:"cf23be212efbcb40e2edec025c6413c5"},{url:"assets/004-project-standards.html-2vM9DZTK.js",revision:"1d25f1cfafed8cf88cef5523b1581cd5"},{url:"assets/004-text-font.html-ldUSeidH.js",revision:"bf7f10fdd146d7487c2615ee6cff46f1"},{url:"assets/004-webpack-plugin.html-n3ujVQXJ.js",revision:"fcd1efd357c1119bd4eab1e8051e5ffd"},{url:"assets/005-advanced-element.html-LXvnYZdN.js",revision:"05c595e892d61531617f78d5cb89c580"},{url:"assets/005-cascade-inheritance.html-5BhjxfCj.js",revision:"d1e459785544619919aff01e5dfcd9ce"},{url:"assets/005-execution-context.html-salfrApg.js",revision:"473d8a15e7af3fb9386e7a3026730ae8"},{url:"assets/005-HTTP-cache.html-KgXwqlEv.js",revision:"08a12b5fd37e525c56edd61a5cd222ff"},{url:"assets/005-install-docker.html-gBSt4qi-.js",revision:"33b1a317361c95cf92c90e272a22a71a"},{url:"assets/005-postcss-px-to-viewport.html-1cqOLJHS.js",revision:"51b4394e5cc416c4a2d53085118e2228"},{url:"assets/005-qwik.html-U4rDkWuK.js",revision:"623001398b0be0c1996d121511d82c5a"},{url:"assets/005-webpack-babel.html-Fqs9mfmk.js",revision:"af318ec879f9b806d1e6185d9b6080d8"},{url:"assets/005-yeoman.html-KxN9wacd.js",revision:"3f5990eb96a4d158dafd94a90684270b"},{url:"assets/006-animation-svg.html-8eIQ6Ihw.js",revision:"4b2bd8538d34509df0f2ad5837d4408d"},{url:"assets/006-background-border.html-RCrBWyb-.js",revision:"0d10eb97e7172d16cc1d70c0dd21337e"},{url:"assets/006-HTTPS-overview.html-SYoh5fQX.js",revision:"488a4e82b705e5197e74a77be5af250a"},{url:"assets/006-react-server-component.html-k-YETDuh.js",revision:"2fb8573d1bd477d56039011edc6aac8b"},{url:"assets/006-semantically-meaningful-tags.html-WThMFqDm.js",revision:"dab5edef130db684bbb31bc5ff1b42d8"},{url:"assets/006-toString-toLocalString-valueOf.html-cxsnu0DQ.js",revision:"26db9c971d92c96a557a243d7b9a286d"},{url:"assets/006-webpack-vue.html-1d_xRqtP.js",revision:"54c2c9235b8c97da70a4b53290cce08e"},{url:"assets/007-basic-reference-type.html-aceDmBbB.js",revision:"45461cab6b9d566b15279dbf26232c23"},{url:"assets/007-hydration-is-pure-overhead.html-RuYzXwld.js",revision:"089d8eea563b8cb171498edc5969ec80"},{url:"assets/007-media-tag.html-4B2dcBja.js",revision:"1350e545bb6e1e766fe13b04a624c26f"},{url:"assets/007-offline-export-in-highcharts.html-wjbjRKLu.js",revision:"df3a70bc82b62e987bae0af3cc30b4dc"},{url:"assets/007-position.html-bHWd8Nqh.js",revision:"40d53c37ab3ab2f2e55623dcfc82fcc1"},{url:"assets/007-TCP-three-handshakes-and-four-waves.html-dYxpKZ12.js",revision:"15d3079322fc6d144c542d04764ba18d"},{url:"assets/007-webpack-dev-server.html-t2yhyF-D.js",revision:"6a81b6292ed047bffd085d6afdc5e749"},{url:"assets/008-canvas-svg.html-J5y6viF5.js",revision:"71b34b52a9e23e068904dfffa5c1bc98"},{url:"assets/008-collection-reference-type.html-6hAWB_6B.js",revision:"6fe4c77b2f07e4158ff656fb94c51138"},{url:"assets/008-float.html-NWrPV4-8.js",revision:"dada435d103c91f11f3811bf7d7c0da8"},{url:"assets/008-tcp-udp.html-rUxlBxzI.js",revision:"5b4a635d9c04393d941e6a06df4f732c"},{url:"assets/008-webpack-resolve.html-WaOOPcO4.js",revision:"4ad014bae79638c70ed4ce80671d29a6"},{url:"assets/009-array-like-object.html-99xk2Ewf.js",revision:"2abc5de46c36c7cb1fed3cfb445f08cf"},{url:"assets/009-flex.html-UhyQHsgH.js",revision:"a050ff78eeb45f4c5fa76948326e22c7"},{url:"assets/009-http-code-when-authorized-refused.html-KimibnOR.js",revision:"a63a32fced52a55c352e5f845d187adc"},{url:"assets/009-src-vs-href.html-7SGMc5wm.js",revision:"0a9bbc1d6f8d46f1eaf5f367a31cb43d"},{url:"assets/009-webpack-env-split.html-2H2sFtOB.js",revision:"39fbe1b0d6bbe1dd58976ed4e8f55784"},{url:"assets/01-a-pragmatic-philosophy.html-2Asvolaw.js",revision:"93e1159ae6b8e334800cf829b5e408b0"},{url:"assets/01-array.html-qqj7snQD.js",revision:"52daacc55a2d7482eb94dc04ef926156"},{url:"assets/01-command-pattern.html-NToFxAAq.js",revision:"7bfa525f29bf2ce068c502bcc2b743b9"},{url:"assets/01-getting-started.html-WKDe7Qbs.js",revision:"1a750cf6de933001b5bc6035be7cae50"},{url:"assets/01-getting-started.html-y0dVi-KY.js",revision:"6c6a34b063e8cd5035a6402aba161857"},{url:"assets/01-how-browser-rendering-works.html-GwCLJ--h.js",revision:"3d3e8fd7637513201028046c24bca6be"},{url:"assets/01-init.html-zmrtRBND.js",revision:"aacc0acdace19f2de0b0d99530644c4d"},{url:"assets/01-maven.html-2dOiULAq.js",revision:"65b0f6569fb76a1bf13ff0b9c21df2d9"},{url:"assets/01-overview-architecture.html-2m6AorPJ.js",revision:"a77aa71d0746c2a574399fb718884ee0"},{url:"assets/01-pages-layouts.html-q0AcGxgI.js",revision:"550ed42472f5516b4bbd6661c057349d"},{url:"assets/01-quick-start.html-icBlNGVT.js",revision:"12b61785c4ba34cf3bdf6b2d8e72f712"},{url:"assets/01-quick-start.html-nSD4Idct.js",revision:"d8d6388deb57e37a38a6702bf5b05ecd"},{url:"assets/01-useState.html-TAgOQCTv.js",revision:"104dd0b48c9ef300014380b8ef4439da"},{url:"assets/01、父子组件通信.html-tJc86P4B.js",revision:"31c609da41465bd5c30f1205f85cc3b1"},{url:"assets/01.vuepress-plugin-ordered-header.html-q2B5p71G.js",revision:"1226c4a6fb522b8aa3afbcd7b11a5b3e"},{url:"assets/010-antd-textarea-placeholder-pre-line.html-FmF3dONc.js",revision:"d39f18785a189d0571118c26625df3d1"},{url:"assets/010-html5.html-IzmK_1on.js",revision:"20c31dceb9416a01bdcecc40f47f320f"},{url:"assets/010-object-property.html-CMstI5aK.js",revision:"3e4f0432fdfde0e0c970ffa9d662cf78"},{url:"assets/010-unit.html-fJENl0PI.js",revision:"0d01675fc6d384028ea87b4eb58c783d"},{url:"assets/011-center.html-QIgnh1uy.js",revision:"7ed58780fe0adfa14d718485099b2e82"},{url:"assets/011-create-object.html-i2ltl5i0.js",revision:"aabbadb0c005f4dd8200a0e8a4dc0e5a"},{url:"assets/011-defer-vs-async.html-BCGYD0Av.js",revision:"2bb400b37eca818e8149a07cb1f071e5"},{url:"assets/012-extends.html-0PMdv4Ro.js",revision:"3f6a2c455442cddd685bce07fdd83f67"},{url:"assets/012-form-validation.html-Z8hIzVSe.js",revision:"9b8d2eb76fdc9e2bd3dcc347e78c2eb6"},{url:"assets/012-grid.html-VQlEaWjN.js",revision:"a6a10f3ac777aad58764e8116e3a1e46"},{url:"assets/013-BFC.html-aFsmxXJq.js",revision:"0a669c286e00709e7f045cfe42e312e3"},{url:"assets/013-class.html-KYMn2F8Y.js",revision:"8f02673ba6d76e2aa3c9dfdade3a1788"},{url:"assets/013-seo.html-oy2Hbj6G.js",revision:"4522cc466faf7f7c763600efa756fde5"},{url:"assets/014-implement-new.html-42YlTdDK.js",revision:"a296d90b5a04073cdadc90f123a8a7a6"},{url:"assets/014-responsive-design-intro.html-7YdohJT-.js",revision:"d94bc21f2666d8c6f0c2e9f7a761bfda"},{url:"assets/015-auto-change-node.html-vmI9x_qg.js",revision:"21d1e054d2a94cd88d6578be4d4ca875"},{url:"assets/015-function.html-0dV-rtlJ.js",revision:"2f69460b809f1bc08f484c0654dd6b72"},{url:"assets/015-responsive-design.html-zWMQ9SbQ.js",revision:"02cee5c9f11ff221b0aaa592a2c33b88"},{url:"assets/016-how-to-responsive.html-3LyDgIXl.js",revision:"4af778dc09857c963ef2eb3f0a8ca62a"},{url:"assets/016-rest-client-error.html-JHYKZQb6.js",revision:"67aa2a2da993911bad2be73aaee1a205"},{url:"assets/016-this.html-V0F_Y6Ry.js",revision:"8def429b57e5ffa370b5cefe5fb92cd7"},{url:"assets/017-implement-call-apply-bind.html-inN8CfCD.js",revision:"200eddae57f909654dc6b7b4dd3868db"},{url:"assets/017-loading-spinner.html-RGOKwDDs.js",revision:"7d2a6f6031625227666f1dd7208f39bc"},{url:"assets/017-whistle-debug-real-phone.html-8fLPP_oc.js",revision:"b58ca2b37f9f77fb0180ac4ca53d70ad"},{url:"assets/018-autofill.html-k6Z5PbWM.js",revision:"1b4d1e44ad977987ef46feae7fca3011"},{url:"assets/018-monaco-editor-react.html-sSKOAfLt.js",revision:"fcca21b1352d2b68d9fd961ac336ff7a"},{url:"assets/019-ios-prevent-touch.html-sCERLB9h.js",revision:"bb70d7f47cf57ef83642c0cc46a6a89d"},{url:"assets/02-a-pragmatic-approach.html-JGy5n7BJ.js",revision:"135af9934e04ac8ca288ad8d2d9ee4b3"},{url:"assets/02-architecture-overview.html-6076uJDz.js",revision:"bcdfe9f114d2ae0260c7256e61d6d1fe"},{url:"assets/02-express.js.html-wRqB8YUW.js",revision:"b531c36b837d322e509cc109a24ac858"},{url:"assets/02-factory-pattern.html-Zwdb5ir_.js",revision:"9308382dd77d8d8700c370d3ddf7e033"},{url:"assets/02-git-basics.html-c-hemJSp.js",revision:"95c22c2148f77ca845840c1195a3f6b7"},{url:"assets/02-server.html-sju2MrZY.js",revision:"4b197090e425458346d3c80ef11e1a03"},{url:"assets/02-style-props.html-oN7Hm48h.js",revision:"4dc420762bcb2d07cac040672fd08ee7"},{url:"assets/02-useEffect.html-7KsZvcwk.js",revision:"d5577c4e658ee34473d61023cfdd614d"},{url:"assets/02-V8.html-abcG9r2W.js",revision:"9acf31af99b41167b373306f7e04be9b"},{url:"assets/02、provide-inject.html--gqiviyZ.js",revision:"908b8645423636715fffadf87e4e2ef0"},{url:"assets/02、Vuex 原理.html-hxEjAjw7.js",revision:"bdf6446b6d80cca5357e717e1887b951"},{url:"assets/020-ios-img.html-qmiwZBqQ.js",revision:"29907a66cf1b5a72f272509ca9afe5e6"},{url:"assets/03-basic-tool.html-g3IuINfV.js",revision:"ac1eb31d09b4cb1122627831d5cee57a"},{url:"assets/03-database.html-GzHjF5vt.js",revision:"7adc24aac7d45212a023fa1a62f57ff3"},{url:"assets/03-flyweight-pattern.html-IIVmQYZ2.js",revision:"0407f6acb81ead18ccc9bd26bd1f0be4"},{url:"assets/03-git-branch.html-CPKiQy0r.js",revision:"5a8e364fe408aa8901573a6ae7e8a8bd"},{url:"assets/03-memory-management.html-zNWUMiQc.js",revision:"83ad91f13a4dfd727bafd63ab5cf1dde"},{url:"assets/03-render-loop.html-dW4TkDPY.js",revision:"03684218bbc4eab5bdcbf4eeea5a9cb1"},{url:"assets/03、插槽.html-VPX4UrNy.js",revision:"6b03e5dc7f77ab605927b44d9f341d28"},{url:"assets/04-api.html-L9kwFNyo.js",revision:"072cc820ddd65252f585d9b13f6791f3"},{url:"assets/04-cross-domain.html-hLz1ACuK.js",revision:"584559adfa70cdeabf5a8305e52626b5"},{url:"assets/04-git-server.html-VbjfIz48.js",revision:"b753c47b466b3bd34231c39b855d6c9c"},{url:"assets/04-mediator-pattern.html-Wk0Fs-dK.js",revision:"27c430ddc35b3470beb799ae272130d7"},{url:"assets/04-pragmatic-paranoid.html-JLwUFQv7.js",revision:"4b7dcb9ba3564619d376d0ccc7e0a6c4"},{url:"assets/04-scene-graph.html-QBvEcXGS.js",revision:"0893b511dd37b61653964def3096791d"},{url:"assets/04、动态组件和异步组件.html-KRYxl05T.js",revision:"253bb7a01fd324ba1a5a631d2b42254c"},{url:"assets/05-middleware-pattern.html-hSMzJDay.js",revision:"aa028c2432be8e15144d9692b7b1e9f1"},{url:"assets/05-what-happens-after-entering-the-URL.html-OWWRueDp.js",revision:"94d3fe5d05df6e040bdb4d0917530583"},{url:"assets/05-work-around.html-kkeNGkzw.js",revision:"42349da8ef0a4ff6387d754580cfa0d3"},{url:"assets/05、组件的v-model.html-oSrQEt5s.js",revision:"3977788fd1315fc056ae8a1d3c91a334"},{url:"assets/06-change-commit.html-yJsOvgbD.js",revision:"cebbcb0c3aa25a9cdcc9ebe81a535529"},{url:"assets/06-concurrent.html-4XZcy3em.js",revision:"691ae04a80968fce23fcceddf7763146"},{url:"assets/06-mixin-pattern.html-xPNxrrXT.js",revision:"68dd6462bd62f6ddd998054f28b53128"},{url:"assets/06、Mixin.html-vFrCtzEG.js",revision:"8cad0f4fc2917f857138f4dae073f02c"},{url:"assets/07-module-pattern.html-PPpx4-1O.js",revision:"850f41526392497683c198ea6ddfa259"},{url:"assets/07-when-coding.html-mMkE9Kb1.js",revision:"6633ef448fa640a8022c77c45e889da7"},{url:"assets/07、组合式API基础.html-sWkWMy6L.js",revision:"e824c2708bb5ac24250aa67b5cdb5884"},{url:"assets/08-before-start-project.html-qoPrQxFC.js",revision:"cf0395c8e42b15fa56daf2ced3254c93"},{url:"assets/08、组合式函数.html-gNvTRZCR.js",revision:"36f699fb7eeea7c02dc9875c4547caa6"},{url:"assets/09-pragmatic-project.html-w1zorxVJ.js",revision:"8886d67d3206df67690fd1ca8ce8ed96"},{url:"assets/09、指令.html-KKqSJCFB.js",revision:"bcfd64426ad665fae796f68c279d4c64"},{url:"assets/10、插件.html-_zTLOduh.js",revision:"56607337757b5a56efbf0d8e21827098"},{url:"assets/2023.html-gXOG2LdF.js",revision:"a857c218b9b1a070486022d25871d91e"},{url:"assets/2024.html-Fl5-sZEu.js",revision:"f8b676c30c3074b426bb8a4bd1e8c0e2"},{url:"assets/404.html-ey9YfrM5.js",revision:"5c082273ed7ab675140e83e43c17b73e"},{url:"assets/app-I81jsmus.js",revision:"5e26f8dfafa18b4d74b75779ea2cc745"},{url:"assets/arc-jj2rQ79R.js",revision:"7b37d111019a7b2af71571863326e1cf"},{url:"assets/array-Nw74a44z.js",revision:"17dcebeaf673b09a1ca5da014d20022f"},{url:"assets/auto-XYC5A0Ix.js",revision:"786b1aef9a90923f3aa3bab127b99c2c"},{url:"assets/blockDiagram-6b2b5046-dPjrH4Tz.js",revision:"2ff75ca5acbccab5e9b39cbef1e8214e"},{url:"assets/c4Diagram-b947cdbb-6LlQD8gP.js",revision:"126cce0063cffe59b20c7e540801085d"},{url:"assets/channel-_BoElw_v.js",revision:"737f53d7605ed0e406ba1aff429f11c9"},{url:"assets/classDiagram-35230388-WCO95pQ7.js",revision:"a46e92e896c916cb594f8b8c2896a285"},{url:"assets/classDiagram-v2-412acd34-jptX3zzM.js",revision:"9b64d51d7a37bbaa4944dd126ff61536"},{url:"assets/clone-RIIBrVN3.js",revision:"202e076452cdda99aee7f7cb18ff1f62"},{url:"assets/codemirror-editor-j7-Ov7Pm.js",revision:"69a59e3831ca11b11bee7d12b22a83d7"},{url:"assets/createText-423428c9-DMNkaBZH.js",revision:"9e2c37ab0921cfd7e02cd8b778bf61cd"},{url:"assets/docsearch-w40geAFS.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/edges-d417c7a0-dMLW4fNk.js",revision:"66b331fa67cfda169c275e36defe1190"},{url:"assets/erDiagram-0ea73325-HOSw3jCf.js",revision:"1251b2faf1cdf77b85ff24220bb16e8f"},{url:"assets/flowchart-elk-definition-27cc417a-E40wJWYz.js",revision:"1f2188648bcdadcdac01afc827e4d712"},{url:"assets/flowchart-tiWkQJPF.js",revision:"22ae562fadded7c906d7297d1f7c64f0"},{url:"assets/flowDb-d35e309a-JunLwFy6.js",revision:"17717bfb3c31fae8e9ece027a2d44e62"},{url:"assets/flowDiagram-d949d7c1-Km3bw0Wv.js",revision:"363d5d4d91a1d6d0c165a555d52617ee"},{url:"assets/flowDiagram-v2-49332944-CeopBWYD.js",revision:"7313e08bb3c1594ee8436a5e66a735b1"},{url:"assets/ganttDiagram-5c869e3b-PaDnyKb9.js",revision:"2e56986769c797ec41a59bbe6b51df93"},{url:"assets/giscus-hHrgKA30.js",revision:"dae7c2db562e417dc4bde3be5134780b"},{url:"assets/gitGraphDiagram-b9d81de9-ii4rvYx6.js",revision:"7a4c5bfb528ad69a6fc0f662a4934213"},{url:"assets/graph-kdm1lDeG.js",revision:"e2ad0d2e03ca77a6814d0b0bc817b869"},{url:"assets/highlight.esm-qL7kkCul.js",revision:"62b5f024c0d2737c1370675313dc2efe"},{url:"assets/index-7IwC0DkA.js",revision:"a0a6a74537488342822dc33151252ce7"},{url:"assets/index-7SG8bi1h.js",revision:"46a193641571106d3b7b43f9bc2a2735"},{url:"assets/index-8fae9850-AldU4d2Z.js",revision:"56600cad49fd64afa5990a0271461800"},{url:"assets/index-QOy62Fup.js",revision:"fa112b5cda5ee3c969c504c6a3080b4c"},{url:"assets/index.html-_Ef4-0Of.js",revision:"2b4c650cb4f90b18bb81d86c4adad1ee"},{url:"assets/index.html-_ln2i5-P.js",revision:"6cfe74afa55a66ce4a8875f2b0e09206"},{url:"assets/index.html--6exqmtK.js",revision:"1714ef29d02482b2751385578f1be739"},{url:"assets/index.html--6TZOf5z.js",revision:"6edd728413da302bb5747b046f51bbd7"},{url:"assets/index.html--F5t8OTY.js",revision:"47c8845b9db2d9c1a8feb33e24a2690f"},{url:"assets/index.html--JPoGlT0.js",revision:"57e8648f80f5e53091ce07c2e580da99"},{url:"assets/index.html--L5HZE0X.js",revision:"bee5b0300c2b77a753be72e81b095b65"},{url:"assets/index.html--VlRPmKi.js",revision:"2b74585a33de59e43ec760be43be7b2b"},{url:"assets/index.html-0C__MQ28.js",revision:"611c977e9212549cbfd5b13aeedb8101"},{url:"assets/index.html-0CdTPh7N.js",revision:"4434ec82515d351e1bbae5f1dcbd0f62"},{url:"assets/index.html-0eyk_dry.js",revision:"eb49827f1ff684d2d3b4b20aa59dfaeb"},{url:"assets/index.html-0KCmLuwB.js",revision:"fa1533f96ed015401f5ade4b690c9470"},{url:"assets/index.html-0uRcbDSq.js",revision:"3a766354d850456ef16ca9410129f22a"},{url:"assets/index.html-0wnONOpX.js",revision:"9671d7f458bf338fc52cc56ab4d2ace3"},{url:"assets/index.html-14MHn-Up.js",revision:"5a9730395369df0993aac518f6110517"},{url:"assets/index.html-1Nr8bhuM.js",revision:"4eb421d6cc98fac7ab6c8bd3925896d3"},{url:"assets/index.html-23cYN8fI.js",revision:"75d75a644bce3266aa4d396290094c99"},{url:"assets/index.html-31ErRzhC.js",revision:"76114b75e9e5eb355436e6d6b8300699"},{url:"assets/index.html-3ghGFG8O.js",revision:"c702ce7755e346efed13a2dc6ea1cac4"},{url:"assets/index.html-3nJHAvil.js",revision:"6772d7e9eb87be3b326c70f62645a7bc"},{url:"assets/index.html-4Iq9ezl_.js",revision:"4567897c25e6ac30badcd3769b2c9ce7"},{url:"assets/index.html-4UU_vsFD.js",revision:"cf844ed0e8a0d59f81dd03e74dd0e415"},{url:"assets/index.html-4vDv9sc6.js",revision:"6540030d911acf2caa4fcc04e0f5ff50"},{url:"assets/index.html-5bSC_2vH.js",revision:"f505d370d6edb860fb63b70e39209375"},{url:"assets/index.html-5TDjfNLf.js",revision:"c10ffb4953200be9f3d2f9f85453e8df"},{url:"assets/index.html-66s9zgMZ.js",revision:"e64f2f2a408fa528c8066d0251a662c1"},{url:"assets/index.html-67kf_GGd.js",revision:"ce5865a6698b59d94f3514f868cb375e"},{url:"assets/index.html-6cowqeov.js",revision:"63cf43b002692652d295128253768b4d"},{url:"assets/index.html-6qpwIxqQ.js",revision:"b4de524f776c5592996358ed6ac87089"},{url:"assets/index.html-6wkUhdzd.js",revision:"8ad16d15d25d2458165117d71ba82719"},{url:"assets/index.html-7b-Yq8WZ.js",revision:"e8d2e82e9c11204370274e378ad6a5e2"},{url:"assets/index.html-7EzYSmUS.js",revision:"fa7a53bdc024ec31cd5a2663add96119"},{url:"assets/index.html-7hjLHxps.js",revision:"26c82b86c1ce38ada70526774daa81bf"},{url:"assets/index.html-8AvS5k6X.js",revision:"b83152d8b3746a02952539e298b56fea"},{url:"assets/index.html-8FWG5OXL.js",revision:"7cff5078bf75f356ecdf917c7f99ce64"},{url:"assets/index.html-90UyKJBw.js",revision:"57a6a4f7dff7fd135594d9dfa519f1fb"},{url:"assets/index.html-91G785uA.js",revision:"1938721b9cb3100985201fe864f415d1"},{url:"assets/index.html-93LI1O8A.js",revision:"5abc08ab122e21b4db15a780fba4e1b5"},{url:"assets/index.html-9E0mn_M3.js",revision:"a4f5c09eb541281b935386f7a1244c23"},{url:"assets/index.html-9mtT_v42.js",revision:"84c9bbd1e3a6064231abe1fecd3eb7f9"},{url:"assets/index.html-9R3u1krZ.js",revision:"ce14e7c7983182b2163ff06aa9e1c647"},{url:"assets/index.html-a_wSv45V.js",revision:"2827968ef139c80eab16ec912a5534c4"},{url:"assets/index.html-AcDDHBjs.js",revision:"062d088766d3c271efee1569b01abed3"},{url:"assets/index.html-AcHcpmyL.js",revision:"555e8780aa83ad9c522e2f7e7b641ed2"},{url:"assets/index.html-aesCbmQA.js",revision:"fbd469b532b3f4a600e0ced07912d266"},{url:"assets/index.html-B0zestXk.js",revision:"e3616405abb41dc903c6eedf54d79bad"},{url:"assets/index.html-B2x9k5tu.js",revision:"dfe1c8bf351ef5c6ca1986d955fd741a"},{url:"assets/index.html-bbwK6XkQ.js",revision:"1b36f33f918b80d45e50f696df689903"},{url:"assets/index.html-BhnJj992.js",revision:"d39fe2ec84f1d651792b78c71a190f2b"},{url:"assets/index.html-BLkmkmA_.js",revision:"5f0b2b9766a5d8e9bc27ee5715dd2a3d"},{url:"assets/index.html-BLPlXPB1.js",revision:"8042bd529e25017dbcec3d37b68ac6e1"},{url:"assets/index.html-BNOp3Mse.js",revision:"33456f30aeeb4443f1569b9538e1c0b6"},{url:"assets/index.html-Bs3oO7C_.js",revision:"a934b0f7c2a7ccad9565980d666b6876"},{url:"assets/index.html-bt7UO1xo.js",revision:"aba4c140f383c231529746b680dbc25b"},{url:"assets/index.html-bxCqco6-.js",revision:"b30a759cb45372610d05097816626985"},{url:"assets/index.html-C360RI7I.js",revision:"54773414e3833e50de2f96397583e2fb"},{url:"assets/index.html-CHWD6_iY.js",revision:"9dcc42806db50631be5799e64b735ce7"},{url:"assets/index.html-ctq9zSHa.js",revision:"2a69566ba82c8557b3f037494747d3af"},{url:"assets/index.html-cwVFNAda.js",revision:"4708bbc3aff06c7dd7a9efdbbf894f91"},{url:"assets/index.html-czHpBbp1.js",revision:"4bcd376c522a5d19334be6fec919db13"},{url:"assets/index.html-D6T1DCMH.js",revision:"4c408270403a1c8acfd073739639031b"},{url:"assets/index.html-dIPTRAjj.js",revision:"366a719103128fa8546ea034bdbbc3ec"},{url:"assets/index.html-DVi4lX_-.js",revision:"1a77f336888af45d06a779ab16acf0d0"},{url:"assets/index.html-E-kz0qY7.js",revision:"64568b46f5ff09b328274e398c7f1c43"},{url:"assets/index.html-E1HdBVl_.js",revision:"eeba3ef52dbb8709853f28c575a22149"},{url:"assets/index.html-eDM5dFS5.js",revision:"5b809a779dff019f59df626947e280f2"},{url:"assets/index.html-eLzDRIQF.js",revision:"f5690f8e29dae868de0e227ca7232b27"},{url:"assets/index.html-EQdXoVXB.js",revision:"cd4cf5ecccbebfb4d3ebd578dd8dbe13"},{url:"assets/index.html-ERfJaqW-.js",revision:"493ddf30ed433768c81df0dadf298783"},{url:"assets/index.html-ev38ZdxY.js",revision:"34aedfba469185c1088030d8742f7eaf"},{url:"assets/index.html-exQTTyLY.js",revision:"b554bfff2d3d3a591e273a37a17e3019"},{url:"assets/index.html-F5HnQcet.js",revision:"904ae9b339dec61bfec59e5c01ce5753"},{url:"assets/index.html-F8Nld46U.js",revision:"4a23ec486dbd18bf2b6bc1c0aeaa2eaa"},{url:"assets/index.html-FFZ3YKGZ.js",revision:"bc54333cddc2e9c877aea997c9a9853a"},{url:"assets/index.html-fjIZXpuo.js",revision:"08bdec790174744585f4e8e40688f3b1"},{url:"assets/index.html-fjQs7H5E.js",revision:"b8bef29aa8b1ec2c3c911a2519b83f3e"},{url:"assets/index.html-FnjjrZVb.js",revision:"e19d4178ddab709f7bf424836821e6c7"},{url:"assets/index.html-fnL6KmMG.js",revision:"b3596000602e90e211739177813f7ab7"},{url:"assets/index.html-FoB7MnFp.js",revision:"8118beedd0b2bdda615b9e9f956cef9c"},{url:"assets/index.html-g-lURbYW.js",revision:"ed02e5fd34234b1c78e3eb7902d5d32b"},{url:"assets/index.html-g-SNk94n.js",revision:"3619a3ebe7952515407564bdcac25089"},{url:"assets/index.html-G24g2E_r.js",revision:"0a64e4be41c4a46eb816741c9dd5e92d"},{url:"assets/index.html-g7IFZ7G_.js",revision:"51e8d92c669319c56772c67b7f626cb5"},{url:"assets/index.html-gBD8K-X8.js",revision:"ed52f159da382faa78d1612b22472812"},{url:"assets/index.html-gBdMXoqL.js",revision:"52a4ee2c1cf97916a1e2df14c94f36ed"},{url:"assets/index.html-GFPyrhoV.js",revision:"1681802d459ce722832d14136f237074"},{url:"assets/index.html-GGbbhDjJ.js",revision:"bf207bdf8fc88ced39c7afee502de70b"},{url:"assets/index.html-GYlVtT_i.js",revision:"7fe827969160cc163b0b69b88bbab706"},{url:"assets/index.html-H1AzmvhU.js",revision:"68d670ff36b8f53e1369009e7bc358e6"},{url:"assets/index.html-h32hkhC5.js",revision:"eb3d29316834ce9173a27172fe65d955"},{url:"assets/index.html-hE-Har5l.js",revision:"5407b06e86a09bc85e1e12489bfbe3bd"},{url:"assets/index.html-HOTiQ-yL.js",revision:"da85cb2c002510c5964b109d4f9c8b38"},{url:"assets/index.html-Hr6EYV6k.js",revision:"8f71d2908e7d349d07fe6f90c69ac4a7"},{url:"assets/index.html-hsh4fjDy.js",revision:"1076730e3265fdeef659d68c23124464"},{url:"assets/index.html-HZQfa0vK.js",revision:"25e8ea37a7e4e0250ab82710efad0330"},{url:"assets/index.html-I-71DhOf.js",revision:"34b3a40f5a5d0cea5162f665150b52b6"},{url:"assets/index.html-i-MMHlcp.js",revision:"4f215cce4fc099b11ccae5a878e29da3"},{url:"assets/index.html-i1mgSfOT.js",revision:"832850c95079bca09e781ec090a3fcff"},{url:"assets/index.html-ibC1JRbc.js",revision:"e098b708eb535b3780513a64a1eab726"},{url:"assets/index.html-idRdJbqu.js",revision:"37df97f41c7dd737c13a930caabbe080"},{url:"assets/index.html-Ilj8DScN.js",revision:"31e70c835c716d95d42ae136110f3c79"},{url:"assets/index.html-Io97aBuh.js",revision:"f1ca5af0f6a131fdde280e9f4e57c173"},{url:"assets/index.html-Ith43-eG.js",revision:"78d4a999ae87afc994d3dabdddca7826"},{url:"assets/index.html-iuNHJ9u0.js",revision:"8b48bf074eaafd1b6a2b97e2097bdff9"},{url:"assets/index.html-J6YBbtvY.js",revision:"4ca6444a7823fb5e77578cd813f64bda"},{url:"assets/index.html-J8BMHg89.js",revision:"437038b67ba1ffd05d2f9781bb9859ea"},{url:"assets/index.html-jA6pdA_t.js",revision:"e1046548bf915ad64ddcf3ab4aca6b31"},{url:"assets/index.html-jbhoO6oS.js",revision:"e81c73033b1b2e1db0d19700143d4c12"},{url:"assets/index.html-JF4gDM7D.js",revision:"b17f3a3bebf3a33775e4a76a0e19dfe6"},{url:"assets/index.html-JhGcsNxJ.js",revision:"638f5ad8ebe91fc9e21524fe935549ed"},{url:"assets/index.html-JHMCqP3K.js",revision:"00de7da58876f0fb27e2a7130b004d71"},{url:"assets/index.html-JnfKE5ye.js",revision:"86903374ff6643b8a88e99e3579c287a"},{url:"assets/index.html-JpugBYVz.js",revision:"33b9138cb546871cbf90ab3bdebe23a7"},{url:"assets/index.html-JsjX07PL.js",revision:"908e8434590fb0f9ff4df8da841dc1ee"},{url:"assets/index.html-jV03Xo7p.js",revision:"f56b79628330e4c4f34e7a8263641127"},{url:"assets/index.html-JX1VErOL.js",revision:"52849e51f2033a7b942dd93707d90c3c"},{url:"assets/index.html-KAO7TBkB.js",revision:"9e862ad474df9fd5a33e3ef473f7e7cc"},{url:"assets/index.html-kB5LT_k5.js",revision:"4d2efc80318ebf66e098d2f93dc6708e"},{url:"assets/index.html-KmYW_B6k.js",revision:"891c63c01c774473b8bdbd145308937d"},{url:"assets/index.html-KRoADKjE.js",revision:"9ff8c43ede51b314b795236e1621f4c5"},{url:"assets/index.html-L7Ue2F8C.js",revision:"aa6ded1b9d1254242fa72dbbe34b9692"},{url:"assets/index.html-Lt33W2fu.js",revision:"d64b37d88a85f4e84fc434108f62474a"},{url:"assets/index.html-lXCBBac6.js",revision:"04ddd5f8583a5e75f14df9fac83a4fd3"},{url:"assets/index.html-MDmNSIgf.js",revision:"bea5c860a13acfe04728ca19b0d0f9f1"},{url:"assets/index.html-MGvi-vgA.js",revision:"9564452b90f426904afcacac5f8dbea4"},{url:"assets/index.html-mNqFLZ6A.js",revision:"49c850864d7183b14f6c7cff51e79b88"},{url:"assets/index.html-MQIB_QpV.js",revision:"cf206eb683ed33d5e9152d0ded85f9a4"},{url:"assets/index.html-MUvLrlGW.js",revision:"c3cc1bfbb017af07fa01cc2792a03bf5"},{url:"assets/index.html-myvTt2O1.js",revision:"db33b5c47368c42442cca537b128418a"},{url:"assets/index.html-n-TQD5DG.js",revision:"e93607b860dd3a38b576724a5a1b7bc7"},{url:"assets/index.html-nbHjCI4E.js",revision:"4b2db1154c481e360596346e882b64ac"},{url:"assets/index.html-nBzh5_NL.js",revision:"2be5701a880ff8734f082911ef7cefa1"},{url:"assets/index.html-ndkFXjKu.js",revision:"36e07b6a936a463d18130babb7aef779"},{url:"assets/index.html-NJpwtthw.js",revision:"7095b67a374b235b661556f1623b7ac6"},{url:"assets/index.html-NleAmsCg.js",revision:"ba9563bdc8be385f00b014b25bce4d0a"},{url:"assets/index.html-nNjnaUOx.js",revision:"07c792d853742fc02edd250f685244a5"},{url:"assets/index.html-NtP5QAzU.js",revision:"74086b55e3e52cfe49325760f8a05763"},{url:"assets/index.html-NW49SvAU.js",revision:"13348097a80db95300b7c5e1ba22cef0"},{url:"assets/index.html-Nxu2qgD8.js",revision:"b969c622b4e48a9387cd1a0dd4b75c5b"},{url:"assets/index.html-oB5J5RJE.js",revision:"60ad3f22e44c14d22ca4431778562f21"},{url:"assets/index.html-OfXkBPs5.js",revision:"9a47c59bcc2bf62b918ca2ea79021a6d"},{url:"assets/index.html-ogpErsaM.js",revision:"68d19d791872fc4e7f6a145e726e0a2d"},{url:"assets/index.html-OOfR2c4H.js",revision:"4d00fe8bdc80b65a45294353955ee56f"},{url:"assets/index.html-oss9_NPr.js",revision:"76233b7f118adc1a34b4b79f22e15cf4"},{url:"assets/index.html-Otbm08-E.js",revision:"b9f99ab04c5482a8c6acf984be8662a7"},{url:"assets/index.html-oTNaI8Zq.js",revision:"eca010a78df6d7ce701c2397641ca569"},{url:"assets/index.html-poaCb2xU.js",revision:"efe109d7a43375a9164f826e963e940c"},{url:"assets/index.html-PSD82k6J.js",revision:"16569791d26d5c749ed9eda5f93e1d95"},{url:"assets/index.html-pvf-HGge.js",revision:"dd5e6d91bc04b429794a06f5bc8f6746"},{url:"assets/index.html-pW4WP2Sh.js",revision:"8216ae0a5038e64be55d5fbb4a15a539"},{url:"assets/index.html-pzCTWktT.js",revision:"8f3b396e9a884361b9bd7754f0cdabc1"},{url:"assets/index.html-q0Xqqilw.js",revision:"b841c6551f90afd100fa6f44439443c3"},{url:"assets/index.html-qcRlqlnK.js",revision:"5fe9b113589a7bb73bdaba7739971309"},{url:"assets/index.html-qHDzCwT5.js",revision:"ffa0358faf941e8aaffaeb5ae09b81aa"},{url:"assets/index.html-qjj58GcY.js",revision:"23759c6943702bb1eb5d943e4389c07d"},{url:"assets/index.html-qmnTnY6r.js",revision:"21f6ba270d07d80d0f2792086a4816f0"},{url:"assets/index.html-QrgOJdpu.js",revision:"45d16359b6e7d1c9d95006f0bd9c2056"},{url:"assets/index.html-QW4gd68q.js",revision:"17f856a6007300352c6c5d030467140d"},{url:"assets/index.html-qWcyy2kZ.js",revision:"70666b09312eab4269a9ceac68816db9"},{url:"assets/index.html-qyCDq7xX.js",revision:"c20ce2a7852d61f5b5228096028b6bbc"},{url:"assets/index.html-QYtx_6GE.js",revision:"87104e89e83506a6deed1d0f9f9a50e9"},{url:"assets/index.html-rD4AKpx1.js",revision:"9b805e4ed0b37769df1164258162ce01"},{url:"assets/index.html-rDZW1GmE.js",revision:"8ce127817f31de162d7b53e40ffc8e1d"},{url:"assets/index.html-reC06NIi.js",revision:"5f84aa92cd4b3f9978724edbd3c949e4"},{url:"assets/index.html-rFvRzY47.js",revision:"c838ac9466760273a105307bca9bf1a8"},{url:"assets/index.html-rkgsTpEx.js",revision:"ee5d5cf14a4783895c4269c533fda921"},{url:"assets/index.html-RQO6tcOD.js",revision:"19dca206e3f4b0d510272e0a58fa853a"},{url:"assets/index.html-RsY9uX7U.js",revision:"4f7f928b32fab790096da3c55fd3946c"},{url:"assets/index.html-S3OdPlRp.js",revision:"04f450c75dbc27ba55edbdae80481069"},{url:"assets/index.html-STrbfrZI.js",revision:"39b906c33e0698cee3c5a2a232d8c93f"},{url:"assets/index.html-sUYrfL3B.js",revision:"fbd123cd65c16f7007b88f0845e5c13d"},{url:"assets/index.html-sWh3vQXB.js",revision:"f29fb6a7a20a983bb15e3d86265ebc77"},{url:"assets/index.html-t_vO7joq.js",revision:"d2e5b29ea477660d4f0cb5624793c0e5"},{url:"assets/index.html-tnhdXudS.js",revision:"f722db43349bb27fa85a29a2bf6d7948"},{url:"assets/index.html-tRPz2-E6.js",revision:"0278bbff813c368526b8f0c29ca4685c"},{url:"assets/index.html-tS5cu49v.js",revision:"9cef53268dab96e8c5ed4f38277e1c31"},{url:"assets/index.html-U4OrLyv3.js",revision:"733e59087150aaef0534a7751ae78b99"},{url:"assets/index.html-U9VUqS42.js",revision:"d680b84d04502cd9fe0f9fe337c84556"},{url:"assets/index.html-uBMV0KJZ.js",revision:"83150c45d6f6ada206e0210865692dbf"},{url:"assets/index.html-Ud0Zos-f.js",revision:"3d1616a1e4e70f9d7efecede898632d0"},{url:"assets/index.html-ullx7Kuy.js",revision:"c3338d3d736f4c4ec930c05b2af6356c"},{url:"assets/index.html-UO9hy6Wg.js",revision:"ac1b218018cb3aa470b8f2a3f3dd5b87"},{url:"assets/index.html-Uu7Eupg5.js",revision:"6d6cab17bb29c67240629d693af0a310"},{url:"assets/index.html-uvGUJw4d.js",revision:"28292e1d90f36f9276d879a6609e7682"},{url:"assets/index.html-v-DWFIuk.js",revision:"f993e8d24961b04ef2e00965387561be"},{url:"assets/index.html-v0Tcuabu.js",revision:"b33bc8caa38bfd207a3c04202b94d3da"},{url:"assets/index.html-vFZDFVW3.js",revision:"85d9d0d7865a028c35f13cc7a7d1c952"},{url:"assets/index.html-Vht3PBEQ.js",revision:"c8caad4e2927c8b35cd0934633333341"},{url:"assets/index.html-VpRKBb5o.js",revision:"c08bbb775293774069f936a4d57847ae"},{url:"assets/index.html-vT57E_ru.js",revision:"bbb723343009b50e845de5d50fa70f03"},{url:"assets/index.html-VUoUY136.js",revision:"a3504e2a1e5f9f35b8a089dee580efa9"},{url:"assets/index.html-vx0DB81j.js",revision:"a846ac8283b8628632b9ef16172041d1"},{url:"assets/index.html-w8VQYI8z.js",revision:"060c082a295d548a1bba4b3c772c69ee"},{url:"assets/index.html-WASu2T95.js",revision:"f6545a425fea9f396b32429833204857"},{url:"assets/index.html-wg-1Cxci.js",revision:"eeefd5d8332e17293440acd604ebf134"},{url:"assets/index.html-wuly5niv.js",revision:"dcb6b5f85e650d5a83cca4cbd82d252c"},{url:"assets/index.html-X_CyS4d0.js",revision:"f5e8c8eb6833bd488a52295aa78ba0de"},{url:"assets/index.html-x1gEaREp.js",revision:"818f9ae20c482431fc2abfb713b852f1"},{url:"assets/index.html-X2Gi4GIY.js",revision:"a7d63c745f9cb39088ee26405f3f4248"},{url:"assets/index.html-xbfU6A5W.js",revision:"3a8ce9b521793714592ab2672f54a7f8"},{url:"assets/index.html-xeADokS7.js",revision:"8b7567abe8ea3572625ccd591edbd7a4"},{url:"assets/index.html-XMSDWYao.js",revision:"db94e223922c329dd98fa6edb748b63b"},{url:"assets/index.html-xSha5ig2.js",revision:"55723833a7002f3f5e951978a35ba030"},{url:"assets/index.html-XzAVJ3CG.js",revision:"39b66eee10db665c2e920f9cec4e46d0"},{url:"assets/index.html-Y_H1tKQ_.js",revision:"058fd07ce45289cee30ebd41aaef9891"},{url:"assets/index.html-y5Coax85.js",revision:"bd433ad3a795af125fccecad8aba991f"},{url:"assets/index.html-yh9aPgpr.js",revision:"9364fb2087cde94bb655feb3d7a42a53"},{url:"assets/index.html-yHhtUDPD.js",revision:"4b244662201635dfc9b9cfba61b17e82"},{url:"assets/index.html-YLj9MQpu.js",revision:"a6a0212d32bbb5b692d27a018feaa2ac"},{url:"assets/index.html-Ym9lCym2.js",revision:"641a8b2a7065a4cc5219f4cc68d76ef3"},{url:"assets/index.html-ySkr2bj2.js",revision:"0706d40589c87a3bc0bcc04b45d25c11"},{url:"assets/index.html-yT7SX3kb.js",revision:"47338b1dc183d13564a692effa284a11"},{url:"assets/index.html-yt9Xge56.js",revision:"0aeea883d2d034b43710a98f87d07698"},{url:"assets/index.html-yvodhWZV.js",revision:"16b718be914feecd1e6cb2221eddf105"},{url:"assets/index.html-ZauJualt.js",revision:"f70b32af4e52aec6ca50d19e4eb52fb3"},{url:"assets/index.html-zqRWhf8b.js",revision:"aefbf49b71dc7f45b3d4526a520e9e61"},{url:"assets/index.html-zQWoWdBH.js",revision:"35f88de195cff26de89b3417f05514ab"},{url:"assets/index.html-zuhL_Xmm.js",revision:"11404a66d1662d63c293a4ea3b55e9a4"},{url:"assets/infoDiagram-db7b18fc-3Dvf5x-f.js",revision:"ac8484d211ad4919e41fa46231eed6d4"},{url:"assets/init-Hi12RPRh.js",revision:"3ce28180466443e9b617d7b96e9f7b8f"},{url:"assets/intro.html-aVWLN24f.js",revision:"4b5f0416c2bbffb512baf065f3f1b71c"},{url:"assets/journeyDiagram-d5636530-oIxwWC6o.js",revision:"85b977657e8c601667f091d45ceeb672"},{url:"assets/KaTeX_AMS-Regular-0YIAJWTb.ttf",revision:"56573229753fad48910bda2ea1a6dd54"},{url:"assets/KaTeX_AMS-Regular-UIXRTGNW.woff2",revision:"66c678209ce93b6e2b583f02ce41529e"},{url:"assets/KaTeX_AMS-Regular-zJvWDgGp.woff",revision:"10824af77e9961cfd548c8a458f10851"},{url:"assets/KaTeX_Caligraphic-Bold-6vyEfazt.woff2",revision:"a9e9b0953b078cd40f5e19ef4face6fc"},{url:"assets/KaTeX_Caligraphic-Bold-AE18XbF9.ttf",revision:"497bf407c4c609c6cf1f1ad38f437f7f"},{url:"assets/KaTeX_Caligraphic-Bold-RIlxi71x.woff",revision:"de2ba279933d60f7819ff61f71c17bed"},{url:"assets/KaTeX_Caligraphic-Regular-4uo0fsfh.woff2",revision:"08d95d99bf4a2b2dc7a876653857f154"},{url:"assets/KaTeX_Caligraphic-Regular-k0QPq0y-.woff",revision:"a25140fbe6692bffe71a2ab861572eb3"},{url:"assets/KaTeX_Caligraphic-Regular-MF_e1AYw.ttf",revision:"e6fb499fc8f9925eea3138cccba17fff"},{url:"assets/KaTeX_Fraktur-Bold-bAz-dThZ.woff",revision:"40934fc076960bb989d590db044fef62"},{url:"assets/KaTeX_Fraktur-Bold-i-oP291Y.woff2",revision:"796f3797cdf36fcaea18c3070a608378"},{url:"assets/KaTeX_Fraktur-Bold-XZxETTVq.ttf",revision:"b9d7c4497cab3702487214651ab03744"},{url:"assets/KaTeX_Fraktur-Regular-8XXOHEfX.woff",revision:"e435cda5784e21b26ab2d03fbcb56a99"},{url:"assets/KaTeX_Fraktur-Regular-gf8Lq3rE.ttf",revision:"97a699d83318e9334a0deaea6ae5eda2"},{url:"assets/KaTeX_Fraktur-Regular-k2IhepQP.woff2",revision:"f9e6a99f4a543b7d6cad1efb6cf1e4b1"},{url:"assets/KaTeX_Main-Bold-CZtwCMuf.woff",revision:"4cdba6465ab9fac5d3833c6cdba7a8c3"},{url:"assets/KaTeX_Main-Bold-MGqDlVzd.ttf",revision:"8e431f7ece346b6282dae3d9d0e7a970"},{url:"assets/KaTeX_Main-Bold-sffOiHVw.woff2",revision:"a9382e25bcf75d856718fcef54d7acdb"},{url:"assets/KaTeX_Main-BoldItalic-88TzJhul.ttf",revision:"52fb39b0434c463d5df32419608ab08a"},{url:"assets/KaTeX_Main-BoldItalic-8QydwDku.woff2",revision:"d873734390c716d6e18ff3f71ac6eb8b"},{url:"assets/KaTeX_Main-BoldItalic-EqUi0SPe.woff",revision:"5f875f986a9bce1264e8c42417b56f74"},{url:"assets/KaTeX_Main-Italic-DVgO3ulm.woff2",revision:"652970624cde999882102fa2b6a8871f"},{url:"assets/KaTeX_Main-Italic-N1npxqDf.ttf",revision:"39349e0a2b366f38e2672b45aded2030"},{url:"assets/KaTeX_Main-Italic-TCzgZvdR.woff",revision:"8ffd28f6390231548ead99d7835887fa"},{url:"assets/KaTeX_Main-Regular-6_eCWgYQ.woff",revision:"f1cdb692ee31c10b37262caffced5271"},{url:"assets/KaTeX_Main-Regular-dtjb4qKe.woff2",revision:"f8a7f19f45060f7a177314855b8c7aa3"},{url:"assets/KaTeX_Main-Regular-MqWbzbVV.ttf",revision:"818582dae57e6fac46202cfd844afabb"},{url:"assets/KaTeX_Math-BoldItalic-d10o37uD.ttf",revision:"6589c4f1f587f73f0ad0af8ae35ccb53"},{url:"assets/KaTeX_Math-BoldItalic-ImPtsMme.woff",revision:"48155e43d9a284b54753e50e4ba586dc"},{url:"assets/KaTeX_Math-BoldItalic-mZ7zbAmZ.woff2",revision:"1320454d951ec809a7dbccb4f23fccf0"},{url:"assets/KaTeX_Math-Italic-H5Tq_9FA.ttf",revision:"fe5ed5875d95b18c98546cb4f47304ff"},{url:"assets/KaTeX_Math-Italic-LedwBEzP.woff2",revision:"d8b7a801bd87b324efcbae7394119c24"},{url:"assets/KaTeX_Math-Italic-wNP_z16f.woff",revision:"ed7aea12d765f9e2d0f9bc7fa2be626c"},{url:"assets/KaTeX_SansSerif-Bold-2yISjogg.woff",revision:"0e897d27f063facef504667290e408bd"},{url:"assets/KaTeX_SansSerif-Bold-9bFEtBg9.woff2",revision:"ad546b4719bcf690a3604944b90b7e42"},{url:"assets/KaTeX_SansSerif-Bold-hTHqZ76u.ttf",revision:"f2ac73121357210d91e5c3eaa42f72ea"},{url:"assets/KaTeX_SansSerif-Italic-Azdo-3Wm.woff",revision:"ef725de572b71381dccf53918e300744"},{url:"assets/KaTeX_SansSerif-Italic-GGIydc0p.ttf",revision:"f60b4a34842bb524b562df092917a542"},{url:"assets/KaTeX_SansSerif-Italic-tx9FahgZ.woff2",revision:"e934cbc86e2d59ceaf04102c43dc0b50"},{url:"assets/KaTeX_SansSerif-Regular-kun6lKiW.woff",revision:"5f8637ee731482c44a37789723f5e499"},{url:"assets/KaTeX_SansSerif-Regular-TaO4USHJ.ttf",revision:"3243452ee6817acd761c9757aef93c29"},{url:"assets/KaTeX_SansSerif-Regular-wwQp5Se8.woff2",revision:"1ac3ed6ebe34e473519ca1da86f7a384"},{url:"assets/KaTeX_Script-Regular--ckFYqpa.woff",revision:"a82fa2a7e18b8c7a1a9f6069844ebfb9"},{url:"assets/KaTeX_Script-Regular-98CFnxev.woff2",revision:"1b3161eb8cc67462d6e8c2fb96c68507"},{url:"assets/KaTeX_Script-Regular-uSZBlqPg.ttf",revision:"a189c37d73ffce63464635dc12cbbc96"},{url:"assets/KaTeX_Size1-Regular-27J7nvyK.ttf",revision:"0d8d9204004bdf126342605f7bbdffe6"},{url:"assets/KaTeX_Size1-Regular-Jgg_JgPA.woff2",revision:"82ef26dc680ba60d884e051c73d9a42d"},{url:"assets/KaTeX_Size1-Regular-tfebZ-uE.woff",revision:"4788ba5b6247e336f734b742fe9900d5"},{url:"assets/KaTeX_Size2-Regular-8uHcfdJu.woff2",revision:"95a1da914c20455a07b7c9e2dcf2836d"},{url:"assets/KaTeX_Size2-Regular-e4ClFoQr.ttf",revision:"1fdda0e59ed35495ebac28badf210574"},{url:"assets/KaTeX_Size2-Regular-KA9bXP1N.woff",revision:"b0628bfd27c979a09f702a2277979888"},{url:"assets/KaTeX_Size3-Regular-4KV7NJM_.ttf",revision:"963af864cbb10611ba33267ba7953777"},{url:"assets/KaTeX_Size3-Regular-k6uTKqBB.woff",revision:"4de844d4552e941f6b9c38837a8d487b"},{url:"assets/KaTeX_Size4-Regular-1hQb9ONy.ttf",revision:"27a23ee69999affa55491c7dab8e53bf"},{url:"assets/KaTeX_Size4-Regular-5eZcWcVX.woff2",revision:"61522cd3d9043622e235ab57762754f2"},{url:"assets/KaTeX_Size4-Regular-RfuIJGSk.woff",revision:"3045a61f722bc4b198450ce69b3e3824"},{url:"assets/KaTeX_Typewriter-Regular-9yG-_x36.ttf",revision:"6bf4287568e1d3004b54d5d60f9f08f9"},{url:"assets/KaTeX_Typewriter-Regular-juq-IZ9c.woff2",revision:"b8b8393d2e65fcebda5fa99fa3264f41"},{url:"assets/KaTeX_Typewriter-Regular-tMUvZjwd.woff",revision:"0e0460587676d22eae09accd6dcfebc6"},{url:"assets/layout-c9rdiZ4H.js",revision:"560808b9be91edc6abaa4b9c333d1a89"},{url:"assets/league-gothic-h3edOfrm.eot",revision:"9900a4643cc63c5d8f969d2196f72572"},{url:"assets/league-gothic-oOjv4w16.ttf",revision:"91295fa87df918411b49b7531da5d558"},{url:"assets/league-gothic-wxYXAA-7.woff",revision:"cd382dc8a9d6317864b5810a320effc5"},{url:"assets/line-mT-6NujG.js",revision:"083a58dcaf5e8cc0881e225fdf2352e1"},{url:"assets/linear-HkO0wGww.js",revision:"606833bcc6e2a12d8fd9dbd5c78d3868"},{url:"assets/markdown.esm-ldiezHYe.js",revision:"dfebc8121864151002204ef714f81472"},{url:"assets/math.esm--eqzfLue.js",revision:"c5f77dc064ac53005c0e5446bb6715b0"},{url:"assets/mermaid.core-RdWnh729.js",revision:"32100348e037d5fa6c6da1c64d33beb3"},{url:"assets/mindmap-definition-377f8f1f-fZozfFch.js",revision:"278f72a5570060abd8a93fe9e64f6f60"},{url:"assets/notes.esm--_TQ5Wr4.js",revision:"12d7e35985a640e2ff8300c7cedb5983"},{url:"assets/ordinal-wXG5obU4.js",revision:"a72e57060c4f6a7606baa78dc6e9ad02"},{url:"assets/path-aUcfwwLI.js",revision:"f86c0243cb45746453c6b4f7dbd9f34d"},{url:"assets/photoswipe.esm-08_zHRDQ.js",revision:"481d5342d9bb799640b63b15b698dcd4"},{url:"assets/pieDiagram-b0208e96-klsHLmfx.js",revision:"bc4e323a6ad6a0d58da02d0f1a300957"},{url:"assets/quadrantDiagram-0332be45-GeUBZ95u.js",revision:"ef268e799a9840c15b4b35bf3632cb92"},{url:"assets/requirementDiagram-bf7890df-giSaRfV5.js",revision:"7bfd33d530a9183815c2684d10998de8"},{url:"assets/reveal.esm-QxxCNeuR.js",revision:"0b31bd04921a05d8df6da2d9faca8c70"},{url:"assets/sankeyDiagram-0acdec17-moTHnuw0.js",revision:"2c15b00f4cdbbfb98b6a06922c1e431b"},{url:"assets/search.esm-I_xTZtXh.js",revision:"d39092c5e0d9959995df72297767dc3f"},{url:"assets/sequenceDiagram-c18d009d-n-wJomEG.js",revision:"63b5629e40e0f582f502814ee7d8bb29"},{url:"assets/slides.html-54Ht2Ryt.js",revision:"5da1ca8d51b2a49fa2d28fce8937d743"},{url:"assets/source-sans-pro-italic-kXLDr8ko.ttf",revision:"8256cfd7e4017a7690814879409212cd"},{url:"assets/source-sans-pro-italic-r_ZvIQue.woff",revision:"e74f0128884561828ce8c9cf5c284ab8"},{url:"assets/source-sans-pro-italic-URCxwoo9.eot",revision:"72217712eb8d28872e7069322f3fda23"},{url:"assets/source-sans-pro-regular-1WEW6-y9.ttf",revision:"2da39ecf9246383937da11b44b7bd9b4"},{url:"assets/source-sans-pro-regular-7ugzKlOX.woff",revision:"e7acc589bb558fe58936a853f570193c"},{url:"assets/source-sans-pro-regular-vMQH-Lno.eot",revision:"1d71438462d532b62b05cdd7e6d7197d"},{url:"assets/source-sans-pro-semibold-8K4hAz36.woff",revision:"1cb8e94f1185f1131a0c895165998f2b"},{url:"assets/source-sans-pro-semibold-CdFA3Jgq.ttf",revision:"f3565095e6c9158140444970f5a2c5ed"},{url:"assets/source-sans-pro-semibold-yZBXeD4J.eot",revision:"0f3da1edf1b5c6a94a6ad948a7664451"},{url:"assets/source-sans-pro-semibolditalic-0pB0ab1n.woff",revision:"6b058fc2634b01d837c3432316c3141f"},{url:"assets/source-sans-pro-semibolditalic-R0KDpyfN.ttf",revision:"c7e698a4d0956f4a939f42a05685bbf5"},{url:"assets/source-sans-pro-semibolditalic-wk7IoV6c.eot",revision:"58153ac7194e141d1e73ea88c6b63861"},{url:"assets/stateDiagram-43596fc0-A4zK6RbX.js",revision:"26814fc9783f28fdb3aeebb689b65438"},{url:"assets/stateDiagram-v2-2ead4f9c-GfOOeFYL.js",revision:"e160b2d098bb9b295f2d9a90bd2b8d38"},{url:"assets/style-0ILgEizb.css",revision:"49819ef9f8c3444f5c699133a2b3ed0c"},{url:"assets/style-w40geAFS.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/styles-6860f46c-_a1nXaH0.js",revision:"8812da6596b74e6efbbc4e3795e375f9"},{url:"assets/styles-7383a064-Mrp4_RJz.js",revision:"e53ab4dddcc5a3d8b580773403dc7781"},{url:"assets/styles-b2c874b6-n89kVm5z.js",revision:"508a86c2a478c30bc3a63846a9a21db3"},{url:"assets/svgDrawCommon-0ee1b4e9-c7S2S_St.js",revision:"84ee0b178a4908b91619ae93b8845ed1"},{url:"assets/Tableau10-Fgclqpgn.js",revision:"f2197f44250cada74e1e663d3abfba3e"},{url:"assets/timeline-definition-d977decf-e99VZsQT.js",revision:"20a78a40b867fc6686bfc3766e8a4c06"},{url:"assets/utils-obz1_5fQ-XOQqDqQW.js",revision:"5adeaa99226a6e92519556c9acd3f636"},{url:"assets/vue-repl-nQ-EEHLy.js",revision:"21143df46f555c5e78c0939b8260103a"},{url:"assets/xychartDiagram-e50adddc-sdb6I-2e.js",revision:"241b5ca3484328b84fde005f10252a41"},{url:"assets/zoom.esm-w3VbP3hY.js",revision:"e6e8f9a61302e3ca14aa4dbeec242607"},{url:"404.html",revision:"0daa76db6105f894e05d6aad44f324d0"},{url:"article/index.html",revision:"c9799679a34a9afc3e8eefc38a4e3f03"},{url:"backend/database/basic/001-hello-database.html",revision:"e3bacbcfcda4106bb2278e72cc3ed7fa"},{url:"backend/database/basic/002-relation-model.html",revision:"0aa4b6c4d0486fab8040e99fd7d6da6f"},{url:"backend/database/basic/003-db-design.html",revision:"2ef7ec4ea3cd719d17759ea8dc798331"},{url:"backend/database/basic/004-advanced-db-model.html",revision:"61c15029ad0cfebaee0a589d24397610"},{url:"backend/database/basic/index.html",revision:"1cee46e6818543c4ace1b12aa596c31c"},{url:"backend/database/index.html",revision:"271f38db8059ab10313c78ca0c9ee4d6"},{url:"backend/database/mysql/001-install-mysql.html",revision:"47b8a5d95e4ef0777252f702cfe71b51"},{url:"backend/database/mysql/index.html",revision:"4e4abd476b56307364f173e28dcbc738"},{url:"backend/database/sql/01-quick-start.html",revision:"2fdef911f4f32b27db223dec963e41f3"},{url:"backend/database/sql/index.html",revision:"b990457bb02a2af9c54822a56e3b914b"},{url:"backend/index.html",revision:"0c8e0829b5032b80df97d0a5bf3990ed"},{url:"backend/java/index.html",revision:"409c5331120b7c46127f244c6724c1cf"},{url:"backend/java/tool/01-maven.html",revision:"f2fff73b152802529e2493715b7ca51a"},{url:"backend/java/tool/index.html",revision:"8e3c90f332eeaf3b07a24a188bf58b23"},{url:"backend/linux/index.html",revision:"e9deeb36990a5d8a55a0d8f83bdd2d57"},{url:"backend/linux/practice/001-set-the-ssh.html",revision:"734f270a9366a8dba0d06a62f57b3f69"},{url:"backend/linux/practice/002-build-git-server.html",revision:"865c03f868ccd141606a3f099b6b210a"},{url:"backend/linux/practice/003-configure-bt.html",revision:"c57f12daad71b08211ac5f5b4a25773c"},{url:"backend/linux/practice/004-automated-deployment.html",revision:"60eb4c2364c1644e00645d84618ca8db"},{url:"backend/linux/practice/005-install-docker.html",revision:"c2ab82c72d8bb536e95b176771531b3f"},{url:"backend/linux/practice/index.html",revision:"4cdb6272ccc663fd53dc1a0adf73fa46"},{url:"backend/node/express/01-overview-architecture.html",revision:"48ffea9c9572b5acb7a89fbcab5a8f0f"},{url:"backend/node/express/02-express.js.html",revision:"e1149d28277943a2aee7f6d704d11d3f"},{url:"backend/node/express/index.html",revision:"e0efd11beab930f1e1cd911d85d475ac"},{url:"backend/node/index.html",revision:"7ec437e43c5bf2c97ad8cddc3573cd9b"},{url:"backend/node/module/001-finalhandler.html",revision:"a6c9ba2ffb984b9f070c340199835b36"},{url:"backend/node/module/index.html",revision:"83bf682b88f94c546b4bfd350c4363e4"},{url:"category/algorithm/index.html",revision:"dc67a73d3a53612bc0a0d5cd6700d74f"},{url:"category/browser/index.html",revision:"9eb5598efb5d5b8ac1debc6376e5e38f"},{url:"category/chakra/index.html",revision:"c7df3bd7ff2d6bb9aa2b6443792647ad"},{url:"category/css/index.html",revision:"d6bd29cb8ec437c3df05448dbe7c957c"},{url:"category/database/index.html",revision:"a844a3270e713d60bf97f9ed72449efe"},{url:"category/html/index.html",revision:"5a5793bdad56e85d8af06ec853c2285f"},{url:"category/index.html",revision:"1910c6e84f3ab536289597319cad3532"},{url:"category/javascript/index.html",revision:"e9e033fcda3e637bba6177653ff04007"},{url:"category/leetcode/index.html",revision:"7cd6ae1273f6043d1928b988321a3d3c"},{url:"category/linux/index.html",revision:"0c3a90a5b4dc5e17d53e6a9fcfd65c3a"},{url:"category/next/index.html",revision:"4036c2eaa0f15d0dadd6d674daf03248"},{url:"category/node/index.html",revision:"bb516441b5c86addfba9d7c309ce5733"},{url:"category/operating-system/index.html",revision:"15703386054db6a75ed31d7bcb175864"},{url:"category/pixi/index.html",revision:"7a86c6fda599f56d714f355fd5fa70d8"},{url:"category/practice/index.html",revision:"20b4be9c2a8f72e87301779678cdec0c"},{url:"category/project/index.html",revision:"ea44232625e68e0efb1e6ca8d4d21295"},{url:"category/react/index.html",revision:"62740e6786b1cb79df1e33a4b1da1c82"},{url:"category/reading/index.html",revision:"e6f34e063ceaa7274ede8d658bfd2b9b"},{url:"category/vue/index.html",revision:"9e5108c505acd09c9500835850a3df49"},{url:"category/工程化/index.html",revision:"62acbd8da3b5024db29f5fe2d4b401f7"},{url:"category/计算机网络/index.html",revision:"3d71d6328f95cbc318ec38450342d332"},{url:"computer-science/algorithm/0001、二叉树.html",revision:"ad692c103f9494c80def010fea899ed6"},{url:"computer-science/algorithm/0002、二叉搜索树.html",revision:"fa5dbe9b843612e839e53c77b11d520c"},{url:"computer-science/algorithm/0003、动态规划.html",revision:"854c664abbf490ed13cfd337017e6f71"},{url:"computer-science/algorithm/0004、链表.html",revision:"c933d6bff17aafdea57090ef824181b7"},{url:"computer-science/algorithm/01-array.html",revision:"1f9c4b070913ea22105e5d5f51674750"},{url:"computer-science/algorithm/index.html",revision:"8ca9c3bf62e46c3229adf7d50ec3dc82"},{url:"computer-science/index.html",revision:"1ce9cf132703e288970dbbf2b50d9efe"},{url:"computer-science/networking/001-network-model.html",revision:"b16ce7c18e4b242d19fe98c61cb5cfb8"},{url:"computer-science/networking/002-HTTP-overview.html",revision:"f316665f73f5c2b4f8d39ead8639b547"},{url:"computer-science/networking/003-get-post-difference.html",revision:"721be907f7de28dae5e33e4fdc6fb02e"},{url:"computer-science/networking/004-HTTP-development.html",revision:"d5139b346391f5dcf6ffcae48e4290ba"},{url:"computer-science/networking/005-HTTP-cache.html",revision:"175ce472710e885147cfaf09a5224d1d"},{url:"computer-science/networking/006-HTTPS-overview.html",revision:"8fcc98b059fc741289bab10fa3558e7b"},{url:"computer-science/networking/007-TCP-three-handshakes-and-four-waves.html",revision:"39d9da8c844edb0a8bd898328dd172f1"},{url:"computer-science/networking/008-tcp-udp.html",revision:"4480a15462b4ea5f7eb679adb3670e4c"},{url:"computer-science/networking/009-http-code-when-authorized-refused.html",revision:"6f31504aafb9f2ec5b58aa895735f264"},{url:"computer-science/networking/index.html",revision:"8a85f4c4871b6b3ce02a34bc05aa9f7d"},{url:"computer-science/operating-system/001-character-encoding.html",revision:"d4efb9179ff66caef3cfaf240ce63fae"},{url:"computer-science/operating-system/index.html",revision:"b97b333806d0d0e67834110a4af15d49"},{url:"frontend/basic/css/001-quick-start.html",revision:"db66051704d06e60683256e4fdbd6c63"},{url:"frontend/basic/css/002-selector.html",revision:"1cd189d9c14ac192f4a05942837948ed"},{url:"frontend/basic/css/003-box-model.html",revision:"16511571d0c217cbb5093bc0c204d66a"},{url:"frontend/basic/css/004-text-font.html",revision:"33f077f9826a2de54fa3a3ed431753db"},{url:"frontend/basic/css/005-cascade-inheritance.html",revision:"c64e4f555722a8565334269649c56bd5"},{url:"frontend/basic/css/006-background-border.html",revision:"8be46cc6a46543c2af0a7ec08378bc9a"},{url:"frontend/basic/css/007-position.html",revision:"0adadba5c43bbe3e166fe59f4f9527d6"},{url:"frontend/basic/css/008-float.html",revision:"a6123ffc97d9334ea437c77e73df214a"},{url:"frontend/basic/css/009-flex.html",revision:"24b801c89e9d11f467cc846a65cb92d7"},{url:"frontend/basic/css/010-unit.html",revision:"1601952c54e42e13674c005ac5b73541"},{url:"frontend/basic/css/011-center.html",revision:"8f63df0bb33e63a3e5767d68f296b7d9"},{url:"frontend/basic/css/012-grid.html",revision:"f67b2022dae483ed326d78b9fb6d6ed5"},{url:"frontend/basic/css/013-BFC.html",revision:"15bd74c4fd0ccdfec531e723e30fd544"},{url:"frontend/basic/css/014-responsive-design-intro.html",revision:"00ca541a52b026357777bd3401501e36"},{url:"frontend/basic/css/015-responsive-design.html",revision:"59003bce5d0d7d7f15c47d18c3c6e4c9"},{url:"frontend/basic/css/016-how-to-responsive.html",revision:"c56ef33e7c4c092dc3768200eae2b329"},{url:"frontend/basic/css/017-loading-spinner.html",revision:"9dc5dbfc3b98f6989064c2d4b10c87e0"},{url:"frontend/basic/css/018-autofill.html",revision:"b6a38b5225f40dfe572ebc6e28c02836"},{url:"frontend/basic/css/index.html",revision:"ce86095dea90b54ee3ae82852ac62416"},{url:"frontend/basic/html/0007、WebSocket.html",revision:"0e9559975b13f72cda414f14e8a1899b"},{url:"frontend/basic/html/0008、WebStorage.html",revision:"8bcc3360a0768002cf92a89f38283b69"},{url:"frontend/basic/html/001-html-history.html",revision:"8553f46f19054c959295b2f93bbced38"},{url:"frontend/basic/html/0010、WebWorker.html",revision:"d10fee04d19231079411b44a0db11636"},{url:"frontend/basic/html/002-quick-start.html",revision:"01ca0340da1c6d3671863ab753f731f3"},{url:"frontend/basic/html/003-doctype.html",revision:"fafcd35aafe00b8fe670bc442825cd91"},{url:"frontend/basic/html/004-common-element.html",revision:"62327b9309c2e10bd29f42ee3e0baac6"},{url:"frontend/basic/html/005-advanced-element.html",revision:"e1ccd593c042ddcc7401759884076d8e"},{url:"frontend/basic/html/006-semantically-meaningful-tags.html",revision:"c1dc269e717f3412b854436c8f28fbbe"},{url:"frontend/basic/html/007-media-tag.html",revision:"e2a0ab742aa7984eb78f4d7c404cc77b"},{url:"frontend/basic/html/008-canvas-svg.html",revision:"6efda65d6dafcd1f497ebe71ae9dc28b"},{url:"frontend/basic/html/009-src-vs-href.html",revision:"952eda38433a23b5a76516c092eb66cd"},{url:"frontend/basic/html/010-html5.html",revision:"8c825ebf3b6e96cede0efed05e77550b"},{url:"frontend/basic/html/011-defer-vs-async.html",revision:"3e8af151011acfbcc4adcc4caa3e8d59"},{url:"frontend/basic/html/012-form-validation.html",revision:"b4b6595ef4390b91b7c4701017c96996"},{url:"frontend/basic/html/013-seo.html",revision:"ff8ea9132e35d52c7d121dd56b3a9415"},{url:"frontend/basic/html/index.html",revision:"205ad1851e6b5bfbcd2a5c5e9974ce99"},{url:"frontend/basic/index.html",revision:"5d74d4d0d87d32aee660a76440c5504d"},{url:"frontend/basic/javascript/001-var-let-const.html",revision:"22f59395b0f27b8dc21c5bc6016f95bd"},{url:"frontend/basic/javascript/0011、判断对象值相等.html",revision:"013b7028f1176206272fba1df230415a"},{url:"frontend/basic/javascript/0012、AJAX.html",revision:"0e4ce03e7273fcd414955aa0a2592bb2"},{url:"frontend/basic/javascript/0014、浅拷贝与深拷贝.html",revision:"222347e6087795283495efaed93ebb39"},{url:"frontend/basic/javascript/0017、事件循环.html",revision:"b2f228173bfcd669873d9ef8b1a24373"},{url:"frontend/basic/javascript/002-types.html",revision:"e8b0c90ca9fb5be6a1a4b990da3e8df3"},{url:"frontend/basic/javascript/003-judge-type.html",revision:"f83f97ce14ad97b2ac447e54dc7d2c4c"},{url:"frontend/basic/javascript/004-primitive-value-reference-value.html",revision:"547dd48766486aa2b2d99de09c054fb3"},{url:"frontend/basic/javascript/005-execution-context.html",revision:"3db0af4398075583f175e5768d04f9c2"},{url:"frontend/basic/javascript/006-toString-toLocalString-valueOf.html",revision:"4aa8a015c7dedd28cdbfb70809f63699"},{url:"frontend/basic/javascript/007-basic-reference-type.html",revision:"b1485cb082fe551c94394a784965ebe1"},{url:"frontend/basic/javascript/008-collection-reference-type.html",revision:"43de5950e60ab97f4680351a4e3e54c1"},{url:"frontend/basic/javascript/009-array-like-object.html",revision:"b6de6051b4e3ccc89c3f9a97f998606c"},{url:"frontend/basic/javascript/010-object-property.html",revision:"5ad47ad9dc6232ba5e714e325b8602a9"},{url:"frontend/basic/javascript/011-create-object.html",revision:"ef9a2cc45c2b74e9bdff026644e44daf"},{url:"frontend/basic/javascript/012-extends.html",revision:"96170b169a49432ce3ff6cb07f9014ee"},{url:"frontend/basic/javascript/013-class.html",revision:"544a2e8bfa486db3b0066d9d6d96a161"},{url:"frontend/basic/javascript/014-implement-new.html",revision:"b2b8967f36b61250e2615cea0b4be740"},{url:"frontend/basic/javascript/015-function.html",revision:"1b66a8ac444541535f5478c7f6d97dac"},{url:"frontend/basic/javascript/016-this.html",revision:"5c5e0c0e07649b48f17f39ae37d47447"},{url:"frontend/basic/javascript/017-implement-call-apply-bind.html",revision:"db8b3ea45d7acebb0d41da3ab664793c"},{url:"frontend/basic/javascript/index.html",revision:"de8a337da149742abb51971c6fe52f48"},{url:"frontend/browser/01-how-browser-rendering-works.html",revision:"f767a225fbd7fd80249f2302ea61cc2b"},{url:"frontend/browser/02-V8.html",revision:"10901f0e5cccba950f5a5ea5727a768d"},{url:"frontend/browser/03-memory-management.html",revision:"e8ae44366366f3dae367c08b92f2acda"},{url:"frontend/browser/04-cross-domain.html",revision:"8d1b80ec91044d39f66f6ad1e8db5610"},{url:"frontend/browser/05-what-happens-after-entering-the-URL.html",revision:"712e886d9e0214847c418b75cd97d24c"},{url:"frontend/browser/index.html",revision:"6290d3128eb02bc5e15db92e9d1e0afa"},{url:"frontend/engineering/basic/001-modularization.html",revision:"a84fb5160179107db3a842bba67b6a16"},{url:"frontend/engineering/basic/002-package-manager.html",revision:"864f1800b5f10309ff711cca55b32a4b"},{url:"frontend/engineering/basic/003-tool.html",revision:"b4775bf36769cf53fb8453949783cfbe"},{url:"frontend/engineering/basic/004-project-standards.html",revision:"ce4e61b54f0a46702a2edb7286ca486e"},{url:"frontend/engineering/basic/005-yeoman.html",revision:"2b04512bfffe39e8f964374b1713ea7b"},{url:"frontend/engineering/basic/index.html",revision:"b53bed8e3a94a0ce58ddbb9e42d39490"},{url:"frontend/engineering/build-tool/index.html",revision:"8f6c4c7764e82236fb453fefccfbebaf"},{url:"frontend/engineering/build-tool/rspack/001-hello-rspack.html",revision:"142f84b6626de53cf5ad40a00d9e01db"},{url:"frontend/engineering/build-tool/rspack/index.html",revision:"e09eab0c5202f7ce7e280ddd74089b65"},{url:"frontend/engineering/build-tool/vite/001-hello-vite.html",revision:"c29fa16a120e48ef476a764df0731ff4"},{url:"frontend/engineering/build-tool/vite/index.html",revision:"a74750d22597164189d80dbf271e59b2"},{url:"frontend/engineering/build-tool/webpack/001-webpack-basic.html",revision:"9d70a31b634789870d79e4927614f439"},{url:"frontend/engineering/build-tool/webpack/002-webpack-css.html",revision:"0a2a75ddd6208ae84413894ff503906c"},{url:"frontend/engineering/build-tool/webpack/003-webpack-assets.html",revision:"36460f97bc8796df9ef926a5fe26677d"},{url:"frontend/engineering/build-tool/webpack/004-webpack-plugin.html",revision:"c7ebab7b819197ab8c3641ab2742eeca"},{url:"frontend/engineering/build-tool/webpack/005-webpack-babel.html",revision:"69bdb442b1cbc865a175944ad794372c"},{url:"frontend/engineering/build-tool/webpack/006-webpack-vue.html",revision:"86d0922c4a37154c80d5eb9cc71fda67"},{url:"frontend/engineering/build-tool/webpack/007-webpack-dev-server.html",revision:"3c9ee2f28e637406bd237582516cefba"},{url:"frontend/engineering/build-tool/webpack/008-webpack-resolve.html",revision:"c787bdb24bf10fdd86efd2b33c467b9e"},{url:"frontend/engineering/build-tool/webpack/009-webpack-env-split.html",revision:"051225ebddc0eebbe6826f532effd01c"},{url:"frontend/engineering/build-tool/webpack/index.html",revision:"99195134e9425652b3a7e9e9b9280176"},{url:"frontend/engineering/index.html",revision:"3941a76643b6ffba97c833ac974dd0f6"},{url:"frontend/engineering/ssr/005-qwik.html",revision:"83c6f2f2ad24d434c61c3e4140f0f495"},{url:"frontend/engineering/ssr/006-react-server-component.html",revision:"7eeaab7cc249b3ae9c9143e0055745a5"},{url:"frontend/engineering/ssr/007-hydration-is-pure-overhead.html",revision:"1dc363f4b9cd6b61d8d37f6516affc09"},{url:"frontend/engineering/ssr/index.html",revision:"0de227684082a2f7f8306963ca681cb5"},{url:"frontend/framework/chakra/01-getting-started.html",revision:"1a6d9d0a9b16227d3310edc0ffc1c012"},{url:"frontend/framework/chakra/02-style-props.html",revision:"336e1016d76562e8cc967260797c125e"},{url:"frontend/framework/chakra/index.html",revision:"c8f62daf5581ae5be84fed127c176672"},{url:"frontend/framework/index.html",revision:"b451b4783840d9731283c676cd846d66"},{url:"frontend/framework/next/index.html",revision:"8bf7b098a206c069209eb7e1c9c64b26"},{url:"frontend/framework/next/pages-router/01-pages-layouts.html",revision:"b68d7fdea812f03b5e513908b7feb929"},{url:"frontend/framework/next/pages-router/index.html",revision:"b1f5d9ba3ce23d8ce015423327f92d0a"},{url:"frontend/framework/node/001-module.html",revision:"7b3589417e2e5d661a5f54e1a9fa1f98"},{url:"frontend/framework/node/index.html",revision:"f9895e7e468be01287ee63eb321e3ca6"},{url:"frontend/framework/pixi/01-quick-start.html",revision:"7cf938292e652c146fa8f432c2afe276"},{url:"frontend/framework/pixi/02-architecture-overview.html",revision:"b0176cf31f5245becedb781254f9eaea"},{url:"frontend/framework/pixi/03-render-loop.html",revision:"aa617cbfd2c3bf6571070710362175e2"},{url:"frontend/framework/pixi/04-scene-graph.html",revision:"aa0f23b6c05bac95d804bd332d2a8394"},{url:"frontend/framework/pixi/index.html",revision:"6a5ebe80d4a546237e38a7eb81448b00"},{url:"frontend/framework/react/01-useState.html",revision:"e66678ae56ab0fbd72285e9049ccbd97"},{url:"frontend/framework/react/02-useEffect.html",revision:"193f3c025f0157933afa016a780e3461"},{url:"frontend/framework/react/index.html",revision:"034c4b89e65330ef34833fb71bfcea09"},{url:"frontend/framework/vue/01、父子组件通信.html",revision:"d6e629270201be6d7284c7fea0f645d8"},{url:"frontend/framework/vue/02、provide-inject.html",revision:"5a16ab3331bf65ab0e0fa44d13052409"},{url:"frontend/framework/vue/02、Vuex 原理.html",revision:"4454e6128a8ab401a0aeb975c7e9d46d"},{url:"frontend/framework/vue/03、插槽.html",revision:"73cb05f1d2df8f3ad9004d174ba0fa0c"},{url:"frontend/framework/vue/04、动态组件和异步组件.html",revision:"17e295f63c6f203739fc94e367b80c55"},{url:"frontend/framework/vue/05、组件的v-model.html",revision:"1289ed31733744fe55dd5f7563b223f8"},{url:"frontend/framework/vue/06、Mixin.html",revision:"c8a57c3ef991246c6c047ad80ff28965"},{url:"frontend/framework/vue/07、组合式API基础.html",revision:"404fd4e8dd7a2296241308269efbf613"},{url:"frontend/framework/vue/08、组合式函数.html",revision:"2f7bdd8dbbf4c1026f7e7f9230386aa5"},{url:"frontend/framework/vue/09、指令.html",revision:"b9a0d12bc2336f3f661a8f98e53a20ee"},{url:"frontend/framework/vue/10、插件.html",revision:"49715c7b206a1320c71ccf762ca182af"},{url:"frontend/framework/vue/index.html",revision:"817e1fe76529ea9d478211e46177135d"},{url:"frontend/index.html",revision:"338cda341c2d4ec072ef81410e451161"},{url:"frontend/practice/001-dnd-kit.html",revision:"d4af09e5602123e1afd132e75050edbc"},{url:"frontend/practice/002-annotation.html",revision:"ac839b3f20262bc211e668e307963fab"},{url:"frontend/practice/003-file-upload.html",revision:"4a02fcfb3bd19b3650f61771fd1ac2f5"},{url:"frontend/practice/004-global-upload.html",revision:"cb5570cc303b8d32ebf648331eec2880"},{url:"frontend/practice/005-postcss-px-to-viewport.html",revision:"6439459ed706d4daf378f1a2f129afbc"},{url:"frontend/practice/006-animation-svg.html",revision:"fda59ec80fa7a7396bebc8f80e1346b9"},{url:"frontend/practice/007-offline-export-in-highcharts.html",revision:"11c0f59c6617a65b0cc86ac57db5c339"},{url:"frontend/practice/010-antd-textarea-placeholder-pre-line.html",revision:"7c68975123a9f0a657aeb0b2969b313b"},{url:"frontend/practice/015-auto-change-node.html",revision:"e18a104f9906b538626dccbd309b3690"},{url:"frontend/practice/016-rest-client-error.html",revision:"9e954eba96d8d5794c4fa42b200d701d"},{url:"frontend/practice/017-whistle-debug-real-phone.html",revision:"7a457f0a2bcf5feb62c797221adc69d8"},{url:"frontend/practice/018-monaco-editor-react.html",revision:"caa4146e479341c0591c81457b9a7fbd"},{url:"frontend/practice/019-ios-prevent-touch.html",revision:"7dc22b9825f8022277c26a20102c4a96"},{url:"frontend/practice/020-ios-img.html",revision:"fb2f80a40e91f62eb9c0643d5cb00c30"},{url:"frontend/practice/index.html",revision:"ada421b4a7617d522e2619e7883b9565"},{url:"index.html",revision:"ebff7dace58701c5b0c2231076713f03"},{url:"intro.html",revision:"7a28ab443ab7692599d45f77ab213584"},{url:"project/github-auto-commit/index.html",revision:"ec08caffb111e9ebca9154fe836c2eb7"},{url:"project/imperial-kitchen/01-init.html",revision:"a85e0e721b70895e079652820aae216b"},{url:"project/imperial-kitchen/02-server.html",revision:"07ebaba7bd1e19c2ec5c64c0fdeb3f73"},{url:"project/imperial-kitchen/03-database.html",revision:"fb579cd669b3dfa52c2ed0c2f36651aa"},{url:"project/imperial-kitchen/04-api.html",revision:"20d57deb88512c6385d8dbee78b42af5"},{url:"project/imperial-kitchen/index.html",revision:"0a23ef5ca9da4d4f2f1d8758c1569a68"},{url:"project/index.html",revision:"59eeee27eac18f08bdb493987825fbad"},{url:"project/mini-vue-cli/001-init-project.html",revision:"7f340f99ccb89e801c0c0d980b0b1eea"},{url:"project/mini-vue-cli/index.html",revision:"5492f16f22021b86c0d2be566abd6d20"},{url:"project/plugin/01.vuepress-plugin-ordered-header.html",revision:"7b4448797312547aa30bdfb84e9ee932"},{url:"project/plugin/index.html",revision:"b7eee3f2cc45b8f78d714c1a9aee4f4a"},{url:"project/RSSHub/index.html",revision:"0b08347123b9fa8affd98227c94ba1e5"},{url:"project/ssg/index.html",revision:"57551f06741554d46a44b8216018f75f"},{url:"project/tyro-ui/001-init-project.html",revision:"3b53a6883219820f46aff9f4d857a3d7"},{url:"project/tyro-ui/index.html",revision:"2eafbcb4f4e8589d9dbb74ef2b9ae907"},{url:"reading/index.html",revision:"0cabd88868de12e8fc00bfaa3005bb45"},{url:"reading/patterns/index.html",revision:"161d4313c104fca7257185e2f2cf559f"},{url:"reading/patterns/vanilla/01-command-pattern.html",revision:"87af51e4edf347ed3df0efe866c3634f"},{url:"reading/patterns/vanilla/02-factory-pattern.html",revision:"3949a151ebb728372ac2c29acbb15a2a"},{url:"reading/patterns/vanilla/03-flyweight-pattern.html",revision:"9d54bae4532f394a6854b0902ac342ae"},{url:"reading/patterns/vanilla/04-mediator-pattern.html",revision:"da22f987a55d72952e599db98285f750"},{url:"reading/patterns/vanilla/05-middleware-pattern.html",revision:"14420bbae4ba17ee9dba17bc01b602d4"},{url:"reading/patterns/vanilla/06-mixin-pattern.html",revision:"89325e1d5e8f25ac28c6c75d34d6811c"},{url:"reading/patterns/vanilla/07-module-pattern.html",revision:"032a0a9d62c8ae9ad38c64cc4d731f3e"},{url:"reading/patterns/vanilla/index.html",revision:"15b135269f327c249f459f72518b899a"},{url:"reading/pragmatic-programmer/01-a-pragmatic-philosophy.html",revision:"bea917edde7b8680be97f238b421d916"},{url:"reading/pragmatic-programmer/02-a-pragmatic-approach.html",revision:"8215dd85d7b6a39260b8fe23b6a4ae39"},{url:"reading/pragmatic-programmer/03-basic-tool.html",revision:"2cb6ce25b333b15ad9c73d51b2fdc20a"},{url:"reading/pragmatic-programmer/04-pragmatic-paranoid.html",revision:"29a1e4c41bae8cd4e854420155951f21"},{url:"reading/pragmatic-programmer/05-work-around.html",revision:"cf1323af543ccec46a737dd84367f852"},{url:"reading/pragmatic-programmer/06-concurrent.html",revision:"7de8ccc6883cb8815047f4653a9bc466"},{url:"reading/pragmatic-programmer/07-when-coding.html",revision:"fc530f71b049c5dc23473f091d0b1a9a"},{url:"reading/pragmatic-programmer/08-before-start-project.html",revision:"13fc84399fe650c4750ac39e239429f2"},{url:"reading/pragmatic-programmer/09-pragmatic-project.html",revision:"757950e6b2271ab07ce3c1ffbbe9553e"},{url:"reading/pragmatic-programmer/index.html",revision:"30d35cea67c0416a816bfc8c7b5c94f4"},{url:"reading/pro-git/01-getting-started.html",revision:"fe63c6330936654640bcfcdeaedb37c3"},{url:"reading/pro-git/02-git-basics.html",revision:"7023f581e0b9bcb2da75407c589b7ffc"},{url:"reading/pro-git/03-git-branch.html",revision:"731975b109b5b7a81d2fbe6da1e2f513"},{url:"reading/pro-git/04-git-server.html",revision:"6b94cabd64f4ebec7816416a58404276"},{url:"reading/pro-git/06-change-commit.html",revision:"6697723b9abd1d74368f7e27395ff411"},{url:"reading/pro-git/index.html",revision:"5dbceef00ed7aecef8a609821144cb2e"},{url:"slides.html",revision:"719dd7c1256d71113779439f8d1b9f40"},{url:"star/index.html",revision:"0f688ff00008c235d28bf59699825692"},{url:"survival/index.html",revision:"12c9fb390f85023850922c0e107a9ac6"},{url:"survival/okr/2023.html",revision:"5e3a049b45edc3d4acd6eb53fbf5db6b"},{url:"survival/okr/2024.html",revision:"2b697295d6a1d07795d77da6ab17c584"},{url:"survival/okr/index.html",revision:"8589ab75e4ff9d46c95fc027c9414623"},{url:"survival/week/index.html",revision:"91e4159a27da2406735ead9811350797"},{url:"tag/amd/index.html",revision:"e7232ea869d6b27cfdc4afa29cc853d9"},{url:"tag/animation/index.html",revision:"d7ed40dddc533aae83face3c72a7594b"},{url:"tag/antd/index.html",revision:"250af6fd578f9ed2b54d98f104dbc92d"},{url:"tag/architecture/index.html",revision:"3ef131373b0948d2581751af6687bfb3"},{url:"tag/atomic-css/index.html",revision:"a52351496669e728450d58f739bd635d"},{url:"tag/backend/index.html",revision:"953b43bd3c35ff41331148aff3b2195e"},{url:"tag/basic-knowledge/index.html",revision:"56a82d0d4e21f250d43f18c4b9ea58fc"},{url:"tag/branch/index.html",revision:"544c3dfe34127bf21ac6591ca8403811"},{url:"tag/bt/index.html",revision:"30e4a7293d5db37e4ea2364ca3aff3ef"},{url:"tag/canvas/index.html",revision:"0689c398958b3424b438d91e9498dc86"},{url:"tag/centos/index.html",revision:"9774152170f555c539f9128c715aaeb8"},{url:"tag/chakra/index.html",revision:"1ec5fe9ee113ff33feebec6b8aa7bde4"},{url:"tag/cjs/index.html",revision:"a01d4703a497d0ff4a41d1ae00f30c43"},{url:"tag/cli/index.html",revision:"d8aea1e8ae60c5a7861c2d38eafc32de"},{url:"tag/cmd/index.html",revision:"69a4344a5b7dec761b0a8ba87d20aa60"},{url:"tag/cnpm/index.html",revision:"17019a67ddeb590bdf8cda72aa52a744"},{url:"tag/code-editor/index.html",revision:"7ee149c38ff8c65e77a9786d382552d3"},{url:"tag/command-pattern/index.html",revision:"35e7046976e9435243d1d0125d5b8938"},{url:"tag/commit/index.html",revision:"576610131b10cebe1235b41adae5be1f"},{url:"tag/computer-science/index.html",revision:"8ab11299fd3fc479bed2a75d8c0cab2b"},{url:"tag/css/index.html",revision:"e5fbc14df21460b826b5061622f7c7b7"},{url:"tag/data-model/index.html",revision:"57a74642438a60dce9cc66a45a766897"},{url:"tag/debug/index.html",revision:"63a9f128146a1d0f714bbe3c555c506f"},{url:"tag/design-pattern/index.html",revision:"6653ef2f9eb33c6c5abbbfc78c970141"},{url:"tag/dnd-kit/index.html",revision:"44e8121f2049b6451ee47a75c515fe8d"},{url:"tag/docker/index.html",revision:"2fdf6c799a1369dc391a31d293f587be"},{url:"tag/effect-hooks/index.html",revision:"0cadef91bdab422d072fb151eb163312"},{url:"tag/efficiency/index.html",revision:"0f2249e8aa3c7694a022887700a3bff5"},{url:"tag/esm/index.html",revision:"c8cd9e1e962cdd219782bcf9db1d4ac6"},{url:"tag/express/index.html",revision:"a3d713ddcdda1d3b4fbfd440f0a2a7bb"},{url:"tag/factory-pattern/index.html",revision:"df9105f32a2abce6a3c4b6db5b56ac7e"},{url:"tag/flyweight-pattern/index.html",revision:"e6091a9ff14ae2872785161481146ffd"},{url:"tag/form/index.html",revision:"b16b38762a80cf97175223703dd43b09"},{url:"tag/frontend/index.html",revision:"0361fb8381f0153cd1ea13d9601575ff"},{url:"tag/git/index.html",revision:"db90c736157397e7f2de18d7d4a1f83f"},{url:"tag/github-auto-commit/index.html",revision:"4c771ed942a18f2b2e53f38f1eb47241"},{url:"tag/github/index.html",revision:"b8eebf7d0778a6b2766c0a6e93b295b0"},{url:"tag/grid/index.html",revision:"2f6219be4d7772bb575b9bc80c4f79ce"},{url:"tag/highcharts/index.html",revision:"471f1f7f9c2f702b7f4b102fec5d3211"},{url:"tag/history/index.html",revision:"314763e4664d33cdad5544c4127dc90a"},{url:"tag/hooks/index.html",revision:"2112a549d5a020bbe47a4d96488e5c22"},{url:"tag/html/index.html",revision:"6dddd6696bbc0fa97b6f62584181d330"},{url:"tag/html5/index.html",revision:"b702503c20b236f5ecc4205b22239c7c"},{url:"tag/http-code/index.html",revision:"6c8e387452cb5fa2ed2a25a843228b6a"},{url:"tag/http/index.html",revision:"81e20e350b15fc17ba796e2559d1141e"},{url:"tag/https/index.html",revision:"189a97220e1fd7bdba016a7564222da9"},{url:"tag/index.html",revision:"93b182234a00eae9ccdd9c2ab7924040"},{url:"tag/init-project/index.html",revision:"b2863ed464b2a5ad6fa4464857d84914"},{url:"tag/kitchen/index.html",revision:"3cf2a490f870ea5deac13060b116ecc7"},{url:"tag/langchain/index.html",revision:"9e3d3c42d33833e62a7070600e9a543e"},{url:"tag/language-advanced/index.html",revision:"846090daa63c0840bec909b4ac44af97"},{url:"tag/language-basic/index.html",revision:"3366a117201551169ab944cc00e0b76f"},{url:"tag/mediator-pattern/index.html",revision:"8bbae9694392c2312968898d14e43083"},{url:"tag/middleware-pattern/index.html",revision:"645577376d981674d812b879aa761194"},{url:"tag/mixin-pattern/index.html",revision:"0bd0618b6d80fc20e7030f6cc4dfabf3"},{url:"tag/module-pattern/index.html",revision:"838eee00773a441c53c7e3045896fa06"},{url:"tag/module/index.html",revision:"6ce7f1c93eba34cb6ccc525a3b50238c"},{url:"tag/mysql/index.html",revision:"ae06a4dcba7e3ee530fd669d5576e9c5"},{url:"tag/network/index.html",revision:"fdb4c6ff11ccec9ea14d24f093204b14"},{url:"tag/new/index.html",revision:"9c7322846319f672dbf087bb8ba0f06f"},{url:"tag/next.js/index.html",revision:"271af344c32cab3468d98ac75f946c77"},{url:"tag/node/index.html",revision:"f9480e566f0a96fccc8d76c9fac1e347"},{url:"tag/npm/index.html",revision:"5acc5c1b1b841b226353f093050e6409"},{url:"tag/object/index.html",revision:"a44c8b58d38fc7a8db8e1afa4f1be931"},{url:"tag/openai/index.html",revision:"ddac3af8ff0853cf09b0aaa1d139d54c"},{url:"tag/pages-router/index.html",revision:"331cd7a5d1ba6aab2bf3532e6f58c98b"},{url:"tag/pnpm/index.html",revision:"c36650f201a36fcbcce27138caa7abf5"},{url:"tag/postcss/index.html",revision:"3a45f90c6f5f7e90743e1695c25e7514"},{url:"tag/pragmatic/index.html",revision:"0a4a3480c5fcc09ee0771ff4cda04ede"},{url:"tag/react-core/index.html",revision:"5e678d963c61d96d542e329a4e492521"},{url:"tag/react/index.html",revision:"fa6149003e01f7bde63826fb3326362d"},{url:"tag/rspack/index.html",revision:"a8eea9ac9270c7aa913c5f75d6c98ece"},{url:"tag/rss/index.html",revision:"35fe7892b023eba7d0afc0ecb7249f13"},{url:"tag/selector/index.html",revision:"dc1dfa381829700d9e5434eedb9ee171"},{url:"tag/seo/index.html",revision:"f8d3d1ef2b31083d8b93f6b0ee079692"},{url:"tag/sql/index.html",revision:"0be514b1d88c70e8253e19b307913515"},{url:"tag/ssg/index.html",revision:"14d7ba77b4ad3f3f85669ef670558504"},{url:"tag/ssh/index.html",revision:"e06eecbc08d84bfa11bc3a01bd8fa569"},{url:"tag/ssr/index.html",revision:"7e891874cb7e2f5ea6d5b5a4543547fb"},{url:"tag/state-hooks/index.html",revision:"12221abc8439244662da7431a06794a0"},{url:"tag/styled-system/index.html",revision:"f81511e57e7d4b9a7157872fe6c8ea92"},{url:"tag/svg/index.html",revision:"184dce01dd24f41a66713e4a1da06456"},{url:"tag/tcp/index.html",revision:"22f44447a4c396d7c40c7af8f8d9e873"},{url:"tag/tcpip-模型/index.html",revision:"3d63457d86feb04953f51adcfb1adad0"},{url:"tag/this/index.html",revision:"b389252ed27d1a506c66debbf3fe12d6"},{url:"tag/trick/index.html",revision:"40730dfef8ed350fe41566cb07a8403a"},{url:"tag/typescript/index.html",revision:"36bf71785258c431719ae339fe79b864"},{url:"tag/udp/index.html",revision:"96135d2c661552a50336772636ddeb90"},{url:"tag/v8-引擎/index.html",revision:"cb2ac34205094a27f0b42584c4234a43"},{url:"tag/vanilla/index.html",revision:"3cd932eee14d2c38b4b3945c899e3476"},{url:"tag/vite/index.html",revision:"3500921da2d5441aaa189fa61832aca0"},{url:"tag/vscode/index.html",revision:"ddc2374e84373d54cb516fd9c95877bf"},{url:"tag/vuepress/index.html",revision:"87753fc57b692c39542241b56e6c1310"},{url:"tag/vuex/index.html",revision:"84e94a3af565ecc5241212db59d2156d"},{url:"tag/web-worker/index.html",revision:"f5721440534232362509fe227749eed9"},{url:"tag/webpack/index.html",revision:"88674e656bd846df42739c9eeb2af50f"},{url:"tag/yarn/index.html",revision:"1519de461bd8f06807442dd88ed47cfc"},{url:"tag/yeoman/index.html",revision:"a4a6e3f240acef5d6859af78f8d27551"},{url:"tag/zsh/index.html",revision:"498529888ee8ebd5fc6434f0cc7fa3d8"},{url:"tag/事件循环/index.html",revision:"3c8e63fdddd230f715ff8dcf83efb281"},{url:"tag/二分查找/index.html",revision:"52c401b9d2d85caccbb5b02bdacc04ec"},{url:"tag/二叉搜索树/index.html",revision:"3dca7b48127dce6aad3062d7f7bb87b7"},{url:"tag/二叉树/index.html",revision:"3e560debf5b64be6de88da98ab58d0ec"},{url:"tag/代码规范/index.html",revision:"1918ae9a302d55a7dcc7444108879932"},{url:"tag/关系数据库模型/index.html",revision:"59e7ebe69e0d4073eac3078108efcc0e"},{url:"tag/兼容/index.html",revision:"0b5323714187aca24f640a80c3fd6add"},{url:"tag/函数/index.html",revision:"028ffcf05d0bfab25988c060b31f4efd"},{url:"tag/前端存储/index.html",revision:"0d53590c1e56e67246c1a24ee712511b"},{url:"tag/动态规划/index.html",revision:"3b04c687e9089aa7c89df65827e7df53"},{url:"tag/双指针/index.html",revision:"266ce32998af13ed841457c046972026"},{url:"tag/图片批注/index.html",revision:"965f07392eea3aaed4f3116bac24e814"},{url:"tag/垃圾回收/index.html",revision:"53af7bc4c28fdf85827143f283faa17f"},{url:"tag/工程化/index.html",revision:"718e87a28e23a44517781c91fdb9a7c3"},{url:"tag/布局/index.html",revision:"57302ffd65d435e1a694f5ae33357d36"},{url:"tag/弹性盒/index.html",revision:"96adc852519715d9b0cb09e0d3aaafa4"},{url:"tag/御膳房/index.html",revision:"8ea98ef85f39b3a8c09a99c45f529a57"},{url:"tag/手写代码/index.html",revision:"1e5a489b52c0e16df19aa3b25d033b8f"},{url:"tag/拖拽排序/index.html",revision:"97ff9360da4737ce545e9411923a1f50"},{url:"tag/数据库设计理论/index.html",revision:"f2aa01dea0c105b6d7f14279f1462bd4"},{url:"tag/数据类型/index.html",revision:"ca6e81bdf45f397edfbf5d051945b6a9"},{url:"tag/数组/index.html",revision:"8ab481a57bd9f397faa9b8f16e4d9a18"},{url:"tag/文件上传/index.html",revision:"2fccfd801750dbb4a48660e71205f139"},{url:"tag/模块化/index.html",revision:"7fc4269d5e0f7cc1cd1e0770d29efe83"},{url:"tag/浅拷贝/index.html",revision:"48e0160edef7f0627c57cda6492a1dc8"},{url:"tag/浏览器渲染/index.html",revision:"7842685b674f87740c01c66bdfecd095"},{url:"tag/浮动/index.html",revision:"ea2c139e5002c4fa54eb00b54445b29a"},{url:"tag/深入组件/index.html",revision:"8320f346f60e177ee60e79c3de0f3c3f"},{url:"tag/深拷贝/index.html",revision:"64819d13e999002c1ca5cba42c6e53a8"},{url:"tag/源码阅读/index.html",revision:"faf2fd617e54079d036d16b5c210a2fd"},{url:"tag/移动端适配/index.html",revision:"3cab07d7939de14fe47fe0bb6986b106"},{url:"tag/组件库/index.html",revision:"4005813cc92b7458fe57bf3399865d7c"},{url:"tag/组件通信/index.html",revision:"610180c45f98f15302657cd93fc3a5da"},{url:"tag/组合式-api/index.html",revision:"c4a45c40c555483f638dbc31c8b7308d"},{url:"tag/网络请求/index.html",revision:"02879d77cbe279fdd93765012006ea32"},{url:"tag/链表/index.html",revision:"bd87628d5b15924088f71593a2654761"},{url:"tag/面向对象/index.html",revision:"ad11e1968722cf70b921d180cdd84edb"},{url:"tag/项目/index.html",revision:"4507bfa00e22bc99c6226c3db44ce9ac"},{url:"tag/项目打包/index.html",revision:"a08eb92f8887b2be5354d59a917dc031"},{url:"tag/项目部署/index.html",revision:"0914dc95c2cd67dd18216b7761bb0a5f"},{url:"timeline/index.html",revision:"761c893af3967cff6815811cfa9d5204"},{url:"assets/event-loop-3S7ql_ag.png",revision:"73c49f2d9fbee1024bb5514bda223259"},{url:"assets/image/computer-science/networking/006/HTTP.png",revision:"696f03139b0a7cd58f61fbda9ca71569"},{url:"assets/image/computer-science/networking/006/https-flow.png",revision:"530732dac1410693cbdbcfeaf8616bcc"},{url:"assets/image/computer-science/networking/006/HTTPS.png",revision:"b7b94c88fd268426680a0c6ca45de5c6"},{url:"assets/image/computer-science/networking/006/mid-attack.png",revision:"f101a27ef11244840aeeca965614da8a"},{url:"assets/image/computer-science/networking/007/four.png",revision:"91ec936c98b288f6f03fec1feeb56bf9"},{url:"assets/image/computer-science/networking/007/three.png",revision:"3d375830b92323a4dab374dcb488ce95"},{url:"assets/image/computer-science/networking/010/DNS.png",revision:"5754e327ee776e651564ad67510a9f66"},{url:"assets/image/computer-science/networking/010/message.png",revision:"fdc1dde481eeae37518ec1a75e964463"},{url:"assets/image/computer-science/networking/010/parse-url.png",revision:"68e965d160d8a8728680356d5e5304e0"},{url:"assets/image/computer-science/networking/010/TCP-IP.png",revision:"eaabb9a2407bfcca4c2e4fb8834b52d6"},{url:"assets/image/frontend/basic/css/003/abnormal-box.png",revision:"f71a1ccfe4bdcff13ae3b08f24b0ddf9"},{url:"assets/image/frontend/basic/css/003/box.png",revision:"663746ae4c9c718590e09adb1fa72caf"},{url:"assets/image/frontend/basic/css/003/normal-box.png",revision:"d7567d94ca78a57d31bcc40a20c5cefd"},{url:"assets/image/frontend/basic/html/002/avatar.jpg",revision:"bcd2b5352170f5d515b1dd8d969bc872"},{url:"assets/image/frontend/tool/vite/001/bundle.png",revision:"9affcc8711ebfcd3d3cc7269c57ced52"},{url:"assets/image/frontend/tool/vite/001/esm-problem.png",revision:"836cb8a52a868faa0474ff52b04e28a0"},{url:"assets/image/frontend/tool/vite/001/esm-vite.png",revision:"cc374f5589cb7c50a73440e53cad1d41"},{url:"assets/image/frontend/tool/vite/001/vite.png",revision:"916a6df6ac5972e0594a1be4c5fff31c"},{url:"assets/image/frontend/tool/webpack/004/mode.png",revision:"c5b190fa1356dde8cf0f9c54cb9b759d"},{url:"assets/image/frontend/tool/webpack/004/source-map-1.png",revision:"9edcbdb60792b9cccef52ee3e4e7e197"},{url:"assets/image/frontend/tool/webpack/004/source-map-2.png",revision:"9087a9aa58eb580e0298f0cd4b59b5c2"},{url:"assets/provide-inject-m2qurnhp.png",revision:"f7110a1bae2d0744997012ca656d8fa1"},{url:"assets/scope-XtMnboSO.png",revision:"00cf6bd787014eb22b2821d72b80212a"},{url:"assets/scoped-slot-zLA5fzs5.png",revision:"c6ef14ba02eac288245c5c5009d966cc"},{url:"avatar.jpeg",revision:"c74016a1dc6691fefe6ad212f1034757"},{url:"hero.webp",revision:"73886f53045fdd0606a196548e42e9a0"}],{}),e.cleanupOutdatedCaches()})); //# sourceMappingURL=service-worker.js.map diff --git a/service-worker.js.map b/service-worker.js.map index b0f7f040c4..66e4f26e34 100644 --- a/service-worker.js.map +++ b/service-worker.js.map @@ -1 +1 @@ -{"version":3,"file":"service-worker.js","sources":["../../../../../tmp/b4a0ee94f9f9522df85b46581f05bdac/service-worker.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/home/runner/work/blog/blog/node_modules/.pnpm/workbox-core@7.0.0/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/runner/work/blog/blog/node_modules/.pnpm/workbox-precaching@7.0.0/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/home/runner/work/blog/blog/node_modules/.pnpm/workbox-precaching@7.0.0/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"assets/0001、二叉树.html-4auqombs.js\",\n \"revision\": \"9839094dbd6813785c65a18f1c99c393\"\n },\n {\n \"url\": \"assets/0002、二叉搜索树.html-OF0zcdo8.js\",\n \"revision\": \"6c7ebb95f90e310b21e9960952192046\"\n },\n {\n \"url\": \"assets/0003、动态规划.html-BaRf7Si3.js\",\n \"revision\": \"6d46c662b86820e365a61bd82a89f065\"\n },\n {\n \"url\": \"assets/0004、链表.html--ickDlYH.js\",\n \"revision\": \"515d944e71b88e6cd3743970dab439c8\"\n },\n {\n \"url\": \"assets/0007、WebSocket.html-clDh-CAk.js\",\n \"revision\": \"65dfea85efa2490db4408756cb1234ba\"\n },\n {\n \"url\": \"assets/0008、WebStorage.html-LEVYFRc7.js\",\n \"revision\": \"9daf612fcd1d4e01d79c79cf2ad7f06e\"\n },\n {\n \"url\": \"assets/001-character-encoding.html-cVILioj-.js\",\n \"revision\": \"ecb63a3f57fce7c3e68ddb8ff85f0716\"\n },\n {\n \"url\": \"assets/001-dnd-kit.html-2XGEbOiO.js\",\n \"revision\": \"94ed47ad6d8f385cb246d1b90df33eb3\"\n },\n {\n \"url\": \"assets/001-finalhandler.html-ovhKFVbX.js\",\n \"revision\": \"e579281219b68710a5c204f7e2b80d79\"\n },\n {\n \"url\": \"assets/001-hello-database.html-aOK2afKr.js\",\n \"revision\": \"d758adae6258f9236e65a606405f1f0b\"\n },\n {\n \"url\": \"assets/001-hello-rspack.html-bi8TfCOv.js\",\n \"revision\": \"0f0fac6e43f45bf63ccc41a96afadb38\"\n },\n {\n \"url\": \"assets/001-hello-vite.html--F-BEmyI.js\",\n \"revision\": \"42cdd043bdf62ca67f374f70c7890ff7\"\n },\n {\n \"url\": \"assets/001-html-history.html-v0CXXyX7.js\",\n \"revision\": \"51efa6af8ac35a95be6630beedececf6\"\n },\n {\n \"url\": \"assets/001-init-project.html-JrVvGhXT.js\",\n \"revision\": \"ff341ae08e220c5c305a5fe44597a7fa\"\n },\n {\n \"url\": \"assets/001-init-project.html-sp9TCZ05.js\",\n \"revision\": \"95e75b60fa553a7e311df04b1d6922be\"\n },\n {\n \"url\": \"assets/001-install-mysql.html-8EsZMsqk.js\",\n \"revision\": \"830495e1b94f07c971de891df17b02f8\"\n },\n {\n \"url\": \"assets/001-modularization.html-C5iw405Z.js\",\n \"revision\": \"5c7800c0ee7014f3c92b2448d76502a1\"\n },\n {\n \"url\": \"assets/001-module.html-0uMgtzmT.js\",\n \"revision\": \"69859e2347500691430389928beda30c\"\n },\n {\n \"url\": \"assets/001-network-model.html-NoIFtNe7.js\",\n \"revision\": \"e41b75ed3edd00647dbade9e3bf44217\"\n },\n {\n \"url\": \"assets/001-quick-start.html-2zV3Q__R.js\",\n \"revision\": \"9be2c85fa38ab4f0cf09c70817ac6448\"\n },\n {\n \"url\": \"assets/001-set-the-ssh.html-aEDPE2NO.js\",\n \"revision\": \"162817720fe971b2c1c9e51e05ebe09d\"\n },\n {\n \"url\": \"assets/001-var-let-const.html-QE4xXk9s.js\",\n \"revision\": \"c6278ee3827ee094671d047388efe181\"\n },\n {\n \"url\": \"assets/001-webpack-basic.html-pCqwATgK.js\",\n \"revision\": \"afaaafed53ad6728be1a3aaa8d9909e8\"\n },\n {\n \"url\": \"assets/0010、WebWorker.html-QlxKBHVw.js\",\n \"revision\": \"b897d9506d5bc7947cd2c28510898952\"\n },\n {\n \"url\": \"assets/0011、判断对象值相等.html-qhcibsAO.js\",\n \"revision\": \"95b5e998495df1bff2819e0b02e4eb82\"\n },\n {\n \"url\": \"assets/0012、AJAX.html-DQSqS6qA.js\",\n \"revision\": \"75508abf55bde99707aa7f07bf8b4d1b\"\n },\n {\n \"url\": \"assets/0014、浅拷贝与深拷贝.html-aQKjlhhK.js\",\n \"revision\": \"7c5bffa464c855e331deb560c7792eaf\"\n },\n {\n \"url\": \"assets/0017、事件循环.html-CHv7YjC_.js\",\n \"revision\": \"049cbcee2ef610819ff4ab7966941b6c\"\n },\n {\n \"url\": \"assets/002-annotation.html-oZ12-DLl.js\",\n \"revision\": \"f19be67ecf0b7b2d1d8ee250cbe270f7\"\n },\n {\n \"url\": \"assets/002-build-git-server.html-C4U8vbpS.js\",\n \"revision\": \"f6928ccf90ad1c721a37dc4ae0d9c98b\"\n },\n {\n \"url\": \"assets/002-HTTP-overview.html-t1eJ1tmB.js\",\n \"revision\": \"8b602fb1effbf5d5e0272af5acdd46f9\"\n },\n {\n \"url\": \"assets/002-package-manager.html-ooVRb0tm.js\",\n \"revision\": \"2e40226bf8f5465443764ab9efd4fbe9\"\n },\n {\n \"url\": \"assets/002-quick-start.html-yQRWabdS.js\",\n \"revision\": \"bb108f5edd4fe7e0ebd9986bdff030c5\"\n },\n {\n \"url\": \"assets/002-relation-model.html-GwrX2GKL.js\",\n \"revision\": \"f38ca0d4f06e796d2cac35078f60cae8\"\n },\n {\n \"url\": \"assets/002-selector.html-_GCwigBR.js\",\n \"revision\": \"7b9072a35fbc867de4db95e56dba9b10\"\n },\n {\n \"url\": \"assets/002-types.html-252gQD2-.js\",\n \"revision\": \"a3444b7332c15298e65615954d81183a\"\n },\n {\n \"url\": \"assets/002-webpack-css.html-QMyYbPPn.js\",\n \"revision\": \"69e3dadac53350fe5a877a3d8eda8d69\"\n },\n {\n \"url\": \"assets/003-box-model.html-XDv8wKIC.js\",\n \"revision\": \"cbf01273f23056b97dcdec204fbc32e4\"\n },\n {\n \"url\": \"assets/003-configure-bt.html-3veiWlcs.js\",\n \"revision\": \"5db4c302463a5c89a792dd1f8ade2bfb\"\n },\n {\n \"url\": \"assets/003-db-design.html-xMFrXx79.js\",\n \"revision\": \"bbb0a0d75fed666e319685f416d2b250\"\n },\n {\n \"url\": \"assets/003-doctype.html-slx-qvH9.js\",\n \"revision\": \"beed2814d43d24a192ea5b8002e7f76d\"\n },\n {\n \"url\": \"assets/003-file-upload.html-aXCMPaU8.js\",\n \"revision\": \"24f3d5539854d71946c138f75f112e32\"\n },\n {\n \"url\": \"assets/003-get-post-difference.html-AcYlQkUc.js\",\n \"revision\": \"7d47b113d059317fba8f1d89c50a2ade\"\n },\n {\n \"url\": \"assets/003-judge-type.html-88H_u1XZ.js\",\n \"revision\": \"cb74964bc92773d270b19fe3af15d4f0\"\n },\n {\n \"url\": \"assets/003-tool.html-k6pbBUqo.js\",\n \"revision\": \"c4ed6676626cb8fdeb2151f6b50afb79\"\n },\n {\n \"url\": \"assets/003-webpack-assets.html-NHLlXkyd.js\",\n \"revision\": \"99783b5873a6f6c16d1b180e59a35411\"\n },\n {\n \"url\": \"assets/004-advanced-db-model.html-ruy78wNd.js\",\n \"revision\": \"445bc359da31477289afd72293a6a592\"\n },\n {\n \"url\": \"assets/004-automated-deployment.html-gtM4lpgE.js\",\n \"revision\": \"ed36903ca2d7fa9af06335308bc6e053\"\n },\n {\n \"url\": \"assets/004-common-element.html-Xjzjjmz0.js\",\n \"revision\": \"064d6fc1c3904940cae839a10c47c343\"\n },\n {\n \"url\": \"assets/004-global-upload.html-_IRYzqKH.js\",\n \"revision\": \"1bcc15a80b22a5eeb5b38bfed1fb7dbb\"\n },\n {\n \"url\": \"assets/004-HTTP-development.html-fXKTMLP5.js\",\n \"revision\": \"be9773fa3f35e53b1c1e6545810cc0ac\"\n },\n {\n \"url\": \"assets/004-primitive-value-reference-value.html-zZRxOtGZ.js\",\n \"revision\": \"b48c801c5bdca985fbe27d74ad05de93\"\n },\n {\n \"url\": \"assets/004-project-standards.html-IEck58m4.js\",\n \"revision\": \"fb21a5f62705d327d2d90b150fb2b547\"\n },\n {\n \"url\": \"assets/004-text-font.html-7LU7lsoM.js\",\n \"revision\": \"b7ff9f2d76efc92d3fb49f9b7e207727\"\n },\n {\n \"url\": \"assets/004-webpack-plugin.html-9kEyMOsf.js\",\n \"revision\": \"63bf82ea2e3aed7008e59b949a3b2352\"\n },\n {\n \"url\": \"assets/005-advanced-element.html-Iw8_OFlN.js\",\n \"revision\": \"cef9ca3aefc0c1733a87ded7cb946a07\"\n },\n {\n \"url\": \"assets/005-cascade-inheritance.html-PJNtVfy1.js\",\n \"revision\": \"e77c32ede7cb0ea222520327e85fa0ee\"\n },\n {\n \"url\": \"assets/005-execution-context.html-h2_naATY.js\",\n \"revision\": \"3eaf4b34c8fad9f79b2263c4544cccd5\"\n },\n {\n \"url\": \"assets/005-HTTP-cache.html-93Z7vex3.js\",\n \"revision\": \"005bc60c38f585702d4ced6ba3c5b5af\"\n },\n {\n \"url\": \"assets/005-install-docker.html-0N1qwABW.js\",\n \"revision\": \"1ad4a5c4267aebca14c9df2f579cada3\"\n },\n {\n \"url\": \"assets/005-postcss-px-to-viewport.html-NXFQc7im.js\",\n \"revision\": \"378bad040be6014f6245353320d5c217\"\n },\n {\n \"url\": \"assets/005-qwik.html-TahGLhP-.js\",\n \"revision\": \"64bfe43780c7d2e5ea3691cece3a7c23\"\n },\n {\n \"url\": \"assets/005-webpack-babel.html-1lDmfMgr.js\",\n \"revision\": \"45ebad5301c407b80a8a5b8b0d4ee182\"\n },\n {\n \"url\": \"assets/005-yeoman.html-9wj3v3oe.js\",\n \"revision\": \"86aab5953160786016792975ade6c6c4\"\n },\n {\n \"url\": \"assets/006-animation-svg.html-JwE1dpsg.js\",\n \"revision\": \"f9fd1c2ad33122f0cc1914bc38cf07fd\"\n },\n {\n \"url\": \"assets/006-background-border.html-pQQrVWCp.js\",\n \"revision\": \"7971e1cb91951bed5d535c02630b6ac7\"\n },\n {\n \"url\": \"assets/006-HTTPS-overview.html-dTO_M_73.js\",\n \"revision\": \"e7872511cd82237e228f994b934c9a3b\"\n },\n {\n \"url\": \"assets/006-react-server-component.html-R-ash7ca.js\",\n \"revision\": \"35ce60ca8c115b4e4d14a943d66893a5\"\n },\n {\n \"url\": \"assets/006-semantically-meaningful-tags.html-antLdR07.js\",\n \"revision\": \"4ae633baac9dcf84b40b800856415561\"\n },\n {\n \"url\": \"assets/006-toString-toLocalString-valueOf.html-chx5Y-eq.js\",\n \"revision\": \"93c6b2e8d3c225f2532d3308c2007ced\"\n },\n {\n \"url\": \"assets/006-webpack-vue.html-la6H1Wb9.js\",\n \"revision\": \"0d7d4cc74209d35f6c2296ebfbbf6c10\"\n },\n {\n \"url\": \"assets/007-basic-reference-type.html-ye_NfEZd.js\",\n \"revision\": \"c46fe1dd1dd65ef3d64023226e6b8c6e\"\n },\n {\n \"url\": \"assets/007-hydration-is-pure-overhead.html-SvnUqg0L.js\",\n \"revision\": \"757686fefcb27a7d3fc7a96742b34ba4\"\n },\n {\n \"url\": \"assets/007-media-tag.html-8v4cFuX3.js\",\n \"revision\": \"c1dd241c7b963c3fa126359914f0564a\"\n },\n {\n \"url\": \"assets/007-offline-export-in-highcharts.html-UrRUULFr.js\",\n \"revision\": \"d969e6973496d88065885579e286c618\"\n },\n {\n \"url\": \"assets/007-position.html-xnmzeXYe.js\",\n \"revision\": \"cc6f70c4c7670a281de9aa3ff1c7b7ca\"\n },\n {\n \"url\": \"assets/007-TCP-three-handshakes-and-four-waves.html-DvEKPAYq.js\",\n \"revision\": \"936f5a188c1916e5b40ebbc4ae3bf8e8\"\n },\n {\n \"url\": \"assets/007-webpack-dev-server.html-UoW4CmYC.js\",\n \"revision\": \"4ac062752d07018982244dec9361bf3b\"\n },\n {\n \"url\": \"assets/008-canvas-svg.html-Afq3qZFA.js\",\n \"revision\": \"0a3372fdf685228583b7557d575550d7\"\n },\n {\n \"url\": \"assets/008-collection-reference-type.html-aot29-MR.js\",\n \"revision\": \"49fc1123cbeee7541ab62dbd4dc92312\"\n },\n {\n \"url\": \"assets/008-float.html-cC7j6Fly.js\",\n \"revision\": \"7c7e75d7f715d61699e7ab47f6ecf4ac\"\n },\n {\n \"url\": \"assets/008-tcp-udp.html-JhmI5mFu.js\",\n \"revision\": \"6147a7e723c3ead4f78f9173c356f851\"\n },\n {\n \"url\": \"assets/008-webpack-resolve.html-Iqw5UzOE.js\",\n \"revision\": \"bf7fefe6be3ff66df13d5b0361d47c8e\"\n },\n {\n \"url\": \"assets/009-array-like-object.html-3HK1Wx8D.js\",\n \"revision\": \"df43674cdcb156b74038f1b70618943c\"\n },\n {\n \"url\": \"assets/009-flex.html-SyAmrX4g.js\",\n \"revision\": \"191ffd9e3b6751191fc53012ccda14a8\"\n },\n {\n \"url\": \"assets/009-http-code-when-authorized-refused.html-wOR2ePmW.js\",\n \"revision\": \"98e19fbeb4b6a76277dc53f1ffe57f68\"\n },\n {\n \"url\": \"assets/009-src-vs-href.html-R_B9c0oQ.js\",\n \"revision\": \"12bc2a1c28abf93f830c5b2c2787d891\"\n },\n {\n \"url\": \"assets/009-webpack-env-split.html-4VesWHbQ.js\",\n \"revision\": \"25c25f22b0c8789b7578cd2c9ae083fd\"\n },\n {\n \"url\": \"assets/01-a-pragmatic-philosophy.html-nlUzlsGE.js\",\n \"revision\": \"9366d7b927b21d434add633a0eb047d2\"\n },\n {\n \"url\": \"assets/01-array.html-eSTvuSoN.js\",\n \"revision\": \"5470a0d35594a0fd66ed2af855fe1a0f\"\n },\n {\n \"url\": \"assets/01-command-pattern.html-sJvJ55xh.js\",\n \"revision\": \"47a618681125a125c56e46cddba526f8\"\n },\n {\n \"url\": \"assets/01-getting-started.html-BoyDoh_2.js\",\n \"revision\": \"a2e51e3568c20f5366239a220ae064c3\"\n },\n {\n \"url\": \"assets/01-getting-started.html-XlgIMo6A.js\",\n \"revision\": \"ea2e603ab34612d4a314f049291f519a\"\n },\n {\n \"url\": \"assets/01-how-browser-rendering-works.html-yfqVgOrF.js\",\n \"revision\": \"182a6d874b2410114926342ab57ba256\"\n },\n {\n \"url\": \"assets/01-init.html-ecnfoh5n.js\",\n \"revision\": \"641761a1ea8a37b0f4503996ff1ed800\"\n },\n {\n \"url\": \"assets/01-maven.html-F0K_vhBd.js\",\n \"revision\": \"a197c068299800f002a4fc10f25d381e\"\n },\n {\n \"url\": \"assets/01-overview-architecture.html-pqHY5Qm9.js\",\n \"revision\": \"12d59ed525dc26495895f42359074129\"\n },\n {\n \"url\": \"assets/01-pages-layouts.html-tbsDBwEp.js\",\n \"revision\": \"dc16fd78790d78e34492ef9984b4f78f\"\n },\n {\n \"url\": \"assets/01-quick-start.html-1kCTwmGo.js\",\n \"revision\": \"e5dbb68bf7ac9e330ac7259d44a4a947\"\n },\n {\n \"url\": \"assets/01-quick-start.html-cNfJxtYv.js\",\n \"revision\": \"c6c2ff8fa0912c89ef807ccca530eb59\"\n },\n {\n \"url\": \"assets/01-useState.html-jaIUYZlb.js\",\n \"revision\": \"391208c51a4650e277ebfddded3f884c\"\n },\n {\n \"url\": \"assets/01、父子组件通信.html-Ur3YppQN.js\",\n \"revision\": \"199f341f27110a182a588d695047fdcc\"\n },\n {\n \"url\": \"assets/01.vuepress-plugin-ordered-header.html-G4Pomedj.js\",\n \"revision\": \"13907947d51a0b4b66cf238ad01b5d1e\"\n },\n {\n \"url\": \"assets/010-antd-textarea-placeholder-pre-line.html-dyz4BBJw.js\",\n \"revision\": \"fc3c72e56755d0d23cfe43557ecd85bb\"\n },\n {\n \"url\": \"assets/010-html5.html-ov7DEVBH.js\",\n \"revision\": \"28c7bc6565e6317b9076c3aa6da89098\"\n },\n {\n \"url\": \"assets/010-object-property.html-4o3XoTEX.js\",\n \"revision\": \"b53344239e9d23ef69b454b864eda371\"\n },\n {\n \"url\": \"assets/010-unit.html-Mmr-V3cT.js\",\n \"revision\": \"57a9b2eeff01745789db6df546301346\"\n },\n {\n \"url\": \"assets/011-center.html-C5Xit3Oi.js\",\n \"revision\": \"07e301627151a7bb070003efcd7a2e1f\"\n },\n {\n \"url\": \"assets/011-create-object.html-R-m-KNNj.js\",\n \"revision\": \"583ba010705ea0204300863ac279bf78\"\n },\n {\n \"url\": \"assets/011-defer-vs-async.html-VM1cIXwT.js\",\n \"revision\": \"6e97bbecd746bb07091f85a9a9d60e63\"\n },\n {\n \"url\": \"assets/012-extends.html-oILfr47G.js\",\n \"revision\": \"27b9c950404ccc797b3d60c8776c964b\"\n },\n {\n \"url\": \"assets/012-form-validation.html-5UKN3JjB.js\",\n \"revision\": \"b85c8822a64474cd5c8f794a5fb29e94\"\n },\n {\n \"url\": \"assets/012-grid.html-3XqGR-dj.js\",\n \"revision\": \"3630ba6a2e824b130ea3745107ae68cd\"\n },\n {\n \"url\": \"assets/013-BFC.html-oRnppy7q.js\",\n \"revision\": \"c1f5ffac486f93ef541b33e176bc6576\"\n },\n {\n \"url\": \"assets/013-class.html-IiH58Ic4.js\",\n \"revision\": \"220da5fed0d8b2c68fb594ae7d768978\"\n },\n {\n \"url\": \"assets/013-seo.html-iv5Q82Xp.js\",\n \"revision\": \"b4deae7b3c779d8e25e87c97db3d4105\"\n },\n {\n \"url\": \"assets/014-implement-new.html-sKoB2ySS.js\",\n \"revision\": \"f915faa526153b2d79f2f5b445b73d79\"\n },\n {\n \"url\": \"assets/014-responsive-design-intro.html-iPsvIRFt.js\",\n \"revision\": \"6dbc51ae0fe45dc8a47c268d7167ad6c\"\n },\n {\n \"url\": \"assets/015-auto-change-node.html-a3AMX6nS.js\",\n \"revision\": \"686b50bde4f60a412a8979597a4759d8\"\n },\n {\n \"url\": \"assets/015-function.html-lE3ghf05.js\",\n \"revision\": \"ae869a031da3cd3d922e06fe87434788\"\n },\n {\n \"url\": \"assets/015-responsive-design.html-4WzXXkGD.js\",\n \"revision\": \"714dd3cb1fa0fd353631b797f445e4b6\"\n },\n {\n \"url\": \"assets/016-how-to-responsive.html-M9Iwp3xZ.js\",\n \"revision\": \"b0d80a6e79b703738ce87846b15eb6aa\"\n },\n {\n \"url\": \"assets/016-rest-client-error.html-p-eY-lWi.js\",\n \"revision\": \"33df1f52fd15863e4f8f5c1ba8f34b61\"\n },\n {\n \"url\": \"assets/016-this.html-BWOVpThp.js\",\n \"revision\": \"8567cefe930cc94f69d6269e3157b334\"\n },\n {\n \"url\": \"assets/017-implement-call-apply-bind.html-pF9-IIfp.js\",\n \"revision\": \"fb5ef29e14534223046897477ea1ea2b\"\n },\n {\n \"url\": \"assets/017-loading-spinner.html-NrAgtaAG.js\",\n \"revision\": \"0b3ffacef4a20659d1d185801b2a5881\"\n },\n {\n \"url\": \"assets/017-whistle-debug-real-phone.html-cdCQQvjc.js\",\n \"revision\": \"299633f41cc9cc0246a8e7ddee69f9cb\"\n },\n {\n \"url\": \"assets/018-autofill.html-d9_0qC3m.js\",\n \"revision\": \"8b1686142194713fc84123f76c7dfe4c\"\n },\n {\n \"url\": \"assets/018-monaco-editor-react.html-_kPxgArL.js\",\n \"revision\": \"f5cc171d4bd2c5104122666fdaf4bf9f\"\n },\n {\n \"url\": \"assets/019-ios-prevent-touch.html-WrR4-Zb-.js\",\n \"revision\": \"bc1a071dbb23cf1dee328341f455077d\"\n },\n {\n \"url\": \"assets/02-a-pragmatic-approach.html-6wOj4UWX.js\",\n \"revision\": \"5f0220e07f8e1ce86e024fcc86551d11\"\n },\n {\n \"url\": \"assets/02-architecture-overview.html-8ZZdthIG.js\",\n \"revision\": \"33ca1964c7c9eb87eb88b0f57b096c87\"\n },\n {\n \"url\": \"assets/02-express.js.html-pkHCz992.js\",\n \"revision\": \"ad93b2c32b37b814edccb3b02a552ffa\"\n },\n {\n \"url\": \"assets/02-factory-pattern.html-XSFhUFpy.js\",\n \"revision\": \"7b5060cc7f7d68e8b190b029a4382a6b\"\n },\n {\n \"url\": \"assets/02-git-basics.html-uhff1ajs.js\",\n \"revision\": \"de0436c06e57964fd38e0b4e99c4271a\"\n },\n {\n \"url\": \"assets/02-server.html-nDPPJ1I0.js\",\n \"revision\": \"19912abf474e2b7fd79c9363a3360b35\"\n },\n {\n \"url\": \"assets/02-style-props.html-KG0Fp9UW.js\",\n \"revision\": \"3d62625318dfaa20b1140126244bad75\"\n },\n {\n \"url\": \"assets/02-useEffect.html-3NUC6b79.js\",\n \"revision\": \"22eeeeb711834e5a548a5160316fcc72\"\n },\n {\n \"url\": \"assets/02-V8.html-IZr6VCnt.js\",\n \"revision\": \"891b0fcf05fa324a786b2026cdc25de1\"\n },\n {\n \"url\": \"assets/02、provide-inject.html-OTYzp_vx.js\",\n \"revision\": \"75d2f43547c9676c811ab579e590c23d\"\n },\n {\n \"url\": \"assets/02、Vuex 原理.html-NnrN3jKK.js\",\n \"revision\": \"783f0509d2ee3d9048ff293c4b756c46\"\n },\n {\n \"url\": \"assets/020-ios-img.html-XvCdcFCF.js\",\n \"revision\": \"e746ec591d2dff696336006f288667b8\"\n },\n {\n \"url\": \"assets/03-basic-tool.html-5ZYgKkhx.js\",\n \"revision\": \"2e8c0d705e063f5688b3f4ca8b2b60c0\"\n },\n {\n \"url\": \"assets/03-database.html-iZ8Pz1RB.js\",\n \"revision\": \"27f80897ff263470d9a01338552c49fd\"\n },\n {\n \"url\": \"assets/03-flyweight-pattern.html-8q_3lsgm.js\",\n \"revision\": \"2e433705522b79ed31ed9c955f68538e\"\n },\n {\n \"url\": \"assets/03-git-branch.html-X-MvpUVr.js\",\n \"revision\": \"61e17abcb6fdc9386a95ec86dc9a797e\"\n },\n {\n \"url\": \"assets/03-memory-management.html-1tFtncAW.js\",\n \"revision\": \"0413b44c2c5462572ba814cda1467598\"\n },\n {\n \"url\": \"assets/03-render-loop.html-qGaAgyJD.js\",\n \"revision\": \"0844f992e3fe88884c58cf95cce244cc\"\n },\n {\n \"url\": \"assets/03、插槽.html-IZ-NFkUC.js\",\n \"revision\": \"34c9d01b0bf82d37c76737f2846cc225\"\n },\n {\n \"url\": \"assets/04-api.html-pkUj-_Sw.js\",\n \"revision\": \"3bed3cc6f3cbdc13a20fc510c629edb7\"\n },\n {\n \"url\": \"assets/04-cross-domain.html-SnbAooaC.js\",\n \"revision\": \"139013a9d945990a9a1338a7d2436b9d\"\n },\n {\n \"url\": \"assets/04-git-server.html-saxeUmXQ.js\",\n \"revision\": \"94f9f9ac74085d06c3b77d3ca71f63ad\"\n },\n {\n \"url\": \"assets/04-mediator-pattern.html-P4FmQ5sb.js\",\n \"revision\": \"1fe6495ffce54d25c334209b75a7539b\"\n },\n {\n \"url\": \"assets/04-pragmatic-paranoid.html-XFMDx0LS.js\",\n \"revision\": \"a672348e980626e173eb4f1465bcd073\"\n },\n {\n \"url\": \"assets/04-scene-graph.html-yMu1RW29.js\",\n \"revision\": \"7b783809c97f6227240c0acc8914f251\"\n },\n {\n \"url\": \"assets/04、动态组件和异步组件.html-xMkS9nHj.js\",\n \"revision\": \"d9c55ef6c6a31d5242535a6092a23fb6\"\n },\n {\n \"url\": \"assets/05-middleware-pattern.html-wkcOGRem.js\",\n \"revision\": \"5dfc8fa7bb73fa5217bfe92c8486c392\"\n },\n {\n \"url\": \"assets/05-what-happens-after-entering-the-URL.html-k-e2Q0RE.js\",\n \"revision\": \"ea1988f331a25d6e007610b9e13dd9e8\"\n },\n {\n \"url\": \"assets/05-work-around.html-AZ__xLsT.js\",\n \"revision\": \"ac6d69e1010f49a11dadbdf48281cddd\"\n },\n {\n \"url\": \"assets/05、组件的v-model.html-hymI2g5O.js\",\n \"revision\": \"728ade60c6141ef3990225702abe8526\"\n },\n {\n \"url\": \"assets/06-change-commit.html-rZc35dXJ.js\",\n \"revision\": \"a9dfa865c3b60f1f99ed8b4ce175c404\"\n },\n {\n \"url\": \"assets/06-concurrent.html-R5x_sgEh.js\",\n \"revision\": \"d1dd62336c42a27023cee595743e10e8\"\n },\n {\n \"url\": \"assets/06、Mixin.html-LXvYo5XJ.js\",\n \"revision\": \"a50eb4e1282839bf2ef2faa8c2509c32\"\n },\n {\n \"url\": \"assets/07-when-coding.html-VHzO1FuP.js\",\n \"revision\": \"0eb7fa583afe2b57b6a537f0054a3efe\"\n },\n {\n \"url\": \"assets/07、组合式API基础.html-fzqdzynD.js\",\n \"revision\": \"a1fb68d5c7baf2ae3a7d350e128d3c8b\"\n },\n {\n \"url\": \"assets/08-before-start-project.html-RLsfigWB.js\",\n \"revision\": \"4e37870aed41c5dd0c78162d0221b607\"\n },\n {\n \"url\": \"assets/08、组合式函数.html-I7pt9eZc.js\",\n \"revision\": \"8a4d93a4a18376df6c97c81487f3ce2b\"\n },\n {\n \"url\": \"assets/09-pragmatic-project.html-PVXGEU7u.js\",\n \"revision\": \"d5744f64dfef57696ae950d6ea99c55b\"\n },\n {\n \"url\": \"assets/09、指令.html-z9tsn97x.js\",\n \"revision\": \"3dd86004eb5060a68652aa688b020fbb\"\n },\n {\n \"url\": \"assets/10、插件.html-oMYOdKlX.js\",\n \"revision\": \"89e499e72cd68f6220285bc2b4e03e08\"\n },\n {\n \"url\": \"assets/2023.html-t3q06end.js\",\n \"revision\": \"e95ee3022d025f7b84b10475efa9cb7b\"\n },\n {\n \"url\": \"assets/2024.html-dchrgZ6a.js\",\n \"revision\": \"b83ecebe6b8478ff19a621eb98486d4f\"\n },\n {\n \"url\": \"assets/404.html-uIvc4tSN.js\",\n \"revision\": \"f4fd96513f8e6104f4c48ae06e68b7fb\"\n },\n {\n \"url\": \"assets/app-2R243if7.js\",\n \"revision\": \"55e3fae7752ccbece086024730b908e0\"\n },\n {\n \"url\": \"assets/arc-FolFS303.js\",\n \"revision\": \"7e9e8db68e724497d12af030b096ba6f\"\n },\n {\n \"url\": \"assets/array-Nw74a44z.js\",\n \"revision\": \"17dcebeaf673b09a1ca5da014d20022f\"\n },\n {\n \"url\": \"assets/auto-XYC5A0Ix.js\",\n \"revision\": \"786b1aef9a90923f3aa3bab127b99c2c\"\n },\n {\n \"url\": \"assets/blockDiagram-6b2b5046-VcrT_T_C.js\",\n \"revision\": \"02f5b95c5feb9e206ce1dcf109f4916e\"\n },\n {\n \"url\": \"assets/c4Diagram-b947cdbb-g3DAk4Ib.js\",\n \"revision\": \"278e49350b0a017839840fbb9d755572\"\n },\n {\n \"url\": \"assets/channel-E06Uohc9.js\",\n \"revision\": \"c9cab79528a85130a906e3505c7a9f92\"\n },\n {\n \"url\": \"assets/classDiagram-35230388-D24NGFi-.js\",\n \"revision\": \"5ee2e8cddfd4769187038d8c9596d741\"\n },\n {\n \"url\": \"assets/classDiagram-v2-412acd34-MgRZZr-Z.js\",\n \"revision\": \"ae160bd263d85a36caa4e28bf950dcf0\"\n },\n {\n \"url\": \"assets/clone-hs9N3Qmu.js\",\n \"revision\": \"12dcbd08da1a81ac851e50f61bf64631\"\n },\n {\n \"url\": \"assets/codemirror-editor-GJMQnzmw.js\",\n \"revision\": \"fc3f4abcdc6c2e0e44313ebe78d609a0\"\n },\n {\n \"url\": \"assets/createText-423428c9-JBHtRGoK.js\",\n \"revision\": \"987ab7b82c9606c6da73bce4e1dd2c39\"\n },\n {\n \"url\": \"assets/docsearch-w40geAFS.js\",\n \"revision\": \"68b329da9893e34099c7d8ad5cb9c940\"\n },\n {\n \"url\": \"assets/edges-d417c7a0-uTLZ61Cj.js\",\n \"revision\": \"2d4c761c0b250c900d7eec61bef8b04e\"\n },\n {\n \"url\": \"assets/erDiagram-0ea73325-O1f0-Gcb.js\",\n \"revision\": \"88927584f0100cbc3e1330a8029f7877\"\n },\n {\n \"url\": \"assets/flowchart-elk-definition-27cc417a-gvB_jGnE.js\",\n \"revision\": \"109f9a45e0967791123cdaea2ba94afe\"\n },\n {\n \"url\": \"assets/flowchart-tiWkQJPF.js\",\n \"revision\": \"22ae562fadded7c906d7297d1f7c64f0\"\n },\n {\n \"url\": \"assets/flowDb-d35e309a-d79xoTHo.js\",\n \"revision\": \"001b301299f2e3225be77f8af218713e\"\n },\n {\n \"url\": \"assets/flowDiagram-d949d7c1-9DQ3Nn7L.js\",\n \"revision\": \"0f26ad93fd0470351384fca7a906ad98\"\n },\n {\n \"url\": \"assets/flowDiagram-v2-49332944-jpRhKRK7.js\",\n \"revision\": \"964eb067b41fc42b9030a0372ad7ad97\"\n },\n {\n \"url\": \"assets/ganttDiagram-5c869e3b-7C6Fd_5I.js\",\n \"revision\": \"f4ceafe1fadc14c6e8a18abbc7017a43\"\n },\n {\n \"url\": \"assets/giscus-hHrgKA30.js\",\n \"revision\": \"dae7c2db562e417dc4bde3be5134780b\"\n },\n {\n \"url\": \"assets/gitGraphDiagram-b9d81de9-pTfZTwrI.js\",\n \"revision\": \"7fe6aa0ce9e93d7f90cb7fe1f595fa2e\"\n },\n {\n \"url\": \"assets/graph-vDJi9agi.js\",\n \"revision\": \"0cc6b025219daccf2351708201fc1cf9\"\n },\n {\n \"url\": \"assets/highlight.esm-qL7kkCul.js\",\n \"revision\": \"62b5f024c0d2737c1370675313dc2efe\"\n },\n {\n \"url\": \"assets/index-7IwC0DkA.js\",\n \"revision\": \"a0a6a74537488342822dc33151252ce7\"\n },\n {\n \"url\": \"assets/index-7SG8bi1h.js\",\n \"revision\": \"46a193641571106d3b7b43f9bc2a2735\"\n },\n {\n \"url\": \"assets/index-8fae9850-mHY5htT3.js\",\n \"revision\": \"7ca76a296f91bd286306191c71061637\"\n },\n {\n \"url\": \"assets/index-QOy62Fup.js\",\n \"revision\": \"fa112b5cda5ee3c969c504c6a3080b4c\"\n },\n {\n \"url\": \"assets/index.html-_5kjpK31.js\",\n \"revision\": \"8fdde7e741b250675d0e0f10a51bba87\"\n },\n {\n \"url\": \"assets/index.html-_qN0xDFh.js\",\n \"revision\": \"6b42f76f655a86d91154fa06a5df73b2\"\n },\n {\n \"url\": \"assets/index.html--FWk7Vul.js\",\n \"revision\": \"1f36dc9a17eea6ddaefa1dfa07c00b36\"\n },\n {\n \"url\": \"assets/index.html--GC_rvs-.js\",\n \"revision\": \"dc42c98f1612ad4b6da55d2aae1f2be3\"\n },\n {\n \"url\": \"assets/index.html--pdyXLPg.js\",\n \"revision\": \"acf808f2a9b7c674c931de1b5ffd12ee\"\n },\n {\n \"url\": \"assets/index.html--rq-pZBd.js\",\n \"revision\": \"4deb2b76dc7345967542cb4dd6c3fd5e\"\n },\n {\n \"url\": \"assets/index.html-0DpfjzBl.js\",\n \"revision\": \"a24c7fba4c036e38d7373eb1bb7b0844\"\n },\n {\n \"url\": \"assets/index.html-0pMmJO2f.js\",\n \"revision\": \"5c416a44fad48166d69b343888f8ea50\"\n },\n {\n \"url\": \"assets/index.html-0st9ukgV.js\",\n \"revision\": \"c25982bc3999115dc309f12a796055c5\"\n },\n {\n \"url\": \"assets/index.html-14cCgwtd.js\",\n \"revision\": \"2dd990d4af0c0dcc433babcb0a8bbcbe\"\n },\n {\n \"url\": \"assets/index.html-1nC4QyoR.js\",\n \"revision\": \"85a6364e209298e2e2e6b666f80bd21e\"\n },\n {\n \"url\": \"assets/index.html-1qS3_eHk.js\",\n \"revision\": \"736cbbc42d81314a653e11845065c255\"\n },\n {\n \"url\": \"assets/index.html-1wIIZvk4.js\",\n \"revision\": \"31eb734ed7b629639e920a5729d44a26\"\n },\n {\n \"url\": \"assets/index.html-24M_Uygr.js\",\n \"revision\": \"b21a0239072cbfbac35a861c7dd5af7d\"\n },\n {\n \"url\": \"assets/index.html-2DwvSX-3.js\",\n \"revision\": \"862603d63e2d169c910e7d52f16beb8b\"\n },\n {\n \"url\": \"assets/index.html-2XB4vSRh.js\",\n \"revision\": \"898ae423ffbb7066038ad60fbf19f255\"\n },\n {\n \"url\": \"assets/index.html-2XYbmDKB.js\",\n \"revision\": \"867ad5b2b3ada8a02a58846891660177\"\n },\n {\n \"url\": \"assets/index.html-2ZEvTyqm.js\",\n \"revision\": \"c26d85ed900f55c6c348db066a0ff1be\"\n },\n {\n \"url\": \"assets/index.html-38UUtIUW.js\",\n \"revision\": \"80bad5d4ca42d5f9bd23b390131fe58b\"\n },\n {\n \"url\": \"assets/index.html-3CUydp4K.js\",\n \"revision\": \"dd5b325e0a4fe3e12843f81ad9690db4\"\n },\n {\n \"url\": \"assets/index.html-3ImxJlYz.js\",\n \"revision\": \"4740759f70a7acf70245d7326c51b233\"\n },\n {\n \"url\": \"assets/index.html-48RqkH9L.js\",\n \"revision\": \"e95e1dbbf2698a578dcdd86f8b16de36\"\n },\n {\n \"url\": \"assets/index.html-4CQRZNtv.js\",\n \"revision\": \"3ad4f1ae64134d91a0fd816bdfac3dd0\"\n },\n {\n \"url\": \"assets/index.html-4IHlJjCx.js\",\n \"revision\": \"9d320d7d21ef8a5ddedcfefc0334f164\"\n },\n {\n \"url\": \"assets/index.html-4QfykMhJ.js\",\n \"revision\": \"1e82587ae488cf0e5f4bb0be01a45675\"\n },\n {\n \"url\": \"assets/index.html-4t0YWChX.js\",\n \"revision\": \"a61a03762476a486ecc5cca633e8a96b\"\n },\n {\n \"url\": \"assets/index.html-4T6lwsm_.js\",\n \"revision\": \"1a2ff80b387d52251553f413dfdd554f\"\n },\n {\n \"url\": \"assets/index.html-515f-G8L.js\",\n \"revision\": \"198a087a47e34c90bf2e212ca348ddd6\"\n },\n {\n \"url\": \"assets/index.html-5emhMzoK.js\",\n \"revision\": \"022955be2b20edf73e426354af5d8a1a\"\n },\n {\n \"url\": \"assets/index.html-5H3zUw48.js\",\n \"revision\": \"ad6f84cd91b2e420d181bb86faf05033\"\n },\n {\n \"url\": \"assets/index.html-5XHgOxjy.js\",\n \"revision\": \"85823e3965bb5b25fab782bf454aefe1\"\n },\n {\n \"url\": \"assets/index.html-6e8qEoMy.js\",\n \"revision\": \"1d88210f05297657ccd2dde6f8ea75a7\"\n },\n {\n \"url\": \"assets/index.html-6LZc6Qgc.js\",\n \"revision\": \"9e914d8f791d630beefcf5d52c56cd21\"\n },\n {\n \"url\": \"assets/index.html-6nX5abh5.js\",\n \"revision\": \"b218623bc6b14b4d032f35812b5d210e\"\n },\n {\n \"url\": \"assets/index.html-6PkFsrKl.js\",\n \"revision\": \"163f829591223c2beb3671a490bbbe17\"\n },\n {\n \"url\": \"assets/index.html-6Pq7OcfA.js\",\n \"revision\": \"20078cfde2e04a254b571c60d14e70fc\"\n },\n {\n \"url\": \"assets/index.html-6PZm1DnQ.js\",\n \"revision\": \"c8124b90d71802265a36cac0c46a6966\"\n },\n {\n \"url\": \"assets/index.html-6QOAi_wy.js\",\n \"revision\": \"dcb54d6bc75dca1922e70b7fc84c1f85\"\n },\n {\n \"url\": \"assets/index.html-6z6s2ocp.js\",\n \"revision\": \"cde61251acd9242bf0ef1350092a0faa\"\n },\n {\n \"url\": \"assets/index.html-7J1SFePC.js\",\n \"revision\": \"aedb50d291f316c58353408460cb0164\"\n },\n {\n \"url\": \"assets/index.html-7kHbRdSg.js\",\n \"revision\": \"34dead9b6e069b7cab7a8dfeb5d9fdbb\"\n },\n {\n \"url\": \"assets/index.html-7pQDueGH.js\",\n \"revision\": \"93a7d59f1de18316edc901af9fda66ca\"\n },\n {\n \"url\": \"assets/index.html-7xhgW9hM.js\",\n \"revision\": \"42cb1efb3751c9709d9e90a497b76ac6\"\n },\n {\n \"url\": \"assets/index.html-8ChHX9NB.js\",\n \"revision\": \"1c97bf44f66cf8dd4889d31cf69a07a3\"\n },\n {\n \"url\": \"assets/index.html-8HQ8FKg-.js\",\n \"revision\": \"8330748c37102920037bfe1224977902\"\n },\n {\n \"url\": \"assets/index.html-8QoYgqEV.js\",\n \"revision\": \"0278694c7c2c89a09558042bfc61534f\"\n },\n {\n \"url\": \"assets/index.html-8TNIbXKM.js\",\n \"revision\": \"b45af93fafb3592d4d624fb8265e2177\"\n },\n {\n \"url\": \"assets/index.html-98hJQE1V.js\",\n \"revision\": \"0d51968ecfc4264a9013035d9df11044\"\n },\n {\n \"url\": \"assets/index.html-9AGhSKws.js\",\n \"revision\": \"8607696cf37121154fec61d91e8f3b1a\"\n },\n {\n \"url\": \"assets/index.html-9LWvYvJf.js\",\n \"revision\": \"5d12b00025396ea2e5018ced2fc00688\"\n },\n {\n \"url\": \"assets/index.html-agu9Tswz.js\",\n \"revision\": \"0fd0e04a54dbc88da2d1fa5db8c24d92\"\n },\n {\n \"url\": \"assets/index.html-aH_uGVqv.js\",\n \"revision\": \"246b97961d192bce61dbc4c0a706e45e\"\n },\n {\n \"url\": \"assets/index.html-B1fEnyTH.js\",\n \"revision\": \"8b11a2ea8dbb48aa410a8f1cdb4c5348\"\n },\n {\n \"url\": \"assets/index.html-BHYZ6wGh.js\",\n \"revision\": \"8e6a4d88b84f91a3c53b2d3e44981f09\"\n },\n {\n \"url\": \"assets/index.html-biNtxuVy.js\",\n \"revision\": \"08b944895a14adb28a28a49610578973\"\n },\n {\n \"url\": \"assets/index.html-bOd4CKkV.js\",\n \"revision\": \"3687be16d3c50e3f7993460d37ce5605\"\n },\n {\n \"url\": \"assets/index.html-BQ5qZrok.js\",\n \"revision\": \"3dd0fdf687f3d736c9a9f9d1f3756338\"\n },\n {\n \"url\": \"assets/index.html-c4rRs-NN.js\",\n \"revision\": \"668adab6088a8d820063170de59e2b23\"\n },\n {\n \"url\": \"assets/index.html-cbiocN7z.js\",\n \"revision\": \"fac560b8f07263955780212e74b2b0cb\"\n },\n {\n \"url\": \"assets/index.html-Ce5yMMMw.js\",\n \"revision\": \"bd8e64b591779eddb7041370531c3f5a\"\n },\n {\n \"url\": \"assets/index.html-CM4Qw_Xy.js\",\n \"revision\": \"56885374b9dfeffb3eda6bc5f1b4baf6\"\n },\n {\n \"url\": \"assets/index.html-cTdgF5uu.js\",\n \"revision\": \"c461fa5d9845d1c271b2d31d6f986d9b\"\n },\n {\n \"url\": \"assets/index.html-cTggcwJJ.js\",\n \"revision\": \"ebd54e4463251ce2d25e5836dc164232\"\n },\n {\n \"url\": \"assets/index.html-CU9BR9sP.js\",\n \"revision\": \"ea0f6894cb2f293e31aca6c6c77f5993\"\n },\n {\n \"url\": \"assets/index.html-cUv3aHhf.js\",\n \"revision\": \"14102e31b645146ae55e3abb71b5a9bb\"\n },\n {\n \"url\": \"assets/index.html-d38JKPow.js\",\n \"revision\": \"90f2da83f53fdf960fe6e6af96a07bd6\"\n },\n {\n \"url\": \"assets/index.html-D8NQd95K.js\",\n \"revision\": \"d576e3b22d2ae724dca00421f8947acf\"\n },\n {\n \"url\": \"assets/index.html-dcS37JKq.js\",\n \"revision\": \"486697e1540fc038f2c923681588431a\"\n },\n {\n \"url\": \"assets/index.html-dCuwV4c-.js\",\n \"revision\": \"cbf2371be44d91b58ebfc500c7a64f55\"\n },\n {\n \"url\": \"assets/index.html-DfbYiCSB.js\",\n \"revision\": \"79d43d99c4cd0438a8441ba64a240dc9\"\n },\n {\n \"url\": \"assets/index.html-DhX6vdce.js\",\n \"revision\": \"15ed403151fce8c8dd323aa25af4ba98\"\n },\n {\n \"url\": \"assets/index.html-DVInEGrY.js\",\n \"revision\": \"9e039a9d9aa533606f89bc2a494185c7\"\n },\n {\n \"url\": \"assets/index.html-E9q0BpxL.js\",\n \"revision\": \"80474bf46de06571ae7cb6757bb2d468\"\n },\n {\n \"url\": \"assets/index.html-eYHlm8Wt.js\",\n \"revision\": \"8ec1f76da1187481fa5abb8e597e5340\"\n },\n {\n \"url\": \"assets/index.html-Ez0b591v.js\",\n \"revision\": \"c3e8b69685e5c12a39ec561b3e116eb7\"\n },\n {\n \"url\": \"assets/index.html-fXiqRdON.js\",\n \"revision\": \"7231ca3cf6eb039644a05bffdde3ff1d\"\n },\n {\n \"url\": \"assets/index.html-FZuIpOY_.js\",\n \"revision\": \"c0202b34b0aed7903de95076995fe029\"\n },\n {\n \"url\": \"assets/index.html-g2XThmuH.js\",\n \"revision\": \"d6b2e434d8b44d301f272da3bccd34bd\"\n },\n {\n \"url\": \"assets/index.html-g8q3PkXX.js\",\n \"revision\": \"aed50a98e4bb37b75e98c6008ef0e8c4\"\n },\n {\n \"url\": \"assets/index.html-G90Ce1_P.js\",\n \"revision\": \"c09e5a9ea3dee6068849bb4a31781ff4\"\n },\n {\n \"url\": \"assets/index.html-GDKls1L1.js\",\n \"revision\": \"6149f7efd15559f54feec36b779cf45d\"\n },\n {\n \"url\": \"assets/index.html-ggqW-JQb.js\",\n \"revision\": \"0f0d6e327e71820244c8285623fd999b\"\n },\n {\n \"url\": \"assets/index.html-GL-fUBiv.js\",\n \"revision\": \"8f21ae43d90f6a8261901040018a98ab\"\n },\n {\n \"url\": \"assets/index.html-GPGqn-oS.js\",\n \"revision\": \"d040f8bd1610708596780706f0e23c79\"\n },\n {\n \"url\": \"assets/index.html-gQEDS16t.js\",\n \"revision\": \"41eef8d3ef2e56c39445bf9f70aadf13\"\n },\n {\n \"url\": \"assets/index.html-gUBfRxr2.js\",\n \"revision\": \"a096125133cb1e54c5210428282d794b\"\n },\n {\n \"url\": \"assets/index.html-h0Bglre2.js\",\n \"revision\": \"7ec98706b9e09b994abe27244bd024a8\"\n },\n {\n \"url\": \"assets/index.html-HIFvKPWZ.js\",\n \"revision\": \"e6d72b69e522365b907af39c5fb47ea8\"\n },\n {\n \"url\": \"assets/index.html-HOdxw-79.js\",\n \"revision\": \"60f31a3070509b0b1fb985f198569365\"\n },\n {\n \"url\": \"assets/index.html-hR7PYs57.js\",\n \"revision\": \"d83424b461c7dc276cbe705ea764e93b\"\n },\n {\n \"url\": \"assets/index.html-hU-axrvG.js\",\n \"revision\": \"7a48b2e397688b98f80c2648843f1c42\"\n },\n {\n \"url\": \"assets/index.html-ig41yThJ.js\",\n \"revision\": \"a7d22c02d5258b7d1acdd99d06b3eaa0\"\n },\n {\n \"url\": \"assets/index.html-IHiIz7ti.js\",\n \"revision\": \"856a67b3e0536d70e4d508120c2a70c5\"\n },\n {\n \"url\": \"assets/index.html-iOMix6mD.js\",\n \"revision\": \"12efb9b0191a5012412ef3060647a52c\"\n },\n {\n \"url\": \"assets/index.html-IwYPYSi0.js\",\n \"revision\": \"d3443b4ec85654b260761c31547831d4\"\n },\n {\n \"url\": \"assets/index.html-JS2QsVHb.js\",\n \"revision\": \"fd121690c46fb66cd13a6b5d4f1ec11b\"\n },\n {\n \"url\": \"assets/index.html-KBT_DBi1.js\",\n \"revision\": \"776fc3a6bd4389480bb524c4a059c12b\"\n },\n {\n \"url\": \"assets/index.html-KdTxVzQB.js\",\n \"revision\": \"c24d96befa79f50675a5d66f46bae3f4\"\n },\n {\n \"url\": \"assets/index.html-kKKFYoZo.js\",\n \"revision\": \"1661d24ae6f5b8c2a96883536383fd69\"\n },\n {\n \"url\": \"assets/index.html-KME69s3l.js\",\n \"revision\": \"d573549e3157fdeb8df5af8993ffe898\"\n },\n {\n \"url\": \"assets/index.html-kN-Nsdix.js\",\n \"revision\": \"bbb48e71698dd365aad5aa06a662032b\"\n },\n {\n \"url\": \"assets/index.html-kr7a12_R.js\",\n \"revision\": \"85474083242baa918d67733597a5b9e8\"\n },\n {\n \"url\": \"assets/index.html-KZiYdgNN.js\",\n \"revision\": \"5cf7e7eeee6c8bc5d07d7095d0905d1b\"\n },\n {\n \"url\": \"assets/index.html-L9JXX8_J.js\",\n \"revision\": \"fa33e09ddf676c28bc4cd7553ae32557\"\n },\n {\n \"url\": \"assets/index.html-LGd4fJ-7.js\",\n \"revision\": \"06e79cc58c6a90991975f6aff1af919c\"\n },\n {\n \"url\": \"assets/index.html-Lu-6iPu6.js\",\n \"revision\": \"071e23dc442dcccdd8974eba89526f7a\"\n },\n {\n \"url\": \"assets/index.html-luHOsFrI.js\",\n \"revision\": \"dddc75a2997e4962d9ec338ef1c1b046\"\n },\n {\n \"url\": \"assets/index.html-MCWjWsAw.js\",\n \"revision\": \"a52efa10a4623fac6dd6cec8b4b42e96\"\n },\n {\n \"url\": \"assets/index.html-mGdiLQP4.js\",\n \"revision\": \"03ca9d0e95cbba17b732f5f11edd2500\"\n },\n {\n \"url\": \"assets/index.html-MGEj_GPV.js\",\n \"revision\": \"e87add372505c9dd78a1e4eec2bc3cb2\"\n },\n {\n \"url\": \"assets/index.html-MJ0Gnn_F.js\",\n \"revision\": \"ed8b9579fa4f456b82a06c72db03f710\"\n },\n {\n \"url\": \"assets/index.html-moSu92Ti.js\",\n \"revision\": \"35e99eef718dfafdb48618397e6efb2b\"\n },\n {\n \"url\": \"assets/index.html-MtNsNwRx.js\",\n \"revision\": \"f78d8a9d62038ad5c17e4f1bd33d6593\"\n },\n {\n \"url\": \"assets/index.html-N_kW9YLo.js\",\n \"revision\": \"61105dc22e7c40b565b111bf40aa93d9\"\n },\n {\n \"url\": \"assets/index.html-n3UBXl_A.js\",\n \"revision\": \"781efaabe62ac6adb89e24ed23ceb91e\"\n },\n {\n \"url\": \"assets/index.html-n8R1JMtH.js\",\n \"revision\": \"abc5dd6f10a432cab4b95058c4f7bfb4\"\n },\n {\n \"url\": \"assets/index.html-NBSoPrCk.js\",\n \"revision\": \"501131a3ad6eee73d620fcd2060b20b9\"\n },\n {\n \"url\": \"assets/index.html-NcsXm3WC.js\",\n \"revision\": \"5c2b62d44fd03d497f7fa9625e6acb32\"\n },\n {\n \"url\": \"assets/index.html-nG6FSSk5.js\",\n \"revision\": \"84d7ee6aa7f6043c5cfa42f7404338b2\"\n },\n {\n \"url\": \"assets/index.html-nk-nrgVB.js\",\n \"revision\": \"99ecad797f3623423b84e86adbcf5547\"\n },\n {\n \"url\": \"assets/index.html-NQxrG0fz.js\",\n \"revision\": \"88f34d9e39c5c6d1073f027a2521ac99\"\n },\n {\n \"url\": \"assets/index.html-NR6J1WpB.js\",\n \"revision\": \"8cd084d0fcc88a77e0600249c7c2c080\"\n },\n {\n \"url\": \"assets/index.html-NsGWRbqf.js\",\n \"revision\": \"a154757a35ac44404b8ff550d45c7b75\"\n },\n {\n \"url\": \"assets/index.html-O2Nw6hi-.js\",\n \"revision\": \"3efa284ffcc4b4e628bccaaebe31e146\"\n },\n {\n \"url\": \"assets/index.html-o9wQA3cF.js\",\n \"revision\": \"42fb5aa4052ddc480c6eb370828293e0\"\n },\n {\n \"url\": \"assets/index.html-OD32esEy.js\",\n \"revision\": \"6bda2c23d2421969be220e4d435b8ada\"\n },\n {\n \"url\": \"assets/index.html-OeaCJOYD.js\",\n \"revision\": \"b18c598fd0d4a7f38424f43c25cfebe1\"\n },\n {\n \"url\": \"assets/index.html-omQNpfwb.js\",\n \"revision\": \"7b7ef1a9fd7008f344b2ea17bb6143ea\"\n },\n {\n \"url\": \"assets/index.html-ONSG8EPU.js\",\n \"revision\": \"a803e74b2c5b353051b0ecd8f56c55db\"\n },\n {\n \"url\": \"assets/index.html-OOLb7v7r.js\",\n \"revision\": \"451668cbed06071c94da16e018f0b4ad\"\n },\n {\n \"url\": \"assets/index.html-oSCTgMYF.js\",\n \"revision\": \"cd0c45c0a5abff0580e618dd92142ace\"\n },\n {\n \"url\": \"assets/index.html-OYEwVsMC.js\",\n \"revision\": \"fce210f7b784e3d3fb5ef3fc03164ab1\"\n },\n {\n \"url\": \"assets/index.html-P-GVqPkq.js\",\n \"revision\": \"32b90384f6b7ab1096b3b8d1aec0312e\"\n },\n {\n \"url\": \"assets/index.html-P0LXao83.js\",\n \"revision\": \"16cca56eb33a0c1646e2576423dc77f7\"\n },\n {\n \"url\": \"assets/index.html-p5Pg_qkt.js\",\n \"revision\": \"dc560c537e65924d79a8473f7705068c\"\n },\n {\n \"url\": \"assets/index.html-pbQnLiRI.js\",\n \"revision\": \"001070221da65b59c660d765cdbab4ff\"\n },\n {\n \"url\": \"assets/index.html-PD4FMCrk.js\",\n \"revision\": \"92dcb47cfcdc1e1f30ad75f7f1253c96\"\n },\n {\n \"url\": \"assets/index.html-pHT5J-DB.js\",\n \"revision\": \"cdef5fb648b1c9277a5bd91147ea48eb\"\n },\n {\n \"url\": \"assets/index.html-pOmA5x9t.js\",\n \"revision\": \"30e92183c7f9bb0cdc28d4d7703dae86\"\n },\n {\n \"url\": \"assets/index.html-pPFdIPqh.js\",\n \"revision\": \"b27ed965b626326ffa92ab58dce150d3\"\n },\n {\n \"url\": \"assets/index.html-PqQ0uo5u.js\",\n \"revision\": \"a83d81cee901696f081dcb5babe93d2f\"\n },\n {\n \"url\": \"assets/index.html-QjGLyWCs.js\",\n \"revision\": \"4a391a73fb4661854172af19bd44a9f6\"\n },\n {\n \"url\": \"assets/index.html-QkDQyo7Q.js\",\n \"revision\": \"6a3b77b32862815aafecbe2cb403061a\"\n },\n {\n \"url\": \"assets/index.html-qkR6G051.js\",\n \"revision\": \"d3162ee1fca43fd37403db9a0d767fce\"\n },\n {\n \"url\": \"assets/index.html-QsjQIX8R.js\",\n \"revision\": \"06dbcf7137d2cf00557f0fdc1ca47cf2\"\n },\n {\n \"url\": \"assets/index.html-QThOMSe4.js\",\n \"revision\": \"e1b0ca2161be6c1368cf400e7877f9a6\"\n },\n {\n \"url\": \"assets/index.html-qu3zlAs0.js\",\n \"revision\": \"3d3677b0b5f39888a6ba9c54cf853138\"\n },\n {\n \"url\": \"assets/index.html-qUwdIo1v.js\",\n \"revision\": \"df943ba530f5ecc88f59a1c4feb04dec\"\n },\n {\n \"url\": \"assets/index.html-r2UKxxc1.js\",\n \"revision\": \"7c09997ec4eb63288e3dad52493cf6d5\"\n },\n {\n \"url\": \"assets/index.html-R3RqRDu-.js\",\n \"revision\": \"5222b71fc7ad8302ca8e3e5d30a2ca0e\"\n },\n {\n \"url\": \"assets/index.html-RE83hP6O.js\",\n \"revision\": \"57d1df83ae8c20ef475c11ecfde21219\"\n },\n {\n \"url\": \"assets/index.html-ReqWpZHA.js\",\n \"revision\": \"ca0e6f45cf0092639e0b4a5da6dfe630\"\n },\n {\n \"url\": \"assets/index.html-rNq1W2Zl.js\",\n \"revision\": \"6476f9abdf21231ba2066d2b02beef13\"\n },\n {\n \"url\": \"assets/index.html-rr2e2a2C.js\",\n \"revision\": \"d00dfced59ee7e91e65d4da97c962a94\"\n },\n {\n \"url\": \"assets/index.html-RrGBfii6.js\",\n \"revision\": \"40f8077619643496fa8be89b27c9560e\"\n },\n {\n \"url\": \"assets/index.html-s9VJ5-1w.js\",\n \"revision\": \"cf1cf48a68bffc0a67100fb127786104\"\n },\n {\n \"url\": \"assets/index.html-saQ_y99N.js\",\n \"revision\": \"639d989cffcdb75c60db2810ceb6972c\"\n },\n {\n \"url\": \"assets/index.html-Se9AuWN3.js\",\n \"revision\": \"aa4f95411d81bddb5c93fd6203e64554\"\n },\n {\n \"url\": \"assets/index.html-shaRytHI.js\",\n \"revision\": \"3fd3b1aae184d672f75886d540faa139\"\n },\n {\n \"url\": \"assets/index.html-SjREii9h.js\",\n \"revision\": \"45d478c0912967d17077c52922330a4d\"\n },\n {\n \"url\": \"assets/index.html-SmPk6-es.js\",\n \"revision\": \"38a5158f4f82165b60521094822327a0\"\n },\n {\n \"url\": \"assets/index.html-SssOY4Zb.js\",\n \"revision\": \"b8096f09eb2b8a67402738dcb62b460e\"\n },\n {\n \"url\": \"assets/index.html-SuQyXgcv.js\",\n \"revision\": \"d7b7ac31c636a9902efd2c983e4d2d97\"\n },\n {\n \"url\": \"assets/index.html-tLYxd7rz.js\",\n \"revision\": \"0904b610354e467cb42091bfc5f02290\"\n },\n {\n \"url\": \"assets/index.html-TrCwWslF.js\",\n \"revision\": \"9fb3fc053cbc749734d525c47b93a23b\"\n },\n {\n \"url\": \"assets/index.html-UAdi2jtU.js\",\n \"revision\": \"bd9e7f480b590e2fdd1ffa618c018552\"\n },\n {\n \"url\": \"assets/index.html-UK93Vd89.js\",\n \"revision\": \"66ce47ca5a5386a37b25d584d9ec2d9c\"\n },\n {\n \"url\": \"assets/index.html-UOTgR6zC.js\",\n \"revision\": \"45a5ecbf01f6dbc3617f549640b0ba26\"\n },\n {\n \"url\": \"assets/index.html-UV9Smhks.js\",\n \"revision\": \"eae4a85564d23354f8a278a86ed036f0\"\n },\n {\n \"url\": \"assets/index.html-uY8tN_X4.js\",\n \"revision\": \"e10b7e8e8344fbbcddcc837ebb1c2d37\"\n },\n {\n \"url\": \"assets/index.html-UyhuCEdI.js\",\n \"revision\": \"b6bf42fb65d1ea6e75547707872b2289\"\n },\n {\n \"url\": \"assets/index.html-UZSmYhmx.js\",\n \"revision\": \"ab9007102ab1a41cd1205272726ab7cb\"\n },\n {\n \"url\": \"assets/index.html-vBNZ4m0L.js\",\n \"revision\": \"9d9a646f8e3afdfcd956c53f6e6389e1\"\n },\n {\n \"url\": \"assets/index.html-vCptjdB4.js\",\n \"revision\": \"11d16f09cfee5722a820a4c2cc65a3a1\"\n },\n {\n \"url\": \"assets/index.html-vCzwf0Sn.js\",\n \"revision\": \"65a439f4a7651b30d2f7a806a94a8212\"\n },\n {\n \"url\": \"assets/index.html-vf9G2sX7.js\",\n \"revision\": \"87adb4c0cadf2f47bc88d9172f345856\"\n },\n {\n \"url\": \"assets/index.html-VFFAf27P.js\",\n \"revision\": \"4225f875ed57cd08d84365c29a09d7fb\"\n },\n {\n \"url\": \"assets/index.html-vI6nL4gW.js\",\n \"revision\": \"a01b60de357c0fab9a3150bebac74480\"\n },\n {\n \"url\": \"assets/index.html-VMaWReow.js\",\n \"revision\": \"7a0b1729117554505f8b026a0563e4ff\"\n },\n {\n \"url\": \"assets/index.html-VqeFNyyk.js\",\n \"revision\": \"88207e9b4ddeb9eb2154ba8a6d973ffa\"\n },\n {\n \"url\": \"assets/index.html-VsrUWBLa.js\",\n \"revision\": \"ac17a4d862494203ad3f25f6d074e7b1\"\n },\n {\n \"url\": \"assets/index.html-VTuwfCCE.js\",\n \"revision\": \"e0ccc19e405c953d05c9f9bbde3cb6bb\"\n },\n {\n \"url\": \"assets/index.html-w49iT_oy.js\",\n \"revision\": \"f25590efb82e4a8f086ef9c9fecd11ca\"\n },\n {\n \"url\": \"assets/index.html-w8grGS9G.js\",\n \"revision\": \"7bf84dbff0c5b1208341e4b716d73d11\"\n },\n {\n \"url\": \"assets/index.html-wCyt5Bog.js\",\n \"revision\": \"3a4e13b3294f557317713a99837d3a9c\"\n },\n {\n \"url\": \"assets/index.html-wEmbbtzu.js\",\n \"revision\": \"92bf32e1090617f4a5ac651ecb58560d\"\n },\n {\n \"url\": \"assets/index.html-WGk49Tv5.js\",\n \"revision\": \"18e53d3cbd91c90d7e78d51081a64ea2\"\n },\n {\n \"url\": \"assets/index.html-WktSnXxw.js\",\n \"revision\": \"703d92f3b20e0b1e46b1f90c3f5cae3b\"\n },\n {\n \"url\": \"assets/index.html-Wr3ujhrK.js\",\n \"revision\": \"a39b32784217fc8945962d449c2fb766\"\n },\n {\n \"url\": \"assets/index.html-WUCyIDuT.js\",\n \"revision\": \"000dcae9e5bcb6edb85bfa318a78ccbf\"\n },\n {\n \"url\": \"assets/index.html-WXkd1m1L.js\",\n \"revision\": \"a0d256bbb8cc27cd39157df6be25eb20\"\n },\n {\n \"url\": \"assets/index.html-wYo71ybu.js\",\n \"revision\": \"d1b00b3a4f73d3cde32cd9f50e32493f\"\n },\n {\n \"url\": \"assets/index.html-wz0pq5zC.js\",\n \"revision\": \"17b0ab77269dc41a6730d1ffff60825b\"\n },\n {\n \"url\": \"assets/index.html-X759pPU_.js\",\n \"revision\": \"d511d19368c0866bc2b03689a4882119\"\n },\n {\n \"url\": \"assets/index.html-XAb12k43.js\",\n \"revision\": \"f6f38d646cb9e3ef39b1c9dde5a97025\"\n },\n {\n \"url\": \"assets/index.html-xfPlmwnO.js\",\n \"revision\": \"35c165aa499e748bbdf402f0376d8a27\"\n },\n {\n \"url\": \"assets/index.html-xgR8-wRj.js\",\n \"revision\": \"f71ddf1c0c50bd41ac54891a1131a99f\"\n },\n {\n \"url\": \"assets/index.html-xRFtv6mu.js\",\n \"revision\": \"68253e057409050f135fefc60f1540e5\"\n },\n {\n \"url\": \"assets/index.html-xS9JslX3.js\",\n \"revision\": \"f9978583bce5e2b7937ce7a7f397922d\"\n },\n {\n \"url\": \"assets/index.html-XZhO_x0W.js\",\n \"revision\": \"49f7bfd0b07223649f67df8b8bf95cac\"\n },\n {\n \"url\": \"assets/index.html-y_SxEoYa.js\",\n \"revision\": \"4d4d909f0950f8908990eb2d17e98600\"\n },\n {\n \"url\": \"assets/index.html-yAAtfPRA.js\",\n \"revision\": \"263e6aa56f10c827bdc4fb9abe19c764\"\n },\n {\n \"url\": \"assets/index.html-ybYFZQb-.js\",\n \"revision\": \"6161db77df0e61a8a2cefdeeef7d03d4\"\n },\n {\n \"url\": \"assets/index.html-YcjenteE.js\",\n \"revision\": \"7a05d88e87cfb466fb4feefad000b27f\"\n },\n {\n \"url\": \"assets/index.html-yMRZy3oz.js\",\n \"revision\": \"8b14593c0e7263b4ba54723836329c8c\"\n },\n {\n \"url\": \"assets/index.html-YpHE7Cx_.js\",\n \"revision\": \"fd647836248c41ff100c4db5958478f9\"\n },\n {\n \"url\": \"assets/index.html-yTMqUL6z.js\",\n \"revision\": \"fdb0f57827c3e321531123011af936f1\"\n },\n {\n \"url\": \"assets/index.html-yyvhfuS4.js\",\n \"revision\": \"c75fed971385f0bdfae5c0d5df380adb\"\n },\n {\n \"url\": \"assets/index.html-z0Rcj3zT.js\",\n \"revision\": \"1e6f450ab9f9b77f5bd764cf0e0b03d4\"\n },\n {\n \"url\": \"assets/index.html-z0YzqgrC.js\",\n \"revision\": \"7c8513b0e60ceb2c9b05f1fdb8646710\"\n },\n {\n \"url\": \"assets/index.html-ZaikQdSp.js\",\n \"revision\": \"4f929f5eb32132349ea3e75cde1c6545\"\n },\n {\n \"url\": \"assets/index.html-ZEfQwbxY.js\",\n \"revision\": \"15e8a3449cc2a799314fcc3e1da2fd15\"\n },\n {\n \"url\": \"assets/index.html-zHvTH7-y.js\",\n \"revision\": \"72ae82f1fa17587c369814fa5d4f03a5\"\n },\n {\n \"url\": \"assets/index.html-ZMuIpS6c.js\",\n \"revision\": \"53a822b6b78b2aa16e8569b66c30ab0a\"\n },\n {\n \"url\": \"assets/index.html-zNLvzmNu.js\",\n \"revision\": \"85f9c6a4b16975396c968a4ce6eaba80\"\n },\n {\n \"url\": \"assets/index.html-zWMKsbfL.js\",\n \"revision\": \"f123ea1f838e452d4c262e1786b14bb0\"\n },\n {\n \"url\": \"assets/infoDiagram-db7b18fc-dxX5pqOn.js\",\n \"revision\": \"4e5e6f29e8cb2668dbda5410330514b4\"\n },\n {\n \"url\": \"assets/init-Hi12RPRh.js\",\n \"revision\": \"3ce28180466443e9b617d7b96e9f7b8f\"\n },\n {\n \"url\": \"assets/intro.html-oX3Ek7N2.js\",\n \"revision\": \"924c97663e3cec3eb1899b2b6800dd84\"\n },\n {\n \"url\": \"assets/journeyDiagram-d5636530-d_UN-4yF.js\",\n \"revision\": \"d882c21438dc7fd463d5b6bf02ace04e\"\n },\n {\n \"url\": \"assets/KaTeX_AMS-Regular-0YIAJWTb.ttf\",\n \"revision\": \"56573229753fad48910bda2ea1a6dd54\"\n },\n {\n \"url\": \"assets/KaTeX_AMS-Regular-UIXRTGNW.woff2\",\n \"revision\": \"66c678209ce93b6e2b583f02ce41529e\"\n },\n {\n \"url\": \"assets/KaTeX_AMS-Regular-zJvWDgGp.woff\",\n \"revision\": \"10824af77e9961cfd548c8a458f10851\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Bold-6vyEfazt.woff2\",\n \"revision\": \"a9e9b0953b078cd40f5e19ef4face6fc\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Bold-AE18XbF9.ttf\",\n \"revision\": \"497bf407c4c609c6cf1f1ad38f437f7f\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Bold-RIlxi71x.woff\",\n \"revision\": \"de2ba279933d60f7819ff61f71c17bed\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Regular-4uo0fsfh.woff2\",\n \"revision\": \"08d95d99bf4a2b2dc7a876653857f154\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Regular-k0QPq0y-.woff\",\n \"revision\": \"a25140fbe6692bffe71a2ab861572eb3\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Regular-MF_e1AYw.ttf\",\n \"revision\": \"e6fb499fc8f9925eea3138cccba17fff\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Bold-bAz-dThZ.woff\",\n \"revision\": \"40934fc076960bb989d590db044fef62\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Bold-i-oP291Y.woff2\",\n \"revision\": \"796f3797cdf36fcaea18c3070a608378\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Bold-XZxETTVq.ttf\",\n \"revision\": \"b9d7c4497cab3702487214651ab03744\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Regular-8XXOHEfX.woff\",\n \"revision\": \"e435cda5784e21b26ab2d03fbcb56a99\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Regular-gf8Lq3rE.ttf\",\n \"revision\": \"97a699d83318e9334a0deaea6ae5eda2\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Regular-k2IhepQP.woff2\",\n \"revision\": \"f9e6a99f4a543b7d6cad1efb6cf1e4b1\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Bold-CZtwCMuf.woff\",\n \"revision\": \"4cdba6465ab9fac5d3833c6cdba7a8c3\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Bold-MGqDlVzd.ttf\",\n \"revision\": \"8e431f7ece346b6282dae3d9d0e7a970\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Bold-sffOiHVw.woff2\",\n \"revision\": \"a9382e25bcf75d856718fcef54d7acdb\"\n },\n {\n \"url\": \"assets/KaTeX_Main-BoldItalic-88TzJhul.ttf\",\n \"revision\": \"52fb39b0434c463d5df32419608ab08a\"\n },\n {\n \"url\": \"assets/KaTeX_Main-BoldItalic-8QydwDku.woff2\",\n \"revision\": \"d873734390c716d6e18ff3f71ac6eb8b\"\n },\n {\n \"url\": \"assets/KaTeX_Main-BoldItalic-EqUi0SPe.woff\",\n \"revision\": \"5f875f986a9bce1264e8c42417b56f74\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Italic-DVgO3ulm.woff2\",\n \"revision\": \"652970624cde999882102fa2b6a8871f\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Italic-N1npxqDf.ttf\",\n \"revision\": \"39349e0a2b366f38e2672b45aded2030\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Italic-TCzgZvdR.woff\",\n \"revision\": \"8ffd28f6390231548ead99d7835887fa\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Regular-6_eCWgYQ.woff\",\n \"revision\": \"f1cdb692ee31c10b37262caffced5271\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Regular-dtjb4qKe.woff2\",\n \"revision\": \"f8a7f19f45060f7a177314855b8c7aa3\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Regular-MqWbzbVV.ttf\",\n \"revision\": \"818582dae57e6fac46202cfd844afabb\"\n },\n {\n \"url\": \"assets/KaTeX_Math-BoldItalic-d10o37uD.ttf\",\n \"revision\": \"6589c4f1f587f73f0ad0af8ae35ccb53\"\n },\n {\n \"url\": \"assets/KaTeX_Math-BoldItalic-ImPtsMme.woff\",\n \"revision\": \"48155e43d9a284b54753e50e4ba586dc\"\n },\n {\n \"url\": \"assets/KaTeX_Math-BoldItalic-mZ7zbAmZ.woff2\",\n \"revision\": \"1320454d951ec809a7dbccb4f23fccf0\"\n },\n {\n \"url\": \"assets/KaTeX_Math-Italic-H5Tq_9FA.ttf\",\n \"revision\": \"fe5ed5875d95b18c98546cb4f47304ff\"\n },\n {\n \"url\": \"assets/KaTeX_Math-Italic-LedwBEzP.woff2\",\n \"revision\": \"d8b7a801bd87b324efcbae7394119c24\"\n },\n {\n \"url\": \"assets/KaTeX_Math-Italic-wNP_z16f.woff\",\n \"revision\": \"ed7aea12d765f9e2d0f9bc7fa2be626c\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Bold-2yISjogg.woff\",\n \"revision\": \"0e897d27f063facef504667290e408bd\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Bold-9bFEtBg9.woff2\",\n \"revision\": \"ad546b4719bcf690a3604944b90b7e42\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Bold-hTHqZ76u.ttf\",\n \"revision\": \"f2ac73121357210d91e5c3eaa42f72ea\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Italic-Azdo-3Wm.woff\",\n \"revision\": \"ef725de572b71381dccf53918e300744\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Italic-GGIydc0p.ttf\",\n \"revision\": \"f60b4a34842bb524b562df092917a542\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Italic-tx9FahgZ.woff2\",\n \"revision\": \"e934cbc86e2d59ceaf04102c43dc0b50\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Regular-kun6lKiW.woff\",\n \"revision\": \"5f8637ee731482c44a37789723f5e499\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Regular-TaO4USHJ.ttf\",\n \"revision\": \"3243452ee6817acd761c9757aef93c29\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Regular-wwQp5Se8.woff2\",\n \"revision\": \"1ac3ed6ebe34e473519ca1da86f7a384\"\n },\n {\n \"url\": \"assets/KaTeX_Script-Regular--ckFYqpa.woff\",\n \"revision\": \"a82fa2a7e18b8c7a1a9f6069844ebfb9\"\n },\n {\n \"url\": \"assets/KaTeX_Script-Regular-98CFnxev.woff2\",\n \"revision\": \"1b3161eb8cc67462d6e8c2fb96c68507\"\n },\n {\n \"url\": \"assets/KaTeX_Script-Regular-uSZBlqPg.ttf\",\n \"revision\": \"a189c37d73ffce63464635dc12cbbc96\"\n },\n {\n \"url\": \"assets/KaTeX_Size1-Regular-27J7nvyK.ttf\",\n \"revision\": \"0d8d9204004bdf126342605f7bbdffe6\"\n },\n {\n \"url\": \"assets/KaTeX_Size1-Regular-Jgg_JgPA.woff2\",\n \"revision\": \"82ef26dc680ba60d884e051c73d9a42d\"\n },\n {\n \"url\": \"assets/KaTeX_Size1-Regular-tfebZ-uE.woff\",\n \"revision\": \"4788ba5b6247e336f734b742fe9900d5\"\n },\n {\n \"url\": \"assets/KaTeX_Size2-Regular-8uHcfdJu.woff2\",\n \"revision\": \"95a1da914c20455a07b7c9e2dcf2836d\"\n },\n {\n \"url\": \"assets/KaTeX_Size2-Regular-e4ClFoQr.ttf\",\n \"revision\": \"1fdda0e59ed35495ebac28badf210574\"\n },\n {\n \"url\": \"assets/KaTeX_Size2-Regular-KA9bXP1N.woff\",\n \"revision\": \"b0628bfd27c979a09f702a2277979888\"\n },\n {\n \"url\": \"assets/KaTeX_Size3-Regular-4KV7NJM_.ttf\",\n \"revision\": \"963af864cbb10611ba33267ba7953777\"\n },\n {\n \"url\": \"assets/KaTeX_Size3-Regular-k6uTKqBB.woff\",\n \"revision\": \"4de844d4552e941f6b9c38837a8d487b\"\n },\n {\n \"url\": \"assets/KaTeX_Size4-Regular-1hQb9ONy.ttf\",\n \"revision\": \"27a23ee69999affa55491c7dab8e53bf\"\n },\n {\n \"url\": \"assets/KaTeX_Size4-Regular-5eZcWcVX.woff2\",\n \"revision\": \"61522cd3d9043622e235ab57762754f2\"\n },\n {\n \"url\": \"assets/KaTeX_Size4-Regular-RfuIJGSk.woff\",\n \"revision\": \"3045a61f722bc4b198450ce69b3e3824\"\n },\n {\n \"url\": \"assets/KaTeX_Typewriter-Regular-9yG-_x36.ttf\",\n \"revision\": \"6bf4287568e1d3004b54d5d60f9f08f9\"\n },\n {\n \"url\": \"assets/KaTeX_Typewriter-Regular-juq-IZ9c.woff2\",\n \"revision\": \"b8b8393d2e65fcebda5fa99fa3264f41\"\n },\n {\n \"url\": \"assets/KaTeX_Typewriter-Regular-tMUvZjwd.woff\",\n \"revision\": \"0e0460587676d22eae09accd6dcfebc6\"\n },\n {\n \"url\": \"assets/layout-vhfCKIw6.js\",\n \"revision\": \"b05284101041d9331034f0ee2a004f68\"\n },\n {\n \"url\": \"assets/league-gothic-h3edOfrm.eot\",\n \"revision\": \"9900a4643cc63c5d8f969d2196f72572\"\n },\n {\n \"url\": \"assets/league-gothic-oOjv4w16.ttf\",\n \"revision\": \"91295fa87df918411b49b7531da5d558\"\n },\n {\n \"url\": \"assets/league-gothic-wxYXAA-7.woff\",\n \"revision\": \"cd382dc8a9d6317864b5810a320effc5\"\n },\n {\n \"url\": \"assets/line-0KVoflyH.js\",\n \"revision\": \"de1f1567d0ded6b8327bad63816059eb\"\n },\n {\n \"url\": \"assets/linear-ZY3LUsi4.js\",\n \"revision\": \"9b89806f8a9d660699f79b423293b48e\"\n },\n {\n \"url\": \"assets/markdown.esm-ldiezHYe.js\",\n \"revision\": \"dfebc8121864151002204ef714f81472\"\n },\n {\n \"url\": \"assets/math.esm--eqzfLue.js\",\n \"revision\": \"c5f77dc064ac53005c0e5446bb6715b0\"\n },\n {\n \"url\": \"assets/mermaid.core-oTI0dw4V.js\",\n \"revision\": \"6fe87effa53fd4fbe2235e077aee7544\"\n },\n {\n \"url\": \"assets/mindmap-definition-377f8f1f-X6LAIWoO.js\",\n \"revision\": \"815773d8c77b93257b7c2e6c394fe3e1\"\n },\n {\n \"url\": \"assets/notes.esm--_TQ5Wr4.js\",\n \"revision\": \"12d7e35985a640e2ff8300c7cedb5983\"\n },\n {\n \"url\": \"assets/ordinal-wXG5obU4.js\",\n \"revision\": \"a72e57060c4f6a7606baa78dc6e9ad02\"\n },\n {\n \"url\": \"assets/path-aUcfwwLI.js\",\n \"revision\": \"f86c0243cb45746453c6b4f7dbd9f34d\"\n },\n {\n \"url\": \"assets/photoswipe.esm-08_zHRDQ.js\",\n \"revision\": \"481d5342d9bb799640b63b15b698dcd4\"\n },\n {\n \"url\": \"assets/pieDiagram-b0208e96-s3bLieF_.js\",\n \"revision\": \"cdd8f55ed83bc863d1e6c67e1075140b\"\n },\n {\n \"url\": \"assets/quadrantDiagram-0332be45-gJWC5Gva.js\",\n \"revision\": \"2e592624ff62a7975a789c7d65d7f3c2\"\n },\n {\n \"url\": \"assets/requirementDiagram-bf7890df-oepJXSkv.js\",\n \"revision\": \"9f1c1cf6e630219079402226952e43d5\"\n },\n {\n \"url\": \"assets/reveal.esm-QxxCNeuR.js\",\n \"revision\": \"0b31bd04921a05d8df6da2d9faca8c70\"\n },\n {\n \"url\": \"assets/sankeyDiagram-0acdec17-hfjkW-rC.js\",\n \"revision\": \"c9df93c981ba537fe19690a396961673\"\n },\n {\n \"url\": \"assets/search.esm-I_xTZtXh.js\",\n \"revision\": \"d39092c5e0d9959995df72297767dc3f\"\n },\n {\n \"url\": \"assets/sequenceDiagram-c18d009d-GNUSKQJn.js\",\n \"revision\": \"9c3bf767f68f7713c749d91e8a08fed4\"\n },\n {\n \"url\": \"assets/slides.html-44inynfd.js\",\n \"revision\": \"ec397fccb1ec8e0554c7a2dd6a10dcee\"\n },\n {\n \"url\": \"assets/source-sans-pro-italic-kXLDr8ko.ttf\",\n \"revision\": \"8256cfd7e4017a7690814879409212cd\"\n },\n {\n \"url\": \"assets/source-sans-pro-italic-r_ZvIQue.woff\",\n \"revision\": \"e74f0128884561828ce8c9cf5c284ab8\"\n },\n {\n \"url\": \"assets/source-sans-pro-italic-URCxwoo9.eot\",\n \"revision\": \"72217712eb8d28872e7069322f3fda23\"\n },\n {\n \"url\": \"assets/source-sans-pro-regular-1WEW6-y9.ttf\",\n \"revision\": \"2da39ecf9246383937da11b44b7bd9b4\"\n },\n {\n \"url\": \"assets/source-sans-pro-regular-7ugzKlOX.woff\",\n \"revision\": \"e7acc589bb558fe58936a853f570193c\"\n },\n {\n \"url\": \"assets/source-sans-pro-regular-vMQH-Lno.eot\",\n \"revision\": \"1d71438462d532b62b05cdd7e6d7197d\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibold-8K4hAz36.woff\",\n \"revision\": \"1cb8e94f1185f1131a0c895165998f2b\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibold-CdFA3Jgq.ttf\",\n \"revision\": \"f3565095e6c9158140444970f5a2c5ed\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibold-yZBXeD4J.eot\",\n \"revision\": \"0f3da1edf1b5c6a94a6ad948a7664451\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibolditalic-0pB0ab1n.woff\",\n \"revision\": \"6b058fc2634b01d837c3432316c3141f\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibolditalic-R0KDpyfN.ttf\",\n \"revision\": \"c7e698a4d0956f4a939f42a05685bbf5\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibolditalic-wk7IoV6c.eot\",\n \"revision\": \"58153ac7194e141d1e73ea88c6b63861\"\n },\n {\n \"url\": \"assets/stateDiagram-43596fc0-s2LDkwDs.js\",\n \"revision\": \"395253b3c128cfa779c0c9691aa9c1e4\"\n },\n {\n \"url\": \"assets/stateDiagram-v2-2ead4f9c-_4YEus-U.js\",\n \"revision\": \"a865d7986814e9ce52efe6997ac4799f\"\n },\n {\n \"url\": \"assets/style-0ILgEizb.css\",\n \"revision\": \"49819ef9f8c3444f5c699133a2b3ed0c\"\n },\n {\n \"url\": \"assets/style-w40geAFS.js\",\n \"revision\": \"68b329da9893e34099c7d8ad5cb9c940\"\n },\n {\n \"url\": \"assets/styles-6860f46c-QqbrbaNT.js\",\n \"revision\": \"be46eda225b90dd8d40160d2ba856611\"\n },\n {\n \"url\": \"assets/styles-7383a064-g88cDJLt.js\",\n \"revision\": \"26c3052ed3028d8c6a757a962bee0123\"\n },\n {\n \"url\": \"assets/styles-b2c874b6-OQFbAfhn.js\",\n \"revision\": \"97b98ff0bb9ea9ede89d5725a38e3d96\"\n },\n {\n \"url\": \"assets/svgDrawCommon-0ee1b4e9-UBeRZUOR.js\",\n \"revision\": \"377656e1b9a107a2a698d37a513e51fb\"\n },\n {\n \"url\": \"assets/Tableau10-Fgclqpgn.js\",\n \"revision\": \"f2197f44250cada74e1e663d3abfba3e\"\n },\n {\n \"url\": \"assets/timeline-definition-d977decf-PV3T5b89.js\",\n \"revision\": \"3cd627dd3c3b145c82ddb728adb48295\"\n },\n {\n \"url\": \"assets/utils-obz1_5fQ-XOQqDqQW.js\",\n \"revision\": \"5adeaa99226a6e92519556c9acd3f636\"\n },\n {\n \"url\": \"assets/vue-repl-966AioC4.js\",\n \"revision\": \"ec7f13030691a1bb7c968e812f395cdc\"\n },\n {\n \"url\": \"assets/xychartDiagram-e50adddc-XrJ1y6Nb.js\",\n \"revision\": \"a43b89eb4e94d3d9b821eb910826c7b5\"\n },\n {\n \"url\": \"assets/zoom.esm-w3VbP3hY.js\",\n \"revision\": \"e6e8f9a61302e3ca14aa4dbeec242607\"\n },\n {\n \"url\": \"404.html\",\n \"revision\": \"08708c1987af0471c682c9e91c448130\"\n },\n {\n \"url\": \"article/index.html\",\n \"revision\": \"255a961c56cfcf5d1f3ad10d000aae25\"\n },\n {\n \"url\": \"backend/database/basic/001-hello-database.html\",\n \"revision\": \"99976fa7f2053e75fa56fc06f54fd38c\"\n },\n {\n \"url\": \"backend/database/basic/002-relation-model.html\",\n \"revision\": \"d7d3d6fe204ed539d9956f41f03e57ae\"\n },\n {\n \"url\": \"backend/database/basic/003-db-design.html\",\n \"revision\": \"85e5bc49986f11512740d0a12f7bc239\"\n },\n {\n \"url\": \"backend/database/basic/004-advanced-db-model.html\",\n \"revision\": \"6dd31f7f6c754fae1dbd2dd6322f063e\"\n },\n {\n \"url\": \"backend/database/basic/index.html\",\n \"revision\": \"cb64ea216251e6894a0a4bad16dba673\"\n },\n {\n \"url\": \"backend/database/index.html\",\n \"revision\": \"46a542b6817a0bacf9a74852642b2ee0\"\n },\n {\n \"url\": \"backend/database/mysql/001-install-mysql.html\",\n \"revision\": \"7c7ed2262919b5cbb89cd2a8764a44b8\"\n },\n {\n \"url\": \"backend/database/mysql/index.html\",\n \"revision\": \"e0bc17d843de64b0aa41c7c3a1b62217\"\n },\n {\n \"url\": \"backend/database/sql/01-quick-start.html\",\n \"revision\": \"71797bea5c735b74ff2c55fb5d4267ec\"\n },\n {\n \"url\": \"backend/database/sql/index.html\",\n \"revision\": \"e4a0077a1c9dd63ee48867812952deaa\"\n },\n {\n \"url\": \"backend/index.html\",\n \"revision\": \"9f73a5939919ec89ab56ec3510060959\"\n },\n {\n \"url\": \"backend/java/index.html\",\n \"revision\": \"85a340f17225eb301395f05cf59fab03\"\n },\n {\n \"url\": \"backend/java/tool/01-maven.html\",\n \"revision\": \"21291c4a9cc0ba760bdd52322f0e4962\"\n },\n {\n \"url\": \"backend/java/tool/index.html\",\n \"revision\": \"8107aac2f639bef5c1d018a37d774f8d\"\n },\n {\n \"url\": \"backend/linux/index.html\",\n \"revision\": \"96ab6619ec5ea253f60c73cafdfa5229\"\n },\n {\n \"url\": \"backend/linux/practice/001-set-the-ssh.html\",\n \"revision\": \"7457ad91b21338ef25e66204e13ab0c0\"\n },\n {\n \"url\": \"backend/linux/practice/002-build-git-server.html\",\n \"revision\": \"54df5ca3d6f78080050c1bef601aefac\"\n },\n {\n \"url\": \"backend/linux/practice/003-configure-bt.html\",\n \"revision\": \"ab82a1ab65ae80ad2d8bb6e5e684c0de\"\n },\n {\n \"url\": \"backend/linux/practice/004-automated-deployment.html\",\n \"revision\": \"f73ad184e6a40b5eb22e17ad55ce04eb\"\n },\n {\n \"url\": \"backend/linux/practice/005-install-docker.html\",\n \"revision\": \"28274c38afcfb8017aa8306b55efd6fc\"\n },\n {\n \"url\": \"backend/linux/practice/index.html\",\n \"revision\": \"0bb54e3d8beb670abe39aaad56bdf92c\"\n },\n {\n \"url\": \"backend/node/express/01-overview-architecture.html\",\n \"revision\": \"7e77c35220fea005c6ec3bb63559de07\"\n },\n {\n \"url\": \"backend/node/express/02-express.js.html\",\n \"revision\": \"9c6c5e27a9ee3e1fe6929f4bf9f2429c\"\n },\n {\n \"url\": \"backend/node/express/index.html\",\n \"revision\": \"06f059b4e626e011c770c784fef63ca9\"\n },\n {\n \"url\": \"backend/node/index.html\",\n \"revision\": \"8027d55338bb7a69690c049b2614d802\"\n },\n {\n \"url\": \"backend/node/module/001-finalhandler.html\",\n \"revision\": \"9a76460840995a877f1cea6a414de062\"\n },\n {\n \"url\": \"backend/node/module/index.html\",\n \"revision\": \"509146ed71120b7e9bdb76129c7de95e\"\n },\n {\n \"url\": \"category/algorithm/index.html\",\n \"revision\": \"809bf5c16224e6b3e6082b1c89c5d0c1\"\n },\n {\n \"url\": \"category/browser/index.html\",\n \"revision\": \"d0c5ad80684257da5f0c22fe3fb475b4\"\n },\n {\n \"url\": \"category/chakra/index.html\",\n \"revision\": \"e2bb366a73d984cccb9513e617f366f8\"\n },\n {\n \"url\": \"category/css/index.html\",\n \"revision\": \"e6531a008f22c28430e8e8214170887b\"\n },\n {\n \"url\": \"category/database/index.html\",\n \"revision\": \"6177bce4e3b8e6332b676e34529fa94f\"\n },\n {\n \"url\": \"category/html/index.html\",\n \"revision\": \"ed5fadce2eb3b489b04426f647f8e728\"\n },\n {\n \"url\": \"category/index.html\",\n \"revision\": \"9107c23a8cfd916ffd19c7e7cf988fa5\"\n },\n {\n \"url\": \"category/javascript/index.html\",\n \"revision\": \"2a3e5b41a29ef33bc7b642ac28555660\"\n },\n {\n \"url\": \"category/leetcode/index.html\",\n \"revision\": \"199786cb111051e2d1c1cfe740ad4cf7\"\n },\n {\n \"url\": \"category/linux/index.html\",\n \"revision\": \"36e5e91dd77c24f7549f4879ea6b21b2\"\n },\n {\n \"url\": \"category/next/index.html\",\n \"revision\": \"d29baf9617a8af064783d4cd2af55c56\"\n },\n {\n \"url\": \"category/node/index.html\",\n \"revision\": \"a7ece156ad7eaf2c5c484ba327eb857e\"\n },\n {\n \"url\": \"category/operating-system/index.html\",\n \"revision\": \"2eb695ab2f93a7a3026ec85da71fb820\"\n },\n {\n \"url\": \"category/pixi/index.html\",\n \"revision\": \"760a12f247c8a65b2731fdaed210154e\"\n },\n {\n \"url\": \"category/practice/index.html\",\n \"revision\": \"c6c645829550d527cd89c1b4f3ae94dd\"\n },\n {\n \"url\": \"category/project/index.html\",\n \"revision\": \"93ed7825427984129af5ffd0de1e818f\"\n },\n {\n \"url\": \"category/react/index.html\",\n \"revision\": \"1a4cd214c74d15094d81f715a3747417\"\n },\n {\n \"url\": \"category/reading/index.html\",\n \"revision\": \"352a0654a10fb90e3e5492d3dc20ef53\"\n },\n {\n \"url\": \"category/vue/index.html\",\n \"revision\": \"c4a53beb90572e083fa7e5fec76a376a\"\n },\n {\n \"url\": \"category/工程化/index.html\",\n \"revision\": \"34743380e54dd714ee32938e6996e04e\"\n },\n {\n \"url\": \"category/计算机网络/index.html\",\n \"revision\": \"5b309c0acd125fe93ab742cf894fe408\"\n },\n {\n \"url\": \"computer-science/algorithm/0001、二叉树.html\",\n \"revision\": \"bb451afea3f1a7407c6a36e626cd42b0\"\n },\n {\n \"url\": \"computer-science/algorithm/0002、二叉搜索树.html\",\n \"revision\": \"efb2831ca4a4e45be31dfaabbc01c42c\"\n },\n {\n \"url\": \"computer-science/algorithm/0003、动态规划.html\",\n \"revision\": \"897406df651c8aa9f091d893512c58fc\"\n },\n {\n \"url\": \"computer-science/algorithm/0004、链表.html\",\n \"revision\": \"1805546b31622d9b8737224a2d53a898\"\n },\n {\n \"url\": \"computer-science/algorithm/01-array.html\",\n \"revision\": \"1e3b88beea5bee6189ecb3ead43ad21d\"\n },\n {\n \"url\": \"computer-science/algorithm/index.html\",\n \"revision\": \"8b53310db6cea06603597035df37d435\"\n },\n {\n \"url\": \"computer-science/index.html\",\n \"revision\": \"6c3014b786d4f3b98300bc43e4b1bd40\"\n },\n {\n \"url\": \"computer-science/networking/001-network-model.html\",\n \"revision\": \"7714af327f82cae80424a805d512b25c\"\n },\n {\n \"url\": \"computer-science/networking/002-HTTP-overview.html\",\n \"revision\": \"a3d3d17714b0e57fce17d33e85fa3846\"\n },\n {\n \"url\": \"computer-science/networking/003-get-post-difference.html\",\n \"revision\": \"0fafb089ec8dec201a3852ee7e043d0b\"\n },\n {\n \"url\": \"computer-science/networking/004-HTTP-development.html\",\n \"revision\": \"c137d654ae959d0f6233684a160256ed\"\n },\n {\n \"url\": \"computer-science/networking/005-HTTP-cache.html\",\n \"revision\": \"7cd8ed47866f37f94a9bb57aad9d5f14\"\n },\n {\n \"url\": \"computer-science/networking/006-HTTPS-overview.html\",\n \"revision\": \"b89d26cc12c14bd3fc75a8a47ef456aa\"\n },\n {\n \"url\": \"computer-science/networking/007-TCP-three-handshakes-and-four-waves.html\",\n \"revision\": \"b5c42635568ab5505d7b9dfafbea4ef9\"\n },\n {\n \"url\": \"computer-science/networking/008-tcp-udp.html\",\n \"revision\": \"0099411d54103d831de356a9c608151b\"\n },\n {\n \"url\": \"computer-science/networking/009-http-code-when-authorized-refused.html\",\n \"revision\": \"23219ccbcbd7270980addca147f4c2b3\"\n },\n {\n \"url\": \"computer-science/networking/index.html\",\n \"revision\": \"129555c6c9eb68f1370e9a2d9e87b140\"\n },\n {\n \"url\": \"computer-science/operating-system/001-character-encoding.html\",\n \"revision\": \"614828c4b2ed21e2bbe677074f2a8489\"\n },\n {\n \"url\": \"computer-science/operating-system/index.html\",\n \"revision\": \"0de90428fb52c41259fa8034888dd830\"\n },\n {\n \"url\": \"frontend/basic/css/001-quick-start.html\",\n \"revision\": \"d514f0302e8907ccaede6220300f864d\"\n },\n {\n \"url\": \"frontend/basic/css/002-selector.html\",\n \"revision\": \"52f115790a24c4dbef934ea055eb807a\"\n },\n {\n \"url\": \"frontend/basic/css/003-box-model.html\",\n \"revision\": \"79695cb16383f9345bde3d39c99d232a\"\n },\n {\n \"url\": \"frontend/basic/css/004-text-font.html\",\n \"revision\": \"12e7ad4023260d2150703871256d311f\"\n },\n {\n \"url\": \"frontend/basic/css/005-cascade-inheritance.html\",\n \"revision\": \"ce408ae2611bbc8cd1194bf04c749c2c\"\n },\n {\n \"url\": \"frontend/basic/css/006-background-border.html\",\n \"revision\": \"968ccfc1f93886a73119fe0f602473ae\"\n },\n {\n \"url\": \"frontend/basic/css/007-position.html\",\n \"revision\": \"35bd97d66b7b997388a376b7b0e97209\"\n },\n {\n \"url\": \"frontend/basic/css/008-float.html\",\n \"revision\": \"8a5fac2c3e48b5e92e1ea3ffd7b388a2\"\n },\n {\n \"url\": \"frontend/basic/css/009-flex.html\",\n \"revision\": \"eb4541395a47293ff43b438f16476cb6\"\n },\n {\n \"url\": \"frontend/basic/css/010-unit.html\",\n \"revision\": \"8a3f34b1d074ac345cff6c837c65c4fb\"\n },\n {\n \"url\": \"frontend/basic/css/011-center.html\",\n \"revision\": \"310758599991b6ad2c5e52ce2fc78c43\"\n },\n {\n \"url\": \"frontend/basic/css/012-grid.html\",\n \"revision\": \"a2d7f7d6bd0a4be7f88625cd3d0399f7\"\n },\n {\n \"url\": \"frontend/basic/css/013-BFC.html\",\n \"revision\": \"8fef6bee4634bf8af7defc7d23f26073\"\n },\n {\n \"url\": \"frontend/basic/css/014-responsive-design-intro.html\",\n \"revision\": \"93bb0697812cf07e4e545b944bdd4b6c\"\n },\n {\n \"url\": \"frontend/basic/css/015-responsive-design.html\",\n \"revision\": \"b9b04781d8a14ed76a0d21273b91da18\"\n },\n {\n \"url\": \"frontend/basic/css/016-how-to-responsive.html\",\n \"revision\": \"2058c83d080a634c4e064865d7980620\"\n },\n {\n \"url\": \"frontend/basic/css/017-loading-spinner.html\",\n \"revision\": \"2a92bd93cc56e491b6ceab5fd577718c\"\n },\n {\n \"url\": \"frontend/basic/css/018-autofill.html\",\n \"revision\": \"c309e857ee6a888580a71dd554436bc1\"\n },\n {\n \"url\": \"frontend/basic/css/index.html\",\n \"revision\": \"946a41c1c7e92e4f78a9d87ba654e7f2\"\n },\n {\n \"url\": \"frontend/basic/html/0007、WebSocket.html\",\n \"revision\": \"2e628471c3dd50b984e7003627ef6882\"\n },\n {\n \"url\": \"frontend/basic/html/0008、WebStorage.html\",\n \"revision\": \"79b01a7cca179c376cd8da2b1c1a3682\"\n },\n {\n \"url\": \"frontend/basic/html/001-html-history.html\",\n \"revision\": \"2ee044770ba494987b49eae39711821f\"\n },\n {\n \"url\": \"frontend/basic/html/0010、WebWorker.html\",\n \"revision\": \"ba3b8c78066bc71db9de157c03ca670f\"\n },\n {\n \"url\": \"frontend/basic/html/002-quick-start.html\",\n \"revision\": \"ddb8746450fb34435b6187a7b9f73a6a\"\n },\n {\n \"url\": \"frontend/basic/html/003-doctype.html\",\n \"revision\": \"2d260e9b7761b1dcfacd0bc8d201ba1e\"\n },\n {\n \"url\": \"frontend/basic/html/004-common-element.html\",\n \"revision\": \"f9f2b6ec8ff4cafbc0ff5b9a55b4d160\"\n },\n {\n \"url\": \"frontend/basic/html/005-advanced-element.html\",\n \"revision\": \"047b57ce1a05a01c33557cc2b19047e6\"\n },\n {\n \"url\": \"frontend/basic/html/006-semantically-meaningful-tags.html\",\n \"revision\": \"081caddf078d418f46c6566a1c5d4f2b\"\n },\n {\n \"url\": \"frontend/basic/html/007-media-tag.html\",\n \"revision\": \"5338c891c57a4acb7614f66a28f058f4\"\n },\n {\n \"url\": \"frontend/basic/html/008-canvas-svg.html\",\n \"revision\": \"29613ba522119bf585b5d8aa21822e52\"\n },\n {\n \"url\": \"frontend/basic/html/009-src-vs-href.html\",\n \"revision\": \"9322b0a17bc917e584fc2bd76f57c7ad\"\n },\n {\n \"url\": \"frontend/basic/html/010-html5.html\",\n \"revision\": \"cf2832fc230792dde55001d2d959b252\"\n },\n {\n \"url\": \"frontend/basic/html/011-defer-vs-async.html\",\n \"revision\": \"48a37233afa8ef202f546983bdf820c4\"\n },\n {\n \"url\": \"frontend/basic/html/012-form-validation.html\",\n \"revision\": \"39bce42ac2dcd08079bdc00f39be6355\"\n },\n {\n \"url\": \"frontend/basic/html/013-seo.html\",\n \"revision\": \"bc70b30fb528a31453dba2bbe625ae06\"\n },\n {\n \"url\": \"frontend/basic/html/index.html\",\n \"revision\": \"8e7064d5d67a6be01c74e0de887fac91\"\n },\n {\n \"url\": \"frontend/basic/index.html\",\n \"revision\": \"6ef86bdcef3fe33cd76747f2fa68ee73\"\n },\n {\n \"url\": \"frontend/basic/javascript/001-var-let-const.html\",\n \"revision\": \"acbe587de61bed9e3f926c609afa2bbd\"\n },\n {\n \"url\": \"frontend/basic/javascript/0011、判断对象值相等.html\",\n \"revision\": \"c35fba691d454428d3ad46bfc1e5ac7b\"\n },\n {\n \"url\": \"frontend/basic/javascript/0012、AJAX.html\",\n \"revision\": \"e105c0b9a95919de7e92b860869945b4\"\n },\n {\n \"url\": \"frontend/basic/javascript/0014、浅拷贝与深拷贝.html\",\n \"revision\": \"0bb18d1b8f700ad0a3b6733337d249cf\"\n },\n {\n \"url\": \"frontend/basic/javascript/0017、事件循环.html\",\n \"revision\": \"bd2883947f1c2761e092e461a66ba359\"\n },\n {\n \"url\": \"frontend/basic/javascript/002-types.html\",\n \"revision\": \"47f83e801fe34442f7521685a9ffaec1\"\n },\n {\n \"url\": \"frontend/basic/javascript/003-judge-type.html\",\n \"revision\": \"d9a73ffa05c11e27b37e3f5e5720341a\"\n },\n {\n \"url\": \"frontend/basic/javascript/004-primitive-value-reference-value.html\",\n \"revision\": \"c7083bfc9d063119e78aba056c1d7254\"\n },\n {\n \"url\": \"frontend/basic/javascript/005-execution-context.html\",\n \"revision\": \"aaa27db42df091cefac90f574d5540e7\"\n },\n {\n \"url\": \"frontend/basic/javascript/006-toString-toLocalString-valueOf.html\",\n \"revision\": \"72f60743d9689ed2b3202a6eba397e3f\"\n },\n {\n \"url\": \"frontend/basic/javascript/007-basic-reference-type.html\",\n \"revision\": \"a46b157d6731eccbd5670eb1bd3353d1\"\n },\n {\n \"url\": \"frontend/basic/javascript/008-collection-reference-type.html\",\n \"revision\": \"fc399248445fcebd433996c78b2e3c6f\"\n },\n {\n \"url\": \"frontend/basic/javascript/009-array-like-object.html\",\n \"revision\": \"8fe9013199415adb75114774ed9beb45\"\n },\n {\n \"url\": \"frontend/basic/javascript/010-object-property.html\",\n \"revision\": \"ab9aaa1c21b69307537d24e1147e56c1\"\n },\n {\n \"url\": \"frontend/basic/javascript/011-create-object.html\",\n \"revision\": \"73150aaf4d8dd6862b56e83268915adc\"\n },\n {\n \"url\": \"frontend/basic/javascript/012-extends.html\",\n \"revision\": \"ecb74d2f4d8d85acae8463b5d363f67f\"\n },\n {\n \"url\": \"frontend/basic/javascript/013-class.html\",\n \"revision\": \"577b27ecf61d7634e304e234bbf325cf\"\n },\n {\n \"url\": \"frontend/basic/javascript/014-implement-new.html\",\n \"revision\": \"e7de927ce23617808fa2a6cd5e1d2586\"\n },\n {\n \"url\": \"frontend/basic/javascript/015-function.html\",\n \"revision\": \"ea545e7358f101d789108dbe1bdae7ef\"\n },\n {\n \"url\": \"frontend/basic/javascript/016-this.html\",\n \"revision\": \"40a5643d9f1e5ce4da96a764124bf78c\"\n },\n {\n \"url\": \"frontend/basic/javascript/017-implement-call-apply-bind.html\",\n \"revision\": \"56bbf2febbd5027bf15d4dc61a56059e\"\n },\n {\n \"url\": \"frontend/basic/javascript/index.html\",\n \"revision\": \"4f99cf5223b32835e88ea9097c17a87a\"\n },\n {\n \"url\": \"frontend/browser/01-how-browser-rendering-works.html\",\n \"revision\": \"356f592c4e3b2f2d4170d0c593490950\"\n },\n {\n \"url\": \"frontend/browser/02-V8.html\",\n \"revision\": \"00c6b975d78490fd55b536ade144e54c\"\n },\n {\n \"url\": \"frontend/browser/03-memory-management.html\",\n \"revision\": \"96b709b823f02eaee94c1d7ed4c0405e\"\n },\n {\n \"url\": \"frontend/browser/04-cross-domain.html\",\n \"revision\": \"2bf9b671bcb6b078f2e0be68e2188909\"\n },\n {\n \"url\": \"frontend/browser/05-what-happens-after-entering-the-URL.html\",\n \"revision\": \"5090165647fc7d4a1ef1ab0b2a9b5797\"\n },\n {\n \"url\": \"frontend/browser/index.html\",\n \"revision\": \"924080224481e0adf1e1bb23991bc8f1\"\n },\n {\n \"url\": \"frontend/engineering/basic/001-modularization.html\",\n \"revision\": \"1e3370b8640cd433da957a16594395d8\"\n },\n {\n \"url\": \"frontend/engineering/basic/002-package-manager.html\",\n \"revision\": \"2c4c051b35f8d474433f0f204ba6e474\"\n },\n {\n \"url\": \"frontend/engineering/basic/003-tool.html\",\n \"revision\": \"18de5ffd7c69f88bd121806047fc44d3\"\n },\n {\n \"url\": \"frontend/engineering/basic/004-project-standards.html\",\n \"revision\": \"85b1b4eb35d3bcee3ef9e2f2cd933888\"\n },\n {\n \"url\": \"frontend/engineering/basic/005-yeoman.html\",\n \"revision\": \"977d2bc81a6ec049f64172f932de25d2\"\n },\n {\n \"url\": \"frontend/engineering/basic/index.html\",\n \"revision\": \"8a60c3098a261865e524620f7379321b\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/index.html\",\n \"revision\": \"98b046eb4e62106e4d280ee1757e7dfc\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/rspack/001-hello-rspack.html\",\n \"revision\": \"9c75fbc41368cb6b6b1e66bedc65c7a3\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/rspack/index.html\",\n \"revision\": \"6492850a4485c40498dbacb119adaf29\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/vite/001-hello-vite.html\",\n \"revision\": \"6fc1570c77f92556bf23245985d13f4d\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/vite/index.html\",\n \"revision\": \"f8b4b83a876702013315b3c4f54846a9\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/001-webpack-basic.html\",\n \"revision\": \"23194131998d89a3cff22b045d38e9c5\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/002-webpack-css.html\",\n \"revision\": \"2746f6f108bb28d1b3a6ad3942d8e2d5\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/003-webpack-assets.html\",\n \"revision\": \"b40cfe4154a0287ba1355cfe4fa48583\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/004-webpack-plugin.html\",\n \"revision\": \"78553bcdba199aa85c0e730b70cce9b6\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/005-webpack-babel.html\",\n \"revision\": \"cc43b1d0ddc28856341d6a789dd68f28\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/006-webpack-vue.html\",\n \"revision\": \"050f386145a075c4476a9ad6562746d5\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/007-webpack-dev-server.html\",\n \"revision\": \"920f6a00056fa665877be0b02c604461\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/008-webpack-resolve.html\",\n \"revision\": \"f39515359839260701ee8330a295abd8\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/009-webpack-env-split.html\",\n \"revision\": \"b5decffbe016be745650b2c435f2fa7b\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/index.html\",\n \"revision\": \"91ce5f2e4d11b3caf42eefef0437b578\"\n },\n {\n \"url\": \"frontend/engineering/index.html\",\n \"revision\": \"e5ae9a33056135baeda559d7ad8f695b\"\n },\n {\n \"url\": \"frontend/engineering/ssr/005-qwik.html\",\n \"revision\": \"57bef5222ad8b6048cb3048ca81833d7\"\n },\n {\n \"url\": \"frontend/engineering/ssr/006-react-server-component.html\",\n \"revision\": \"6c4fe8c9799ceb55f8be72713ddc2c00\"\n },\n {\n \"url\": \"frontend/engineering/ssr/007-hydration-is-pure-overhead.html\",\n \"revision\": \"983b992029659bc74cb1496bb1b9dce6\"\n },\n {\n \"url\": \"frontend/engineering/ssr/index.html\",\n \"revision\": \"c58a9bc364f3997905b3045870c26c3c\"\n },\n {\n \"url\": \"frontend/framework/chakra/01-getting-started.html\",\n \"revision\": \"7c1ba6c0b32b81415c6c83232bd44bcc\"\n },\n {\n \"url\": \"frontend/framework/chakra/02-style-props.html\",\n \"revision\": \"af7c4cc995172b1c915be5282f7c0e7b\"\n },\n {\n \"url\": \"frontend/framework/chakra/index.html\",\n \"revision\": \"0ad5f499e98a012f05ea2c028a9e0e4f\"\n },\n {\n \"url\": \"frontend/framework/index.html\",\n \"revision\": \"1dd22dcdd957cf472b44436f4bc560a2\"\n },\n {\n \"url\": \"frontend/framework/next/index.html\",\n \"revision\": \"147c87d914d0599e7b20b50f1efb76dc\"\n },\n {\n \"url\": \"frontend/framework/next/pages-router/01-pages-layouts.html\",\n \"revision\": \"204409cc3de3a63525048bb65dc15883\"\n },\n {\n \"url\": \"frontend/framework/next/pages-router/index.html\",\n \"revision\": \"76ce4782ba3cd2f7133f53a97ee73215\"\n },\n {\n \"url\": \"frontend/framework/node/001-module.html\",\n \"revision\": \"66a9666fe26593ed2aeeef7dc1564795\"\n },\n {\n \"url\": \"frontend/framework/node/index.html\",\n \"revision\": \"b3fde319365d0bb619d1bda5bdc6ca90\"\n },\n {\n \"url\": \"frontend/framework/pixi/01-quick-start.html\",\n \"revision\": \"10e15a2e289f6c4ebb17e998e8a751f8\"\n },\n {\n \"url\": \"frontend/framework/pixi/02-architecture-overview.html\",\n \"revision\": \"5d13ad09815ce8b4f324fa675ca18c25\"\n },\n {\n \"url\": \"frontend/framework/pixi/03-render-loop.html\",\n \"revision\": \"c4f76473d94a1cc1fded3cd7b0f030b9\"\n },\n {\n \"url\": \"frontend/framework/pixi/04-scene-graph.html\",\n \"revision\": \"ed3f8f41c0048a4aa9dd088c564760ea\"\n },\n {\n \"url\": \"frontend/framework/pixi/index.html\",\n \"revision\": \"c6203651eeb31ddafd91c6f1d8f23c56\"\n },\n {\n \"url\": \"frontend/framework/react/01-useState.html\",\n \"revision\": \"a35e69479a97b4013f1b4d199938893d\"\n },\n {\n \"url\": \"frontend/framework/react/02-useEffect.html\",\n \"revision\": \"e25f2222b4e1440fab23010f3a5fa2dc\"\n },\n {\n \"url\": \"frontend/framework/react/index.html\",\n \"revision\": \"f73853491effee83ff5e108d7f8632e5\"\n },\n {\n \"url\": \"frontend/framework/vue/01、父子组件通信.html\",\n \"revision\": \"20c3272799c3fcf638b6a898fac80a4e\"\n },\n {\n \"url\": \"frontend/framework/vue/02、provide-inject.html\",\n \"revision\": \"f2799883f7b9a1f870301624592c1a87\"\n },\n {\n \"url\": \"frontend/framework/vue/02、Vuex 原理.html\",\n \"revision\": \"b90d4f746ef547180e18aa84e1c5142d\"\n },\n {\n \"url\": \"frontend/framework/vue/03、插槽.html\",\n \"revision\": \"bfa6f284bf95eeab720a7322f20f40d8\"\n },\n {\n \"url\": \"frontend/framework/vue/04、动态组件和异步组件.html\",\n \"revision\": \"72f18139fb3bd349a06ba86eb395b076\"\n },\n {\n \"url\": \"frontend/framework/vue/05、组件的v-model.html\",\n \"revision\": \"37f1d4b41886fd9400c69fd9370628fe\"\n },\n {\n \"url\": \"frontend/framework/vue/06、Mixin.html\",\n \"revision\": \"d75b8a0aeacd740a138e3ec5e2a8fed1\"\n },\n {\n \"url\": \"frontend/framework/vue/07、组合式API基础.html\",\n \"revision\": \"00eefacd33a6c259be17709ced7825e4\"\n },\n {\n \"url\": \"frontend/framework/vue/08、组合式函数.html\",\n \"revision\": \"04bb27758919cd2c3b864c08ff015a98\"\n },\n {\n \"url\": \"frontend/framework/vue/09、指令.html\",\n \"revision\": \"6547015238f64ad4d136e0d3c9a4929a\"\n },\n {\n \"url\": \"frontend/framework/vue/10、插件.html\",\n \"revision\": \"5b24847929d6e49e377096a305342963\"\n },\n {\n \"url\": \"frontend/framework/vue/index.html\",\n \"revision\": \"cacbcea56a82bffb830cbbf0145b8a44\"\n },\n {\n \"url\": \"frontend/index.html\",\n \"revision\": \"57fa467dc3c8ef939119db23f80bcea8\"\n },\n {\n \"url\": \"frontend/practice/001-dnd-kit.html\",\n \"revision\": \"31985545925b92bdbfeba4836b7cdbd7\"\n },\n {\n \"url\": \"frontend/practice/002-annotation.html\",\n \"revision\": \"7f6cceb66d1784164e2dbcb8038edd2b\"\n },\n {\n \"url\": \"frontend/practice/003-file-upload.html\",\n \"revision\": \"f71998d4425aa6481f9a223e5f83f95a\"\n },\n {\n \"url\": \"frontend/practice/004-global-upload.html\",\n \"revision\": \"623e5677f49762b9d73deba0b4582520\"\n },\n {\n \"url\": \"frontend/practice/005-postcss-px-to-viewport.html\",\n \"revision\": \"3f8bfc47c8de955ccd780bd1fc29e5a0\"\n },\n {\n \"url\": \"frontend/practice/006-animation-svg.html\",\n \"revision\": \"0ec9fbc304d51ba0b4729ca90b9eabf0\"\n },\n {\n \"url\": \"frontend/practice/007-offline-export-in-highcharts.html\",\n \"revision\": \"5afefd2bfc23249548e1d36f274fadbe\"\n },\n {\n \"url\": \"frontend/practice/010-antd-textarea-placeholder-pre-line.html\",\n \"revision\": \"289a3855c8897bd4dfb3c56e7742c70b\"\n },\n {\n \"url\": \"frontend/practice/015-auto-change-node.html\",\n \"revision\": \"56832df3aa640736aac283e9ccdd0815\"\n },\n {\n \"url\": \"frontend/practice/016-rest-client-error.html\",\n \"revision\": \"f0dd39b9e9a006890c7ead10bbc11c36\"\n },\n {\n \"url\": \"frontend/practice/017-whistle-debug-real-phone.html\",\n \"revision\": \"c226e80a3220b84588fbb81e0d3e455d\"\n },\n {\n \"url\": \"frontend/practice/018-monaco-editor-react.html\",\n \"revision\": \"368a82f2cab743f2d40561ec3d9e217f\"\n },\n {\n \"url\": \"frontend/practice/019-ios-prevent-touch.html\",\n \"revision\": \"6bc6ac4ece7b6ffcbb4f9bc868696f8d\"\n },\n {\n \"url\": \"frontend/practice/020-ios-img.html\",\n \"revision\": \"d1334bc360ca57d9729a6346c754576b\"\n },\n {\n \"url\": \"frontend/practice/index.html\",\n \"revision\": \"10adaab8b2a6deb431f8344cc697da20\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"26dfff6f3b357c6efc5ace9b630d69da\"\n },\n {\n \"url\": \"intro.html\",\n \"revision\": \"558b6f4c2368bc40a7a93b6a7f6c09a9\"\n },\n {\n \"url\": \"project/github-auto-commit/index.html\",\n \"revision\": \"52ee2016e0951a452198dbfc93be7c0f\"\n },\n {\n \"url\": \"project/imperial-kitchen/01-init.html\",\n \"revision\": \"6d07c2b034470cba6d14fafcc089d6dd\"\n },\n {\n \"url\": \"project/imperial-kitchen/02-server.html\",\n \"revision\": \"ef6fcf08c47030a74fe95ccdef70fcce\"\n },\n {\n \"url\": \"project/imperial-kitchen/03-database.html\",\n \"revision\": \"805530451c1ae4332d62e7a1bfbe22bb\"\n },\n {\n \"url\": \"project/imperial-kitchen/04-api.html\",\n \"revision\": \"ec77eed3c094c7a2f5742ec8657bb34e\"\n },\n {\n \"url\": \"project/imperial-kitchen/index.html\",\n \"revision\": \"505260a565f18445e07e859d86d04a7b\"\n },\n {\n \"url\": \"project/index.html\",\n \"revision\": \"b5234c878a544216198d32202da07d58\"\n },\n {\n \"url\": \"project/mini-vue-cli/001-init-project.html\",\n \"revision\": \"47d3dc1e7be79b274df279e6775fbe1b\"\n },\n {\n \"url\": \"project/mini-vue-cli/index.html\",\n \"revision\": \"6ab80edb5b909be88886109105561dae\"\n },\n {\n \"url\": \"project/plugin/01.vuepress-plugin-ordered-header.html\",\n \"revision\": \"f913a2b7e2c986bb5d8cbfec6947f747\"\n },\n {\n \"url\": \"project/plugin/index.html\",\n \"revision\": \"feadf577d7d7a7cc13add154b8ac76de\"\n },\n {\n \"url\": \"project/RSSHub/index.html\",\n \"revision\": \"c5aa0dce8715a137037210db4b728b2d\"\n },\n {\n \"url\": \"project/ssg/index.html\",\n \"revision\": \"8fc491591a0f017e914ee4a0071e6aa9\"\n },\n {\n \"url\": \"project/tyro-ui/001-init-project.html\",\n \"revision\": \"2ca6f6b8feb8f822978fc172f013fb29\"\n },\n {\n \"url\": \"project/tyro-ui/index.html\",\n \"revision\": \"5bb0a5c1d847bcf41da218c770841f91\"\n },\n {\n \"url\": \"reading/index.html\",\n \"revision\": \"c4a27808c6dd4ede8dfa8121bb36361f\"\n },\n {\n \"url\": \"reading/patterns/index.html\",\n \"revision\": \"161ba9e40052d74ea095af1da9c663fb\"\n },\n {\n \"url\": \"reading/patterns/vanilla/01-command-pattern.html\",\n \"revision\": \"3b5eea706ff15b1beadc7c9ee971737a\"\n },\n {\n \"url\": \"reading/patterns/vanilla/02-factory-pattern.html\",\n \"revision\": \"3fb780373be51ee82a209aa2202977d0\"\n },\n {\n \"url\": \"reading/patterns/vanilla/03-flyweight-pattern.html\",\n \"revision\": \"105a4bac4b65e811f7b3edc955b7b846\"\n },\n {\n \"url\": \"reading/patterns/vanilla/04-mediator-pattern.html\",\n \"revision\": \"426dedcada93987144a220fd1c3e9c37\"\n },\n {\n \"url\": \"reading/patterns/vanilla/05-middleware-pattern.html\",\n \"revision\": \"5a0a215da9ff8ad22eafc576ec42997c\"\n },\n {\n \"url\": \"reading/patterns/vanilla/index.html\",\n \"revision\": \"c193c1b77261c6490b8b107565fb1826\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/01-a-pragmatic-philosophy.html\",\n \"revision\": \"99ed1a54fe899481c7895f1ddeb99639\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/02-a-pragmatic-approach.html\",\n \"revision\": \"ffee17b14937a20e41cf4c31ff5047be\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/03-basic-tool.html\",\n \"revision\": \"711bf42ad667371953271eb7b9fc36f6\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/04-pragmatic-paranoid.html\",\n \"revision\": \"03f89dc0582527278e16c6ba821a5355\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/05-work-around.html\",\n \"revision\": \"5447bf871603c7854fd18c7dfe0258c2\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/06-concurrent.html\",\n \"revision\": \"a7464d4b52b15c8c155dd090711ae944\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/07-when-coding.html\",\n \"revision\": \"8b9bfa224f41acd74af45a89666e70f8\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/08-before-start-project.html\",\n \"revision\": \"91ea87ce4740b87f3b10a455bebccacf\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/09-pragmatic-project.html\",\n \"revision\": \"cfc67aac4a32251e78c100762220d93e\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/index.html\",\n \"revision\": \"ff6613e52f078982dd2ead111aee51dd\"\n },\n {\n \"url\": \"reading/pro-git/01-getting-started.html\",\n \"revision\": \"8e050a22ae2c0384564f92505fbbd3b9\"\n },\n {\n \"url\": \"reading/pro-git/02-git-basics.html\",\n \"revision\": \"7eb3c862d28fb079a40aedbd210aca80\"\n },\n {\n \"url\": \"reading/pro-git/03-git-branch.html\",\n \"revision\": \"b35c0e99c084306d0eb6922992d78161\"\n },\n {\n \"url\": \"reading/pro-git/04-git-server.html\",\n \"revision\": \"2ba2ae58e6b335b787347a8caaa2c474\"\n },\n {\n \"url\": \"reading/pro-git/06-change-commit.html\",\n \"revision\": \"d735d10b2165ac4dad6b911575959978\"\n },\n {\n \"url\": \"reading/pro-git/index.html\",\n \"revision\": \"a27d8323e9070dce3154be7197c07d5b\"\n },\n {\n \"url\": \"slides.html\",\n \"revision\": \"34e26d54141942e790b288845dc14d04\"\n },\n {\n \"url\": \"star/index.html\",\n \"revision\": \"b23d3853b8ba29ebba3c61ce346a61b8\"\n },\n {\n \"url\": \"survival/index.html\",\n \"revision\": \"99dfd3d1c46299d92e3a239c4d5b2883\"\n },\n {\n \"url\": \"survival/okr/2023.html\",\n \"revision\": \"cd193e8878b5985d072addf6ec1ee713\"\n },\n {\n \"url\": \"survival/okr/2024.html\",\n \"revision\": \"3ed2bde16e15049e417d652ac4b21fba\"\n },\n {\n \"url\": \"survival/okr/index.html\",\n \"revision\": \"1d9199418c42786530e7982660497fc9\"\n },\n {\n \"url\": \"survival/week/index.html\",\n \"revision\": \"97fe90320dec7f9732a366431527794f\"\n },\n {\n \"url\": \"tag/amd/index.html\",\n \"revision\": \"a0a75beb23b72c929ebc6ebb7655e07e\"\n },\n {\n \"url\": \"tag/animation/index.html\",\n \"revision\": \"ea8afffe39fde4fa9bfa08f9b7f9865c\"\n },\n {\n \"url\": \"tag/antd/index.html\",\n \"revision\": \"c24ae29dcb3f971674a779af17e1cc71\"\n },\n {\n \"url\": \"tag/architecture/index.html\",\n \"revision\": \"bfa9e11fc764baea4f410127510c80e8\"\n },\n {\n \"url\": \"tag/atomic-css/index.html\",\n \"revision\": \"f54da06a609f0d896736926dea335c45\"\n },\n {\n \"url\": \"tag/backend/index.html\",\n \"revision\": \"2997ef0abd75005724f9c333c53f3aa1\"\n },\n {\n \"url\": \"tag/basic-knowledge/index.html\",\n \"revision\": \"d30a418bff2915394fc25d563c0b9c0b\"\n },\n {\n \"url\": \"tag/branch/index.html\",\n \"revision\": \"e951ac4c2e7c48440e697c8f0ac51915\"\n },\n {\n \"url\": \"tag/bt/index.html\",\n \"revision\": \"2b1a5eabe776fe0637a1b3bb8c83a0ba\"\n },\n {\n \"url\": \"tag/canvas/index.html\",\n \"revision\": \"3f2f84324022a128b77c4d59cff96873\"\n },\n {\n \"url\": \"tag/centos/index.html\",\n \"revision\": \"0027e2dac09aceb399ed6b2d039184ba\"\n },\n {\n \"url\": \"tag/chakra/index.html\",\n \"revision\": \"7190465bae3e2fb52947f4d12ca750a0\"\n },\n {\n \"url\": \"tag/cjs/index.html\",\n \"revision\": \"405dbd1747ef9607e5cfd2a1e336175c\"\n },\n {\n \"url\": \"tag/cli/index.html\",\n \"revision\": \"68961ccf0506f787e9c5b542040ab7b7\"\n },\n {\n \"url\": \"tag/cmd/index.html\",\n \"revision\": \"141b374e5d40111992c4cf1e7db65e1c\"\n },\n {\n \"url\": \"tag/cnpm/index.html\",\n \"revision\": \"f6ba1d5678c523a366b42f4fc01f73d6\"\n },\n {\n \"url\": \"tag/code-editor/index.html\",\n \"revision\": \"399fad1eb16c50f2a1709068140df8f5\"\n },\n {\n \"url\": \"tag/command-pattern/index.html\",\n \"revision\": \"3bae9f47e10cc100d8c6991323600138\"\n },\n {\n \"url\": \"tag/commit/index.html\",\n \"revision\": \"475080803a9789c2aec6123e2f107ec2\"\n },\n {\n \"url\": \"tag/computer-science/index.html\",\n \"revision\": \"36585f8c880fe40c016c22e87009b558\"\n },\n {\n \"url\": \"tag/css/index.html\",\n \"revision\": \"b7593ce0d01ebc4d727ca200cc00ffa8\"\n },\n {\n \"url\": \"tag/data-model/index.html\",\n \"revision\": \"0192efc223abce6d4cdbfbb5a3344b91\"\n },\n {\n \"url\": \"tag/debug/index.html\",\n \"revision\": \"c0f2a67018b5ed4cd98b2c2dc5ef7f7e\"\n },\n {\n \"url\": \"tag/design-pattern/index.html\",\n \"revision\": \"c03eb1755906108e39a259b5b8271518\"\n },\n {\n \"url\": \"tag/dnd-kit/index.html\",\n \"revision\": \"8447c30e3511bf9a601350e2cb3de452\"\n },\n {\n \"url\": \"tag/docker/index.html\",\n \"revision\": \"6063d8a5c57d524a13a5b2e4872d50d4\"\n },\n {\n \"url\": \"tag/effect-hooks/index.html\",\n \"revision\": \"84113570518c17d2078a91b859a65e24\"\n },\n {\n \"url\": \"tag/efficiency/index.html\",\n \"revision\": \"a13c183efe3af7ef4a7f3b00817e0319\"\n },\n {\n \"url\": \"tag/esm/index.html\",\n \"revision\": \"c6bbbd58d4049fb9e87d4b2b442ef935\"\n },\n {\n \"url\": \"tag/express/index.html\",\n \"revision\": \"e0f52a63436b3a1007992cd56685a6f8\"\n },\n {\n \"url\": \"tag/factory-pattern/index.html\",\n \"revision\": \"f26df47416ea56b3b4607c1601da045f\"\n },\n {\n \"url\": \"tag/flyweight-pattern/index.html\",\n \"revision\": \"305afd649ea56a260e99528f4ae813a8\"\n },\n {\n \"url\": \"tag/form/index.html\",\n \"revision\": \"3e0afaf69216cd8559a79e96ee29e40b\"\n },\n {\n \"url\": \"tag/frontend/index.html\",\n \"revision\": \"b4898e63801a76ef301d3c250405e70e\"\n },\n {\n \"url\": \"tag/git/index.html\",\n \"revision\": \"4f2b70b98b1f4476ab8461777d01c7b3\"\n },\n {\n \"url\": \"tag/github-auto-commit/index.html\",\n \"revision\": \"1b39da02a70f33bc163ab077be4c969f\"\n },\n {\n \"url\": \"tag/github/index.html\",\n \"revision\": \"e35e693f453beb6b46a8fa13a6bf6bf5\"\n },\n {\n \"url\": \"tag/grid/index.html\",\n \"revision\": \"42228025336d14cafbb2d3577fe73a28\"\n },\n {\n \"url\": \"tag/highcharts/index.html\",\n \"revision\": \"36821b95ddf82981e2e1cbdb4ffbef4c\"\n },\n {\n \"url\": \"tag/history/index.html\",\n \"revision\": \"c9df216f77fd2ddadaf0bd1cd6cd02c9\"\n },\n {\n \"url\": \"tag/hooks/index.html\",\n \"revision\": \"97a58ef8cae6d878b2114418c05f41df\"\n },\n {\n \"url\": \"tag/html/index.html\",\n \"revision\": \"d956521e8dff0823aae87c373d582587\"\n },\n {\n \"url\": \"tag/html5/index.html\",\n \"revision\": \"82cb2847b3828c536b26126b8c72fe6a\"\n },\n {\n \"url\": \"tag/http-code/index.html\",\n \"revision\": \"b587a3245ed112bbefbedc69a9ac7733\"\n },\n {\n \"url\": \"tag/http/index.html\",\n \"revision\": \"174b944934b6e64c8831f25a4ba8c31d\"\n },\n {\n \"url\": \"tag/https/index.html\",\n \"revision\": \"c97d3098cab49c94e4450d9b0db3346a\"\n },\n {\n \"url\": \"tag/index.html\",\n \"revision\": \"6de5865f0f86518657ebdeeaa7466ee1\"\n },\n {\n \"url\": \"tag/init-project/index.html\",\n \"revision\": \"c6875ce8fbc20dccf0b69a3851a071b9\"\n },\n {\n \"url\": \"tag/kitchen/index.html\",\n \"revision\": \"9c1aca3d22b6e2c22f1c7e8992b65891\"\n },\n {\n \"url\": \"tag/langchain/index.html\",\n \"revision\": \"d3d17bf51c6a230a9eabe12d58ee14b2\"\n },\n {\n \"url\": \"tag/language-advanced/index.html\",\n \"revision\": \"a3253ea45b1a1a229994a4a69eb0e11d\"\n },\n {\n \"url\": \"tag/language-basic/index.html\",\n \"revision\": \"9a170fa4f840c909a56706ccdb260d2b\"\n },\n {\n \"url\": \"tag/mediator-pattern/index.html\",\n \"revision\": \"7d442c92680782c006dbbe88f6a9710a\"\n },\n {\n \"url\": \"tag/middleware-pattern/index.html\",\n \"revision\": \"f210478e65516002afb49130df3ce97e\"\n },\n {\n \"url\": \"tag/module/index.html\",\n \"revision\": \"7d657dfb258bf8aeef4618355b26cf51\"\n },\n {\n \"url\": \"tag/mysql/index.html\",\n \"revision\": \"67ffd1f7389b43d031492eb0288b4b1e\"\n },\n {\n \"url\": \"tag/network/index.html\",\n \"revision\": \"00a0cc3ed1a45a1a82a2c978af2ab8bd\"\n },\n {\n \"url\": \"tag/new/index.html\",\n \"revision\": \"11ac644494cfb80d25a1a4eabdaaf1aa\"\n },\n {\n \"url\": \"tag/next.js/index.html\",\n \"revision\": \"68e13485de43a7a3af03b5cc1f1816b9\"\n },\n {\n \"url\": \"tag/node/index.html\",\n \"revision\": \"42069603449012caffc58e1aef0c97ad\"\n },\n {\n \"url\": \"tag/npm/index.html\",\n \"revision\": \"f527ebdff5341674b4d4f59e0a3edd76\"\n },\n {\n \"url\": \"tag/object/index.html\",\n \"revision\": \"392d876e6913639acad8f6ca6a55ed3e\"\n },\n {\n \"url\": \"tag/openai/index.html\",\n \"revision\": \"120895296f0f4aad81c80aaf8c605edc\"\n },\n {\n \"url\": \"tag/pages-router/index.html\",\n \"revision\": \"0a298d830eeaeef8eb0b261a75f68c66\"\n },\n {\n \"url\": \"tag/pnpm/index.html\",\n \"revision\": \"4c9f4aaff18095341fc91ec1b6b712ab\"\n },\n {\n \"url\": \"tag/postcss/index.html\",\n \"revision\": \"0d8df8880182691ed3d5102142f7d201\"\n },\n {\n \"url\": \"tag/pragmatic/index.html\",\n \"revision\": \"9aca1e6123106b88d6398b404454bccb\"\n },\n {\n \"url\": \"tag/react-core/index.html\",\n \"revision\": \"55af43b6a695293583f96c5d966a35a8\"\n },\n {\n \"url\": \"tag/react/index.html\",\n \"revision\": \"313e2720a0ae3389a1f471b47974b4ed\"\n },\n {\n \"url\": \"tag/rspack/index.html\",\n \"revision\": \"96e6910d39944614b1269df33aa9f90f\"\n },\n {\n \"url\": \"tag/rss/index.html\",\n \"revision\": \"3c615b5fd1e3118f078202f702752d2e\"\n },\n {\n \"url\": \"tag/selector/index.html\",\n \"revision\": \"6ee1356946918726f700f7ebcc5ccb54\"\n },\n {\n \"url\": \"tag/seo/index.html\",\n \"revision\": \"a8eeff60ccf5ed2e2df14ff7d32e38f6\"\n },\n {\n \"url\": \"tag/sql/index.html\",\n \"revision\": \"18e1e93bd4896b60c5b745c395c90e95\"\n },\n {\n \"url\": \"tag/ssg/index.html\",\n \"revision\": \"3fa6efb60cfd456cfdcd431756582e0f\"\n },\n {\n \"url\": \"tag/ssh/index.html\",\n \"revision\": \"b343a3009b7d3caa4d3e5ba107f34e4f\"\n },\n {\n \"url\": \"tag/ssr/index.html\",\n \"revision\": \"5c53972ffbe3c1fc270fde7ad13208d4\"\n },\n {\n \"url\": \"tag/state-hooks/index.html\",\n \"revision\": \"9dbf7512ebb9768849b65c9068f6425e\"\n },\n {\n \"url\": \"tag/styled-system/index.html\",\n \"revision\": \"270fdc10565241b89e4eb36ec16ce2d5\"\n },\n {\n \"url\": \"tag/svg/index.html\",\n \"revision\": \"f95084de8e2c837f71bccdff911676fc\"\n },\n {\n \"url\": \"tag/tcp/index.html\",\n \"revision\": \"9deb979da59e0270c001db08a0ca20f0\"\n },\n {\n \"url\": \"tag/tcpip-模型/index.html\",\n \"revision\": \"7080bd7d8c1b5e68bb08175adfa255d4\"\n },\n {\n \"url\": \"tag/this/index.html\",\n \"revision\": \"eaec68f7129c758cedc9f4962112758c\"\n },\n {\n \"url\": \"tag/trick/index.html\",\n \"revision\": \"47fe52370f2f46fd6862a30e3af6a1fc\"\n },\n {\n \"url\": \"tag/typescript/index.html\",\n \"revision\": \"fdd573c2db9edf2caef456238e093622\"\n },\n {\n \"url\": \"tag/udp/index.html\",\n \"revision\": \"0ef7609bc3db13fc997c8e9fe9762ac9\"\n },\n {\n \"url\": \"tag/v8-引擎/index.html\",\n \"revision\": \"0bc7cfc47c5050a9a7b301a04397f2c1\"\n },\n {\n \"url\": \"tag/vanilla/index.html\",\n \"revision\": \"c1a38ac938018a22cf27077442fdc240\"\n },\n {\n \"url\": \"tag/vite/index.html\",\n \"revision\": \"6366849d8f493d49184a0ec60c0fa316\"\n },\n {\n \"url\": \"tag/vscode/index.html\",\n \"revision\": \"543dfbcd728bc0c2724f53bcda974b40\"\n },\n {\n \"url\": \"tag/vuepress/index.html\",\n \"revision\": \"f0f5282a1dda43efe07b255f6990edb2\"\n },\n {\n \"url\": \"tag/vuex/index.html\",\n \"revision\": \"a702c90fd78bc773799f310c585b62c8\"\n },\n {\n \"url\": \"tag/web-worker/index.html\",\n \"revision\": \"3ecd75198e74495a836178b88a028631\"\n },\n {\n \"url\": \"tag/webpack/index.html\",\n \"revision\": \"b618e22384c694d5a80a8e68a19fa671\"\n },\n {\n \"url\": \"tag/yarn/index.html\",\n \"revision\": \"6a3d790c07e3f39a6c2f4ecec53eec1c\"\n },\n {\n \"url\": \"tag/yeoman/index.html\",\n \"revision\": \"c387f8b30e386e571cfcedabb90308b5\"\n },\n {\n \"url\": \"tag/zsh/index.html\",\n \"revision\": \"447ec7c6f18f6c68ad765a066edb5cb4\"\n },\n {\n \"url\": \"tag/事件循环/index.html\",\n \"revision\": \"bad5acd6ea64ee7fd1ac62cf56211bd2\"\n },\n {\n \"url\": \"tag/二分查找/index.html\",\n \"revision\": \"9febf8271535b70c5a20802732eee86e\"\n },\n {\n \"url\": \"tag/二叉搜索树/index.html\",\n \"revision\": \"35e5015b66343140d8d7cbb952149112\"\n },\n {\n \"url\": \"tag/二叉树/index.html\",\n \"revision\": \"fa9e734bea97078e79d30be68f4a9bd6\"\n },\n {\n \"url\": \"tag/代码规范/index.html\",\n \"revision\": \"adbe4317d68833cfc5295ac09796827d\"\n },\n {\n \"url\": \"tag/关系数据库模型/index.html\",\n \"revision\": \"6bc829fcdb01454b6d3e717c87ab3750\"\n },\n {\n \"url\": \"tag/兼容/index.html\",\n \"revision\": \"767f13b2c04ff3ea7883968aff719821\"\n },\n {\n \"url\": \"tag/函数/index.html\",\n \"revision\": \"f6366be667056d1f726ed3c01cf09ee6\"\n },\n {\n \"url\": \"tag/前端存储/index.html\",\n \"revision\": \"58cf6d63eac9a05c405a40c9eaf3ae7d\"\n },\n {\n \"url\": \"tag/动态规划/index.html\",\n \"revision\": \"d6cb08441ca44d876ce94098e138280d\"\n },\n {\n \"url\": \"tag/双指针/index.html\",\n \"revision\": \"908d7a8e2344394fdcd07c57ee52b4d6\"\n },\n {\n \"url\": \"tag/图片批注/index.html\",\n \"revision\": \"bc3461c09148cb995674f8882ace3392\"\n },\n {\n \"url\": \"tag/垃圾回收/index.html\",\n \"revision\": \"555d6726a8389b9c550bc22e84b0d0c4\"\n },\n {\n \"url\": \"tag/工程化/index.html\",\n \"revision\": \"0b0e0a1957967f4a7b1a791a326cb257\"\n },\n {\n \"url\": \"tag/布局/index.html\",\n \"revision\": \"73a386051c56b0b669fcf6a15196e4ce\"\n },\n {\n \"url\": \"tag/弹性盒/index.html\",\n \"revision\": \"bca474cffe4975acf356d3d7f39cb179\"\n },\n {\n \"url\": \"tag/御膳房/index.html\",\n \"revision\": \"e56eacb452e8aa52eaa9216493cc0cbc\"\n },\n {\n \"url\": \"tag/手写代码/index.html\",\n \"revision\": \"98a826349738aef6c73de2b055f26859\"\n },\n {\n \"url\": \"tag/拖拽排序/index.html\",\n \"revision\": \"d79c8fe38a157ea21e45aeb3c748eaa0\"\n },\n {\n \"url\": \"tag/数据库设计理论/index.html\",\n \"revision\": \"37e4326eb4f1a1aa021662f45cf64b93\"\n },\n {\n \"url\": \"tag/数据类型/index.html\",\n \"revision\": \"e16fac69f2459c361d3152461bc7d5b2\"\n },\n {\n \"url\": \"tag/数组/index.html\",\n \"revision\": \"c97f4c13826ce9de76e5646f778c3215\"\n },\n {\n \"url\": \"tag/文件上传/index.html\",\n \"revision\": \"1c3698e91a4758be26582080c78427a4\"\n },\n {\n \"url\": \"tag/模块化/index.html\",\n \"revision\": \"730383ebbb22a337b2228bfafdc88b92\"\n },\n {\n \"url\": \"tag/浅拷贝/index.html\",\n \"revision\": \"748a8ed6a07b1ebdc5e4dc04725c2b2b\"\n },\n {\n \"url\": \"tag/浏览器渲染/index.html\",\n \"revision\": \"a01cf4770385eee04ad78d0dd080d9cc\"\n },\n {\n \"url\": \"tag/浮动/index.html\",\n \"revision\": \"d6abb2d9b54aa43ec9513c4f48d30ce6\"\n },\n {\n \"url\": \"tag/深入组件/index.html\",\n \"revision\": \"00054c869f10b44963fe28f22d2d18c8\"\n },\n {\n \"url\": \"tag/深拷贝/index.html\",\n \"revision\": \"6737031a6e440898ddea51ef4f94027c\"\n },\n {\n \"url\": \"tag/源码阅读/index.html\",\n \"revision\": \"9eda7445b9a983f6c5e41b43bb649f86\"\n },\n {\n \"url\": \"tag/移动端适配/index.html\",\n \"revision\": \"3d8bd7ab6b22a0a6b821f7906770dfa7\"\n },\n {\n \"url\": \"tag/组件库/index.html\",\n \"revision\": \"9a5ffa4ab8bbb580f2cb8836cc7181e2\"\n },\n {\n \"url\": \"tag/组件通信/index.html\",\n \"revision\": \"08a7e2bbc90c585e7babd35bfa527f8b\"\n },\n {\n \"url\": \"tag/组合式-api/index.html\",\n \"revision\": \"8250ae1e59c51a68a3f0415587d2a831\"\n },\n {\n \"url\": \"tag/网络请求/index.html\",\n \"revision\": \"5686ae20c13809b86a679b90c5ef9d17\"\n },\n {\n \"url\": \"tag/链表/index.html\",\n \"revision\": \"e1a8897d0540fbdf1d9bd981a9ac6a3c\"\n },\n {\n \"url\": \"tag/面向对象/index.html\",\n \"revision\": \"256bb94542b161c6ba9e4788f5e263db\"\n },\n {\n \"url\": \"tag/项目/index.html\",\n \"revision\": \"54808994002152a9780acb50dcbd6a01\"\n },\n {\n \"url\": \"tag/项目打包/index.html\",\n \"revision\": \"f62f7a60386b887167658536161617a5\"\n },\n {\n \"url\": \"tag/项目部署/index.html\",\n \"revision\": \"b3bd33d849649715def1f815ff2bd8a1\"\n },\n {\n \"url\": \"timeline/index.html\",\n \"revision\": \"25afb1354720802c919629bdfc1fa77e\"\n },\n {\n \"url\": \"assets/event-loop-3S7ql_ag.png\",\n \"revision\": \"73c49f2d9fbee1024bb5514bda223259\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/006/HTTP.png\",\n \"revision\": \"696f03139b0a7cd58f61fbda9ca71569\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/006/https-flow.png\",\n \"revision\": \"530732dac1410693cbdbcfeaf8616bcc\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/006/HTTPS.png\",\n \"revision\": \"b7b94c88fd268426680a0c6ca45de5c6\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/006/mid-attack.png\",\n \"revision\": \"f101a27ef11244840aeeca965614da8a\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/007/four.png\",\n \"revision\": \"91ec936c98b288f6f03fec1feeb56bf9\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/007/three.png\",\n \"revision\": \"3d375830b92323a4dab374dcb488ce95\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/010/DNS.png\",\n \"revision\": \"5754e327ee776e651564ad67510a9f66\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/010/message.png\",\n \"revision\": \"fdc1dde481eeae37518ec1a75e964463\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/010/parse-url.png\",\n \"revision\": \"68e965d160d8a8728680356d5e5304e0\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/010/TCP-IP.png\",\n \"revision\": \"eaabb9a2407bfcca4c2e4fb8834b52d6\"\n },\n {\n \"url\": \"assets/image/frontend/basic/css/003/abnormal-box.png\",\n \"revision\": \"f71a1ccfe4bdcff13ae3b08f24b0ddf9\"\n },\n {\n \"url\": \"assets/image/frontend/basic/css/003/box.png\",\n \"revision\": \"663746ae4c9c718590e09adb1fa72caf\"\n },\n {\n \"url\": \"assets/image/frontend/basic/css/003/normal-box.png\",\n \"revision\": \"d7567d94ca78a57d31bcc40a20c5cefd\"\n },\n {\n \"url\": \"assets/image/frontend/basic/html/002/avatar.jpg\",\n \"revision\": \"bcd2b5352170f5d515b1dd8d969bc872\"\n },\n {\n \"url\": \"assets/image/frontend/tool/vite/001/bundle.png\",\n \"revision\": \"9affcc8711ebfcd3d3cc7269c57ced52\"\n },\n {\n \"url\": \"assets/image/frontend/tool/vite/001/esm-problem.png\",\n \"revision\": \"836cb8a52a868faa0474ff52b04e28a0\"\n },\n {\n \"url\": \"assets/image/frontend/tool/vite/001/esm-vite.png\",\n \"revision\": \"cc374f5589cb7c50a73440e53cad1d41\"\n },\n {\n \"url\": \"assets/image/frontend/tool/vite/001/vite.png\",\n \"revision\": \"916a6df6ac5972e0594a1be4c5fff31c\"\n },\n {\n \"url\": \"assets/image/frontend/tool/webpack/004/mode.png\",\n \"revision\": \"c5b190fa1356dde8cf0f9c54cb9b759d\"\n },\n {\n \"url\": \"assets/image/frontend/tool/webpack/004/source-map-1.png\",\n \"revision\": \"9edcbdb60792b9cccef52ee3e4e7e197\"\n },\n {\n \"url\": \"assets/image/frontend/tool/webpack/004/source-map-2.png\",\n \"revision\": \"9087a9aa58eb580e0298f0cd4b59b5c2\"\n },\n {\n \"url\": \"assets/provide-inject-m2qurnhp.png\",\n \"revision\": \"f7110a1bae2d0744997012ca656d8fa1\"\n },\n {\n \"url\": \"assets/scope-XtMnboSO.png\",\n \"revision\": \"00cf6bd787014eb22b2821d72b80212a\"\n },\n {\n \"url\": \"assets/scoped-slot-zLA5fzs5.png\",\n \"revision\": \"c6ef14ba02eac288245c5c5009d966cc\"\n },\n {\n \"url\": \"avatar.jpeg\",\n \"revision\": \"c74016a1dc6691fefe6ad212f1034757\"\n },\n {\n \"url\": \"hero.webp\",\n \"revision\": \"73886f53045fdd0606a196548e42e9a0\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches"],"mappings":"0nBAqBAA,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACP,IAGFC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,WACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,2EACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,qEACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,mEACPC,SAAY,oCAEd,CACED,IAAO,qEACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,iBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,YACPC,SAAY,qCAEb,CAAE,GACLC,EAAAA"} \ No newline at end of file +{"version":3,"file":"service-worker.js","sources":["../../../../../tmp/0a0a8347ee75eff2508864273eb6dfe2/service-worker.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/home/runner/work/blog/blog/node_modules/.pnpm/workbox-core@7.0.0/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/runner/work/blog/blog/node_modules/.pnpm/workbox-precaching@7.0.0/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/home/runner/work/blog/blog/node_modules/.pnpm/workbox-precaching@7.0.0/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"assets/0001、二叉树.html-dZHoE2lD.js\",\n \"revision\": \"15fd474c3d0188a96cd33bb91bb487d5\"\n },\n {\n \"url\": \"assets/0002、二叉搜索树.html-BRHkwM8L.js\",\n \"revision\": \"2be42b3cef65c86bd2f759b59d13682e\"\n },\n {\n \"url\": \"assets/0003、动态规划.html-U9YyrO12.js\",\n \"revision\": \"ca86d230902e47e6fb2e9e7d7ef91303\"\n },\n {\n \"url\": \"assets/0004、链表.html-DGNJio24.js\",\n \"revision\": \"496946c245ac4a2d7f0010cf2472875a\"\n },\n {\n \"url\": \"assets/0007、WebSocket.html-rjc6_IG0.js\",\n \"revision\": \"54bf0b967f704406ca96cf9387203709\"\n },\n {\n \"url\": \"assets/0008、WebStorage.html-5kGJ81lf.js\",\n \"revision\": \"ea472f50f866de9325645e4c829eb873\"\n },\n {\n \"url\": \"assets/001-character-encoding.html-E_VDWDGh.js\",\n \"revision\": \"d4b468cd206317571bebcf9dbec86971\"\n },\n {\n \"url\": \"assets/001-dnd-kit.html-jsyMYY9a.js\",\n \"revision\": \"15de68d64b6aaeca8e6827284f2cad3c\"\n },\n {\n \"url\": \"assets/001-finalhandler.html-s_PiC4wA.js\",\n \"revision\": \"565ea6b8f25f1c28b5706ef694bc7e42\"\n },\n {\n \"url\": \"assets/001-hello-database.html-Zgc4Q_aW.js\",\n \"revision\": \"2e7f6a9fe29f7d0b14f51ff96b06b76b\"\n },\n {\n \"url\": \"assets/001-hello-rspack.html-hPXOzEdL.js\",\n \"revision\": \"3736f810cce11a7df18c20ce2ff93e9a\"\n },\n {\n \"url\": \"assets/001-hello-vite.html-7wlT7B5t.js\",\n \"revision\": \"a2cecf32aa0ee2b577c31ad4f5a99526\"\n },\n {\n \"url\": \"assets/001-html-history.html-tURB45U7.js\",\n \"revision\": \"29edf4b02b766925b696ad787c01da4c\"\n },\n {\n \"url\": \"assets/001-init-project.html-9epaxP2F.js\",\n \"revision\": \"b8daffe7c13abc0804a09026f48b631e\"\n },\n {\n \"url\": \"assets/001-init-project.html-txRST9Rg.js\",\n \"revision\": \"ba881fa2eb6a39a6abe53e9d1c66c65a\"\n },\n {\n \"url\": \"assets/001-install-mysql.html-qc7jqvu9.js\",\n \"revision\": \"7b88aa29bd8e367fa8f6508397848061\"\n },\n {\n \"url\": \"assets/001-modularization.html-aVDXVF3p.js\",\n \"revision\": \"74547084094359cf28f715ea1ba41703\"\n },\n {\n \"url\": \"assets/001-module.html-S6GWBUID.js\",\n \"revision\": \"f04b24811cbd5d235c1c2dc92103152b\"\n },\n {\n \"url\": \"assets/001-network-model.html-AnQrVYyf.js\",\n \"revision\": \"a762ba567a56ddd795b1b245415edd05\"\n },\n {\n \"url\": \"assets/001-quick-start.html-reK2EBPD.js\",\n \"revision\": \"b592888c895668f79a82d7f0f8a40a0f\"\n },\n {\n \"url\": \"assets/001-set-the-ssh.html-_kRdhh4B.js\",\n \"revision\": \"8a40054f5ae5d4a8cedef530b590548e\"\n },\n {\n \"url\": \"assets/001-var-let-const.html-s47UVxV9.js\",\n \"revision\": \"aec159ca1ef535312b5cae0800109685\"\n },\n {\n \"url\": \"assets/001-webpack-basic.html-iANhhZl5.js\",\n \"revision\": \"ee9a5fc97eddedb8d02810a42c9571fa\"\n },\n {\n \"url\": \"assets/0010、WebWorker.html-z-ry9p5x.js\",\n \"revision\": \"d8267a701712bb7bd95829c465101350\"\n },\n {\n \"url\": \"assets/0011、判断对象值相等.html-Qe14ZYL2.js\",\n \"revision\": \"e56d97491be7ff016fb83294060bdf15\"\n },\n {\n \"url\": \"assets/0012、AJAX.html-KSX5mbJA.js\",\n \"revision\": \"a26ef0ad13b448d35ed4c5a8b176f546\"\n },\n {\n \"url\": \"assets/0014、浅拷贝与深拷贝.html-KNURvFJh.js\",\n \"revision\": \"29fdd29e2514381a6b562d16674d4c7b\"\n },\n {\n \"url\": \"assets/0017、事件循环.html-RxwjAYeR.js\",\n \"revision\": \"fd45a9cf4bb99d582a38863de38910c2\"\n },\n {\n \"url\": \"assets/002-annotation.html-jSTF0IVD.js\",\n \"revision\": \"9b8197d5f35630d77f4df2e77d00cb11\"\n },\n {\n \"url\": \"assets/002-build-git-server.html-k7ZuvaaM.js\",\n \"revision\": \"7394ca89ec8b24b63d502007107b4cc4\"\n },\n {\n \"url\": \"assets/002-HTTP-overview.html-yA9pf-8X.js\",\n \"revision\": \"dab8d3a5d31e9d73853478edea7f9977\"\n },\n {\n \"url\": \"assets/002-package-manager.html-8ga7lBMd.js\",\n \"revision\": \"7500a1026a3bb5ca8713a66eaa92a0f2\"\n },\n {\n \"url\": \"assets/002-quick-start.html-GzDTnx7H.js\",\n \"revision\": \"55e60cf7be76908eea9135aeda216ec7\"\n },\n {\n \"url\": \"assets/002-relation-model.html-eh9sdhEc.js\",\n \"revision\": \"9ec4a83fdf0a05a6cce7780a3786249b\"\n },\n {\n \"url\": \"assets/002-selector.html-Y8lG2Qy6.js\",\n \"revision\": \"1355a11dc11beb4f2a564f71fdc68d77\"\n },\n {\n \"url\": \"assets/002-types.html-X5moh2oe.js\",\n \"revision\": \"0230c5fef5b43a35e55b18c801e7e44d\"\n },\n {\n \"url\": \"assets/002-webpack-css.html-C0hFA9Ag.js\",\n \"revision\": \"4719685633a9f488c311a88eed312833\"\n },\n {\n \"url\": \"assets/003-box-model.html-FIoUn3l-.js\",\n \"revision\": \"3973a7ee035aa9dacbd0b1e929f87408\"\n },\n {\n \"url\": \"assets/003-configure-bt.html-3e4O9NhM.js\",\n \"revision\": \"45214c50b54fed11ff1d0c3bbae5bdf5\"\n },\n {\n \"url\": \"assets/003-db-design.html-Oji9hdtE.js\",\n \"revision\": \"dd2b108e9b491419be977e365665fe2b\"\n },\n {\n \"url\": \"assets/003-doctype.html-3ssLfMA4.js\",\n \"revision\": \"051b61987492a4df5db481ceb8aa65a4\"\n },\n {\n \"url\": \"assets/003-file-upload.html-PdEE_gdK.js\",\n \"revision\": \"9fef03b61b897a248096119dc224eafd\"\n },\n {\n \"url\": \"assets/003-get-post-difference.html-y7Gjbjjy.js\",\n \"revision\": \"340a60b11131957a4d01d6c38bf29ceb\"\n },\n {\n \"url\": \"assets/003-judge-type.html-0nLfDuM_.js\",\n \"revision\": \"c9d766db05d4896f07d6298709841093\"\n },\n {\n \"url\": \"assets/003-tool.html-DLnZqT_R.js\",\n \"revision\": \"b4caa596ac9bc2e0d77175633131f7a1\"\n },\n {\n \"url\": \"assets/003-webpack-assets.html-kB2bMhYm.js\",\n \"revision\": \"fbd998fbdb2403d546c9d1183042e3bc\"\n },\n {\n \"url\": \"assets/004-advanced-db-model.html-tGr-G7p6.js\",\n \"revision\": \"2809dcda2e64d891c5ca0b435b91b5f7\"\n },\n {\n \"url\": \"assets/004-automated-deployment.html-wjHFQrWt.js\",\n \"revision\": \"a8601798fcacde289fb76fee4543c271\"\n },\n {\n \"url\": \"assets/004-common-element.html-q8tUaFIS.js\",\n \"revision\": \"a5a1c5f4ea423a9ea978c48ebcaa87b2\"\n },\n {\n \"url\": \"assets/004-global-upload.html-2q23fxm8.js\",\n \"revision\": \"d40b72b4c172ee55bd6752baee421d5f\"\n },\n {\n \"url\": \"assets/004-HTTP-development.html-BBWBnLvD.js\",\n \"revision\": \"bc74c5ecc3d61084f84dcef130b46428\"\n },\n {\n \"url\": \"assets/004-primitive-value-reference-value.html-MLxMLvib.js\",\n \"revision\": \"cf23be212efbcb40e2edec025c6413c5\"\n },\n {\n \"url\": \"assets/004-project-standards.html-2vM9DZTK.js\",\n \"revision\": \"1d25f1cfafed8cf88cef5523b1581cd5\"\n },\n {\n \"url\": \"assets/004-text-font.html-ldUSeidH.js\",\n \"revision\": \"bf7f10fdd146d7487c2615ee6cff46f1\"\n },\n {\n \"url\": \"assets/004-webpack-plugin.html-n3ujVQXJ.js\",\n \"revision\": \"fcd1efd357c1119bd4eab1e8051e5ffd\"\n },\n {\n \"url\": \"assets/005-advanced-element.html-LXvnYZdN.js\",\n \"revision\": \"05c595e892d61531617f78d5cb89c580\"\n },\n {\n \"url\": \"assets/005-cascade-inheritance.html-5BhjxfCj.js\",\n \"revision\": \"d1e459785544619919aff01e5dfcd9ce\"\n },\n {\n \"url\": \"assets/005-execution-context.html-salfrApg.js\",\n \"revision\": \"473d8a15e7af3fb9386e7a3026730ae8\"\n },\n {\n \"url\": \"assets/005-HTTP-cache.html-KgXwqlEv.js\",\n \"revision\": \"08a12b5fd37e525c56edd61a5cd222ff\"\n },\n {\n \"url\": \"assets/005-install-docker.html-gBSt4qi-.js\",\n \"revision\": \"33b1a317361c95cf92c90e272a22a71a\"\n },\n {\n \"url\": \"assets/005-postcss-px-to-viewport.html-1cqOLJHS.js\",\n \"revision\": \"51b4394e5cc416c4a2d53085118e2228\"\n },\n {\n \"url\": \"assets/005-qwik.html-U4rDkWuK.js\",\n \"revision\": \"623001398b0be0c1996d121511d82c5a\"\n },\n {\n \"url\": \"assets/005-webpack-babel.html-Fqs9mfmk.js\",\n \"revision\": \"af318ec879f9b806d1e6185d9b6080d8\"\n },\n {\n \"url\": \"assets/005-yeoman.html-KxN9wacd.js\",\n \"revision\": \"3f5990eb96a4d158dafd94a90684270b\"\n },\n {\n \"url\": \"assets/006-animation-svg.html-8eIQ6Ihw.js\",\n \"revision\": \"4b2bd8538d34509df0f2ad5837d4408d\"\n },\n {\n \"url\": \"assets/006-background-border.html-RCrBWyb-.js\",\n \"revision\": \"0d10eb97e7172d16cc1d70c0dd21337e\"\n },\n {\n \"url\": \"assets/006-HTTPS-overview.html-SYoh5fQX.js\",\n \"revision\": \"488a4e82b705e5197e74a77be5af250a\"\n },\n {\n \"url\": \"assets/006-react-server-component.html-k-YETDuh.js\",\n \"revision\": \"2fb8573d1bd477d56039011edc6aac8b\"\n },\n {\n \"url\": \"assets/006-semantically-meaningful-tags.html-WThMFqDm.js\",\n \"revision\": \"dab5edef130db684bbb31bc5ff1b42d8\"\n },\n {\n \"url\": \"assets/006-toString-toLocalString-valueOf.html-cxsnu0DQ.js\",\n \"revision\": \"26db9c971d92c96a557a243d7b9a286d\"\n },\n {\n \"url\": \"assets/006-webpack-vue.html-1d_xRqtP.js\",\n \"revision\": \"54c2c9235b8c97da70a4b53290cce08e\"\n },\n {\n \"url\": \"assets/007-basic-reference-type.html-aceDmBbB.js\",\n \"revision\": \"45461cab6b9d566b15279dbf26232c23\"\n },\n {\n \"url\": \"assets/007-hydration-is-pure-overhead.html-RuYzXwld.js\",\n \"revision\": \"089d8eea563b8cb171498edc5969ec80\"\n },\n {\n \"url\": \"assets/007-media-tag.html-4B2dcBja.js\",\n \"revision\": \"1350e545bb6e1e766fe13b04a624c26f\"\n },\n {\n \"url\": \"assets/007-offline-export-in-highcharts.html-wjbjRKLu.js\",\n \"revision\": \"df3a70bc82b62e987bae0af3cc30b4dc\"\n },\n {\n \"url\": \"assets/007-position.html-bHWd8Nqh.js\",\n \"revision\": \"40d53c37ab3ab2f2e55623dcfc82fcc1\"\n },\n {\n \"url\": \"assets/007-TCP-three-handshakes-and-four-waves.html-dYxpKZ12.js\",\n \"revision\": \"15d3079322fc6d144c542d04764ba18d\"\n },\n {\n \"url\": \"assets/007-webpack-dev-server.html-t2yhyF-D.js\",\n \"revision\": \"6a81b6292ed047bffd085d6afdc5e749\"\n },\n {\n \"url\": \"assets/008-canvas-svg.html-J5y6viF5.js\",\n \"revision\": \"71b34b52a9e23e068904dfffa5c1bc98\"\n },\n {\n \"url\": \"assets/008-collection-reference-type.html-6hAWB_6B.js\",\n \"revision\": \"6fe4c77b2f07e4158ff656fb94c51138\"\n },\n {\n \"url\": \"assets/008-float.html-NWrPV4-8.js\",\n \"revision\": \"dada435d103c91f11f3811bf7d7c0da8\"\n },\n {\n \"url\": \"assets/008-tcp-udp.html-rUxlBxzI.js\",\n \"revision\": \"5b4a635d9c04393d941e6a06df4f732c\"\n },\n {\n \"url\": \"assets/008-webpack-resolve.html-WaOOPcO4.js\",\n \"revision\": \"4ad014bae79638c70ed4ce80671d29a6\"\n },\n {\n \"url\": \"assets/009-array-like-object.html-99xk2Ewf.js\",\n \"revision\": \"2abc5de46c36c7cb1fed3cfb445f08cf\"\n },\n {\n \"url\": \"assets/009-flex.html-UhyQHsgH.js\",\n \"revision\": \"a050ff78eeb45f4c5fa76948326e22c7\"\n },\n {\n \"url\": \"assets/009-http-code-when-authorized-refused.html-KimibnOR.js\",\n \"revision\": \"a63a32fced52a55c352e5f845d187adc\"\n },\n {\n \"url\": \"assets/009-src-vs-href.html-7SGMc5wm.js\",\n \"revision\": \"0a9bbc1d6f8d46f1eaf5f367a31cb43d\"\n },\n {\n \"url\": \"assets/009-webpack-env-split.html-2H2sFtOB.js\",\n \"revision\": \"39fbe1b0d6bbe1dd58976ed4e8f55784\"\n },\n {\n \"url\": \"assets/01-a-pragmatic-philosophy.html-2Asvolaw.js\",\n \"revision\": \"93e1159ae6b8e334800cf829b5e408b0\"\n },\n {\n \"url\": \"assets/01-array.html-qqj7snQD.js\",\n \"revision\": \"52daacc55a2d7482eb94dc04ef926156\"\n },\n {\n \"url\": \"assets/01-command-pattern.html-NToFxAAq.js\",\n \"revision\": \"7bfa525f29bf2ce068c502bcc2b743b9\"\n },\n {\n \"url\": \"assets/01-getting-started.html-WKDe7Qbs.js\",\n \"revision\": \"1a750cf6de933001b5bc6035be7cae50\"\n },\n {\n \"url\": \"assets/01-getting-started.html-y0dVi-KY.js\",\n \"revision\": \"6c6a34b063e8cd5035a6402aba161857\"\n },\n {\n \"url\": \"assets/01-how-browser-rendering-works.html-GwCLJ--h.js\",\n \"revision\": \"3d3e8fd7637513201028046c24bca6be\"\n },\n {\n \"url\": \"assets/01-init.html-zmrtRBND.js\",\n \"revision\": \"aacc0acdace19f2de0b0d99530644c4d\"\n },\n {\n \"url\": \"assets/01-maven.html-2dOiULAq.js\",\n \"revision\": \"65b0f6569fb76a1bf13ff0b9c21df2d9\"\n },\n {\n \"url\": \"assets/01-overview-architecture.html-2m6AorPJ.js\",\n \"revision\": \"a77aa71d0746c2a574399fb718884ee0\"\n },\n {\n \"url\": \"assets/01-pages-layouts.html-q0AcGxgI.js\",\n \"revision\": \"550ed42472f5516b4bbd6661c057349d\"\n },\n {\n \"url\": \"assets/01-quick-start.html-icBlNGVT.js\",\n \"revision\": \"12b61785c4ba34cf3bdf6b2d8e72f712\"\n },\n {\n \"url\": \"assets/01-quick-start.html-nSD4Idct.js\",\n \"revision\": \"d8d6388deb57e37a38a6702bf5b05ecd\"\n },\n {\n \"url\": \"assets/01-useState.html-TAgOQCTv.js\",\n \"revision\": \"104dd0b48c9ef300014380b8ef4439da\"\n },\n {\n \"url\": \"assets/01、父子组件通信.html-tJc86P4B.js\",\n \"revision\": \"31c609da41465bd5c30f1205f85cc3b1\"\n },\n {\n \"url\": \"assets/01.vuepress-plugin-ordered-header.html-q2B5p71G.js\",\n \"revision\": \"1226c4a6fb522b8aa3afbcd7b11a5b3e\"\n },\n {\n \"url\": \"assets/010-antd-textarea-placeholder-pre-line.html-FmF3dONc.js\",\n \"revision\": \"d39f18785a189d0571118c26625df3d1\"\n },\n {\n \"url\": \"assets/010-html5.html-IzmK_1on.js\",\n \"revision\": \"20c31dceb9416a01bdcecc40f47f320f\"\n },\n {\n \"url\": \"assets/010-object-property.html-CMstI5aK.js\",\n \"revision\": \"3e4f0432fdfde0e0c970ffa9d662cf78\"\n },\n {\n \"url\": \"assets/010-unit.html-fJENl0PI.js\",\n \"revision\": \"0d01675fc6d384028ea87b4eb58c783d\"\n },\n {\n \"url\": \"assets/011-center.html-QIgnh1uy.js\",\n \"revision\": \"7ed58780fe0adfa14d718485099b2e82\"\n },\n {\n \"url\": \"assets/011-create-object.html-i2ltl5i0.js\",\n \"revision\": \"aabbadb0c005f4dd8200a0e8a4dc0e5a\"\n },\n {\n \"url\": \"assets/011-defer-vs-async.html-BCGYD0Av.js\",\n \"revision\": \"2bb400b37eca818e8149a07cb1f071e5\"\n },\n {\n \"url\": \"assets/012-extends.html-0PMdv4Ro.js\",\n \"revision\": \"3f6a2c455442cddd685bce07fdd83f67\"\n },\n {\n \"url\": \"assets/012-form-validation.html-Z8hIzVSe.js\",\n \"revision\": \"9b8d2eb76fdc9e2bd3dcc347e78c2eb6\"\n },\n {\n \"url\": \"assets/012-grid.html-VQlEaWjN.js\",\n \"revision\": \"a6a10f3ac777aad58764e8116e3a1e46\"\n },\n {\n \"url\": \"assets/013-BFC.html-aFsmxXJq.js\",\n \"revision\": \"0a669c286e00709e7f045cfe42e312e3\"\n },\n {\n \"url\": \"assets/013-class.html-KYMn2F8Y.js\",\n \"revision\": \"8f02673ba6d76e2aa3c9dfdade3a1788\"\n },\n {\n \"url\": \"assets/013-seo.html-oy2Hbj6G.js\",\n \"revision\": \"4522cc466faf7f7c763600efa756fde5\"\n },\n {\n \"url\": \"assets/014-implement-new.html-42YlTdDK.js\",\n \"revision\": \"a296d90b5a04073cdadc90f123a8a7a6\"\n },\n {\n \"url\": \"assets/014-responsive-design-intro.html-7YdohJT-.js\",\n \"revision\": \"d94bc21f2666d8c6f0c2e9f7a761bfda\"\n },\n {\n \"url\": \"assets/015-auto-change-node.html-vmI9x_qg.js\",\n \"revision\": \"21d1e054d2a94cd88d6578be4d4ca875\"\n },\n {\n \"url\": \"assets/015-function.html-0dV-rtlJ.js\",\n \"revision\": \"2f69460b809f1bc08f484c0654dd6b72\"\n },\n {\n \"url\": \"assets/015-responsive-design.html-zWMQ9SbQ.js\",\n \"revision\": \"02cee5c9f11ff221b0aaa592a2c33b88\"\n },\n {\n \"url\": \"assets/016-how-to-responsive.html-3LyDgIXl.js\",\n \"revision\": \"4af778dc09857c963ef2eb3f0a8ca62a\"\n },\n {\n \"url\": \"assets/016-rest-client-error.html-JHYKZQb6.js\",\n \"revision\": \"67aa2a2da993911bad2be73aaee1a205\"\n },\n {\n \"url\": \"assets/016-this.html-V0F_Y6Ry.js\",\n \"revision\": \"8def429b57e5ffa370b5cefe5fb92cd7\"\n },\n {\n \"url\": \"assets/017-implement-call-apply-bind.html-inN8CfCD.js\",\n \"revision\": \"200eddae57f909654dc6b7b4dd3868db\"\n },\n {\n \"url\": \"assets/017-loading-spinner.html-RGOKwDDs.js\",\n \"revision\": \"7d2a6f6031625227666f1dd7208f39bc\"\n },\n {\n \"url\": \"assets/017-whistle-debug-real-phone.html-8fLPP_oc.js\",\n \"revision\": \"b58ca2b37f9f77fb0180ac4ca53d70ad\"\n },\n {\n \"url\": \"assets/018-autofill.html-k6Z5PbWM.js\",\n \"revision\": \"1b4d1e44ad977987ef46feae7fca3011\"\n },\n {\n \"url\": \"assets/018-monaco-editor-react.html-sSKOAfLt.js\",\n \"revision\": \"fcca21b1352d2b68d9fd961ac336ff7a\"\n },\n {\n \"url\": \"assets/019-ios-prevent-touch.html-sCERLB9h.js\",\n \"revision\": \"bb70d7f47cf57ef83642c0cc46a6a89d\"\n },\n {\n \"url\": \"assets/02-a-pragmatic-approach.html-JGy5n7BJ.js\",\n \"revision\": \"135af9934e04ac8ca288ad8d2d9ee4b3\"\n },\n {\n \"url\": \"assets/02-architecture-overview.html-6076uJDz.js\",\n \"revision\": \"bcdfe9f114d2ae0260c7256e61d6d1fe\"\n },\n {\n \"url\": \"assets/02-express.js.html-wRqB8YUW.js\",\n \"revision\": \"b531c36b837d322e509cc109a24ac858\"\n },\n {\n \"url\": \"assets/02-factory-pattern.html-Zwdb5ir_.js\",\n \"revision\": \"9308382dd77d8d8700c370d3ddf7e033\"\n },\n {\n \"url\": \"assets/02-git-basics.html-c-hemJSp.js\",\n \"revision\": \"95c22c2148f77ca845840c1195a3f6b7\"\n },\n {\n \"url\": \"assets/02-server.html-sju2MrZY.js\",\n \"revision\": \"4b197090e425458346d3c80ef11e1a03\"\n },\n {\n \"url\": \"assets/02-style-props.html-oN7Hm48h.js\",\n \"revision\": \"4dc420762bcb2d07cac040672fd08ee7\"\n },\n {\n \"url\": \"assets/02-useEffect.html-7KsZvcwk.js\",\n \"revision\": \"d5577c4e658ee34473d61023cfdd614d\"\n },\n {\n \"url\": \"assets/02-V8.html-abcG9r2W.js\",\n \"revision\": \"9acf31af99b41167b373306f7e04be9b\"\n },\n {\n \"url\": \"assets/02、provide-inject.html--gqiviyZ.js\",\n \"revision\": \"908b8645423636715fffadf87e4e2ef0\"\n },\n {\n \"url\": \"assets/02、Vuex 原理.html-hxEjAjw7.js\",\n \"revision\": \"bdf6446b6d80cca5357e717e1887b951\"\n },\n {\n \"url\": \"assets/020-ios-img.html-qmiwZBqQ.js\",\n \"revision\": \"29907a66cf1b5a72f272509ca9afe5e6\"\n },\n {\n \"url\": \"assets/03-basic-tool.html-g3IuINfV.js\",\n \"revision\": \"ac1eb31d09b4cb1122627831d5cee57a\"\n },\n {\n \"url\": \"assets/03-database.html-GzHjF5vt.js\",\n \"revision\": \"7adc24aac7d45212a023fa1a62f57ff3\"\n },\n {\n \"url\": \"assets/03-flyweight-pattern.html-IIVmQYZ2.js\",\n \"revision\": \"0407f6acb81ead18ccc9bd26bd1f0be4\"\n },\n {\n \"url\": \"assets/03-git-branch.html-CPKiQy0r.js\",\n \"revision\": \"5a8e364fe408aa8901573a6ae7e8a8bd\"\n },\n {\n \"url\": \"assets/03-memory-management.html-zNWUMiQc.js\",\n \"revision\": \"83ad91f13a4dfd727bafd63ab5cf1dde\"\n },\n {\n \"url\": \"assets/03-render-loop.html-dW4TkDPY.js\",\n \"revision\": \"03684218bbc4eab5bdcbf4eeea5a9cb1\"\n },\n {\n \"url\": \"assets/03、插槽.html-VPX4UrNy.js\",\n \"revision\": \"6b03e5dc7f77ab605927b44d9f341d28\"\n },\n {\n \"url\": \"assets/04-api.html-L9kwFNyo.js\",\n \"revision\": \"072cc820ddd65252f585d9b13f6791f3\"\n },\n {\n \"url\": \"assets/04-cross-domain.html-hLz1ACuK.js\",\n \"revision\": \"584559adfa70cdeabf5a8305e52626b5\"\n },\n {\n \"url\": \"assets/04-git-server.html-VbjfIz48.js\",\n \"revision\": \"b753c47b466b3bd34231c39b855d6c9c\"\n },\n {\n \"url\": \"assets/04-mediator-pattern.html-Wk0Fs-dK.js\",\n \"revision\": \"27c430ddc35b3470beb799ae272130d7\"\n },\n {\n \"url\": \"assets/04-pragmatic-paranoid.html-JLwUFQv7.js\",\n \"revision\": \"4b7dcb9ba3564619d376d0ccc7e0a6c4\"\n },\n {\n \"url\": \"assets/04-scene-graph.html-QBvEcXGS.js\",\n \"revision\": \"0893b511dd37b61653964def3096791d\"\n },\n {\n \"url\": \"assets/04、动态组件和异步组件.html-KRYxl05T.js\",\n \"revision\": \"253bb7a01fd324ba1a5a631d2b42254c\"\n },\n {\n \"url\": \"assets/05-middleware-pattern.html-hSMzJDay.js\",\n \"revision\": \"aa028c2432be8e15144d9692b7b1e9f1\"\n },\n {\n \"url\": \"assets/05-what-happens-after-entering-the-URL.html-OWWRueDp.js\",\n \"revision\": \"94d3fe5d05df6e040bdb4d0917530583\"\n },\n {\n \"url\": \"assets/05-work-around.html-kkeNGkzw.js\",\n \"revision\": \"42349da8ef0a4ff6387d754580cfa0d3\"\n },\n {\n \"url\": \"assets/05、组件的v-model.html-oSrQEt5s.js\",\n \"revision\": \"3977788fd1315fc056ae8a1d3c91a334\"\n },\n {\n \"url\": \"assets/06-change-commit.html-yJsOvgbD.js\",\n \"revision\": \"cebbcb0c3aa25a9cdcc9ebe81a535529\"\n },\n {\n \"url\": \"assets/06-concurrent.html-4XZcy3em.js\",\n \"revision\": \"691ae04a80968fce23fcceddf7763146\"\n },\n {\n \"url\": \"assets/06-mixin-pattern.html-xPNxrrXT.js\",\n \"revision\": \"68dd6462bd62f6ddd998054f28b53128\"\n },\n {\n \"url\": \"assets/06、Mixin.html-vFrCtzEG.js\",\n \"revision\": \"8cad0f4fc2917f857138f4dae073f02c\"\n },\n {\n \"url\": \"assets/07-module-pattern.html-PPpx4-1O.js\",\n \"revision\": \"850f41526392497683c198ea6ddfa259\"\n },\n {\n \"url\": \"assets/07-when-coding.html-mMkE9Kb1.js\",\n \"revision\": \"6633ef448fa640a8022c77c45e889da7\"\n },\n {\n \"url\": \"assets/07、组合式API基础.html-sWkWMy6L.js\",\n \"revision\": \"e824c2708bb5ac24250aa67b5cdb5884\"\n },\n {\n \"url\": \"assets/08-before-start-project.html-qoPrQxFC.js\",\n \"revision\": \"cf0395c8e42b15fa56daf2ced3254c93\"\n },\n {\n \"url\": \"assets/08、组合式函数.html-gNvTRZCR.js\",\n \"revision\": \"36f699fb7eeea7c02dc9875c4547caa6\"\n },\n {\n \"url\": \"assets/09-pragmatic-project.html-w1zorxVJ.js\",\n \"revision\": \"8886d67d3206df67690fd1ca8ce8ed96\"\n },\n {\n \"url\": \"assets/09、指令.html-KKqSJCFB.js\",\n \"revision\": \"bcfd64426ad665fae796f68c279d4c64\"\n },\n {\n \"url\": \"assets/10、插件.html-_zTLOduh.js\",\n \"revision\": \"56607337757b5a56efbf0d8e21827098\"\n },\n {\n \"url\": \"assets/2023.html-gXOG2LdF.js\",\n \"revision\": \"a857c218b9b1a070486022d25871d91e\"\n },\n {\n \"url\": \"assets/2024.html-Fl5-sZEu.js\",\n \"revision\": \"f8b676c30c3074b426bb8a4bd1e8c0e2\"\n },\n {\n \"url\": \"assets/404.html-ey9YfrM5.js\",\n \"revision\": \"5c082273ed7ab675140e83e43c17b73e\"\n },\n {\n \"url\": \"assets/app-I81jsmus.js\",\n \"revision\": \"5e26f8dfafa18b4d74b75779ea2cc745\"\n },\n {\n \"url\": \"assets/arc-jj2rQ79R.js\",\n \"revision\": \"7b37d111019a7b2af71571863326e1cf\"\n },\n {\n \"url\": \"assets/array-Nw74a44z.js\",\n \"revision\": \"17dcebeaf673b09a1ca5da014d20022f\"\n },\n {\n \"url\": \"assets/auto-XYC5A0Ix.js\",\n \"revision\": \"786b1aef9a90923f3aa3bab127b99c2c\"\n },\n {\n \"url\": \"assets/blockDiagram-6b2b5046-dPjrH4Tz.js\",\n \"revision\": \"2ff75ca5acbccab5e9b39cbef1e8214e\"\n },\n {\n \"url\": \"assets/c4Diagram-b947cdbb-6LlQD8gP.js\",\n \"revision\": \"126cce0063cffe59b20c7e540801085d\"\n },\n {\n \"url\": \"assets/channel-_BoElw_v.js\",\n \"revision\": \"737f53d7605ed0e406ba1aff429f11c9\"\n },\n {\n \"url\": \"assets/classDiagram-35230388-WCO95pQ7.js\",\n \"revision\": \"a46e92e896c916cb594f8b8c2896a285\"\n },\n {\n \"url\": \"assets/classDiagram-v2-412acd34-jptX3zzM.js\",\n \"revision\": \"9b64d51d7a37bbaa4944dd126ff61536\"\n },\n {\n \"url\": \"assets/clone-RIIBrVN3.js\",\n \"revision\": \"202e076452cdda99aee7f7cb18ff1f62\"\n },\n {\n \"url\": \"assets/codemirror-editor-j7-Ov7Pm.js\",\n \"revision\": \"69a59e3831ca11b11bee7d12b22a83d7\"\n },\n {\n \"url\": \"assets/createText-423428c9-DMNkaBZH.js\",\n \"revision\": \"9e2c37ab0921cfd7e02cd8b778bf61cd\"\n },\n {\n \"url\": \"assets/docsearch-w40geAFS.js\",\n \"revision\": \"68b329da9893e34099c7d8ad5cb9c940\"\n },\n {\n \"url\": \"assets/edges-d417c7a0-dMLW4fNk.js\",\n \"revision\": \"66b331fa67cfda169c275e36defe1190\"\n },\n {\n \"url\": \"assets/erDiagram-0ea73325-HOSw3jCf.js\",\n \"revision\": \"1251b2faf1cdf77b85ff24220bb16e8f\"\n },\n {\n \"url\": \"assets/flowchart-elk-definition-27cc417a-E40wJWYz.js\",\n \"revision\": \"1f2188648bcdadcdac01afc827e4d712\"\n },\n {\n \"url\": \"assets/flowchart-tiWkQJPF.js\",\n \"revision\": \"22ae562fadded7c906d7297d1f7c64f0\"\n },\n {\n \"url\": \"assets/flowDb-d35e309a-JunLwFy6.js\",\n \"revision\": \"17717bfb3c31fae8e9ece027a2d44e62\"\n },\n {\n \"url\": \"assets/flowDiagram-d949d7c1-Km3bw0Wv.js\",\n \"revision\": \"363d5d4d91a1d6d0c165a555d52617ee\"\n },\n {\n \"url\": \"assets/flowDiagram-v2-49332944-CeopBWYD.js\",\n \"revision\": \"7313e08bb3c1594ee8436a5e66a735b1\"\n },\n {\n \"url\": \"assets/ganttDiagram-5c869e3b-PaDnyKb9.js\",\n \"revision\": \"2e56986769c797ec41a59bbe6b51df93\"\n },\n {\n \"url\": \"assets/giscus-hHrgKA30.js\",\n \"revision\": \"dae7c2db562e417dc4bde3be5134780b\"\n },\n {\n \"url\": \"assets/gitGraphDiagram-b9d81de9-ii4rvYx6.js\",\n \"revision\": \"7a4c5bfb528ad69a6fc0f662a4934213\"\n },\n {\n \"url\": \"assets/graph-kdm1lDeG.js\",\n \"revision\": \"e2ad0d2e03ca77a6814d0b0bc817b869\"\n },\n {\n \"url\": \"assets/highlight.esm-qL7kkCul.js\",\n \"revision\": \"62b5f024c0d2737c1370675313dc2efe\"\n },\n {\n \"url\": \"assets/index-7IwC0DkA.js\",\n \"revision\": \"a0a6a74537488342822dc33151252ce7\"\n },\n {\n \"url\": \"assets/index-7SG8bi1h.js\",\n \"revision\": \"46a193641571106d3b7b43f9bc2a2735\"\n },\n {\n \"url\": \"assets/index-8fae9850-AldU4d2Z.js\",\n \"revision\": \"56600cad49fd64afa5990a0271461800\"\n },\n {\n \"url\": \"assets/index-QOy62Fup.js\",\n \"revision\": \"fa112b5cda5ee3c969c504c6a3080b4c\"\n },\n {\n \"url\": \"assets/index.html-_Ef4-0Of.js\",\n \"revision\": \"2b4c650cb4f90b18bb81d86c4adad1ee\"\n },\n {\n \"url\": \"assets/index.html-_ln2i5-P.js\",\n \"revision\": \"6cfe74afa55a66ce4a8875f2b0e09206\"\n },\n {\n \"url\": \"assets/index.html--6exqmtK.js\",\n \"revision\": \"1714ef29d02482b2751385578f1be739\"\n },\n {\n \"url\": \"assets/index.html--6TZOf5z.js\",\n \"revision\": \"6edd728413da302bb5747b046f51bbd7\"\n },\n {\n \"url\": \"assets/index.html--F5t8OTY.js\",\n \"revision\": \"47c8845b9db2d9c1a8feb33e24a2690f\"\n },\n {\n \"url\": \"assets/index.html--JPoGlT0.js\",\n \"revision\": \"57e8648f80f5e53091ce07c2e580da99\"\n },\n {\n \"url\": \"assets/index.html--L5HZE0X.js\",\n \"revision\": \"bee5b0300c2b77a753be72e81b095b65\"\n },\n {\n \"url\": \"assets/index.html--VlRPmKi.js\",\n \"revision\": \"2b74585a33de59e43ec760be43be7b2b\"\n },\n {\n \"url\": \"assets/index.html-0C__MQ28.js\",\n \"revision\": \"611c977e9212549cbfd5b13aeedb8101\"\n },\n {\n \"url\": \"assets/index.html-0CdTPh7N.js\",\n \"revision\": \"4434ec82515d351e1bbae5f1dcbd0f62\"\n },\n {\n \"url\": \"assets/index.html-0eyk_dry.js\",\n \"revision\": \"eb49827f1ff684d2d3b4b20aa59dfaeb\"\n },\n {\n \"url\": \"assets/index.html-0KCmLuwB.js\",\n \"revision\": \"fa1533f96ed015401f5ade4b690c9470\"\n },\n {\n \"url\": \"assets/index.html-0uRcbDSq.js\",\n \"revision\": \"3a766354d850456ef16ca9410129f22a\"\n },\n {\n \"url\": \"assets/index.html-0wnONOpX.js\",\n \"revision\": \"9671d7f458bf338fc52cc56ab4d2ace3\"\n },\n {\n \"url\": \"assets/index.html-14MHn-Up.js\",\n \"revision\": \"5a9730395369df0993aac518f6110517\"\n },\n {\n \"url\": \"assets/index.html-1Nr8bhuM.js\",\n \"revision\": \"4eb421d6cc98fac7ab6c8bd3925896d3\"\n },\n {\n \"url\": \"assets/index.html-23cYN8fI.js\",\n \"revision\": \"75d75a644bce3266aa4d396290094c99\"\n },\n {\n \"url\": \"assets/index.html-31ErRzhC.js\",\n \"revision\": \"76114b75e9e5eb355436e6d6b8300699\"\n },\n {\n \"url\": \"assets/index.html-3ghGFG8O.js\",\n \"revision\": \"c702ce7755e346efed13a2dc6ea1cac4\"\n },\n {\n \"url\": \"assets/index.html-3nJHAvil.js\",\n \"revision\": \"6772d7e9eb87be3b326c70f62645a7bc\"\n },\n {\n \"url\": \"assets/index.html-4Iq9ezl_.js\",\n \"revision\": \"4567897c25e6ac30badcd3769b2c9ce7\"\n },\n {\n \"url\": \"assets/index.html-4UU_vsFD.js\",\n \"revision\": \"cf844ed0e8a0d59f81dd03e74dd0e415\"\n },\n {\n \"url\": \"assets/index.html-4vDv9sc6.js\",\n \"revision\": \"6540030d911acf2caa4fcc04e0f5ff50\"\n },\n {\n \"url\": \"assets/index.html-5bSC_2vH.js\",\n \"revision\": \"f505d370d6edb860fb63b70e39209375\"\n },\n {\n \"url\": \"assets/index.html-5TDjfNLf.js\",\n \"revision\": \"c10ffb4953200be9f3d2f9f85453e8df\"\n },\n {\n \"url\": \"assets/index.html-66s9zgMZ.js\",\n \"revision\": \"e64f2f2a408fa528c8066d0251a662c1\"\n },\n {\n \"url\": \"assets/index.html-67kf_GGd.js\",\n \"revision\": \"ce5865a6698b59d94f3514f868cb375e\"\n },\n {\n \"url\": \"assets/index.html-6cowqeov.js\",\n \"revision\": \"63cf43b002692652d295128253768b4d\"\n },\n {\n \"url\": \"assets/index.html-6qpwIxqQ.js\",\n \"revision\": \"b4de524f776c5592996358ed6ac87089\"\n },\n {\n \"url\": \"assets/index.html-6wkUhdzd.js\",\n \"revision\": \"8ad16d15d25d2458165117d71ba82719\"\n },\n {\n \"url\": \"assets/index.html-7b-Yq8WZ.js\",\n \"revision\": \"e8d2e82e9c11204370274e378ad6a5e2\"\n },\n {\n \"url\": \"assets/index.html-7EzYSmUS.js\",\n \"revision\": \"fa7a53bdc024ec31cd5a2663add96119\"\n },\n {\n \"url\": \"assets/index.html-7hjLHxps.js\",\n \"revision\": \"26c82b86c1ce38ada70526774daa81bf\"\n },\n {\n \"url\": \"assets/index.html-8AvS5k6X.js\",\n \"revision\": \"b83152d8b3746a02952539e298b56fea\"\n },\n {\n \"url\": \"assets/index.html-8FWG5OXL.js\",\n \"revision\": \"7cff5078bf75f356ecdf917c7f99ce64\"\n },\n {\n \"url\": \"assets/index.html-90UyKJBw.js\",\n \"revision\": \"57a6a4f7dff7fd135594d9dfa519f1fb\"\n },\n {\n \"url\": \"assets/index.html-91G785uA.js\",\n \"revision\": \"1938721b9cb3100985201fe864f415d1\"\n },\n {\n \"url\": \"assets/index.html-93LI1O8A.js\",\n \"revision\": \"5abc08ab122e21b4db15a780fba4e1b5\"\n },\n {\n \"url\": \"assets/index.html-9E0mn_M3.js\",\n \"revision\": \"a4f5c09eb541281b935386f7a1244c23\"\n },\n {\n \"url\": \"assets/index.html-9mtT_v42.js\",\n \"revision\": \"84c9bbd1e3a6064231abe1fecd3eb7f9\"\n },\n {\n \"url\": \"assets/index.html-9R3u1krZ.js\",\n \"revision\": \"ce14e7c7983182b2163ff06aa9e1c647\"\n },\n {\n \"url\": \"assets/index.html-a_wSv45V.js\",\n \"revision\": \"2827968ef139c80eab16ec912a5534c4\"\n },\n {\n \"url\": \"assets/index.html-AcDDHBjs.js\",\n \"revision\": \"062d088766d3c271efee1569b01abed3\"\n },\n {\n \"url\": \"assets/index.html-AcHcpmyL.js\",\n \"revision\": \"555e8780aa83ad9c522e2f7e7b641ed2\"\n },\n {\n \"url\": \"assets/index.html-aesCbmQA.js\",\n \"revision\": \"fbd469b532b3f4a600e0ced07912d266\"\n },\n {\n \"url\": \"assets/index.html-B0zestXk.js\",\n \"revision\": \"e3616405abb41dc903c6eedf54d79bad\"\n },\n {\n \"url\": \"assets/index.html-B2x9k5tu.js\",\n \"revision\": \"dfe1c8bf351ef5c6ca1986d955fd741a\"\n },\n {\n \"url\": \"assets/index.html-bbwK6XkQ.js\",\n \"revision\": \"1b36f33f918b80d45e50f696df689903\"\n },\n {\n \"url\": \"assets/index.html-BhnJj992.js\",\n \"revision\": \"d39fe2ec84f1d651792b78c71a190f2b\"\n },\n {\n \"url\": \"assets/index.html-BLkmkmA_.js\",\n \"revision\": \"5f0b2b9766a5d8e9bc27ee5715dd2a3d\"\n },\n {\n \"url\": \"assets/index.html-BLPlXPB1.js\",\n \"revision\": \"8042bd529e25017dbcec3d37b68ac6e1\"\n },\n {\n \"url\": \"assets/index.html-BNOp3Mse.js\",\n \"revision\": \"33456f30aeeb4443f1569b9538e1c0b6\"\n },\n {\n \"url\": \"assets/index.html-Bs3oO7C_.js\",\n \"revision\": \"a934b0f7c2a7ccad9565980d666b6876\"\n },\n {\n \"url\": \"assets/index.html-bt7UO1xo.js\",\n \"revision\": \"aba4c140f383c231529746b680dbc25b\"\n },\n {\n \"url\": \"assets/index.html-bxCqco6-.js\",\n \"revision\": \"b30a759cb45372610d05097816626985\"\n },\n {\n \"url\": \"assets/index.html-C360RI7I.js\",\n \"revision\": \"54773414e3833e50de2f96397583e2fb\"\n },\n {\n \"url\": \"assets/index.html-CHWD6_iY.js\",\n \"revision\": \"9dcc42806db50631be5799e64b735ce7\"\n },\n {\n \"url\": \"assets/index.html-ctq9zSHa.js\",\n \"revision\": \"2a69566ba82c8557b3f037494747d3af\"\n },\n {\n \"url\": \"assets/index.html-cwVFNAda.js\",\n \"revision\": \"4708bbc3aff06c7dd7a9efdbbf894f91\"\n },\n {\n \"url\": \"assets/index.html-czHpBbp1.js\",\n \"revision\": \"4bcd376c522a5d19334be6fec919db13\"\n },\n {\n \"url\": \"assets/index.html-D6T1DCMH.js\",\n \"revision\": \"4c408270403a1c8acfd073739639031b\"\n },\n {\n \"url\": \"assets/index.html-dIPTRAjj.js\",\n \"revision\": \"366a719103128fa8546ea034bdbbc3ec\"\n },\n {\n \"url\": \"assets/index.html-DVi4lX_-.js\",\n \"revision\": \"1a77f336888af45d06a779ab16acf0d0\"\n },\n {\n \"url\": \"assets/index.html-E-kz0qY7.js\",\n \"revision\": \"64568b46f5ff09b328274e398c7f1c43\"\n },\n {\n \"url\": \"assets/index.html-E1HdBVl_.js\",\n \"revision\": \"eeba3ef52dbb8709853f28c575a22149\"\n },\n {\n \"url\": \"assets/index.html-eDM5dFS5.js\",\n \"revision\": \"5b809a779dff019f59df626947e280f2\"\n },\n {\n \"url\": \"assets/index.html-eLzDRIQF.js\",\n \"revision\": \"f5690f8e29dae868de0e227ca7232b27\"\n },\n {\n \"url\": \"assets/index.html-EQdXoVXB.js\",\n \"revision\": \"cd4cf5ecccbebfb4d3ebd578dd8dbe13\"\n },\n {\n \"url\": \"assets/index.html-ERfJaqW-.js\",\n \"revision\": \"493ddf30ed433768c81df0dadf298783\"\n },\n {\n \"url\": \"assets/index.html-ev38ZdxY.js\",\n \"revision\": \"34aedfba469185c1088030d8742f7eaf\"\n },\n {\n \"url\": \"assets/index.html-exQTTyLY.js\",\n \"revision\": \"b554bfff2d3d3a591e273a37a17e3019\"\n },\n {\n \"url\": \"assets/index.html-F5HnQcet.js\",\n \"revision\": \"904ae9b339dec61bfec59e5c01ce5753\"\n },\n {\n \"url\": \"assets/index.html-F8Nld46U.js\",\n \"revision\": \"4a23ec486dbd18bf2b6bc1c0aeaa2eaa\"\n },\n {\n \"url\": \"assets/index.html-FFZ3YKGZ.js\",\n \"revision\": \"bc54333cddc2e9c877aea997c9a9853a\"\n },\n {\n \"url\": \"assets/index.html-fjIZXpuo.js\",\n \"revision\": \"08bdec790174744585f4e8e40688f3b1\"\n },\n {\n \"url\": \"assets/index.html-fjQs7H5E.js\",\n \"revision\": \"b8bef29aa8b1ec2c3c911a2519b83f3e\"\n },\n {\n \"url\": \"assets/index.html-FnjjrZVb.js\",\n \"revision\": \"e19d4178ddab709f7bf424836821e6c7\"\n },\n {\n \"url\": \"assets/index.html-fnL6KmMG.js\",\n \"revision\": \"b3596000602e90e211739177813f7ab7\"\n },\n {\n \"url\": \"assets/index.html-FoB7MnFp.js\",\n \"revision\": \"8118beedd0b2bdda615b9e9f956cef9c\"\n },\n {\n \"url\": \"assets/index.html-g-lURbYW.js\",\n \"revision\": \"ed02e5fd34234b1c78e3eb7902d5d32b\"\n },\n {\n \"url\": \"assets/index.html-g-SNk94n.js\",\n \"revision\": \"3619a3ebe7952515407564bdcac25089\"\n },\n {\n \"url\": \"assets/index.html-G24g2E_r.js\",\n \"revision\": \"0a64e4be41c4a46eb816741c9dd5e92d\"\n },\n {\n \"url\": \"assets/index.html-g7IFZ7G_.js\",\n \"revision\": \"51e8d92c669319c56772c67b7f626cb5\"\n },\n {\n \"url\": \"assets/index.html-gBD8K-X8.js\",\n \"revision\": \"ed52f159da382faa78d1612b22472812\"\n },\n {\n \"url\": \"assets/index.html-gBdMXoqL.js\",\n \"revision\": \"52a4ee2c1cf97916a1e2df14c94f36ed\"\n },\n {\n \"url\": \"assets/index.html-GFPyrhoV.js\",\n \"revision\": \"1681802d459ce722832d14136f237074\"\n },\n {\n \"url\": \"assets/index.html-GGbbhDjJ.js\",\n \"revision\": \"bf207bdf8fc88ced39c7afee502de70b\"\n },\n {\n \"url\": \"assets/index.html-GYlVtT_i.js\",\n \"revision\": \"7fe827969160cc163b0b69b88bbab706\"\n },\n {\n \"url\": \"assets/index.html-H1AzmvhU.js\",\n \"revision\": \"68d670ff36b8f53e1369009e7bc358e6\"\n },\n {\n \"url\": \"assets/index.html-h32hkhC5.js\",\n \"revision\": \"eb3d29316834ce9173a27172fe65d955\"\n },\n {\n \"url\": \"assets/index.html-hE-Har5l.js\",\n \"revision\": \"5407b06e86a09bc85e1e12489bfbe3bd\"\n },\n {\n \"url\": \"assets/index.html-HOTiQ-yL.js\",\n \"revision\": \"da85cb2c002510c5964b109d4f9c8b38\"\n },\n {\n \"url\": \"assets/index.html-Hr6EYV6k.js\",\n \"revision\": \"8f71d2908e7d349d07fe6f90c69ac4a7\"\n },\n {\n \"url\": \"assets/index.html-hsh4fjDy.js\",\n \"revision\": \"1076730e3265fdeef659d68c23124464\"\n },\n {\n \"url\": \"assets/index.html-HZQfa0vK.js\",\n \"revision\": \"25e8ea37a7e4e0250ab82710efad0330\"\n },\n {\n \"url\": \"assets/index.html-I-71DhOf.js\",\n \"revision\": \"34b3a40f5a5d0cea5162f665150b52b6\"\n },\n {\n \"url\": \"assets/index.html-i-MMHlcp.js\",\n \"revision\": \"4f215cce4fc099b11ccae5a878e29da3\"\n },\n {\n \"url\": \"assets/index.html-i1mgSfOT.js\",\n \"revision\": \"832850c95079bca09e781ec090a3fcff\"\n },\n {\n \"url\": \"assets/index.html-ibC1JRbc.js\",\n \"revision\": \"e098b708eb535b3780513a64a1eab726\"\n },\n {\n \"url\": \"assets/index.html-idRdJbqu.js\",\n \"revision\": \"37df97f41c7dd737c13a930caabbe080\"\n },\n {\n \"url\": \"assets/index.html-Ilj8DScN.js\",\n \"revision\": \"31e70c835c716d95d42ae136110f3c79\"\n },\n {\n \"url\": \"assets/index.html-Io97aBuh.js\",\n \"revision\": \"f1ca5af0f6a131fdde280e9f4e57c173\"\n },\n {\n \"url\": \"assets/index.html-Ith43-eG.js\",\n \"revision\": \"78d4a999ae87afc994d3dabdddca7826\"\n },\n {\n \"url\": \"assets/index.html-iuNHJ9u0.js\",\n \"revision\": \"8b48bf074eaafd1b6a2b97e2097bdff9\"\n },\n {\n \"url\": \"assets/index.html-J6YBbtvY.js\",\n \"revision\": \"4ca6444a7823fb5e77578cd813f64bda\"\n },\n {\n \"url\": \"assets/index.html-J8BMHg89.js\",\n \"revision\": \"437038b67ba1ffd05d2f9781bb9859ea\"\n },\n {\n \"url\": \"assets/index.html-jA6pdA_t.js\",\n \"revision\": \"e1046548bf915ad64ddcf3ab4aca6b31\"\n },\n {\n \"url\": \"assets/index.html-jbhoO6oS.js\",\n \"revision\": \"e81c73033b1b2e1db0d19700143d4c12\"\n },\n {\n \"url\": \"assets/index.html-JF4gDM7D.js\",\n \"revision\": \"b17f3a3bebf3a33775e4a76a0e19dfe6\"\n },\n {\n \"url\": \"assets/index.html-JhGcsNxJ.js\",\n \"revision\": \"638f5ad8ebe91fc9e21524fe935549ed\"\n },\n {\n \"url\": \"assets/index.html-JHMCqP3K.js\",\n \"revision\": \"00de7da58876f0fb27e2a7130b004d71\"\n },\n {\n \"url\": \"assets/index.html-JnfKE5ye.js\",\n \"revision\": \"86903374ff6643b8a88e99e3579c287a\"\n },\n {\n \"url\": \"assets/index.html-JpugBYVz.js\",\n \"revision\": \"33b9138cb546871cbf90ab3bdebe23a7\"\n },\n {\n \"url\": \"assets/index.html-JsjX07PL.js\",\n \"revision\": \"908e8434590fb0f9ff4df8da841dc1ee\"\n },\n {\n \"url\": \"assets/index.html-jV03Xo7p.js\",\n \"revision\": \"f56b79628330e4c4f34e7a8263641127\"\n },\n {\n \"url\": \"assets/index.html-JX1VErOL.js\",\n \"revision\": \"52849e51f2033a7b942dd93707d90c3c\"\n },\n {\n \"url\": \"assets/index.html-KAO7TBkB.js\",\n \"revision\": \"9e862ad474df9fd5a33e3ef473f7e7cc\"\n },\n {\n \"url\": \"assets/index.html-kB5LT_k5.js\",\n \"revision\": \"4d2efc80318ebf66e098d2f93dc6708e\"\n },\n {\n \"url\": \"assets/index.html-KmYW_B6k.js\",\n \"revision\": \"891c63c01c774473b8bdbd145308937d\"\n },\n {\n \"url\": \"assets/index.html-KRoADKjE.js\",\n \"revision\": \"9ff8c43ede51b314b795236e1621f4c5\"\n },\n {\n \"url\": \"assets/index.html-L7Ue2F8C.js\",\n \"revision\": \"aa6ded1b9d1254242fa72dbbe34b9692\"\n },\n {\n \"url\": \"assets/index.html-Lt33W2fu.js\",\n \"revision\": \"d64b37d88a85f4e84fc434108f62474a\"\n },\n {\n \"url\": \"assets/index.html-lXCBBac6.js\",\n \"revision\": \"04ddd5f8583a5e75f14df9fac83a4fd3\"\n },\n {\n \"url\": \"assets/index.html-MDmNSIgf.js\",\n \"revision\": \"bea5c860a13acfe04728ca19b0d0f9f1\"\n },\n {\n \"url\": \"assets/index.html-MGvi-vgA.js\",\n \"revision\": \"9564452b90f426904afcacac5f8dbea4\"\n },\n {\n \"url\": \"assets/index.html-mNqFLZ6A.js\",\n \"revision\": \"49c850864d7183b14f6c7cff51e79b88\"\n },\n {\n \"url\": \"assets/index.html-MQIB_QpV.js\",\n \"revision\": \"cf206eb683ed33d5e9152d0ded85f9a4\"\n },\n {\n \"url\": \"assets/index.html-MUvLrlGW.js\",\n \"revision\": \"c3cc1bfbb017af07fa01cc2792a03bf5\"\n },\n {\n \"url\": \"assets/index.html-myvTt2O1.js\",\n \"revision\": \"db33b5c47368c42442cca537b128418a\"\n },\n {\n \"url\": \"assets/index.html-n-TQD5DG.js\",\n \"revision\": \"e93607b860dd3a38b576724a5a1b7bc7\"\n },\n {\n \"url\": \"assets/index.html-nbHjCI4E.js\",\n \"revision\": \"4b2db1154c481e360596346e882b64ac\"\n },\n {\n \"url\": \"assets/index.html-nBzh5_NL.js\",\n \"revision\": \"2be5701a880ff8734f082911ef7cefa1\"\n },\n {\n \"url\": \"assets/index.html-ndkFXjKu.js\",\n \"revision\": \"36e07b6a936a463d18130babb7aef779\"\n },\n {\n \"url\": \"assets/index.html-NJpwtthw.js\",\n \"revision\": \"7095b67a374b235b661556f1623b7ac6\"\n },\n {\n \"url\": \"assets/index.html-NleAmsCg.js\",\n \"revision\": \"ba9563bdc8be385f00b014b25bce4d0a\"\n },\n {\n \"url\": \"assets/index.html-nNjnaUOx.js\",\n \"revision\": \"07c792d853742fc02edd250f685244a5\"\n },\n {\n \"url\": \"assets/index.html-NtP5QAzU.js\",\n \"revision\": \"74086b55e3e52cfe49325760f8a05763\"\n },\n {\n \"url\": \"assets/index.html-NW49SvAU.js\",\n \"revision\": \"13348097a80db95300b7c5e1ba22cef0\"\n },\n {\n \"url\": \"assets/index.html-Nxu2qgD8.js\",\n \"revision\": \"b969c622b4e48a9387cd1a0dd4b75c5b\"\n },\n {\n \"url\": \"assets/index.html-oB5J5RJE.js\",\n \"revision\": \"60ad3f22e44c14d22ca4431778562f21\"\n },\n {\n \"url\": \"assets/index.html-OfXkBPs5.js\",\n \"revision\": \"9a47c59bcc2bf62b918ca2ea79021a6d\"\n },\n {\n \"url\": \"assets/index.html-ogpErsaM.js\",\n \"revision\": \"68d19d791872fc4e7f6a145e726e0a2d\"\n },\n {\n \"url\": \"assets/index.html-OOfR2c4H.js\",\n \"revision\": \"4d00fe8bdc80b65a45294353955ee56f\"\n },\n {\n \"url\": \"assets/index.html-oss9_NPr.js\",\n \"revision\": \"76233b7f118adc1a34b4b79f22e15cf4\"\n },\n {\n \"url\": \"assets/index.html-Otbm08-E.js\",\n \"revision\": \"b9f99ab04c5482a8c6acf984be8662a7\"\n },\n {\n \"url\": \"assets/index.html-oTNaI8Zq.js\",\n \"revision\": \"eca010a78df6d7ce701c2397641ca569\"\n },\n {\n \"url\": \"assets/index.html-poaCb2xU.js\",\n \"revision\": \"efe109d7a43375a9164f826e963e940c\"\n },\n {\n \"url\": \"assets/index.html-PSD82k6J.js\",\n \"revision\": \"16569791d26d5c749ed9eda5f93e1d95\"\n },\n {\n \"url\": \"assets/index.html-pvf-HGge.js\",\n \"revision\": \"dd5e6d91bc04b429794a06f5bc8f6746\"\n },\n {\n \"url\": \"assets/index.html-pW4WP2Sh.js\",\n \"revision\": \"8216ae0a5038e64be55d5fbb4a15a539\"\n },\n {\n \"url\": \"assets/index.html-pzCTWktT.js\",\n \"revision\": \"8f3b396e9a884361b9bd7754f0cdabc1\"\n },\n {\n \"url\": \"assets/index.html-q0Xqqilw.js\",\n \"revision\": \"b841c6551f90afd100fa6f44439443c3\"\n },\n {\n \"url\": \"assets/index.html-qcRlqlnK.js\",\n \"revision\": \"5fe9b113589a7bb73bdaba7739971309\"\n },\n {\n \"url\": \"assets/index.html-qHDzCwT5.js\",\n \"revision\": \"ffa0358faf941e8aaffaeb5ae09b81aa\"\n },\n {\n \"url\": \"assets/index.html-qjj58GcY.js\",\n \"revision\": \"23759c6943702bb1eb5d943e4389c07d\"\n },\n {\n \"url\": \"assets/index.html-qmnTnY6r.js\",\n \"revision\": \"21f6ba270d07d80d0f2792086a4816f0\"\n },\n {\n \"url\": \"assets/index.html-QrgOJdpu.js\",\n \"revision\": \"45d16359b6e7d1c9d95006f0bd9c2056\"\n },\n {\n \"url\": \"assets/index.html-QW4gd68q.js\",\n \"revision\": \"17f856a6007300352c6c5d030467140d\"\n },\n {\n \"url\": \"assets/index.html-qWcyy2kZ.js\",\n \"revision\": \"70666b09312eab4269a9ceac68816db9\"\n },\n {\n \"url\": \"assets/index.html-qyCDq7xX.js\",\n \"revision\": \"c20ce2a7852d61f5b5228096028b6bbc\"\n },\n {\n \"url\": \"assets/index.html-QYtx_6GE.js\",\n \"revision\": \"87104e89e83506a6deed1d0f9f9a50e9\"\n },\n {\n \"url\": \"assets/index.html-rD4AKpx1.js\",\n \"revision\": \"9b805e4ed0b37769df1164258162ce01\"\n },\n {\n \"url\": \"assets/index.html-rDZW1GmE.js\",\n \"revision\": \"8ce127817f31de162d7b53e40ffc8e1d\"\n },\n {\n \"url\": \"assets/index.html-reC06NIi.js\",\n \"revision\": \"5f84aa92cd4b3f9978724edbd3c949e4\"\n },\n {\n \"url\": \"assets/index.html-rFvRzY47.js\",\n \"revision\": \"c838ac9466760273a105307bca9bf1a8\"\n },\n {\n \"url\": \"assets/index.html-rkgsTpEx.js\",\n \"revision\": \"ee5d5cf14a4783895c4269c533fda921\"\n },\n {\n \"url\": \"assets/index.html-RQO6tcOD.js\",\n \"revision\": \"19dca206e3f4b0d510272e0a58fa853a\"\n },\n {\n \"url\": \"assets/index.html-RsY9uX7U.js\",\n \"revision\": \"4f7f928b32fab790096da3c55fd3946c\"\n },\n {\n \"url\": \"assets/index.html-S3OdPlRp.js\",\n \"revision\": \"04f450c75dbc27ba55edbdae80481069\"\n },\n {\n \"url\": \"assets/index.html-STrbfrZI.js\",\n \"revision\": \"39b906c33e0698cee3c5a2a232d8c93f\"\n },\n {\n \"url\": \"assets/index.html-sUYrfL3B.js\",\n \"revision\": \"fbd123cd65c16f7007b88f0845e5c13d\"\n },\n {\n \"url\": \"assets/index.html-sWh3vQXB.js\",\n \"revision\": \"f29fb6a7a20a983bb15e3d86265ebc77\"\n },\n {\n \"url\": \"assets/index.html-t_vO7joq.js\",\n \"revision\": \"d2e5b29ea477660d4f0cb5624793c0e5\"\n },\n {\n \"url\": \"assets/index.html-tnhdXudS.js\",\n \"revision\": \"f722db43349bb27fa85a29a2bf6d7948\"\n },\n {\n \"url\": \"assets/index.html-tRPz2-E6.js\",\n \"revision\": \"0278bbff813c368526b8f0c29ca4685c\"\n },\n {\n \"url\": \"assets/index.html-tS5cu49v.js\",\n \"revision\": \"9cef53268dab96e8c5ed4f38277e1c31\"\n },\n {\n \"url\": \"assets/index.html-U4OrLyv3.js\",\n \"revision\": \"733e59087150aaef0534a7751ae78b99\"\n },\n {\n \"url\": \"assets/index.html-U9VUqS42.js\",\n \"revision\": \"d680b84d04502cd9fe0f9fe337c84556\"\n },\n {\n \"url\": \"assets/index.html-uBMV0KJZ.js\",\n \"revision\": \"83150c45d6f6ada206e0210865692dbf\"\n },\n {\n \"url\": \"assets/index.html-Ud0Zos-f.js\",\n \"revision\": \"3d1616a1e4e70f9d7efecede898632d0\"\n },\n {\n \"url\": \"assets/index.html-ullx7Kuy.js\",\n \"revision\": \"c3338d3d736f4c4ec930c05b2af6356c\"\n },\n {\n \"url\": \"assets/index.html-UO9hy6Wg.js\",\n \"revision\": \"ac1b218018cb3aa470b8f2a3f3dd5b87\"\n },\n {\n \"url\": \"assets/index.html-Uu7Eupg5.js\",\n \"revision\": \"6d6cab17bb29c67240629d693af0a310\"\n },\n {\n \"url\": \"assets/index.html-uvGUJw4d.js\",\n \"revision\": \"28292e1d90f36f9276d879a6609e7682\"\n },\n {\n \"url\": \"assets/index.html-v-DWFIuk.js\",\n \"revision\": \"f993e8d24961b04ef2e00965387561be\"\n },\n {\n \"url\": \"assets/index.html-v0Tcuabu.js\",\n \"revision\": \"b33bc8caa38bfd207a3c04202b94d3da\"\n },\n {\n \"url\": \"assets/index.html-vFZDFVW3.js\",\n \"revision\": \"85d9d0d7865a028c35f13cc7a7d1c952\"\n },\n {\n \"url\": \"assets/index.html-Vht3PBEQ.js\",\n \"revision\": \"c8caad4e2927c8b35cd0934633333341\"\n },\n {\n \"url\": \"assets/index.html-VpRKBb5o.js\",\n \"revision\": \"c08bbb775293774069f936a4d57847ae\"\n },\n {\n \"url\": \"assets/index.html-vT57E_ru.js\",\n \"revision\": \"bbb723343009b50e845de5d50fa70f03\"\n },\n {\n \"url\": \"assets/index.html-VUoUY136.js\",\n \"revision\": \"a3504e2a1e5f9f35b8a089dee580efa9\"\n },\n {\n \"url\": \"assets/index.html-vx0DB81j.js\",\n \"revision\": \"a846ac8283b8628632b9ef16172041d1\"\n },\n {\n \"url\": \"assets/index.html-w8VQYI8z.js\",\n \"revision\": \"060c082a295d548a1bba4b3c772c69ee\"\n },\n {\n \"url\": \"assets/index.html-WASu2T95.js\",\n \"revision\": \"f6545a425fea9f396b32429833204857\"\n },\n {\n \"url\": \"assets/index.html-wg-1Cxci.js\",\n \"revision\": \"eeefd5d8332e17293440acd604ebf134\"\n },\n {\n \"url\": \"assets/index.html-wuly5niv.js\",\n \"revision\": \"dcb6b5f85e650d5a83cca4cbd82d252c\"\n },\n {\n \"url\": \"assets/index.html-X_CyS4d0.js\",\n \"revision\": \"f5e8c8eb6833bd488a52295aa78ba0de\"\n },\n {\n \"url\": \"assets/index.html-x1gEaREp.js\",\n \"revision\": \"818f9ae20c482431fc2abfb713b852f1\"\n },\n {\n \"url\": \"assets/index.html-X2Gi4GIY.js\",\n \"revision\": \"a7d63c745f9cb39088ee26405f3f4248\"\n },\n {\n \"url\": \"assets/index.html-xbfU6A5W.js\",\n \"revision\": \"3a8ce9b521793714592ab2672f54a7f8\"\n },\n {\n \"url\": \"assets/index.html-xeADokS7.js\",\n \"revision\": \"8b7567abe8ea3572625ccd591edbd7a4\"\n },\n {\n \"url\": \"assets/index.html-XMSDWYao.js\",\n \"revision\": \"db94e223922c329dd98fa6edb748b63b\"\n },\n {\n \"url\": \"assets/index.html-xSha5ig2.js\",\n \"revision\": \"55723833a7002f3f5e951978a35ba030\"\n },\n {\n \"url\": \"assets/index.html-XzAVJ3CG.js\",\n \"revision\": \"39b66eee10db665c2e920f9cec4e46d0\"\n },\n {\n \"url\": \"assets/index.html-Y_H1tKQ_.js\",\n \"revision\": \"058fd07ce45289cee30ebd41aaef9891\"\n },\n {\n \"url\": \"assets/index.html-y5Coax85.js\",\n \"revision\": \"bd433ad3a795af125fccecad8aba991f\"\n },\n {\n \"url\": \"assets/index.html-yh9aPgpr.js\",\n \"revision\": \"9364fb2087cde94bb655feb3d7a42a53\"\n },\n {\n \"url\": \"assets/index.html-yHhtUDPD.js\",\n \"revision\": \"4b244662201635dfc9b9cfba61b17e82\"\n },\n {\n \"url\": \"assets/index.html-YLj9MQpu.js\",\n \"revision\": \"a6a0212d32bbb5b692d27a018feaa2ac\"\n },\n {\n \"url\": \"assets/index.html-Ym9lCym2.js\",\n \"revision\": \"641a8b2a7065a4cc5219f4cc68d76ef3\"\n },\n {\n \"url\": \"assets/index.html-ySkr2bj2.js\",\n \"revision\": \"0706d40589c87a3bc0bcc04b45d25c11\"\n },\n {\n \"url\": \"assets/index.html-yT7SX3kb.js\",\n \"revision\": \"47338b1dc183d13564a692effa284a11\"\n },\n {\n \"url\": \"assets/index.html-yt9Xge56.js\",\n \"revision\": \"0aeea883d2d034b43710a98f87d07698\"\n },\n {\n \"url\": \"assets/index.html-yvodhWZV.js\",\n \"revision\": \"16b718be914feecd1e6cb2221eddf105\"\n },\n {\n \"url\": \"assets/index.html-ZauJualt.js\",\n \"revision\": \"f70b32af4e52aec6ca50d19e4eb52fb3\"\n },\n {\n \"url\": \"assets/index.html-zqRWhf8b.js\",\n \"revision\": \"aefbf49b71dc7f45b3d4526a520e9e61\"\n },\n {\n \"url\": \"assets/index.html-zQWoWdBH.js\",\n \"revision\": \"35f88de195cff26de89b3417f05514ab\"\n },\n {\n \"url\": \"assets/index.html-zuhL_Xmm.js\",\n \"revision\": \"11404a66d1662d63c293a4ea3b55e9a4\"\n },\n {\n \"url\": \"assets/infoDiagram-db7b18fc-3Dvf5x-f.js\",\n \"revision\": \"ac8484d211ad4919e41fa46231eed6d4\"\n },\n {\n \"url\": \"assets/init-Hi12RPRh.js\",\n \"revision\": \"3ce28180466443e9b617d7b96e9f7b8f\"\n },\n {\n \"url\": \"assets/intro.html-aVWLN24f.js\",\n \"revision\": \"4b5f0416c2bbffb512baf065f3f1b71c\"\n },\n {\n \"url\": \"assets/journeyDiagram-d5636530-oIxwWC6o.js\",\n \"revision\": \"85b977657e8c601667f091d45ceeb672\"\n },\n {\n \"url\": \"assets/KaTeX_AMS-Regular-0YIAJWTb.ttf\",\n \"revision\": \"56573229753fad48910bda2ea1a6dd54\"\n },\n {\n \"url\": \"assets/KaTeX_AMS-Regular-UIXRTGNW.woff2\",\n \"revision\": \"66c678209ce93b6e2b583f02ce41529e\"\n },\n {\n \"url\": \"assets/KaTeX_AMS-Regular-zJvWDgGp.woff\",\n \"revision\": \"10824af77e9961cfd548c8a458f10851\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Bold-6vyEfazt.woff2\",\n \"revision\": \"a9e9b0953b078cd40f5e19ef4face6fc\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Bold-AE18XbF9.ttf\",\n \"revision\": \"497bf407c4c609c6cf1f1ad38f437f7f\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Bold-RIlxi71x.woff\",\n \"revision\": \"de2ba279933d60f7819ff61f71c17bed\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Regular-4uo0fsfh.woff2\",\n \"revision\": \"08d95d99bf4a2b2dc7a876653857f154\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Regular-k0QPq0y-.woff\",\n \"revision\": \"a25140fbe6692bffe71a2ab861572eb3\"\n },\n {\n \"url\": \"assets/KaTeX_Caligraphic-Regular-MF_e1AYw.ttf\",\n \"revision\": \"e6fb499fc8f9925eea3138cccba17fff\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Bold-bAz-dThZ.woff\",\n \"revision\": \"40934fc076960bb989d590db044fef62\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Bold-i-oP291Y.woff2\",\n \"revision\": \"796f3797cdf36fcaea18c3070a608378\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Bold-XZxETTVq.ttf\",\n \"revision\": \"b9d7c4497cab3702487214651ab03744\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Regular-8XXOHEfX.woff\",\n \"revision\": \"e435cda5784e21b26ab2d03fbcb56a99\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Regular-gf8Lq3rE.ttf\",\n \"revision\": \"97a699d83318e9334a0deaea6ae5eda2\"\n },\n {\n \"url\": \"assets/KaTeX_Fraktur-Regular-k2IhepQP.woff2\",\n \"revision\": \"f9e6a99f4a543b7d6cad1efb6cf1e4b1\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Bold-CZtwCMuf.woff\",\n \"revision\": \"4cdba6465ab9fac5d3833c6cdba7a8c3\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Bold-MGqDlVzd.ttf\",\n \"revision\": \"8e431f7ece346b6282dae3d9d0e7a970\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Bold-sffOiHVw.woff2\",\n \"revision\": \"a9382e25bcf75d856718fcef54d7acdb\"\n },\n {\n \"url\": \"assets/KaTeX_Main-BoldItalic-88TzJhul.ttf\",\n \"revision\": \"52fb39b0434c463d5df32419608ab08a\"\n },\n {\n \"url\": \"assets/KaTeX_Main-BoldItalic-8QydwDku.woff2\",\n \"revision\": \"d873734390c716d6e18ff3f71ac6eb8b\"\n },\n {\n \"url\": \"assets/KaTeX_Main-BoldItalic-EqUi0SPe.woff\",\n \"revision\": \"5f875f986a9bce1264e8c42417b56f74\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Italic-DVgO3ulm.woff2\",\n \"revision\": \"652970624cde999882102fa2b6a8871f\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Italic-N1npxqDf.ttf\",\n \"revision\": \"39349e0a2b366f38e2672b45aded2030\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Italic-TCzgZvdR.woff\",\n \"revision\": \"8ffd28f6390231548ead99d7835887fa\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Regular-6_eCWgYQ.woff\",\n \"revision\": \"f1cdb692ee31c10b37262caffced5271\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Regular-dtjb4qKe.woff2\",\n \"revision\": \"f8a7f19f45060f7a177314855b8c7aa3\"\n },\n {\n \"url\": \"assets/KaTeX_Main-Regular-MqWbzbVV.ttf\",\n \"revision\": \"818582dae57e6fac46202cfd844afabb\"\n },\n {\n \"url\": \"assets/KaTeX_Math-BoldItalic-d10o37uD.ttf\",\n \"revision\": \"6589c4f1f587f73f0ad0af8ae35ccb53\"\n },\n {\n \"url\": \"assets/KaTeX_Math-BoldItalic-ImPtsMme.woff\",\n \"revision\": \"48155e43d9a284b54753e50e4ba586dc\"\n },\n {\n \"url\": \"assets/KaTeX_Math-BoldItalic-mZ7zbAmZ.woff2\",\n \"revision\": \"1320454d951ec809a7dbccb4f23fccf0\"\n },\n {\n \"url\": \"assets/KaTeX_Math-Italic-H5Tq_9FA.ttf\",\n \"revision\": \"fe5ed5875d95b18c98546cb4f47304ff\"\n },\n {\n \"url\": \"assets/KaTeX_Math-Italic-LedwBEzP.woff2\",\n \"revision\": \"d8b7a801bd87b324efcbae7394119c24\"\n },\n {\n \"url\": \"assets/KaTeX_Math-Italic-wNP_z16f.woff\",\n \"revision\": \"ed7aea12d765f9e2d0f9bc7fa2be626c\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Bold-2yISjogg.woff\",\n \"revision\": \"0e897d27f063facef504667290e408bd\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Bold-9bFEtBg9.woff2\",\n \"revision\": \"ad546b4719bcf690a3604944b90b7e42\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Bold-hTHqZ76u.ttf\",\n \"revision\": \"f2ac73121357210d91e5c3eaa42f72ea\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Italic-Azdo-3Wm.woff\",\n \"revision\": \"ef725de572b71381dccf53918e300744\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Italic-GGIydc0p.ttf\",\n \"revision\": \"f60b4a34842bb524b562df092917a542\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Italic-tx9FahgZ.woff2\",\n \"revision\": \"e934cbc86e2d59ceaf04102c43dc0b50\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Regular-kun6lKiW.woff\",\n \"revision\": \"5f8637ee731482c44a37789723f5e499\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Regular-TaO4USHJ.ttf\",\n \"revision\": \"3243452ee6817acd761c9757aef93c29\"\n },\n {\n \"url\": \"assets/KaTeX_SansSerif-Regular-wwQp5Se8.woff2\",\n \"revision\": \"1ac3ed6ebe34e473519ca1da86f7a384\"\n },\n {\n \"url\": \"assets/KaTeX_Script-Regular--ckFYqpa.woff\",\n \"revision\": \"a82fa2a7e18b8c7a1a9f6069844ebfb9\"\n },\n {\n \"url\": \"assets/KaTeX_Script-Regular-98CFnxev.woff2\",\n \"revision\": \"1b3161eb8cc67462d6e8c2fb96c68507\"\n },\n {\n \"url\": \"assets/KaTeX_Script-Regular-uSZBlqPg.ttf\",\n \"revision\": \"a189c37d73ffce63464635dc12cbbc96\"\n },\n {\n \"url\": \"assets/KaTeX_Size1-Regular-27J7nvyK.ttf\",\n \"revision\": \"0d8d9204004bdf126342605f7bbdffe6\"\n },\n {\n \"url\": \"assets/KaTeX_Size1-Regular-Jgg_JgPA.woff2\",\n \"revision\": \"82ef26dc680ba60d884e051c73d9a42d\"\n },\n {\n \"url\": \"assets/KaTeX_Size1-Regular-tfebZ-uE.woff\",\n \"revision\": \"4788ba5b6247e336f734b742fe9900d5\"\n },\n {\n \"url\": \"assets/KaTeX_Size2-Regular-8uHcfdJu.woff2\",\n \"revision\": \"95a1da914c20455a07b7c9e2dcf2836d\"\n },\n {\n \"url\": \"assets/KaTeX_Size2-Regular-e4ClFoQr.ttf\",\n \"revision\": \"1fdda0e59ed35495ebac28badf210574\"\n },\n {\n \"url\": \"assets/KaTeX_Size2-Regular-KA9bXP1N.woff\",\n \"revision\": \"b0628bfd27c979a09f702a2277979888\"\n },\n {\n \"url\": \"assets/KaTeX_Size3-Regular-4KV7NJM_.ttf\",\n \"revision\": \"963af864cbb10611ba33267ba7953777\"\n },\n {\n \"url\": \"assets/KaTeX_Size3-Regular-k6uTKqBB.woff\",\n \"revision\": \"4de844d4552e941f6b9c38837a8d487b\"\n },\n {\n \"url\": \"assets/KaTeX_Size4-Regular-1hQb9ONy.ttf\",\n \"revision\": \"27a23ee69999affa55491c7dab8e53bf\"\n },\n {\n \"url\": \"assets/KaTeX_Size4-Regular-5eZcWcVX.woff2\",\n \"revision\": \"61522cd3d9043622e235ab57762754f2\"\n },\n {\n \"url\": \"assets/KaTeX_Size4-Regular-RfuIJGSk.woff\",\n \"revision\": \"3045a61f722bc4b198450ce69b3e3824\"\n },\n {\n \"url\": \"assets/KaTeX_Typewriter-Regular-9yG-_x36.ttf\",\n \"revision\": \"6bf4287568e1d3004b54d5d60f9f08f9\"\n },\n {\n \"url\": \"assets/KaTeX_Typewriter-Regular-juq-IZ9c.woff2\",\n \"revision\": \"b8b8393d2e65fcebda5fa99fa3264f41\"\n },\n {\n \"url\": \"assets/KaTeX_Typewriter-Regular-tMUvZjwd.woff\",\n \"revision\": \"0e0460587676d22eae09accd6dcfebc6\"\n },\n {\n \"url\": \"assets/layout-c9rdiZ4H.js\",\n \"revision\": \"560808b9be91edc6abaa4b9c333d1a89\"\n },\n {\n \"url\": \"assets/league-gothic-h3edOfrm.eot\",\n \"revision\": \"9900a4643cc63c5d8f969d2196f72572\"\n },\n {\n \"url\": \"assets/league-gothic-oOjv4w16.ttf\",\n \"revision\": \"91295fa87df918411b49b7531da5d558\"\n },\n {\n \"url\": \"assets/league-gothic-wxYXAA-7.woff\",\n \"revision\": \"cd382dc8a9d6317864b5810a320effc5\"\n },\n {\n \"url\": \"assets/line-mT-6NujG.js\",\n \"revision\": \"083a58dcaf5e8cc0881e225fdf2352e1\"\n },\n {\n \"url\": \"assets/linear-HkO0wGww.js\",\n \"revision\": \"606833bcc6e2a12d8fd9dbd5c78d3868\"\n },\n {\n \"url\": \"assets/markdown.esm-ldiezHYe.js\",\n \"revision\": \"dfebc8121864151002204ef714f81472\"\n },\n {\n \"url\": \"assets/math.esm--eqzfLue.js\",\n \"revision\": \"c5f77dc064ac53005c0e5446bb6715b0\"\n },\n {\n \"url\": \"assets/mermaid.core-RdWnh729.js\",\n \"revision\": \"32100348e037d5fa6c6da1c64d33beb3\"\n },\n {\n \"url\": \"assets/mindmap-definition-377f8f1f-fZozfFch.js\",\n \"revision\": \"278f72a5570060abd8a93fe9e64f6f60\"\n },\n {\n \"url\": \"assets/notes.esm--_TQ5Wr4.js\",\n \"revision\": \"12d7e35985a640e2ff8300c7cedb5983\"\n },\n {\n \"url\": \"assets/ordinal-wXG5obU4.js\",\n \"revision\": \"a72e57060c4f6a7606baa78dc6e9ad02\"\n },\n {\n \"url\": \"assets/path-aUcfwwLI.js\",\n \"revision\": \"f86c0243cb45746453c6b4f7dbd9f34d\"\n },\n {\n \"url\": \"assets/photoswipe.esm-08_zHRDQ.js\",\n \"revision\": \"481d5342d9bb799640b63b15b698dcd4\"\n },\n {\n \"url\": \"assets/pieDiagram-b0208e96-klsHLmfx.js\",\n \"revision\": \"bc4e323a6ad6a0d58da02d0f1a300957\"\n },\n {\n \"url\": \"assets/quadrantDiagram-0332be45-GeUBZ95u.js\",\n \"revision\": \"ef268e799a9840c15b4b35bf3632cb92\"\n },\n {\n \"url\": \"assets/requirementDiagram-bf7890df-giSaRfV5.js\",\n \"revision\": \"7bfd33d530a9183815c2684d10998de8\"\n },\n {\n \"url\": \"assets/reveal.esm-QxxCNeuR.js\",\n \"revision\": \"0b31bd04921a05d8df6da2d9faca8c70\"\n },\n {\n \"url\": \"assets/sankeyDiagram-0acdec17-moTHnuw0.js\",\n \"revision\": \"2c15b00f4cdbbfb98b6a06922c1e431b\"\n },\n {\n \"url\": \"assets/search.esm-I_xTZtXh.js\",\n \"revision\": \"d39092c5e0d9959995df72297767dc3f\"\n },\n {\n \"url\": \"assets/sequenceDiagram-c18d009d-n-wJomEG.js\",\n \"revision\": \"63b5629e40e0f582f502814ee7d8bb29\"\n },\n {\n \"url\": \"assets/slides.html-54Ht2Ryt.js\",\n \"revision\": \"5da1ca8d51b2a49fa2d28fce8937d743\"\n },\n {\n \"url\": \"assets/source-sans-pro-italic-kXLDr8ko.ttf\",\n \"revision\": \"8256cfd7e4017a7690814879409212cd\"\n },\n {\n \"url\": \"assets/source-sans-pro-italic-r_ZvIQue.woff\",\n \"revision\": \"e74f0128884561828ce8c9cf5c284ab8\"\n },\n {\n \"url\": \"assets/source-sans-pro-italic-URCxwoo9.eot\",\n \"revision\": \"72217712eb8d28872e7069322f3fda23\"\n },\n {\n \"url\": \"assets/source-sans-pro-regular-1WEW6-y9.ttf\",\n \"revision\": \"2da39ecf9246383937da11b44b7bd9b4\"\n },\n {\n \"url\": \"assets/source-sans-pro-regular-7ugzKlOX.woff\",\n \"revision\": \"e7acc589bb558fe58936a853f570193c\"\n },\n {\n \"url\": \"assets/source-sans-pro-regular-vMQH-Lno.eot\",\n \"revision\": \"1d71438462d532b62b05cdd7e6d7197d\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibold-8K4hAz36.woff\",\n \"revision\": \"1cb8e94f1185f1131a0c895165998f2b\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibold-CdFA3Jgq.ttf\",\n \"revision\": \"f3565095e6c9158140444970f5a2c5ed\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibold-yZBXeD4J.eot\",\n \"revision\": \"0f3da1edf1b5c6a94a6ad948a7664451\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibolditalic-0pB0ab1n.woff\",\n \"revision\": \"6b058fc2634b01d837c3432316c3141f\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibolditalic-R0KDpyfN.ttf\",\n \"revision\": \"c7e698a4d0956f4a939f42a05685bbf5\"\n },\n {\n \"url\": \"assets/source-sans-pro-semibolditalic-wk7IoV6c.eot\",\n \"revision\": \"58153ac7194e141d1e73ea88c6b63861\"\n },\n {\n \"url\": \"assets/stateDiagram-43596fc0-A4zK6RbX.js\",\n \"revision\": \"26814fc9783f28fdb3aeebb689b65438\"\n },\n {\n \"url\": \"assets/stateDiagram-v2-2ead4f9c-GfOOeFYL.js\",\n \"revision\": \"e160b2d098bb9b295f2d9a90bd2b8d38\"\n },\n {\n \"url\": \"assets/style-0ILgEizb.css\",\n \"revision\": \"49819ef9f8c3444f5c699133a2b3ed0c\"\n },\n {\n \"url\": \"assets/style-w40geAFS.js\",\n \"revision\": \"68b329da9893e34099c7d8ad5cb9c940\"\n },\n {\n \"url\": \"assets/styles-6860f46c-_a1nXaH0.js\",\n \"revision\": \"8812da6596b74e6efbbc4e3795e375f9\"\n },\n {\n \"url\": \"assets/styles-7383a064-Mrp4_RJz.js\",\n \"revision\": \"e53ab4dddcc5a3d8b580773403dc7781\"\n },\n {\n \"url\": \"assets/styles-b2c874b6-n89kVm5z.js\",\n \"revision\": \"508a86c2a478c30bc3a63846a9a21db3\"\n },\n {\n \"url\": \"assets/svgDrawCommon-0ee1b4e9-c7S2S_St.js\",\n \"revision\": \"84ee0b178a4908b91619ae93b8845ed1\"\n },\n {\n \"url\": \"assets/Tableau10-Fgclqpgn.js\",\n \"revision\": \"f2197f44250cada74e1e663d3abfba3e\"\n },\n {\n \"url\": \"assets/timeline-definition-d977decf-e99VZsQT.js\",\n \"revision\": \"20a78a40b867fc6686bfc3766e8a4c06\"\n },\n {\n \"url\": \"assets/utils-obz1_5fQ-XOQqDqQW.js\",\n \"revision\": \"5adeaa99226a6e92519556c9acd3f636\"\n },\n {\n \"url\": \"assets/vue-repl-nQ-EEHLy.js\",\n \"revision\": \"21143df46f555c5e78c0939b8260103a\"\n },\n {\n \"url\": \"assets/xychartDiagram-e50adddc-sdb6I-2e.js\",\n \"revision\": \"241b5ca3484328b84fde005f10252a41\"\n },\n {\n \"url\": \"assets/zoom.esm-w3VbP3hY.js\",\n \"revision\": \"e6e8f9a61302e3ca14aa4dbeec242607\"\n },\n {\n \"url\": \"404.html\",\n \"revision\": \"0daa76db6105f894e05d6aad44f324d0\"\n },\n {\n \"url\": \"article/index.html\",\n \"revision\": \"c9799679a34a9afc3e8eefc38a4e3f03\"\n },\n {\n \"url\": \"backend/database/basic/001-hello-database.html\",\n \"revision\": \"e3bacbcfcda4106bb2278e72cc3ed7fa\"\n },\n {\n \"url\": \"backend/database/basic/002-relation-model.html\",\n \"revision\": \"0aa4b6c4d0486fab8040e99fd7d6da6f\"\n },\n {\n \"url\": \"backend/database/basic/003-db-design.html\",\n \"revision\": \"2ef7ec4ea3cd719d17759ea8dc798331\"\n },\n {\n \"url\": \"backend/database/basic/004-advanced-db-model.html\",\n \"revision\": \"61c15029ad0cfebaee0a589d24397610\"\n },\n {\n \"url\": \"backend/database/basic/index.html\",\n \"revision\": \"1cee46e6818543c4ace1b12aa596c31c\"\n },\n {\n \"url\": \"backend/database/index.html\",\n \"revision\": \"271f38db8059ab10313c78ca0c9ee4d6\"\n },\n {\n \"url\": \"backend/database/mysql/001-install-mysql.html\",\n \"revision\": \"47b8a5d95e4ef0777252f702cfe71b51\"\n },\n {\n \"url\": \"backend/database/mysql/index.html\",\n \"revision\": \"4e4abd476b56307364f173e28dcbc738\"\n },\n {\n \"url\": \"backend/database/sql/01-quick-start.html\",\n \"revision\": \"2fdef911f4f32b27db223dec963e41f3\"\n },\n {\n \"url\": \"backend/database/sql/index.html\",\n \"revision\": \"b990457bb02a2af9c54822a56e3b914b\"\n },\n {\n \"url\": \"backend/index.html\",\n \"revision\": \"0c8e0829b5032b80df97d0a5bf3990ed\"\n },\n {\n \"url\": \"backend/java/index.html\",\n \"revision\": \"409c5331120b7c46127f244c6724c1cf\"\n },\n {\n \"url\": \"backend/java/tool/01-maven.html\",\n \"revision\": \"f2fff73b152802529e2493715b7ca51a\"\n },\n {\n \"url\": \"backend/java/tool/index.html\",\n \"revision\": \"8e3c90f332eeaf3b07a24a188bf58b23\"\n },\n {\n \"url\": \"backend/linux/index.html\",\n \"revision\": \"e9deeb36990a5d8a55a0d8f83bdd2d57\"\n },\n {\n \"url\": \"backend/linux/practice/001-set-the-ssh.html\",\n \"revision\": \"734f270a9366a8dba0d06a62f57b3f69\"\n },\n {\n \"url\": \"backend/linux/practice/002-build-git-server.html\",\n \"revision\": \"865c03f868ccd141606a3f099b6b210a\"\n },\n {\n \"url\": \"backend/linux/practice/003-configure-bt.html\",\n \"revision\": \"c57f12daad71b08211ac5f5b4a25773c\"\n },\n {\n \"url\": \"backend/linux/practice/004-automated-deployment.html\",\n \"revision\": \"60eb4c2364c1644e00645d84618ca8db\"\n },\n {\n \"url\": \"backend/linux/practice/005-install-docker.html\",\n \"revision\": \"c2ab82c72d8bb536e95b176771531b3f\"\n },\n {\n \"url\": \"backend/linux/practice/index.html\",\n \"revision\": \"4cdb6272ccc663fd53dc1a0adf73fa46\"\n },\n {\n \"url\": \"backend/node/express/01-overview-architecture.html\",\n \"revision\": \"48ffea9c9572b5acb7a89fbcab5a8f0f\"\n },\n {\n \"url\": \"backend/node/express/02-express.js.html\",\n \"revision\": \"e1149d28277943a2aee7f6d704d11d3f\"\n },\n {\n \"url\": \"backend/node/express/index.html\",\n \"revision\": \"e0efd11beab930f1e1cd911d85d475ac\"\n },\n {\n \"url\": \"backend/node/index.html\",\n \"revision\": \"7ec437e43c5bf2c97ad8cddc3573cd9b\"\n },\n {\n \"url\": \"backend/node/module/001-finalhandler.html\",\n \"revision\": \"a6c9ba2ffb984b9f070c340199835b36\"\n },\n {\n \"url\": \"backend/node/module/index.html\",\n \"revision\": \"83bf682b88f94c546b4bfd350c4363e4\"\n },\n {\n \"url\": \"category/algorithm/index.html\",\n \"revision\": \"dc67a73d3a53612bc0a0d5cd6700d74f\"\n },\n {\n \"url\": \"category/browser/index.html\",\n \"revision\": \"9eb5598efb5d5b8ac1debc6376e5e38f\"\n },\n {\n \"url\": \"category/chakra/index.html\",\n \"revision\": \"c7df3bd7ff2d6bb9aa2b6443792647ad\"\n },\n {\n \"url\": \"category/css/index.html\",\n \"revision\": \"d6bd29cb8ec437c3df05448dbe7c957c\"\n },\n {\n \"url\": \"category/database/index.html\",\n \"revision\": \"a844a3270e713d60bf97f9ed72449efe\"\n },\n {\n \"url\": \"category/html/index.html\",\n \"revision\": \"5a5793bdad56e85d8af06ec853c2285f\"\n },\n {\n \"url\": \"category/index.html\",\n \"revision\": \"1910c6e84f3ab536289597319cad3532\"\n },\n {\n \"url\": \"category/javascript/index.html\",\n \"revision\": \"e9e033fcda3e637bba6177653ff04007\"\n },\n {\n \"url\": \"category/leetcode/index.html\",\n \"revision\": \"7cd6ae1273f6043d1928b988321a3d3c\"\n },\n {\n \"url\": \"category/linux/index.html\",\n \"revision\": \"0c3a90a5b4dc5e17d53e6a9fcfd65c3a\"\n },\n {\n \"url\": \"category/next/index.html\",\n \"revision\": \"4036c2eaa0f15d0dadd6d674daf03248\"\n },\n {\n \"url\": \"category/node/index.html\",\n \"revision\": \"bb516441b5c86addfba9d7c309ce5733\"\n },\n {\n \"url\": \"category/operating-system/index.html\",\n \"revision\": \"15703386054db6a75ed31d7bcb175864\"\n },\n {\n \"url\": \"category/pixi/index.html\",\n \"revision\": \"7a86c6fda599f56d714f355fd5fa70d8\"\n },\n {\n \"url\": \"category/practice/index.html\",\n \"revision\": \"20b4be9c2a8f72e87301779678cdec0c\"\n },\n {\n \"url\": \"category/project/index.html\",\n \"revision\": \"ea44232625e68e0efb1e6ca8d4d21295\"\n },\n {\n \"url\": \"category/react/index.html\",\n \"revision\": \"62740e6786b1cb79df1e33a4b1da1c82\"\n },\n {\n \"url\": \"category/reading/index.html\",\n \"revision\": \"e6f34e063ceaa7274ede8d658bfd2b9b\"\n },\n {\n \"url\": \"category/vue/index.html\",\n \"revision\": \"9e5108c505acd09c9500835850a3df49\"\n },\n {\n \"url\": \"category/工程化/index.html\",\n \"revision\": \"62acbd8da3b5024db29f5fe2d4b401f7\"\n },\n {\n \"url\": \"category/计算机网络/index.html\",\n \"revision\": \"3d71d6328f95cbc318ec38450342d332\"\n },\n {\n \"url\": \"computer-science/algorithm/0001、二叉树.html\",\n \"revision\": \"ad692c103f9494c80def010fea899ed6\"\n },\n {\n \"url\": \"computer-science/algorithm/0002、二叉搜索树.html\",\n \"revision\": \"fa5dbe9b843612e839e53c77b11d520c\"\n },\n {\n \"url\": \"computer-science/algorithm/0003、动态规划.html\",\n \"revision\": \"854c664abbf490ed13cfd337017e6f71\"\n },\n {\n \"url\": \"computer-science/algorithm/0004、链表.html\",\n \"revision\": \"c933d6bff17aafdea57090ef824181b7\"\n },\n {\n \"url\": \"computer-science/algorithm/01-array.html\",\n \"revision\": \"1f9c4b070913ea22105e5d5f51674750\"\n },\n {\n \"url\": \"computer-science/algorithm/index.html\",\n \"revision\": \"8ca9c3bf62e46c3229adf7d50ec3dc82\"\n },\n {\n \"url\": \"computer-science/index.html\",\n \"revision\": \"1ce9cf132703e288970dbbf2b50d9efe\"\n },\n {\n \"url\": \"computer-science/networking/001-network-model.html\",\n \"revision\": \"b16ce7c18e4b242d19fe98c61cb5cfb8\"\n },\n {\n \"url\": \"computer-science/networking/002-HTTP-overview.html\",\n \"revision\": \"f316665f73f5c2b4f8d39ead8639b547\"\n },\n {\n \"url\": \"computer-science/networking/003-get-post-difference.html\",\n \"revision\": \"721be907f7de28dae5e33e4fdc6fb02e\"\n },\n {\n \"url\": \"computer-science/networking/004-HTTP-development.html\",\n \"revision\": \"d5139b346391f5dcf6ffcae48e4290ba\"\n },\n {\n \"url\": \"computer-science/networking/005-HTTP-cache.html\",\n \"revision\": \"175ce472710e885147cfaf09a5224d1d\"\n },\n {\n \"url\": \"computer-science/networking/006-HTTPS-overview.html\",\n \"revision\": \"8fcc98b059fc741289bab10fa3558e7b\"\n },\n {\n \"url\": \"computer-science/networking/007-TCP-three-handshakes-and-four-waves.html\",\n \"revision\": \"39d9da8c844edb0a8bd898328dd172f1\"\n },\n {\n \"url\": \"computer-science/networking/008-tcp-udp.html\",\n \"revision\": \"4480a15462b4ea5f7eb679adb3670e4c\"\n },\n {\n \"url\": \"computer-science/networking/009-http-code-when-authorized-refused.html\",\n \"revision\": \"6f31504aafb9f2ec5b58aa895735f264\"\n },\n {\n \"url\": \"computer-science/networking/index.html\",\n \"revision\": \"8a85f4c4871b6b3ce02a34bc05aa9f7d\"\n },\n {\n \"url\": \"computer-science/operating-system/001-character-encoding.html\",\n \"revision\": \"d4efb9179ff66caef3cfaf240ce63fae\"\n },\n {\n \"url\": \"computer-science/operating-system/index.html\",\n \"revision\": \"b97b333806d0d0e67834110a4af15d49\"\n },\n {\n \"url\": \"frontend/basic/css/001-quick-start.html\",\n \"revision\": \"db66051704d06e60683256e4fdbd6c63\"\n },\n {\n \"url\": \"frontend/basic/css/002-selector.html\",\n \"revision\": \"1cd189d9c14ac192f4a05942837948ed\"\n },\n {\n \"url\": \"frontend/basic/css/003-box-model.html\",\n \"revision\": \"16511571d0c217cbb5093bc0c204d66a\"\n },\n {\n \"url\": \"frontend/basic/css/004-text-font.html\",\n \"revision\": \"33f077f9826a2de54fa3a3ed431753db\"\n },\n {\n \"url\": \"frontend/basic/css/005-cascade-inheritance.html\",\n \"revision\": \"c64e4f555722a8565334269649c56bd5\"\n },\n {\n \"url\": \"frontend/basic/css/006-background-border.html\",\n \"revision\": \"8be46cc6a46543c2af0a7ec08378bc9a\"\n },\n {\n \"url\": \"frontend/basic/css/007-position.html\",\n \"revision\": \"0adadba5c43bbe3e166fe59f4f9527d6\"\n },\n {\n \"url\": \"frontend/basic/css/008-float.html\",\n \"revision\": \"a6123ffc97d9334ea437c77e73df214a\"\n },\n {\n \"url\": \"frontend/basic/css/009-flex.html\",\n \"revision\": \"24b801c89e9d11f467cc846a65cb92d7\"\n },\n {\n \"url\": \"frontend/basic/css/010-unit.html\",\n \"revision\": \"1601952c54e42e13674c005ac5b73541\"\n },\n {\n \"url\": \"frontend/basic/css/011-center.html\",\n \"revision\": \"8f63df0bb33e63a3e5767d68f296b7d9\"\n },\n {\n \"url\": \"frontend/basic/css/012-grid.html\",\n \"revision\": \"f67b2022dae483ed326d78b9fb6d6ed5\"\n },\n {\n \"url\": \"frontend/basic/css/013-BFC.html\",\n \"revision\": \"15bd74c4fd0ccdfec531e723e30fd544\"\n },\n {\n \"url\": \"frontend/basic/css/014-responsive-design-intro.html\",\n \"revision\": \"00ca541a52b026357777bd3401501e36\"\n },\n {\n \"url\": \"frontend/basic/css/015-responsive-design.html\",\n \"revision\": \"59003bce5d0d7d7f15c47d18c3c6e4c9\"\n },\n {\n \"url\": \"frontend/basic/css/016-how-to-responsive.html\",\n \"revision\": \"c56ef33e7c4c092dc3768200eae2b329\"\n },\n {\n \"url\": \"frontend/basic/css/017-loading-spinner.html\",\n \"revision\": \"9dc5dbfc3b98f6989064c2d4b10c87e0\"\n },\n {\n \"url\": \"frontend/basic/css/018-autofill.html\",\n \"revision\": \"b6a38b5225f40dfe572ebc6e28c02836\"\n },\n {\n \"url\": \"frontend/basic/css/index.html\",\n \"revision\": \"ce86095dea90b54ee3ae82852ac62416\"\n },\n {\n \"url\": \"frontend/basic/html/0007、WebSocket.html\",\n \"revision\": \"0e9559975b13f72cda414f14e8a1899b\"\n },\n {\n \"url\": \"frontend/basic/html/0008、WebStorage.html\",\n \"revision\": \"8bcc3360a0768002cf92a89f38283b69\"\n },\n {\n \"url\": \"frontend/basic/html/001-html-history.html\",\n \"revision\": \"8553f46f19054c959295b2f93bbced38\"\n },\n {\n \"url\": \"frontend/basic/html/0010、WebWorker.html\",\n \"revision\": \"d10fee04d19231079411b44a0db11636\"\n },\n {\n \"url\": \"frontend/basic/html/002-quick-start.html\",\n \"revision\": \"01ca0340da1c6d3671863ab753f731f3\"\n },\n {\n \"url\": \"frontend/basic/html/003-doctype.html\",\n \"revision\": \"fafcd35aafe00b8fe670bc442825cd91\"\n },\n {\n \"url\": \"frontend/basic/html/004-common-element.html\",\n \"revision\": \"62327b9309c2e10bd29f42ee3e0baac6\"\n },\n {\n \"url\": \"frontend/basic/html/005-advanced-element.html\",\n \"revision\": \"e1ccd593c042ddcc7401759884076d8e\"\n },\n {\n \"url\": \"frontend/basic/html/006-semantically-meaningful-tags.html\",\n \"revision\": \"c1dc269e717f3412b854436c8f28fbbe\"\n },\n {\n \"url\": \"frontend/basic/html/007-media-tag.html\",\n \"revision\": \"e2a0ab742aa7984eb78f4d7c404cc77b\"\n },\n {\n \"url\": \"frontend/basic/html/008-canvas-svg.html\",\n \"revision\": \"6efda65d6dafcd1f497ebe71ae9dc28b\"\n },\n {\n \"url\": \"frontend/basic/html/009-src-vs-href.html\",\n \"revision\": \"952eda38433a23b5a76516c092eb66cd\"\n },\n {\n \"url\": \"frontend/basic/html/010-html5.html\",\n \"revision\": \"8c825ebf3b6e96cede0efed05e77550b\"\n },\n {\n \"url\": \"frontend/basic/html/011-defer-vs-async.html\",\n \"revision\": \"3e8af151011acfbcc4adcc4caa3e8d59\"\n },\n {\n \"url\": \"frontend/basic/html/012-form-validation.html\",\n \"revision\": \"b4b6595ef4390b91b7c4701017c96996\"\n },\n {\n \"url\": \"frontend/basic/html/013-seo.html\",\n \"revision\": \"ff8ea9132e35d52c7d121dd56b3a9415\"\n },\n {\n \"url\": \"frontend/basic/html/index.html\",\n \"revision\": \"205ad1851e6b5bfbcd2a5c5e9974ce99\"\n },\n {\n \"url\": \"frontend/basic/index.html\",\n \"revision\": \"5d74d4d0d87d32aee660a76440c5504d\"\n },\n {\n \"url\": \"frontend/basic/javascript/001-var-let-const.html\",\n \"revision\": \"22f59395b0f27b8dc21c5bc6016f95bd\"\n },\n {\n \"url\": \"frontend/basic/javascript/0011、判断对象值相等.html\",\n \"revision\": \"013b7028f1176206272fba1df230415a\"\n },\n {\n \"url\": \"frontend/basic/javascript/0012、AJAX.html\",\n \"revision\": \"0e4ce03e7273fcd414955aa0a2592bb2\"\n },\n {\n \"url\": \"frontend/basic/javascript/0014、浅拷贝与深拷贝.html\",\n \"revision\": \"222347e6087795283495efaed93ebb39\"\n },\n {\n \"url\": \"frontend/basic/javascript/0017、事件循环.html\",\n \"revision\": \"b2f228173bfcd669873d9ef8b1a24373\"\n },\n {\n \"url\": \"frontend/basic/javascript/002-types.html\",\n \"revision\": \"e8b0c90ca9fb5be6a1a4b990da3e8df3\"\n },\n {\n \"url\": \"frontend/basic/javascript/003-judge-type.html\",\n \"revision\": \"f83f97ce14ad97b2ac447e54dc7d2c4c\"\n },\n {\n \"url\": \"frontend/basic/javascript/004-primitive-value-reference-value.html\",\n \"revision\": \"547dd48766486aa2b2d99de09c054fb3\"\n },\n {\n \"url\": \"frontend/basic/javascript/005-execution-context.html\",\n \"revision\": \"3db0af4398075583f175e5768d04f9c2\"\n },\n {\n \"url\": \"frontend/basic/javascript/006-toString-toLocalString-valueOf.html\",\n \"revision\": \"4aa8a015c7dedd28cdbfb70809f63699\"\n },\n {\n \"url\": \"frontend/basic/javascript/007-basic-reference-type.html\",\n \"revision\": \"b1485cb082fe551c94394a784965ebe1\"\n },\n {\n \"url\": \"frontend/basic/javascript/008-collection-reference-type.html\",\n \"revision\": \"43de5950e60ab97f4680351a4e3e54c1\"\n },\n {\n \"url\": \"frontend/basic/javascript/009-array-like-object.html\",\n \"revision\": \"b6de6051b4e3ccc89c3f9a97f998606c\"\n },\n {\n \"url\": \"frontend/basic/javascript/010-object-property.html\",\n \"revision\": \"5ad47ad9dc6232ba5e714e325b8602a9\"\n },\n {\n \"url\": \"frontend/basic/javascript/011-create-object.html\",\n \"revision\": \"ef9a2cc45c2b74e9bdff026644e44daf\"\n },\n {\n \"url\": \"frontend/basic/javascript/012-extends.html\",\n \"revision\": \"96170b169a49432ce3ff6cb07f9014ee\"\n },\n {\n \"url\": \"frontend/basic/javascript/013-class.html\",\n \"revision\": \"544a2e8bfa486db3b0066d9d6d96a161\"\n },\n {\n \"url\": \"frontend/basic/javascript/014-implement-new.html\",\n \"revision\": \"b2b8967f36b61250e2615cea0b4be740\"\n },\n {\n \"url\": \"frontend/basic/javascript/015-function.html\",\n \"revision\": \"1b66a8ac444541535f5478c7f6d97dac\"\n },\n {\n \"url\": \"frontend/basic/javascript/016-this.html\",\n \"revision\": \"5c5e0c0e07649b48f17f39ae37d47447\"\n },\n {\n \"url\": \"frontend/basic/javascript/017-implement-call-apply-bind.html\",\n \"revision\": \"db8b3ea45d7acebb0d41da3ab664793c\"\n },\n {\n \"url\": \"frontend/basic/javascript/index.html\",\n \"revision\": \"de8a337da149742abb51971c6fe52f48\"\n },\n {\n \"url\": \"frontend/browser/01-how-browser-rendering-works.html\",\n \"revision\": \"f767a225fbd7fd80249f2302ea61cc2b\"\n },\n {\n \"url\": \"frontend/browser/02-V8.html\",\n \"revision\": \"10901f0e5cccba950f5a5ea5727a768d\"\n },\n {\n \"url\": \"frontend/browser/03-memory-management.html\",\n \"revision\": \"e8ae44366366f3dae367c08b92f2acda\"\n },\n {\n \"url\": \"frontend/browser/04-cross-domain.html\",\n \"revision\": \"8d1b80ec91044d39f66f6ad1e8db5610\"\n },\n {\n \"url\": \"frontend/browser/05-what-happens-after-entering-the-URL.html\",\n \"revision\": \"712e886d9e0214847c418b75cd97d24c\"\n },\n {\n \"url\": \"frontend/browser/index.html\",\n \"revision\": \"6290d3128eb02bc5e15db92e9d1e0afa\"\n },\n {\n \"url\": \"frontend/engineering/basic/001-modularization.html\",\n \"revision\": \"a84fb5160179107db3a842bba67b6a16\"\n },\n {\n \"url\": \"frontend/engineering/basic/002-package-manager.html\",\n \"revision\": \"864f1800b5f10309ff711cca55b32a4b\"\n },\n {\n \"url\": \"frontend/engineering/basic/003-tool.html\",\n \"revision\": \"b4775bf36769cf53fb8453949783cfbe\"\n },\n {\n \"url\": \"frontend/engineering/basic/004-project-standards.html\",\n \"revision\": \"ce4e61b54f0a46702a2edb7286ca486e\"\n },\n {\n \"url\": \"frontend/engineering/basic/005-yeoman.html\",\n \"revision\": \"2b04512bfffe39e8f964374b1713ea7b\"\n },\n {\n \"url\": \"frontend/engineering/basic/index.html\",\n \"revision\": \"b53bed8e3a94a0ce58ddbb9e42d39490\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/index.html\",\n \"revision\": \"8f6c4c7764e82236fb453fefccfbebaf\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/rspack/001-hello-rspack.html\",\n \"revision\": \"142f84b6626de53cf5ad40a00d9e01db\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/rspack/index.html\",\n \"revision\": \"e09eab0c5202f7ce7e280ddd74089b65\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/vite/001-hello-vite.html\",\n \"revision\": \"c29fa16a120e48ef476a764df0731ff4\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/vite/index.html\",\n \"revision\": \"a74750d22597164189d80dbf271e59b2\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/001-webpack-basic.html\",\n \"revision\": \"9d70a31b634789870d79e4927614f439\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/002-webpack-css.html\",\n \"revision\": \"0a2a75ddd6208ae84413894ff503906c\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/003-webpack-assets.html\",\n \"revision\": \"36460f97bc8796df9ef926a5fe26677d\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/004-webpack-plugin.html\",\n \"revision\": \"c7ebab7b819197ab8c3641ab2742eeca\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/005-webpack-babel.html\",\n \"revision\": \"69bdb442b1cbc865a175944ad794372c\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/006-webpack-vue.html\",\n \"revision\": \"86d0922c4a37154c80d5eb9cc71fda67\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/007-webpack-dev-server.html\",\n \"revision\": \"3c9ee2f28e637406bd237582516cefba\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/008-webpack-resolve.html\",\n \"revision\": \"c787bdb24bf10fdd86efd2b33c467b9e\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/009-webpack-env-split.html\",\n \"revision\": \"051225ebddc0eebbe6826f532effd01c\"\n },\n {\n \"url\": \"frontend/engineering/build-tool/webpack/index.html\",\n \"revision\": \"99195134e9425652b3a7e9e9b9280176\"\n },\n {\n \"url\": \"frontend/engineering/index.html\",\n \"revision\": \"3941a76643b6ffba97c833ac974dd0f6\"\n },\n {\n \"url\": \"frontend/engineering/ssr/005-qwik.html\",\n \"revision\": \"83c6f2f2ad24d434c61c3e4140f0f495\"\n },\n {\n \"url\": \"frontend/engineering/ssr/006-react-server-component.html\",\n \"revision\": \"7eeaab7cc249b3ae9c9143e0055745a5\"\n },\n {\n \"url\": \"frontend/engineering/ssr/007-hydration-is-pure-overhead.html\",\n \"revision\": \"1dc363f4b9cd6b61d8d37f6516affc09\"\n },\n {\n \"url\": \"frontend/engineering/ssr/index.html\",\n \"revision\": \"0de227684082a2f7f8306963ca681cb5\"\n },\n {\n \"url\": \"frontend/framework/chakra/01-getting-started.html\",\n \"revision\": \"1a6d9d0a9b16227d3310edc0ffc1c012\"\n },\n {\n \"url\": \"frontend/framework/chakra/02-style-props.html\",\n \"revision\": \"336e1016d76562e8cc967260797c125e\"\n },\n {\n \"url\": \"frontend/framework/chakra/index.html\",\n \"revision\": \"c8f62daf5581ae5be84fed127c176672\"\n },\n {\n \"url\": \"frontend/framework/index.html\",\n \"revision\": \"b451b4783840d9731283c676cd846d66\"\n },\n {\n \"url\": \"frontend/framework/next/index.html\",\n \"revision\": \"8bf7b098a206c069209eb7e1c9c64b26\"\n },\n {\n \"url\": \"frontend/framework/next/pages-router/01-pages-layouts.html\",\n \"revision\": \"b68d7fdea812f03b5e513908b7feb929\"\n },\n {\n \"url\": \"frontend/framework/next/pages-router/index.html\",\n \"revision\": \"b1f5d9ba3ce23d8ce015423327f92d0a\"\n },\n {\n \"url\": \"frontend/framework/node/001-module.html\",\n \"revision\": \"7b3589417e2e5d661a5f54e1a9fa1f98\"\n },\n {\n \"url\": \"frontend/framework/node/index.html\",\n \"revision\": \"f9895e7e468be01287ee63eb321e3ca6\"\n },\n {\n \"url\": \"frontend/framework/pixi/01-quick-start.html\",\n \"revision\": \"7cf938292e652c146fa8f432c2afe276\"\n },\n {\n \"url\": \"frontend/framework/pixi/02-architecture-overview.html\",\n \"revision\": \"b0176cf31f5245becedb781254f9eaea\"\n },\n {\n \"url\": \"frontend/framework/pixi/03-render-loop.html\",\n \"revision\": \"aa617cbfd2c3bf6571070710362175e2\"\n },\n {\n \"url\": \"frontend/framework/pixi/04-scene-graph.html\",\n \"revision\": \"aa0f23b6c05bac95d804bd332d2a8394\"\n },\n {\n \"url\": \"frontend/framework/pixi/index.html\",\n \"revision\": \"6a5ebe80d4a546237e38a7eb81448b00\"\n },\n {\n \"url\": \"frontend/framework/react/01-useState.html\",\n \"revision\": \"e66678ae56ab0fbd72285e9049ccbd97\"\n },\n {\n \"url\": \"frontend/framework/react/02-useEffect.html\",\n \"revision\": \"193f3c025f0157933afa016a780e3461\"\n },\n {\n \"url\": \"frontend/framework/react/index.html\",\n \"revision\": \"034c4b89e65330ef34833fb71bfcea09\"\n },\n {\n \"url\": \"frontend/framework/vue/01、父子组件通信.html\",\n \"revision\": \"d6e629270201be6d7284c7fea0f645d8\"\n },\n {\n \"url\": \"frontend/framework/vue/02、provide-inject.html\",\n \"revision\": \"5a16ab3331bf65ab0e0fa44d13052409\"\n },\n {\n \"url\": \"frontend/framework/vue/02、Vuex 原理.html\",\n \"revision\": \"4454e6128a8ab401a0aeb975c7e9d46d\"\n },\n {\n \"url\": \"frontend/framework/vue/03、插槽.html\",\n \"revision\": \"73cb05f1d2df8f3ad9004d174ba0fa0c\"\n },\n {\n \"url\": \"frontend/framework/vue/04、动态组件和异步组件.html\",\n \"revision\": \"17e295f63c6f203739fc94e367b80c55\"\n },\n {\n \"url\": \"frontend/framework/vue/05、组件的v-model.html\",\n \"revision\": \"1289ed31733744fe55dd5f7563b223f8\"\n },\n {\n \"url\": \"frontend/framework/vue/06、Mixin.html\",\n \"revision\": \"c8a57c3ef991246c6c047ad80ff28965\"\n },\n {\n \"url\": \"frontend/framework/vue/07、组合式API基础.html\",\n \"revision\": \"404fd4e8dd7a2296241308269efbf613\"\n },\n {\n \"url\": \"frontend/framework/vue/08、组合式函数.html\",\n \"revision\": \"2f7bdd8dbbf4c1026f7e7f9230386aa5\"\n },\n {\n \"url\": \"frontend/framework/vue/09、指令.html\",\n \"revision\": \"b9a0d12bc2336f3f661a8f98e53a20ee\"\n },\n {\n \"url\": \"frontend/framework/vue/10、插件.html\",\n \"revision\": \"49715c7b206a1320c71ccf762ca182af\"\n },\n {\n \"url\": \"frontend/framework/vue/index.html\",\n \"revision\": \"817e1fe76529ea9d478211e46177135d\"\n },\n {\n \"url\": \"frontend/index.html\",\n \"revision\": \"338cda341c2d4ec072ef81410e451161\"\n },\n {\n \"url\": \"frontend/practice/001-dnd-kit.html\",\n \"revision\": \"d4af09e5602123e1afd132e75050edbc\"\n },\n {\n \"url\": \"frontend/practice/002-annotation.html\",\n \"revision\": \"ac839b3f20262bc211e668e307963fab\"\n },\n {\n \"url\": \"frontend/practice/003-file-upload.html\",\n \"revision\": \"4a02fcfb3bd19b3650f61771fd1ac2f5\"\n },\n {\n \"url\": \"frontend/practice/004-global-upload.html\",\n \"revision\": \"cb5570cc303b8d32ebf648331eec2880\"\n },\n {\n \"url\": \"frontend/practice/005-postcss-px-to-viewport.html\",\n \"revision\": \"6439459ed706d4daf378f1a2f129afbc\"\n },\n {\n \"url\": \"frontend/practice/006-animation-svg.html\",\n \"revision\": \"fda59ec80fa7a7396bebc8f80e1346b9\"\n },\n {\n \"url\": \"frontend/practice/007-offline-export-in-highcharts.html\",\n \"revision\": \"11c0f59c6617a65b0cc86ac57db5c339\"\n },\n {\n \"url\": \"frontend/practice/010-antd-textarea-placeholder-pre-line.html\",\n \"revision\": \"7c68975123a9f0a657aeb0b2969b313b\"\n },\n {\n \"url\": \"frontend/practice/015-auto-change-node.html\",\n \"revision\": \"e18a104f9906b538626dccbd309b3690\"\n },\n {\n \"url\": \"frontend/practice/016-rest-client-error.html\",\n \"revision\": \"9e954eba96d8d5794c4fa42b200d701d\"\n },\n {\n \"url\": \"frontend/practice/017-whistle-debug-real-phone.html\",\n \"revision\": \"7a457f0a2bcf5feb62c797221adc69d8\"\n },\n {\n \"url\": \"frontend/practice/018-monaco-editor-react.html\",\n \"revision\": \"caa4146e479341c0591c81457b9a7fbd\"\n },\n {\n \"url\": \"frontend/practice/019-ios-prevent-touch.html\",\n \"revision\": \"7dc22b9825f8022277c26a20102c4a96\"\n },\n {\n \"url\": \"frontend/practice/020-ios-img.html\",\n \"revision\": \"fb2f80a40e91f62eb9c0643d5cb00c30\"\n },\n {\n \"url\": \"frontend/practice/index.html\",\n \"revision\": \"ada421b4a7617d522e2619e7883b9565\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"ebff7dace58701c5b0c2231076713f03\"\n },\n {\n \"url\": \"intro.html\",\n \"revision\": \"7a28ab443ab7692599d45f77ab213584\"\n },\n {\n \"url\": \"project/github-auto-commit/index.html\",\n \"revision\": \"ec08caffb111e9ebca9154fe836c2eb7\"\n },\n {\n \"url\": \"project/imperial-kitchen/01-init.html\",\n \"revision\": \"a85e0e721b70895e079652820aae216b\"\n },\n {\n \"url\": \"project/imperial-kitchen/02-server.html\",\n \"revision\": \"07ebaba7bd1e19c2ec5c64c0fdeb3f73\"\n },\n {\n \"url\": \"project/imperial-kitchen/03-database.html\",\n \"revision\": \"fb579cd669b3dfa52c2ed0c2f36651aa\"\n },\n {\n \"url\": \"project/imperial-kitchen/04-api.html\",\n \"revision\": \"20d57deb88512c6385d8dbee78b42af5\"\n },\n {\n \"url\": \"project/imperial-kitchen/index.html\",\n \"revision\": \"0a23ef5ca9da4d4f2f1d8758c1569a68\"\n },\n {\n \"url\": \"project/index.html\",\n \"revision\": \"59eeee27eac18f08bdb493987825fbad\"\n },\n {\n \"url\": \"project/mini-vue-cli/001-init-project.html\",\n \"revision\": \"7f340f99ccb89e801c0c0d980b0b1eea\"\n },\n {\n \"url\": \"project/mini-vue-cli/index.html\",\n \"revision\": \"5492f16f22021b86c0d2be566abd6d20\"\n },\n {\n \"url\": \"project/plugin/01.vuepress-plugin-ordered-header.html\",\n \"revision\": \"7b4448797312547aa30bdfb84e9ee932\"\n },\n {\n \"url\": \"project/plugin/index.html\",\n \"revision\": \"b7eee3f2cc45b8f78d714c1a9aee4f4a\"\n },\n {\n \"url\": \"project/RSSHub/index.html\",\n \"revision\": \"0b08347123b9fa8affd98227c94ba1e5\"\n },\n {\n \"url\": \"project/ssg/index.html\",\n \"revision\": \"57551f06741554d46a44b8216018f75f\"\n },\n {\n \"url\": \"project/tyro-ui/001-init-project.html\",\n \"revision\": \"3b53a6883219820f46aff9f4d857a3d7\"\n },\n {\n \"url\": \"project/tyro-ui/index.html\",\n \"revision\": \"2eafbcb4f4e8589d9dbb74ef2b9ae907\"\n },\n {\n \"url\": \"reading/index.html\",\n \"revision\": \"0cabd88868de12e8fc00bfaa3005bb45\"\n },\n {\n \"url\": \"reading/patterns/index.html\",\n \"revision\": \"161d4313c104fca7257185e2f2cf559f\"\n },\n {\n \"url\": \"reading/patterns/vanilla/01-command-pattern.html\",\n \"revision\": \"87af51e4edf347ed3df0efe866c3634f\"\n },\n {\n \"url\": \"reading/patterns/vanilla/02-factory-pattern.html\",\n \"revision\": \"3949a151ebb728372ac2c29acbb15a2a\"\n },\n {\n \"url\": \"reading/patterns/vanilla/03-flyweight-pattern.html\",\n \"revision\": \"9d54bae4532f394a6854b0902ac342ae\"\n },\n {\n \"url\": \"reading/patterns/vanilla/04-mediator-pattern.html\",\n \"revision\": \"da22f987a55d72952e599db98285f750\"\n },\n {\n \"url\": \"reading/patterns/vanilla/05-middleware-pattern.html\",\n \"revision\": \"14420bbae4ba17ee9dba17bc01b602d4\"\n },\n {\n \"url\": \"reading/patterns/vanilla/06-mixin-pattern.html\",\n \"revision\": \"89325e1d5e8f25ac28c6c75d34d6811c\"\n },\n {\n \"url\": \"reading/patterns/vanilla/07-module-pattern.html\",\n \"revision\": \"032a0a9d62c8ae9ad38c64cc4d731f3e\"\n },\n {\n \"url\": \"reading/patterns/vanilla/index.html\",\n \"revision\": \"15b135269f327c249f459f72518b899a\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/01-a-pragmatic-philosophy.html\",\n \"revision\": \"bea917edde7b8680be97f238b421d916\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/02-a-pragmatic-approach.html\",\n \"revision\": \"8215dd85d7b6a39260b8fe23b6a4ae39\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/03-basic-tool.html\",\n \"revision\": \"2cb6ce25b333b15ad9c73d51b2fdc20a\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/04-pragmatic-paranoid.html\",\n \"revision\": \"29a1e4c41bae8cd4e854420155951f21\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/05-work-around.html\",\n \"revision\": \"cf1323af543ccec46a737dd84367f852\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/06-concurrent.html\",\n \"revision\": \"7de8ccc6883cb8815047f4653a9bc466\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/07-when-coding.html\",\n \"revision\": \"fc530f71b049c5dc23473f091d0b1a9a\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/08-before-start-project.html\",\n \"revision\": \"13fc84399fe650c4750ac39e239429f2\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/09-pragmatic-project.html\",\n \"revision\": \"757950e6b2271ab07ce3c1ffbbe9553e\"\n },\n {\n \"url\": \"reading/pragmatic-programmer/index.html\",\n \"revision\": \"30d35cea67c0416a816bfc8c7b5c94f4\"\n },\n {\n \"url\": \"reading/pro-git/01-getting-started.html\",\n \"revision\": \"fe63c6330936654640bcfcdeaedb37c3\"\n },\n {\n \"url\": \"reading/pro-git/02-git-basics.html\",\n \"revision\": \"7023f581e0b9bcb2da75407c589b7ffc\"\n },\n {\n \"url\": \"reading/pro-git/03-git-branch.html\",\n \"revision\": \"731975b109b5b7a81d2fbe6da1e2f513\"\n },\n {\n \"url\": \"reading/pro-git/04-git-server.html\",\n \"revision\": \"6b94cabd64f4ebec7816416a58404276\"\n },\n {\n \"url\": \"reading/pro-git/06-change-commit.html\",\n \"revision\": \"6697723b9abd1d74368f7e27395ff411\"\n },\n {\n \"url\": \"reading/pro-git/index.html\",\n \"revision\": \"5dbceef00ed7aecef8a609821144cb2e\"\n },\n {\n \"url\": \"slides.html\",\n \"revision\": \"719dd7c1256d71113779439f8d1b9f40\"\n },\n {\n \"url\": \"star/index.html\",\n \"revision\": \"0f688ff00008c235d28bf59699825692\"\n },\n {\n \"url\": \"survival/index.html\",\n \"revision\": \"12c9fb390f85023850922c0e107a9ac6\"\n },\n {\n \"url\": \"survival/okr/2023.html\",\n \"revision\": \"5e3a049b45edc3d4acd6eb53fbf5db6b\"\n },\n {\n \"url\": \"survival/okr/2024.html\",\n \"revision\": \"2b697295d6a1d07795d77da6ab17c584\"\n },\n {\n \"url\": \"survival/okr/index.html\",\n \"revision\": \"8589ab75e4ff9d46c95fc027c9414623\"\n },\n {\n \"url\": \"survival/week/index.html\",\n \"revision\": \"91e4159a27da2406735ead9811350797\"\n },\n {\n \"url\": \"tag/amd/index.html\",\n \"revision\": \"e7232ea869d6b27cfdc4afa29cc853d9\"\n },\n {\n \"url\": \"tag/animation/index.html\",\n \"revision\": \"d7ed40dddc533aae83face3c72a7594b\"\n },\n {\n \"url\": \"tag/antd/index.html\",\n \"revision\": \"250af6fd578f9ed2b54d98f104dbc92d\"\n },\n {\n \"url\": \"tag/architecture/index.html\",\n \"revision\": \"3ef131373b0948d2581751af6687bfb3\"\n },\n {\n \"url\": \"tag/atomic-css/index.html\",\n \"revision\": \"a52351496669e728450d58f739bd635d\"\n },\n {\n \"url\": \"tag/backend/index.html\",\n \"revision\": \"953b43bd3c35ff41331148aff3b2195e\"\n },\n {\n \"url\": \"tag/basic-knowledge/index.html\",\n \"revision\": \"56a82d0d4e21f250d43f18c4b9ea58fc\"\n },\n {\n \"url\": \"tag/branch/index.html\",\n \"revision\": \"544c3dfe34127bf21ac6591ca8403811\"\n },\n {\n \"url\": \"tag/bt/index.html\",\n \"revision\": \"30e4a7293d5db37e4ea2364ca3aff3ef\"\n },\n {\n \"url\": \"tag/canvas/index.html\",\n \"revision\": \"0689c398958b3424b438d91e9498dc86\"\n },\n {\n \"url\": \"tag/centos/index.html\",\n \"revision\": \"9774152170f555c539f9128c715aaeb8\"\n },\n {\n \"url\": \"tag/chakra/index.html\",\n \"revision\": \"1ec5fe9ee113ff33feebec6b8aa7bde4\"\n },\n {\n \"url\": \"tag/cjs/index.html\",\n \"revision\": \"a01d4703a497d0ff4a41d1ae00f30c43\"\n },\n {\n \"url\": \"tag/cli/index.html\",\n \"revision\": \"d8aea1e8ae60c5a7861c2d38eafc32de\"\n },\n {\n \"url\": \"tag/cmd/index.html\",\n \"revision\": \"69a4344a5b7dec761b0a8ba87d20aa60\"\n },\n {\n \"url\": \"tag/cnpm/index.html\",\n \"revision\": \"17019a67ddeb590bdf8cda72aa52a744\"\n },\n {\n \"url\": \"tag/code-editor/index.html\",\n \"revision\": \"7ee149c38ff8c65e77a9786d382552d3\"\n },\n {\n \"url\": \"tag/command-pattern/index.html\",\n \"revision\": \"35e7046976e9435243d1d0125d5b8938\"\n },\n {\n \"url\": \"tag/commit/index.html\",\n \"revision\": \"576610131b10cebe1235b41adae5be1f\"\n },\n {\n \"url\": \"tag/computer-science/index.html\",\n \"revision\": \"8ab11299fd3fc479bed2a75d8c0cab2b\"\n },\n {\n \"url\": \"tag/css/index.html\",\n \"revision\": \"e5fbc14df21460b826b5061622f7c7b7\"\n },\n {\n \"url\": \"tag/data-model/index.html\",\n \"revision\": \"57a74642438a60dce9cc66a45a766897\"\n },\n {\n \"url\": \"tag/debug/index.html\",\n \"revision\": \"63a9f128146a1d0f714bbe3c555c506f\"\n },\n {\n \"url\": \"tag/design-pattern/index.html\",\n \"revision\": \"6653ef2f9eb33c6c5abbbfc78c970141\"\n },\n {\n \"url\": \"tag/dnd-kit/index.html\",\n \"revision\": \"44e8121f2049b6451ee47a75c515fe8d\"\n },\n {\n \"url\": \"tag/docker/index.html\",\n \"revision\": \"2fdf6c799a1369dc391a31d293f587be\"\n },\n {\n \"url\": \"tag/effect-hooks/index.html\",\n \"revision\": \"0cadef91bdab422d072fb151eb163312\"\n },\n {\n \"url\": \"tag/efficiency/index.html\",\n \"revision\": \"0f2249e8aa3c7694a022887700a3bff5\"\n },\n {\n \"url\": \"tag/esm/index.html\",\n \"revision\": \"c8cd9e1e962cdd219782bcf9db1d4ac6\"\n },\n {\n \"url\": \"tag/express/index.html\",\n \"revision\": \"a3d713ddcdda1d3b4fbfd440f0a2a7bb\"\n },\n {\n \"url\": \"tag/factory-pattern/index.html\",\n \"revision\": \"df9105f32a2abce6a3c4b6db5b56ac7e\"\n },\n {\n \"url\": \"tag/flyweight-pattern/index.html\",\n \"revision\": \"e6091a9ff14ae2872785161481146ffd\"\n },\n {\n \"url\": \"tag/form/index.html\",\n \"revision\": \"b16b38762a80cf97175223703dd43b09\"\n },\n {\n \"url\": \"tag/frontend/index.html\",\n \"revision\": \"0361fb8381f0153cd1ea13d9601575ff\"\n },\n {\n \"url\": \"tag/git/index.html\",\n \"revision\": \"db90c736157397e7f2de18d7d4a1f83f\"\n },\n {\n \"url\": \"tag/github-auto-commit/index.html\",\n \"revision\": \"4c771ed942a18f2b2e53f38f1eb47241\"\n },\n {\n \"url\": \"tag/github/index.html\",\n \"revision\": \"b8eebf7d0778a6b2766c0a6e93b295b0\"\n },\n {\n \"url\": \"tag/grid/index.html\",\n \"revision\": \"2f6219be4d7772bb575b9bc80c4f79ce\"\n },\n {\n \"url\": \"tag/highcharts/index.html\",\n \"revision\": \"471f1f7f9c2f702b7f4b102fec5d3211\"\n },\n {\n \"url\": \"tag/history/index.html\",\n \"revision\": \"314763e4664d33cdad5544c4127dc90a\"\n },\n {\n \"url\": \"tag/hooks/index.html\",\n \"revision\": \"2112a549d5a020bbe47a4d96488e5c22\"\n },\n {\n \"url\": \"tag/html/index.html\",\n \"revision\": \"6dddd6696bbc0fa97b6f62584181d330\"\n },\n {\n \"url\": \"tag/html5/index.html\",\n \"revision\": \"b702503c20b236f5ecc4205b22239c7c\"\n },\n {\n \"url\": \"tag/http-code/index.html\",\n \"revision\": \"6c8e387452cb5fa2ed2a25a843228b6a\"\n },\n {\n \"url\": \"tag/http/index.html\",\n \"revision\": \"81e20e350b15fc17ba796e2559d1141e\"\n },\n {\n \"url\": \"tag/https/index.html\",\n \"revision\": \"189a97220e1fd7bdba016a7564222da9\"\n },\n {\n \"url\": \"tag/index.html\",\n \"revision\": \"93b182234a00eae9ccdd9c2ab7924040\"\n },\n {\n \"url\": \"tag/init-project/index.html\",\n \"revision\": \"b2863ed464b2a5ad6fa4464857d84914\"\n },\n {\n \"url\": \"tag/kitchen/index.html\",\n \"revision\": \"3cf2a490f870ea5deac13060b116ecc7\"\n },\n {\n \"url\": \"tag/langchain/index.html\",\n \"revision\": \"9e3d3c42d33833e62a7070600e9a543e\"\n },\n {\n \"url\": \"tag/language-advanced/index.html\",\n \"revision\": \"846090daa63c0840bec909b4ac44af97\"\n },\n {\n \"url\": \"tag/language-basic/index.html\",\n \"revision\": \"3366a117201551169ab944cc00e0b76f\"\n },\n {\n \"url\": \"tag/mediator-pattern/index.html\",\n \"revision\": \"8bbae9694392c2312968898d14e43083\"\n },\n {\n \"url\": \"tag/middleware-pattern/index.html\",\n \"revision\": \"645577376d981674d812b879aa761194\"\n },\n {\n \"url\": \"tag/mixin-pattern/index.html\",\n \"revision\": \"0bd0618b6d80fc20e7030f6cc4dfabf3\"\n },\n {\n \"url\": \"tag/module-pattern/index.html\",\n \"revision\": \"838eee00773a441c53c7e3045896fa06\"\n },\n {\n \"url\": \"tag/module/index.html\",\n \"revision\": \"6ce7f1c93eba34cb6ccc525a3b50238c\"\n },\n {\n \"url\": \"tag/mysql/index.html\",\n \"revision\": \"ae06a4dcba7e3ee530fd669d5576e9c5\"\n },\n {\n \"url\": \"tag/network/index.html\",\n \"revision\": \"fdb4c6ff11ccec9ea14d24f093204b14\"\n },\n {\n \"url\": \"tag/new/index.html\",\n \"revision\": \"9c7322846319f672dbf087bb8ba0f06f\"\n },\n {\n \"url\": \"tag/next.js/index.html\",\n \"revision\": \"271af344c32cab3468d98ac75f946c77\"\n },\n {\n \"url\": \"tag/node/index.html\",\n \"revision\": \"f9480e566f0a96fccc8d76c9fac1e347\"\n },\n {\n \"url\": \"tag/npm/index.html\",\n \"revision\": \"5acc5c1b1b841b226353f093050e6409\"\n },\n {\n \"url\": \"tag/object/index.html\",\n \"revision\": \"a44c8b58d38fc7a8db8e1afa4f1be931\"\n },\n {\n \"url\": \"tag/openai/index.html\",\n \"revision\": \"ddac3af8ff0853cf09b0aaa1d139d54c\"\n },\n {\n \"url\": \"tag/pages-router/index.html\",\n \"revision\": \"331cd7a5d1ba6aab2bf3532e6f58c98b\"\n },\n {\n \"url\": \"tag/pnpm/index.html\",\n \"revision\": \"c36650f201a36fcbcce27138caa7abf5\"\n },\n {\n \"url\": \"tag/postcss/index.html\",\n \"revision\": \"3a45f90c6f5f7e90743e1695c25e7514\"\n },\n {\n \"url\": \"tag/pragmatic/index.html\",\n \"revision\": \"0a4a3480c5fcc09ee0771ff4cda04ede\"\n },\n {\n \"url\": \"tag/react-core/index.html\",\n \"revision\": \"5e678d963c61d96d542e329a4e492521\"\n },\n {\n \"url\": \"tag/react/index.html\",\n \"revision\": \"fa6149003e01f7bde63826fb3326362d\"\n },\n {\n \"url\": \"tag/rspack/index.html\",\n \"revision\": \"a8eea9ac9270c7aa913c5f75d6c98ece\"\n },\n {\n \"url\": \"tag/rss/index.html\",\n \"revision\": \"35fe7892b023eba7d0afc0ecb7249f13\"\n },\n {\n \"url\": \"tag/selector/index.html\",\n \"revision\": \"dc1dfa381829700d9e5434eedb9ee171\"\n },\n {\n \"url\": \"tag/seo/index.html\",\n \"revision\": \"f8d3d1ef2b31083d8b93f6b0ee079692\"\n },\n {\n \"url\": \"tag/sql/index.html\",\n \"revision\": \"0be514b1d88c70e8253e19b307913515\"\n },\n {\n \"url\": \"tag/ssg/index.html\",\n \"revision\": \"14d7ba77b4ad3f3f85669ef670558504\"\n },\n {\n \"url\": \"tag/ssh/index.html\",\n \"revision\": \"e06eecbc08d84bfa11bc3a01bd8fa569\"\n },\n {\n \"url\": \"tag/ssr/index.html\",\n \"revision\": \"7e891874cb7e2f5ea6d5b5a4543547fb\"\n },\n {\n \"url\": \"tag/state-hooks/index.html\",\n \"revision\": \"12221abc8439244662da7431a06794a0\"\n },\n {\n \"url\": \"tag/styled-system/index.html\",\n \"revision\": \"f81511e57e7d4b9a7157872fe6c8ea92\"\n },\n {\n \"url\": \"tag/svg/index.html\",\n \"revision\": \"184dce01dd24f41a66713e4a1da06456\"\n },\n {\n \"url\": \"tag/tcp/index.html\",\n \"revision\": \"22f44447a4c396d7c40c7af8f8d9e873\"\n },\n {\n \"url\": \"tag/tcpip-模型/index.html\",\n \"revision\": \"3d63457d86feb04953f51adcfb1adad0\"\n },\n {\n \"url\": \"tag/this/index.html\",\n \"revision\": \"b389252ed27d1a506c66debbf3fe12d6\"\n },\n {\n \"url\": \"tag/trick/index.html\",\n \"revision\": \"40730dfef8ed350fe41566cb07a8403a\"\n },\n {\n \"url\": \"tag/typescript/index.html\",\n \"revision\": \"36bf71785258c431719ae339fe79b864\"\n },\n {\n \"url\": \"tag/udp/index.html\",\n \"revision\": \"96135d2c661552a50336772636ddeb90\"\n },\n {\n \"url\": \"tag/v8-引擎/index.html\",\n \"revision\": \"cb2ac34205094a27f0b42584c4234a43\"\n },\n {\n \"url\": \"tag/vanilla/index.html\",\n \"revision\": \"3cd932eee14d2c38b4b3945c899e3476\"\n },\n {\n \"url\": \"tag/vite/index.html\",\n \"revision\": \"3500921da2d5441aaa189fa61832aca0\"\n },\n {\n \"url\": \"tag/vscode/index.html\",\n \"revision\": \"ddc2374e84373d54cb516fd9c95877bf\"\n },\n {\n \"url\": \"tag/vuepress/index.html\",\n \"revision\": \"87753fc57b692c39542241b56e6c1310\"\n },\n {\n \"url\": \"tag/vuex/index.html\",\n \"revision\": \"84e94a3af565ecc5241212db59d2156d\"\n },\n {\n \"url\": \"tag/web-worker/index.html\",\n \"revision\": \"f5721440534232362509fe227749eed9\"\n },\n {\n \"url\": \"tag/webpack/index.html\",\n \"revision\": \"88674e656bd846df42739c9eeb2af50f\"\n },\n {\n \"url\": \"tag/yarn/index.html\",\n \"revision\": \"1519de461bd8f06807442dd88ed47cfc\"\n },\n {\n \"url\": \"tag/yeoman/index.html\",\n \"revision\": \"a4a6e3f240acef5d6859af78f8d27551\"\n },\n {\n \"url\": \"tag/zsh/index.html\",\n \"revision\": \"498529888ee8ebd5fc6434f0cc7fa3d8\"\n },\n {\n \"url\": \"tag/事件循环/index.html\",\n \"revision\": \"3c8e63fdddd230f715ff8dcf83efb281\"\n },\n {\n \"url\": \"tag/二分查找/index.html\",\n \"revision\": \"52c401b9d2d85caccbb5b02bdacc04ec\"\n },\n {\n \"url\": \"tag/二叉搜索树/index.html\",\n \"revision\": \"3dca7b48127dce6aad3062d7f7bb87b7\"\n },\n {\n \"url\": \"tag/二叉树/index.html\",\n \"revision\": \"3e560debf5b64be6de88da98ab58d0ec\"\n },\n {\n \"url\": \"tag/代码规范/index.html\",\n \"revision\": \"1918ae9a302d55a7dcc7444108879932\"\n },\n {\n \"url\": \"tag/关系数据库模型/index.html\",\n \"revision\": \"59e7ebe69e0d4073eac3078108efcc0e\"\n },\n {\n \"url\": \"tag/兼容/index.html\",\n \"revision\": \"0b5323714187aca24f640a80c3fd6add\"\n },\n {\n \"url\": \"tag/函数/index.html\",\n \"revision\": \"028ffcf05d0bfab25988c060b31f4efd\"\n },\n {\n \"url\": \"tag/前端存储/index.html\",\n \"revision\": \"0d53590c1e56e67246c1a24ee712511b\"\n },\n {\n \"url\": \"tag/动态规划/index.html\",\n \"revision\": \"3b04c687e9089aa7c89df65827e7df53\"\n },\n {\n \"url\": \"tag/双指针/index.html\",\n \"revision\": \"266ce32998af13ed841457c046972026\"\n },\n {\n \"url\": \"tag/图片批注/index.html\",\n \"revision\": \"965f07392eea3aaed4f3116bac24e814\"\n },\n {\n \"url\": \"tag/垃圾回收/index.html\",\n \"revision\": \"53af7bc4c28fdf85827143f283faa17f\"\n },\n {\n \"url\": \"tag/工程化/index.html\",\n \"revision\": \"718e87a28e23a44517781c91fdb9a7c3\"\n },\n {\n \"url\": \"tag/布局/index.html\",\n \"revision\": \"57302ffd65d435e1a694f5ae33357d36\"\n },\n {\n \"url\": \"tag/弹性盒/index.html\",\n \"revision\": \"96adc852519715d9b0cb09e0d3aaafa4\"\n },\n {\n \"url\": \"tag/御膳房/index.html\",\n \"revision\": \"8ea98ef85f39b3a8c09a99c45f529a57\"\n },\n {\n \"url\": \"tag/手写代码/index.html\",\n \"revision\": \"1e5a489b52c0e16df19aa3b25d033b8f\"\n },\n {\n \"url\": \"tag/拖拽排序/index.html\",\n \"revision\": \"97ff9360da4737ce545e9411923a1f50\"\n },\n {\n \"url\": \"tag/数据库设计理论/index.html\",\n \"revision\": \"f2aa01dea0c105b6d7f14279f1462bd4\"\n },\n {\n \"url\": \"tag/数据类型/index.html\",\n \"revision\": \"ca6e81bdf45f397edfbf5d051945b6a9\"\n },\n {\n \"url\": \"tag/数组/index.html\",\n \"revision\": \"8ab481a57bd9f397faa9b8f16e4d9a18\"\n },\n {\n \"url\": \"tag/文件上传/index.html\",\n \"revision\": \"2fccfd801750dbb4a48660e71205f139\"\n },\n {\n \"url\": \"tag/模块化/index.html\",\n \"revision\": \"7fc4269d5e0f7cc1cd1e0770d29efe83\"\n },\n {\n \"url\": \"tag/浅拷贝/index.html\",\n \"revision\": \"48e0160edef7f0627c57cda6492a1dc8\"\n },\n {\n \"url\": \"tag/浏览器渲染/index.html\",\n \"revision\": \"7842685b674f87740c01c66bdfecd095\"\n },\n {\n \"url\": \"tag/浮动/index.html\",\n \"revision\": \"ea2c139e5002c4fa54eb00b54445b29a\"\n },\n {\n \"url\": \"tag/深入组件/index.html\",\n \"revision\": \"8320f346f60e177ee60e79c3de0f3c3f\"\n },\n {\n \"url\": \"tag/深拷贝/index.html\",\n \"revision\": \"64819d13e999002c1ca5cba42c6e53a8\"\n },\n {\n \"url\": \"tag/源码阅读/index.html\",\n \"revision\": \"faf2fd617e54079d036d16b5c210a2fd\"\n },\n {\n \"url\": \"tag/移动端适配/index.html\",\n \"revision\": \"3cab07d7939de14fe47fe0bb6986b106\"\n },\n {\n \"url\": \"tag/组件库/index.html\",\n \"revision\": \"4005813cc92b7458fe57bf3399865d7c\"\n },\n {\n \"url\": \"tag/组件通信/index.html\",\n \"revision\": \"610180c45f98f15302657cd93fc3a5da\"\n },\n {\n \"url\": \"tag/组合式-api/index.html\",\n \"revision\": \"c4a45c40c555483f638dbc31c8b7308d\"\n },\n {\n \"url\": \"tag/网络请求/index.html\",\n \"revision\": \"02879d77cbe279fdd93765012006ea32\"\n },\n {\n \"url\": \"tag/链表/index.html\",\n \"revision\": \"bd87628d5b15924088f71593a2654761\"\n },\n {\n \"url\": \"tag/面向对象/index.html\",\n \"revision\": \"ad11e1968722cf70b921d180cdd84edb\"\n },\n {\n \"url\": \"tag/项目/index.html\",\n \"revision\": \"4507bfa00e22bc99c6226c3db44ce9ac\"\n },\n {\n \"url\": \"tag/项目打包/index.html\",\n \"revision\": \"a08eb92f8887b2be5354d59a917dc031\"\n },\n {\n \"url\": \"tag/项目部署/index.html\",\n \"revision\": \"0914dc95c2cd67dd18216b7761bb0a5f\"\n },\n {\n \"url\": \"timeline/index.html\",\n \"revision\": \"761c893af3967cff6815811cfa9d5204\"\n },\n {\n \"url\": \"assets/event-loop-3S7ql_ag.png\",\n \"revision\": \"73c49f2d9fbee1024bb5514bda223259\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/006/HTTP.png\",\n \"revision\": \"696f03139b0a7cd58f61fbda9ca71569\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/006/https-flow.png\",\n \"revision\": \"530732dac1410693cbdbcfeaf8616bcc\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/006/HTTPS.png\",\n \"revision\": \"b7b94c88fd268426680a0c6ca45de5c6\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/006/mid-attack.png\",\n \"revision\": \"f101a27ef11244840aeeca965614da8a\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/007/four.png\",\n \"revision\": \"91ec936c98b288f6f03fec1feeb56bf9\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/007/three.png\",\n \"revision\": \"3d375830b92323a4dab374dcb488ce95\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/010/DNS.png\",\n \"revision\": \"5754e327ee776e651564ad67510a9f66\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/010/message.png\",\n \"revision\": \"fdc1dde481eeae37518ec1a75e964463\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/010/parse-url.png\",\n \"revision\": \"68e965d160d8a8728680356d5e5304e0\"\n },\n {\n \"url\": \"assets/image/computer-science/networking/010/TCP-IP.png\",\n \"revision\": \"eaabb9a2407bfcca4c2e4fb8834b52d6\"\n },\n {\n \"url\": \"assets/image/frontend/basic/css/003/abnormal-box.png\",\n \"revision\": \"f71a1ccfe4bdcff13ae3b08f24b0ddf9\"\n },\n {\n \"url\": \"assets/image/frontend/basic/css/003/box.png\",\n \"revision\": \"663746ae4c9c718590e09adb1fa72caf\"\n },\n {\n \"url\": \"assets/image/frontend/basic/css/003/normal-box.png\",\n \"revision\": \"d7567d94ca78a57d31bcc40a20c5cefd\"\n },\n {\n \"url\": \"assets/image/frontend/basic/html/002/avatar.jpg\",\n \"revision\": \"bcd2b5352170f5d515b1dd8d969bc872\"\n },\n {\n \"url\": \"assets/image/frontend/tool/vite/001/bundle.png\",\n \"revision\": \"9affcc8711ebfcd3d3cc7269c57ced52\"\n },\n {\n \"url\": \"assets/image/frontend/tool/vite/001/esm-problem.png\",\n \"revision\": \"836cb8a52a868faa0474ff52b04e28a0\"\n },\n {\n \"url\": \"assets/image/frontend/tool/vite/001/esm-vite.png\",\n \"revision\": \"cc374f5589cb7c50a73440e53cad1d41\"\n },\n {\n \"url\": \"assets/image/frontend/tool/vite/001/vite.png\",\n \"revision\": \"916a6df6ac5972e0594a1be4c5fff31c\"\n },\n {\n \"url\": \"assets/image/frontend/tool/webpack/004/mode.png\",\n \"revision\": \"c5b190fa1356dde8cf0f9c54cb9b759d\"\n },\n {\n \"url\": \"assets/image/frontend/tool/webpack/004/source-map-1.png\",\n \"revision\": \"9edcbdb60792b9cccef52ee3e4e7e197\"\n },\n {\n \"url\": \"assets/image/frontend/tool/webpack/004/source-map-2.png\",\n \"revision\": \"9087a9aa58eb580e0298f0cd4b59b5c2\"\n },\n {\n \"url\": \"assets/provide-inject-m2qurnhp.png\",\n \"revision\": \"f7110a1bae2d0744997012ca656d8fa1\"\n },\n {\n \"url\": \"assets/scope-XtMnboSO.png\",\n \"revision\": \"00cf6bd787014eb22b2821d72b80212a\"\n },\n {\n \"url\": \"assets/scoped-slot-zLA5fzs5.png\",\n \"revision\": \"c6ef14ba02eac288245c5c5009d966cc\"\n },\n {\n \"url\": \"avatar.jpeg\",\n \"revision\": \"c74016a1dc6691fefe6ad212f1034757\"\n },\n {\n \"url\": \"hero.webp\",\n \"revision\": \"73886f53045fdd0606a196548e42e9a0\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches"],"mappings":"0nBAqBAA,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACP,IAGFC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,WACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,2EACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,qEACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,mEACPC,SAAY,oCAEd,CACED,IAAO,qEACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,iBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,YACPC,SAAY,qCAEb,CAAE,GACLC,EAAAA"} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index b8420670e5..b27b5c7084 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,3 +1,3 @@ -https://dribble-njr.github.io/blog/2024-04-09T02:51:47.000Zdailyhttps://dribble-njr.github.io/blog/intro.html2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/slides.html2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/backend/2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/2024-07-10T09:58:28.000Zdailyhttps://dribble-njr.github.io/blog/frontend/2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/project/2024-02-29T11:17:41.000Zdailyhttps://dribble-njr.github.io/blog/reading/2023-09-28T03:42:49.000Zdailyhttps://dribble-njr.github.io/blog/survival/2024-04-02T03:14:43.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/0001%E3%80%81%E4%BA%8C%E5%8F%89%E6%A0%91.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/0002%E3%80%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/0003%E3%80%81%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/0004%E3%80%81%E9%93%BE%E8%A1%A8.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/01-array.html2024-09-19T04:34:08.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/2024-02-15T10:39:28.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/001-network-model.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/002-HTTP-overview.html2024-02-07T06:34:07.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/003-get-post-difference.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/004-HTTP-development.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/005-HTTP-cache.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/006-HTTPS-overview.html2024-02-07T06:34:07.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/007-TCP-three-handshakes-and-four-waves.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/008-tcp-udp.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/009-http-code-when-authorized-refused.html2024-07-10T09:58:28.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/2024-07-10T09:58:28.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/operating-system/001-character-encoding.html2024-04-19T05:03:42.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/operating-system/2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/01-how-browser-rendering-works.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/02-V8.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/03-memory-management.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/04-cross-domain.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/05-what-happens-after-entering-the-URL.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/2023-12-24T06:41:05.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/001-dnd-kit.html2024-07-18T09:07:14.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/002-annotation.html2024-07-10T03:00:38.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/003-file-upload.html2024-01-07T10:18:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/004-global-upload.html2024-01-07T10:18:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/005-postcss-px-to-viewport.html2024-01-07T10:18:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/006-animation-svg.html2024-01-13T16:14:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/007-offline-export-in-highcharts.html2024-01-24T06:35:37.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/010-antd-textarea-placeholder-pre-line.html2024-04-08T10:29:30.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/015-auto-change-node.html2024-07-18T07:25:19.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/016-rest-client-error.html2024-07-19T06:38:02.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/017-whistle-debug-real-phone.html2024-08-21T06:16:31.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/018-monaco-editor-react.html2024-08-14T03:05:10.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/019-ios-prevent-touch.html2024-09-11T06:46:55.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/020-ios-img.html2024-09-11T07:08:05.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/2024-01-13T16:33:26.000Zdailyhttps://dribble-njr.github.io/blog/project/RSSHub/2024-02-27T03:18:09.000Zdailyhttps://dribble-njr.github.io/blog/project/github-auto-commit/2024-05-12T06:37:11.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/01-init.html2024-05-15T15:05:48.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/02-server.html2024-07-23T09:41:43.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/03-database.html2024-07-23T10:53:00.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/04-api.html2024-07-23T10:53:00.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/2024-05-12T06:37:11.000Zdailyhttps://dribble-njr.github.io/blog/project/mini-vue-cli/001-init-project.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/project/plugin/01.vuepress-plugin-ordered-header.html2024-02-29T11:17:41.000Zdailyhttps://dribble-njr.github.io/blog/project/plugin/2024-02-29T11:17:41.000Zdailyhttps://dribble-njr.github.io/blog/project/ssg/2024-02-29T11:17:41.000Zdailyhttps://dribble-njr.github.io/blog/project/tyro-ui/001-init-project.html2023-07-04T14:00:38.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/01-a-pragmatic-philosophy.html2024-02-20T02:22:03.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/02-a-pragmatic-approach.html2024-02-19T14:34:11.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/03-basic-tool.html2024-02-29T06:16:22.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/04-pragmatic-paranoid.html2024-04-08T09:07:59.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/05-work-around.html2024-05-29T14:30:37.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/06-concurrent.html2024-08-07T09:50:07.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/07-when-coding.html2024-08-07T10:07:24.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/08-before-start-project.html2024-08-07T10:23:44.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/09-pragmatic-project.html2024-08-07T10:33:41.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/2024-08-07T10:33:41.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/01-getting-started.html2024-02-07T08:47:58.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/02-git-basics.html2024-02-07T08:47:58.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/03-git-branch.html2024-02-07T08:47:58.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/04-git-server.html2024-02-07T09:12:42.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/06-change-commit.html2024-07-10T03:00:38.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/2024-07-10T03:00:38.000Zdailyhttps://dribble-njr.github.io/blog/survival/okr/2023.html2024-05-29T14:26:35.000Zdailyhttps://dribble-njr.github.io/blog/survival/okr/2024.html2024-08-07T10:34:28.000Zdailyhttps://dribble-njr.github.io/blog/survival/okr/2024-04-02T03:14:43.000Zdailyhttps://dribble-njr.github.io/blog/survival/week/2024-04-02T03:14:43.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/basic/001-hello-database.html2024-01-15T15:40:10.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/basic/002-relation-model.html2024-01-23T14:35:46.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/basic/003-db-design.html2024-01-23T14:35:46.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/basic/004-advanced-db-model.html2024-02-27T08:39:09.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/mysql/001-install-mysql.html2024-01-14T11:13:24.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/sql/01-quick-start.html2024-07-18T03:15:15.000Zdailyhttps://dribble-njr.github.io/blog/backend/java/tool/01-maven.html2024-08-30T11:36:15.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/001-set-the-ssh.html2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/002-build-git-server.html2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/003-configure-bt.html2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/004-automated-deployment.html2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/005-install-docker.html2024-01-13T18:13:25.000Zdailyhttps://dribble-njr.github.io/blog/backend/node/express/01-overview-architecture.html2024-08-23T10:15:50.000Zdailyhttps://dribble-njr.github.io/blog/backend/node/express/02-express.js.html2024-08-28T09:34:35.000Zdailyhttps://dribble-njr.github.io/blog/backend/node/module/001-finalhandler.html2024-08-27T08:07:17.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/001-quick-start.html2023-03-28T03:50:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/002-selector.html2023-03-27T10:15:15.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/003-box-model.html2023-04-25T05:40:28.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/004-text-font.html2023-08-22T10:50:30.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/005-cascade-inheritance.html2023-04-25T03:55:49.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/006-background-border.html2023-08-21T11:06:57.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/007-position.html2023-12-24T06:39:15.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/008-float.html2024-01-07T13:07:06.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/009-flex.html2023-12-24T06:39:15.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/010-unit.html2024-03-04T10:51:20.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/011-center.html2023-10-22T12:39:17.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/012-grid.html2023-12-30T10:18:48.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/013-BFC.html2024-01-07T13:07:06.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/014-responsive-design-intro.html2024-03-04T10:51:20.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/015-responsive-design.html2024-03-04T09:14:57.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/016-how-to-responsive.html2024-03-04T10:51:20.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/017-loading-spinner.html2024-09-18T07:24:09.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/018-autofill.html2024-09-14T09:21:57.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/2024-03-04T10:54:03.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/0007%E3%80%81WebSocket.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/0008%E3%80%81WebStorage.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/001-html-history.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/0010%E3%80%81WebWorker.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/002-quick-start.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/003-doctype.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/004-common-element.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/005-advanced-element.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/006-semantically-meaningful-tags.html2024-01-07T13:07:06.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/007-media-tag.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/008-canvas-svg.html2024-01-07T13:07:06.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/009-src-vs-href.html2024-03-04T11:50:03.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/010-html5.html2024-03-04T11:54:28.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/011-defer-vs-async.html2024-03-04T11:59:34.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/012-form-validation.html2024-03-24T07:43:55.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/013-seo.html2024-03-24T12:23:26.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/2024-04-14T11:37:32.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/001-var-let-const.html2024-04-16T04:38:18.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/0011%E3%80%81%E5%88%A4%E6%96%AD%E5%AF%B9%E8%B1%A1%E5%80%BC%E7%9B%B8%E7%AD%89.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/0012%E3%80%81AJAX.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/0014%E3%80%81%E6%B5%85%E6%8B%B7%E8%B4%9D%E4%B8%8E%E6%B7%B1%E6%8B%B7%E8%B4%9D.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/0017%E3%80%81%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/002-types.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/003-judge-type.html2024-04-14T15:32:30.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/004-primitive-value-reference-value.html2024-04-16T04:38:18.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/005-execution-context.html2024-04-16T05:23:03.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/006-toString-toLocalString-valueOf.html2024-04-30T07:44:46.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/007-basic-reference-type.html2024-04-19T05:03:42.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/008-collection-reference-type.html2024-04-30T07:44:46.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/009-array-like-object.html2024-04-24T04:51:59.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/010-object-property.html2024-04-30T08:41:59.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/011-create-object.html2024-05-29T13:16:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/012-extends.html2024-05-29T14:23:59.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/013-class.html2024-06-26T11:03:01.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/014-implement-new.html2024-06-27T07:26:14.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/015-function.html2024-08-07T08:19:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/016-this.html2024-08-07T08:19:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/017-implement-call-apply-bind.html2024-08-07T08:29:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/2024-04-30T08:41:59.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/001-modularization.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/002-package-manager.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/003-tool.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/004-project-standards.html2024-01-15T15:15:41.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/005-yeoman.html2024-01-09T13:35:18.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/ssr/005-qwik.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/ssr/006-react-server-component.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/ssr/007-hydration-is-pure-overhead.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/chakra/01-getting-started.html2024-03-07T10:41:37.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/chakra/02-style-props.html2024-03-07T10:41:37.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/chakra/2024-03-07T09:35:01.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/node/001-module.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/node/2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/01-quick-start.html2024-07-23T11:09:05.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/02-architecture-overview.html2024-07-29T10:55:38.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/03-render-loop.html2024-08-08T02:49:23.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/04-scene-graph.html2024-08-08T08:34:48.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/2024-07-23T11:09:05.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/react/01-useState.html2024-03-25T07:44:17.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/react/02-useEffect.html2024-04-02T03:14:43.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/react/2024-02-27T10:43:17.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/01%E3%80%81%E7%88%B6%E5%AD%90%E7%BB%84%E4%BB%B6%E9%80%9A%E4%BF%A1.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/02%E3%80%81Vuex%20%E5%8E%9F%E7%90%86.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/02%E3%80%81provide-inject.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/03%E3%80%81%E6%8F%92%E6%A7%BD.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/04%E3%80%81%E5%8A%A8%E6%80%81%E7%BB%84%E4%BB%B6%E5%92%8C%E5%BC%82%E6%AD%A5%E7%BB%84%E4%BB%B6.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/05%E3%80%81%E7%BB%84%E4%BB%B6%E7%9A%84v-model.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/06%E3%80%81Mixin.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/07%E3%80%81%E7%BB%84%E5%90%88%E5%BC%8FAPI%E5%9F%BA%E7%A1%80.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/08%E3%80%81%E7%BB%84%E5%90%88%E5%BC%8F%E5%87%BD%E6%95%B0.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/09%E3%80%81%E6%8C%87%E4%BB%A4.html2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/10%E3%80%81%E6%8F%92%E4%BB%B6.html2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/01-command-pattern.html2024-09-18T08:46:06.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/02-factory-pattern.html2024-09-18T08:46:06.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/03-flyweight-pattern.html2024-09-18T08:45:50.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/04-mediator-pattern.html2024-09-18T09:49:01.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/05-middleware-pattern.html2024-09-18T10:01:10.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/2024-02-07T04:26:52.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/rspack/001-hello-rspack.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/vite/001-hello-vite.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/001-webpack-basic.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/002-webpack-css.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/003-webpack-assets.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/004-webpack-plugin.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/005-webpack-babel.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/006-webpack-vue.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/007-webpack-dev-server.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/008-webpack-resolve.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/009-webpack-env-split.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/next/pages-router/01-pages-layouts.html2024-03-05T05:06:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/next/pages-router/2024-03-05T05:06:40.000Zdaily \ No newline at end of file +https://dribble-njr.github.io/blog/2024-04-09T02:51:47.000Zdailyhttps://dribble-njr.github.io/blog/intro.html2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/slides.html2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/backend/2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/2024-07-10T09:58:28.000Zdailyhttps://dribble-njr.github.io/blog/frontend/2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/project/2024-02-29T11:17:41.000Zdailyhttps://dribble-njr.github.io/blog/reading/2023-09-28T03:42:49.000Zdailyhttps://dribble-njr.github.io/blog/survival/2024-04-02T03:14:43.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/0001%E3%80%81%E4%BA%8C%E5%8F%89%E6%A0%91.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/0002%E3%80%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/0003%E3%80%81%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/0004%E3%80%81%E9%93%BE%E8%A1%A8.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/01-array.html2024-09-19T04:34:08.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/algorithm/2024-02-15T10:39:28.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/001-network-model.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/002-HTTP-overview.html2024-02-07T06:34:07.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/003-get-post-difference.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/004-HTTP-development.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/005-HTTP-cache.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/006-HTTPS-overview.html2024-02-07T06:34:07.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/007-TCP-three-handshakes-and-four-waves.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/008-tcp-udp.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/009-http-code-when-authorized-refused.html2024-07-10T09:58:28.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/networking/2024-07-10T09:58:28.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/operating-system/001-character-encoding.html2024-04-19T05:03:42.000Zdailyhttps://dribble-njr.github.io/blog/computer-science/operating-system/2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/01-how-browser-rendering-works.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/02-V8.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/03-memory-management.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/04-cross-domain.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/05-what-happens-after-entering-the-URL.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/browser/2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/2023-12-24T06:41:05.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/001-dnd-kit.html2024-07-18T09:07:14.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/002-annotation.html2024-07-10T03:00:38.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/003-file-upload.html2024-01-07T10:18:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/004-global-upload.html2024-01-07T10:18:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/005-postcss-px-to-viewport.html2024-01-07T10:18:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/006-animation-svg.html2024-01-13T16:14:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/007-offline-export-in-highcharts.html2024-01-24T06:35:37.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/010-antd-textarea-placeholder-pre-line.html2024-04-08T10:29:30.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/015-auto-change-node.html2024-07-18T07:25:19.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/016-rest-client-error.html2024-07-19T06:38:02.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/017-whistle-debug-real-phone.html2024-08-21T06:16:31.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/018-monaco-editor-react.html2024-08-14T03:05:10.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/019-ios-prevent-touch.html2024-09-11T06:46:55.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/020-ios-img.html2024-09-11T07:08:05.000Zdailyhttps://dribble-njr.github.io/blog/frontend/practice/2024-01-13T16:33:26.000Zdailyhttps://dribble-njr.github.io/blog/project/RSSHub/2024-02-27T03:18:09.000Zdailyhttps://dribble-njr.github.io/blog/project/github-auto-commit/2024-05-12T06:37:11.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/01-init.html2024-05-15T15:05:48.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/02-server.html2024-07-23T09:41:43.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/03-database.html2024-07-23T10:53:00.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/04-api.html2024-07-23T10:53:00.000Zdailyhttps://dribble-njr.github.io/blog/project/imperial-kitchen/2024-05-12T06:37:11.000Zdailyhttps://dribble-njr.github.io/blog/project/mini-vue-cli/001-init-project.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/project/plugin/01.vuepress-plugin-ordered-header.html2024-02-29T11:17:41.000Zdailyhttps://dribble-njr.github.io/blog/project/plugin/2024-02-29T11:17:41.000Zdailyhttps://dribble-njr.github.io/blog/project/ssg/2024-02-29T11:17:41.000Zdailyhttps://dribble-njr.github.io/blog/project/tyro-ui/001-init-project.html2023-07-04T14:00:38.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/01-a-pragmatic-philosophy.html2024-02-20T02:22:03.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/02-a-pragmatic-approach.html2024-02-19T14:34:11.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/03-basic-tool.html2024-02-29T06:16:22.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/04-pragmatic-paranoid.html2024-04-08T09:07:59.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/05-work-around.html2024-05-29T14:30:37.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/06-concurrent.html2024-08-07T09:50:07.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/07-when-coding.html2024-08-07T10:07:24.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/08-before-start-project.html2024-08-07T10:23:44.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/09-pragmatic-project.html2024-08-07T10:33:41.000Zdailyhttps://dribble-njr.github.io/blog/reading/pragmatic-programmer/2024-08-07T10:33:41.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/01-getting-started.html2024-02-07T08:47:58.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/02-git-basics.html2024-02-07T08:47:58.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/03-git-branch.html2024-02-07T08:47:58.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/04-git-server.html2024-02-07T09:12:42.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/06-change-commit.html2024-07-10T03:00:38.000Zdailyhttps://dribble-njr.github.io/blog/reading/pro-git/2024-07-10T03:00:38.000Zdailyhttps://dribble-njr.github.io/blog/survival/okr/2023.html2024-05-29T14:26:35.000Zdailyhttps://dribble-njr.github.io/blog/survival/okr/2024.html2024-08-07T10:34:28.000Zdailyhttps://dribble-njr.github.io/blog/survival/okr/2024-04-02T03:14:43.000Zdailyhttps://dribble-njr.github.io/blog/survival/week/2024-04-02T03:14:43.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/basic/001-hello-database.html2024-01-15T15:40:10.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/basic/002-relation-model.html2024-01-23T14:35:46.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/basic/003-db-design.html2024-01-23T14:35:46.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/basic/004-advanced-db-model.html2024-02-27T08:39:09.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/mysql/001-install-mysql.html2024-01-14T11:13:24.000Zdailyhttps://dribble-njr.github.io/blog/backend/database/sql/01-quick-start.html2024-07-18T03:15:15.000Zdailyhttps://dribble-njr.github.io/blog/backend/java/tool/01-maven.html2024-08-30T11:36:15.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/001-set-the-ssh.html2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/002-build-git-server.html2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/003-configure-bt.html2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/004-automated-deployment.html2024-01-09T04:30:54.000Zdailyhttps://dribble-njr.github.io/blog/backend/linux/practice/005-install-docker.html2024-01-13T18:13:25.000Zdailyhttps://dribble-njr.github.io/blog/backend/node/express/01-overview-architecture.html2024-08-23T10:15:50.000Zdailyhttps://dribble-njr.github.io/blog/backend/node/express/02-express.js.html2024-08-28T09:34:35.000Zdailyhttps://dribble-njr.github.io/blog/backend/node/module/001-finalhandler.html2024-08-27T08:07:17.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/001-quick-start.html2023-03-28T03:50:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/002-selector.html2023-03-27T10:15:15.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/003-box-model.html2023-04-25T05:40:28.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/004-text-font.html2023-08-22T10:50:30.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/005-cascade-inheritance.html2023-04-25T03:55:49.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/006-background-border.html2023-08-21T11:06:57.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/007-position.html2023-12-24T06:39:15.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/008-float.html2024-01-07T13:07:06.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/009-flex.html2023-12-24T06:39:15.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/010-unit.html2024-03-04T10:51:20.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/011-center.html2023-10-22T12:39:17.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/012-grid.html2023-12-30T10:18:48.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/013-BFC.html2024-01-07T13:07:06.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/014-responsive-design-intro.html2024-03-04T10:51:20.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/015-responsive-design.html2024-03-04T09:14:57.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/016-how-to-responsive.html2024-03-04T10:51:20.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/017-loading-spinner.html2024-09-18T07:24:09.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/018-autofill.html2024-09-14T09:21:57.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/css/2024-03-04T10:54:03.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/0007%E3%80%81WebSocket.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/0008%E3%80%81WebStorage.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/001-html-history.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/0010%E3%80%81WebWorker.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/002-quick-start.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/003-doctype.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/004-common-element.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/005-advanced-element.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/006-semantically-meaningful-tags.html2024-01-07T13:07:06.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/007-media-tag.html2024-03-04T11:41:47.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/008-canvas-svg.html2024-01-07T13:07:06.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/009-src-vs-href.html2024-03-04T11:50:03.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/010-html5.html2024-03-04T11:54:28.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/011-defer-vs-async.html2024-03-04T11:59:34.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/012-form-validation.html2024-03-24T07:43:55.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/013-seo.html2024-03-24T12:23:26.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/html/2024-04-14T11:37:32.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/001-var-let-const.html2024-04-16T04:38:18.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/0011%E3%80%81%E5%88%A4%E6%96%AD%E5%AF%B9%E8%B1%A1%E5%80%BC%E7%9B%B8%E7%AD%89.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/0012%E3%80%81AJAX.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/0014%E3%80%81%E6%B5%85%E6%8B%B7%E8%B4%9D%E4%B8%8E%E6%B7%B1%E6%8B%B7%E8%B4%9D.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/0017%E3%80%81%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/002-types.html2024-04-15T05:32:00.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/003-judge-type.html2024-04-14T15:32:30.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/004-primitive-value-reference-value.html2024-04-16T04:38:18.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/005-execution-context.html2024-04-16T05:23:03.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/006-toString-toLocalString-valueOf.html2024-04-30T07:44:46.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/007-basic-reference-type.html2024-04-19T05:03:42.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/008-collection-reference-type.html2024-04-30T07:44:46.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/009-array-like-object.html2024-04-24T04:51:59.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/010-object-property.html2024-04-30T08:41:59.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/011-create-object.html2024-05-29T13:16:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/012-extends.html2024-05-29T14:23:59.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/013-class.html2024-06-26T11:03:01.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/014-implement-new.html2024-06-27T07:26:14.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/015-function.html2024-08-07T08:19:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/016-this.html2024-08-07T08:19:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/017-implement-call-apply-bind.html2024-08-07T08:29:51.000Zdailyhttps://dribble-njr.github.io/blog/frontend/basic/javascript/2024-04-30T08:41:59.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/001-modularization.html2024-09-19T09:44:12.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/002-package-manager.html2024-02-07T05:30:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/003-tool.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/004-project-standards.html2024-01-15T15:15:41.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/basic/005-yeoman.html2024-01-09T13:35:18.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/ssr/005-qwik.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/ssr/006-react-server-component.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/ssr/007-hydration-is-pure-overhead.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/chakra/01-getting-started.html2024-03-07T10:41:37.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/chakra/02-style-props.html2024-03-07T10:41:37.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/chakra/2024-03-07T09:35:01.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/node/001-module.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/node/2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/01-quick-start.html2024-07-23T11:09:05.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/02-architecture-overview.html2024-07-29T10:55:38.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/03-render-loop.html2024-08-08T02:49:23.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/04-scene-graph.html2024-08-08T08:34:48.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/pixi/2024-07-23T11:09:05.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/react/01-useState.html2024-03-25T07:44:17.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/react/02-useEffect.html2024-04-02T03:14:43.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/react/2024-02-27T10:43:17.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/01%E3%80%81%E7%88%B6%E5%AD%90%E7%BB%84%E4%BB%B6%E9%80%9A%E4%BF%A1.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/02%E3%80%81Vuex%20%E5%8E%9F%E7%90%86.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/02%E3%80%81provide-inject.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/03%E3%80%81%E6%8F%92%E6%A7%BD.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/04%E3%80%81%E5%8A%A8%E6%80%81%E7%BB%84%E4%BB%B6%E5%92%8C%E5%BC%82%E6%AD%A5%E7%BB%84%E4%BB%B6.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/05%E3%80%81%E7%BB%84%E4%BB%B6%E7%9A%84v-model.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/06%E3%80%81Mixin.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/07%E3%80%81%E7%BB%84%E5%90%88%E5%BC%8FAPI%E5%9F%BA%E7%A1%80.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/08%E3%80%81%E7%BB%84%E5%90%88%E5%BC%8F%E5%87%BD%E6%95%B0.html2023-03-25T10:47:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/09%E3%80%81%E6%8C%87%E4%BB%A4.html2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/10%E3%80%81%E6%8F%92%E4%BB%B6.html2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/vue/2023-03-02T05:00:27.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/01-command-pattern.html2024-09-18T08:46:06.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/02-factory-pattern.html2024-09-18T08:46:06.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/03-flyweight-pattern.html2024-09-18T08:45:50.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/04-mediator-pattern.html2024-09-18T09:49:01.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/05-middleware-pattern.html2024-09-18T10:01:10.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/06-mixin-pattern.html2024-09-19T09:21:50.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/07-module-pattern.html2024-09-19T09:44:12.000Zdailyhttps://dribble-njr.github.io/blog/reading/patterns/vanilla/2024-02-07T04:26:52.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/rspack/001-hello-rspack.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/vite/001-hello-vite.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/001-webpack-basic.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/002-webpack-css.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/003-webpack-assets.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/004-webpack-plugin.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/005-webpack-babel.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/006-webpack-vue.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/007-webpack-dev-server.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/008-webpack-resolve.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/engineering/build-tool/webpack/009-webpack-env-split.html2024-01-07T08:28:24.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/next/pages-router/01-pages-layouts.html2024-03-05T05:06:40.000Zdailyhttps://dribble-njr.github.io/blog/frontend/framework/next/pages-router/2024-03-05T05:06:40.000Zdaily \ No newline at end of file diff --git a/slides.html b/slides.html index 127cacb936..a4b6c167f0 100644 --- a/slides.html +++ b/slides.html @@ -30,11 +30,11 @@ Slide page - +
    - + diff --git a/star/index.html b/star/index.html index 0fc5ade52d..33e7116504 100644 --- a/star/index.html +++ b/star/index.html @@ -30,11 +30,11 @@ 星标 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/survival/index.html b/survival/index.html index 1728afdb37..256f9c9f03 100644 --- a/survival/index.html +++ b/survival/index.html @@ -30,11 +30,11 @@ 求生之路 - +
    跳至主要內容

    求生之路

    njr小于 1 分钟约 13 字

    - + diff --git a/survival/okr/2023.html b/survival/okr/2023.html index 060dc479b4..a30e485d53 100644 --- a/survival/okr/2023.html +++ b/survival/okr/2023.html @@ -30,11 +30,11 @@ 2023 - +
    跳至主要內容

    2023

    njr大约 3 分钟约 852 字

    工作产出:

    1. 积极参与「新牛计划」,深入学习并系统沉淀了大量学习笔记。
    2. 开发纵横「图片压缩工具」,在性能优化方面进行了深入探索,并形成文档,经过成本评估后,决策采用了懒加载和前端分页实现方案,有效提升了页面加载速度和用户体验。
    3. 成功修复组件库上传组件的「拖拽上传问题」,并支持大规模文件拖拽上传。
    4. 积极参与了「前端单元测试」和「Rspack」等一起学习课程,参加「前端研发过程 prompt」圆桌讨论,拓宽了技术视野,不断提升了自身的技能水平。
    5. 实现「素材库」,包括动画素材库和原画素材库。在该需求上积累了复杂需求的开发经验,实现纵横整站的「全局上传组件」,并在「斑马前端周刊」上贡献一篇技术文章。
    6. 实现「思维知识树重构」,在开发中获得了丰富的拖拽排序和目录树技术经验,并将这些经验分享给团队成员,撰写并贡献了一篇相关技术文章。
    7. 优化「百科图鉴」相关需求 5+。
    8. Q4 KR「Angular 页面迁移」:配合迁移纵横课程视频模块 Angular 页面。
    9. ET 效率工具:为 ET 增加一些提效效率工具,包括阶段测、不限时测评、单节课等。
    10. 优化组内项目:为纵横添加 commitlint,解决每次 commit 报错,Z 站添加全局 ErrorBoundary 组件,提高项目的代码质量和稳定性。
    11. 参与「图片审核工具」图片批注与缩放方案探索,对方案的推动做出了贡献。

    工作能力和态度

    1. 通过参与纵横图片压缩工具、素材库、思维知识树重、图片审核工具等项目,展现了对复杂问题的解决能力,优化了前端代码结构和性能,为项目的稳定性和可扩展性提供了强有力的支持。
    2. 持续保持对新技术的学习,通过参加一起学习和圆桌讨论,学习并应用了新的前端框架/工具,提升了个人技能水平,与团队密切协作,促进了信息共享、技术交流和团队协作效率。
    3. 及时响应 Darwin 相关 case,主动与产品、后端跟进对齐,交付前充分自测,保证需求交付的产品质量,产品走查问题月平均 2 个。
    4. 大小需求均记录文档,及时记录问题,方便回顾并确保项目开发的可追溯性和透明性。

    发展计划及改进建议

    1. 深入学习 React Hooks 最佳实践和实现原理,学习代码设计模式、代码整洁之道,提高自己的编码质量。
    2. 逐步加入团队的代码审查流程,通过参与审查并学习他人优秀的代码,不断提高自己的编码规范和质量意识。
    3. 完善前端知识体系,学习前端工程化及 Node 相关知识,增加技术广度。
    4. 学习 Java、SpringBoot、数据库等后端基础知识,增加对业务及项目的理解程度。
    - + diff --git a/survival/okr/2024.html b/survival/okr/2024.html index 888db526e9..b75a220af4 100644 --- a/survival/okr/2024.html +++ b/survival/okr/2024.html @@ -30,11 +30,11 @@ 2024 - +
    跳至主要內容

    2024

    njr大约 3 分钟约 899 字

    Q1

    Q1O1: 前后端全栈能力

    Q1O2: 软技能

    Q2

    Q2O1:提升 JS 能力

    Q2O2:前后端全栈能力(接 Q1O1)

    Q2O3:软技能

    上半年

    上半年工作总结:

    1. 参与完成「阅读知识重构」,英语、阅读、思维「教学编排外化」工作,保证需求的及时交付,积累了 B 端复杂业务需求的经验。
      a. 负责「阅读知识重构」列表页开发,及部分知识类型详情页的开发;
      b. 负责「教学编排外化」级别、季度、单元、周的详情展示与编辑,单节课教学课程信息的展示与编辑功能的开发。
    2. 梳理英语环节不同条件下的不同资源配置,优化 word 环节「普通单词卡」、「三图视频」、「砸金蛋」资源配置。
    3. Z 站基础功能优化
      a. 支持解析 MOV 格式,解决宽高无法校验的问题;
      b. 调研 HighCharts 客户端导出图片技术方案并实现,保证数据安全;
      c. 调研表单低代码工具使用,并产出 demo 与文档。
    4. 纵横「打包工具迁移为 Rspack」,构建时间由 62.3s 减至 22.8s,冷启动时间由 25.7s 减少至 10.9s,部署时间由 364s 减至 143s。
    5. 纵横新增「文件检索」模块,支持文本搜图和以图搜图。
    6. 纵横「图片审核工具重构」,参与定义数据结构,抽象「文件列表渲染组件(支持拖放入文件)」、「面包屑」、「通用选择悬浮组件」,并抽象「本地排序」、「双击单击」、「shift 连选」通用 hooks 逻辑。
    7. 纵横新增「插画素材库」,同时优化缩略图加载顺序逻辑,提高页面加载性能,并新增「拖拽排序」及「文件移动」功能,接入「通用选择悬浮组件」,提升了操作体验。

    Q3

    继续 Q2 未完成事项。

    Q2O1:提升 JS 能力

    Q2O2:前后端全栈能力(接 Q1O1)

    Q2O3:软技能

    - + diff --git a/survival/okr/index.html b/survival/okr/index.html index 178667160c..611045d246 100644 --- a/survival/okr/index.html +++ b/survival/okr/index.html @@ -30,11 +30,11 @@ OKR - +
    跳至主要內容

    OKR

    njr小于 1 分钟约 6 字

    - + diff --git a/survival/week/index.html b/survival/week/index.html index 0257e7b12f..ab051e045e 100644 --- a/survival/week/index.html +++ b/survival/week/index.html @@ -30,11 +30,11 @@ Week - +
    跳至主要內容

    Week

    njr小于 1 分钟约 6 字

    - + diff --git a/tag/amd/index.html b/tag/amd/index.html index 61e46134ca..d5c6c12e0e 100644 --- a/tag/amd/index.html +++ b/tag/amd/index.html @@ -30,11 +30,11 @@ 标签: AMD - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/animation/index.html b/tag/animation/index.html index e3c2aa0bc2..7874afbaf2 100644 --- a/tag/animation/index.html +++ b/tag/animation/index.html @@ -30,11 +30,11 @@ 标签: animation - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/antd/index.html b/tag/antd/index.html index 4d0d0902f1..96c5277dfd 100644 --- a/tag/antd/index.html +++ b/tag/antd/index.html @@ -30,11 +30,11 @@ 标签: antd - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/architecture/index.html b/tag/architecture/index.html index 917cb3ae67..6a97d09029 100644 --- a/tag/architecture/index.html +++ b/tag/architecture/index.html @@ -30,11 +30,11 @@ 标签: architecture - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/atomic-css/index.html b/tag/atomic-css/index.html index 8c333d033e..997940560d 100644 --- a/tag/atomic-css/index.html +++ b/tag/atomic-css/index.html @@ -30,11 +30,11 @@ 标签: atomic css - + -
    跳至主要內容
    Style Props

    njr大约 3 分钟chakrafrontendatomic csschakrastyled system
    - +
    跳至主要內容
    Style Props

    njr大约 3 分钟chakrafrontendatomic csschakrastyled system
    + diff --git a/tag/backend/index.html b/tag/backend/index.html index 8a1add118b..f59462dedd 100644 --- a/tag/backend/index.html +++ b/tag/backend/index.html @@ -30,11 +30,11 @@ 标签: backend - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/basic-knowledge/index.html b/tag/basic-knowledge/index.html index e65e382b5c..1fece53ab9 100644 --- a/tag/basic-knowledge/index.html +++ b/tag/basic-knowledge/index.html @@ -30,11 +30,11 @@ 标签: basic-knowledge - + -
    跳至主要內容
    字符编码

    njr小于 1 分钟operating-systemcomputer-sciencebasic-knowledge
    - +
    跳至主要內容
    字符编码

    njr小于 1 分钟operating-systemcomputer-sciencebasic-knowledge
    + diff --git a/tag/branch/index.html b/tag/branch/index.html index 23e60c5962..bf93c97c35 100644 --- a/tag/branch/index.html +++ b/tag/branch/index.html @@ -30,11 +30,11 @@ 标签: branch - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/bt/index.html b/tag/bt/index.html index d5625c5781..96be1987a8 100644 --- a/tag/bt/index.html +++ b/tag/bt/index.html @@ -30,11 +30,11 @@ 标签: bt - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/canvas/index.html b/tag/canvas/index.html index 53d08f897e..9a6ba8a002 100644 --- a/tag/canvas/index.html +++ b/tag/canvas/index.html @@ -30,11 +30,11 @@ 标签: Canvas - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/centos/index.html b/tag/centos/index.html index 10573f852d..00b690641f 100644 --- a/tag/centos/index.html +++ b/tag/centos/index.html @@ -30,11 +30,11 @@ 标签: centos - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/chakra/index.html b/tag/chakra/index.html index 62f08eb513..df8ae6a7e6 100644 --- a/tag/chakra/index.html +++ b/tag/chakra/index.html @@ -30,11 +30,11 @@ 标签: chakra - + -
    跳至主要內容
    Style Props

    njr大约 3 分钟chakrafrontendatomic csschakrastyled system
    - +
    跳至主要內容
    Style Props

    njr大约 3 分钟chakrafrontendatomic csschakrastyled system
    + diff --git a/tag/cjs/index.html b/tag/cjs/index.html index 2871b50fc2..06aa1e511e 100644 --- a/tag/cjs/index.html +++ b/tag/cjs/index.html @@ -30,11 +30,11 @@ 标签: CJS - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/cli/index.html b/tag/cli/index.html index 07bbe67006..ea420a71e8 100644 --- a/tag/cli/index.html +++ b/tag/cli/index.html @@ -30,11 +30,11 @@ 标签: cli - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/cmd/index.html b/tag/cmd/index.html index c8e5fbb13d..5e5f2cd601 100644 --- a/tag/cmd/index.html +++ b/tag/cmd/index.html @@ -30,11 +30,11 @@ 标签: CMD - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/cnpm/index.html b/tag/cnpm/index.html index e45b6c60c3..d4a2ce1f81 100644 --- a/tag/cnpm/index.html +++ b/tag/cnpm/index.html @@ -30,11 +30,11 @@ 标签: cnpm - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/code-editor/index.html b/tag/code-editor/index.html index 35efc01203..f51a8421da 100644 --- a/tag/code-editor/index.html +++ b/tag/code-editor/index.html @@ -30,11 +30,11 @@ 标签: code editor - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/command-pattern/index.html b/tag/command-pattern/index.html index fd1b571d91..62cf3f8eea 100644 --- a/tag/command-pattern/index.html +++ b/tag/command-pattern/index.html @@ -30,11 +30,11 @@ 标签: command-pattern - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/commit/index.html b/tag/commit/index.html index a5e48e36f6..959b4d5acf 100644 --- a/tag/commit/index.html +++ b/tag/commit/index.html @@ -30,11 +30,11 @@ 标签: commit - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/computer-science/index.html b/tag/computer-science/index.html index 9a835143db..9a1e9cabd8 100644 --- a/tag/computer-science/index.html +++ b/tag/computer-science/index.html @@ -30,11 +30,11 @@ 标签: computer-science - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/css/index.html b/tag/css/index.html index d7aa2485f8..2089b13441 100644 --- a/tag/css/index.html +++ b/tag/css/index.html @@ -30,11 +30,11 @@ 标签: css - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/data-model/index.html b/tag/data-model/index.html index 58b898f514..6c2f0d02d3 100644 --- a/tag/data-model/index.html +++ b/tag/data-model/index.html @@ -30,11 +30,11 @@ 标签: data model - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/debug/index.html b/tag/debug/index.html index 09d84ca228..89e9dbc5ee 100644 --- a/tag/debug/index.html +++ b/tag/debug/index.html @@ -30,11 +30,11 @@ 标签: debug - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/design-pattern/index.html b/tag/design-pattern/index.html index b85f490903..03c8585067 100644 --- a/tag/design-pattern/index.html +++ b/tag/design-pattern/index.html @@ -30,11 +30,11 @@ 标签: design pattern - + -
    跳至主要內容
    享元模式

    patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
    中介者模式

    patterns大约 2 分钟readingdesign patternvanillamediator-pattern
    中间件模式

    patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
    命令模式

    patterns大约 2 分钟readingdesign patternvanillacommand-pattern
    工厂模式

    patterns大约 2 分钟readingdesign patternvanillafactory-pattern
    介绍

    patterns大约 1 分钟readingdesign patternvanilla
    - +
    跳至主要內容
    混入模式

    patterns大约 3 分钟readingdesign patternvanillamixin-pattern
    模块模式

    patterns小于 1 分钟readingdesign patternvanillamodule-pattern
    享元模式

    patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
    中介者模式

    patterns大约 2 分钟readingdesign patternvanillamediator-pattern
    中间件模式

    patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
    命令模式

    patterns大约 2 分钟readingdesign patternvanillacommand-pattern
    工厂模式

    patterns大约 2 分钟readingdesign patternvanillafactory-pattern
    介绍

    patterns大约 1 分钟readingdesign patternvanilla
    + diff --git a/tag/dnd-kit/index.html b/tag/dnd-kit/index.html index 5c1cb267c1..386c1d1711 100644 --- a/tag/dnd-kit/index.html +++ b/tag/dnd-kit/index.html @@ -30,11 +30,11 @@ 标签: dnd kit - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/docker/index.html b/tag/docker/index.html index deb76cf771..4a488e10c0 100644 --- a/tag/docker/index.html +++ b/tag/docker/index.html @@ -30,11 +30,11 @@ 标签: docker - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/effect-hooks/index.html b/tag/effect-hooks/index.html index 53f5876652..adccb768eb 100644 --- a/tag/effect-hooks/index.html +++ b/tag/effect-hooks/index.html @@ -30,11 +30,11 @@ 标签: effect hooks - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/efficiency/index.html b/tag/efficiency/index.html index 2544625d04..30ae0308a4 100644 --- a/tag/efficiency/index.html +++ b/tag/efficiency/index.html @@ -30,11 +30,11 @@ 标签: efficiency - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/esm/index.html b/tag/esm/index.html index cd76349d21..b306764b47 100644 --- a/tag/esm/index.html +++ b/tag/esm/index.html @@ -30,11 +30,11 @@ 标签: ESM - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/express/index.html b/tag/express/index.html index 0e1b6aa1e5..44394192cc 100644 --- a/tag/express/index.html +++ b/tag/express/index.html @@ -30,11 +30,11 @@ 标签: express - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/factory-pattern/index.html b/tag/factory-pattern/index.html index 23d231b2d0..f600c5bba5 100644 --- a/tag/factory-pattern/index.html +++ b/tag/factory-pattern/index.html @@ -30,11 +30,11 @@ 标签: factory-pattern - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/flyweight-pattern/index.html b/tag/flyweight-pattern/index.html index bbf49cb054..f65b39baf8 100644 --- a/tag/flyweight-pattern/index.html +++ b/tag/flyweight-pattern/index.html @@ -30,11 +30,11 @@ 标签: flyweight-pattern - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/form/index.html b/tag/form/index.html index b57fa6cabb..2db465425b 100644 --- a/tag/form/index.html +++ b/tag/form/index.html @@ -30,11 +30,11 @@ 标签: form - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/frontend/index.html b/tag/frontend/index.html index 9fd62dd6e2..c026120c5b 100644 --- a/tag/frontend/index.html +++ b/tag/frontend/index.html @@ -30,11 +30,11 @@ 标签: frontend - + -
    跳至主要內容
    Style Props

    njr大约 3 分钟chakrafrontendatomic csschakrastyled system
    Qwik

    njr大约 4 分钟工程化frontendSSR
    - +
    跳至主要內容
    Style Props

    njr大约 3 分钟chakrafrontendatomic csschakrastyled system
    Qwik

    njr大约 4 分钟工程化frontendSSR
    + diff --git a/tag/git/index.html b/tag/git/index.html index 7049b6c132..06f7ec54cf 100644 --- a/tag/git/index.html +++ b/tag/git/index.html @@ -30,11 +30,11 @@ 标签: git - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/github-auto-commit/index.html b/tag/github-auto-commit/index.html index dbddac0953..94e1cdeba7 100644 --- a/tag/github-auto-commit/index.html +++ b/tag/github-auto-commit/index.html @@ -30,11 +30,11 @@ 标签: github auto commit - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/github/index.html b/tag/github/index.html index a11ad4091b..d65811251e 100644 --- a/tag/github/index.html +++ b/tag/github/index.html @@ -30,11 +30,11 @@ 标签: github - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/grid/index.html b/tag/grid/index.html index c681b5e370..ef8020b4b5 100644 --- a/tag/grid/index.html +++ b/tag/grid/index.html @@ -30,11 +30,11 @@ 标签: grid - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/highcharts/index.html b/tag/highcharts/index.html index cd4ab97648..32bfe765b3 100644 --- a/tag/highcharts/index.html +++ b/tag/highcharts/index.html @@ -30,11 +30,11 @@ 标签: highcharts - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/history/index.html b/tag/history/index.html index a613cbd237..7285bc04a4 100644 --- a/tag/history/index.html +++ b/tag/history/index.html @@ -30,11 +30,11 @@ 标签: history - + -
    跳至主要內容
    历史

    njr大约 2 分钟HTMLfrontendhtmlbasic-knowledgehistory
    - +
    跳至主要內容
    历史

    njr大约 2 分钟HTMLfrontendhtmlbasic-knowledgehistory
    + diff --git a/tag/hooks/index.html b/tag/hooks/index.html index cecfa88c39..bf7259552d 100644 --- a/tag/hooks/index.html +++ b/tag/hooks/index.html @@ -30,11 +30,11 @@ 标签: hooks - + -
    跳至主要內容
    - +
    跳至主要內容
    useState

    njr大约 5 分钟reactreact corehooksstate hooks
    + diff --git a/tag/html/index.html b/tag/html/index.html index 3f65db751e..ddce057901 100644 --- a/tag/html/index.html +++ b/tag/html/index.html @@ -30,11 +30,11 @@ 标签: HTML - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/html5/index.html b/tag/html5/index.html index 2544ff56a8..a238e768ac 100644 --- a/tag/html5/index.html +++ b/tag/html5/index.html @@ -30,11 +30,11 @@ 标签: HTML5 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/http-code/index.html b/tag/http-code/index.html index 891a3b6c14..f6c3a10225 100644 --- a/tag/http-code/index.html +++ b/tag/http-code/index.html @@ -30,11 +30,11 @@ 标签: HTTP code - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/http/index.html b/tag/http/index.html index f1326f644a..b92239ceda 100644 --- a/tag/http/index.html +++ b/tag/http/index.html @@ -30,11 +30,11 @@ 标签: HTTP - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/https/index.html b/tag/https/index.html index bde9a89ac9..61ae088d5e 100644 --- a/tag/https/index.html +++ b/tag/https/index.html @@ -30,11 +30,11 @@ 标签: HTTPS - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/index.html b/tag/index.html index f9fa8a65bb..82fe963d79 100644 --- a/tag/index.html +++ b/tag/index.html @@ -30,11 +30,11 @@ 标签 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/init-project/index.html b/tag/init-project/index.html index ad5939eb01..d748284faa 100644 --- a/tag/init-project/index.html +++ b/tag/init-project/index.html @@ -30,11 +30,11 @@ 标签: init project - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/kitchen/index.html b/tag/kitchen/index.html index 40679e0ea2..de68320b92 100644 --- a/tag/kitchen/index.html +++ b/tag/kitchen/index.html @@ -30,11 +30,11 @@ 标签: kitchen - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/langchain/index.html b/tag/langchain/index.html index c5c916b643..fa747af1e9 100644 --- a/tag/langchain/index.html +++ b/tag/langchain/index.html @@ -30,11 +30,11 @@ 标签: langchain - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/language-advanced/index.html b/tag/language-advanced/index.html index 20e8cc9504..15e6d07c44 100644 --- a/tag/language-advanced/index.html +++ b/tag/language-advanced/index.html @@ -30,11 +30,11 @@ 标签: language advanced - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/language-basic/index.html b/tag/language-basic/index.html index 8a4fa5065a..e947a20b8c 100644 --- a/tag/language-basic/index.html +++ b/tag/language-basic/index.html @@ -30,11 +30,11 @@ 标签: language basic - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/mediator-pattern/index.html b/tag/mediator-pattern/index.html index 2690171437..72b3640d3b 100644 --- a/tag/mediator-pattern/index.html +++ b/tag/mediator-pattern/index.html @@ -30,11 +30,11 @@ 标签: mediator-pattern - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/middleware-pattern/index.html b/tag/middleware-pattern/index.html index 94efa3fc1d..cf962f41ae 100644 --- a/tag/middleware-pattern/index.html +++ b/tag/middleware-pattern/index.html @@ -30,11 +30,11 @@ 标签: middleware-pattern - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/mixin-pattern/index.html b/tag/mixin-pattern/index.html new file mode 100644 index 0000000000..3cc791209e --- /dev/null +++ b/tag/mixin-pattern/index.html @@ -0,0 +1,40 @@ + + + + + + + + + + 标签: mixin-pattern + + + + + +
    跳至主要內容
    + + + diff --git a/tag/module-pattern/index.html b/tag/module-pattern/index.html new file mode 100644 index 0000000000..30712e06e6 --- /dev/null +++ b/tag/module-pattern/index.html @@ -0,0 +1,40 @@ + + + + + + + + + + 标签: module-pattern + + + + + +
    跳至主要內容
    + + + diff --git a/tag/module/index.html b/tag/module/index.html index 59bede3d75..667f62d5a7 100644 --- a/tag/module/index.html +++ b/tag/module/index.html @@ -30,11 +30,11 @@ 标签: module - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/mysql/index.html b/tag/mysql/index.html index aa01b61741..e500bc73ea 100644 --- a/tag/mysql/index.html +++ b/tag/mysql/index.html @@ -30,11 +30,11 @@ 标签: mysql - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/network/index.html b/tag/network/index.html index a31f62cad9..48ca7eac91 100644 --- a/tag/network/index.html +++ b/tag/network/index.html @@ -30,11 +30,11 @@ 标签: network - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/new/index.html b/tag/new/index.html index d5e1020291..e29af7076e 100644 --- a/tag/new/index.html +++ b/tag/new/index.html @@ -30,11 +30,11 @@ 标签: new - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/next.js/index.html b/tag/next.js/index.html index 97dacd3924..6698ca06dd 100644 --- a/tag/next.js/index.html +++ b/tag/next.js/index.html @@ -30,11 +30,11 @@ 标签: next.js - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/node/index.html b/tag/node/index.html index 2ab4e37a95..184634a78a 100644 --- a/tag/node/index.html +++ b/tag/node/index.html @@ -30,11 +30,11 @@ 标签: node - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/npm/index.html b/tag/npm/index.html index 89fdb96dc4..36f6bebf90 100644 --- a/tag/npm/index.html +++ b/tag/npm/index.html @@ -30,11 +30,11 @@ 标签: npm - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/object/index.html b/tag/object/index.html index 8ccff5bd35..2f81091a75 100644 --- a/tag/object/index.html +++ b/tag/object/index.html @@ -30,11 +30,11 @@ 标签: Object - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/openai/index.html b/tag/openai/index.html index 21854da3bd..d37a0b5b77 100644 --- a/tag/openai/index.html +++ b/tag/openai/index.html @@ -30,11 +30,11 @@ 标签: openai - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/pages-router/index.html b/tag/pages-router/index.html index 059b4c3570..3c70343108 100644 --- a/tag/pages-router/index.html +++ b/tag/pages-router/index.html @@ -30,11 +30,11 @@ 标签: pages router - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/pnpm/index.html b/tag/pnpm/index.html index ab23fd39c6..069544c2ec 100644 --- a/tag/pnpm/index.html +++ b/tag/pnpm/index.html @@ -30,11 +30,11 @@ 标签: pnpm - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/postcss/index.html b/tag/postcss/index.html index 58017dee57..6a3afd62b1 100644 --- a/tag/postcss/index.html +++ b/tag/postcss/index.html @@ -30,11 +30,11 @@ 标签: postcss - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/pragmatic/index.html b/tag/pragmatic/index.html index dd4552448d..363e929bec 100644 --- a/tag/pragmatic/index.html +++ b/tag/pragmatic/index.html @@ -30,11 +30,11 @@ 标签: pragmatic - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/react-core/index.html b/tag/react-core/index.html index 287044cef8..367304426e 100644 --- a/tag/react-core/index.html +++ b/tag/react-core/index.html @@ -30,11 +30,11 @@ 标签: react core - + -
    跳至主要內容
    - +
    跳至主要內容
    useState

    njr大约 5 分钟reactreact corehooksstate hooks
    + diff --git a/tag/react/index.html b/tag/react/index.html index e4ed64cb21..43ea16af69 100644 --- a/tag/react/index.html +++ b/tag/react/index.html @@ -30,11 +30,11 @@ 标签: React - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/rspack/index.html b/tag/rspack/index.html index bf9cb5c9b2..2f5ec42322 100644 --- a/tag/rspack/index.html +++ b/tag/rspack/index.html @@ -30,11 +30,11 @@ 标签: rspack - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/rss/index.html b/tag/rss/index.html index 50a251efc4..3881075b14 100644 --- a/tag/rss/index.html +++ b/tag/rss/index.html @@ -30,11 +30,11 @@ 标签: rss - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/selector/index.html b/tag/selector/index.html index 758c890f38..6d83620c29 100644 --- a/tag/selector/index.html +++ b/tag/selector/index.html @@ -30,11 +30,11 @@ 标签: selector - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/seo/index.html b/tag/seo/index.html index c54a69c06e..806d1048ce 100644 --- a/tag/seo/index.html +++ b/tag/seo/index.html @@ -30,11 +30,11 @@ 标签: seo - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/sql/index.html b/tag/sql/index.html index 241db7eb9b..c079ee233d 100644 --- a/tag/sql/index.html +++ b/tag/sql/index.html @@ -30,11 +30,11 @@ 标签: sql - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/ssg/index.html b/tag/ssg/index.html index c127a9cae1..8ecc421042 100644 --- a/tag/ssg/index.html +++ b/tag/ssg/index.html @@ -30,11 +30,11 @@ 标签: ssg - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/ssh/index.html b/tag/ssh/index.html index 7acb61cad9..8d45eaeac7 100644 --- a/tag/ssh/index.html +++ b/tag/ssh/index.html @@ -30,11 +30,11 @@ 标签: ssh - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/ssr/index.html b/tag/ssr/index.html index 7f6ed4ab68..29741beec4 100644 --- a/tag/ssr/index.html +++ b/tag/ssr/index.html @@ -30,11 +30,11 @@ 标签: SSR - + -
    跳至主要內容
    Qwik

    njr大约 4 分钟工程化frontendSSR
    - +
    跳至主要內容
    Qwik

    njr大约 4 分钟工程化frontendSSR
    + diff --git a/tag/state-hooks/index.html b/tag/state-hooks/index.html index 5c2756c4b0..ef35894003 100644 --- a/tag/state-hooks/index.html +++ b/tag/state-hooks/index.html @@ -30,11 +30,11 @@ 标签: state hooks - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/styled-system/index.html b/tag/styled-system/index.html index 585bdeb9b4..2d64f20afb 100644 --- a/tag/styled-system/index.html +++ b/tag/styled-system/index.html @@ -30,11 +30,11 @@ 标签: styled system - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/svg/index.html b/tag/svg/index.html index fadabbafbd..204265f277 100644 --- a/tag/svg/index.html +++ b/tag/svg/index.html @@ -30,11 +30,11 @@ 标签: SVG - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/tcp/index.html b/tag/tcp/index.html index 5b0060895d..5e0fe1de5f 100644 --- a/tag/tcp/index.html +++ b/tag/tcp/index.html @@ -30,11 +30,11 @@ 标签: TCP - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/tcpip-\346\250\241\345\236\213/index.html" "b/tag/tcpip-\346\250\241\345\236\213/index.html" index 0e488422cb..bc7197c239 100644 --- "a/tag/tcpip-\346\250\241\345\236\213/index.html" +++ "b/tag/tcpip-\346\250\241\345\236\213/index.html" @@ -30,11 +30,11 @@ 标签: TCP/IP 模型 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/this/index.html b/tag/this/index.html index 90c3adbd6b..47e85582ea 100644 --- a/tag/this/index.html +++ b/tag/this/index.html @@ -30,11 +30,11 @@ 标签: this - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/trick/index.html b/tag/trick/index.html index a6e3ee18af..aff216cc59 100644 --- a/tag/trick/index.html +++ b/tag/trick/index.html @@ -30,11 +30,11 @@ 标签: trick - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/typescript/index.html b/tag/typescript/index.html index f4b2263128..9006715744 100644 --- a/tag/typescript/index.html +++ b/tag/typescript/index.html @@ -30,11 +30,11 @@ 标签: TypeScript - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/udp/index.html b/tag/udp/index.html index 55a06fd424..038716677c 100644 --- a/tag/udp/index.html +++ b/tag/udp/index.html @@ -30,11 +30,11 @@ 标签: UDP - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/v8-\345\274\225\346\223\216/index.html" "b/tag/v8-\345\274\225\346\223\216/index.html" index af44e71bfd..a7b93c1158 100644 --- "a/tag/v8-\345\274\225\346\223\216/index.html" +++ "b/tag/v8-\345\274\225\346\223\216/index.html" @@ -30,11 +30,11 @@ 标签: V8 引擎 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/vanilla/index.html b/tag/vanilla/index.html index 0eef22d8e7..bb46756944 100644 --- a/tag/vanilla/index.html +++ b/tag/vanilla/index.html @@ -30,11 +30,11 @@ 标签: vanilla - + -
    跳至主要內容
    享元模式

    patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
    中介者模式

    patterns大约 2 分钟readingdesign patternvanillamediator-pattern
    中间件模式

    patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
    命令模式

    patterns大约 2 分钟readingdesign patternvanillacommand-pattern
    工厂模式

    patterns大约 2 分钟readingdesign patternvanillafactory-pattern
    介绍

    patterns大约 1 分钟readingdesign patternvanilla
    - +
    跳至主要內容
    混入模式

    patterns大约 3 分钟readingdesign patternvanillamixin-pattern
    模块模式

    patterns小于 1 分钟readingdesign patternvanillamodule-pattern
    享元模式

    patterns大约 5 分钟readingdesign patternvanillaflyweight-pattern
    中介者模式

    patterns大约 2 分钟readingdesign patternvanillamediator-pattern
    中间件模式

    patterns大约 1 分钟readingdesign patternvanillamiddleware-pattern
    命令模式

    patterns大约 2 分钟readingdesign patternvanillacommand-pattern
    工厂模式

    patterns大约 2 分钟readingdesign patternvanillafactory-pattern
    介绍

    patterns大约 1 分钟readingdesign patternvanilla
    + diff --git a/tag/vite/index.html b/tag/vite/index.html index 9e663fd814..a670c53a03 100644 --- a/tag/vite/index.html +++ b/tag/vite/index.html @@ -30,11 +30,11 @@ 标签: Vite - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/vscode/index.html b/tag/vscode/index.html index c5dcffbc52..2dd58c601c 100644 --- a/tag/vscode/index.html +++ b/tag/vscode/index.html @@ -30,11 +30,11 @@ 标签: vscode - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/vuepress/index.html b/tag/vuepress/index.html index 60805a3fe6..a3a42a002c 100644 --- a/tag/vuepress/index.html +++ b/tag/vuepress/index.html @@ -30,11 +30,11 @@ 标签: vuepress - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/vuex/index.html b/tag/vuex/index.html index bd22100ac8..78cd763b72 100644 --- a/tag/vuex/index.html +++ b/tag/vuex/index.html @@ -30,11 +30,11 @@ 标签: Vuex - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/web-worker/index.html b/tag/web-worker/index.html index b6edd34509..3dd8e5952f 100644 --- a/tag/web-worker/index.html +++ b/tag/web-worker/index.html @@ -30,11 +30,11 @@ 标签: Web Worker - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/webpack/index.html b/tag/webpack/index.html index 483ed2a9b0..cb5692b71b 100644 --- a/tag/webpack/index.html +++ b/tag/webpack/index.html @@ -30,11 +30,11 @@ 标签: webpack - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/yarn/index.html b/tag/yarn/index.html index 2ddfc105c4..13e408ca9c 100644 --- a/tag/yarn/index.html +++ b/tag/yarn/index.html @@ -30,11 +30,11 @@ 标签: yarn - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/yeoman/index.html b/tag/yeoman/index.html index 7c239df3e0..b4d404a005 100644 --- a/tag/yeoman/index.html +++ b/tag/yeoman/index.html @@ -30,11 +30,11 @@ 标签: yeoman - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/tag/zsh/index.html b/tag/zsh/index.html index e2563817f7..1c458877c3 100644 --- a/tag/zsh/index.html +++ b/tag/zsh/index.html @@ -30,11 +30,11 @@ 标签: zsh - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\344\272\213\344\273\266\345\276\252\347\216\257/index.html" "b/tag/\344\272\213\344\273\266\345\276\252\347\216\257/index.html" index 4582d116c2..be2f120525 100644 --- "a/tag/\344\272\213\344\273\266\345\276\252\347\216\257/index.html" +++ "b/tag/\344\272\213\344\273\266\345\276\252\347\216\257/index.html" @@ -30,11 +30,11 @@ 标签: 事件循环 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\344\272\214\345\210\206\346\237\245\346\211\276/index.html" "b/tag/\344\272\214\345\210\206\346\237\245\346\211\276/index.html" index 059d2701b4..827db38d07 100644 --- "a/tag/\344\272\214\345\210\206\346\237\245\346\211\276/index.html" +++ "b/tag/\344\272\214\345\210\206\346\237\245\346\211\276/index.html" @@ -30,11 +30,11 @@ 标签: 二分查找 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/index.html" "b/tag/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/index.html" index 9b4c6d34f1..92d02ee363 100644 --- "a/tag/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/index.html" +++ "b/tag/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/index.html" @@ -30,11 +30,11 @@ 标签: 二叉搜索树 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\344\272\214\345\217\211\346\240\221/index.html" "b/tag/\344\272\214\345\217\211\346\240\221/index.html" index bc3f220e0d..5a0e484205 100644 --- "a/tag/\344\272\214\345\217\211\346\240\221/index.html" +++ "b/tag/\344\272\214\345\217\211\346\240\221/index.html" @@ -30,11 +30,11 @@ 标签: 二叉树 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\344\273\243\347\240\201\350\247\204\350\214\203/index.html" "b/tag/\344\273\243\347\240\201\350\247\204\350\214\203/index.html" index 2b7535de63..c05798f51e 100644 --- "a/tag/\344\273\243\347\240\201\350\247\204\350\214\203/index.html" +++ "b/tag/\344\273\243\347\240\201\350\247\204\350\214\203/index.html" @@ -30,11 +30,11 @@ 标签: 代码规范 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\205\263\347\263\273\346\225\260\346\215\256\345\272\223\346\250\241\345\236\213/index.html" "b/tag/\345\205\263\347\263\273\346\225\260\346\215\256\345\272\223\346\250\241\345\236\213/index.html" index 8748102b14..c8bcb32b8a 100644 --- "a/tag/\345\205\263\347\263\273\346\225\260\346\215\256\345\272\223\346\250\241\345\236\213/index.html" +++ "b/tag/\345\205\263\347\263\273\346\225\260\346\215\256\345\272\223\346\250\241\345\236\213/index.html" @@ -30,11 +30,11 @@ 标签: 关系数据库模型 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\205\274\345\256\271/index.html" "b/tag/\345\205\274\345\256\271/index.html" index 95d56bac2e..14e94f53e7 100644 --- "a/tag/\345\205\274\345\256\271/index.html" +++ "b/tag/\345\205\274\345\256\271/index.html" @@ -30,11 +30,11 @@ 标签: 兼容 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\207\275\346\225\260/index.html" "b/tag/\345\207\275\346\225\260/index.html" index 2c24052173..5b9b5bb905 100644 --- "a/tag/\345\207\275\346\225\260/index.html" +++ "b/tag/\345\207\275\346\225\260/index.html" @@ -30,11 +30,11 @@ 标签: 函数 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\211\215\347\253\257\345\255\230\345\202\250/index.html" "b/tag/\345\211\215\347\253\257\345\255\230\345\202\250/index.html" index 669ab17667..8ff7e669ae 100644 --- "a/tag/\345\211\215\347\253\257\345\255\230\345\202\250/index.html" +++ "b/tag/\345\211\215\347\253\257\345\255\230\345\202\250/index.html" @@ -30,11 +30,11 @@ 标签: 前端存储 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\212\250\346\200\201\350\247\204\345\210\222/index.html" "b/tag/\345\212\250\346\200\201\350\247\204\345\210\222/index.html" index f9f224634a..4dc158f881 100644 --- "a/tag/\345\212\250\346\200\201\350\247\204\345\210\222/index.html" +++ "b/tag/\345\212\250\346\200\201\350\247\204\345\210\222/index.html" @@ -30,11 +30,11 @@ 标签: 动态规划 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\217\214\346\214\207\351\222\210/index.html" "b/tag/\345\217\214\346\214\207\351\222\210/index.html" index 08a35a36b4..caab2a685f 100644 --- "a/tag/\345\217\214\346\214\207\351\222\210/index.html" +++ "b/tag/\345\217\214\346\214\207\351\222\210/index.html" @@ -30,11 +30,11 @@ 标签: 双指针 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\233\276\347\211\207\346\211\271\346\263\250/index.html" "b/tag/\345\233\276\347\211\207\346\211\271\346\263\250/index.html" index 3cb0a05bce..92f309f975 100644 --- "a/tag/\345\233\276\347\211\207\346\211\271\346\263\250/index.html" +++ "b/tag/\345\233\276\347\211\207\346\211\271\346\263\250/index.html" @@ -30,11 +30,11 @@ 标签: 图片批注 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\236\203\345\234\276\345\233\236\346\224\266/index.html" "b/tag/\345\236\203\345\234\276\345\233\236\346\224\266/index.html" index 43343386e4..c421bac8c7 100644 --- "a/tag/\345\236\203\345\234\276\345\233\236\346\224\266/index.html" +++ "b/tag/\345\236\203\345\234\276\345\233\236\346\224\266/index.html" @@ -30,11 +30,11 @@ 标签: 垃圾回收 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\267\245\347\250\213\345\214\226/index.html" "b/tag/\345\267\245\347\250\213\345\214\226/index.html" index ba5109b6f6..2fdaeacf2a 100644 --- "a/tag/\345\267\245\347\250\213\345\214\226/index.html" +++ "b/tag/\345\267\245\347\250\213\345\214\226/index.html" @@ -30,11 +30,11 @@ 标签: 工程化 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\270\203\345\261\200/index.html" "b/tag/\345\270\203\345\261\200/index.html" index 38d50d99b8..523767159c 100644 --- "a/tag/\345\270\203\345\261\200/index.html" +++ "b/tag/\345\270\203\345\261\200/index.html" @@ -30,11 +30,11 @@ 标签: 布局 - + -
    跳至主要內容
    浮动

    njr大约 4 分钟CSS布局浮动frontendbasic-knowledge
    居中

    njr大约 1 分钟CSS布局frontendbasic-knowledge
    定位

    njr大约 4 分钟CSS布局frontendbasic-knowledge
    Flex 布局

    njr大约 7 分钟CSS布局弹性盒frontendbasic-knowledge
    - +
    跳至主要內容
    浮动

    njr大约 4 分钟CSS布局浮动frontendbasic-knowledge
    居中

    njr大约 1 分钟CSS布局frontendbasic-knowledge
    定位

    njr大约 4 分钟CSS布局frontendbasic-knowledge
    Flex 布局

    njr大约 7 分钟CSS布局弹性盒frontendbasic-knowledge
    + diff --git "a/tag/\345\274\271\346\200\247\347\233\222/index.html" "b/tag/\345\274\271\346\200\247\347\233\222/index.html" index 13e2b1e6b9..c3180ab922 100644 --- "a/tag/\345\274\271\346\200\247\347\233\222/index.html" +++ "b/tag/\345\274\271\346\200\247\347\233\222/index.html" @@ -30,11 +30,11 @@ 标签: 弹性盒 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\345\276\241\350\206\263\346\210\277/index.html" "b/tag/\345\276\241\350\206\263\346\210\277/index.html" index 59307bd37c..313d1c0dcc 100644 --- "a/tag/\345\276\241\350\206\263\346\210\277/index.html" +++ "b/tag/\345\276\241\350\206\263\346\210\277/index.html" @@ -30,11 +30,11 @@ 标签: 御膳房 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\211\213\345\206\231\344\273\243\347\240\201/index.html" "b/tag/\346\211\213\345\206\231\344\273\243\347\240\201/index.html" index 92f77fbcbf..309f5b7508 100644 --- "a/tag/\346\211\213\345\206\231\344\273\243\347\240\201/index.html" +++ "b/tag/\346\211\213\345\206\231\344\273\243\347\240\201/index.html" @@ -30,11 +30,11 @@ 标签: 手写代码 - + -
    跳至主要內容
    AJAX

    njr大约 2 分钟JavaScript网络请求手写代码
    - +
    跳至主要內容
    AJAX

    njr大约 2 分钟JavaScript网络请求手写代码
    + diff --git "a/tag/\346\213\226\346\213\275\346\216\222\345\272\217/index.html" "b/tag/\346\213\226\346\213\275\346\216\222\345\272\217/index.html" index f3aac8c8ce..d5d6a09289 100644 --- "a/tag/\346\213\226\346\213\275\346\216\222\345\272\217/index.html" +++ "b/tag/\346\213\226\346\213\275\346\216\222\345\272\217/index.html" @@ -30,11 +30,11 @@ 标签: 拖拽排序 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\220\206\350\256\272/index.html" "b/tag/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\220\206\350\256\272/index.html" index ca30768326..ed1bc6324e 100644 --- "a/tag/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\220\206\350\256\272/index.html" +++ "b/tag/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\220\206\350\256\272/index.html" @@ -30,11 +30,11 @@ 标签: 数据库设计理论 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\225\260\346\215\256\347\261\273\345\236\213/index.html" "b/tag/\346\225\260\346\215\256\347\261\273\345\236\213/index.html" index 7198efc9a8..ccd9b968b4 100644 --- "a/tag/\346\225\260\346\215\256\347\261\273\345\236\213/index.html" +++ "b/tag/\346\225\260\346\215\256\347\261\273\345\236\213/index.html" @@ -30,11 +30,11 @@ 标签: 数据类型 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\225\260\347\273\204/index.html" "b/tag/\346\225\260\347\273\204/index.html" index ecbe7308a9..072be7cbd0 100644 --- "a/tag/\346\225\260\347\273\204/index.html" +++ "b/tag/\346\225\260\347\273\204/index.html" @@ -30,11 +30,11 @@ 标签: 数组 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\226\207\344\273\266\344\270\212\344\274\240/index.html" "b/tag/\346\226\207\344\273\266\344\270\212\344\274\240/index.html" index bc5b8ead7b..e1f85aef37 100644 --- "a/tag/\346\226\207\344\273\266\344\270\212\344\274\240/index.html" +++ "b/tag/\346\226\207\344\273\266\344\270\212\344\274\240/index.html" @@ -30,11 +30,11 @@ 标签: 文件上传 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\250\241\345\235\227\345\214\226/index.html" "b/tag/\346\250\241\345\235\227\345\214\226/index.html" index fa96da8f34..12ffcdcd91 100644 --- "a/tag/\346\250\241\345\235\227\345\214\226/index.html" +++ "b/tag/\346\250\241\345\235\227\345\214\226/index.html" @@ -30,11 +30,11 @@ 标签: 模块化 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\265\205\346\213\267\350\264\235/index.html" "b/tag/\346\265\205\346\213\267\350\264\235/index.html" index d893b8c94d..c95d8bb151 100644 --- "a/tag/\346\265\205\346\213\267\350\264\235/index.html" +++ "b/tag/\346\265\205\346\213\267\350\264\235/index.html" @@ -30,11 +30,11 @@ 标签: 浅拷贝 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\265\217\350\247\210\345\231\250\346\270\262\346\237\223/index.html" "b/tag/\346\265\217\350\247\210\345\231\250\346\270\262\346\237\223/index.html" index 0dc40728d8..636627b93f 100644 --- "a/tag/\346\265\217\350\247\210\345\231\250\346\270\262\346\237\223/index.html" +++ "b/tag/\346\265\217\350\247\210\345\231\250\346\270\262\346\237\223/index.html" @@ -30,11 +30,11 @@ 标签: 浏览器渲染 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\265\256\345\212\250/index.html" "b/tag/\346\265\256\345\212\250/index.html" index 2f6a97b75a..b50a6c18a7 100644 --- "a/tag/\346\265\256\345\212\250/index.html" +++ "b/tag/\346\265\256\345\212\250/index.html" @@ -30,11 +30,11 @@ 标签: 浮动 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\267\261\345\205\245\347\273\204\344\273\266/index.html" "b/tag/\346\267\261\345\205\245\347\273\204\344\273\266/index.html" index de19c190bb..f649a01abb 100644 --- "a/tag/\346\267\261\345\205\245\347\273\204\344\273\266/index.html" +++ "b/tag/\346\267\261\345\205\245\347\273\204\344\273\266/index.html" @@ -30,11 +30,11 @@ 标签: 深入组件 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\267\261\346\213\267\350\264\235/index.html" "b/tag/\346\267\261\346\213\267\350\264\235/index.html" index 42373ca313..14ea83de5d 100644 --- "a/tag/\346\267\261\346\213\267\350\264\235/index.html" +++ "b/tag/\346\267\261\346\213\267\350\264\235/index.html" @@ -30,11 +30,11 @@ 标签: 深拷贝 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\346\272\220\347\240\201\351\230\205\350\257\273/index.html" "b/tag/\346\272\220\347\240\201\351\230\205\350\257\273/index.html" index 8d94babf5a..4380ca24f5 100644 --- "a/tag/\346\272\220\347\240\201\351\230\205\350\257\273/index.html" +++ "b/tag/\346\272\220\347\240\201\351\230\205\350\257\273/index.html" @@ -30,11 +30,11 @@ 标签: 源码阅读 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\347\247\273\345\212\250\347\253\257\351\200\202\351\205\215/index.html" "b/tag/\347\247\273\345\212\250\347\253\257\351\200\202\351\205\215/index.html" index f69d685752..60630beb10 100644 --- "a/tag/\347\247\273\345\212\250\347\253\257\351\200\202\351\205\215/index.html" +++ "b/tag/\347\247\273\345\212\250\347\253\257\351\200\202\351\205\215/index.html" @@ -30,11 +30,11 @@ 标签: 移动端适配 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\347\273\204\344\273\266\345\272\223/index.html" "b/tag/\347\273\204\344\273\266\345\272\223/index.html" index dfc4dfb5d9..37ca05ca48 100644 --- "a/tag/\347\273\204\344\273\266\345\272\223/index.html" +++ "b/tag/\347\273\204\344\273\266\345\272\223/index.html" @@ -30,11 +30,11 @@ 标签: 组件库 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\347\273\204\344\273\266\351\200\232\344\277\241/index.html" "b/tag/\347\273\204\344\273\266\351\200\232\344\277\241/index.html" index 7503d70cc1..136524934f 100644 --- "a/tag/\347\273\204\344\273\266\351\200\232\344\277\241/index.html" +++ "b/tag/\347\273\204\344\273\266\351\200\232\344\277\241/index.html" @@ -30,11 +30,11 @@ 标签: 组件通信 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\347\273\204\345\220\210\345\274\217-api/index.html" "b/tag/\347\273\204\345\220\210\345\274\217-api/index.html" index 2d8bdd5f23..f0d454a96d 100644 --- "a/tag/\347\273\204\345\220\210\345\274\217-api/index.html" +++ "b/tag/\347\273\204\345\220\210\345\274\217-api/index.html" @@ -30,11 +30,11 @@ 标签: 组合式 API - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\347\275\221\347\273\234\350\257\267\346\261\202/index.html" "b/tag/\347\275\221\347\273\234\350\257\267\346\261\202/index.html" index 143531fcf9..217129f315 100644 --- "a/tag/\347\275\221\347\273\234\350\257\267\346\261\202/index.html" +++ "b/tag/\347\275\221\347\273\234\350\257\267\346\261\202/index.html" @@ -30,11 +30,11 @@ 标签: 网络请求 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\351\223\276\350\241\250/index.html" "b/tag/\351\223\276\350\241\250/index.html" index cff686a874..36168f6801 100644 --- "a/tag/\351\223\276\350\241\250/index.html" +++ "b/tag/\351\223\276\350\241\250/index.html" @@ -30,11 +30,11 @@ 标签: 链表 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\351\235\242\345\220\221\345\257\271\350\261\241/index.html" "b/tag/\351\235\242\345\220\221\345\257\271\350\261\241/index.html" index 5aff067113..8c3d0130fb 100644 --- "a/tag/\351\235\242\345\220\221\345\257\271\350\261\241/index.html" +++ "b/tag/\351\235\242\345\220\221\345\257\271\350\261\241/index.html" @@ -30,11 +30,11 @@ 标签: 面向对象 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\351\241\271\347\233\256/index.html" "b/tag/\351\241\271\347\233\256/index.html" index 127cc9e3d9..ce14b0157d 100644 --- "a/tag/\351\241\271\347\233\256/index.html" +++ "b/tag/\351\241\271\347\233\256/index.html" @@ -30,11 +30,11 @@ 标签: 项目 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git "a/tag/\351\241\271\347\233\256\346\211\223\345\214\205/index.html" "b/tag/\351\241\271\347\233\256\346\211\223\345\214\205/index.html" index 6680d6ed6c..9e05f55d11 100644 --- "a/tag/\351\241\271\347\233\256\346\211\223\345\214\205/index.html" +++ "b/tag/\351\241\271\347\233\256\346\211\223\345\214\205/index.html" @@ -30,11 +30,11 @@ 标签: 项目打包 - + -
    跳至主要內容
    Rspack

    njr大约 5 分钟工程化项目打包rspack
    - +
    跳至主要內容
    Rspack

    njr大约 5 分钟工程化项目打包rspack
    + diff --git "a/tag/\351\241\271\347\233\256\351\203\250\347\275\262/index.html" "b/tag/\351\241\271\347\233\256\351\203\250\347\275\262/index.html" index 0fa3ea95d7..e63261d216 100644 --- "a/tag/\351\241\271\347\233\256\351\203\250\347\275\262/index.html" +++ "b/tag/\351\241\271\347\233\256\351\203\250\347\275\262/index.html" @@ -30,11 +30,11 @@ 标签: 项目部署 - + -
    跳至主要內容
    - +
    跳至主要內容
    + diff --git a/timeline/index.html b/timeline/index.html index 9cbaed454c..41e684f641 100644 --- a/timeline/index.html +++ b/timeline/index.html @@ -30,11 +30,11 @@ 时间轴 - + -
    跳至主要內容
    - +
    跳至主要內容
    +