From 75a1aaf291ee01fa9713438562b44823585e206d Mon Sep 17 00:00:00 2001 From: ihengshuai Date: Fri, 26 Jan 2024 05:35:12 +0000 Subject: [PATCH] update page --- 404.html | 53 + CNAME | 1 + README.md | 76 ++ article/2019/bind-call-apply.html | 114 ++ article/2019/css-center.html | 208 +++ article/2019/js-copy.html | 187 +++ article/2019/js-type-transfer.html | 230 ++++ article/2019/ktv-system.html | 491 +++++++ article/2019/mysql-guide.html | 317 +++++ article/2019/nvm-guide.html | 69 + article/2019/promise.html | 229 ++++ article/2019/what-bfc.html | 206 +++ article/2020/domparser-xml.html | 59 + article/2020/optimize-web-server.html | 175 +++ article/2020/regexp-guide.html | 222 ++++ article/2020/vscode-shortcut.html | 186 +++ article/2020/web-cache.html | 56 + article/2020/webpack-guide.html | 523 ++++++++ article/2021/flex-layout.html | 56 + article/2021/js-pattern.html | 477 +++++++ article/2021/performance-tools.html | 58 + article/2021/pwa-app.html | 133 ++ article/2021/ts-decorator.html | 380 ++++++ article/2021/vue-core-process.html | 309 +++++ article/2021/vue-img-lazyload.html | 410 ++++++ article/2022/emoji-markup.html | 56 + article/base.html | 56 + assets/app.hlbKLLW0.js | 7 + ...rticle_2019_bind-call-apply.md.EzG0_8Ly.js | 59 + ...e_2019_bind-call-apply.md.EzG0_8Ly.lean.js | 1 + assets/article_2019_css-center.md.9vJJ7-ow.js | 153 +++ ...rticle_2019_css-center.md.9vJJ7-ow.lean.js | 1 + assets/article_2019_js-copy.md.hrnH-GZy.js | 132 ++ .../article_2019_js-copy.md.hrnH-GZy.lean.js | 1 + ...ticle_2019_js-type-transfer.md.UKEkeSx-.js | 175 +++ ..._2019_js-type-transfer.md.UKEkeSx-.lean.js | 1 + assets/article_2019_ktv-system.md.ZlJWiM1B.js | 436 +++++++ ...rticle_2019_ktv-system.md.ZlJWiM1B.lean.js | 1 + .../article_2019_mysql-guide.md.3wP7Sagt.js | 262 ++++ ...ticle_2019_mysql-guide.md.3wP7Sagt.lean.js | 1 + assets/article_2019_nvm-guide.md.jatQbzh1.js | 14 + ...article_2019_nvm-guide.md.jatQbzh1.lean.js | 1 + assets/article_2019_promise.md.5sNxqCYP.js | 174 +++ .../article_2019_promise.md.5sNxqCYP.lean.js | 1 + assets/article_2019_what-bfc.md.tIBqKLqT.js | 151 +++ .../article_2019_what-bfc.md.tIBqKLqT.lean.js | 1 + .../article_2020_domparser-xml.md.uJdSS0gw.js | 4 + ...cle_2020_domparser-xml.md.uJdSS0gw.lean.js | 1 + ...le_2020_optimize-web-server.md.b9Z54Q9U.js | 120 ++ ...20_optimize-web-server.md.b9Z54Q9U.lean.js | 1 + .../article_2020_regexp-guide.md.1Tud3eyA.js | 167 +++ ...icle_2020_regexp-guide.md.1Tud3eyA.lean.js | 1 + ...rticle_2020_vscode-shortcut.md.kzdDBCVW.js | 131 ++ ...e_2020_vscode-shortcut.md.kzdDBCVW.lean.js | 1 + assets/article_2020_web-cache.md.uI4_cM9P.js | 1 + ...article_2020_web-cache.md.uI4_cM9P.lean.js | 1 + .../article_2020_webpack-guide.md.zBMh8gpK.js | 468 +++++++ ...cle_2020_webpack-guide.md.zBMh8gpK.lean.js | 1 + .../article_2021_flex-layout.md.evpHdPM-.js | 1 + ...ticle_2021_flex-layout.md.evpHdPM-.lean.js | 1 + assets/article_2021_js-pattern.md.Qzh4S7uy.js | 422 ++++++ ...rticle_2021_js-pattern.md.Qzh4S7uy.lean.js | 1 + ...icle_2021_performance-tools.md.G4md1C7p.js | 3 + ...2021_performance-tools.md.G4md1C7p.lean.js | 1 + assets/article_2021_pwa-app.md.edqGSum2.js | 78 ++ .../article_2021_pwa-app.md.edqGSum2.lean.js | 1 + .../article_2021_ts-decorator.md.XWu9IBvE.js | 325 +++++ ...icle_2021_ts-decorator.md.XWu9IBvE.lean.js | 1 + ...ticle_2021_vue-core-process.md.ORz11p1q.js | 254 ++++ ..._2021_vue-core-process.md.ORz11p1q.lean.js | 1 + ...ticle_2021_vue-img-lazyload.md.tKCHuRr8.js | 355 +++++ ..._2021_vue-img-lazyload.md.tKCHuRr8.lean.js | 1 + .../article_2022_emoji-markup.md.wvCnl86t.js | 1 + ...icle_2022_emoji-markup.md.wvCnl86t.lean.js | 1 + assets/article_base.md.BJwv0RtE.js | 1 + assets/article_base.md.BJwv0RtE.lean.js | 1 + .../chunks/@localSearchIndexroot.5hxXnWZ2.js | 1 + assets/chunks/VPLocalSearchBox.D-gwIAzV.js | 13 + assets/chunks/framework.SV1ROkXV.js | 1 + assets/chunks/giscus-a53917f0.pI8Mtuqg.js | 72 + assets/chunks/theme.qcSYzAJN.js | 7 + ...ontend_babel_babel-analysis.md.Z0deENoo.js | 1 + ...d_babel_babel-analysis.md.Z0deENoo.lean.js | 1 + ...nd_babel_babel-plugin-guide.md.vF1b_R9m.js | 1 + ...bel_babel-plugin-guide.md.vF1b_R9m.lean.js | 1 + assets/frontend_babel_base.md.t0-aK7-4.js | 6 + .../frontend_babel_base.md.t0-aK7-4.lean.js | 1 + assets/frontend_base.md.36vRxAi8.js | 1 + assets/frontend_base.md.36vRxAi8.lean.js | 1 + assets/frontend_browser_base.md.v_UdQTA3.js | 1 + .../frontend_browser_base.md.v_UdQTA3.lean.js | 1 + ...frontend_building-tool_base.md.nIZ1pU9W.js | 1 + ...end_building-tool_base.md.nIZ1pU9W.lean.js | 1 + assets/frontend_canvas_base.md.u6xHSP1j.js | 68 + .../frontend_canvas_base.md.u6xHSP1j.lean.js | 1 + ...ontend_canvas_magic-effects.md.Fkxa5tC4.js | 1 + ...d_canvas_magic-effects.md.Fkxa5tC4.lean.js | 1 + assets/frontend_cli_index.md.qTzih6d4.js | 1 + assets/frontend_cli_index.md.qTzih6d4.lean.js | 1 + assets/frontend_compiler_index.md.gB4W-5KQ.js | 1 + ...rontend_compiler_index.md.gB4W-5KQ.lean.js | 1 + ...mputer-network_arp-protocol.md.oAtbXMJy.js | 8 + ...r-network_arp-protocol.md.oAtbXMJy.lean.js | 1 + ...ntend_computer-network_base.md.1bZNLudq.js | 1 + ..._computer-network_base.md.1bZNLudq.lean.js | 1 + ...puter-network_http-protocol.md.fxY3d9SH.js | 306 +++++ ...-network_http-protocol.md.fxY3d9SH.lean.js | 1 + ...omputer-network_ip-protocol.md.ZfcsangK.js | 4 + ...er-network_ip-protocol.md.ZfcsangK.lean.js | 1 + ...mputer-network_tcp-protocol.md.cEUhzRKM.js | 44 + ...r-network_tcp-protocol.md.cEUhzRKM.lean.js | 1 + .../frontend_debug-skill_base.md.9fX9BAHb.js | 154 +++ ...ntend_debug-skill_base.md.9fX9BAHb.lean.js | 1 + ...rontend_debug-skill_charles.md.cdOszKr5.js | 1 + ...nd_debug-skill_charles.md.cdOszKr5.lean.js | 1 + ...frontend_debug-skill_chrome.md.nkCU8h5d.js | 1 + ...end_debug-skill_chrome.md.nkCU8h5d.lean.js | 1 + ...rontend_debug-skill_fiddler.md.07eSQgh_.js | 24 + ...nd_debug-skill_fiddler.md.07eSQgh_.lean.js | 1 + assets/frontend_debug-skill_h5.md.GWeYJzVC.js | 1 + ...rontend_debug-skill_h5.md.GWeYJzVC.lean.js | 1 + ...frontend_debug-skill_vscode.md.s-HeTMf3.js | 1 + ...end_debug-skill_vscode.md.s-HeTMf3.lean.js | 1 + ...ntend_debug-skill_wireshark.md.s-dRrpN9.js | 40 + ..._debug-skill_wireshark.md.s-dRrpN9.lean.js | 1 + .../frontend_desktop-app_index.md.efUgh7UD.js | 1 + ...tend_desktop-app_index.md.efUgh7UD.lean.js | 1 + assets/frontend_editor_index.md._6kkOtxM.js | 17 + .../frontend_editor_index.md._6kkOtxM.lean.js | 1 + assets/frontend_flutter_base.md.9KY5vMgx.js | 1 + .../frontend_flutter_base.md.9KY5vMgx.lean.js | 1 + .../frontend_hybrid-app_base.md.hBB-XojM.js | 1 + ...ontend_hybrid-app_base.md.hBB-XojM.lean.js | 1 + assets/frontend_js_async.md.JY11OOTH.js | 4 + assets/frontend_js_async.md.JY11OOTH.lean.js | 1 + assets/frontend_js_audio.md.bjTod7Ut.js | 1 + assets/frontend_js_audio.md.bjTod7Ut.lean.js | 1 + assets/frontend_js_base.md.uTBw_pBH.js | 1 + assets/frontend_js_base.md.uTBw_pBH.lean.js | 1 + assets/frontend_js_binary.md.kGIZY9pD.js | 244 ++++ assets/frontend_js_binary.md.kGIZY9pD.lean.js | 1 + assets/frontend_js_eventloop.md.2QrpoMAr.js | 92 ++ .../frontend_js_eventloop.md.2QrpoMAr.lean.js | 1 + ...tend_js_implicit-conversion.md.s3K7bck7.js | 175 +++ ...js_implicit-conversion.md.s3K7bck7.lean.js | 1 + assets/frontend_js_js-gc.md.AunbcRGq.js | 1 + assets/frontend_js_js-gc.md.AunbcRGq.lean.js | 1 + assets/frontend_js_meta-coding.md.SJjED1Qn.js | 1 + ...rontend_js_meta-coding.md.SJjED1Qn.lean.js | 1 + .../frontend_js_proto-inherit.md.I_l70cVG.js | 326 +++++ ...ntend_js_proto-inherit.md.I_l70cVG.lean.js | 1 + .../frontend_js_scope-closure.md.fqZFaNHm.js | 82 ++ ...ntend_js_scope-closure.md.fqZFaNHm.lean.js | 1 + assets/frontend_lowcoding_base.md.BKDSIX3v.js | 1 + ...rontend_lowcoding_base.md.BKDSIX3v.lean.js | 1 + ...rontend_micro-frontend_base.md.50Wy2Q-k.js | 1 + ...nd_micro-frontend_base.md.50Wy2Q-k.lean.js | 1 + ...rontend_micro-program_index.md.xlVMmi6M.js | 1 + ...nd_micro-program_index.md.xlVMmi6M.lean.js | 1 + assets/frontend_monitor_base.md.XPdYn5-o.js | 1 + .../frontend_monitor_base.md.XPdYn5-o.lean.js | 1 + assets/frontend_nestjs_base.md.J1ZEEYhI.js | 1098 ++++++++++++++++ .../frontend_nestjs_base.md.J1ZEEYhI.lean.js | 1 + assets/frontend_nestjs_mvc.md.Z5ZKRS9C.js | 172 +++ .../frontend_nestjs_mvc.md.Z5ZKRS9C.lean.js | 1 + assets/frontend_nestjs_swagger.md.y4EL9kxL.js | 94 ++ ...rontend_nestjs_swagger.md.y4EL9kxL.lean.js | 1 + assets/frontend_nestjs_useful.md.qejIwuqb.js | 196 +++ ...frontend_nestjs_useful.md.qejIwuqb.lean.js | 1 + assets/frontend_nginx_base.md.uaI9zQ4K.js | 637 +++++++++ .../frontend_nginx_base.md.uaI9zQ4K.lean.js | 1 + assets/frontend_node-bff_index.md.hRxjNnOC.js | 1 + ...rontend_node-bff_index.md.hRxjNnOC.lean.js | 1 + ...rontend_node-optimize_index.md.f6NvNEj-.js | 1 + ...nd_node-optimize_index.md.f6NvNEj-.lean.js | 1 + assets/frontend_node_base.md.XlnRBo2L.js | 1 + assets/frontend_node_base.md.XlnRBo2L.lean.js | 1 + .../frontend_node_node-debug.md.PY_CCMV9.js | 1 + ...ontend_node_node-debug.md.PY_CCMV9.lean.js | 1 + ...rontend_node_node-framework.md.IA789WKd.js | 1 + ...nd_node_node-framework.md.IA789WKd.lean.js | 1 + .../frontend_node_node-measure.md.K9kMWbHF.js | 1 + ...tend_node_node-measure.md.K9kMWbHF.lean.js | 1 + .../frontend_node_node-process.md.nI0gQQIR.js | 1 + ...tend_node_node-process.md.nI0gQQIR.lean.js | 1 + assets/frontend_node_node-web.md.8gBO0zUa.js | 1 + ...frontend_node_node-web.md.8gBO0zUa.lean.js | 1 + assets/frontend_npm_index.md.zxaDPdL6.js | 1 + assets/frontend_npm_index.md.zxaDPdL6.lean.js | 1 + assets/frontend_pattern_base.md.ESTX4J2k.js | 422 ++++++ .../frontend_pattern_base.md.ESTX4J2k.lean.js | 1 + .../frontend_performance_base.md.4_74TDRU.js | 1 + ...ntend_performance_base.md.4_74TDRU.lean.js | 1 + ...tend_performance_cache-perf.md.ztt0MTqt.js | 1 + ...performance_cache-perf.md.ztt0MTqt.lean.js | 1 + .../frontend_performance_cache.md.DWS86kiQ.js | 1 + ...tend_performance_cache.md.DWS86kiQ.lean.js | 1 + ...nd_performance_chunk-upload.md.SxJaw511.js | 344 +++++ ...rformance_chunk-upload.md.SxJaw511.lean.js | 1 + ...ntend_performance_load-perf.md.YgBKXjky.js | 1 + ..._performance_load-perf.md.YgBKXjky.lean.js | 1 + ...nd_performance_network-perf.md.dbc1c8R_.js | 1 + ...rformance_network-perf.md.dbc1c8R_.lean.js | 1 + ...tend_performance_node-score.md.D9AUg7bg.js | 1 + ...performance_node-score.md.D9AUg7bg.lean.js | 1 + ...end_performance_performance.md.o6_aDciN.js | 1 + ...erformance_performance.md.o6_aDciN.lean.js | 1 + ..._performance_range-download.md.9tg7xUgK.js | 1 + ...ormance_range-download.md.9tg7xUgK.lean.js | 1 + ...end_performance_secure-perf.md.xaV7lDmb.js | 1 + ...erformance_secure-perf.md.xaV7lDmb.lean.js | 1 + .../frontend_performance_seo.md.QeValPBK.js | 1 + ...ontend_performance_seo.md.QeValPBK.lean.js | 1 + ...erformance_virtual-scroll-1.md.zLnkOlkp.js | 1 + ...mance_virtual-scroll-1.md.zLnkOlkp.lean.js | 1 + ...erformance_virtual-scroll-2.md.Pm3KlSap.js | 1 + ...mance_virtual-scroll-2.md.Pm3KlSap.lean.js | 1 + ...ntend_performance_web-score.md.1Mfy9rMi.js | 1 + ..._performance_web-score.md.1Mfy9rMi.lean.js | 1 + ...nd_project-integration_base.md.XekYSkMF.js | 1 + ...oject-integration_base.md.XekYSkMF.lean.js | 1 + ...ject-integration_build-tool.md.3LVzvGhj.js | 4 + ...integration_build-tool.md.3LVzvGhj.lean.js | 1 + ...t-integration_choose-editor.md.VGwstEOo.js | 1 + ...egration_choose-editor.md.VGwstEOo.lean.js | 1 + ...ect-integration_ci-pipeline.md.-exRgXJ0.js | 1 + ...ntegration_ci-pipeline.md.-exRgXJ0.lean.js | 1 + ...-integration_debugger-skill.md.Zl33JS1r.js | 1 + ...gration_debugger-skill.md.Zl33JS1r.lean.js | 1 + ...ration_deploy-specification.md.c1zXEw1q.js | 1 + ...n_deploy-specification.md.c1zXEw1q.lean.js | 1 + ...oject-integration_framework.md.E07YI-v5.js | 1 + ...-integration_framework.md.E07YI-v5.lean.js | 1 + ...ject-integration_git-commit.md.UP0mr78M.js | 199 +++ ...integration_git-commit.md.UP0mr78M.lean.js | 1 + ...roject-integration_monorepo.md.oJ7L8XFu.js | 79 ++ ...t-integration_monorepo.md.oJ7L8XFu.lean.js | 1 + ...t-integration_specification.md.VgHGKirL.js | 95 ++ ...egration_specification.md.VgHGKirL.lean.js | 95 ++ ...d_project-integration_style.md.1DtJ1w1z.js | 135 ++ ...ject-integration_style.md.1DtJ1w1z.lean.js | 1 + ...-integration_test-framework.md.jZ4aPEv-.js | 402 ++++++ ...gration_test-framework.md.jZ4aPEv-.lean.js | 1 + assets/frontend_react_index.md.vKjsadpH.js | 1 + .../frontend_react_index.md.vKjsadpH.lean.js | 1 + assets/frontend_regexp_base.md.QEvSpxyK.js | 167 +++ .../frontend_regexp_base.md.QEvSpxyK.lean.js | 1 + .../frontend_render-mode_base.md.NeCLWyST.js | 1 + ...ntend_render-mode_base.md.NeCLWyST.lean.js | 1 + assets/frontend_sandbox_index.md.Z9MoVJas.js | 1 + ...frontend_sandbox_index.md.Z9MoVJas.lean.js | 1 + assets/frontend_ts_base.md.VMBqRDJo.js | 31 + assets/frontend_ts_base.md.VMBqRDJo.lean.js | 1 + .../frontend_ts_ts-configure.md.p4gJph3L.js | 1 + ...ontend_ts_ts-configure.md.p4gJph3L.lean.js | 1 + assets/frontend_visual_index.md.m1fPrP2X.js | 1 + .../frontend_visual_index.md.m1fPrP2X.lean.js | 1 + ...ontend_vue_component-render.md.nhoAsokZ.js | 1 + ...d_vue_component-render.md.nhoAsokZ.lean.js | 1 + ...frontend_vue_computed-watch.md.D5_gwArb.js | 767 +++++++++++ ...end_vue_computed-watch.md.D5_gwArb.lean.js | 1 + assets/frontend_vue_pinia.md.LOFu5M5D.js | 1 + assets/frontend_vue_pinia.md.LOFu5M5D.lean.js | 1 + assets/frontend_vue_reactivity.md.FuUuuTBh.js | 1104 ++++++++++++++++ ...rontend_vue_reactivity.md.FuUuuTBh.lean.js | 1 + assets/frontend_vue_router.md.avVg46Rr.js | 1 + .../frontend_vue_router.md.avVg46Rr.lean.js | 1 + assets/frontend_vue_slot.md.cV7NCWVx.js | 1 + assets/frontend_vue_slot.md.cV7NCWVx.lean.js | 1 + ...ntend_vue_template-compiler.md.eQe44ILX.js | 15 + ..._vue_template-compiler.md.eQe44ILX.lean.js | 1 + assets/frontend_vue_transition.md.osm8ExKv.js | 1 + ...rontend_vue_transition.md.osm8ExKv.lean.js | 1 + ...frontend_vue_update-process.md.MkXMZBqr.js | 1 + ...end_vue_update-process.md.MkXMZBqr.lean.js | 1 + assets/frontend_vue_vuex.md.ki4Nhn_g.js | 1 + assets/frontend_vue_vuex.md.ki4Nhn_g.lean.js | 1 + assets/frontend_wasm_base.md.h0kzz92d.js | 1 + assets/frontend_wasm_base.md.h0kzz92d.lean.js | 1 + assets/frontend_webpack_base.md.ijd0DzJn.js | 1 + .../frontend_webpack_base.md.ijd0DzJn.lean.js | 1 + ...nd_webpack_webpack-analysis.md.0-mNgpgx.js | 1 + ...bpack_webpack-analysis.md.0-mNgpgx.lean.js | 1 + ...tend_webpack_webpack-loader.md.5SNt50qQ.js | 1 + ...webpack_webpack-loader.md.5SNt50qQ.lean.js | 1 + ...ontend_webpack_webpack-node.md.3SEUjomz.js | 1 + ...d_webpack_webpack-node.md.3SEUjomz.lean.js | 1 + ...tend_webpack_webpack-plugin.md.9Iz9sFjv.js | 1 + ...webpack_webpack-plugin.md.9Iz9sFjv.lean.js | 1 + assets/fullstack_base.md.vQ985qV_.js | 1 + assets/fullstack_base.md.vQ985qV_.lean.js | 1 + ...lstack_docker_base-tutorial.md.HbViEf-l.js | 113 ++ ...k_docker_base-tutorial.md.HbViEf-l.lean.js | 1 + ...stack_docker_docker-compose.md.pk2z5mQl.js | 171 +++ ..._docker_docker-compose.md.pk2z5mQl.lean.js | 1 + ...ck_docker_docker-repository.md.M30BRYPU.js | 75 ++ ...cker_docker-repository.md.M30BRYPU.lean.js | 1 + ...fullstack_docker_dockerfile.md.W4mEEOsy.js | 256 ++++ ...tack_docker_dockerfile.md.W4mEEOsy.lean.js | 1 + ...ck_docker_install-configure.md.76I1Z0j-.js | 77 ++ ...cker_install-configure.md.76I1Z0j-.lean.js | 1 + .../fullstack_docker_network.md.k3FDmQ9F.js | 59 + ...llstack_docker_network.md.k3FDmQ9F.lean.js | 1 + ...stack_docker_npm-repository.md.9jm80i0a.js | 155 +++ ..._docker_npm-repository.md.9jm80i0a.lean.js | 1 + ...llstack_docker_volume-store.md.qcpOQfjk.js | 21 + ...ck_docker_volume-store.md.qcpOQfjk.lean.js | 1 + ...tack_gitlab_gitlab-pipeline.md.e1alnaT7.js | 264 ++++ ...gitlab_gitlab-pipeline.md.e1alnaT7.lean.js | 1 + ...ab-runner-install-configure.md.VVSd4_S0.js | 108 ++ ...nner-install-configure.md.VVSd4_S0.lean.js | 1 + ...ck_gitlab_install-configure.md.RtybrUAQ.js | 163 +++ ...tlab_install-configure.md.RtybrUAQ.lean.js | 1 + ...stack_gitlab_npm-repository.md.0Y5cfoTu.js | 134 ++ ..._gitlab_npm-repository.md.0Y5cfoTu.lean.js | 1 + assets/fullstack_k8s_base.md.dtBawEqz.js | 1 + assets/fullstack_k8s_base.md.dtBawEqz.lean.js | 1 + assets/fullstack_k8s_install.md.vfL3WVw3.js | 662 ++++++++++ .../fullstack_k8s_install.md.vfL3WVw3.lean.js | 1 + assets/index.md.x6ZltWo2.js | 1 + assets/index.md.x6ZltWo2.lean.js | 1 + .../inter-italic-cyrillic-ext.OVycGSDq.woff2 | Bin 0 -> 28332 bytes assets/inter-italic-cyrillic.-nLMcIwj.woff2 | Bin 0 -> 17824 bytes assets/inter-italic-greek-ext.hznxWNZO.woff2 | Bin 0 -> 12188 bytes assets/inter-italic-greek.PSfer2Kc.woff2 | Bin 0 -> 23264 bytes assets/inter-italic-latin-ext.RnFly65-.woff2 | Bin 0 -> 63552 bytes assets/inter-italic-latin.27E69YJn.woff2 | Bin 0 -> 46048 bytes assets/inter-italic-vietnamese.xzQHe1q1.woff2 | Bin 0 -> 8784 bytes .../inter-roman-cyrillic-ext.8T9wMG5w.woff2 | Bin 0 -> 26600 bytes assets/inter-roman-cyrillic.jIZ9REo5.woff2 | Bin 0 -> 16780 bytes assets/inter-roman-greek-ext.9JiNzaSO.woff2 | Bin 0 -> 11808 bytes assets/inter-roman-greek.Cb5wWeGA.woff2 | Bin 0 -> 21776 bytes assets/inter-roman-latin-ext.GZWE-KO4.woff2 | Bin 0 -> 59608 bytes assets/inter-roman-latin.bvIUbFQP.woff2 | Bin 0 -> 42464 bytes assets/inter-roman-vietnamese.paY3CzEB.woff2 | Bin 0 -> 8492 bytes assets/me.md.ZKkPBK0C.js | 1 + assets/me.md.ZKkPBK0C.lean.js | 1 + assets/style.R4pHl7s5.css | 1 + assets/super-nav_index.md.yGU0kMmW.js | 9 + assets/super-nav_index.md.yGU0kMmW.lean.js | 1 + .../talk_2023_dad-foot-injured.md.HmqqvJLL.js | 1 + ..._2023_dad-foot-injured.md.HmqqvJLL.lean.js | 1 + assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.js | 1 + ...talk_2023_lose-qoo-job.md.OMUrm0Ji.lean.js | 1 + ...k_2023_love-4th-anniversary.md.yJuD2XUO.js | 1 + ...3_love-4th-anniversary.md.yJuD2XUO.lean.js | 1 + assets/talk_2023_second-covid.md.W7G-R6cY.js | 1 + ...talk_2023_second-covid.md.W7G-R6cY.lean.js | 1 + assets/talk_base.md.GzyzggUv.js | 1 + assets/talk_base.md.GzyzggUv.lean.js | 1 + favicon.ico | Bin 0 -> 4286 bytes frontend/babel/babel-analysis.html | 56 + frontend/babel/babel-plugin-guide.html | 56 + frontend/babel/base.html | 61 + frontend/base.html | 56 + frontend/browser/base.html | 56 + frontend/building-tool/base.html | 56 + frontend/canvas/base.html | 123 ++ frontend/canvas/magic-effects.html | 56 + frontend/cli/index.html | 56 + frontend/compiler/index.html | 56 + frontend/computer-network/arp-protocol.html | 63 + frontend/computer-network/base.html | 56 + frontend/computer-network/http-protocol.html | 361 +++++ frontend/computer-network/ip-protocol.html | 59 + frontend/computer-network/tcp-protocol.html | 99 ++ frontend/debug-skill/base.html | 209 +++ frontend/debug-skill/charles.html | 56 + frontend/debug-skill/chrome.html | 56 + frontend/debug-skill/fiddler.html | 79 ++ frontend/debug-skill/h5.html | 56 + frontend/debug-skill/vscode.html | 56 + frontend/debug-skill/wireshark.html | 95 ++ frontend/desktop-app/index.html | 56 + frontend/editor/index.html | 72 + frontend/flutter/base.html | 56 + frontend/hybrid-app/base.html | 56 + frontend/js/async.html | 59 + frontend/js/audio.html | 56 + frontend/js/base.html | 56 + frontend/js/binary.html | 299 +++++ frontend/js/eventloop.html | 147 +++ frontend/js/implicit-conversion.html | 230 ++++ frontend/js/js-gc.html | 56 + frontend/js/meta-coding.html | 56 + frontend/js/proto-inherit.html | 381 ++++++ frontend/js/scope-closure.html | 137 ++ frontend/lowcoding/base.html | 56 + frontend/micro-frontend/base.html | 56 + frontend/micro-program/index.html | 56 + frontend/monitor/base.html | 56 + frontend/nestjs/base.html | 1153 ++++++++++++++++ frontend/nestjs/mvc.html | 227 ++++ frontend/nestjs/swagger.html | 149 +++ frontend/nestjs/useful.html | 251 ++++ frontend/nginx/base.html | 692 ++++++++++ frontend/node-bff/index.html | 56 + frontend/node-optimize/index.html | 56 + frontend/node/base.html | 56 + frontend/node/node-debug.html | 56 + frontend/node/node-framework.html | 56 + frontend/node/node-measure.html | 56 + frontend/node/node-process.html | 56 + frontend/node/node-web.html | 56 + frontend/npm/index.html | 56 + frontend/pattern/base.html | 477 +++++++ frontend/performance/base.html | 56 + frontend/performance/cache-perf.html | 56 + frontend/performance/cache.html | 56 + frontend/performance/chunk-upload.html | 399 ++++++ frontend/performance/load-perf.html | 56 + frontend/performance/network-perf.html | 56 + frontend/performance/node-score.html | 56 + frontend/performance/performance.html | 56 + frontend/performance/range-download.html | 56 + frontend/performance/secure-perf.html | 56 + frontend/performance/seo.html | 56 + frontend/performance/virtual-scroll-1.html | 56 + frontend/performance/virtual-scroll-2.html | 56 + frontend/performance/web-score.html | 56 + frontend/project-integration/base.html | 56 + frontend/project-integration/build-tool.html | 59 + .../project-integration/choose-editor.html | 56 + frontend/project-integration/ci-pipeline.html | 56 + .../project-integration/debugger-skill.html | 56 + .../deploy-specification.html | 56 + frontend/project-integration/framework.html | 56 + frontend/project-integration/git-commit.html | 254 ++++ frontend/project-integration/monorepo.html | 134 ++ .../project-integration/specification.html | 150 +++ frontend/project-integration/style.html | 190 +++ .../project-integration/test-framework.html | 457 +++++++ frontend/react/index.html | 56 + frontend/regexp/base.html | 222 ++++ frontend/render-mode/base.html | 56 + frontend/sandbox/index.html | 56 + frontend/ts/base.html | 86 ++ frontend/ts/ts-configure.html | 56 + frontend/visual/index.html | 56 + frontend/vue/component-render.html | 56 + frontend/vue/computed-watch.html | 822 ++++++++++++ frontend/vue/pinia.html | 56 + frontend/vue/reactivity.html | 1159 +++++++++++++++++ frontend/vue/router.html | 56 + frontend/vue/slot.html | 56 + frontend/vue/template-compiler.html | 70 + frontend/vue/transition.html | 56 + frontend/vue/update-process.html | 56 + frontend/vue/vuex.html | 56 + frontend/wasm/base.html | 56 + frontend/webpack/base.html | 56 + frontend/webpack/webpack-analysis.html | 56 + frontend/webpack/webpack-loader.html | 56 + frontend/webpack/webpack-node.html | 56 + frontend/webpack/webpack-plugin.html | 56 + fullstack/base.html | 56 + fullstack/docker/base-tutorial.html | 168 +++ fullstack/docker/docker-compose.html | 226 ++++ fullstack/docker/docker-repository.html | 130 ++ fullstack/docker/dockerfile.html | 311 +++++ fullstack/docker/install-configure.html | 132 ++ fullstack/docker/network.html | 114 ++ fullstack/docker/npm-repository.html | 210 +++ fullstack/docker/volume-store.html | 76 ++ fullstack/gitlab/gitlab-pipeline.html | 319 +++++ .../gitlab-runner-install-configure.html | 163 +++ fullstack/gitlab/install-configure.html | 218 ++++ fullstack/gitlab/npm-repository.html | 189 +++ fullstack/k8s/base.html | 56 + fullstack/k8s/install.html | 717 ++++++++++ hashmap.json | 1 + index.html | 56 + logo.png | Bin 0 -> 17741 bytes manifest.json | 26 + me.html | 56 + media/senbonzakura.mp3 | Bin 0 -> 3169774 bytes pwa-worker.js | 14 + robots.txt | 5 + sitemap.txt | 152 +++ super-nav/index.html | 64 + talk/2023/dad-foot-injured.html | 56 + talk/2023/lose-qoo-job.html | 56 + talk/2023/love-4th-anniversary.html | 56 + talk/2023/second-covid.html | 56 + talk/base.html | 56 + 485 files changed, 36556 insertions(+) create mode 100644 404.html create mode 100644 CNAME create mode 100644 README.md create mode 100644 article/2019/bind-call-apply.html create mode 100644 article/2019/css-center.html create mode 100644 article/2019/js-copy.html create mode 100644 article/2019/js-type-transfer.html create mode 100644 article/2019/ktv-system.html create mode 100644 article/2019/mysql-guide.html create mode 100644 article/2019/nvm-guide.html create mode 100644 article/2019/promise.html create mode 100644 article/2019/what-bfc.html create mode 100644 article/2020/domparser-xml.html create mode 100644 article/2020/optimize-web-server.html create mode 100644 article/2020/regexp-guide.html create mode 100644 article/2020/vscode-shortcut.html create mode 100644 article/2020/web-cache.html create mode 100644 article/2020/webpack-guide.html create mode 100644 article/2021/flex-layout.html create mode 100644 article/2021/js-pattern.html create mode 100644 article/2021/performance-tools.html create mode 100644 article/2021/pwa-app.html create mode 100644 article/2021/ts-decorator.html create mode 100644 article/2021/vue-core-process.html create mode 100644 article/2021/vue-img-lazyload.html create mode 100644 article/2022/emoji-markup.html create mode 100644 article/base.html create mode 100644 assets/app.hlbKLLW0.js create mode 100644 assets/article_2019_bind-call-apply.md.EzG0_8Ly.js create mode 100644 assets/article_2019_bind-call-apply.md.EzG0_8Ly.lean.js create mode 100644 assets/article_2019_css-center.md.9vJJ7-ow.js create mode 100644 assets/article_2019_css-center.md.9vJJ7-ow.lean.js create mode 100644 assets/article_2019_js-copy.md.hrnH-GZy.js create mode 100644 assets/article_2019_js-copy.md.hrnH-GZy.lean.js create mode 100644 assets/article_2019_js-type-transfer.md.UKEkeSx-.js create mode 100644 assets/article_2019_js-type-transfer.md.UKEkeSx-.lean.js create mode 100644 assets/article_2019_ktv-system.md.ZlJWiM1B.js create mode 100644 assets/article_2019_ktv-system.md.ZlJWiM1B.lean.js create mode 100644 assets/article_2019_mysql-guide.md.3wP7Sagt.js create mode 100644 assets/article_2019_mysql-guide.md.3wP7Sagt.lean.js create mode 100644 assets/article_2019_nvm-guide.md.jatQbzh1.js create mode 100644 assets/article_2019_nvm-guide.md.jatQbzh1.lean.js create mode 100644 assets/article_2019_promise.md.5sNxqCYP.js create mode 100644 assets/article_2019_promise.md.5sNxqCYP.lean.js create mode 100644 assets/article_2019_what-bfc.md.tIBqKLqT.js create mode 100644 assets/article_2019_what-bfc.md.tIBqKLqT.lean.js create mode 100644 assets/article_2020_domparser-xml.md.uJdSS0gw.js create mode 100644 assets/article_2020_domparser-xml.md.uJdSS0gw.lean.js create mode 100644 assets/article_2020_optimize-web-server.md.b9Z54Q9U.js create mode 100644 assets/article_2020_optimize-web-server.md.b9Z54Q9U.lean.js create mode 100644 assets/article_2020_regexp-guide.md.1Tud3eyA.js create mode 100644 assets/article_2020_regexp-guide.md.1Tud3eyA.lean.js create mode 100644 assets/article_2020_vscode-shortcut.md.kzdDBCVW.js create mode 100644 assets/article_2020_vscode-shortcut.md.kzdDBCVW.lean.js create mode 100644 assets/article_2020_web-cache.md.uI4_cM9P.js create mode 100644 assets/article_2020_web-cache.md.uI4_cM9P.lean.js create mode 100644 assets/article_2020_webpack-guide.md.zBMh8gpK.js create mode 100644 assets/article_2020_webpack-guide.md.zBMh8gpK.lean.js create mode 100644 assets/article_2021_flex-layout.md.evpHdPM-.js create mode 100644 assets/article_2021_flex-layout.md.evpHdPM-.lean.js create mode 100644 assets/article_2021_js-pattern.md.Qzh4S7uy.js create mode 100644 assets/article_2021_js-pattern.md.Qzh4S7uy.lean.js create mode 100644 assets/article_2021_performance-tools.md.G4md1C7p.js create mode 100644 assets/article_2021_performance-tools.md.G4md1C7p.lean.js create mode 100644 assets/article_2021_pwa-app.md.edqGSum2.js create mode 100644 assets/article_2021_pwa-app.md.edqGSum2.lean.js create mode 100644 assets/article_2021_ts-decorator.md.XWu9IBvE.js create mode 100644 assets/article_2021_ts-decorator.md.XWu9IBvE.lean.js create mode 100644 assets/article_2021_vue-core-process.md.ORz11p1q.js create mode 100644 assets/article_2021_vue-core-process.md.ORz11p1q.lean.js create mode 100644 assets/article_2021_vue-img-lazyload.md.tKCHuRr8.js create mode 100644 assets/article_2021_vue-img-lazyload.md.tKCHuRr8.lean.js create mode 100644 assets/article_2022_emoji-markup.md.wvCnl86t.js create mode 100644 assets/article_2022_emoji-markup.md.wvCnl86t.lean.js create mode 100644 assets/article_base.md.BJwv0RtE.js create mode 100644 assets/article_base.md.BJwv0RtE.lean.js create mode 100644 assets/chunks/@localSearchIndexroot.5hxXnWZ2.js create mode 100644 assets/chunks/VPLocalSearchBox.D-gwIAzV.js create mode 100644 assets/chunks/framework.SV1ROkXV.js create mode 100644 assets/chunks/giscus-a53917f0.pI8Mtuqg.js create mode 100644 assets/chunks/theme.qcSYzAJN.js create mode 100644 assets/frontend_babel_babel-analysis.md.Z0deENoo.js create mode 100644 assets/frontend_babel_babel-analysis.md.Z0deENoo.lean.js create mode 100644 assets/frontend_babel_babel-plugin-guide.md.vF1b_R9m.js create mode 100644 assets/frontend_babel_babel-plugin-guide.md.vF1b_R9m.lean.js create mode 100644 assets/frontend_babel_base.md.t0-aK7-4.js create mode 100644 assets/frontend_babel_base.md.t0-aK7-4.lean.js create mode 100644 assets/frontend_base.md.36vRxAi8.js create mode 100644 assets/frontend_base.md.36vRxAi8.lean.js create mode 100644 assets/frontend_browser_base.md.v_UdQTA3.js create mode 100644 assets/frontend_browser_base.md.v_UdQTA3.lean.js create mode 100644 assets/frontend_building-tool_base.md.nIZ1pU9W.js create mode 100644 assets/frontend_building-tool_base.md.nIZ1pU9W.lean.js create mode 100644 assets/frontend_canvas_base.md.u6xHSP1j.js create mode 100644 assets/frontend_canvas_base.md.u6xHSP1j.lean.js create mode 100644 assets/frontend_canvas_magic-effects.md.Fkxa5tC4.js create mode 100644 assets/frontend_canvas_magic-effects.md.Fkxa5tC4.lean.js create mode 100644 assets/frontend_cli_index.md.qTzih6d4.js create mode 100644 assets/frontend_cli_index.md.qTzih6d4.lean.js create mode 100644 assets/frontend_compiler_index.md.gB4W-5KQ.js create mode 100644 assets/frontend_compiler_index.md.gB4W-5KQ.lean.js create mode 100644 assets/frontend_computer-network_arp-protocol.md.oAtbXMJy.js create mode 100644 assets/frontend_computer-network_arp-protocol.md.oAtbXMJy.lean.js create mode 100644 assets/frontend_computer-network_base.md.1bZNLudq.js create mode 100644 assets/frontend_computer-network_base.md.1bZNLudq.lean.js create mode 100644 assets/frontend_computer-network_http-protocol.md.fxY3d9SH.js create mode 100644 assets/frontend_computer-network_http-protocol.md.fxY3d9SH.lean.js create mode 100644 assets/frontend_computer-network_ip-protocol.md.ZfcsangK.js create mode 100644 assets/frontend_computer-network_ip-protocol.md.ZfcsangK.lean.js create mode 100644 assets/frontend_computer-network_tcp-protocol.md.cEUhzRKM.js create mode 100644 assets/frontend_computer-network_tcp-protocol.md.cEUhzRKM.lean.js create mode 100644 assets/frontend_debug-skill_base.md.9fX9BAHb.js create mode 100644 assets/frontend_debug-skill_base.md.9fX9BAHb.lean.js create mode 100644 assets/frontend_debug-skill_charles.md.cdOszKr5.js create mode 100644 assets/frontend_debug-skill_charles.md.cdOszKr5.lean.js create mode 100644 assets/frontend_debug-skill_chrome.md.nkCU8h5d.js create mode 100644 assets/frontend_debug-skill_chrome.md.nkCU8h5d.lean.js create mode 100644 assets/frontend_debug-skill_fiddler.md.07eSQgh_.js create mode 100644 assets/frontend_debug-skill_fiddler.md.07eSQgh_.lean.js create mode 100644 assets/frontend_debug-skill_h5.md.GWeYJzVC.js create mode 100644 assets/frontend_debug-skill_h5.md.GWeYJzVC.lean.js create mode 100644 assets/frontend_debug-skill_vscode.md.s-HeTMf3.js create mode 100644 assets/frontend_debug-skill_vscode.md.s-HeTMf3.lean.js create mode 100644 assets/frontend_debug-skill_wireshark.md.s-dRrpN9.js create mode 100644 assets/frontend_debug-skill_wireshark.md.s-dRrpN9.lean.js create mode 100644 assets/frontend_desktop-app_index.md.efUgh7UD.js create mode 100644 assets/frontend_desktop-app_index.md.efUgh7UD.lean.js create mode 100644 assets/frontend_editor_index.md._6kkOtxM.js create mode 100644 assets/frontend_editor_index.md._6kkOtxM.lean.js create mode 100644 assets/frontend_flutter_base.md.9KY5vMgx.js create mode 100644 assets/frontend_flutter_base.md.9KY5vMgx.lean.js create mode 100644 assets/frontend_hybrid-app_base.md.hBB-XojM.js create mode 100644 assets/frontend_hybrid-app_base.md.hBB-XojM.lean.js create mode 100644 assets/frontend_js_async.md.JY11OOTH.js create mode 100644 assets/frontend_js_async.md.JY11OOTH.lean.js create mode 100644 assets/frontend_js_audio.md.bjTod7Ut.js create mode 100644 assets/frontend_js_audio.md.bjTod7Ut.lean.js create mode 100644 assets/frontend_js_base.md.uTBw_pBH.js create mode 100644 assets/frontend_js_base.md.uTBw_pBH.lean.js create mode 100644 assets/frontend_js_binary.md.kGIZY9pD.js create mode 100644 assets/frontend_js_binary.md.kGIZY9pD.lean.js create mode 100644 assets/frontend_js_eventloop.md.2QrpoMAr.js create mode 100644 assets/frontend_js_eventloop.md.2QrpoMAr.lean.js create mode 100644 assets/frontend_js_implicit-conversion.md.s3K7bck7.js create mode 100644 assets/frontend_js_implicit-conversion.md.s3K7bck7.lean.js create mode 100644 assets/frontend_js_js-gc.md.AunbcRGq.js create mode 100644 assets/frontend_js_js-gc.md.AunbcRGq.lean.js create mode 100644 assets/frontend_js_meta-coding.md.SJjED1Qn.js create mode 100644 assets/frontend_js_meta-coding.md.SJjED1Qn.lean.js create mode 100644 assets/frontend_js_proto-inherit.md.I_l70cVG.js create mode 100644 assets/frontend_js_proto-inherit.md.I_l70cVG.lean.js create mode 100644 assets/frontend_js_scope-closure.md.fqZFaNHm.js create mode 100644 assets/frontend_js_scope-closure.md.fqZFaNHm.lean.js create mode 100644 assets/frontend_lowcoding_base.md.BKDSIX3v.js create mode 100644 assets/frontend_lowcoding_base.md.BKDSIX3v.lean.js create mode 100644 assets/frontend_micro-frontend_base.md.50Wy2Q-k.js create mode 100644 assets/frontend_micro-frontend_base.md.50Wy2Q-k.lean.js create mode 100644 assets/frontend_micro-program_index.md.xlVMmi6M.js create mode 100644 assets/frontend_micro-program_index.md.xlVMmi6M.lean.js create mode 100644 assets/frontend_monitor_base.md.XPdYn5-o.js create mode 100644 assets/frontend_monitor_base.md.XPdYn5-o.lean.js create mode 100644 assets/frontend_nestjs_base.md.J1ZEEYhI.js create mode 100644 assets/frontend_nestjs_base.md.J1ZEEYhI.lean.js create mode 100644 assets/frontend_nestjs_mvc.md.Z5ZKRS9C.js create mode 100644 assets/frontend_nestjs_mvc.md.Z5ZKRS9C.lean.js create mode 100644 assets/frontend_nestjs_swagger.md.y4EL9kxL.js create mode 100644 assets/frontend_nestjs_swagger.md.y4EL9kxL.lean.js create mode 100644 assets/frontend_nestjs_useful.md.qejIwuqb.js create mode 100644 assets/frontend_nestjs_useful.md.qejIwuqb.lean.js create mode 100644 assets/frontend_nginx_base.md.uaI9zQ4K.js create mode 100644 assets/frontend_nginx_base.md.uaI9zQ4K.lean.js create mode 100644 assets/frontend_node-bff_index.md.hRxjNnOC.js create mode 100644 assets/frontend_node-bff_index.md.hRxjNnOC.lean.js create mode 100644 assets/frontend_node-optimize_index.md.f6NvNEj-.js create mode 100644 assets/frontend_node-optimize_index.md.f6NvNEj-.lean.js create mode 100644 assets/frontend_node_base.md.XlnRBo2L.js create mode 100644 assets/frontend_node_base.md.XlnRBo2L.lean.js create mode 100644 assets/frontend_node_node-debug.md.PY_CCMV9.js create mode 100644 assets/frontend_node_node-debug.md.PY_CCMV9.lean.js create mode 100644 assets/frontend_node_node-framework.md.IA789WKd.js create mode 100644 assets/frontend_node_node-framework.md.IA789WKd.lean.js create mode 100644 assets/frontend_node_node-measure.md.K9kMWbHF.js create mode 100644 assets/frontend_node_node-measure.md.K9kMWbHF.lean.js create mode 100644 assets/frontend_node_node-process.md.nI0gQQIR.js create mode 100644 assets/frontend_node_node-process.md.nI0gQQIR.lean.js create mode 100644 assets/frontend_node_node-web.md.8gBO0zUa.js create mode 100644 assets/frontend_node_node-web.md.8gBO0zUa.lean.js create mode 100644 assets/frontend_npm_index.md.zxaDPdL6.js create mode 100644 assets/frontend_npm_index.md.zxaDPdL6.lean.js create mode 100644 assets/frontend_pattern_base.md.ESTX4J2k.js create mode 100644 assets/frontend_pattern_base.md.ESTX4J2k.lean.js create mode 100644 assets/frontend_performance_base.md.4_74TDRU.js create mode 100644 assets/frontend_performance_base.md.4_74TDRU.lean.js create mode 100644 assets/frontend_performance_cache-perf.md.ztt0MTqt.js create mode 100644 assets/frontend_performance_cache-perf.md.ztt0MTqt.lean.js create mode 100644 assets/frontend_performance_cache.md.DWS86kiQ.js create mode 100644 assets/frontend_performance_cache.md.DWS86kiQ.lean.js create mode 100644 assets/frontend_performance_chunk-upload.md.SxJaw511.js create mode 100644 assets/frontend_performance_chunk-upload.md.SxJaw511.lean.js create mode 100644 assets/frontend_performance_load-perf.md.YgBKXjky.js create mode 100644 assets/frontend_performance_load-perf.md.YgBKXjky.lean.js create mode 100644 assets/frontend_performance_network-perf.md.dbc1c8R_.js create mode 100644 assets/frontend_performance_network-perf.md.dbc1c8R_.lean.js create mode 100644 assets/frontend_performance_node-score.md.D9AUg7bg.js create mode 100644 assets/frontend_performance_node-score.md.D9AUg7bg.lean.js create mode 100644 assets/frontend_performance_performance.md.o6_aDciN.js create mode 100644 assets/frontend_performance_performance.md.o6_aDciN.lean.js create mode 100644 assets/frontend_performance_range-download.md.9tg7xUgK.js create mode 100644 assets/frontend_performance_range-download.md.9tg7xUgK.lean.js create mode 100644 assets/frontend_performance_secure-perf.md.xaV7lDmb.js create mode 100644 assets/frontend_performance_secure-perf.md.xaV7lDmb.lean.js create mode 100644 assets/frontend_performance_seo.md.QeValPBK.js create mode 100644 assets/frontend_performance_seo.md.QeValPBK.lean.js create mode 100644 assets/frontend_performance_virtual-scroll-1.md.zLnkOlkp.js create mode 100644 assets/frontend_performance_virtual-scroll-1.md.zLnkOlkp.lean.js create mode 100644 assets/frontend_performance_virtual-scroll-2.md.Pm3KlSap.js create mode 100644 assets/frontend_performance_virtual-scroll-2.md.Pm3KlSap.lean.js create mode 100644 assets/frontend_performance_web-score.md.1Mfy9rMi.js create mode 100644 assets/frontend_performance_web-score.md.1Mfy9rMi.lean.js create mode 100644 assets/frontend_project-integration_base.md.XekYSkMF.js create mode 100644 assets/frontend_project-integration_base.md.XekYSkMF.lean.js create mode 100644 assets/frontend_project-integration_build-tool.md.3LVzvGhj.js create mode 100644 assets/frontend_project-integration_build-tool.md.3LVzvGhj.lean.js create mode 100644 assets/frontend_project-integration_choose-editor.md.VGwstEOo.js create mode 100644 assets/frontend_project-integration_choose-editor.md.VGwstEOo.lean.js create mode 100644 assets/frontend_project-integration_ci-pipeline.md.-exRgXJ0.js create mode 100644 assets/frontend_project-integration_ci-pipeline.md.-exRgXJ0.lean.js create mode 100644 assets/frontend_project-integration_debugger-skill.md.Zl33JS1r.js create mode 100644 assets/frontend_project-integration_debugger-skill.md.Zl33JS1r.lean.js create mode 100644 assets/frontend_project-integration_deploy-specification.md.c1zXEw1q.js create mode 100644 assets/frontend_project-integration_deploy-specification.md.c1zXEw1q.lean.js create mode 100644 assets/frontend_project-integration_framework.md.E07YI-v5.js create mode 100644 assets/frontend_project-integration_framework.md.E07YI-v5.lean.js create mode 100644 assets/frontend_project-integration_git-commit.md.UP0mr78M.js create mode 100644 assets/frontend_project-integration_git-commit.md.UP0mr78M.lean.js create mode 100644 assets/frontend_project-integration_monorepo.md.oJ7L8XFu.js create mode 100644 assets/frontend_project-integration_monorepo.md.oJ7L8XFu.lean.js create mode 100644 assets/frontend_project-integration_specification.md.VgHGKirL.js create mode 100644 assets/frontend_project-integration_specification.md.VgHGKirL.lean.js create mode 100644 assets/frontend_project-integration_style.md.1DtJ1w1z.js create mode 100644 assets/frontend_project-integration_style.md.1DtJ1w1z.lean.js create mode 100644 assets/frontend_project-integration_test-framework.md.jZ4aPEv-.js create mode 100644 assets/frontend_project-integration_test-framework.md.jZ4aPEv-.lean.js create mode 100644 assets/frontend_react_index.md.vKjsadpH.js create mode 100644 assets/frontend_react_index.md.vKjsadpH.lean.js create mode 100644 assets/frontend_regexp_base.md.QEvSpxyK.js create mode 100644 assets/frontend_regexp_base.md.QEvSpxyK.lean.js create mode 100644 assets/frontend_render-mode_base.md.NeCLWyST.js create mode 100644 assets/frontend_render-mode_base.md.NeCLWyST.lean.js create mode 100644 assets/frontend_sandbox_index.md.Z9MoVJas.js create mode 100644 assets/frontend_sandbox_index.md.Z9MoVJas.lean.js create mode 100644 assets/frontend_ts_base.md.VMBqRDJo.js create mode 100644 assets/frontend_ts_base.md.VMBqRDJo.lean.js create mode 100644 assets/frontend_ts_ts-configure.md.p4gJph3L.js create mode 100644 assets/frontend_ts_ts-configure.md.p4gJph3L.lean.js create mode 100644 assets/frontend_visual_index.md.m1fPrP2X.js create mode 100644 assets/frontend_visual_index.md.m1fPrP2X.lean.js create mode 100644 assets/frontend_vue_component-render.md.nhoAsokZ.js create mode 100644 assets/frontend_vue_component-render.md.nhoAsokZ.lean.js create mode 100644 assets/frontend_vue_computed-watch.md.D5_gwArb.js create mode 100644 assets/frontend_vue_computed-watch.md.D5_gwArb.lean.js create mode 100644 assets/frontend_vue_pinia.md.LOFu5M5D.js create mode 100644 assets/frontend_vue_pinia.md.LOFu5M5D.lean.js create mode 100644 assets/frontend_vue_reactivity.md.FuUuuTBh.js create mode 100644 assets/frontend_vue_reactivity.md.FuUuuTBh.lean.js create mode 100644 assets/frontend_vue_router.md.avVg46Rr.js create mode 100644 assets/frontend_vue_router.md.avVg46Rr.lean.js create mode 100644 assets/frontend_vue_slot.md.cV7NCWVx.js create mode 100644 assets/frontend_vue_slot.md.cV7NCWVx.lean.js create mode 100644 assets/frontend_vue_template-compiler.md.eQe44ILX.js create mode 100644 assets/frontend_vue_template-compiler.md.eQe44ILX.lean.js create mode 100644 assets/frontend_vue_transition.md.osm8ExKv.js create mode 100644 assets/frontend_vue_transition.md.osm8ExKv.lean.js create mode 100644 assets/frontend_vue_update-process.md.MkXMZBqr.js create mode 100644 assets/frontend_vue_update-process.md.MkXMZBqr.lean.js create mode 100644 assets/frontend_vue_vuex.md.ki4Nhn_g.js create mode 100644 assets/frontend_vue_vuex.md.ki4Nhn_g.lean.js create mode 100644 assets/frontend_wasm_base.md.h0kzz92d.js create mode 100644 assets/frontend_wasm_base.md.h0kzz92d.lean.js create mode 100644 assets/frontend_webpack_base.md.ijd0DzJn.js create mode 100644 assets/frontend_webpack_base.md.ijd0DzJn.lean.js create mode 100644 assets/frontend_webpack_webpack-analysis.md.0-mNgpgx.js create mode 100644 assets/frontend_webpack_webpack-analysis.md.0-mNgpgx.lean.js create mode 100644 assets/frontend_webpack_webpack-loader.md.5SNt50qQ.js create mode 100644 assets/frontend_webpack_webpack-loader.md.5SNt50qQ.lean.js create mode 100644 assets/frontend_webpack_webpack-node.md.3SEUjomz.js create mode 100644 assets/frontend_webpack_webpack-node.md.3SEUjomz.lean.js create mode 100644 assets/frontend_webpack_webpack-plugin.md.9Iz9sFjv.js create mode 100644 assets/frontend_webpack_webpack-plugin.md.9Iz9sFjv.lean.js create mode 100644 assets/fullstack_base.md.vQ985qV_.js create mode 100644 assets/fullstack_base.md.vQ985qV_.lean.js create mode 100644 assets/fullstack_docker_base-tutorial.md.HbViEf-l.js create mode 100644 assets/fullstack_docker_base-tutorial.md.HbViEf-l.lean.js create mode 100644 assets/fullstack_docker_docker-compose.md.pk2z5mQl.js create mode 100644 assets/fullstack_docker_docker-compose.md.pk2z5mQl.lean.js create mode 100644 assets/fullstack_docker_docker-repository.md.M30BRYPU.js create mode 100644 assets/fullstack_docker_docker-repository.md.M30BRYPU.lean.js create mode 100644 assets/fullstack_docker_dockerfile.md.W4mEEOsy.js create mode 100644 assets/fullstack_docker_dockerfile.md.W4mEEOsy.lean.js create mode 100644 assets/fullstack_docker_install-configure.md.76I1Z0j-.js create mode 100644 assets/fullstack_docker_install-configure.md.76I1Z0j-.lean.js create mode 100644 assets/fullstack_docker_network.md.k3FDmQ9F.js create mode 100644 assets/fullstack_docker_network.md.k3FDmQ9F.lean.js create mode 100644 assets/fullstack_docker_npm-repository.md.9jm80i0a.js create mode 100644 assets/fullstack_docker_npm-repository.md.9jm80i0a.lean.js create mode 100644 assets/fullstack_docker_volume-store.md.qcpOQfjk.js create mode 100644 assets/fullstack_docker_volume-store.md.qcpOQfjk.lean.js create mode 100644 assets/fullstack_gitlab_gitlab-pipeline.md.e1alnaT7.js create mode 100644 assets/fullstack_gitlab_gitlab-pipeline.md.e1alnaT7.lean.js create mode 100644 assets/fullstack_gitlab_gitlab-runner-install-configure.md.VVSd4_S0.js create mode 100644 assets/fullstack_gitlab_gitlab-runner-install-configure.md.VVSd4_S0.lean.js create mode 100644 assets/fullstack_gitlab_install-configure.md.RtybrUAQ.js create mode 100644 assets/fullstack_gitlab_install-configure.md.RtybrUAQ.lean.js create mode 100644 assets/fullstack_gitlab_npm-repository.md.0Y5cfoTu.js create mode 100644 assets/fullstack_gitlab_npm-repository.md.0Y5cfoTu.lean.js create mode 100644 assets/fullstack_k8s_base.md.dtBawEqz.js create mode 100644 assets/fullstack_k8s_base.md.dtBawEqz.lean.js create mode 100644 assets/fullstack_k8s_install.md.vfL3WVw3.js create mode 100644 assets/fullstack_k8s_install.md.vfL3WVw3.lean.js create mode 100644 assets/index.md.x6ZltWo2.js create mode 100644 assets/index.md.x6ZltWo2.lean.js create mode 100644 assets/inter-italic-cyrillic-ext.OVycGSDq.woff2 create mode 100644 assets/inter-italic-cyrillic.-nLMcIwj.woff2 create mode 100644 assets/inter-italic-greek-ext.hznxWNZO.woff2 create mode 100644 assets/inter-italic-greek.PSfer2Kc.woff2 create mode 100644 assets/inter-italic-latin-ext.RnFly65-.woff2 create mode 100644 assets/inter-italic-latin.27E69YJn.woff2 create mode 100644 assets/inter-italic-vietnamese.xzQHe1q1.woff2 create mode 100644 assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2 create mode 100644 assets/inter-roman-cyrillic.jIZ9REo5.woff2 create mode 100644 assets/inter-roman-greek-ext.9JiNzaSO.woff2 create mode 100644 assets/inter-roman-greek.Cb5wWeGA.woff2 create mode 100644 assets/inter-roman-latin-ext.GZWE-KO4.woff2 create mode 100644 assets/inter-roman-latin.bvIUbFQP.woff2 create mode 100644 assets/inter-roman-vietnamese.paY3CzEB.woff2 create mode 100644 assets/me.md.ZKkPBK0C.js create mode 100644 assets/me.md.ZKkPBK0C.lean.js create mode 100644 assets/style.R4pHl7s5.css create mode 100644 assets/super-nav_index.md.yGU0kMmW.js create mode 100644 assets/super-nav_index.md.yGU0kMmW.lean.js create mode 100644 assets/talk_2023_dad-foot-injured.md.HmqqvJLL.js create mode 100644 assets/talk_2023_dad-foot-injured.md.HmqqvJLL.lean.js create mode 100644 assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.js create mode 100644 assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.lean.js create mode 100644 assets/talk_2023_love-4th-anniversary.md.yJuD2XUO.js create mode 100644 assets/talk_2023_love-4th-anniversary.md.yJuD2XUO.lean.js create mode 100644 assets/talk_2023_second-covid.md.W7G-R6cY.js create mode 100644 assets/talk_2023_second-covid.md.W7G-R6cY.lean.js create mode 100644 assets/talk_base.md.GzyzggUv.js create mode 100644 assets/talk_base.md.GzyzggUv.lean.js create mode 100644 favicon.ico create mode 100644 frontend/babel/babel-analysis.html create mode 100644 frontend/babel/babel-plugin-guide.html create mode 100644 frontend/babel/base.html create mode 100644 frontend/base.html create mode 100644 frontend/browser/base.html create mode 100644 frontend/building-tool/base.html create mode 100644 frontend/canvas/base.html create mode 100644 frontend/canvas/magic-effects.html create mode 100644 frontend/cli/index.html create mode 100644 frontend/compiler/index.html create mode 100644 frontend/computer-network/arp-protocol.html create mode 100644 frontend/computer-network/base.html create mode 100644 frontend/computer-network/http-protocol.html create mode 100644 frontend/computer-network/ip-protocol.html create mode 100644 frontend/computer-network/tcp-protocol.html create mode 100644 frontend/debug-skill/base.html create mode 100644 frontend/debug-skill/charles.html create mode 100644 frontend/debug-skill/chrome.html create mode 100644 frontend/debug-skill/fiddler.html create mode 100644 frontend/debug-skill/h5.html create mode 100644 frontend/debug-skill/vscode.html create mode 100644 frontend/debug-skill/wireshark.html create mode 100644 frontend/desktop-app/index.html create mode 100644 frontend/editor/index.html create mode 100644 frontend/flutter/base.html create mode 100644 frontend/hybrid-app/base.html create mode 100644 frontend/js/async.html create mode 100644 frontend/js/audio.html create mode 100644 frontend/js/base.html create mode 100644 frontend/js/binary.html create mode 100644 frontend/js/eventloop.html create mode 100644 frontend/js/implicit-conversion.html create mode 100644 frontend/js/js-gc.html create mode 100644 frontend/js/meta-coding.html create mode 100644 frontend/js/proto-inherit.html create mode 100644 frontend/js/scope-closure.html create mode 100644 frontend/lowcoding/base.html create mode 100644 frontend/micro-frontend/base.html create mode 100644 frontend/micro-program/index.html create mode 100644 frontend/monitor/base.html create mode 100644 frontend/nestjs/base.html create mode 100644 frontend/nestjs/mvc.html create mode 100644 frontend/nestjs/swagger.html create mode 100644 frontend/nestjs/useful.html create mode 100644 frontend/nginx/base.html create mode 100644 frontend/node-bff/index.html create mode 100644 frontend/node-optimize/index.html create mode 100644 frontend/node/base.html create mode 100644 frontend/node/node-debug.html create mode 100644 frontend/node/node-framework.html create mode 100644 frontend/node/node-measure.html create mode 100644 frontend/node/node-process.html create mode 100644 frontend/node/node-web.html create mode 100644 frontend/npm/index.html create mode 100644 frontend/pattern/base.html create mode 100644 frontend/performance/base.html create mode 100644 frontend/performance/cache-perf.html create mode 100644 frontend/performance/cache.html create mode 100644 frontend/performance/chunk-upload.html create mode 100644 frontend/performance/load-perf.html create mode 100644 frontend/performance/network-perf.html create mode 100644 frontend/performance/node-score.html create mode 100644 frontend/performance/performance.html create mode 100644 frontend/performance/range-download.html create mode 100644 frontend/performance/secure-perf.html create mode 100644 frontend/performance/seo.html create mode 100644 frontend/performance/virtual-scroll-1.html create mode 100644 frontend/performance/virtual-scroll-2.html create mode 100644 frontend/performance/web-score.html create mode 100644 frontend/project-integration/base.html create mode 100644 frontend/project-integration/build-tool.html create mode 100644 frontend/project-integration/choose-editor.html create mode 100644 frontend/project-integration/ci-pipeline.html create mode 100644 frontend/project-integration/debugger-skill.html create mode 100644 frontend/project-integration/deploy-specification.html create mode 100644 frontend/project-integration/framework.html create mode 100644 frontend/project-integration/git-commit.html create mode 100644 frontend/project-integration/monorepo.html create mode 100644 frontend/project-integration/specification.html create mode 100644 frontend/project-integration/style.html create mode 100644 frontend/project-integration/test-framework.html create mode 100644 frontend/react/index.html create mode 100644 frontend/regexp/base.html create mode 100644 frontend/render-mode/base.html create mode 100644 frontend/sandbox/index.html create mode 100644 frontend/ts/base.html create mode 100644 frontend/ts/ts-configure.html create mode 100644 frontend/visual/index.html create mode 100644 frontend/vue/component-render.html create mode 100644 frontend/vue/computed-watch.html create mode 100644 frontend/vue/pinia.html create mode 100644 frontend/vue/reactivity.html create mode 100644 frontend/vue/router.html create mode 100644 frontend/vue/slot.html create mode 100644 frontend/vue/template-compiler.html create mode 100644 frontend/vue/transition.html create mode 100644 frontend/vue/update-process.html create mode 100644 frontend/vue/vuex.html create mode 100644 frontend/wasm/base.html create mode 100644 frontend/webpack/base.html create mode 100644 frontend/webpack/webpack-analysis.html create mode 100644 frontend/webpack/webpack-loader.html create mode 100644 frontend/webpack/webpack-node.html create mode 100644 frontend/webpack/webpack-plugin.html create mode 100644 fullstack/base.html create mode 100644 fullstack/docker/base-tutorial.html create mode 100644 fullstack/docker/docker-compose.html create mode 100644 fullstack/docker/docker-repository.html create mode 100644 fullstack/docker/dockerfile.html create mode 100644 fullstack/docker/install-configure.html create mode 100644 fullstack/docker/network.html create mode 100644 fullstack/docker/npm-repository.html create mode 100644 fullstack/docker/volume-store.html create mode 100644 fullstack/gitlab/gitlab-pipeline.html create mode 100644 fullstack/gitlab/gitlab-runner-install-configure.html create mode 100644 fullstack/gitlab/install-configure.html create mode 100644 fullstack/gitlab/npm-repository.html create mode 100644 fullstack/k8s/base.html create mode 100644 fullstack/k8s/install.html create mode 100644 hashmap.json create mode 100644 index.html create mode 100644 logo.png create mode 100644 manifest.json create mode 100644 me.html create mode 100644 media/senbonzakura.mp3 create mode 100644 pwa-worker.js create mode 100644 robots.txt create mode 100644 sitemap.txt create mode 100644 super-nav/index.html create mode 100644 talk/2023/dad-foot-injured.html create mode 100644 talk/2023/lose-qoo-job.html create mode 100644 talk/2023/love-4th-anniversary.html create mode 100644 talk/2023/second-covid.html create mode 100644 talk/base.html diff --git a/404.html b/404.html new file mode 100644 index 000000000..39fe56d2b --- /dev/null +++ b/404.html @@ -0,0 +1,53 @@ + + + + + + 404 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..1f2ee2136 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +blog.usword.cn diff --git a/README.md b/README.md new file mode 100644 index 000000000..83a594149 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +
+ + +
+
+ +

+ + + + + + +

+

hengshuai's blog

+
+ +Hi everyone, nice to meet you here! :wave: + +大家好,我叫卫恒帅,一位专注于web前端开发的工程师,这是我的博客系统,很高兴在这里见到你,在这里我会对于常见前端技术经验进行分享,除了前端也会涉及相关的后端、运维知识,偶尔也会发发相关的文章。目前在深圳就职于[QooApp](https://www.qoo-app.com),欢迎交流。 + +关于本博客已有好久的历史,不过旧博客都是自己从零搭建的前后端分离项目,随着服务器到期和成本的考虑,决定转换成用静态博客来部署,旧博客数据正在迁移到当前博客。 + +## 在线阅读/Read online +[https://blog.usword.cn](https://blog.usword.cn) + +## 内容结构 +``` +blog +├── article # 技术文章 +├── frontend # 前端 +├── fullstack # 全栈 +├── index.md # 主页 +├── me # 关于我 +└── talk # 杂谈 +``` +本博客的大体划分表现在顶部导航栏上,主要包括:前端、全栈、文章、杂谈等,内容涉及到前端的学习路线、算法、框架及核心知识原理(当然前端的知识是最多的),全栈知识如Java、应用部署、CICD、docker、k8s,除此之外还会分享一些平时归纳的文章、项目实战等等,偶尔也会写生活文章发发牢骚:laughing:,如果你感兴趣的话就把我放到收藏夹吧:briefcase:! + +为方便大家阅读,博客整体结构清晰,非常方便。对于海量数据你可以通过导航栏的搜索进行过滤,直达你最中意的内容! + +本人也是一位和大家一样正在不断努力学习的同学,内容都是以平时的积累和自己的见解作为基础的,文章难免会有一些疏漏或者错误之处,如有发现有不对或需改进的地方,非常欢迎大家[提供issue](https://github.com/ihengshuai/blog/issues),我会及时查看进行修改的,感谢各位:pray: + +>本博客中的一些链接可能需要科学上网才能访问哦 + +## 贡献 +关于贡献内容,你可以fork本篇博客,本地跑起,或直接修改对应的文章,修改完后,发个pull request请求即可,我会及时处理的 + +Regarding the content of contribution, you can fork this blog, running locally, or directly modify the corresponding article. After the modification, you can send a Pull Request request. I will deal with it in time. + +## 转载须知 +本博客文章允许大家转载,需要注明出处并提供源文章链接,对于标注不允许转载的,请联系本人。 + +## 打赏 +如果你觉得本博客对你有帮助,不介意的话打赏一杯咖啡,鼓励作者不断分享技术文章,在此感谢!:thumbsup: + +If you think this blog is helpful to you, if you don't mind, enjoy a cup of coffee, encourage the author to continue to share technical articles, thank you here! + +
+ + +
+ +## 联系 +若您愿意深度交流,可以扫描下方二维码关注公众号,输入联系作者会得到我的微信二维码,就可以加我了。有需要的话,我会考虑建个微信交流群,大家一起来探讨技术。 +
+ hengshuai公众号 +
+ +## 版权 +Copyright 2019-present HengShuai ([ihengshuai@mail.com](mailto:wsm_1105@163.com)) + +知识共享 署名-非商业性使用-相同方式共享 4.0(CC BY-NC-SA 4.0),详情见 [LICENSE](/LICENSE) 文件。 \ No newline at end of file diff --git a/article/2019/bind-call-apply.html b/article/2019/bind-call-apply.html new file mode 100644 index 000000000..1e7347ce9 --- /dev/null +++ b/article/2019/bind-call-apply.html @@ -0,0 +1,114 @@ + + + + + + 使用bind、call、apply改变this指向 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

bind、call、apply使用技巧

介绍与使用方法

js
// call
+fn.call(thisArg[, arg1[, arg2[, arg3]]])
+// apply
+fn.apply(thisArg, [argsArray])
+// bind
+fn.bind(thisArg[, arg1[, arg2[, arg3]]])()

apply介绍

语法:

fun.apply(thisArg, [argsArray])

  • thisArg:在 fun 函数运行时指定的 this 值。需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
  • argsArray:一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun 函数。如果该参数的值为null 或 undefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。浏览器兼容性请参阅本文底部内容。

示例:

js
var a ={
+    name : "Cherry",
+    fn : function (a,b) {
+        console.log( a + b)
+    }
+}
+var b = a.fn;
+b.apply(a,[1,2])     // 3

call介绍

语法:

fun.call(thisArg[, arg1[, arg2[, ...]]])

  • call的参数是thisArg,thisArg代表若干个参数列表

示例:

js
var a ={
+    name : "Cherry",
+    fn : function (a,b) {
+        console.log( a + b)
+    }
+}
+var b = a.fn;
+b.call(a,1,2)       // 3

bind介绍

语法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])()

  • bind的参数是thisArg,thisArg代表若干个参数列表
  • bind改变this指向返回的是function需要手动调用

示例:

js
var a ={
+    name : "Cherry",
+    fn : function (a,b) {
+        console.log( a + b)
+    }
+}
+var b = a.fn;
+b.bind(a,1,2)()           // 3

三者区别

apply和call基本上相似,他们的区别只是传入的参数不同

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

手写call,apply,bind

下面我们来简单的实现一下这三者

手写call

js
Function.prototype.mycall = function(context){
+    if(typeof this !== 'function'){
+        throw new TypeError('Error')
+    }
+    context = context || window
+    context.fn = this
+    const args = [...argrments].slice(1)
+    let result = context.fn(...args)
+    delete context.fn
+    return result
+}

解析:

  • 首先 context 为可选参数,如果不传的话默认上下文为 window
  • 接下来给 context 创建一个 fn 属性,并将值设置为需要调用的函数
  • 因为 call 可以传入多个参数作为调用函数的参数,所以需要将参数剥离出来
  • 然后调用函数并将对象上的函数删除

手写apply

js
Function.prototype.myapply = function(context) {
+    if(typeof this !== 'function'){
+        throw new TypeError('Error')
+    }
+    context = context || window
+    context.fn = this
+    let result
+    arguments[1] ? result = context.fn(...arguments[1]) : context.fn()
+    delete context.fn
+    return result
+}

解析: 同上(基本相似)

手写bind

js
Function.prototype.mybind = function(context) {
+    if(typeof this !== 'function'){
+        throw new TypeError('Error')
+    }
+    const args = [...arguments].slice(1)
+    const _this = this
+    return function F(){
+        if(this instanceof F){
+            return new _this(...args, ...arguments)
+        }
+        return _this.apply(context, args.concat(...arguments))
+    }
+}

解析:

  • 前几步和之前的实现差不多,就不赘述了
  • bind 返回了一个函数,对于函数来说有两种方式调用,一种是直接调用,一种是通过 new 的方式,我们先来说直接调用的方式
  • 对于直接调用来说,这里选择了 apply 的方式实现,但是对于参数需要注意以下情况:因为 bind 可以实现类似这样的代码 f.bind(obj, 1)(2),所以我们需要将两边的参数拼接起来,于是就有了这样的实现 args.concat(...arguments)
  • 最后来说通过 new 的方式,在之前的章节中我们学习过如何判断 this,对于 new 的情况来说,不会被任何方式改变 this,所以对于这种情况我们需要忽略传入的 this

最后

希望以上的解析还可以帮助你进一步理解三者的概念和使用方法,手写的实现方法可能会有一些小问题,你可以进行补充,如果你喜欢本篇文章,动动小手分享出去,关注GitHub更多优质项目等你来开箱😄

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2019/css-center.html b/article/2019/css-center.html new file mode 100644 index 000000000..d3bf3cc13 --- /dev/null +++ b/article/2019/css-center.html @@ -0,0 +1,208 @@ + + + + + + css的10中居中方式 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

css的10中居中方式

要实现上图的效果看似很简单,实则暗藏玄机,本文总结了一下CSS实现水平垂直居中的方式大概有下面这些,本文将逐一介绍一下 仅居中元素定宽高适用

  • absolute + 负margin
  • absolute + margin auto
  • absolute + calc

居中元素不定宽高

  • absolute + transform
  • lineheight
  • writing-mode
  • table
  • css-table
  • flex
  • grid

absolute + 负margin

为了实现上面的效果先来做些准备工作,假设HTML代码如下,总共两个元素,父元素和子元素

html
<div class="wp">
+    <div class="box size">123123</div>
+</div>

wp是父元素的类名,box是子元素的类名,因为有定宽和不定宽的区别,size用来表示指定宽度,下面是所有效果都要用到的公共代码,主要是设置颜色和宽高

后面不在重复这段公共代码,只会给出相应提示

css
/* 公共代码 */
+.wp {
+    border: 1px solid red;
+    width: 300px;
+    height: 300px;
+}
+.box {
+    background: green;    
+}
+.box.size{
+    width: 100px;
+    height: 100px;
+}
+/* 公共代码 */

绝对定位的百分比是相对于父元素的宽高,通过这个特性可以让子元素的居中显示,但绝对定位是基于子元素的左上角,期望的效果是子元素的中心居中显示

为了修正这个问题,可以借助外边距的负值,负的外边距可以让元素向相反方向定位,通过指定子元素的外边距为子元素宽度一半的负值,就可以让子元素居中了,css代码如下

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    position: relative;
+}
+.box {
+    position: absolute;;
+    top: 50%;
+    left: 50%;
+    margin-left: -50px;
+    margin-top: -50px;
+}

这是我比较常用的方式,这种方式比较好理解,兼容性也很好,缺点是需要知道子元素的宽高

absolute + margin auto

这种方式也要求居中元素的宽高必须固定,HTML代码如下

css
<div class="wp">
+    <div class="box size">123123</div>
+</div>

这种方式通过设置各个方向的距离都是0,此时再讲margin设为auto,就可以在各个方向上居中了

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    position: relative;
+}
+.box {
+    position: absolute;;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+}

这种方法兼容性也很好,缺点是需要知道子元素的宽高

absolute + calc

这种方式也要求居中元素的宽高必须固定,所以我们为box增加size类,HTML代码如下

html
<div class="wp">
+    <div class="box size">123123</div>
+</div>

感谢css3带来了计算属性,既然top的百分比是基于元素的左上角,那么在减去宽度的一半就好了,代码如下

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    position: relative;
+}
+.box {
+    position: absolute;;
+    top: calc(50% - 50px);
+    left: calc(50% - 50px);
+}

这种方法兼容性依赖calc的兼容性,缺点是需要知道子元素的宽高

absolute + transform

还是绝对定位,但这个方法不需要子元素固定宽高,所以不再需要size类了,HTML代码如下

html
<div class="wp">
+    <div class="box">123123</div>
+</div>

修复绝对定位的问题,还可以使用css3新增的transform,transform的translate属性也可以设置百分比,其是相对于自身的宽和高,所以可以讲translate设置为-50%,就可以做到居中了,代码如下

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    position: relative;
+}
+.box {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+}

这种方法兼容性依赖translate2d的兼容性

lineheight

利用行内元素居中属性也可以做到水平垂直居中,HTML代码如下

html
<div class="wp">
+    <div class="box">123123</div>
+</div>

把box设置为行内元素,通过text-align就可以做到水平居中,但很多同学可能不知道通过通过vertical-align也可以在垂直方向做到居中,代码如下

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    line-height: 300px;
+    text-align: center;
+    font-size: 0px;
+}
+.box {
+    font-size: 16px;
+    display: inline-block;
+    vertical-align: middle;
+    line-height: initial;
+    text-align: left; /* 修正文字 */
+}

这种方法需要在子元素中将文字显示重置为想要的效果

writing-mode

很多同学一定和我一样不知道writing-mode属性,感谢@张鑫旭老师的反馈,简单来说writing-mode可以改变文字的显示方向,比如可以通过writing-mode让文字的显示变为垂直方向

html
<div class="div1">水平方向</div>
+<div class="div2">垂直方向</div>
+.div2 {
+    writing-mode: vertical-lr;
+}

更神奇的是所有水平方向上的css属性,都会变为垂直方向上的属性,比如text-align,通过writing-modetext-align就可以做到水平和垂直方向的居中了,只不过要稍微麻烦一点

html
<div class="wp">
+    <div class="wp-inner">
+        <div class="box">123123</div>
+    </div>
+</div>
css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    writing-mode: vertical-lr;
+    text-align: center;
+}
+.wp-inner {
+    writing-mode: horizontal-tb;
+    display: inline-block;
+    text-align: center;
+    width: 100%;
+}
+.box {
+    display: inline-block;
+    margin: auto;
+    text-align: left;
+}

这种方法实现起来和理解起来都稍微有些复杂

table

曾经table被用来做页面布局,现在没人这么做了,但table也能够实现水平垂直居中,但是会增加很多冗余代码

html
<table>
+    <tbody>
+        <tr>
+            <td class="wp">
+                <div class="box">123123</div>
+            </td>
+        </tr>
+    </tbody>
+</table>

tabel单元格中的内容天然就是垂直居中的,只要添加一个水平居中属性就好了

css
.wp {
+    text-align: center;
+}
+.box {
+    display: inline-block;
+}

这种方法就是代码太冗余,而且也不是table的正确用法

css-table

css新增的table属性,可以让我们把普通元素,变为table元素的现实效果,通过这个特性也可以实现水平垂直居中

html
<div class="wp">
+    <div class="box">123123</div>
+</div>

下面通过css属性,可以让div显示的和table一样

css
.wp {
+    display: table-cell;
+    text-align: center;
+    vertical-align: middle;
+}
+.box {
+    display: inline-block;
+}

这种方法和table一样的原理,但却没有那么多冗余代码,兼容性也还不错

flex

flex作为现代的布局方案,颠覆了过去的经验,只需几行代码就可以优雅的做到水平垂直居中

html
<div class="wp">
+    <div class="box">123123</div>
+</div>
css
.wp {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}

目前在移动端已经完全可以使用flex了,PC端需要看自己业务的兼容性情况

grid

感谢@一丝姐 反馈的这个方案,css新出的网格布局,由于兼容性不太好,一直没太关注,通过grid也可以实现水平垂直居中

html
<div class="wp">
+    <div class="box">123123</div>
+</div>
css
.wp {
+    display: grid;
+}
+.box {
+    align-self: center;
+    justify-self: center;
+}

代码量也很少,但兼容性不如flex,不推荐使用

总结

下面对比下各个方式的优缺点,肯定又双叒叕该有同学说回字的写法了,简单总结下

  • PC端有兼容性要求,宽高固定,推荐absolute + 负margin
  • PC端有兼容要求,宽高不固定,推荐css-table
  • PC端无兼容性要求,推荐flex
  • 移动端推荐使用flex
方法居中元素定宽高固定PC兼容性移动端兼容性
absolute + 负marginie6+, chrome4+, firefox2+安卓2.3+, iOS6+
absolute + margin autoie6+, chrome4+, firefox2+安卓2.3+, iOS6+
absolute + calcie9+, chrome19+, firefox4+安卓4.4+, iOS6+
absolute + transformie9+, chrome4+, firefox3.5+安卓3+, iOS6+
writing-modeie6+, chrome4+, firefox3.5+安卓2.3+, iOS5.1+
lineheightie6+, chrome4+, firefox2+安卓2.3+, iOS6+
tableie6+, chrome4+, firefox2+安卓2.3+, iOS6+
css-tableie8+, chrome4+, firefox2+安卓2.3+, iOS6+
flexie10+, chrome4+, firefox2+安卓2.3+, iOS6+
gridie10+, chrome57+, firefox52+安卓6+, iOS10.3+

最近发现很多同学都对css不够重视,这其实是不正确的,比如下面的这么简单的问题都有那么多同学不会,我也是很无语

html
<div class="red blue">123</div>
+<div class="blue red">123</div>
+.red {
+    color: red
+}
+
+.blue {
+    color: blue
+}

问两个div的颜色分别是什么,竟然只有40%的同学能够答对,这40%中还有很多同学不知道为什么,希望这些同学好好补习下CSS基础

原文链接

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2019/js-copy.html b/article/2019/js-copy.html new file mode 100644 index 000000000..66e993222 --- /dev/null +++ b/article/2019/js-copy.html @@ -0,0 +1,187 @@ + + + + + + JS的深拷贝和浅拷贝 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

JS的深浅拷贝

数据类型

数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。

  • 基本数据类型的特点:直接存储在栈(stack)中的数据
  • 引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里

引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

浅拷贝与深拷贝

深拷贝和浅拷贝是只针对 Object 和 Array 这样的引用数据类型的

深拷贝和浅拷贝的示意图大致如下:

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

赋值和浅拷贝的区别

  1. 当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
  1. 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

我们先来看两个例子,对比赋值与浅拷贝会对原对象带来哪些改变?

js
// 对象赋值
+var obj1 = {
+  name: "zhangsan",
+  age: "18",
+  language: [1, [2, 3], [4, 5]]
+};
+var obj2 = obj1;
+obj2.name = "lisi";
+obj2.language[1] = ["", ""];
+console.log("obj1", obj1);
+console.log("obj2", obj2);

js
// 浅拷贝
+var obj1 = {
+  name: "zhangsan",
+  age: "18",
+  language: [1, [2, 3], [4, 5]]
+};
+var obj3 = shallowCopy(obj1);
+obj3.name = "lisi";
+obj3.language[1] = ["", ""];
+function shallowCopy(src) {
+  var dst = {};
+  for (var prop in src) {
+    if (src.hasOwnProperty(prop)) {
+      dst[prop] = src[prop];
+    }
+  }
+  return dst;
+}
+console.log("obj1", obj1);
+console.log("obj3", obj3);

上面例子中,obj1 是原始数据,obj2 是赋值操作得到,而 obj3 浅拷贝得到。我们可以很清晰看到对原始数据的影响,具体请看下表:

/和原数据是否指向同一个对象第一层数据为基本数据类型原数据中包含子对象
赋值改变会使原数据一同改变改变会使原数据一同改变
浅拷贝改变不会使原数据一同改变改变会使原数据一同改变
深拷贝改变不会使原数据一同改变改变不会使原数据一同改变

浅拷贝的实现方式

1.Object.assign()

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign()进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

js
var obj = { a: { a: "kobe", b: 39 } };
+var initalObj = Object.assign({}, obj);
+initalObj.a.a = "wade";
+console.log(obj.a.a); //wade

当 object 只有一层的时候,是深拷贝

js
let obj = {
+  username: "kobe"
+};
+let obj2 = Object.assign({}, obj);
+obj2.username = "wade";
+console.log(obj); //{username: "kobe"}

2.Array.prototype.concat()

js
let arr = [
+  1,
+  3,
+  {
+    username: "kobe"
+  }
+];
+let arr2 = arr.concat();
+arr2[2].username = "wade";
+console.log(arr);

修改新对象会改到原对象:

3.Array.prototype.slice()

js
let arr = [
+  1,
+  3,
+  {
+    username: " kobe"
+  }
+];
+let arr3 = arr.slice();
+arr3[2].username = "wade";
+console.log(arr);

同样修改新对象会改到原对象:

Array 的 slice 和 concat 方法不修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。

原数组的元素会按照下述规则拷贝:

  • 如果该元素是个对象引用(不是实际的对象),slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
  • 对于字符串、数字及布尔值来说(不是 String、Number 或者 Boolean 对象),slice 会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。

可能这段话晦涩难懂,我们举个例子,将上面的例子小作修改:

js
let arr = [
+  1,
+  3,
+  {
+    username: " kobe"
+  }
+];
+let arr3 = arr.slice();
+arr3[1] = 2;
+console.log(arr, arr3);

深拷贝的实现方式

1.JSON.parse(JSON.stringify())

js
let arr = [
+  1,
+  3,
+  {
+    username: " kobe"
+  }
+];
+let arr4 = JSON.parse(JSON.stringify(arr));
+arr4[2].username = "duncan";
+console.log(arr, arr4);

原理: 用 JSON.stringify 将对象转成 JSON 字符串,再用 JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。

这种方法虽然可以实现数组或对象深拷贝,但不能处理函数

js
let arr = [
+  1,
+  3,
+  {
+    username: " kobe"
+  },
+  function() {}
+];
+let arr4 = JSON.parse(JSON.stringify(arr));
+arr4[2].username = "duncan";
+console.log(arr, arr4);

这是因为 JSON.stringify() 方法是将一个 JavaScript 值(对象或者数组)转换为一个 JSON 字符串,不能接受函数

2.手写递归方法

递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝

ts
function deepCopy(from: any, map: any = new Map()) {
+  const isObject = (obj: any): obj is Object =>
+    Object.prototype.toString.call(obj) === "[object Object]" ||
+    Object.prototype.toString.call(obj) === "[object Array]";
+
+  if (!isObject(from)) return from;
+  let res: any = Array.isArray(from) ? [] : {};
+
+  // 有缓存时不用递归,解决循环引用问题
+  if (map.get(from)) res = map.get(from);
+  else {
+    // 缓存当前对象
+    map.set(from, res);
+    for (const key of [
+      ...Object.keys(from),
+      ...Object.getOwnPropertySymbols(from),
+    ]) {
+      const val = from[key];
+      if (isObject(val)) {
+        res[key] = deepCopy(val, map);
+      } else {
+        res[key] = val;
+      }
+    }
+  }
+  return res;
+}

测试:

js
let a = {
+  age: 11,
+  arr: [1, 2, 3],
+  say: function() {},
+  m: Symbol(1)
+};
+const b = deepCopy(a)
+b.age = 12
+b.arr[1] = 4
+b.m = Symbol(2)
+console.log("a", a)
+console.log("b", b)
+// 输出
+a { age: 11, arr: [ 1, 2, 3 ], say: [Function: say], m: Symbol(1) }
+b { age: 12, arr: [ 1, 4, 3 ], say: [Function: say], m: Symbol(2) }

从上面可以看出,改变b的值,a没有发生变化

函数库lodash

该函数库也有提供_.cloneDeep用来做 Deep Copy

js
var _ = require('lodash');
+var obj1 = {
+    a: 1,
+    b: { f: { g: 1 } },
+    c: [1, 2, 3]
+};
+var obj2 = _.cloneDeep(obj1);
+console.log(obj1.b.f === obj2.b.f);
+// false

总结

本篇主要讲了深拷贝和浅拷贝的特点,以及如何实现它们,并介绍了一些注意点。

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2019/js-type-transfer.html b/article/2019/js-type-transfer.html new file mode 100644 index 000000000..5686baf72 --- /dev/null +++ b/article/2019/js-type-transfer.html @@ -0,0 +1,230 @@ + + + + + + JS类型隐式转换与装箱拆箱 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

JS类型隐式转换与装箱拆箱

如果你写过大多数强类型语言如Java对数据的类型一定不会陌生,如定义两个变量:int num = 1boolean bool = false,比较两个变量是否相等时结果很明显时false(不同类型直接会报错),类型不同的变量永远不会相等。由于JS被定位成动态弱类型语言,其往往会颠覆你的认知。

JS引擎往往会最大限度的降低程序的错误,假如你会写num = 1;num.name=xxx这种很明显的错误,但当你运行时却不会报错,这里就涉及到了装箱和拆箱;还有1 == true; 1 == [1]你会发现竟然结果都为true,如果你不了解JS内部的装箱、拆箱和类型的隐式转换规则,这些可能都会让你产生困惑,如果你有这些疑惑,接着看下面的内容吧。

注:如遇到有一些链接无法访问可能需要科学上网

装箱与拆箱

什么是装箱和拆箱?JS中有stringnumberboolean基础类型,它们都有对应的包装类型(引用类型)StringNumberBoolean装箱就是将基础类型转换为对应的包装类型,而拆箱则将包装类型转换为对应的基础类型。

如果你对拆箱操作不了解,将会影响你对隐式转换的理解。

装箱

装箱可以通过显式new进行装箱,JS引擎也可以隐式装箱,下面就来了解下两种不同的装箱操作。

  1. 显式装箱
js
// string
+str = new Object('str')
+str = new String('str')
+
+// boolean
+bool = new Object(true)
+bool = new Boolean(true)
+
+// number
+num = new Object(1)
+num = new Number(1)
  1. 隐式装箱
js
name = 'js'
+// 例1
+name.toUpperCase(); // JS
+
+// 例2
+name.age = 1; // 自动装箱 => name = new String('js') => name.age = 1 => 下一行前销毁当前对象
+console.log(name.age); // undefined

上面隐式装箱name是个基础类型,基础类型不会有属性的,但却拥有toUpperCase方法,其本质还是String对象的方法,当执行此方法时会隐式的将name转换为对象name => new String(name),然后就会拥有对应的方法;而给其设置age属性后重新获取却为undefined,这里JS引擎就处理了错误的赋值操作,也会将name转换为new String(name)然后在执行下一行前又会销毁此对象,可以理解为当前对象就是来为赋值操作服务的。

拆箱

拆箱则是将包装类型转化为对应的基础类型,通过执行valueOf方法可以得到它的原始值:

js
num = new Number(123); // Number {123}
+typeof num; // object
+num.valueOf(); // 123
+
+bool = new Object(true); // Boolean {true}
+typeof booll; // object
+bool.valueOf(); // true

除了执行valueOftoString方法也可以将包装类型转换为基础类型字符串形式,其实除了以上几个包装类型拆箱,其他的引用类型也会根据一定的规则进行转换,下面就来一起看看。

toPrimitive、 OrdinaryToPrimitive

对于引用类型在特殊条件下都会转换为基础类型,其拆箱都会遵循【toPrimitive规则】

JS引擎內部toPrimitive的签名如下:input是待转换的对象,perferedType为转换的类型,有string/number两种

ts
toPrimitive(input, perferedType);
+
+// 1. If input is an Object, then
+//   a. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
+//   b. If exoticToPrim is not undefined, then
+//     i. If preferredType is not present, let hint be "default".
+//     ii. Else if preferredType is string, let hint be "string".
+//     iii. Else,
+//       1. Assert: preferredType is number.
+//       2. Let hint be "number".
+//     iv. Let result be ? Call(exoticToPrim, input, « hint »).
+//     v. If result is not an Object, return result.
+//     vi. Throw a TypeError exception.
+//   c. If preferredType is not present, let preferredType be number.
+//   d. Return ? OrdinaryToPrimitive(input, preferredType).
+// 2. Return input.

这里的toPrimitive属性其实就是Symbol.toPrimitive属性,其内部转换可以概括步骤如下(重点):

  1. 当进行类型转换时会首先判断有没有Symbol.toPromitive属性:
    • perferedTypestring时,返回string条件结果。
    • perferedTypenumber时返回number条件结果。
    • perferedType为空时,返回default条件结果。
    • 如果以上返回的结果不是基本类型时抛异常Cannot convert object to primitive value
  2. 如果没有Symbol.toPromitive属性,会执行内部的OrdinaryToPrimitive方法,此方法会根据优先级调用toStringvalueOf方法,其调用顺序如下:
    • 当指定转换类型为string时,会优先调用toString方法,若执行结果为基础类型则返回,否则执行valueOf方法,基本类型结果将会返回,否则将会抛异常。
    • 当指定转换类型为number时,会优先调用valueOf方法,若执行结果为基础类型则返回,否则执行toString方法,基本类型结果将会返回,否则将会抛异常。
    • 在不指定类型情况下,除了Date会优先执行toString方法,其余的都会优先执行valueOf方法,然后根据前两条规则执行。

OrdinaryToPrimitive签名如下:

ts
OrdinaryToPrimitive(O, hint);
+
+// 1. If hint is string, then
+//   a. Let methodNames be « "toString", "valueOf" ».
+// 2. Else,
+//   a. Let methodNames be « "valueOf", "toString" ».
+// 3. For each element name of methodNames, do
+//   a. Let method be ? Get(O, name).
+//   b. If IsCallable(method) is true, then
+//     i. Let result be ? Call(method, O).
+//     ii. If result is not an Object, return result.
+// 4. Throw a TypeError exception.

OrdinaryToPrimitive的执行也可以在源码(c代码JS代码)中找到,你可以在source.chromium.org中搜索对应的关键字OrdinaryToPrimitive,就可以找到。下面代码也证明了OrdinaryToPrimitive的执行的执行步骤

js
module.exports = function OrdinaryToPrimitive(O, hint) {
+  if (Type(O) !== 'Object') {
+    throw new $TypeError('Assertion failed: Type(O) is not Object');
+  }
+  if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
+    throw new $TypeError('Assertion failed: `hint` must be "string" or "number"');
+  }
+
+  var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
+
+  for (var i = 0; i < methodNames.length; i += 1) {
+    var name = methodNames[i];
+    var method = Get(O, name);
+    if (IsCallable(method)) {
+      var result = Call(method, O);
+      if (Type(result) !== 'Object') {
+        return result;
+      }
+    }
+  }
+
+  throw new $TypeError('No primitive value for ' + inspect(O));
+};

接下来通过下面的代码来证明以上总结的步骤,首先会执行Symbol.toPrimitive方法,没有则会执行OrdinaryToPrimitive的方法。

Symbol.toPrimitive证明

js
// 根据toPrimitive签名定义方法
+obj = {
+  [Symbol.toPrimitive](perferedType) {
+    if (perferedType === "number") return 1;
+    if (perferedType === "string") return "str";
+    return "default";
+  }
+}
+
+// 1. perferedType为string
+`${obj}`; // 'str'
+
+// 2. perferedType为number
++obj; // 1
+
+// 3. perferedType为 undefined
+'' + obj; // 'default'
+
+// 若返回的结果不是基础类型则抛异常,这里修改一个number返回对象
+obj = {
+  [Symbol.toPrimitive](perferedType) {
+    if (perferedType === "number") return [1,2,3];
+    if (perferedType === "string") return "str";
+    return "default";
+  }
+}
++obj; // Uncaught TypeError: Cannot convert object to primitive value

通过上面的代码再次证明了确实是以上的步骤,接下来看OrdinaryToPrimitive

OrdinaryToPrimitive证明

js
// 1. hint为string会先执行toString方法
+`${{valueOf: () => 1, toString: () => 2}}`; // '2'
+Array.prototype.toString = () => 'array';
+`${[1,2,3]}`; // 'array'
+
+// 2. hint为number会先执行valueOf方法
++({valueOf: () => 1, toString: () => 2}); // 1
+Array.prototype.valueOf = () => 2;
++[1,2,3]; // 2
+
+// 3.当不指定 hint 类型时,除Date类型其它会优先执行`valueOf`,然后执行`toString`,Date正好相反
+'' + ({valueOf: () => 1, toString: () => 2}); // '1'
+1 + ({valueOf: () => 1, toString: () => 2}); // 2
+'' + new Date(); // 'Thu Dec 01 2021 12:56:23 GMT+0800 (中国标准时间)'
+Date.prototype.toString = () => 'date'; // 修改Date的toString方法
+'' + new Date(); // date
+
+// 4.若某一个方法返回的不是基础类型,继续执行下一个方法,否则抛异常
+'' + ({valueOf: () => [1,2,3], toString: () => 2}); // 2 => 执行toSting
+Date.prototype.toString = () => [1,2,3]; // 修改Date的toString方法
+'' + new Date(); // '1609459200000' => 执行 valueOf
+'' + ({valueOf: () => [1,2,3], toString: () => []}); // Uncaught TypeError: Cannot convert object to primitive value

以上就是OrdinaryToPrimitive的执行步骤,其实valueOf执行结果更趋向于自己原本的值(除Date外),而toString一定会返回string类型,如:

js
// valueOf
+obj = { name: 1 };
+obj.valueOf(); // { name: 1 }
+(function(){}).valueOf(); // f(){}
+[1,2,3].valueOf(); // [1,2,3]
+new RegExp('^\d+','i').valueOf(); // /^d+/i
+
+// toString
+obj.toString(); // '[object Object]'
+[1,2,3].toString(); // '1,2,3'
+new RegExp('^\d+','i').toString(); // '/^d+/i'

通过上面的内容你应该对装箱与拆箱有了更深的认识,从拆箱中应该也看到了类型转换的影子(上面代码中12,13行高亮部分)'' + ({valueOf: () => 1, toString: () => 2}); // '1',返回的结果是个字符串1而不是数字,而1 + ({valueOf: () => 1, toString: () => 2}); // 2返回的却是数字2,两者只因相加位类型的不同结果也不同,这里就涉及到了类型的隐式转换,number => string的转换。

了解了对象转换为原始类型(拆箱)后,接下来就来看看类型隐式转换是如何运作的。

类型隐式转换

提示

如果你在类型隐式转换的阅读过程中产生的疑问过多,建议将装箱和拆箱的内容多读、多练几遍。

类型隐式转换可以归结为numberstringboolean等其它基础类型之间通过运算符==*、/、+、-或逻辑运算的转换。由于JS的弱类型特征,像==比较者可以为任意类型任意值,而===比较者的类型不同永远不会相等(1 == 11 === '1')。

其实转换者可以是基础类型和对象类型,但归根还是基础类型之间的转换,若转换者存在对象类型,会根据拆箱优先级进行拆箱转换为基础类型后,然后在根据类型隐式转换的规则进行转换。

这里列出一张不同类型转换表格,里面包含了不同类型转换到原始值或其它基础类型的规则,通常情况下记住这张表的转换规则就可以解决所有隐式转换的问题了(当然对象类型转换为基础类型要学会前面讲的拆箱规则)。

类型to Booleanto Numberto String
Booleantruetrue1'true'
Booleanfalsefalse0'false'
Number100true100'100'
NumberInfinitytrueInfinity'Infinity'
Number0false0'0'
NumberNaNfalseNaN'NaN'
String''false0''
String'100'true100'100'
String'100abc'trueNaN'100abc'
String'abc'trueNaN'abc'
Nullnullfalse0'null'
UndefinedundefinedfalseNaN'undefined'
Functionfunction(){}trueNaN'function(){}'
Object{}trueNaN'[object Object]'
Array[]true0''
Array['abc']trueNaN'abc'
Array['123']true123'123'
Array['123', 'abc']trueNaN'123,abc'
Datenew Datetrue数字(时间戳)'Wed Nov 16 2020 16:51:31 GMT+0800 (中国标准时间)'
SymbolSymbol('a')truethrow TypeErrorthrow TypeError

算术运算符转换

算术运算符主要包括+、-、*、/,除了+运算符外,其余算术运算符都针对的是数字number,也就是说运算双方都必须是或转换为数字,这个相对来说简单直接套上面的表格即可,而+运算符最为特殊,+不仅可以进行算术运算也可以进行字符串的拼接,同时也是最常见的隐式转换。

减乘除

参与双方若是基础类型都会转换为number类型,而一方为引用类型时会先进行内部拆箱转换成最兼容number类型的基本类型,下面用一段代码加深下印象:

  1. string转number
js
'1' - 1  // 0
+'1' * 1  // 0
+'1a' - 1  // NaN

这里'1'会涉及到string => number的转换,从上面的表格中得到转换值为1,而'1a'转换后并不能兼容数字所以是NaN

  1. boolean转number
js
true - 0  // 1
+true * 1  // 1
+false - 0  // 0

true转换为1,false转换为0。

  1. undefined、null转number
js
undefined - 1  // NaN
+null - 1  // -1
+null * 1  // 0

undefined转换为NaN,null转换为0。

  1. 对象类型转number
js
[] - 1  // -1
+[] * 1  // 0
+[1] - 1  // 0
+[1, 'a'] - 1  // NaN
+({}) - 1  // NaN
+new Date() - 1  // 1577836799999
+(function(){}) - 1  // NaN
+new RegExp('^\w+', 'i') - 1  // NaN

对象类型会根据OrdinaryToPrimitive拆箱规则进行转换为基础类型number类型,然后进行计算。

以上便是-、*、/运算符转换为number类型的规则,比较简单。

加运算

加法运算最为特殊同时也是类型转换最多的,不仅可以进行算术运算也可以进行字符串的拼接。其转换规则为:

  1. 若一方是string类型,则另一方也会转换为字符串,进行字符串的拼接
  2. 若一方为number类型,另一方为原始类型,将其转换为number类型,进行算术相加。
  3. 若一方为number类型,另一方为引用类型,将其拆箱转换为基本类型后,进行字符串的拼接。

以上转换规则优先级从高到低进行转换。

下面用几个例子演示这些规则:

转换规则1:

js
'' + 1 // '1'
+'' + true // 'true'
+'str' + undefined // 'strundefined'
+'' + null // 'null'
+'' + [] // ''
+'' + [1] // '1'
+'' + [1,2,3] // '1,2,3'
+'' + {name: 1} // '[object Object]'
+'' + (function(){}) // 'function(){}'

转换规则2:

js
1 + 1 // 2
+1 + true // 2
+1 + null // 1
+1 + undefined // NaN

转换规则3:

js
1 + [] // '1'
+1 + [1,2] // '11,2'
+1 + (function(){}) // '1function(){}'
+1 + ({}) // '1[objectObject]'
+1 + new Date() // '1Fri Dec 02 2020 11:40:48 GMT+0800 (中国标准时间)'
+1 + new RegExp('\s', 'ig') // '1/s/gi'

以上便是加法的隐式转换,根据上面三条规则的优先级进行转换,基础不同类型转换的值可以根据上面的表格进行判断,引用类型根据拆箱规则结合转换优先级即可。

逻辑运算转换

!运算转换

逻辑运算的转换常见的就是!==的转换,相对来说非常简单。一般像null、undefined、0、''、NaN、false等为false外,其余的都是true(如:[]、{}等等)。

js
!null // true
+!undefined // true
+!NaN // true
+![] // false
+!{} // false

==运算转换

==转换规则一般总结为一下五条:

  • NaN和任何其他类型(包括自己)比较值都是false。
  • Boolean和其他类型比较时,自己转化为Number类型然后进行比较.
  • NumberString类型比较,将String类型转换为Number类型后进行比较。
  • undefined除了和null比较结果为true外,其余的比较都是false。
  • 原始值和引用类型进行比较时,引用类型根据拆箱规则转换成基础类型后进行比较。
js
NaN == NaN // false
+NaN == 0 // false
+true == 2 // false  true => 1
+1 = '1' // true  '1' => 1
+undefined == null // true
+undefined == NaN // false
+null == false // false
+[1] == 1 // true  [1] => 1
+[1,2] == 1 // false  [1,2] => '1,2'

到这里基本上学会了以上的内容,隐式转换就可以搞懂了,其实也没什么难度,把这些转换概念摸清楚就可以游刃有余。

问题

有些同学可能看到这里,还没有完全掌握,这里就提供几个小菜,提供给大家练习,看和你的想法一直不,如果一直可以说清楚具体逻辑不,想法有出入那又是问什么?

js
({}) + []
查看结果

答案:'[object Object]',两者首先拆箱转换为基础类型,{} => [object Object][] => ''然后进行字符串拼接

js
[] == []
查看结果

答案:false,这里不会进行拆箱,类型相同的变量会直接比较,两者都是引用类型,地址不同不会相等

js
[] == ![]
查看结果

答案:true,![]先转换转换为false,[]进行拆箱变成0,false在转换成0

这里笔者发现一个有趣的问题,看看通过上面的知识你能解决吗:

js
let a;
+// 请让变量a满足以下条件
+
+if (a == 1 && a == 2 && a == 3) { console.log(true) };
查看结果
js
a = {
+  value: 1,
+  valueOf:() => a.value++;
+}

以上就是解决方案,是不是很简单。 首先要想a同时满足1、2、3的值,直接排除掉基础类型值,那么a一定是个引用类型,引用类型和基础类型的==比较,会通过拆箱规则转换,那么就会执行valueOf、toString方法,又根据拆箱优先级会先执行valueOf方法,那么在此方法做文章就可以了,每次读取值时进行自加,这样就会满足1、2、3

总结

本篇主要讲了JS怎么进行隐式转换的,通过拆箱和装箱了解到JS引擎对程序的包容性还是很高的,学会引用类型根据toPrimitive优先级规则进行转换,也学会了从简单的算术运算到逻辑运算的隐式转换规则。

相关参考:

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2019/ktv-system.html b/article/2019/ktv-system.html new file mode 100644 index 000000000..a7656b207 --- /dev/null +++ b/article/2019/ktv-system.html @@ -0,0 +1,491 @@ + + + + + + 7天撸完ktv点歌系统 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

7天撸完ktv点歌系统

用Express教你写KTV点歌系统,包括前台内容和后台管理系统,整合Express框架和Mongodb数据库服务器开发;教你用Vue.JS,ElementUI和iViewUI写出超漂亮的页面,随心点歌随心听

思维导图

技术栈

  • 后端: Express + Mongodb + jsonwebtoken等等

  • 前端: Vue.JS + ElementUI + iViewUI + Axios等等

功能介绍

本项目分前台开发,后台开发和服务器开发

md
- 用户听歌需要登录(路由守卫)
+- 用户需要到管理员申请账号和密码
+- 用户登录听歌(风格点歌,语种点歌,明星点歌,热门歌曲等等...)
+- 剩余时长30分钟提醒,到时间自动下机
+- 管理员对歌曲的增删改查
+- 管理员给用户开户,可以选择上机的时间
+- 管理员查看订单,删除订单,搜索订单
+- 管理员收藏歌曲,推荐到ktv推荐歌曲
+- 等等...

项目设计结构

js
-- 服务器基本架构
+ktv-select_music-system
+├── README.md
+├── index.js  -- 后台文件入口
+├── test.http  -- 测试文件
+├── api  -- 路由文件
+│    ├── admin.js  -- 配置管理员的操作
+|    ├── music.js  -- 配置歌曲信息
+|    ├── user.js  -- 配置用户的相关操作
+|    └── safecode.js  -- 配置安全码
+├── config -- 配置
+|    ├── Date.js  -- 配置日期格式化插件
+|    ├── delNoUse.js  -- 封装闲置删除闲置资源方法
+|    ├── http.js  -- 配置跨域
+|    ├── isBadAccount.js  -- 封装账户是否合法
+|    ├── newaccount.js  -- 封装随机开户方法
+|    ├── passport.js  -- 验证token是否合法
+|    ├── uploadImg.js  -- 封装上传图片方法
+|    └── uploadMusic.js  -- 封装上传歌曲方法
+├── ktv-admin  --后台管理系统界面
+├── ktv-client  --前台用户点歌项目界面
+├── dbModel
+|    └── **  -- Mongodb数据库的一些模型
+├── mongodb
+|    └── mongodb.js  -- 配置Mongodb,链接数据库 
+├── secret
+|    ├── mongodbURI.js  -- Mongodb地址
+|    └── jwtkey.js  -- token的私钥
+├── static -- 资源存放处
+|    ├── music  -- 歌曲上传目标文件夹 
+|    ├── poster  -- 歌曲海报上传目标文件夹
+└──  └── view  -- 配置404文件
js
-- 后台管理系统架构
+ktv-admin
+├── README.md
+├── public 
+|    ├── index.html  -- vue挂载页面
+|    └── **  -- 你可以在这里链接少量静态资源
+├── src  -- 开发文件夹
+|    ├── App.vue  -- Vue挂载根页面
+|    ├── main.js  -- Vue程序入口文件,挂载各种组件
+|    ├── router.js  -- Vue路由配置文件
+|    ├── store.js  -- Vuex的状态管理文件
+|    ├── assets  -- 静态资源文件夹
+|    ├── components  --公共组件
+|    |      └── nav.vue  -- 后台导航栏
+|    ├── plugins  --插件
+|    |      ├── axios.js   -- 配置跨域,拦截器等等 
+|    |      ├── Date.js   -- 格式化日期 
+|    |      └── Date.js   -- 加载动画Loading
+|    ├── stores  -- 状态管理文件夹
+|    |      └── adminStore.js  -- 管理员状态 
+|    ├── views  -- 页面文件夹
+|    |      ├── 404.vue   -- 404页面
+|    |      ├── adminlikes.vue   -- 管理员处理ktv收藏歌曲
+|    |      ├── allorders.vue   -- 订单管理
+|    |      ├── Home.vue   -- 后台根页面
+|    |      ├── Index.vue   -- 后台首页
+|    |      ├── managemusic.vue   -- 音乐管理
+|    |      ├── user_service.vue   -- 给用户开户
+|    |      └── login.vue   -- 后台登录
+└── babel.config.js  -- babel配置
js

+-- 前台用户听歌架构
+ktv-client
+├── README.md
+├── public 
+|    ├── index.html  -- vue挂载页面
+|    └── **  -- 你可以在这里链接少量静态资源
+├── src  -- 开发文件夹
+|    ├── App.vue  -- Vue挂载根页面
+|    ├── main.js  -- Vue程序入口文件,挂载各种组件
+|    ├── router.js  -- Vue路由配置文件
+|    ├── store.js  -- Vuex的状态管理文件
+|    ├── assets  -- 静态资源文件夹
+|    ├── components  --公共组件
+|    |      ├── bottomNav.vue  -- 底部音乐控制区域
+|    |      └── topNav.vue  -- 顶部信息区域
+|    ├── config  --配置
+|    |      ├── addSong.js    --封装选取歌曲方法
+|    |      ├── isBadAccount.js    --验证账户合法性
+|    |      ├── isLogin.js    --是否登录
+|    |      ├── nextSong.js    --封装下一首歌曲方法
+|    |      └── prevSong.js    --封装上一首歌曲方法
+|    ├── plugins  --插件
+|    |      ├── axios.js   -- 配置跨域,拦截器等等 
+|    |      └── wsmLoading.js   -- 加载动画Loading
+|    ├── stores  -- 状态管理文件夹
+|    |      └── song.js  -- 存储歌曲信息 
+|    ├── views  -- 页面文件夹
+|    |      ├── 404.vue   -- 404页面
+|    |      ├── abc.vue   -- 拼音点歌
+|    |      ├── artist.vue   -- 明星点歌
+|    |      ├── Home.vue   -- 后台根页面
+|    |      ├── Index.vue   -- 后台首页
+|    |      ├── hot.vue   -- 热播歌曲
+|    |      ├── ktvlikes.vue   -- ktv推荐歌曲
+|    |      ├── selected.vue   -- 已选歌曲
+|    |      ├── style.vue   -- 风格点歌
+|    |      └── language.vue   -- 语种点歌
+├── babel.config.js  -- babel配置
+└── vue.config.js  -- vue配置

项目启动介绍

首先

  1. 首先不要改变服务器端口,否则报错.

  2. 你需要在装有Node和Vue的环境中测试,如果其中一个没有请先下载(Node下载,Vue下载).如果没有Mongodb数据库,请自行下载,对于环境就不多讲了.

  3. 首先在最外层文件夹下载依赖:npm install 下载后端依赖,

  4. 接着进入ktv-client, npm install 下载用户前端依赖.

  5. 接着进入ktv-admin, npm install 下载管理员前端依赖.

  6. 以上工作完成后,使用命令npm run server 或者 node index命令启动Node服务器,启动成功会显示:

    Server is running on port [8633].

    Mongodb is Connected.Please have a great coding.

  7. 进入ktv-client,打开命令板,使用命令npm run client启动前台用户项目,启动成功后用浏览器访问http://localhost:xxxx

  8. 进入ktv-admin,打开命令板,使用命令npm run admin启动后台管理系统项目,启动成功后用浏览器访问http://localhost:xxxx

  9. 本例中将Mongodb部署在本地电脑上,如果你仔细阅读了这篇文档,启动项目应该是很容易的。如果你把Mongodb部署在其他地方,请自行修改secret/mongodbURI.js配置文件信息。

  10. 项目启动成功,最好用 chrome 浏览器打开, 美化了滚动条

接着注册管理员账号

js
admin.js最下面有个注册接口
+
+// 管理员注册
+router.post("/account/register", (req, res) => {
+    const email = req.body.email;
+    Admin.findOne({email})
+        .then(hasOne => {
+            if(hasOne){
+                return req.status(422).json({status:"422", result:"邮箱被占用"});
+            }else{
+                const username = req.body.username;
+                const password = req.body.password;
+                const identity = req.body.identity ? req.body.identity : null;
+                const date = new Date().format("yyyy/MM/dd HH:mm:ss");
+                const newAdmin = new Admin({
+                    email,
+                    username,
+                    password,
+                    identity,
+                    date
+                });
+                newAdmin.save()
+                    .then(() => {
+                        res.json({status:"200", result:"注册成功"})
+                    }).catch(err => {
+                        console.log(err);
+                        res.status(500).json({status:"500", result:"未知错误,注册失败"})
+                    })
+            }
+        })
+})

然后用postman注册或者其他工具

技术攻关

Date方法

由于js没有元素格式化日期的方法,就瞎掰一个(值得学习)

Date.js

js

+/** 
+*
+*  @author: ihengshuai 
+*  @version: 1.0.0 
+*  @description: 格式化日期
+*  @Date: 2019/10/16 09:32
+*
+*/ 
+
+Date.prototype.format = function(format) {
+    var o = {
+                "M+": this.getMonth() + 1, //月份
+                "d+": this.getDate(), //日
+                "H+": this.getHours(), //小时
+                "m+": this.getMinutes(), //分
+                "s+": this.getSeconds(), //秒
+                "q+": Math.floor((this.getMonth() + 3) / 3), //季度
+                "f+": this.getMilliseconds() //毫秒
+        };
+        if (/(y+)/.test(format))
+                format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+        for (var k in o)
+                if (new RegExp("(" + k + ")").test(format))
+                        format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+        return format;
+}
+
+export default Date.prototype.format
+
+
+然后我们使用其格式日期
+require(Date);
+// const now = new Date().format("yyyy/MM/dd HH:mm:ss.S");
+const now = new Date().format("yyyy/MM/dd HH:mm:ss");

验证码(svg-captcha)

svg-captcha验证码的运用,防止暴力破解密码,加强安全性. 详细的文档地址:svg-captcha

使用验证码

js
// 后台生成验证码
+router.get("/getCaptcha", (req, res) => {
+    var captcha = svgCaptcha.create({  
+        // 翻转颜色  
+        inverse: false,  
+        // 字体大小  
+        fontSize: 38,  
+        // 噪声线条数  
+        noise: 3,  
+        // 宽度  
+        width: 80,  
+        // 高度  
+        height: 32,  
+      });  
+      // 保存到session,忽略大小写  
+      req.session = captcha.text.toLowerCase(); 
+      console.log(req.session); //0xtg 生成的验证码
+      //保存到cookie 方便前端调用验证
+      res.cookie('captcha', req.session); 
+      res.setHeader('Content-Type', 'image/svg+xml');
+      res.send(String(captcha.data));
+      res.end();
+})
+
+
+// 前台获取验证码
+--HTML
+<img width="80" style="background:#EEE9E9;margin-left:30px;" ref="captcha" height="32" src="http://localhost:3001/api/user/getCaptcha" @click="refreshCaptcha">
+
+--js
+// 获取验证码cookie
+getCookie(cname){
+    var name = cname + "=";
+    var ca = document.cookie.split(';');
+    for(var i=0; i<ca.length; i++){
+        var c = ca[i].trim();
+        if (c.indexOf(name)==0) return c.substring(name.length,c.length);
+    }
+    return "";
+},
+// 刷新验证码
+refreshCaptcha(){
+    this.$refs.captcha.src = "http://localhost:3001/api/user/getCaptcha?d=" + Math.random();
+},
+
+最后用 填写的验证码进行对比

上传歌曲或图片

formidable来处理文件上传信息,用起来方便,很友好,如果你没有接触过文件操作,赶紧收藏起来

封装歌曲方法uploadMusic.js

js
/** 
+*
+*  @author: ihengshuai 
+*  @version: 1.0.0 
+*  @description: 封装上传音乐方法
+*  @Date: 2019/10/16 08:35
+*
+*/ 
+
+const fs = require('fs');
+const path = require('path');
+const formidable = require('formidable');  // 文件处理库
+const formatTime = require('silly-datetime');  // 格式化数据
+
+module.exports = (req, res) => {
+    
+    let form = new formidable.IncomingForm();  //创建上传表单
+    form.encoding = 'utf-8';  // 设置编码格式
+    form.uploadDir = path.join(__dirname, '../static/music'); // 设置上传目录(这个目录必须先创建好)
+    form.keepExtensions = true;  // 保留文件后缀名
+    form.maxFieldsSize = 20 * 1024 *1024; // 设置文件大小
+
+    /* 格式化form数据 */
+    form.parse(req, (err, fields, files) => {
+        let file = files.file;
+        /* 获取异常 */
+        if(err) {
+            return res.status(500).json({'status': 500, result: '服务器内部错误'});
+        }
+        if(file.size > form.maxFieldsSize) {
+            fs.unlink(file.path);
+            return res.status(412).json({'status': 412, result: '音频不能超过20M'});
+        }
+
+        /* 存储后缀名 */
+        let extName = '';
+        switch (file.type) {
+            case 'audio/mp3':
+                extName = 'mp3';
+                break;
+        }
+        if(extName.length == 0) {
+            fs.unlink(file.path);
+            return res.status(412).json({'status': 412, result: '只支持mp3格式音频'});
+        }
+        /* 拼接新的文件名 */
+        let time = formatTime.format(new Date(), 'YYYYMMDDHHmmss');
+        let num = Math.floor(Math.random() * 8999 + 10000);
+        let songName = `${time}_${num}.${extName}`;
+        let newPath = form.uploadDir + '/' + songName;
+
+        /* 更改名字和路径 */
+        fs.rename(file.path, newPath, (err) => {
+            if(err) {
+                return res.status(500).json({'status': 500, result: '音频上传失败'});
+            } else {
+                return res.send({'status': 200, 'msg': '音频上传成功', result: {src: songName}});
+            }
+        })
+        
+    })
+};

Vue、ElementUI分页使用

关于ElementUI分页详细请见:ElementUI的Pagination分页学习

上图

js
-- html
+<el-pagination
+    v-if='paginations.total > 0'
+    :page-sizes="paginations.page_sizes"
+    :page-size="paginations.page_size"
+    :layout="paginations.layout"
+    :total="paginations.total"
+    :current-page.sync='paginations.page_index'
+    @current-change='handleCurrentChange'
+    @size-change='handleSizeChange'>
+</el-pagination>
+
+-- js
+data(){
+    return{
+        allUsers:[],  // 用来存储最终信息, 被显示的dom点调用
+        allTableData:[],  // 用户承接分页设置的数据
+        paginations: {   // 分页组件信息
+            page_index: 1, // 当前位于哪页
+            total: 0, // 总数
+            page_size: 5, // 1页显示多少条
+            page_sizes: [5, 10, 15, 20], //每页显示多少条
+            layout: "total, sizes, prev, pager, next, jumper" // 翻页属性
+        },
+    }
+},
+methods:{
+    // 获取当前页
+    handleCurrentChange(page) {
+        let sortnum = this.paginations.page_size * (page - 1);
+        let table = this.allTableData.filter((item, index) => {
+            return index >= sortnum;
+        });
+        // 设置默认分页数据
+        this.getAllUsers = table.filter((item, index) => {
+            return index < this.paginations.page_size;
+        });
+        this.getAllUsers = table.filter((item, index) => {
+            return index < this.paginations.page_size;
+        });
+    },
+    // 切换size
+    handleSizeChange(page_size) {
+        this.paginations.page_index = 1;
+        this.paginations.page_size = page_size;
+        this.getAllUsers = this.allTableData.filter((item, index) => {
+            return index < page_size;
+        });
+    },
+     // 总页数
+    setPaginations() {
+        this.paginations.total = this.allTableData.length;
+        this.paginations.page_index = 1;
+        this.paginations.page_size = 5;
+        // 设置默认分页数据
+        this.getAllUsers = this.allTableData.filter((item, index) => {
+            return index < this.paginations.page_size;
+        });
+    },
+}

没了吗?对,分页就是这么简单!你学会了吗?有些前端开发的同学总是对分页比较陌生,学会这个,让你不再产生烦恼!

token和自定义验证合法性

jsonwebtoken是对用户信息加密成不可逆向破解的token.关于passport-jwt,是用来对用户请求时所带的token信息进行过期验证,如果超过签证的合法时间,则会请前台发出token失效的信息,提示用户重新获取合法的token信息,否则无法继续请求加密的信息;

用法

js
- passport-jwt
+const key = require("../config/keys").KEYORSECRET;
+const JwtStrategy = require('passport-jwt').Strategy,
+      ExtractJwt = require('passport-jwt').ExtractJwt;
+var opts = {}
+opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
+opts.secretOrKey = key;
+
+module.exports = passport => {
+    passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
+        UserInfo.findById(jwt_payload.id)
+                .then(user => {
+                    if (user) {
+                        return done(null, user);
+                    } else {
+                        return done(null, false);
+                        // or you could create a new account
+                    }
+                })
+    }));
+}
+
+
+
+// 设置token
+// 规则
+ const rule = {
+    id:String(userinfo._id),
+    username:userinfo.username,
+    email:userinfo.email,
+    date:user.date,
+    signdate:userinfo.signdate,
+    signcount:userinfo.signcount,
+    avatar:userinfo.avatar,
+    phone:userinfo.phone
+};
+
+// 签证加密
+// jwt.sign(规则, key(私钥), {配置:比如过期时长}, (err, token){ 响应程序 })
+jwt.sign(rule,key,{expiresIn:7200},(err, token) => {
+    if(err) throw err;
+    res.json({"token" : "Bearer " + token})
+})
+
+
+
+自定义验证方法
+/** 
+*
+*  @author: ihengshuai 
+*  @version: 1.0.0 
+*  @description: 判断是否过期用户
+*  @Date: 2019/10/19 12:19
+*
+*/ 
+const UserOrOrders = require("../dbModel/user");
+module.exports = async params => {
+    
+    
+    const flag = await new Promise((resolve) => {
+        if(params){
+            const account = params.account;
+            UserOrOrders.findOne({account})
+                .then(user => {
+                    if(user){
+                        if(new Date().getTime() > new Date(user.endTime).getTime()){
+                            console.log("过期用户");
+                            // 处理
+                            return resolve(false);
+                        }else{
+                            console.log("合法用户");
+                            return resolve(true);
+                        }
+                    }else{
+                        return resolve(false);
+                    }
+                })
+        }else{
+            console.log("不合法用户");
+            return resolve(false);
+        }
+        
+    }) 
+    return flag;
+}
+
+
+
+
+使用:
+// 测试  isBadAccount(params)方法
+router.post("/test", passport.authenticate("jwt", {session:false}), async (req, res) => {
+    // console.log(req.user)
+    if(await isBadAccount(req.user)){
+        // do something
+        res.send("OK");
+    }else{
+        res.status(401).json({status:"401", result:"帐号过期,请联系管理员"})
+    }
+})

详细的文档地址:Passport-Jwt合法验证,token加密

截图(只给出部分截图)

源码在这里

此项目2018年7天快速写的,作者打算对项目将会进行重构,fork后等待项目更新自动推送... 传送门: https://github.com/ihengshuai/ktv-select_music-system

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2019/mysql-guide.html b/article/2019/mysql-guide.html new file mode 100644 index 000000000..99e435937 --- /dev/null +++ b/article/2019/mysql-guide.html @@ -0,0 +1,317 @@ + + + + + + MySQL从入门到放弃 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

MySQL从入门到放弃

对于一个程序的功能而言,数据存储也是一项很重要的技术。我们一般将程序产生的数据,比如用户账户信息,订单信息持久化, 也就是储存在数据库中。常用的关系型数据库有很多,如access、mysql、sqlserver、oracle等等。 其中目前最常用的还是mysql,今天小编就介绍下MySQL的基本操作...

下载安装

  1. 下载

首页打开MySQL的官方网站(👉MySQL),打开后将网站拉到最底部,点击下载栏目中的 MySQL Community Server社区免费版,打开下载页面后,选择不同的操作系统,点击下面不同格式的安装包,如下:下载8.0.22版本的dmg安装包, 点击下载即可

  1. 安装

等待下载完成后双击安装包进行安装(Mac双击后点击里面的*.pkg安装包),现在就进入MySQL的安装界面了

接下来就是傻瓜式的安装,一直点继续就可以了

注意

安装完成之后会弹出一个对话框,告诉我们生成了一个root账户的临时密码。请注意保存,否则重设密码会比较麻烦。 这个版本会让你自己设置密码,至少8位,设置后安装完成后登录使用

最后点击安装,等待安装完成...

安装完成后,打开我们的系统偏好设置就多出现MySQL服务,默认MySQL的服务开启状态

MYSQL的默认安装路径

终端配置MySQL

打开终端,Mac目前基本都是zsh终端,因此我们在~目录进行zsh配置,添加MySQL环境变量,如果没有.zshrc配置文件,自行创建即可

bash
vim .zshrc
+
+export PATH=${PATH}:/usr/local/mysql/bin

环境变量配置好后,就可以进行终端登录了,如下图表示配置成功(输入安装过程中创建的密码)

工具推荐

推荐一个强大的数据可视化工具:Navicat Premium,这款工具不仅可以连接MySQL数据库, 也可以连接SQL Server等数据库,非常强大,唯一一点不好就是收费,可以自行百度下载破解版,这里我下载了15.0版本的

基本操作

操作数据库的语句时,结尾一定不能漏掉分号!!!

创建数据库

  1. 数据库操作

查看数据库列表

sql
show databases;

接着创建一个demo数据库

sql
# create database 数据库名字;
+
+create database demo;

删除数据库

shell
# drop database 数据库名字;
+
+drop database demo;

使用数据库

bash
 # use 数据库名字;
+
+ use demo;

  1. 表的操作

查看当前数据库所有表

sql
show tables;

我去没一个表,那就创建表吧...

创建表

创建一个user表

sql
# create table 表名 (配置...);
+
+create table user (
+  `id` INT NOT NULL AUTO_INCREMENT,
+  `name` VARCHAR(20) NOT NULL,
+  `age` INT(3),
+  `birth` DATETIME NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB CHARSET=UTF8;

MySQL常用数据类型传送门: 常用数据类型

删除表 Drop

删除user表

sql
# drop table 表名;
+drop table user;

插入数据 Insert into

1.全部插入

sql
# insert into 表名 values (值);
+
+insert into user values (1, 'Peachick', 10, NOW());

2.选择插入对应值

选择插入,键值是对应的,因此值可以根据键的顺序,填写值

sql
# insert into 表名 (键...) values (对应值...);
+insert into user (name, birth) values ("Peachick2", NOW());

刷新发现多了一条数据...

3.插入多条数据

sql
# insert into 表名 values (值), (值), ...;
+或者
+# insert into 表名 (键...) values (值...), (值...), ...
+
+insert into user (name, age, birth) values ('Peachick3', 11, NOW()), ('Peachick4', 12, NOw());

插入多条,前面的语法和前面插入单条是一样的,VALUES之后的,每一个小括号算是一条数据,每条数据之间用逗号隔开就行了。

修改数据 Update

1.修改单个值

shell
# update 表名 set 字段名 = 新值 (条件语句)?可有可无;
+update user set name = 'Peachick1' where id = 1;

2.修改对个值

shell
# update 表名 set 字段名 = 新值, 字段名 = 新值, ... (条件语句)?可有可无;
+update user set name = 'Peachick02', age = 2 where id = 2;

3.不带条件

shell
update user set name = 'Peachick', age = 0, birth = NOW();

我们会发现表中的数据全被改了,有点流氓...,所以在修改数据库时一定要加上条件语句!!!

删除数据 Delete from

  1. 有条件
shell
# delete from 表名 (条件语句)?可有可无;
+delete from user where id = 1;

可以看出id为1的数据被删除了...

  1. 无条件 上面说了,条件语句可有可无,那如果没有条件语句会是什么样子呢?
shell
delete from user;

我去数据全部被删除了,有点魔鬼!!! 所以在删除数据时,一定要非常谨慎的加上条件,否则会产生很严重的后果...

简单查询

  1. 查询所有字段
shell
# select * from 表名;
+select * from user;

  1. 查询指定字段
shell
# select 字段名, 字段名, ... from 表名;
+select name, age from user;

  1. 条件查询
shell
# select * (或者 选择字段) from 表名 条件语句;
+select name, age from user where id = 1;

查询排序 Order By

  1. 单个字段
shell
# select * from 表名 order by 字段名 排序;
+select * from user order by age DESC;

通过观察上述两个语句的执行结果,我们可以得出以下几点结论:

  • MYSQL的排序命令是ORDER BY + 排序字段 + 排序方式,这个命令要加在语句的最后面(如果带了查询条件,查询条件应该放到ORDER BY 前面,否则会报错)
  • DESC 表示倒序(降序)排序
  • ASC表示正序(升序)排序
  • ASC是默认排序方式
  1. 多个字段
shell
# select * from 表名 order by 字段名 排序, 字段名 排序, ...;
+select * from user order by age DESC, id ASC;

通过观察上述两条语句的结果可以得出:

  • MYSQL排序先按前一个条件来排序,会先以最前面一个规则来排序,在最前面一个规则的基础上按第二个规则再进行排序,一直到最后一个规则(可以修改age使之和id不一样进一步验证)

别名

  1. 字段别名
shell
select 字段名 (as) "别名", ... from 表名;

as可以省略

shell
select 字段名 (as) "别名", ... from 表名 "别名";

常用函数

  1. 统计 COUNT()
sh
select count(*) from 表名;

应用场景:统计人数,点赞量。。。

  1. 求和 SUM()
sh
select SUM(字段名) from 表名;

应用场景:sum()一般用于金钱、分数等数据的计算,比如求平台用户每个月收入多少钱,支出多少钱等等。另外sun()函数不仅可以求数字类型的字段的和还可以对字符串进行求和,但是它会只计算能求和的数据的和。

  1. 平均数 AVG()
sh
select AVG(字段名) from 表名;

4.其它

  • 聚合函数
sql
AVG(X)           --返回指定列的平均值
+COUNT(X)         --返回指定列中非NULL值的个数
+MIN(X)           --返回指定列的最小值
+MAX(X)           --返回指定列的最大值
+SUM(X)           --返回指定列的所有值之和
+GROUP_CONCAT(X)  --返回由属于一组的列值连接组合而成的结果,非常有用
  • 数学函数
sql
ABS(x)                                          --返回x的绝对值
+BIN(x)                                          --返回x的二进制(OCT返回八进制,HEX返回十六进制)
+CEILING(x)                                      --返回大于x的最小整数值
+EXP(x)                                          --返回值e(自然对数的底)的x次方
+FLOOR(x)                                        --返回小于x的最大整数值
+GREATEST(x1,x2,...,xn)  --返回集合中最大的值
+LEAST(x1,x2,...,xn)     --返回集合中最小的值
+LN(x)                                           --返回x的自然对数
+LOG(x,y)                                        --返回x的以y为底的对数
+MOD(x,y)                                        --返回x/y的模(余数)
+PI()                                            --返回pi的值(圆周率)
+RAND()                                          --返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
+ROUND(x,y)                                      --返回参数x的四舍五入的有y位小数的值
+SIGN(x)                                         --返回代表数字x的符号的值
+SQRT(x)                                         --返回一个数的平方根
+TRUNCATE(x,y)                                   --返回数字x截短为y位小数的结果
  • 字符串函数
sql
ASCII(char)                                             --返回字符的ASCII码值
+BIT_LENGTH(str)                                         --返回字符串的比特长度
+CONCAT(s1,s2...,sn)         --将s1,s2...,sn连接成字符串
+CONCAT_WS(sep,s1,s2...,sn)      --将s1,s2...,sn连接成字符串,并用sep字符间隔
+INSERT(str,x,y,instr)                   --将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
+FIND_IN_SET(str,list)                   --分析逗号分隔的list列表,如果发现str,返回str在list中的位置
+LCASE(str)或LOWER(str)                  --返回将字符串str中所有字符改变为小写后的结果
+LEFT(str,x)                                             --返回字符串str中最左边的x个字符
+LENGTH(s)                                               --返回字符串str中的字符数
+LTRIM(str)                                              --从字符串str中切掉开头的空格
+POSITION(substr,str)                    --返回子串substr在字符串str中第一次出现的位置
+QUOTE(str)                                              --用反斜杠转义str中的单引号
+REPEAT(str,srchstr,rplcstr) --返回字符串str重复x次的结果
+REVERSE(str)                                            --返回颠倒字符串str的结果
+RIGHT(str,x)                                            --返回字符串str中最右边的x个字符
+RTRIM(str)                                              --返回字符串str尾部的空格
+STRCMP(s1,s2)                                           --比较字符串s1和s2
+TRIM(str)                                               --去除字符串首部和尾部的所有空格
+UCASE(str)或UPPER(str)                  --返回将字符串str中所有字符转变为大写后的结果

-日期和时间函数

sql
CURDATE()或CURRENT_DATE() 
+                  --返回当前的日期
+CURTIME()或CURRENT_TIME() 
+                  --返回当前的时间
+DATE_ADD(date,INTERVAL int keyword)
+                  --返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化)
+例如
+SELECT DATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
+
+DATE_FORMAT(date,fmt)  
+                  --依照指定的fmt格式格式化日期date值
+DATE_SUB(date,INTERVAL int keyword)
+                  --返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化)
+例如
+SELECT DATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
+
+DAYOFWEEK(date)   --返回date所代表的一星期中的第几天(1~7)
+DAYOFMONTH(date)  --返回date是一个月的第几天(1~31)
+DAYOFYEAR(date)   --返回date是一年的第几天(1~366)
+DAYNAME(date)     --返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
+FROM_UNIXTIME(ts,fmt)  
+                  --根据指定的fmt格式,格式化UNIX时间戳ts
+HOUR(time)        --返回time的小时值(0~23)
+MINUTE(time)      --返回time的分钟值(0~59)
+MONTH(date)       --返回date的月份值(1~12)
+MONTHNAME(date)   --返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
+NOW()             --返回当前的日期和时间
+QUARTER(date)     --返回date在一年中的季度(1~4)
+例如
+SELECT QUARTER(CURRENT_DATE);
+
+WEEK(date)        --返回日期date为一年中第几周(0~53)
+YEAR(date)        --返回日期date的年份(1000~9999)
+例如,获取当前系统时间
+SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
+SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);
+SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);
+SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);
+
+返回两个日期值之间的差值(月数)
+SELECT PERIOD_DIFF(200302,199802);
+
+在Mysql中计算年龄:
+SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),'%Y')+0 AS age FROM employee;
+这样,如果Brithday是未来的年月日的话,计算结果为0。
+下面的SQL语句计算员工的绝对年龄,即当Birthday是未来的日期时,将得到负值。
+SELECT DATE_FORMAT(NOW(), '%Y') 
+- DATE_FORMAT(birthday, '%Y') 
+-(DATE_FORMAT(NOW(), '00-%m-%d') 
+< DATE_FORMAT(birthday, '00-%m-%d')) AS age from employee
  • 加密函数
sql
AES_ENCRYPT(str,key)  
+                  --返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储
+AES_DECRYPT(str,key)  
+                  --返回用密钥key对字符串str利用高级加密标准算法解密后的结果
+DECODE(str,key)   --使用key作为密钥解密加密字符串str
+ENCRYPT(str,salt) --使用UNIXcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str
+ENCODE(str,key)   --使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串,它以BLOB类型存储
+MD5()             --计算字符串str的MD5校验和
+PASSWORD(str)     --返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
+SHA()             --计算字符串str的安全散列算法(SHA)校验和
+
+例如
+SELECT ENCRYPT('root','salt');
+SELECT ENCODE('xufeng','key');
+SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起
+SELECT AES_ENCRYPT('root','key');
+SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key');
+SELECT MD5('123456');
+SELECT SHA('123456');
  • 控制流函数
sql
CASE WHEN [test1] THEN [result1]...ELSE [default] END 
+                    --如果test1是真,则返回result1,否则返回default
+CASE [test] WHEN [val1] THEN [result]...ELSE [default] END  
+                    --如果test和valN相等,则返回result,否则返回default
+IF(test,t,f)        --如果test是真,返回t;否则返回f
+IFNULL(arg1,arg2)   --如果arg1不是空,返回arg1,否则返回arg2
+NULLIF(arg1,arg2)   --如果arg1=arg2返回NULL;否则返回arg1
+
+这些函数的第一个是IFNULL(),它有两个参数,并且对第一个参数进行判断。
+如果第一个参数不是NULL,函数就会向调用者返回第一个参数;
+如果是NULL,将返回第二个参数。
+例如
+SELECT IFNULL(1,2), 
+IFNULL(NULL,10),
+IFNULL(4*NULL,'false');
+
+NULLIF()函数将会检验提供的两个参数是否相等,如果相等,则返回NULL,
+如果不相等,就返回第一个参数。
+例如
+SELECT NULLIF(1,1),
+NULLIF('A','B'),
+NULLIF(2+3,4+1);
+
+MySQL的IF()函数也可以建立一个简单的条件测试,
+这个函数有三个参数,第一个是要被判断的表达式,
+如果表达式为真,IF()将会返回第二个参数,
+如果为假,IF()将会返回第三个参数。
+例如
+SELECT IF(1<10,2,3),IF(56>100,'true','false');
+IF()函数在只有两种可能结果时才适合使用。
+然而,在现实世界中,我们可能发现在条件测试中会需要多个分支。
+在这种情况下,它和PHP及Perl语言的switch-case条件例程一样。
+
+CASE函数的格式有些复杂,通常如下所示:
+CASE [expression to be evaluated]
+WHEN [val 1] THEN [result 1]
+WHEN [val 2] THEN [result 2]
+WHEN [val 3] THEN [result 3]
+......
+WHEN [val n] THEN [result n]
+ELSE [default result]
+END
+这里,第一个参数是要被判断的值或表达式,接下来的是一系列的WHEN-THEN块,
+每一块的第一个参数指定要比较的值,如果为真,就返回结果。
+所有的WHEN-THEN块将以ELSE块结束,当END结束了所有外部的CASE块时,
+如果前面的每一个块都不匹配就会返回ELSE块指定的默认结果。
+如果没有指定ELSE块,而且所有的WHEN-THEN比较都不是真,MySQL将会返回NULL。
+CASE函数还有另外一种句法,有时使用起来非常方便,如下:
+CASE
+WHEN [conditional test 1] THEN [result 1]
+WHEN [conditional test 2] THEN [result 2]
+ELSE [default result]
+END
+这种条件下,返回的结果取决于相应的条件测试是否为真。
+例如:
+SELECT CASE 'green'
+     WHEN 'red' THEN 'stop'
+     WHEN 'green' THEN 'go' END;
+
+SELECT CASE 9 
+WHEN 1 THEN 'a'
+WHEN 2 THEN 'b' ELSE 'N/A' END;
+
+SELECT CASE WHEN (2+2)=4 THEN 'OK' 
+WHEN (2+2)<>4 THEN 'not OK' END AS STATUS;
+
+SELECT Name,IF((IsActive = 1),'已激活','未激活') AS RESULT 
+FROM UserLoginInfo;
+
+SELECT fname,lname,(math+sci+lit) AS total,
+CASE WHEN (math+sci+lit) < 50 THEN 'D'
+     WHEN (math+sci+lit) BETWEEN 50 AND 150 THEN 'C'
+     WHEN (math+sci+lit) BETWEEN 151 AND 250 THEN 'B'
+ELSE 'A' END AS grade FROM marks;
+
+SELECT IF(ENCRYPT('sue','ts')=upass,'allow','deny') AS LoginResult
+FROM users WHERE uname = 'sue';
  • 格式化函数
sql
DATE_FORMAT(date,fmt)  
+                  --依照字符串fmt格式化日期date值
+FORMAT(x,y)       --把x格式化为以逗号隔开的数字序列,y是结果的小数位数
+INET_ATON(ip)     --返回IP地址的数字表示
+INET_NTOA(num)    --返回数字所代表的IP地址
+TIME_FORMAT(time,fmt)  
+                  --依照字符串fmt格式化时间time值
+其中最简单的是FORMAT()函数,
+它可以把大的数值格式化为以逗号间隔的易读的序列。
+例如
+SELECT FORMAT(34234.34323432,3);
+SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');
+SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
+SELECT DATE_FORMAT(19990330,'%Y-%m-%d');
+SELECT DATE_FORMAT(NOW(),'%h:%i %p');
+SELECT INET_ATON('10.122.89.47');
+SELECT INET_NTOA(175790383);
  • 类型转换函数
sql
为了进行数据类型转化,MySQL提供了CAST()函数,
+它可以把一个值转化为指定的数据类型。
+类型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
+例如
+SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
+SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
  • 信息系统函数
sql
DATABASE()        --返回当前数据库名
+BENCHMARK(count,expr)  
+                  --将表达式expr重复运行count次
+CONNECTION_ID()   --返回当前客户的连接ID
+FOUND_ROWS()      --返回最后一个SELECT查询进行检索的总行数
+USER()或SYSTEM_USER()  
+                  --返回当前登陆用户名
+VERSION()         --返回MySQL服务器的版本
+例如
+SELECT DATABASE(),VERSION(),USER();
+SELECTBENCHMARK(9999999,LOG(RAND()*PI()));# 
+该例中,MySQL计算LOG(RAND()*PI())表达式9999999次。

分组查询 Group By

sh
select 字段名 from 表名 group by 字段名,...;

先查下表里的数据

接下来分组查询

1.单个字段与多个字段

  • 根据age字段

  • 根据age和name字段

总结

从上面的两个分组查询我们可以得出结论:group by会根据后面的字段进行分组,一样的为一组,不一样就是不同的组,要查询的字段必须是 group by后面的字段

  • 应用: 查询每个年龄的人数

2.多个字段的顺序 以age和name两个字段分组,不同的排序又会是啥样子呢?

  • age, name 顺序

可以发现,如果是age在前面就主要以age来进行分组,然在此基础上再以name为基础再继续分组,如果是name在前面就主要以name来进行分组,然在此基础上再以age为基础再继续分组

模糊查询 Like

sh
select * from 表名 where 字段 like 值(%, _, regexp);

  • 如果%通配符放到结尾,开头是固定内容,那就是查找以这个内容开头的数据,如’大%’
  • 如果%通配符放到开头,结尾是固定内容,那就是查找以这个内容结尾的数据,如’%叔’
  • 如果通配符放到首尾,中间是固定内容,那么就是查找包含这个内容的数据,如’%chick%’
  • _通配符表示一个字符,%表示0个或多个

模糊查询的效率非常低,因为它在匹配数据的时候是一行行往下找的,对于数据量大的项目,查找数据非常费时,所以一般情况下我们应该避免使用模糊查询,真正在做搜索的时候一般会自己建立索引,然后用程序来维护,或者直接使用搜索引擎,当然,mysql自己也可以在插入数据的时候创建索引(这个鄙人完全没有使用过),所以本章内容只做了解,顺便贴出大神总结的mysql通配符的文章:https://blog.csdn.net/win7system/article/details/53508401

联表查询 Join

现在创建两张表来为后面的了联接做准备

  • 学生表
sh
CREATE TABLE `student` (
+     `id` INT NOT NULL AUTO_INCREMENT,
+     `name` VARCHAR(8) NOT NULL,
+     `age` INT(3) NOT NULL,
+     `class_id` INT(3),
+     PRIMARY KEY(`id`)
+) ENGINE=InnoDB charset=utf8;
+
+// 插入数据
+INSERT INTO student (name, age, class_id) values ('喜羊羊', 10, 2), ('美羊羊', 9, 1), ('懒羊羊', 9, 3), ('沸羊羊', 11, 2), ('老村长', 33, 2), ('灰太狼', 10, 3), ('红太狼', 9, 1);

  • 班级表
sh
CREATE TABLE `class` (
+     `id` INT NOT NULL AUTO_INCREMENT,
+     `name` VARCHAR(8) NOT NULL,
+     PRIMARY KEY(`id`)
+) ENGINE=InnoDB charset=utf8;
+
+// 插入数据
+INSERT INTO class (name) values ('仙女班'), ('汉子班'), ('娘炮班');

  1. 左联接 LEFT JOIN

左联查询的定义:首先取出表1(LEFT JOIN左边的表格)中所有数据和表2(LEFT JOIN右边的表格)中与表1所取数据相对应的所有数据,合成新的表格,没有数据则显示NULL。表1的数据为主,并显示在合成表格的左边。

  1. 右联接 RIGHT JOIN

右联查询的定义:首先取出表1(RIGHT JOIN右边的表格)中所有数据和表2(RIGHT JOIN左边的表格)中与表1所取数据相对应的所有数据,合成新的表格,没有数据则显示NULL。表2的数据为主,并显示在合成表格的右边。

  1. 内联 INNER JOIN

内联理解起来比左右联更简单,就是把两个表中,class的id和student的class_id都存在并且两个相等的数据连接成一条数据。因此在数据库中有前面两种连接有部分为null的数据这一整行都没有了。

联表查询综合应用

现在创建一张老师的表,一个老师只能交一个班级

如果要用联表查询查出每个学生所在的班级,还有老师,以及老师所教的课程 这样联表的思路是,首先先用student表和class表联表,以联表之后的大表作为一张虚拟表,再用这张虚拟表和teacher表联表,最后查询出结果。 那么这样一来,和第三张表联表的方式可以是右联还可以是自联,甚至还可以是其它后面要学到的查询方式

自联

现在有一个这样的需求,假如有一张成绩表,里面是每个同学课程1的分数和课程2的分数,现在要查出课程2比课程1分数要高的学生

先创建一个分数表:

查询每个学生课程2分数高于课程1的学生:

这样就行啦。通过语句可以看出,其实这是一个内联,只不过是score表自己和自己联表,因此自联和左联右联不一样,所以单独开了一张出来没有和左联这几章一起写。自联其实是一种联表的用法,并不是一种联表方式,原理就是让一张表自己和自己联表,联表的方式可以是内联,也可以是左联右联。自联的用途也挺广泛的,除了文中这样,还有别的场景可以使用,比如有一个职工表,里面有姓名,职位,部门,还有上级id,如果是最高级,上级id是0,以及多级回复等等场景,都可以通过自联的方式获取想要的结果。

子查询

还是班级表,查询每个学生所在的班级,除了联表查询,也可以子查询:

分页 LIMIT

sh
select * from 表名 LIMIT 起始位置,查询条数;

后面的依次类推。 可以看出,分页,主要是用了LIMIT关键字。这个关键字是这样的:LIMIT 开始位置,查询条数, 比如LIMIT 0,2说明是从第一条开始查询(下标都是由0开始),查询两条,那么返回的结果就是第一条和第二条。我们可以吧这个看做是一页,那么下一页就是第三条和第四条了,那就是LIMIT 2,2。

LIMIT也可以和我们上述的其它语句一起结合使用,并且一定是放在最后面的,比如:

如果不把limit放在最后面就会报错: 语法错误...

外键

待更新...

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2019/nvm-guide.html b/article/2019/nvm-guide.html new file mode 100644 index 000000000..57eaa96e4 --- /dev/null +++ b/article/2019/nvm-guide.html @@ -0,0 +1,69 @@ + + + + + + nvm切换node版本 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

nvm切换node版本

以前学会了用nvm来管理node版本,后来就专心搞开发了.如今一些所谓的vue,react,koa,Express,egg等框架更新迭代太快,老项目和新项目对node版本依赖不同,老版本的node已经无法友好支持.今天打开控制台竟然忘记nvm的常用命令,前查后查想起来,现在做个笔记,方便以后查阅

下载安装NVM

1.github下载地址https://github.com/coreybutler/nvm-windows/releases

2.下载完毕后,点击安装,目标盘随便更改. 如果是win10,请用管理员方式安装

3.查看是否安装成功

这里作者安装了1.1.7版本

配置环境变量

使用NVM查看信息

1.nvm list 查看安装了所有的node版本

2.nvm use 版本号切换版本

3.在你还不知道下载Node哪个版本前,你可以 nvm list available 查看可以安装的版本号

使用NVM下载Node等等

4.nvm install 版本号下载指定版本Node

这里演示下载8.9.4版本

5.nvm uninstall 版本号卸载指定Node含npm,以及当前版本全局工具

这里演示卸载8.9.4版本

注意,当你卸载哪个版本的Node时,那个版本的全局环境下的工具也全部删除掉了,包括npm

比如

sh
# current Node.js 8.9.4
+npm install nodemon -g 下载了全局nodemon
+nvm uninstall 8.9.4  写在了此版本node
+nvm use 10.6.0  使用10.6.0Node
+npm install nodemon -g  重新安装nodemon

常见问题

1.下载安装好后使用命令nvm install [指定版本],出现诸如以下错误

sh
  nodejs An existing connection was forcibly closed by the remote host:连接被强行关闭
+
+ Could not retrieve https://nodejs.org/dist/latest/SHASUMS256.txt:无法获得指定的校验文件

2.解决办法: 将nvm中node和npm的源设置到国内源(一般使用taobao)上。

3.在nvm的安装路径下找到settings.txt打开:

md
# root: C:\nvm
+arch: 64
+proxy: none
+originalpath:
+originalversion:
+node_mirror:
+npm_mirror:

4.分别指定node和npm的mirror

md
node_mirror: npm.taobao.org/mirrors/node/
+npm_mirror: npm.taobao.org/mirrors/npm/

5.这样就解决好了~,你学废了吗?

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2019/promise.html b/article/2019/promise.html new file mode 100644 index 000000000..82cc0a067 --- /dev/null +++ b/article/2019/promise.html @@ -0,0 +1,229 @@ + + + + + + Promise使用与原理 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Promise使用与原理

js
const PENDING = 'pending'
+const FULFILLED = 'fulfilled'
+const REJECTED = 'rejected'
+
+class MyPromise {
+  constructor(executor) {
+    try {
+      executor(this.resolve, this.reject)
+    } catch (error) {
+      this.reject(error)
+    }
+  }
+
+  status = PENDING
+
+  value = null
+  reason = null
+
+  onFulfilledCallback = []
+  onRejectedCallback = []
+
+  resolve = (value) => {
+    if (this.status == PENDING) {
+      this.status = FULFILLED
+      this.value = value
+
+      while (this.onFulfilledCallback.length) {
+        const cb = this.onFulfilledCallback.shift()
+        cb(value)
+      }
+    }
+  }
+
+  reject = (reason) => {
+    if (this.status == PENDING) {
+      this.status = REJECTED
+      this.reason = reason
+
+      while (this.onRejectedCallback.length) {
+        const cb = this.onRejectedCallback.shift()
+        cb(reason)
+      }
+    }
+  }
+
+  static resolve(param) {
+    if (param instanceof MyPromise) return param
+    return new MyPromise((resolve) => resolve(param))
+  }
+
+  static reject(param) {
+    if (param instanceof MyPromise) return param
+    return new MyPromise((resolve, reject) => reject(param))
+  }
+
+  then = (onFulfilled, onRejected) => {
+    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value
+    onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }
+
+    const _promise = new MyPromise((resolve, reject) => {
+      if (this.status == FULFILLED) {
+        queueMicrotask(() => {
+          try {
+            const x = onFulfilled(this.value)
+            resolvePromise(_promise, x, resolve, reject)
+          } catch (error) {
+            reject(error)
+          }
+        })
+      } else if (this.status == REJECTED) {
+        queueMicrotask(() => {
+          try {
+            const x = onRejected(this.reason)
+            resolvePromise(_promise, x, resolve, reject)
+          } catch (error) {
+            reject(error)
+          }
+        })
+      } else if (this.status == PENDING) {
+        // 异步进行缓存回调函数
+        this.onFulfilledCallback.push(() => {
+          queueMicrotask(() => {
+            try {
+              const x = onFulfilled(this.value)
+              resolvePromise(_promise, x, resolve, reject)
+            } catch (error) {
+              reject(error)
+            }
+          })
+        })
+        this.onRejectedCallback.push(() => {
+          queueMicrotask(() => {
+            try {
+              const x = onRejected(this.reason)
+              resolvePromise(_promise, x, resolve, reject)
+            } catch (error) {
+              reject(error)
+            }
+          })
+        })
+      }
+    })
+    return _promise
+  }
+}
+
+function resolvePromise(self, x, resolve, reject) {
+  if (self === x) {
+    return reject(new TypeError('Chaining cycle detected for promise #<Promise>'))
+  }
+  if (x instanceof MyPromise) {
+    try {
+      x.then(resolve, reject)
+    } catch (error) {
+      reject(error)
+    }
+  } else {
+    resolve(x)
+  }
+}
+
+const promise = new MyPromise((resolve, reject) => {
+  console.log('init Promsie')
+  setTimeout(() => {
+    resolve(1)
+  })
+})
+
+promise
+  .then((v1) => {
+    console.log(v1)
+    return 2
+  })
+  .then((v2) => {
+    console.log(v2)
+    return new MyPromise((resolve) => resolve(3))
+  })
+  .then((v) => {
+    console.log(v)
+    console.log('end')
+  }, reason => {
+    console.log(reason)
+  })
+
+MyPromise
+  .resolve(new MyPromise((resolve) => resolve('static resolve')))
+  .then((v) => {
+    console.log(v)
+    console.log('static')
+  })
+
+MyPromise
+  .reject(false)
+  .then(null, err => console.log(err))
+
+
+MyPromise.resolve().then(() => {
+  console.log(0);
+  return MyPromise.resolve(4);
+}).then((res) => {
+  console.log(res)
+})
+
+MyPromise.resolve().then(() => {
+  console.log(1);
+}).then(() => {
+  console.log(2);
+}).then(() => {
+  console.log(3);
+}).then(() => {
+  console.log(5);
+}).then(() =>{
+  console.log(6);
+})

//待更新...

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2019/what-bfc.html b/article/2019/what-bfc.html new file mode 100644 index 000000000..a9f450cce --- /dev/null +++ b/article/2019/what-bfc.html @@ -0,0 +1,206 @@ + + + + + + BFC渲染规则 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

BFC总结

前言

在写css样式时,可能是添加了一个样式后就达到了预期效果。有没有想过,是我们在不经意间触发了什么,帮助我们达到了效果?本文就快速介绍下css样式中经常使用的BFC,主要包括以下几个方面:

  1. 什么是BFC
  2. 如何生成BFC
  3. BFC的布局规则
  4. 应用

什么是BFC

首先看下什么是Formatting Context

  • CSS2.1规范中的一个概念
  • 它是指页面中的一块渲染区域,并拥有一套渲染规则,它决定了其子元素将如何定位,以及与其他元素的关系和相互作用。最常见的Formatting Context有BFC(Block Fomatting Context)和IFC(Inline Formatting Context)
  • CSS2.1 中只有BFC和IFC,CSS3中还增加了GFC和FFC

BFC

块级格式化上下文,它是一个独立的渲染区域,该区域拥有一套渲染规则来约束块级盒子的布局,并且与这个区域外部无关。

如何生成BFC

CSS2.1规定满足下列CSS声明之一的元素便会生成BFC:

  • float的值不为none
  • overflow的值不为visible
  • display的值为inline-block、table-cell、table-caption、flex、inline-flex
  • position的值为absolute或者fixed

BFC的布局规则

  1. 内部的元素会在垂直方向上一个接一个的放置;
  2. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻的Box的margin会发生重叠;

可应用到解决margin重叠的问题中:

可在其中一个元素外包裹一层容器,并触发该容器生成BFC(overflow:hidden;),这样两个元素就不属于同一个BFC了,就不会发生margin重叠的问题了。下面应用中会举例阐述。

  1. 生成BFC元素的子元素中,每一个子元素的margin与包含块的左边界border相接触(对于从左到右的格式化,否则相反),即使存在浮动也是如此;
  2. BFC的区域不会与float元素区域重叠

可应用到两栏布局中:

一个元素是浮动元素,可触发另一个非浮动元素生成BFC(overflow:hidden;)。由于“BFC的区域不会与float元素区域重叠”,因此可以实现两栏布局。下面应用中会举例阐述。

  1. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。
  2. 计算BFC的高度时,浮动元素也参与计算

可应用到解决浮动元素的父元素高度塌陷问题中:

如果父元素的子元素都是浮动元素,那么父元素的高度会发生高度塌陷(height:0)。可触发父元素生成BFC(overflow:hidden;)那么在“计算BFC的高度时,浮动元素也参与计算”,实现清除了内部浮动的效果。下面应用中会举例阐述。

应用

在上述BFC的布局规则中已经简单介绍了下3个利用BFC布局规则的实例了,下面按序分别举例说明:

解决margin重叠的问题

举例:

html
<!DOCTYPE html>
+<html lang="en">
+
+<head>
+        <meta charset="UTF-8">
+        <title>BFC的应用:解决margin重叠问题</title>
+        <style type="text/css">
+                body {
+                        margin: 0;
+                        padding: 0;
+                }
+
+                .container p {
+                        margin: 25px 10px;
+                        background-color: palevioletred;
+                        border: 1px solid black;
+                }
+        </style>
+</head>
+
+<body>
+        <div class="container">
+                <p>the first line</p>
+                <p>the second line</p>
+                <p>the third line</p>
+        </div>
+</body>
+
+</html>

效果:

以第一行来看,它距离顶部的垂直距离,和距离第二行的垂直距离是一样的。说明第一行的margin-bottom和第二行的margin-top发生了重叠,不然第一行到第二行的距离,应该是50px,是第一行距离顶部距离的两倍。

解决方法上面已经介绍过:可在其中一个元素外包裹一层容器,并触发该容器生成BFC(overflow:hidden;),这样两个元素就不属于同一个BFC了,就不会发生margin重叠的问题了。

据此修改:

html
<!DOCTYPE html>
+<html lang="en">
+
+<head>
+        <meta charset="UTF-8">
+        <title>BFC的应用:解决margin重叠问题</title>
+        <style type="text/css">
+                body {
+                        margin: 0;
+                        padding: 0;
+                }
+
+                .container p {
+                        margin: 25px 10px;
+                        background-color: palevioletred;
+                        border: 1px solid black;
+                }
+
+                .wrap {
+                        overflow: hidden;
+                }
+        </style>
+</head>
+
+<body>
+        <div class="container">
+                <p>the first line</p>
+                <div class="wrap">
+                        <p>the second line</p>
+                </div>
+                <p>the third line</p>
+        </div>
+</body>
+
+</html>

效果

这样就解决了margin重叠的问题

两栏布局问题

两栏布局有很多解决方案,比如用flex,这里介绍BFC的解决方案

举例:

html
<!DOCTYPE html>
+<html lang="en">
+
+<head>
+        <meta charset="UTF-8">
+        <title>BFC的应用</title>
+        <style type="text/css">
+                body {
+                        margin: 0;
+                        padding: 0;
+                }
+
+                .container {
+                        width: 500px;
+                        border: 1px solid black;
+                }
+
+                .left {
+                        width: 200px;
+                        height: 200px;
+                        background-color: palevioletred;
+                        float: left;
+                }
+
+                .right {
+                        width: 300px;
+                        height: 400px;
+                        background-color: skyblue;
+                }
+        </style>
+</head>
+
+<body>
+        <div class="container">
+                <div class="left">left</div>
+                <div class="right">right</div>
+        </div>
+</body>
+
+</html>

效果:

左栏是浮动元素,会脱离文档流,浮在文档流元素上。

BFC的解决方法:

可触发另一个非浮动元素生成BFC(overflow:hidden;)。由于“BFC的区域不会与float元素区域重叠”,因此可以实现两栏布局。

修改.right的样式:

css
.right {
+  ...
+  overflow: hidden;
+}

效果

不过我个人觉得这样做只是让BFC的区域不会与float元素区域重叠,实现了两栏布局效果,但并不是自适应的两栏布局,上述例子只是刚好父容器的宽度=左盒子宽度+右盒子宽度(大于时也可以)。如果把父容器的container的宽度,设为一个小于左盒子的宽度+右边盒子的宽度值(200px+300px),如400px时,就会看到这样的效果:

说明左右两个盒子并不会自动调整宽度来自适应的布局。

要想实现自适应的两栏布局也很简单,直接设置父元素的display:flex;即可。

修改样式:

css
.container {
+  ...
+  display: flex;
+}

右盒子不需要设置overflow:hidden;

效果:

可以看出左右盒子都按比例调整了自身的宽度:

200px:300px=2:3,

左栏新宽度=2/(2+3)*400=160px;

右栏新宽度=3/(2+3)*400=240px;

结果也确实如此:

左栏:

右栏:

解决浮动元素的父元素高度塌陷的问题

举例:

html
<!DOCTYPE html>
+<html lang="en">
+
+<head>
+        <meta charset="UTF-8">
+        <title>BFC的应用:解决浮动问题</title>
+        <style type="text/css">
+                body {
+                        margin: 0;
+                        padding: 0;
+                }
+
+                .container {
+                        width: 500px;
+                        border: 1px solid black;
+                }
+
+                .left {
+                        width: 200px;
+                        height: 200px;
+                        background-color: palevioletred;
+                        float: left;
+                }
+
+                .right {
+                        width: 300px;
+                        height: 400px;
+                        background-color: skyblue;
+                        float:left;
+                }
+        </style>
+</head>
+
+<body>
+        <div class="container">
+                <div class="left">left</div>
+                <div class="right">right</div>
+        </div>
+</body>
+
+</html>

效果:

如果父元素的子元素都是浮动元素,那么父元素的高度会发生高度塌陷。

解决方法:

可触发父元素生成BFC(overflow:hidden;)那么在“计算BFC的高度时,浮动元素也参与计算”,实现清除了内部浮动的效果。

修改样式,让父元素生成BFC:

css
.container {
+  ...
+  overflow: hidden;
+}

效果:

父元素的高度被撑起来了,为右盒子的高度400px;

小结

关于BFC的内容也是属于老生常谈的问题,关于BFC只需要知道,使用一定的CSS声明可以生成BFC,浏览器对生成的BFC有一系列的渲染规则,利用这些渲染规则可以达到一定的布局效果。为了达到特定的布局效果,我们让元素生成BFC

本文内容摘自 前端林子

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2020/domparser-xml.html b/article/2020/domparser-xml.html new file mode 100644 index 000000000..6bd471f4a --- /dev/null +++ b/article/2020/domparser-xml.html @@ -0,0 +1,59 @@ + + + + + + 关于DOMParser、XMLSerializer、createTreeWalker使用 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

关于DOMParser、XMLSerializer、createTreeWalker使用

DOMParser

DOMParser 可以将存储在字符串中的 XML 或 HTML 源代码解析为一个 DOM Document。

你可以使用XMLSerializer 接口执行相反的操作 - 将DOM树转换为XML或HTML源。

对于HTML文档,您还可以通过设置 Element.innerHTML 和outerHTML 属性的值,将部分 DOM 替换为从HTML构建的新 DOM 树。还可以读取这些属性以获取对应于相应 DOM 子树的 HTML 片段

语法

js
let domparser = new DOMParser();

domparser是个DOMParser对象 iShot2022-04-06 22.02.43.png

方法

domparser对象拥有一个parseFromString的方法,使用如下:

js
let doc = domparser.parseFromString(string, mimeType);

返回值基于 mimeType 参数,返回 Document 或 XMLDocument 或其他文档类型。

parseFromString的参数解释:

  • string:要解析的 DOMString。它必须包含 HTML、xml、xhtml+xml 或 svg 文档。
  • mimeType:表示解析的文档类型,支持下表这些参数值 |mimeType|返回文档类型| |--|--| |text/html|Document| |text/xml|XMLDocument| |application/xml|XMLDocument| |application/xhtml+xml|XMLDocument| |image/xvg+xml|XMLDocument|

其中Document文档类型是会自动包含<html><body>标签的,而XMLDocument文档类型则不会主动添加<html><body>等标签

例子: iShot2022-04-06 22.14.17.png

错误处理

DOMParser对象按指定的mimeType解析错误时,不会抛出任何异常,而是会返回一个给定的错误文档:

xml
<parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">
+(error description)
+<sourcetext>(a snippet of the source XML)</sourcetext>
+</parsererror>

iShot2022-04-06 22.17.12.png

XMLSerializer

XMLSerializer接口提供serializeToString() (en-US) 方法来构建一个代表 DOM 树的XML字符串。

语法

js
let s = new XMLSerializer();

s是个XMLSerializer对象 iShot2022-04-06 22.19.45.png

方法

XMLSerializer对象拥有一个serializeToString的方法,使用如下:

js
const str = s.serializeToString(document);

返回值是DOMString类型

serializeToString的参数解释:

  • document: 是一个dom节点

例子: iShot2022-04-06 22.25.22.png

和outerHTML区别

serializeToString方法和outerHTML有些类似,但还是有所区别,主要有有下面两个:

  1. outerHTML只能作用在Element元素上,但是不能是其他节点类型,例如文本节点,注释节点之类。但是serializeToString()方法适用于任意节点类型。包括: |节点类型|释义| |--|--| |DocumentType|文档类型| |Document|文档| |DocumentFragment|文档片段| |Element|元素| |Comment|注释节点| |Text|文本节点| |ProcessingInstruction|处理指令| |Attr|属性节点|
  2. serializeToString方法会给根元素自动增加xmlns命名空间,如上图
若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2020/optimize-web-server.html b/article/2020/optimize-web-server.html new file mode 100644 index 000000000..2a18352c1 --- /dev/null +++ b/article/2020/optimize-web-server.html @@ -0,0 +1,175 @@ + + + + + + 优化改善网页的加载及性能 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

优化改善网页的加载及性能

食用对象:不是土豪但是有点土,或者想了解下网站性能优化问题的同学

我记得那年像大同学一样怀揣着一颗IT梦进军了互联网的大门,开始朝着我不'秃'谁'秃'的幻想一步步照亮前方的道路。 然而前进的道路,坎坷往往不会缺席。学习的过程往往会产生种种疑惑与不解,在互联网高速发展的时代,百度成了解决问题的最大老师,那时对于编程解答最常用的就是CSDN了。随着每次不断在其上寻求解答外,网站也让我感到种种好奇,心想如果自己有个属于自己的技术博客该是多香呢。 故事经过了半年时间,各大云服务厂商各种推广,相爱相杀,对于仅有一个月生活费的大学生来说机会来了,说是白嫖也不为过😂,买到手后就开始各种折腾,虽然很累却很开心。

起步

小编用的是一台CentOs机器,刚开始就进行一些列的环境配置,如:nginx、node、java、mysql等一些列安装,当然中间也有不少的挫折,遇到不会的就百度搜一搜,一步一个脚印完成配置的,总体来说配置完觉得挺开心的... 本篇主要阐述网站性能优化,至于题外话就简单一概而过了 接着就是给网站搭建应用了

应用搭建

小编的博客主要是基于自己的webpack-mpa-template项目骨架集成的,采用了前后端分离进行开发,前端使用传统的webpackVueReactjquery等技术(项目模板已经集成好了,开箱即用),后端一开始采用Spring+MySQL开发,后台考虑到,nodejs的轻巧及方便以及对大批前端同学友好的全栈项目而言,就走上了koa+mysql的主体方案,相对大批前端同学来说更加友好。 本文就不讲述搭建应用的详细内容了,你可以参考我的项目骨架webpack-mpa-template,开箱即用,支持Vue、React

应用部署

小编开发完基本的功能后,就准备部署到服务器上了。当然要提交代码到github了,服务器拉取代码后直接

yaml
yarn run build
+
+yarn run deploy
+
+pm2 start blog-app

前面说了,后端主要是以node作为支撑服务的,node部署采用流行的pm2进行部署的,其有很好的负载均衡、热重启、日志收集等等爽到不能再爽的功能,很值得推荐。大家可能还有疑惑那前端打包的页面是如何托管的,其实再执行yarn run deploy后,自动会把打包后的前端页面推到后端的 public 目录作为静态路由,之所以不单独为前端页面部署服务,是因为作为后端路由后可以很好的路由拦截,进行身份鉴权等问题,你是不是很好奇如何做到的,在webpack-mpa-template里都进行了简单的说明

鉴权拦截器

鉴权拦截主要是针对登录信息进行拦截的,整个工程划分了免登录和登录机制模块,其主要针对登录模块进行拦截的 下面是鉴权拦截器的部分👇

js
/* 借用中间件机制 */
+
+// middleware/index.js
+// 鉴权机制
+app.use((ctx, next) => verifyAuth(ctx, next))
+
+// 随后路由的鉴权或者其他鉴权可以在这里进行
+// middleware/auth/index.js
+
+// 设置黑名单用来鉴权 => 可以采用 正则配置
+const apiBlackList = ["^/permission", "^/xxx$"]
+
+// 鉴权(伪代码)
+function validateAuth() {
+    // 这里可以根据身份信息进行鉴权
+    // 你可以使用token、cookie或者其他,自由配置
+}

在项目骨架中路由和鉴权有权衡约定,其中有详细说明,在此就详细展开了 你只需要在 validateAuth 根据身份信息拦截即可

nginx代理

前面讲述了我们的应用已经正常运行,接下来就需要进行http配置,使用域名映射到node server。 在conf.d路径下我们建立单独的appName.conf来配置单独应用(如果你熟悉nginx),这样以应用配置方便以后管理及维护,屡试不爽

nginx
server {
+  listen 80;
+  server_name blog.cn; # 绑定的域名
+  
+  # 进行反向代理
+  location / {
+    proxy_redirect off;
+    proxy_set_header Host $host;
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header X-Forwarded-For $http_x_forwarded_for;
+    proxy_pass http://127.0.0.1:5695; # 本地node server 地址
+  }
+}

以上就是针对当前应用的nginx配置,其绑定了blog.cn域名,配置完后保存退出后执行👇

yaml
nginx -s reload # nginx 重新加载配置

完成后当我们访问blog.cn就会打开我们的应用

性能优化

以上配置好了应用及域名,然而结果总是出人意料😂,当打开网站时发现,我来个去的蜗牛速度,打开需要10几秒,简直要吐了,然而当我点击某篇文章时,发现居然要加载15s才能进来,我差点一头撞死😭,突然对白嫖的感觉不那么香了。这要是真的是这样,别说别人浏览文章,我自己都嫌弃。 上图是后来优化后的性能分析一张图(刚开始忘记截图),可以很明显看出entry.js加载了10多s,大小972kb(当时加载快20s,大小1.4M),这对于1M宽带的服务器来说加载很慢是肯定的 上图是js加载网络图(这是优化后的,请忽略时间,还有size大小,主要是讲没有命中缓存)

从上面可以分析出:

  1. js bundle过大,虽然进行了代码分割但还是比较大,可以采用cdn网络资源,可以大大减小bundle体积,也可以减小请求时间
  2. 当点击某篇文章时需要等待20s时间,是因为异步加载的js文件过大,因此可以进行预加载,利用浏览器的空闲时间,主动加载,既不影响页面的加载,还能提高加载速度
  3. js资源没有合理进行缓存,每次重复请求,因此可以缓存静态资源,减少不必要的请求
  4. 懒加载优化网站友好过渡信息

知道了优化的方向,接下来就着手不同问题对症下药

设置CDN

在webpack(4.x)中我们进行打包时,有个optimization,splitChunks字段 可以在这里进行代码分割的逻辑,因为要结合CDN,对于一些常用的库文件,可以忽略打包,这样就可以减小打包体积,分割的代码也会变小

js
// webpack.prod.config.js
+module.exports = {
+  // ...其他配置
+  
+  // 忽略打包采用cdn
+  externals: {
+    "vue": "Vue",
+    "vue-router": "VueRouter",
+    "vuex": "Vuex",
+    "react": "react",
+    "jquery": "jQuery",
+    "echarts": "echarts",
+    "moment": "moment",
+  },
+  
+  // 代码分割
+  optimization: {
+    splitChunks: {
+      // 总的配置
+      chunks: "all",
+      minSize: 30000,
+      minChunks: 2,
+      maxAsyncRequests: 5,
+      maxInitialRequests: 3,
+      name: false,
+      cacheGroups: {
+        // 当前模块相同的配置会覆盖全局配置
+        vender: {
+          // 对于当前模块 的配置
+        },
+        // ... 可以继续根据模块或者第三方库进行划分
+      }
+    }
+  }
+}

现在需要在页面中主动引入库文件的cdn

pug
// pages/index.pug (骨架HTML提供了原生和pug)
+
+//- 引入了jquery
+script(src="https://cdn.bootcdn.net/ajax/libs/jquery/2.2.4/jquery.min.js")

以上简单概述了使用webpack代码分割忽略打包采用cdn引用

(首次加载)

上图即在使用cdn后的网络加载图,而且cdn自带缓存,可以看出首次加载还是很快的,基本上200ms,并且完全不会消耗自己服务器的性能,当再次刷新时cdn全部命中缓存,time全部为0,这也太香了...

介绍完代码分割及CDN,接着来说说预加载

预加载

预加载顾名思义就是提前加载资源,也就是说在下次需要使用该资源或该资源可能会被使用时,提前加载,减小下载请求,或命中缓存,这样就会提高响应速度

提前加载涉及到 preloadprefetch,二者都是为提前加载资源而生的,那两者有啥不同呢?

  • preload preload一般是提前加载当前页面需要使用的资源,但其不会阻塞主线程进行渲染
  • prefetch prefetch一般是用来其他页面可能会用到的资源,比如 A页面 访问 B页面 需要用到的 xx.js资源,浏览器会在cpu空闲时主动加载,其不会阻塞主线程进行渲染

在上面综合分析后,需要的是prefetch。因为首页并没有什么太大的资源需要加载,库文件已经采用CDN的方式引用,则无需担心加载问题。问题主要在于查看文章时,其他页面需要的js文件过大,加载时间过长,因此,在加载首页时对其进行prefetch,则在进行查看文章时实现秒开的感觉

preloadprefetch都可以在webpack中进行配置,更多详细配置戳这里

因为网站使用的是 bytemarkdown ,好像是刚发布不久,碰巧看到了就试试水,可惜现在并无CDN引用的链接来使用,只能采用模块打包,文件还是比较大的,这里主要是对其进行预加载

上代码:

js
// 预加载 bytemarkdown
+
+import(/*webpackPrefetch: true*/ "@/components/ByteMd/ByteMd")

采用合适的时机进行资源 prefetch

上图便是进行了prefetch配置后的网络加载图,可以看出,在空闲时间浏览器主动加载了 0.3373.js资源,并且用 prefetch 标记了 此次请求,可以很清楚当前是 预加载 当点击文章跳转到详情页时,只是加载了16.32..js文件,只花了424ms,其依赖的0.3373.js文件已经预加载好了,实现了秒开😱,实在是太香了,此时心里突然对 白嫖 好感十足😂

接着 资源缓存 👇

缓存

缓存:初次访问时对静态资源进行缓存或储存,在下载访问时根据不同的缓存策略命中缓存返还资源,减少请求

在讲缓存前,先大概了解下 缓存又分为 浏览器缓存http缓存,二者相辅相成,你中有我我中有你,如果你对缓存还不太了解,可以阅读我的另一篇文章 web缓存策略,此处就不在详细展开

对于js、css文件,可以在webpack进行打包时,给文件添加hash值,在迭代项目时,会根据hash不同主动进行资源获取,这里推荐使用contenthash及文件内容不变,hash不变。

js
// webpack.config.js
+
+module.exports = {
+  output: {
+    path: resolve("../client/dist"),
+    filename: USE_HASH ? "js/[name].[chunkhash:4].js" : "js/[name].js",
+    publicPath: "/",
+    chunkFilename: USE_HASH ? "js/[name].[chunkhash:4].js" : "js/[name].js",
+    // ... 其他配置
+  },
+}

这样就解决了更新问题

接着需要在nginx中进行静态资源的缓存(本文假设你对nginx有基本了解)

nginx
 # 缓存图片,音频等资源
+ location ~ .*\.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|gz|mp3|mp4|ogg|webm)$ {
+    # 资源防盗链
+    valid_referers *.usword.cn ~\.google\. ~\.baidu\. *.qq.com;            
+    if ($invalid_referer) {                                                
+      rewrite ^/ http://tva1.sinaimg.cn/large/005HV6Avgy1gvn4e450oxj602.jpg;                                                                         
+      return 403;                                                    
+    }                                                                      
+    proxy_pass http://127.0.0.1:8882; # node server
+    proxy_redirect off;                        
+    proxy_set_header Host $host;
+    proxy_cache my_cache; # nginx指定缓存项
+    proxy_cache_valid 200 304 24h;
+    proxy_cache_valid any 10m; # 代理过期时间
+    expires 7d;  # 资源过期时间
+    add_header Is-Cache true; # 天机自定义头部                                             
+ }                                                                              
+
+ # 缓存js,css 同上
+ location ~ .*\.(?:js|css)$ {                                                   
+    proxy_pass http://127.0.0.1:9901;                                      
+    proxy_set_header Host $host;                                           
+    proxy_cache my_cache;                                                  
+    proxy_cache_valid 200 304 24h;                                         
+    proxy_cache_valid any 10m;                                             
+    expires 7d;                                                            
+    add_header Is-Cache true;                                              
+ }

上图即添加nginx缓存后,非首次访问,浏览器会命中缓存,实现秒开功能

懒加载

预加载相对的就是预加载,为了提高网页的响应速度,减少不必要的资源请求是很提倡的做法

  1. 针对图片资源 可以采用图片懒加载,用其他展位图进行展示,然后一步一步加载图片,在效果上也会比较舒服,很直观的能让用户感受到:哦,资源加载中

  2. 针对接口请求 减少请求量,采用分页加载。每个用户面对的都是有固定尺寸的显示器,其可展示的内容就只占一屏,其后面的数据就算加载了用户也看不到 可以对浏览器进行滚动监听,当到快到底部时,再进行下一部门内容的加载

资源压缩gzip

nginx示例配置,更多配置戳这里查看官方文档

nginx
server {
+  gzip on;
+  gzip_types text/html text/css application/javascript;
+  gzip_static: on;
+  gzip_proxied: expired no-cache auth;
+  gzip_buffers: 16 8k;
+  gzip_min_length: 2k;
+  gzip_comp_level: 4;
+  gzip_http_version: 1.0;
+  gzip_vary: on;
+  gzip_disable: "MSIE [1-6]\.";
+}

//待更新...

总结

本文主要从cdn、代码分割、资源缓存、预加载和懒加载等方面,不断优化了网站的加载速度,可能还需要不断的优化,但至少现在比刚开始已经快的很多了。 结尾容我感叹一句:白嫖不容易,别放弃白嫖

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2020/regexp-guide.html b/article/2020/regexp-guide.html new file mode 100644 index 000000000..f960da7c0 --- /dev/null +++ b/article/2020/regexp-guide.html @@ -0,0 +1,222 @@ + + + + + + 深入浅出RegExp | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

深入浅出RegExp

JavaScript中的正则是Perl的大子集,但Perl内部的一些表达式却没有继承

正则表达式是用于匹配字符串中字符组合的模式(可参考MDN教程)

一个例子

使用正则将一个数字以科学计数法进行表示,如:

js
 // 10000000 => 10,000,000

现在用一个正则来解决

js
const str = '10000000'
+const reg = /(?=(\B)(\d{3})+$)/g
+str.replace(reg, ',') // 10,000,000

修饰符

正则表达式是由模式修饰符(可有可无)组成 常用的修饰符有:igmuy

  • i:匹配时不区分大小写
    js
    str = 'JavaScript'
    +reg = /javascript/i
    +reg.test(str) // => true
  • g:匹配时会查找所有的匹配项,而不只是第一个
    js
    str = 'absKsdblsb'
    +reg = /s/g
    +str.match(reg) // => [s, s, s]
  • m:匹配多行(会影响^、$操作符)
    js
    str = 'ab\nab'
    +reg = /^ab/mg
    +str.match(reg) // => [ab,ab]
  • u:开启完整的 unicode 支持
  • y:粘滞模式
    js
    str = 'Hello, world!';
    +reg = /\w+/y;
    +reg.lastIndex = 5; // 在位置 5 精确查找
    +regexp.exec(str) // => null

字符类

字符类是个特殊的字符,用来匹配字符集中字符 如:匹配字符串中的数字

js
const str = 'jhsd123fg903d'
+
+// 匹配所有的数字
+str.match(/\d/g) // => ['1', '2', '3', '9', '0', '3']

常用的字符表达式见下表:

表达式描述含义
.匹配单个字符,除了换行和行结束符(小数点)默认匹配除换行符之外的任何单个字符。例如,/.n/ 将会匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不会匹配 'nay'。如果 s ("dotAll") 标志位被设为 true,它也会匹配换行符。
\w匹配单词字符匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。例如, /\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 和 "3D." 中的 '3'。
\W匹配非单词字符匹配一个非单字字符。等价于 [^A-Za-z0-9_]。例如, /\W/ 或者 /[^A-Za-z0-9_]/ 匹配 "50%." 中的 '%'。
\d匹配数字匹配一个数字。等价于[0-9]。例如, /\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。
\D匹配非数字字符匹配一个非数字字符。等价于[^0-9]。例如, /\D/ 或者 /[^0-9]/ 匹配"B2 is the suite number."中的'B' 。
\s匹配空白字符匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如, /\s\w*/ 匹配"foo bar."中的' bar'。经测试,\s不匹配"\u180e",在当前版本Chrome(v80.0.3987.122)和Firefox(76.0.1)控制台输入/\s/.test("\u180e")均返回false。
\S匹配非空白字符匹配一个非空白字符。等价于 [^ \f\n\r\t\v\u00a0\u1680\u180e\u2000-u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\S\w*/ 匹配"foo bar."中的'foo'。
\b匹配单词边界匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。注意,匹配中不包括匹配的字边界。换句话说,一个匹配的词的边界的内容的长度是0。(不要和[\b]混淆了)使用"moon"举例:/\bm/匹配“moon”中的‘m’;/oo\b/并不匹配"moon"中的'oo',因为'oo'被一个“字”字符'n'紧跟着。/oon\b/匹配"moon"中的'oon',因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。/\w\b\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。
\B匹配非单词边界匹配一个非单词边界。匹配如下几种情况:(1)字符串第一个字符为非“字”字符 (2)字符串最后一个字符为非“字”字符(3)两个单词字符之间(4)两个非单词字符之间(5)空字符串
\n匹配换行符匹配一个换行符 (U+000A)。

...等等其他

例子

  1. .字符
js
var str = 'aa1bb'
+str.match(/(\w)\1.(\w)\2/g) // => ['aa1bb'],此处 `.` 匹配的是 1
+
+str = 'nay, an apple is on the tree'
+str.match(/.n/g) // => ['an', 'on'],匹配两个结果,此处`.` 分别是 a, o
  1. \w字符
js
var str = 'a1ds23;.?]'
+str.match(/\w/g) // => ['a', '1', 'd', 's', '2', '3']
  1. \d字符
js
var str = 'a1ds23;.?]'
+str.match(/\w/g) // => ['1', '2', '3']
  1. \s字符
js
var str = 'a1 ds2 3;.?]'
+str.match(/\w/g) // => [' ', ' '],共有两处
  1. \b字符
js
var str = '2split1;word3'
+str.match(/\b\d/g) // => [2],先匹配数字[2,1,3],而后单词边界的是 [2]
  1. \B字符
js
var str = '2split1;word3'
+str.match(/\B\d/g) // => [1, 3],先匹配数字[2,1,3],而后非单词边界的是 [1,3]

复用

复用即量词,常见的量词包括:*+?{n},量词可以在匹配多个相同的模式的时候很管用,避免了重复写相同的模式

一个小例子:

js
str = 'ab1c2d345e'
+str.match(/\d/ig) // => [1, 2, 3, 4, 5]
+
+// 使用量词 (这里涉及到了贪婪原则,后面会讲到)
+str.match(/\d+/ig) // => [1, 2, 345]

来看下面的解释

  • *:匹配前面的模式0个或多个,相当于{0, n}
    js
    // 还是上面的例子
    +// 使用 *
    +str.match(/\d*/ig) // => ['', '', '1', '', '2', '', '345', '', '']
    +// 这里因为 * 0个也会匹配,所以每个位置都会匹配到空字符
  • +:匹配前面的模式1个或多个,相当于{1, n}
    js
    // 使用 +,同理,至少得一个才能匹配上
    +str.match(/\d+/ig) // => ['1', '2', '345']
  • ?:匹配前面模式0个或1个,相当于{0, 1}
    js
    str = 'Should I write color or colour'
    +// 这里 ? 表示前面的 u 有或者没有都行
    +str.match(/colou?r/ig) // => [color, colour]
  • {n}:表示一个范围,可以是{0,n},{n,} 或者{n,m},表示知道得有左位数和最多位数
    js
    str = 'erabuiababidjabababkjlsdababababkl'
    +// 至少得有2个ab,最多匹配3个ab
    +str.match(/(ab){2,3}/ig) // => [abab, ababab, ababab]

选择、组合、捕获、引用

选择

选择是由|标识进行匹配,可以理解为or,如:a|b表示匹配a或者b

js
str = 'absdfg'
+// 匹配s或者d
+str.match(/s|d/ig) // => ['s', 'd']

组合(字符集合范围)

组合在常用的匹配模式中还是常用的,[]用来组合匹配的范围或者其他

几个重要概念:

  1. [^..]表示非组合的内容,^在开头代表不是后面要匹配的内容
  2. [\b]匹配一个退格,不要和 \b混淆了
js
// 匹配第一位是字符全是大写或者全是小写的字母
+reg1 = /^[A-z]\d*/ig
+reg1.test('s12314') // => true
+
+// 匹配第一位是字母或者数字的,最后一个第一位是字母或者0-2之间的数字,很明显false
+reg2 = /^[A-z|\d]\d*/ig
+reg2.test('s12314') // => true
+reg2.test('112314') // => true
+reg3 = /^[A-z|0-2]\d*/ig
+reg3.test('312314') // => false
+
+// 匹配第一位不是字母
+reg4 = /^[^A-z]\d*/ig
+reg4.test('s12314') // => false
+reg4.test(';12314') // => true

捕获

捕获在匹配表达式中经常看到,他的作用非常强大,使用()一对括号进行修饰,这样就可以捕获到匹配到里面的内容,捕获经常和引用或者修饰符(*、+...)结合使用

在讲用法前,需要补充一下排除捕获,排除捕获也很重要很常用,可以用一些需要()但又不需要捕获后的值,用?:排除捕获

常见用法:

  1. 使用捕获获取具体内容 RegExp 的静态属性 $
js
str = 'I like Java coding'
+
+// 忽略大小写
+reg = /\w*(JAVA)\w*/ig
+
+// 匹配字符
+reg.test(str)
+// 匹配后,捕获到的内容会按照捕获的顺序出现在 `RegExp`的静态属性上,以`$`开头
+console.log(RegExp.$1) // => Java 
+console.log(RegExp.$2) // => undefined ,只有一个捕获,不存在`$2`属性
+
+// 使用`replace`方法
+str.replace(reg, 'PHP') // => I like PHP coding
+str.replace(reg, '【$1】') // => I like 【Java】 coding
+str.replace(reg, '$1Script') // => I like JavaScript coding
+str.replace(reg, ($, $1) => {
+  console.log('匹配到了' + $1)
+  return `${$1}`
+}) // => I like 【Java】 coding  并且会打印 `匹配到了Java`
+// 搜索段落标红关键字
+str.replace(reg, '<span style="color:red">$1</span>') // => I like <span style='color:red'>Java</span> coding
  1. 匹配表达式结合引用使用

引用其实和前面讲到的RegExp的静态属性类似,只不过引用是在匹配表达式中使用,写法不一样。在匹配表达式中使用 \1 \2...斜杠加一个数字的形式引用所有引用的第一个,类似 $1、$2...

引用的顺序与()的使用顺序相关联,规则:由左到右,由外到内,遇到排除捕获跳过当前()

js
str = 'qaabbccddq'
+reg = /(\w)\1/ig
+str.match(reg) // => ['aa', 'bb', 'cc', 'dd']
js
str = 'qaaaabbbb11q'
+reg = /(\w\w)\1(\d)\2?/ig
+str.match(reg) // => ['bbbb11']
+
+// 这里注意是 `\3` 而不是 `\2`
+reg1 = /(\w\w)\1((\d)\3)?/ig
+str.match(reg1) // => ['aaaa', 'bbbb11']
+
+// 这里注意使用了 `?:` 排除捕获,所以是 `\2` 而不是 `\3`
+reg2 = /(\w\w)\1(?:(\d)\2)?/ig
+str.match(reg1) // => ['aaaa', 'bbbb11']

引用

引用在匹配表达式中使用 \1 这种以 斜杠和数字 结合的方式使用,需要注意的是,引用的数字和使用 ()的规则相关,规则为:由左到右,由外到内,遇到排除捕获跳过当前(),这一点很重要

关于引用的用法,详见前面 捕获小结的使用方法即可

断言

通常我们要匹配的内容后面要跟着指定的内容,常见的断言x(?=y)x(?!y)(?<=y)x(?<!y)x

前瞻断言

前瞻断言主要是x(?=y)x(?!y)x(?=y)表示匹配后面紧跟着y的x,x(?!y)表示匹配后面不是y的x

js
str = '1 candy costs 50€'
+
+// 假如要匹配后面是 `€` 的数字
+str.match(/\d+(?=)/) // => [50]
+
+// 假如要匹配后面不是 `€` 的数字
+str.match(/\d+(?!)/) // => [1]

后瞻断言

前瞻断言主要是(?<=y)x(?<!y)x(?<=y)x表示匹配前面紧跟着y的x,(?<!y)x表示匹配前面不是y的x

js
str = '1 candy costs $50'
+
+// 假如要匹配前面是 `$` 的数字
+str.match(/(?<=\$)\d+/) // => [50]
+
+// 假如要匹配前面不是 `$` 的数字
+str.match(/(?<!\$)\d+/) // => [1]

贪婪与惰性

正则的量词通常都是遵循贪婪原则,也就是有量词的时候,尽量匹配多的。而惰性则和这种原则相反,尽量匹配少,不匹配多。

惰性使用?紧跟在量词的后面,如:

js
`\d+?` // 匹配一个数字就行
+`\w{1,}?` // 匹配1个字母就行
+`\d*?` // 匹配0个数字 => ['', ...]

例子

js
// 匹配带 `""`号的水果
+str = 'I like "apples" a little more than "oranges"'
+
+
+// 1.贪婪
+// 会发现结果并不理想,原因就是默认是贪婪原则,能匹配多的不匹配少的
+// 首先,会匹配到第一个`"`
+// 而后匹配下一个`"`,当匹配到`apples"`,还会继续往后匹配
+// 看剩下的能不能匹配到 `.+"`,最后匹配到了`oranges"`(当然前面还有`than "`)
+str.match(/".+"/g) // => ["apples" a little more than "oranges"]
+
+// 2.惰性
+str.match(/".+?"/g) // => ["apples", "oranges"]
+
+// 3.其他方法
+str.match(/"[^"]+"/g) // => ["apples", "oranges"]

RegExp属性、方法

属性

常见的属性:source,global,ignoreCase,multiline,lastIndex等等...

  1. source 表示正则对象的原表达式内容以字符串的形式输出,不包含修饰符
js
reg = /(\d\s)\1/ig
+
+reg.source // => '(\\d\\s)\\1'
  1. global 表示是否匹配全部内容,而不是匹配到第一个就停止匹配,返回Boolean类型
js
reg = /(\d\s)\1/ig
+
+reg.global // => true
  1. ignoreCase 表示匹配是否忽略大小写,返回Boolean类型
js
reg = /(\d\s)\1/ig
+
+reg.ignoreCase // => true
  1. multiline 表示多行匹配,有回车符,换下一行从头匹配
js
reg = /(\d\s)\1/ig
+
+reg.multiline // => false
  1. lastIndex 在全局匹配时,表示当前匹配的的索引,初始为0,当匹配到结果时,lastIndex值变为最新匹配的位置,如果不能匹配到结果了,然后重0开始
js
str = 'day by day'
+
+reg = /\w+/g
+
+reg.exec(str) // => ['day', index: 0, input: 'day by day', groups: undefined]
+reg.lastIndex // => 3
+
+reg.exec(str) // => ['by', index: 4, input: 'day by day', groups: undefined]
+reg.lastIndex // => 6
+
+reg.exec(str) // => ['day', index: 7, input: 'day by day', groups: undefined]
+reg.lastIndex // => 10
+
+reg.exec(str) // => null
+reg.lastIndex // => 0,重新从头开始

方法

常见的方法:exec、test

  1. exec 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null) 同上lastIndex例子

  2. test 一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false。

js
str = '1a1aklk2b2bp'
+reg = /(\d\w)\1+/
+reg.test(str) // => true

String常见的正则方法

常用的方法:replacematchmatchAllsearchsplit

  1. replace:字符串替换指定的内容(表达式匹配)
js
str = 'I like Java coding'
+
+str.replace(/JAVA/i, 'PHP') // => 'I like PHP coding'
+str.replace(/(JAVA)/i, '<$1>') // => 'I like <Java> coding'
+str.replace(reg, ($, $1) => {
+  console.log('匹配到了' + $1)
+  return `${$1}`
+}) // => I like 【Java】 coding  并且会打印 `匹配到了Java`
  1. match:匹配所有符合表达式的内容,返回数组,否则null
js
str = 'd1sd2asf43d5'
+
+str.match(/\d+/) // => [1]
+str.match(/\d+/g) // => [1, 2, 43, 5]
+str.match(/\d\b/) // => [5]
+str.match(/\d\B/) // => [1, 2, 43]
+str.match(/\d\s/) // => null
  1. matchAll:返回匹配正则表达式的迭代器,参数为 RegExp 类型,且必须带上 修饰符 g,否则报错;其匹配结果返回一个 RegExpStringIterator 类型的迭代器
js
str = 'd1sd2asf43d5'
+
+iterator = str.matchAll(/\d+/g) // => RegExpStringIterator {}
+Object.prototype.toString.call(iterator) // => [object RegExp String Iterator]
+
+// 返回结果基本和迭代器一致,value是类数组
+iterator.next() // => {value: [1], done: false}
+iterator.next() // => {value: [2], done: false}
+iterator.next() // => {value: [43], done: false}
+iterator.next() // => {value: [5], done: false}
+iterator.next() // => {value: undefined, done: true}

迭代器截图

  1. search:匹配正则表达式,如果匹配成功返回第一个匹配的位置,否则返回-1
js
str = '1 apple costs $50'
+
+str.search(/(?<=\$)\d+/) // => 15
+str.search(/\d+/) // => 0
+str.search(/\d[A-z]/) // => -1
  1. split:将以正则匹配的内容进行分割
js
str = 'skJavaslkdJAVAllksdfJaVAlp'
+
+// 将会以 java 或者 javas 进行分割(不区分大小写)
+str.split(/javas?/i) // => ['sk', 'lkd', 'llksdf', 'lp']
若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2020/vscode-shortcut.html b/article/2020/vscode-shortcut.html new file mode 100644 index 000000000..47b67b8b1 --- /dev/null +++ b/article/2020/vscode-shortcut.html @@ -0,0 +1,186 @@ + + + + + + vscode快捷键 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

vscode快捷键

该文章内容翻译自Visual Studio Code 快捷键 Mac 版,快捷键忘了的可以查阅此文档

以下以Mac为例

全局

markdown
Command + Shift + P / F1 显示命令面板
+Command + P 快速打开
+Command + Shift + N 打开新窗口
+Command + W 关闭窗口

基本

markdown
Command + X 剪切(未选中文本的情况下,剪切光标所在行)
+Command + C 复制(未选中文本的情况下,复制光标所在行)
+Option + Up 向上移动行
+Option + Down 向下移动行
+Option + Shift + Up 向上复制行
+Option + Shift + Down 向下复制行
+Command + Shift + K 删除行
+Command + Enter 下一行插入
+Command + Shift + Enter 上一行插入
+Command + Shift + \ 跳转到匹配的括号
+Command + [ 减少缩进
+Command + ] 增加缩进
+Home 跳转至行首
+End 跳转到行尾
+Command + Up 跳转至文件开头
+Command + Down 跳转至文件结尾
+Ctrl + PgUp 按行向上滚动
+Ctrl + PgDown 按行向下滚动
+Command + PgUp 按屏向上滚动
+Command + PgDown 按屏向下滚动
+Command + Shift + [ 折叠代码块
+Command + Shift + ] 展开代码块
+Command + K Command + [ 折叠全部子代码块
+Command + K Command + ] 展开全部子代码块
+Command + K Command + 0 折叠全部代码块
+Command + K Command + J 展开全部代码块
+Command + K Command + C 添加行注释
+Command + K Command + U 移除行注释
+Command + / 添加、移除行注释
+Option + Shift + A 添加、移除块注释
+Option + Z 自动换行、取消自动换行

多光标与选择

markdown
Option + 点击 插入多个光标
+Command + Option + Up 向上插入光标
+Command + Option + Down 向下插入光标
+Command + U 撤销上一个光标操作
+Option + Shift + I 在所选行的行尾插入光标
+Command + I 选中当前行
+Command + Shift + L 选中所有与当前选中内容相同部分
+Command + F2 选中所有与当前选中单词相同的单词
+Command + Ctrl + Shift + Left 折叠选中
+Command + Ctrl + Shift + Right 展开选中
+Alt + Shift + 拖动鼠标 选中代码块
+Command + Shift + Option + Up 列选择 向上
+Command + Shift + Option + Down 列选择 向下
+Command + Shift + Option + Left 列选择 向左
+Command + Shift + Option + Right 列选择 向右
+Command + Shift + Option + PgUp 列选择 向上翻页
+Command + Shift + Option + PgDown 列选择 向下翻页

查找替换

markdown
Command + F 查找
+Command + Option + F 替换
+Command + G 查找下一个
+Command + Shift + G 查找上一个
+Option + Enter 选中所有匹配项
+Command + D 向下选中相同内容
+Command + K Command + D 移除前一个向下选中相同内容

进阶

markdown
Ctrl + Space 打开建议
+Command + Shift + Space 参数提示
+Tab Emmet插件缩写补全
+Option + Shift + F 格式化
+Command + K Command + F 格式化选中内容
+F12 跳转到声明位置
+Option + F12 查看具体声明内容
+Command + K F12 分屏查看具体声明内容
+Command + . 快速修复
+Shift + F12 显示引用
+F2 重命名符号
+Command + Shift + . 替换为上一个值
+Command + Shift + , 替换为下一个值
+Command + K Command + X 删除行尾多余空格
+Command + K M 更改文件语言

导航

markdown
Command + T 显示所有符号
+Ctrl + G 跳转至某行
+Command + P 跳转到某个文件
+Command + Shift + O 跳转到某个符号
+Command + Shift + M 打开问题面板
+F8 下一个错误或警告位置
+Shift + F8 上一个错误或警告位置
+Ctrl + Shift + Tab 编辑器历史记录
+Ctrl + - 后退
+Ctrl + Shift + - 前进
+Ctrl + Shift + M Tab 切换焦点

编辑器管理

markdown
Command + W 关闭编辑器
+Command + K F 关闭文件夹
+Command + \ 编辑器分屏
+Command + 1 切换到第一分组
+Command + 2 切换到第二分组
+Command + 3 切换到第三分组
+Command + K Command + Left 切换到上一分组
+Command + K Command + Right 切换到下一分组
+Command + K Command + Shift + Left 左移编辑器
+Command + K Command + Shift + Right 右移编辑器
+Command + K Left 激活左侧编辑组
+Command + K Right 激活右侧编辑组

文件管理

markdown
Command + N 新建文件
+Command + O 打开文件
+Command + S 保存文件
+Command + Shift + S 另存为
+Command + Option + S 全部保存
+Command + W 关闭
+Command + K Command + W 全部关闭
+Command + Shift + T 重新打开被关闭的编辑器
+Command + K Enter 保持打开
+Ctrl + Tab 打开下一个
+Ctrl + Shift + Tab 打开上一个
+Command + K P 复制当前文件路径
+Command + K R 在资源管理器中查看当前文件
+Command + K O 新窗口打开当前文件

显示

markdown
Command + Ctrl + F 全屏、退出全屏
+Command + Option + 1 切换编辑器分屏方式(横、竖)
+Command + + 放大
+Command + - 缩小
+Command + B 显示、隐藏侧边栏
+Command + Shift + E 显示资源管理器 或 切换焦点
+Command + Shift + F 显示搜索框
+Ctrl + Shift + G 显示Git面板
+Command + Shift + D 显示调试面板
+Command + Shift + X 显示插件面板
+Command + Shift + H 全局搜索替换
+Command + Shift + J 显示、隐藏高级搜索
+Command + Shift + C 打开新终端
+Command + Shift + U 显示输出面板
+Command + Shift + V Markdown预览窗口
+Command + K V 分屏显示 Markdown预览窗口

调试

markdown
F9 设置 或 取消断点
+F5 开始 或 继续
+F11 进入
+Shift + F11 跳出
+F10 跳过
+Command + K Command + I 显示悬停信息

集成终端

markdown
Ctrl + ` 显示终端
+Ctrl + Shift + ` 新建终端
+Command + Up 向上滚动
+Command + Down 向下滚动
+PgUp 向上翻页
+PgDown 向下翻页
+Command + Home 滚动到顶部
+Command + End 滚动到底部
若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2020/web-cache.html b/article/2020/web-cache.html new file mode 100644 index 000000000..6ed483af0 --- /dev/null +++ b/article/2020/web-cache.html @@ -0,0 +1,56 @@ + + + + + + web缓存策略 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

web缓存策略

缓存简单的来说就是把需要的东西储存到指定的位置,等下次需要取到相应的内容时,先看储存的缓存里是否存在,如果存在直接拿缓存的内容,如果不存在重新获取即可;那么前端缓存主要指什么,又有那些缓存策略呢?

概念

前端缓存是 http缓存浏览器缓存 的结合,两者相辅相成,共同完成缓存。

  1. http缓存

主要是指客户端和服务器间的通信缓存,利用这一缓存可以提升服务器资源利用率,在资源的有效期内不用进行请求该资源,大大减少服务器的压力

按照失效缓存策略分为:强缓存协商缓存

  1. 浏览器缓存

浏览器缓存把请求到的服务端资源进行本地储存

  • 按照缓存位置可以分为:memory cachedisk cacheservice worker cachepush cache
  • 按照数据存储类型分为:web storageCookieIndexDB等等

待补充...

相关文章

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2020/webpack-guide.html b/article/2020/webpack-guide.html new file mode 100644 index 000000000..2f3400b1d --- /dev/null +++ b/article/2020/webpack-guide.html @@ -0,0 +1,523 @@ + + + + + + 从零配置webpack工程 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

从零配置webpack工程

本篇文章主要针对webpack4.x进行配置,如果你的版本有差别,或者配置有出入,请移步官网查询更多详细配置,各个版本大同小异,不影响学习

webpack 是什么?

webpack 是一个现代 JavaScript 应用程序的静态模块打包器,当 webpack 处理应用程序时,会递归构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将这些模块打包成一个或多个 bundle。

webpack 的核心概念

  • entry: 入口
  • output: 输出
  • loader: 模块转换器,用于把模块原内容按照需求转换成新内容
  • 插件(plugins): 扩展插件,在 webpack 构建流程中的特定时机注入扩展逻辑来改变构建结果或做你想要做的事情

初始化项目

webpack4.x开始增加mode为必要字段,用来区分你的运行环境。

如果你还没有项目,可以先创建一个简单的项目,方便后面使用

sh
mkdir webpack-demo && cd webpack-demo
+npm init -y

创建完成后,就让我们进行简单的配置吧

安装基本的依赖

对于目前的webpack4.x,你或许需要以下依赖:

  • webpack
  • webpack-cli
sh
npm install webpack webpack-cli -D

基本配置

首先我们在webpack-demo文件下创建webpack.config.jssrc文件夹,然后在src文件夹下创建index.js

js
// webpack.config.js
+const path = require("path");
+module.exports = {
+  mode: "production", // 代码环境模式 (webpack4.x是必选的字段)
+  entry: path.resolve(__dirname, "./src/index/"), // 入口文件
+  output: {
+    path: path.resolve(__dirname, "./dist"), //  打包的目的路径
+    filename: "js/bundle.[hash:8].js" // 打包后的文件名
+  }
+};

然后再src/index.js里面简单的写几个语句进行打包处理

js
// src/index.js
+console.log("hello");
+console.log("webpack");

我们按照上面的简单配置进行打包:

sh
webpack webpack.config.js

为了方便输入打包口令,让我们简单的配置一下package.json脚本

json
// package.json
+{
+  // ...
+  "scripts": {
+    "build": "webpack --config webpack.config.js"
+  }
+}

然后使用以下的口令就可以完成打包啦:

sh
npm run build

是不是很方便,很 nice~

html-webpack-plugin

html-webpack-plugin可以让我们动态生成 HTML 文件,让我们在浏览器中查看效果

sh
npm install html-webpack-plugin -D

html-webpacl-plugin 是要配置在plugins中的,作为 webpack 的插件使用,plugins 是一个数组

html-webpack-plugin可以使用模板,也就是我们创建好的 html 模板,所以现在public文件夹下创建index.html文件

接着以上的webpack配置,添加html-webpack-plugin

js
// webpack.config.js
+const htmlWebpackPlugin = require("html-webpack-plugin");
+module.exports = {
+  // ...
+  plugins: [
+    new htmlWebpackPlugin({
+      template: path.resolve(__dirname, "./public/index.html"),
+      minify: {
+        // 压缩
+        collapseWhitespace: true, // 折叠空格
+        removeAttributeQuotes: true // 去除属性的引号
+      },
+      filename: "index.html" // 生成的html名称
+    })
+  ]
+};

打包代码吧~

sh
npm run build

打包后会多出index.html文件

html-webpack-plugin 在开发中还是非常有用的,其实它还有很多详细的配置,这里不做详解,请移步html-webpack-plugin 官方文档获取更多

devServer

webpack4.x 为我们提供了devServer工具,可以进行热更新,方便我们调试

使用前先下载:

sh
npm install webpack-dev-server -D

然后在上面的基础上添加devServer

js
// webpack.config.js
+module.exports = {
+  // ...
+  devServer: {
+    host: "0.0.0.0", // ip地址
+    port: 9999, // 端口号
+    hot: true, // 是否热更新
+    open: true, // 是否自动打开浏览器
+    https: false, // 是否
+    proxy: {
+      // 代理
+      "^/api": {
+        target: "http://localhost:8080"
+        // ...
+      }
+    }
+    // ...更多详看官网
+  }
+};

完成以上配置后,就已经可以使用devServer了,但是我们还要对package.json进行简单的配置,方便我们启动devServer

json
// package.json
+{
+  // ...
+  "scripts": {
+    "dev": "webpack-dev-server --config webpack.config.js", // 开发环境
+    "build": "webpack --config webpack.config.js" // 生产环境
+  }
+}

然后我们就可以很方便的启动devServer

sh
npm run dev

配置 loader

loader 是什么? loader 用于对源代码进行转换,这正是我们现在所需要的。

下面我们介绍几个简单的loader为大家演示下使用方式,其余的依次类推

less-loader

less-loader主要用来让我们的项目可以识别lesscss 预处理器,他可以将 less 文件转换成浏览器识别的 css 文件。

针对样式文件,首先要提一下两个重要的 loader: css-loaderstyle-loader,为什么它们很重要呢?因为他们项目中使用 css 样式的最根本的 loader,不管你是使用什么css预处理器,根本的转化都是离不开他们两个

  • css-loader:将不同渠道的样式文件进行 css 编译
  • style-loader:将编译后的 css 代码插入到 HTML 文件中

先下载依赖:

sh
npm install less less-loader css-loader style-loader -D

我们在以上的配置中,添加less-loader的配置:

js
// webpack.config.js
+module.exports = {
+  // ...
+  module: {
+    rule: [
+      {
+        test: /\.less/, // 针对所有的 *.less 文件
+        use: [
+          // 使用loader来处理
+          /**
+           *  这里要注意loader的执行顺序,请记住这两点:
+           *  1. 自下往上
+           *  2. 自右往左
+           */
+          // less-loader -> css-loader -> style-loader
+          "style-loader",
+          "css-loader",
+          "less-loader"
+        ],
+        exclude: /node_modules/ // 忽略node-modules文件夹,也就是说不用转义这个文件夹里面的*.less文件
+      }
+    ]
+  }
+};

然后我们创建一个样式文件src/style/base.less,然后随便写一点样式进去:

less
body {
+  font-size: 12px;
+  padding: 0;
+  background-color: teal;
+}

然后再进行打包:

sh
npm run dev

如果配置没有错误的话,你先在可以看到背景色为teal

babel-loader

babel-loader可以将 JS 代码向低版本转换,我们需要使用 babel-loader

首先安装一下babel-loader

sh
npm install babel-loader -D

此外,我们还需要配置 babel,为此我们安装一下以下依赖:

sh
npm install @babel/core @babel/preset-env @babel/plugin-transform-runtime -D
+npm install @babel/runtime @babel/runtime-corejs3 -S

我们在以上的配置基础上添加配置:

js
// webpack.config.js
+module.exports = {
+  // ...
+  module: {
+    rules: [
+      // ...
+      {
+        test: /\.jsx?$/,
+        use: {
+          loader: "babel-loader",
+          options: {
+            presets: ["@babel/preset-env"],
+            plugins: [
+              [
+                "@babel/plugin-transform-runtime",
+                {
+                  corejs: 3
+                }
+              ]
+            ]
+          }
+        },
+        exclude: /node_modules/
+      }
+    ]
+  }
+};

url-loader

url-loader帮助我们处理静态文件,如:css,image,js 等等

先下载:

sh
npm install url-loader -D

添加配置:

js
// webpack.config.js
+module.exports = {
+  // ...
+  module: {
+    rules: [
+      // ...
+      {
+        test: /\.(png|jpe?g|svg|gif)$/,
+        use: {
+          loader: "url-loader",
+          options: {
+            limit: 200 * 1024, // 最大200kb
+            outputPath: "image", // 打包路径  dist/image
+            name: "[name].[hash:8].[ext]" // 文件名
+          }
+        }
+      }
+    ]
+  }
+};

现在试着打包吧~

sh
npm run build

现在我们可以看出多了image文件夹,里面有我们打包的图片等其他静态资源(前提:你要在 js 文件中使用图片哦~)

到这里我们已经介绍了中 loader 了,就不再往下讲了,目前 npm 上有很多 loader 提供我们使用,使用哪个 loader 你可以当场查看文档就行了,配置都是千篇一律。可以查看官网上推荐的 loader

mode

mode是在webpack4.x才发布的,用来设置代码的环境,有developmentproduction两种模式

众所周知,灵活改变 mode 需要配置环境变量,方便操作,因此为了兼容各个操作系统环境,我们需要用到cross-env

先下载cross-env:

sh
npm install cross-env -D

接着,在package.json里修改脚本:

json
// package.json
+{
+  // ...
+  "scripts": {
+    "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js",
+    "build": "cross-env NODE_ENV=production webpack --config webpack.config.js"
+  }
+}

当然我们还要在我们的配置文件中接收NODE_ENV变量来控制mode:

js
// webpack.config.js
+const isDev = process.env.NODE_ENV == "development" ? true : false;
+const config = {
+  mode: isDev ? "development" : "production"
+};
+if (isDev) {
+  // 如果是开发环境就加上 devServer
+  config.devServer = {
+    host: "0.0.0.0", // ip地址
+    port: 9999, // 端口号
+    hot: true, // 是否热更新
+    open: true, // 是否自动打开浏览器
+    https: false, // 是否
+    proxy: {
+      // 代理
+      "^/api": {
+        target: "http://localhost:8080"
+        // ...
+      }
+    }
+  };
+}
+module.exports = config;

现在我们就可以进行不同的打包啦~

sh
// 开发环境
+npm run dev
+// 生产环境打包
+npm run build

devtool

devtool 中的一些设置,可以帮助我们将编译后的代码映射回原始源代码。不同的值会明显影响到构建和重新构建的速度。

对我而言,能够定位到源码的行即可,因此,综合构建速度,在开发模式下,我设置的 devtool 的值是 cheap-module-eval-source-map

js
//webpack.config.js
+module.exports = {
+  // ...
+  //开发环境下使用
+  devtool: "cheap-module-eval-source-map"
+};

生产环境可以使用 none 或者是 source-map,使用 source-map 最终会单独打包出一个 .map 文件,我们可以根据报错信息和此 map 文件,进行错误解析,定位到源代码。

source-maphidden-source-map 都会打包生成单独的 .map 文件,区别在于,source-map 会在打包出的 js 文件中增加一个引用注释,以便开发工具知道在哪里可以找到它。hidden-source-map 则不会在打包的 js 中增加引用注释。

但是我们一般不会直接将 .map 文件部署到 CDN,因为会直接映射到源码,更希望将.map 文件传到错误解析系统,然后根据上报的错误信息,直接解析到出错的源码位置。

还可以设置其他的devtool值,你可以使用不同的值,构建对比差异。

每次打包前清空 dist 目录

反正我是懒得手动去清理的,只要你足够懒,你总是会找到好办法的,懒人推动科技进步。这里,我们需要插件: clean-webpack-plugin

安装依赖:

sh
npm install clean-webpack-plugin

以前,clean-webpack-plugin 是默认导出的,现在不是,所以引用的时候,需要注意一下。另外,现在构造函数接受的参数是一个对象,可缺省。

js
//webpack.config.js
+const { CleanWebpackPlugin } = require("clean-webpack-plugin");
+module.exports = {
+  //...
+  plugins: [
+    //不需要传参数喔,它可以找到 outputPath
+    new CleanWebpackPlugin()
+  ]
+};

现在你再修改文件,重现构建,生成的hash值和之前dist中的不一样,但是因为每次 clean-webpack-plugin 都会帮我们先清空一波 dist 目录,所以不会出现太多文件,傻傻分不清楚究竟哪个是新生成文件的情况。

不过呢,有些时候,我们并不希望整个 dist 目录都被清空,比如,我们不希望,每次打包的时候,都删除 dll 目录,以及 dll 目录下的文件或子目录,该怎么办呢?

clean-webpack-plugin 为我们提供了参数 cleanOnceBeforeBuildPatterns

js
//webpack.config.js
+module.exports = {
+  //...
+  plugins: [
+    new CleanWebpackPlugin({
+      cleanOnceBeforeBuildPatterns: ["**/*", "!dll", "!dll/**"] //不删除dll目录下的文件
+    })
+  ]
+};

此外,clean-webpack-plugin 还有一些其它的配置,不过我使用的不多,大家可以查看clean-webpack-plugin 文档

externals

externals是webpack自带的选项,告诉webpack打包时排除哪些模块,也就是这些模块是外部的,或者CDN方式引入,不需要打包

js
// webpack.config.js
+module.exports = {
+  externals: {
+    jquery: 'jQuery'  // 排除jQuery
+  }
+}

可以试试吧~

resolve

resolve也是webpack自带的选项,告诉webpack如何解析一些模块

js
// webpack.config.js
+module.exports = {
+  resolve: {
+    modules: [path.resolve('node_modules')],  // 从node_modules中解析
+    mainFields: ['style', 'main'],  // 先找style 再找main
+    // mainFile: [], // 入口文件的名字  index.js
+    extensions: ['.js', '.css', '.styl', '.json'],   // 扩展名,依次解析
+    alias: {  // 别名
+      'bootstrap': 'bootstrap/dist/css/bootstrap.css',
+      '@': path.resolve(__dirname, './src')
+    }
+  }
+}

是不是很高大上~

optimization

optimization是webpack自带的选项,用来优化项目,他主要用在生产环境下,比如:压缩代码,抽离公共代码等等~

js
// webpack.config.js
+module.exports = {
+  mode: 'production',
+  // 优化项
+  optimization: {
+    // 对没有使用的依赖,删除导入导出,减小打包体积
+    usedExports: true,  // 此选项已经内置,生产环境下默认是true
+    // 抽离公共代码块
+    splitChunks: {
+      cacheGroups: {  // 缓存组
+        common: {  // 公共模块
+          chunks: 'initial',
+          minSize: 0,
+          minChunks: 2
+        },
+        vender: {   // 第三方模块
+          priority: 1,
+          test: /node_modules/,
+          chunks: 'initial',
+          minSize: 0,
+          minChunks: 2
+        }
+      }
+    },  
+    // 压缩
+    minimizer: [
+      new UglifyJSWebpackPlugin({  // 压缩js
+        cache: true, // 缓存
+        parallel: true, // 并发打包
+        sourceMap: true // 源码映射
+      }),
+      new OptimizeCSSAssetsPlugin()  // 压缩css
+    ]
+  },
+}

watch

watch是webpack自带的属性,他可以让自动监视代码有没有修改,进行监控打包,开启后你就不用再手动进行打包了

js
// webpack.config.js
+module.exports = {
+  watch: true,
+  watchOptions: {
+    poll: 1000, // ms  每秒检查一次
+    aggregateTimeout: 500, // 防抖  500ms
+    ignored: /node_modules/
+  }
+}

noParse

noParse属于module中的属性,可以告诉webpack不解析哪些模块,比如:jQuery就没有依赖第三方模块,不需要解析jQuery

使用:

js
// webpack.config.js
+module.exports = {
+  // ...
+  module: {
+    noParse: /jQuery|lodash/
+  }
+}

webpack-merge

webpack-merge用来帮助我们合并webpack配置,我们可以根据不同的环境设置特定的webpack配置,将公共的webpack配置抽离出来使用,根据不同环境,合并公共配置完成配置,话不多说,上手吧~

下载依赖webpack-merge

sh
npm install webpack-merge -D

现在我们稍微改造下我们的配置代码,删除原来的webpack.config.js,新建webpack.dev.conf.jswebpack.prod.conf.jswebpack.base.conf.js,简单解释:

  • webpack.base.conf.js:公共的webpack配置
  • webpack.dev.conf.js:开发环境下的配置
  • webpack.prod.conf.js:生产环境下的配置

使用:

webpack公共配置:

js
// webpack.base.conf.js
+// 抽离公共配置
+module.exports = {
+  entry: path.resolve(__dirname, './src/index'),
+  output: {
+    path: path.resolve(__dirname, "./dist"),
+    filename: "js/[name].[hash:8].js"
+  },
+  externals: {   // 外部的
+    jquery: "jQuery"
+  },
+  resolve: {  // 解析第三方模块
+    modules: [path.resolve('node_modules')],
+    mainFields: ['style', 'main'],  // 先找style 再找main
+    // mainFile: [], // 入口文件的名字  index.js
+    extensions: ['.js', '.css', '.styl', '.json'],   // 扩展名,依次解析
+    alias: {  // 别名
+      'bootstrap': 'bootstrap/dist/css/bootstrap.css',
+      '@': path.resolve(__dirname, './src')
+    }
+  },
+  module: {
+    rules: [
+      {
+        test: /\.js$/,
+        use: [
+          {
+            loader: "babel-loader?cacheDirectory=true",  // babel编译文件缓存
+            options: {
+              presets: ["@babel/preset-env"],
+              plugins: [
+                ["@babel/plugin-proposal-decorators", { legacy: true }],
+                ["@babel/plugin-proposal-class-properties", { loose: true }],
+                "@babel/plugin-transform-runtime"
+              ]
+            }
+          }
+        ],
+        exclude: /node_modules/,
+        include: path.resolve(__dirname, "./src")
+      },
+      {
+        test: /\.css$/,
+        use: [
+          {
+            loader: devMode ? "style-loader" : MiniCssExtractPlugin.loader
+          },
+          "css-loader",
+          "postcss-loader"
+        ]
+      },
+      {
+        test: /\.styl(us)?/,
+        use: [
+          {
+            loader: devMode ? "style-loader" : MiniCssExtractPlugin.loader
+          },
+          "css-loader",
+          "postcss-loader",
+          "stylus-loader"
+        ],
+        exclude: /node_modules/
+      },
+      {
+        test: /\.(png|jpe?g|gif)$/,
+        use: {
+          loader: "url-loader",
+          options: {
+            // esModule: false
+            limit: 200 * 1024,
+            outputPath: "image",
+            // publicPath: '',
+            name: "[name].[hash:8].[ext]" // 文件名
+          }
+        }
+      }
+    ]
+  },
+  plugins: [
+    new MiniCssExtractPlugin({
+      filename: "style/[name].[hash:8].css"
+    }),
+    new HTMLWebpackPlugin({
+      template: path.resolve(__dirname, "index.html"),
+      minify: {
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+      },
+      filename: 'index.html',
+      // hash: true,   // js加上hash,
+      chunks: ['index']
+    }),
+    new HTMLWebpackPlugin({
+      template: path.resolve(__dirname, "index.html"),
+      minify: {
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+      },
+      filename: 'app.html',
+      chunks: ['index', 'app']
+    }),
+    new CleanWebpackPlugin(),
+    new webpack.ProvidePlugin({
+      // 全局提供插件
+      $: "jquery"
+    })
+  ]
+}

webpack开发环境配置:

js
const baseConfig = require('./webpack.base.conf')
+const Merge = require('webpack-merge')
+const path = require('path')
+const webpack = require('webpack')
+const devConfig = Merge(baseConfig, {
+  mode: 'development',
+  devServer: {
+    port: 2222,
+    hot: true,
+    open: true,
+    contentBase: path.resolve(__dirname, './dist'),
+    progress: true,
+    compress: true,
+    inline: true,
+    // 跨域请求
+    proxy: {
+      '/api': {
+        target: 'http://localhost:3000/juejin',  // 指定要跨域请求的url
+        pathRewrite: {  // 重写路径
+          '^/api': ''
+        }
+      }
+    },
+    // node方式进行跨域
+    before: app => {}
+  },
+  plugins: [
+    // 打印更新了文件的路径
+    new webpack.NamedModulesPlugin(),
+    // webpack支持热更新插件
+    new webpack.HotModuleReplacementPlugin()
+  ]
+})
+module.exports = devConfig

webpack生产环境配置:

js
const baseConfig = require("./webpack.base.conf");
+const webpack = require("webpack");
+const Merge = require("webpack-merge");
+const UglifyJSWebpackPlugin = require("uglifyjs-webpack-plugin");
+const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
+const Moment = require("moment");
+const Date = new Moment().format("YYYY-MM-DD HH:mm:ss");
+const purgecssWebpackPlugin = require('purgecss-webpack-plugin')
+const glob = require('glob')
+const prodConfig = Merge(baseConfig, {
+  mode: "production",
+  // 优化项
+  optimization: {
+    // 对没有使用的依赖,删除导入导出,减小打包体积
+    usedExports: true,  // 此选项已经内置,生产环境下默认是true
+    // 抽离公共代码块
+    splitChunks: {
+      cacheGroups: {  // 缓存组
+        common: {  // 公共模块
+          chunks: 'initial',
+          minSize: 0,
+          minChunks: 2
+        },
+        vender: {   // 第三方模块
+          priority: 1,
+          test: /node_modules/,
+          chunks: 'initial',
+          minSize: 0,
+          minChunks: 2
+        }
+      }
+    },  
+    // 压缩
+    minimizer: [
+      new UglifyJSWebpackPlugin({
+        cache: true, // 缓存
+        parallel: true, // 并发打包
+        sourceMap: true // 源码映射
+      }),
+      new OptimizeCSSAssetsPlugin()
+    ]
+  },
+  devtool: "cheap-module-eval-source-map",
+  watch: false,
+  watchOptions: {
+    poll: 1000, // ms  每秒检查一次
+    aggregateTimeout: 500, // 防抖  500ms
+    ignored: /node_modules/
+  },
+  module: {
+    // 忽略不需要解析的包   因为jQuery,lodash不需要第三方依赖
+    noParse: /jquery|lodash/, 
+  },
+  plugins: [
+    new webpack.BannerPlugin(`
+      @Author: Mr_Wei
+      @Date: ${Date}
+      @Description: 简单的webpack配置学习
+      @Other: xxx   
+    `),
+    // 忽略掉第三方的某些不需要的包
+    new webpack.IgnorePlugin(/\.\/locale/, /moment/),
+    // 去除没用的css样式代码
+    new purgecssWebpackPlugin({
+      paths: glob.sync('./src/**/*', {nodir: true})
+    })
+  ]
+});
+module.exports = prodConfig;

完成以上的配置分离,还没有结束,接下来我们修改package.json的脚本,方便我们打包

json
// package.json
+{
+  // ...
+  "scripts": {
+    "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.dev.conf.js",
+    "build": "cross-env NODE_ENV=production webpack --config webpack.prod.conf.js"
+  }
+}

大功告成,这样写配置是不是更加友好,更加便于后期的维护。

sh
// 开发环境
+npm run dev
+// 生产环境
+npm run build

最后

到这里,其实webpack的基本配置已经讲了不少了,其实还有很多详细的配置,和重要的配置,比如:dll静态库全局插件抽离css第三方包的忽略去除无用的css样式等等。

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2021/flex-layout.html b/article/2021/flex-layout.html new file mode 100644 index 000000000..10ecdb412 --- /dev/null +++ b/article/2021/flex-layout.html @@ -0,0 +1,56 @@ + + + + + + flex布局 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/article/2021/js-pattern.html b/article/2021/js-pattern.html new file mode 100644 index 000000000..83867db52 --- /dev/null +++ b/article/2021/js-pattern.html @@ -0,0 +1,477 @@ + + + + + + JS中的设计模式 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

JS中的设计模式

设计模式 (Design Pattern) 是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结,任何事情都有套路,设计模式就是写代码中常见的套路,有些写法我们日常都在使用,下面我们来介绍一下。

订阅/发布模式(观察者)

pub/sub这个应该大家用到的最广的设计 模式了

在这种模式中,并不是一个对象调用另一个对象的方法,而是一个对象订阅另一个对象

特定活动并在状态改变后获得通知,订阅者因此也成为观察者,而被观察的对象成为发布者或主题。当发生了一个重要事件的时候发布者会通知(调用)所有订阅者并且可能经常以事件对象的形式传递消息。

简单的实现发布订阅设计模式:

js
// 创建EventBus
+class EventBus {
+  constructor() {
+    // 储存事件
+    this.tasks = {};
+  }
+  // 绑定事件
+  $on(eName, cb) {
+    typeof cb == "function"
+      ? this.tasks[eName] || (this.tasks[eName] = [])
+      : this.Error(cb, "is not a function");
+    this.tasks[eName].some(fn => fn == cb) 
+      ? true 
+      : this.tasks[eName].push(cb); // 避免重复绑定
+  }
+  // 触发事件
+  $emit(eName, ...arg) {
+    let taskQueue;
+    this.tasks[eName] && this.tasks[eName].length > 0
+      ? (taskQueue = this.tasks[eName])
+      : this.Error(eName, "is not defined or is a array of having empty callback");
+    taskQueue.forEach(fn => {
+      fn(...arg);
+    });
+  }
+  // 触发一次
+  $once(eName, cb) {
+    let fn = (...arg) => {
+      this.$off(eName, fn);
+      cb(...arg);
+    };
+    typeof cb == "function" && this.$on(eName, fn);
+  }
+  // 卸载事件
+  $off(eName, cb) {
+    let taskQueue;
+    this.tasks[eName] && this.tasks[eName].length > 0
+      ? (taskQueue = this.tasks[eName])
+      : this.Error(eName, "is not exist");
+    if (typeof cb === "function") {
+      let index = taskQueue.findIndex(v => (v == cb));
+      index != -1 &&
+        taskQueue.splice(
+          taskQueue.findIndex(v => (v == cb)),
+          1
+        );
+    }
+    if (typeof cb === "undefined") {
+      taskQueue.length = 0;
+    }
+  }
+  // 异常处理
+  Error(node, errorMsg) {
+    throw Error(`${node} ${errorMsg}`);
+  }
+}

下面我们针对自己的模式进行简单的使用:

js
// 首先定义一个事件池
+const EventSinks = {
+  add(x, y) {
+    console.log("总和: " + x + y);
+  },
+  multip(x, y) {
+    console.log("乘积: " + x * y);
+  },
+  onceEvent() {
+    console.log("我执行一次后就自动卸载");
+  }
+};
+// 实例化对象
+let bus = new EventBus();
+bus.$on("operator", EventSinks.add); // 监听operator事件, 增加一个EventSinks.add
+bus.$on("operator", EventSinks.add); // 当事件名和回调函数相同时,跳过,避免重复绑定
+bus.$on("operator", EventSinks.multip); // 给operator事件增加一个EventSinks.multip回调函数
+bus.$once("onceEvent", EventSinks.onceEvent); // 触发一次后卸载
+console.log(bus.tasks); // { operator: [ [Function: add], [Function: multip] ], onceEvent: [ [Function: fn] ]}
+bus.$emit("operator", 3, 5); // 总和:8  乘积:15
+bus.$emit("onceEvent"); // 我就执行一次
+console.log(bus.tasks); // { operator: [ [Function: add], [Function: multip] ], onceEvent: [] }
+bus.$off("operator", EventSinks.add); // 卸载掉operator事件中的EventSinks.add函数体
+console.log(bus.tasks); // { operator: [ [Function: multip] ], onceEvent: [] }
+bus.$off("operator"); // 卸载operator事件的所有回调函数
+console.log(bus.tasks); // { operator: [], onceEvent: [] }
+bus.$emit("onceEvent"); // onceEvent is not defined or is a array of having empty callback

单例模式

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,否则就创建实例再返回,这就保证了一个类只实例化一次

使用场景:一个单一对象。比如:弹窗,无论点击多少次,弹窗只应该被创建一次,实现起来也很简单,用一个变量缓存起来即可。可以参考ElementUI模态框的实现

简单实现单例模式(只要有个变量确保实例只创建一次):

js
class Singleton {
+  constructor() {}
+}
+Singleton.getInstance = (function() {
+  let instance
+  return function() {
+    if (!instance) {
+      instance = new Singleton()
+    }
+    return instance
+  }
+})()
+let s1 = Singleton.getInstance()
+let s2 = Singleton.getInstance()
+console.log(s1 === s2) // true

当我们再次创建时,如果实例化了,就不在实例化,直接返回,上面可以看出,二者相同

策略模式

策略模式的定义:定义一系列的算法,把他们一个个封装起来,并且使他们可以互相替换 策略模式的目的就是将算法的使用、算法的实现分离出来

一个基于策略模式的程序至少由两部分组成。第一部分是一组策略类(可变),策略类封装了具体的算法,并负责具体的计算过程。第二部分是环境类Context(不变),Context接受客户的请求,随后将请求委托给某一个策略类。要做到这一点,说明Context中要维持对某个策略对象的引用

举个表单校验栗子:

js
// 普通写法
+const form = document.querySelector("#form");
+form.onsubmit = () => {
+  if (form.username.value == "") {
+    console.log("用户名不能为空");
+    return false;
+  }
+  if(form.username.password.length < 10){
+    console.log('密码长度不能小于10')
+    return false
+  }
+}

简单的策略模式

js
// 创建校验器
+const checker = {
+  isEmpty(v, errorMsg){
+    if(value === ''){
+      return errorMsg
+    }
+  },
+  minLength(v, length, errorMsg){
+    if(value.length < length){
+      return errorMsg
+    }
+  }
+}
+const validator = () => {
+  // 校验规则存储
+  this.cache = []
+}
+validator.prototype.add = () => {
+  let arr = rule.split(':')
+  this.cache.push(() => {
+    let valit = arr.shift()
+    arr.unshift(dom.value)
+    arr.push(errorMsg)
+    return checker[valit].apply(dom, arr)
+  })
+}
+validator.prototype.start = () => {
+  for(let i = 0, validatorFunc; validatorFunc = this.cache[i++];){
+    // 开始校验,并取得校验后的返回值
+    let msg = validatorFunc() 
+    if(msg){
+      return msg
+    }
+  }
+}
+const validatorFunc = () => {
+  // 创建一个validator对象
+  let valit = new validator() 
+  valit.add(form.username, 'isEmpty', '用户名不能为空')
+  valit.add(form.password, 'minLength', '密码长度不能小于10')
+  // 获得校验结果
+  let errorMsg = valit.start()  
+  return errorMsg  
+}
+// 再次登录
+const form = document.querySelector("#form");
+form.onsubmit = () => {
+  let errorMsg = validatorFunc()
+  if(errorMsg){
+    console.error(errorMsg)
+    return false
+  }
+}

当创建校验器后,校验规则清晰明了,可以动态增改,便于维护

代理模式

为一个对象提供一个代用品或占位符,以便控制它的访问 常用的虚拟代理形式:某一个花销很大的操作,可以通过虚拟代理的方式延迟这种需要他的时候才去创建(例:使用虚拟代理实现图片懒加载)

图片懒加载的方式:先通过一张loading图占位,然后通过异步的方式加载图片,等图片加载好了再把请求成功的图片加载到img标签上

栗子:

js
const imgFunc = (() => {
+    const imgNode = document.createElement('img')
+    document.body.appendChild(imgNode)
+    return{
+        setSrc: function(src){
+            imgNode.src = src
+        }
+    }
+})()
+const proxyImage = (() => {
+    let img = new Image()
+    img.onload = function(){
+        imgFunc.setSrc(this.src)
+    }
+    return {
+        setSrc: function(src){
+            imgFunc.setSrc('./loading.gif')
+            img.src = src
+        }
+    }
+})()
+proxyImage.setSrc('./pic.png')()

上面的栗子实现了加载图片时,在图片加载成功前,指定特定的图片,加载完成后替换成真是的数据

在我们生活中常用的事件代理、节流防抖函数其实都是代理模式的实现

装饰器模式

在不改变对象自身的基础上,在程序运行期间给对象动态地添加方法,注解也可以理解为装饰器。常见应用:react的高阶组件,或者react-redux中的@connect或者自己定义一些高阶组件 简单实现:

js
import React from 'react'
+const withLog = Component => {
+  // 完好无损渲染出来, 只是添加了两个生命周期函数
+  class NewComponent extends React.Component{
+    // 1
+    componentWillMount(){ 
+      console.time('ComponentRender')
+      console.log('准备完毕了')
+    }
+    render(){  // 完好无损渲染出来
+      return <Component { ...this.props }></Component>
+    }
+    // 2
+    componentDidMount(){
+      console.timeEnd('ComponentRender')
+      console.log('渲染完毕了')
+    }
+  }
+  return NewComponent
+}
+export { withLog }
+@withLog
+class xxx

在redux中可以找出装饰器的方式,其实Vue中的v-inputv-checkbox也可以认为是装饰器模式,对原生input和checkbox做一层装饰

装饰器模式和代理模式的结构看起来非常相似,这两种模式都描述了怎样为对象提供一定程度上的间接引用,并且向那个对象发送请求。代理模式和装饰器模式最重要的区别在于它们的意图和设计目的。代理模式的目的是:当直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者。装饰模式目的是:为对象动态加入的行为,本体定义了关键功能,而装饰器提供或拒绝它的访问,或者在访问本体前做一些额外的事。

外观模式

即在内部让多个方法一起被调用 涉及到兼容性,参数支持多格式,有很多这种代码,对外暴露统一API,比如上面的$on支持数组,$off参数支持多种情况,对面只用一个函数,内部判断实现

举个简单的栗子:

js
// 封装一些事件,让其兼容各个浏览器
+const myEvent = {
+  stopBubble(e){
+    if(typeof e.preventDefault() === 'function'){
+      e.preventDefault()
+    }
+    if(typeof e.stopPropagation() === 'function'){
+      e.stopPropagation()
+    }
+    // for IE
+    if(typeof e.returnValue === 'boolean'){
+      e.returnValue = false
+    }
+    if(typeof e.cancelBubble === 'boolean'){
+      e.cancelBubble = false
+    }
+  },
+  addEvent(dom, type, cb){
+    if(dom.addEventListener){
+      dom.addEventListener(type, cb, false)
+    } else if(dom.attachEvent){
+      dom.attachEvent('on' + type, cb)
+    }else{
+      dom['on' + type] = cb
+    }
+  }
+}

以上就用外观模式封装了两个基本事件,让其兼容各种浏览器,调用者不需要知道内部的构造,只要知道这个方法怎么用就行了。

工厂模式

提供创建对象的接口,把成员对象的创建工作转交给一个外部对象,好处就是消除对象直接的耦合(也就是相互影响) 常见的栗子,我们的弹窗message,对外部提供API,都是调用API,然后新建一个弹窗或者message的实例,就是典型的工厂模式

简单的栗子:

js
class Man {
+  constructor(name) {
+    this.name = name
+  }
+  say(){
+      console.log(`我的名字 ` + this.name)
+  }
+}
+const p = new Man('JavaScript')
+p.say() // 我的名字 JavaScript

当然工厂模式并不仅仅是用来 new 出实例

可以想象一个场景。假设有一份很复杂的代码需要用户去调用,但是用户并不关心这些复杂的代码,只需要你提供给我一个接口去调用,用户只负责传递需要的参数,至于这些参数怎么使用,内部有什么逻辑是不关心的,只需要你最后返回我一个实例。这个构造过程就是工厂。

再比如下面Vue这个例子:

js
const Notification = function(options) {
+  if (Vue.prototype.$isServer) return;
+  options = options || {};
+  let userOnClose = options.onClose;
+  let id = "notification_" + seed++;
+  let postion = options.postion || "top-right";
+  options.onClose = function() {
+    Notification.close(id, userOnClose);
+  };
+  instance = new NotificationConstructor({
+    data: options
+  });
+  if(isVNode(options.message)){
+    instance.$slots.default = [options.message]
+    options.message = 'REPLACED_BY_VNODE'
+  }
+  instance.id = id
+  instance.$mount()
+  document.body.appendChild(instance.$el)
+  instance.visible = true
+  instance.dom = instance.$el
+  instance.dom.style.zIndex = PopupManager.nextZIndex()
+  let verticalOffset = options.offset || 0
+  instances.filter(item => {
+    verticalOffset += item.$el.offsetHeight + 16
+  })
+  verticalOffset += 16
+  instance.verticalOffset = verticalOffset
+  instances.push(instance)
+  return instance
+};

在上述代码中,我们可以调用它封装好的方法就可以创建对象实例,至于它内部的实现原理我们并不关心。

建造者模式Builder

和工厂者模式相比,参与了更多创建过程或者更加复杂

js
const Person = function(name, work){
+  // 创建应聘者缓存对象
+  let _person = new Human()
+  // 创建应聘者姓名解析对象
+  _person.name = new NamedNodeMap(name)
+  // 创建应聘者期望职位
+  _person.work = new Worker(work)
+  return _person
+}
+const p = new Person('小明', 'Java')
+console.log(p)

迭代器模式

指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 比如常用的:every、map、filter、forEach等等

js
const each = function(arr, callback){
+  if(!Array.isArray(arr)){
+    throw Error(`${arr} is not a Array`)
+  }
+  for(let i = 0, l = arr.length; i < l; i++){
+    callback.call(arr[i], i, arr[i])
+  }
+}
+each([1,2,4], function(i, n){
+  console.log([i, n])
+})

享元模式

一种用于性能优化的模式,fly在这里是苍蝇的意思,意为蝇量级。享元模式的核心是运用共享技术来有效支持大量细粒度的对象。如果系统中因为创建了大量类似的对象而导致内存占用过高,享元模式就是非常有用了。在JavaScript中,浏览器特别是移动端的浏览器分配的内存并不多,如何节省内存就成了一件非常有意义的事情 假设有个内衣工厂,目前的产品有50中男衣和50中女士内衣,为了推销产品,工厂决定生产一些塑料模特来穿上他们的内衣拍成广告照片。正常情况下需要50个男模特和50个女模特,然后让他们每人分别穿上一件内衣来拍照

普通的做法:

js
const Model = function(sex, underwear){
+  this.sex = sex
+  this.underwear = underwear
+}
+Model.prototype.takePhoto = function(){
+  console.log('sex=' + this.sex + ' underwear=' + this.underwear)
+}
+for(let i = 1; i <= 50; i++){
+  let maleModel = new Model('male', 'underwear' + i)
+  maleModel.takePhoto()
+}
+for(let join = 1; join <= 50; join++){
+  let femaleModel = new Model('female', 'underwear' + join)
+  femaleModel.takePhoto()
+}

采用享元模式:

js
const Model = function(sex){
+  this.sex = sex
+}
+Model.prototype.takePhoto = function(){
+  console.log('sex=' + this.sex + ' underwear=' + this.underwear)
+}
+// 分别创建一个男模特和一个女模特对象
+let maleModel = new Model('male'),
+    femaleModel = new Model('female')
+// 给男模特依次穿上所有的男装,并进行拍照
+for(let i = 1; i <= 50; i++){
+  maleModel.underwear = 'underwear' + i
+  maleModel.takePhoto()
+}
+// 给女模特依次穿上所有的女装,并进行拍照
+for(let j = 1; j <= 50; j++){
+  femaleModel.underwear = 'underwear' + j
+  femaleModel.takePhoto()
+}
  • 内部状态存储于对象内部
  • 内部状态可以被一些对象共享
  • 内部状态独立于具体的场景,通常不会改变
  • 外部状态取决于具体的场景,并根据场景而变化,外部状态不能被共享

职责链模式

使多个对象都有机会处理请求,从而避免请求发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。职责链模式的名字非常形象,一系列可能会处理请求的对象被连成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,我们把这些对象称为链中的节点

简单的栗子:假设我们负责一个售卖手机的电商网站,分别经过缴纳500元定金和200元定金的两轮预定后(订单已在此时生成),现在已经到了正式购买的阶段。公司针对支付过预定金的用户有一定的优惠政策。在正式购买后,已经支付过500元定金的用户会受到100元的商城优惠券,200元定金的用户可以收到50元的优惠券,而之前没有支付定金的用户只能进入普通购买模式,也就是没有优惠券,且在存库有限的情况下不一定保证买到

js
let order500 = function(orderType, pay, stock) {
+  if (orderType === 1 && pay === true) {
+    console.log("500元定金预购,得到100元优惠券");
+  } else {
+    // 我不知道下一个节点是谁,反正把请求往后面传递
+    return "nextSuccessor";
+  }
+};
+let order200 = function(orderType, pay, stock) {
+  if (orderType === 2 && pay === true) {
+    console.log("200元定金预购,得到50元优惠券");
+  } else {
+    return "nextSuccessor";
+  }
+};
+let orderNormal = function(orderType, pay, stock) {
+  if (stock > 0) {
+    console.log("普通购买, 无优惠券");
+  } else {
+    console.log("库存不足");
+  }
+};
+let Chain = function(fn) {
+  this.fn = fn;
+  this.successor = null;
+};
+// Chain.prototype.setNextSuccessor 指定在链中的下一个节点
+Chain.prototype.setNextSuccessor = function(successor) {
+  return (this.successor = successor);
+};
+// Chain.prototype.passRequest 传递请求给某个节点
+Chain.prototype.passRequest = function() {
+  let ret = this.fn.apply(this, arguments);
+  if (ret === "nextSuccessor") {
+    return (
+      this.successor &&
+      this.successor.passRequest.apply(this.successor, arguments)
+    );
+  }
+  return ret;
+};
+let chainOrder500 = new Chain(order500)
+let chainOrder200 = new Chain(order200)
+let chainOrderNormal = new Chain(orderNormal)
+chainOrder500.setNextSuccessor(chainOrder200)
+chainOrder200.setNextSuccessor(chainOrderNormal)
+// 500元定金预购,得到100元优惠券
+chainOrder500.passRequest(1, true, 500)
+// 200元定金预购,得到50元优惠券
+chainOrder500.passRequest(2, true, 500)
+// 普通购买,无优惠券
+chainOrder500.passRequest(3, true, 500)
+// 库存不足
+chainOrder500.passRequest(1, false, 0)

适配器模式

解决两个软件实体间的接口不兼容的问题。使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作。适配器的别名是包装器(wrapper),这是一个相对简单的模式。在程序开发过程中有许多这样的场景:当我们试图调用模块或者对象的某个接口时,却发现这个接口的格式并不符合目前需求。这时候有两种解决办法,第一种是修改原来的接口实现,但如果原来的模板很复杂,或者我们拿到模块是一段别人编写的经过压缩的代码,修改原接口就显得不太现实了。第二种方法是创建一个适配器,将原接口转换为客户希望的另一个接口,客户只需要和适配器打交道

js
let googleMap = {
+  show: function(){
+    console.log('开始渲染谷歌地图')
+  }
+}
+let baiduMap = {
+  display: function(){
+    console.log('开始渲染百度地图')
+  }
+}
+let baiduMapAdapter = {
+  show: function(){
+    return baiduMap.display()
+  }
+}
+renderMap(googleMap)  // 开始渲染谷歌地图
+renderMap(baiduMapAdapter)  // 开始渲染百度地图

适配器模式主要用来解决两个已有接口不匹配的问题,它不考虑这接口时怎么实现的,也不考虑他们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够使他们协同作用

装饰模式和代理模式也不会改变原有对象的接口,但装饰器模式的作用是为了给对象增加功能。装饰器模式常常形成一条长的装饰链,适配器模式通常只包装一次。代理模式为了控制对对象的访问,通常也只包装一次。

我们设计很多插件,有默认值,也算是适配器的一种应用,vue的prop校验,default也算是适配器的应用了

外观模式的作用倒是和适配器比较相似,有人把外观模式看成一组对象的适配器,但外观模式最显著的特点是定义了一个新的接口。

模板方法模式

在一个方法中定义一个算法骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现 我们常用的有很多,vue中的slot,react中的children

js
class Parent {
+  constructor() {}
+  render() {
+    <div>
+      <div name="tom"></div>
+      {/* 算法过程:children要渲染在name为joe的div中 */}
+      <div name="joe">{this.props.children}</div>
+    </div>
+  }
+}
+class Stage{
+  constructor(){}
+  render(){
+    // 在parent中已经设定了children的渲染位置算法
+    <Parent>
+      // children的具体实现
+      <div>child</div>
+    </Parent>
+  }
+}
html
<template>
+  <div>
+    <div name="tom"></div>
+    <div name="joe">
+      <slot />
+    </div>
+  </div>
+</template>
+<template>
+  <div>
+    <parent>
+      <!-- children的具体实现 -->
+      <div>child</div>
+    </parent>
+  </div>
+</template>

中介者模式

通过一个中介者对象,其他所有的相关对象都通过该中介者来通信,而不是相互引用,当其中的一个对象发生改变时,只需要通知中介者对象即可。通过中介者模式可以解除对象与对象之间的紧耦合关系(目的就是减少耦合) 栗子:现实生活中,航线上的飞机只需要和机场的塔台通信就能确定航线和飞行状态,而不需要和所有飞机通信。同时塔台作为中介者,知道每架飞机的飞行状态,所以可以安排所有飞机的起降和航信安排。

中介者模式使用场景:例如购物车需求,存在商品选择表单、颜色选择表单、购买数量表单等等,都会触发change事件,那么可以通过中介者来转发处理这些事件,实现各个事件间的解耦,仅仅维护中介者对象即可。

redux、vuex都属于中介者模式的实际应用,我们把共享的数据,抽离成一个单独的store,每个都通过tore这个中介者来操作对象

备忘录模式

可以恢复到对象之前的某个状态,其实大家学习react或者redux的时候,时间旅行的功能,就算是备忘录模式的一个应用

总结

创建设计模式:工厂,单例、建造者、原型 结构化设计模式:外观,适配器,代理,装饰器,享元,桥接,组合 行为型模式:策略、模板方法、观察者、迭代器、责任链、命令、备忘录、状态、访问者、终结者、解释器

参考文档

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2021/performance-tools.html b/article/2021/performance-tools.html new file mode 100644 index 000000000..325f99844 --- /dev/null +++ b/article/2021/performance-tools.html @@ -0,0 +1,58 @@ + + + + + + 前端性能测试工具 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

前端性能测试工具

PageSpeed Insights

谷歌开发的一个免费的网页分析工具,在地址栏中输入被分析的网站 url 地址,点击分析,在地址栏中输入被分析的网站 url 地址,点击分析

可模拟移动设备访问页面结果分析 桌面设备访问页面结果分析 前端开发工程师,可以根据这个报告进行页面优化

Lighthouse

Lighthouse 是谷歌开源的一款 Web 前端性能测试工具,用于改进网络应用的质量,适用于网页版和移动端。能生成一个包括页面性能、PWA(Progressive Web apps,渐进式 Web 应用)、可访问性(无障碍)、最佳实践、SEO 的报告清单提供参考,看看可以采取哪些措施来改进您的应用。

使用方法

  • 浏览器 F12 功能 在最新的谷歌浏览器 或 Edge 浏览器 访问一个被测试网站,按 F12 ,打开开发者工具,看到最后一个项就是 Lighthouse
  • 下载安装到电脑
    sh
    npm install -g lighthouse

测试某网站

  1. 访问被测网站,打开浏览器的开发者工具 sitespeed01-06288c1d.png

  2. 点击【生成报告】 就会自动分析你访问的网站,得出性能分析报告 sitespeed02-f43bb52a.png

这款工具,大家在用浏览器访问任意一个页面(包括需要登录,才能访问的页面),想要对这个页面进行性能分析都非常简单。

SiteSpeed

SiteSpeed 也是一款开源的,可以用于监控和检查网站性能的工具。可以通过 docker 镜像或 npm 方式来使用。这个工具,并不是单一的,而是一组工具集合,可以根据自己需要,选择适合自己的工具。

安装

  • docker安装
bash
sudo docker run --rm -v "$(pwd):/sitespeed.io"
+sitespeedio/sitespeed.io:14.4.0 https://www.taobao.com/
  • npm安装
bash
$ npm install -g sitespeed.io   # 安装
+$ sitespeed.io https://www.taobao.com/  # 测试淘宝网站

测试

测试结束后,会把测试结果写到 HTML 文件 Snipaste20200901sitespeed01-2c335bdc.png

Speedcurve

Speedcurve 是一个前端性能综合监控网站,可以在网站输入被测网站的 url 地址,进行测试 iShot2022-03-27 09.46.41.png

选择要默认访问网站的设备,进行模拟访问 iShot2022-03-27 09.49.27.png

你也可以将js脚本添加到网站中 iShot2022-03-27 09.50.19.png

访问后,网站会给出一份性能测试监控报告 Snipaste20200901speedcurve04-40399a17.png

webpagetest

webpagetest 和上面的 speedcurve 相似,也是在一个网站中,输入被测试的网站 ip 地址,就可以对被测网站页面进行分析。但是,这个网站在国内,被友好的和谐了,会出现无法正常进行测试的情况。 Snipaste20200901webpagetest01-06e3b767.png

好了,这些是现在比较方便的前端性能测试工具,你都了解吗?可能有同学会说为什么没有 yslow,嗯,这个也是前端性能测工具,但是,你可以去搜索下,看下你现在的电脑上能非常方便的使用这个工具吗?yslow,不可否认,是一款经典的 Web 端性能测试工具,但是现在使用起来非常的不方便,所以现在你想去学习这款工具,可能事被功半,收不到预期的效果,所以,个人不推荐大家学习这款工具了。

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2021/pwa-app.html b/article/2021/pwa-app.html new file mode 100644 index 000000000..25c894652 --- /dev/null +++ b/article/2021/pwa-app.html @@ -0,0 +1,133 @@ + + + + + + PWA渐进式应用 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

PWA渐进式应用

需要manifestserviceWorker

出现条件:

  • 性能问题
  • 用户留存

安装条件:

  • 未安装 Web 应用程序
  • 符合用户参与启发式
  • 通过 HTTPS 提供服务
  • 具有一个 Web 应用清单,其中包括:
    • short_name 或 name
    • icons - 必须包含一个 192 像素和一个 512 像素的图标
    • start_url
    • display - 必须是 fullscreen、standalone 或 minimal-ui
    • 不能有 prefer_related_applications,或值为 false
  • 使用 fetch 处理程序注册服务工作进程
html
<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>xxx</title>
+    <meta name="description" content="A list of A-Frame entries submitted to the js13kGames 2017 competition, used as an example for the MDN articles about Progressive Web Apps.">
+    <meta name="author" content="end3r">
+    <meta name="theme-color" content="#B12A34">
+    <meta name="description" content="A list of A-Frame entries submitted to the js13kGames 2017 competition, used as an example for the MDN articles about Progressive Web Apps.">
+    <meta name="author" content="end3r">
+    <meta property="og:image" content="icons/icon.png">
+    <link rel="shortcut icon" href="favicon.ico">
+    <link rel="manifest" href="manifest.json">
+</head>
+<body>
+
+    <h2>hello...</h2>
+    
+    <script>
+        if ("serviceWorker" in navigator) {
+            window.addEventListener("load", () => {
+                navigator.serviceWorker.register("worker.js").then(res => {
+                    console.log("register")
+                }).catch(err => {
+                    console.log(err)
+                })
+            })
+        }
+    </script>
+</body>
+</html>
js
// worker.js
+self.addEventListener("install", (event) => {
+    console.log("install")
+    event.waitUnit(self.skipWaiting())
+})
+
+self.addEventListener("activate", (event) => {
+    console.log("activate")
+    event.waitUnit(self.clients.claim())
+})
+
+
+self.addEventListener("fetch", (event) => {
+    console.log("fetch")
+})
json
// manifest.json
+{
+    "name": "hengshuai's blog",
+    "short_name": "hengshuai's blog",
+    "description": "a progress blog app for sharing web development experiences...",
+    "icons": [
+          {
+            "src": "/384.png",
+            "sizes": "384x384",
+            "type": "image/png"
+          },
+          {
+            "src": "/256.png",
+            "sizes": "256x256",
+            "type": "image/png"
+          },
+          {
+            "src": "/192.png",
+            "sizes": "192x192",
+            "type": "image/png"
+          },
+          {
+            "src": "/128.png",
+            "sizes": "128x128",
+            "type": "image/png"
+          }
+    ],
+    "start_url": "https://blog.usword.cn",
+    "display": "minimal-ui",
+    "theme_color": "#747bff",
+    "background_color": "#747bff"
+}

参考文章

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2021/ts-decorator.html b/article/2021/ts-decorator.html new file mode 100644 index 000000000..4b33a2f49 --- /dev/null +++ b/article/2021/ts-decorator.html @@ -0,0 +1,380 @@ + + + + + + Typescript装饰器指南 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Typescript装饰器指南

Typescript装饰器模式,可以有效的提高开发效率,就像Java那种注解;装饰器让TypeScript的世界更好。 我们使用的许多库都基于这一强大特性构建, 例如AngularNestjs。 在这文章中我将介绍装饰器和它的许多细节。 我希望在读完这篇文章后,你可以理解何时和如何使用这一强的的特性。

概念

装饰器本身就是一种特殊的函数,被用于类的各个属性(类本身、类属性、类方法、类访问器、类方法的参数),装饰器就像高阶函数一样,对目标做了一层中间操作,可以很简洁的无痛修改一些功能和做一些有趣的功能

一个小例子:

tsx
// 日志打印
+function logger(key: string): any {
+  return function () {
+    console.log("call: \t\t", key);
+  };
+}
+
+class HTTP {
+  @logger("get")
+  static get(url?: string) {
+    return url;
+  }
+}
+HTTP.get();  // 打印 call: get

装饰器类别

前面说了装饰器主要是用于类中,所以就有类、类方法、类属性、类访问器属性、类方法参数装饰器,接下来我们就一个个介绍

在介绍装饰器前,先介绍个工具库,在装饰器中反射往往发挥着很大作用,reflect-metadata库通常在装饰器中都会使用,接下来介绍下其基本作用

Reflect-metadata(元数据)

严格地说,元数据和装饰器是EcmaScript中两个独立的部分。 然而,如果你想实现像是反射这样的能力,你总是同时需要它们。有了reflect-metadata的帮助, 我们可以获取编译期的类型。
借助reflect-metadata,编译器可以拿到的类型有三种:

  • design:type:属性类型
  • design:paramtypes:方法的参数类型
  • design:returntypes:方法返回值的类型

这三种方式拿到的结果都是构造函数(例如String和Number)。规则是:

  • number -> Number
  • string -> String
  • boolean -> Boolean
  • void/null/never -> undefined
  • Array/Tuple -> Array
  • Class -> Construtor
  • Enum -> 如果是纯数字枚举为Number,否则为Object
  • Function -> function
  • 其余都是Object

类装饰器

类型:

tsx
type ClassDecorator = <Func extends Function>(target: Func) => Func | void;

参数:

  • @target:类的构造器
  • @return:如果有值将会替代原有的类构造器的声明;或不返回值也可以修改原有的类

用途:

类装饰器可以继承现有类添加或修改一些属性或方法

tsx
// 扩展一个toString方法
+type Consturctor = { new (...args: any[]): any };
+
+function toString<T extends Consturctor>(target: T): T {
+  return class extends target {
+    public toString() {
+      return JSON.stringify(this);
+    }
+  };
+}
+
+@toString
+class Car {
+  constructor(public prize: number, public name: string) {}
+}
+
+// ts不会智能的推导出toString方法
+console.log(new Car(1000, "BMW").toString()); // {"prize":1000,"name":"BMW"}

属性装饰器

类型:

tsx
type PropertyDecorator = (target: Record<string|symbol, any>, prop: string | symbol) => any | void

参数:

  • @target:对于实例属性成员是类的原型链,对于静态属性是类的构造器
  • @prop:当前属性名称
  • @return:返回的值将被忽略

用途:

属性装饰器可以收集信息,反射赋值,给类添加方法等等,下面介绍一个完整的例子

tsx
import "reflect-metadata"; // 这里需要借助一个反射库
+
+type Constructor = { new (...args: any): any }
+
+// 用来管理所有可注入的service
+const services: Map<Constructor, Constructor> = new Map();
+
+// 注入装饰器
+function Inject<T extends Constructor>(target: T) {
+  services.set(target, target);
+}
+// 获取注入的service装饰器
+function Service(target: Record<string|symbol, any>, key: string | symbol) {
+  const service = services?.get(Reflect.getMetadata("design:type", target, key));
+  service && (target[key] = new service());
+}
+
+// 常量装饰器
+function constant(value: any) {
+  return function (target: object, key: string) {
+    Object.defineProperty(target, key, {
+      enumerable: false,
+      configurable: false,
+      get() {
+        return value;
+      },
+      set() {
+        return value;
+      },
+    });
+  };
+}
+
+// 用户相关Service
+// 让当前service变成可注入
+@Inject
+class UserService {
+        // 模拟获取用户信息
+  public getUser(...args: any) {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve("user")
+      }, 1000)
+    })
+  }
+}
+
+// 用户页面
+class UserPage extends React.Component{
+  @Service  // 注入UserService
+  public service: UserService;
+
+  // 让BASE_URL变成常量
+  @constant(process.env.BASE_URL || 'https://www.baidu.com')
+  private _BASE_URL: string;
+
+  public getUser() {
+    console.log(this.service)
+    return this.service?.getUser({ BASE_URL: this._BASE_URL })
+  }
+
+  render() {
+    return <>
+      <button onClick={this.getUser}>获取用户信息</button>
+    </>
+  }
+}

上面点击获取用户信息按钮就会去请求用户的信息,打印结果如下

https://s3.bmp.ovh/imgs/2022/06/30/a4db1835bc490571.png

方法装饰器

类型:

tsx
Type MethodDecorator = (target: Record<string|symbol, any>, 
+prop: string | symbol, descriptor: PropertyDescriptor) => PropertyDescriptor |  void

参数:

  • @target:对于静态成员是类构造器,对实例成员是原型链
  • @prop:属性名称
  • @descriptor:属性描述器
  • @return:属性描述器或不返回

用途:

方法装饰器可以高阶目标方法,做一些参数转换,数据收集等等,如日志收集

tsx
// 接着上面的介绍,做一个日志收集logger
+
+// 日志收集
+function logger(target: object, key: string, descriptor: PropertyDescriptor) {
+  const origin = descriptor.value;
+  descriptor.value = async function (...args: any[]) {
+    try {
+      const start = +new Date();
+      const rs = await origin.call(this, ...args);
+      const end = +new Date();
+
+      // 打印请求耗时
+      console.log(`@logger: ${key} api request spend`, `${end - start}ms.`);
+
+      // 这里可以做一些相关收集...
+      return rs;
+    } catch (err) {
+      console.log(err);
+    }
+  };
+}
+
+@Inject
+class UserService {
+  @logger
+  // 登录Request
+  async postLogin(username: string) {
+    const time = Math.floor(Math.random() * 10 * 1000);
+    const rs = await new Promise((resolve, reject) => {
+      setTimeout(() => {
+        if (Math.floor(Math.random() * 26) % 10) {
+          resolve(username + ' logined success...');
+        } else {
+          reject('error');
+        }
+      }, time);
+    });
+    return rs;
+  }
+}
+
+// 用户页面
+class UserPage extends React.Component{
+  @Service  // 注入UserService
+  public service: UserService;
+
+  public async toLogin(username: string) {
+    return await this.service?.postLogin(username);
+  }
+
+  render() {
+    return <>
+      <button onClick={() => this.toLogin('Mr Ming')}>登录</button>
+    </>
+  }
+}

上面点击登录后会记录请求耗时,控制台打印的结果如下:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3tgd7rxirj30r60a640p.jpg

访问器装饰器

  • 访问器装饰器和方法装饰器差不多,唯一不同的就是key不同
  • 方法装饰器:value、wriable、enumerable、configurable
  • 访问器装饰器:get、set、enumerate、configurable

用途:

tsx
// 不变装饰器
+function immutable(
+  target: any,
+  propertyKey: string,
+  descriptor: PropertyDescriptor,
+) {
+  descriptor.set = function (value: any) {
+    return value;
+  };
+}
+
+// 私有属性装饰器
+function toPrivate(target: object, key: string) {
+  let _val: any = undefined;
+  Object.defineProperty(target, key, {
+    enumerable: false,
+    configurable: false,
+    get() {
+      return _val;
+    },
+    set(val) {
+      _val = val;
+    },
+  });
+}
+
+// 用户页面
+class UserPage extends React.Component{
+  @Service  // 注入UserService
+  public service: UserService;
+
+  @toPrivate
+  private _PORT: number = 3306;
+  get PORT() {
+    return this._PORT;
+  }
+  @immutable
+  set PORT(port: number) {
+    this._PORT = port;
+  } 
+
+  render() {
+    return <>
+      <button onClick={() => (this.PORT = 2)}>改变PORT</button>
+    </>
+  }
+}

现在给PORT赋值,将不会改变_PORT的值,如下图:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3ti440ni7j312w0sgqbp.jpg

参数装饰器

类型:

tsx
type ParamerDecorator = (target: Record<string|symbol, any>, prop: string | symbol, paramIdx: number) => void

参数:

  • @target:对于实例属性是类的原型链,对于静态属性是类的构造器
  • prop:属性名
  • paramIdx:参数位置

用途:

参数装饰器单独使用很有限,一般结合其他装饰器一起使用;下面介绍一个验证器案例,用户可以自定义验证器也可以使用原始类型来验证参数是否正确:

tsx
// 参数装饰器
+type ParamerDecorator = (
+  target: Record<string | symbol, any>,
+  prop: string | symbol,
+  paramIdx: number,
+) => void;
+// 自定义验证器
+type Validater = (...args: any) => boolean;
+const validatorStorage: Record<string | symbol, Validater[]> = {};
+const typeDecoratorFactory =
+  (validator: Validater): ParamerDecorator =>
+  (target, prop, idx) => {
+    const targetValidators = validatorStorage[prop] ?? [];
+    targetValidators[idx] = validator;
+    validatorStorage[prop] = targetValidators;
+  };
+const isString = typeDecoratorFactory((str: string) => typeof str === 'string');
+// 源验证器或自定义参数验证器
+function validator(
+  target: object,
+  prop: string,
+  descriptor: PropertyDescriptor,
+) {
+  // 反射获取参数源类型
+  const typeMetaDatas: Function[] = Reflect.getMetadata(
+    'design:paramtypes',
+    target,
+    prop,
+  );
+  const origin = descriptor.value;
+  descriptor.value = function (...args: any[]) {
+    // 取到自定义验证器
+    const validators = validatorStorage[prop];
+
+    // 验证参数
+    if (args) {
+      args.forEach((arg, idx) => {
+        // 自定义验证器
+        const validate = validators?.[idx];
+        // 源类型验证器
+        const metaValidate = typeMetaDatas?.[idx];
+        const errorMsg = `Failed for parameter: ${prop} at method of ${
+          JSON.stringify(target.constructor?.toString())?.match(
+            /function (\w+)/i,
+          )?.[1]
+        }, expect 【${metaValidate.name?.toLowerCase()}】but 【${typeof arg}`;
+        if (validate && !validate(arg)) {
+          throw new TypeError(errorMsg);
+        }
+        // 没有自定义验证器执行默认验证器
+        else if (!validate) {
+          if (metaValidate !== arg?.constructor) {
+            throw new TypeError(errorMsg);
+          }
+        }
+      });
+    }
+
+    // 执行源函数
+    return origin.call(this, ...args);
+  };
+}
+
+class LoginPage {
+  // 省略前面代码...
+
+  @validator
+  public async toLogin(@isString username: string) { // 期望username为string
+    return await this.service?.postLogin(username);
+  }
+
+  render() {
+    return <>
+      <button onClick={() => (this.toLogin(xxx)}>登录</button>
+    </>
+  }
+}

现在当点击登录时,调用toLogin方法,就会验证username的参数是否合法(当然前提是参数不能为空的,ts也是无法知道参数是否必填,只是来验证参数的类型罢了),打印如下:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3tt2o96xrj315k11ob29.jpg

当将isString代码改为 typeDecoratorFactory((str: object) => str?.name === ‘Mr Ming’);

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3ttid8rcnj31360e4alm.jpg

当删除自定义验证器,再次执行会验证默认的类型验证器:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3ttkha08bj31460lqh5j.jpg

执行顺序

上面我们针对每个类型的装饰器分别做了介绍并作了相关的例子实验,现在我们可以同时使用不同的装饰器,测试一下不同类型装饰器的执行顺序是如何的:

tsx
// 记录
+function trace(key: string): any {
+  console.log('evaluate: \t', key);
+  return function () {
+    console.log('call: \t\t', key);
+  };
+}
+
+// 类装饰器
+@trace('Class Decorator')
+class People {
+  protected _name: string;
+
+  @trace('Static Property _instance')
+  public static _instance?: People;
+
+  @trace('Instance Property grade')
+  public grade: number;
+
+  constructor(@trace('Constructor Parameter') name: string) {
+    this._name = name;
+    this.grade = 0;
+    this.age = 0;
+  }
+
+  @trace('属性访问器')
+  public get name() {
+    return this._name;
+  }
+
+  @trace('Instance Method')
+  add(
+    @trace('Instance Method Param x') x: number,
+    @trace('Instance Method Param y') y: number,
+  ): number {
+    return x + y;
+  }
+
+  @trace('Instance Property age')
+  public age: number;
+
+  @trace('Static Method getInstance')
+  public static getInstance(
+    @trace('Static Method Param name') name: string,
+  ): People {
+    if (!this._instance) {
+      this._instance = new People(name);
+    }
+    return this._instance;
+  }
+}

上面的打印结果如下:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3tubgm2udj31680ymx4h.jpg

从上面的结果可以得出结论: 装饰器访问顺序

  1. 实例属性:按定义从上往下 => 属性/方法(参数 -> 方法名)/属性访问器
  2. 静态属性:按定义从上往下 => 属性/方法(参数 -> 方法名)
  3. 构造器参数
  4. 类装饰器

当改变实例或者静态属性的定义顺序,响应的执行顺序也会按着从上往下定义的顺序执行,有兴趣的小伙伴可以动手试试

至此,有关typescript的装饰器的基本使用就介绍完了,相信看到这里的小伙伴也会对其有相关的了解,希望读完后自己动手实践

实践

tsx
// 待补充
若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2021/vue-core-process.html b/article/2021/vue-core-process.html new file mode 100644 index 000000000..40d3a843c --- /dev/null +++ b/article/2021/vue-core-process.html @@ -0,0 +1,309 @@ + + + + + + 谈谈Vue内部的运行机制 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

谈谈Vue内部的运行机制

前言

在使用vue开发时,都是从new Vue() 开始构建的,将state(data、props、methods...)、template、render等做为参数选项传入,vue内部就自动处理最后生成HTML呈现在页面上,那内部到底是怎么个流程呢?

在网上看到的文章大多都是直接讲双向绑定原理等一些内部实现机制,很少从构建开始讲起,这会对Vue的构建有一些疑惑,带着这份疑惑,接下来就开始进行分析吧

从构建开始

首先我们得找到Vue的入口,new VueVue是在哪里定义的,因为Vue是基于Rollup(一个 JavaScript 模块打包器常用于构建库)进行构建的,可以在源码项目中build.js中看到rollup的相关配置,我们在package.json中看到有很多脚本用于vue的构建,

从脚本中可以看出,运行不同脚本用来构建不同版本的文件,我们直接看build,实际运行node scripts/build.js,也就是说打包运行的就是这个文件,接下来看看build.js里面都是些什么内容。

js
// scripts/build.js
+let builds = require('./config').getAllBuilds()
+
+// ...
+
+build(builds)
+
+function build (builds) {
+  let built = 0
+  const total = builds.length
+  const next = () => {
+    buildEntry(builds[built]).then(() => {
+      built++
+      if (built < total) {
+        next()
+      }
+    }).catch(logError)
+  }
+
+  next()
+}
+
+function buildEntry (config) {
+  const output = config.output
+  const { file, banner } = output
+  const isProd = /(min|prod)\.js$/.test(file)
+  return rollup.rollup(config)
+    .then(bundle => bundle.generate(output))
+    // ...
+}

build.js中,其实就是执行了build方法,遍历builds将其作为buildEntry方法参数执行,在buildEntry函数中可以看到rollup字眼了,config作为了rollup的参数,进行配置构建 build方法的参数builds,可以猜出就是rollup相关的配置,他是从config.js中的getAllBuilds方法获取的,接下来看看config.js

js
const builds = {
+  // Runtime only (CommonJS). Used by bundlers e.g. Webpack & Browserify
+  'web-runtime-cjs-dev': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.common.dev.js'),
+    format: 'cjs',
+    env: 'development',
+    banner
+  },
+  'web-runtime-cjs-prod': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.common.prod.js'),
+    format: 'cjs',
+    env: 'production',
+    banner
+  },
+  // Runtime+compiler CommonJS build (CommonJS)
+  'web-full-cjs-dev': {
+    entry: resolve('web/entry-runtime-with-compiler.js'),
+    dest: resolve('dist/vue.common.dev.js'),
+    format: 'cjs',
+    env: 'development',
+    alias: { he: './entity-decoder' },
+    banner
+  },
+  'web-full-cjs-prod': {
+    entry: resolve('web/entry-runtime-with-compiler.js'),
+    dest: resolve('dist/vue.common.prod.js'),
+    format: 'cjs',
+    env: 'production',
+    alias: { he: './entity-decoder' },
+    banner
+  },
+  // Runtime only ES modules build (for bundlers)
+  'web-runtime-esm': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.esm.js'),
+    format: 'es',
+    banner
+  },
+  //... 省略部分代码
+}
+
+function genConfig (name) {
+  const opts = builds[name]
+  const config = {
+    input: opts.entry,
+    external: opts.external,
+    plugins: [
+      flow(),
+      alias(Object.assign({}, aliases, opts.alias))
+    ].concat(opts.plugins || []),
+    output: {
+      file: opts.dest,
+      format: opts.format,
+      banner: opts.banner,
+      name: opts.moduleName || 'Vue'
+    },
+    onwarn: (msg, warn) => {
+      if (!/Circular/.test(msg)) {
+        warn(msg)
+      }
+    }
+  }
+
+  //... 省略部分代码
+
+  return config
+}
+
+//... 省略部分代码
+exports.getAllBuilds = () => Object.keys(builds).map(genConfig)

config文件中,通过getAllBuilds遍历builds,进行getConfig加工,getConfig方法内部,其实就是对builds中的每个属性,进行config改造,可以看出内部的config其实就是rollup的配置,最终返回改造好的config 再看builds其实就是针对构建不同规范、不同平台、不同环境进行的配置,如:web平台、commonJS规范、dev及prod环境、Runtime版本、Runtime+Comiler版、ES Module版等等,这样可以集中处理需要构建的目标版本等等,这里做了很好的区分,也容易管理

知道了打包的入口文件,就可以找到Vue开始的位置了,本篇分析Runtime+Compiler的commonjs版本,关于Runtime和Compiler版本后面再做介绍

入口分析

上部分我们终于找到了Vue打包的入口,可以看到有很多,我们只讲Runtime+Compiler的commonjs版本,可以在源码中找到entry-runtime-with-compiler.js,这就是打包入口。

首先我们要先找到Vue的定义所在

js
// src/platforms/web/entry-runtime-with-compiler.js
+
+//... 省略部分代码
+import Vue from './runtime/index'
+
+const mount = Vue.prototype.$mount
+Vue.prototype.$mount = function (
+  el?: string | Element,
+  hydrating?: boolean
+): Component {
+  //... 省略部分代码
+  return mount.call(this, el, hydrating)
+}
+
+export default Vue

在上述入口文件中,并没有看到Vue的定义,只是从runtime/index文件中引入了Vue,然后先对Vue的原型方法$mount进行缓存,再重写$mount,最后导出了Vue

接着我们来到src/platforms/web/runtime/index.js

js
//src/platforms/web/runtime/index.js`
+
+import Vue from 'core/index'
+import { patch } from './patch'
+import platformDirectives from './directives/index'
+import platformComponents from './components/index'
+
+// install platform specific utils
+Vue.config.mustUseProp = mustUseProp
+Vue.config.isReservedTag = isReservedTag
+
+//... 省略部分代码
+
+// install platform runtime directives & components
+extend(Vue.options.directives, platformDirectives)
+extend(Vue.options.components, platformComponents)
+
+// install platform patch function
+Vue.prototype.__patch__ = inBrowser ? patch : noop
+
+// public mount method
+Vue.prototype.$mount = function (
+  el?: string | Element,
+  hydrating?: boolean
+): Component {
+  el = el && inBrowser ? query(el) : undefined
+  return mountComponent(this, el, hydrating)
+}
+
+//... 省略部分代码
+
+export default Vue

在上述文件中,也没有找到Vue的定义,只是简单的从core/index文件中导出了Vue。这里为Vue扩展了静态属性config并设置了一些配置属性,然后在其静态属性options上扩展了和平台相关的指令、组件等等;并给Vue原型定义了_patch__方法,然后发现这里找到了$mount方法的位置,内部执行的是mountComponent函数(后面再讲),最后导出Vue

其实这里就是为Vue做不同平台的构建做了一些扩展和准备,如__patch__方法在非浏览器环境下(ssr)就不需要patch,所以是个空函数

接着我们来到了core/index

js
// src/core/index.js
+
+import Vue from './instance/index'
+import { initGlobalAPI } from './global-api/index'
+import { isServerRendering } from 'core/util/env'
+import { FunctionalRenderContext } from 'core/vdom/create-functional-component'
+
+// 初始化全局API
+initGlobalAPI(Vue)
+
+Object.defineProperty(Vue.prototype, '$isServer', {
+  get: isServerRendering
+})
+
+Object.defineProperty(Vue.prototype, '$ssrContext', {
+  get () {
+    /* istanbul ignore next */
+    return this.$vnode && this.$vnode.ssrContext
+  }
+})
+
+// expose FunctionalRenderContext for ssr runtime helper installation
+Object.defineProperty(Vue, 'FunctionalRenderContext', {
+  value: FunctionalRenderContext
+})
+
+Vue.version = '__VERSION__'
+
+export default Vue

这里也没有找到Vue定义,而是从core/instance/index中引入了Vue,initGlobalAPI是对Vue挂载了全局静态属性及方法,如:nextTickset...等等,直接看instance/index文件

js
// src/core/instance/index
+import { initMixin } from './init'
+import { stateMixin } from './state'
+import { renderMixin } from './render'
+import { eventsMixin } from './events'
+import { lifecycleMixin } from './lifecycle'
+import { warn } from '../util/index'
+
+function Vue (options) {
+  if (process.env.NODE_ENV !== 'production' &&
+    !(this instanceof Vue)
+  ) {
+    warn('Vue is a constructor and should be called with the `new` keyword')
+  }
+  this._init(options)
+}
+
+initMixin(Vue)
+stateMixin(Vue)
+eventsMixin(Vue)
+lifecycleMixin(Vue)
+renderMixin(Vue)
+
+export default Vue

终于找到了Vue定义,原来就是一个函数

new Vue发生了什么

上个章节终于找到了vue的定义所在,就是一个普通函数,找到Vue接下来就可以对其进行下一步的分析了

通常我们都要new一个Vue,如下:

js
new Vue({
+  template: `<div>{{title}}</div>`
+  data: { title: 'emmm...' },
+  methods: {}
+})

在执行new操作后,就会执行内部方法_init,在源码中

js
function Vue (options) {
+  this._init(options)
+}
+initMixin(Vue)
+stateMixin(Vue)
+eventsMixin(Vue)
+lifecycleMixin(Vue)
+renderMixin(Vue)

那么_init方法又是从哪来的,首先肯定会想到是在Vue原型上定义的方法,接着再看下面给Vue进行了多个mixin,我们先看initMixin,initMixin在init.js中:

js
// src/core/instance/init.js
+
+let uid = 0
+
+export function initMixin (Vue: Class<Component>) {
+  Vue.prototype._init = function (options?: Object) {
+    const vm: Component = this
+    // a uid
+    vm._uid = uid++
+   
+    // a flag to avoid this being observed
+    vm._isVue = true
+    if (options && options._isComponent) {
+      initInternalComponent(vm, options)
+    }
+    else {
+      vm.$options = mergeOptions(
+        resolveConstructorOptions(vm.constructor),
+        options || {},
+        vm
+      )
+    }
+
+    if (process.env.NODE_ENV !== 'production') {
+      initProxy(vm)
+    } else {
+      vm._renderProxy = vm
+    }
+
+    // expose real self
+    vm._self = vm
+
+    initLifecycle(vm)
+    initEvents(vm)
+    initRender(vm)
+    callHook(vm, 'beforeCreate')
+    initInjections(vm)
+    initState(vm)
+    initProvide(vm)
+    callHook(vm, 'created')
+
+    if (vm.$options.el) {
+      vm.$mount(vm.$options.el)
+    }
+  }
+}
+//...省略部分代码

在init中,可以看到为Vue原型挂载了_init方法,因此当new Vue的时候,执行的就是这个_init方法。 在_init函数内部首先对传入的options进行了合并,mergeOptions

由于工作原因,后续会不断补充...(感谢理解)

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2021/vue-img-lazyload.html b/article/2021/vue-img-lazyload.html new file mode 100644 index 000000000..1c7409830 --- /dev/null +++ b/article/2021/vue-img-lazyload.html @@ -0,0 +1,410 @@ + + + + + + 手写一个vue图片懒加载插件 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

手写vue图片懒加载插件

前言

性能优化越来越被重视,其中的静态资源加载称为重灾区,如果网页的图片太多,一次加载会出现明显的卡顿,采用懒加载和预加载是解决其的良好手段

本篇就来用Vue和TypeScript来撸一个懒加载插件,在阅读本编之前,请先了解vue插件注册机制和自定义指令,如果你还不了解,可以看看官方文档

实现效果

功能实现

功能分析:在实现此功能前,可以将功能拆分为多个小功能,将不同的功能模块化,抽象出来,提高代码可读性

分析1:

首先在加载目标图片时,会有默认的图片来占位,也就是占位图,并将图片状态置为LOADING,当达到某种条件时获取真实的图片,当真实的图片获取成功时,图片加载完毕,图片响应的状态为LOADED;当真实图片加载失败时,状态变为ERROR。因此,为了便于管理图片的各个状态,可以单独写个类ImageManager来管理图片的不同状态,而图片的状态也为懒加载管理器做好了铺垫

分析2: 图片状态管理器有了,应该还需要一个懒加载管理器Lazy,将所有需要懒加载的图片推到加载队列中managerQueue用来管理所有图片的状态。加载管理器需要对每个图片进行是否是要请求真实资源进行判断,当达到条件时,触发当前的图片管理器请求真实图片,当图片的状态不再是LOADING状态时,将其从managerQueue队列中剔除,这样就不用再检测当前ImageManager

属性定义

懒加载器实例化参数类型和指令绑定值类型如下:

ts
// types/index.ts
+import { DirectiveBinding } from 'vue/types/options'
+
+// 初始化插件时,定义全局的loading和error(图片) 下面会降到 new Lazy({loading, error})
+export interface LazyOpts {
+  loading?: string
+  error?: string
+}
+
+// 定义指令绑定值得类型,DirectiveBinding 的 value 为any类型,这里进行改造
+// 这里就可以在 v-lazy="{src, loading, error}" | src 使用这种对象值
+export interface DirectiveBindingType extends DirectiveBinding {
+  value: { src: string, loading?: string, error?: string } | string
+}
+
+// bind el type
+export type DirectiveBindingElemType = HTMLImageElement | HTMLElement

图片管理器实例化参数类型如下:

ts
// 实例化图片管理器的选项
+export type ImageManagerOpts = {
+  el: DirectiveBindingElemType // 目标Element
+  src: string  // 真实图片
+  loading: string  // loading 图片
+  error: string  // error图片
+}

图片管理器

正如上述分析,图片有3中状态,即:加载中加载成功加载失败,三种状态渲染不同的url,这里先枚举出三种状态:

ts
// 图片状态
+export enum IMAGE_STATUS {
+  LOADING, // 加载中
+  LOADED,  // 加载成功
+  ERROR,  // 加载失败
+}

图片管理器考虑到自身状态的维护,可以用class进行构造

ts
import { ImageManagerOpts, DirectiveBindingElemType } from './types'
+
+// 唯一标识符
+let uid = 1
+
+// 图片管理器
+class ImageManager {
+  src: string
+  el: DirectiveBindingElemType
+  loading: string
+  error: string
+  status: IMAGE_STATUS
+  uid!: number // 图片的唯一标识符
+
+  constructor(opts: ImageManagerOpts) {
+    this.src = opts.src
+    this.el = opts.el
+    this.loading = opts.loading
+    this.error = opts.error
+    this.uid = uid++
+
+    this.status = IMAGE_STATUS.LOADING
+    this.render(this.loading)
+  }
+
+  // 渲染dom图片
+  render(src: string) {
+    this.el.setAttribute('src', src)
+  }
+
+  // 加载资源,如果已经不是loading状态 终止
+  load(next?: Function) {
+    if (this.status > IMAGE_STATUS.LOADING) return
+    this.renderSrc(next)
+  }
+
+  // 异步加载资源,并改变状态
+  renderSrc(next?: Function) {
+    loadImage(this.src)
+      .then(() => {
+        this.status = IMAGE_STATUS.LOADED
+        this.render(this.src)
+        next && next()
+      })
+      .catch((e) => {
+        this.status = IMAGE_STATUS.ERROR
+        this.render(this.error)
+        console.warn(`v-lazy:load img ${this.src} failed, ${e.message}.`)
+        next && next()
+      })
+  }
+}
+
+// 异步获取图片
+function loadImage(src: string) {
+  return new Promise((resolve, reject) => {
+    const img = new Image()
+
+    img.onload = () => {
+      resolve(true)
+      img.onload = null
+    }
+
+    img.onerror = (err) => {
+      reject(err)
+      img.onerror = null
+    }
+
+    img.src = src
+  })
+}
+
+export { ImageManager }

以上基本上已经定义好了ImageManager,现在我们可以这样使用它:

ts
// 实例化时,状态为loading,render loading image
+const manager = new ImageManager({el,src,loading,error})
+
+// 当需要加载真实资源时
+manager.load()

那么接下来就来创建懒加载器来管理所有的图片管理器

懒加载管理器

ts
import {
+  DirectiveBindingType,
+  LazyOpts,
+  DirectiveBindingElemType,
+} from './types'
+import { ImageManager, IMAGE_STATUS } from './image-manager'
+
+// 可以默认一张图片
+import { defaultImage } from './default-data'
+
+const DEFAULT_URL = defaultImage
+
+class Lazy {
+  managerQueue: Array<ImageManager> = []
+  observer!: IntersectionObserver
+  loading!: string
+  error!: string
+
+  constructor(options: LazyOpts) {
+    this.loading = options.loading || DEFAULT_URL
+    this.error = options.error || DEFAULT_URL
+    this.initInterSectionObserver()
+  }
+
+  // 使用指令时,添加当前元素
+  add(el: DirectiveBindingElemType, binding: DirectiveBindingType) {
+    let src, error, loading
+    if (typeof binding.value === 'object') {
+      src = binding.value.src || ''
+      error = binding.value.error
+      loading = binding.value.loading
+    } else {
+      src = binding.value || ''
+    }
+    const manager = new ImageManager({
+      el,
+      src,
+      loading: loading || this.loading,
+      error: error || this.error,
+    })
+
+    this.managerQueue.push(manager)
+
+    this.observer.observe(el)
+  }
+
+  // 使用IntersectionObserver观测managerQueue里的manager
+  initInterSectionObserver() {
+    this.observer = new IntersectionObserver((entries) => {
+      entries.forEach((entry) => {
+        if (entry.isIntersecting) {
+          const manager = this.managerQueue.find((manager) => manager.el === entry.target)
+          if (manager) {
+            // manager状态不是loading时 则移除对其的观测
+            if (manager.status > IMAGE_STATUS.LOADING) {
+              this.removeManager(manager)
+              return
+            }
+            manager.load()
+          }
+        }
+      })
+    }, { rootMargin: '0px', threshold: 0.7 })
+  }
+
+  // 移除目标manager
+  removeManager(manager: ImageManager) {
+    const findIndex = this.managerQueue.map((m) => m.uid).indexOf(manager.uid)
+    if (findIndex > -1) {
+      this.managerQueue.splice(findIndex, 1)
+    }
+    if (this.observer) {
+      this.observer.unobserve(manager.el)
+    }
+  }
+}
+
+// 导出插件,需要按照Vue插件注册机制规范
+export default {
+  install(Vue: any, options: LazyOpts = {}) {
+    const lazy = new Lazy(options)
+    Vue.directive('lazy', {
+      bind: lazy.add.bind(lazy)
+    })
+  }
+}

至此,大体上已经完成所有功能了,当注册插件时,会实例化一个Lazy对象,并初始化一些初始状态loadingerrorIntersectionObserver,有关IntersectionObserver的使用可以详见MDN,对于监测两者是否交叉一个友好的API;除了这些还有managerQueue队列

当使用v-lazy指令时,会执行lazy的add方法,将其添加到managerQueue中,并对其进行oberve,当元素处于交叉状态时,获取对应的manager,并加载其真实图片,当然可以在这里判断如果manager的状态已经不是loading,直接removeManager卸载对其的观测

简单使用:

ts
// 全局注册
+import VLazy from './directives/lazy/lazy'
+Vue.use(VLazy, {
+  error: '/error.gif',  // 初始化默认错误
+  loading: '/loading.gif' // 默认loading
+})
+
+// HTML
+<template>
+    // 正常加载
+    <img v-lazy="'https://s4.ax1x.com/2021/12/15/TS7e29.gif'" />
+    
+    // 对当前元素提供指定错误图片
+    <img width="200" height="200" v-lazy="{ src: '/adad.png', error: 'https://s4.ax1x.com/2021/12/15/TSbQhD.jpg' }" />
+    
+    // 错误图片,将会加载错误
+    <img v-lazy="'/a1.jpg'" alt="出错了..." />
+</template>

优化

以上基本实现了所需的功能,但可能还有一些优化点需要做,如:IntersectionObserver的API虽然很好用,大部分浏览器也支持其特性,可惜的是IE却都不支持,如果想使用在IE里的项目,就得做兼容处理了;

再比如说,所有添加到队列中的manager,每当加载真实或者错误图片时,都会执行loadImage函数,创建img,请求图片,如果有多个图片的地址是一样的,就没必要再执行loadImage操作了,直接渲染目标图片即可,这种以空间换时间的策略会提升性能

上面仅仅是处理了src图片,也有些场景下还是会用到背景图,因此还需要一些改造,来支持背景图

兼容处理

当在IE时,不再使用IntersectionObserver,就会用到传统的滚动检测目标对象,进行差值计算,进行图片加载。因为此涉及到判断是否加载真正图片,只许对Lazy管理器进行改造即可

ts
class Lazy {
+  // ...省略部分代码
+  // 定义属性来判断是否支持
+  supportObserver: boolean = ('IntersectionObserver' in window)
+  
+  constructor(options: LazyOpts) {
+    this.loading = options.loading || DEFAULT_URL
+    this.error = options.error || DEFAULT_URL
+    
+    // 这里不再直接初始化IntersectionObserver
+    this.init()
+  }
+  
+  init() {
+    // 不支持IntersectionObserver时直接初始化 scroll
+    if (this.supportObserver) {
+      this.initInterSectionObserver()
+    } else {
+      this.initScrollListener()
+    }
+  }
+  
+  // 检测window滚动
+  initScrollListener() {
+    const screenHeight: number = document.documentElement.clientHeight
+    window.addEventListener('scroll', () => {
+      this.doScrollCallback(screenHeight)
+    })
+  }
+
+  // 滚动时执行判断每个manager是否已经达到条件加载图片
+  doScrollCallback(screenHeight: number) {
+    this.managerQueue.forEach((manager) => {
+      const rest = manager.el.getBoundingClientRect()
+      if (manager.status > IMAGE_STATUS.LOADING) {
+        this.removeManager(manager)
+        return
+      }
+      
+      if (rest.top >= 0 && rest.top <= screenHeight - 100) {
+        manager.load()
+      }
+    })
+  }
+  
+  add(el: HTMLImageElement, binding: DirectiveBindingType) {
+    //.. 省略部分代码
+
+    // 这里也需要判断
+    // 当不支持IntersectionObserver时,不再observe目标
+    // 而初次执行doScrollCallback(可能初次目标已经达到加载条件)
+    if (this.supportObserver) {
+      this.observer.observe(el)
+    } else {
+      const screenHeight: number = document.documentElement.clientHeight
+      setTimeout(() => this.doScrollCallback(screenHeight))
+    }
+  }
+}

这样就解决了IE兼容的问题,现在可以打开IE浏览器,发现也是好使的,证明兼容性是没有问题的

图片缓存

针对缓存可以创建一个Set,对所有图片进行收集,当后面的图片进行请求时,先判断有没有对应的缓存,如有的话直接进行渲染即可;那么知道缓存的内容了,又在哪里创建缓存器呢?缓存器应该不会改变,从而可以在Lazy中创建缓存器,将其传入ImageManager

定义先加上对应的字段:

ts
export type ImageManagerOpts = {
+  //...
+  cache: Set<string>
+}

接着先创建缓存器:

ts
class Lazy {
+  // ...
+  cache: Set<string> = new Set()
+
+  // ...
+  
+  add(el: HTMLImageElement, binding: DirectiveBindingType) {
+    // 创建manager时将cache传入
+    const manager = new ImageManager({
+      el,
+      src,
+      cache: this.cache,
+      //...
+    })
+  }
+}

ImageManager里需要在加载时,判断时是否可以命中缓存,如有直接加载即可;没有命中缓存时,当家在完毕或失败时,对对应的URL进行缓存,提供后面缓存使用

ts
class ImageManager {
+  //...
+  cache!: Set<string>
+
+  constructor(opts: ImageManagerOpts) {
+    // ...
+    this.cache = opts.cache
+  }
+
+  load(next?: Function) {
+    //...
+    // 判断是否命中缓存,如有直接渲染
+    if (this.cache.has(this.src)) {
+      this.render(this.src)
+      this.status = IMAGE_STATUS.LOADED
+      return
+    }
+    //...
+  }
+
+  // 加载失败或成功对其缓存
+  renderSrc(next?: Function) {
+    loadImage(this.src)
+      .then(() => {
+        //...
+        // 缓存
+        this.cache.add(this.src)
+      })
+      .catch((e) => {
+        //缓存
+        this.cache.add(this.error)
+      })
+  }
+}

缓存大致就这样,可以试试

背景图

支持背景图需要用到指令参数,处理起来也比较简单,判断指令是否具有backgroundImage(自定义)参数,有的话进行背景图渲染

类型定义:

ts
export type ImageManagerOpts = {
+  // ...
+  isBackGround?: boolean
+}

管理器改:

ts
class Lazy {
+  // ...
+  add(el: HTMLImageElement, binding: DirectiveBindingType) {
+    let src, error, loading
+    // 判断是不是背景参数
+    const isBackGround = (binding.arg && binding.arg.toLocaleUpperCase() === 'BACKGROUNDIMAGE') as boolean
+    
+    const manager = new ImageManager({
+      //...
+      // 传入
+      isBackGround
+    })
+  }
+}
+
+
+class ImageManager {
+  //...
+  isBackGround: boolean
+
+  constructor(opts: ImageManagerOpts) {
+    //...
+    this.isBackGround = opts.isBackGround || false
+  }
+
+  render(src: string) {
+    // 背景图渲染
+    if (this.isBackGround) {
+      this.el.style.backgroundImage = `url(${src})`
+      return
+    }
+    this.el.setAttribute('src', src)
+  }
+}

现在就可以使用背景图片渲染了:

html
<!--背景图渲染,也可以指定loading、error等等-->
+<div
+    v-lazy:backgroundImage="{src: 'https://s4.ax1x.com/2021/12/15/TScWbd.jpg', loading: '/default-loading.gif'}"
+    class="back-img"
+/>

总结

本篇主要通过一个图片管理器ImageManager和一个懒加载管理器Lazy,分别实现了对图片状态的管理,和对图片请求真实资源的管理。通过使用交叉观测器IntersectionObserver来观测图片的临界值来加载真实资源,后又使用scroll监测window滚动来兼容IE对IntersectionObserver的不支持,最后进行各种优化完成插件功能

以上源码可以在GitHub下载,感谢点赞、感谢支持😄

若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/2022/emoji-markup.html b/article/2022/emoji-markup.html new file mode 100644 index 000000000..787d48fea --- /dev/null +++ b/article/2022/emoji-markup.html @@ -0,0 +1,56 @@ + + + + + + Emoji markup(Markdown表情) | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Emoji markup

本文内容摘自:rxaviers

People

:bowtie: :bowtie:😄 :smile:😆 :laughing:
😊 :blush:😃 :smiley:☺️ :relaxed:
😏 :smirk:😍 :heart_eyes:😘 :kissing_heart:
😚 :kissing_closed_eyes:😳 :flushed:😌 :relieved:
😆 :satisfied:😁 :grin:😉 :wink:
😜 :stuck_out_tongue_winking_eye:😝 :stuck_out_tongue_closed_eyes:😀 :grinning:
😗 :kissing:😙 :kissing_smiling_eyes:😛 :stuck_out_tongue:
😴 :sleeping:😟 :worried:😦 :frowning:
😧 :anguished:😮 :open_mouth:😬 :grimacing:
😕 :confused:😯 :hushed:😑 :expressionless:
😒 :unamused:😅 :sweat_smile:😓 :sweat:
😥 :disappointed_relieved:😩 :weary:😔 :pensive:
😞 :disappointed:😖 :confounded:😨 :fearful:
😰 :cold_sweat:😣 :persevere:😢 :cry:
😭 :sob:😂 :joy:😲 :astonished:
😱 :scream::neckbeard: :neckbeard:😫 :tired_face:
😠 :angry:😡 :rage:😤 :triumph:
😪 :sleepy:😋 :yum:😷 :mask:
😎 :sunglasses:😵 :dizzy_face:👿 :imp:
😈 :smiling_imp:😐 :neutral_face:😶 :no_mouth:
😇 :innocent:👽 :alien:💛 :yellow_heart:
💙 :blue_heart:💜 :purple_heart:❤️ :heart:
💚 :green_heart:💔 :broken_heart:💓 :heartbeat:
💗 :heartpulse:💕 :two_hearts:💞 :revolving_hearts:
💘 :cupid:💖 :sparkling_heart::sparkles:
:star:🌟 :star2:💫 :dizzy:
💥 :boom:💥 :collision:💢 :anger:
:exclamation::question::grey_exclamation:
:grey_question:💤 :zzz:💨 :dash:
💦 :sweat_drops:🎶 :notes:🎵 :musical_note:
🔥 :fire:💩 :hankey:💩 :poop:
💩 :shit:👍 :+1:👍 :thumbsup:
👎 :-1:👎 :thumbsdown:👌 :ok_hand:
👊 :punch:👊 :facepunch::fist:
✌️ :v:👋 :wave::hand:
:raised_hand:👐 :open_hands:☝️ :point_up:
👇 :point_down:👈 :point_left:👉 :point_right:
🙌 :raised_hands:🙏 :pray:👆 :point_up_2:
👏 :clap:💪 :muscle:🤘 :metal:
🖕 :fu:🚶 :walking:🏃 :runner:
🏃 :running:👫 :couple:👪 :family:
👬 :two_men_holding_hands:👭 :two_women_holding_hands:💃 :dancer:
👯 :dancers:🙆‍♀️ :ok_woman:🙅 :no_good:
💁 :information_desk_person:🙋 :raising_hand:👰‍♀️ :bride_with_veil:
:person_with_pouting_face: :person_with_pouting_face::person_frowning: :person_frowning:🙇 :bow:
💏 :couplekiss:💑 :couple_with_heart:💆 :massage:
💇 :haircut:💅 :nail_care:👦 :boy:
👧 :girl:👩 :woman:👨 :man:
👶 :baby:👵 :older_woman:👴 :older_man:
:person_with_blond_hair: :person_with_blond_hair:👲 :man_with_gua_pi_mao:👳‍♂️ :man_with_turban:
👷 :construction_worker:👮 :cop:👼 :angel:
👸 :princess:😺 :smiley_cat:😸 :smile_cat:
😻 :heart_eyes_cat:😽 :kissing_cat:😼 :smirk_cat:
🙀 :scream_cat:😿 :crying_cat_face:😹 :joy_cat:
😾 :pouting_cat:👹 :japanese_ogre:👺 :japanese_goblin:
🙈 :see_no_evil:🙉 :hear_no_evil:🙊 :speak_no_evil:
💂‍♂️ :guardsman:💀 :skull:🐾 :feet:
👄 :lips:💋 :kiss:💧 :droplet:
👂 :ear:👀 :eyes:👃 :nose:
👅 :tongue:💌 :love_letter:👤 :bust_in_silhouette:
👥 :busts_in_silhouette:💬 :speech_balloon:💭 :thought_balloon:
:feelsgood: :feelsgood::finnadie: :finnadie::goberserk: :goberserk:
:godmode: :godmode::hurtrealbad: :hurtrealbad::rage1: :rage1:
:rage2: :rage2::rage3: :rage3::rage4: :rage4:
:suspect: :suspect::trollface: :trollface:

Nature

☀️ :sunny::umbrella:☁️ :cloud:
❄️ :snowflake::snowman::zap:
🌀 :cyclone:🌁 :foggy:🌊 :ocean:
🐱 :cat:🐶 :dog:🐭 :mouse:
🐹 :hamster:🐰 :rabbit:🐺 :wolf:
🐸 :frog:🐯 :tiger:🐨 :koala:
🐻 :bear:🐷 :pig:🐽 :pig_nose:
🐮 :cow:🐗 :boar:🐵 :monkey_face:
🐒 :monkey:🐴 :horse:🐎 :racehorse:
🐫 :camel:🐑 :sheep:🐘 :elephant:
🐼 :panda_face:🐍 :snake:🐦 :bird:
🐤 :baby_chick:🐥 :hatched_chick:🐣 :hatching_chick:
🐔 :chicken:🐧 :penguin:🐢 :turtle:
🐛 :bug:🐝 :honeybee:🐜 :ant:
🪲 :beetle:🐌 :snail:🐙 :octopus:
🐠 :tropical_fish:🐟 :fish:🐳 :whale:
🐋 :whale2:🐬 :dolphin:🐄 :cow2:
🐏 :ram:🐀 :rat:🐃 :water_buffalo:
🐅 :tiger2:🐇 :rabbit2:🐉 :dragon:
🐐 :goat:🐓 :rooster:🐕 :dog2:
🐖 :pig2:🐁 :mouse2:🐂 :ox:
🐲 :dragon_face:🐡 :blowfish:🐊 :crocodile:
🐪 :dromedary_camel:🐆 :leopard:🐈 :cat2:
🐩 :poodle:🐾 :paw_prints:💐 :bouquet:
🌸 :cherry_blossom:🌷 :tulip:🍀 :four_leaf_clover:
🌹 :rose:🌻 :sunflower:🌺 :hibiscus:
🍁 :maple_leaf:🍃 :leaves:🍂 :fallen_leaf:
🌿 :herb:🍄 :mushroom:🌵 :cactus:
🌴 :palm_tree:🌲 :evergreen_tree:🌳 :deciduous_tree:
🌰 :chestnut:🌱 :seedling:🌼 :blossom:
🌾 :ear_of_rice:🐚 :shell:🌐 :globe_with_meridians:
🌞 :sun_with_face:🌝 :full_moon_with_face:🌚 :new_moon_with_face:
🌑 :new_moon:🌒 :waxing_crescent_moon:🌓 :first_quarter_moon:
🌔 :waxing_gibbous_moon:🌕 :full_moon:🌖 :waning_gibbous_moon:
🌗 :last_quarter_moon:🌘 :waning_crescent_moon:🌜 :last_quarter_moon_with_face:
🌛 :first_quarter_moon_with_face:🌔 :moon:🌍 :earth_africa:
🌎 :earth_americas:🌏 :earth_asia:🌋 :volcano:
🌌 :milky_way::partly_sunny::octocat: :octocat:
:squirrel: :squirrel:

Objects

🎍 :bamboo:💝 :gift_heart:🎎 :dolls:
🎒 :school_satchel:🎓 :mortar_board:🎏 :flags:
🎆 :fireworks:🎇 :sparkler:🎐 :wind_chime:
🎑 :rice_scene:🎃 :jack_o_lantern:👻 :ghost:
🎅 :santa:🎄 :christmas_tree:🎁 :gift:
🔔 :bell:🔕 :no_bell:🎋 :tanabata_tree:
🎉 :tada:🎊 :confetti_ball:🎈 :balloon:
🔮 :crystal_ball:💿 :cd:📀 :dvd:
💾 :floppy_disk:📷 :camera:📹 :video_camera:
🎥 :movie_camera:💻 :computer:📺 :tv:
📱 :iphone:☎️ :phone:☎️ :telephone:
📞 :telephone_receiver:📟 :pager:📠 :fax:
💽 :minidisc:📼 :vhs:🔉 :sound:
🔈 :speaker:🔇 :mute:📢 :loudspeaker:
📣 :mega::hourglass::hourglass_flowing_sand:
:alarm_clock::watch:📻 :radio:
📡 :satellite::loop:🔍 :mag:
🔎 :mag_right:🔓 :unlock:🔒 :lock:
🔏 :lock_with_ink_pen:🔐 :closed_lock_with_key:🔑 :key:
💡 :bulb:🔦 :flashlight:🔆 :high_brightness:
🔅 :low_brightness:🔌 :electric_plug:🔋 :battery:
📲 :calling:📧 :email:📫 :mailbox:
📮 :postbox:🛀 :bath:🛁 :bathtub:
🚿 :shower:🚽 :toilet:🔧 :wrench:
🔩 :nut_and_bolt:🔨 :hammer:💺 :seat:
💰 :moneybag:💴 :yen:💵 :dollar:
💷 :pound:💶 :euro:💳 :credit_card:
💸 :money_with_wings:📧 :e-mail:📥 :inbox_tray:
📤 :outbox_tray:✉️ :envelope:📨 :incoming_envelope:
📯 :postal_horn:📪 :mailbox_closed:📬 :mailbox_with_mail:
📭 :mailbox_with_no_mail:🚪 :door:🚬 :smoking:
💣 :bomb:🔫 :gun:🔪 :hocho:
💊 :pill:💉 :syringe:📄 :page_facing_up:
📃 :page_with_curl:📑 :bookmark_tabs:📊 :bar_chart:
📈 :chart_with_upwards_trend:📉 :chart_with_downwards_trend:📜 :scroll:
📋 :clipboard:📆 :calendar:📅 :date:
📇 :card_index:📁 :file_folder:📂 :open_file_folder:
✂️ :scissors:📌 :pushpin:📎 :paperclip:
✒️ :black_nib:✏️ :pencil2:📏 :straight_ruler:
📐 :triangular_ruler:📕 :closed_book:📗 :green_book:
📘 :blue_book:📙 :orange_book:📓 :notebook:
📔 :notebook_with_decorative_cover:📒 :ledger:📚 :books:
🔖 :bookmark:📛 :name_badge:🔬 :microscope:
🔭 :telescope:📰 :newspaper:🏈 :football:
🏀 :basketball::soccer::baseball:
🎾 :tennis:🎱 :8ball:🏉 :rugby_football:
🎳 :bowling::golf:🚵 :mountain_bicyclist:
🚴 :bicyclist:🏇 :horse_racing:🏂 :snowboarder:
🏊 :swimmer:🏄 :surfer:🎿 :ski:
♠️ :spades:♥️ :hearts:♣️ :clubs:
♦️ :diamonds:💎 :gem:💍 :ring:
🏆 :trophy:🎼 :musical_score:🎹 :musical_keyboard:
🎻 :violin:👾 :space_invader:🎮 :video_game:
🃏 :black_joker:🎴 :flower_playing_cards:🎲 :game_die:
🎯 :dart:🀄 :mahjong:🎬 :clapper:
📝 :memo:📝 :pencil:📖 :book:
🎨 :art:🎤 :microphone:🎧 :headphones:
🎺 :trumpet:🎷 :saxophone:🎸 :guitar:
👞 :shoe:👡 :sandal:👠 :high_heel:
💄 :lipstick:👢 :boot:👕 :shirt:
👕 :tshirt:👔 :necktie:👚 :womans_clothes:
👗 :dress:🎽 :running_shirt_with_sash:👖 :jeans:
👘 :kimono:👙 :bikini:🎀 :ribbon:
🎩 :tophat:👑 :crown:👒 :womans_hat:
👞 :mans_shoe:🌂 :closed_umbrella:💼 :briefcase:
👜 :handbag:👝 :pouch:👛 :purse:
👓 :eyeglasses:🎣 :fishing_pole_and_fish::coffee:
🍵 :tea:🍶 :sake:🍼 :baby_bottle:
🍺 :beer:🍻 :beers:🍸 :cocktail:
🍹 :tropical_drink:🍷 :wine_glass:🍴 :fork_and_knife:
🍕 :pizza:🍔 :hamburger:🍟 :fries:
🍗 :poultry_leg:🍖 :meat_on_bone:🍝 :spaghetti:
🍛 :curry:🍤 :fried_shrimp:🍱 :bento:
🍣 :sushi:🍥 :fish_cake:🍙 :rice_ball:
🍘 :rice_cracker:🍚 :rice:🍜 :ramen:
🍲 :stew:🍢 :oden:🍡 :dango:
🥚 :egg:🍞 :bread:🍩 :doughnut:
🍮 :custard:🍦 :icecream:🍨 :ice_cream:
🍧 :shaved_ice:🎂 :birthday:🍰 :cake:
🍪 :cookie:🍫 :chocolate_bar:🍬 :candy:
🍭 :lollipop:🍯 :honey_pot:🍎 :apple:
🍏 :green_apple:🍊 :tangerine:🍋 :lemon:
🍒 :cherries:🍇 :grapes:🍉 :watermelon:
🍓 :strawberry:🍑 :peach:🍈 :melon:
🍌 :banana:🍐 :pear:🍍 :pineapple:
🍠 :sweet_potato:🍆 :eggplant:🍅 :tomato:
🌽 :corn:

Places

🏠 :house:🏡 :house_with_garden:🏫 :school:
🏢 :office:🏣 :post_office:🏥 :hospital:
🏦 :bank:🏪 :convenience_store:🏩 :love_hotel:
🏨 :hotel:💒 :wedding::church:
🏬 :department_store:🏤 :european_post_office:🌇 :city_sunrise:
🌆 :city_sunset:🏯 :japanese_castle:🏰 :european_castle:
:tent:🏭 :factory:🗼 :tokyo_tower:
🗾 :japan:🗻 :mount_fuji:🌄 :sunrise_over_mountains:
🌅 :sunrise:🌠 :stars:🗽 :statue_of_liberty:
🌉 :bridge_at_night:🎠 :carousel_horse:🌈 :rainbow:
🎡 :ferris_wheel::fountain:🎢 :roller_coaster:
🚢 :ship:🚤 :speedboat::boat:
:sailboat:🚣 :rowboat::anchor:
🚀 :rocket:✈️ :airplane:🚁 :helicopter:
🚂 :steam_locomotive:🚊 :tram:🚞 :mountain_railway:
🚲 :bike:🚡 :aerial_tramway:🚟 :suspension_railway:
🚠 :mountain_cableway:🚜 :tractor:🚙 :blue_car:
🚘 :oncoming_automobile:🚗 :car:🚗 :red_car:
🚕 :taxi:🚖 :oncoming_taxi:🚛 :articulated_lorry:
🚌 :bus:🚍 :oncoming_bus:🚨 :rotating_light:
🚓 :police_car:🚔 :oncoming_police_car:🚒 :fire_engine:
🚑 :ambulance:🚐 :minibus:🚚 :truck:
🚋 :train:🚉 :station:🚆 :train2:
🚅 :bullettrain_front:🚄 :bullettrain_side:🚈 :light_rail:
🚝 :monorail:🚃 :railway_car:🚎 :trolleybus:
🎫 :ticket::fuelpump:🚦 :vertical_traffic_light:
🚥 :traffic_light:⚠️ :warning:🚧 :construction:
🔰 :beginner:🏧 :atm:🎰 :slot_machine:
🚏 :busstop:💈 :barber:♨️ :hotsprings:
🏁 :checkered_flag:🎌 :crossed_flags:🏮 :izakaya_lantern:
🗿 :moyai:🎪 :circus_tent:🎭 :performing_arts:
📍 :round_pushpin:🚩 :triangular_flag_on_post:🇯🇵 :jp:
🇰🇷 :kr:🇨🇳 :cn:🇺🇸 :us:
🇫🇷 :fr:🇪🇸 :es:🇮🇹 :it:
🇷🇺 :ru:🇬🇧 :gb:🇬🇧 :uk:
🇩🇪 :de:

Symbols

1️⃣ :one:2️⃣ :two:3️⃣ :three:
4️⃣ :four:5️⃣ :five:6️⃣ :six:
7️⃣ :seven:8️⃣ :eight:9️⃣ :nine:
🔟 :keycap_ten:🔢 :1234:0️⃣ :zero:
#️⃣ :hash:🔣 :symbols:◀️ :arrow_backward:
⬇️ :arrow_down:▶️ :arrow_forward:⬅️ :arrow_left:
🔠 :capital_abcd:🔡 :abcd:🔤 :abc:
↙️ :arrow_lower_left:↘️ :arrow_lower_right:➡️ :arrow_right:
⬆️ :arrow_up:↖️ :arrow_upper_left:↗️ :arrow_upper_right:
:arrow_double_down::arrow_double_up:🔽 :arrow_down_small:
⤵️ :arrow_heading_down:⤴️ :arrow_heading_up:↩️ :leftwards_arrow_with_hook:
↪️ :arrow_right_hook:↔️ :left_right_arrow:↕️ :arrow_up_down:
🔼 :arrow_up_small:🔃 :arrows_clockwise:🔄 :arrows_counterclockwise:
:rewind::fast_forward:ℹ️ :information_source:
🆗 :ok:🔀 :twisted_rightwards_arrows:🔁 :repeat:
🔂 :repeat_one:🆕 :new:🔝 :top:
🆙 :up:🆒 :cool:🆓 :free:
🆖 :ng:🎦 :cinema:🈁 :koko:
📶 :signal_strength::u5272: :u5272::u5408: :u5408:
:u55b6: :u55b6::u6307: :u6307::u6708: :u6708:
:u6709: :u6709:🈵 :u6e80::u7121: :u7121:
:u7533: :u7533::u7a7a: :u7a7a::u7981: :u7981:
🈂️ :sa:🚻 :restroom:🚹 :mens:
🚺 :womens:🚼 :baby_symbol:🚭 :no_smoking:
🅿️ :parking::wheelchair:🚇 :metro:
🛄 :baggage_claim:🉑 :accept:🚾 :wc:
🚰 :potable_water:🚮 :put_litter_in_its_place:㊙️ :secret:
㊗️ :congratulations:Ⓜ️ :m:🛂 :passport_control:
🛅 :left_luggage:🛃 :customs:🉐 :ideograph_advantage:
🆑 :cl:🆘 :sos:🆔 :id:
🚫 :no_entry_sign:🔞 :underage:📵 :no_mobile_phones:
🚯 :do_not_litter:🚱 :non-potable_water:🚳 :no_bicycles:
🚷 :no_pedestrians:🚸 :children_crossing::no_entry:
✳️ :eight_spoked_asterisk:✴️ :eight_pointed_black_star:💟 :heart_decoration:
🆚 :vs:📳 :vibration_mode:📴 :mobile_phone_off:
💹 :chart:💱 :currency_exchange::aries:
:taurus::gemini::cancer:
:leo::virgo::libra:
:scorpius::sagittarius::capricorn:
:aquarius::pisces::ophiuchus:
🔯 :six_pointed_star::negative_squared_cross_mark:🅰️ :a:
🅱️ :b:🆎 :ab:🅾️ :o2:
💠 :diamond_shape_with_a_dot_inside:♻️ :recycle:🔚 :end:
🔛 :on:🔜 :soon:🕐 :clock1:
🕜 :clock130:🕙 :clock10:🕥 :clock1030:
🕚 :clock11:🕦 :clock1130:🕛 :clock12:
🕧 :clock1230:🕑 :clock2:🕝 :clock230:
🕒 :clock3:🕞 :clock330:🕓 :clock4:
🕟 :clock430:🕔 :clock5:🕠 :clock530:
🕕 :clock6:🕡 :clock630:🕖 :clock7:
🕢 :clock730:🕗 :clock8:🕣 :clock830:
🕘 :clock9:🕤 :clock930:💲 :heavy_dollar_sign:
©️ :copyright:®️ :registered:™️ :tm:
:x::heavy_exclamation_mark:‼️ :bangbang:
⁉️ :interrobang::o:✖️ :heavy_multiplication_x:
:heavy_plus_sign::heavy_minus_sign::heavy_division_sign:
💮 :white_flower:💯 :100:✔️ :heavy_check_mark:
☑️ :ballot_box_with_check:🔘 :radio_button:🔗 :link:
:curly_loop:〰️ :wavy_dash:〽️ :part_alternation_mark:
🔱 :trident::black_square: :black_square::white_square: :white_square:
:white_check_mark:🔲 :black_square_button:🔳 :white_square_button:
:black_circle::white_circle:🔴 :red_circle:
🔵 :large_blue_circle:🔷 :large_blue_diamond:🔶 :large_orange_diamond:
🔹 :small_blue_diamond:🔸 :small_orange_diamond:🔺 :small_red_triangle:
🔻 :small_red_triangle_down::shipit: :shipit:

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/article/base.html b/article/base.html new file mode 100644 index 000000000..8001076ed --- /dev/null +++ b/article/base.html @@ -0,0 +1,56 @@ + + + + + + 日拱一卒 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

日拱一卒

万古长空,一朝风月

转载须知

本博客文章允许大家转载,需要注明出处并提供源文章链接,对于标注不允许转载的,请联系本人。

如果本博客对您有帮助,请在GitHub给我点个star,支持我不断更新。

这里是本人在工作或学习中Get到的一些技能技巧,还有常见参考内容,把一些值得学习的记录下来分享给大家。同时这些也大体见证着本人的成长过程,希望这些文章对你也有所帮助😊。

由于工作原因,写作时间有限,尽力更新中...

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/assets/app.hlbKLLW0.js b/assets/app.hlbKLLW0.js new file mode 100644 index 000000000..709659f9f --- /dev/null +++ b/assets/app.hlbKLLW0.js @@ -0,0 +1,7 @@ +import{d as p,j as o,a4 as u,u as c,l,z as f,a5 as d,a6 as m,a7 as h,a8 as A,a9 as g,aa as v,ab as P,ac as w,ad as y,ae as C,af as R,ag as _,ah as b,Y as E}from"./chunks/framework.SV1ROkXV.js";import{R as D}from"./chunks/theme.qcSYzAJN.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(D),T=p({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=c();return l(()=>{f(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&d(),m(),h(),s.setup&&s.setup(),()=>A(s.Layout)}});async function j(){const e=O(),a=L();a.provide(g,e);const t=v(e.route);return a.provide(P,t),a.component("Content",w),a.component("ClientOnly",y),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:C}),{app:a,router:e,data:t}}function L(){return R(T)}function O(){let e=o,a;return _(t=>{let n=b(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=E(()=>import(n),__vite__mapDeps([]))),o&&(e=!1),r},s.NotFound)}o&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{j as createApp}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} diff --git a/assets/article_2019_bind-call-apply.md.EzG0_8Ly.js b/assets/article_2019_bind-call-apply.md.EzG0_8Ly.js new file mode 100644 index 000000000..d4377f4d7 --- /dev/null +++ b/assets/article_2019_bind-call-apply.md.EzG0_8Ly.js @@ -0,0 +1,59 @@ +import{_ as p,c as o,J as s,V as e,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"使用bind、call、apply改变this指向","description":"js中如何使用bind、call、apply改变this指向","frontmatter":{"title":"使用bind、call、apply改变this指向","description":"js中如何使用bind、call、apply改变this指向","keywords":"this指向,bind,apply,call,js,js改变this","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2019/bind-call-apply.md","filePath":"article/2019/bind-call-apply.md","lastUpdated":1706247228000}'),t={name:"article/2019/bind-call-apply.md"},r=e(`

bind、call、apply使用技巧

介绍与使用方法

js
// call
+fn.call(thisArg[, arg1[, arg2[, arg3]]])
+// apply
+fn.apply(thisArg, [argsArray])
+// bind
+fn.bind(thisArg[, arg1[, arg2[, arg3]]])()

apply介绍

语法:

fun.apply(thisArg, [argsArray])

示例:

js
var a ={
+    name : "Cherry",
+    fn : function (a,b) {
+        console.log( a + b)
+    }
+}
+var b = a.fn;
+b.apply(a,[1,2])     // 3

call介绍

语法:

fun.call(thisArg[, arg1[, arg2[, ...]]])

示例:

js
var a ={
+    name : "Cherry",
+    fn : function (a,b) {
+        console.log( a + b)
+    }
+}
+var b = a.fn;
+b.call(a,1,2)       // 3

bind介绍

语法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])()

示例:

js
var a ={
+    name : "Cherry",
+    fn : function (a,b) {
+        console.log( a + b)
+    }
+}
+var b = a.fn;
+b.bind(a,1,2)()           // 3

三者区别

apply和call基本上相似,他们的区别只是传入的参数不同

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

手写call,apply,bind

下面我们来简单的实现一下这三者

手写call

js
Function.prototype.mycall = function(context){
+    if(typeof this !== 'function'){
+        throw new TypeError('Error')
+    }
+    context = context || window
+    context.fn = this
+    const args = [...argrments].slice(1)
+    let result = context.fn(...args)
+    delete context.fn
+    return result
+}

解析:

手写apply

js
Function.prototype.myapply = function(context) {
+    if(typeof this !== 'function'){
+        throw new TypeError('Error')
+    }
+    context = context || window
+    context.fn = this
+    let result
+    arguments[1] ? result = context.fn(...arguments[1]) : context.fn()
+    delete context.fn
+    return result
+}

解析: 同上(基本相似)

手写bind

js
Function.prototype.mybind = function(context) {
+    if(typeof this !== 'function'){
+        throw new TypeError('Error')
+    }
+    const args = [...arguments].slice(1)
+    const _this = this
+    return function F(){
+        if(this instanceof F){
+            return new _this(...args, ...arguments)
+        }
+        return _this.apply(context, args.concat(...arguments))
+    }
+}

解析:

最后

希望以上的解析还可以帮助你进一步理解三者的概念和使用方法,手写的实现方法可能会有一些小问题,你可以进行补充,如果你喜欢本篇文章,动动小手分享出去,关注GitHub更多优质项目等你来开箱😄

`,39);function y(i,F,D,b,d,u){const a=n("Reward"),l=n("Gitalk");return c(),o("div",null,[r,s(a),s(l)])}const m=p(t,[["render",y]]);export{A as __pageData,m as default}; diff --git a/assets/article_2019_bind-call-apply.md.EzG0_8Ly.lean.js b/assets/article_2019_bind-call-apply.md.EzG0_8Ly.lean.js new file mode 100644 index 000000000..66b9fd8ac --- /dev/null +++ b/assets/article_2019_bind-call-apply.md.EzG0_8Ly.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"使用bind、call、apply改变this指向","description":"js中如何使用bind、call、apply改变this指向","frontmatter":{"title":"使用bind、call、apply改变this指向","description":"js中如何使用bind、call、apply改变this指向","keywords":"this指向,bind,apply,call,js,js改变this","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2019/bind-call-apply.md","filePath":"article/2019/bind-call-apply.md","lastUpdated":1706247228000}'),t={name:"article/2019/bind-call-apply.md"},r=e("",39);function y(i,F,D,b,d,u){const a=n("Reward"),l=n("Gitalk");return c(),o("div",null,[r,s(a),s(l)])}const m=p(t,[["render",y]]);export{A as __pageData,m as default}; diff --git a/assets/article_2019_css-center.md.9vJJ7-ow.js b/assets/article_2019_css-center.md.9vJJ7-ow.js new file mode 100644 index 000000000..e7270e296 --- /dev/null +++ b/assets/article_2019_css-center.md.9vJJ7-ow.js @@ -0,0 +1,153 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"css的10中居中方式","description":"css居中样式可以用10种方法完成","frontmatter":{"title":"css的10中居中方式","description":"css居中样式可以用10种方法完成","keywords":"CSS居中,css垂直居中","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-css.png"},"headers":[],"relativePath":"article/2019/css-center.md","filePath":"article/2019/css-center.md","lastUpdated":1706247228000}'),c={name:"article/2019/css-center.md"},r=o(`

css的10中居中方式

要实现上图的效果看似很简单,实则暗藏玄机,本文总结了一下CSS实现水平垂直居中的方式大概有下面这些,本文将逐一介绍一下 仅居中元素定宽高适用

居中元素不定宽高

absolute + 负margin

为了实现上面的效果先来做些准备工作,假设HTML代码如下,总共两个元素,父元素和子元素

html
<div class="wp">
+    <div class="box size">123123</div>
+</div>

wp是父元素的类名,box是子元素的类名,因为有定宽和不定宽的区别,size用来表示指定宽度,下面是所有效果都要用到的公共代码,主要是设置颜色和宽高

后面不在重复这段公共代码,只会给出相应提示

css
/* 公共代码 */
+.wp {
+    border: 1px solid red;
+    width: 300px;
+    height: 300px;
+}
+.box {
+    background: green;    
+}
+.box.size{
+    width: 100px;
+    height: 100px;
+}
+/* 公共代码 */

绝对定位的百分比是相对于父元素的宽高,通过这个特性可以让子元素的居中显示,但绝对定位是基于子元素的左上角,期望的效果是子元素的中心居中显示

为了修正这个问题,可以借助外边距的负值,负的外边距可以让元素向相反方向定位,通过指定子元素的外边距为子元素宽度一半的负值,就可以让子元素居中了,css代码如下

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    position: relative;
+}
+.box {
+    position: absolute;;
+    top: 50%;
+    left: 50%;
+    margin-left: -50px;
+    margin-top: -50px;
+}

这是我比较常用的方式,这种方式比较好理解,兼容性也很好,缺点是需要知道子元素的宽高

absolute + margin auto

这种方式也要求居中元素的宽高必须固定,HTML代码如下

css
<div class="wp">
+    <div class="box size">123123</div>
+</div>

这种方式通过设置各个方向的距离都是0,此时再讲margin设为auto,就可以在各个方向上居中了

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    position: relative;
+}
+.box {
+    position: absolute;;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+}

这种方法兼容性也很好,缺点是需要知道子元素的宽高

absolute + calc

这种方式也要求居中元素的宽高必须固定,所以我们为box增加size类,HTML代码如下

html
<div class="wp">
+    <div class="box size">123123</div>
+</div>

感谢css3带来了计算属性,既然top的百分比是基于元素的左上角,那么在减去宽度的一半就好了,代码如下

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    position: relative;
+}
+.box {
+    position: absolute;;
+    top: calc(50% - 50px);
+    left: calc(50% - 50px);
+}

这种方法兼容性依赖calc的兼容性,缺点是需要知道子元素的宽高

absolute + transform

还是绝对定位,但这个方法不需要子元素固定宽高,所以不再需要size类了,HTML代码如下

html
<div class="wp">
+    <div class="box">123123</div>
+</div>

修复绝对定位的问题,还可以使用css3新增的transform,transform的translate属性也可以设置百分比,其是相对于自身的宽和高,所以可以讲translate设置为-50%,就可以做到居中了,代码如下

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    position: relative;
+}
+.box {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+}

这种方法兼容性依赖translate2d的兼容性

lineheight

利用行内元素居中属性也可以做到水平垂直居中,HTML代码如下

html
<div class="wp">
+    <div class="box">123123</div>
+</div>

把box设置为行内元素,通过text-align就可以做到水平居中,但很多同学可能不知道通过通过vertical-align也可以在垂直方向做到居中,代码如下

css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    line-height: 300px;
+    text-align: center;
+    font-size: 0px;
+}
+.box {
+    font-size: 16px;
+    display: inline-block;
+    vertical-align: middle;
+    line-height: initial;
+    text-align: left; /* 修正文字 */
+}

这种方法需要在子元素中将文字显示重置为想要的效果

writing-mode

很多同学一定和我一样不知道writing-mode属性,感谢@张鑫旭老师的反馈,简单来说writing-mode可以改变文字的显示方向,比如可以通过writing-mode让文字的显示变为垂直方向

html
<div class="div1">水平方向</div>
+<div class="div2">垂直方向</div>
+.div2 {
+    writing-mode: vertical-lr;
+}

更神奇的是所有水平方向上的css属性,都会变为垂直方向上的属性,比如text-align,通过writing-modetext-align就可以做到水平和垂直方向的居中了,只不过要稍微麻烦一点

html
<div class="wp">
+    <div class="wp-inner">
+        <div class="box">123123</div>
+    </div>
+</div>
css
/* 此处引用上面的公共代码 */
+/* 此处引用上面的公共代码 */
+/* 定位代码 */
+.wp {
+    writing-mode: vertical-lr;
+    text-align: center;
+}
+.wp-inner {
+    writing-mode: horizontal-tb;
+    display: inline-block;
+    text-align: center;
+    width: 100%;
+}
+.box {
+    display: inline-block;
+    margin: auto;
+    text-align: left;
+}

这种方法实现起来和理解起来都稍微有些复杂

table

曾经table被用来做页面布局,现在没人这么做了,但table也能够实现水平垂直居中,但是会增加很多冗余代码

html
<table>
+    <tbody>
+        <tr>
+            <td class="wp">
+                <div class="box">123123</div>
+            </td>
+        </tr>
+    </tbody>
+</table>

tabel单元格中的内容天然就是垂直居中的,只要添加一个水平居中属性就好了

css
.wp {
+    text-align: center;
+}
+.box {
+    display: inline-block;
+}

这种方法就是代码太冗余,而且也不是table的正确用法

css-table

css新增的table属性,可以让我们把普通元素,变为table元素的现实效果,通过这个特性也可以实现水平垂直居中

html
<div class="wp">
+    <div class="box">123123</div>
+</div>

下面通过css属性,可以让div显示的和table一样

css
.wp {
+    display: table-cell;
+    text-align: center;
+    vertical-align: middle;
+}
+.box {
+    display: inline-block;
+}

这种方法和table一样的原理,但却没有那么多冗余代码,兼容性也还不错

flex

flex作为现代的布局方案,颠覆了过去的经验,只需几行代码就可以优雅的做到水平垂直居中

html
<div class="wp">
+    <div class="box">123123</div>
+</div>
css
.wp {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}

目前在移动端已经完全可以使用flex了,PC端需要看自己业务的兼容性情况

grid

感谢@一丝姐 反馈的这个方案,css新出的网格布局,由于兼容性不太好,一直没太关注,通过grid也可以实现水平垂直居中

html
<div class="wp">
+    <div class="box">123123</div>
+</div>
css
.wp {
+    display: grid;
+}
+.box {
+    align-self: center;
+    justify-self: center;
+}

代码量也很少,但兼容性不如flex,不推荐使用

总结

下面对比下各个方式的优缺点,肯定又双叒叕该有同学说回字的写法了,简单总结下

方法居中元素定宽高固定PC兼容性移动端兼容性
absolute + 负marginie6+, chrome4+, firefox2+安卓2.3+, iOS6+
absolute + margin autoie6+, chrome4+, firefox2+安卓2.3+, iOS6+
absolute + calcie9+, chrome19+, firefox4+安卓4.4+, iOS6+
absolute + transformie9+, chrome4+, firefox3.5+安卓3+, iOS6+
writing-modeie6+, chrome4+, firefox3.5+安卓2.3+, iOS5.1+
lineheightie6+, chrome4+, firefox2+安卓2.3+, iOS6+
tableie6+, chrome4+, firefox2+安卓2.3+, iOS6+
css-tableie8+, chrome4+, firefox2+安卓2.3+, iOS6+
flexie10+, chrome4+, firefox2+安卓2.3+, iOS6+
gridie10+, chrome57+, firefox52+安卓6+, iOS10.3+

最近发现很多同学都对css不够重视,这其实是不正确的,比如下面的这么简单的问题都有那么多同学不会,我也是很无语

html
<div class="red blue">123</div>
+<div class="blue red">123</div>
+.red {
+    color: red
+}
+
+.blue {
+    color: blue
+}

问两个div的颜色分别是什么,竟然只有40%的同学能够答对,这40%中还有很多同学不知道为什么,希望这些同学好好补习下CSS基础

原文链接

`,77);function i(D,F,y,b,d,u){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[r,s(a),s(l)])}const g=p(c,[["render",i]]);export{C as __pageData,g as default}; diff --git a/assets/article_2019_css-center.md.9vJJ7-ow.lean.js b/assets/article_2019_css-center.md.9vJJ7-ow.lean.js new file mode 100644 index 000000000..829073916 --- /dev/null +++ b/assets/article_2019_css-center.md.9vJJ7-ow.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"css的10中居中方式","description":"css居中样式可以用10种方法完成","frontmatter":{"title":"css的10中居中方式","description":"css居中样式可以用10种方法完成","keywords":"CSS居中,css垂直居中","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-css.png"},"headers":[],"relativePath":"article/2019/css-center.md","filePath":"article/2019/css-center.md","lastUpdated":1706247228000}'),c={name:"article/2019/css-center.md"},r=o("",77);function i(D,F,y,b,d,u){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[r,s(a),s(l)])}const g=p(c,[["render",i]]);export{C as __pageData,g as default}; diff --git a/assets/article_2019_js-copy.md.hrnH-GZy.js b/assets/article_2019_js-copy.md.hrnH-GZy.js new file mode 100644 index 000000000..dbb57dfca --- /dev/null +++ b/assets/article_2019_js-copy.md.hrnH-GZy.js @@ -0,0 +1,132 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"JS的深拷贝和浅拷贝","description":"JS的深拷贝和浅拷贝,递归拷贝","frontmatter":{"title":"JS的深拷贝和浅拷贝","description":"JS的深拷贝和浅拷贝,递归拷贝","keywords":"深拷贝,浅拷贝,递归拷贝,数据结构,lodash","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2019/js-copy.md","filePath":"article/2019/js-copy.md","lastUpdated":1706247228000}'),c={name:"article/2019/js-copy.md"},t=e(`

JS的深浅拷贝

数据类型

数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。

引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

浅拷贝与深拷贝

深拷贝和浅拷贝是只针对 Object 和 Array 这样的引用数据类型的

深拷贝和浅拷贝的示意图大致如下:

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

赋值和浅拷贝的区别

  1. 当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
  1. 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

我们先来看两个例子,对比赋值与浅拷贝会对原对象带来哪些改变?

js
// 对象赋值
+var obj1 = {
+  name: "zhangsan",
+  age: "18",
+  language: [1, [2, 3], [4, 5]]
+};
+var obj2 = obj1;
+obj2.name = "lisi";
+obj2.language[1] = ["", ""];
+console.log("obj1", obj1);
+console.log("obj2", obj2);

js
// 浅拷贝
+var obj1 = {
+  name: "zhangsan",
+  age: "18",
+  language: [1, [2, 3], [4, 5]]
+};
+var obj3 = shallowCopy(obj1);
+obj3.name = "lisi";
+obj3.language[1] = ["", ""];
+function shallowCopy(src) {
+  var dst = {};
+  for (var prop in src) {
+    if (src.hasOwnProperty(prop)) {
+      dst[prop] = src[prop];
+    }
+  }
+  return dst;
+}
+console.log("obj1", obj1);
+console.log("obj3", obj3);

上面例子中,obj1 是原始数据,obj2 是赋值操作得到,而 obj3 浅拷贝得到。我们可以很清晰看到对原始数据的影响,具体请看下表:

/和原数据是否指向同一个对象第一层数据为基本数据类型原数据中包含子对象
赋值改变会使原数据一同改变改变会使原数据一同改变
浅拷贝改变不会使原数据一同改变改变会使原数据一同改变
深拷贝改变不会使原数据一同改变改变不会使原数据一同改变

浅拷贝的实现方式

1.Object.assign()

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign()进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

js
var obj = { a: { a: "kobe", b: 39 } };
+var initalObj = Object.assign({}, obj);
+initalObj.a.a = "wade";
+console.log(obj.a.a); //wade

当 object 只有一层的时候,是深拷贝

js
let obj = {
+  username: "kobe"
+};
+let obj2 = Object.assign({}, obj);
+obj2.username = "wade";
+console.log(obj); //{username: "kobe"}

2.Array.prototype.concat()

js
let arr = [
+  1,
+  3,
+  {
+    username: "kobe"
+  }
+];
+let arr2 = arr.concat();
+arr2[2].username = "wade";
+console.log(arr);

修改新对象会改到原对象:

3.Array.prototype.slice()

js
let arr = [
+  1,
+  3,
+  {
+    username: " kobe"
+  }
+];
+let arr3 = arr.slice();
+arr3[2].username = "wade";
+console.log(arr);

同样修改新对象会改到原对象:

Array 的 slice 和 concat 方法不修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。

原数组的元素会按照下述规则拷贝:

可能这段话晦涩难懂,我们举个例子,将上面的例子小作修改:

js
let arr = [
+  1,
+  3,
+  {
+    username: " kobe"
+  }
+];
+let arr3 = arr.slice();
+arr3[1] = 2;
+console.log(arr, arr3);

深拷贝的实现方式

1.JSON.parse(JSON.stringify())

js
let arr = [
+  1,
+  3,
+  {
+    username: " kobe"
+  }
+];
+let arr4 = JSON.parse(JSON.stringify(arr));
+arr4[2].username = "duncan";
+console.log(arr, arr4);

原理: 用 JSON.stringify 将对象转成 JSON 字符串,再用 JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。

这种方法虽然可以实现数组或对象深拷贝,但不能处理函数

js
let arr = [
+  1,
+  3,
+  {
+    username: " kobe"
+  },
+  function() {}
+];
+let arr4 = JSON.parse(JSON.stringify(arr));
+arr4[2].username = "duncan";
+console.log(arr, arr4);

这是因为 JSON.stringify() 方法是将一个 JavaScript 值(对象或者数组)转换为一个 JSON 字符串,不能接受函数

2.手写递归方法

递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝

ts
function deepCopy(from: any, map: any = new Map()) {
+  const isObject = (obj: any): obj is Object =>
+    Object.prototype.toString.call(obj) === "[object Object]" ||
+    Object.prototype.toString.call(obj) === "[object Array]";
+
+  if (!isObject(from)) return from;
+  let res: any = Array.isArray(from) ? [] : {};
+
+  // 有缓存时不用递归,解决循环引用问题
+  if (map.get(from)) res = map.get(from);
+  else {
+    // 缓存当前对象
+    map.set(from, res);
+    for (const key of [
+      ...Object.keys(from),
+      ...Object.getOwnPropertySymbols(from),
+    ]) {
+      const val = from[key];
+      if (isObject(val)) {
+        res[key] = deepCopy(val, map);
+      } else {
+        res[key] = val;
+      }
+    }
+  }
+  return res;
+}

测试:

js
let a = {
+  age: 11,
+  arr: [1, 2, 3],
+  say: function() {},
+  m: Symbol(1)
+};
+const b = deepCopy(a)
+b.age = 12
+b.arr[1] = 4
+b.m = Symbol(2)
+console.log("a", a)
+console.log("b", b)
+// 输出
+a { age: 11, arr: [ 1, 2, 3 ], say: [Function: say], m: Symbol(1) }
+b { age: 12, arr: [ 1, 4, 3 ], say: [Function: say], m: Symbol(2) }

从上面可以看出,改变b的值,a没有发生变化

函数库lodash

该函数库也有提供_.cloneDeep用来做 Deep Copy

js
var _ = require('lodash');
+var obj1 = {
+    a: 1,
+    b: { f: { g: 1 } },
+    c: [1, 2, 3]
+};
+var obj2 = _.cloneDeep(obj1);
+console.log(obj1.b.f === obj2.b.f);
+// false

总结

本篇主要讲了深拷贝和浅拷贝的特点,以及如何实现它们,并介绍了一些注意点。

`,61);function F(D,y,i,b,B,u){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const E=p(c,[["render",F]]);export{m as __pageData,E as default}; diff --git a/assets/article_2019_js-copy.md.hrnH-GZy.lean.js b/assets/article_2019_js-copy.md.hrnH-GZy.lean.js new file mode 100644 index 000000000..aab749186 --- /dev/null +++ b/assets/article_2019_js-copy.md.hrnH-GZy.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"JS的深拷贝和浅拷贝","description":"JS的深拷贝和浅拷贝,递归拷贝","frontmatter":{"title":"JS的深拷贝和浅拷贝","description":"JS的深拷贝和浅拷贝,递归拷贝","keywords":"深拷贝,浅拷贝,递归拷贝,数据结构,lodash","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2019/js-copy.md","filePath":"article/2019/js-copy.md","lastUpdated":1706247228000}'),c={name:"article/2019/js-copy.md"},t=e("",61);function F(D,y,i,b,B,u){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const E=p(c,[["render",F]]);export{m as __pageData,E as default}; diff --git a/assets/article_2019_js-type-transfer.md.UKEkeSx-.js b/assets/article_2019_js-type-transfer.md.UKEkeSx-.js new file mode 100644 index 000000000..39d526c98 --- /dev/null +++ b/assets/article_2019_js-type-transfer.md.UKEkeSx-.js @@ -0,0 +1,175 @@ +import{_ as e,c as p,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"JS类型隐式转换与装箱拆箱","description":"搞明白JS动态弱类型语言的隐式转换规则及装箱拆箱规则来提高你的程序稳定性","frontmatter":{"title":"JS类型隐式转换与装箱拆箱","description":"搞明白JS动态弱类型语言的隐式转换规则及装箱拆箱规则来提高你的程序稳定性","keywords":"类型隐式转换,装箱拆箱,运算转换,类型转换规则,type conversion,toPrimitive,弱类型,OrdinaryToPrimitive","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2019/js-type-transfer.md","filePath":"article/2019/js-type-transfer.md","lastUpdated":1706247228000}'),r={name:"article/2019/js-type-transfer.md"},c=o(`

JS类型隐式转换与装箱拆箱

如果你写过大多数强类型语言如Java对数据的类型一定不会陌生,如定义两个变量:int num = 1boolean bool = false,比较两个变量是否相等时结果很明显时false(不同类型直接会报错),类型不同的变量永远不会相等。由于JS被定位成动态弱类型语言,其往往会颠覆你的认知。

JS引擎往往会最大限度的降低程序的错误,假如你会写num = 1;num.name=xxx这种很明显的错误,但当你运行时却不会报错,这里就涉及到了装箱和拆箱;还有1 == true; 1 == [1]你会发现竟然结果都为true,如果你不了解JS内部的装箱、拆箱和类型的隐式转换规则,这些可能都会让你产生困惑,如果你有这些疑惑,接着看下面的内容吧。

注:如遇到有一些链接无法访问可能需要科学上网

装箱与拆箱

什么是装箱和拆箱?JS中有stringnumberboolean基础类型,它们都有对应的包装类型(引用类型)StringNumberBoolean装箱就是将基础类型转换为对应的包装类型,而拆箱则将包装类型转换为对应的基础类型。

如果你对拆箱操作不了解,将会影响你对隐式转换的理解。

装箱

装箱可以通过显式new进行装箱,JS引擎也可以隐式装箱,下面就来了解下两种不同的装箱操作。

  1. 显式装箱
js
// string
+str = new Object('str')
+str = new String('str')
+
+// boolean
+bool = new Object(true)
+bool = new Boolean(true)
+
+// number
+num = new Object(1)
+num = new Number(1)
  1. 隐式装箱
js
name = 'js'
+// 例1
+name.toUpperCase(); // JS
+
+// 例2
+name.age = 1; // 自动装箱 => name = new String('js') => name.age = 1 => 下一行前销毁当前对象
+console.log(name.age); // undefined

上面隐式装箱name是个基础类型,基础类型不会有属性的,但却拥有toUpperCase方法,其本质还是String对象的方法,当执行此方法时会隐式的将name转换为对象name => new String(name),然后就会拥有对应的方法;而给其设置age属性后重新获取却为undefined,这里JS引擎就处理了错误的赋值操作,也会将name转换为new String(name)然后在执行下一行前又会销毁此对象,可以理解为当前对象就是来为赋值操作服务的。

拆箱

拆箱则是将包装类型转化为对应的基础类型,通过执行valueOf方法可以得到它的原始值:

js
num = new Number(123); // Number {123}
+typeof num; // object
+num.valueOf(); // 123
+
+bool = new Object(true); // Boolean {true}
+typeof booll; // object
+bool.valueOf(); // true

除了执行valueOftoString方法也可以将包装类型转换为基础类型字符串形式,其实除了以上几个包装类型拆箱,其他的引用类型也会根据一定的规则进行转换,下面就来一起看看。

toPrimitive、 OrdinaryToPrimitive

对于引用类型在特殊条件下都会转换为基础类型,其拆箱都会遵循【toPrimitive规则】

JS引擎內部toPrimitive的签名如下:input是待转换的对象,perferedType为转换的类型,有string/number两种

ts
toPrimitive(input, perferedType);
+
+// 1. If input is an Object, then
+//   a. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
+//   b. If exoticToPrim is not undefined, then
+//     i. If preferredType is not present, let hint be "default".
+//     ii. Else if preferredType is string, let hint be "string".
+//     iii. Else,
+//       1. Assert: preferredType is number.
+//       2. Let hint be "number".
+//     iv. Let result be ? Call(exoticToPrim, input, « hint »).
+//     v. If result is not an Object, return result.
+//     vi. Throw a TypeError exception.
+//   c. If preferredType is not present, let preferredType be number.
+//   d. Return ? OrdinaryToPrimitive(input, preferredType).
+// 2. Return input.

这里的toPrimitive属性其实就是Symbol.toPrimitive属性,其内部转换可以概括步骤如下(重点):

  1. 当进行类型转换时会首先判断有没有Symbol.toPromitive属性:
    • perferedTypestring时,返回string条件结果。
    • perferedTypenumber时返回number条件结果。
    • perferedType为空时,返回default条件结果。
    • 如果以上返回的结果不是基本类型时抛异常Cannot convert object to primitive value
  2. 如果没有Symbol.toPromitive属性,会执行内部的OrdinaryToPrimitive方法,此方法会根据优先级调用toStringvalueOf方法,其调用顺序如下:
    • 当指定转换类型为string时,会优先调用toString方法,若执行结果为基础类型则返回,否则执行valueOf方法,基本类型结果将会返回,否则将会抛异常。
    • 当指定转换类型为number时,会优先调用valueOf方法,若执行结果为基础类型则返回,否则执行toString方法,基本类型结果将会返回,否则将会抛异常。
    • 在不指定类型情况下,除了Date会优先执行toString方法,其余的都会优先执行valueOf方法,然后根据前两条规则执行。

OrdinaryToPrimitive签名如下:

ts
OrdinaryToPrimitive(O, hint);
+
+// 1. If hint is string, then
+//   a. Let methodNames be « "toString", "valueOf" ».
+// 2. Else,
+//   a. Let methodNames be « "valueOf", "toString" ».
+// 3. For each element name of methodNames, do
+//   a. Let method be ? Get(O, name).
+//   b. If IsCallable(method) is true, then
+//     i. Let result be ? Call(method, O).
+//     ii. If result is not an Object, return result.
+// 4. Throw a TypeError exception.

OrdinaryToPrimitive的执行也可以在源码(c代码JS代码)中找到,你可以在source.chromium.org中搜索对应的关键字OrdinaryToPrimitive,就可以找到。下面代码也证明了OrdinaryToPrimitive的执行的执行步骤

js
module.exports = function OrdinaryToPrimitive(O, hint) {
+  if (Type(O) !== 'Object') {
+    throw new $TypeError('Assertion failed: Type(O) is not Object');
+  }
+  if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
+    throw new $TypeError('Assertion failed: \`hint\` must be "string" or "number"');
+  }
+
+  var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
+
+  for (var i = 0; i < methodNames.length; i += 1) {
+    var name = methodNames[i];
+    var method = Get(O, name);
+    if (IsCallable(method)) {
+      var result = Call(method, O);
+      if (Type(result) !== 'Object') {
+        return result;
+      }
+    }
+  }
+
+  throw new $TypeError('No primitive value for ' + inspect(O));
+};

接下来通过下面的代码来证明以上总结的步骤,首先会执行Symbol.toPrimitive方法,没有则会执行OrdinaryToPrimitive的方法。

Symbol.toPrimitive证明

js
// 根据toPrimitive签名定义方法
+obj = {
+  [Symbol.toPrimitive](perferedType) {
+    if (perferedType === "number") return 1;
+    if (perferedType === "string") return "str";
+    return "default";
+  }
+}
+
+// 1. perferedType为string
+\`\${obj}\`; // 'str'
+
+// 2. perferedType为number
++obj; // 1
+
+// 3. perferedType为 undefined
+'' + obj; // 'default'
+
+// 若返回的结果不是基础类型则抛异常,这里修改一个number返回对象
+obj = {
+  [Symbol.toPrimitive](perferedType) {
+    if (perferedType === "number") return [1,2,3];
+    if (perferedType === "string") return "str";
+    return "default";
+  }
+}
++obj; // Uncaught TypeError: Cannot convert object to primitive value

通过上面的代码再次证明了确实是以上的步骤,接下来看OrdinaryToPrimitive

OrdinaryToPrimitive证明

js
// 1. hint为string会先执行toString方法
+\`\${{valueOf: () => 1, toString: () => 2}}\`; // '2'
+Array.prototype.toString = () => 'array';
+\`\${[1,2,3]}\`; // 'array'
+
+// 2. hint为number会先执行valueOf方法
++({valueOf: () => 1, toString: () => 2}); // 1
+Array.prototype.valueOf = () => 2;
++[1,2,3]; // 2
+
+// 3.当不指定 hint 类型时,除Date类型其它会优先执行\`valueOf\`,然后执行\`toString\`,Date正好相反
+'' + ({valueOf: () => 1, toString: () => 2}); // '1'
+1 + ({valueOf: () => 1, toString: () => 2}); // 2
+'' + new Date(); // 'Thu Dec 01 2021 12:56:23 GMT+0800 (中国标准时间)'
+Date.prototype.toString = () => 'date'; // 修改Date的toString方法
+'' + new Date(); // date
+
+// 4.若某一个方法返回的不是基础类型,继续执行下一个方法,否则抛异常
+'' + ({valueOf: () => [1,2,3], toString: () => 2}); // 2 => 执行toSting
+Date.prototype.toString = () => [1,2,3]; // 修改Date的toString方法
+'' + new Date(); // '1609459200000' => 执行 valueOf
+'' + ({valueOf: () => [1,2,3], toString: () => []}); // Uncaught TypeError: Cannot convert object to primitive value

以上就是OrdinaryToPrimitive的执行步骤,其实valueOf执行结果更趋向于自己原本的值(除Date外),而toString一定会返回string类型,如:

js
// valueOf
+obj = { name: 1 };
+obj.valueOf(); // { name: 1 }
+(function(){}).valueOf(); // f(){}
+[1,2,3].valueOf(); // [1,2,3]
+new RegExp('^\\d+','i').valueOf(); // /^d+/i
+
+// toString
+obj.toString(); // '[object Object]'
+[1,2,3].toString(); // '1,2,3'
+new RegExp('^\\d+','i').toString(); // '/^d+/i'

通过上面的内容你应该对装箱与拆箱有了更深的认识,从拆箱中应该也看到了类型转换的影子(上面代码中12,13行高亮部分)'' + ({valueOf: () => 1, toString: () => 2}); // '1',返回的结果是个字符串1而不是数字,而1 + ({valueOf: () => 1, toString: () => 2}); // 2返回的却是数字2,两者只因相加位类型的不同结果也不同,这里就涉及到了类型的隐式转换,number => string的转换。

了解了对象转换为原始类型(拆箱)后,接下来就来看看类型隐式转换是如何运作的。

类型隐式转换

提示

如果你在类型隐式转换的阅读过程中产生的疑问过多,建议将装箱和拆箱的内容多读、多练几遍。

类型隐式转换可以归结为numberstringboolean等其它基础类型之间通过运算符==*、/、+、-或逻辑运算的转换。由于JS的弱类型特征,像==比较者可以为任意类型任意值,而===比较者的类型不同永远不会相等(1 == 11 === '1')。

其实转换者可以是基础类型和对象类型,但归根还是基础类型之间的转换,若转换者存在对象类型,会根据拆箱优先级进行拆箱转换为基础类型后,然后在根据类型隐式转换的规则进行转换。

这里列出一张不同类型转换表格,里面包含了不同类型转换到原始值或其它基础类型的规则,通常情况下记住这张表的转换规则就可以解决所有隐式转换的问题了(当然对象类型转换为基础类型要学会前面讲的拆箱规则)。

类型to Booleanto Numberto String
Booleantruetrue1'true'
Booleanfalsefalse0'false'
Number100true100'100'
NumberInfinitytrueInfinity'Infinity'
Number0false0'0'
NumberNaNfalseNaN'NaN'
String''false0''
String'100'true100'100'
String'100abc'trueNaN'100abc'
String'abc'trueNaN'abc'
Nullnullfalse0'null'
UndefinedundefinedfalseNaN'undefined'
Functionfunction(){}trueNaN'function(){}'
Object{}trueNaN'[object Object]'
Array[]true0''
Array['abc']trueNaN'abc'
Array['123']true123'123'
Array['123', 'abc']trueNaN'123,abc'
Datenew Datetrue数字(时间戳)'Wed Nov 16 2020 16:51:31 GMT+0800 (中国标准时间)'
SymbolSymbol('a')truethrow TypeErrorthrow TypeError

算术运算符转换

算术运算符主要包括+、-、*、/,除了+运算符外,其余算术运算符都针对的是数字number,也就是说运算双方都必须是或转换为数字,这个相对来说简单直接套上面的表格即可,而+运算符最为特殊,+不仅可以进行算术运算也可以进行字符串的拼接,同时也是最常见的隐式转换。

减乘除

参与双方若是基础类型都会转换为number类型,而一方为引用类型时会先进行内部拆箱转换成最兼容number类型的基本类型,下面用一段代码加深下印象:

  1. string转number
js
'1' - 1  // 0
+'1' * 1  // 0
+'1a' - 1  // NaN

这里'1'会涉及到string => number的转换,从上面的表格中得到转换值为1,而'1a'转换后并不能兼容数字所以是NaN

  1. boolean转number
js
true - 0  // 1
+true * 1  // 1
+false - 0  // 0

true转换为1,false转换为0。

  1. undefined、null转number
js
undefined - 1  // NaN
+null - 1  // -1
+null * 1  // 0

undefined转换为NaN,null转换为0。

  1. 对象类型转number
js
[] - 1  // -1
+[] * 1  // 0
+[1] - 1  // 0
+[1, 'a'] - 1  // NaN
+({}) - 1  // NaN
+new Date() - 1  // 1577836799999
+(function(){}) - 1  // NaN
+new RegExp('^\\w+', 'i') - 1  // NaN

对象类型会根据OrdinaryToPrimitive拆箱规则进行转换为基础类型number类型,然后进行计算。

以上便是-、*、/运算符转换为number类型的规则,比较简单。

加运算

加法运算最为特殊同时也是类型转换最多的,不仅可以进行算术运算也可以进行字符串的拼接。其转换规则为:

  1. 若一方是string类型,则另一方也会转换为字符串,进行字符串的拼接
  2. 若一方为number类型,另一方为原始类型,将其转换为number类型,进行算术相加。
  3. 若一方为number类型,另一方为引用类型,将其拆箱转换为基本类型后,进行字符串的拼接。

以上转换规则优先级从高到低进行转换。

下面用几个例子演示这些规则:

转换规则1:

js
'' + 1 // '1'
+'' + true // 'true'
+'str' + undefined // 'strundefined'
+'' + null // 'null'
+'' + [] // ''
+'' + [1] // '1'
+'' + [1,2,3] // '1,2,3'
+'' + {name: 1} // '[object Object]'
+'' + (function(){}) // 'function(){}'

转换规则2:

js
1 + 1 // 2
+1 + true // 2
+1 + null // 1
+1 + undefined // NaN

转换规则3:

js
1 + [] // '1'
+1 + [1,2] // '11,2'
+1 + (function(){}) // '1function(){}'
+1 + ({}) // '1[objectObject]'
+1 + new Date() // '1Fri Dec 02 2020 11:40:48 GMT+0800 (中国标准时间)'
+1 + new RegExp('\\s', 'ig') // '1/s/gi'

以上便是加法的隐式转换,根据上面三条规则的优先级进行转换,基础不同类型转换的值可以根据上面的表格进行判断,引用类型根据拆箱规则结合转换优先级即可。

逻辑运算转换

!运算转换

逻辑运算的转换常见的就是!==的转换,相对来说非常简单。一般像null、undefined、0、''、NaN、false等为false外,其余的都是true(如:[]、{}等等)。

js
!null // true
+!undefined // true
+!NaN // true
+![] // false
+!{} // false

==运算转换

==转换规则一般总结为一下五条:

js
NaN == NaN // false
+NaN == 0 // false
+true == 2 // false  true => 1
+1 = '1' // true  '1' => 1
+undefined == null // true
+undefined == NaN // false
+null == false // false
+[1] == 1 // true  [1] => 1
+[1,2] == 1 // false  [1,2] => '1,2'

到这里基本上学会了以上的内容,隐式转换就可以搞懂了,其实也没什么难度,把这些转换概念摸清楚就可以游刃有余。

问题

有些同学可能看到这里,还没有完全掌握,这里就提供几个小菜,提供给大家练习,看和你的想法一直不,如果一直可以说清楚具体逻辑不,想法有出入那又是问什么?

js
({}) + []
查看结果

答案:'[object Object]',两者首先拆箱转换为基础类型,{} => [object Object][] => ''然后进行字符串拼接

js
[] == []
查看结果

答案:false,这里不会进行拆箱,类型相同的变量会直接比较,两者都是引用类型,地址不同不会相等

js
[] == ![]
查看结果

答案:true,![]先转换转换为false,[]进行拆箱变成0,false在转换成0

这里笔者发现一个有趣的问题,看看通过上面的知识你能解决吗:

js
let a;
+// 请让变量a满足以下条件
+
+if (a == 1 && a == 2 && a == 3) { console.log(true) };
查看结果
js
a = {
+  value: 1,
+  valueOf:() => a.value++;
+}

以上就是解决方案,是不是很简单。 首先要想a同时满足1、2、3的值,直接排除掉基础类型值,那么a一定是个引用类型,引用类型和基础类型的==比较,会通过拆箱规则转换,那么就会执行valueOf、toString方法,又根据拆箱优先级会先执行valueOf方法,那么在此方法做文章就可以了,每次读取值时进行自加,这样就会满足1、2、3

总结

本篇主要讲了JS怎么进行隐式转换的,通过拆箱和装箱了解到JS引擎对程序的包容性还是很高的,学会引用类型根据toPrimitive优先级规则进行转换,也学会了从简单的算术运算到逻辑运算的隐式转换规则。

相关参考:

`,97);function i(y,F,D,d,u,b){const a=n("Reward"),l=n("Gitalk");return t(),p("div",null,[c,s(a),s(l)])}const B=e(r,[["render",i]]);export{E as __pageData,B as default}; diff --git a/assets/article_2019_js-type-transfer.md.UKEkeSx-.lean.js b/assets/article_2019_js-type-transfer.md.UKEkeSx-.lean.js new file mode 100644 index 000000000..141f2a497 --- /dev/null +++ b/assets/article_2019_js-type-transfer.md.UKEkeSx-.lean.js @@ -0,0 +1 @@ +import{_ as e,c as p,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"JS类型隐式转换与装箱拆箱","description":"搞明白JS动态弱类型语言的隐式转换规则及装箱拆箱规则来提高你的程序稳定性","frontmatter":{"title":"JS类型隐式转换与装箱拆箱","description":"搞明白JS动态弱类型语言的隐式转换规则及装箱拆箱规则来提高你的程序稳定性","keywords":"类型隐式转换,装箱拆箱,运算转换,类型转换规则,type conversion,toPrimitive,弱类型,OrdinaryToPrimitive","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2019/js-type-transfer.md","filePath":"article/2019/js-type-transfer.md","lastUpdated":1706247228000}'),r={name:"article/2019/js-type-transfer.md"},c=o("",97);function i(y,F,D,d,u,b){const a=n("Reward"),l=n("Gitalk");return t(),p("div",null,[c,s(a),s(l)])}const B=e(r,[["render",i]]);export{E as __pageData,B as default}; diff --git a/assets/article_2019_ktv-system.md.ZlJWiM1B.js b/assets/article_2019_ktv-system.md.ZlJWiM1B.js new file mode 100644 index 000000000..dfb452aab --- /dev/null +++ b/assets/article_2019_ktv-system.md.ZlJWiM1B.js @@ -0,0 +1,436 @@ +import{_ as p,c as o,J as s,V as e,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"7天撸完ktv点歌系统","description":"使用express和vue全栈7天撸完ktv点歌系统(完整版)","frontmatter":{"title":"7天撸完ktv点歌系统","description":"使用express和vue全栈7天撸完ktv点歌系统(完整版)","keywords":"KTV点歌系统,毕业设计,nodejs,vue,后台管理系统,创意毕设,全栈,mysql,koa,express,全栈系统","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-npm.png"},"headers":[],"relativePath":"article/2019/ktv-system.md","filePath":"article/2019/ktv-system.md","lastUpdated":1706247228000}'),r={name:"article/2019/ktv-system.md"},c=e(`

7天撸完ktv点歌系统

用Express教你写KTV点歌系统,包括前台内容和后台管理系统,整合Express框架和Mongodb数据库服务器开发;教你用Vue.JS,ElementUI和iViewUI写出超漂亮的页面,随心点歌随心听

思维导图

技术栈

功能介绍

本项目分前台开发,后台开发和服务器开发

md
- 用户听歌需要登录(路由守卫)
+- 用户需要到管理员申请账号和密码
+- 用户登录听歌(风格点歌,语种点歌,明星点歌,热门歌曲等等...)
+- 剩余时长30分钟提醒,到时间自动下机
+- 管理员对歌曲的增删改查
+- 管理员给用户开户,可以选择上机的时间
+- 管理员查看订单,删除订单,搜索订单
+- 管理员收藏歌曲,推荐到ktv推荐歌曲
+- 等等...

项目设计结构

js
-- 服务器基本架构
+ktv-select_music-system
+├── README.md
+├── index.js  -- 后台文件入口
+├── test.http  -- 测试文件
+├── api  -- 路由文件
+│    ├── admin.js  -- 配置管理员的操作
+|    ├── music.js  -- 配置歌曲信息
+|    ├── user.js  -- 配置用户的相关操作
+|    └── safecode.js  -- 配置安全码
+├── config -- 配置
+|    ├── Date.js  -- 配置日期格式化插件
+|    ├── delNoUse.js  -- 封装闲置删除闲置资源方法
+|    ├── http.js  -- 配置跨域
+|    ├── isBadAccount.js  -- 封装账户是否合法
+|    ├── newaccount.js  -- 封装随机开户方法
+|    ├── passport.js  -- 验证token是否合法
+|    ├── uploadImg.js  -- 封装上传图片方法
+|    └── uploadMusic.js  -- 封装上传歌曲方法
+├── ktv-admin  --后台管理系统界面
+├── ktv-client  --前台用户点歌项目界面
+├── dbModel
+|    └── **  -- Mongodb数据库的一些模型
+├── mongodb
+|    └── mongodb.js  -- 配置Mongodb,链接数据库 
+├── secret
+|    ├── mongodbURI.js  -- Mongodb地址
+|    └── jwtkey.js  -- token的私钥
+├── static -- 资源存放处
+|    ├── music  -- 歌曲上传目标文件夹 
+|    ├── poster  -- 歌曲海报上传目标文件夹
+└──  └── view  -- 配置404文件
js
-- 后台管理系统架构
+ktv-admin
+├── README.md
+├── public 
+|    ├── index.html  -- vue挂载页面
+|    └── **  -- 你可以在这里链接少量静态资源
+├── src  -- 开发文件夹
+|    ├── App.vue  -- Vue挂载根页面
+|    ├── main.js  -- Vue程序入口文件,挂载各种组件
+|    ├── router.js  -- Vue路由配置文件
+|    ├── store.js  -- Vuex的状态管理文件
+|    ├── assets  -- 静态资源文件夹
+|    ├── components  --公共组件
+|    |      └── nav.vue  -- 后台导航栏
+|    ├── plugins  --插件
+|    |      ├── axios.js   -- 配置跨域,拦截器等等 
+|    |      ├── Date.js   -- 格式化日期 
+|    |      └── Date.js   -- 加载动画Loading
+|    ├── stores  -- 状态管理文件夹
+|    |      └── adminStore.js  -- 管理员状态 
+|    ├── views  -- 页面文件夹
+|    |      ├── 404.vue   -- 404页面
+|    |      ├── adminlikes.vue   -- 管理员处理ktv收藏歌曲
+|    |      ├── allorders.vue   -- 订单管理
+|    |      ├── Home.vue   -- 后台根页面
+|    |      ├── Index.vue   -- 后台首页
+|    |      ├── managemusic.vue   -- 音乐管理
+|    |      ├── user_service.vue   -- 给用户开户
+|    |      └── login.vue   -- 后台登录
+└── babel.config.js  -- babel配置
js

+-- 前台用户听歌架构
+ktv-client
+├── README.md
+├── public 
+|    ├── index.html  -- vue挂载页面
+|    └── **  -- 你可以在这里链接少量静态资源
+├── src  -- 开发文件夹
+|    ├── App.vue  -- Vue挂载根页面
+|    ├── main.js  -- Vue程序入口文件,挂载各种组件
+|    ├── router.js  -- Vue路由配置文件
+|    ├── store.js  -- Vuex的状态管理文件
+|    ├── assets  -- 静态资源文件夹
+|    ├── components  --公共组件
+|    |      ├── bottomNav.vue  -- 底部音乐控制区域
+|    |      └── topNav.vue  -- 顶部信息区域
+|    ├── config  --配置
+|    |      ├── addSong.js    --封装选取歌曲方法
+|    |      ├── isBadAccount.js    --验证账户合法性
+|    |      ├── isLogin.js    --是否登录
+|    |      ├── nextSong.js    --封装下一首歌曲方法
+|    |      └── prevSong.js    --封装上一首歌曲方法
+|    ├── plugins  --插件
+|    |      ├── axios.js   -- 配置跨域,拦截器等等 
+|    |      └── wsmLoading.js   -- 加载动画Loading
+|    ├── stores  -- 状态管理文件夹
+|    |      └── song.js  -- 存储歌曲信息 
+|    ├── views  -- 页面文件夹
+|    |      ├── 404.vue   -- 404页面
+|    |      ├── abc.vue   -- 拼音点歌
+|    |      ├── artist.vue   -- 明星点歌
+|    |      ├── Home.vue   -- 后台根页面
+|    |      ├── Index.vue   -- 后台首页
+|    |      ├── hot.vue   -- 热播歌曲
+|    |      ├── ktvlikes.vue   -- ktv推荐歌曲
+|    |      ├── selected.vue   -- 已选歌曲
+|    |      ├── style.vue   -- 风格点歌
+|    |      └── language.vue   -- 语种点歌
+├── babel.config.js  -- babel配置
+└── vue.config.js  -- vue配置

项目启动介绍

首先

  1. 首先不要改变服务器端口,否则报错.

  2. 你需要在装有Node和Vue的环境中测试,如果其中一个没有请先下载(Node下载,Vue下载).如果没有Mongodb数据库,请自行下载,对于环境就不多讲了.

  3. 首先在最外层文件夹下载依赖:npm install 下载后端依赖,

  4. 接着进入ktv-client, npm install 下载用户前端依赖.

  5. 接着进入ktv-admin, npm install 下载管理员前端依赖.

  6. 以上工作完成后,使用命令npm run server 或者 node index命令启动Node服务器,启动成功会显示:

    Server is running on port [8633].

    Mongodb is Connected.Please have a great coding.

  7. 进入ktv-client,打开命令板,使用命令npm run client启动前台用户项目,启动成功后用浏览器访问http://localhost:xxxx

  8. 进入ktv-admin,打开命令板,使用命令npm run admin启动后台管理系统项目,启动成功后用浏览器访问http://localhost:xxxx

  9. 本例中将Mongodb部署在本地电脑上,如果你仔细阅读了这篇文档,启动项目应该是很容易的。如果你把Mongodb部署在其他地方,请自行修改secret/mongodbURI.js配置文件信息。

  10. 项目启动成功,最好用 chrome 浏览器打开, 美化了滚动条

接着注册管理员账号

js
admin.js最下面有个注册接口
+
+// 管理员注册
+router.post("/account/register", (req, res) => {
+    const email = req.body.email;
+    Admin.findOne({email})
+        .then(hasOne => {
+            if(hasOne){
+                return req.status(422).json({status:"422", result:"邮箱被占用"});
+            }else{
+                const username = req.body.username;
+                const password = req.body.password;
+                const identity = req.body.identity ? req.body.identity : null;
+                const date = new Date().format("yyyy/MM/dd HH:mm:ss");
+                const newAdmin = new Admin({
+                    email,
+                    username,
+                    password,
+                    identity,
+                    date
+                });
+                newAdmin.save()
+                    .then(() => {
+                        res.json({status:"200", result:"注册成功"})
+                    }).catch(err => {
+                        console.log(err);
+                        res.status(500).json({status:"500", result:"未知错误,注册失败"})
+                    })
+            }
+        })
+})

然后用postman注册或者其他工具

技术攻关

Date方法

由于js没有元素格式化日期的方法,就瞎掰一个(值得学习)

Date.js

js

+/** 
+*
+*  @author: ihengshuai 
+*  @version: 1.0.0 
+*  @description: 格式化日期
+*  @Date: 2019/10/16 09:32
+*
+*/ 
+
+Date.prototype.format = function(format) {
+    var o = {
+                "M+": this.getMonth() + 1, //月份
+                "d+": this.getDate(), //日
+                "H+": this.getHours(), //小时
+                "m+": this.getMinutes(), //分
+                "s+": this.getSeconds(), //秒
+                "q+": Math.floor((this.getMonth() + 3) / 3), //季度
+                "f+": this.getMilliseconds() //毫秒
+        };
+        if (/(y+)/.test(format))
+                format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+        for (var k in o)
+                if (new RegExp("(" + k + ")").test(format))
+                        format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+        return format;
+}
+
+export default Date.prototype.format
+
+
+然后我们使用其格式日期
+require(Date);
+// const now = new Date().format("yyyy/MM/dd HH:mm:ss.S");
+const now = new Date().format("yyyy/MM/dd HH:mm:ss");

验证码(svg-captcha)

svg-captcha验证码的运用,防止暴力破解密码,加强安全性. 详细的文档地址:svg-captcha

使用验证码

js
// 后台生成验证码
+router.get("/getCaptcha", (req, res) => {
+    var captcha = svgCaptcha.create({  
+        // 翻转颜色  
+        inverse: false,  
+        // 字体大小  
+        fontSize: 38,  
+        // 噪声线条数  
+        noise: 3,  
+        // 宽度  
+        width: 80,  
+        // 高度  
+        height: 32,  
+      });  
+      // 保存到session,忽略大小写  
+      req.session = captcha.text.toLowerCase(); 
+      console.log(req.session); //0xtg 生成的验证码
+      //保存到cookie 方便前端调用验证
+      res.cookie('captcha', req.session); 
+      res.setHeader('Content-Type', 'image/svg+xml');
+      res.send(String(captcha.data));
+      res.end();
+})
+
+
+// 前台获取验证码
+--HTML
+<img width="80" style="background:#EEE9E9;margin-left:30px;" ref="captcha" height="32" src="http://localhost:3001/api/user/getCaptcha" @click="refreshCaptcha">
+
+--js
+// 获取验证码cookie
+getCookie(cname){
+    var name = cname + "=";
+    var ca = document.cookie.split(';');
+    for(var i=0; i<ca.length; i++){
+        var c = ca[i].trim();
+        if (c.indexOf(name)==0) return c.substring(name.length,c.length);
+    }
+    return "";
+},
+// 刷新验证码
+refreshCaptcha(){
+    this.$refs.captcha.src = "http://localhost:3001/api/user/getCaptcha?d=" + Math.random();
+},
+
+最后用 填写的验证码进行对比

上传歌曲或图片

formidable来处理文件上传信息,用起来方便,很友好,如果你没有接触过文件操作,赶紧收藏起来

封装歌曲方法uploadMusic.js

js
/** 
+*
+*  @author: ihengshuai 
+*  @version: 1.0.0 
+*  @description: 封装上传音乐方法
+*  @Date: 2019/10/16 08:35
+*
+*/ 
+
+const fs = require('fs');
+const path = require('path');
+const formidable = require('formidable');  // 文件处理库
+const formatTime = require('silly-datetime');  // 格式化数据
+
+module.exports = (req, res) => {
+    
+    let form = new formidable.IncomingForm();  //创建上传表单
+    form.encoding = 'utf-8';  // 设置编码格式
+    form.uploadDir = path.join(__dirname, '../static/music'); // 设置上传目录(这个目录必须先创建好)
+    form.keepExtensions = true;  // 保留文件后缀名
+    form.maxFieldsSize = 20 * 1024 *1024; // 设置文件大小
+
+    /* 格式化form数据 */
+    form.parse(req, (err, fields, files) => {
+        let file = files.file;
+        /* 获取异常 */
+        if(err) {
+            return res.status(500).json({'status': 500, result: '服务器内部错误'});
+        }
+        if(file.size > form.maxFieldsSize) {
+            fs.unlink(file.path);
+            return res.status(412).json({'status': 412, result: '音频不能超过20M'});
+        }
+
+        /* 存储后缀名 */
+        let extName = '';
+        switch (file.type) {
+            case 'audio/mp3':
+                extName = 'mp3';
+                break;
+        }
+        if(extName.length == 0) {
+            fs.unlink(file.path);
+            return res.status(412).json({'status': 412, result: '只支持mp3格式音频'});
+        }
+        /* 拼接新的文件名 */
+        let time = formatTime.format(new Date(), 'YYYYMMDDHHmmss');
+        let num = Math.floor(Math.random() * 8999 + 10000);
+        let songName = \`\${time}_\${num}.\${extName}\`;
+        let newPath = form.uploadDir + '/' + songName;
+
+        /* 更改名字和路径 */
+        fs.rename(file.path, newPath, (err) => {
+            if(err) {
+                return res.status(500).json({'status': 500, result: '音频上传失败'});
+            } else {
+                return res.send({'status': 200, 'msg': '音频上传成功', result: {src: songName}});
+            }
+        })
+        
+    })
+};

Vue、ElementUI分页使用

关于ElementUI分页详细请见:ElementUI的Pagination分页学习

上图

js
-- html
+<el-pagination
+    v-if='paginations.total > 0'
+    :page-sizes="paginations.page_sizes"
+    :page-size="paginations.page_size"
+    :layout="paginations.layout"
+    :total="paginations.total"
+    :current-page.sync='paginations.page_index'
+    @current-change='handleCurrentChange'
+    @size-change='handleSizeChange'>
+</el-pagination>
+
+-- js
+data(){
+    return{
+        allUsers:[],  // 用来存储最终信息, 被显示的dom点调用
+        allTableData:[],  // 用户承接分页设置的数据
+        paginations: {   // 分页组件信息
+            page_index: 1, // 当前位于哪页
+            total: 0, // 总数
+            page_size: 5, // 1页显示多少条
+            page_sizes: [5, 10, 15, 20], //每页显示多少条
+            layout: "total, sizes, prev, pager, next, jumper" // 翻页属性
+        },
+    }
+},
+methods:{
+    // 获取当前页
+    handleCurrentChange(page) {
+        let sortnum = this.paginations.page_size * (page - 1);
+        let table = this.allTableData.filter((item, index) => {
+            return index >= sortnum;
+        });
+        // 设置默认分页数据
+        this.getAllUsers = table.filter((item, index) => {
+            return index < this.paginations.page_size;
+        });
+        this.getAllUsers = table.filter((item, index) => {
+            return index < this.paginations.page_size;
+        });
+    },
+    // 切换size
+    handleSizeChange(page_size) {
+        this.paginations.page_index = 1;
+        this.paginations.page_size = page_size;
+        this.getAllUsers = this.allTableData.filter((item, index) => {
+            return index < page_size;
+        });
+    },
+     // 总页数
+    setPaginations() {
+        this.paginations.total = this.allTableData.length;
+        this.paginations.page_index = 1;
+        this.paginations.page_size = 5;
+        // 设置默认分页数据
+        this.getAllUsers = this.allTableData.filter((item, index) => {
+            return index < this.paginations.page_size;
+        });
+    },
+}

没了吗?对,分页就是这么简单!你学会了吗?有些前端开发的同学总是对分页比较陌生,学会这个,让你不再产生烦恼!

token和自定义验证合法性

jsonwebtoken是对用户信息加密成不可逆向破解的token.关于passport-jwt,是用来对用户请求时所带的token信息进行过期验证,如果超过签证的合法时间,则会请前台发出token失效的信息,提示用户重新获取合法的token信息,否则无法继续请求加密的信息;

用法

js
- passport-jwt
+const key = require("../config/keys").KEYORSECRET;
+const JwtStrategy = require('passport-jwt').Strategy,
+      ExtractJwt = require('passport-jwt').ExtractJwt;
+var opts = {}
+opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
+opts.secretOrKey = key;
+
+module.exports = passport => {
+    passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
+        UserInfo.findById(jwt_payload.id)
+                .then(user => {
+                    if (user) {
+                        return done(null, user);
+                    } else {
+                        return done(null, false);
+                        // or you could create a new account
+                    }
+                })
+    }));
+}
+
+
+
+// 设置token
+// 规则
+ const rule = {
+    id:String(userinfo._id),
+    username:userinfo.username,
+    email:userinfo.email,
+    date:user.date,
+    signdate:userinfo.signdate,
+    signcount:userinfo.signcount,
+    avatar:userinfo.avatar,
+    phone:userinfo.phone
+};
+
+// 签证加密
+// jwt.sign(规则, key(私钥), {配置:比如过期时长}, (err, token){ 响应程序 })
+jwt.sign(rule,key,{expiresIn:7200},(err, token) => {
+    if(err) throw err;
+    res.json({"token" : "Bearer " + token})
+})
+
+
+
+自定义验证方法
+/** 
+*
+*  @author: ihengshuai 
+*  @version: 1.0.0 
+*  @description: 判断是否过期用户
+*  @Date: 2019/10/19 12:19
+*
+*/ 
+const UserOrOrders = require("../dbModel/user");
+module.exports = async params => {
+    
+    
+    const flag = await new Promise((resolve) => {
+        if(params){
+            const account = params.account;
+            UserOrOrders.findOne({account})
+                .then(user => {
+                    if(user){
+                        if(new Date().getTime() > new Date(user.endTime).getTime()){
+                            console.log("过期用户");
+                            // 处理
+                            return resolve(false);
+                        }else{
+                            console.log("合法用户");
+                            return resolve(true);
+                        }
+                    }else{
+                        return resolve(false);
+                    }
+                })
+        }else{
+            console.log("不合法用户");
+            return resolve(false);
+        }
+        
+    }) 
+    return flag;
+}
+
+
+
+
+使用:
+// 测试  isBadAccount(params)方法
+router.post("/test", passport.authenticate("jwt", {session:false}), async (req, res) => {
+    // console.log(req.user)
+    if(await isBadAccount(req.user)){
+        // do something
+        res.send("OK");
+    }else{
+        res.status(401).json({status:"401", result:"帐号过期,请联系管理员"})
+    }
+})

详细的文档地址:Passport-Jwt合法验证,token加密

截图(只给出部分截图)

源码在这里

此项目2018年7天快速写的,作者打算对项目将会进行重构,fork后等待项目更新自动推送... 传送门: https://github.com/ihengshuai/ktv-select_music-system

`,51);function D(F,y,i,B,b,A){const a=n("Reward"),l=n("Gitalk");return t(),o("div",null,[c,s(a),s(l)])}const m=p(r,[["render",D]]);export{E as __pageData,m as default}; diff --git a/assets/article_2019_ktv-system.md.ZlJWiM1B.lean.js b/assets/article_2019_ktv-system.md.ZlJWiM1B.lean.js new file mode 100644 index 000000000..9c4c7b8ce --- /dev/null +++ b/assets/article_2019_ktv-system.md.ZlJWiM1B.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"7天撸完ktv点歌系统","description":"使用express和vue全栈7天撸完ktv点歌系统(完整版)","frontmatter":{"title":"7天撸完ktv点歌系统","description":"使用express和vue全栈7天撸完ktv点歌系统(完整版)","keywords":"KTV点歌系统,毕业设计,nodejs,vue,后台管理系统,创意毕设,全栈,mysql,koa,express,全栈系统","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-npm.png"},"headers":[],"relativePath":"article/2019/ktv-system.md","filePath":"article/2019/ktv-system.md","lastUpdated":1706247228000}'),r={name:"article/2019/ktv-system.md"},c=e("",51);function D(F,y,i,B,b,A){const a=n("Reward"),l=n("Gitalk");return t(),o("div",null,[c,s(a),s(l)])}const m=p(r,[["render",D]]);export{E as __pageData,m as default}; diff --git a/assets/article_2019_mysql-guide.md.3wP7Sagt.js b/assets/article_2019_mysql-guide.md.3wP7Sagt.js new file mode 100644 index 000000000..5ed08d2da --- /dev/null +++ b/assets/article_2019_mysql-guide.md.3wP7Sagt.js @@ -0,0 +1,262 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"MySQL从入门到放弃","description":"mysql基础使用指南","frontmatter":{"title":"MySQL从入门到放弃","description":"mysql基础使用指南","keywords":"MySQL,数据持久化,数据库,nodejs使用mysql,redis,关系型数据库","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-mysql.png"},"headers":[],"relativePath":"article/2019/mysql-guide.md","filePath":"article/2019/mysql-guide.md","lastUpdated":1706247228000}'),t={name:"article/2019/mysql-guide.md"},r=o(`

MySQL从入门到放弃

对于一个程序的功能而言,数据存储也是一项很重要的技术。我们一般将程序产生的数据,比如用户账户信息,订单信息持久化, 也就是储存在数据库中。常用的关系型数据库有很多,如access、mysql、sqlserver、oracle等等。 其中目前最常用的还是mysql,今天小编就介绍下MySQL的基本操作...

下载安装

  1. 下载

首页打开MySQL的官方网站(👉MySQL),打开后将网站拉到最底部,点击下载栏目中的 MySQL Community Server社区免费版,打开下载页面后,选择不同的操作系统,点击下面不同格式的安装包,如下:下载8.0.22版本的dmg安装包, 点击下载即可

  1. 安装

等待下载完成后双击安装包进行安装(Mac双击后点击里面的*.pkg安装包),现在就进入MySQL的安装界面了

接下来就是傻瓜式的安装,一直点继续就可以了

注意

安装完成之后会弹出一个对话框,告诉我们生成了一个root账户的临时密码。请注意保存,否则重设密码会比较麻烦。 这个版本会让你自己设置密码,至少8位,设置后安装完成后登录使用

最后点击安装,等待安装完成...

安装完成后,打开我们的系统偏好设置就多出现MySQL服务,默认MySQL的服务开启状态

MYSQL的默认安装路径

终端配置MySQL

打开终端,Mac目前基本都是zsh终端,因此我们在~目录进行zsh配置,添加MySQL环境变量,如果没有.zshrc配置文件,自行创建即可

bash
vim .zshrc
+
+export PATH=\${PATH}:/usr/local/mysql/bin

环境变量配置好后,就可以进行终端登录了,如下图表示配置成功(输入安装过程中创建的密码)

工具推荐

推荐一个强大的数据可视化工具:Navicat Premium,这款工具不仅可以连接MySQL数据库, 也可以连接SQL Server等数据库,非常强大,唯一一点不好就是收费,可以自行百度下载破解版,这里我下载了15.0版本的

基本操作

操作数据库的语句时,结尾一定不能漏掉分号!!!

创建数据库

  1. 数据库操作

查看数据库列表

sql
show databases;

接着创建一个demo数据库

sql
# create database 数据库名字;
+
+create database demo;

删除数据库

shell
# drop database 数据库名字;
+
+drop database demo;

使用数据库

bash
 # use 数据库名字;
+
+ use demo;

  1. 表的操作

查看当前数据库所有表

sql
show tables;

我去没一个表,那就创建表吧...

创建表

创建一个user表

sql
# create table 表名 (配置...);
+
+create table user (
+  \`id\` INT NOT NULL AUTO_INCREMENT,
+  \`name\` VARCHAR(20) NOT NULL,
+  \`age\` INT(3),
+  \`birth\` DATETIME NOT NULL,
+  PRIMARY KEY (\`id\`)
+) ENGINE=InnoDB CHARSET=UTF8;

MySQL常用数据类型传送门: 常用数据类型

删除表 Drop

删除user表

sql
# drop table 表名;
+drop table user;

插入数据 Insert into

1.全部插入

sql
# insert into 表名 values (值);
+
+insert into user values (1, 'Peachick', 10, NOW());

2.选择插入对应值

选择插入,键值是对应的,因此值可以根据键的顺序,填写值

sql
# insert into 表名 (键...) values (对应值...);
+insert into user (name, birth) values ("Peachick2", NOW());

刷新发现多了一条数据...

3.插入多条数据

sql
# insert into 表名 values (值), (值), ...;
+或者
+# insert into 表名 (键...) values (值...), (值...), ...
+
+insert into user (name, age, birth) values ('Peachick3', 11, NOW()), ('Peachick4', 12, NOw());

插入多条,前面的语法和前面插入单条是一样的,VALUES之后的,每一个小括号算是一条数据,每条数据之间用逗号隔开就行了。

修改数据 Update

1.修改单个值

shell
# update 表名 set 字段名 = 新值 (条件语句)?可有可无;
+update user set name = 'Peachick1' where id = 1;

2.修改对个值

shell
# update 表名 set 字段名 = 新值, 字段名 = 新值, ... (条件语句)?可有可无;
+update user set name = 'Peachick02', age = 2 where id = 2;

3.不带条件

shell
update user set name = 'Peachick', age = 0, birth = NOW();

我们会发现表中的数据全被改了,有点流氓...,所以在修改数据库时一定要加上条件语句!!!

删除数据 Delete from

  1. 有条件
shell
# delete from 表名 (条件语句)?可有可无;
+delete from user where id = 1;

可以看出id为1的数据被删除了...

  1. 无条件 上面说了,条件语句可有可无,那如果没有条件语句会是什么样子呢?
shell
delete from user;

我去数据全部被删除了,有点魔鬼!!! 所以在删除数据时,一定要非常谨慎的加上条件,否则会产生很严重的后果...

简单查询

  1. 查询所有字段
shell
# select * from 表名;
+select * from user;

  1. 查询指定字段
shell
# select 字段名, 字段名, ... from 表名;
+select name, age from user;

  1. 条件查询
shell
# select * (或者 选择字段) from 表名 条件语句;
+select name, age from user where id = 1;

查询排序 Order By

  1. 单个字段
shell
# select * from 表名 order by 字段名 排序;
+select * from user order by age DESC;

通过观察上述两个语句的执行结果,我们可以得出以下几点结论:

  1. 多个字段
shell
# select * from 表名 order by 字段名 排序, 字段名 排序, ...;
+select * from user order by age DESC, id ASC;

通过观察上述两条语句的结果可以得出:

别名

  1. 字段别名
shell
select 字段名 (as) "别名", ... from 表名;

as可以省略

shell
select 字段名 (as) "别名", ... from 表名 "别名";

常用函数

  1. 统计 COUNT()
sh
select count(*) from 表名;

应用场景:统计人数,点赞量。。。

  1. 求和 SUM()
sh
select SUM(字段名) from 表名;

应用场景:sum()一般用于金钱、分数等数据的计算,比如求平台用户每个月收入多少钱,支出多少钱等等。另外sun()函数不仅可以求数字类型的字段的和还可以对字符串进行求和,但是它会只计算能求和的数据的和。

  1. 平均数 AVG()
sh
select AVG(字段名) from 表名;

4.其它

sql
AVG(X)           --返回指定列的平均值
+COUNT(X)         --返回指定列中非NULL值的个数
+MIN(X)           --返回指定列的最小值
+MAX(X)           --返回指定列的最大值
+SUM(X)           --返回指定列的所有值之和
+GROUP_CONCAT(X)  --返回由属于一组的列值连接组合而成的结果,非常有用
sql
ABS(x)                                          --返回x的绝对值
+BIN(x)                                          --返回x的二进制(OCT返回八进制,HEX返回十六进制)
+CEILING(x)                                      --返回大于x的最小整数值
+EXP(x)                                          --返回值e(自然对数的底)的x次方
+FLOOR(x)                                        --返回小于x的最大整数值
+GREATEST(x1,x2,...,xn)  --返回集合中最大的值
+LEAST(x1,x2,...,xn)     --返回集合中最小的值
+LN(x)                                           --返回x的自然对数
+LOG(x,y)                                        --返回x的以y为底的对数
+MOD(x,y)                                        --返回x/y的模(余数)
+PI()                                            --返回pi的值(圆周率)
+RAND()                                          --返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
+ROUND(x,y)                                      --返回参数x的四舍五入的有y位小数的值
+SIGN(x)                                         --返回代表数字x的符号的值
+SQRT(x)                                         --返回一个数的平方根
+TRUNCATE(x,y)                                   --返回数字x截短为y位小数的结果
sql
ASCII(char)                                             --返回字符的ASCII码值
+BIT_LENGTH(str)                                         --返回字符串的比特长度
+CONCAT(s1,s2...,sn)         --将s1,s2...,sn连接成字符串
+CONCAT_WS(sep,s1,s2...,sn)      --将s1,s2...,sn连接成字符串,并用sep字符间隔
+INSERT(str,x,y,instr)                   --将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
+FIND_IN_SET(str,list)                   --分析逗号分隔的list列表,如果发现str,返回str在list中的位置
+LCASE(str)或LOWER(str)                  --返回将字符串str中所有字符改变为小写后的结果
+LEFT(str,x)                                             --返回字符串str中最左边的x个字符
+LENGTH(s)                                               --返回字符串str中的字符数
+LTRIM(str)                                              --从字符串str中切掉开头的空格
+POSITION(substr,str)                    --返回子串substr在字符串str中第一次出现的位置
+QUOTE(str)                                              --用反斜杠转义str中的单引号
+REPEAT(str,srchstr,rplcstr) --返回字符串str重复x次的结果
+REVERSE(str)                                            --返回颠倒字符串str的结果
+RIGHT(str,x)                                            --返回字符串str中最右边的x个字符
+RTRIM(str)                                              --返回字符串str尾部的空格
+STRCMP(s1,s2)                                           --比较字符串s1和s2
+TRIM(str)                                               --去除字符串首部和尾部的所有空格
+UCASE(str)或UPPER(str)                  --返回将字符串str中所有字符转变为大写后的结果

-日期和时间函数

sql
CURDATE()或CURRENT_DATE() 
+                  --返回当前的日期
+CURTIME()或CURRENT_TIME() 
+                  --返回当前的时间
+DATE_ADD(date,INTERVAL int keyword)
+                  --返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化)
+例如
+SELECT DATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
+
+DATE_FORMAT(date,fmt)  
+                  --依照指定的fmt格式格式化日期date值
+DATE_SUB(date,INTERVAL int keyword)
+                  --返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化)
+例如
+SELECT DATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
+
+DAYOFWEEK(date)   --返回date所代表的一星期中的第几天(1~7)
+DAYOFMONTH(date)  --返回date是一个月的第几天(1~31)
+DAYOFYEAR(date)   --返回date是一年的第几天(1~366)
+DAYNAME(date)     --返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
+FROM_UNIXTIME(ts,fmt)  
+                  --根据指定的fmt格式,格式化UNIX时间戳ts
+HOUR(time)        --返回time的小时值(0~23)
+MINUTE(time)      --返回time的分钟值(0~59)
+MONTH(date)       --返回date的月份值(1~12)
+MONTHNAME(date)   --返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
+NOW()             --返回当前的日期和时间
+QUARTER(date)     --返回date在一年中的季度(1~4)
+例如
+SELECT QUARTER(CURRENT_DATE);
+
+WEEK(date)        --返回日期date为一年中第几周(0~53)
+YEAR(date)        --返回日期date的年份(1000~9999)
+例如,获取当前系统时间
+SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
+SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);
+SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);
+SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);
+
+返回两个日期值之间的差值(月数)
+SELECT PERIOD_DIFF(200302,199802);
+
+在Mysql中计算年龄:
+SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),'%Y')+0 AS age FROM employee;
+这样,如果Brithday是未来的年月日的话,计算结果为0。
+下面的SQL语句计算员工的绝对年龄,即当Birthday是未来的日期时,将得到负值。
+SELECT DATE_FORMAT(NOW(), '%Y') 
+- DATE_FORMAT(birthday, '%Y') 
+-(DATE_FORMAT(NOW(), '00-%m-%d') 
+< DATE_FORMAT(birthday, '00-%m-%d')) AS age from employee
sql
AES_ENCRYPT(str,key)  
+                  --返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储
+AES_DECRYPT(str,key)  
+                  --返回用密钥key对字符串str利用高级加密标准算法解密后的结果
+DECODE(str,key)   --使用key作为密钥解密加密字符串str
+ENCRYPT(str,salt) --使用UNIXcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str
+ENCODE(str,key)   --使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串,它以BLOB类型存储
+MD5()             --计算字符串str的MD5校验和
+PASSWORD(str)     --返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
+SHA()             --计算字符串str的安全散列算法(SHA)校验和
+
+例如
+SELECT ENCRYPT('root','salt');
+SELECT ENCODE('xufeng','key');
+SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起
+SELECT AES_ENCRYPT('root','key');
+SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key');
+SELECT MD5('123456');
+SELECT SHA('123456');
sql
CASE WHEN [test1] THEN [result1]...ELSE [default] END 
+                    --如果test1是真,则返回result1,否则返回default
+CASE [test] WHEN [val1] THEN [result]...ELSE [default] END  
+                    --如果test和valN相等,则返回result,否则返回default
+IF(test,t,f)        --如果test是真,返回t;否则返回f
+IFNULL(arg1,arg2)   --如果arg1不是空,返回arg1,否则返回arg2
+NULLIF(arg1,arg2)   --如果arg1=arg2返回NULL;否则返回arg1
+
+这些函数的第一个是IFNULL(),它有两个参数,并且对第一个参数进行判断。
+如果第一个参数不是NULL,函数就会向调用者返回第一个参数;
+如果是NULL,将返回第二个参数。
+例如
+SELECT IFNULL(1,2), 
+IFNULL(NULL,10),
+IFNULL(4*NULL,'false');
+
+NULLIF()函数将会检验提供的两个参数是否相等,如果相等,则返回NULL,
+如果不相等,就返回第一个参数。
+例如
+SELECT NULLIF(1,1),
+NULLIF('A','B'),
+NULLIF(2+3,4+1);
+
+MySQL的IF()函数也可以建立一个简单的条件测试,
+这个函数有三个参数,第一个是要被判断的表达式,
+如果表达式为真,IF()将会返回第二个参数,
+如果为假,IF()将会返回第三个参数。
+例如
+SELECT IF(1<10,2,3),IF(56>100,'true','false');
+IF()函数在只有两种可能结果时才适合使用。
+然而,在现实世界中,我们可能发现在条件测试中会需要多个分支。
+在这种情况下,它和PHP及Perl语言的switch-case条件例程一样。
+
+CASE函数的格式有些复杂,通常如下所示:
+CASE [expression to be evaluated]
+WHEN [val 1] THEN [result 1]
+WHEN [val 2] THEN [result 2]
+WHEN [val 3] THEN [result 3]
+......
+WHEN [val n] THEN [result n]
+ELSE [default result]
+END
+这里,第一个参数是要被判断的值或表达式,接下来的是一系列的WHEN-THEN块,
+每一块的第一个参数指定要比较的值,如果为真,就返回结果。
+所有的WHEN-THEN块将以ELSE块结束,当END结束了所有外部的CASE块时,
+如果前面的每一个块都不匹配就会返回ELSE块指定的默认结果。
+如果没有指定ELSE块,而且所有的WHEN-THEN比较都不是真,MySQL将会返回NULL。
+CASE函数还有另外一种句法,有时使用起来非常方便,如下:
+CASE
+WHEN [conditional test 1] THEN [result 1]
+WHEN [conditional test 2] THEN [result 2]
+ELSE [default result]
+END
+这种条件下,返回的结果取决于相应的条件测试是否为真。
+例如:
+SELECT CASE 'green'
+     WHEN 'red' THEN 'stop'
+     WHEN 'green' THEN 'go' END;
+
+SELECT CASE 9 
+WHEN 1 THEN 'a'
+WHEN 2 THEN 'b' ELSE 'N/A' END;
+
+SELECT CASE WHEN (2+2)=4 THEN 'OK' 
+WHEN (2+2)<>4 THEN 'not OK' END AS STATUS;
+
+SELECT Name,IF((IsActive = 1),'已激活','未激活') AS RESULT 
+FROM UserLoginInfo;
+
+SELECT fname,lname,(math+sci+lit) AS total,
+CASE WHEN (math+sci+lit) < 50 THEN 'D'
+     WHEN (math+sci+lit) BETWEEN 50 AND 150 THEN 'C'
+     WHEN (math+sci+lit) BETWEEN 151 AND 250 THEN 'B'
+ELSE 'A' END AS grade FROM marks;
+
+SELECT IF(ENCRYPT('sue','ts')=upass,'allow','deny') AS LoginResult
+FROM users WHERE uname = 'sue';
sql
DATE_FORMAT(date,fmt)  
+                  --依照字符串fmt格式化日期date值
+FORMAT(x,y)       --把x格式化为以逗号隔开的数字序列,y是结果的小数位数
+INET_ATON(ip)     --返回IP地址的数字表示
+INET_NTOA(num)    --返回数字所代表的IP地址
+TIME_FORMAT(time,fmt)  
+                  --依照字符串fmt格式化时间time值
+其中最简单的是FORMAT()函数,
+它可以把大的数值格式化为以逗号间隔的易读的序列。
+例如
+SELECT FORMAT(34234.34323432,3);
+SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');
+SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
+SELECT DATE_FORMAT(19990330,'%Y-%m-%d');
+SELECT DATE_FORMAT(NOW(),'%h:%i %p');
+SELECT INET_ATON('10.122.89.47');
+SELECT INET_NTOA(175790383);
sql
为了进行数据类型转化,MySQL提供了CAST()函数,
+它可以把一个值转化为指定的数据类型。
+类型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
+例如
+SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
+SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
sql
DATABASE()        --返回当前数据库名
+BENCHMARK(count,expr)  
+                  --将表达式expr重复运行count次
+CONNECTION_ID()   --返回当前客户的连接ID
+FOUND_ROWS()      --返回最后一个SELECT查询进行检索的总行数
+USER()或SYSTEM_USER()  
+                  --返回当前登陆用户名
+VERSION()         --返回MySQL服务器的版本
+例如
+SELECT DATABASE(),VERSION(),USER();
+SELECTBENCHMARK(9999999,LOG(RAND()*PI()));# 
+该例中,MySQL计算LOG(RAND()*PI())表达式9999999次。

分组查询 Group By

sh
select 字段名 from 表名 group by 字段名,...;

先查下表里的数据

接下来分组查询

1.单个字段与多个字段

总结

从上面的两个分组查询我们可以得出结论:group by会根据后面的字段进行分组,一样的为一组,不一样就是不同的组,要查询的字段必须是 group by后面的字段

2.多个字段的顺序 以age和name两个字段分组,不同的排序又会是啥样子呢?

可以发现,如果是age在前面就主要以age来进行分组,然在此基础上再以name为基础再继续分组,如果是name在前面就主要以name来进行分组,然在此基础上再以age为基础再继续分组

模糊查询 Like

sh
select * from 表名 where 字段 like 值(%, _, regexp);

模糊查询的效率非常低,因为它在匹配数据的时候是一行行往下找的,对于数据量大的项目,查找数据非常费时,所以一般情况下我们应该避免使用模糊查询,真正在做搜索的时候一般会自己建立索引,然后用程序来维护,或者直接使用搜索引擎,当然,mysql自己也可以在插入数据的时候创建索引(这个鄙人完全没有使用过),所以本章内容只做了解,顺便贴出大神总结的mysql通配符的文章:https://blog.csdn.net/win7system/article/details/53508401

联表查询 Join

现在创建两张表来为后面的了联接做准备

sh
CREATE TABLE \`student\` (
+     \`id\` INT NOT NULL AUTO_INCREMENT,
+     \`name\` VARCHAR(8) NOT NULL,
+     \`age\` INT(3) NOT NULL,
+     \`class_id\` INT(3),
+     PRIMARY KEY(\`id\`)
+) ENGINE=InnoDB charset=utf8;
+
+// 插入数据
+INSERT INTO student (name, age, class_id) values ('喜羊羊', 10, 2), ('美羊羊', 9, 1), ('懒羊羊', 9, 3), ('沸羊羊', 11, 2), ('老村长', 33, 2), ('灰太狼', 10, 3), ('红太狼', 9, 1);

sh
CREATE TABLE \`class\` (
+     \`id\` INT NOT NULL AUTO_INCREMENT,
+     \`name\` VARCHAR(8) NOT NULL,
+     PRIMARY KEY(\`id\`)
+) ENGINE=InnoDB charset=utf8;
+
+// 插入数据
+INSERT INTO class (name) values ('仙女班'), ('汉子班'), ('娘炮班');

  1. 左联接 LEFT JOIN

左联查询的定义:首先取出表1(LEFT JOIN左边的表格)中所有数据和表2(LEFT JOIN右边的表格)中与表1所取数据相对应的所有数据,合成新的表格,没有数据则显示NULL。表1的数据为主,并显示在合成表格的左边。

  1. 右联接 RIGHT JOIN

右联查询的定义:首先取出表1(RIGHT JOIN右边的表格)中所有数据和表2(RIGHT JOIN左边的表格)中与表1所取数据相对应的所有数据,合成新的表格,没有数据则显示NULL。表2的数据为主,并显示在合成表格的右边。

  1. 内联 INNER JOIN

内联理解起来比左右联更简单,就是把两个表中,class的id和student的class_id都存在并且两个相等的数据连接成一条数据。因此在数据库中有前面两种连接有部分为null的数据这一整行都没有了。

联表查询综合应用

现在创建一张老师的表,一个老师只能交一个班级

如果要用联表查询查出每个学生所在的班级,还有老师,以及老师所教的课程 这样联表的思路是,首先先用student表和class表联表,以联表之后的大表作为一张虚拟表,再用这张虚拟表和teacher表联表,最后查询出结果。 那么这样一来,和第三张表联表的方式可以是右联还可以是自联,甚至还可以是其它后面要学到的查询方式

自联

现在有一个这样的需求,假如有一张成绩表,里面是每个同学课程1的分数和课程2的分数,现在要查出课程2比课程1分数要高的学生

先创建一个分数表:

查询每个学生课程2分数高于课程1的学生:

这样就行啦。通过语句可以看出,其实这是一个内联,只不过是score表自己和自己联表,因此自联和左联右联不一样,所以单独开了一张出来没有和左联这几章一起写。自联其实是一种联表的用法,并不是一种联表方式,原理就是让一张表自己和自己联表,联表的方式可以是内联,也可以是左联右联。自联的用途也挺广泛的,除了文中这样,还有别的场景可以使用,比如有一个职工表,里面有姓名,职位,部门,还有上级id,如果是最高级,上级id是0,以及多级回复等等场景,都可以通过自联的方式获取想要的结果。

子查询

还是班级表,查询每个学生所在的班级,除了联表查询,也可以子查询:

分页 LIMIT

sh
select * from 表名 LIMIT 起始位置,查询条数;

后面的依次类推。 可以看出,分页,主要是用了LIMIT关键字。这个关键字是这样的:LIMIT 开始位置,查询条数, 比如LIMIT 0,2说明是从第一条开始查询(下标都是由0开始),查询两条,那么返回的结果就是第一条和第二条。我们可以吧这个看做是一页,那么下一页就是第三条和第四条了,那就是LIMIT 2,2。

LIMIT也可以和我们上述的其它语句一起结合使用,并且一定是放在最后面的,比如:

如果不把limit放在最后面就会报错: 语法错误...

外键

待更新...

`,213);function i(y,D,F,E,B,b){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[r,s(a),s(l)])}const m=p(t,[["render",i]]);export{u as __pageData,m as default}; diff --git a/assets/article_2019_mysql-guide.md.3wP7Sagt.lean.js b/assets/article_2019_mysql-guide.md.3wP7Sagt.lean.js new file mode 100644 index 000000000..d9f1e0013 --- /dev/null +++ b/assets/article_2019_mysql-guide.md.3wP7Sagt.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"MySQL从入门到放弃","description":"mysql基础使用指南","frontmatter":{"title":"MySQL从入门到放弃","description":"mysql基础使用指南","keywords":"MySQL,数据持久化,数据库,nodejs使用mysql,redis,关系型数据库","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-mysql.png"},"headers":[],"relativePath":"article/2019/mysql-guide.md","filePath":"article/2019/mysql-guide.md","lastUpdated":1706247228000}'),t={name:"article/2019/mysql-guide.md"},r=o("",213);function i(y,D,F,E,B,b){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[r,s(a),s(l)])}const m=p(t,[["render",i]]);export{u as __pageData,m as default}; diff --git a/assets/article_2019_nvm-guide.md.jatQbzh1.js b/assets/article_2019_nvm-guide.md.jatQbzh1.js new file mode 100644 index 000000000..e31732f2e --- /dev/null +++ b/assets/article_2019_nvm-guide.md.jatQbzh1.js @@ -0,0 +1,14 @@ +import{_ as o,c as p,J as n,V as l,o as i,G as s}from"./chunks/framework.SV1ROkXV.js";const y=JSON.parse('{"title":"nvm切换node版本","description":"使用nvm丝滑切换node版本提高开发效率","frontmatter":{"title":"nvm切换node版本","description":"使用nvm丝滑切换node版本提高开发效率","keywords":"nvm,切换node版本工具,node版本工具,n,开发效率,nodejs","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nodejs.png"},"headers":[],"relativePath":"article/2019/nvm-guide.md","filePath":"article/2019/nvm-guide.md","lastUpdated":1706247228000}'),t={name:"article/2019/nvm-guide.md"},r=l(`

nvm切换node版本

以前学会了用nvm来管理node版本,后来就专心搞开发了.如今一些所谓的vue,react,koa,Express,egg等框架更新迭代太快,老项目和新项目对node版本依赖不同,老版本的node已经无法友好支持.今天打开控制台竟然忘记nvm的常用命令,前查后查想起来,现在做个笔记,方便以后查阅

下载安装NVM

1.github下载地址https://github.com/coreybutler/nvm-windows/releases

2.下载完毕后,点击安装,目标盘随便更改. 如果是win10,请用管理员方式安装

3.查看是否安装成功

这里作者安装了1.1.7版本

配置环境变量

使用NVM查看信息

1.nvm list 查看安装了所有的node版本

2.nvm use 版本号切换版本

3.在你还不知道下载Node哪个版本前,你可以 nvm list available 查看可以安装的版本号

使用NVM下载Node等等

4.nvm install 版本号下载指定版本Node

这里演示下载8.9.4版本

5.nvm uninstall 版本号卸载指定Node含npm,以及当前版本全局工具

这里演示卸载8.9.4版本

注意,当你卸载哪个版本的Node时,那个版本的全局环境下的工具也全部删除掉了,包括npm

比如

sh
# current Node.js 8.9.4
+npm install nodemon -g 下载了全局nodemon
+nvm uninstall 8.9.4  写在了此版本node
+nvm use 10.6.0  使用10.6.0Node
+npm install nodemon -g  重新安装nodemon

常见问题

1.下载安装好后使用命令nvm install [指定版本],出现诸如以下错误

sh
  nodejs An existing connection was forcibly closed by the remote host:连接被强行关闭
+
+ Could not retrieve https://nodejs.org/dist/latest/SHASUMS256.txt:无法获得指定的校验文件

2.解决办法: 将nvm中node和npm的源设置到国内源(一般使用taobao)上。

3.在nvm的安装路径下找到settings.txt打开:

md
# root: C:\\nvm
+arch: 64
+proxy: none
+originalpath:
+originalversion:
+node_mirror:
+npm_mirror:

4.分别指定node和npm的mirror

md
node_mirror: npm.taobao.org/mirrors/node/
+npm_mirror: npm.taobao.org/mirrors/npm/

5.这样就解决好了~,你学废了吗?

`,38);function c(d,m,u,g,h,b){const a=s("Reward"),e=s("Gitalk");return i(),p("div",null,[r,n(a),n(e)])}const j=o(t,[["render",c]]);export{y as __pageData,j as default}; diff --git a/assets/article_2019_nvm-guide.md.jatQbzh1.lean.js b/assets/article_2019_nvm-guide.md.jatQbzh1.lean.js new file mode 100644 index 000000000..643ce686b --- /dev/null +++ b/assets/article_2019_nvm-guide.md.jatQbzh1.lean.js @@ -0,0 +1 @@ +import{_ as o,c as p,J as n,V as l,o as i,G as s}from"./chunks/framework.SV1ROkXV.js";const y=JSON.parse('{"title":"nvm切换node版本","description":"使用nvm丝滑切换node版本提高开发效率","frontmatter":{"title":"nvm切换node版本","description":"使用nvm丝滑切换node版本提高开发效率","keywords":"nvm,切换node版本工具,node版本工具,n,开发效率,nodejs","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nodejs.png"},"headers":[],"relativePath":"article/2019/nvm-guide.md","filePath":"article/2019/nvm-guide.md","lastUpdated":1706247228000}'),t={name:"article/2019/nvm-guide.md"},r=l("",38);function c(d,m,u,g,h,b){const a=s("Reward"),e=s("Gitalk");return i(),p("div",null,[r,n(a),n(e)])}const j=o(t,[["render",c]]);export{y as __pageData,j as default}; diff --git a/assets/article_2019_promise.md.5sNxqCYP.js b/assets/article_2019_promise.md.5sNxqCYP.js new file mode 100644 index 000000000..d0db77f4b --- /dev/null +++ b/assets/article_2019_promise.md.5sNxqCYP.js @@ -0,0 +1,174 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Promise使用与原理","description":"如何使用promise优雅的解决异步问题,promise使用技巧与原理","frontmatter":{"title":"Promise使用与原理","description":"如何使用promise优雅的解决异步问题,promise使用技巧与原理","keywords":"Promise,promise原理,异步操作,回调函数,异步机制","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2019/promise.md","filePath":"article/2019/promise.md","lastUpdated":1706247228000}'),c={name:"article/2019/promise.md"},t=e(`

Promise使用与原理

js
const PENDING = 'pending'
+const FULFILLED = 'fulfilled'
+const REJECTED = 'rejected'
+
+class MyPromise {
+  constructor(executor) {
+    try {
+      executor(this.resolve, this.reject)
+    } catch (error) {
+      this.reject(error)
+    }
+  }
+
+  status = PENDING
+
+  value = null
+  reason = null
+
+  onFulfilledCallback = []
+  onRejectedCallback = []
+
+  resolve = (value) => {
+    if (this.status == PENDING) {
+      this.status = FULFILLED
+      this.value = value
+
+      while (this.onFulfilledCallback.length) {
+        const cb = this.onFulfilledCallback.shift()
+        cb(value)
+      }
+    }
+  }
+
+  reject = (reason) => {
+    if (this.status == PENDING) {
+      this.status = REJECTED
+      this.reason = reason
+
+      while (this.onRejectedCallback.length) {
+        const cb = this.onRejectedCallback.shift()
+        cb(reason)
+      }
+    }
+  }
+
+  static resolve(param) {
+    if (param instanceof MyPromise) return param
+    return new MyPromise((resolve) => resolve(param))
+  }
+
+  static reject(param) {
+    if (param instanceof MyPromise) return param
+    return new MyPromise((resolve, reject) => reject(param))
+  }
+
+  then = (onFulfilled, onRejected) => {
+    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value
+    onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }
+
+    const _promise = new MyPromise((resolve, reject) => {
+      if (this.status == FULFILLED) {
+        queueMicrotask(() => {
+          try {
+            const x = onFulfilled(this.value)
+            resolvePromise(_promise, x, resolve, reject)
+          } catch (error) {
+            reject(error)
+          }
+        })
+      } else if (this.status == REJECTED) {
+        queueMicrotask(() => {
+          try {
+            const x = onRejected(this.reason)
+            resolvePromise(_promise, x, resolve, reject)
+          } catch (error) {
+            reject(error)
+          }
+        })
+      } else if (this.status == PENDING) {
+        // 异步进行缓存回调函数
+        this.onFulfilledCallback.push(() => {
+          queueMicrotask(() => {
+            try {
+              const x = onFulfilled(this.value)
+              resolvePromise(_promise, x, resolve, reject)
+            } catch (error) {
+              reject(error)
+            }
+          })
+        })
+        this.onRejectedCallback.push(() => {
+          queueMicrotask(() => {
+            try {
+              const x = onRejected(this.reason)
+              resolvePromise(_promise, x, resolve, reject)
+            } catch (error) {
+              reject(error)
+            }
+          })
+        })
+      }
+    })
+    return _promise
+  }
+}
+
+function resolvePromise(self, x, resolve, reject) {
+  if (self === x) {
+    return reject(new TypeError('Chaining cycle detected for promise #<Promise>'))
+  }
+  if (x instanceof MyPromise) {
+    try {
+      x.then(resolve, reject)
+    } catch (error) {
+      reject(error)
+    }
+  } else {
+    resolve(x)
+  }
+}
+
+const promise = new MyPromise((resolve, reject) => {
+  console.log('init Promsie')
+  setTimeout(() => {
+    resolve(1)
+  })
+})
+
+promise
+  .then((v1) => {
+    console.log(v1)
+    return 2
+  })
+  .then((v2) => {
+    console.log(v2)
+    return new MyPromise((resolve) => resolve(3))
+  })
+  .then((v) => {
+    console.log(v)
+    console.log('end')
+  }, reason => {
+    console.log(reason)
+  })
+
+MyPromise
+  .resolve(new MyPromise((resolve) => resolve('static resolve')))
+  .then((v) => {
+    console.log(v)
+    console.log('static')
+  })
+
+MyPromise
+  .reject(false)
+  .then(null, err => console.log(err))
+
+
+MyPromise.resolve().then(() => {
+  console.log(0);
+  return MyPromise.resolve(4);
+}).then((res) => {
+  console.log(res)
+})
+
+MyPromise.resolve().then(() => {
+  console.log(1);
+}).then(() => {
+  console.log(2);
+}).then(() => {
+  console.log(3);
+}).then(() => {
+  console.log(5);
+}).then(() =>{
+  console.log(6);
+})

//待更新...

`,3);function F(D,y,i,B,b,A){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const u=p(c,[["render",F]]);export{m as __pageData,u as default}; diff --git a/assets/article_2019_promise.md.5sNxqCYP.lean.js b/assets/article_2019_promise.md.5sNxqCYP.lean.js new file mode 100644 index 000000000..1ab1854f5 --- /dev/null +++ b/assets/article_2019_promise.md.5sNxqCYP.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Promise使用与原理","description":"如何使用promise优雅的解决异步问题,promise使用技巧与原理","frontmatter":{"title":"Promise使用与原理","description":"如何使用promise优雅的解决异步问题,promise使用技巧与原理","keywords":"Promise,promise原理,异步操作,回调函数,异步机制","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2019/promise.md","filePath":"article/2019/promise.md","lastUpdated":1706247228000}'),c={name:"article/2019/promise.md"},t=e("",3);function F(D,y,i,B,b,A){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const u=p(c,[["render",F]]);export{m as __pageData,u as default}; diff --git a/assets/article_2019_what-bfc.md.tIBqKLqT.js b/assets/article_2019_what-bfc.md.tIBqKLqT.js new file mode 100644 index 000000000..615839e07 --- /dev/null +++ b/assets/article_2019_what-bfc.md.tIBqKLqT.js @@ -0,0 +1,151 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"BFC渲染规则","description":"什么是BFC及它的作用又是什么","frontmatter":{"title":"BFC渲染规则","description":"什么是BFC及它的作用又是什么","keywords":"CSS,BFC,块级格式化上下文,margin重叠,css渲染规则,两栏布局","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-css.png"},"headers":[],"relativePath":"article/2019/what-bfc.md","filePath":"article/2019/what-bfc.md","lastUpdated":1706247228000}'),t={name:"article/2019/what-bfc.md"},c=e(`

BFC总结

前言

在写css样式时,可能是添加了一个样式后就达到了预期效果。有没有想过,是我们在不经意间触发了什么,帮助我们达到了效果?本文就快速介绍下css样式中经常使用的BFC,主要包括以下几个方面:

  1. 什么是BFC
  2. 如何生成BFC
  3. BFC的布局规则
  4. 应用

什么是BFC

首先看下什么是Formatting Context

BFC

块级格式化上下文,它是一个独立的渲染区域,该区域拥有一套渲染规则来约束块级盒子的布局,并且与这个区域外部无关。

如何生成BFC

CSS2.1规定满足下列CSS声明之一的元素便会生成BFC:

BFC的布局规则

  1. 内部的元素会在垂直方向上一个接一个的放置;
  2. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻的Box的margin会发生重叠;

可应用到解决margin重叠的问题中:

可在其中一个元素外包裹一层容器,并触发该容器生成BFC(overflow:hidden;),这样两个元素就不属于同一个BFC了,就不会发生margin重叠的问题了。下面应用中会举例阐述。

  1. 生成BFC元素的子元素中,每一个子元素的margin与包含块的左边界border相接触(对于从左到右的格式化,否则相反),即使存在浮动也是如此;
  2. BFC的区域不会与float元素区域重叠

可应用到两栏布局中:

一个元素是浮动元素,可触发另一个非浮动元素生成BFC(overflow:hidden;)。由于“BFC的区域不会与float元素区域重叠”,因此可以实现两栏布局。下面应用中会举例阐述。

  1. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。
  2. 计算BFC的高度时,浮动元素也参与计算

可应用到解决浮动元素的父元素高度塌陷问题中:

如果父元素的子元素都是浮动元素,那么父元素的高度会发生高度塌陷(height:0)。可触发父元素生成BFC(overflow:hidden;)那么在“计算BFC的高度时,浮动元素也参与计算”,实现清除了内部浮动的效果。下面应用中会举例阐述。

应用

在上述BFC的布局规则中已经简单介绍了下3个利用BFC布局规则的实例了,下面按序分别举例说明:

解决margin重叠的问题

举例:

html
<!DOCTYPE html>
+<html lang="en">
+
+<head>
+        <meta charset="UTF-8">
+        <title>BFC的应用:解决margin重叠问题</title>
+        <style type="text/css">
+                body {
+                        margin: 0;
+                        padding: 0;
+                }
+
+                .container p {
+                        margin: 25px 10px;
+                        background-color: palevioletred;
+                        border: 1px solid black;
+                }
+        </style>
+</head>
+
+<body>
+        <div class="container">
+                <p>the first line</p>
+                <p>the second line</p>
+                <p>the third line</p>
+        </div>
+</body>
+
+</html>

效果:

以第一行来看,它距离顶部的垂直距离,和距离第二行的垂直距离是一样的。说明第一行的margin-bottom和第二行的margin-top发生了重叠,不然第一行到第二行的距离,应该是50px,是第一行距离顶部距离的两倍。

解决方法上面已经介绍过:可在其中一个元素外包裹一层容器,并触发该容器生成BFC(overflow:hidden;),这样两个元素就不属于同一个BFC了,就不会发生margin重叠的问题了。

据此修改:

html
<!DOCTYPE html>
+<html lang="en">
+
+<head>
+        <meta charset="UTF-8">
+        <title>BFC的应用:解决margin重叠问题</title>
+        <style type="text/css">
+                body {
+                        margin: 0;
+                        padding: 0;
+                }
+
+                .container p {
+                        margin: 25px 10px;
+                        background-color: palevioletred;
+                        border: 1px solid black;
+                }
+
+                .wrap {
+                        overflow: hidden;
+                }
+        </style>
+</head>
+
+<body>
+        <div class="container">
+                <p>the first line</p>
+                <div class="wrap">
+                        <p>the second line</p>
+                </div>
+                <p>the third line</p>
+        </div>
+</body>
+
+</html>

效果

这样就解决了margin重叠的问题

两栏布局问题

两栏布局有很多解决方案,比如用flex,这里介绍BFC的解决方案

举例:

html
<!DOCTYPE html>
+<html lang="en">
+
+<head>
+        <meta charset="UTF-8">
+        <title>BFC的应用</title>
+        <style type="text/css">
+                body {
+                        margin: 0;
+                        padding: 0;
+                }
+
+                .container {
+                        width: 500px;
+                        border: 1px solid black;
+                }
+
+                .left {
+                        width: 200px;
+                        height: 200px;
+                        background-color: palevioletred;
+                        float: left;
+                }
+
+                .right {
+                        width: 300px;
+                        height: 400px;
+                        background-color: skyblue;
+                }
+        </style>
+</head>
+
+<body>
+        <div class="container">
+                <div class="left">left</div>
+                <div class="right">right</div>
+        </div>
+</body>
+
+</html>

效果:

左栏是浮动元素,会脱离文档流,浮在文档流元素上。

BFC的解决方法:

可触发另一个非浮动元素生成BFC(overflow:hidden;)。由于“BFC的区域不会与float元素区域重叠”,因此可以实现两栏布局。

修改.right的样式:

css
.right {
+  ...
+  overflow: hidden;
+}

效果

不过我个人觉得这样做只是让BFC的区域不会与float元素区域重叠,实现了两栏布局效果,但并不是自适应的两栏布局,上述例子只是刚好父容器的宽度=左盒子宽度+右盒子宽度(大于时也可以)。如果把父容器的container的宽度,设为一个小于左盒子的宽度+右边盒子的宽度值(200px+300px),如400px时,就会看到这样的效果:

说明左右两个盒子并不会自动调整宽度来自适应的布局。

要想实现自适应的两栏布局也很简单,直接设置父元素的display:flex;即可。

修改样式:

css
.container {
+  ...
+  display: flex;
+}

右盒子不需要设置overflow:hidden;

效果:

可以看出左右盒子都按比例调整了自身的宽度:

200px:300px=2:3,

左栏新宽度=2/(2+3)*400=160px;

右栏新宽度=3/(2+3)*400=240px;

结果也确实如此:

左栏:

右栏:

解决浮动元素的父元素高度塌陷的问题

举例:

html
<!DOCTYPE html>
+<html lang="en">
+
+<head>
+        <meta charset="UTF-8">
+        <title>BFC的应用:解决浮动问题</title>
+        <style type="text/css">
+                body {
+                        margin: 0;
+                        padding: 0;
+                }
+
+                .container {
+                        width: 500px;
+                        border: 1px solid black;
+                }
+
+                .left {
+                        width: 200px;
+                        height: 200px;
+                        background-color: palevioletred;
+                        float: left;
+                }
+
+                .right {
+                        width: 300px;
+                        height: 400px;
+                        background-color: skyblue;
+                        float:left;
+                }
+        </style>
+</head>
+
+<body>
+        <div class="container">
+                <div class="left">left</div>
+                <div class="right">right</div>
+        </div>
+</body>
+
+</html>

效果:

如果父元素的子元素都是浮动元素,那么父元素的高度会发生高度塌陷。

解决方法:

可触发父元素生成BFC(overflow:hidden;)那么在“计算BFC的高度时,浮动元素也参与计算”,实现清除了内部浮动的效果。

修改样式,让父元素生成BFC:

css
.container {
+  ...
+  overflow: hidden;
+}

效果:

父元素的高度被撑起来了,为右盒子的高度400px;

小结

关于BFC的内容也是属于老生常谈的问题,关于BFC只需要知道,使用一定的CSS声明可以生成BFC,浏览器对生成的BFC有一系列的渲染规则,利用这些渲染规则可以达到一定的布局效果。为了达到特定的布局效果,我们让元素生成BFC

本文内容摘自 前端林子

`,83);function F(D,i,y,b,u,m){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[c,s(a),s(l)])}const d=p(t,[["render",F]]);export{g as __pageData,d as default}; diff --git a/assets/article_2019_what-bfc.md.tIBqKLqT.lean.js b/assets/article_2019_what-bfc.md.tIBqKLqT.lean.js new file mode 100644 index 000000000..60d62284b --- /dev/null +++ b/assets/article_2019_what-bfc.md.tIBqKLqT.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"BFC渲染规则","description":"什么是BFC及它的作用又是什么","frontmatter":{"title":"BFC渲染规则","description":"什么是BFC及它的作用又是什么","keywords":"CSS,BFC,块级格式化上下文,margin重叠,css渲染规则,两栏布局","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-css.png"},"headers":[],"relativePath":"article/2019/what-bfc.md","filePath":"article/2019/what-bfc.md","lastUpdated":1706247228000}'),t={name:"article/2019/what-bfc.md"},c=e("",83);function F(D,i,y,b,u,m){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[c,s(a),s(l)])}const d=p(t,[["render",F]]);export{g as __pageData,d as default}; diff --git a/assets/article_2020_domparser-xml.md.uJdSS0gw.js b/assets/article_2020_domparser-xml.md.uJdSS0gw.js new file mode 100644 index 000000000..e247c5b7e --- /dev/null +++ b/assets/article_2020_domparser-xml.md.uJdSS0gw.js @@ -0,0 +1,4 @@ +import{_ as l,c as o,J as e,V as n,o as t,G as a}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"关于DOMParser、XMLSerializer、createTreeWalker使用","description":"如何使用DOMParser、XMLSerializer、createTreeWalker,使用的场景有哪些","frontmatter":{"title":"关于DOMParser、XMLSerializer、createTreeWalker使用","description":"如何使用DOMParser、XMLSerializer、createTreeWalker,使用的场景有哪些","keywords":"DOMParser,XMLSerializer,createTreeWalker,解析dom字符串,dom解析"},"headers":[],"relativePath":"article/2020/domparser-xml.md","filePath":"article/2020/domparser-xml.md","lastUpdated":1706247228000}'),p={name:"article/2020/domparser-xml.md"},i=n(`

关于DOMParser、XMLSerializer、createTreeWalker使用

DOMParser

DOMParser 可以将存储在字符串中的 XML 或 HTML 源代码解析为一个 DOM Document。

你可以使用XMLSerializer 接口执行相反的操作 - 将DOM树转换为XML或HTML源。

对于HTML文档,您还可以通过设置 Element.innerHTML 和outerHTML 属性的值,将部分 DOM 替换为从HTML构建的新 DOM 树。还可以读取这些属性以获取对应于相应 DOM 子树的 HTML 片段

语法

js
let domparser = new DOMParser();

domparser是个DOMParser对象 iShot2022-04-06 22.02.43.png

方法

domparser对象拥有一个parseFromString的方法,使用如下:

js
let doc = domparser.parseFromString(string, mimeType);

返回值基于 mimeType 参数,返回 Document 或 XMLDocument 或其他文档类型。

parseFromString的参数解释:

其中Document文档类型是会自动包含<html><body>标签的,而XMLDocument文档类型则不会主动添加<html><body>等标签

例子: iShot2022-04-06 22.14.17.png

错误处理

DOMParser对象按指定的mimeType解析错误时,不会抛出任何异常,而是会返回一个给定的错误文档:

xml
<parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">
+(error description)
+<sourcetext>(a snippet of the source XML)</sourcetext>
+</parsererror>

iShot2022-04-06 22.17.12.png

XMLSerializer

XMLSerializer接口提供serializeToString() (en-US) 方法来构建一个代表 DOM 树的XML字符串。

语法

js
let s = new XMLSerializer();

s是个XMLSerializer对象 iShot2022-04-06 22.19.45.png

方法

XMLSerializer对象拥有一个serializeToString的方法,使用如下:

js
const str = s.serializeToString(document);

返回值是DOMString类型

serializeToString的参数解释:

例子: iShot2022-04-06 22.25.22.png

和outerHTML区别

serializeToString方法和outerHTML有些类似,但还是有所区别,主要有有下面两个:

  1. outerHTML只能作用在Element元素上,但是不能是其他节点类型,例如文本节点,注释节点之类。但是serializeToString()方法适用于任意节点类型。包括: |节点类型|释义| |--|--| |DocumentType|文档类型| |Document|文档| |DocumentFragment|文档片段| |Element|元素| |Comment|注释节点| |Text|文本节点| |ProcessingInstruction|处理指令| |Attr|属性节点|
  2. serializeToString方法会给根元素自动增加xmlns命名空间,如上图
`,35);function c(d,m,u,h,D,y){const s=a("Reward"),r=a("Gitalk");return t(),o("div",null,[i,e(s),e(r)])}const F=l(p,[["render",c]]);export{b as __pageData,F as default}; diff --git a/assets/article_2020_domparser-xml.md.uJdSS0gw.lean.js b/assets/article_2020_domparser-xml.md.uJdSS0gw.lean.js new file mode 100644 index 000000000..b33cb251b --- /dev/null +++ b/assets/article_2020_domparser-xml.md.uJdSS0gw.lean.js @@ -0,0 +1 @@ +import{_ as l,c as o,J as e,V as n,o as t,G as a}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"关于DOMParser、XMLSerializer、createTreeWalker使用","description":"如何使用DOMParser、XMLSerializer、createTreeWalker,使用的场景有哪些","frontmatter":{"title":"关于DOMParser、XMLSerializer、createTreeWalker使用","description":"如何使用DOMParser、XMLSerializer、createTreeWalker,使用的场景有哪些","keywords":"DOMParser,XMLSerializer,createTreeWalker,解析dom字符串,dom解析"},"headers":[],"relativePath":"article/2020/domparser-xml.md","filePath":"article/2020/domparser-xml.md","lastUpdated":1706247228000}'),p={name:"article/2020/domparser-xml.md"},i=n("",35);function c(d,m,u,h,D,y){const s=a("Reward"),r=a("Gitalk");return t(),o("div",null,[i,e(s),e(r)])}const F=l(p,[["render",c]]);export{b as __pageData,F as default}; diff --git a/assets/article_2020_optimize-web-server.md.b9Z54Q9U.js b/assets/article_2020_optimize-web-server.md.b9Z54Q9U.js new file mode 100644 index 000000000..46d86e126 --- /dev/null +++ b/assets/article_2020_optimize-web-server.md.b9Z54Q9U.js @@ -0,0 +1,120 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"优化改善网页的加载及性能","description":"如何优化网页的加载速度和性能指标,提高网站的seo","frontmatter":{"title":"优化改善网页的加载及性能","description":"如何优化网页的加载速度和性能指标,提高网站的seo","keywords":"性能优化,nginx,部署应用,deploy,缓存机制,强缓存,协商缓存,http缓存,CDN,服务器","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-perf.png"},"headers":[],"relativePath":"article/2020/optimize-web-server.md","filePath":"article/2020/optimize-web-server.md","lastUpdated":1706247228000}'),r={name:"article/2020/optimize-web-server.md"},t=o(`

优化改善网页的加载及性能

食用对象:不是土豪但是有点土,或者想了解下网站性能优化问题的同学

我记得那年像大同学一样怀揣着一颗IT梦进军了互联网的大门,开始朝着我不'秃'谁'秃'的幻想一步步照亮前方的道路。 然而前进的道路,坎坷往往不会缺席。学习的过程往往会产生种种疑惑与不解,在互联网高速发展的时代,百度成了解决问题的最大老师,那时对于编程解答最常用的就是CSDN了。随着每次不断在其上寻求解答外,网站也让我感到种种好奇,心想如果自己有个属于自己的技术博客该是多香呢。 故事经过了半年时间,各大云服务厂商各种推广,相爱相杀,对于仅有一个月生活费的大学生来说机会来了,说是白嫖也不为过😂,买到手后就开始各种折腾,虽然很累却很开心。

起步

小编用的是一台CentOs机器,刚开始就进行一些列的环境配置,如:nginx、node、java、mysql等一些列安装,当然中间也有不少的挫折,遇到不会的就百度搜一搜,一步一个脚印完成配置的,总体来说配置完觉得挺开心的... 本篇主要阐述网站性能优化,至于题外话就简单一概而过了 接着就是给网站搭建应用了

应用搭建

小编的博客主要是基于自己的webpack-mpa-template项目骨架集成的,采用了前后端分离进行开发,前端使用传统的webpackVueReactjquery等技术(项目模板已经集成好了,开箱即用),后端一开始采用Spring+MySQL开发,后台考虑到,nodejs的轻巧及方便以及对大批前端同学友好的全栈项目而言,就走上了koa+mysql的主体方案,相对大批前端同学来说更加友好。 本文就不讲述搭建应用的详细内容了,你可以参考我的项目骨架webpack-mpa-template,开箱即用,支持Vue、React

应用部署

小编开发完基本的功能后,就准备部署到服务器上了。当然要提交代码到github了,服务器拉取代码后直接

yaml
yarn run build
+
+yarn run deploy
+
+pm2 start blog-app

前面说了,后端主要是以node作为支撑服务的,node部署采用流行的pm2进行部署的,其有很好的负载均衡、热重启、日志收集等等爽到不能再爽的功能,很值得推荐。大家可能还有疑惑那前端打包的页面是如何托管的,其实再执行yarn run deploy后,自动会把打包后的前端页面推到后端的 public 目录作为静态路由,之所以不单独为前端页面部署服务,是因为作为后端路由后可以很好的路由拦截,进行身份鉴权等问题,你是不是很好奇如何做到的,在webpack-mpa-template里都进行了简单的说明

鉴权拦截器

鉴权拦截主要是针对登录信息进行拦截的,整个工程划分了免登录和登录机制模块,其主要针对登录模块进行拦截的 下面是鉴权拦截器的部分👇

js
/* 借用中间件机制 */
+
+// middleware/index.js
+// 鉴权机制
+app.use((ctx, next) => verifyAuth(ctx, next))
+
+// 随后路由的鉴权或者其他鉴权可以在这里进行
+// middleware/auth/index.js
+
+// 设置黑名单用来鉴权 => 可以采用 正则配置
+const apiBlackList = ["^/permission", "^/xxx$"]
+
+// 鉴权(伪代码)
+function validateAuth() {
+    // 这里可以根据身份信息进行鉴权
+    // 你可以使用token、cookie或者其他,自由配置
+}

在项目骨架中路由和鉴权有权衡约定,其中有详细说明,在此就详细展开了 你只需要在 validateAuth 根据身份信息拦截即可

nginx代理

前面讲述了我们的应用已经正常运行,接下来就需要进行http配置,使用域名映射到node server。 在conf.d路径下我们建立单独的appName.conf来配置单独应用(如果你熟悉nginx),这样以应用配置方便以后管理及维护,屡试不爽

nginx
server {
+  listen 80;
+  server_name blog.cn; # 绑定的域名
+  
+  # 进行反向代理
+  location / {
+    proxy_redirect off;
+    proxy_set_header Host $host;
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header X-Forwarded-For $http_x_forwarded_for;
+    proxy_pass http://127.0.0.1:5695; # 本地node server 地址
+  }
+}

以上就是针对当前应用的nginx配置,其绑定了blog.cn域名,配置完后保存退出后执行👇

yaml
nginx -s reload # nginx 重新加载配置

完成后当我们访问blog.cn就会打开我们的应用

性能优化

以上配置好了应用及域名,然而结果总是出人意料😂,当打开网站时发现,我来个去的蜗牛速度,打开需要10几秒,简直要吐了,然而当我点击某篇文章时,发现居然要加载15s才能进来,我差点一头撞死😭,突然对白嫖的感觉不那么香了。这要是真的是这样,别说别人浏览文章,我自己都嫌弃。 上图是后来优化后的性能分析一张图(刚开始忘记截图),可以很明显看出entry.js加载了10多s,大小972kb(当时加载快20s,大小1.4M),这对于1M宽带的服务器来说加载很慢是肯定的 上图是js加载网络图(这是优化后的,请忽略时间,还有size大小,主要是讲没有命中缓存)

从上面可以分析出:

  1. js bundle过大,虽然进行了代码分割但还是比较大,可以采用cdn网络资源,可以大大减小bundle体积,也可以减小请求时间
  2. 当点击某篇文章时需要等待20s时间,是因为异步加载的js文件过大,因此可以进行预加载,利用浏览器的空闲时间,主动加载,既不影响页面的加载,还能提高加载速度
  3. js资源没有合理进行缓存,每次重复请求,因此可以缓存静态资源,减少不必要的请求
  4. 懒加载优化网站友好过渡信息

知道了优化的方向,接下来就着手不同问题对症下药

设置CDN

在webpack(4.x)中我们进行打包时,有个optimization,splitChunks字段 可以在这里进行代码分割的逻辑,因为要结合CDN,对于一些常用的库文件,可以忽略打包,这样就可以减小打包体积,分割的代码也会变小

js
// webpack.prod.config.js
+module.exports = {
+  // ...其他配置
+  
+  // 忽略打包采用cdn
+  externals: {
+    "vue": "Vue",
+    "vue-router": "VueRouter",
+    "vuex": "Vuex",
+    "react": "react",
+    "jquery": "jQuery",
+    "echarts": "echarts",
+    "moment": "moment",
+  },
+  
+  // 代码分割
+  optimization: {
+    splitChunks: {
+      // 总的配置
+      chunks: "all",
+      minSize: 30000,
+      minChunks: 2,
+      maxAsyncRequests: 5,
+      maxInitialRequests: 3,
+      name: false,
+      cacheGroups: {
+        // 当前模块相同的配置会覆盖全局配置
+        vender: {
+          // 对于当前模块 的配置
+        },
+        // ... 可以继续根据模块或者第三方库进行划分
+      }
+    }
+  }
+}

现在需要在页面中主动引入库文件的cdn

pug
// pages/index.pug (骨架HTML提供了原生和pug)
+
+//- 引入了jquery
+script(src="https://cdn.bootcdn.net/ajax/libs/jquery/2.2.4/jquery.min.js")

以上简单概述了使用webpack代码分割忽略打包采用cdn引用

(首次加载)

上图即在使用cdn后的网络加载图,而且cdn自带缓存,可以看出首次加载还是很快的,基本上200ms,并且完全不会消耗自己服务器的性能,当再次刷新时cdn全部命中缓存,time全部为0,这也太香了...

介绍完代码分割及CDN,接着来说说预加载

预加载

预加载顾名思义就是提前加载资源,也就是说在下次需要使用该资源或该资源可能会被使用时,提前加载,减小下载请求,或命中缓存,这样就会提高响应速度

提前加载涉及到 preloadprefetch,二者都是为提前加载资源而生的,那两者有啥不同呢?

在上面综合分析后,需要的是prefetch。因为首页并没有什么太大的资源需要加载,库文件已经采用CDN的方式引用,则无需担心加载问题。问题主要在于查看文章时,其他页面需要的js文件过大,加载时间过长,因此,在加载首页时对其进行prefetch,则在进行查看文章时实现秒开的感觉

preloadprefetch都可以在webpack中进行配置,更多详细配置戳这里

因为网站使用的是 bytemarkdown ,好像是刚发布不久,碰巧看到了就试试水,可惜现在并无CDN引用的链接来使用,只能采用模块打包,文件还是比较大的,这里主要是对其进行预加载

上代码:

js
// 预加载 bytemarkdown
+
+import(/*webpackPrefetch: true*/ "@/components/ByteMd/ByteMd")

采用合适的时机进行资源 prefetch

上图便是进行了prefetch配置后的网络加载图,可以看出,在空闲时间浏览器主动加载了 0.3373.js资源,并且用 prefetch 标记了 此次请求,可以很清楚当前是 预加载 当点击文章跳转到详情页时,只是加载了16.32..js文件,只花了424ms,其依赖的0.3373.js文件已经预加载好了,实现了秒开😱,实在是太香了,此时心里突然对 白嫖 好感十足😂

接着 资源缓存 👇

缓存

缓存:初次访问时对静态资源进行缓存或储存,在下载访问时根据不同的缓存策略命中缓存返还资源,减少请求

在讲缓存前,先大概了解下 缓存又分为 浏览器缓存http缓存,二者相辅相成,你中有我我中有你,如果你对缓存还不太了解,可以阅读我的另一篇文章 web缓存策略,此处就不在详细展开

对于js、css文件,可以在webpack进行打包时,给文件添加hash值,在迭代项目时,会根据hash不同主动进行资源获取,这里推荐使用contenthash及文件内容不变,hash不变。

js
// webpack.config.js
+
+module.exports = {
+  output: {
+    path: resolve("../client/dist"),
+    filename: USE_HASH ? "js/[name].[chunkhash:4].js" : "js/[name].js",
+    publicPath: "/",
+    chunkFilename: USE_HASH ? "js/[name].[chunkhash:4].js" : "js/[name].js",
+    // ... 其他配置
+  },
+}

这样就解决了更新问题

接着需要在nginx中进行静态资源的缓存(本文假设你对nginx有基本了解)

nginx
 # 缓存图片,音频等资源
+ location ~ .*\\.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|gz|mp3|mp4|ogg|webm)$ {
+    # 资源防盗链
+    valid_referers *.usword.cn ~\\.google\\. ~\\.baidu\\. *.qq.com;            
+    if ($invalid_referer) {                                                
+      rewrite ^/ http://tva1.sinaimg.cn/large/005HV6Avgy1gvn4e450oxj602.jpg;                                                                         
+      return 403;                                                    
+    }                                                                      
+    proxy_pass http://127.0.0.1:8882; # node server
+    proxy_redirect off;                        
+    proxy_set_header Host $host;
+    proxy_cache my_cache; # nginx指定缓存项
+    proxy_cache_valid 200 304 24h;
+    proxy_cache_valid any 10m; # 代理过期时间
+    expires 7d;  # 资源过期时间
+    add_header Is-Cache true; # 天机自定义头部                                             
+ }                                                                              
+
+ # 缓存js,css 同上
+ location ~ .*\\.(?:js|css)$ {                                                   
+    proxy_pass http://127.0.0.1:9901;                                      
+    proxy_set_header Host $host;                                           
+    proxy_cache my_cache;                                                  
+    proxy_cache_valid 200 304 24h;                                         
+    proxy_cache_valid any 10m;                                             
+    expires 7d;                                                            
+    add_header Is-Cache true;                                              
+ }

上图即添加nginx缓存后,非首次访问,浏览器会命中缓存,实现秒开功能

懒加载

预加载相对的就是预加载,为了提高网页的响应速度,减少不必要的资源请求是很提倡的做法

  1. 针对图片资源 可以采用图片懒加载,用其他展位图进行展示,然后一步一步加载图片,在效果上也会比较舒服,很直观的能让用户感受到:哦,资源加载中

  2. 针对接口请求 减少请求量,采用分页加载。每个用户面对的都是有固定尺寸的显示器,其可展示的内容就只占一屏,其后面的数据就算加载了用户也看不到 可以对浏览器进行滚动监听,当到快到底部时,再进行下一部门内容的加载

资源压缩gzip

nginx示例配置,更多配置戳这里查看官方文档

nginx
server {
+  gzip on;
+  gzip_types text/html text/css application/javascript;
+  gzip_static: on;
+  gzip_proxied: expired no-cache auth;
+  gzip_buffers: 16 8k;
+  gzip_min_length: 2k;
+  gzip_comp_level: 4;
+  gzip_http_version: 1.0;
+  gzip_vary: on;
+  gzip_disable: "MSIE [1-6]\\.";
+}

//待更新...

总结

本文主要从cdn、代码分割、资源缓存、预加载和懒加载等方面,不断优化了网站的加载速度,可能还需要不断的优化,但至少现在比刚开始已经快的很多了。 结尾容我感叹一句:白嫖不容易,别放弃白嫖

`,65);function i(y,D,F,b,u,d){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[t,s(a),s(l)])}const g=p(r,[["render",i]]);export{h as __pageData,g as default}; diff --git a/assets/article_2020_optimize-web-server.md.b9Z54Q9U.lean.js b/assets/article_2020_optimize-web-server.md.b9Z54Q9U.lean.js new file mode 100644 index 000000000..bcd52eff3 --- /dev/null +++ b/assets/article_2020_optimize-web-server.md.b9Z54Q9U.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"优化改善网页的加载及性能","description":"如何优化网页的加载速度和性能指标,提高网站的seo","frontmatter":{"title":"优化改善网页的加载及性能","description":"如何优化网页的加载速度和性能指标,提高网站的seo","keywords":"性能优化,nginx,部署应用,deploy,缓存机制,强缓存,协商缓存,http缓存,CDN,服务器","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-perf.png"},"headers":[],"relativePath":"article/2020/optimize-web-server.md","filePath":"article/2020/optimize-web-server.md","lastUpdated":1706247228000}'),r={name:"article/2020/optimize-web-server.md"},t=o("",65);function i(y,D,F,b,u,d){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[t,s(a),s(l)])}const g=p(r,[["render",i]]);export{h as __pageData,g as default}; diff --git a/assets/article_2020_regexp-guide.md.1Tud3eyA.js b/assets/article_2020_regexp-guide.md.1Tud3eyA.js new file mode 100644 index 000000000..69ff4b089 --- /dev/null +++ b/assets/article_2020_regexp-guide.md.1Tud3eyA.js @@ -0,0 +1,167 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as a}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"深入浅出RegExp","description":"玩转正则表达式(regexp)的使用技巧,使用regexp提高开发效率","frontmatter":{"title":"深入浅出RegExp","description":"玩转正则表达式(regexp)的使用技巧,使用regexp提高开发效率","keywords":"正则表达式,RegExp,正则匹配,前端正则表达式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2020/regexp-guide.md","filePath":"article/2020/regexp-guide.md","lastUpdated":1706247228000}'),c={name:"article/2020/regexp-guide.md"},r=o(`

深入浅出RegExp

JavaScript中的正则是Perl的大子集,但Perl内部的一些表达式却没有继承

正则表达式是用于匹配字符串中字符组合的模式(可参考MDN教程)

一个例子

使用正则将一个数字以科学计数法进行表示,如:

js
 // 10000000 => 10,000,000

现在用一个正则来解决

js
const str = '10000000'
+const reg = /(?=(\\B)(\\d{3})+$)/g
+str.replace(reg, ',') // 10,000,000

修饰符

正则表达式是由模式修饰符(可有可无)组成 常用的修饰符有:igmuy

字符类

字符类是个特殊的字符,用来匹配字符集中字符 如:匹配字符串中的数字

js
const str = 'jhsd123fg903d'
+
+// 匹配所有的数字
+str.match(/\\d/g) // => ['1', '2', '3', '9', '0', '3']

常用的字符表达式见下表:

表达式描述含义
.匹配单个字符,除了换行和行结束符(小数点)默认匹配除换行符之外的任何单个字符。例如,/.n/ 将会匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不会匹配 'nay'。如果 s ("dotAll") 标志位被设为 true,它也会匹配换行符。
\\w匹配单词字符匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。例如, /\\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 和 "3D." 中的 '3'。
\\W匹配非单词字符匹配一个非单字字符。等价于 [^A-Za-z0-9_]。例如, /\\W/ 或者 /[^A-Za-z0-9_]/ 匹配 "50%." 中的 '%'。
\\d匹配数字匹配一个数字。等价于[0-9]。例如, /\\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。
\\D匹配非数字字符匹配一个非数字字符。等价于[^0-9]。例如, /\\D/ 或者 /[^0-9]/ 匹配"B2 is the suite number."中的'B' 。
\\s匹配空白字符匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[ \\f\\n\\r\\t\\v\\u00a0\\u1680\\u180e\\u2000-u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]。例如, /\\s\\w*/ 匹配"foo bar."中的' bar'。经测试,\\s不匹配"\\u180e",在当前版本Chrome(v80.0.3987.122)和Firefox(76.0.1)控制台输入/\\s/.test("\\u180e")均返回false。
\\S匹配非空白字符匹配一个非空白字符。等价于 [^ \\f\\n\\r\\t\\v\\u00a0\\u1680\\u180e\\u2000-u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]。例如,/\\S\\w*/ 匹配"foo bar."中的'foo'。
\\b匹配单词边界匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。注意,匹配中不包括匹配的字边界。换句话说,一个匹配的词的边界的内容的长度是0。(不要和[\\b]混淆了)使用"moon"举例:/\\bm/匹配“moon”中的‘m’;/oo\\b/并不匹配"moon"中的'oo',因为'oo'被一个“字”字符'n'紧跟着。/oon\\b/匹配"moon"中的'oon',因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。/\\w\\b\\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。
\\B匹配非单词边界匹配一个非单词边界。匹配如下几种情况:(1)字符串第一个字符为非“字”字符 (2)字符串最后一个字符为非“字”字符(3)两个单词字符之间(4)两个非单词字符之间(5)空字符串
\\n匹配换行符匹配一个换行符 (U+000A)。

...等等其他

例子

  1. .字符
js
var str = 'aa1bb'
+str.match(/(\\w)\\1.(\\w)\\2/g) // => ['aa1bb'],此处 \`.\` 匹配的是 1
+
+str = 'nay, an apple is on the tree'
+str.match(/.n/g) // => ['an', 'on'],匹配两个结果,此处\`.\` 分别是 a, o
  1. \\w字符
js
var str = 'a1ds23;.?]'
+str.match(/\\w/g) // => ['a', '1', 'd', 's', '2', '3']
  1. \\d字符
js
var str = 'a1ds23;.?]'
+str.match(/\\w/g) // => ['1', '2', '3']
  1. \\s字符
js
var str = 'a1 ds2 3;.?]'
+str.match(/\\w/g) // => [' ', ' '],共有两处
  1. \\b字符
js
var str = '2split1;word3'
+str.match(/\\b\\d/g) // => [2],先匹配数字[2,1,3],而后单词边界的是 [2]
  1. \\B字符
js
var str = '2split1;word3'
+str.match(/\\B\\d/g) // => [1, 3],先匹配数字[2,1,3],而后非单词边界的是 [1,3]

复用

复用即量词,常见的量词包括:*+?{n},量词可以在匹配多个相同的模式的时候很管用,避免了重复写相同的模式

一个小例子:

js
str = 'ab1c2d345e'
+str.match(/\\d/ig) // => [1, 2, 3, 4, 5]
+
+// 使用量词 (这里涉及到了贪婪原则,后面会讲到)
+str.match(/\\d+/ig) // => [1, 2, 345]

来看下面的解释

选择、组合、捕获、引用

选择

选择是由|标识进行匹配,可以理解为or,如:a|b表示匹配a或者b

js
str = 'absdfg'
+// 匹配s或者d
+str.match(/s|d/ig) // => ['s', 'd']

组合(字符集合范围)

组合在常用的匹配模式中还是常用的,[]用来组合匹配的范围或者其他

几个重要概念:

  1. [^..]表示非组合的内容,^在开头代表不是后面要匹配的内容
  2. [\\b]匹配一个退格,不要和 \\b混淆了
js
// 匹配第一位是字符全是大写或者全是小写的字母
+reg1 = /^[A-z]\\d*/ig
+reg1.test('s12314') // => true
+
+// 匹配第一位是字母或者数字的,最后一个第一位是字母或者0-2之间的数字,很明显false
+reg2 = /^[A-z|\\d]\\d*/ig
+reg2.test('s12314') // => true
+reg2.test('112314') // => true
+reg3 = /^[A-z|0-2]\\d*/ig
+reg3.test('312314') // => false
+
+// 匹配第一位不是字母
+reg4 = /^[^A-z]\\d*/ig
+reg4.test('s12314') // => false
+reg4.test(';12314') // => true

捕获

捕获在匹配表达式中经常看到,他的作用非常强大,使用()一对括号进行修饰,这样就可以捕获到匹配到里面的内容,捕获经常和引用或者修饰符(*、+...)结合使用

在讲用法前,需要补充一下排除捕获,排除捕获也很重要很常用,可以用一些需要()但又不需要捕获后的值,用?:排除捕获

常见用法:

  1. 使用捕获获取具体内容 RegExp 的静态属性 $
js
str = 'I like Java coding'
+
+// 忽略大小写
+reg = /\\w*(JAVA)\\w*/ig
+
+// 匹配字符
+reg.test(str)
+// 匹配后,捕获到的内容会按照捕获的顺序出现在 \`RegExp\`的静态属性上,以\`$\`开头
+console.log(RegExp.$1) // => Java 
+console.log(RegExp.$2) // => undefined ,只有一个捕获,不存在\`$2\`属性
+
+// 使用\`replace\`方法
+str.replace(reg, 'PHP') // => I like PHP coding
+str.replace(reg, '【$1】') // => I like 【Java】 coding
+str.replace(reg, '$1Script') // => I like JavaScript coding
+str.replace(reg, ($, $1) => {
+  console.log('匹配到了' + $1)
+  return \`\${$1}\`
+}) // => I like 【Java】 coding  并且会打印 \`匹配到了Java\`
+// 搜索段落标红关键字
+str.replace(reg, '<span style="color:red">$1</span>') // => I like <span style='color:red'>Java</span> coding
  1. 匹配表达式结合引用使用

引用其实和前面讲到的RegExp的静态属性类似,只不过引用是在匹配表达式中使用,写法不一样。在匹配表达式中使用 \\1 \\2...斜杠加一个数字的形式引用所有引用的第一个,类似 $1、$2...

引用的顺序与()的使用顺序相关联,规则:由左到右,由外到内,遇到排除捕获跳过当前()

js
str = 'qaabbccddq'
+reg = /(\\w)\\1/ig
+str.match(reg) // => ['aa', 'bb', 'cc', 'dd']
js
str = 'qaaaabbbb11q'
+reg = /(\\w\\w)\\1(\\d)\\2?/ig
+str.match(reg) // => ['bbbb11']
+
+// 这里注意是 \`\\3\` 而不是 \`\\2\`
+reg1 = /(\\w\\w)\\1((\\d)\\3)?/ig
+str.match(reg1) // => ['aaaa', 'bbbb11']
+
+// 这里注意使用了 \`?:\` 排除捕获,所以是 \`\\2\` 而不是 \`\\3\`
+reg2 = /(\\w\\w)\\1(?:(\\d)\\2)?/ig
+str.match(reg1) // => ['aaaa', 'bbbb11']

引用

引用在匹配表达式中使用 \\1 这种以 斜杠和数字 结合的方式使用,需要注意的是,引用的数字和使用 ()的规则相关,规则为:由左到右,由外到内,遇到排除捕获跳过当前(),这一点很重要

关于引用的用法,详见前面 捕获小结的使用方法即可

断言

通常我们要匹配的内容后面要跟着指定的内容,常见的断言x(?=y)x(?!y)(?<=y)x(?<!y)x

前瞻断言

前瞻断言主要是x(?=y)x(?!y)x(?=y)表示匹配后面紧跟着y的x,x(?!y)表示匹配后面不是y的x

js
str = '1 candy costs 50€'
+
+// 假如要匹配后面是 \`€\` 的数字
+str.match(/\\d+(?=)/) // => [50]
+
+// 假如要匹配后面不是 \`€\` 的数字
+str.match(/\\d+(?!)/) // => [1]

后瞻断言

前瞻断言主要是(?<=y)x(?<!y)x(?<=y)x表示匹配前面紧跟着y的x,(?<!y)x表示匹配前面不是y的x

js
str = '1 candy costs $50'
+
+// 假如要匹配前面是 \`$\` 的数字
+str.match(/(?<=\\$)\\d+/) // => [50]
+
+// 假如要匹配前面不是 \`$\` 的数字
+str.match(/(?<!\\$)\\d+/) // => [1]

贪婪与惰性

正则的量词通常都是遵循贪婪原则,也就是有量词的时候,尽量匹配多的。而惰性则和这种原则相反,尽量匹配少,不匹配多。

惰性使用?紧跟在量词的后面,如:

js
\`\\d+?\` // 匹配一个数字就行
+\`\\w{1,}?\` // 匹配1个字母就行
+\`\\d*?\` // 匹配0个数字 => ['', ...]

例子

js
// 匹配带 \`""\`号的水果
+str = 'I like "apples" a little more than "oranges"'
+
+
+// 1.贪婪
+// 会发现结果并不理想,原因就是默认是贪婪原则,能匹配多的不匹配少的
+// 首先,会匹配到第一个\`"\`
+// 而后匹配下一个\`"\`,当匹配到\`apples"\`,还会继续往后匹配
+// 看剩下的能不能匹配到 \`.+"\`,最后匹配到了\`oranges"\`(当然前面还有\`than "\`)
+str.match(/".+"/g) // => ["apples" a little more than "oranges"]
+
+// 2.惰性
+str.match(/".+?"/g) // => ["apples", "oranges"]
+
+// 3.其他方法
+str.match(/"[^"]+"/g) // => ["apples", "oranges"]

RegExp属性、方法

属性

常见的属性:source,global,ignoreCase,multiline,lastIndex等等...

  1. source 表示正则对象的原表达式内容以字符串的形式输出,不包含修饰符
js
reg = /(\\d\\s)\\1/ig
+
+reg.source // => '(\\\\d\\\\s)\\\\1'
  1. global 表示是否匹配全部内容,而不是匹配到第一个就停止匹配,返回Boolean类型
js
reg = /(\\d\\s)\\1/ig
+
+reg.global // => true
  1. ignoreCase 表示匹配是否忽略大小写,返回Boolean类型
js
reg = /(\\d\\s)\\1/ig
+
+reg.ignoreCase // => true
  1. multiline 表示多行匹配,有回车符,换下一行从头匹配
js
reg = /(\\d\\s)\\1/ig
+
+reg.multiline // => false
  1. lastIndex 在全局匹配时,表示当前匹配的的索引,初始为0,当匹配到结果时,lastIndex值变为最新匹配的位置,如果不能匹配到结果了,然后重0开始
js
str = 'day by day'
+
+reg = /\\w+/g
+
+reg.exec(str) // => ['day', index: 0, input: 'day by day', groups: undefined]
+reg.lastIndex // => 3
+
+reg.exec(str) // => ['by', index: 4, input: 'day by day', groups: undefined]
+reg.lastIndex // => 6
+
+reg.exec(str) // => ['day', index: 7, input: 'day by day', groups: undefined]
+reg.lastIndex // => 10
+
+reg.exec(str) // => null
+reg.lastIndex // => 0,重新从头开始

方法

常见的方法:exec、test

  1. exec 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null) 同上lastIndex例子

  2. test 一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false。

js
str = '1a1aklk2b2bp'
+reg = /(\\d\\w)\\1+/
+reg.test(str) // => true

String常见的正则方法

常用的方法:replacematchmatchAllsearchsplit

  1. replace:字符串替换指定的内容(表达式匹配)
js
str = 'I like Java coding'
+
+str.replace(/JAVA/i, 'PHP') // => 'I like PHP coding'
+str.replace(/(JAVA)/i, '<$1>') // => 'I like <Java> coding'
+str.replace(reg, ($, $1) => {
+  console.log('匹配到了' + $1)
+  return \`\${$1}\`
+}) // => I like 【Java】 coding  并且会打印 \`匹配到了Java\`
  1. match:匹配所有符合表达式的内容,返回数组,否则null
js
str = 'd1sd2asf43d5'
+
+str.match(/\\d+/) // => [1]
+str.match(/\\d+/g) // => [1, 2, 43, 5]
+str.match(/\\d\\b/) // => [5]
+str.match(/\\d\\B/) // => [1, 2, 43]
+str.match(/\\d\\s/) // => null
  1. matchAll:返回匹配正则表达式的迭代器,参数为 RegExp 类型,且必须带上 修饰符 g,否则报错;其匹配结果返回一个 RegExpStringIterator 类型的迭代器
js
str = 'd1sd2asf43d5'
+
+iterator = str.matchAll(/\\d+/g) // => RegExpStringIterator {}
+Object.prototype.toString.call(iterator) // => [object RegExp String Iterator]
+
+// 返回结果基本和迭代器一致,value是类数组
+iterator.next() // => {value: [1], done: false}
+iterator.next() // => {value: [2], done: false}
+iterator.next() // => {value: [43], done: false}
+iterator.next() // => {value: [5], done: false}
+iterator.next() // => {value: undefined, done: true}

迭代器截图

  1. search:匹配正则表达式,如果匹配成功返回第一个匹配的位置,否则返回-1
js
str = '1 apple costs $50'
+
+str.search(/(?<=\\$)\\d+/) // => 15
+str.search(/\\d+/) // => 0
+str.search(/\\d[A-z]/) // => -1
  1. split:将以正则匹配的内容进行分割
js
str = 'skJavaslkdJAVAllksdfJaVAlp'
+
+// 将会以 java 或者 javas 进行分割(不区分大小写)
+str.split(/javas?/i) // => ['sk', 'lkd', 'llksdf', 'lp']
`,103);function i(y,D,F,d,b,u){const n=a("Reward"),l=a("Gitalk");return t(),e("div",null,[r,s(n),s(l)])}const m=p(c,[["render",i]]);export{E as __pageData,m as default}; diff --git a/assets/article_2020_regexp-guide.md.1Tud3eyA.lean.js b/assets/article_2020_regexp-guide.md.1Tud3eyA.lean.js new file mode 100644 index 000000000..27f5ae9a1 --- /dev/null +++ b/assets/article_2020_regexp-guide.md.1Tud3eyA.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as a}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"深入浅出RegExp","description":"玩转正则表达式(regexp)的使用技巧,使用regexp提高开发效率","frontmatter":{"title":"深入浅出RegExp","description":"玩转正则表达式(regexp)的使用技巧,使用regexp提高开发效率","keywords":"正则表达式,RegExp,正则匹配,前端正则表达式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2020/regexp-guide.md","filePath":"article/2020/regexp-guide.md","lastUpdated":1706247228000}'),c={name:"article/2020/regexp-guide.md"},r=o("",103);function i(y,D,F,d,b,u){const n=a("Reward"),l=a("Gitalk");return t(),e("div",null,[r,s(n),s(l)])}const m=p(c,[["render",i]]);export{E as __pageData,m as default}; diff --git a/assets/article_2020_vscode-shortcut.md.kzdDBCVW.js b/assets/article_2020_vscode-shortcut.md.kzdDBCVW.js new file mode 100644 index 000000000..315b0a172 --- /dev/null +++ b/assets/article_2020_vscode-shortcut.md.kzdDBCVW.js @@ -0,0 +1,131 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"vscode快捷键","description":"本文罗列常见的vscode快捷键","frontmatter":{"title":"vscode快捷键","description":"本文罗列常见的vscode快捷键","keywords":"vscode快捷键,快捷键,mac vscode快捷键,Mac vscode","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vscode.png"},"headers":[],"relativePath":"article/2020/vscode-shortcut.md","filePath":"article/2020/vscode-shortcut.md","lastUpdated":1706247228000}'),c={name:"article/2020/vscode-shortcut.md"},i=o(`

vscode快捷键

该文章内容翻译自Visual Studio Code 快捷键 Mac 版,快捷键忘了的可以查阅此文档

以下以Mac为例

全局

markdown
Command + Shift + P / F1 显示命令面板
+Command + P 快速打开
+Command + Shift + N 打开新窗口
+Command + W 关闭窗口

基本

markdown
Command + X 剪切(未选中文本的情况下,剪切光标所在行)
+Command + C 复制(未选中文本的情况下,复制光标所在行)
+Option + Up 向上移动行
+Option + Down 向下移动行
+Option + Shift + Up 向上复制行
+Option + Shift + Down 向下复制行
+Command + Shift + K 删除行
+Command + Enter 下一行插入
+Command + Shift + Enter 上一行插入
+Command + Shift + \\ 跳转到匹配的括号
+Command + [ 减少缩进
+Command + ] 增加缩进
+Home 跳转至行首
+End 跳转到行尾
+Command + Up 跳转至文件开头
+Command + Down 跳转至文件结尾
+Ctrl + PgUp 按行向上滚动
+Ctrl + PgDown 按行向下滚动
+Command + PgUp 按屏向上滚动
+Command + PgDown 按屏向下滚动
+Command + Shift + [ 折叠代码块
+Command + Shift + ] 展开代码块
+Command + K Command + [ 折叠全部子代码块
+Command + K Command + ] 展开全部子代码块
+Command + K Command + 0 折叠全部代码块
+Command + K Command + J 展开全部代码块
+Command + K Command + C 添加行注释
+Command + K Command + U 移除行注释
+Command + / 添加、移除行注释
+Option + Shift + A 添加、移除块注释
+Option + Z 自动换行、取消自动换行

多光标与选择

markdown
Option + 点击 插入多个光标
+Command + Option + Up 向上插入光标
+Command + Option + Down 向下插入光标
+Command + U 撤销上一个光标操作
+Option + Shift + I 在所选行的行尾插入光标
+Command + I 选中当前行
+Command + Shift + L 选中所有与当前选中内容相同部分
+Command + F2 选中所有与当前选中单词相同的单词
+Command + Ctrl + Shift + Left 折叠选中
+Command + Ctrl + Shift + Right 展开选中
+Alt + Shift + 拖动鼠标 选中代码块
+Command + Shift + Option + Up 列选择 向上
+Command + Shift + Option + Down 列选择 向下
+Command + Shift + Option + Left 列选择 向左
+Command + Shift + Option + Right 列选择 向右
+Command + Shift + Option + PgUp 列选择 向上翻页
+Command + Shift + Option + PgDown 列选择 向下翻页

查找替换

markdown
Command + F 查找
+Command + Option + F 替换
+Command + G 查找下一个
+Command + Shift + G 查找上一个
+Option + Enter 选中所有匹配项
+Command + D 向下选中相同内容
+Command + K Command + D 移除前一个向下选中相同内容

进阶

markdown
Ctrl + Space 打开建议
+Command + Shift + Space 参数提示
+Tab Emmet插件缩写补全
+Option + Shift + F 格式化
+Command + K Command + F 格式化选中内容
+F12 跳转到声明位置
+Option + F12 查看具体声明内容
+Command + K F12 分屏查看具体声明内容
+Command + . 快速修复
+Shift + F12 显示引用
+F2 重命名符号
+Command + Shift + . 替换为上一个值
+Command + Shift + , 替换为下一个值
+Command + K Command + X 删除行尾多余空格
+Command + K M 更改文件语言

导航

markdown
Command + T 显示所有符号
+Ctrl + G 跳转至某行
+Command + P 跳转到某个文件
+Command + Shift + O 跳转到某个符号
+Command + Shift + M 打开问题面板
+F8 下一个错误或警告位置
+Shift + F8 上一个错误或警告位置
+Ctrl + Shift + Tab 编辑器历史记录
+Ctrl + - 后退
+Ctrl + Shift + - 前进
+Ctrl + Shift + M Tab 切换焦点

编辑器管理

markdown
Command + W 关闭编辑器
+Command + K F 关闭文件夹
+Command + \\ 编辑器分屏
+Command + 1 切换到第一分组
+Command + 2 切换到第二分组
+Command + 3 切换到第三分组
+Command + K Command + Left 切换到上一分组
+Command + K Command + Right 切换到下一分组
+Command + K Command + Shift + Left 左移编辑器
+Command + K Command + Shift + Right 右移编辑器
+Command + K Left 激活左侧编辑组
+Command + K Right 激活右侧编辑组

文件管理

markdown
Command + N 新建文件
+Command + O 打开文件
+Command + S 保存文件
+Command + Shift + S 另存为
+Command + Option + S 全部保存
+Command + W 关闭
+Command + K Command + W 全部关闭
+Command + Shift + T 重新打开被关闭的编辑器
+Command + K Enter 保持打开
+Ctrl + Tab 打开下一个
+Ctrl + Shift + Tab 打开上一个
+Command + K P 复制当前文件路径
+Command + K R 在资源管理器中查看当前文件
+Command + K O 新窗口打开当前文件

显示

markdown
Command + Ctrl + F 全屏、退出全屏
+Command + Option + 1 切换编辑器分屏方式(横、竖)
+Command + + 放大
+Command + - 缩小
+Command + B 显示、隐藏侧边栏
+Command + Shift + E 显示资源管理器 或 切换焦点
+Command + Shift + F 显示搜索框
+Ctrl + Shift + G 显示Git面板
+Command + Shift + D 显示调试面板
+Command + Shift + X 显示插件面板
+Command + Shift + H 全局搜索替换
+Command + Shift + J 显示、隐藏高级搜索
+Command + Shift + C 打开新终端
+Command + Shift + U 显示输出面板
+Command + Shift + V Markdown预览窗口
+Command + K V 分屏显示 Markdown预览窗口

调试

markdown
F9 设置 或 取消断点
+F5 开始 或 继续
+F11 进入
+Shift + F11 跳出
+F10 跳过
+Command + K Command + I 显示悬停信息

集成终端

markdown
Ctrl + \` 显示终端
+Ctrl + Shift + \` 新建终端
+Command + Up 向上滚动
+Command + Down 向下滚动
+PgUp 向上翻页
+PgDown 向下翻页
+Command + Home 滚动到顶部
+Command + End 滚动到底部
`,25);function m(t,b,d,B,u,h){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[i,s(a),s(l)])}const D=p(c,[["render",m]]);export{C as __pageData,D as default}; diff --git a/assets/article_2020_vscode-shortcut.md.kzdDBCVW.lean.js b/assets/article_2020_vscode-shortcut.md.kzdDBCVW.lean.js new file mode 100644 index 000000000..64d840fbe --- /dev/null +++ b/assets/article_2020_vscode-shortcut.md.kzdDBCVW.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"vscode快捷键","description":"本文罗列常见的vscode快捷键","frontmatter":{"title":"vscode快捷键","description":"本文罗列常见的vscode快捷键","keywords":"vscode快捷键,快捷键,mac vscode快捷键,Mac vscode","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vscode.png"},"headers":[],"relativePath":"article/2020/vscode-shortcut.md","filePath":"article/2020/vscode-shortcut.md","lastUpdated":1706247228000}'),c={name:"article/2020/vscode-shortcut.md"},i=o("",25);function m(t,b,d,B,u,h){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[i,s(a),s(l)])}const D=p(c,[["render",m]]);export{C as __pageData,D as default}; diff --git a/assets/article_2020_web-cache.md.uI4_cM9P.js b/assets/article_2020_web-cache.md.uI4_cM9P.js new file mode 100644 index 000000000..55a00eca4 --- /dev/null +++ b/assets/article_2020_web-cache.md.uI4_cM9P.js @@ -0,0 +1 @@ +import{_ as t,c as r,J as e,V as l,o as d,G as o}from"./chunks/framework.SV1ROkXV.js";const T=JSON.parse('{"title":"web缓存策略","description":"什么是强缓存和协商缓存、HTTP缓存、浏览器缓存,web如何做缓存提高应用的加载效率","frontmatter":{"title":"web缓存策略","description":"什么是强缓存和协商缓存、HTTP缓存、浏览器缓存,web如何做缓存提高应用的加载效率","keywords":"强缓存,协商缓存,HTTP缓存,浏览器缓存,内存缓存,缓存策略,缓存机制,性能优化","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-cache.png"},"headers":[],"relativePath":"article/2020/web-cache.md","filePath":"article/2020/web-cache.md","lastUpdated":1706247228000}'),i={name:"article/2020/web-cache.md"},h=l('

web缓存策略

缓存简单的来说就是把需要的东西储存到指定的位置,等下次需要取到相应的内容时,先看储存的缓存里是否存在,如果存在直接拿缓存的内容,如果不存在重新获取即可;那么前端缓存主要指什么,又有那些缓存策略呢?

概念

前端缓存是 http缓存浏览器缓存 的结合,两者相辅相成,共同完成缓存。

  1. http缓存

主要是指客户端和服务器间的通信缓存,利用这一缓存可以提升服务器资源利用率,在资源的有效期内不用进行请求该资源,大大减少服务器的压力

按照失效缓存策略分为:强缓存协商缓存

  1. 浏览器缓存

浏览器缓存把请求到的服务端资源进行本地储存

待补充...

相关文章

',13);function n(s,p,_,b,u,m){const a=o("Reward"),c=o("Gitalk");return d(),r("div",null,[h,e(a),e(c)])}const w=t(i,[["render",n]]);export{T as __pageData,w as default}; diff --git a/assets/article_2020_web-cache.md.uI4_cM9P.lean.js b/assets/article_2020_web-cache.md.uI4_cM9P.lean.js new file mode 100644 index 000000000..b03437927 --- /dev/null +++ b/assets/article_2020_web-cache.md.uI4_cM9P.lean.js @@ -0,0 +1 @@ +import{_ as t,c as r,J as e,V as l,o as d,G as o}from"./chunks/framework.SV1ROkXV.js";const T=JSON.parse('{"title":"web缓存策略","description":"什么是强缓存和协商缓存、HTTP缓存、浏览器缓存,web如何做缓存提高应用的加载效率","frontmatter":{"title":"web缓存策略","description":"什么是强缓存和协商缓存、HTTP缓存、浏览器缓存,web如何做缓存提高应用的加载效率","keywords":"强缓存,协商缓存,HTTP缓存,浏览器缓存,内存缓存,缓存策略,缓存机制,性能优化","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-cache.png"},"headers":[],"relativePath":"article/2020/web-cache.md","filePath":"article/2020/web-cache.md","lastUpdated":1706247228000}'),i={name:"article/2020/web-cache.md"},h=l("",13);function n(s,p,_,b,u,m){const a=o("Reward"),c=o("Gitalk");return d(),r("div",null,[h,e(a),e(c)])}const w=t(i,[["render",n]]);export{T as __pageData,w as default}; diff --git a/assets/article_2020_webpack-guide.md.zBMh8gpK.js b/assets/article_2020_webpack-guide.md.zBMh8gpK.js new file mode 100644 index 000000000..bf34cd602 --- /dev/null +++ b/assets/article_2020_webpack-guide.md.zBMh8gpK.js @@ -0,0 +1,468 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"从零配置webpack工程","description":"使用webpack搭建一个完整的工程项目,webpack使用基础指南","frontmatter":{"title":"从零配置webpack工程","description":"使用webpack搭建一个完整的工程项目,webpack使用基础指南","keywords":"webpack,工程化,webpack搭建,webpack基础","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-webpack.png"},"headers":[],"relativePath":"article/2020/webpack-guide.md","filePath":"article/2020/webpack-guide.md","lastUpdated":1706247228000}'),r={name:"article/2020/webpack-guide.md"},t=o(`

从零配置webpack工程

本篇文章主要针对webpack4.x进行配置,如果你的版本有差别,或者配置有出入,请移步官网查询更多详细配置,各个版本大同小异,不影响学习

webpack 是什么?

webpack 是一个现代 JavaScript 应用程序的静态模块打包器,当 webpack 处理应用程序时,会递归构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将这些模块打包成一个或多个 bundle。

webpack 的核心概念

初始化项目

webpack4.x开始增加mode为必要字段,用来区分你的运行环境。

如果你还没有项目,可以先创建一个简单的项目,方便后面使用

sh
mkdir webpack-demo && cd webpack-demo
+npm init -y

创建完成后,就让我们进行简单的配置吧

安装基本的依赖

对于目前的webpack4.x,你或许需要以下依赖:

sh
npm install webpack webpack-cli -D

基本配置

首先我们在webpack-demo文件下创建webpack.config.jssrc文件夹,然后在src文件夹下创建index.js

js
// webpack.config.js
+const path = require("path");
+module.exports = {
+  mode: "production", // 代码环境模式 (webpack4.x是必选的字段)
+  entry: path.resolve(__dirname, "./src/index/"), // 入口文件
+  output: {
+    path: path.resolve(__dirname, "./dist"), //  打包的目的路径
+    filename: "js/bundle.[hash:8].js" // 打包后的文件名
+  }
+};

然后再src/index.js里面简单的写几个语句进行打包处理

js
// src/index.js
+console.log("hello");
+console.log("webpack");

我们按照上面的简单配置进行打包:

sh
webpack webpack.config.js

为了方便输入打包口令,让我们简单的配置一下package.json脚本

json
// package.json
+{
+  // ...
+  "scripts": {
+    "build": "webpack --config webpack.config.js"
+  }
+}

然后使用以下的口令就可以完成打包啦:

sh
npm run build

是不是很方便,很 nice~

html-webpack-plugin

html-webpack-plugin可以让我们动态生成 HTML 文件,让我们在浏览器中查看效果

sh
npm install html-webpack-plugin -D

html-webpacl-plugin 是要配置在plugins中的,作为 webpack 的插件使用,plugins 是一个数组

html-webpack-plugin可以使用模板,也就是我们创建好的 html 模板,所以现在public文件夹下创建index.html文件

接着以上的webpack配置,添加html-webpack-plugin

js
// webpack.config.js
+const htmlWebpackPlugin = require("html-webpack-plugin");
+module.exports = {
+  // ...
+  plugins: [
+    new htmlWebpackPlugin({
+      template: path.resolve(__dirname, "./public/index.html"),
+      minify: {
+        // 压缩
+        collapseWhitespace: true, // 折叠空格
+        removeAttributeQuotes: true // 去除属性的引号
+      },
+      filename: "index.html" // 生成的html名称
+    })
+  ]
+};

打包代码吧~

sh
npm run build

打包后会多出index.html文件

html-webpack-plugin 在开发中还是非常有用的,其实它还有很多详细的配置,这里不做详解,请移步html-webpack-plugin 官方文档获取更多

devServer

webpack4.x 为我们提供了devServer工具,可以进行热更新,方便我们调试

使用前先下载:

sh
npm install webpack-dev-server -D

然后在上面的基础上添加devServer

js
// webpack.config.js
+module.exports = {
+  // ...
+  devServer: {
+    host: "0.0.0.0", // ip地址
+    port: 9999, // 端口号
+    hot: true, // 是否热更新
+    open: true, // 是否自动打开浏览器
+    https: false, // 是否
+    proxy: {
+      // 代理
+      "^/api": {
+        target: "http://localhost:8080"
+        // ...
+      }
+    }
+    // ...更多详看官网
+  }
+};

完成以上配置后,就已经可以使用devServer了,但是我们还要对package.json进行简单的配置,方便我们启动devServer

json
// package.json
+{
+  // ...
+  "scripts": {
+    "dev": "webpack-dev-server --config webpack.config.js", // 开发环境
+    "build": "webpack --config webpack.config.js" // 生产环境
+  }
+}

然后我们就可以很方便的启动devServer

sh
npm run dev

配置 loader

loader 是什么? loader 用于对源代码进行转换,这正是我们现在所需要的。

下面我们介绍几个简单的loader为大家演示下使用方式,其余的依次类推

less-loader

less-loader主要用来让我们的项目可以识别lesscss 预处理器,他可以将 less 文件转换成浏览器识别的 css 文件。

针对样式文件,首先要提一下两个重要的 loader: css-loaderstyle-loader,为什么它们很重要呢?因为他们项目中使用 css 样式的最根本的 loader,不管你是使用什么css预处理器,根本的转化都是离不开他们两个

先下载依赖:

sh
npm install less less-loader css-loader style-loader -D

我们在以上的配置中,添加less-loader的配置:

js
// webpack.config.js
+module.exports = {
+  // ...
+  module: {
+    rule: [
+      {
+        test: /\\.less/, // 针对所有的 *.less 文件
+        use: [
+          // 使用loader来处理
+          /**
+           *  这里要注意loader的执行顺序,请记住这两点:
+           *  1. 自下往上
+           *  2. 自右往左
+           */
+          // less-loader -> css-loader -> style-loader
+          "style-loader",
+          "css-loader",
+          "less-loader"
+        ],
+        exclude: /node_modules/ // 忽略node-modules文件夹,也就是说不用转义这个文件夹里面的*.less文件
+      }
+    ]
+  }
+};

然后我们创建一个样式文件src/style/base.less,然后随便写一点样式进去:

less
body {
+  font-size: 12px;
+  padding: 0;
+  background-color: teal;
+}

然后再进行打包:

sh
npm run dev

如果配置没有错误的话,你先在可以看到背景色为teal

babel-loader

babel-loader可以将 JS 代码向低版本转换,我们需要使用 babel-loader

首先安装一下babel-loader

sh
npm install babel-loader -D

此外,我们还需要配置 babel,为此我们安装一下以下依赖:

sh
npm install @babel/core @babel/preset-env @babel/plugin-transform-runtime -D
+npm install @babel/runtime @babel/runtime-corejs3 -S

我们在以上的配置基础上添加配置:

js
// webpack.config.js
+module.exports = {
+  // ...
+  module: {
+    rules: [
+      // ...
+      {
+        test: /\\.jsx?$/,
+        use: {
+          loader: "babel-loader",
+          options: {
+            presets: ["@babel/preset-env"],
+            plugins: [
+              [
+                "@babel/plugin-transform-runtime",
+                {
+                  corejs: 3
+                }
+              ]
+            ]
+          }
+        },
+        exclude: /node_modules/
+      }
+    ]
+  }
+};

url-loader

url-loader帮助我们处理静态文件,如:css,image,js 等等

先下载:

sh
npm install url-loader -D

添加配置:

js
// webpack.config.js
+module.exports = {
+  // ...
+  module: {
+    rules: [
+      // ...
+      {
+        test: /\\.(png|jpe?g|svg|gif)$/,
+        use: {
+          loader: "url-loader",
+          options: {
+            limit: 200 * 1024, // 最大200kb
+            outputPath: "image", // 打包路径  dist/image
+            name: "[name].[hash:8].[ext]" // 文件名
+          }
+        }
+      }
+    ]
+  }
+};

现在试着打包吧~

sh
npm run build

现在我们可以看出多了image文件夹,里面有我们打包的图片等其他静态资源(前提:你要在 js 文件中使用图片哦~)

到这里我们已经介绍了中 loader 了,就不再往下讲了,目前 npm 上有很多 loader 提供我们使用,使用哪个 loader 你可以当场查看文档就行了,配置都是千篇一律。可以查看官网上推荐的 loader

mode

mode是在webpack4.x才发布的,用来设置代码的环境,有developmentproduction两种模式

众所周知,灵活改变 mode 需要配置环境变量,方便操作,因此为了兼容各个操作系统环境,我们需要用到cross-env

先下载cross-env:

sh
npm install cross-env -D

接着,在package.json里修改脚本:

json
// package.json
+{
+  // ...
+  "scripts": {
+    "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js",
+    "build": "cross-env NODE_ENV=production webpack --config webpack.config.js"
+  }
+}

当然我们还要在我们的配置文件中接收NODE_ENV变量来控制mode:

js
// webpack.config.js
+const isDev = process.env.NODE_ENV == "development" ? true : false;
+const config = {
+  mode: isDev ? "development" : "production"
+};
+if (isDev) {
+  // 如果是开发环境就加上 devServer
+  config.devServer = {
+    host: "0.0.0.0", // ip地址
+    port: 9999, // 端口号
+    hot: true, // 是否热更新
+    open: true, // 是否自动打开浏览器
+    https: false, // 是否
+    proxy: {
+      // 代理
+      "^/api": {
+        target: "http://localhost:8080"
+        // ...
+      }
+    }
+  };
+}
+module.exports = config;

现在我们就可以进行不同的打包啦~

sh
// 开发环境
+npm run dev
+// 生产环境打包
+npm run build

devtool

devtool 中的一些设置,可以帮助我们将编译后的代码映射回原始源代码。不同的值会明显影响到构建和重新构建的速度。

对我而言,能够定位到源码的行即可,因此,综合构建速度,在开发模式下,我设置的 devtool 的值是 cheap-module-eval-source-map

js
//webpack.config.js
+module.exports = {
+  // ...
+  //开发环境下使用
+  devtool: "cheap-module-eval-source-map"
+};

生产环境可以使用 none 或者是 source-map,使用 source-map 最终会单独打包出一个 .map 文件,我们可以根据报错信息和此 map 文件,进行错误解析,定位到源代码。

source-maphidden-source-map 都会打包生成单独的 .map 文件,区别在于,source-map 会在打包出的 js 文件中增加一个引用注释,以便开发工具知道在哪里可以找到它。hidden-source-map 则不会在打包的 js 中增加引用注释。

但是我们一般不会直接将 .map 文件部署到 CDN,因为会直接映射到源码,更希望将.map 文件传到错误解析系统,然后根据上报的错误信息,直接解析到出错的源码位置。

还可以设置其他的devtool值,你可以使用不同的值,构建对比差异。

每次打包前清空 dist 目录

反正我是懒得手动去清理的,只要你足够懒,你总是会找到好办法的,懒人推动科技进步。这里,我们需要插件: clean-webpack-plugin

安装依赖:

sh
npm install clean-webpack-plugin

以前,clean-webpack-plugin 是默认导出的,现在不是,所以引用的时候,需要注意一下。另外,现在构造函数接受的参数是一个对象,可缺省。

js
//webpack.config.js
+const { CleanWebpackPlugin } = require("clean-webpack-plugin");
+module.exports = {
+  //...
+  plugins: [
+    //不需要传参数喔,它可以找到 outputPath
+    new CleanWebpackPlugin()
+  ]
+};

现在你再修改文件,重现构建,生成的hash值和之前dist中的不一样,但是因为每次 clean-webpack-plugin 都会帮我们先清空一波 dist 目录,所以不会出现太多文件,傻傻分不清楚究竟哪个是新生成文件的情况。

不过呢,有些时候,我们并不希望整个 dist 目录都被清空,比如,我们不希望,每次打包的时候,都删除 dll 目录,以及 dll 目录下的文件或子目录,该怎么办呢?

clean-webpack-plugin 为我们提供了参数 cleanOnceBeforeBuildPatterns

js
//webpack.config.js
+module.exports = {
+  //...
+  plugins: [
+    new CleanWebpackPlugin({
+      cleanOnceBeforeBuildPatterns: ["**/*", "!dll", "!dll/**"] //不删除dll目录下的文件
+    })
+  ]
+};

此外,clean-webpack-plugin 还有一些其它的配置,不过我使用的不多,大家可以查看clean-webpack-plugin 文档

externals

externals是webpack自带的选项,告诉webpack打包时排除哪些模块,也就是这些模块是外部的,或者CDN方式引入,不需要打包

js
// webpack.config.js
+module.exports = {
+  externals: {
+    jquery: 'jQuery'  // 排除jQuery
+  }
+}

可以试试吧~

resolve

resolve也是webpack自带的选项,告诉webpack如何解析一些模块

js
// webpack.config.js
+module.exports = {
+  resolve: {
+    modules: [path.resolve('node_modules')],  // 从node_modules中解析
+    mainFields: ['style', 'main'],  // 先找style 再找main
+    // mainFile: [], // 入口文件的名字  index.js
+    extensions: ['.js', '.css', '.styl', '.json'],   // 扩展名,依次解析
+    alias: {  // 别名
+      'bootstrap': 'bootstrap/dist/css/bootstrap.css',
+      '@': path.resolve(__dirname, './src')
+    }
+  }
+}

是不是很高大上~

optimization

optimization是webpack自带的选项,用来优化项目,他主要用在生产环境下,比如:压缩代码,抽离公共代码等等~

js
// webpack.config.js
+module.exports = {
+  mode: 'production',
+  // 优化项
+  optimization: {
+    // 对没有使用的依赖,删除导入导出,减小打包体积
+    usedExports: true,  // 此选项已经内置,生产环境下默认是true
+    // 抽离公共代码块
+    splitChunks: {
+      cacheGroups: {  // 缓存组
+        common: {  // 公共模块
+          chunks: 'initial',
+          minSize: 0,
+          minChunks: 2
+        },
+        vender: {   // 第三方模块
+          priority: 1,
+          test: /node_modules/,
+          chunks: 'initial',
+          minSize: 0,
+          minChunks: 2
+        }
+      }
+    },  
+    // 压缩
+    minimizer: [
+      new UglifyJSWebpackPlugin({  // 压缩js
+        cache: true, // 缓存
+        parallel: true, // 并发打包
+        sourceMap: true // 源码映射
+      }),
+      new OptimizeCSSAssetsPlugin()  // 压缩css
+    ]
+  },
+}

watch

watch是webpack自带的属性,他可以让自动监视代码有没有修改,进行监控打包,开启后你就不用再手动进行打包了

js
// webpack.config.js
+module.exports = {
+  watch: true,
+  watchOptions: {
+    poll: 1000, // ms  每秒检查一次
+    aggregateTimeout: 500, // 防抖  500ms
+    ignored: /node_modules/
+  }
+}

noParse

noParse属于module中的属性,可以告诉webpack不解析哪些模块,比如:jQuery就没有依赖第三方模块,不需要解析jQuery

使用:

js
// webpack.config.js
+module.exports = {
+  // ...
+  module: {
+    noParse: /jQuery|lodash/
+  }
+}

webpack-merge

webpack-merge用来帮助我们合并webpack配置,我们可以根据不同的环境设置特定的webpack配置,将公共的webpack配置抽离出来使用,根据不同环境,合并公共配置完成配置,话不多说,上手吧~

下载依赖webpack-merge

sh
npm install webpack-merge -D

现在我们稍微改造下我们的配置代码,删除原来的webpack.config.js,新建webpack.dev.conf.jswebpack.prod.conf.jswebpack.base.conf.js,简单解释:

使用:

webpack公共配置:

js
// webpack.base.conf.js
+// 抽离公共配置
+module.exports = {
+  entry: path.resolve(__dirname, './src/index'),
+  output: {
+    path: path.resolve(__dirname, "./dist"),
+    filename: "js/[name].[hash:8].js"
+  },
+  externals: {   // 外部的
+    jquery: "jQuery"
+  },
+  resolve: {  // 解析第三方模块
+    modules: [path.resolve('node_modules')],
+    mainFields: ['style', 'main'],  // 先找style 再找main
+    // mainFile: [], // 入口文件的名字  index.js
+    extensions: ['.js', '.css', '.styl', '.json'],   // 扩展名,依次解析
+    alias: {  // 别名
+      'bootstrap': 'bootstrap/dist/css/bootstrap.css',
+      '@': path.resolve(__dirname, './src')
+    }
+  },
+  module: {
+    rules: [
+      {
+        test: /\\.js$/,
+        use: [
+          {
+            loader: "babel-loader?cacheDirectory=true",  // babel编译文件缓存
+            options: {
+              presets: ["@babel/preset-env"],
+              plugins: [
+                ["@babel/plugin-proposal-decorators", { legacy: true }],
+                ["@babel/plugin-proposal-class-properties", { loose: true }],
+                "@babel/plugin-transform-runtime"
+              ]
+            }
+          }
+        ],
+        exclude: /node_modules/,
+        include: path.resolve(__dirname, "./src")
+      },
+      {
+        test: /\\.css$/,
+        use: [
+          {
+            loader: devMode ? "style-loader" : MiniCssExtractPlugin.loader
+          },
+          "css-loader",
+          "postcss-loader"
+        ]
+      },
+      {
+        test: /\\.styl(us)?/,
+        use: [
+          {
+            loader: devMode ? "style-loader" : MiniCssExtractPlugin.loader
+          },
+          "css-loader",
+          "postcss-loader",
+          "stylus-loader"
+        ],
+        exclude: /node_modules/
+      },
+      {
+        test: /\\.(png|jpe?g|gif)$/,
+        use: {
+          loader: "url-loader",
+          options: {
+            // esModule: false
+            limit: 200 * 1024,
+            outputPath: "image",
+            // publicPath: '',
+            name: "[name].[hash:8].[ext]" // 文件名
+          }
+        }
+      }
+    ]
+  },
+  plugins: [
+    new MiniCssExtractPlugin({
+      filename: "style/[name].[hash:8].css"
+    }),
+    new HTMLWebpackPlugin({
+      template: path.resolve(__dirname, "index.html"),
+      minify: {
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+      },
+      filename: 'index.html',
+      // hash: true,   // js加上hash,
+      chunks: ['index']
+    }),
+    new HTMLWebpackPlugin({
+      template: path.resolve(__dirname, "index.html"),
+      minify: {
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+      },
+      filename: 'app.html',
+      chunks: ['index', 'app']
+    }),
+    new CleanWebpackPlugin(),
+    new webpack.ProvidePlugin({
+      // 全局提供插件
+      $: "jquery"
+    })
+  ]
+}

webpack开发环境配置:

js
const baseConfig = require('./webpack.base.conf')
+const Merge = require('webpack-merge')
+const path = require('path')
+const webpack = require('webpack')
+const devConfig = Merge(baseConfig, {
+  mode: 'development',
+  devServer: {
+    port: 2222,
+    hot: true,
+    open: true,
+    contentBase: path.resolve(__dirname, './dist'),
+    progress: true,
+    compress: true,
+    inline: true,
+    // 跨域请求
+    proxy: {
+      '/api': {
+        target: 'http://localhost:3000/juejin',  // 指定要跨域请求的url
+        pathRewrite: {  // 重写路径
+          '^/api': ''
+        }
+      }
+    },
+    // node方式进行跨域
+    before: app => {}
+  },
+  plugins: [
+    // 打印更新了文件的路径
+    new webpack.NamedModulesPlugin(),
+    // webpack支持热更新插件
+    new webpack.HotModuleReplacementPlugin()
+  ]
+})
+module.exports = devConfig

webpack生产环境配置:

js
const baseConfig = require("./webpack.base.conf");
+const webpack = require("webpack");
+const Merge = require("webpack-merge");
+const UglifyJSWebpackPlugin = require("uglifyjs-webpack-plugin");
+const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
+const Moment = require("moment");
+const Date = new Moment().format("YYYY-MM-DD HH:mm:ss");
+const purgecssWebpackPlugin = require('purgecss-webpack-plugin')
+const glob = require('glob')
+const prodConfig = Merge(baseConfig, {
+  mode: "production",
+  // 优化项
+  optimization: {
+    // 对没有使用的依赖,删除导入导出,减小打包体积
+    usedExports: true,  // 此选项已经内置,生产环境下默认是true
+    // 抽离公共代码块
+    splitChunks: {
+      cacheGroups: {  // 缓存组
+        common: {  // 公共模块
+          chunks: 'initial',
+          minSize: 0,
+          minChunks: 2
+        },
+        vender: {   // 第三方模块
+          priority: 1,
+          test: /node_modules/,
+          chunks: 'initial',
+          minSize: 0,
+          minChunks: 2
+        }
+      }
+    },  
+    // 压缩
+    minimizer: [
+      new UglifyJSWebpackPlugin({
+        cache: true, // 缓存
+        parallel: true, // 并发打包
+        sourceMap: true // 源码映射
+      }),
+      new OptimizeCSSAssetsPlugin()
+    ]
+  },
+  devtool: "cheap-module-eval-source-map",
+  watch: false,
+  watchOptions: {
+    poll: 1000, // ms  每秒检查一次
+    aggregateTimeout: 500, // 防抖  500ms
+    ignored: /node_modules/
+  },
+  module: {
+    // 忽略不需要解析的包   因为jQuery,lodash不需要第三方依赖
+    noParse: /jquery|lodash/, 
+  },
+  plugins: [
+    new webpack.BannerPlugin(\`
+      @Author: Mr_Wei
+      @Date: \${Date}
+      @Description: 简单的webpack配置学习
+      @Other: xxx   
+    \`),
+    // 忽略掉第三方的某些不需要的包
+    new webpack.IgnorePlugin(/\\.\\/locale/, /moment/),
+    // 去除没用的css样式代码
+    new purgecssWebpackPlugin({
+      paths: glob.sync('./src/**/*', {nodir: true})
+    })
+  ]
+});
+module.exports = prodConfig;

完成以上的配置分离,还没有结束,接下来我们修改package.json的脚本,方便我们打包

json
// package.json
+{
+  // ...
+  "scripts": {
+    "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.dev.conf.js",
+    "build": "cross-env NODE_ENV=production webpack --config webpack.prod.conf.js"
+  }
+}

大功告成,这样写配置是不是更加友好,更加便于后期的维护。

sh
// 开发环境
+npm run dev
+// 生产环境
+npm run build

最后

到这里,其实webpack的基本配置已经讲了不少了,其实还有很多详细的配置,和重要的配置,比如:dll静态库全局插件抽离css第三方包的忽略去除无用的css样式等等。

`,150);function F(D,i,y,b,u,d){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[t,s(a),s(l)])}const B=p(r,[["render",F]]);export{E as __pageData,B as default}; diff --git a/assets/article_2020_webpack-guide.md.zBMh8gpK.lean.js b/assets/article_2020_webpack-guide.md.zBMh8gpK.lean.js new file mode 100644 index 000000000..cd50e6f0d --- /dev/null +++ b/assets/article_2020_webpack-guide.md.zBMh8gpK.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"从零配置webpack工程","description":"使用webpack搭建一个完整的工程项目,webpack使用基础指南","frontmatter":{"title":"从零配置webpack工程","description":"使用webpack搭建一个完整的工程项目,webpack使用基础指南","keywords":"webpack,工程化,webpack搭建,webpack基础","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-webpack.png"},"headers":[],"relativePath":"article/2020/webpack-guide.md","filePath":"article/2020/webpack-guide.md","lastUpdated":1706247228000}'),r={name:"article/2020/webpack-guide.md"},t=o("",150);function F(D,i,y,b,u,d){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[t,s(a),s(l)])}const B=p(r,[["render",F]]);export{E as __pageData,B as default}; diff --git a/assets/article_2021_flex-layout.md.evpHdPM-.js b/assets/article_2021_flex-layout.md.evpHdPM-.js new file mode 100644 index 000000000..b210fe473 --- /dev/null +++ b/assets/article_2021_flex-layout.md.evpHdPM-.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,V as l}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"flex布局","description":"","frontmatter":{"title":"flex布局"},"headers":[],"relativePath":"article/2021/flex-layout.md","filePath":"article/2021/flex-layout.md","lastUpdated":1706247228000}'),r={name:"article/2021/flex-layout.md"},o=l('

flex布局

待补充...

参考文档

',4),n=[o];function i(c,s,_,f,d,h){return t(),a("div",null,n)}const x=e(r,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/article_2021_flex-layout.md.evpHdPM-.lean.js b/assets/article_2021_flex-layout.md.evpHdPM-.lean.js new file mode 100644 index 000000000..92c8bee29 --- /dev/null +++ b/assets/article_2021_flex-layout.md.evpHdPM-.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,V as l}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"flex布局","description":"","frontmatter":{"title":"flex布局"},"headers":[],"relativePath":"article/2021/flex-layout.md","filePath":"article/2021/flex-layout.md","lastUpdated":1706247228000}'),r={name:"article/2021/flex-layout.md"},o=l("",4),n=[o];function i(c,s,_,f,d,h){return t(),a("div",null,n)}const x=e(r,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/article_2021_js-pattern.md.Qzh4S7uy.js b/assets/article_2021_js-pattern.md.Qzh4S7uy.js new file mode 100644 index 000000000..3960daa6f --- /dev/null +++ b/assets/article_2021_js-pattern.md.Qzh4S7uy.js @@ -0,0 +1,422 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"JS中的设计模式","description":"一文了解设计模式让你的代码更加茁壮","frontmatter":{"title":"JS中的设计模式","description":"一文了解设计模式让你的代码更加茁壮","keywords":"设计模式,单例模式,发布订阅,策略模式,代理模式,装饰器模式,外观模式,工厂模式,迭代器模式,建造者模式,适配器模式等等","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2021/js-pattern.md","filePath":"article/2021/js-pattern.md","lastUpdated":1706247228000}'),c={name:"article/2021/js-pattern.md"},t=e(`

JS中的设计模式

设计模式 (Design Pattern) 是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结,任何事情都有套路,设计模式就是写代码中常见的套路,有些写法我们日常都在使用,下面我们来介绍一下。

订阅/发布模式(观察者)

pub/sub这个应该大家用到的最广的设计 模式了

在这种模式中,并不是一个对象调用另一个对象的方法,而是一个对象订阅另一个对象

特定活动并在状态改变后获得通知,订阅者因此也成为观察者,而被观察的对象成为发布者或主题。当发生了一个重要事件的时候发布者会通知(调用)所有订阅者并且可能经常以事件对象的形式传递消息。

简单的实现发布订阅设计模式:

js
// 创建EventBus
+class EventBus {
+  constructor() {
+    // 储存事件
+    this.tasks = {};
+  }
+  // 绑定事件
+  $on(eName, cb) {
+    typeof cb == "function"
+      ? this.tasks[eName] || (this.tasks[eName] = [])
+      : this.Error(cb, "is not a function");
+    this.tasks[eName].some(fn => fn == cb) 
+      ? true 
+      : this.tasks[eName].push(cb); // 避免重复绑定
+  }
+  // 触发事件
+  $emit(eName, ...arg) {
+    let taskQueue;
+    this.tasks[eName] && this.tasks[eName].length > 0
+      ? (taskQueue = this.tasks[eName])
+      : this.Error(eName, "is not defined or is a array of having empty callback");
+    taskQueue.forEach(fn => {
+      fn(...arg);
+    });
+  }
+  // 触发一次
+  $once(eName, cb) {
+    let fn = (...arg) => {
+      this.$off(eName, fn);
+      cb(...arg);
+    };
+    typeof cb == "function" && this.$on(eName, fn);
+  }
+  // 卸载事件
+  $off(eName, cb) {
+    let taskQueue;
+    this.tasks[eName] && this.tasks[eName].length > 0
+      ? (taskQueue = this.tasks[eName])
+      : this.Error(eName, "is not exist");
+    if (typeof cb === "function") {
+      let index = taskQueue.findIndex(v => (v == cb));
+      index != -1 &&
+        taskQueue.splice(
+          taskQueue.findIndex(v => (v == cb)),
+          1
+        );
+    }
+    if (typeof cb === "undefined") {
+      taskQueue.length = 0;
+    }
+  }
+  // 异常处理
+  Error(node, errorMsg) {
+    throw Error(\`\${node} \${errorMsg}\`);
+  }
+}

下面我们针对自己的模式进行简单的使用:

js
// 首先定义一个事件池
+const EventSinks = {
+  add(x, y) {
+    console.log("总和: " + x + y);
+  },
+  multip(x, y) {
+    console.log("乘积: " + x * y);
+  },
+  onceEvent() {
+    console.log("我执行一次后就自动卸载");
+  }
+};
+// 实例化对象
+let bus = new EventBus();
+bus.$on("operator", EventSinks.add); // 监听operator事件, 增加一个EventSinks.add
+bus.$on("operator", EventSinks.add); // 当事件名和回调函数相同时,跳过,避免重复绑定
+bus.$on("operator", EventSinks.multip); // 给operator事件增加一个EventSinks.multip回调函数
+bus.$once("onceEvent", EventSinks.onceEvent); // 触发一次后卸载
+console.log(bus.tasks); // { operator: [ [Function: add], [Function: multip] ], onceEvent: [ [Function: fn] ]}
+bus.$emit("operator", 3, 5); // 总和:8  乘积:15
+bus.$emit("onceEvent"); // 我就执行一次
+console.log(bus.tasks); // { operator: [ [Function: add], [Function: multip] ], onceEvent: [] }
+bus.$off("operator", EventSinks.add); // 卸载掉operator事件中的EventSinks.add函数体
+console.log(bus.tasks); // { operator: [ [Function: multip] ], onceEvent: [] }
+bus.$off("operator"); // 卸载operator事件的所有回调函数
+console.log(bus.tasks); // { operator: [], onceEvent: [] }
+bus.$emit("onceEvent"); // onceEvent is not defined or is a array of having empty callback

单例模式

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,否则就创建实例再返回,这就保证了一个类只实例化一次

使用场景:一个单一对象。比如:弹窗,无论点击多少次,弹窗只应该被创建一次,实现起来也很简单,用一个变量缓存起来即可。可以参考ElementUI模态框的实现

简单实现单例模式(只要有个变量确保实例只创建一次):

js
class Singleton {
+  constructor() {}
+}
+Singleton.getInstance = (function() {
+  let instance
+  return function() {
+    if (!instance) {
+      instance = new Singleton()
+    }
+    return instance
+  }
+})()
+let s1 = Singleton.getInstance()
+let s2 = Singleton.getInstance()
+console.log(s1 === s2) // true

当我们再次创建时,如果实例化了,就不在实例化,直接返回,上面可以看出,二者相同

策略模式

策略模式的定义:定义一系列的算法,把他们一个个封装起来,并且使他们可以互相替换 策略模式的目的就是将算法的使用、算法的实现分离出来

一个基于策略模式的程序至少由两部分组成。第一部分是一组策略类(可变),策略类封装了具体的算法,并负责具体的计算过程。第二部分是环境类Context(不变),Context接受客户的请求,随后将请求委托给某一个策略类。要做到这一点,说明Context中要维持对某个策略对象的引用

举个表单校验栗子:

js
// 普通写法
+const form = document.querySelector("#form");
+form.onsubmit = () => {
+  if (form.username.value == "") {
+    console.log("用户名不能为空");
+    return false;
+  }
+  if(form.username.password.length < 10){
+    console.log('密码长度不能小于10')
+    return false
+  }
+}

简单的策略模式

js
// 创建校验器
+const checker = {
+  isEmpty(v, errorMsg){
+    if(value === ''){
+      return errorMsg
+    }
+  },
+  minLength(v, length, errorMsg){
+    if(value.length < length){
+      return errorMsg
+    }
+  }
+}
+const validator = () => {
+  // 校验规则存储
+  this.cache = []
+}
+validator.prototype.add = () => {
+  let arr = rule.split(':')
+  this.cache.push(() => {
+    let valit = arr.shift()
+    arr.unshift(dom.value)
+    arr.push(errorMsg)
+    return checker[valit].apply(dom, arr)
+  })
+}
+validator.prototype.start = () => {
+  for(let i = 0, validatorFunc; validatorFunc = this.cache[i++];){
+    // 开始校验,并取得校验后的返回值
+    let msg = validatorFunc() 
+    if(msg){
+      return msg
+    }
+  }
+}
+const validatorFunc = () => {
+  // 创建一个validator对象
+  let valit = new validator() 
+  valit.add(form.username, 'isEmpty', '用户名不能为空')
+  valit.add(form.password, 'minLength', '密码长度不能小于10')
+  // 获得校验结果
+  let errorMsg = valit.start()  
+  return errorMsg  
+}
+// 再次登录
+const form = document.querySelector("#form");
+form.onsubmit = () => {
+  let errorMsg = validatorFunc()
+  if(errorMsg){
+    console.error(errorMsg)
+    return false
+  }
+}

当创建校验器后,校验规则清晰明了,可以动态增改,便于维护

代理模式

为一个对象提供一个代用品或占位符,以便控制它的访问 常用的虚拟代理形式:某一个花销很大的操作,可以通过虚拟代理的方式延迟这种需要他的时候才去创建(例:使用虚拟代理实现图片懒加载)

图片懒加载的方式:先通过一张loading图占位,然后通过异步的方式加载图片,等图片加载好了再把请求成功的图片加载到img标签上

栗子:

js
const imgFunc = (() => {
+    const imgNode = document.createElement('img')
+    document.body.appendChild(imgNode)
+    return{
+        setSrc: function(src){
+            imgNode.src = src
+        }
+    }
+})()
+const proxyImage = (() => {
+    let img = new Image()
+    img.onload = function(){
+        imgFunc.setSrc(this.src)
+    }
+    return {
+        setSrc: function(src){
+            imgFunc.setSrc('./loading.gif')
+            img.src = src
+        }
+    }
+})()
+proxyImage.setSrc('./pic.png')()

上面的栗子实现了加载图片时,在图片加载成功前,指定特定的图片,加载完成后替换成真是的数据

在我们生活中常用的事件代理、节流防抖函数其实都是代理模式的实现

装饰器模式

在不改变对象自身的基础上,在程序运行期间给对象动态地添加方法,注解也可以理解为装饰器。常见应用:react的高阶组件,或者react-redux中的@connect或者自己定义一些高阶组件 简单实现:

js
import React from 'react'
+const withLog = Component => {
+  // 完好无损渲染出来, 只是添加了两个生命周期函数
+  class NewComponent extends React.Component{
+    // 1
+    componentWillMount(){ 
+      console.time('ComponentRender')
+      console.log('准备完毕了')
+    }
+    render(){  // 完好无损渲染出来
+      return <Component { ...this.props }></Component>
+    }
+    // 2
+    componentDidMount(){
+      console.timeEnd('ComponentRender')
+      console.log('渲染完毕了')
+    }
+  }
+  return NewComponent
+}
+export { withLog }
+@withLog
+class xxx

在redux中可以找出装饰器的方式,其实Vue中的v-inputv-checkbox也可以认为是装饰器模式,对原生input和checkbox做一层装饰

装饰器模式和代理模式的结构看起来非常相似,这两种模式都描述了怎样为对象提供一定程度上的间接引用,并且向那个对象发送请求。代理模式和装饰器模式最重要的区别在于它们的意图和设计目的。代理模式的目的是:当直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者。装饰模式目的是:为对象动态加入的行为,本体定义了关键功能,而装饰器提供或拒绝它的访问,或者在访问本体前做一些额外的事。

外观模式

即在内部让多个方法一起被调用 涉及到兼容性,参数支持多格式,有很多这种代码,对外暴露统一API,比如上面的$on支持数组,$off参数支持多种情况,对面只用一个函数,内部判断实现

举个简单的栗子:

js
// 封装一些事件,让其兼容各个浏览器
+const myEvent = {
+  stopBubble(e){
+    if(typeof e.preventDefault() === 'function'){
+      e.preventDefault()
+    }
+    if(typeof e.stopPropagation() === 'function'){
+      e.stopPropagation()
+    }
+    // for IE
+    if(typeof e.returnValue === 'boolean'){
+      e.returnValue = false
+    }
+    if(typeof e.cancelBubble === 'boolean'){
+      e.cancelBubble = false
+    }
+  },
+  addEvent(dom, type, cb){
+    if(dom.addEventListener){
+      dom.addEventListener(type, cb, false)
+    } else if(dom.attachEvent){
+      dom.attachEvent('on' + type, cb)
+    }else{
+      dom['on' + type] = cb
+    }
+  }
+}

以上就用外观模式封装了两个基本事件,让其兼容各种浏览器,调用者不需要知道内部的构造,只要知道这个方法怎么用就行了。

工厂模式

提供创建对象的接口,把成员对象的创建工作转交给一个外部对象,好处就是消除对象直接的耦合(也就是相互影响) 常见的栗子,我们的弹窗message,对外部提供API,都是调用API,然后新建一个弹窗或者message的实例,就是典型的工厂模式

简单的栗子:

js
class Man {
+  constructor(name) {
+    this.name = name
+  }
+  say(){
+      console.log(\`我的名字 \` + this.name)
+  }
+}
+const p = new Man('JavaScript')
+p.say() // 我的名字 JavaScript

当然工厂模式并不仅仅是用来 new 出实例

可以想象一个场景。假设有一份很复杂的代码需要用户去调用,但是用户并不关心这些复杂的代码,只需要你提供给我一个接口去调用,用户只负责传递需要的参数,至于这些参数怎么使用,内部有什么逻辑是不关心的,只需要你最后返回我一个实例。这个构造过程就是工厂。

再比如下面Vue这个例子:

js
const Notification = function(options) {
+  if (Vue.prototype.$isServer) return;
+  options = options || {};
+  let userOnClose = options.onClose;
+  let id = "notification_" + seed++;
+  let postion = options.postion || "top-right";
+  options.onClose = function() {
+    Notification.close(id, userOnClose);
+  };
+  instance = new NotificationConstructor({
+    data: options
+  });
+  if(isVNode(options.message)){
+    instance.$slots.default = [options.message]
+    options.message = 'REPLACED_BY_VNODE'
+  }
+  instance.id = id
+  instance.$mount()
+  document.body.appendChild(instance.$el)
+  instance.visible = true
+  instance.dom = instance.$el
+  instance.dom.style.zIndex = PopupManager.nextZIndex()
+  let verticalOffset = options.offset || 0
+  instances.filter(item => {
+    verticalOffset += item.$el.offsetHeight + 16
+  })
+  verticalOffset += 16
+  instance.verticalOffset = verticalOffset
+  instances.push(instance)
+  return instance
+};

在上述代码中,我们可以调用它封装好的方法就可以创建对象实例,至于它内部的实现原理我们并不关心。

建造者模式Builder

和工厂者模式相比,参与了更多创建过程或者更加复杂

js
const Person = function(name, work){
+  // 创建应聘者缓存对象
+  let _person = new Human()
+  // 创建应聘者姓名解析对象
+  _person.name = new NamedNodeMap(name)
+  // 创建应聘者期望职位
+  _person.work = new Worker(work)
+  return _person
+}
+const p = new Person('小明', 'Java')
+console.log(p)

迭代器模式

指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 比如常用的:every、map、filter、forEach等等

js
const each = function(arr, callback){
+  if(!Array.isArray(arr)){
+    throw Error(\`\${arr} is not a Array\`)
+  }
+  for(let i = 0, l = arr.length; i < l; i++){
+    callback.call(arr[i], i, arr[i])
+  }
+}
+each([1,2,4], function(i, n){
+  console.log([i, n])
+})

享元模式

一种用于性能优化的模式,fly在这里是苍蝇的意思,意为蝇量级。享元模式的核心是运用共享技术来有效支持大量细粒度的对象。如果系统中因为创建了大量类似的对象而导致内存占用过高,享元模式就是非常有用了。在JavaScript中,浏览器特别是移动端的浏览器分配的内存并不多,如何节省内存就成了一件非常有意义的事情 假设有个内衣工厂,目前的产品有50中男衣和50中女士内衣,为了推销产品,工厂决定生产一些塑料模特来穿上他们的内衣拍成广告照片。正常情况下需要50个男模特和50个女模特,然后让他们每人分别穿上一件内衣来拍照

普通的做法:

js
const Model = function(sex, underwear){
+  this.sex = sex
+  this.underwear = underwear
+}
+Model.prototype.takePhoto = function(){
+  console.log('sex=' + this.sex + ' underwear=' + this.underwear)
+}
+for(let i = 1; i <= 50; i++){
+  let maleModel = new Model('male', 'underwear' + i)
+  maleModel.takePhoto()
+}
+for(let join = 1; join <= 50; join++){
+  let femaleModel = new Model('female', 'underwear' + join)
+  femaleModel.takePhoto()
+}

采用享元模式:

js
const Model = function(sex){
+  this.sex = sex
+}
+Model.prototype.takePhoto = function(){
+  console.log('sex=' + this.sex + ' underwear=' + this.underwear)
+}
+// 分别创建一个男模特和一个女模特对象
+let maleModel = new Model('male'),
+    femaleModel = new Model('female')
+// 给男模特依次穿上所有的男装,并进行拍照
+for(let i = 1; i <= 50; i++){
+  maleModel.underwear = 'underwear' + i
+  maleModel.takePhoto()
+}
+// 给女模特依次穿上所有的女装,并进行拍照
+for(let j = 1; j <= 50; j++){
+  femaleModel.underwear = 'underwear' + j
+  femaleModel.takePhoto()
+}

职责链模式

使多个对象都有机会处理请求,从而避免请求发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。职责链模式的名字非常形象,一系列可能会处理请求的对象被连成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,我们把这些对象称为链中的节点

简单的栗子:假设我们负责一个售卖手机的电商网站,分别经过缴纳500元定金和200元定金的两轮预定后(订单已在此时生成),现在已经到了正式购买的阶段。公司针对支付过预定金的用户有一定的优惠政策。在正式购买后,已经支付过500元定金的用户会受到100元的商城优惠券,200元定金的用户可以收到50元的优惠券,而之前没有支付定金的用户只能进入普通购买模式,也就是没有优惠券,且在存库有限的情况下不一定保证买到

js
let order500 = function(orderType, pay, stock) {
+  if (orderType === 1 && pay === true) {
+    console.log("500元定金预购,得到100元优惠券");
+  } else {
+    // 我不知道下一个节点是谁,反正把请求往后面传递
+    return "nextSuccessor";
+  }
+};
+let order200 = function(orderType, pay, stock) {
+  if (orderType === 2 && pay === true) {
+    console.log("200元定金预购,得到50元优惠券");
+  } else {
+    return "nextSuccessor";
+  }
+};
+let orderNormal = function(orderType, pay, stock) {
+  if (stock > 0) {
+    console.log("普通购买, 无优惠券");
+  } else {
+    console.log("库存不足");
+  }
+};
+let Chain = function(fn) {
+  this.fn = fn;
+  this.successor = null;
+};
+// Chain.prototype.setNextSuccessor 指定在链中的下一个节点
+Chain.prototype.setNextSuccessor = function(successor) {
+  return (this.successor = successor);
+};
+// Chain.prototype.passRequest 传递请求给某个节点
+Chain.prototype.passRequest = function() {
+  let ret = this.fn.apply(this, arguments);
+  if (ret === "nextSuccessor") {
+    return (
+      this.successor &&
+      this.successor.passRequest.apply(this.successor, arguments)
+    );
+  }
+  return ret;
+};
+let chainOrder500 = new Chain(order500)
+let chainOrder200 = new Chain(order200)
+let chainOrderNormal = new Chain(orderNormal)
+chainOrder500.setNextSuccessor(chainOrder200)
+chainOrder200.setNextSuccessor(chainOrderNormal)
+// 500元定金预购,得到100元优惠券
+chainOrder500.passRequest(1, true, 500)
+// 200元定金预购,得到50元优惠券
+chainOrder500.passRequest(2, true, 500)
+// 普通购买,无优惠券
+chainOrder500.passRequest(3, true, 500)
+// 库存不足
+chainOrder500.passRequest(1, false, 0)

适配器模式

解决两个软件实体间的接口不兼容的问题。使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作。适配器的别名是包装器(wrapper),这是一个相对简单的模式。在程序开发过程中有许多这样的场景:当我们试图调用模块或者对象的某个接口时,却发现这个接口的格式并不符合目前需求。这时候有两种解决办法,第一种是修改原来的接口实现,但如果原来的模板很复杂,或者我们拿到模块是一段别人编写的经过压缩的代码,修改原接口就显得不太现实了。第二种方法是创建一个适配器,将原接口转换为客户希望的另一个接口,客户只需要和适配器打交道

js
let googleMap = {
+  show: function(){
+    console.log('开始渲染谷歌地图')
+  }
+}
+let baiduMap = {
+  display: function(){
+    console.log('开始渲染百度地图')
+  }
+}
+let baiduMapAdapter = {
+  show: function(){
+    return baiduMap.display()
+  }
+}
+renderMap(googleMap)  // 开始渲染谷歌地图
+renderMap(baiduMapAdapter)  // 开始渲染百度地图

适配器模式主要用来解决两个已有接口不匹配的问题,它不考虑这接口时怎么实现的,也不考虑他们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够使他们协同作用

装饰模式和代理模式也不会改变原有对象的接口,但装饰器模式的作用是为了给对象增加功能。装饰器模式常常形成一条长的装饰链,适配器模式通常只包装一次。代理模式为了控制对对象的访问,通常也只包装一次。

我们设计很多插件,有默认值,也算是适配器的一种应用,vue的prop校验,default也算是适配器的应用了

外观模式的作用倒是和适配器比较相似,有人把外观模式看成一组对象的适配器,但外观模式最显著的特点是定义了一个新的接口。

模板方法模式

在一个方法中定义一个算法骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现 我们常用的有很多,vue中的slot,react中的children

js
class Parent {
+  constructor() {}
+  render() {
+    <div>
+      <div name="tom"></div>
+      {/* 算法过程:children要渲染在name为joe的div中 */}
+      <div name="joe">{this.props.children}</div>
+    </div>
+  }
+}
+class Stage{
+  constructor(){}
+  render(){
+    // 在parent中已经设定了children的渲染位置算法
+    <Parent>
+      // children的具体实现
+      <div>child</div>
+    </Parent>
+  }
+}
html
<template>
+  <div>
+    <div name="tom"></div>
+    <div name="joe">
+      <slot />
+    </div>
+  </div>
+</template>
+<template>
+  <div>
+    <parent>
+      <!-- children的具体实现 -->
+      <div>child</div>
+    </parent>
+  </div>
+</template>

中介者模式

通过一个中介者对象,其他所有的相关对象都通过该中介者来通信,而不是相互引用,当其中的一个对象发生改变时,只需要通知中介者对象即可。通过中介者模式可以解除对象与对象之间的紧耦合关系(目的就是减少耦合) 栗子:现实生活中,航线上的飞机只需要和机场的塔台通信就能确定航线和飞行状态,而不需要和所有飞机通信。同时塔台作为中介者,知道每架飞机的飞行状态,所以可以安排所有飞机的起降和航信安排。

中介者模式使用场景:例如购物车需求,存在商品选择表单、颜色选择表单、购买数量表单等等,都会触发change事件,那么可以通过中介者来转发处理这些事件,实现各个事件间的解耦,仅仅维护中介者对象即可。

redux、vuex都属于中介者模式的实际应用,我们把共享的数据,抽离成一个单独的store,每个都通过tore这个中介者来操作对象

备忘录模式

可以恢复到对象之前的某个状态,其实大家学习react或者redux的时候,时间旅行的功能,就算是备忘录模式的一个应用

总结

创建设计模式:工厂,单例、建造者、原型 结构化设计模式:外观,适配器,代理,装饰器,享元,桥接,组合 行为型模式:策略、模板方法、观察者、迭代器、责任链、命令、备忘录、状态、访问者、终结者、解释器

参考文档

`,88);function F(D,y,i,B,b,A){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const m=p(c,[["render",F]]);export{E as __pageData,m as default}; diff --git a/assets/article_2021_js-pattern.md.Qzh4S7uy.lean.js b/assets/article_2021_js-pattern.md.Qzh4S7uy.lean.js new file mode 100644 index 000000000..9172aee21 --- /dev/null +++ b/assets/article_2021_js-pattern.md.Qzh4S7uy.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"JS中的设计模式","description":"一文了解设计模式让你的代码更加茁壮","frontmatter":{"title":"JS中的设计模式","description":"一文了解设计模式让你的代码更加茁壮","keywords":"设计模式,单例模式,发布订阅,策略模式,代理模式,装饰器模式,外观模式,工厂模式,迭代器模式,建造者模式,适配器模式等等","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"article/2021/js-pattern.md","filePath":"article/2021/js-pattern.md","lastUpdated":1706247228000}'),c={name:"article/2021/js-pattern.md"},t=e("",88);function F(D,y,i,B,b,A){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const m=p(c,[["render",F]]);export{E as __pageData,m as default}; diff --git a/assets/article_2021_performance-tools.md.G4md1C7p.js b/assets/article_2021_performance-tools.md.G4md1C7p.js new file mode 100644 index 000000000..5f8fca470 --- /dev/null +++ b/assets/article_2021_performance-tools.md.G4md1C7p.js @@ -0,0 +1,3 @@ +import{_ as n,c as o,J as e,V as i,o as p,G as a}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"前端性能测试工具","description":"前端性能测试工具推荐,性能测试工具有哪些","frontmatter":{"title":"前端性能测试工具","description":"前端性能测试工具推荐,性能测试工具有哪些","keywords":"前端性能优化,性能测试工具,PageSpeed Insights,Lighthouse,SiteSpeed,Speedcurve,webpagetest","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-perf.png"},"headers":[],"relativePath":"article/2021/performance-tools.md","filePath":"article/2021/performance-tools.md","lastUpdated":1706247228000}'),l={name:"article/2021/performance-tools.md"},r=i(`

前端性能测试工具

PageSpeed Insights

谷歌开发的一个免费的网页分析工具,在地址栏中输入被分析的网站 url 地址,点击分析,在地址栏中输入被分析的网站 url 地址,点击分析

可模拟移动设备访问页面结果分析 桌面设备访问页面结果分析 前端开发工程师,可以根据这个报告进行页面优化

Lighthouse

Lighthouse 是谷歌开源的一款 Web 前端性能测试工具,用于改进网络应用的质量,适用于网页版和移动端。能生成一个包括页面性能、PWA(Progressive Web apps,渐进式 Web 应用)、可访问性(无障碍)、最佳实践、SEO 的报告清单提供参考,看看可以采取哪些措施来改进您的应用。

使用方法

测试某网站

  1. 访问被测网站,打开浏览器的开发者工具 sitespeed01-06288c1d.png

  2. 点击【生成报告】 就会自动分析你访问的网站,得出性能分析报告 sitespeed02-f43bb52a.png

这款工具,大家在用浏览器访问任意一个页面(包括需要登录,才能访问的页面),想要对这个页面进行性能分析都非常简单。

SiteSpeed

SiteSpeed 也是一款开源的,可以用于监控和检查网站性能的工具。可以通过 docker 镜像或 npm 方式来使用。这个工具,并不是单一的,而是一组工具集合,可以根据自己需要,选择适合自己的工具。

安装

bash
sudo docker run --rm -v "$(pwd):/sitespeed.io"
+sitespeedio/sitespeed.io:14.4.0 https://www.taobao.com/
bash
$ npm install -g sitespeed.io   # 安装
+$ sitespeed.io https://www.taobao.com/  # 测试淘宝网站

测试

测试结束后,会把测试结果写到 HTML 文件 Snipaste20200901sitespeed01-2c335bdc.png

Speedcurve

Speedcurve 是一个前端性能综合监控网站,可以在网站输入被测网站的 url 地址,进行测试 iShot2022-03-27 09.46.41.png

选择要默认访问网站的设备,进行模拟访问 iShot2022-03-27 09.49.27.png

你也可以将js脚本添加到网站中 iShot2022-03-27 09.50.19.png

访问后,网站会给出一份性能测试监控报告 Snipaste20200901speedcurve04-40399a17.png

webpagetest

webpagetest 和上面的 speedcurve 相似,也是在一个网站中,输入被测试的网站 ip 地址,就可以对被测网站页面进行分析。但是,这个网站在国内,被友好的和谐了,会出现无法正常进行测试的情况。 Snipaste20200901webpagetest01-06e3b767.png

好了,这些是现在比较方便的前端性能测试工具,你都了解吗?可能有同学会说为什么没有 yslow,嗯,这个也是前端性能测工具,但是,你可以去搜索下,看下你现在的电脑上能非常方便的使用这个工具吗?yslow,不可否认,是一款经典的 Web 端性能测试工具,但是现在使用起来非常的不方便,所以现在你想去学习这款工具,可能事被功半,收不到预期的效果,所以,个人不推荐大家学习这款工具了。

`,28);function c(h,d,g,u,m,b){const s=a("Reward"),t=a("Gitalk");return p(),o("div",null,[r,e(s),e(t)])}const _=n(l,[["render",c]]);export{v as __pageData,_ as default}; diff --git a/assets/article_2021_performance-tools.md.G4md1C7p.lean.js b/assets/article_2021_performance-tools.md.G4md1C7p.lean.js new file mode 100644 index 000000000..d9cac2f31 --- /dev/null +++ b/assets/article_2021_performance-tools.md.G4md1C7p.lean.js @@ -0,0 +1 @@ +import{_ as n,c as o,J as e,V as i,o as p,G as a}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"前端性能测试工具","description":"前端性能测试工具推荐,性能测试工具有哪些","frontmatter":{"title":"前端性能测试工具","description":"前端性能测试工具推荐,性能测试工具有哪些","keywords":"前端性能优化,性能测试工具,PageSpeed Insights,Lighthouse,SiteSpeed,Speedcurve,webpagetest","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-perf.png"},"headers":[],"relativePath":"article/2021/performance-tools.md","filePath":"article/2021/performance-tools.md","lastUpdated":1706247228000}'),l={name:"article/2021/performance-tools.md"},r=i("",28);function c(h,d,g,u,m,b){const s=a("Reward"),t=a("Gitalk");return p(),o("div",null,[r,e(s),e(t)])}const _=n(l,[["render",c]]);export{v as __pageData,_ as default}; diff --git a/assets/article_2021_pwa-app.md.edqGSum2.js b/assets/article_2021_pwa-app.md.edqGSum2.js new file mode 100644 index 000000000..bfd822a39 --- /dev/null +++ b/assets/article_2021_pwa-app.md.edqGSum2.js @@ -0,0 +1,78 @@ +import{_ as s,c as n,o as a,V as l}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"PWA渐进式应用","description":"PWA渐进式应用","frontmatter":{"title":"PWA渐进式应用","description":"PWA渐进式应用","keywords":"渐进式应用,离线app,webApp","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-pwa.png"},"headers":[],"relativePath":"article/2021/pwa-app.md","filePath":"article/2021/pwa-app.md","lastUpdated":1706247228000}'),p={name:"article/2021/pwa-app.md"},o=l(`

PWA渐进式应用

需要manifestserviceWorker

出现条件:

安装条件:

html
<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>xxx</title>
+    <meta name="description" content="A list of A-Frame entries submitted to the js13kGames 2017 competition, used as an example for the MDN articles about Progressive Web Apps.">
+    <meta name="author" content="end3r">
+    <meta name="theme-color" content="#B12A34">
+    <meta name="description" content="A list of A-Frame entries submitted to the js13kGames 2017 competition, used as an example for the MDN articles about Progressive Web Apps.">
+    <meta name="author" content="end3r">
+    <meta property="og:image" content="icons/icon.png">
+    <link rel="shortcut icon" href="favicon.ico">
+    <link rel="manifest" href="manifest.json">
+</head>
+<body>
+
+    <h2>hello...</h2>
+    
+    <script>
+        if ("serviceWorker" in navigator) {
+            window.addEventListener("load", () => {
+                navigator.serviceWorker.register("worker.js").then(res => {
+                    console.log("register")
+                }).catch(err => {
+                    console.log(err)
+                })
+            })
+        }
+    </script>
+</body>
+</html>
js
// worker.js
+self.addEventListener("install", (event) => {
+    console.log("install")
+    event.waitUnit(self.skipWaiting())
+})
+
+self.addEventListener("activate", (event) => {
+    console.log("activate")
+    event.waitUnit(self.clients.claim())
+})
+
+
+self.addEventListener("fetch", (event) => {
+    console.log("fetch")
+})
json
// manifest.json
+{
+    "name": "hengshuai's blog",
+    "short_name": "hengshuai's blog",
+    "description": "a progress blog app for sharing web development experiences...",
+    "icons": [
+          {
+            "src": "/384.png",
+            "sizes": "384x384",
+            "type": "image/png"
+          },
+          {
+            "src": "/256.png",
+            "sizes": "256x256",
+            "type": "image/png"
+          },
+          {
+            "src": "/192.png",
+            "sizes": "192x192",
+            "type": "image/png"
+          },
+          {
+            "src": "/128.png",
+            "sizes": "128x128",
+            "type": "image/png"
+          }
+    ],
+    "start_url": "https://blog.usword.cn",
+    "display": "minimal-ui",
+    "theme_color": "#747bff",
+    "background_color": "#747bff"
+}

参考文章

`,11),e=[o];function t(r,c,F,D,y,i){return a(),n("div",null,e)}const m=s(p,[["render",t]]);export{b as __pageData,m as default}; diff --git a/assets/article_2021_pwa-app.md.edqGSum2.lean.js b/assets/article_2021_pwa-app.md.edqGSum2.lean.js new file mode 100644 index 000000000..c1525db80 --- /dev/null +++ b/assets/article_2021_pwa-app.md.edqGSum2.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,V as l}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"PWA渐进式应用","description":"PWA渐进式应用","frontmatter":{"title":"PWA渐进式应用","description":"PWA渐进式应用","keywords":"渐进式应用,离线app,webApp","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-pwa.png"},"headers":[],"relativePath":"article/2021/pwa-app.md","filePath":"article/2021/pwa-app.md","lastUpdated":1706247228000}'),p={name:"article/2021/pwa-app.md"},o=l("",11),e=[o];function t(r,c,F,D,y,i){return a(),n("div",null,e)}const m=s(p,[["render",t]]);export{b as __pageData,m as default}; diff --git a/assets/article_2021_ts-decorator.md.XWu9IBvE.js b/assets/article_2021_ts-decorator.md.XWu9IBvE.js new file mode 100644 index 000000000..643bf5db4 --- /dev/null +++ b/assets/article_2021_ts-decorator.md.XWu9IBvE.js @@ -0,0 +1,325 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"Typescript装饰器指南","description":"这是一篇Typescript装饰器使用指南,教大家理解什么装饰器,装饰器的作用","frontmatter":{"title":"Typescript装饰器指南","description":"这是一篇Typescript装饰器使用指南,教大家理解什么装饰器,装饰器的作用","keywords":"Typescript装饰器,ts装饰器,装饰器,类装饰器,参数装饰器,属性装饰器,方法装饰器,访问装饰器,装饰器模式,设计模式,Typescript Decorator","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-ts.png"},"headers":[],"relativePath":"article/2021/ts-decorator.md","filePath":"article/2021/ts-decorator.md","lastUpdated":1706247228000}'),t={name:"article/2021/ts-decorator.md"},c=e(`

Typescript装饰器指南

Typescript装饰器模式,可以有效的提高开发效率,就像Java那种注解;装饰器让TypeScript的世界更好。 我们使用的许多库都基于这一强大特性构建, 例如AngularNestjs。 在这文章中我将介绍装饰器和它的许多细节。 我希望在读完这篇文章后,你可以理解何时和如何使用这一强的的特性。

概念

装饰器本身就是一种特殊的函数,被用于类的各个属性(类本身、类属性、类方法、类访问器、类方法的参数),装饰器就像高阶函数一样,对目标做了一层中间操作,可以很简洁的无痛修改一些功能和做一些有趣的功能

一个小例子:

tsx
// 日志打印
+function logger(key: string): any {
+  return function () {
+    console.log("call: \\t\\t", key);
+  };
+}
+
+class HTTP {
+  @logger("get")
+  static get(url?: string) {
+    return url;
+  }
+}
+HTTP.get();  // 打印 call: get

装饰器类别

前面说了装饰器主要是用于类中,所以就有类、类方法、类属性、类访问器属性、类方法参数装饰器,接下来我们就一个个介绍

在介绍装饰器前,先介绍个工具库,在装饰器中反射往往发挥着很大作用,reflect-metadata库通常在装饰器中都会使用,接下来介绍下其基本作用

Reflect-metadata(元数据)

严格地说,元数据和装饰器是EcmaScript中两个独立的部分。 然而,如果你想实现像是反射这样的能力,你总是同时需要它们。有了reflect-metadata的帮助, 我们可以获取编译期的类型。
借助reflect-metadata,编译器可以拿到的类型有三种:

这三种方式拿到的结果都是构造函数(例如String和Number)。规则是:

类装饰器

类型:

tsx
type ClassDecorator = <Func extends Function>(target: Func) => Func | void;

参数:

用途:

类装饰器可以继承现有类添加或修改一些属性或方法

tsx
// 扩展一个toString方法
+type Consturctor = { new (...args: any[]): any };
+
+function toString<T extends Consturctor>(target: T): T {
+  return class extends target {
+    public toString() {
+      return JSON.stringify(this);
+    }
+  };
+}
+
+@toString
+class Car {
+  constructor(public prize: number, public name: string) {}
+}
+
+// ts不会智能的推导出toString方法
+console.log(new Car(1000, "BMW").toString()); // {"prize":1000,"name":"BMW"}

属性装饰器

类型:

tsx
type PropertyDecorator = (target: Record<string|symbol, any>, prop: string | symbol) => any | void

参数:

用途:

属性装饰器可以收集信息,反射赋值,给类添加方法等等,下面介绍一个完整的例子

tsx
import "reflect-metadata"; // 这里需要借助一个反射库
+
+type Constructor = { new (...args: any): any }
+
+// 用来管理所有可注入的service
+const services: Map<Constructor, Constructor> = new Map();
+
+// 注入装饰器
+function Inject<T extends Constructor>(target: T) {
+  services.set(target, target);
+}
+// 获取注入的service装饰器
+function Service(target: Record<string|symbol, any>, key: string | symbol) {
+  const service = services?.get(Reflect.getMetadata("design:type", target, key));
+  service && (target[key] = new service());
+}
+
+// 常量装饰器
+function constant(value: any) {
+  return function (target: object, key: string) {
+    Object.defineProperty(target, key, {
+      enumerable: false,
+      configurable: false,
+      get() {
+        return value;
+      },
+      set() {
+        return value;
+      },
+    });
+  };
+}
+
+// 用户相关Service
+// 让当前service变成可注入
+@Inject
+class UserService {
+        // 模拟获取用户信息
+  public getUser(...args: any) {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve("user")
+      }, 1000)
+    })
+  }
+}
+
+// 用户页面
+class UserPage extends React.Component{
+  @Service  // 注入UserService
+  public service: UserService;
+
+  // 让BASE_URL变成常量
+  @constant(process.env.BASE_URL || 'https://www.baidu.com')
+  private _BASE_URL: string;
+
+  public getUser() {
+    console.log(this.service)
+    return this.service?.getUser({ BASE_URL: this._BASE_URL })
+  }
+
+  render() {
+    return <>
+      <button onClick={this.getUser}>获取用户信息</button>
+    </>
+  }
+}

上面点击获取用户信息按钮就会去请求用户的信息,打印结果如下

https://s3.bmp.ovh/imgs/2022/06/30/a4db1835bc490571.png

方法装饰器

类型:

tsx
Type MethodDecorator = (target: Record<string|symbol, any>, 
+prop: string | symbol, descriptor: PropertyDescriptor) => PropertyDescriptor |  void

参数:

用途:

方法装饰器可以高阶目标方法,做一些参数转换,数据收集等等,如日志收集

tsx
// 接着上面的介绍,做一个日志收集logger
+
+// 日志收集
+function logger(target: object, key: string, descriptor: PropertyDescriptor) {
+  const origin = descriptor.value;
+  descriptor.value = async function (...args: any[]) {
+    try {
+      const start = +new Date();
+      const rs = await origin.call(this, ...args);
+      const end = +new Date();
+
+      // 打印请求耗时
+      console.log(\`@logger: \${key} api request spend\`, \`\${end - start}ms.\`);
+
+      // 这里可以做一些相关收集...
+      return rs;
+    } catch (err) {
+      console.log(err);
+    }
+  };
+}
+
+@Inject
+class UserService {
+  @logger
+  // 登录Request
+  async postLogin(username: string) {
+    const time = Math.floor(Math.random() * 10 * 1000);
+    const rs = await new Promise((resolve, reject) => {
+      setTimeout(() => {
+        if (Math.floor(Math.random() * 26) % 10) {
+          resolve(username + ' logined success...');
+        } else {
+          reject('error');
+        }
+      }, time);
+    });
+    return rs;
+  }
+}
+
+// 用户页面
+class UserPage extends React.Component{
+  @Service  // 注入UserService
+  public service: UserService;
+
+  public async toLogin(username: string) {
+    return await this.service?.postLogin(username);
+  }
+
+  render() {
+    return <>
+      <button onClick={() => this.toLogin('Mr Ming')}>登录</button>
+    </>
+  }
+}

上面点击登录后会记录请求耗时,控制台打印的结果如下:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3tgd7rxirj30r60a640p.jpg

访问器装饰器

用途:

tsx
// 不变装饰器
+function immutable(
+  target: any,
+  propertyKey: string,
+  descriptor: PropertyDescriptor,
+) {
+  descriptor.set = function (value: any) {
+    return value;
+  };
+}
+
+// 私有属性装饰器
+function toPrivate(target: object, key: string) {
+  let _val: any = undefined;
+  Object.defineProperty(target, key, {
+    enumerable: false,
+    configurable: false,
+    get() {
+      return _val;
+    },
+    set(val) {
+      _val = val;
+    },
+  });
+}
+
+// 用户页面
+class UserPage extends React.Component{
+  @Service  // 注入UserService
+  public service: UserService;
+
+  @toPrivate
+  private _PORT: number = 3306;
+  get PORT() {
+    return this._PORT;
+  }
+  @immutable
+  set PORT(port: number) {
+    this._PORT = port;
+  } 
+
+  render() {
+    return <>
+      <button onClick={() => (this.PORT = 2)}>改变PORT</button>
+    </>
+  }
+}

现在给PORT赋值,将不会改变_PORT的值,如下图:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3ti440ni7j312w0sgqbp.jpg

参数装饰器

类型:

tsx
type ParamerDecorator = (target: Record<string|symbol, any>, prop: string | symbol, paramIdx: number) => void

参数:

用途:

参数装饰器单独使用很有限,一般结合其他装饰器一起使用;下面介绍一个验证器案例,用户可以自定义验证器也可以使用原始类型来验证参数是否正确:

tsx
// 参数装饰器
+type ParamerDecorator = (
+  target: Record<string | symbol, any>,
+  prop: string | symbol,
+  paramIdx: number,
+) => void;
+// 自定义验证器
+type Validater = (...args: any) => boolean;
+const validatorStorage: Record<string | symbol, Validater[]> = {};
+const typeDecoratorFactory =
+  (validator: Validater): ParamerDecorator =>
+  (target, prop, idx) => {
+    const targetValidators = validatorStorage[prop] ?? [];
+    targetValidators[idx] = validator;
+    validatorStorage[prop] = targetValidators;
+  };
+const isString = typeDecoratorFactory((str: string) => typeof str === 'string');
+// 源验证器或自定义参数验证器
+function validator(
+  target: object,
+  prop: string,
+  descriptor: PropertyDescriptor,
+) {
+  // 反射获取参数源类型
+  const typeMetaDatas: Function[] = Reflect.getMetadata(
+    'design:paramtypes',
+    target,
+    prop,
+  );
+  const origin = descriptor.value;
+  descriptor.value = function (...args: any[]) {
+    // 取到自定义验证器
+    const validators = validatorStorage[prop];
+
+    // 验证参数
+    if (args) {
+      args.forEach((arg, idx) => {
+        // 自定义验证器
+        const validate = validators?.[idx];
+        // 源类型验证器
+        const metaValidate = typeMetaDatas?.[idx];
+        const errorMsg = \`Failed for parameter: \${prop} at method of \${
+          JSON.stringify(target.constructor?.toString())?.match(
+            /function (\\w+)/i,
+          )?.[1]
+        }, expect 【\${metaValidate.name?.toLowerCase()}】but 【\${typeof arg}\`;
+        if (validate && !validate(arg)) {
+          throw new TypeError(errorMsg);
+        }
+        // 没有自定义验证器执行默认验证器
+        else if (!validate) {
+          if (metaValidate !== arg?.constructor) {
+            throw new TypeError(errorMsg);
+          }
+        }
+      });
+    }
+
+    // 执行源函数
+    return origin.call(this, ...args);
+  };
+}
+
+class LoginPage {
+  // 省略前面代码...
+
+  @validator
+  public async toLogin(@isString username: string) { // 期望username为string
+    return await this.service?.postLogin(username);
+  }
+
+  render() {
+    return <>
+      <button onClick={() => (this.toLogin(xxx)}>登录</button>
+    </>
+  }
+}

现在当点击登录时,调用toLogin方法,就会验证username的参数是否合法(当然前提是参数不能为空的,ts也是无法知道参数是否必填,只是来验证参数的类型罢了),打印如下:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3tt2o96xrj315k11ob29.jpg

当将isString代码改为 typeDecoratorFactory((str: object) => str?.name === ‘Mr Ming’);

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3ttid8rcnj31360e4alm.jpg

当删除自定义验证器,再次执行会验证默认的类型验证器:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3ttkha08bj31460lqh5j.jpg

执行顺序

上面我们针对每个类型的装饰器分别做了介绍并作了相关的例子实验,现在我们可以同时使用不同的装饰器,测试一下不同类型装饰器的执行顺序是如何的:

tsx
// 记录
+function trace(key: string): any {
+  console.log('evaluate: \\t', key);
+  return function () {
+    console.log('call: \\t\\t', key);
+  };
+}
+
+// 类装饰器
+@trace('Class Decorator')
+class People {
+  protected _name: string;
+
+  @trace('Static Property _instance')
+  public static _instance?: People;
+
+  @trace('Instance Property grade')
+  public grade: number;
+
+  constructor(@trace('Constructor Parameter') name: string) {
+    this._name = name;
+    this.grade = 0;
+    this.age = 0;
+  }
+
+  @trace('属性访问器')
+  public get name() {
+    return this._name;
+  }
+
+  @trace('Instance Method')
+  add(
+    @trace('Instance Method Param x') x: number,
+    @trace('Instance Method Param y') y: number,
+  ): number {
+    return x + y;
+  }
+
+  @trace('Instance Property age')
+  public age: number;
+
+  @trace('Static Method getInstance')
+  public static getInstance(
+    @trace('Static Method Param name') name: string,
+  ): People {
+    if (!this._instance) {
+      this._instance = new People(name);
+    }
+    return this._instance;
+  }
+}

上面的打印结果如下:

https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/005HV6Avgy1h3tubgm2udj31680ymx4h.jpg

从上面的结果可以得出结论: 装饰器访问顺序

  1. 实例属性:按定义从上往下 => 属性/方法(参数 -> 方法名)/属性访问器
  2. 静态属性:按定义从上往下 => 属性/方法(参数 -> 方法名)
  3. 构造器参数
  4. 类装饰器

当改变实例或者静态属性的定义顺序,响应的执行顺序也会按着从上往下定义的顺序执行,有兴趣的小伙伴可以动手试试

至此,有关typescript的装饰器的基本使用就介绍完了,相信看到这里的小伙伴也会对其有相关的了解,希望读完后自己动手实践

实践

tsx
// 待补充
`,73);function F(y,D,i,b,B,u){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[c,s(a),s(l)])}const E=p(t,[["render",F]]);export{A as __pageData,E as default}; diff --git a/assets/article_2021_ts-decorator.md.XWu9IBvE.lean.js b/assets/article_2021_ts-decorator.md.XWu9IBvE.lean.js new file mode 100644 index 000000000..badbefd35 --- /dev/null +++ b/assets/article_2021_ts-decorator.md.XWu9IBvE.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"Typescript装饰器指南","description":"这是一篇Typescript装饰器使用指南,教大家理解什么装饰器,装饰器的作用","frontmatter":{"title":"Typescript装饰器指南","description":"这是一篇Typescript装饰器使用指南,教大家理解什么装饰器,装饰器的作用","keywords":"Typescript装饰器,ts装饰器,装饰器,类装饰器,参数装饰器,属性装饰器,方法装饰器,访问装饰器,装饰器模式,设计模式,Typescript Decorator","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-ts.png"},"headers":[],"relativePath":"article/2021/ts-decorator.md","filePath":"article/2021/ts-decorator.md","lastUpdated":1706247228000}'),t={name:"article/2021/ts-decorator.md"},c=e("",73);function F(y,D,i,b,B,u){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[c,s(a),s(l)])}const E=p(t,[["render",F]]);export{A as __pageData,E as default}; diff --git a/assets/article_2021_vue-core-process.md.ORz11p1q.js b/assets/article_2021_vue-core-process.md.ORz11p1q.js new file mode 100644 index 000000000..ae74a7498 --- /dev/null +++ b/assets/article_2021_vue-core-process.md.ORz11p1q.js @@ -0,0 +1,254 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"谈谈Vue内部的运行机制","description":"Vue核心流程原理解密,一起来窥探vue的内部运行机制","frontmatter":{"title":"谈谈Vue内部的运行机制","description":"Vue核心流程原理解密,一起来窥探vue的内部运行机制","keywords":"Vue源码,vue core,vue核心原理,vue运行机制流程,vue双向绑定原理,模板编译","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"article/2021/vue-core-process.md","filePath":"article/2021/vue-core-process.md","lastUpdated":1706247228000}'),r={name:"article/2021/vue-core-process.md"},t=o(`

谈谈Vue内部的运行机制

前言

在使用vue开发时,都是从new Vue() 开始构建的,将state(data、props、methods...)、template、render等做为参数选项传入,vue内部就自动处理最后生成HTML呈现在页面上,那内部到底是怎么个流程呢?

在网上看到的文章大多都是直接讲双向绑定原理等一些内部实现机制,很少从构建开始讲起,这会对Vue的构建有一些疑惑,带着这份疑惑,接下来就开始进行分析吧

从构建开始

首先我们得找到Vue的入口,new VueVue是在哪里定义的,因为Vue是基于Rollup(一个 JavaScript 模块打包器常用于构建库)进行构建的,可以在源码项目中build.js中看到rollup的相关配置,我们在package.json中看到有很多脚本用于vue的构建,

从脚本中可以看出,运行不同脚本用来构建不同版本的文件,我们直接看build,实际运行node scripts/build.js,也就是说打包运行的就是这个文件,接下来看看build.js里面都是些什么内容。

js
// scripts/build.js
+let builds = require('./config').getAllBuilds()
+
+// ...
+
+build(builds)
+
+function build (builds) {
+  let built = 0
+  const total = builds.length
+  const next = () => {
+    buildEntry(builds[built]).then(() => {
+      built++
+      if (built < total) {
+        next()
+      }
+    }).catch(logError)
+  }
+
+  next()
+}
+
+function buildEntry (config) {
+  const output = config.output
+  const { file, banner } = output
+  const isProd = /(min|prod)\\.js$/.test(file)
+  return rollup.rollup(config)
+    .then(bundle => bundle.generate(output))
+    // ...
+}

build.js中,其实就是执行了build方法,遍历builds将其作为buildEntry方法参数执行,在buildEntry函数中可以看到rollup字眼了,config作为了rollup的参数,进行配置构建 build方法的参数builds,可以猜出就是rollup相关的配置,他是从config.js中的getAllBuilds方法获取的,接下来看看config.js

js
const builds = {
+  // Runtime only (CommonJS). Used by bundlers e.g. Webpack & Browserify
+  'web-runtime-cjs-dev': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.common.dev.js'),
+    format: 'cjs',
+    env: 'development',
+    banner
+  },
+  'web-runtime-cjs-prod': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.common.prod.js'),
+    format: 'cjs',
+    env: 'production',
+    banner
+  },
+  // Runtime+compiler CommonJS build (CommonJS)
+  'web-full-cjs-dev': {
+    entry: resolve('web/entry-runtime-with-compiler.js'),
+    dest: resolve('dist/vue.common.dev.js'),
+    format: 'cjs',
+    env: 'development',
+    alias: { he: './entity-decoder' },
+    banner
+  },
+  'web-full-cjs-prod': {
+    entry: resolve('web/entry-runtime-with-compiler.js'),
+    dest: resolve('dist/vue.common.prod.js'),
+    format: 'cjs',
+    env: 'production',
+    alias: { he: './entity-decoder' },
+    banner
+  },
+  // Runtime only ES modules build (for bundlers)
+  'web-runtime-esm': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.esm.js'),
+    format: 'es',
+    banner
+  },
+  //... 省略部分代码
+}
+
+function genConfig (name) {
+  const opts = builds[name]
+  const config = {
+    input: opts.entry,
+    external: opts.external,
+    plugins: [
+      flow(),
+      alias(Object.assign({}, aliases, opts.alias))
+    ].concat(opts.plugins || []),
+    output: {
+      file: opts.dest,
+      format: opts.format,
+      banner: opts.banner,
+      name: opts.moduleName || 'Vue'
+    },
+    onwarn: (msg, warn) => {
+      if (!/Circular/.test(msg)) {
+        warn(msg)
+      }
+    }
+  }
+
+  //... 省略部分代码
+
+  return config
+}
+
+//... 省略部分代码
+exports.getAllBuilds = () => Object.keys(builds).map(genConfig)

config文件中,通过getAllBuilds遍历builds,进行getConfig加工,getConfig方法内部,其实就是对builds中的每个属性,进行config改造,可以看出内部的config其实就是rollup的配置,最终返回改造好的config 再看builds其实就是针对构建不同规范、不同平台、不同环境进行的配置,如:web平台、commonJS规范、dev及prod环境、Runtime版本、Runtime+Comiler版、ES Module版等等,这样可以集中处理需要构建的目标版本等等,这里做了很好的区分,也容易管理

知道了打包的入口文件,就可以找到Vue开始的位置了,本篇分析Runtime+Compiler的commonjs版本,关于Runtime和Compiler版本后面再做介绍

入口分析

上部分我们终于找到了Vue打包的入口,可以看到有很多,我们只讲Runtime+Compiler的commonjs版本,可以在源码中找到entry-runtime-with-compiler.js,这就是打包入口。

首先我们要先找到Vue的定义所在

js
// src/platforms/web/entry-runtime-with-compiler.js
+
+//... 省略部分代码
+import Vue from './runtime/index'
+
+const mount = Vue.prototype.$mount
+Vue.prototype.$mount = function (
+  el?: string | Element,
+  hydrating?: boolean
+): Component {
+  //... 省略部分代码
+  return mount.call(this, el, hydrating)
+}
+
+export default Vue

在上述入口文件中,并没有看到Vue的定义,只是从runtime/index文件中引入了Vue,然后先对Vue的原型方法$mount进行缓存,再重写$mount,最后导出了Vue

接着我们来到src/platforms/web/runtime/index.js

js
//src/platforms/web/runtime/index.js\`
+
+import Vue from 'core/index'
+import { patch } from './patch'
+import platformDirectives from './directives/index'
+import platformComponents from './components/index'
+
+// install platform specific utils
+Vue.config.mustUseProp = mustUseProp
+Vue.config.isReservedTag = isReservedTag
+
+//... 省略部分代码
+
+// install platform runtime directives & components
+extend(Vue.options.directives, platformDirectives)
+extend(Vue.options.components, platformComponents)
+
+// install platform patch function
+Vue.prototype.__patch__ = inBrowser ? patch : noop
+
+// public mount method
+Vue.prototype.$mount = function (
+  el?: string | Element,
+  hydrating?: boolean
+): Component {
+  el = el && inBrowser ? query(el) : undefined
+  return mountComponent(this, el, hydrating)
+}
+
+//... 省略部分代码
+
+export default Vue

在上述文件中,也没有找到Vue的定义,只是简单的从core/index文件中导出了Vue。这里为Vue扩展了静态属性config并设置了一些配置属性,然后在其静态属性options上扩展了和平台相关的指令、组件等等;并给Vue原型定义了_patch__方法,然后发现这里找到了$mount方法的位置,内部执行的是mountComponent函数(后面再讲),最后导出Vue

其实这里就是为Vue做不同平台的构建做了一些扩展和准备,如__patch__方法在非浏览器环境下(ssr)就不需要patch,所以是个空函数

接着我们来到了core/index

js
// src/core/index.js
+
+import Vue from './instance/index'
+import { initGlobalAPI } from './global-api/index'
+import { isServerRendering } from 'core/util/env'
+import { FunctionalRenderContext } from 'core/vdom/create-functional-component'
+
+// 初始化全局API
+initGlobalAPI(Vue)
+
+Object.defineProperty(Vue.prototype, '$isServer', {
+  get: isServerRendering
+})
+
+Object.defineProperty(Vue.prototype, '$ssrContext', {
+  get () {
+    /* istanbul ignore next */
+    return this.$vnode && this.$vnode.ssrContext
+  }
+})
+
+// expose FunctionalRenderContext for ssr runtime helper installation
+Object.defineProperty(Vue, 'FunctionalRenderContext', {
+  value: FunctionalRenderContext
+})
+
+Vue.version = '__VERSION__'
+
+export default Vue

这里也没有找到Vue定义,而是从core/instance/index中引入了Vue,initGlobalAPI是对Vue挂载了全局静态属性及方法,如:nextTickset...等等,直接看instance/index文件

js
// src/core/instance/index
+import { initMixin } from './init'
+import { stateMixin } from './state'
+import { renderMixin } from './render'
+import { eventsMixin } from './events'
+import { lifecycleMixin } from './lifecycle'
+import { warn } from '../util/index'
+
+function Vue (options) {
+  if (process.env.NODE_ENV !== 'production' &&
+    !(this instanceof Vue)
+  ) {
+    warn('Vue is a constructor and should be called with the \`new\` keyword')
+  }
+  this._init(options)
+}
+
+initMixin(Vue)
+stateMixin(Vue)
+eventsMixin(Vue)
+lifecycleMixin(Vue)
+renderMixin(Vue)
+
+export default Vue

终于找到了Vue定义,原来就是一个函数

new Vue发生了什么

上个章节终于找到了vue的定义所在,就是一个普通函数,找到Vue接下来就可以对其进行下一步的分析了

通常我们都要new一个Vue,如下:

js
new Vue({
+  template: \`<div>{{title}}</div>\`
+  data: { title: 'emmm...' },
+  methods: {}
+})

在执行new操作后,就会执行内部方法_init,在源码中

js
function Vue (options) {
+  this._init(options)
+}
+initMixin(Vue)
+stateMixin(Vue)
+eventsMixin(Vue)
+lifecycleMixin(Vue)
+renderMixin(Vue)

那么_init方法又是从哪来的,首先肯定会想到是在Vue原型上定义的方法,接着再看下面给Vue进行了多个mixin,我们先看initMixin,initMixin在init.js中:

js
// src/core/instance/init.js
+
+let uid = 0
+
+export function initMixin (Vue: Class<Component>) {
+  Vue.prototype._init = function (options?: Object) {
+    const vm: Component = this
+    // a uid
+    vm._uid = uid++
+   
+    // a flag to avoid this being observed
+    vm._isVue = true
+    if (options && options._isComponent) {
+      initInternalComponent(vm, options)
+    }
+    else {
+      vm.$options = mergeOptions(
+        resolveConstructorOptions(vm.constructor),
+        options || {},
+        vm
+      )
+    }
+
+    if (process.env.NODE_ENV !== 'production') {
+      initProxy(vm)
+    } else {
+      vm._renderProxy = vm
+    }
+
+    // expose real self
+    vm._self = vm
+
+    initLifecycle(vm)
+    initEvents(vm)
+    initRender(vm)
+    callHook(vm, 'beforeCreate')
+    initInjections(vm)
+    initState(vm)
+    initProvide(vm)
+    callHook(vm, 'created')
+
+    if (vm.$options.el) {
+      vm.$mount(vm.$options.el)
+    }
+  }
+}
+//...省略部分代码

在init中,可以看到为Vue原型挂载了_init方法,因此当new Vue的时候,执行的就是这个_init方法。 在_init函数内部首先对传入的options进行了合并,mergeOptions

由于工作原因,后续会不断补充...(感谢理解)

`,37);function F(D,i,y,b,u,m){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[t,s(a),s(l)])}const d=p(r,[["render",F]]);export{A as __pageData,d as default}; diff --git a/assets/article_2021_vue-core-process.md.ORz11p1q.lean.js b/assets/article_2021_vue-core-process.md.ORz11p1q.lean.js new file mode 100644 index 000000000..8a5980530 --- /dev/null +++ b/assets/article_2021_vue-core-process.md.ORz11p1q.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"谈谈Vue内部的运行机制","description":"Vue核心流程原理解密,一起来窥探vue的内部运行机制","frontmatter":{"title":"谈谈Vue内部的运行机制","description":"Vue核心流程原理解密,一起来窥探vue的内部运行机制","keywords":"Vue源码,vue core,vue核心原理,vue运行机制流程,vue双向绑定原理,模板编译","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"article/2021/vue-core-process.md","filePath":"article/2021/vue-core-process.md","lastUpdated":1706247228000}'),r={name:"article/2021/vue-core-process.md"},t=o("",37);function F(D,i,y,b,u,m){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[t,s(a),s(l)])}const d=p(r,[["render",F]]);export{A as __pageData,d as default}; diff --git a/assets/article_2021_vue-img-lazyload.md.tKCHuRr8.js b/assets/article_2021_vue-img-lazyload.md.tKCHuRr8.js new file mode 100644 index 000000000..8ec3f8fbf --- /dev/null +++ b/assets/article_2021_vue-img-lazyload.md.tKCHuRr8.js @@ -0,0 +1,355 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"手写一个vue图片懒加载插件","description":"如何使用vue写一个图片懒加载插件指令","frontmatter":{"title":"手写一个vue图片懒加载插件","description":"如何使用vue写一个图片懒加载插件指令","keywords":"图片懒加载,vue插件,vue图片懒加载,性能优化,页面懒加载,页面性能","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"article/2021/vue-img-lazyload.md","filePath":"article/2021/vue-img-lazyload.md","lastUpdated":1706247228000}'),c={name:"article/2021/vue-img-lazyload.md"},t=o(`

手写vue图片懒加载插件

前言

性能优化越来越被重视,其中的静态资源加载称为重灾区,如果网页的图片太多,一次加载会出现明显的卡顿,采用懒加载和预加载是解决其的良好手段

本篇就来用Vue和TypeScript来撸一个懒加载插件,在阅读本编之前,请先了解vue插件注册机制和自定义指令,如果你还不了解,可以看看官方文档

实现效果

功能实现

功能分析:在实现此功能前,可以将功能拆分为多个小功能,将不同的功能模块化,抽象出来,提高代码可读性

分析1:

首先在加载目标图片时,会有默认的图片来占位,也就是占位图,并将图片状态置为LOADING,当达到某种条件时获取真实的图片,当真实的图片获取成功时,图片加载完毕,图片响应的状态为LOADED;当真实图片加载失败时,状态变为ERROR。因此,为了便于管理图片的各个状态,可以单独写个类ImageManager来管理图片的不同状态,而图片的状态也为懒加载管理器做好了铺垫

分析2: 图片状态管理器有了,应该还需要一个懒加载管理器Lazy,将所有需要懒加载的图片推到加载队列中managerQueue用来管理所有图片的状态。加载管理器需要对每个图片进行是否是要请求真实资源进行判断,当达到条件时,触发当前的图片管理器请求真实图片,当图片的状态不再是LOADING状态时,将其从managerQueue队列中剔除,这样就不用再检测当前ImageManager

属性定义

懒加载器实例化参数类型和指令绑定值类型如下:

ts
// types/index.ts
+import { DirectiveBinding } from 'vue/types/options'
+
+// 初始化插件时,定义全局的loading和error(图片) 下面会降到 new Lazy({loading, error})
+export interface LazyOpts {
+  loading?: string
+  error?: string
+}
+
+// 定义指令绑定值得类型,DirectiveBinding 的 value 为any类型,这里进行改造
+// 这里就可以在 v-lazy="{src, loading, error}" | src 使用这种对象值
+export interface DirectiveBindingType extends DirectiveBinding {
+  value: { src: string, loading?: string, error?: string } | string
+}
+
+// bind el type
+export type DirectiveBindingElemType = HTMLImageElement | HTMLElement

图片管理器实例化参数类型如下:

ts
// 实例化图片管理器的选项
+export type ImageManagerOpts = {
+  el: DirectiveBindingElemType // 目标Element
+  src: string  // 真实图片
+  loading: string  // loading 图片
+  error: string  // error图片
+}

图片管理器

正如上述分析,图片有3中状态,即:加载中加载成功加载失败,三种状态渲染不同的url,这里先枚举出三种状态:

ts
// 图片状态
+export enum IMAGE_STATUS {
+  LOADING, // 加载中
+  LOADED,  // 加载成功
+  ERROR,  // 加载失败
+}

图片管理器考虑到自身状态的维护,可以用class进行构造

ts
import { ImageManagerOpts, DirectiveBindingElemType } from './types'
+
+// 唯一标识符
+let uid = 1
+
+// 图片管理器
+class ImageManager {
+  src: string
+  el: DirectiveBindingElemType
+  loading: string
+  error: string
+  status: IMAGE_STATUS
+  uid!: number // 图片的唯一标识符
+
+  constructor(opts: ImageManagerOpts) {
+    this.src = opts.src
+    this.el = opts.el
+    this.loading = opts.loading
+    this.error = opts.error
+    this.uid = uid++
+
+    this.status = IMAGE_STATUS.LOADING
+    this.render(this.loading)
+  }
+
+  // 渲染dom图片
+  render(src: string) {
+    this.el.setAttribute('src', src)
+  }
+
+  // 加载资源,如果已经不是loading状态 终止
+  load(next?: Function) {
+    if (this.status > IMAGE_STATUS.LOADING) return
+    this.renderSrc(next)
+  }
+
+  // 异步加载资源,并改变状态
+  renderSrc(next?: Function) {
+    loadImage(this.src)
+      .then(() => {
+        this.status = IMAGE_STATUS.LOADED
+        this.render(this.src)
+        next && next()
+      })
+      .catch((e) => {
+        this.status = IMAGE_STATUS.ERROR
+        this.render(this.error)
+        console.warn(\`v-lazy:load img \${this.src} failed, \${e.message}.\`)
+        next && next()
+      })
+  }
+}
+
+// 异步获取图片
+function loadImage(src: string) {
+  return new Promise((resolve, reject) => {
+    const img = new Image()
+
+    img.onload = () => {
+      resolve(true)
+      img.onload = null
+    }
+
+    img.onerror = (err) => {
+      reject(err)
+      img.onerror = null
+    }
+
+    img.src = src
+  })
+}
+
+export { ImageManager }

以上基本上已经定义好了ImageManager,现在我们可以这样使用它:

ts
// 实例化时,状态为loading,render loading image
+const manager = new ImageManager({el,src,loading,error})
+
+// 当需要加载真实资源时
+manager.load()

那么接下来就来创建懒加载器来管理所有的图片管理器

懒加载管理器

ts
import {
+  DirectiveBindingType,
+  LazyOpts,
+  DirectiveBindingElemType,
+} from './types'
+import { ImageManager, IMAGE_STATUS } from './image-manager'
+
+// 可以默认一张图片
+import { defaultImage } from './default-data'
+
+const DEFAULT_URL = defaultImage
+
+class Lazy {
+  managerQueue: Array<ImageManager> = []
+  observer!: IntersectionObserver
+  loading!: string
+  error!: string
+
+  constructor(options: LazyOpts) {
+    this.loading = options.loading || DEFAULT_URL
+    this.error = options.error || DEFAULT_URL
+    this.initInterSectionObserver()
+  }
+
+  // 使用指令时,添加当前元素
+  add(el: DirectiveBindingElemType, binding: DirectiveBindingType) {
+    let src, error, loading
+    if (typeof binding.value === 'object') {
+      src = binding.value.src || ''
+      error = binding.value.error
+      loading = binding.value.loading
+    } else {
+      src = binding.value || ''
+    }
+    const manager = new ImageManager({
+      el,
+      src,
+      loading: loading || this.loading,
+      error: error || this.error,
+    })
+
+    this.managerQueue.push(manager)
+
+    this.observer.observe(el)
+  }
+
+  // 使用IntersectionObserver观测managerQueue里的manager
+  initInterSectionObserver() {
+    this.observer = new IntersectionObserver((entries) => {
+      entries.forEach((entry) => {
+        if (entry.isIntersecting) {
+          const manager = this.managerQueue.find((manager) => manager.el === entry.target)
+          if (manager) {
+            // manager状态不是loading时 则移除对其的观测
+            if (manager.status > IMAGE_STATUS.LOADING) {
+              this.removeManager(manager)
+              return
+            }
+            manager.load()
+          }
+        }
+      })
+    }, { rootMargin: '0px', threshold: 0.7 })
+  }
+
+  // 移除目标manager
+  removeManager(manager: ImageManager) {
+    const findIndex = this.managerQueue.map((m) => m.uid).indexOf(manager.uid)
+    if (findIndex > -1) {
+      this.managerQueue.splice(findIndex, 1)
+    }
+    if (this.observer) {
+      this.observer.unobserve(manager.el)
+    }
+  }
+}
+
+// 导出插件,需要按照Vue插件注册机制规范
+export default {
+  install(Vue: any, options: LazyOpts = {}) {
+    const lazy = new Lazy(options)
+    Vue.directive('lazy', {
+      bind: lazy.add.bind(lazy)
+    })
+  }
+}

至此,大体上已经完成所有功能了,当注册插件时,会实例化一个Lazy对象,并初始化一些初始状态loadingerrorIntersectionObserver,有关IntersectionObserver的使用可以详见MDN,对于监测两者是否交叉一个友好的API;除了这些还有managerQueue队列

当使用v-lazy指令时,会执行lazy的add方法,将其添加到managerQueue中,并对其进行oberve,当元素处于交叉状态时,获取对应的manager,并加载其真实图片,当然可以在这里判断如果manager的状态已经不是loading,直接removeManager卸载对其的观测

简单使用:

ts
// 全局注册
+import VLazy from './directives/lazy/lazy'
+Vue.use(VLazy, {
+  error: '/error.gif',  // 初始化默认错误
+  loading: '/loading.gif' // 默认loading
+})
+
+// HTML
+<template>
+    // 正常加载
+    <img v-lazy="'https://s4.ax1x.com/2021/12/15/TS7e29.gif'" />
+    
+    // 对当前元素提供指定错误图片
+    <img width="200" height="200" v-lazy="{ src: '/adad.png', error: 'https://s4.ax1x.com/2021/12/15/TSbQhD.jpg' }" />
+    
+    // 错误图片,将会加载错误
+    <img v-lazy="'/a1.jpg'" alt="出错了..." />
+</template>

优化

以上基本实现了所需的功能,但可能还有一些优化点需要做,如:IntersectionObserver的API虽然很好用,大部分浏览器也支持其特性,可惜的是IE却都不支持,如果想使用在IE里的项目,就得做兼容处理了;

再比如说,所有添加到队列中的manager,每当加载真实或者错误图片时,都会执行loadImage函数,创建img,请求图片,如果有多个图片的地址是一样的,就没必要再执行loadImage操作了,直接渲染目标图片即可,这种以空间换时间的策略会提升性能

上面仅仅是处理了src图片,也有些场景下还是会用到背景图,因此还需要一些改造,来支持背景图

兼容处理

当在IE时,不再使用IntersectionObserver,就会用到传统的滚动检测目标对象,进行差值计算,进行图片加载。因为此涉及到判断是否加载真正图片,只许对Lazy管理器进行改造即可

ts
class Lazy {
+  // ...省略部分代码
+  // 定义属性来判断是否支持
+  supportObserver: boolean = ('IntersectionObserver' in window)
+  
+  constructor(options: LazyOpts) {
+    this.loading = options.loading || DEFAULT_URL
+    this.error = options.error || DEFAULT_URL
+    
+    // 这里不再直接初始化IntersectionObserver
+    this.init()
+  }
+  
+  init() {
+    // 不支持IntersectionObserver时直接初始化 scroll
+    if (this.supportObserver) {
+      this.initInterSectionObserver()
+    } else {
+      this.initScrollListener()
+    }
+  }
+  
+  // 检测window滚动
+  initScrollListener() {
+    const screenHeight: number = document.documentElement.clientHeight
+    window.addEventListener('scroll', () => {
+      this.doScrollCallback(screenHeight)
+    })
+  }
+
+  // 滚动时执行判断每个manager是否已经达到条件加载图片
+  doScrollCallback(screenHeight: number) {
+    this.managerQueue.forEach((manager) => {
+      const rest = manager.el.getBoundingClientRect()
+      if (manager.status > IMAGE_STATUS.LOADING) {
+        this.removeManager(manager)
+        return
+      }
+      
+      if (rest.top >= 0 && rest.top <= screenHeight - 100) {
+        manager.load()
+      }
+    })
+  }
+  
+  add(el: HTMLImageElement, binding: DirectiveBindingType) {
+    //.. 省略部分代码
+
+    // 这里也需要判断
+    // 当不支持IntersectionObserver时,不再observe目标
+    // 而初次执行doScrollCallback(可能初次目标已经达到加载条件)
+    if (this.supportObserver) {
+      this.observer.observe(el)
+    } else {
+      const screenHeight: number = document.documentElement.clientHeight
+      setTimeout(() => this.doScrollCallback(screenHeight))
+    }
+  }
+}

这样就解决了IE兼容的问题,现在可以打开IE浏览器,发现也是好使的,证明兼容性是没有问题的

图片缓存

针对缓存可以创建一个Set,对所有图片进行收集,当后面的图片进行请求时,先判断有没有对应的缓存,如有的话直接进行渲染即可;那么知道缓存的内容了,又在哪里创建缓存器呢?缓存器应该不会改变,从而可以在Lazy中创建缓存器,将其传入ImageManager

定义先加上对应的字段:

ts
export type ImageManagerOpts = {
+  //...
+  cache: Set<string>
+}

接着先创建缓存器:

ts
class Lazy {
+  // ...
+  cache: Set<string> = new Set()
+
+  // ...
+  
+  add(el: HTMLImageElement, binding: DirectiveBindingType) {
+    // 创建manager时将cache传入
+    const manager = new ImageManager({
+      el,
+      src,
+      cache: this.cache,
+      //...
+    })
+  }
+}

ImageManager里需要在加载时,判断时是否可以命中缓存,如有直接加载即可;没有命中缓存时,当家在完毕或失败时,对对应的URL进行缓存,提供后面缓存使用

ts
class ImageManager {
+  //...
+  cache!: Set<string>
+
+  constructor(opts: ImageManagerOpts) {
+    // ...
+    this.cache = opts.cache
+  }
+
+  load(next?: Function) {
+    //...
+    // 判断是否命中缓存,如有直接渲染
+    if (this.cache.has(this.src)) {
+      this.render(this.src)
+      this.status = IMAGE_STATUS.LOADED
+      return
+    }
+    //...
+  }
+
+  // 加载失败或成功对其缓存
+  renderSrc(next?: Function) {
+    loadImage(this.src)
+      .then(() => {
+        //...
+        // 缓存
+        this.cache.add(this.src)
+      })
+      .catch((e) => {
+        //缓存
+        this.cache.add(this.error)
+      })
+  }
+}

缓存大致就这样,可以试试

背景图

支持背景图需要用到指令参数,处理起来也比较简单,判断指令是否具有backgroundImage(自定义)参数,有的话进行背景图渲染

类型定义:

ts
export type ImageManagerOpts = {
+  // ...
+  isBackGround?: boolean
+}

管理器改:

ts
class Lazy {
+  // ...
+  add(el: HTMLImageElement, binding: DirectiveBindingType) {
+    let src, error, loading
+    // 判断是不是背景参数
+    const isBackGround = (binding.arg && binding.arg.toLocaleUpperCase() === 'BACKGROUNDIMAGE') as boolean
+    
+    const manager = new ImageManager({
+      //...
+      // 传入
+      isBackGround
+    })
+  }
+}
+
+
+class ImageManager {
+  //...
+  isBackGround: boolean
+
+  constructor(opts: ImageManagerOpts) {
+    //...
+    this.isBackGround = opts.isBackGround || false
+  }
+
+  render(src: string) {
+    // 背景图渲染
+    if (this.isBackGround) {
+      this.el.style.backgroundImage = \`url(\${src})\`
+      return
+    }
+    this.el.setAttribute('src', src)
+  }
+}

现在就可以使用背景图片渲染了:

html
<!--背景图渲染,也可以指定loading、error等等-->
+<div
+    v-lazy:backgroundImage="{src: 'https://s4.ax1x.com/2021/12/15/TScWbd.jpg', loading: '/default-loading.gif'}"
+    class="back-img"
+/>

总结

本篇主要通过一个图片管理器ImageManager和一个懒加载管理器Lazy,分别实现了对图片状态的管理,和对图片请求真实资源的管理。通过使用交叉观测器IntersectionObserver来观测图片的临界值来加载真实资源,后又使用scroll监测window滚动来兼容IE对IntersectionObserver的不支持,最后进行各种优化完成插件功能

以上源码可以在GitHub下载,感谢点赞、感谢支持😄

`,57);function F(D,y,i,b,B,u){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[t,s(a),s(l)])}const E=p(c,[["render",F]]);export{A as __pageData,E as default}; diff --git a/assets/article_2021_vue-img-lazyload.md.tKCHuRr8.lean.js b/assets/article_2021_vue-img-lazyload.md.tKCHuRr8.lean.js new file mode 100644 index 000000000..080dba039 --- /dev/null +++ b/assets/article_2021_vue-img-lazyload.md.tKCHuRr8.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"手写一个vue图片懒加载插件","description":"如何使用vue写一个图片懒加载插件指令","frontmatter":{"title":"手写一个vue图片懒加载插件","description":"如何使用vue写一个图片懒加载插件指令","keywords":"图片懒加载,vue插件,vue图片懒加载,性能优化,页面懒加载,页面性能","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"article/2021/vue-img-lazyload.md","filePath":"article/2021/vue-img-lazyload.md","lastUpdated":1706247228000}'),c={name:"article/2021/vue-img-lazyload.md"},t=o("",57);function F(D,y,i,b,B,u){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[t,s(a),s(l)])}const E=p(c,[["render",F]]);export{A as __pageData,E as default}; diff --git a/assets/article_2022_emoji-markup.md.wvCnl86t.js b/assets/article_2022_emoji-markup.md.wvCnl86t.js new file mode 100644 index 000000000..6221465f3 --- /dev/null +++ b/assets/article_2022_emoji-markup.md.wvCnl86t.js @@ -0,0 +1 @@ +import{_ as t,c as e,J as o,V as c,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"Emoji markup(Markdown表情)","description":"Markdown表情,Markdown emoji markup list,help you select markdown emoji markup","frontmatter":{"title":"Emoji markup(Markdown表情)","description":"Markdown表情,Markdown emoji markup list,help you select markdown emoji markup","keywords":"markdown表情,markdown,emoji markup,emoji,markdown emoji","aside":false},"headers":[],"relativePath":"article/2022/emoji-markup.md","filePath":"article/2022/emoji-markup.md","lastUpdated":1706247228000}'),i={name:"article/2022/emoji-markup.md"},n=c('

Emoji markup

本文内容摘自:rxaviers

People

:bowtie: :bowtie:😄 :smile:😆 :laughing:
😊 :blush:😃 :smiley:☺️ :relaxed:
😏 :smirk:😍 :heart_eyes:😘 :kissing_heart:
😚 :kissing_closed_eyes:😳 :flushed:😌 :relieved:
😆 :satisfied:😁 :grin:😉 :wink:
😜 :stuck_out_tongue_winking_eye:😝 :stuck_out_tongue_closed_eyes:😀 :grinning:
😗 :kissing:😙 :kissing_smiling_eyes:😛 :stuck_out_tongue:
😴 :sleeping:😟 :worried:😦 :frowning:
😧 :anguished:😮 :open_mouth:😬 :grimacing:
😕 :confused:😯 :hushed:😑 :expressionless:
😒 :unamused:😅 :sweat_smile:😓 :sweat:
😥 :disappointed_relieved:😩 :weary:😔 :pensive:
😞 :disappointed:😖 :confounded:😨 :fearful:
😰 :cold_sweat:😣 :persevere:😢 :cry:
😭 :sob:😂 :joy:😲 :astonished:
😱 :scream::neckbeard: :neckbeard:😫 :tired_face:
😠 :angry:😡 :rage:😤 :triumph:
😪 :sleepy:😋 :yum:😷 :mask:
😎 :sunglasses:😵 :dizzy_face:👿 :imp:
😈 :smiling_imp:😐 :neutral_face:😶 :no_mouth:
😇 :innocent:👽 :alien:💛 :yellow_heart:
💙 :blue_heart:💜 :purple_heart:❤️ :heart:
💚 :green_heart:💔 :broken_heart:💓 :heartbeat:
💗 :heartpulse:💕 :two_hearts:💞 :revolving_hearts:
💘 :cupid:💖 :sparkling_heart::sparkles:
:star:🌟 :star2:💫 :dizzy:
💥 :boom:💥 :collision:💢 :anger:
:exclamation::question::grey_exclamation:
:grey_question:💤 :zzz:💨 :dash:
💦 :sweat_drops:🎶 :notes:🎵 :musical_note:
🔥 :fire:💩 :hankey:💩 :poop:
💩 :shit:👍 :+1:👍 :thumbsup:
👎 :-1:👎 :thumbsdown:👌 :ok_hand:
👊 :punch:👊 :facepunch::fist:
✌️ :v:👋 :wave::hand:
:raised_hand:👐 :open_hands:☝️ :point_up:
👇 :point_down:👈 :point_left:👉 :point_right:
🙌 :raised_hands:🙏 :pray:👆 :point_up_2:
👏 :clap:💪 :muscle:🤘 :metal:
🖕 :fu:🚶 :walking:🏃 :runner:
🏃 :running:👫 :couple:👪 :family:
👬 :two_men_holding_hands:👭 :two_women_holding_hands:💃 :dancer:
👯 :dancers:🙆‍♀️ :ok_woman:🙅 :no_good:
💁 :information_desk_person:🙋 :raising_hand:👰‍♀️ :bride_with_veil:
:person_with_pouting_face: :person_with_pouting_face::person_frowning: :person_frowning:🙇 :bow:
💏 :couplekiss:💑 :couple_with_heart:💆 :massage:
💇 :haircut:💅 :nail_care:👦 :boy:
👧 :girl:👩 :woman:👨 :man:
👶 :baby:👵 :older_woman:👴 :older_man:
:person_with_blond_hair: :person_with_blond_hair:👲 :man_with_gua_pi_mao:👳‍♂️ :man_with_turban:
👷 :construction_worker:👮 :cop:👼 :angel:
👸 :princess:😺 :smiley_cat:😸 :smile_cat:
😻 :heart_eyes_cat:😽 :kissing_cat:😼 :smirk_cat:
🙀 :scream_cat:😿 :crying_cat_face:😹 :joy_cat:
😾 :pouting_cat:👹 :japanese_ogre:👺 :japanese_goblin:
🙈 :see_no_evil:🙉 :hear_no_evil:🙊 :speak_no_evil:
💂‍♂️ :guardsman:💀 :skull:🐾 :feet:
👄 :lips:💋 :kiss:💧 :droplet:
👂 :ear:👀 :eyes:👃 :nose:
👅 :tongue:💌 :love_letter:👤 :bust_in_silhouette:
👥 :busts_in_silhouette:💬 :speech_balloon:💭 :thought_balloon:
:feelsgood: :feelsgood::finnadie: :finnadie::goberserk: :goberserk:
:godmode: :godmode::hurtrealbad: :hurtrealbad::rage1: :rage1:
:rage2: :rage2::rage3: :rage3::rage4: :rage4:
:suspect: :suspect::trollface: :trollface:

Nature

☀️ :sunny::umbrella:☁️ :cloud:
❄️ :snowflake::snowman::zap:
🌀 :cyclone:🌁 :foggy:🌊 :ocean:
🐱 :cat:🐶 :dog:🐭 :mouse:
🐹 :hamster:🐰 :rabbit:🐺 :wolf:
🐸 :frog:🐯 :tiger:🐨 :koala:
🐻 :bear:🐷 :pig:🐽 :pig_nose:
🐮 :cow:🐗 :boar:🐵 :monkey_face:
🐒 :monkey:🐴 :horse:🐎 :racehorse:
🐫 :camel:🐑 :sheep:🐘 :elephant:
🐼 :panda_face:🐍 :snake:🐦 :bird:
🐤 :baby_chick:🐥 :hatched_chick:🐣 :hatching_chick:
🐔 :chicken:🐧 :penguin:🐢 :turtle:
🐛 :bug:🐝 :honeybee:🐜 :ant:
🪲 :beetle:🐌 :snail:🐙 :octopus:
🐠 :tropical_fish:🐟 :fish:🐳 :whale:
🐋 :whale2:🐬 :dolphin:🐄 :cow2:
🐏 :ram:🐀 :rat:🐃 :water_buffalo:
🐅 :tiger2:🐇 :rabbit2:🐉 :dragon:
🐐 :goat:🐓 :rooster:🐕 :dog2:
🐖 :pig2:🐁 :mouse2:🐂 :ox:
🐲 :dragon_face:🐡 :blowfish:🐊 :crocodile:
🐪 :dromedary_camel:🐆 :leopard:🐈 :cat2:
🐩 :poodle:🐾 :paw_prints:💐 :bouquet:
🌸 :cherry_blossom:🌷 :tulip:🍀 :four_leaf_clover:
🌹 :rose:🌻 :sunflower:🌺 :hibiscus:
🍁 :maple_leaf:🍃 :leaves:🍂 :fallen_leaf:
🌿 :herb:🍄 :mushroom:🌵 :cactus:
🌴 :palm_tree:🌲 :evergreen_tree:🌳 :deciduous_tree:
🌰 :chestnut:🌱 :seedling:🌼 :blossom:
🌾 :ear_of_rice:🐚 :shell:🌐 :globe_with_meridians:
🌞 :sun_with_face:🌝 :full_moon_with_face:🌚 :new_moon_with_face:
🌑 :new_moon:🌒 :waxing_crescent_moon:🌓 :first_quarter_moon:
🌔 :waxing_gibbous_moon:🌕 :full_moon:🌖 :waning_gibbous_moon:
🌗 :last_quarter_moon:🌘 :waning_crescent_moon:🌜 :last_quarter_moon_with_face:
🌛 :first_quarter_moon_with_face:🌔 :moon:🌍 :earth_africa:
🌎 :earth_americas:🌏 :earth_asia:🌋 :volcano:
🌌 :milky_way::partly_sunny::octocat: :octocat:
:squirrel: :squirrel:

Objects

🎍 :bamboo:💝 :gift_heart:🎎 :dolls:
🎒 :school_satchel:🎓 :mortar_board:🎏 :flags:
🎆 :fireworks:🎇 :sparkler:🎐 :wind_chime:
🎑 :rice_scene:🎃 :jack_o_lantern:👻 :ghost:
🎅 :santa:🎄 :christmas_tree:🎁 :gift:
🔔 :bell:🔕 :no_bell:🎋 :tanabata_tree:
🎉 :tada:🎊 :confetti_ball:🎈 :balloon:
🔮 :crystal_ball:💿 :cd:📀 :dvd:
💾 :floppy_disk:📷 :camera:📹 :video_camera:
🎥 :movie_camera:💻 :computer:📺 :tv:
📱 :iphone:☎️ :phone:☎️ :telephone:
📞 :telephone_receiver:📟 :pager:📠 :fax:
💽 :minidisc:📼 :vhs:🔉 :sound:
🔈 :speaker:🔇 :mute:📢 :loudspeaker:
📣 :mega::hourglass::hourglass_flowing_sand:
:alarm_clock::watch:📻 :radio:
📡 :satellite::loop:🔍 :mag:
🔎 :mag_right:🔓 :unlock:🔒 :lock:
🔏 :lock_with_ink_pen:🔐 :closed_lock_with_key:🔑 :key:
💡 :bulb:🔦 :flashlight:🔆 :high_brightness:
🔅 :low_brightness:🔌 :electric_plug:🔋 :battery:
📲 :calling:📧 :email:📫 :mailbox:
📮 :postbox:🛀 :bath:🛁 :bathtub:
🚿 :shower:🚽 :toilet:🔧 :wrench:
🔩 :nut_and_bolt:🔨 :hammer:💺 :seat:
💰 :moneybag:💴 :yen:💵 :dollar:
💷 :pound:💶 :euro:💳 :credit_card:
💸 :money_with_wings:📧 :e-mail:📥 :inbox_tray:
📤 :outbox_tray:✉️ :envelope:📨 :incoming_envelope:
📯 :postal_horn:📪 :mailbox_closed:📬 :mailbox_with_mail:
📭 :mailbox_with_no_mail:🚪 :door:🚬 :smoking:
💣 :bomb:🔫 :gun:🔪 :hocho:
💊 :pill:💉 :syringe:📄 :page_facing_up:
📃 :page_with_curl:📑 :bookmark_tabs:📊 :bar_chart:
📈 :chart_with_upwards_trend:📉 :chart_with_downwards_trend:📜 :scroll:
📋 :clipboard:📆 :calendar:📅 :date:
📇 :card_index:📁 :file_folder:📂 :open_file_folder:
✂️ :scissors:📌 :pushpin:📎 :paperclip:
✒️ :black_nib:✏️ :pencil2:📏 :straight_ruler:
📐 :triangular_ruler:📕 :closed_book:📗 :green_book:
📘 :blue_book:📙 :orange_book:📓 :notebook:
📔 :notebook_with_decorative_cover:📒 :ledger:📚 :books:
🔖 :bookmark:📛 :name_badge:🔬 :microscope:
🔭 :telescope:📰 :newspaper:🏈 :football:
🏀 :basketball::soccer::baseball:
🎾 :tennis:🎱 :8ball:🏉 :rugby_football:
🎳 :bowling::golf:🚵 :mountain_bicyclist:
🚴 :bicyclist:🏇 :horse_racing:🏂 :snowboarder:
🏊 :swimmer:🏄 :surfer:🎿 :ski:
♠️ :spades:♥️ :hearts:♣️ :clubs:
♦️ :diamonds:💎 :gem:💍 :ring:
🏆 :trophy:🎼 :musical_score:🎹 :musical_keyboard:
🎻 :violin:👾 :space_invader:🎮 :video_game:
🃏 :black_joker:🎴 :flower_playing_cards:🎲 :game_die:
🎯 :dart:🀄 :mahjong:🎬 :clapper:
📝 :memo:📝 :pencil:📖 :book:
🎨 :art:🎤 :microphone:🎧 :headphones:
🎺 :trumpet:🎷 :saxophone:🎸 :guitar:
👞 :shoe:👡 :sandal:👠 :high_heel:
💄 :lipstick:👢 :boot:👕 :shirt:
👕 :tshirt:👔 :necktie:👚 :womans_clothes:
👗 :dress:🎽 :running_shirt_with_sash:👖 :jeans:
👘 :kimono:👙 :bikini:🎀 :ribbon:
🎩 :tophat:👑 :crown:👒 :womans_hat:
👞 :mans_shoe:🌂 :closed_umbrella:💼 :briefcase:
👜 :handbag:👝 :pouch:👛 :purse:
👓 :eyeglasses:🎣 :fishing_pole_and_fish::coffee:
🍵 :tea:🍶 :sake:🍼 :baby_bottle:
🍺 :beer:🍻 :beers:🍸 :cocktail:
🍹 :tropical_drink:🍷 :wine_glass:🍴 :fork_and_knife:
🍕 :pizza:🍔 :hamburger:🍟 :fries:
🍗 :poultry_leg:🍖 :meat_on_bone:🍝 :spaghetti:
🍛 :curry:🍤 :fried_shrimp:🍱 :bento:
🍣 :sushi:🍥 :fish_cake:🍙 :rice_ball:
🍘 :rice_cracker:🍚 :rice:🍜 :ramen:
🍲 :stew:🍢 :oden:🍡 :dango:
🥚 :egg:🍞 :bread:🍩 :doughnut:
🍮 :custard:🍦 :icecream:🍨 :ice_cream:
🍧 :shaved_ice:🎂 :birthday:🍰 :cake:
🍪 :cookie:🍫 :chocolate_bar:🍬 :candy:
🍭 :lollipop:🍯 :honey_pot:🍎 :apple:
🍏 :green_apple:🍊 :tangerine:🍋 :lemon:
🍒 :cherries:🍇 :grapes:🍉 :watermelon:
🍓 :strawberry:🍑 :peach:🍈 :melon:
🍌 :banana:🍐 :pear:🍍 :pineapple:
🍠 :sweet_potato:🍆 :eggplant:🍅 :tomato:
🌽 :corn:

Places

🏠 :house:🏡 :house_with_garden:🏫 :school:
🏢 :office:🏣 :post_office:🏥 :hospital:
🏦 :bank:🏪 :convenience_store:🏩 :love_hotel:
🏨 :hotel:💒 :wedding::church:
🏬 :department_store:🏤 :european_post_office:🌇 :city_sunrise:
🌆 :city_sunset:🏯 :japanese_castle:🏰 :european_castle:
:tent:🏭 :factory:🗼 :tokyo_tower:
🗾 :japan:🗻 :mount_fuji:🌄 :sunrise_over_mountains:
🌅 :sunrise:🌠 :stars:🗽 :statue_of_liberty:
🌉 :bridge_at_night:🎠 :carousel_horse:🌈 :rainbow:
🎡 :ferris_wheel::fountain:🎢 :roller_coaster:
🚢 :ship:🚤 :speedboat::boat:
:sailboat:🚣 :rowboat::anchor:
🚀 :rocket:✈️ :airplane:🚁 :helicopter:
🚂 :steam_locomotive:🚊 :tram:🚞 :mountain_railway:
🚲 :bike:🚡 :aerial_tramway:🚟 :suspension_railway:
🚠 :mountain_cableway:🚜 :tractor:🚙 :blue_car:
🚘 :oncoming_automobile:🚗 :car:🚗 :red_car:
🚕 :taxi:🚖 :oncoming_taxi:🚛 :articulated_lorry:
🚌 :bus:🚍 :oncoming_bus:🚨 :rotating_light:
🚓 :police_car:🚔 :oncoming_police_car:🚒 :fire_engine:
🚑 :ambulance:🚐 :minibus:🚚 :truck:
🚋 :train:🚉 :station:🚆 :train2:
🚅 :bullettrain_front:🚄 :bullettrain_side:🚈 :light_rail:
🚝 :monorail:🚃 :railway_car:🚎 :trolleybus:
🎫 :ticket::fuelpump:🚦 :vertical_traffic_light:
🚥 :traffic_light:⚠️ :warning:🚧 :construction:
🔰 :beginner:🏧 :atm:🎰 :slot_machine:
🚏 :busstop:💈 :barber:♨️ :hotsprings:
🏁 :checkered_flag:🎌 :crossed_flags:🏮 :izakaya_lantern:
🗿 :moyai:🎪 :circus_tent:🎭 :performing_arts:
📍 :round_pushpin:🚩 :triangular_flag_on_post:🇯🇵 :jp:
🇰🇷 :kr:🇨🇳 :cn:🇺🇸 :us:
🇫🇷 :fr:🇪🇸 :es:🇮🇹 :it:
🇷🇺 :ru:🇬🇧 :gb:🇬🇧 :uk:
🇩🇪 :de:

Symbols

1️⃣ :one:2️⃣ :two:3️⃣ :three:
4️⃣ :four:5️⃣ :five:6️⃣ :six:
7️⃣ :seven:8️⃣ :eight:9️⃣ :nine:
🔟 :keycap_ten:🔢 :1234:0️⃣ :zero:
#️⃣ :hash:🔣 :symbols:◀️ :arrow_backward:
⬇️ :arrow_down:▶️ :arrow_forward:⬅️ :arrow_left:
🔠 :capital_abcd:🔡 :abcd:🔤 :abc:
↙️ :arrow_lower_left:↘️ :arrow_lower_right:➡️ :arrow_right:
⬆️ :arrow_up:↖️ :arrow_upper_left:↗️ :arrow_upper_right:
:arrow_double_down::arrow_double_up:🔽 :arrow_down_small:
⤵️ :arrow_heading_down:⤴️ :arrow_heading_up:↩️ :leftwards_arrow_with_hook:
↪️ :arrow_right_hook:↔️ :left_right_arrow:↕️ :arrow_up_down:
🔼 :arrow_up_small:🔃 :arrows_clockwise:🔄 :arrows_counterclockwise:
:rewind::fast_forward:ℹ️ :information_source:
🆗 :ok:🔀 :twisted_rightwards_arrows:🔁 :repeat:
🔂 :repeat_one:🆕 :new:🔝 :top:
🆙 :up:🆒 :cool:🆓 :free:
🆖 :ng:🎦 :cinema:🈁 :koko:
📶 :signal_strength::u5272: :u5272::u5408: :u5408:
:u55b6: :u55b6::u6307: :u6307::u6708: :u6708:
:u6709: :u6709:🈵 :u6e80::u7121: :u7121:
:u7533: :u7533::u7a7a: :u7a7a::u7981: :u7981:
🈂️ :sa:🚻 :restroom:🚹 :mens:
🚺 :womens:🚼 :baby_symbol:🚭 :no_smoking:
🅿️ :parking::wheelchair:🚇 :metro:
🛄 :baggage_claim:🉑 :accept:🚾 :wc:
🚰 :potable_water:🚮 :put_litter_in_its_place:㊙️ :secret:
㊗️ :congratulations:Ⓜ️ :m:🛂 :passport_control:
🛅 :left_luggage:🛃 :customs:🉐 :ideograph_advantage:
🆑 :cl:🆘 :sos:🆔 :id:
🚫 :no_entry_sign:🔞 :underage:📵 :no_mobile_phones:
🚯 :do_not_litter:🚱 :non-potable_water:🚳 :no_bicycles:
🚷 :no_pedestrians:🚸 :children_crossing::no_entry:
✳️ :eight_spoked_asterisk:✴️ :eight_pointed_black_star:💟 :heart_decoration:
🆚 :vs:📳 :vibration_mode:📴 :mobile_phone_off:
💹 :chart:💱 :currency_exchange::aries:
:taurus::gemini::cancer:
:leo::virgo::libra:
:scorpius::sagittarius::capricorn:
:aquarius::pisces::ophiuchus:
🔯 :six_pointed_star::negative_squared_cross_mark:🅰️ :a:
🅱️ :b:🆎 :ab:🅾️ :o2:
💠 :diamond_shape_with_a_dot_inside:♻️ :recycle:🔚 :end:
🔛 :on:🔜 :soon:🕐 :clock1:
🕜 :clock130:🕙 :clock10:🕥 :clock1030:
🕚 :clock11:🕦 :clock1130:🕛 :clock12:
🕧 :clock1230:🕑 :clock2:🕝 :clock230:
🕒 :clock3:🕞 :clock330:🕓 :clock4:
🕟 :clock430:🕔 :clock5:🕠 :clock530:
🕕 :clock6:🕡 :clock630:🕖 :clock7:
🕢 :clock730:🕗 :clock8:🕣 :clock830:
🕘 :clock9:🕤 :clock930:💲 :heavy_dollar_sign:
©️ :copyright:®️ :registered:™️ :tm:
:x::heavy_exclamation_mark:‼️ :bangbang:
⁉️ :interrobang::o:✖️ :heavy_multiplication_x:
:heavy_plus_sign::heavy_minus_sign::heavy_division_sign:
💮 :white_flower:💯 :100:✔️ :heavy_check_mark:
☑️ :ballot_box_with_check:🔘 :radio_button:🔗 :link:
:curly_loop:〰️ :wavy_dash:〽️ :part_alternation_mark:
🔱 :trident::black_square: :black_square::white_square: :white_square:
:white_check_mark:🔲 :black_square_button:🔳 :white_square_button:
:black_circle::white_circle:🔴 :red_circle:
🔵 :large_blue_circle:🔷 :large_blue_diamond:🔶 :large_orange_diamond:
🔹 :small_blue_diamond:🔸 :small_orange_diamond:🔺 :small_red_triangle:
🔻 :small_red_triangle_down::shipit: :shipit:
',12);function _(s,l,h,u,p,m){const d=a("Gitalk");return r(),e("div",null,[n,o(d)])}const k=t(i,[["render",_]]);export{b as __pageData,k as default}; diff --git a/assets/article_2022_emoji-markup.md.wvCnl86t.lean.js b/assets/article_2022_emoji-markup.md.wvCnl86t.lean.js new file mode 100644 index 000000000..548a012a9 --- /dev/null +++ b/assets/article_2022_emoji-markup.md.wvCnl86t.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,J as o,V as c,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"Emoji markup(Markdown表情)","description":"Markdown表情,Markdown emoji markup list,help you select markdown emoji markup","frontmatter":{"title":"Emoji markup(Markdown表情)","description":"Markdown表情,Markdown emoji markup list,help you select markdown emoji markup","keywords":"markdown表情,markdown,emoji markup,emoji,markdown emoji","aside":false},"headers":[],"relativePath":"article/2022/emoji-markup.md","filePath":"article/2022/emoji-markup.md","lastUpdated":1706247228000}'),i={name:"article/2022/emoji-markup.md"},n=c("",12);function _(s,l,h,u,p,m){const d=a("Gitalk");return r(),e("div",null,[n,o(d)])}const k=t(i,[["render",_]]);export{b as __pageData,k as default}; diff --git a/assets/article_base.md.BJwv0RtE.js b/assets/article_base.md.BJwv0RtE.js new file mode 100644 index 000000000..a473e217a --- /dev/null +++ b/assets/article_base.md.BJwv0RtE.js @@ -0,0 +1 @@ +import{_ as t,c as a,J as o,V as s,o as r,G as c}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"日拱一卒","description":"在这里我会不断分享web开发技术,其中不限于前端、后端、运维等技术文章","frontmatter":{"title":"日拱一卒","description":"在这里我会不断分享web开发技术,其中不限于前端、后端、运维等技术文章"},"headers":[],"relativePath":"article/base.md","filePath":"article/base.md","lastUpdated":1706247228000}'),i={name:"article/base.md"},l=s('

日拱一卒

万古长空,一朝风月

转载须知

本博客文章允许大家转载,需要注明出处并提供源文章链接,对于标注不允许转载的,请联系本人。

如果本博客对您有帮助,请在GitHub给我点个star,支持我不断更新。

这里是本人在工作或学习中Get到的一些技能技巧,还有常见参考内容,把一些值得学习的记录下来分享给大家。同时这些也大体见证着本人的成长过程,希望这些文章对你也有所帮助😊。

由于工作原因,写作时间有限,尽力更新中...

',6);function n(p,_,d,b,h,m){const e=c("Gitalk");return r(),a("div",null,[l,o(e)])}const k=t(i,[["render",n]]);export{f as __pageData,k as default}; diff --git a/assets/article_base.md.BJwv0RtE.lean.js b/assets/article_base.md.BJwv0RtE.lean.js new file mode 100644 index 000000000..4ffde5713 --- /dev/null +++ b/assets/article_base.md.BJwv0RtE.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,J as o,V as s,o as r,G as c}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"日拱一卒","description":"在这里我会不断分享web开发技术,其中不限于前端、后端、运维等技术文章","frontmatter":{"title":"日拱一卒","description":"在这里我会不断分享web开发技术,其中不限于前端、后端、运维等技术文章"},"headers":[],"relativePath":"article/base.md","filePath":"article/base.md","lastUpdated":1706247228000}'),i={name:"article/base.md"},l=s("",6);function n(p,_,d,b,h,m){const e=c("Gitalk");return r(),a("div",null,[l,o(e)])}const k=t(i,[["render",n]]);export{f as __pageData,k as default}; diff --git a/assets/chunks/@localSearchIndexroot.5hxXnWZ2.js b/assets/chunks/@localSearchIndexroot.5hxXnWZ2.js new file mode 100644 index 000000000..a4c67dcb7 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.5hxXnWZ2.js @@ -0,0 +1 @@ +const e='{"documentCount":1238,"nextId":1238,"documentIds":{"0":"/article/2019/bind-call-apply.html#bind、call、apply使用技巧","1":"/article/2019/bind-call-apply.html#介绍与使用方法","2":"/article/2019/bind-call-apply.html#apply介绍","3":"/article/2019/bind-call-apply.html#call介绍","4":"/article/2019/bind-call-apply.html#bind介绍","5":"/article/2019/bind-call-apply.html#三者区别","6":"/article/2019/bind-call-apply.html#手写call-apply-bind","7":"/article/2019/bind-call-apply.html#手写call","8":"/article/2019/bind-call-apply.html#手写apply","9":"/article/2019/bind-call-apply.html#手写bind","10":"/article/2019/bind-call-apply.html#最后","11":"/article/2019/css-center.html#css的10中居中方式","12":"/article/2019/css-center.html#absolute-负margin","13":"/article/2019/css-center.html#absolute-margin-auto","14":"/article/2019/css-center.html#absolute-calc","15":"/article/2019/css-center.html#absolute-transform","16":"/article/2019/css-center.html#lineheight","17":"/article/2019/css-center.html#writing-mode","18":"/article/2019/css-center.html#table","19":"/article/2019/css-center.html#css-table","20":"/article/2019/css-center.html#flex","21":"/article/2019/css-center.html#grid","22":"/article/2019/css-center.html#总结","23":"/article/2019/js-copy.html#js的深浅拷贝","24":"/article/2019/js-copy.html#数据类型","25":"/article/2019/js-copy.html#浅拷贝与深拷贝","26":"/article/2019/js-copy.html#赋值和浅拷贝的区别","27":"/article/2019/js-copy.html#浅拷贝的实现方式","28":"/article/2019/js-copy.html#_1-object-assign","29":"/article/2019/js-copy.html#_2-array-prototype-concat","30":"/article/2019/js-copy.html#_3-array-prototype-slice","31":"/article/2019/js-copy.html#深拷贝的实现方式","32":"/article/2019/js-copy.html#_1-json-parse-json-stringify","33":"/article/2019/js-copy.html#_2-手写递归方法","34":"/article/2019/js-copy.html#函数库lodash","35":"/article/2019/js-copy.html#总结","36":"/article/2019/js-type-transfer.html#js类型隐式转换与装箱拆箱","37":"/article/2019/js-type-transfer.html#装箱与拆箱","38":"/article/2019/js-type-transfer.html#装箱","39":"/article/2019/js-type-transfer.html#拆箱","40":"/article/2019/js-type-transfer.html#toprimitive、-ordinarytoprimitive","41":"/article/2019/js-type-transfer.html#类型隐式转换","42":"/article/2019/js-type-transfer.html#算术运算符转换","43":"/article/2019/js-type-transfer.html#减乘除","44":"/article/2019/js-type-transfer.html#加运算","45":"/article/2019/js-type-transfer.html#逻辑运算转换","46":"/article/2019/js-type-transfer.html#运算转换","47":"/article/2019/js-type-transfer.html#运算转换-1","48":"/article/2019/js-type-transfer.html#问题","49":"/article/2019/js-type-transfer.html#总结","50":"/article/2019/ktv-system.html#_7天撸完ktv点歌系统","51":"/article/2019/ktv-system.html#思维导图","52":"/article/2019/ktv-system.html#技术栈","53":"/article/2019/ktv-system.html#功能介绍","54":"/article/2019/ktv-system.html#项目设计结构","55":"/article/2019/ktv-system.html#项目启动介绍","56":"/article/2019/ktv-system.html#首先","57":"/article/2019/ktv-system.html#接着注册管理员账号","58":"/article/2019/ktv-system.html#然后用postman注册或者其他工具","59":"/article/2019/ktv-system.html#技术攻关","60":"/article/2019/ktv-system.html#date方法","61":"/article/2019/ktv-system.html#验证码-svg-captcha","62":"/article/2019/ktv-system.html#上传歌曲或图片","63":"/article/2019/ktv-system.html#vue、elementui分页使用","64":"/article/2019/ktv-system.html#token和自定义验证合法性","65":"/article/2019/ktv-system.html#截图-只给出部分截图","66":"/article/2019/ktv-system.html#源码在这里","67":"/article/2019/mysql-guide.html#mysql从入门到放弃","68":"/article/2019/mysql-guide.html#下载安装","69":"/article/2019/mysql-guide.html#终端配置mysql","70":"/article/2019/mysql-guide.html#工具推荐","71":"/article/2019/mysql-guide.html#基本操作","72":"/article/2019/mysql-guide.html#创建数据库","73":"/article/2019/mysql-guide.html#删除数据库","74":"/article/2019/mysql-guide.html#查看当前数据库所有表","75":"/article/2019/mysql-guide.html#创建表","76":"/article/2019/mysql-guide.html#删除表-drop","77":"/article/2019/mysql-guide.html#插入数据-insert-into","78":"/article/2019/mysql-guide.html#修改数据-update","79":"/article/2019/mysql-guide.html#删除数据-delete-from","80":"/article/2019/mysql-guide.html#简单查询","81":"/article/2019/mysql-guide.html#查询排序-order-by","82":"/article/2019/mysql-guide.html#别名","83":"/article/2019/mysql-guide.html#常用函数","84":"/article/2019/mysql-guide.html#分组查询-group-by","85":"/article/2019/mysql-guide.html#模糊查询-like","86":"/article/2019/mysql-guide.html#联表查询-join","87":"/article/2019/mysql-guide.html#联表查询综合应用","88":"/article/2019/mysql-guide.html#自联","89":"/article/2019/mysql-guide.html#子查询","90":"/article/2019/mysql-guide.html#分页-limit","91":"/article/2019/mysql-guide.html#外键","92":"/article/2019/nvm-guide.html#nvm切换node版本","93":"/article/2019/nvm-guide.html#下载安装nvm","94":"/article/2019/nvm-guide.html#配置环境变量","95":"/article/2019/nvm-guide.html#使用nvm查看信息","96":"/article/2019/nvm-guide.html#使用nvm下载node等等","97":"/article/2019/nvm-guide.html#常见问题","98":"/article/2019/promise.html#promise使用与原理","99":"/article/2019/what-bfc.html#bfc总结","100":"/article/2019/what-bfc.html#前言","101":"/article/2019/what-bfc.html#什么是bfc","102":"/article/2019/what-bfc.html#首先看下什么是formatting-context","103":"/article/2019/what-bfc.html#bfc","104":"/article/2019/what-bfc.html#如何生成bfc","105":"/article/2019/what-bfc.html#bfc的布局规则","106":"/article/2019/what-bfc.html#可应用到解决margin重叠的问题中","107":"/article/2019/what-bfc.html#可应用到两栏布局中","108":"/article/2019/what-bfc.html#可应用到解决浮动元素的父元素高度塌陷问题中","109":"/article/2019/what-bfc.html#应用","110":"/article/2019/what-bfc.html#解决margin重叠的问题","111":"/article/2019/what-bfc.html#两栏布局问题","112":"/article/2019/what-bfc.html#解决浮动元素的父元素高度塌陷的问题","113":"/article/2019/what-bfc.html#小结","114":"/article/2020/domparser-xml.html#关于domparser、xmlserializer、createtreewalker使用","115":"/article/2020/domparser-xml.html#domparser","116":"/article/2020/domparser-xml.html#语法","117":"/article/2020/domparser-xml.html#方法","118":"/article/2020/domparser-xml.html#错误处理","119":"/article/2020/domparser-xml.html#xmlserializer","120":"/article/2020/domparser-xml.html#语法-1","121":"/article/2020/domparser-xml.html#方法-1","122":"/article/2020/domparser-xml.html#和outerhtml区别","123":"/article/2020/optimize-web-server.html#优化改善网页的加载及性能","124":"/article/2020/optimize-web-server.html#起步","125":"/article/2020/optimize-web-server.html#应用搭建","126":"/article/2020/optimize-web-server.html#应用部署","127":"/article/2020/optimize-web-server.html#鉴权拦截器","128":"/article/2020/optimize-web-server.html#nginx代理","129":"/article/2020/optimize-web-server.html#性能优化","130":"/article/2020/optimize-web-server.html#设置cdn","131":"/article/2020/optimize-web-server.html#预加载","132":"/article/2020/optimize-web-server.html#缓存","133":"/article/2020/optimize-web-server.html#懒加载","134":"/article/2020/optimize-web-server.html#资源压缩gzip","135":"/article/2020/optimize-web-server.html#总结","136":"/article/2020/regexp-guide.html#深入浅出regexp","137":"/article/2020/regexp-guide.html#一个例子","138":"/article/2020/regexp-guide.html#修饰符","139":"/article/2020/regexp-guide.html#字符类","140":"/article/2020/regexp-guide.html#例子","141":"/article/2020/regexp-guide.html#复用","142":"/article/2020/regexp-guide.html#选择、组合、捕获、引用","143":"/article/2020/regexp-guide.html#选择","144":"/article/2020/regexp-guide.html#组合-字符集合范围","145":"/article/2020/regexp-guide.html#捕获","146":"/article/2020/regexp-guide.html#引用","147":"/article/2020/regexp-guide.html#断言","148":"/article/2020/regexp-guide.html#前瞻断言","149":"/article/2020/regexp-guide.html#后瞻断言","150":"/article/2020/regexp-guide.html#贪婪与惰性","151":"/article/2020/regexp-guide.html#regexp属性、方法","152":"/article/2020/regexp-guide.html#属性","153":"/article/2020/regexp-guide.html#方法","154":"/article/2020/regexp-guide.html#string常见的正则方法","155":"/article/2020/vscode-shortcut.html#vscode快捷键","156":"/article/2020/vscode-shortcut.html#全局","157":"/article/2020/vscode-shortcut.html#基本","158":"/article/2020/vscode-shortcut.html#多光标与选择","159":"/article/2020/vscode-shortcut.html#查找替换","160":"/article/2020/vscode-shortcut.html#进阶","161":"/article/2020/vscode-shortcut.html#导航","162":"/article/2020/vscode-shortcut.html#编辑器管理","163":"/article/2020/vscode-shortcut.html#文件管理","164":"/article/2020/vscode-shortcut.html#显示","165":"/article/2020/vscode-shortcut.html#调试","166":"/article/2020/vscode-shortcut.html#集成终端","167":"/article/2020/web-cache.html#web缓存策略","168":"/article/2020/web-cache.html#概念","169":"/article/2020/web-cache.html#相关文章","170":"/article/2020/webpack-guide.html#从零配置webpack工程","171":"/article/2020/webpack-guide.html#webpack-是什么","172":"/article/2020/webpack-guide.html#webpack-的核心概念","173":"/article/2020/webpack-guide.html#初始化项目","174":"/article/2020/webpack-guide.html#安装基本的依赖","175":"/article/2020/webpack-guide.html#基本配置","176":"/article/2020/webpack-guide.html#html-webpack-plugin","177":"/article/2020/webpack-guide.html#devserver","178":"/article/2020/webpack-guide.html#配置-loader","179":"/article/2020/webpack-guide.html#less-loader","180":"/article/2020/webpack-guide.html#babel-loader","181":"/article/2020/webpack-guide.html#url-loader","182":"/article/2020/webpack-guide.html#mode","183":"/article/2020/webpack-guide.html#devtool","184":"/article/2020/webpack-guide.html#每次打包前清空-dist-目录","185":"/article/2020/webpack-guide.html#externals","186":"/article/2020/webpack-guide.html#resolve","187":"/article/2020/webpack-guide.html#optimization","188":"/article/2020/webpack-guide.html#watch","189":"/article/2020/webpack-guide.html#noparse","190":"/article/2020/webpack-guide.html#webpack-merge","191":"/article/2020/webpack-guide.html#最后","192":"/article/2021/flex-layout.html#flex布局","193":"/article/2021/flex-layout.html#参考文档","194":"/article/2021/js-pattern.html#js中的设计模式","195":"/article/2021/js-pattern.html#订阅-发布模式-观察者","196":"/article/2021/js-pattern.html#单例模式","197":"/article/2021/js-pattern.html#策略模式","198":"/article/2021/js-pattern.html#代理模式","199":"/article/2021/js-pattern.html#装饰器模式","200":"/article/2021/js-pattern.html#外观模式","201":"/article/2021/js-pattern.html#工厂模式","202":"/article/2021/js-pattern.html#建造者模式builder","203":"/article/2021/js-pattern.html#迭代器模式","204":"/article/2021/js-pattern.html#享元模式","205":"/article/2021/js-pattern.html#职责链模式","206":"/article/2021/js-pattern.html#适配器模式","207":"/article/2021/js-pattern.html#模板方法模式","208":"/article/2021/js-pattern.html#中介者模式","209":"/article/2021/js-pattern.html#备忘录模式","210":"/article/2021/js-pattern.html#总结","211":"/article/2021/js-pattern.html#参考文档","212":"/article/2021/performance-tools.html#前端性能测试工具","213":"/article/2021/performance-tools.html#pagespeed-insights","214":"/article/2021/performance-tools.html#lighthouse","215":"/article/2021/performance-tools.html#使用方法","216":"/article/2021/performance-tools.html#测试某网站","217":"/article/2021/performance-tools.html#sitespeed","218":"/article/2021/performance-tools.html#安装","219":"/article/2021/performance-tools.html#测试","220":"/article/2021/performance-tools.html#speedcurve","221":"/article/2021/performance-tools.html#webpagetest","222":"/article/2021/pwa-app.html#pwa渐进式应用","223":"/article/2021/pwa-app.html#参考文章","224":"/article/2021/ts-decorator.html#typescript装饰器指南","225":"/article/2021/ts-decorator.html#概念","226":"/article/2021/ts-decorator.html#装饰器类别","227":"/article/2021/ts-decorator.html#reflect-metadata-元数据","228":"/article/2021/ts-decorator.html#类装饰器","229":"/article/2021/ts-decorator.html#属性装饰器","230":"/article/2021/ts-decorator.html#方法装饰器","231":"/article/2021/ts-decorator.html#访问器装饰器","232":"/article/2021/ts-decorator.html#参数装饰器","233":"/article/2021/ts-decorator.html#执行顺序","234":"/article/2021/ts-decorator.html#实践","235":"/article/2021/vue-core-process.html#谈谈vue内部的运行机制","236":"/article/2021/vue-core-process.html#前言","237":"/article/2021/vue-core-process.html#从构建开始","238":"/article/2021/vue-core-process.html#入口分析","239":"/article/2021/vue-core-process.html#new-vue发生了什么","240":"/article/2021/vue-img-lazyload.html#手写vue图片懒加载插件","241":"/article/2021/vue-img-lazyload.html#前言","242":"/article/2021/vue-img-lazyload.html#功能实现","243":"/article/2021/vue-img-lazyload.html#属性定义","244":"/article/2021/vue-img-lazyload.html#图片管理器","245":"/article/2021/vue-img-lazyload.html#懒加载管理器","246":"/article/2021/vue-img-lazyload.html#优化","247":"/article/2021/vue-img-lazyload.html#兼容处理","248":"/article/2021/vue-img-lazyload.html#图片缓存","249":"/article/2021/vue-img-lazyload.html#背景图","250":"/article/2021/vue-img-lazyload.html#总结","251":"/article/2022/emoji-markup.html#emoji-markup","252":"/article/base.html#日拱一卒","253":"/frontend/babel/babel-analysis.html#babel原理分析","254":"/frontend/babel/babel-analysis.html#整体流程","255":"/frontend/babel/babel-analysis.html#parser","256":"/frontend/babel/babel-analysis.html#traverse","257":"/frontend/babel/babel-analysis.html#generate","258":"/frontend/babel/babel-plugin-guide.html#使用babel开发插件","259":"/frontend/babel/base.html#babel基本使用","260":"/frontend/babel/base.html#用途","261":"/frontend/babel/base.html#配置文件","262":"/frontend/babel/base.html#json","263":"/frontend/babel/base.html#function","264":"/frontend/babel/base.html#presets","265":"/frontend/babel/base.html#plugins","266":"/frontend/babel/base.html#常见预设","267":"/frontend/babel/base.html#常见插件","268":"/frontend/babel/base.html#项目和相对文件配置","269":"/frontend/babel/base.html#编译器假设compiler-assumptions","270":"/frontend/babel/base.html#参考文献","271":"/frontend/base.html#only-frontend","272":"/frontend/browser/base.html#现代浏览器架构","273":"/frontend/browser/base.html#cpu、gpu","274":"/frontend/browser/base.html#浏览器架构","275":"/frontend/browser/base.html#为什么要多进程","276":"/frontend/browser/base.html#输入url后发生了什么","277":"/frontend/browser/base.html#浏览器内核、渲染内核","278":"/frontend/browser/base.html#站点隔离","279":"/frontend/browser/base.html#页面渲染过程","280":"/frontend/browser/base.html#渲染优化","281":"/frontend/building-tool/base.html#前端主流构建工具","282":"/frontend/canvas/base.html#canvas","283":"/frontend/canvas/base.html#基本","284":"/frontend/canvas/base.html#文字","285":"/frontend/canvas/base.html#圆弧","286":"/frontend/canvas/base.html#坐标系转换","287":"/frontend/canvas/base.html#图像合成","288":"/frontend/canvas/base.html#裁剪","289":"/frontend/canvas/base.html#状态保存恢复","290":"/frontend/canvas/base.html#像素操作","291":"/frontend/canvas/base.html#交互","292":"/frontend/cli/#cli","293":"/frontend/cli/#参考文献","294":"/frontend/compiler/#compiler","295":"/frontend/computer-network/arp-protocol.html#arp协议","296":"/frontend/computer-network/arp-protocol.html#通信过程","297":"/frontend/computer-network/arp-protocol.html#arp首部","298":"/frontend/computer-network/arp-protocol.html#arp缓存表","299":"/frontend/computer-network/arp-protocol.html#动态arp表","300":"/frontend/computer-network/arp-protocol.html#静态arp表","301":"/frontend/computer-network/arp-protocol.html#rarp","302":"/frontend/computer-network/arp-protocol.html#代理arp","303":"/frontend/computer-network/arp-protocol.html#arp欺骗","304":"/frontend/computer-network/arp-protocol.html#arp泛洪","305":"/frontend/computer-network/arp-protocol.html#总结","306":"/frontend/computer-network/arp-protocol.html#参考文献","307":"/frontend/computer-network/base.html#计算机网络","308":"/frontend/computer-network/base.html#网络层次划分","309":"/frontend/computer-network/base.html#osi模型","310":"/frontend/computer-network/base.html#tcp-ip模型","311":"/frontend/computer-network/base.html#传输过程","312":"/frontend/computer-network/base.html#tcp-ip协议","313":"/frontend/computer-network/base.html#为什么要懂计算机网络","314":"/frontend/computer-network/base.html#参考文献","315":"/frontend/computer-network/http-protocol.html#http协议及安全防范","316":"/frontend/computer-network/http-protocol.html#uri、url、urn","317":"/frontend/computer-network/http-protocol.html#常见状态码","318":"/frontend/computer-network/http-protocol.html#http报文","319":"/frontend/computer-network/http-protocol.html#首部字段","320":"/frontend/computer-network/http-protocol.html#请求方法","321":"/frontend/computer-network/http-protocol.html#http演变","322":"/frontend/computer-network/http-protocol.html#http-1-1","323":"/frontend/computer-network/http-protocol.html#http-2","324":"/frontend/computer-network/http-protocol.html#多路复用","325":"/frontend/computer-network/http-protocol.html#serverpush","326":"/frontend/computer-network/http-protocol.html#头部压缩","327":"/frontend/computer-network/http-protocol.html#http-3","328":"/frontend/computer-network/http-protocol.html#https","329":"/frontend/computer-network/http-protocol.html#ssl-tls","330":"/frontend/computer-network/http-protocol.html#对称-非对称加密","331":"/frontend/computer-network/http-protocol.html#tls握手","332":"/frontend/computer-network/http-protocol.html#i、rsa握手","333":"/frontend/computer-network/http-protocol.html#ii、dh-diffie-hellman-握手","334":"/frontend/computer-network/http-protocol.html#iii、tls1-3握手","335":"/frontend/computer-network/http-protocol.html#http缓存","336":"/frontend/computer-network/http-protocol.html#跨域","337":"/frontend/computer-network/http-protocol.html#简单、非简单请求","338":"/frontend/computer-network/http-protocol.html#jsonp","339":"/frontend/computer-network/http-protocol.html#cors","340":"/frontend/computer-network/http-protocol.html#postmessage","341":"/frontend/computer-network/http-protocol.html#数据传输","342":"/frontend/computer-network/http-protocol.html#定长传输","343":"/frontend/computer-network/http-protocol.html#不定长传输","344":"/frontend/computer-network/http-protocol.html#范围请求","345":"/frontend/computer-network/http-protocol.html#大文件上传与下载","346":"/frontend/computer-network/http-protocol.html#身份认证","347":"/frontend/computer-network/http-protocol.html#cookie","348":"/frontend/computer-network/http-protocol.html#session","349":"/frontend/computer-network/http-protocol.html#http攻击","350":"/frontend/computer-network/http-protocol.html#xss","351":"/frontend/computer-network/http-protocol.html#csrf","352":"/frontend/computer-network/http-protocol.html#csrf攻击演示","353":"/frontend/computer-network/http-protocol.html#那么如何防止csrf攻击呢","354":"/frontend/computer-network/http-protocol.html#websocket","355":"/frontend/computer-network/http-protocol.html#参考文档","356":"/frontend/computer-network/http-protocol.html#总结","357":"/frontend/computer-network/ip-protocol.html#ip协议","358":"/frontend/computer-network/ip-protocol.html#ip地址","359":"/frontend/computer-network/ip-protocol.html#ip地址分类","360":"/frontend/computer-network/ip-protocol.html#私网地址","361":"/frontend/computer-network/ip-protocol.html#回环地址","362":"/frontend/computer-network/ip-protocol.html#网络划分","363":"/frontend/computer-network/ip-protocol.html#子网掩码","364":"/frontend/computer-network/ip-protocol.html#划分实现","365":"/frontend/computer-network/ip-protocol.html#广播、多播","366":"/frontend/computer-network/ip-protocol.html#ipv6","367":"/frontend/computer-network/ip-protocol.html#ip首部","368":"/frontend/computer-network/ip-protocol.html#生存期ttl","369":"/frontend/computer-network/ip-protocol.html#ip分片、重组","370":"/frontend/computer-network/ip-protocol.html#nat","371":"/frontend/computer-network/ip-protocol.html#网关、路由器","372":"/frontend/computer-network/ip-protocol.html#总结","373":"/frontend/computer-network/ip-protocol.html#参考文献","374":"/frontend/computer-network/tcp-protocol.html#tcp协议","375":"/frontend/computer-network/tcp-protocol.html#特点","376":"/frontend/computer-network/tcp-protocol.html#tcp首部","377":"/frontend/computer-network/tcp-protocol.html#连接与终止","378":"/frontend/computer-network/tcp-protocol.html#三次握手","379":"/frontend/computer-network/tcp-protocol.html#重置连接","380":"/frontend/computer-network/tcp-protocol.html#连接队列","381":"/frontend/computer-network/tcp-protocol.html#syn泛洪","382":"/frontend/computer-network/tcp-protocol.html#四次挥手","383":"/frontend/computer-network/tcp-protocol.html#查看tcp状态","384":"/frontend/computer-network/tcp-protocol.html#半连接、半断开、半打开","385":"/frontend/computer-network/tcp-protocol.html#数据传输","386":"/frontend/computer-network/tcp-protocol.html#分段传输","387":"/frontend/computer-network/tcp-protocol.html#滑动窗口","388":"/frontend/computer-network/tcp-protocol.html#重传机制","389":"/frontend/computer-network/tcp-protocol.html#rtt、rto","390":"/frontend/computer-network/tcp-protocol.html#超时重传","391":"/frontend/computer-network/tcp-protocol.html#快速重传","392":"/frontend/computer-network/tcp-protocol.html#拥塞控制","393":"/frontend/computer-network/tcp-protocol.html#慢启动","394":"/frontend/computer-network/tcp-protocol.html#拥塞避免","395":"/frontend/computer-network/tcp-protocol.html#总结","396":"/frontend/computer-network/tcp-protocol.html#参考文献","397":"/frontend/debug-skill/base.html#debug-skill","398":"/frontend/debug-skill/base.html#调试node程序","399":"/frontend/debug-skill/base.html#node-debugger模式-chrome调试","400":"/frontend/debug-skill/base.html#node-debugger模式-vscode调试","401":"/frontend/debug-skill/base.html#仅vscode调试","402":"/frontend/debug-skill/base.html#调试需编译的程序","403":"/frontend/debug-skill/base.html#调试网页程序","404":"/frontend/debug-skill/base.html#网页七大断点技巧","405":"/frontend/debug-skill/base.html#调试react","406":"/frontend/debug-skill/base.html#调试vue","407":"/frontend/debug-skill/base.html#线上override调试","408":"/frontend/debug-skill/base.html#线上调试-异常上报-监控系统-map映射","409":"/frontend/debug-skill/base.html#手动添加","410":"/frontend/debug-skill/base.html#自动映射","411":"/frontend/debug-skill/charles.html#charles抓包工具","412":"/frontend/debug-skill/charles.html#下载安装","413":"/frontend/debug-skill/charles.html#面板介绍","414":"/frontend/debug-skill/charles.html#菜单栏","415":"/frontend/debug-skill/charles.html#工具栏","416":"/frontend/debug-skill/charles.html#抓包记录","417":"/frontend/debug-skill/charles.html#抓包详情","418":"/frontend/debug-skill/charles.html#请求代理与篡改","419":"/frontend/debug-skill/charles.html#断点调试","420":"/frontend/debug-skill/charles.html#弱网测试","421":"/frontend/debug-skill/charles.html#配置https","422":"/frontend/debug-skill/charles.html#客户端抓包","423":"/frontend/debug-skill/charles.html#汉化补丁","424":"/frontend/debug-skill/charles.html#常见问题","425":"/frontend/debug-skill/charles.html#本地地址无法抓取","426":"/frontend/debug-skill/charles.html#总结","427":"/frontend/debug-skill/chrome.html#chrome","428":"/frontend/debug-skill/fiddler.html#fiddler抓包","429":"/frontend/debug-skill/fiddler.html#面板介绍","430":"/frontend/debug-skill/fiddler.html#菜单栏","431":"/frontend/debug-skill/fiddler.html#工具栏","432":"/frontend/debug-skill/fiddler.html#代理监控面板","433":"/frontend/debug-skill/fiddler.html#execquick和状态栏","434":"/frontend/debug-skill/fiddler.html#execquick","435":"/frontend/debug-skill/fiddler.html#状态栏","436":"/frontend/debug-skill/fiddler.html#详情面板","437":"/frontend/debug-skill/fiddler.html#面板小结","438":"/frontend/debug-skill/fiddler.html#客户端抓包","439":"/frontend/debug-skill/fiddler.html#配置https","440":"/frontend/debug-skill/fiddler.html#总结","441":"/frontend/debug-skill/h5.html#h5","442":"/frontend/debug-skill/vscode.html#vscode","443":"/frontend/debug-skill/vscode.html#auto-attach","444":"/frontend/debug-skill/vscode.html#javascript-debug-terminal","445":"/frontend/debug-skill/vscode.html#launch-configuration","446":"/frontend/debug-skill/vscode.html#request-launch","447":"/frontend/debug-skill/vscode.html#request-attach","448":"/frontend/debug-skill/vscode.html#sourcemaps","449":"/frontend/debug-skill/wireshark.html#wireshark网络抓包","450":"/frontend/debug-skill/wireshark.html#下载安装","451":"/frontend/debug-skill/wireshark.html#菜单栏","452":"/frontend/debug-skill/wireshark.html#工具栏","453":"/frontend/debug-skill/wireshark.html#过滤器","454":"/frontend/debug-skill/wireshark.html#arp协议","455":"/frontend/debug-skill/wireshark.html#tcp协议","456":"/frontend/debug-skill/wireshark.html#三次握手","457":"/frontend/debug-skill/wireshark.html#四次挥手","458":"/frontend/debug-skill/wireshark.html#http协议","459":"/frontend/debug-skill/wireshark.html#统计","460":"/frontend/debug-skill/wireshark.html#小结","461":"/frontend/desktop-app/#desktop-app","462":"/frontend/editor/#编辑器相关","463":"/frontend/flutter/base.html#flutter","464":"/frontend/hybrid-app/base.html#混合应用","465":"/frontend/js/async.html#javascript异步编程","466":"/frontend/js/async.html#同步和异步","467":"/frontend/js/async.html#为什么需要异步","468":"/frontend/js/async.html#异步-影子","469":"/frontend/js/async.html#回调函数","470":"/frontend/js/async.html#事件监听","471":"/frontend/js/async.html#发布订阅","472":"/frontend/js/async.html#promise","473":"/frontend/js/async.html#迭代器generator","474":"/frontend/js/async.html#async-await","475":"/frontend/js/audio.html#音视频","476":"/frontend/js/audio.html#音频可视化","477":"/frontend/js/base.html#你不知道的javascript","478":"/frontend/js/binary.html#走进前端二进制","479":"/frontend/js/binary.html#arraybuffer","480":"/frontend/js/binary.html#视图对象","481":"/frontend/js/binary.html#typearray","482":"/frontend/js/binary.html#uint8array","483":"/frontend/js/binary.html#构造函数","484":"/frontend/js/binary.html#属性","485":"/frontend/js/binary.html#方法","486":"/frontend/js/binary.html#dataview","487":"/frontend/js/binary.html#构造方法","488":"/frontend/js/binary.html#属性-1","489":"/frontend/js/binary.html#方法-1","490":"/frontend/js/binary.html#视图对象总结","491":"/frontend/js/binary.html#字符二进制","492":"/frontend/js/binary.html#字符二进制流","493":"/frontend/js/binary.html#blob","494":"/frontend/js/binary.html#构造器","495":"/frontend/js/binary.html#属性-2","496":"/frontend/js/binary.html#方法-2","497":"/frontend/js/binary.html#用途","498":"/frontend/js/binary.html#file","499":"/frontend/js/binary.html#file对象","500":"/frontend/js/binary.html#属性-3","501":"/frontend/js/binary.html#方法-3","502":"/frontend/js/binary.html#filereader","503":"/frontend/js/binary.html#构造函数-1","504":"/frontend/js/binary.html#属性-4","505":"/frontend/js/binary.html#事件","506":"/frontend/js/binary.html#方法-4","507":"/frontend/js/binary.html#filereadersync","508":"/frontend/js/binary.html#stream","509":"/frontend/js/binary.html#readablestream","510":"/frontend/js/binary.html#构造函数-2","511":"/frontend/js/binary.html#实例属性","512":"/frontend/js/binary.html#实例方法","513":"/frontend/js/binary.html#writablestream","514":"/frontend/js/binary.html#构造函数-3","515":"/frontend/js/binary.html#实例属性-1","516":"/frontend/js/binary.html#实例方法-1","517":"/frontend/js/binary.html#transformstream","518":"/frontend/js/binary.html#response-body","519":"/frontend/js/binary.html#实践","520":"/frontend/js/binary.html#视频流","521":"/frontend/js/binary.html#文件下载","522":"/frontend/js/binary.html#大文件上传","523":"/frontend/js/eventloop.html#eventloop事件循环机制","524":"/frontend/js/eventloop.html#前言","525":"/frontend/js/eventloop.html#js的engine和runtime","526":"/frontend/js/eventloop.html#了解浏览器","527":"/frontend/js/eventloop.html#事件驱动","528":"/frontend/js/eventloop.html#浏览器的eventloop","529":"/frontend/js/eventloop.html#调用栈","530":"/frontend/js/eventloop.html#堆","531":"/frontend/js/eventloop.html#任务队列","532":"/frontend/js/eventloop.html#macrotask和microtask","533":"/frontend/js/eventloop.html#定时器误差","534":"/frontend/js/eventloop.html#视图更新时机","535":"/frontend/js/eventloop.html#requestanimationframe","536":"/frontend/js/eventloop.html#浏览器eventloop总结","537":"/frontend/js/eventloop.html#node的eventloop","538":"/frontend/js/eventloop.html#执行阶段","539":"/frontend/js/eventloop.html#settimeout和setimmediate","540":"/frontend/js/eventloop.html#process-nexttick","541":"/frontend/js/eventloop.html#总结","542":"/frontend/js/implicit-conversion.html#js类型隐式转换与装箱拆箱","543":"/frontend/js/implicit-conversion.html#装箱与拆箱","544":"/frontend/js/implicit-conversion.html#装箱","545":"/frontend/js/implicit-conversion.html#拆箱","546":"/frontend/js/implicit-conversion.html#toprimitive、-ordinarytoprimitive","547":"/frontend/js/implicit-conversion.html#类型隐式转换","548":"/frontend/js/implicit-conversion.html#算术运算符转换","549":"/frontend/js/implicit-conversion.html#减乘除","550":"/frontend/js/implicit-conversion.html#加运算","551":"/frontend/js/implicit-conversion.html#逻辑运算转换","552":"/frontend/js/implicit-conversion.html#运算转换","553":"/frontend/js/implicit-conversion.html#运算转换-1","554":"/frontend/js/implicit-conversion.html#问题","555":"/frontend/js/implicit-conversion.html#总结","556":"/frontend/js/js-gc.html#js垃圾回收机制","557":"/frontend/js/js-gc.html#引用计数法","558":"/frontend/js/js-gc.html#标记清除法","559":"/frontend/js/js-gc.html#分代式回收","560":"/frontend/js/js-gc.html#新生代","561":"/frontend/js/js-gc.html#老生代","562":"/frontend/js/js-gc.html#并行回收","563":"/frontend/js/js-gc.html#增量标记","564":"/frontend/js/js-gc.html#三色标记法","565":"/frontend/js/js-gc.html#写屏障","566":"/frontend/js/js-gc.html#惰性清理","567":"/frontend/js/js-gc.html#并发回收","568":"/frontend/js/js-gc.html#参考文档","569":"/frontend/js/meta-coding.html#javascript元编程","570":"/frontend/js/proto-inherit.html#原型、原型链与继承","571":"/frontend/js/proto-inherit.html#什么是原型与原型链","572":"/frontend/js/proto-inherit.html#属性访问器","573":"/frontend/js/proto-inherit.html#构造函数","574":"/frontend/js/proto-inherit.html#object-create","575":"/frontend/js/proto-inherit.html#object-setprototypeof-getprototypeof","576":"/frontend/js/proto-inherit.html#new内幕","577":"/frontend/js/proto-inherit.html#原型链继承","578":"/frontend/js/proto-inherit.html#构造函数继承","579":"/frontend/js/proto-inherit.html#原型式继承","580":"/frontend/js/proto-inherit.html#组合式继承","581":"/frontend/js/proto-inherit.html#寄生式继承","582":"/frontend/js/proto-inherit.html#寄生组合式继承","583":"/frontend/js/proto-inherit.html#class继承","584":"/frontend/js/proto-inherit.html#总结","585":"/frontend/js/scope-closure.html#作用域、执行上下文、作用域链和闭包","586":"/frontend/js/scope-closure.html#变量声明与提升","587":"/frontend/js/scope-closure.html#变量声明","588":"/frontend/js/scope-closure.html#变量提升和暂时性死区","589":"/frontend/js/scope-closure.html#作用域","590":"/frontend/js/scope-closure.html#词法环境","591":"/frontend/js/scope-closure.html#作用域链","592":"/frontend/js/scope-closure.html#执行栈","593":"/frontend/js/scope-closure.html#执行上下文","594":"/frontend/js/scope-closure.html#闭包","595":"/frontend/js/scope-closure.html#闭包的优点和缺点","596":"/frontend/js/scope-closure.html#总结","597":"/frontend/lowcoding/base.html#lowcoding","598":"/frontend/micro-frontend/base.html#微前端","599":"/frontend/micro-program/#micro-program","600":"/frontend/monitor/base.html#前端监控系统","601":"/frontend/nestjs/base.html#nestjs基础教程","602":"/frontend/nestjs/base.html#安装","603":"/frontend/nestjs/base.html#程序入口","604":"/frontend/nestjs/base.html#module","605":"/frontend/nestjs/base.html#controllers","606":"/frontend/nestjs/base.html#providers","607":"/frontend/nestjs/base.html#imports","608":"/frontend/nestjs/base.html#exports","609":"/frontend/nestjs/base.html#动态模块","610":"/frontend/nestjs/base.html#controller","611":"/frontend/nestjs/base.html#路由分组","612":"/frontend/nestjs/base.html#路由定义","613":"/frontend/nestjs/base.html#参数处理","614":"/frontend/nestjs/base.html#请求对象","615":"/frontend/nestjs/base.html#状态码","616":"/frontend/nestjs/base.html#头信息","617":"/frontend/nestjs/base.html#重定向","618":"/frontend/nestjs/base.html#子域路由","619":"/frontend/nestjs/base.html#自定义装饰器","620":"/frontend/nestjs/base.html#scope作用域","621":"/frontend/nestjs/base.html#生命周期","622":"/frontend/nestjs/base.html#service","623":"/frontend/nestjs/base.html#依赖注入","624":"/frontend/nestjs/base.html#使用","625":"/frontend/nestjs/base.html#作用域","626":"/frontend/nestjs/base.html#可选项-optional","627":"/frontend/nestjs/base.html#应用配置","628":"/frontend/nestjs/base.html#configmodule","629":"/frontend/nestjs/base.html#configservice","630":"/frontend/nestjs/base.html#自定义配置","631":"/frontend/nestjs/base.html#registeras-命名空间","632":"/frontend/nestjs/base.html#校验","633":"/frontend/nestjs/base.html#middleware","634":"/frontend/nestjs/base.html#创建配置","635":"/frontend/nestjs/base.html#注册","636":"/frontend/nestjs/base.html#exception-filter","637":"/frontend/nestjs/base.html#基本使用","638":"/frontend/nestjs/base.html#内置filter","639":"/frontend/nestjs/base.html#自定义filter-catch","640":"/frontend/nestjs/base.html#绑定filter","641":"/frontend/nestjs/base.html#pipe","642":"/frontend/nestjs/base.html#基本使用-1","643":"/frontend/nestjs/base.html#绑定pipe","644":"/frontend/nestjs/base.html#内置pipe","645":"/frontend/nestjs/base.html#自定义pipe","646":"/frontend/nestjs/base.html#class-transformer、class-validator","647":"/frontend/nestjs/base.html#guard","648":"/frontend/nestjs/base.html#基本使用-2","649":"/frontend/nestjs/base.html#绑定guard","650":"/frontend/nestjs/base.html#interceptor","651":"/frontend/nestjs/base.html#自定义interceptor","652":"/frontend/nestjs/base.html#绑定interceptor","653":"/frontend/nestjs/base.html#logger","654":"/frontend/nestjs/base.html#版本控制","655":"/frontend/nestjs/base.html#基本使用-3","656":"/frontend/nestjs/base.html#自定义版本","657":"/frontend/nestjs/base.html#任务调度","658":"/frontend/nestjs/base.html#安装-1","659":"/frontend/nestjs/base.html#模块注册","660":"/frontend/nestjs/base.html#注册调度任务","661":"/frontend/nestjs/base.html#动态调度","662":"/frontend/nestjs/base.html#总结","663":"/frontend/nestjs/base.html#参考文档","664":"/frontend/nestjs/mvc.html#nest搭建web服务","665":"/frontend/nestjs/mvc.html#起步","666":"/frontend/nestjs/mvc.html#路由配置","667":"/frontend/nestjs/mvc.html#服务配置","668":"/frontend/nestjs/mvc.html#应用配置","669":"/frontend/nestjs/mvc.html#配置文件","670":"/frontend/nestjs/mvc.html#内置功能","671":"/frontend/nestjs/mvc.html#模板引擎","672":"/frontend/nestjs/mvc.html#国际化","673":"/frontend/nestjs/mvc.html#注册","674":"/frontend/nestjs/mvc.html#语言匹配","675":"/frontend/nestjs/mvc.html#控制器使用","676":"/frontend/nestjs/mvc.html#语言包","677":"/frontend/nestjs/mvc.html#其他","678":"/frontend/nestjs/swagger.html#nest使用swagger文档","679":"/frontend/nestjs/swagger.html#起步","680":"/frontend/nestjs/swagger.html#安装","681":"/frontend/nestjs/swagger.html#配置","682":"/frontend/nestjs/swagger.html#启动","683":"/frontend/nestjs/swagger.html#接口参数","684":"/frontend/nestjs/swagger.html#默认注入","685":"/frontend/nestjs/swagger.html#apiproperty","686":"/frontend/nestjs/swagger.html#显式定义","687":"/frontend/nestjs/swagger.html#模块划分","688":"/frontend/nestjs/swagger.html#其他","689":"/frontend/nestjs/swagger.html#参考文档","690":"/frontend/nestjs/useful.html#nest实用手册","691":"/frontend/nestjs/useful.html#跨域","692":"/frontend/nestjs/useful.html#基本配置","693":"/frontend/nestjs/useful.html#参考文档","694":"/frontend/nestjs/useful.html#静态资源","695":"/frontend/nestjs/useful.html#基本使用","696":"/frontend/nestjs/useful.html#资源压缩","697":"/frontend/nestjs/useful.html#gzip","698":"/frontend/nestjs/useful.html#参考文档-1","699":"/frontend/nestjs/useful.html#文件上传与下载","700":"/frontend/nestjs/useful.html#流文件","701":"/frontend/nestjs/useful.html#文件上传","702":"/frontend/nestjs/useful.html#websocket","703":"/frontend/nestjs/useful.html#部署","704":"/frontend/nginx/base.html#nginx使用手册","705":"/frontend/nginx/base.html#优势","706":"/frontend/nginx/base.html#功能","707":"/frontend/nginx/base.html#安装nginx","708":"/frontend/nginx/base.html#常用命令","709":"/frontend/nginx/base.html#配置文件","710":"/frontend/nginx/base.html#server","711":"/frontend/nginx/base.html#location","712":"/frontend/nginx/base.html#静态服务","713":"/frontend/nginx/base.html#访问控制","714":"/frontend/nginx/base.html#重定向","715":"/frontend/nginx/base.html#rewrite","716":"/frontend/nginx/base.html#return","717":"/frontend/nginx/base.html#gzip压缩","718":"/frontend/nginx/base.html#图像转换","719":"/frontend/nginx/base.html#缓存","720":"/frontend/nginx/base.html#静态资源缓存","721":"/frontend/nginx/base.html#代理缓存","722":"/frontend/nginx/base.html#防盗链","723":"/frontend/nginx/base.html#反向代理","724":"/frontend/nginx/base.html#配置跨域","725":"/frontend/nginx/base.html#负载均衡","726":"/frontend/nginx/base.html#配置https","727":"/frontend/nginx/base.html#配置http2-3","728":"/frontend/nginx/base.html#keepalived实现高可用","729":"/frontend/nginx/base.html#内置变量","730":"/frontend/nginx/base.html#参考文档","731":"/frontend/node-bff/#node-bff","732":"/frontend/node-optimize/#node-optimize","733":"/frontend/node/base.html#nodejs基本使用","734":"/frontend/node/base.html#参考文档","735":"/frontend/node/node-debug.html#nodejs调试技巧","736":"/frontend/node/node-debug.html#参考文档","737":"/frontend/node/node-framework.html#nodejs常见框架","738":"/frontend/node/node-measure.html#nodejs性能优化","739":"/frontend/node/node-measure.html#压测","740":"/frontend/node/node-measure.html#分析","741":"/frontend/node/node-process.html#nodejs多进程与多线程","742":"/frontend/node/node-web.html#nodejs搭建web服务","743":"/frontend/npm/#npm-package","744":"/frontend/pattern/base.html#设计模式","745":"/frontend/pattern/base.html#订阅-发布模式-观察者","746":"/frontend/pattern/base.html#单例模式","747":"/frontend/pattern/base.html#策略模式","748":"/frontend/pattern/base.html#代理模式","749":"/frontend/pattern/base.html#装饰器模式","750":"/frontend/pattern/base.html#外观模式","751":"/frontend/pattern/base.html#工厂模式","752":"/frontend/pattern/base.html#建造者模式builder","753":"/frontend/pattern/base.html#迭代器模式","754":"/frontend/pattern/base.html#享元模式","755":"/frontend/pattern/base.html#职责链模式","756":"/frontend/pattern/base.html#适配器模式","757":"/frontend/pattern/base.html#模板方法模式","758":"/frontend/pattern/base.html#中介者模式","759":"/frontend/pattern/base.html#备忘录模式","760":"/frontend/pattern/base.html#总结","761":"/frontend/pattern/base.html#参考文档","762":"/frontend/performance/base.html#前端性能优化","763":"/frontend/performance/cache.html#缓存策略","764":"/frontend/performance/chunk-upload.html#如何实现大文件上传","765":"/frontend/performance/chunk-upload.html#文件上传","766":"/frontend/performance/chunk-upload.html#大文件问题","767":"/frontend/performance/chunk-upload.html#解决方案","768":"/frontend/performance/chunk-upload.html#文件切片","769":"/frontend/performance/chunk-upload.html#切片上传与合并","770":"/frontend/performance/chunk-upload.html#切片合并","771":"/frontend/performance/chunk-upload.html#并发限制","772":"/frontend/performance/chunk-upload.html#断点续传","773":"/frontend/performance/chunk-upload.html#切片优化","774":"/frontend/performance/chunk-upload.html#文件秒传","775":"/frontend/performance/chunk-upload.html#功能完善","776":"/frontend/performance/chunk-upload.html#总结","777":"/frontend/performance/range-download.html#大文件下载","778":"/frontend/performance/seo.html#seo优化","779":"/frontend/performance/seo.html#参考文档","780":"/frontend/performance/virtual-scroll-1.html#虚拟滚动","781":"/frontend/performance/virtual-scroll-2.html#虚拟滚动","782":"/frontend/project-integration/base.html#项目集成","783":"/frontend/project-integration/base.html#常见无规范问题","784":"/frontend/project-integration/build-tool.html#项目集成之打包工具","785":"/frontend/project-integration/choose-editor.html#项目集成之编辑器","786":"/frontend/project-integration/framework.html#项目集成之框架选型","787":"/frontend/project-integration/git-commit.html#项目集成之提交规范","788":"/frontend/project-integration/git-commit.html#约定式提交","789":"/frontend/project-integration/git-commit.html#提交类型","790":"/frontend/project-integration/git-commit.html#作用域","791":"/frontend/project-integration/git-commit.html#主题","792":"/frontend/project-integration/git-commit.html#breaking-changes","793":"/frontend/project-integration/git-commit.html#关联issue","794":"/frontend/project-integration/git-commit.html#作用","795":"/frontend/project-integration/git-commit.html#commitlint","796":"/frontend/project-integration/git-commit.html#安装","797":"/frontend/project-integration/git-commit.html#配置","798":"/frontend/project-integration/git-commit.html#commitizen","799":"/frontend/project-integration/git-commit.html#安装-1","800":"/frontend/project-integration/git-commit.html#使用","801":"/frontend/project-integration/git-commit.html#自定义规范","802":"/frontend/project-integration/git-commit.html#结合commitlint","803":"/frontend/project-integration/git-commit.html#husky","804":"/frontend/project-integration/git-commit.html#安装配置","805":"/frontend/project-integration/git-commit.html#集成lint","806":"/frontend/project-integration/git-commit.html#集成commitlint","807":"/frontend/project-integration/git-commit.html#参考文档","808":"/frontend/project-integration/monorepo.html#项目集成之monorepo","809":"/frontend/project-integration/monorepo.html#发展历程","810":"/frontend/project-integration/monorepo.html#概念","811":"/frontend/project-integration/monorepo.html#作用","812":"/frontend/project-integration/monorepo.html#包管理方案","813":"/frontend/project-integration/monorepo.html#npm","814":"/frontend/project-integration/monorepo.html#yarn","815":"/frontend/project-integration/monorepo.html#pnpm","816":"/frontend/project-integration/monorepo.html#构建方案","817":"/frontend/project-integration/monorepo.html#turbo","818":"/frontend/project-integration/monorepo.html#nx","819":"/frontend/project-integration/monorepo.html#rush","820":"/frontend/project-integration/monorepo.html#版本方案","821":"/frontend/project-integration/monorepo.html#changesets","822":"/frontend/project-integration/monorepo.html#实战","823":"/frontend/project-integration/specification.html#项目集成之语法规范","824":"/frontend/project-integration/specification.html#重要性","825":"/frontend/project-integration/specification.html#如何做","826":"/frontend/project-integration/specification.html#eslint","827":"/frontend/project-integration/specification.html#配置文件","828":"/frontend/project-integration/specification.html#environments、globals","829":"/frontend/project-integration/specification.html#parser、parseroptions","830":"/frontend/project-integration/specification.html#rules、overrides","831":"/frontend/project-integration/specification.html#plugins、extends","832":"/frontend/project-integration/specification.html#编辑器集成","833":"/frontend/project-integration/specification.html#规则集","834":"/frontend/project-integration/specification.html#typescript","835":"/frontend/project-integration/style.html#项目集成之风格指南","836":"/frontend/project-integration/style.html#editorconfig","837":"/frontend/project-integration/style.html#prettier","838":"/frontend/project-integration/style.html#配置插件","839":"/frontend/project-integration/style.html#配置文件","840":"/frontend/project-integration/style.html#集成eslint","841":"/frontend/project-integration/style.html#prettierignore","842":"/frontend/project-integration/style.html#stylelint","843":"/frontend/project-integration/style.html#插件安装、配置","844":"/frontend/project-integration/style.html#项目安装","845":"/frontend/project-integration/style.html#plugins","846":"/frontend/project-integration/style.html#extends","847":"/frontend/project-integration/style.html#rules、overrides","848":"/frontend/project-integration/style.html#stylelintignore","849":"/frontend/project-integration/style.html#脚本","850":"/frontend/project-integration/style.html#css-bem命名约定","851":"/frontend/project-integration/test-framework.html#前端自动化测试","852":"/frontend/project-integration/test-framework.html#单测和端测区别","853":"/frontend/project-integration/test-framework.html#单元测试-unit","854":"/frontend/project-integration/test-framework.html#端到端测试-end-to-end","855":"/frontend/project-integration/test-framework.html#单元测试-jest","856":"/frontend/project-integration/test-framework.html#安装","857":"/frontend/project-integration/test-framework.html#初始化","858":"/frontend/project-integration/test-framework.html#转译器","859":"/frontend/project-integration/test-framework.html#基本断言","860":"/frontend/project-integration/test-framework.html#执行测试","861":"/frontend/project-integration/test-framework.html#路径映射","862":"/frontend/project-integration/test-framework.html#配置jest路径映射","863":"/frontend/project-integration/test-framework.html#配置tsconfig","864":"/frontend/project-integration/test-framework.html#dom测试","865":"/frontend/project-integration/test-framework.html#异步测试","866":"/frontend/project-integration/test-framework.html#使用promise","867":"/frontend/project-integration/test-framework.html#使用async测试","868":"/frontend/project-integration/test-framework.html#使用回调函数","869":"/frontend/project-integration/test-framework.html#模拟函数","870":"/frontend/project-integration/test-framework.html#定时器","871":"/frontend/project-integration/test-framework.html#setup配置","872":"/frontend/project-integration/test-framework.html#覆盖率","873":"/frontend/project-integration/test-framework.html#开启覆盖率","874":"/frontend/project-integration/test-framework.html#测试覆盖率","875":"/frontend/project-integration/test-framework.html#vue组件测试","876":"/frontend/project-integration/test-framework.html#端到端测试-cypress","877":"/frontend/project-integration/test-framework.html#安装使用","878":"/frontend/project-integration/test-framework.html#配置","879":"/frontend/project-integration/test-framework.html#基本端测","880":"/frontend/project-integration/test-framework.html#代码覆盖率","881":"/frontend/project-integration/test-framework.html#钩子函数","882":"/frontend/project-integration/test-framework.html#常见问题","883":"/frontend/project-integration/test-framework.html#参考文档","884":"/frontend/react/#react","885":"/frontend/regexp/base.html#正则表达式","886":"/frontend/regexp/base.html#一个例子","887":"/frontend/regexp/base.html#修饰符","888":"/frontend/regexp/base.html#字符类","889":"/frontend/regexp/base.html#例子","890":"/frontend/regexp/base.html#复用","891":"/frontend/regexp/base.html#选择、组合、捕获、引用","892":"/frontend/regexp/base.html#选择","893":"/frontend/regexp/base.html#组合-字符集合范围","894":"/frontend/regexp/base.html#捕获","895":"/frontend/regexp/base.html#引用","896":"/frontend/regexp/base.html#断言","897":"/frontend/regexp/base.html#前瞻断言","898":"/frontend/regexp/base.html#后瞻断言","899":"/frontend/regexp/base.html#贪婪与惰性","900":"/frontend/regexp/base.html#regexp属性、方法","901":"/frontend/regexp/base.html#属性","902":"/frontend/regexp/base.html#方法","903":"/frontend/regexp/base.html#string常见的正则方法","904":"/frontend/render-mode/base.html#渲染模式","905":"/frontend/sandbox/#sandbox","906":"/frontend/ts/base.html#typescript","907":"/frontend/ts/base.html#基础类型","908":"/frontend/ts/base.html#内置null-undefined-void","909":"/frontend/ts/base.html#内置any-unknown-never","910":"/frontend/ts/base.html#枚举","911":"/frontend/ts/base.html#接口interface和类型别名type","912":"/frontend/ts/base.html#联合类型和交叉类型","913":"/frontend/ts/base.html#索引类型keyof","914":"/frontend/ts/base.html#类型查询typeof","915":"/frontend/ts/base.html#类型守卫","916":"/frontend/ts/base.html#类class","917":"/frontend/ts/base.html#泛型","918":"/frontend/ts/base.html#条件类型","919":"/frontend/ts/base.html#鸭子辨形","920":"/frontend/ts/base.html#内置工具类型","921":"/frontend/ts/base.html#常用","922":"/frontend/ts/ts-configure.html#typescript配置文件","923":"/frontend/visual/#visual","924":"/frontend/vue/component-render.html#vue源码分析之组件创建","925":"/frontend/vue/component-render.html#vnode","926":"/frontend/vue/component-render.html#render","927":"/frontend/vue/computed-watch.html#vue源码分析之计算属性与侦听函数","928":"/frontend/vue/computed-watch.html#计算属性","929":"/frontend/vue/computed-watch.html#简单使用","930":"/frontend/vue/computed-watch.html#计算属性缓存","931":"/frontend/vue/computed-watch.html#计算属性本质","932":"/frontend/vue/computed-watch.html#原理实现","933":"/frontend/vue/computed-watch.html#代码调试","934":"/frontend/vue/computed-watch.html#vue3的computed","935":"/frontend/vue/computed-watch.html#侦听函数","936":"/frontend/vue/computed-watch.html#简单使用-1","937":"/frontend/vue/computed-watch.html#初始化过程","938":"/frontend/vue/computed-watch.html#watch","939":"/frontend/vue/computed-watch.html#immediate","940":"/frontend/vue/computed-watch.html#事件卸载","941":"/frontend/vue/computed-watch.html#deep","942":"/frontend/vue/computed-watch.html#sync","943":"/frontend/vue/computed-watch.html#注意事项","944":"/frontend/vue/computed-watch.html#vue3的watch","945":"/frontend/vue/computed-watch.html#watcheffect","946":"/frontend/vue/computed-watch.html#总结","947":"/frontend/vue/pinia.html#pinia源码分析","948":"/frontend/vue/reactivity.html#vue源码分析之响应式原理","949":"/frontend/vue/reactivity.html#vue2分析","950":"/frontend/vue/reactivity.html#简单实现","951":"/frontend/vue/reactivity.html#依赖自动收集与更新","952":"/frontend/vue/reactivity.html#官方实现","953":"/frontend/vue/reactivity.html#整体流程","954":"/frontend/vue/reactivity.html#具体实现","955":"/frontend/vue/reactivity.html#数组实现","956":"/frontend/vue/reactivity.html#set原理","957":"/frontend/vue/reactivity.html#vue3分析","958":"/frontend/vue/reactivity.html#核心api","959":"/frontend/vue/reactivity.html#简单实现-1","960":"/frontend/vue/reactivity.html#深层嵌套","961":"/frontend/vue/reactivity.html#实现数组","962":"/frontend/vue/reactivity.html#实现ref","963":"/frontend/vue/reactivity.html#实现torefs","964":"/frontend/vue/reactivity.html#官方实现-1","965":"/frontend/vue/reactivity.html#响应式对比","966":"/frontend/vue/reactivity.html#源码调试技巧","967":"/frontend/vue/reactivity.html#ioc实现响应式","968":"/frontend/vue/reactivity.html#总结","969":"/frontend/vue/router.html#vuerouter源码分析","970":"/frontend/vue/slot.html#vue源码分析之插槽","971":"/frontend/vue/template-compiler.html#vue源码分析之模板编译","972":"/frontend/vue/transition.html#vue源码分析之过渡","973":"/frontend/vue/update-process.html#vue源码分析之视图更新","974":"/frontend/vue/update-process.html#patch","975":"/frontend/vue/update-process.html#nexktick","976":"/frontend/vue/vuex.html#vuex源码分析","977":"/frontend/wasm/base.html#webassembly","978":"/frontend/wasm/base.html#用途","979":"/frontend/wasm/base.html#使用","980":"/frontend/wasm/base.html#参考文档","981":"/frontend/webpack/base.html#webpack基本使用","982":"/frontend/webpack/webpack-analysis.html#webpack原理分析","983":"/frontend/webpack/webpack-analysis.html#什么是loader","984":"/frontend/webpack/webpack-analysis.html#什么是plugin","985":"/frontend/webpack/webpack-analysis.html#整体流程","986":"/frontend/webpack/webpack-analysis.html#核心模块","987":"/frontend/webpack/webpack-analysis.html#运行时","988":"/frontend/webpack/webpack-loader.html#webpack自定义loader","989":"/frontend/webpack/webpack-node.html#webpack结合nodejs使用","990":"/frontend/webpack/webpack-plugin.html#webpack自定义插件","991":"/fullstack/base.html#to-fullstack","992":"/fullstack/docker/base-tutorial.html#docker基础教程","993":"/fullstack/docker/base-tutorial.html#docker架构","994":"/fullstack/docker/base-tutorial.html#全局命令","995":"/fullstack/docker/base-tutorial.html#核心组件","996":"/fullstack/docker/base-tutorial.html#镜像","997":"/fullstack/docker/base-tutorial.html#镜像层","998":"/fullstack/docker/base-tutorial.html#查看本地镜像","999":"/fullstack/docker/base-tutorial.html#搜索、下载、推送","1000":"/fullstack/docker/base-tutorial.html#创建、删除","1001":"/fullstack/docker/base-tutorial.html#其他命令","1002":"/fullstack/docker/base-tutorial.html#虚悬镜像","1003":"/fullstack/docker/base-tutorial.html#容器","1004":"/fullstack/docker/base-tutorial.html#启动","1005":"/fullstack/docker/base-tutorial.html#进入容器","1006":"/fullstack/docker/base-tutorial.html#容器列表","1007":"/fullstack/docker/base-tutorial.html#容器日志","1008":"/fullstack/docker/base-tutorial.html#停止","1009":"/fullstack/docker/base-tutorial.html#删除","1010":"/fullstack/docker/base-tutorial.html#导入导出","1011":"/fullstack/docker/base-tutorial.html#仓库","1012":"/fullstack/docker/base-tutorial.html#公有仓库","1013":"/fullstack/docker/base-tutorial.html#私有仓库","1014":"/fullstack/docker/base-tutorial.html#认证","1015":"/fullstack/docker/base-tutorial.html#总结","1016":"/fullstack/docker/docker-compose.html#使用dockercompose部署服务","1017":"/fullstack/docker/docker-compose.html#优势","1018":"/fullstack/docker/docker-compose.html#初识dockercompose","1019":"/fullstack/docker/docker-compose.html#语法","1020":"/fullstack/docker/docker-compose.html#services","1021":"/fullstack/docker/docker-compose.html#image","1022":"/fullstack/docker/docker-compose.html#ports、networks、volumes","1023":"/fullstack/docker/docker-compose.html#depends-on","1024":"/fullstack/docker/docker-compose.html#environment","1025":"/fullstack/docker/docker-compose.html#restart","1026":"/fullstack/docker/docker-compose.html#更多","1027":"/fullstack/docker/docker-compose.html#命令","1028":"/fullstack/docker/docker-compose.html#build","1029":"/fullstack/docker/docker-compose.html#up","1030":"/fullstack/docker/docker-compose.html#stop","1031":"/fullstack/docker/docker-compose.html#rm","1032":"/fullstack/docker/docker-compose.html#kill","1033":"/fullstack/docker/docker-compose.html#更多-1","1034":"/fullstack/docker/docker-compose.html#实战","1035":"/fullstack/docker/docker-compose.html#参考文档","1036":"/fullstack/docker/docker-repository.html#搭建docker私有仓库","1037":"/fullstack/docker/docker-repository.html#官方registry搭建","1038":"/fullstack/docker/docker-repository.html#安装registry","1039":"/fullstack/docker/docker-repository.html#使用仓库","1040":"/fullstack/docker/docker-repository.html#使用nexus3搭建","1041":"/fullstack/docker/docker-repository.html#创建存储集","1042":"/fullstack/docker/docker-repository.html#创建仓库","1043":"/fullstack/docker/docker-repository.html#配置角色与用户","1044":"/fullstack/docker/docker-repository.html#配置realms","1045":"/fullstack/docker/docker-repository.html#登录仓库","1046":"/fullstack/docker/docker-repository.html#推送镜像","1047":"/fullstack/docker/docker-repository.html#下载镜像","1048":"/fullstack/docker/dockerfile.html#使用dockerfile构建镜像","1049":"/fullstack/docker/dockerfile.html#概念","1050":"/fullstack/docker/dockerfile.html#作用","1051":"/fullstack/docker/dockerfile.html#初识dockerfile","1052":"/fullstack/docker/dockerfile.html#语法","1053":"/fullstack/docker/dockerfile.html#from","1054":"/fullstack/docker/dockerfile.html#arg","1055":"/fullstack/docker/dockerfile.html#env","1056":"/fullstack/docker/dockerfile.html#workdir","1057":"/fullstack/docker/dockerfile.html#label","1058":"/fullstack/docker/dockerfile.html#run","1059":"/fullstack/docker/dockerfile.html#copy","1060":"/fullstack/docker/dockerfile.html#add","1061":"/fullstack/docker/dockerfile.html#volume","1062":"/fullstack/docker/dockerfile.html#expose","1063":"/fullstack/docker/dockerfile.html#cmd","1064":"/fullstack/docker/dockerfile.html#entrypoint","1065":"/fullstack/docker/dockerfile.html#onbuild","1066":"/fullstack/docker/dockerfile.html#healthcheck","1067":"/fullstack/docker/dockerfile.html#注意事项","1068":"/fullstack/docker/dockerfile.html#构建上下文","1069":"/fullstack/docker/dockerfile.html#镜像构建","1070":"/fullstack/docker/dockerfile.html#多阶段构建","1071":"/fullstack/docker/dockerfile.html#dockerignore","1072":"/fullstack/docker/dockerfile.html#构建前端项目","1073":"/fullstack/docker/dockerfile.html#静态项目","1074":"/fullstack/docker/dockerfile.html#nodejs项目","1075":"/fullstack/docker/dockerfile.html#构建优化","1076":"/fullstack/docker/dockerfile.html#参考文档","1077":"/fullstack/docker/dockerfile.html#总结","1078":"/fullstack/docker/install-configure.html#docker安装与配置","1079":"/fullstack/docker/install-configure.html#优缺点","1080":"/fullstack/docker/install-configure.html#docker架构","1081":"/fullstack/docker/install-configure.html#docker三大组件","1082":"/fullstack/docker/install-configure.html#安装","1083":"/fullstack/docker/install-configure.html#配置","1084":"/fullstack/docker/network.html#docker网络原理","1085":"/fullstack/docker/network.html#原理","1086":"/fullstack/docker/network.html#访问过程","1087":"/fullstack/docker/network.html#网络类型","1088":"/fullstack/docker/network.html#网络列表","1089":"/fullstack/docker/network.html#创建网络","1090":"/fullstack/docker/network.html#使用网络","1091":"/fullstack/docker/network.html#总结","1092":"/fullstack/docker/npm-repository.html#使用docker搭建npm仓库","1093":"/fullstack/docker/npm-repository.html#安装docker","1094":"/fullstack/docker/npm-repository.html#安装nexus3","1095":"/fullstack/docker/npm-repository.html#初始密码","1096":"/fullstack/docker/npm-repository.html#访问nexus3","1097":"/fullstack/docker/npm-repository.html#创建存储集","1098":"/fullstack/docker/npm-repository.html#创建仓库","1099":"/fullstack/docker/npm-repository.html#创建角色","1100":"/fullstack/docker/npm-repository.html#创建用户","1101":"/fullstack/docker/npm-repository.html#权限认证","1102":"/fullstack/docker/npm-repository.html#发布npm包","1103":"/fullstack/docker/npm-repository.html#验证npm包","1104":"/fullstack/docker/npm-repository.html#proxy和group仓库","1105":"/fullstack/docker/npm-repository.html#创建proxy","1106":"/fullstack/docker/npm-repository.html#创建group","1107":"/fullstack/docker/npm-repository.html#验证私库","1108":"/fullstack/docker/npm-repository.html#打标签","1109":"/fullstack/docker/volume-store.html#docker数据卷与持久化","1110":"/fullstack/docker/volume-store.html#概念与作用","1111":"/fullstack/docker/volume-store.html#卷的类型","1112":"/fullstack/docker/volume-store.html#卷的使用","1113":"/fullstack/docker/volume-store.html#创建","1114":"/fullstack/docker/volume-store.html#查看","1115":"/fullstack/docker/volume-store.html#删除","1116":"/fullstack/docker/volume-store.html#挂载","1117":"/fullstack/docker/volume-store.html#总结","1118":"/fullstack/gitlab/gitlab-pipeline.html#gitlab流水线配置","1119":"/fullstack/gitlab/gitlab-pipeline.html#示例","1120":"/fullstack/gitlab/gitlab-pipeline.html#默认变量","1121":"/fullstack/gitlab/gitlab-pipeline.html#通用变量","1122":"/fullstack/gitlab/gitlab-pipeline.html#合并请求变量","1123":"/fullstack/gitlab/gitlab-pipeline.html#流水线","1124":"/fullstack/gitlab/gitlab-pipeline.html#job","1125":"/fullstack/gitlab/gitlab-pipeline.html#stages","1126":"/fullstack/gitlab/gitlab-pipeline.html#stage","1127":"/fullstack/gitlab/gitlab-pipeline.html#pre-post","1128":"/fullstack/gitlab/gitlab-pipeline.html#variables","1129":"/fullstack/gitlab/gitlab-pipeline.html#tags","1130":"/fullstack/gitlab/gitlab-pipeline.html#allow-failure","1131":"/fullstack/gitlab/gitlab-pipeline.html#when","1132":"/fullstack/gitlab/gitlab-pipeline.html#retry","1133":"/fullstack/gitlab/gitlab-pipeline.html#timeout","1134":"/fullstack/gitlab/gitlab-pipeline.html#parallel","1135":"/fullstack/gitlab/gitlab-pipeline.html#only-except","1136":"/fullstack/gitlab/gitlab-pipeline.html#rules","1137":"/fullstack/gitlab/gitlab-pipeline.html#workflow","1138":"/fullstack/gitlab/gitlab-pipeline.html#cache","1139":"/fullstack/gitlab/gitlab-pipeline.html#artifacts","1140":"/fullstack/gitlab/gitlab-pipeline.html#dependencies","1141":"/fullstack/gitlab/gitlab-pipeline.html#needs","1142":"/fullstack/gitlab/gitlab-pipeline.html#include","1143":"/fullstack/gitlab/gitlab-pipeline.html#extends","1144":"/fullstack/gitlab/gitlab-pipeline.html#trigger","1145":"/fullstack/gitlab/gitlab-pipeline.html#image","1146":"/fullstack/gitlab/gitlab-pipeline.html#services","1147":"/fullstack/gitlab/gitlab-pipeline.html#environment","1148":"/fullstack/gitlab/gitlab-pipeline.html#inherit","1149":"/fullstack/gitlab/gitlab-pipeline.html#参考文档","1150":"/fullstack/gitlab/gitlab-runner-install-configure.html#gitlab-runner安装与配置","1151":"/fullstack/gitlab/gitlab-runner-install-configure.html#下载镜像","1152":"/fullstack/gitlab/gitlab-runner-install-configure.html#创建挂载卷","1153":"/fullstack/gitlab/gitlab-runner-install-configure.html#运行runner","1154":"/fullstack/gitlab/gitlab-runner-install-configure.html#注册runner","1155":"/fullstack/gitlab/gitlab-runner-install-configure.html#注册token","1156":"/fullstack/gitlab/gitlab-runner-install-configure.html#交互式注册","1157":"/fullstack/gitlab/gitlab-runner-install-configure.html#非交互式","1158":"/fullstack/gitlab/gitlab-runner-install-configure.html#参数说明","1159":"/fullstack/gitlab/gitlab-runner-install-configure.html#配置文件","1160":"/fullstack/gitlab/gitlab-runner-install-configure.html#配置重载","1161":"/fullstack/gitlab/gitlab-runner-install-configure.html#runner类型","1162":"/fullstack/gitlab/gitlab-runner-install-configure.html#runner执行器","1163":"/fullstack/gitlab/gitlab-runner-install-configure.html#shell-执行器","1164":"/fullstack/gitlab/gitlab-runner-install-configure.html#虚拟机执行器-virtualbox-parallels","1165":"/fullstack/gitlab/gitlab-runner-install-configure.html#docker-执行器","1166":"/fullstack/gitlab/gitlab-runner-install-configure.html#docker-machine-执行器","1167":"/fullstack/gitlab/gitlab-runner-install-configure.html#kubernetes-执行器","1168":"/fullstack/gitlab/gitlab-runner-install-configure.html#ssh-执行器","1169":"/fullstack/gitlab/gitlab-runner-install-configure.html#自定义执行器","1170":"/fullstack/gitlab/install-configure.html#gitlab安装与配置","1171":"/fullstack/gitlab/install-configure.html#docker安装","1172":"/fullstack/gitlab/install-configure.html#命令式","1173":"/fullstack/gitlab/install-configure.html#配置文件安装","1174":"/fullstack/gitlab/install-configure.html#密码","1175":"/fullstack/gitlab/install-configure.html#域名与证书","1176":"/fullstack/gitlab/install-configure.html#配置域名","1177":"/fullstack/gitlab/install-configure.html#开启https","1178":"/fullstack/gitlab/install-configure.html#ssl证书配置","1179":"/fullstack/gitlab/install-configure.html#配置重载","1180":"/fullstack/gitlab/install-configure.html#centos安装","1181":"/fullstack/gitlab/npm-repository.html#gitlab搭建npm仓库","1182":"/fullstack/gitlab/npm-repository.html#创建组与项目","1183":"/fullstack/gitlab/npm-repository.html#初始化项目","1184":"/fullstack/gitlab/npm-repository.html#项目作为依赖","1185":"/fullstack/gitlab/npm-repository.html#gitlab软件库","1186":"/fullstack/gitlab/npm-repository.html#注册表类型","1187":"/fullstack/gitlab/npm-repository.html#发布准备","1188":"/fullstack/gitlab/npm-repository.html#发布npm包","1189":"/fullstack/gitlab/npm-repository.html#手动发布","1190":"/fullstack/gitlab/npm-repository.html#ci-cd自动构建npm包","1191":"/fullstack/gitlab/npm-repository.html#使用npm包","1192":"/fullstack/gitlab/npm-repository.html#参考文档","1193":"/fullstack/k8s/base.html#初识kubernetes","1194":"/fullstack/k8s/install.html#搭建k8s集群","1195":"/fullstack/k8s/install.html#配置要求","1196":"/fullstack/k8s/install.html#机器划分","1197":"/fullstack/k8s/install.html#环境准备","1198":"/fullstack/k8s/install.html#内核升级","1199":"/fullstack/k8s/install.html#更改主机名","1200":"/fullstack/k8s/install.html#配置dns","1201":"/fullstack/k8s/install.html#配置防火墙","1202":"/fullstack/k8s/install.html#禁用selinux","1203":"/fullstack/k8s/install.html#禁用swap","1204":"/fullstack/k8s/install.html#同步时区","1205":"/fullstack/k8s/install.html#转发-ipv4-并让-iptables-看到桥接流量","1206":"/fullstack/k8s/install.html#安装ipvs","1207":"/fullstack/k8s/install.html#容器运行时","1208":"/fullstack/k8s/install.html#docker","1209":"/fullstack/k8s/install.html#containerd","1210":"/fullstack/k8s/install.html#配置k8s国内源","1211":"/fullstack/k8s/install.html#使用kubeadm安装","1212":"/fullstack/k8s/install.html#master生成k8s集群配置","1213":"/fullstack/k8s/install.html#拉取镜像","1214":"/fullstack/k8s/install.html#初始化k8s集群","1215":"/fullstack/k8s/install.html#work节点加入集群","1216":"/fullstack/k8s/install.html#token过期处理","1217":"/fullstack/k8s/install.html#网络组件","1218":"/fullstack/k8s/install.html#集群验证","1219":"/fullstack/k8s/install.html#dashboard","1220":"/fullstack/k8s/install.html#安装metrics","1221":"/fullstack/k8s/install.html#安装dashborad","1222":"/fullstack/k8s/install.html#参考文档","1223":"/me.html#关于我","1224":"/me.html#联系","1225":"/me.html#贡献","1226":"/me.html#转载须知","1227":"/me.html#打赏","1228":"/me.html#版权","1229":"/super-nav/#导航指南","1230":"/super-nav/#个人技术博客","1231":"/super-nav/#团队技术博客","1232":"/talk/2023/dad-foot-injured.html#我爸脚受伤了","1233":"/talk/2023/lose-qoo-job.html#我也赶上了裁员","1234":"/talk/2023/love-4th-anniversary.html#四周年纪念","1235":"/talk/2023/love-4th-anniversary.html#df","1236":"/talk/2023/second-covid.html#我二🐑了","1237":"/talk/base.html#杂谈"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[3,1,1],"1":[1,3,12],"2":[1,4,52],"3":[1,4,26],"4":[1,4,27],"5":[1,3,9],"6":[3,3,2],"7":[1,5,40],"8":[1,5,27],"9":[1,5,52],"10":[1,3,7],"11":[1,1,21],"12":[3,1,59],"13":[4,1,30],"14":[3,1,31],"15":[3,1,33],"16":[1,1,40],"17":[2,1,51],"18":[1,1,30],"19":[2,1,30],"20":[1,1,23],"21":[1,1,27],"22":[1,1,75],"23":[1,1,1],"24":[1,1,21],"25":[1,1,13],"26":[1,1,75],"27":[1,1,1],"28":[4,2,31],"29":[5,2,16],"30":[5,2,44],"31":[1,1,1],"32":[5,2,39],"33":[2,2,68],"34":[1,2,26],"35":[1,1,4],"36":[1,1,31],"37":[1,1,14],"38":[1,2,47],"39":[1,2,22],"40":[2,1,219],"41":[1,1,64],"42":[1,1,9],"43":[1,2,45],"44":[1,2,55],"45":[1,1,1],"46":[2,2,17],"47":[1,2,29],"48":[1,1,60],"49":[1,1,40],"50":[1,1,8],"51":[1,1,1],"52":[1,1,12],"53":[1,1,24],"54":[1,1,152],"55":[1,1,1],"56":[1,2,59],"57":[1,2,53],"58":[1,2,1],"59":[1,1,1],"60":[1,2,80],"61":[4,2,108],"62":[1,2,116],"63":[2,2,77],"64":[1,2,133],"65":[3,1,1],"66":[1,1,13],"67":[1,1,14],"68":[1,1,38],"69":[1,1,22],"70":[1,1,12],"71":[1,1,3],"72":[1,1,12],"73":[1,1,11],"74":[1,1,6],"75":[1,1,28],"76":[2,1,8],"77":[3,1,41],"78":[2,1,32],"79":[3,1,25],"80":[1,1,20],"81":[3,1,40],"82":[1,1,10],"83":[1,1,496],"84":[3,1,34],"85":[2,1,47],"86":[2,1,77],"87":[1,1,14],"88":[1,1,30],"89":[1,1,5],"90":[2,1,29],"91":[1,1,2],"92":[1,1,14],"93":[1,1,19],"94":[1,1,1],"95":[1,1,13],"96":[1,1,36],"97":[1,1,58],"98":[1,1,81],"99":[1,1,1],"100":[1,1,12],"101":[1,1,1],"102":[2,2,18],"103":[1,2,5],"104":[1,1,13],"105":[1,1,4],"106":[2,2,14],"107":[2,2,14],"108":[2,2,13],"109":[1,1,3],"110":[1,2,68],"111":[1,2,96],"112":[1,2,66],"113":[1,1,10],"114":[3,1,1],"115":[1,3,24],"116":[1,4,7],"117":[1,4,47],"118":[1,4,25],"119":[1,3,7],"120":[1,3,7],"121":[1,3,13],"122":[1,3,23],"123":[1,1,25],"124":[1,1,15],"125":[1,1,20],"126":[1,1,34],"127":[1,2,41],"128":[1,2,57],"129":[1,1,49],"130":[1,1,83],"131":[1,1,79],"132":[1,1,118],"133":[1,2,21],"134":[1,1,37],"135":[1,1,11],"136":[1,1,5],"137":[1,1,21],"138":[1,1,48],"139":[1,1,161],"140":[1,2,49],"141":[1,1,66],"142":[4,1,1],"143":[1,5,17],"144":[3,5,40],"145":[1,5,103],"146":[1,5,17],"147":[1,1,7],"148":[1,2,26],"149":[1,2,27],"150":[1,1,55],"151":[2,1,1],"152":[1,3,55],"153":[1,3,24],"154":[1,1,102],"155":[1,1,9],"156":[1,1,14],"157":[1,1,58],"158":[1,1,39],"159":[1,1,19],"160":[1,1,30],"161":[1,1,25],"162":[1,1,26],"163":[1,1,32],"164":[1,1,43],"165":[1,1,20],"166":[1,1,22],"167":[1,1,8],"168":[1,1,29],"169":[1,1,11],"170":[1,1,8],"171":[3,1,11],"172":[2,1,14],"173":[1,1,18],"174":[1,1,10],"175":[1,1,54],"176":[3,1,58],"177":[1,1,57],"178":[2,1,7],"179":[2,3,72],"180":[2,3,45],"181":[2,3,57],"182":[1,1,77],"183":[1,1,52],"184":[3,1,63],"185":[1,1,17],"186":[1,1,36],"187":[1,1,57],"188":[1,1,26],"189":[1,1,16],"190":[2,1,274],"191":[1,1,11],"192":[1,1,2],"193":[1,1,11],"194":[1,1,12],"195":[4,1,114],"196":[1,1,42],"197":[1,1,85],"198":[1,1,44],"199":[1,1,62],"200":[1,1,44],"201":[1,1,97],"202":[1,1,26],"203":[1,1,44],"204":[1,1,60],"205":[1,1,76],"206":[1,1,52],"207":[1,1,35],"208":[1,1,29],"209":[1,1,5],"210":[1,1,26],"211":[1,1,11],"212":[1,1,1],"213":[2,1,10],"214":[1,1,19],"215":[1,2,17],"216":[1,2,12],"217":[1,1,14],"218":[1,2,27],"219":[1,2,5],"220":[1,1,12],"221":[1,1,33],"222":[1,1,167],"223":[1,1,7],"224":[1,1,10],"225":[1,1,31],"226":[1,1,14],"227":[4,1,43],"228":[1,1,48],"229":[1,1,106],"230":[1,1,110],"231":[1,1,65],"232":[1,1,132],"233":[1,1,69],"234":[1,1,4],"235":[1,1,1],"236":[1,1,18],"237":[1,1,154],"238":[1,1,159],"239":[2,1,106],"240":[1,1,1],"241":[1,1,12],"242":[1,1,32],"243":[1,2,49],"244":[1,2,96],"245":[1,2,147],"246":[1,1,23],"247":[1,2,82],"248":[1,2,68],"249":[1,2,80],"250":[1,1,10],"251":[2,1,1717],"252":[1,1,19],"253":[1,1,2],"254":[1,1,6],"255":[1,1,1],"256":[1,1,1],"257":[1,1,1],"258":[1,1,2],"259":[1,1,3],"260":[1,1,1],"261":[1,1,2],"262":[1,2,1],"263":[1,2,9],"264":[1,2,2],"265":[1,2,1],"266":[1,1,1],"267":[1,1,1],"268":[1,1,23],"269":[2,1,10],"270":[1,1,18],"271":[2,1,37],"272":[1,1,2],"273":[2,1,1],"274":[1,1,3],"275":[1,1,3],"276":[1,1,14],"277":[2,1,1],"278":[1,1,1],"279":[1,1,27],"280":[1,1,26],"281":[1,1,15],"282":[1,1,8],"283":[1,2,47],"284":[1,2,42],"285":[1,2,25],"286":[1,2,6],"287":[1,2,2],"288":[1,2,2],"289":[1,2,3],"290":[1,2,5],"291":[1,2,2],"292":[1,1,1],"293":[1,1,13],"294":[1,1,1],"295":[1,1,18],"296":[1,1,19],"297":[1,1,42],"298":[1,1,69],"299":[1,2,8],"300":[1,2,10],"301":[1,1,27],"302":[1,1,18],"303":[1,1,45],"304":[1,1,36],"305":[1,1,6],"306":[1,1,8],"307":[1,1,25],"308":[1,1,13],"309":[1,2,53],"310":[2,2,49],"311":[1,1,34],"312":[2,1,44],"313":[2,1,10],"314":[1,1,8],"315":[1,1,15],"316":[3,1,65],"317":[1,1,123],"318":[1,1,21],"319":[1,1,71],"320":[1,1,76],"321":[1,1,21],"322":[2,1,33],"323":[2,1,33],"324":[1,3,51],"325":[1,3,90],"326":[1,3,34],"327":[2,1,30],"328":[1,1,26],"329":[2,2,65],"330":[2,2,41],"331":[1,2,11],"332":[2,3,42],"333":[5,3,91],"334":[3,3,28],"335":[1,1,12],"336":[1,1,35],"337":[2,2,63],"338":[1,2,41],"339":[1,2,70],"340":[1,2,2],"341":[1,1,10],"342":[1,2,65],"343":[1,2,82],"344":[1,2,106],"345":[1,2,9],"346":[1,1,9],"347":[1,2,169],"348":[1,2,16],"349":[1,1,16],"350":[1,2,359],"351":[1,2,21],"352":[2,3,63],"353":[3,3,82],"354":[1,1,228],"355":[1,1,29],"356":[1,1,4],"357":[1,1,23],"358":[1,1,16],"359":[1,1,45],"360":[1,2,21],"361":[1,2,49],"362":[1,1,6],"363":[1,2,11],"364":[1,2,65],"365":[2,1,32],"366":[1,1,53],"367":[1,1,69],"368":[1,1,64],"369":[2,1,45],"370":[1,1,39],"371":[2,1,25],"372":[1,1,8],"373":[1,1,8],"374":[1,1,14],"375":[1,1,19],"376":[1,1,117],"377":[1,1,8],"378":[1,2,57],"379":[1,2,28],"380":[1,2,64],"381":[1,2,70],"382":[1,2,146],"383":[1,2,70],"384":[3,2,43],"385":[1,1,8],"386":[1,2,35],"387":[1,2,43],"388":[1,1,12],"389":[2,2,19],"390":[1,2,26],"391":[1,2,24],"392":[1,1,15],"393":[1,2,20],"394":[1,2,11],"395":[1,1,9],"396":[1,1,8],"397":[2,1,2],"398":[1,2,2],"399":[2,3,41],"400":[2,3,72],"401":[1,3,36],"402":[1,3,1],"403":[1,2,1],"404":[1,3,220],"405":[1,3,25],"406":[1,3,21],"407":[1,3,37],"408":[3,2,32],"409":[1,5,2],"410":[1,5,44],"411":[1,1,30],"412":[1,1,20],"413":[1,1,36],"414":[1,1,114],"415":[1,1,13],"416":[1,1,8],"417":[1,1,3],"418":[1,1,11],"419":[1,1,35],"420":[1,1,20],"421":[1,1,28],"422":[1,1,63],"423":[1,1,14],"424":[1,1,6],"425":[1,2,24],"426":[1,1,17],"427":[1,1,9],"428":[1,1,37],"429":[1,1,13],"430":[1,1,39],"431":[1,1,36],"432":[1,1,10],"433":[1,1,2],"434":[1,2,31],"435":[1,2,14],"436":[1,1,84],"437":[1,2,11],"438":[1,1,81],"439":[1,1,34],"440":[1,1,12],"441":[1,1,3],"442":[1,1,5],"443":[2,1,10],"444":[3,1,1],"445":[2,1,1],"446":[2,3,1],"447":[2,3,1],"448":[1,3,11],"449":[1,1,19],"450":[1,1,23],"451":[1,1,13],"452":[1,1,24],"453":[1,1,123],"454":[1,1,198],"455":[1,1,87],"456":[1,2,65],"457":[1,2,59],"458":[1,1,16],"459":[1,1,9],"460":[1,1,10],"461":[2,1,1],"462":[1,1,139],"463":[1,1,2],"464":[1,1,11],"465":[1,1,10],"466":[1,1,2],"467":[1,1,2],"468":[4,1,4],"469":[1,1,2],"470":[1,1,2],"471":[1,1,2],"472":[1,1,1],"473":[1,1,16],"474":[2,1,1],"475":[1,1,1],"476":[1,1,1],"477":[1,1,12],"478":[1,1,15],"479":[1,1,25],"480":[1,1,5],"481":[1,2,23],"482":[1,2,13],"483":[1,3,31],"484":[1,3,16],"485":[1,3,74],"486":[1,2,15],"487":[1,3,8],"488":[1,3,7],"489":[1,3,15],"490":[1,2,1],"491":[1,1,47],"492":[1,1,4],"493":[1,1,12],"494":[1,2,40],"495":[1,2,5],"496":[1,2,49],"497":[1,2,58],"498":[1,1,21],"499":[1,2,44],"500":[1,2,13],"501":[1,2,5],"502":[1,1,12],"503":[1,2,8],"504":[1,2,22],"505":[1,2,9],"506":[1,2,13],"507":[1,1,26],"508":[1,1,35],"509":[1,2,6],"510":[1,3,70],"511":[1,3,5],"512":[1,3,82],"513":[1,2,5],"514":[1,3,76],"515":[1,3,6],"516":[1,3,42],"517":[1,2,49],"518":[2,2,12],"519":[1,1,1],"520":[1,2,98],"521":[1,2,83],"522":[1,2,4],"523":[1,1,12],"524":[1,1,26],"525":[1,1,39],"526":[1,1,80],"527":[1,2,21],"528":[1,1,13],"529":[1,2,46],"530":[1,2,2],"531":[1,2,18],"532":[1,1,167],"533":[1,1,45],"534":[1,1,47],"535":[1,1,31],"536":[1,1,22],"537":[1,1,20],"538":[1,2,63],"539":[1,2,47],"540":[2,2,23],"541":[1,1,33],"542":[1,1,31],"543":[1,1,14],"544":[1,2,47],"545":[1,2,22],"546":[2,1,219],"547":[1,1,64],"548":[1,1,9],"549":[1,2,45],"550":[1,2,55],"551":[1,1,1],"552":[2,2,17],"553":[1,2,29],"554":[1,1,60],"555":[1,1,40],"556":[1,1,2],"557":[1,1,15],"558":[1,1,17],"559":[1,1,33],"560":[1,2,1],"561":[1,2,1],"562":[1,1,1],"563":[1,1,1],"564":[1,2,1],"565":[1,2,1],"566":[1,1,1],"567":[1,1,1],"568":[1,1,26],"569":[1,1,1],"570":[2,1,19],"571":[1,2,126],"572":[1,3,50],"573":[1,3,110],"574":[2,3,19],"575":[3,3,40],"576":[1,2,91],"577":[1,2,67],"578":[1,2,54],"579":[1,2,72],"580":[1,2,58],"581":[1,2,76],"582":[1,2,92],"583":[1,2,143],"584":[1,2,8],"585":[3,1,10],"586":[1,3,15],"587":[1,4,89],"588":[1,4,116],"589":[1,3,61],"590":[1,3,29],"591":[1,3,28],"592":[1,3,23],"593":[1,3,13],"594":[1,3,42],"595":[1,4,27],"596":[1,3,7],"597":[1,1,1],"598":[1,1,2],"599":[2,1,1],"600":[1,1,2],"601":[1,1,66],"602":[1,1,21],"603":[1,1,36],"604":[1,1,34],"605":[1,2,26],"606":[1,2,124],"607":[1,2,16],"608":[1,2,23],"609":[1,2,37],"610":[1,1,15],"611":[1,2,40],"612":[1,2,44],"613":[1,2,54],"614":[1,2,43],"615":[1,2,23],"616":[1,2,28],"617":[1,2,30],"618":[1,2,25],"619":[1,2,46],"620":[1,2,3],"621":[1,1,55],"622":[1,1,27],"623":[1,1,10],"624":[1,2,37],"625":[1,2,5],"626":[2,2,22],"627":[1,1,9],"628":[1,2,42],"629":[1,2,38],"630":[1,2,25],"631":[2,2,49],"632":[1,2,45],"633":[1,1,14],"634":[1,2,71],"635":[1,2,37],"636":[2,1,13],"637":[1,3,40],"638":[1,3,13],"639":[2,3,92],"640":[1,3,78],"641":[1,1,2],"642":[1,2,27],"643":[1,2,69],"644":[1,2,6],"645":[1,2,63],"646":[4,2,104],"647":[1,1,6],"648":[1,2,108],"649":[1,2,7],"650":[1,1,17],"651":[1,2,63],"652":[1,2,46],"653":[1,1,3],"654":[1,1,26],"655":[1,2,38],"656":[1,2,29],"657":[1,1,3],"658":[1,2,11],"659":[1,2,21],"660":[1,2,66],"661":[1,2,89],"662":[1,1,14],"663":[1,1,5],"664":[1,1,15],"665":[1,1,82],"666":[1,1,27],"667":[1,1,22],"668":[1,1,8],"669":[1,2,77],"670":[1,2,13],"671":[1,1,97],"672":[1,1,11],"673":[1,2,44],"674":[1,2,53],"675":[1,2,23],"676":[1,2,17],"677":[1,1,9],"678":[1,1,21],"679":[1,1,12],"680":[1,2,7],"681":[1,2,33],"682":[1,2,8],"683":[1,1,30],"684":[1,2,10],"685":[1,2,35],"686":[1,2,54],"687":[1,1,59],"688":[1,1,47],"689":[1,1,7],"690":[1,1,11],"691":[1,1,19],"692":[1,2,70],"693":[1,2,11],"694":[1,1,7],"695":[1,2,57],"696":[1,2,28],"697":[1,2,41],"698":[1,2,15],"699":[1,1,5],"700":[1,2,35],"701":[1,2,52],"702":[1,1,70],"703":[1,1,129],"704":[1,1,22],"705":[1,1,32],"706":[1,1,30],"707":[1,1,64],"708":[1,1,149],"709":[1,1,155],"710":[1,2,51],"711":[1,2,46],"712":[1,1,65],"713":[1,1,73],"714":[1,1,2],"715":[1,2,73],"716":[1,2,43],"717":[1,1,121],"718":[1,1,281],"719":[1,1,2],"720":[1,2,111],"721":[1,2,79],"722":[1,1,56],"723":[1,1,126],"724":[1,1,111],"725":[1,1,31],"726":[1,1,243],"727":[2,1,133],"728":[1,1,297],"729":[1,1,194],"730":[1,1,3],"731":[2,1,1],"732":[2,1,1],"733":[1,1,2],"734":[1,1,11],"735":[1,1,2],"736":[1,1,8],"737":[1,1,7],"738":[1,1,2],"739":[1,1,4],"740":[1,1,6],"741":[1,1,2],"742":[1,1,2],"743":[2,1,1],"744":[1,1,12],"745":[4,1,114],"746":[1,1,42],"747":[1,1,85],"748":[1,1,44],"749":[1,1,62],"750":[1,1,44],"751":[1,1,97],"752":[1,1,26],"753":[1,1,44],"754":[1,1,60],"755":[1,1,76],"756":[1,1,52],"757":[1,1,35],"758":[1,1,29],"759":[1,1,5],"760":[1,1,26],"761":[1,1,11],"762":[1,1,28],"763":[1,1,2],"764":[1,1,21],"765":[1,1,74],"766":[1,1,15],"767":[1,1,19],"768":[1,1,58],"769":[1,1,83],"770":[1,3,113],"771":[1,1,154],"772":[1,1,145],"773":[1,1,62],"774":[1,1,2],"775":[1,1,22],"776":[1,1,13],"777":[1,1,2],"778":[1,1,30],"779":[1,1,12],"780":[1,1,2],"781":[1,1,2],"782":[1,1,23],"783":[3,2,26],"784":[1,1,115],"785":[1,1,112],"786":[1,1,46],"787":[1,1,9],"788":[1,1,32],"789":[1,2,20],"790":[1,2,6],"791":[1,2,2],"792":[2,2,9],"793":[1,2,7],"794":[1,2,23],"795":[1,1,20],"796":[1,2,12],"797":[1,2,96],"798":[1,1,6],"799":[1,2,23],"800":[1,2,144],"801":[1,2,136],"802":[1,2,33],"803":[1,1,6],"804":[1,2,22],"805":[1,2,52],"806":[1,2,34],"807":[1,1,7],"808":[1,1,9],"809":[1,1,16],"810":[1,1,31],"811":[1,1,39],"812":[1,1,4],"813":[1,2,34],"814":[1,2,108],"815":[1,2,28],"816":[1,1,10],"817":[1,2,25],"818":[1,2,48],"819":[1,2,9],"820":[1,1,1],"821":[1,2,6],"822":[1,1,1],"823":[1,1,8],"824":[1,1,32],"825":[1,1,24],"826":[1,1,14],"827":[1,2,45],"828":[2,2,46],"829":[2,2,63],"830":[2,2,71],"831":[2,2,67],"832":[1,2,15],"833":[1,2,13],"834":[1,1,9],"835":[1,1,12],"836":[1,1,53],"837":[1,1,18],"838":[1,2,24],"839":[1,2,51],"840":[1,2,40],"841":[1,2,21],"842":[1,1,33],"843":[2,2,21],"844":[1,2,22],"845":[1,2,14],"846":[1,2,26],"847":[2,2,24],"848":[1,2,19],"849":[1,2,19],"850":[2,1,41],"851":[1,1,20],"852":[1,1,1],"853":[3,2,12],"854":[4,2,21],"855":[2,1,17],"856":[1,3,7],"857":[1,3,188],"858":[1,3,75],"859":[1,3,35],"860":[1,4,53],"861":[1,3,11],"862":[1,4,10],"863":[1,4,34],"864":[1,3,64],"865":[1,3,26],"866":[1,4,31],"867":[1,4,24],"868":[1,4,38],"869":[1,3,49],"870":[1,3,31],"871":[1,3,11],"872":[1,3,9],"873":[1,4,19],"874":[1,4,118],"875":[1,3,98],"876":[2,1,13],"877":[1,3,60],"878":[1,3,98],"879":[1,3,72],"880":[1,3,45],"881":[1,3,32],"882":[1,3,17],"883":[1,1,13],"884":[1,1,1],"885":[1,1,5],"886":[1,1,21],"887":[1,1,48],"888":[1,1,161],"889":[1,2,49],"890":[1,1,66],"891":[4,1,1],"892":[1,5,17],"893":[3,5,40],"894":[1,5,103],"895":[1,5,17],"896":[1,1,7],"897":[1,2,26],"898":[1,2,27],"899":[1,1,55],"900":[2,1,1],"901":[1,3,55],"902":[1,3,24],"903":[1,1,102],"904":[1,1,5],"905":[1,1,1],"906":[1,1,6],"907":[1,1,1],"908":[3,1,1],"909":[3,1,1],"910":[1,1,1],"911":[1,1,1],"912":[1,1,1],"913":[1,1,1],"914":[1,1,1],"915":[1,1,10],"916":[1,1,1],"917":[1,1,9],"918":[1,1,4],"919":[1,1,2],"920":[1,1,29],"921":[1,1,14],"922":[1,1,2],"923":[1,1,1],"924":[1,1,2],"925":[1,1,1],"926":[1,1,1],"927":[1,1,13],"928":[1,1,7],"929":[1,2,25],"930":[1,2,38],"931":[1,2,61],"932":[1,2,237],"933":[1,2,11],"934":[1,2,212],"935":[1,1,9],"936":[1,2,29],"937":[1,2,90],"938":[1,2,140],"939":[1,2,29],"940":[1,2,50],"941":[1,2,95],"942":[1,2,32],"943":[1,2,28],"944":[1,2,135],"945":[1,2,92],"946":[1,1,14],"947":[1,1,2],"948":[1,1,35],"949":[1,1,41],"950":[1,2,85],"951":[1,2,218],"952":[1,2,13],"953":[1,3,47],"954":[1,3,328],"955":[1,2,212],"956":[1,2,72],"957":[1,1,22],"958":[1,2,53],"959":[1,2,109],"960":[1,2,73],"961":[1,2,30],"962":[1,2,28],"963":[1,2,51],"964":[1,2,204],"965":[1,1,59],"966":[1,1,60],"967":[1,1,2],"968":[1,1,16],"969":[1,1,2],"970":[1,1,4],"971":[1,1,27],"972":[1,1,4],"973":[1,1,2],"974":[1,1,1],"975":[1,1,1],"976":[1,1,3],"977":[1,1,33],"978":[1,1,1],"979":[1,1,1],"980":[1,1,16],"981":[1,1,2],"982":[1,1,2],"983":[1,1,1],"984":[1,1,1],"985":[1,1,1],"986":[1,1,1],"987":[1,1,1],"988":[1,1,2],"989":[1,1,2],"990":[1,1,2],"991":[2,1,29],"992":[1,1,15],"993":[1,1,30],"994":[1,1,91],"995":[1,1,24],"996":[1,1,20],"997":[1,2,54],"998":[1,2,58],"999":[3,2,46],"1000":[2,2,37],"1001":[1,2,18],"1002":[1,2,71],"1003":[1,1,32],"1004":[1,2,72],"1005":[1,2,70],"1006":[1,2,63],"1007":[1,2,89],"1008":[1,2,35],"1009":[1,2,39],"1010":[1,2,42],"1011":[1,1,35],"1012":[1,2,56],"1013":[1,2,25],"1014":[1,2,110],"1015":[1,1,11],"1016":[1,1,20],"1017":[1,1,36],"1018":[1,1,60],"1019":[1,1,15],"1020":[1,2,35],"1021":[1,2,26],"1022":[3,2,70],"1023":[2,2,43],"1024":[1,2,70],"1025":[1,2,45],"1026":[1,2,6],"1027":[1,1,15],"1028":[1,2,25],"1029":[1,2,24],"1030":[1,2,18],"1031":[1,2,19],"1032":[1,2,12],"1033":[1,2,3],"1034":[1,1,189],"1035":[1,1,21],"1036":[1,1,9],"1037":[1,1,2],"1038":[1,2,22],"1039":[1,2,93],"1040":[1,1,13],"1041":[1,2,3],"1042":[1,2,27],"1043":[1,2,6],"1044":[1,2,5],"1045":[1,2,78],"1046":[1,2,72],"1047":[1,2,28],"1048":[1,1,8],"1049":[1,1,10],"1050":[1,1,18],"1051":[1,1,140],"1052":[1,1,1],"1053":[1,2,25],"1054":[1,2,99],"1055":[1,2,117],"1056":[1,2,36],"1057":[1,2,32],"1058":[1,2,39],"1059":[1,2,39],"1060":[1,2,33],"1061":[1,2,33],"1062":[1,2,64],"1063":[1,2,103],"1064":[1,2,128],"1065":[1,2,69],"1066":[1,2,57],"1067":[1,1,6],"1068":[1,1,46],"1069":[1,1,63],"1070":[1,1,79],"1071":[1,1,24],"1072":[1,1,2],"1073":[1,2,51],"1074":[1,2,115],"1075":[1,1,24],"1076":[1,1,14],"1077":[1,1,9],"1078":[1,1,59],"1079":[1,1,29],"1080":[1,1,30],"1081":[1,1,24],"1082":[1,1,185],"1083":[1,1,35],"1084":[1,1,30],"1085":[1,1,71],"1086":[1,1,23],"1087":[1,1,55],"1088":[1,1,24],"1089":[1,1,25],"1090":[1,1,107],"1091":[1,1,17],"1092":[1,1,10],"1093":[1,1,43],"1094":[1,1,45],"1095":[1,1,23],"1096":[1,1,17],"1097":[1,1,27],"1098":[1,1,69],"1099":[1,1,23],"1100":[1,1,22],"1101":[1,1,8],"1102":[1,1,68],"1103":[1,1,160],"1104":[1,1,17],"1105":[1,2,3],"1106":[1,2,16],"1107":[1,2,72],"1108":[1,1,50],"1109":[1,1,16],"1110":[1,1,39],"1111":[1,1,31],"1112":[1,1,6],"1113":[1,2,20],"1114":[1,2,19],"1115":[1,2,14],"1116":[1,2,38],"1117":[1,1,9],"1118":[1,1,12],"1119":[1,1,12],"1120":[1,1,12],"1121":[1,2,481],"1122":[1,2,92],"1123":[1,1,7],"1124":[1,2,45],"1125":[1,2,30],"1126":[1,2,23],"1127":[4,2,22],"1128":[1,2,31],"1129":[1,2,21],"1130":[2,2,26],"1131":[1,2,35],"1132":[1,2,88],"1133":[1,2,17],"1134":[1,2,22],"1135":[2,2,18],"1136":[1,2,47],"1137":[1,2,26],"1138":[1,2,36],"1139":[1,2,59],"1140":[1,2,17],"1141":[1,2,33],"1142":[1,2,51],"1143":[1,2,22],"1144":[1,2,11],"1145":[1,2,31],"1146":[1,2,16],"1147":[1,2,25],"1148":[1,2,41],"1149":[1,1,8],"1150":[2,1,6],"1151":[1,2,9],"1152":[1,2,14],"1153":[1,2,23],"1154":[1,2,14],"1155":[1,3,7],"1156":[1,3,26],"1157":[1,3,94],"1158":[1,3,55],"1159":[1,2,91],"1160":[1,2,14],"1161":[1,2,9],"1162":[1,2,3],"1163":[2,3,6],"1164":[4,3,20],"1165":[2,3,20],"1166":[3,3,8],"1167":[2,3,11],"1168":[2,3,10],"1169":[1,3,11],"1170":[1,1,14],"1171":[1,1,64],"1172":[1,2,69],"1173":[1,2,44],"1174":[1,2,59],"1175":[1,2,27],"1176":[1,3,24],"1177":[1,3,23],"1178":[1,3,144],"1179":[1,2,62],"1180":[1,1,5],"1181":[1,1,13],"1182":[1,1,6],"1183":[1,1,69],"1184":[1,1,90],"1185":[1,1,6],"1186":[1,2,24],"1187":[1,2,58],"1188":[1,1,16],"1189":[1,2,53],"1190":[2,2,78],"1191":[1,1,68],"1192":[1,1,13],"1193":[1,1,2],"1194":[1,1,22],"1195":[1,1,41],"1196":[1,1,12],"1197":[1,1,5],"1198":[1,2,30],"1199":[1,2,13],"1200":[1,2,24],"1201":[1,2,15],"1202":[1,2,77],"1203":[1,2,47],"1204":[1,2,34],"1205":[5,2,48],"1206":[1,2,53],"1207":[1,1,32],"1208":[1,2,187],"1209":[1,2,308],"1210":[1,1,33],"1211":[1,1,20],"1212":[1,2,219],"1213":[1,2,10],"1214":[1,2,145],"1215":[1,2,18],"1216":[1,2,10],"1217":[1,1,216],"1218":[1,1,113],"1219":[1,1,1],"1220":[1,2,1],"1221":[1,2,1],"1222":[1,1,6],"1223":[1,1,57],"1224":[1,1,10],"1225":[1,1,40],"1226":[1,1,5],"1227":[1,1,33],"1228":[1,1,21],"1229":[1,1,5],"1230":[1,1,26],"1231":[1,1,3],"1232":[1,1,124],"1233":[1,1,61],"1234":[1,1,1],"1235":[1,1,1],"1236":[1,1,57],"1237":[1,1,10]},"averageFieldLength":[1.1704361873990294,1.5767366720516958,39.77544426494348],"storedFields":{"0":{"title":"bind、call、apply使用技巧","titles":[]},"1":{"title":"介绍与使用方法","titles":["bind、call、apply使用技巧"]},"2":{"title":"apply介绍","titles":["bind、call、apply使用技巧","介绍与使用方法"]},"3":{"title":"call介绍","titles":["bind、call、apply使用技巧","介绍与使用方法"]},"4":{"title":"bind介绍","titles":["bind、call、apply使用技巧","介绍与使用方法"]},"5":{"title":"三者区别","titles":["bind、call、apply使用技巧"]},"6":{"title":"手写call,apply,bind","titles":["bind、call、apply使用技巧"]},"7":{"title":"手写call","titles":["bind、call、apply使用技巧","手写call,apply,bind"]},"8":{"title":"手写apply","titles":["bind、call、apply使用技巧","手写call,apply,bind"]},"9":{"title":"手写bind","titles":["bind、call、apply使用技巧","手写call,apply,bind"]},"10":{"title":"最后","titles":["bind、call、apply使用技巧"]},"11":{"title":"css的10中居中方式","titles":[]},"12":{"title":"absolute + 负margin","titles":["css的10中居中方式"]},"13":{"title":"absolute + margin auto","titles":["css的10中居中方式"]},"14":{"title":"absolute + calc","titles":["css的10中居中方式"]},"15":{"title":"absolute + transform","titles":["css的10中居中方式"]},"16":{"title":"lineheight","titles":["css的10中居中方式"]},"17":{"title":"writing-mode","titles":["css的10中居中方式"]},"18":{"title":"table","titles":["css的10中居中方式"]},"19":{"title":"css-table","titles":["css的10中居中方式"]},"20":{"title":"flex","titles":["css的10中居中方式"]},"21":{"title":"grid","titles":["css的10中居中方式"]},"22":{"title":"总结","titles":["css的10中居中方式"]},"23":{"title":"JS的深浅拷贝","titles":[]},"24":{"title":"数据类型","titles":["JS的深浅拷贝"]},"25":{"title":"浅拷贝与深拷贝","titles":["JS的深浅拷贝"]},"26":{"title":"赋值和浅拷贝的区别","titles":["JS的深浅拷贝"]},"27":{"title":"浅拷贝的实现方式","titles":["JS的深浅拷贝"]},"28":{"title":"1.Object.assign()","titles":["JS的深浅拷贝","浅拷贝的实现方式"]},"29":{"title":"2.Array.prototype.concat()","titles":["JS的深浅拷贝","浅拷贝的实现方式"]},"30":{"title":"3.Array.prototype.slice()","titles":["JS的深浅拷贝","浅拷贝的实现方式"]},"31":{"title":"深拷贝的实现方式","titles":["JS的深浅拷贝"]},"32":{"title":"1.JSON.parse(JSON.stringify())","titles":["JS的深浅拷贝","深拷贝的实现方式"]},"33":{"title":"2.手写递归方法","titles":["JS的深浅拷贝","深拷贝的实现方式"]},"34":{"title":"函数库lodash","titles":["JS的深浅拷贝","深拷贝的实现方式"]},"35":{"title":"总结","titles":["JS的深浅拷贝"]},"36":{"title":"JS类型隐式转换与装箱拆箱","titles":[]},"37":{"title":"装箱与拆箱","titles":["JS类型隐式转换与装箱拆箱"]},"38":{"title":"装箱","titles":["JS类型隐式转换与装箱拆箱","装箱与拆箱"]},"39":{"title":"拆箱","titles":["JS类型隐式转换与装箱拆箱","装箱与拆箱"]},"40":{"title":"toPrimitive、 OrdinaryToPrimitive","titles":["JS类型隐式转换与装箱拆箱"]},"41":{"title":"类型隐式转换","titles":["JS类型隐式转换与装箱拆箱"]},"42":{"title":"算术运算符转换","titles":["JS类型隐式转换与装箱拆箱"]},"43":{"title":"减乘除","titles":["JS类型隐式转换与装箱拆箱","算术运算符转换"]},"44":{"title":"加运算","titles":["JS类型隐式转换与装箱拆箱","算术运算符转换"]},"45":{"title":"逻辑运算转换","titles":["JS类型隐式转换与装箱拆箱"]},"46":{"title":"!运算转换","titles":["JS类型隐式转换与装箱拆箱","逻辑运算转换"]},"47":{"title":"==运算转换","titles":["JS类型隐式转换与装箱拆箱","逻辑运算转换"]},"48":{"title":"问题","titles":["JS类型隐式转换与装箱拆箱"]},"49":{"title":"总结","titles":["JS类型隐式转换与装箱拆箱"]},"50":{"title":"7天撸完ktv点歌系统","titles":[]},"51":{"title":"思维导图","titles":["7天撸完ktv点歌系统"]},"52":{"title":"技术栈","titles":["7天撸完ktv点歌系统"]},"53":{"title":"功能介绍","titles":["7天撸完ktv点歌系统"]},"54":{"title":"项目设计结构","titles":["7天撸完ktv点歌系统"]},"55":{"title":"项目启动介绍","titles":["7天撸完ktv点歌系统"]},"56":{"title":"首先","titles":["7天撸完ktv点歌系统","项目启动介绍"]},"57":{"title":"接着注册管理员账号","titles":["7天撸完ktv点歌系统","项目启动介绍"]},"58":{"title":"然后用postman注册或者其他工具","titles":["7天撸完ktv点歌系统","项目启动介绍"]},"59":{"title":"技术攻关","titles":["7天撸完ktv点歌系统"]},"60":{"title":"Date方法","titles":["7天撸完ktv点歌系统","技术攻关"]},"61":{"title":"验证码(svg-captcha)","titles":["7天撸完ktv点歌系统","技术攻关"]},"62":{"title":"上传歌曲或图片","titles":["7天撸完ktv点歌系统","技术攻关"]},"63":{"title":"Vue、ElementUI分页使用","titles":["7天撸完ktv点歌系统","技术攻关"]},"64":{"title":"token和自定义验证合法性","titles":["7天撸完ktv点歌系统","技术攻关"]},"65":{"title":"截图(只给出部分截图)","titles":["7天撸完ktv点歌系统"]},"66":{"title":"源码在这里","titles":["7天撸完ktv点歌系统"]},"67":{"title":"MySQL从入门到放弃","titles":[]},"68":{"title":"下载安装","titles":["MySQL从入门到放弃"]},"69":{"title":"终端配置MySQL","titles":["MySQL从入门到放弃"]},"70":{"title":"工具推荐","titles":["MySQL从入门到放弃"]},"71":{"title":"基本操作","titles":["MySQL从入门到放弃"]},"72":{"title":"创建数据库","titles":["MySQL从入门到放弃"]},"73":{"title":"删除数据库","titles":["MySQL从入门到放弃"]},"74":{"title":"查看当前数据库所有表","titles":["MySQL从入门到放弃"]},"75":{"title":"创建表","titles":["MySQL从入门到放弃"]},"76":{"title":"删除表 Drop","titles":["MySQL从入门到放弃"]},"77":{"title":"插入数据 Insert into","titles":["MySQL从入门到放弃"]},"78":{"title":"修改数据 Update","titles":["MySQL从入门到放弃"]},"79":{"title":"删除数据 Delete from","titles":["MySQL从入门到放弃"]},"80":{"title":"简单查询","titles":["MySQL从入门到放弃"]},"81":{"title":"查询排序 Order By","titles":["MySQL从入门到放弃"]},"82":{"title":"别名","titles":["MySQL从入门到放弃"]},"83":{"title":"常用函数","titles":["MySQL从入门到放弃"]},"84":{"title":"分组查询 Group By","titles":["MySQL从入门到放弃"]},"85":{"title":"模糊查询 Like","titles":["MySQL从入门到放弃"]},"86":{"title":"联表查询 Join","titles":["MySQL从入门到放弃"]},"87":{"title":"联表查询综合应用","titles":["MySQL从入门到放弃"]},"88":{"title":"自联","titles":["MySQL从入门到放弃"]},"89":{"title":"子查询","titles":["MySQL从入门到放弃"]},"90":{"title":"分页 LIMIT","titles":["MySQL从入门到放弃"]},"91":{"title":"外键","titles":["MySQL从入门到放弃"]},"92":{"title":"nvm切换node版本","titles":[]},"93":{"title":"下载安装NVM","titles":["nvm切换node版本"]},"94":{"title":"配置环境变量","titles":["nvm切换node版本"]},"95":{"title":"使用NVM查看信息","titles":["nvm切换node版本"]},"96":{"title":"使用NVM下载Node等等","titles":["nvm切换node版本"]},"97":{"title":"常见问题","titles":["nvm切换node版本"]},"98":{"title":"Promise使用与原理","titles":[]},"99":{"title":"BFC总结","titles":[]},"100":{"title":"前言","titles":["BFC总结"]},"101":{"title":"什么是BFC","titles":["BFC总结"]},"102":{"title":"首先看下什么是Formatting Context","titles":["BFC总结","什么是BFC"]},"103":{"title":"BFC","titles":["BFC总结","什么是BFC"]},"104":{"title":"如何生成BFC","titles":["BFC总结"]},"105":{"title":"BFC的布局规则","titles":["BFC总结"]},"106":{"title":"可应用到解决margin重叠的问题中:","titles":["BFC总结","BFC的布局规则"]},"107":{"title":"可应用到两栏布局中:","titles":["BFC总结","BFC的布局规则"]},"108":{"title":"可应用到解决浮动元素的父元素高度塌陷问题中:","titles":["BFC总结","BFC的布局规则"]},"109":{"title":"应用","titles":["BFC总结"]},"110":{"title":"解决margin重叠的问题","titles":["BFC总结","应用"]},"111":{"title":"两栏布局问题","titles":["BFC总结","应用"]},"112":{"title":"解决浮动元素的父元素高度塌陷的问题","titles":["BFC总结","应用"]},"113":{"title":"小结","titles":["BFC总结"]},"114":{"title":"关于DOMParser、XMLSerializer、createTreeWalker使用","titles":[]},"115":{"title":"DOMParser","titles":["关于DOMParser、XMLSerializer、createTreeWalker使用"]},"116":{"title":"语法","titles":["关于DOMParser、XMLSerializer、createTreeWalker使用","DOMParser"]},"117":{"title":"方法","titles":["关于DOMParser、XMLSerializer、createTreeWalker使用","DOMParser"]},"118":{"title":"错误处理","titles":["关于DOMParser、XMLSerializer、createTreeWalker使用","DOMParser"]},"119":{"title":"XMLSerializer","titles":["关于DOMParser、XMLSerializer、createTreeWalker使用"]},"120":{"title":"语法","titles":["关于DOMParser、XMLSerializer、createTreeWalker使用","XMLSerializer"]},"121":{"title":"方法","titles":["关于DOMParser、XMLSerializer、createTreeWalker使用","XMLSerializer"]},"122":{"title":"和outerHTML区别","titles":["关于DOMParser、XMLSerializer、createTreeWalker使用","XMLSerializer"]},"123":{"title":"优化改善网页的加载及性能","titles":[]},"124":{"title":"起步","titles":["优化改善网页的加载及性能"]},"125":{"title":"应用搭建","titles":["优化改善网页的加载及性能"]},"126":{"title":"应用部署","titles":["优化改善网页的加载及性能"]},"127":{"title":"鉴权拦截器","titles":["优化改善网页的加载及性能","应用部署"]},"128":{"title":"nginx代理","titles":["优化改善网页的加载及性能","应用部署"]},"129":{"title":"性能优化","titles":["优化改善网页的加载及性能"]},"130":{"title":"设置CDN","titles":["优化改善网页的加载及性能"]},"131":{"title":"预加载","titles":["优化改善网页的加载及性能"]},"132":{"title":"缓存","titles":["优化改善网页的加载及性能"]},"133":{"title":"懒加载","titles":["优化改善网页的加载及性能","缓存"]},"134":{"title":"资源压缩gzip","titles":["优化改善网页的加载及性能"]},"135":{"title":"总结","titles":["优化改善网页的加载及性能"]},"136":{"title":"深入浅出RegExp","titles":[]},"137":{"title":"一个例子","titles":["深入浅出RegExp"]},"138":{"title":"修饰符","titles":["深入浅出RegExp"]},"139":{"title":"字符类","titles":["深入浅出RegExp"]},"140":{"title":"例子","titles":["深入浅出RegExp","字符类"]},"141":{"title":"复用","titles":["深入浅出RegExp"]},"142":{"title":"选择、组合、捕获、引用","titles":["深入浅出RegExp"]},"143":{"title":"选择","titles":["深入浅出RegExp","选择、组合、捕获、引用"]},"144":{"title":"组合(字符集合范围)","titles":["深入浅出RegExp","选择、组合、捕获、引用"]},"145":{"title":"捕获","titles":["深入浅出RegExp","选择、组合、捕获、引用"]},"146":{"title":"引用","titles":["深入浅出RegExp","选择、组合、捕获、引用"]},"147":{"title":"断言","titles":["深入浅出RegExp"]},"148":{"title":"前瞻断言","titles":["深入浅出RegExp","断言"]},"149":{"title":"后瞻断言","titles":["深入浅出RegExp","断言"]},"150":{"title":"贪婪与惰性","titles":["深入浅出RegExp"]},"151":{"title":"RegExp属性、方法","titles":["深入浅出RegExp"]},"152":{"title":"属性","titles":["深入浅出RegExp","RegExp属性、方法"]},"153":{"title":"方法","titles":["深入浅出RegExp","RegExp属性、方法"]},"154":{"title":"String常见的正则方法","titles":["深入浅出RegExp"]},"155":{"title":"vscode快捷键","titles":[]},"156":{"title":"全局","titles":["vscode快捷键"]},"157":{"title":"基本","titles":["vscode快捷键"]},"158":{"title":"多光标与选择","titles":["vscode快捷键"]},"159":{"title":"查找替换","titles":["vscode快捷键"]},"160":{"title":"进阶","titles":["vscode快捷键"]},"161":{"title":"导航","titles":["vscode快捷键"]},"162":{"title":"编辑器管理","titles":["vscode快捷键"]},"163":{"title":"文件管理","titles":["vscode快捷键"]},"164":{"title":"显示","titles":["vscode快捷键"]},"165":{"title":"调试","titles":["vscode快捷键"]},"166":{"title":"集成终端","titles":["vscode快捷键"]},"167":{"title":"web缓存策略","titles":[]},"168":{"title":"概念","titles":["web缓存策略"]},"169":{"title":"相关文章","titles":["web缓存策略"]},"170":{"title":"从零配置webpack工程","titles":[]},"171":{"title":"webpack 是什么?","titles":["从零配置webpack工程"]},"172":{"title":"webpack 的核心概念","titles":["从零配置webpack工程"]},"173":{"title":"初始化项目","titles":["从零配置webpack工程"]},"174":{"title":"安装基本的依赖","titles":["从零配置webpack工程"]},"175":{"title":"基本配置","titles":["从零配置webpack工程"]},"176":{"title":"html-webpack-plugin","titles":["从零配置webpack工程"]},"177":{"title":"devServer","titles":["从零配置webpack工程"]},"178":{"title":"配置 loader","titles":["从零配置webpack工程"]},"179":{"title":"less-loader","titles":["从零配置webpack工程","配置 loader"]},"180":{"title":"babel-loader","titles":["从零配置webpack工程","配置 loader"]},"181":{"title":"url-loader","titles":["从零配置webpack工程","配置 loader"]},"182":{"title":"mode","titles":["从零配置webpack工程"]},"183":{"title":"devtool","titles":["从零配置webpack工程"]},"184":{"title":"每次打包前清空 dist 目录","titles":["从零配置webpack工程"]},"185":{"title":"externals","titles":["从零配置webpack工程"]},"186":{"title":"resolve","titles":["从零配置webpack工程"]},"187":{"title":"optimization","titles":["从零配置webpack工程"]},"188":{"title":"watch","titles":["从零配置webpack工程"]},"189":{"title":"noParse","titles":["从零配置webpack工程"]},"190":{"title":"webpack-merge","titles":["从零配置webpack工程"]},"191":{"title":"最后","titles":["从零配置webpack工程"]},"192":{"title":"flex布局","titles":[]},"193":{"title":"参考文档","titles":["flex布局"]},"194":{"title":"JS中的设计模式","titles":[]},"195":{"title":"订阅/发布模式(观察者)","titles":["JS中的设计模式"]},"196":{"title":"单例模式","titles":["JS中的设计模式"]},"197":{"title":"策略模式","titles":["JS中的设计模式"]},"198":{"title":"代理模式","titles":["JS中的设计模式"]},"199":{"title":"装饰器模式","titles":["JS中的设计模式"]},"200":{"title":"外观模式","titles":["JS中的设计模式"]},"201":{"title":"工厂模式","titles":["JS中的设计模式"]},"202":{"title":"建造者模式Builder","titles":["JS中的设计模式"]},"203":{"title":"迭代器模式","titles":["JS中的设计模式"]},"204":{"title":"享元模式","titles":["JS中的设计模式"]},"205":{"title":"职责链模式","titles":["JS中的设计模式"]},"206":{"title":"适配器模式","titles":["JS中的设计模式"]},"207":{"title":"模板方法模式","titles":["JS中的设计模式"]},"208":{"title":"中介者模式","titles":["JS中的设计模式"]},"209":{"title":"备忘录模式","titles":["JS中的设计模式"]},"210":{"title":"总结","titles":["JS中的设计模式"]},"211":{"title":"参考文档","titles":["JS中的设计模式"]},"212":{"title":"前端性能测试工具","titles":[]},"213":{"title":"PageSpeed Insights","titles":["前端性能测试工具"]},"214":{"title":"Lighthouse","titles":["前端性能测试工具"]},"215":{"title":"使用方法","titles":["前端性能测试工具","Lighthouse"]},"216":{"title":"测试某网站","titles":["前端性能测试工具","Lighthouse"]},"217":{"title":"SiteSpeed","titles":["前端性能测试工具"]},"218":{"title":"安装","titles":["前端性能测试工具","SiteSpeed"]},"219":{"title":"测试","titles":["前端性能测试工具","SiteSpeed"]},"220":{"title":"Speedcurve","titles":["前端性能测试工具"]},"221":{"title":"webpagetest","titles":["前端性能测试工具"]},"222":{"title":"PWA渐进式应用","titles":[]},"223":{"title":"参考文章","titles":["PWA渐进式应用"]},"224":{"title":"Typescript装饰器指南","titles":[]},"225":{"title":"概念","titles":["Typescript装饰器指南"]},"226":{"title":"装饰器类别","titles":["Typescript装饰器指南"]},"227":{"title":"Reflect-metadata(元数据)","titles":["Typescript装饰器指南"]},"228":{"title":"类装饰器","titles":["Typescript装饰器指南"]},"229":{"title":"属性装饰器","titles":["Typescript装饰器指南"]},"230":{"title":"方法装饰器","titles":["Typescript装饰器指南"]},"231":{"title":"访问器装饰器","titles":["Typescript装饰器指南"]},"232":{"title":"参数装饰器","titles":["Typescript装饰器指南"]},"233":{"title":"执行顺序","titles":["Typescript装饰器指南"]},"234":{"title":"实践","titles":["Typescript装饰器指南"]},"235":{"title":"谈谈Vue内部的运行机制","titles":[]},"236":{"title":"前言","titles":["谈谈Vue内部的运行机制"]},"237":{"title":"从构建开始","titles":["谈谈Vue内部的运行机制"]},"238":{"title":"入口分析","titles":["谈谈Vue内部的运行机制"]},"239":{"title":"new Vue发生了什么","titles":["谈谈Vue内部的运行机制"]},"240":{"title":"手写vue图片懒加载插件","titles":[]},"241":{"title":"前言","titles":["手写vue图片懒加载插件"]},"242":{"title":"功能实现","titles":["手写vue图片懒加载插件"]},"243":{"title":"属性定义","titles":["手写vue图片懒加载插件","功能实现"]},"244":{"title":"图片管理器","titles":["手写vue图片懒加载插件","功能实现"]},"245":{"title":"懒加载管理器","titles":["手写vue图片懒加载插件","功能实现"]},"246":{"title":"优化","titles":["手写vue图片懒加载插件"]},"247":{"title":"兼容处理","titles":["手写vue图片懒加载插件","优化"]},"248":{"title":"图片缓存","titles":["手写vue图片懒加载插件","优化"]},"249":{"title":"背景图","titles":["手写vue图片懒加载插件","优化"]},"250":{"title":"总结","titles":["手写vue图片懒加载插件"]},"251":{"title":"Emoji markup","titles":[]},"252":{"title":"日拱一卒","titles":[]},"253":{"title":"babel原理分析","titles":[]},"254":{"title":"整体流程","titles":["babel原理分析"]},"255":{"title":"parser","titles":["babel原理分析"]},"256":{"title":"traverse","titles":["babel原理分析"]},"257":{"title":"generate","titles":["babel原理分析"]},"258":{"title":"使用Babel开发插件","titles":[]},"259":{"title":"Babel基本使用","titles":[]},"260":{"title":"用途","titles":["Babel基本使用"]},"261":{"title":"配置文件","titles":["Babel基本使用"]},"262":{"title":"JSON","titles":["Babel基本使用","配置文件"]},"263":{"title":"Function","titles":["Babel基本使用","配置文件"]},"264":{"title":"presets","titles":["Babel基本使用","配置文件"]},"265":{"title":"plugins","titles":["Babel基本使用","配置文件"]},"266":{"title":"常见预设","titles":["Babel基本使用"]},"267":{"title":"常见插件","titles":["Babel基本使用"]},"268":{"title":"项目和相对文件配置","titles":["Babel基本使用"]},"269":{"title":"编译器假设Compiler assumptions","titles":["Babel基本使用"]},"270":{"title":"参考文献","titles":["Babel基本使用"]},"271":{"title":"Only Frontend","titles":[]},"272":{"title":"现代浏览器架构","titles":[]},"273":{"title":"CPU、GPU","titles":["现代浏览器架构"]},"274":{"title":"浏览器架构","titles":["现代浏览器架构"]},"275":{"title":"为什么要多进程","titles":["现代浏览器架构"]},"276":{"title":"输入URL后发生了什么","titles":["现代浏览器架构"]},"277":{"title":"浏览器内核、渲染内核","titles":["现代浏览器架构"]},"278":{"title":"站点隔离","titles":["现代浏览器架构"]},"279":{"title":"页面渲染过程","titles":["现代浏览器架构"]},"280":{"title":"渲染优化","titles":["现代浏览器架构"]},"281":{"title":"前端主流构建工具","titles":[]},"282":{"title":"Canvas","titles":[]},"283":{"title":"基本","titles":["Canvas",null]},"284":{"title":"文字","titles":["Canvas",null]},"285":{"title":"圆弧","titles":["Canvas",null]},"286":{"title":"坐标系转换","titles":["Canvas",null]},"287":{"title":"图像合成","titles":["Canvas",null]},"288":{"title":"裁剪","titles":["Canvas",null]},"289":{"title":"状态保存恢复","titles":["Canvas",null]},"290":{"title":"像素操作","titles":["Canvas",null]},"291":{"title":"交互","titles":["Canvas",null]},"292":{"title":"cli","titles":[]},"293":{"title":"参考文献","titles":["cli"]},"294":{"title":"compiler","titles":[]},"295":{"title":"ARP协议","titles":[]},"296":{"title":"通信过程","titles":["ARP协议"]},"297":{"title":"ARP首部","titles":["ARP协议"]},"298":{"title":"ARP缓存表","titles":["ARP协议"]},"299":{"title":"动态ARP表","titles":["ARP协议","ARP缓存表"]},"300":{"title":"静态ARP表","titles":["ARP协议","ARP缓存表"]},"301":{"title":"RARP","titles":["ARP协议"]},"302":{"title":"代理ARP","titles":["ARP协议"]},"303":{"title":"ARP欺骗","titles":["ARP协议"]},"304":{"title":"ARP泛洪","titles":["ARP协议"]},"305":{"title":"总结","titles":["ARP协议"]},"306":{"title":"参考文献","titles":["ARP协议"]},"307":{"title":"计算机网络","titles":[]},"308":{"title":"网络层次划分","titles":["计算机网络"]},"309":{"title":"OSI模型","titles":["计算机网络","网络层次划分"]},"310":{"title":"TCP/IP模型","titles":["计算机网络","网络层次划分"]},"311":{"title":"传输过程","titles":["计算机网络"]},"312":{"title":"TCP/IP协议","titles":["计算机网络"]},"313":{"title":"为什么要懂计算机网络?","titles":["计算机网络"]},"314":{"title":"参考文献","titles":["计算机网络"]},"315":{"title":"HTTP协议及安全防范","titles":[]},"316":{"title":"URI、URL、URN","titles":["HTTP协议及安全防范"]},"317":{"title":"常见状态码","titles":["HTTP协议及安全防范"]},"318":{"title":"HTTP报文","titles":["HTTP协议及安全防范"]},"319":{"title":"首部字段","titles":["HTTP协议及安全防范"]},"320":{"title":"请求方法","titles":["HTTP协议及安全防范"]},"321":{"title":"HTTP演变","titles":["HTTP协议及安全防范"]},"322":{"title":"HTTP/1.1","titles":["HTTP协议及安全防范"]},"323":{"title":"HTTP/2","titles":["HTTP协议及安全防范"]},"324":{"title":"多路复用","titles":["HTTP协议及安全防范","HTTP/2"]},"325":{"title":"ServerPush","titles":["HTTP协议及安全防范","HTTP/2"]},"326":{"title":"头部压缩","titles":["HTTP协议及安全防范","HTTP/2"]},"327":{"title":"HTTP/3","titles":["HTTP协议及安全防范"]},"328":{"title":"HTTPS","titles":["HTTP协议及安全防范"]},"329":{"title":"SSL/TLS","titles":["HTTP协议及安全防范","HTTPS"]},"330":{"title":"对称/非对称加密","titles":["HTTP协议及安全防范","HTTPS"]},"331":{"title":"TLS握手","titles":["HTTP协议及安全防范","HTTPS"]},"332":{"title":"I、RSA握手","titles":["HTTP协议及安全防范","HTTPS","TLS握手"]},"333":{"title":"II、DH(Diffie-Hellman)握手","titles":["HTTP协议及安全防范","HTTPS","TLS握手"]},"334":{"title":"III、TLS1.3握手","titles":["HTTP协议及安全防范","HTTPS","TLS握手"]},"335":{"title":"HTTP缓存","titles":["HTTP协议及安全防范"]},"336":{"title":"跨域","titles":["HTTP协议及安全防范"]},"337":{"title":"简单、非简单请求","titles":["HTTP协议及安全防范","跨域"]},"338":{"title":"JSONP","titles":["HTTP协议及安全防范","跨域"]},"339":{"title":"CORS","titles":["HTTP协议及安全防范","跨域"]},"340":{"title":"postMessage","titles":["HTTP协议及安全防范","跨域"]},"341":{"title":"数据传输","titles":["HTTP协议及安全防范"]},"342":{"title":"定长传输","titles":["HTTP协议及安全防范","数据传输"]},"343":{"title":"不定长传输","titles":["HTTP协议及安全防范","数据传输"]},"344":{"title":"范围请求","titles":["HTTP协议及安全防范","数据传输"]},"345":{"title":"大文件上传与下载","titles":["HTTP协议及安全防范","数据传输"]},"346":{"title":"身份认证","titles":["HTTP协议及安全防范"]},"347":{"title":"Cookie","titles":["HTTP协议及安全防范","身份认证"]},"348":{"title":"Session","titles":["HTTP协议及安全防范","身份认证"]},"349":{"title":"HTTP攻击","titles":["HTTP协议及安全防范"]},"350":{"title":"XSS","titles":["HTTP协议及安全防范","HTTP攻击"]},"351":{"title":"CSRF","titles":["HTTP协议及安全防范","HTTP攻击"]},"352":{"title":"🔗 CSRF攻击演示","titles":["HTTP协议及安全防范","HTTP攻击","CSRF"]},"353":{"title":"💡 那么如何防止CSRF攻击呢?","titles":["HTTP协议及安全防范","HTTP攻击","CSRF"]},"354":{"title":"WebSocket","titles":["HTTP协议及安全防范"]},"355":{"title":"参考文档","titles":["HTTP协议及安全防范"]},"356":{"title":"总结","titles":["HTTP协议及安全防范"]},"357":{"title":"IP协议","titles":[]},"358":{"title":"IP地址","titles":["IP协议"]},"359":{"title":"IP地址分类","titles":["IP协议"]},"360":{"title":"私网地址","titles":["IP协议","IP地址分类"]},"361":{"title":"回环地址","titles":["IP协议","IP地址分类"]},"362":{"title":"网络划分","titles":["IP协议"]},"363":{"title":"子网掩码","titles":["IP协议","网络划分"]},"364":{"title":"划分实现","titles":["IP协议","网络划分"]},"365":{"title":"广播、多播","titles":["IP协议"]},"366":{"title":"IPV6","titles":["IP协议"]},"367":{"title":"IP首部","titles":["IP协议"]},"368":{"title":"生存期TTL","titles":["IP协议"]},"369":{"title":"IP分片、重组","titles":["IP协议"]},"370":{"title":"NAT","titles":["IP协议"]},"371":{"title":"网关、路由器","titles":["IP协议"]},"372":{"title":"总结","titles":["IP协议"]},"373":{"title":"参考文献","titles":["IP协议"]},"374":{"title":"TCP协议","titles":[]},"375":{"title":"特点","titles":["TCP协议"]},"376":{"title":"TCP首部","titles":["TCP协议"]},"377":{"title":"连接与终止","titles":["TCP协议"]},"378":{"title":"三次握手","titles":["TCP协议","连接与终止"]},"379":{"title":"重置连接","titles":["TCP协议","连接与终止"]},"380":{"title":"连接队列","titles":["TCP协议","连接与终止"]},"381":{"title":"SYN泛洪","titles":["TCP协议","连接与终止"]},"382":{"title":"四次挥手","titles":["TCP协议","连接与终止"]},"383":{"title":"查看TCP状态","titles":["TCP协议","连接与终止"]},"384":{"title":"半连接、半断开、半打开","titles":["TCP协议","连接与终止"]},"385":{"title":"数据传输","titles":["TCP协议"]},"386":{"title":"分段传输","titles":["TCP协议","数据传输"]},"387":{"title":"滑动窗口","titles":["TCP协议","数据传输"]},"388":{"title":"重传机制","titles":["TCP协议"]},"389":{"title":"RTT、RTO","titles":["TCP协议","重传机制"]},"390":{"title":"超时重传","titles":["TCP协议","重传机制"]},"391":{"title":"快速重传","titles":["TCP协议","重传机制"]},"392":{"title":"拥塞控制","titles":["TCP协议"]},"393":{"title":"慢启动","titles":["TCP协议","拥塞控制"]},"394":{"title":"拥塞避免","titles":["TCP协议","拥塞控制"]},"395":{"title":"总结","titles":["TCP协议"]},"396":{"title":"参考文献","titles":["TCP协议"]},"397":{"title":"Debug skill","titles":[]},"398":{"title":"调试node程序","titles":["Debug skill"]},"399":{"title":"node debugger模式+chrome调试","titles":["Debug skill","调试node程序"]},"400":{"title":"node debugger模式+vscode调试","titles":["Debug skill","调试node程序"]},"401":{"title":"仅vscode调试","titles":["Debug skill","调试node程序"]},"402":{"title":"调试需编译的程序","titles":["Debug skill","调试node程序"]},"403":{"title":"调试网页程序","titles":["Debug skill"]},"404":{"title":"网页七大断点技巧","titles":["Debug skill","调试网页程序"]},"405":{"title":"调试React","titles":["Debug skill","调试网页程序"]},"406":{"title":"调试Vue","titles":["Debug skill","调试网页程序"]},"407":{"title":"线上Override调试","titles":["Debug skill","调试网页程序"]},"408":{"title":"线上调试(异常上报+监控系统+map映射)","titles":["Debug skill"]},"409":{"title":"手动添加","titles":["Debug skill","线上调试(异常上报+监控系统+map映射)"]},"410":{"title":"自动映射","titles":["Debug skill","线上调试(异常上报+监控系统+map映射)"]},"411":{"title":"Charles抓包工具","titles":[]},"412":{"title":"下载安装","titles":["Charles抓包工具"]},"413":{"title":"面板介绍","titles":["Charles抓包工具"]},"414":{"title":"菜单栏","titles":["Charles抓包工具"]},"415":{"title":"工具栏","titles":["Charles抓包工具"]},"416":{"title":"抓包记录","titles":["Charles抓包工具"]},"417":{"title":"抓包详情","titles":["Charles抓包工具"]},"418":{"title":"请求代理与篡改","titles":["Charles抓包工具"]},"419":{"title":"断点调试","titles":["Charles抓包工具"]},"420":{"title":"弱网测试","titles":["Charles抓包工具"]},"421":{"title":"配置HTTPS","titles":["Charles抓包工具"]},"422":{"title":"客户端抓包","titles":["Charles抓包工具"]},"423":{"title":"汉化补丁","titles":["Charles抓包工具"]},"424":{"title":"常见问题","titles":["Charles抓包工具"]},"425":{"title":"本地地址无法抓取","titles":["Charles抓包工具","常见问题"]},"426":{"title":"总结","titles":["Charles抓包工具"]},"427":{"title":"Chrome","titles":[]},"428":{"title":"Fiddler抓包","titles":[]},"429":{"title":"面板介绍","titles":["Fiddler抓包"]},"430":{"title":"菜单栏","titles":["Fiddler抓包"]},"431":{"title":"工具栏","titles":["Fiddler抓包"]},"432":{"title":"代理监控面板","titles":["Fiddler抓包"]},"433":{"title":"execquick和状态栏","titles":["Fiddler抓包"]},"434":{"title":"execquick","titles":["Fiddler抓包","execquick和状态栏"]},"435":{"title":"状态栏","titles":["Fiddler抓包","execquick和状态栏"]},"436":{"title":"详情面板","titles":["Fiddler抓包"]},"437":{"title":"面板小结","titles":["Fiddler抓包","详情面板"]},"438":{"title":"客户端抓包","titles":["Fiddler抓包"]},"439":{"title":"配置HTTPS","titles":["Fiddler抓包"]},"440":{"title":"总结","titles":["Fiddler抓包"]},"441":{"title":"H5","titles":[]},"442":{"title":"vscode","titles":[]},"443":{"title":"auto attach","titles":["vscode"]},"444":{"title":"Javascript Debug Terminal","titles":["vscode"]},"445":{"title":"Launch Configuration","titles":["vscode"]},"446":{"title":"request launch","titles":["vscode","Launch Configuration"]},"447":{"title":"request attach","titles":["vscode","Launch Configuration"]},"448":{"title":"sourcemaps","titles":["vscode","Launch Configuration"]},"449":{"title":"wireshark网络抓包","titles":[]},"450":{"title":"下载安装","titles":["wireshark网络抓包"]},"451":{"title":"菜单栏","titles":["wireshark网络抓包"]},"452":{"title":"工具栏","titles":["wireshark网络抓包"]},"453":{"title":"过滤器","titles":["wireshark网络抓包"]},"454":{"title":"ARP协议","titles":["wireshark网络抓包"]},"455":{"title":"TCP协议","titles":["wireshark网络抓包"]},"456":{"title":"三次握手","titles":["wireshark网络抓包","TCP协议"]},"457":{"title":"四次挥手","titles":["wireshark网络抓包","TCP协议"]},"458":{"title":"HTTP协议","titles":["wireshark网络抓包"]},"459":{"title":"统计","titles":["wireshark网络抓包"]},"460":{"title":"小结","titles":["wireshark网络抓包"]},"461":{"title":"desktop app","titles":[]},"462":{"title":"编辑器相关","titles":[]},"463":{"title":"flutter","titles":[]},"464":{"title":"混合应用","titles":[]},"465":{"title":"Javascript异步编程","titles":[]},"466":{"title":"同步和异步","titles":["Javascript异步编程"]},"467":{"title":"为什么需要异步","titles":["Javascript异步编程"]},"468":{"title":"异步"影子"","titles":["Javascript异步编程"]},"469":{"title":"回调函数","titles":["Javascript异步编程"]},"470":{"title":"事件监听","titles":["Javascript异步编程"]},"471":{"title":"发布订阅","titles":["Javascript异步编程"]},"472":{"title":"promise","titles":["Javascript异步编程"]},"473":{"title":"迭代器generator","titles":["Javascript异步编程"]},"474":{"title":"async/await","titles":["Javascript异步编程"]},"475":{"title":"音视频","titles":[]},"476":{"title":"音频可视化","titles":["音视频"]},"477":{"title":"你不知道的Javascript","titles":[]},"478":{"title":"走进前端二进制","titles":[]},"479":{"title":"ArrayBuffer","titles":["走进前端二进制"]},"480":{"title":"视图对象","titles":["走进前端二进制"]},"481":{"title":"TypeArray","titles":["走进前端二进制","视图对象"]},"482":{"title":"Uint8Array","titles":["走进前端二进制","视图对象"]},"483":{"title":"构造函数","titles":["走进前端二进制","视图对象","Uint8Array"]},"484":{"title":"属性","titles":["走进前端二进制","视图对象","Uint8Array"]},"485":{"title":"方法","titles":["走进前端二进制","视图对象","Uint8Array"]},"486":{"title":"DataView","titles":["走进前端二进制","视图对象"]},"487":{"title":"构造方法","titles":["走进前端二进制","视图对象","DataView"]},"488":{"title":"属性","titles":["走进前端二进制","视图对象","DataView"]},"489":{"title":"方法","titles":["走进前端二进制","视图对象","DataView"]},"490":{"title":"视图对象总结","titles":["走进前端二进制","视图对象"]},"491":{"title":"字符二进制","titles":["走进前端二进制"]},"492":{"title":"字符二进制流","titles":["走进前端二进制"]},"493":{"title":"Blob","titles":["走进前端二进制"]},"494":{"title":"构造器","titles":["走进前端二进制","Blob"]},"495":{"title":"属性","titles":["走进前端二进制","Blob"]},"496":{"title":"方法","titles":["走进前端二进制","Blob"]},"497":{"title":"用途","titles":["走进前端二进制","Blob"]},"498":{"title":"File","titles":["走进前端二进制"]},"499":{"title":"File对象","titles":["走进前端二进制","File"]},"500":{"title":"属性","titles":["走进前端二进制","File"]},"501":{"title":"方法","titles":["走进前端二进制","File"]},"502":{"title":"FileReader","titles":["走进前端二进制"]},"503":{"title":"构造函数","titles":["走进前端二进制","FileReader"]},"504":{"title":"属性","titles":["走进前端二进制","FileReader"]},"505":{"title":"事件","titles":["走进前端二进制","FileReader"]},"506":{"title":"方法","titles":["走进前端二进制","FileReader"]},"507":{"title":"FileReaderSync","titles":["走进前端二进制"]},"508":{"title":"Stream","titles":["走进前端二进制"]},"509":{"title":"ReadableStream","titles":["走进前端二进制","Stream"]},"510":{"title":"构造函数","titles":["走进前端二进制","Stream","ReadableStream"]},"511":{"title":"实例属性","titles":["走进前端二进制","Stream","ReadableStream"]},"512":{"title":"实例方法","titles":["走进前端二进制","Stream","ReadableStream"]},"513":{"title":"WritableStream","titles":["走进前端二进制","Stream"]},"514":{"title":"构造函数","titles":["走进前端二进制","Stream","WritableStream"]},"515":{"title":"实例属性","titles":["走进前端二进制","Stream","WritableStream"]},"516":{"title":"实例方法","titles":["走进前端二进制","Stream","WritableStream"]},"517":{"title":"TransformStream","titles":["走进前端二进制","Stream"]},"518":{"title":"Response.body","titles":["走进前端二进制","Stream"]},"519":{"title":"实践","titles":["走进前端二进制"]},"520":{"title":"视频流","titles":["走进前端二进制","实践"]},"521":{"title":"文件下载","titles":["走进前端二进制","实践"]},"522":{"title":"大文件上传","titles":["走进前端二进制","实践"]},"523":{"title":"EventLoop事件循环机制","titles":[]},"524":{"title":"前言","titles":["EventLoop事件循环机制"]},"525":{"title":"JS的Engine和Runtime","titles":["EventLoop事件循环机制"]},"526":{"title":"了解浏览器","titles":["EventLoop事件循环机制"]},"527":{"title":"事件驱动","titles":["EventLoop事件循环机制","了解浏览器"]},"528":{"title":"浏览器的EventLoop","titles":["EventLoop事件循环机制"]},"529":{"title":"调用栈","titles":["EventLoop事件循环机制","浏览器的EventLoop"]},"530":{"title":"堆","titles":["EventLoop事件循环机制","浏览器的EventLoop"]},"531":{"title":"任务队列","titles":["EventLoop事件循环机制","浏览器的EventLoop"]},"532":{"title":"MacroTask和MicroTask","titles":["EventLoop事件循环机制"]},"533":{"title":"定时器误差","titles":["EventLoop事件循环机制"]},"534":{"title":"视图更新时机","titles":["EventLoop事件循环机制"]},"535":{"title":"requestAnimationFrame","titles":["EventLoop事件循环机制"]},"536":{"title":"浏览器EventLoop总结","titles":["EventLoop事件循环机制"]},"537":{"title":"Node的EventLoop","titles":["EventLoop事件循环机制"]},"538":{"title":"执行阶段","titles":["EventLoop事件循环机制","Node的EventLoop"]},"539":{"title":"setTimeout和setImmediate","titles":["EventLoop事件循环机制","Node的EventLoop"]},"540":{"title":"process.nextTick","titles":["EventLoop事件循环机制","Node的EventLoop"]},"541":{"title":"总结","titles":["EventLoop事件循环机制"]},"542":{"title":"JS类型隐式转换与装箱拆箱","titles":[]},"543":{"title":"装箱与拆箱","titles":["JS类型隐式转换与装箱拆箱"]},"544":{"title":"装箱","titles":["JS类型隐式转换与装箱拆箱","装箱与拆箱"]},"545":{"title":"拆箱","titles":["JS类型隐式转换与装箱拆箱","装箱与拆箱"]},"546":{"title":"toPrimitive、 OrdinaryToPrimitive","titles":["JS类型隐式转换与装箱拆箱"]},"547":{"title":"类型隐式转换","titles":["JS类型隐式转换与装箱拆箱"]},"548":{"title":"算术运算符转换","titles":["JS类型隐式转换与装箱拆箱"]},"549":{"title":"减乘除","titles":["JS类型隐式转换与装箱拆箱","算术运算符转换"]},"550":{"title":"加运算","titles":["JS类型隐式转换与装箱拆箱","算术运算符转换"]},"551":{"title":"逻辑运算转换","titles":["JS类型隐式转换与装箱拆箱"]},"552":{"title":"!运算转换","titles":["JS类型隐式转换与装箱拆箱","逻辑运算转换"]},"553":{"title":"==运算转换","titles":["JS类型隐式转换与装箱拆箱","逻辑运算转换"]},"554":{"title":"问题","titles":["JS类型隐式转换与装箱拆箱"]},"555":{"title":"总结","titles":["JS类型隐式转换与装箱拆箱"]},"556":{"title":"JS垃圾回收机制","titles":[]},"557":{"title":"引用计数法","titles":["JS垃圾回收机制"]},"558":{"title":"标记清除法","titles":["JS垃圾回收机制"]},"559":{"title":"分代式回收","titles":["JS垃圾回收机制"]},"560":{"title":"新生代","titles":["JS垃圾回收机制","分代式回收"]},"561":{"title":"老生代","titles":["JS垃圾回收机制","分代式回收"]},"562":{"title":"并行回收","titles":["JS垃圾回收机制"]},"563":{"title":"增量标记","titles":["JS垃圾回收机制"]},"564":{"title":"三色标记法","titles":["JS垃圾回收机制","增量标记"]},"565":{"title":"写屏障","titles":["JS垃圾回收机制","增量标记"]},"566":{"title":"惰性清理","titles":["JS垃圾回收机制"]},"567":{"title":"并发回收","titles":["JS垃圾回收机制"]},"568":{"title":"参考文档","titles":["JS垃圾回收机制"]},"569":{"title":"Javascript元编程","titles":[]},"570":{"title":"原型、原型链与继承","titles":[]},"571":{"title":"什么是原型与原型链","titles":["原型、原型链与继承"]},"572":{"title":"属性访问器","titles":["原型、原型链与继承","什么是原型与原型链"]},"573":{"title":"构造函数","titles":["原型、原型链与继承","什么是原型与原型链"]},"574":{"title":"Object.create","titles":["原型、原型链与继承","什么是原型与原型链"]},"575":{"title":"Object.setPrototypeOf/getPrototypeOf","titles":["原型、原型链与继承","什么是原型与原型链"]},"576":{"title":"new内幕","titles":["原型、原型链与继承"]},"577":{"title":"原型链继承","titles":["原型、原型链与继承"]},"578":{"title":"构造函数继承","titles":["原型、原型链与继承"]},"579":{"title":"原型式继承","titles":["原型、原型链与继承"]},"580":{"title":"组合式继承","titles":["原型、原型链与继承"]},"581":{"title":"寄生式继承","titles":["原型、原型链与继承"]},"582":{"title":"寄生组合式继承","titles":["原型、原型链与继承"]},"583":{"title":"class继承","titles":["原型、原型链与继承"]},"584":{"title":"总结","titles":["原型、原型链与继承"]},"585":{"title":"作用域、执行上下文、作用域链和闭包","titles":[]},"586":{"title":"变量声明与提升","titles":["作用域、执行上下文、作用域链和闭包"]},"587":{"title":"变量声明","titles":["作用域、执行上下文、作用域链和闭包","变量声明与提升"]},"588":{"title":"变量提升和暂时性死区","titles":["作用域、执行上下文、作用域链和闭包","变量声明与提升"]},"589":{"title":"作用域","titles":["作用域、执行上下文、作用域链和闭包"]},"590":{"title":"词法环境","titles":["作用域、执行上下文、作用域链和闭包"]},"591":{"title":"作用域链","titles":["作用域、执行上下文、作用域链和闭包"]},"592":{"title":"执行栈","titles":["作用域、执行上下文、作用域链和闭包"]},"593":{"title":"执行上下文","titles":["作用域、执行上下文、作用域链和闭包"]},"594":{"title":"闭包","titles":["作用域、执行上下文、作用域链和闭包"]},"595":{"title":"闭包的优点和缺点","titles":["作用域、执行上下文、作用域链和闭包","闭包"]},"596":{"title":"总结","titles":["作用域、执行上下文、作用域链和闭包"]},"597":{"title":"lowcoding","titles":[]},"598":{"title":"微前端","titles":[]},"599":{"title":"micro-program","titles":[]},"600":{"title":"前端监控系统","titles":[]},"601":{"title":"NestJS基础教程","titles":[]},"602":{"title":"安装","titles":["NestJS基础教程"]},"603":{"title":"程序入口","titles":["NestJS基础教程"]},"604":{"title":"Module","titles":["NestJS基础教程"]},"605":{"title":"controllers","titles":["NestJS基础教程","Module"]},"606":{"title":"providers","titles":["NestJS基础教程","Module"]},"607":{"title":"imports","titles":["NestJS基础教程","Module"]},"608":{"title":"exports","titles":["NestJS基础教程","Module"]},"609":{"title":"动态模块","titles":["NestJS基础教程","Module"]},"610":{"title":"Controller","titles":["NestJS基础教程"]},"611":{"title":"路由分组","titles":["NestJS基础教程","Controller"]},"612":{"title":"路由定义","titles":["NestJS基础教程","Controller"]},"613":{"title":"参数处理","titles":["NestJS基础教程","Controller"]},"614":{"title":"请求对象","titles":["NestJS基础教程","Controller"]},"615":{"title":"状态码","titles":["NestJS基础教程","Controller"]},"616":{"title":"头信息","titles":["NestJS基础教程","Controller"]},"617":{"title":"重定向","titles":["NestJS基础教程","Controller"]},"618":{"title":"子域路由","titles":["NestJS基础教程","Controller"]},"619":{"title":"自定义装饰器","titles":["NestJS基础教程","Controller"]},"620":{"title":"Scope作用域","titles":["NestJS基础教程","Controller"]},"621":{"title":"生命周期","titles":["NestJS基础教程"]},"622":{"title":"Service","titles":["NestJS基础教程"]},"623":{"title":"依赖注入","titles":["NestJS基础教程"]},"624":{"title":"使用","titles":["NestJS基础教程","依赖注入"]},"625":{"title":"作用域","titles":["NestJS基础教程","依赖注入"]},"626":{"title":"可选项 Optional","titles":["NestJS基础教程","依赖注入"]},"627":{"title":"应用配置","titles":["NestJS基础教程"]},"628":{"title":"ConfigModule","titles":["NestJS基础教程","应用配置"]},"629":{"title":"ConfigService","titles":["NestJS基础教程","应用配置"]},"630":{"title":"自定义配置","titles":["NestJS基础教程","应用配置"]},"631":{"title":"registerAs 命名空间","titles":["NestJS基础教程","应用配置"]},"632":{"title":"校验","titles":["NestJS基础教程","应用配置"]},"633":{"title":"Middleware","titles":["NestJS基础教程"]},"634":{"title":"创建配置","titles":["NestJS基础教程","Middleware"]},"635":{"title":"注册","titles":["NestJS基础教程","Middleware"]},"636":{"title":"Exception Filter","titles":["NestJS基础教程"]},"637":{"title":"基本使用","titles":["NestJS基础教程","Exception Filter"]},"638":{"title":"内置filter","titles":["NestJS基础教程","Exception Filter"]},"639":{"title":"自定义filter catch","titles":["NestJS基础教程","Exception Filter"]},"640":{"title":"绑定filter","titles":["NestJS基础教程","Exception Filter"]},"641":{"title":"Pipe","titles":["NestJS基础教程"]},"642":{"title":"基本使用","titles":["NestJS基础教程","Pipe"]},"643":{"title":"绑定pipe","titles":["NestJS基础教程","Pipe"]},"644":{"title":"内置pipe","titles":["NestJS基础教程","Pipe"]},"645":{"title":"自定义pipe","titles":["NestJS基础教程","Pipe"]},"646":{"title":"Class-transformer、class-validator","titles":["NestJS基础教程","Pipe"]},"647":{"title":"Guard","titles":["NestJS基础教程"]},"648":{"title":"基本使用","titles":["NestJS基础教程","Guard"]},"649":{"title":"绑定guard","titles":["NestJS基础教程","Guard"]},"650":{"title":"Interceptor","titles":["NestJS基础教程"]},"651":{"title":"自定义interceptor","titles":["NestJS基础教程","Interceptor"]},"652":{"title":"绑定interceptor","titles":["NestJS基础教程","Interceptor"]},"653":{"title":"Logger","titles":["NestJS基础教程"]},"654":{"title":"版本控制","titles":["NestJS基础教程"]},"655":{"title":"基本使用","titles":["NestJS基础教程","版本控制"]},"656":{"title":"自定义版本","titles":["NestJS基础教程","版本控制"]},"657":{"title":"任务调度","titles":["NestJS基础教程"]},"658":{"title":"安装","titles":["NestJS基础教程","任务调度"]},"659":{"title":"模块注册","titles":["NestJS基础教程","任务调度"]},"660":{"title":"注册调度任务","titles":["NestJS基础教程","任务调度"]},"661":{"title":"动态调度","titles":["NestJS基础教程","任务调度"]},"662":{"title":"总结","titles":["NestJS基础教程"]},"663":{"title":"参考文档","titles":["NestJS基础教程"]},"664":{"title":"Nest搭建WEB服务","titles":[]},"665":{"title":"起步","titles":["Nest搭建WEB服务"]},"666":{"title":"路由配置","titles":["Nest搭建WEB服务"]},"667":{"title":"服务配置","titles":["Nest搭建WEB服务"]},"668":{"title":"应用配置","titles":["Nest搭建WEB服务"]},"669":{"title":"配置文件","titles":["Nest搭建WEB服务","应用配置"]},"670":{"title":"内置功能","titles":["Nest搭建WEB服务","应用配置"]},"671":{"title":"模板引擎","titles":["Nest搭建WEB服务"]},"672":{"title":"国际化","titles":["Nest搭建WEB服务"]},"673":{"title":"注册","titles":["Nest搭建WEB服务","国际化"]},"674":{"title":"语言匹配","titles":["Nest搭建WEB服务","国际化"]},"675":{"title":"控制器使用","titles":["Nest搭建WEB服务","国际化"]},"676":{"title":"语言包","titles":["Nest搭建WEB服务","国际化"]},"677":{"title":"其他","titles":["Nest搭建WEB服务"]},"678":{"title":"Nest使用Swagger文档","titles":[]},"679":{"title":"起步","titles":["Nest使用Swagger文档"]},"680":{"title":"安装","titles":["Nest使用Swagger文档","起步"]},"681":{"title":"配置","titles":["Nest使用Swagger文档","起步"]},"682":{"title":"启动","titles":["Nest使用Swagger文档","起步"]},"683":{"title":"接口参数","titles":["Nest使用Swagger文档"]},"684":{"title":"默认注入","titles":["Nest使用Swagger文档","接口参数"]},"685":{"title":"ApiProperty","titles":["Nest使用Swagger文档","接口参数"]},"686":{"title":"显式定义","titles":["Nest使用Swagger文档","接口参数"]},"687":{"title":"模块划分","titles":["Nest使用Swagger文档"]},"688":{"title":"其他","titles":["Nest使用Swagger文档"]},"689":{"title":"参考文档","titles":["Nest使用Swagger文档"]},"690":{"title":"Nest实用手册","titles":[]},"691":{"title":"跨域","titles":["Nest实用手册"]},"692":{"title":"基本配置","titles":["Nest实用手册","跨域"]},"693":{"title":"参考文档","titles":["Nest实用手册","跨域"]},"694":{"title":"静态资源","titles":["Nest实用手册"]},"695":{"title":"基本使用","titles":["Nest实用手册","静态资源"]},"696":{"title":"资源压缩","titles":["Nest实用手册","静态资源"]},"697":{"title":"Gzip","titles":["Nest实用手册","静态资源"]},"698":{"title":"参考文档","titles":["Nest实用手册","静态资源"]},"699":{"title":"文件上传与下载","titles":["Nest实用手册"]},"700":{"title":"流文件","titles":["Nest实用手册","文件上传与下载"]},"701":{"title":"文件上传","titles":["Nest实用手册","文件上传与下载"]},"702":{"title":"websocket","titles":["Nest实用手册"]},"703":{"title":"部署","titles":["Nest实用手册"]},"704":{"title":"Nginx使用手册","titles":[]},"705":{"title":"优势","titles":["Nginx使用手册"]},"706":{"title":"功能","titles":["Nginx使用手册"]},"707":{"title":"安装nginx","titles":["Nginx使用手册"]},"708":{"title":"常用命令","titles":["Nginx使用手册"]},"709":{"title":"配置文件","titles":["Nginx使用手册"]},"710":{"title":"server","titles":["Nginx使用手册","配置文件"]},"711":{"title":"location","titles":["Nginx使用手册","配置文件"]},"712":{"title":"静态服务","titles":["Nginx使用手册"]},"713":{"title":"访问控制","titles":["Nginx使用手册"]},"714":{"title":"重定向","titles":["Nginx使用手册"]},"715":{"title":"rewrite","titles":["Nginx使用手册","重定向"]},"716":{"title":"return","titles":["Nginx使用手册","重定向"]},"717":{"title":"GZIP压缩","titles":["Nginx使用手册"]},"718":{"title":"图像转换","titles":["Nginx使用手册"]},"719":{"title":"缓存","titles":["Nginx使用手册"]},"720":{"title":"静态资源缓存","titles":["Nginx使用手册","缓存"]},"721":{"title":"代理缓存","titles":["Nginx使用手册","缓存"]},"722":{"title":"防盗链","titles":["Nginx使用手册"]},"723":{"title":"反向代理","titles":["Nginx使用手册"]},"724":{"title":"配置跨域","titles":["Nginx使用手册"]},"725":{"title":"负载均衡","titles":["Nginx使用手册"]},"726":{"title":"配置HTTPS","titles":["Nginx使用手册"]},"727":{"title":"配置HTTP2/3","titles":["Nginx使用手册"]},"728":{"title":"keepalived实现高可用","titles":["Nginx使用手册"]},"729":{"title":"内置变量","titles":["Nginx使用手册"]},"730":{"title":"参考文档","titles":["Nginx使用手册"]},"731":{"title":"node-bff","titles":[]},"732":{"title":"node-optimize","titles":[]},"733":{"title":"NodeJS基本使用","titles":[]},"734":{"title":"参考文档","titles":["NodeJS基本使用"]},"735":{"title":"NodeJS调试技巧","titles":[]},"736":{"title":"参考文档","titles":["NodeJS调试技巧"]},"737":{"title":"NodeJS常见框架","titles":[]},"738":{"title":"NodeJS性能优化","titles":[]},"739":{"title":"压测","titles":["NodeJS性能优化"]},"740":{"title":"分析","titles":["NodeJS性能优化"]},"741":{"title":"NodeJS多进程与多线程","titles":[]},"742":{"title":"NodeJS搭建web服务","titles":[]},"743":{"title":"npm package","titles":[]},"744":{"title":"设计模式","titles":[]},"745":{"title":"订阅/发布模式(观察者)","titles":["设计模式"]},"746":{"title":"单例模式","titles":["设计模式"]},"747":{"title":"策略模式","titles":["设计模式"]},"748":{"title":"代理模式","titles":["设计模式"]},"749":{"title":"装饰器模式","titles":["设计模式"]},"750":{"title":"外观模式","titles":["设计模式"]},"751":{"title":"工厂模式","titles":["设计模式"]},"752":{"title":"建造者模式Builder","titles":["设计模式"]},"753":{"title":"迭代器模式","titles":["设计模式"]},"754":{"title":"享元模式","titles":["设计模式"]},"755":{"title":"职责链模式","titles":["设计模式"]},"756":{"title":"适配器模式","titles":["设计模式"]},"757":{"title":"模板方法模式","titles":["设计模式"]},"758":{"title":"中介者模式","titles":["设计模式"]},"759":{"title":"备忘录模式","titles":["设计模式"]},"760":{"title":"总结","titles":["设计模式"]},"761":{"title":"参考文档","titles":["设计模式"]},"762":{"title":"前端性能优化","titles":[]},"763":{"title":"缓存策略","titles":[]},"764":{"title":"如何实现大文件上传","titles":[]},"765":{"title":"文件上传","titles":["如何实现大文件上传"]},"766":{"title":"大文件问题","titles":["如何实现大文件上传"]},"767":{"title":"解决方案","titles":["如何实现大文件上传"]},"768":{"title":"文件切片","titles":["如何实现大文件上传"]},"769":{"title":"切片上传与合并","titles":["如何实现大文件上传"]},"770":{"title":"切片合并","titles":["如何实现大文件上传","切片上传与合并",null]},"771":{"title":"并发限制","titles":["如何实现大文件上传"]},"772":{"title":"断点续传","titles":["如何实现大文件上传"]},"773":{"title":"切片优化","titles":["如何实现大文件上传"]},"774":{"title":"文件秒传","titles":["如何实现大文件上传"]},"775":{"title":"功能完善","titles":["如何实现大文件上传"]},"776":{"title":"总结","titles":["如何实现大文件上传"]},"777":{"title":"大文件下载","titles":[]},"778":{"title":"SEO优化","titles":[]},"779":{"title":"参考文档","titles":["SEO优化"]},"780":{"title":"虚拟滚动","titles":[]},"781":{"title":"虚拟滚动","titles":[]},"782":{"title":"项目集成","titles":[]},"783":{"title":"💣 常见无规范问题:","titles":["项目集成",null,null]},"784":{"title":"项目集成之打包工具","titles":[]},"785":{"title":"项目集成之编辑器","titles":[]},"786":{"title":"项目集成之框架选型","titles":[]},"787":{"title":"项目集成之提交规范","titles":[]},"788":{"title":"约定式提交","titles":["项目集成之提交规范"]},"789":{"title":"提交类型","titles":["项目集成之提交规范","约定式提交"]},"790":{"title":"作用域","titles":["项目集成之提交规范","约定式提交"]},"791":{"title":"主题","titles":["项目集成之提交规范","约定式提交"]},"792":{"title":"Breaking Changes","titles":["项目集成之提交规范","约定式提交"]},"793":{"title":"关联issue","titles":["项目集成之提交规范","约定式提交"]},"794":{"title":"作用","titles":["项目集成之提交规范","约定式提交"]},"795":{"title":"CommitLint","titles":["项目集成之提交规范"]},"796":{"title":"安装","titles":["项目集成之提交规范","CommitLint"]},"797":{"title":"配置","titles":["项目集成之提交规范","CommitLint"]},"798":{"title":"commitizen","titles":["项目集成之提交规范"]},"799":{"title":"安装","titles":["项目集成之提交规范","commitizen"]},"800":{"title":"使用","titles":["项目集成之提交规范","commitizen"]},"801":{"title":"自定义规范","titles":["项目集成之提交规范","commitizen"]},"802":{"title":"结合commitlint","titles":["项目集成之提交规范","commitizen"]},"803":{"title":"Husky","titles":["项目集成之提交规范"]},"804":{"title":"安装配置","titles":["项目集成之提交规范","Husky"]},"805":{"title":"集成lint","titles":["项目集成之提交规范","Husky"]},"806":{"title":"集成commitlint","titles":["项目集成之提交规范","Husky"]},"807":{"title":"参考文档","titles":["项目集成之提交规范"]},"808":{"title":"项目集成之Monorepo","titles":[]},"809":{"title":"发展历程","titles":["项目集成之Monorepo"]},"810":{"title":"概念","titles":["项目集成之Monorepo"]},"811":{"title":"作用","titles":["项目集成之Monorepo"]},"812":{"title":"包管理方案","titles":["项目集成之Monorepo"]},"813":{"title":"npm","titles":["项目集成之Monorepo","包管理方案"]},"814":{"title":"yarn","titles":["项目集成之Monorepo","包管理方案"]},"815":{"title":"pnpm","titles":["项目集成之Monorepo","包管理方案"]},"816":{"title":"构建方案","titles":["项目集成之Monorepo"]},"817":{"title":"turbo","titles":["项目集成之Monorepo","构建方案"]},"818":{"title":"nx","titles":["项目集成之Monorepo","构建方案"]},"819":{"title":"rush","titles":["项目集成之Monorepo","构建方案"]},"820":{"title":"版本方案","titles":["项目集成之Monorepo"]},"821":{"title":"changesets","titles":["项目集成之Monorepo","版本方案"]},"822":{"title":"实战","titles":["项目集成之Monorepo"]},"823":{"title":"项目集成之语法规范","titles":[]},"824":{"title":"重要性","titles":["项目集成之语法规范"]},"825":{"title":"如何做","titles":["项目集成之语法规范"]},"826":{"title":"ESLint","titles":["项目集成之语法规范"]},"827":{"title":"配置文件","titles":["项目集成之语法规范","ESLint"]},"828":{"title":"environments、globals","titles":["项目集成之语法规范","ESLint"]},"829":{"title":"parser、parserOptions","titles":["项目集成之语法规范","ESLint"]},"830":{"title":"rules、overrides","titles":["项目集成之语法规范","ESLint"]},"831":{"title":"plugins、extends","titles":["项目集成之语法规范","ESLint"]},"832":{"title":"编辑器集成","titles":["项目集成之语法规范","ESLint"]},"833":{"title":"规则集","titles":["项目集成之语法规范","ESLint"]},"834":{"title":"TypeScript","titles":["项目集成之语法规范"]},"835":{"title":"项目集成之风格指南","titles":[]},"836":{"title":"Editorconfig","titles":["项目集成之风格指南"]},"837":{"title":"Prettier","titles":["项目集成之风格指南"]},"838":{"title":"配置插件","titles":["项目集成之风格指南","Prettier"]},"839":{"title":"配置文件","titles":["项目集成之风格指南","Prettier"]},"840":{"title":"集成eslint","titles":["项目集成之风格指南","Prettier"]},"841":{"title":"prettierignore","titles":["项目集成之风格指南","Prettier"]},"842":{"title":"StyleLint","titles":["项目集成之风格指南"]},"843":{"title":"插件安装、配置","titles":["项目集成之风格指南","StyleLint"]},"844":{"title":"项目安装","titles":["项目集成之风格指南","StyleLint"]},"845":{"title":"plugins","titles":["项目集成之风格指南","StyleLint"]},"846":{"title":"extends","titles":["项目集成之风格指南","StyleLint"]},"847":{"title":"rules、overrides","titles":["项目集成之风格指南","StyleLint"]},"848":{"title":"stylelintignore","titles":["项目集成之风格指南","StyleLint"]},"849":{"title":"脚本","titles":["项目集成之风格指南","StyleLint"]},"850":{"title":"CSS BEM命名约定","titles":["项目集成之风格指南"]},"851":{"title":"前端自动化测试","titles":[]},"852":{"title":"单测和端测区别","titles":["前端自动化测试"]},"853":{"title":"单元测试(Unit)","titles":["前端自动化测试","单测和端测区别"]},"854":{"title":"端到端测试(End-to-End)","titles":["前端自动化测试","单测和端测区别"]},"855":{"title":"单元测试 - Jest","titles":["前端自动化测试"]},"856":{"title":"安装","titles":["前端自动化测试","单元测试 - Jest"]},"857":{"title":"初始化","titles":["前端自动化测试","单元测试 - Jest"]},"858":{"title":"转译器","titles":["前端自动化测试","单元测试 - Jest"]},"859":{"title":"基本断言","titles":["前端自动化测试","单元测试 - Jest"]},"860":{"title":"执行测试","titles":["前端自动化测试","单元测试 - Jest","基本断言"]},"861":{"title":"路径映射","titles":["前端自动化测试","单元测试 - Jest"]},"862":{"title":"配置jest路径映射","titles":["前端自动化测试","单元测试 - Jest","路径映射"]},"863":{"title":"配置tsconfig","titles":["前端自动化测试","单元测试 - Jest","路径映射"]},"864":{"title":"dom测试","titles":["前端自动化测试","单元测试 - Jest"]},"865":{"title":"异步测试","titles":["前端自动化测试","单元测试 - Jest"]},"866":{"title":"使用Promise","titles":["前端自动化测试","单元测试 - Jest","异步测试"]},"867":{"title":"使用async测试","titles":["前端自动化测试","单元测试 - Jest","异步测试"]},"868":{"title":"使用回调函数","titles":["前端自动化测试","单元测试 - Jest","异步测试"]},"869":{"title":"模拟函数","titles":["前端自动化测试","单元测试 - Jest"]},"870":{"title":"定时器","titles":["前端自动化测试","单元测试 - Jest"]},"871":{"title":"setup配置","titles":["前端自动化测试","单元测试 - Jest"]},"872":{"title":"覆盖率","titles":["前端自动化测试","单元测试 - Jest"]},"873":{"title":"开启覆盖率","titles":["前端自动化测试","单元测试 - Jest","覆盖率"]},"874":{"title":"测试覆盖率","titles":["前端自动化测试","单元测试 - Jest","覆盖率"]},"875":{"title":"Vue组件测试","titles":["前端自动化测试","单元测试 - Jest"]},"876":{"title":"端到端测试 - Cypress","titles":["前端自动化测试"]},"877":{"title":"安装使用","titles":["前端自动化测试","端到端测试 - Cypress"]},"878":{"title":"配置","titles":["前端自动化测试","端到端测试 - Cypress"]},"879":{"title":"基本端测","titles":["前端自动化测试","端到端测试 - Cypress"]},"880":{"title":"代码覆盖率","titles":["前端自动化测试","端到端测试 - Cypress"]},"881":{"title":"钩子函数","titles":["前端自动化测试","端到端测试 - Cypress"]},"882":{"title":"常见问题","titles":["前端自动化测试","端到端测试 - Cypress"]},"883":{"title":"参考文档","titles":["前端自动化测试"]},"884":{"title":"react","titles":[]},"885":{"title":"正则表达式","titles":[]},"886":{"title":"一个例子","titles":["正则表达式"]},"887":{"title":"修饰符","titles":["正则表达式"]},"888":{"title":"字符类","titles":["正则表达式"]},"889":{"title":"例子","titles":["正则表达式","字符类"]},"890":{"title":"复用","titles":["正则表达式"]},"891":{"title":"选择、组合、捕获、引用","titles":["正则表达式"]},"892":{"title":"选择","titles":["正则表达式","选择、组合、捕获、引用"]},"893":{"title":"组合(字符集合范围)","titles":["正则表达式","选择、组合、捕获、引用"]},"894":{"title":"捕获","titles":["正则表达式","选择、组合、捕获、引用"]},"895":{"title":"引用","titles":["正则表达式","选择、组合、捕获、引用"]},"896":{"title":"断言","titles":["正则表达式"]},"897":{"title":"前瞻断言","titles":["正则表达式","断言"]},"898":{"title":"后瞻断言","titles":["正则表达式","断言"]},"899":{"title":"贪婪与惰性","titles":["正则表达式"]},"900":{"title":"RegExp属性、方法","titles":["正则表达式"]},"901":{"title":"属性","titles":["正则表达式","RegExp属性、方法"]},"902":{"title":"方法","titles":["正则表达式","RegExp属性、方法"]},"903":{"title":"String常见的正则方法","titles":["正则表达式"]},"904":{"title":"渲染模式","titles":[]},"905":{"title":"sandbox","titles":[]},"906":{"title":"typescript","titles":[]},"907":{"title":"基础类型","titles":["typescript"]},"908":{"title":"内置null/undefined/void","titles":["typescript"]},"909":{"title":"内置any/unknown/never","titles":["typescript"]},"910":{"title":"枚举","titles":["typescript"]},"911":{"title":"接口interface和类型别名type","titles":["typescript"]},"912":{"title":"联合类型和交叉类型","titles":["typescript"]},"913":{"title":"索引类型keyof","titles":["typescript"]},"914":{"title":"类型查询typeof","titles":["typescript"]},"915":{"title":"类型守卫","titles":["typescript"]},"916":{"title":"类Class","titles":["typescript"]},"917":{"title":"泛型","titles":["typescript"]},"918":{"title":"条件类型","titles":["typescript"]},"919":{"title":"鸭子辨形","titles":["typescript"]},"920":{"title":"内置工具类型","titles":["typescript"]},"921":{"title":"常用","titles":["typescript"]},"922":{"title":"Typescript配置文件","titles":[]},"923":{"title":"visual","titles":[]},"924":{"title":"Vue源码分析之组件创建","titles":[]},"925":{"title":"VNode","titles":["Vue源码分析之组件创建"]},"926":{"title":"Render","titles":["Vue源码分析之组件创建"]},"927":{"title":"Vue源码分析之计算属性与侦听函数","titles":[]},"928":{"title":"计算属性","titles":["Vue源码分析之计算属性与侦听函数"]},"929":{"title":"简单使用","titles":["Vue源码分析之计算属性与侦听函数","计算属性"]},"930":{"title":"计算属性缓存","titles":["Vue源码分析之计算属性与侦听函数","计算属性"]},"931":{"title":"计算属性本质","titles":["Vue源码分析之计算属性与侦听函数","计算属性"]},"932":{"title":"原理实现","titles":["Vue源码分析之计算属性与侦听函数","计算属性"]},"933":{"title":"代码调试","titles":["Vue源码分析之计算属性与侦听函数","计算属性"]},"934":{"title":"Vue3的computed","titles":["Vue源码分析之计算属性与侦听函数","计算属性"]},"935":{"title":"侦听函数","titles":["Vue源码分析之计算属性与侦听函数"]},"936":{"title":"简单使用","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"937":{"title":"初始化过程","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"938":{"title":"$watch","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"939":{"title":"immediate","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"940":{"title":"事件卸载","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"941":{"title":"deep","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"942":{"title":"sync","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"943":{"title":"注意事项","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"944":{"title":"Vue3的watch","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"945":{"title":"watchEffect","titles":["Vue源码分析之计算属性与侦听函数","侦听函数"]},"946":{"title":"总结","titles":["Vue源码分析之计算属性与侦听函数"]},"947":{"title":"Pinia源码分析","titles":[]},"948":{"title":"Vue源码分析之响应式原理","titles":[]},"949":{"title":"Vue2分析","titles":["Vue源码分析之响应式原理"]},"950":{"title":"简单实现","titles":["Vue源码分析之响应式原理","Vue2分析"]},"951":{"title":"依赖自动收集与更新","titles":["Vue源码分析之响应式原理","Vue2分析"]},"952":{"title":"官方实现","titles":["Vue源码分析之响应式原理","Vue2分析"]},"953":{"title":"整体流程","titles":["Vue源码分析之响应式原理","Vue2分析","官方实现"]},"954":{"title":"具体实现","titles":["Vue源码分析之响应式原理","Vue2分析","官方实现"]},"955":{"title":"数组实现","titles":["Vue源码分析之响应式原理","Vue2分析"]},"956":{"title":"$Set原理","titles":["Vue源码分析之响应式原理","Vue2分析"]},"957":{"title":"Vue3分析","titles":["Vue源码分析之响应式原理"]},"958":{"title":"核心API","titles":["Vue源码分析之响应式原理","Vue3分析"]},"959":{"title":"简单实现","titles":["Vue源码分析之响应式原理","Vue3分析"]},"960":{"title":"深层嵌套","titles":["Vue源码分析之响应式原理","Vue3分析"]},"961":{"title":"实现数组","titles":["Vue源码分析之响应式原理","Vue3分析"]},"962":{"title":"实现Ref","titles":["Vue源码分析之响应式原理","Vue3分析"]},"963":{"title":"实现toRefs","titles":["Vue源码分析之响应式原理","Vue3分析"]},"964":{"title":"官方实现","titles":["Vue源码分析之响应式原理","Vue3分析"]},"965":{"title":"响应式对比","titles":["Vue源码分析之响应式原理"]},"966":{"title":"源码调试技巧","titles":["Vue源码分析之响应式原理"]},"967":{"title":"IOC实现响应式","titles":["Vue源码分析之响应式原理"]},"968":{"title":"总结","titles":["Vue源码分析之响应式原理"]},"969":{"title":"VueRouter源码分析","titles":[]},"970":{"title":"Vue源码分析之插槽","titles":[]},"971":{"title":"Vue源码分析之模板编译","titles":[]},"972":{"title":"Vue源码分析之过渡","titles":[]},"973":{"title":"Vue源码分析之视图更新","titles":[]},"974":{"title":"patch","titles":["Vue源码分析之视图更新"]},"975":{"title":"nexktick","titles":["Vue源码分析之视图更新"]},"976":{"title":"Vuex源码分析","titles":[]},"977":{"title":"webassembly","titles":[]},"978":{"title":"用途","titles":["webassembly"]},"979":{"title":"使用","titles":["webassembly"]},"980":{"title":"参考文档","titles":["webassembly"]},"981":{"title":"webpack基本使用","titles":[]},"982":{"title":"webpack原理分析","titles":[]},"983":{"title":"什么是loader","titles":["webpack原理分析"]},"984":{"title":"什么是plugin","titles":["webpack原理分析"]},"985":{"title":"整体流程","titles":["webpack原理分析"]},"986":{"title":"核心模块","titles":["webpack原理分析"]},"987":{"title":"运行时","titles":["webpack原理分析"]},"988":{"title":"webpack自定义loader","titles":[]},"989":{"title":"webpack结合nodejs使用","titles":[]},"990":{"title":"webpack自定义插件","titles":[]},"991":{"title":"To Fullstack","titles":[]},"992":{"title":"Docker基础教程","titles":[]},"993":{"title":"Docker架构","titles":["Docker基础教程"]},"994":{"title":"全局命令","titles":["Docker基础教程"]},"995":{"title":"核心组件","titles":["Docker基础教程"]},"996":{"title":"镜像","titles":["Docker基础教程"]},"997":{"title":"镜像层","titles":["Docker基础教程","镜像"]},"998":{"title":"查看本地镜像","titles":["Docker基础教程","镜像"]},"999":{"title":"搜索、下载、推送","titles":["Docker基础教程","镜像"]},"1000":{"title":"创建、删除","titles":["Docker基础教程","镜像"]},"1001":{"title":"其他命令","titles":["Docker基础教程","镜像"]},"1002":{"title":"虚悬镜像","titles":["Docker基础教程","镜像"]},"1003":{"title":"容器","titles":["Docker基础教程"]},"1004":{"title":"启动","titles":["Docker基础教程","容器"]},"1005":{"title":"进入容器","titles":["Docker基础教程","容器"]},"1006":{"title":"容器列表","titles":["Docker基础教程","容器"]},"1007":{"title":"容器日志","titles":["Docker基础教程","容器"]},"1008":{"title":"停止","titles":["Docker基础教程","容器"]},"1009":{"title":"删除","titles":["Docker基础教程","容器"]},"1010":{"title":"导入导出","titles":["Docker基础教程","容器"]},"1011":{"title":"仓库","titles":["Docker基础教程"]},"1012":{"title":"公有仓库","titles":["Docker基础教程","仓库"]},"1013":{"title":"私有仓库","titles":["Docker基础教程","仓库"]},"1014":{"title":"认证","titles":["Docker基础教程","仓库"]},"1015":{"title":"总结","titles":["Docker基础教程"]},"1016":{"title":"使用DockerCompose部署服务","titles":[]},"1017":{"title":"优势","titles":["使用DockerCompose部署服务"]},"1018":{"title":"初识DockerCompose","titles":["使用DockerCompose部署服务"]},"1019":{"title":"语法","titles":["使用DockerCompose部署服务"]},"1020":{"title":"services","titles":["使用DockerCompose部署服务","语法"]},"1021":{"title":"image","titles":["使用DockerCompose部署服务","语法"]},"1022":{"title":"ports、networks、volumes","titles":["使用DockerCompose部署服务","语法"]},"1023":{"title":"depends_on","titles":["使用DockerCompose部署服务","语法"]},"1024":{"title":"environment","titles":["使用DockerCompose部署服务","语法"]},"1025":{"title":"restart","titles":["使用DockerCompose部署服务","语法"]},"1026":{"title":"更多","titles":["使用DockerCompose部署服务","语法"]},"1027":{"title":"命令","titles":["使用DockerCompose部署服务"]},"1028":{"title":"build","titles":["使用DockerCompose部署服务","命令"]},"1029":{"title":"up","titles":["使用DockerCompose部署服务","命令"]},"1030":{"title":"stop","titles":["使用DockerCompose部署服务","命令"]},"1031":{"title":"rm","titles":["使用DockerCompose部署服务","命令"]},"1032":{"title":"kill","titles":["使用DockerCompose部署服务","命令"]},"1033":{"title":"更多","titles":["使用DockerCompose部署服务","命令"]},"1034":{"title":"实战","titles":["使用DockerCompose部署服务"]},"1035":{"title":"参考文档","titles":["使用DockerCompose部署服务"]},"1036":{"title":"搭建docker私有仓库","titles":[]},"1037":{"title":"官方registry搭建","titles":["搭建docker私有仓库"]},"1038":{"title":"安装registry","titles":["搭建docker私有仓库","官方registry搭建"]},"1039":{"title":"使用仓库","titles":["搭建docker私有仓库","官方registry搭建"]},"1040":{"title":"使用nexus3搭建","titles":["搭建docker私有仓库"]},"1041":{"title":"创建存储集","titles":["搭建docker私有仓库","使用nexus3搭建"]},"1042":{"title":"创建仓库","titles":["搭建docker私有仓库","使用nexus3搭建"]},"1043":{"title":"配置角色与用户","titles":["搭建docker私有仓库","使用nexus3搭建"]},"1044":{"title":"配置Realms","titles":["搭建docker私有仓库","使用nexus3搭建"]},"1045":{"title":"登录仓库","titles":["搭建docker私有仓库","使用nexus3搭建"]},"1046":{"title":"推送镜像","titles":["搭建docker私有仓库","使用nexus3搭建"]},"1047":{"title":"下载镜像","titles":["搭建docker私有仓库","使用nexus3搭建"]},"1048":{"title":"使用Dockerfile构建镜像","titles":[]},"1049":{"title":"概念","titles":["使用Dockerfile构建镜像"]},"1050":{"title":"作用","titles":["使用Dockerfile构建镜像"]},"1051":{"title":"初识Dockerfile","titles":["使用Dockerfile构建镜像"]},"1052":{"title":"语法","titles":["使用Dockerfile构建镜像"]},"1053":{"title":"FROM","titles":["使用Dockerfile构建镜像","语法"]},"1054":{"title":"ARG","titles":["使用Dockerfile构建镜像","语法"]},"1055":{"title":"ENV","titles":["使用Dockerfile构建镜像","语法"]},"1056":{"title":"WORKDIR","titles":["使用Dockerfile构建镜像","语法"]},"1057":{"title":"LABEL","titles":["使用Dockerfile构建镜像","语法"]},"1058":{"title":"RUN","titles":["使用Dockerfile构建镜像","语法"]},"1059":{"title":"COPY","titles":["使用Dockerfile构建镜像","语法"]},"1060":{"title":"ADD","titles":["使用Dockerfile构建镜像","语法"]},"1061":{"title":"VOLUME","titles":["使用Dockerfile构建镜像","语法"]},"1062":{"title":"EXPOSE","titles":["使用Dockerfile构建镜像","语法"]},"1063":{"title":"CMD","titles":["使用Dockerfile构建镜像","语法"]},"1064":{"title":"ENTRYPOINT","titles":["使用Dockerfile构建镜像","语法"]},"1065":{"title":"ONBUILD","titles":["使用Dockerfile构建镜像","语法"]},"1066":{"title":"HEALTHCHECK","titles":["使用Dockerfile构建镜像","语法"]},"1067":{"title":"注意事项","titles":["使用Dockerfile构建镜像"]},"1068":{"title":"构建上下文","titles":["使用Dockerfile构建镜像"]},"1069":{"title":"镜像构建","titles":["使用Dockerfile构建镜像"]},"1070":{"title":"多阶段构建","titles":["使用Dockerfile构建镜像"]},"1071":{"title":"dockerignore","titles":["使用Dockerfile构建镜像"]},"1072":{"title":"构建前端项目","titles":["使用Dockerfile构建镜像"]},"1073":{"title":"静态项目","titles":["使用Dockerfile构建镜像","构建前端项目"]},"1074":{"title":"NodeJS项目","titles":["使用Dockerfile构建镜像","构建前端项目"]},"1075":{"title":"构建优化","titles":["使用Dockerfile构建镜像"]},"1076":{"title":"参考文档","titles":["使用Dockerfile构建镜像"]},"1077":{"title":"总结","titles":["使用Dockerfile构建镜像"]},"1078":{"title":"Docker安装与配置","titles":[]},"1079":{"title":"优缺点","titles":["Docker安装与配置"]},"1080":{"title":"docker架构","titles":["Docker安装与配置"]},"1081":{"title":"Docker三大组件","titles":["Docker安装与配置"]},"1082":{"title":"安装","titles":["Docker安装与配置"]},"1083":{"title":"配置","titles":["Docker安装与配置"]},"1084":{"title":"Docker网络原理","titles":[]},"1085":{"title":"原理","titles":["Docker网络原理"]},"1086":{"title":"访问过程","titles":["Docker网络原理"]},"1087":{"title":"网络类型","titles":["Docker网络原理"]},"1088":{"title":"网络列表","titles":["Docker网络原理"]},"1089":{"title":"创建网络","titles":["Docker网络原理"]},"1090":{"title":"使用网络","titles":["Docker网络原理"]},"1091":{"title":"总结","titles":["Docker网络原理"]},"1092":{"title":"使用Docker搭建npm仓库","titles":[]},"1093":{"title":"安装docker","titles":["使用Docker搭建npm仓库"]},"1094":{"title":"安装nexus3","titles":["使用Docker搭建npm仓库"]},"1095":{"title":"初始密码","titles":["使用Docker搭建npm仓库"]},"1096":{"title":"访问nexus3","titles":["使用Docker搭建npm仓库"]},"1097":{"title":"创建存储集","titles":["使用Docker搭建npm仓库"]},"1098":{"title":"创建仓库","titles":["使用Docker搭建npm仓库"]},"1099":{"title":"创建角色","titles":["使用Docker搭建npm仓库"]},"1100":{"title":"创建用户","titles":["使用Docker搭建npm仓库"]},"1101":{"title":"权限认证","titles":["使用Docker搭建npm仓库"]},"1102":{"title":"发布npm包","titles":["使用Docker搭建npm仓库"]},"1103":{"title":"验证npm包","titles":["使用Docker搭建npm仓库"]},"1104":{"title":"proxy和group仓库","titles":["使用Docker搭建npm仓库"]},"1105":{"title":"创建proxy","titles":["使用Docker搭建npm仓库","proxy和group仓库"]},"1106":{"title":"创建group","titles":["使用Docker搭建npm仓库","proxy和group仓库"]},"1107":{"title":"验证私库","titles":["使用Docker搭建npm仓库","proxy和group仓库"]},"1108":{"title":"打标签","titles":["使用Docker搭建npm仓库"]},"1109":{"title":"Docker数据卷与持久化","titles":[]},"1110":{"title":"概念与作用","titles":["Docker数据卷与持久化"]},"1111":{"title":"卷的类型","titles":["Docker数据卷与持久化"]},"1112":{"title":"卷的使用","titles":["Docker数据卷与持久化"]},"1113":{"title":"创建","titles":["Docker数据卷与持久化","卷的使用"]},"1114":{"title":"查看","titles":["Docker数据卷与持久化","卷的使用"]},"1115":{"title":"删除","titles":["Docker数据卷与持久化","卷的使用"]},"1116":{"title":"挂载","titles":["Docker数据卷与持久化","卷的使用"]},"1117":{"title":"总结","titles":["Docker数据卷与持久化"]},"1118":{"title":"Gitlab流水线配置","titles":[]},"1119":{"title":"示例","titles":["Gitlab流水线配置"]},"1120":{"title":"默认变量","titles":["Gitlab流水线配置"]},"1121":{"title":"通用变量","titles":["Gitlab流水线配置","默认变量"]},"1122":{"title":"合并请求变量","titles":["Gitlab流水线配置","默认变量"]},"1123":{"title":"流水线","titles":["Gitlab流水线配置"]},"1124":{"title":"job","titles":["Gitlab流水线配置","流水线"]},"1125":{"title":"stages","titles":["Gitlab流水线配置","流水线"]},"1126":{"title":"stage","titles":["Gitlab流水线配置","流水线"]},"1127":{"title":".pre&.post","titles":["Gitlab流水线配置","流水线"]},"1128":{"title":"variables","titles":["Gitlab流水线配置","流水线"]},"1129":{"title":"tags","titles":["Gitlab流水线配置","流水线"]},"1130":{"title":"allow_failure","titles":["Gitlab流水线配置","流水线"]},"1131":{"title":"when","titles":["Gitlab流水线配置","流水线"]},"1132":{"title":"retry","titles":["Gitlab流水线配置","流水线"]},"1133":{"title":"timeout","titles":["Gitlab流水线配置","流水线"]},"1134":{"title":"parallel","titles":["Gitlab流水线配置","流水线"]},"1135":{"title":"only/except","titles":["Gitlab流水线配置","流水线"]},"1136":{"title":"rules","titles":["Gitlab流水线配置","流水线"]},"1137":{"title":"workflow","titles":["Gitlab流水线配置","流水线"]},"1138":{"title":"cache","titles":["Gitlab流水线配置","流水线"]},"1139":{"title":"artifacts","titles":["Gitlab流水线配置","流水线"]},"1140":{"title":"dependencies","titles":["Gitlab流水线配置","流水线"]},"1141":{"title":"needs","titles":["Gitlab流水线配置","流水线"]},"1142":{"title":"include","titles":["Gitlab流水线配置","流水线"]},"1143":{"title":"extends","titles":["Gitlab流水线配置","流水线"]},"1144":{"title":"trigger","titles":["Gitlab流水线配置","流水线"]},"1145":{"title":"image","titles":["Gitlab流水线配置","流水线"]},"1146":{"title":"services","titles":["Gitlab流水线配置","流水线"]},"1147":{"title":"environment","titles":["Gitlab流水线配置","流水线"]},"1148":{"title":"inherit","titles":["Gitlab流水线配置","流水线"]},"1149":{"title":"参考文档","titles":["Gitlab流水线配置"]},"1150":{"title":"Gitlab Runner安装与配置","titles":[]},"1151":{"title":"下载镜像","titles":["Gitlab Runner安装与配置"]},"1152":{"title":"创建挂载卷","titles":["Gitlab Runner安装与配置"]},"1153":{"title":"运行runner","titles":["Gitlab Runner安装与配置"]},"1154":{"title":"注册runner","titles":["Gitlab Runner安装与配置"]},"1155":{"title":"注册token","titles":["Gitlab Runner安装与配置","注册runner"]},"1156":{"title":"交互式注册","titles":["Gitlab Runner安装与配置","注册runner"]},"1157":{"title":"非交互式","titles":["Gitlab Runner安装与配置","注册runner"]},"1158":{"title":"参数说明","titles":["Gitlab Runner安装与配置","注册runner"]},"1159":{"title":"配置文件","titles":["Gitlab Runner安装与配置"]},"1160":{"title":"配置重载","titles":["Gitlab Runner安装与配置"]},"1161":{"title":"runner类型","titles":["Gitlab Runner安装与配置"]},"1162":{"title":"runner执行器","titles":["Gitlab Runner安装与配置"]},"1163":{"title":"Shell 执行器","titles":["Gitlab Runner安装与配置","runner执行器"]},"1164":{"title":"虚拟机执行器(VirtualBox / Parallels)","titles":["Gitlab Runner安装与配置","runner执行器"]},"1165":{"title":"Docker 执行器","titles":["Gitlab Runner安装与配置","runner执行器"]},"1166":{"title":"Docker Machine 执行器","titles":["Gitlab Runner安装与配置","runner执行器"]},"1167":{"title":"Kubernetes 执行器","titles":["Gitlab Runner安装与配置","runner执行器"]},"1168":{"title":"SSH 执行器","titles":["Gitlab Runner安装与配置","runner执行器"]},"1169":{"title":"自定义执行器","titles":["Gitlab Runner安装与配置","runner执行器"]},"1170":{"title":"GitLab安装与配置","titles":[]},"1171":{"title":"docker安装","titles":["GitLab安装与配置"]},"1172":{"title":"命令式","titles":["GitLab安装与配置","docker安装"]},"1173":{"title":"配置文件安装","titles":["GitLab安装与配置","docker安装"]},"1174":{"title":"密码","titles":["GitLab安装与配置","docker安装"]},"1175":{"title":"域名与证书","titles":["GitLab安装与配置","docker安装"]},"1176":{"title":"配置域名","titles":["GitLab安装与配置","docker安装","域名与证书"]},"1177":{"title":"开启https","titles":["GitLab安装与配置","docker安装","域名与证书"]},"1178":{"title":"ssl证书配置","titles":["GitLab安装与配置","docker安装","域名与证书"]},"1179":{"title":"配置重载","titles":["GitLab安装与配置","docker安装"]},"1180":{"title":"Centos安装","titles":["GitLab安装与配置"]},"1181":{"title":"Gitlab搭建npm仓库","titles":[]},"1182":{"title":"创建组与项目","titles":["Gitlab搭建npm仓库"]},"1183":{"title":"初始化项目","titles":["Gitlab搭建npm仓库"]},"1184":{"title":"项目作为依赖","titles":["Gitlab搭建npm仓库"]},"1185":{"title":"Gitlab软件库","titles":["Gitlab搭建npm仓库"]},"1186":{"title":"注册表类型","titles":["Gitlab搭建npm仓库","Gitlab软件库"]},"1187":{"title":"发布准备","titles":["Gitlab搭建npm仓库","Gitlab软件库"]},"1188":{"title":"发布npm包","titles":["Gitlab搭建npm仓库"]},"1189":{"title":"手动发布","titles":["Gitlab搭建npm仓库","发布npm包"]},"1190":{"title":"CI/CD自动构建npm包","titles":["Gitlab搭建npm仓库","发布npm包"]},"1191":{"title":"使用npm包","titles":["Gitlab搭建npm仓库"]},"1192":{"title":"参考文档","titles":["Gitlab搭建npm仓库"]},"1193":{"title":"初识Kubernetes","titles":[null]},"1194":{"title":"搭建k8s集群","titles":[]},"1195":{"title":"配置要求","titles":["搭建k8s集群"]},"1196":{"title":"机器划分","titles":["搭建k8s集群"]},"1197":{"title":"环境准备","titles":["搭建k8s集群"]},"1198":{"title":"内核升级","titles":["搭建k8s集群","环境准备"]},"1199":{"title":"更改主机名","titles":["搭建k8s集群","环境准备"]},"1200":{"title":"配置DNS","titles":["搭建k8s集群","环境准备"]},"1201":{"title":"配置防火墙","titles":["搭建k8s集群","环境准备"]},"1202":{"title":"禁用selinux","titles":["搭建k8s集群","环境准备"]},"1203":{"title":"禁用swap","titles":["搭建k8s集群","环境准备"]},"1204":{"title":"同步时区","titles":["搭建k8s集群","环境准备"]},"1205":{"title":"转发 IPv4 并让 iptables 看到桥接流量","titles":["搭建k8s集群","环境准备"]},"1206":{"title":"安装ipvs","titles":["搭建k8s集群","环境准备"]},"1207":{"title":"容器运行时","titles":["搭建k8s集群"]},"1208":{"title":"docker","titles":["搭建k8s集群","容器运行时"]},"1209":{"title":"containerd","titles":["搭建k8s集群","容器运行时"]},"1210":{"title":"配置k8s国内源","titles":["搭建k8s集群"]},"1211":{"title":"使用kubeadm安装","titles":["搭建k8s集群"]},"1212":{"title":"master生成k8s集群配置","titles":["搭建k8s集群","使用kubeadm安装"]},"1213":{"title":"拉取镜像","titles":["搭建k8s集群","使用kubeadm安装"]},"1214":{"title":"初始化k8s集群","titles":["搭建k8s集群","使用kubeadm安装"]},"1215":{"title":"work节点加入集群","titles":["搭建k8s集群","使用kubeadm安装"]},"1216":{"title":"token过期处理","titles":["搭建k8s集群","使用kubeadm安装"]},"1217":{"title":"网络组件","titles":["搭建k8s集群"]},"1218":{"title":"集群验证","titles":["搭建k8s集群"]},"1219":{"title":"Dashboard","titles":["搭建k8s集群"]},"1220":{"title":"安装Metrics","titles":["搭建k8s集群","Dashboard"]},"1221":{"title":"安装Dashborad","titles":["搭建k8s集群","Dashboard"]},"1222":{"title":"参考文档","titles":["搭建k8s集群"]},"1223":{"title":"关于我","titles":[]},"1224":{"title":"联系","titles":["关于我"]},"1225":{"title":"贡献","titles":["关于我"]},"1226":{"title":"转载须知","titles":["关于我"]},"1227":{"title":"打赏","titles":["关于我"]},"1228":{"title":"版权","titles":["关于我"]},"1229":{"title":"导航指南","titles":[]},"1230":{"title":"个人技术博客","titles":["导航指南"]},"1231":{"title":"团队技术博客","titles":["导航指南"]},"1232":{"title":"我爸脚受伤了","titles":[]},"1233":{"title":"我也赶上了裁员","titles":[]},"1234":{"title":"四周年纪念","titles":[]},"1235":{"title":"df","titles":["四周年纪念"]},"1236":{"title":"我二🐑了","titles":[]},"1237":{"title":"杂谈","titles":[]}},"dirtCount":0,"index":[["杂谈",{"0":{"1237":1}}],["杂谈等",{"2":{"1223":1}}],["万幸在周日就已经不发烧了",{"2":{"1236":1}}],["万古长空",{"2":{"252":1}}],["女友上周五也阳了",{"2":{"1236":1}}],["女友下班后帮我测了个抗原检测",{"2":{"1236":1}}],["女朋友",{"2":{"960":1}}],["床上的我如蒸笼乳猪无法静心养病",{"2":{"1236":1}}],["竟飙到惊人的38°c",{"2":{"1236":1}}],["竟然只有40",{"2":{"22":1}}],["身体逐渐乏力",{"2":{"1236":1}}],["身份验证的第三方系统进行身份验证",{"2":{"1121":1}}],["身份认证",{"0":{"346":1},"1":{"347":1,"348":1}}],["声音也感觉变了",{"2":{"1236":1}}],["声明了变量",{"2":{"588":2}}],["地铁里空调风狠狠地向我扑来",{"2":{"1236":1}}],["地址改为自己",{"2":{"1102":1}}],["地址范围是从",{"2":{"1085":1}}],["地址与宿主机和其他容器隔离",{"2":{"1085":1}}],["地址段",{"2":{"713":1}}],["地址段的访问",{"2":{"713":1}}],["地址或",{"2":{"713":1,"1195":1}}],["地址解析协议",{"2":{"295":1}}],["地址",{"2":{"128":1,"213":2,"220":1,"221":1,"634":1,"710":1,"1085":2,"1086":2,"1087":4,"1121":1,"1159":1}}],["地址不同不会相等",{"2":{"48":1,"554":1}}],["吃完早餐喝了点感冒灵就去上班了",{"2":{"1236":1}}],["人生很长久不只有工作",{"2":{"1233":1}}],["江湖再见",{"2":{"1233":1}}],["聊了公司以后的方向",{"2":{"1233":1}}],["裁员会变得很常见",{"2":{"1233":1}}],["裁员是没办法",{"2":{"1233":1}}],["裁剪",{"0":{"288":1},"2":{"718":1}}],["据说整个运营团队都被裁掉了",{"2":{"1233":1}}],["据内部消息来自股东的压力为实现收支平衡不得已才裁员的",{"2":{"1233":1}}],["据此修改",{"2":{"110":1}}],["果不其然最后参加会议的人都要被裁掉",{"2":{"1233":1}}],["果然是这样",{"2":{"583":1}}],["台湾等几个部门加起来有几十个人吧",{"2":{"1233":1}}],["香港",{"2":{"1233":1}}],["趁家人还年轻一定要好好陪陪家人",{"2":{"1232":1}}],["趁热打铁来看看vue对其真正的实现过程",{"2":{"951":1}}],["见面的日子也越来越少",{"2":{"1232":1}}],["亲朋好友",{"2":{"1232":1}}],["谢谢",{"2":{"1232":1}}],["顿时心里也猜到了有不祥的事情要发生",{"2":{"1233":1}}],["顿时也差点哭出来",{"2":{"1232":1}}],["顿时懵逼",{"2":{"408":1}}],["哎",{"2":{"1232":1}}],["脑子里总在想我爸以后不会要做轮椅或者没法正常走路吧",{"2":{"1232":1}}],["医生说等脚稍微消肿了就可以做手术了",{"2":{"1232":1}}],["医生说是脚踝骨折",{"2":{"1232":1}}],["她在那里照顾就可以了",{"2":{"1232":1}}],["精神紧绷却又无济于事",{"2":{"1232":1}}],["精确查找",{"2":{"138":1,"887":1}}],["坐在我旁边的ui也看我的屏幕",{"2":{"1233":1}}],["坐不住",{"2":{"1232":1}}],["坐标系转换",{"0":{"286":1}}],["迫切想知道受伤严重程度",{"2":{"1232":1}}],["怎么回事啊",{"2":{"1232":1}}],["心想大丈夫决不能哭",{"2":{"1232":1}}],["心想如果自己有个属于自己的技术博客该是多香呢",{"2":{"123":1}}],["心情无比沉痛",{"2":{"1232":1}}],["癸卯年七月初三",{"2":{"1232":1}}],["评论写下你的信息",{"2":{"1230":1}}],["评估框架的学习曲线和可用的学习资源",{"2":{"786":1}}],["评估打包工具的性能和打包速度",{"2":{"784":1}}],["署名",{"2":{"1228":1}}],["鼓励作者不断分享技术文章",{"2":{"1227":1}}],["金额不限",{"2":{"1227":1}}],["贡献",{"0":{"1225":1}}],["博客整体结构清晰",{"2":{"1223":1}}],["博客中也介绍了关于私有仓库的搭建",{"2":{"1013":1}}],["偶尔也会写生活文章发发牢骚😆",{"2":{"1223":1}}],["偶尔也会发发相关的文章",{"2":{"1223":1}}],["旧博客数据正在迁移到当前博客",{"2":{"1223":1}}],["旧的镜像",{"2":{"1002":1}}],["决定转换成用静态博客来部署",{"2":{"1223":1}}],["欢迎补充",{"2":{"1231":1}}],["欢迎交流",{"2":{"1223":1}}],["欢迎每个细心的读者随时提供issue或直接在文章下面留言",{"2":{"271":1}}],["备份",{"2":{"1209":1}}],["备忘录",{"2":{"210":1,"760":1}}],["备忘录模式",{"0":{"209":1,"759":1}}],["甚至导致节点崩溃",{"2":{"1203":1}}],["甚至还可以是其它后面要学到的查询方式",{"2":{"87":1}}],["永久关闭防火墙",{"2":{"1201":1}}],["永久开启",{"2":{"381":1}}],["熟悉linux命令",{"2":{"1194":1}}],["仍然可以参考文章指导",{"2":{"1194":1}}],["仍然推荐语义明确",{"2":{"1099":1}}],["附加您自己的唯一范围到您的包名称",{"2":{"1186":1}}],["阅读要求",{"2":{"1194":1}}],["阅读此篇",{"2":{"1181":1}}],["阅前提示",{"2":{"271":1}}],["阿里云",{"2":{"1178":1}}],["​\\t\\t其实gitlab的初始密码就存储在",{"2":{"1174":1}}],["顶级workflow关键字适用于整个管道",{"2":{"1137":1}}],["顶部信息区域",{"2":{"54":1}}],["克隆仓库",{"2":{"1208":1}}],["克隆",{"2":{"1121":1}}],["界面中显示的项目描述",{"2":{"1121":1}}],["界面中显示的人类可读的项目名称",{"2":{"1121":1}}],["界面会引导你去创建第一个测试用例",{"2":{"877":1}}],["始终是",{"2":{"1121":1}}],["站点的",{"2":{"1121":1}}],["站点隔离",{"0":{"278":1}}],["托管",{"2":{"1121":1}}],["阶段时的作业状态",{"2":{"1121":1}}],["阶段的基础镜像",{"2":{"1057":1}}],["令牌包含前缀",{"2":{"1121":1}}],["令牌就有效",{"2":{"1121":1}}],["令牌",{"2":{"1121":1}}],["销毁",{"2":{"1121":1}}],["跟踪",{"2":{"1121":1}}],["跟踪彼此的更改",{"2":{"811":1}}],["尾随的",{"2":{"1121":1}}],["尾随",{"2":{"1121":1}}],["临时卷的优点是方便快捷",{"2":{"1111":1}}],["临时卷是一种轻量级的数据卷类型",{"2":{"1111":1}}],["临时卷",{"2":{"1111":1}}],["卷",{"2":{"1115":1}}],["卷的创建指的是命名卷的创建",{"2":{"1113":1}}],["卷的使用",{"0":{"1112":1},"1":{"1113":1,"1114":1,"1115":1,"1116":1}}],["卷的类型",{"0":{"1111":1}}],["卷1",{"2":{"306":1,"314":1,"373":1,"396":1}}],["持久化存储数据",{"2":{"1110":1}}],["持久连接",{"2":{"321":1,"322":1}}],["淘宝仓库",{"2":{"1104":1}}],["权限等等",{"2":{"1116":1}}],["权限认证",{"0":{"1101":1}}],["权限配置更加友好",{"2":{"1039":1}}],["角色权限等操作都在设置面板里配置",{"2":{"1096":1}}],["授权",{"2":{"1094":1}}],["尝试分别使用ip和容器名的方式ping对方",{"2":{"1090":1}}],["宿主机",{"2":{"1088":1}}],["宿主机的",{"2":{"1062":1}}],["科大",{"2":{"1083":1}}],["国内docker",{"2":{"1083":1}}],["国际化已经成了现在项目必不可少的功能",{"2":{"672":1}}],["国际化",{"0":{"672":1},"1":{"673":1,"674":1,"675":1,"676":1}}],["腾讯云",{"2":{"1178":1}}],["腾讯",{"2":{"1083":1}}],["腾讯bem文档",{"2":{"850":1}}],["四周年纪念",{"0":{"1234":1},"1":{"1235":1}}],["四",{"2":{"1082":1}}],["四次挥手",{"0":{"382":1,"457":1}}],["●",{"2":{"1082":1}}],["迁移困难",{"2":{"1079":1}}],["冗余步骤多",{"2":{"1079":1}}],["层因为我也不知道是啥",{"2":{"1078":1}}],["层层向上每一层为上一层提供服务",{"2":{"309":1}}],["产品等",{"2":{"1233":1}}],["产物为dist目录",{"2":{"1070":1}}],["产生不正常的消耗",{"2":{"381":1}}],["体积会变大好多",{"2":{"1070":1}}],["禁用swap",{"0":{"1203":1}}],["禁用selinux",{"0":{"1202":1}}],["禁用交换分区",{"2":{"1195":1}}],["禁用构建缓存",{"2":{"1069":1}}],["禁止使用variables变量",{"2":{"1148":1}}],["禁止使用default变量",{"2":{"1148":1}}],["禁止使用缓存进行构建",{"2":{"1028":1}}],["禁止重发",{"2":{"1098":1}}],["禁止健康检查",{"2":{"1066":1}}],["禁止相同内容",{"2":{"778":1}}],["禁止ip",{"2":{"713":1}}],["禁止指定ip",{"2":{"713":1}}],["禁止访问",{"2":{"520":1}}],["禁止客户端的",{"2":{"350":1}}],["低版本可能会报错",{"2":{"1063":1}}],["低内存消耗以及高稳定性的特点",{"2":{"705":1}}],["绝对路径",{"2":{"1059":1}}],["易维护",{"2":{"1051":1}}],["易于理解和修改",{"2":{"705":1}}],["暴露gitlab的http",{"2":{"1172":1}}],["暴露端口80",{"2":{"1051":1}}],["暴露当前模块中的部分内容",{"2":{"604":1}}],["拉取镜像的用户名",{"2":{"1121":1}}],["拉取镜像的密码",{"2":{"1121":1}}],["拉取镜像的直接群组镜像前缀",{"2":{"1121":1}}],["拉取镜像的顶级群组镜像前缀",{"2":{"1121":1}}],["拉取镜像",{"0":{"1213":1},"2":{"1039":1}}],["拉取最新的基础镜像",{"2":{"1028":1}}],["找一个镜像",{"2":{"1039":1}}],["找到",{"2":{"1202":1}}],["找到selinux=enforcing",{"2":{"1202":1}}],["找到描述文件",{"2":{"439":1}}],["找到和电脑连接相同的wifi",{"2":{"438":1}}],["找到vue接下来就可以对其进行下一步的分析了",{"2":{"239":1}}],["凭证",{"2":{"1014":1}}],["认证",{"0":{"1014":1}}],["认识webassembly",{"2":{"980":1}}],["搭建k8s集群",{"0":{"1194":1},"1":{"1195":1,"1196":1,"1197":1,"1198":1,"1199":1,"1200":1,"1201":1,"1202":1,"1203":1,"1204":1,"1205":1,"1206":1,"1207":1,"1208":1,"1209":1,"1210":1,"1211":1,"1212":1,"1213":1,"1214":1,"1215":1,"1216":1,"1217":1,"1218":1,"1219":1,"1220":1,"1221":1,"1222":1}}],["搭建docker私有仓库也是工作中会遇到的",{"2":{"1036":1}}],["搭建docker私有仓库",{"0":{"1036":1},"1":{"1037":1,"1038":1,"1039":1,"1040":1,"1041":1,"1042":1,"1043":1,"1044":1,"1045":1,"1046":1,"1047":1},"2":{"1013":1}}],["搭建web服务",{"2":{"879":1}}],["隔开",{"2":{"1012":2}}],["毕竟已经停止的容器一般倒不是不需要的",{"2":{"1009":1}}],["映射宿主机端口",{"2":{"1004":1}}],["映射sourcemap",{"2":{"406":1}}],["虚悬镜像可能是由于以下原因导致的",{"2":{"1002":1}}],["虚悬镜像",{"0":{"1002":1},"2":{"1002":1}}],["虚悬镜像看以下部分",{"2":{"1000":1}}],["虚拟机执行器",{"0":{"1164":1}}],["虚拟滚动",{"0":{"780":1,"781":1}}],["虚拟ip",{"2":{"728":1}}],["虚拟主机",{"2":{"706":1,"709":1}}],["虚拟主机等",{"2":{"322":1}}],["虚拟网",{"2":{"453":1}}],["筛选镜像",{"2":{"998":1}}],["集群验证",{"0":{"1218":1}}],["集群中的所有机器的网络彼此均能相互连接",{"2":{"1195":1}}],["集群",{"2":{"1167":2,"1217":1}}],["集群时才可用",{"2":{"1121":1}}],["集群里同一个服务里的所有容器使用自定义网络时",{"2":{"1087":1}}],["集群由一个管理节点和多个工作节点组成",{"2":{"993":1,"1080":1}}],["集群模式",{"2":{"993":1}}],["集成eslint",{"0":{"840":1}}],["集成commitlint",{"0":{"806":1}}],["集成lint",{"0":{"805":1}}],["集成了",{"2":{"785":1}}],["集成终端",{"0":{"166":1}}],["架构",{"2":{"1121":1}}],["架构分为客户端",{"2":{"993":1,"1080":1}}],["架构能力和部署能力",{"2":{"690":1}}],["仓库中也允许自己编译代码最终生成cri",{"2":{"1208":1}}],["仓库中使用的语言的逗号分隔的小写列表",{"2":{"1121":1}}],["仓库里会发行很多不同版本",{"2":{"1208":1}}],["仓库的",{"2":{"1121":1}}],["仓库的tag表示镜像的版本",{"2":{"1011":1}}],["仓库克隆到的完整路径",{"2":{"1121":1}}],["仓库进行连接访问配置",{"2":{"1042":1}}],["仓库认证是一种基于用户名和密码的身份验证机制",{"2":{"1014":1}}],["仓库地址指的是",{"2":{"1012":1}}],["仓库地址",{"2":{"1012":1,"1014":1,"1102":1}}],["仓库",{"0":{"1011":1},"1":{"1012":1,"1013":1,"1014":1},"2":{"992":1,"995":1,"1081":1}}],["镜像里",{"2":{"1165":1}}],["镜像拉取策略",{"2":{"1159":1}}],["镜像构建过程的技术",{"2":{"1070":1}}],["镜像构建",{"0":{"1069":1}}],["镜像时",{"2":{"1068":1}}],["镜像中包含",{"2":{"1065":1}}],["镜像作为基础镜像",{"2":{"1065":1}}],["镜像是分层构建的",{"2":{"1049":1}}],["镜像是静态的定义",{"2":{"995":1,"1081":1}}],["镜像可以指定第三方的",{"2":{"1021":1}}],["镜像仓库",{"2":{"1013":1}}],["镜像仓库的地址",{"2":{"1012":1}}],["镜像标签是指镜像的版本号或标识符",{"2":{"1012":1}}],["镜像的重要工具",{"2":{"1077":1}}],["镜像的构建是在docker",{"2":{"1071":1}}],["镜像的示例",{"2":{"1068":1}}],["镜像的名称",{"2":{"1012":1,"1121":1}}],["镜像的管理和分发",{"2":{"1011":1}}],["镜像的服务器端应用程序",{"2":{"1011":1}}],["镜像的最底层",{"2":{"997":1}}],["镜像推送指将本地的镜像推送到远程仓库",{"2":{"999":1}}],["镜像名及标签",{"2":{"1069":1}}],["镜像名称是指",{"2":{"1012":1}}],["镜像名称和镜像标签",{"2":{"1012":1}}],["镜像名称",{"2":{"1006":1}}],["镜像名",{"2":{"998":1}}],["镜像id",{"2":{"998":1}}],["镜像层",{"0":{"997":1}}],["镜像最重要的概念就是镜像层",{"2":{"996":1}}],["镜像和容器的关系",{"2":{"995":1,"1081":1}}],["镜像就是容器",{"2":{"995":1,"1081":1}}],["镜像",{"0":{"996":1},"1":{"997":1,"998":1,"999":1,"1000":1,"1001":1,"1002":1},"2":{"992":1,"995":1,"996":2,"1010":3,"1011":1,"1012":4,"1013":1,"1015":1,"1068":1,"1069":1,"1081":1}}],["镜像或",{"2":{"217":1}}],["水流花开",{"2":{"991":1}}],["核心及以上",{"2":{"1195":1}}],["核心组件",{"0":{"995":1}}],["核心模块",{"0":{"986":1}}],["核心api",{"0":{"958":1}}],["浅谈webassembly历史",{"2":{"980":1}}],["浅拷贝的实现方式",{"0":{"27":1},"1":{"28":1,"29":1,"30":1}}],["浅拷贝得到",{"2":{"26":1}}],["浅拷贝",{"2":{"26":2}}],["浅拷贝是按位拷贝对象",{"2":{"26":1}}],["浅拷贝只复制指向某个对象的指针",{"2":{"25":1}}],["浅拷贝与深拷贝",{"0":{"25":1}}],["朋友",{"2":{"960":1}}],["朋友`",{"2":{"951":2}}],["钟馗",{"2":{"960":1}}],["鲁班",{"2":{"960":2}}],["鲁班七号",{"2":{"955":1}}],["爱好",{"2":{"959":1,"960":1}}],["篮球",{"2":{"959":1,"960":1}}],["副作用函数用来修改",{"2":{"959":1}}],["细心的读者应该会发现",{"2":{"955":1}}],["细心的同学会发现",{"2":{"951":1}}],["改作业将会在用户界面中显示橙色警告",{"2":{"1130":1}}],["改为",{"2":{"958":1}}],["改写原型方法",{"2":{"955":1}}],["改写后就可以实现拦截了",{"2":{"955":1}}],["改变friends",{"2":{"955":1}}],["改变了当前对象什么都不会发生",{"2":{"950":1}}],["改变当前activeeffect为",{"2":{"934":1}}],["改变prototype",{"2":{"579":1,"581":1}}],["改变原型对象",{"2":{"571":1}}],["改变b的值",{"2":{"33":1}}],["改变不会使原数据一同改变",{"2":{"26":3}}],["改变会使原数据一同改变",{"2":{"26":3}}],["揭开组件的渲染watcher真面目",{"2":{"954":1}}],["维护wather栈结构",{"2":{"954":1}}],["维护和管理代码更加方便",{"2":{"811":1}}],["维护和扩展",{"2":{"308":1}}],["派发更新",{"2":{"954":1,"959":1}}],["观察",{"2":{"955":1}}],["观察者",{"0":{"195":1,"745":1},"2":{"210":1,"760":1}}],["观测观测组件data",{"2":{"954":1}}],["挂载gitlab的相关配置到主机",{"2":{"1172":1}}],["挂载目录",{"2":{"1159":1}}],["挂载了数据卷可以进行本地查看",{"2":{"1095":1}}],["挂载到操作系统上",{"2":{"997":1}}],["挂载",{"0":{"1116":1},"2":{"953":1}}],["挂载各种组件",{"2":{"54":2}}],["官方registry镜像地址点这里查看",{"2":{"1037":1}}],["官方registry搭建",{"0":{"1037":1},"1":{"1038":1,"1039":1}}],["官方镜像",{"2":{"1018":1}}],["官方不推荐",{"2":{"1014":1}}],["官方的",{"2":{"1012":2}}],["官方的公开仓库地址为",{"2":{"1012":1}}],["官方建议使用docker",{"2":{"1005":1}}],["官方实现",{"0":{"952":1,"964":1},"1":{"953":1,"954":1}}],["官方文档也没有给出这个选项",{"2":{"932":1}}],["官方文档配置戳👉这里",{"2":{"718":1}}],["官方文档以及大量的文章后才对它有了深刻认识",{"2":{"523":1}}],["官方文档",{"2":{"404":1,"878":1,"879":1,"880":1,"1170":1}}],["官方文档获取更多",{"2":{"176":1}}],["校长",{"2":{"951":1}}],["校验",{"0":{"632":1}}],["校验规则清晰明了",{"2":{"197":1,"747":1}}],["校验规则存储",{"2":{"197":1,"747":1}}],["校验和",{"2":{"83":1,"375":1,"376":1}}],["拦截的地方",{"2":{"964":1}}],["拦截对象的get",{"2":{"959":1}}],["拦截对象的每个属性都会有一个闭包dep",{"2":{"954":1}}],["拦截对象入口",{"2":{"951":1}}],["拦截data进行改造",{"2":{"953":1}}],["拦截器等",{"2":{"609":1}}],["拦截器等等",{"2":{"54":2,"668":1}}],["拦截器",{"2":{"601":1,"670":1}}],["步骤",{"2":{"951":1}}],["啃源码也会非常痛苦",{"2":{"948":1}}],["千万不要开始就从头到尾分析",{"2":{"948":1}}],["尤其对于面试八股文是一把",{"2":{"948":1}}],["尤其是在项目需求变更或者重构时随心所欲的代码可能让团队头疼简直比推倒重写还难",{"2":{"823":1}}],["尤其是在大型项目中",{"2":{"795":1}}],["尤其是对于很大的图片",{"2":{"718":1}}],["情况",{"2":{"944":1}}],["侦听函数在vue中就是我们常用的watch又称user",{"2":{"935":1}}],["侦听函数",{"0":{"935":1},"1":{"936":1,"937":1,"938":1,"939":1,"940":1,"941":1,"942":1,"943":1,"944":1,"945":1},"2":{"948":1}}],["岁`",{"2":{"929":2,"930":1,"931":1,"932":1}}],["今年",{"2":{"929":2,"930":1,"931":1,"932":1}}],["今天打开控制台竟然忘记nvm的常用命令",{"2":{"92":1}}],["今天小编就介绍下mysql的基本操作",{"2":{"67":1}}],["里氏替换",{"2":{"919":1}}],["里面会定义多个作业",{"2":{"1118":1}}],["里面包含了nginx和nodejs容器",{"2":{"1034":1}}],["里面包含了commit的钩子",{"2":{"804":1}}],["里面包含了不同类型转换到原始值或其它基础类型的规则",{"2":{"41":1,"547":1}}],["里面是什么内容不能直接读取",{"2":{"480":1}}],["里面是每个同学课程1的分数和课程2的分数",{"2":{"88":1}}],["里面的options功能最重要",{"2":{"430":1}}],["里面有我们打包的图片等其他静态资源",{"2":{"181":1}}],["里面有姓名",{"2":{"88":1}}],["鸭子辨形",{"0":{"919":1}}],["泛型",{"0":{"917":1}}],["守卫对象类型",{"2":{"915":1}}],["守卫基本类型",{"2":{"915":1}}],["索引类型keyof",{"0":{"913":1}}],["索引作为每个切片文件",{"2":{"769":1}}],["联系",{"0":{"1224":1}}],["联合文件系统",{"2":{"997":1}}],["联合类型",{"2":{"915":1}}],["联合类型和交叉类型",{"0":{"912":1}}],["联表的方式可以是内联",{"2":{"88":1}}],["联表查询综合应用",{"0":{"87":1}}],["联表查询",{"0":{"86":1}}],["屏蔽掉cypress测试用例",{"2":{"882":1}}],["退出登录",{"2":{"1014":1}}],["退出登录等",{"2":{"881":1}}],["退出后删除容器",{"2":{"1004":1}}],["退出全屏",{"2":{"164":1}}],["登录并发布",{"2":{"1102":1}}],["登录hosted",{"2":{"1046":1}}],["登录docker",{"2":{"1045":1}}],["登录仓库sh➜",{"2":{"1045":1}}],["登录仓库",{"0":{"1045":1}}],["登录密码",{"2":{"1014":1}}],["登录的用户名",{"2":{"1014":1}}],["登录",{"2":{"999":1}}],["登录用户等",{"2":{"881":1}}],["登录request",{"2":{"230":1}}],["钩子函数",{"0":{"881":1}}],["✓",{"2":{"860":1,"864":1,"874":1,"875":1}}],["差不多一样的道理",{"2":{"858":1}}],["✔",{"2":{"857":6}}],["✔️",{"2":{"251":1}}],["丰富的功能和强大的断言库",{"2":{"855":1}}],["丰富的语言支持",{"2":{"785":1}}],["涉及用户界面",{"2":{"854":1}}],["涉及到兼容性",{"2":{"200":1,"750":1}}],["颜色格式",{"2":{"842":1}}],["颜色选择表单",{"2":{"208":1,"758":1}}],["检查防火墙",{"2":{"1201":1}}],["检查能否互通",{"2":{"1200":1}}],["检查间隔",{"2":{"1159":1}}],["检查超时时间设置为10s",{"2":{"1066":1}}],["检查一下自己账户的权限",{"2":{"1047":1}}],["检查",{"2":{"842":1}}],["检测节点状态的心跳间隔",{"2":{"728":1}}],["检测nginx健康状态脚本",{"2":{"728":1}}],["检测并输出配置文件",{"2":{"708":1}}],["检测window滚动",{"2":{"247":1}}],["顾需结合eslint进行错误提示",{"2":{"840":1}}],["括号等",{"2":{"837":1}}],["末尾插入新行",{"2":{"836":1}}],["行尾逗号",{"2":{"839":1}}],["行尾插入空格等",{"2":{"836":1}}],["行为型模式",{"2":{"210":1,"760":1}}],["风格问题并不是属于错误❌",{"2":{"835":1}}],["风格点歌",{"2":{"53":1,"54":1}}],["偏向程序的运行时错误",{"2":{"835":1}}],["偏好设置",{"2":{"347":1,"413":1}}],["久而久之可能就会变得难以维护",{"2":{"834":1}}],["覆盖率",{"0":{"872":1},"1":{"873":1,"874":1}}],["覆盖掉全局的双引号规则",{"2":{"830":1}}],["覆盖特定规则",{"2":{"827":1}}],["环境准备",{"0":{"1197":1},"1":{"1198":1,"1199":1,"1200":1,"1201":1,"1202":1,"1203":1,"1204":1,"1205":1,"1206":1}}],["环境是基于arm架构centos7",{"2":{"1194":1}}],["环境名称的简化版本",{"2":{"1121":1}}],["环境变量等",{"2":{"1020":1}}],["环境变量等等",{"2":{"878":1}}],["环境变量",{"2":{"996":1}}],["环境变量配置好后",{"2":{"69":1}}],["环境中",{"2":{"855":1}}],["环境",{"2":{"827":1}}],["良好的代码质量可以提供良好的结构和设计",{"2":{"824":1}}],["良好的代码质量可以提高代码的可读性和可维护性",{"2":{"824":1}}],["良好的代码质量可以通过静态类型检查",{"2":{"824":1}}],["磁盘占用空间会变得越来越大",{"2":{"813":1}}],["促进团队合作和沟通",{"2":{"811":1}}],["促进了代码的共享和复用",{"2":{"811":1}}],["号外",{"2":{"806":1}}],["觉得使用commitlint一个结合原生的git提交就足够了",{"2":{"802":1}}],["✖",{"2":{"797":5}}],["✖️",{"2":{"251":1}}],["⧗",{"2":{"797":2}}],["培养一致的协作风格",{"2":{"794":1}}],["遵循一致的提交信息规范可以使生成版本日志变得更加容易",{"2":{"794":1}}],["遵从配置由简到繁",{"2":{"784":1}}],["团队技术博客",{"0":{"1231":1}}],["团队技术的选型定要贴合团队自身的技术偏向和使用成本才是正确之道",{"2":{"786":1}}],["团队协作和知识共享",{"2":{"824":1}}],["团队成员遵循相同的提交信息格式",{"2":{"794":1}}],["缺失的分号等",{"2":{"789":1}}],["缺点",{"2":{"557":1,"558":1,"577":1,"578":1,"579":1,"580":1,"581":1,"965":1}}],["缺点是需要知道子元素的宽高",{"2":{"12":1,"13":1,"14":1}}],["页眉的格式指定为提交类型",{"2":{"788":1}}],["页面包括一个输入框和一个按钮",{"2":{"1034":1}}],["页面也没必要渲染",{"2":{"954":1}}],["页面加载时间",{"2":{"778":1}}],["页面中的请求",{"2":{"1034":1}}],["页面中请求后端服务",{"2":{"1034":1}}],["页面中",{"2":{"762":1}}],["页面字节数从",{"2":{"717":1}}],["页面标题",{"2":{"688":1}}],["页面不见了",{"2":{"638":1}}],["页面长时间等待等缺点",{"2":{"524":1}}],["页面上添加视频播放器",{"2":{"520":1}}],["页面种下登录信息cookie",{"2":{"352":1}}],["页面渲染时进行字符转义",{"2":{"350":1}}],["页面渲染过程",{"0":{"279":1}}],["页面在服务端渲染时",{"2":{"350":1}}],["页面文件夹",{"2":{"54":2}}],["约定式提交的作用主要体现在以下几个方面",{"2":{"794":1}}],["约定式提交规范是一种基于提交信息的轻量级约定",{"2":{"788":1}}],["约定式提交",{"0":{"788":1},"1":{"789":1,"790":1,"791":1,"792":1,"793":1,"794":1},"2":{"807":1}}],["约42亿",{"2":{"366":1}}],["沉重",{"2":{"786":1}}],["聪明的人不做选择",{"2":{"785":1}}],["社区成员积极参与插件开发",{"2":{"785":1}}],["社区支持和活跃度",{"2":{"785":1}}],["社区活跃度和更新频率",{"2":{"784":1}}],["轻量且快速",{"2":{"785":1}}],["智能提示",{"2":{"785":1}}],["笑仅一个编辑器何须如此长篇大论",{"2":{"785":1}}],["众说纷纷",{"2":{"785":1}}],["众所周知vue2是通过",{"2":{"949":1}}],["众所周知js是个弱类型动态语言",{"2":{"825":1}}],["众所周知js是基于原型的编程语言",{"2":{"570":1}}],["众所周知js是一个单线程非阻塞语言",{"2":{"524":1}}],["众所周知",{"2":{"182":1}}],["专注于代码优化和资源体积的最小化",{"2":{"784":1}}],["富媒体测试",{"2":{"779":1}}],["富媒体",{"2":{"778":1}}],["巧用webwoker小帮手实现多线程计算",{"2":{"776":1}}],["巧妙的借用父类实例和原型属性",{"2":{"582":1}}],["长期访问镜像库",{"2":{"1121":1}}],["长描述",{"2":{"800":1}}],["长时间的js计算会导致页面卡顿或者卡死现象",{"2":{"773":1}}],["长度为10",{"2":{"483":1}}],["长度为2个字节16位",{"2":{"376":1}}],["停止服务的容器",{"2":{"1031":1}}],["停止服务的超时时间",{"2":{"1030":1}}],["停止等等",{"2":{"1016":1}}],["停止",{"0":{"1008":1},"2":{"1003":1,"1017":1}}],["停止后再上传同一个文件即可",{"2":{"772":1}}],["停止抓包",{"2":{"452":1}}],["成长",{"2":{"1237":1}}],["成本由低到高及性能由低到高的策略即可",{"2":{"784":1}}],["成功上传",{"2":{"772":1}}],["成对应的字节码",{"2":{"525":1}}],["造成系统无法启动的问题",{"2":{"1202":1}}],["造成卡顿现象",{"2":{"786":1}}],["造成不必要的重传和资源浪费",{"2":{"772":1}}],["造成数据泄露等安全问题",{"2":{"303":1}}],["切片进度",{"2":{"775":1}}],["切片优化",{"0":{"773":1}}],["切片传输正好可以满足以上的条件",{"2":{"772":1}}],["切片合并",{"0":{"770":1}}],["切片上传",{"2":{"769":1}}],["切片上传与合并",{"0":{"769":1},"1":{"770":1}}],["切换成hosted暴露的http",{"2":{"1046":1}}],["切换编辑器分屏方式",{"2":{"164":1}}],["切换到下一分组",{"2":{"162":1}}],["切换到上一分组",{"2":{"162":1}}],["切换到第三分组",{"2":{"162":1}}],["切换到第二分组",{"2":{"162":1}}],["切换到第一分组",{"2":{"162":1}}],["切换焦点",{"2":{"161":1,"164":1}}],["切换size",{"2":{"63":1}}],["收拾好装备就打卡下班了",{"2":{"1236":1}}],["收集依赖",{"2":{"954":1,"959":2,"960":1}}],["收集watcher",{"2":{"954":1}}],["收集当前正在执行的函数",{"2":{"951":1}}],["收集的目标是全局唯一正在运行的函数",{"2":{"959":1}}],["收集的就是",{"2":{"954":1}}],["收集的对象范围",{"2":{"950":1}}],["收集的切片总大小",{"2":{"768":1}}],["收集所有的切片",{"2":{"768":1}}],["收不到预期的效果",{"2":{"221":1}}],["效率很低",{"2":{"767":1}}],["效果一样",{"2":{"1099":1}}],["效果",{"2":{"111":1}}],["缓慢崩溃问题",{"2":{"766":1}}],["缓存策略",{"0":{"763":1}}],["缓存优化",{"2":{"762":1}}],["缓存锁定失败时",{"2":{"721":1}}],["缓存控制",{"2":{"720":1}}],["缓存必须从原始服务器重新获取资源",{"2":{"720":1}}],["缓存的有效期为",{"2":{"721":1}}],["缓存的类型等",{"2":{"720":1}}],["缓存的位置",{"2":{"720":1}}],["缓存等",{"2":{"709":3,"710":1}}],["缓存和压缩",{"2":{"706":1}}],["缓存器应该不会改变",{"2":{"248":1}}],["缓存组",{"2":{"187":1,"190":1}}],["缓存简单的来说就是把需要的东西储存到指定的位置",{"2":{"167":1}}],["缓存js",{"2":{"132":1}}],["缓存图片",{"2":{"132":1}}],["缓存又分为",{"2":{"132":1}}],["缓存",{"0":{"132":1,"719":1},"1":{"133":1,"720":1,"721":1},"2":{"132":1,"187":1,"190":1,"248":2}}],["缓存当前对象",{"2":{"33":1}}],["浪费宽带浪费时间",{"2":{"766":1}}],["速度慢",{"2":{"766":1}}],["丢包几率很低效率高",{"2":{"767":1}}],["丢包",{"2":{"764":1,"766":1}}],["压测",{"0":{"739":1}}],["压缩时间越长",{"2":{"717":1}}],["压缩级别最低",{"2":{"717":1}}],["压缩级别是",{"2":{"717":1}}],["压缩比",{"2":{"717":1}}],["压缩的浏览器",{"2":{"717":1}}],["压缩的",{"2":{"717":1}}],["压缩或解压缩数据或以其他的方式从一种数据转换成另一种数据",{"2":{"517":1}}],["压缩啥的",{"2":{"512":1}}],["压缩等等",{"2":{"430":1}}],["压缩css",{"2":{"187":1}}],["压缩js",{"2":{"187":1}}],["压缩代码",{"2":{"187":1}}],["压缩",{"2":{"176":1,"187":1,"190":1,"717":2,"784":1}}],["递归创建组件时也会不断地进行依赖的收集",{"2":{"951":1}}],["递归方法实现深度克隆原理",{"2":{"33":1}}],["递",{"2":{"729":1}}],["器",{"2":{"729":1}}],["览",{"2":{"729":1}}],["浏",{"2":{"729":1}}],["浏览器进行访问",{"2":{"1172":1}}],["浏览器进程解析地址",{"2":{"276":1}}],["浏览器输入ip",{"2":{"1073":1,"1074":1}}],["浏览器提供了",{"2":{"773":1}}],["浏览器一次性发送这么多请求会造成浏览器卡顿或崩溃",{"2":{"771":1}}],["浏览器访问vip地址192",{"2":{"728":1}}],["浏览器就会判断已经允许跨域",{"2":{"692":1}}],["浏览器根据相应的后access",{"2":{"692":1}}],["浏览器端为提高资源请求的安全性提出了同源策略机制",{"2":{"691":1}}],["浏览器打印顺序",{"2":{"538":1}}],["浏览器打开",{"2":{"56":1}}],["浏览器中的异步方法node中也会有",{"2":{"537":1}}],["浏览器中就是window对象",{"2":{"2":1}}],["浏览器可能会更新视图",{"2":{"536":1}}],["浏览器eventloop总结",{"0":{"536":1}}],["浏览器eventloop会有一个或多个macro任务队列",{"2":{"532":1}}],["浏览器的eventloop",{"0":{"528":1},"1":{"529":1,"530":1,"531":1}}],["浏览器插件",{"2":{"526":1}}],["浏览器发送请求时会在头部携带上相关的cookie信息",{"2":{"347":1}}],["浏览器才会发送实际的请求",{"2":{"337":1}}],["浏览器才允许两个页面之间相互访问和交互数据",{"2":{"336":1}}],["浏览器必须先发送一个",{"2":{"337":1}}],["浏览器历史记录",{"2":{"320":1}}],["浏览器内核",{"0":{"277":1}}],["浏览器架构",{"0":{"274":1}}],["浏览器",{"2":{"215":2,"526":1,"556":1}}],["浏览器特别是移动端的浏览器分配的内存并不多",{"2":{"204":1,"754":1}}],["浏览器会显示新的url",{"2":{"715":2}}],["浏览器会根据不同tasksource的优先级可能会被先调度",{"2":{"532":1}}],["浏览器会对页面中的所有请求添加referer头来标识请求来源",{"2":{"353":1}}],["浏览器会直接发送请求",{"2":{"337":1}}],["浏览器会限制同一个域名tcp最大同时连接数",{"2":{"322":1}}],["浏览器会命中缓存",{"2":{"132":1}}],["浏览器会在cpu空闲时主动加载",{"2":{"131":1}}],["浏览器缓存把请求到的服务端资源进行本地储存",{"2":{"168":1}}],["浏览器缓存",{"2":{"132":1,"168":2}}],["浏览器对生成的bfc有一系列的渲染规则",{"2":{"113":1}}],["浏览器兼容性请参阅本文底部内容",{"2":{"2":1}}],["于",{"2":{"729":1}}],["于是我心里的担忧也慢慢放下了",{"2":{"1232":1}}],["于是我妈就在家里坐了一天的车去工作地方照顾我爸去了",{"2":{"1232":1}}],["于是就测了下体温",{"2":{"1236":1}}],["于是就想着出去打工",{"2":{"1232":1}}],["于是就有了这样的实现",{"2":{"9":1}}],["于是会再发一个给客户端",{"2":{"457":1}}],["破折号变为下划线",{"2":{"729":2}}],["宕机后vip会从当前节点剔除并根据优先级绑定到另一节点",{"2":{"728":1}}],["└─1406",{"2":{"1082":1}}],["└─5174",{"2":{"728":1}}],["└──",{"2":{"54":20,"665":2,"676":2,"810":4,"874":2,"1107":4}}],["├─5173",{"2":{"728":1}}],["├─5172",{"2":{"728":1}}],["├──",{"2":{"54":76,"665":17,"676":1,"810":3,"874":12,"878":2,"1107":8}}],["六月的广东骄阳似火",{"2":{"1236":1}}],["六",{"2":{"728":1}}],["啥都不输退出",{"2":{"726":1,"1178":1}}],["啥也不做",{"2":{"494":1}}],["轮询",{"2":{"725":1}}],["逗号",{"2":{"723":1}}],["列出所有镜像",{"2":{"998":1}}],["列出任何breaking",{"2":{"801":1}}],["列表中就会看到刚刚创建的存储单元集合",{"2":{"1097":1}}],["列表",{"2":{"722":1}}],["列选择",{"2":{"158":6}}],["次",{"2":{"721":1}}],["次数超过",{"2":{"715":1}}],["制重新验证缓存",{"2":{"721":1}}],["制表符",{"2":{"139":1,"888":1}}],["天",{"2":{"720":1}}],["天机自定义头部",{"2":{"132":1}}],["走到会议室空气瞬间安静了起来",{"2":{"1233":1}}],["走",{"2":{"718":1}}],["走进前端二进制",{"0":{"478":1},"1":{"479":1,"480":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"488":1,"489":1,"490":1,"491":1,"492":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1,"503":1,"504":1,"505":1,"506":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1}}],["零值将禁用锐化",{"2":{"718":1}}],["零宽连字",{"2":{"462":1}}],["零宽不连字",{"2":{"462":1}}],["零宽空格",{"2":{"462":1}}],["零宽字符",{"2":{"462":1}}],["锐度百分比可以超过100",{"2":{"718":1}}],["透明度的降低会导致质量更好的图像",{"2":{"718":1}}],["较小的值通常意味着图像质量越低",{"2":{"718":1}}],["格式使用yaml文件格式",{"2":{"1118":1}}],["格式的提交时间戳",{"2":{"1121":1}}],["格式的提交作者",{"2":{"1121":1}}],["格式的文件",{"2":{"1018":1}}],["格式的绝对时间",{"2":{"720":1}}],["格式大小写",{"2":{"797":1}}],["格式",{"2":{"718":1,"1121":2,"1187":1}}],["格式化选中内容",{"2":{"160":1}}],["格式化",{"2":{"160":1,"789":1,"842":1}}],["格式化函数",{"2":{"83":1}}],["格式化unix时间戳ts",{"2":{"83":1}}],["格式化form数据",{"2":{"62":1}}],["格式化数据",{"2":{"62":1}}],["格式化日期",{"2":{"54":1,"60":1}}],["旋转图像",{"2":{"718":1}}],["质量等等",{"2":{"718":1}}],["缩短为",{"2":{"1121":2}}],["缩进大小",{"2":{"836":2}}],["缩放图片",{"2":{"718":1}}],["缩放的比例很大",{"2":{"718":1}}],["缩放",{"2":{"718":1}}],["缩小",{"2":{"164":1}}],["识别是否启用",{"2":{"717":1}}],["级别越高压缩率越大",{"2":{"717":1}}],["替代的内容",{"2":{"715":1}}],["替换ens256",{"2":{"728":1}}],["替换为下一个值",{"2":{"160":1}}],["替换为上一个值",{"2":{"160":1}}],["替换为从html构建的新",{"2":{"115":1}}],["替换",{"2":{"159":1}}],["区分大小写",{"2":{"711":1}}],["区别在于",{"2":{"183":1}}],["块",{"2":{"850":1,"881":4}}],["块还可以配置其他的参数",{"2":{"710":1}}],["块都必须包含一个",{"2":{"710":1}}],["块用于配置一个虚拟主机的参数",{"2":{"710":1}}],["块级",{"2":{"588":1}}],["块级作用域和函数作用域说法",{"2":{"588":1}}],["块级格式化上下文",{"2":{"103":1}}],["件引入到主配置文件",{"2":{"709":1}}],["立即执行一次",{"2":{"944":1}}],["立即执行函数",{"2":{"594":1}}],["立即用此location",{"2":{"711":1}}],["立即停止",{"2":{"708":1}}],["降低了部署过程中的错误率",{"2":{"1017":1}}],["降低程序的不稳定性",{"2":{"906":1}}],["降低",{"2":{"778":1}}],["降低时延",{"2":{"767":1}}],["降低服务器负载",{"2":{"706":1}}],["降序",{"2":{"81":1}}],["✗",{"2":{"703":1,"797":3,"800":1,"801":1}}],["掌握node可以提高自己对前端的视野",{"2":{"690":1}}],["掌握这些通常足够了",{"2":{"395":1}}],["明确转换为number",{"2":{"686":1}}],["明星点歌",{"2":{"53":1,"54":1}}],["姓名",{"2":{"686":1}}],["年轻时候考上了大专最后由于某种原因没有去",{"2":{"1232":1}}],["年龄",{"2":{"686":1,"950":1,"951":3,"959":3,"960":1,"963":2}}],["年发布",{"2":{"329":4}}],["枚举",{"0":{"910":1},"2":{"685":1}}],["程序中要有相关的controller",{"2":{"682":1}}],["程序入口",{"0":{"603":1},"2":{"665":1}}],["英文",{"2":{"676":1}}],["限制promise并发数",{"2":{"771":1}}],["限制指定的值",{"2":{"669":1}}],["限制网页内容只能从指定的源加载",{"2":{"350":1}}],["业务代码",{"2":{"665":1}}],["间隔5分钟执行一次",{"2":{"660":1}}],["名为",{"2":{"1207":1}}],["名字需小写",{"2":{"1070":1}}],["名字",{"2":{"660":1,"951":2}}],["名称",{"2":{"347":1,"729":1}}],["周一到周五早上11",{"2":{"660":1}}],["耗时",{"2":{"634":2}}],["必填",{"2":{"801":3}}],["必填且必须是这几个值中的一个",{"2":{"632":1}}],["必须提供一个范围的scope名字",{"2":{"1186":1}}],["必须先启动其所依赖的容器",{"2":{"1023":1}}],["必须调用next",{"2":{"634":1}}],["必须调用next方法",{"2":{"633":1}}],["必须是个正整数",{"2":{"646":1}}],["必须是number",{"2":{"632":1}}],["必须是",{"2":{"222":1}}],["必须包含一个",{"2":{"222":1}}],["命名卷的优点是灵活性大",{"2":{"1111":1}}],["命名卷是",{"2":{"1111":1}}],["命名卷",{"2":{"1111":2}}],["命名规则",{"2":{"831":1}}],["命名不规范",{"2":{"783":1}}],["命名语义化",{"2":{"778":1}}],["命名空间",{"0":{"631":1},"2":{"631":1}}],["命令式",{"0":{"1172":1}}],["命令传递的附加参数",{"2":{"1121":1}}],["命令都没有",{"2":{"1078":1}}],["命令构建",{"2":{"1068":1}}],["命令检查容器中是否能够访问",{"2":{"1066":1}}],["命令行输出等",{"2":{"1066":1}}],["命令行工具提供的创建数据卷的命令",{"2":{"1113":1}}],["命令行工具",{"2":{"993":1,"1080":1}}],["命令将",{"2":{"1010":1}}],["命令导出容器的文件系统为一个",{"2":{"1010":1}}],["命令用于删除已经停止的",{"2":{"1009":1}}],["命令的用户的聊天服务用户",{"2":{"1121":1}}],["命令的源聊天频道",{"2":{"1121":1}}],["命令的语法",{"2":{"1007":1,"1009":1}}],["命令的一些常用选项和参数",{"2":{"1004":1}}],["命令选项",{"2":{"1006":1}}],["命令来保存为一个新的镜像",{"2":{"1003":1}}],["命令查看本地镜像列表时",{"2":{"1002":1}}],["命令",{"0":{"1027":1},"1":{"1028":1,"1029":1,"1030":1,"1031":1,"1032":1,"1033":1},"2":{"210":1,"760":1,"998":1,"1004":1,"1006":1,"1065":1}}],["难以表意协作困难",{"2":{"783":1}}],["难以后续维护或内容表意无法一目了然",{"2":{"783":1}}],["难以统一整体风格",{"2":{"782":1}}],["难以进行单元测试和代码重用",{"2":{"601":1}}],["难免会不满足业务中的使用",{"2":{"619":1}}],["头中的",{"2":{"717":1}}],["头值是否等于route进行判断",{"2":{"648":1}}],["头信息",{"0":{"616":1}}],["头部的时间格式是",{"2":{"720":1}}],["头部的长度173字节",{"2":{"326":1}}],["头部校验和",{"2":{"367":1}}],["头部添加一些字段来告知浏览器",{"2":{"339":1}}],["头部压缩",{"0":{"326":1},"2":{"323":2}}],["头部压缩等",{"2":{"321":1}}],["拿到token后将其写入",{"2":{"1189":1}}],["拿到最新的值",{"2":{"938":1}}],["拿到计算的hash值",{"2":{"773":1}}],["拿到整个query",{"2":{"613":1}}],["拿到整个params",{"2":{"613":1}}],["拿来看下原型图",{"2":{"580":1}}],["框架及核心知识原理",{"2":{"1223":1}}],["框架不但可以使用",{"2":{"977":1}}],["框架",{"2":{"601":1,"662":1}}],["平时我也不怎么戴口罩",{"2":{"1236":1}}],["平时都是早上上班出门前",{"2":{"1232":1}}],["平台的一个核心组件",{"2":{"1011":1}}],["平台的现代化",{"2":{"601":1,"662":1}}],["平均数",{"2":{"83":1}}],["微前端等多种架构",{"2":{"786":1}}],["微前端",{"0":{"598":1}}],["微任务放入微任务队列",{"2":{"536":1}}],["微任务队列清空",{"2":{"532":1}}],["微任务v8会将其放入一个专门的队列",{"2":{"532":1}}],["垃圾回收",{"2":{"595":1}}],["垃圾回收运行时清理掉次数为0",{"2":{"557":1}}],["循环时就是字符串",{"2":{"937":1}}],["循环体中的代码并不会执行",{"2":{"594":1}}],["循环读取数据",{"2":{"516":1}}],["词法环境",{"0":{"590":1}}],["词法分析",{"2":{"254":1}}],["诸如在函数体中定义的变量",{"2":{"589":1}}],["局部",{"2":{"588":1}}],["局域网",{"2":{"365":1}}],["暂时性死区等等",{"2":{"587":1}}],["寄生组合式继承",{"0":{"582":1},"2":{"582":1}}],["寄生式继承是对原型式继承的加强版",{"2":{"581":1}}],["寄生式继承",{"0":{"581":1}}],["空山无人",{"2":{"991":1}}],["空函数",{"2":{"931":1,"932":1}}],["空格",{"2":{"837":1}}],["空对象中并没有属性和方法",{"2":{"581":1}}],["空字符串",{"2":{"139":1,"888":1}}],["父子管道",{"2":{"1144":1}}],["父类只有将所有的属性定义在函数体内才能得到继承",{"2":{"578":1}}],["父类在子类之间共享",{"2":{"577":1}}],["父类是个实例对象",{"2":{"577":1}}],["父元素的高度被撑起来了",{"2":{"112":1}}],["父元素和子元素",{"2":{"12":1}}],["拥有自己的文件系统",{"2":{"1003":1}}],["拥有固定的提交规范格式将会一目了然",{"2":{"787":1}}],["拥有庞大的用户社区",{"2":{"785":1}}],["拥有父类的实例属性和原型方法",{"2":{"580":1}}],["拥有构造函数prototype对象中的属性和方法",{"2":{"577":1}}],["拥塞问题",{"2":{"764":1}}],["拥塞窗口增加1",{"2":{"394":1}}],["拥塞避免算法外",{"2":{"394":1}}],["拥塞避免算法当收到1个ack时",{"2":{"394":1}}],["拥塞避免",{"0":{"394":1}}],["拥塞控制等多方面讲述了tcp协议的工作方式和细节",{"2":{"395":1}}],["拥塞控制是一种网络流量控制机制",{"2":{"392":1}}],["拥塞控制动态改变的",{"2":{"387":1}}],["拥塞控制",{"0":{"392":1},"1":{"393":1,"394":1},"2":{"375":1}}],["继承retry",{"2":{"1148":1}}],["继承react插件中推荐的规则集",{"2":{"831":1}}],["继承变量",{"2":{"1148":1}}],["继承其他作业的配置",{"2":{"1143":1}}],["继承官方推荐的",{"2":{"831":1}}],["继承规则",{"2":{"797":1}}],["继承组合式继承就是来实现上面的操作的",{"2":{"582":1}}],["继承操作简单容易理解",{"2":{"579":1}}],["继承对象是个对象的形式",{"2":{"579":1}}],["继承",{"2":{"576":1}}],["继续",{"2":{"165":1}}],["继续执行下一个方法",{"2":{"40":1,"546":1}}],["讲过了",{"2":{"670":1}}],["讲了这么多原型和原型链大家应该已经明白是怎么回事了",{"2":{"575":1}}],["讲完了浏览器的eventloop接下来看看node的eventloop",{"2":{"537":1}}],["读写权限",{"2":{"1116":1}}],["读写锁",{"2":{"559":1}}],["读者自己尝试打断点分析一下即可",{"2":{"964":1}}],["读者只需了解过程是怎么样的",{"2":{"954":1}}],["读者可能会在此产生疑问",{"2":{"587":1}}],["读取当前chunk的大小",{"2":{"770":1}}],["读取所有chunk地址",{"2":{"770":1}}],["读取图片缓冲区大小",{"2":{"718":1}}],["读取完毕",{"2":{"512":1}}],["读取完后的内容",{"2":{"504":1}}],["读取结束",{"2":{"510":1}}],["读取它",{"2":{"508":1}}],["读取数据都是异步的",{"2":{"506":1}}],["读取成功后触发",{"2":{"505":1}}],["读取时发生错误时触发",{"2":{"505":1}}],["读取时中断时触发",{"2":{"505":1}}],["读取错误的对象",{"2":{"504":1}}],["读取操作后效",{"2":{"504":1}}],["活动区和空闲区身份互换",{"2":{"559":1}}],["计划作业的",{"2":{"1121":1}}],["计数器需要占很大的空间",{"2":{"557":1}}],["计算watcher",{"2":{"932":1}}],["计算属性与侦听函数",{"2":{"956":1,"968":1}}],["计算属性中的响应式对象收集渲染函数",{"2":{"933":1}}],["计算属性的执行的重新执行是由对应的data属性的dep控制的",{"2":{"932":1}}],["计算属性的get函数",{"2":{"932":1}}],["计算属性本质",{"0":{"931":1}}],["计算属性缓存",{"0":{"930":1}}],["计算属性顾名思义就是由计算得来的值",{"2":{"928":1}}],["计算属性",{"0":{"928":1},"1":{"929":1,"930":1,"931":1,"932":1,"933":1,"934":1},"2":{"948":1,"964":1}}],["计算完hash后上传",{"2":{"772":1}}],["计算机本身是不认识也就读不懂其含义也就无法正常运行",{"2":{"586":1}}],["计算机网络使用各种协议来实现不同的功能和服务",{"2":{"307":1}}],["计算机网络可以分为局域网",{"2":{"307":1}}],["计算机网络是指互联的计算机系统之间通过通信设备和通信线路进行数据交换的系统",{"2":{"307":1}}],["计算机网络",{"0":{"307":1},"1":{"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1},"2":{"306":1,"314":1,"373":1,"396":1}}],["计算进度",{"2":{"514":1}}],["计算已经接受到的数据大小",{"2":{"514":1}}],["计算出共享密钥",{"2":{"333":2}}],["计算出一个共享密钥",{"2":{"333":1}}],["计算bfc的高度时",{"2":{"107":1,"108":1,"112":1}}],["计算字符串str的安全散列算法",{"2":{"83":1}}],["计算字符串str的md5校验和",{"2":{"83":1}}],["计算结果为0",{"2":{"83":1}}],["受代码执行环境的影响",{"2":{"538":1}}],["考虑框架的性能特点和可维护性",{"2":{"786":1}}],["考虑项目的长远维护以及团队成员的技术栈选择大家熟悉的工具和规范集成化的项目工具",{"2":{"784":1}}],["考虑",{"2":{"535":1}}],["呢",{"2":{"532":1}}],["事情是这样的",{"2":{"1232":1}}],["事实上却是个set集合",{"2":{"532":1}}],["事件卸载",{"0":{"940":1}}],["事件模型等",{"2":{"709":1}}],["事件驱动",{"0":{"527":1}}],["事件触发线程",{"2":{"526":1}}],["事件",{"0":{"505":1}}],["事件监听",{"0":{"470":1},"2":{"465":1}}],["宏任务",{"2":{"531":1}}],["任何陪伴的时光终将会变成珍贵的回忆",{"2":{"1232":1}}],["任何动态数据",{"2":{"996":1}}],["任何技术或多或少都有一些缺陷",{"2":{"811":1}}],["任何事情都有套路",{"2":{"194":1,"744":1}}],["任务配置相对复杂",{"2":{"784":1}}],["任务调度的动态操作需要通过schedulerregistry进行",{"2":{"661":1}}],["任务调度系统同时也提供了动态操作任务的功能",{"2":{"661":1}}],["任务调度可以很好解决一些需要定时执行的任务",{"2":{"657":1}}],["任务调度",{"0":{"657":1},"1":{"658":1,"659":1,"660":1,"661":1}}],["任务又包括",{"2":{"531":1}}],["任务队列用来储存待执行的任务如",{"2":{"531":1}}],["任务队列",{"0":{"531":1}}],["堆",{"0":{"530":1}}],["堆和任务队列",{"2":{"528":1}}],["栈就被清空了",{"2":{"529":1}}],["剩下的还有watchposteffect",{"2":{"945":1}}],["剩下",{"2":{"529":1}}],["剩余的24位保存了",{"2":{"381":1}}],["剩余时长30分钟提醒",{"2":{"53":1}}],["帧中包含",{"2":{"529":1}}],["帧中包含了",{"2":{"529":1}}],["帧头包含了一些元数据",{"2":{"354":1}}],["脚本",{"0":{"849":1},"2":{"860":1}}],["脚本执行",{"2":{"528":1}}],["脚本的源",{"2":{"350":1}}],["独立的脚本",{"2":{"526":1}}],["演变到可以在服务端运行的nodejs",{"2":{"525":1}}],["机构有一些使用",{"2":{"1168":1}}],["机器划分",{"0":{"1196":1}}],["机器上需要先安装docker",{"2":{"1171":1}}],["机器名使用",{"2":{"729":1}}],["机器码然后才会运行",{"2":{"525":1}}],["机制",{"2":{"366":1}}],["试想在弱网环境下脚本还没有完全加载完时",{"2":{"524":1}}],["记个日志亦足矣",{"2":{"785":1}}],["记住这个",{"2":{"932":1}}],["记住",{"2":{"514":1}}],["记录着它出生时周围的环境作用域信息",{"2":{"590":1}}],["记录展示方式",{"2":{"413":1}}],["记录显示与编辑",{"2":{"413":1}}],["记录位置信息的字符串",{"2":{"410":1}}],["记录路由等",{"2":{"367":1}}],["记录",{"2":{"233":1}}],["管理程序",{"2":{"1078":1}}],["管理多个环境",{"2":{"1017":1}}],["管理节点和工作节点可以运行在同一台机器上",{"2":{"993":1,"1080":1}}],["管理节点负责整个集群的管理和调度",{"2":{"993":1,"1080":1}}],["管理员可以在网络设备上手动配置每个设备的mac地址和ip地址的对应关系",{"2":{"303":1}}],["管理员可以在静态arp表中指定某个ip地址对应的mac地址",{"2":{"300":1}}],["管理员注册",{"2":{"57":1}}],["管理员处理ktv收藏歌曲",{"2":{"54":1}}],["管理员状态",{"2":{"54":1}}],["管理员收藏歌曲",{"2":{"53":1}}],["管理员查看订单",{"2":{"53":1}}],["管理员给用户开户",{"2":{"53":1}}],["管理员对歌曲的增删改查",{"2":{"53":1}}],["管道和工作之间共享缓存",{"2":{"1138":1}}],["管道",{"2":{"601":1,"609":1}}],["管道输出到给定的",{"2":{"512":1}}],["往可读流中写入数据",{"2":{"510":1}}],["背压",{"2":{"510":1,"514":1}}],["背景图渲染",{"2":{"249":2}}],["背景图",{"0":{"249":1}}],["位置偏移量",{"2":{"770":1}}],["位无符号整数",{"2":{"485":3}}],["位无符号整型数组",{"2":{"482":1}}],["位",{"2":{"485":1}}],["储存集选择你前面创建的存储集",{"2":{"1098":1}}],["储存请求的所有的图片buffer",{"2":{"485":1}}],["储存事件",{"2":{"195":1,"745":1}}],["拷贝当前可读流",{"2":{"512":1}}],["拷贝指定位置的内容并返回新的buffer",{"2":{"479":1}}],["拷贝的是对象的属性的引用",{"2":{"28":1}}],["拷贝的就是内存地址",{"2":{"26":1}}],["拷贝的就是基本类型的值",{"2":{"26":1}}],["固定长度的原始二进制数据缓冲区",{"2":{"479":1}}],["灰度处理等等",{"2":{"478":1}}],["灰太狼",{"2":{"86":1}}],["闭包有很多优点",{"2":{"595":1}}],["闭包的优点和缺点",{"0":{"595":1}}],["闭包是前端的高频话题",{"2":{"594":1}}],["闭包等概念都是js的基础知识",{"2":{"585":1}}],["闭包",{"0":{"594":1},"1":{"595":1},"2":{"477":1,"951":1}}],["闭合路径",{"2":{"283":1}}],["回想还是周三晚上洗完冷水澡后直吹空调导致周四就感觉到鼻子不太舒服了",{"2":{"1236":1}}],["回去好好养病",{"2":{"1236":1}}],["回调会被封装一次",{"2":{"945":1}}],["回调就从当前实例上取",{"2":{"937":1}}],["回调",{"2":{"865":1}}],["回调函数在内部会被封装一次",{"2":{"945":1}}],["回调函数默认通常是以前那种回调写法",{"2":{"868":1}}],["回调函数等等",{"2":{"531":1}}],["回调函数",{"0":{"469":1},"2":{"934":1}}],["回退",{"2":{"801":1}}],["回到事件循环的执行阶段中",{"2":{"539":1}}],["回环地址就像是本地网络上的另一个设备一样",{"2":{"361":1}}],["回环地址为127",{"2":{"361":1}}],["回环地址常用于本地主机进行自测",{"2":{"361":1}}],["回环地址",{"0":{"361":1},"2":{"361":1}}],["影子",{"0":{"468":1}}],["理解异步对于前端的重要性",{"2":{"467":1}}],["混合应用",{"0":{"464":1}}],["混淆了",{"2":{"139":1,"888":1}}],["印地语",{"2":{"462":1}}],["抑制本来会发生的连字",{"2":{"462":1}}],["放到老生代",{"2":{"559":1}}],["放在第一个帧之上",{"2":{"529":1}}],["放在某些需要复杂排版语言",{"2":{"462":1}}],["放在电子文本的两个字符之间",{"2":{"462":1}}],["放大",{"2":{"164":1}}],["边界比较",{"2":{"462":1}}],["之外的所有",{"2":{"1121":1}}],["之外的所有内容都替换为",{"2":{"1121":1}}],["之间只以api进行交流",{"2":{"671":1}}],["之间的浮点数",{"2":{"485":1}}],["之间的整数",{"2":{"485":2}}],["之间的单个数字",{"2":{"485":1}}],["之后你可以使用",{"2":{"508":1}}],["之后就可以正常通信了",{"2":{"456":1}}],["之前的",{"2":{"1207":1}}],["之前",{"2":{"462":1}}],["之所以安装成功",{"2":{"1103":1}}],["之所以这么称呼是因为它也是一个watcher对象并且user的值为true",{"2":{"935":1}}],["之所以服务器信任fiddler",{"2":{"440":1}}],["之所以不单独为前端页面部署服务",{"2":{"126":1}}],["③tcp四次挥手",{"2":{"456":1}}],["②http请求相关",{"2":{"456":1}}],["①tcp三次握手连接",{"2":{"456":1}}],["准备断开连接",{"2":{"455":1}}],["准备完毕了",{"2":{"199":1,"749":1}}],["告知对方数据包收到后马上交给应用层",{"2":{"455":1}}],["告知对方数据发送完毕",{"2":{"455":1}}],["告诉女友后",{"2":{"1236":1}}],["告诉jest改模块的匹配路径",{"2":{"857":1}}],["告诉eslint会存在的全局变量有哪些",{"2":{"828":1}}],["告诉服务器要合并的文件",{"2":{"770":1}}],["告诉浏览器禁止打开下载的文件",{"2":{"350":1}}],["告诉webpack如何解析一些模块",{"2":{"186":1}}],["告诉webpack打包时排除哪些模块",{"2":{"185":1}}],["告诉我们生成了一个root账户的临时密码",{"2":{"68":1}}],["强烈建议使用exec方式使用",{"2":{"1063":1}}],["强制https",{"2":{"1177":1}}],["强制每次重新拉取远程镜像",{"2":{"1069":1}}],["强制重新构建镜像",{"2":{"1069":1}}],["强制停止并删除服务的容器",{"2":{"1031":1}}],["强制删除所有容器",{"2":{"1009":1}}],["强制删除正在运行的nginx容器",{"2":{"1009":1}}],["强制删除容器",{"2":{"1009":1}}],["强制终止容器中的进程",{"2":{"1008":1}}],["强制断开连接",{"2":{"455":1}}],["强大的功能扩展",{"2":{"785":1}}],["强缓存",{"2":{"168":1}}],["携带信息192",{"2":{"454":1}}],["携带信息who",{"2":{"454":1}}],["携带着一个随机数",{"2":{"332":1}}],["途径的网关和其他接收到广播的主机虽然不是目标主机",{"2":{"454":1}}],["十六进制",{"2":{"453":1}}],["什么端口",{"2":{"453":1}}],["什么是plugin",{"0":{"984":1}}],["什么是loader",{"0":{"983":1}}],["什么是monorepo呢❓",{"2":{"810":1}}],["什么是队头阻塞",{"2":{"727":1}}],["什么是原型与原型链",{"0":{"571":1},"1":{"572":1,"573":1,"574":1,"575":1}}],["什么是tcp窗口",{"2":{"387":1}}],["什么是syn",{"2":{"381":1}}],["什么是跨域",{"2":{"336":1}}],["什么是babel",{"2":{"259":1}}],["什么是bfc",{"0":{"101":1},"1":{"102":1,"103":1},"2":{"100":1}}],["什么是装箱和拆箱",{"2":{"37":1,"543":1}}],["蓝牙等等",{"2":{"453":1}}],["蓝牙等协议",{"2":{"310":1}}],["入门教程",{"2":{"980":1}}],["入侵侦测系统等网络层面的用处",{"2":{"449":1}}],["入口分析",{"0":{"238":1}}],["入口文件的名字",{"2":{"186":1,"190":1}}],["入口文件",{"2":{"175":1}}],["入口",{"2":{"172":1}}],["允许作业失败",{"2":{"1130":1}}],["允许重发",{"2":{"1098":1}}],["允许访客下载镜像",{"2":{"1042":1}}],["允许跨域",{"2":{"1034":1}}],["允许用户自定义容器之间通信的网络",{"2":{"1017":1}}],["允许用户使用",{"2":{"1017":1}}],["允许用户将本地创建的镜像上传到",{"2":{"1011":1}}],["允许使用保留字",{"2":{"829":1}}],["允许指定字符串的引用来源",{"2":{"722":1}}],["允许指定ip",{"2":{"713":1}}],["允许与服务器名匹配的引用来源",{"2":{"722":1}}],["允许空的引用来源",{"2":{"722":1}}],["允许压缩的页面最小字节数",{"2":{"717":1}}],["允许的源",{"2":{"692":1}}],["允许",{"2":{"508":1}}],["允许远程连接",{"2":{"438":1}}],["允许客户端在建立新连接时将上一次会话的密钥用于加密数据",{"2":{"334":1}}],["远程文件",{"2":{"1142":1}}],["远程连接fiddler所在的计算机",{"2":{"438":1}}],["远程调试需要将远程应用和fiddler保持在局域网下",{"2":{"438":1}}],["远程代理等等",{"2":{"430":1}}],["需与配置文件中的server",{"2":{"703":1}}],["需勾选unmatched",{"2":{"436":1}}],["需要做手术",{"2":{"1232":1}}],["需要做一系列的环境准备",{"2":{"1197":1}}],["需要版本14",{"2":{"1185":1}}],["需要重启加载配置并重新启动便会配置成功",{"2":{"1178":1}}],["需要重新下载资源",{"2":{"720":1}}],["需要重新连接",{"2":{"379":1}}],["需要关闭这个",{"2":{"1178":1}}],["需要提供证书",{"2":{"1175":1}}],["需要查看root账户的初始密码",{"2":{"1174":1}}],["需要映射宿主机的docker",{"2":{"1159":1}}],["需要指定证书使runner信任此证书",{"2":{"1158":1}}],["需要进行证书认证",{"2":{"1157":1}}],["需要进行身份验证",{"2":{"317":1}}],["需要创建",{"2":{"1103":1}}],["需要对一些权限添加认证",{"2":{"1101":1}}],["需要对plugin中规则一一写出很麻烦",{"2":{"831":1}}],["需要填写仓库名称",{"2":{"1098":1}}],["需要支持arm架构的nexus镜像",{"2":{"1094":1}}],["需要虚拟出一套完整的硬件后",{"2":{"1079":1}}],["需要我们一步一步使用命令进行构建",{"2":{"1051":1}}],["需要添加一些配置",{"2":{"1045":1}}],["需要大家多多使用才能熟练",{"2":{"1015":1}}],["需要将docker和k8s保持一致",{"2":{"1208":1}}],["需要将其加权限",{"2":{"1178":1}}],["需要将所有相关的容器和镜像一起导出导入",{"2":{"1010":1}}],["需要将域名写入host吗",{"2":{"726":1,"1178":1}}],["需要先使用docker",{"2":{"1009":1}}],["需要先获得主机b的mac地址",{"2":{"296":1}}],["需要分号",{"2":{"839":1}}],["需要一定的配置和编写任务的经验",{"2":{"784":1}}],["需要根据文件内容生成对应的唯一hash值",{"2":{"772":1}}],["需要储存对应的切片文件",{"2":{"769":1}}],["需要勾选显示protocol一栏",{"2":{"727":1}}],["需要勾选enble",{"2":{"436":1}}],["需要保持和证书域名相同不",{"2":{"726":1,"1178":1}}],["需要获得ssl证书",{"2":{"726":1}}],["需要鉴权的这里简单的使用",{"2":{"648":1}}],["需要实现",{"2":{"635":1}}],["需要耐心看完💪",{"2":{"523":1}}],["需要通过js的引擎",{"2":{"525":1}}],["需要通过onload事件获取读取内容",{"2":{"506":1}}],["需要通过此事件获取读取的数据",{"2":{"505":1}}],["需要通过client连接这个server",{"2":{"399":1}}],["需要等待发送完毕后才会主动发送fin包请求断开",{"2":{"457":1}}],["需要手动打开配置选项",{"2":{"438":1}}],["需要手动进行维护",{"2":{"304":1}}],["需要信任证书",{"2":{"422":1}}],["需要配置了https后才能查看解码后的内容",{"2":{"421":1}}],["需要配置环境变量",{"2":{"182":1}}],["需要在后台打开",{"2":{"1158":1}}],["需要在运行容器时使用",{"2":{"1062":1}}],["需要在anonymous",{"2":{"1044":1}}],["需要在页脚引用该issue",{"2":{"793":1}}],["需要在breakpoint",{"2":{"419":1}}],["需要在项目中",{"2":{"400":1}}],["需要决定发送新",{"2":{"391":1}}],["需要应答client并发送syn=1",{"2":{"378":1}}],["需要确定每个子网的网络地址和主机地址范围",{"2":{"364":1}}],["需要使用特定的数组方法进行变异操作",{"2":{"965":1}}],["需要使用",{"2":{"965":1}}],["需要使用公有ip地址",{"2":{"360":1}}],["需要使用轮询",{"2":{"354":1}}],["需要区分不同场景",{"2":{"350":1}}],["需要新的协议栈的支持",{"2":{"327":1}}],["需要转换为mac地址的ip地址",{"2":{"298":1}}],["需要注明出处并提供源文章链接",{"2":{"252":1,"271":1,"991":1,"1226":1}}],["需要注意主机是否占用80端口",{"2":{"1172":1}}],["需要注意配置多个runner",{"2":{"1126":1}}],["需要注意在跟路径下创建",{"2":{"966":1}}],["需要注意安装子包时需要标明对应的工作区的版本号",{"2":{"814":1}}],["需要注意一下",{"2":{"184":1}}],["需要注意的是自行配置dns",{"2":{"1212":1}}],["需要注意的是编译依赖go环境",{"2":{"1208":1}}],["需要注意的是发布包到npm",{"2":{"1107":1}}],["需要注意的是这两个端口需要处于创建nexus3容器时暴露出一段端口范围内",{"2":{"1042":1}}],["需要注意的是这种方式不适合大文件的下载",{"2":{"521":1}}],["需要注意的是在child的构造器中调用了super",{"2":{"583":1}}],["需要注意的是所谓的微任务并不会交给其他线程处理",{"2":{"532":1}}],["需要注意的是",{"2":{"2":1,"146":1,"360":1,"420":1,"895":1,"1024":1,"1025":1,"1068":1,"1106":1}}],["需要按照vue插件注册机制规范",{"2":{"245":1}}],["需要manifest和serviceworker",{"2":{"222":1}}],["需要补充一下排除捕获",{"2":{"145":1,"894":1}}],["需要的是prefetch",{"2":{"131":1}}],["需要用到的",{"2":{"131":1}}],["达到精确匹配",{"2":{"1132":1}}],["达到篡改目的",{"2":{"436":1}}],["达到数据传输的可靠",{"2":{"387":1}}],["知识共享",{"2":{"1228":1}}],["知识",{"2":{"436":1}}],["知道匹配并作为动态提供属性",{"2":{"1136":1}}],["知道客户端没有请求了但还可以继续接受数据包",{"2":{"457":1}}],["知道了rules那么什么是overrides呢",{"2":{"830":1}}],["知道了打包的入口文件",{"2":{"237":1}}],["知道了优化的方向",{"2":{"129":1}}],["知道每架飞机的飞行状态",{"2":{"208":1,"758":1}}],["知道有一个对象处理它为止",{"2":{"205":1,"755":1}}],["清理",{"2":{"559":1}}],["清理缓存等功能",{"2":{"430":1}}],["清空所有的mircotask",{"2":{"532":1}}],["清除副作用",{"2":{"945":1}}],["清除后剩余的对象内存位置不变",{"2":{"558":1}}],["清除记录",{"2":{"413":1,"415":1,"434":1}}],["清除画布",{"2":{"283":1}}],["粘贴对象",{"2":{"462":1}}],["粘贴",{"2":{"430":1}}],["粘滞模式jsstr",{"2":{"138":1,"887":1}}],["视频保存路径",{"2":{"878":1}}],["视频文件就会有很多切片",{"2":{"771":1}}],["视频播放器",{"2":{"520":1}}],["视频流",{"0":{"520":1}}],["视频等",{"2":{"316":1}}],["视图会自动更新",{"2":{"968":1}}],["视图更新时机",{"0":{"534":1}}],["视图",{"2":{"486":1}}],["视图对象总结",{"0":{"490":1}}],["视图对象",{"0":{"480":1},"1":{"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"488":1,"489":1,"490":1}}],["视图修改等等",{"2":{"430":1}}],["汉化补丁",{"0":{"423":1}}],["汉子班",{"2":{"86":1}}],["抓取远程的",{"2":{"438":1}}],["抓取指定进程的数据",{"2":{"431":1}}],["抓取https",{"2":{"421":1}}],["抓包范围等等",{"2":{"435":1}}],["抓包详情通常就是我们用来分析返回来的内容和一些请求信息等",{"2":{"417":1}}],["抓包详情",{"0":{"417":1}}],["抓包记录是用来记录抓包的记录的",{"2":{"416":1}}],["抓包记录",{"0":{"416":1},"2":{"413":1,"456":1}}],["抓包结果",{"2":{"378":1,"382":1}}],["抓包分析ip首部字段",{"2":{"367":1}}],["抓包查看http报文",{"2":{"318":1}}],["抓包情况如下",{"2":{"297":1}}],["忘记的可以前面查看",{"2":{"419":1}}],["聚焦到此面板ctrl+x会清除全部的记录",{"2":{"432":1}}],["聚焦展示前面已经讲过了",{"2":{"416":1}}],["聚合函数",{"2":{"83":1}}],["阻碍协作",{"2":{"783":1}}],["阻止所有的引用来源",{"2":{"722":1}}],["阻止页面加载",{"2":{"350":1}}],["阻塞和允许指定的请求",{"2":{"414":1}}],["阻塞请求的cookie",{"2":{"414":1}}],["阻塞cookie",{"2":{"414":1}}],["弱网测试",{"0":{"420":1}}],["弱网测试比较方便",{"2":{"414":1}}],["弱网环境下可能传输效率比http",{"2":{"324":1}}],["帮助团队成员养成良好的编码习惯",{"2":{"794":1}}],["帮助信息",{"2":{"430":1}}],["帮助等等",{"2":{"413":1}}],["帮助我们达到了效果",{"2":{"100":1}}],["菜单栏这里只讲下统计",{"2":{"451":1}}],["菜单栏对fiddler一般做一些全局的配置或功能",{"2":{"430":1}}],["菜单栏相对来说比较重要",{"2":{"414":1}}],["菜单栏",{"0":{"414":1,"430":1,"451":1},"2":{"413":1,"429":1}}],["手术后的前两天麻药过后会感觉很疼",{"2":{"1232":1}}],["手机在同一局域网下",{"2":{"438":1}}],["手机端抓包等等",{"2":{"437":1}}],["手机浏览器访问chls",{"2":{"422":1}}],["手机网络代理到charles和2",{"2":{"422":1}}],["手机ip",{"2":{"422":1}}],["手动发布",{"0":{"1189":1}}],["手动执行",{"2":{"1131":1,"1190":1}}],["手动执行作业",{"2":{"1131":1}}],["手动清除变量",{"2":{"595":1}}],["手动请求",{"2":{"415":1}}],["手动添加",{"0":{"409":1}}],["手写vue图片懒加载插件",{"0":{"240":1},"1":{"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1}}],["手写递归方法",{"0":{"33":1}}],["手写的实现方法可能会有一些小问题",{"2":{"10":1}}],["手写bind",{"0":{"9":1}}],["手写apply",{"0":{"8":1}}],["手写call",{"0":{"6":1,"7":1},"1":{"7":1,"8":1,"9":1}}],["带有构建容器和服务容器",{"2":{"1167":1}}],["带宽",{"2":{"767":1}}],["带着疑问我们一探究竟",{"2":{"587":1}}],["带着这份疑惑",{"2":{"236":1}}],["带我们去目标文件",{"2":{"408":1}}],["潜意识下打开控制台点击报错信息",{"2":{"408":1}}],["潜意识下会打开控制台看下哪里错了",{"2":{"408":1}}],["线上调试",{"0":{"408":1},"1":{"409":1,"410":1}}],["线上override调试",{"0":{"407":1}}],["线属性",{"2":{"283":1}}],["鼠标",{"2":{"404":1,"532":1}}],["才可以进行操作",{"2":{"1101":1}}],["才能事半功倍",{"2":{"824":1}}],["才能访问的页面",{"2":{"216":1}}],["才会加快下载速度",{"2":{"1082":1}}],["才会执行当前阶段微任务队列中的所有微任务",{"2":{"538":1}}],["才会通过eventloop去获取下一个task执行",{"2":{"533":1}}],["才会监听的到",{"2":{"404":1}}],["断网等等",{"2":{"420":1}}],["断点续传功能",{"2":{"776":1}}],["断点续传这里不再演示",{"2":{"772":1}}],["断点续传",{"0":{"772":1}}],["断点续传之类的术语了",{"2":{"764":1}}],["断点信息",{"2":{"435":1}}],["断点等等",{"2":{"434":1}}],["断点调试",{"0":{"419":1}}],["断点",{"2":{"414":1,"436":1}}],["断点设置",{"2":{"413":1,"415":1}}],["断住",{"2":{"404":1}}],["断言",{"0":{"147":1,"896":1},"1":{"148":1,"149":1,"897":1,"898":1}}],["变成了",{"2":{"932":1,"954":1}}],["变成数字",{"2":{"669":1}}],["变为",{"2":{"729":2}}],["变为table元素的现实效果",{"2":{"19":1}}],["变量的一些特性",{"2":{"1058":1}}],["变量的可见性和作用范围",{"2":{"589":1}}],["变量提升",{"2":{"825":1}}],["变量提升和暂时性死区相关概念",{"2":{"588":1}}],["变量提升和暂时性死区",{"0":{"588":1}}],["变量或函数时",{"2":{"594":1}}],["变量对象主要存储var声明的变量",{"2":{"593":1}}],["变量式申明",{"2":{"587":1}}],["变量声明",{"0":{"587":1}}],["变量声明与提升",{"0":{"586":1},"1":{"587":1,"588":1}}],["变量调用等等一系列操作",{"2":{"586":1}}],["变量",{"2":{"400":1,"404":1,"588":2,"1121":1,"1122":1}}],["做好自己就行",{"2":{"1233":1}}],["做强大的自己",{"2":{"1232":1}}],["做为反向代理时启用",{"2":{"717":1}}],["做上面like播放键就可以看到刚刚配置的调试名字",{"2":{"400":1}}],["做一个日志收集logger",{"2":{"230":1}}],["做一些参数转换",{"2":{"230":1}}],["欲了解更多信息",{"2":{"400":1}}],["悬停以查看现有属性的描述",{"2":{"400":1}}],["慢启动算法就是以指数的形式增加",{"2":{"393":1}}],["慢启动",{"0":{"393":1}}],["延迟执行作业",{"2":{"1131":1}}],["延迟等",{"2":{"392":1}}],["延迟高",{"2":{"354":1}}],["滑动窗口的概念则是调整发送数据的起始位置",{"2":{"387":1}}],["滑动窗口",{"0":{"387":1}}],["消耗server端的资源",{"2":{"384":1}}],["消息的完整第一行",{"2":{"1121":1}}],["消息长度等信息",{"2":{"354":1}}],["消息会被分割成多个数据帧进行传输",{"2":{"354":1}}],["消息中的验证信息",{"2":{"333":1}}],["消息和一个",{"2":{"333":1}}],["消息",{"2":{"333":5}}],["消息给客户端",{"2":{"333":1}}],["消息给服务器",{"2":{"333":1}}],["半打开",{"0":{"384":1},"2":{"384":1}}],["半断开",{"0":{"384":1},"2":{"384":1}}],["半连接",{"0":{"384":1},"2":{"384":1}}],["半连接队列",{"2":{"380":1}}],["半连接状态",{"2":{"378":1}}],["处于established建立状态",{"2":{"383":1}}],["处理数组",{"2":{"955":2}}],["处理flush",{"2":{"944":1}}],["处理请求的",{"2":{"729":1}}],["处理完请求后停止",{"2":{"708":1}}],["处理表单数据",{"2":{"613":1}}],["处理body",{"2":{"613":1}}],["处理query",{"2":{"613":1}}],["处理param",{"2":{"613":1}}],["处理异步定时任务",{"2":{"526":1}}],["处理不好就会造成网络资源的浪费",{"2":{"391":1}}],["处理速度较快",{"2":{"342":1}}],["处理返回的数据",{"2":{"338":1}}],["处理起来也比较简单",{"2":{"249":1}}],["处理程序注册服务工作进程",{"2":{"222":1}}],["处理应用程序时",{"2":{"171":1}}],["处理",{"2":{"64":1,"944":1}}],["抛出异常",{"2":{"382":1}}],["系统调用的值",{"2":{"729":1}}],["系统安装charles证书并信任",{"2":{"421":1}}],["系统则认为已断开连接",{"2":{"384":1}}],["系统认为30s内ip可以被转发64次",{"2":{"382":1}}],["系统瘫痪",{"2":{"349":1}}],["便捷升级和扩容",{"2":{"1079":1}}],["便于调试",{"2":{"1069":1}}],["便于生成版本日志",{"2":{"794":1}}],["便于使用封装成以下脚本auto",{"2":{"726":1}}],["便于管理和维护",{"2":{"709":1}}],["便于维护",{"2":{"197":1,"747":1}}],["便会启动成功",{"2":{"1172":1}}],["便会清空当前队列",{"2":{"532":1}}],["便会根据重传机制重新发送数据包",{"2":{"388":1}}],["便一起返回发送一个确认消息",{"2":{"382":1}}],["赶紧给server回了一个ack响应",{"2":{"382":1}}],["赶紧收藏起来",{"2":{"62":1}}],["释放掉syn资源断开连接",{"2":{"381":1}}],["却正确的打印出了值",{"2":{"587":1}}],["却没有parent的prototype相关方法",{"2":{"578":1}}],["却没有收件地址一样",{"2":{"454":1}}],["却一直等不到server的fin报文",{"2":{"384":1}}],["却不响应server的ack+syn请求时",{"2":{"381":1}}],["却发现这个接口的格式并不符合目前需求",{"2":{"206":1,"756":1}}],["➜",{"2":{"379":1,"380":2,"381":1,"382":5,"454":1,"602":3,"610":1,"634":1,"639":1,"645":1,"648":1,"650":1,"655":1,"658":1,"708":5,"718":8,"728":9,"784":2,"799":1,"804":1,"813":1,"814":1,"817":1,"818":1,"860":1,"998":2,"999":1,"1002":3,"1007":1,"1012":1,"1039":2,"1046":2,"1051":2,"1089":1,"1103":2,"1107":2,"1108":1,"1114":1,"1189":1,"1191":2,"1203":1,"1217":2,"1218":4}}],["乙方回答我是那你是谁呢",{"2":{"378":1}}],["甲方再次回乙方说我是谁",{"2":{"378":1}}],["甲方问你是乙方吗",{"2":{"378":1}}],["甲方打给乙方",{"2":{"378":1}}],["搞清楚它非常简单",{"2":{"378":1}}],["流水线过程中如果某个已经在本地了",{"2":{"1159":1}}],["流水线运行时可以通过runner标签指定runner运行",{"2":{"1158":1}}],["流水线全局定义作业的执行的阶段",{"2":{"1125":1}}],["流水线",{"0":{"1123":1},"1":{"1124":1,"1125":1,"1126":1,"1127":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1,"1141":1,"1142":1,"1143":1,"1144":1,"1145":1,"1146":1,"1147":1,"1148":1}}],["流水线详细信息的",{"2":{"1121":1}}],["流水线是如何触发的",{"2":{"1121":1}}],["流水线的流程是",{"2":{"1118":1}}],["流文件",{"0":{"700":1}}],["流内容直接返回",{"2":{"651":1}}],["流内部队列不满时会重复调用这个方法",{"2":{"510":1}}],["流读取",{"2":{"512":1}}],["流写入的数据在某些状态下可以被",{"2":{"512":1}}],["流或可写",{"2":{"512":1}}],["流的基础应用围绕着使响应可以被流处理展开",{"2":{"508":1}}],["流可以让程序不需要接受全部的内容后才可以展示操作",{"2":{"508":1}}],["流量",{"2":{"451":1}}],["流量控制",{"2":{"377":1}}],["流式传输",{"2":{"375":1}}],["超过80报错",{"2":{"830":1}}],["超时",{"2":{"420":1}}],["超时重传是根据rto的时间进行判断的",{"2":{"389":1}}],["超时重传是避不开的问题",{"2":{"388":1}}],["超时重传时使用相同的seq",{"2":{"378":1}}],["超时重传",{"0":{"390":1},"2":{"377":1}}],["超文本传输协议是一个用于",{"2":{"315":1}}],["种类1允许发送者用多个4字节组填充字段",{"2":{"376":1}}],["种类为0和1的选项仅占1字节",{"2":{"376":1}}],["种子",{"2":{"83":1}}],["紧接着是普通变量",{"2":{"587":1}}],["紧接着进入time",{"2":{"382":1}}],["紧急指针",{"2":{"376":1}}],["紧跟在量词的后面",{"2":{"150":1,"899":1}}],["紧跟着",{"2":{"139":1,"888":1}}],["窗口的大小会根据接收方的确认信息",{"2":{"387":1}}],["窗口的大小通常等于接收方的窗口大小",{"2":{"387":1}}],["窗口其实是个缓存空间",{"2":{"387":1}}],["窗口通常用来限制数据包的发送速率",{"2":{"387":1}}],["窗口缩放因子",{"2":{"376":1}}],["窗口",{"2":{"376":1}}],["窗口大小加1可以同时发送2个syn",{"2":{"393":1}}],["窗口大小",{"2":{"311":1,"378":1,"455":1}}],["序列号加上报文长度",{"2":{"455":1}}],["序列号为y+1且有效",{"2":{"378":1}}],["序列号不一定从0或1开始",{"2":{"376":1}}],["序列号",{"2":{"376":1,"455":1}}],["故而不理的",{"2":{"1232":1}}],["故tcp的端口范围为0",{"2":{"376":1}}],["故事经过了半年时间",{"2":{"123":1}}],["面对的是操作系统提供的接口",{"2":{"1078":1}}],["面对大量的代码要学会任务划分",{"2":{"948":1}}],["面向对象编程的思想和函数式编程的思想",{"2":{"601":1,"662":1}}],["面向连接",{"2":{"375":1}}],["面试就会游刃有余",{"2":{"585":1}}],["面试考点",{"2":{"312":1}}],["面板小结",{"0":{"437":1}}],["面板介绍",{"0":{"413":1,"429":1}}],["损坏或重复",{"2":{"375":1}}],["确实有点吓人",{"2":{"1233":1}}],["确切地说是操作系统内核之上",{"2":{"1078":1}}],["确保安全和可靠性",{"2":{"1011":1}}],["确保代码符合统一的风格和标准",{"2":{"842":1}}],["确保编辑器对你项目中使用的语言和框架提供良好的支持",{"2":{"785":1}}],["确保图片格式为png",{"2":{"718":1}}],["确定要提交吗",{"2":{"801":1}}],["确定值",{"2":{"483":1}}],["确定协议版本后也发送一个serverhello给客户端",{"2":{"332":1}}],["确认数据",{"2":{"455":1}}],["确认号",{"2":{"376":1,"455":1}}],["确认机制等手段来确保数据不会丢失",{"2":{"375":1}}],["特性",{"2":{"829":1}}],["特别是在处理大型项目和复杂的依赖关系时的速度",{"2":{"784":1}}],["特点",{"0":{"375":1}}],["特定活动并在状态改变后获得通知",{"2":{"195":1,"745":1}}],["节约成本",{"2":{"1079":1}}],["节点之中不可以有重复的主机名",{"2":{"1195":1}}],["节点间通信类型和密码",{"2":{"728":1}}],["节点2",{"2":{"728":1}}],["节点1",{"2":{"728":1}}],["节点监听",{"2":{"404":1}}],["节省了ip地址资源",{"2":{"370":1}}],["节流防抖函数其实都是代理模式的实现",{"2":{"198":1,"748":1}}],["去掉尾部空格",{"2":{"836":1}}],["去掉链路层的收尾部长度20",{"2":{"369":1}}],["去处理流",{"2":{"508":1}}],["去除无用的css样式等等",{"2":{"191":1}}],["去除没用的css样式代码",{"2":{"190":1}}],["去除属性的引号",{"2":{"176":1}}],["去除字符串首部和尾部的所有空格",{"2":{"83":1}}],["报告生成位置",{"2":{"873":1}}],["报错",{"2":{"578":1,"858":1}}],["报分片混淆",{"2":{"367":1}}],["报文的长度未知",{"2":{"343":1}}],["报文传输方式",{"2":{"341":1}}],["占16位",{"2":{"367":1}}],["广泛应用于前端开发和",{"2":{"855":1}}],["广告投放",{"2":{"778":1}}],["广播是一种无差别的通信方式",{"2":{"365":1}}],["广播是一种将数据包发送给网络中",{"2":{"365":1}}],["广播",{"0":{"365":1},"2":{"365":1,"453":1}}],["广域网和因特网等不同的类型",{"2":{"307":1}}],["灵活性",{"2":{"1050":1}}],["灵活的配置",{"2":{"705":1}}],["灵活管理ip地址",{"2":{"364":1}}],["灵活改变",{"2":{"182":1}}],["划分指定范围的blob",{"2":{"496":1}}],["划分子网可以支持网络的扩展",{"2":{"364":1}}],["划分子网可以为不同的网络应用提供独立的网络空间",{"2":{"364":1}}],["划分子网可以更灵活地管理ip地址",{"2":{"364":1}}],["划分子网可以将网络分段",{"2":{"364":1}}],["划分子网可以减少广播域的范围",{"2":{"364":1}}],["划分子网的好处",{"2":{"364":1}}],["划分子网时",{"2":{"364":1}}],["划分实现",{"0":{"364":1}}],["划分层次可以进一步促进不同层次标准化",{"2":{"308":1}}],["监听关闭事件",{"2":{"537":1}}],["监听执行事件callback",{"2":{"526":1}}],["监听对应的事件当触发时就会打住断点",{"2":{"404":1}}],["监听当前元素属性发生变化时",{"2":{"404":1}}],["监听所有可用的网络接口",{"2":{"361":1}}],["监听operator事件",{"2":{"195":1,"745":1}}],["范围同上",{"2":{"376":1}}],["范围为240",{"2":{"359":1}}],["范围为224",{"2":{"359":1}}],["范围请求允许获取资源的部分内容",{"2":{"344":1}}],["范围请求可以通过指定资源的字节范围来实现",{"2":{"344":1}}],["范围请求",{"0":{"344":1},"2":{"317":1}}],["漏洞动图演示",{"2":{"355":1}}],["游客",{"2":{"354":1}}],["股票行情等",{"2":{"354":1}}],["双引号将会被移除如果没有使用转义",{"2":{"1055":1}}],["双下划线用来连接块和块的子元素",{"2":{"850":1}}],["双下划线",{"2":{"850":1}}],["双击接口就可以抓取了",{"2":{"453":1}}],["双击某条记录可以在右侧面板查看详细信息",{"2":{"432":1}}],["双重验证",{"2":{"353":1}}],["双方进入全连接状态",{"2":{"378":1}}],["双方验证成功后便进入正式数据传输阶段",{"2":{"332":1}}],["双方都根据3个随机数和密码套件生成会话密钥",{"2":{"332":1}}],["双方可以在本地根据一系列规则生成对应的规则避免密钥传输或者被中间人破解",{"2":{"330":1}}],["黑客网站",{"2":{"352":1}}],["黑客链接页面localhost",{"2":{"352":1}}],["黑客在上面发布了一条链接指向黑客网站localhost",{"2":{"352":1}}],["黑客很容易拿到密钥",{"2":{"330":1}}],["恶意请求会被发送到一个受害者网站",{"2":{"351":1}}],["过程中可能会对模板进行编译",{"2":{"953":1}}],["过大网络延时偏大",{"2":{"389":1}}],["过小造成网络资源浪费",{"2":{"389":1}}],["过滤掉已经上传过的切片",{"2":{"772":1}}],["过滤掉不是以",{"2":{"687":1}}],["过滤器分为捕获过滤器和显示过滤器",{"2":{"453":1}}],["过滤器",{"0":{"453":1},"2":{"452":2,"601":1,"670":1}}],["过滤和管理等功能",{"2":{"371":1}}],["过滤",{"2":{"350":1}}],["过期时间",{"2":{"347":1}}],["过期时间等等",{"2":{"347":1}}],["过期用户",{"2":{"64":1}}],["启用并视作错误",{"2":{"830":1}}],["启用并视作警告",{"2":{"830":1}}],["启用了https后由于会进行ssl握手会消耗更多的cpu资源",{"2":{"726":1}}],["启用缓存失效时使用旧的缓存数据",{"2":{"721":1}}],["启用缓存锁定",{"2":{"721":1}}],["启用缓存背景更新",{"2":{"721":1}}],["启用代理缓存",{"2":{"721":1}}],["启用版本控制",{"2":{"654":1}}],["启用",{"2":{"350":1,"717":1,"873":1}}],["启动后",{"2":{"1130":1}}],["启动后出弹出cypress的界面",{"2":{"877":1}}],["启动作业的用户的姓名",{"2":{"1121":1}}],["启动作业的用户的",{"2":{"1121":1}}],["启动nexus3容器",{"2":{"1094":1}}],["启动nginx",{"2":{"728":2,"1004":1}}],["启动nginx与重启sh➜",{"2":{"708":1}}],["启动docker",{"2":{"1093":1}}],["启动docker并配置开机自启",{"2":{"1082":1}}],["启动debugger模式",{"2":{"399":1}}],["启动debugger",{"2":{"399":1}}],["启动慢",{"2":{"1079":1}}],["启动快",{"2":{"1078":1}}],["启动整体服务",{"2":{"1034":1}}],["启动顺序",{"2":{"1019":1}}],["启动时间长",{"2":{"1078":1}}],["启动时间",{"2":{"1006":1}}],["启动容器",{"2":{"1002":1}}],["启动容器时会根据docker网桥的网络随机分配一个虚拟ip",{"2":{"1085":1}}],["启动容器时",{"2":{"997":1}}],["启动或停止容器查看输出",{"2":{"994":1}}],["启动静态服务",{"2":{"966":1}}],["启动项目",{"2":{"966":1}}],["启动项目应该是很容易的",{"2":{"56":1}}],["启动测试",{"2":{"879":1}}],["启动keepalived",{"2":{"728":1}}],["启动",{"0":{"682":1,"1004":1},"2":{"399":1,"1003":1,"1004":1,"1017":1}}],["启动成功后用浏览器访问http",{"2":{"56":2}}],["启动成功会显示",{"2":{"56":1}}],["元编程",{"2":{"958":1}}],["元素",{"2":{"850":1}}],["元素节点等等都会监听的到",{"2":{"404":1}}],["元素内嵌入",{"2":{"350":1}}],["元素的",{"2":{"350":1}}],["元数据是在method上的",{"2":{"648":1}}],["元数据和装饰器是ecmascript中两个独立的部分",{"2":{"227":1}}],["元数据",{"0":{"227":1}}],["样式表的源",{"2":{"350":1}}],["样式的最根本的",{"2":{"179":1}}],["符合白名单的才会加载",{"2":{"350":1}}],["符合用户参与启发式",{"2":{"222":1}}],["型",{"2":{"350":1}}],["盗用用户账户等",{"2":{"350":1}}],["篡改网页内容",{"2":{"350":1}}],["篡改或冒充",{"2":{"328":2}}],["温馨提示",{"2":{"350":1,"351":1,"654":1}}],["拒绝服务攻击等",{"2":{"349":1}}],["拒绝访问",{"2":{"317":1}}],["攻击利用漏洞伪造用户的请求",{"2":{"351":1}}],["攻击者账号",{"2":{"352":1}}],["攻击者利用这种漏洞向网站注入恶意脚本代码",{"2":{"350":1}}],["攻击者可以通过利用http协议的漏洞或者弱点",{"2":{"349":1}}],["攻击是一种常见的web安全漏洞",{"2":{"350":1}}],["攻击等",{"2":{"329":1}}],["感觉无力再敲代码",{"2":{"1236":1}}],["感兴趣可以试试",{"2":{"728":1}}],["感兴趣的可以看看",{"2":{"932":1}}],["感兴趣的可以自己看看",{"2":{"583":1}}],["感兴趣的同学可以自行搜索",{"2":{"348":1}}],["感谢这里一切",{"2":{"1233":1}}],["感谢老天的厚爱",{"2":{"1232":1}}],["感谢各位🙏",{"2":{"1223":1}}],["感谢支持😄",{"2":{"250":1}}],["感谢点赞",{"2":{"250":1}}],["感谢理解",{"2":{"239":1}}],["感谢",{"2":{"17":1,"21":1}}],["规定在dockerfile中第一条指令必须是from",{"2":{"1069":1}}],["规定cookie只能https传输",{"2":{"347":1}}],["规范和最佳实践可以帮助团队成员更好地理解和协作",{"2":{"824":1}}],["规范的提交信息可以帮助团队成员更快地理解每次提交的目的和更改内容",{"2":{"794":1}}],["规范类和功能类",{"2":{"782":1}}],["规则配置等",{"2":{"842":1}}],["规则校验",{"2":{"842":1}}],["规则匹配",{"2":{"841":1}}],["规则集",{"0":{"833":1}}],["规则优先级",{"2":{"830":1}}],["规则值",{"2":{"830":1}}],["规则还可以包含针对该规则的额外配置选项",{"2":{"830":1}}],["规则是",{"2":{"227":1}}],["规则为",{"2":{"146":1,"895":1}}],["规则",{"2":{"64":2,"145":1,"830":1,"831":1,"846":1,"894":1}}],["优先下载第一个仓库的包",{"2":{"1106":1}}],["优先级",{"2":{"830":1}}],["优先级越大",{"2":{"728":1}}],["优先级更高",{"2":{"720":1}}],["优先级高",{"2":{"347":1}}],["优缺点",{"0":{"1079":1}}],["优质的代码应具备高度的可靠性和稳定性",{"2":{"824":1}}],["优势",{"0":{"705":1,"1017":1},"2":{"965":1}}],["优点",{"2":{"557":1,"558":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1}}],["优化内容",{"2":{"778":1}}],["优化图片",{"2":{"762":1}}],["优化请求队列",{"2":{"727":1}}],["优化https",{"2":{"726":1}}],["优化器转化成字节码或机器码执行",{"2":{"587":1}}],["优化了握手协议",{"2":{"329":1}}],["优化",{"0":{"246":1},"1":{"247":1,"248":1,"249":1}}],["优化项",{"2":{"187":1,"190":1}}],["优化改善网页的加载及性能",{"0":{"123":1},"1":{"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1}}],["域",{"2":{"347":1}}],["域名自行修改",{"2":{"1176":1}}],["域名与证书",{"0":{"1175":1},"1":{"1176":1,"1177":1,"1178":1}}],["域名访问看后面",{"2":{"1172":1}}],["域名来访问其他容器",{"2":{"1091":1}}],["域名来区分具体的路由",{"2":{"610":1}}],["域名控制",{"2":{"611":1}}],["域名",{"2":{"336":1,"691":1,"709":1,"710":1}}],["域名或ip地址",{"2":{"316":1}}],["统一阶段的作业并行运行",{"2":{"1125":1}}],["统一标准",{"2":{"1079":1}}],["统一配置管理",{"2":{"1017":1}}],["统一配置对于所有的开发者都是透明的",{"2":{"669":1}}],["统一放在",{"2":{"964":1}}],["统一构建和部署过程",{"2":{"811":1}}],["统一提交信息格式",{"2":{"794":1}}],["统一前缀",{"2":{"605":1}}],["统一域名可以使用一个或多个cookie",{"2":{"347":1}}],["统计可以对网络数据进行不同维度的统计",{"2":{"459":1}}],["统计需要数据才可以统计出结果",{"2":{"451":1}}],["统计内部有好多不同维度的分组",{"2":{"451":1}}],["统计人数",{"2":{"83":1}}],["统计",{"0":{"459":1},"2":{"83":1,"877":1}}],["购买证书",{"2":{"726":1}}],["购买数量表单等等",{"2":{"208":1,"758":1}}],["购物车内容等数据",{"2":{"347":1}}],["部分代码省略",{"2":{"954":1}}],["部分省略",{"2":{"934":1}}],["部分chunk上传",{"2":{"772":1}}],["部分内容不是很全",{"2":{"769":1}}],["部分字段已经被省略",{"2":{"344":1}}],["部署通常都会使用docker+pm2+k8s形式进行配置",{"2":{"703":1}}],["部署",{"0":{"703":1},"2":{"1079":1}}],["部署等等",{"2":{"690":1}}],["部门",{"2":{"88":1}}],["个字符",{"2":{"1121":4}}],["个字节视为一个",{"2":{"485":3}}],["个字节",{"2":{"342":1}}],["个可用的",{"2":{"1085":1}}],["个人技术博客",{"0":{"1230":1}}],["个人博客可以自主按照以下提示申请即可",{"2":{"1229":1}}],["个人喜欢这种风格的",{"2":{"414":1}}],["个人不推荐大家学习这款工具了",{"2":{"221":1}}],["个地址",{"2":{"366":1}}],["哪些源可以被信任",{"2":{"339":1}}],["满足以下所有条件",{"2":{"337":1}}],["废除了rsa",{"2":{"334":1}}],["密钥的文件",{"2":{"1121":1}}],["密钥交换算法的主要思想是利用质数p和底数g",{"2":{"333":1}}],["密钥交换的临时公钥",{"2":{"333":1}}],["密码可以从下文得知",{"2":{"1172":1}}],["密码的base64结果",{"2":{"1014":1}}],["密码会暴露😂",{"2":{"1014":1}}],["密码",{"0":{"1174":1},"2":{"728":1,"1014":1}}],["密码类型",{"2":{"728":1}}],["密码加密算法有好几种",{"2":{"713":1}}],["密码提示你输入",{"2":{"713":1}}],["密码长度不能小于10",{"2":{"197":2,"747":2}}],["签名信息是由服务器的私钥生成的",{"2":{"333":1}}],["签证加密",{"2":{"64":1}}],["底层都是使用了cors第三方库",{"2":{"691":1}}],["底部的filter可以简单的过滤抓包记录",{"2":{"416":1}}],["底部音乐控制区域",{"2":{"54":1}}],["底数g和服务器的公钥",{"2":{"333":1}}],["证明不是响应式对象",{"2":{"956":1}}],["证明兼容性是没有问题的",{"2":{"247":1}}],["证书的文件",{"2":{"1121":2}}],["证书和私钥的路径等等",{"2":{"710":1}}],["证书安装等等",{"2":{"414":1}}],["证书",{"2":{"332":1,"422":1,"709":1,"710":1,"726":1}}],["服务镜像可以运行任何应用程序",{"2":{"1146":1}}],["服务基于",{"2":{"1091":1}}],["服务能够在另一个节点上继续运行",{"2":{"728":1}}],["服务配置",{"0":{"667":1}}],["服务的简便性和效率",{"2":{"664":1}}],["服务代码",{"2":{"404":1}}],["服务类型",{"2":{"367":1}}],["服务端是",{"2":{"993":1,"1080":1}}],["服务端通信",{"2":{"993":1,"1080":1}}],["服务端发送http响应",{"2":{"458":1}}],["服务端发送tcp的ack的数据包确认已经收到请求了",{"2":{"458":1}}],["服务端发送数据到客户端",{"2":{"456":1}}],["服务端也并不能立马关闭连接",{"2":{"457":1}}],["服务端将会进入closed状态",{"2":{"457":1}}],["服务端将sessionid存入cookie中设置到客户端",{"2":{"348":1}}],["服务端进入last",{"2":{"457":1}}],["服务端接收后知道客户端的接收能力没问题",{"2":{"456":1}}],["服务端接收到数据包后",{"2":{"457":1}}],["服务端接收到后知道客户端的发送能力没问题",{"2":{"456":1}}],["服务端接收到客户端的syn数据包后",{"2":{"456":1}}],["服务端渲染",{"2":{"350":1}}],["服务端渲染时",{"2":{"350":1}}],["服务端收到客户端的消息并验证后",{"2":{"332":1}}],["服务端收到客户端发送的预主密钥后",{"2":{"332":1}}],["服务端收到clienthello根据client的加密套件选择一个密码套件",{"2":{"332":1}}],["服务器实现",{"2":{"1091":1}}],["服务器架构",{"2":{"993":2,"1080":2}}],["服务器架构和主从架构",{"2":{"993":1,"1080":1}}],["服务器以hash值作为文件的储存地址",{"2":{"772":1}}],["服务器以为是小明自己发起的请求",{"2":{"352":1}}],["服务器存储切片用",{"2":{"769":1}}],["服务器名称",{"2":{"729":1}}],["服务器地址",{"2":{"729":1}}],["服务器推荐加密套件",{"2":{"726":1}}],["服务器推送等多个新特性",{"2":{"323":1}}],["服务器推送",{"2":{"321":1,"323":1}}],["服务器会在响应头中设置一个到期日期",{"2":{"720":1}}],["服务器的名称",{"2":{"1121":1}}],["服务器的行为和参数",{"2":{"709":1}}],["服务器的用户",{"2":{"709":1}}],["服务器",{"2":{"456":1,"1121":3}}],["服务器通常用下面的方法设置初始序列号",{"2":{"381":1}}],["服务器通过计算客户端的",{"2":{"354":1}}],["服务器在收到syn包后",{"2":{"380":1}}],["服务器在读取完一个块之后才会知道下一个块的大小和内容",{"2":{"343":1}}],["服务器在读取到请求头之后",{"2":{"342":1}}],["服务器收到请求后如果允许协议升级",{"2":{"354":1}}],["服务器收到预检请求后",{"2":{"337":1}}],["服务器根据cookie中的sessionid对比存储起来的session信息",{"2":{"348":1}}],["服务器主动发送9次",{"2":{"343":1}}],["服务器可以一次性读取整个消息体并返回",{"2":{"341":1}}],["服务器可以在收到客户端请求之前主动将一些资源推送给客户端",{"2":{"325":1}}],["服务器端需要设置access",{"2":{"339":1}}],["服务器接收到该消息后",{"2":{"333":1}}],["服务器发送一个",{"2":{"333":2}}],["服务器发生了错误",{"2":{"317":1}}],["服务器返回已经上传的切片列表",{"2":{"772":1}}],["服务器返回一个",{"2":{"333":1}}],["服务器返回的内容为空",{"2":{"317":1}}],["服务器返回的响应状态码",{"2":{"317":1}}],["服务器日志等记录下来",{"2":{"320":1}}],["服务器充当网关或代理时",{"2":{"317":1}}],["服务器暂时无法处理请求",{"2":{"317":1}}],["服务器作为网关或代理",{"2":{"317":1}}],["服务器不支持请求的功能",{"2":{"317":1}}],["服务器无法处理请求中所包含的媒体类型",{"2":{"317":1}}],["服务器无法解析该请求",{"2":{"317":1}}],["服务器正在处理请求",{"2":{"317":1}}],["服务器正在根据客户端的请求切换协议",{"2":{"317":1}}],["服务器已经接收到了请求头",{"2":{"317":1}}],["服务器则根据请求返回响应",{"2":{"315":1}}],["服务器协议",{"2":{"315":1}}],["服务器拉取代码后直接",{"2":{"126":1}}],["服务器内部错误",{"2":{"62":1}}],["服务器基本架构",{"2":{"54":1}}],["握手不太清楚的可以阅读我的",{"2":{"726":1}}],["握手结束",{"2":{"333":1}}],["握手",{"0":{"333":1}}],["握手成功",{"2":{"332":1}}],["握手后的数据传输使用对称加密",{"2":{"330":1}}],["握手阶段使用非对称加密进行密钥的共享",{"2":{"330":1}}],["完整的提交消息",{"2":{"1121":1}}],["完整性和可信性",{"2":{"329":1}}],["完成对属性拦截的相关逻辑",{"2":{"953":1}}],["完成数据的封装",{"2":{"454":1}}],["完全合格域名",{"2":{"726":1,"1178":1}}],["完好无损渲染出来",{"2":{"199":2,"749":2}}],["容器运行时",{"0":{"1207":1},"1":{"1208":1,"1209":1}}],["容器位置在",{"2":{"1159":1}}],["容器时使用",{"2":{"1116":1}}],["容器资源类似都有创建",{"2":{"1112":1}}],["容器停止后数据会丢失",{"2":{"1111":1}}],["容器与宿主机的路径解耦",{"2":{"1111":1}}],["容器与宿主机的路径绑定较为紧密",{"2":{"1111":1}}],["容器被删除或重建时数据也会被删除",{"2":{"1110":1}}],["容器中",{"2":{"1113":1}}],["容器中的数据是存储在容器存储层中的",{"2":{"1110":1}}],["容器中使用volumes列表进行卷的映射",{"2":{"1022":1}}],["容器持久化存储的重要组成部分",{"2":{"1110":1}}],["容器内部无法访问外部网络",{"2":{"1087":1}}],["容器内没有自己内核",{"2":{"1079":1}}],["容器不会被分配独立的",{"2":{"1087":1}}],["容器直接使用宿主机的网络设备和",{"2":{"1087":1}}],["容器启动时",{"2":{"1086":1}}],["容器启动会执行dockerfile中指定的cmd命令",{"2":{"1063":1}}],["容器都有自己的网络命名空间",{"2":{"1085":1}}],["容器相互隔离",{"2":{"1079":1}}],["容器对我们的代码和依赖进行打包",{"2":{"1078":1}}],["容器使用卷的本质其实就是文件或路径的挂载",{"2":{"1110":1}}],["容器使用",{"2":{"1018":1}}],["容器使用本地",{"2":{"1018":1}}],["容器之间可以直接通信",{"2":{"1017":1}}],["容器之间的通信",{"2":{"1017":1}}],["容器和仓库入门",{"2":{"1015":1}}],["容器的网络命名空间使得容器内部的网络设备和",{"2":{"1085":1}}],["容器的运行必须提供默认的运行命令",{"2":{"1063":1}}],["容器的",{"2":{"1062":1}}],["容器的配置和关系",{"2":{"1018":1}}],["容器的导入导出可以用于将一个容器的文件系统打包成一个",{"2":{"1010":1}}],["容器的集群工具",{"2":{"993":1,"1080":1}}],["容器起来后不想运行了怎么办",{"2":{"1008":1}}],["容器日志",{"0":{"1007":1}}],["容器名称",{"2":{"1006":1,"1020":1}}],["容器列表",{"0":{"1006":1},"2":{"1006":1}}],["容器命名nginx",{"2":{"1004":1}}],["容器实例",{"2":{"1004":1}}],["容器需要使用",{"2":{"1004":1}}],["容器可以通过修改来生成新的镜像",{"2":{"1003":1}}],["容器可以通过镜像来创建",{"2":{"1003":1}}],["容器是一个具有生命周期的实体",{"2":{"1003":1}}],["容器是一个动态的环境",{"2":{"1003":1}}],["容器是镜像的运行实例",{"2":{"1003":1}}],["容器是镜像运行时的实体",{"2":{"995":1,"1081":1}}],["容器所依赖的镜像不会被自动删除",{"2":{"1002":1}}],["容器就能够访问和修改虚拟文件系统中的内容",{"2":{"997":1}}],["容器文件系统",{"2":{"997":1}}],["容器等等shdocker",{"2":{"994":1}}],["容器",{"0":{"1003":1},"1":{"1004":1,"1005":1,"1006":1,"1007":1,"1008":1,"1009":1,"1010":1},"2":{"992":1,"993":2,"995":1,"1009":1,"1016":1,"1018":1,"1080":2,"1081":1,"1169":1}}],["容器化",{"2":{"991":1}}],["容器通过控制反转",{"2":{"601":1}}],["容器里面的子元素不会影响到外面的元素",{"2":{"107":1}}],["容易撑爆内存",{"2":{"521":1}}],["容易被攻击者窃取",{"2":{"328":1}}],["尚未被广泛采用",{"2":{"327":1}}],["严重影响性能",{"2":{"930":1}}],["严重影响流量",{"2":{"326":1}}],["严格模式",{"2":{"829":1}}],["严格地说",{"2":{"227":1}}],["推送到gitlab项目中",{"2":{"1183":1}}],["推送镜像",{"0":{"1046":1},"2":{"1039":1}}],["推送首先要登录",{"2":{"999":1}}],["推送",{"0":{"999":1},"2":{"999":2}}],["推送对首屏的渲染并没有太大用处",{"2":{"325":1}}],["推送的资源不被缓存",{"2":{"325":1}}],["推荐",{"2":{"827":1}}],["推荐的最大值为95",{"2":{"718":1}}],["推荐使用官方推荐的技术如",{"2":{"784":1}}],["推荐使用",{"2":{"428":1,"582":1,"1206":1}}],["推荐使用域名归纳方式方便调试",{"2":{"416":1}}],["推荐使用structure",{"2":{"414":1}}],["推荐一个强大的数据可视化工具",{"2":{"70":1}}],["推荐到ktv推荐歌曲",{"2":{"53":1}}],["推荐flex",{"2":{"22":1}}],["推荐css",{"2":{"22":1}}],["推荐absolute",{"2":{"22":1}}],["\\tuser",{"2":{"1148":1}}],["\\turl",{"2":{"772":2}}],["\\tenvironment",{"2":{"1147":1}}],["\\tentrypoint",{"2":{"1145":1}}],["\\tnode",{"2":{"1145":1,"1146":1,"1148":1}}],["\\tneeds",{"2":{"1141":2}}],["\\tname",{"2":{"839":1}}],["\\tproject",{"2":{"1142":1}}],["\\tpriority",{"2":{"728":1}}],["\\tpaths",{"2":{"1138":1}}],["\\tparallel",{"2":{"1134":1}}],["\\ttemplate",{"2":{"1142":1}}],["\\ttag",{"2":{"1138":1}}],["\\ttags",{"2":{"1127":1,"1129":2}}],["\\ttimeout",{"2":{"1133":1}}],["\\tonly",{"2":{"1127":1,"1135":1,"1139":1}}],["\\tmynetwork",{"2":{"1022":1}}],["\\tmyvolume",{"2":{"1022":1}}],["\\tmethod",{"2":{"770":1,"772":1}}],["\\tfile",{"2":{"1142":1}}],["\\tfetch",{"2":{"1034":1}}],["\\tfriends",{"2":{"955":1}}],["\\tfunction",{"2":{"354":1}}],["\\t└──",{"2":{"878":3}}],["\\t├──",{"2":{"878":1}}],["\\tvariables",{"2":{"1128":1}}],["\\tvalue",{"2":{"950":1}}],["\\tvue响应式模型",{"2":{"953":1}}],["\\tversion",{"2":{"828":1}}],["\\tvirtual",{"2":{"728":2}}],["\\theaders",{"2":{"770":1,"772":2}}],["\\thttp",{"2":{"326":2}}],["\\thttp2",{"2":{"325":1}}],["\\tdependencies",{"2":{"1139":1}}],["\\tdomain",{"2":{"1136":1,"1137":1}}],["\\tdomian",{"2":{"1128":1}}],["\\tdockerfile",{"2":{"1018":1,"1021":1}}],["\\tdocument",{"2":{"338":1}}],["\\tdata",{"2":{"769":1,"770":1,"772":1}}],["\\twhen",{"2":{"1131":3}}],["\\tweight",{"2":{"728":1}}],["\\tws",{"2":{"354":3}}],["\\tartifacts",{"2":{"1139":1}}],["\\tallow",{"2":{"1130":1}}],["\\tafter",{"2":{"1124":2}}],["\\tage",{"2":{"839":2}}],["\\tadvert",{"2":{"728":1}}],["\\tadd",{"2":{"727":1}}],["\\tauthentication",{"2":{"728":1}}],["\\tauth",{"2":{"713":2}}],["\\tlocal",{"2":{"1142":1}}],["\\tlocation",{"2":{"353":1,"711":3,"712":3,"713":3,"715":2,"716":2,"718":2,"720":2,"721":1,"722":1,"723":1,"724":1,"725":1,"727":1}}],["\\tlisten",{"2":{"724":1,"726":2,"727":3}}],["\\tgzip",{"2":{"717":13}}],["\\tgetusers",{"2":{"652":1}}],["\\tbefore",{"2":{"1124":1}}],["\\tbackground",{"2":{"850":2}}],["\\tbtn",{"2":{"354":1,"724":1}}],["\\tbutton",{"2":{"350":1}}],["\\tstart",{"2":{"1131":1}}],["\\tstage",{"2":{"1124":3,"1125":3,"1128":1,"1141":4,"1142":1,"1145":1}}],["\\tstate",{"2":{"728":1}}],["\\tssl",{"2":{"726":9,"727":2}}],["\\tserver",{"2":{"709":1,"722":1,"725":3,"726":1}}],["\\tsamesite",{"2":{"353":1}}],["\\tscripts",{"2":{"1139":1,"1141":3,"1142":1,"1145":1,"1147":1}}],["\\tscript",{"2":{"338":1,"728":1,"1124":2,"1125":3,"1127":1,"1128":1,"1130":1,"1148":2}}],["\\t\\tvariables",{"2":{"1148":2}}],["\\t\\tvalid",{"2":{"353":1,"722":1}}],["\\t\\tdefault",{"2":{"1148":2}}],["\\t\\tdeny",{"2":{"713":3}}],["\\t\\tkey",{"2":{"1138":2}}],["\\t\\tmax",{"2":{"1132":2}}],["\\t\\tmsg",{"2":{"723":1}}],["\\t\\twhen",{"2":{"1132":2,"1139":1}}],["\\t\\tname",{"2":{"1128":1,"1139":1,"1147":1}}],["\\t\\t2",{"2":{"797":1}}],["\\t\\t192",{"2":{"728":1}}],["\\t\\thttp2",{"2":{"727":1}}],["\\t\\tconsole",{"2":{"724":1}}],["\\t\\tconst",{"2":{"724":1}}],["\\t\\tcode",{"2":{"723":1}}],["\\t\\turl",{"2":{"723":1,"1147":1}}],["\\t\\tpolicy",{"2":{"1138":1}}],["\\t\\tport",{"2":{"723":1}}],["\\t\\tpaths",{"2":{"1138":2,"1139":1}}],["\\t\\tproxy",{"2":{"721":15,"723":10,"724":6,"725":1}}],["\\t\\texpire",{"2":{"1139":1}}],["\\t\\texpires",{"2":{"720":1}}],["\\t\\texpose",{"2":{"1139":1}}],["\\t\\texclude",{"2":{"1139":1}}],["\\t\\terror",{"2":{"715":1}}],["\\t\\tauth",{"2":{"728":2}}],["\\t\\tautoindex",{"2":{"712":3}}],["\\t\\tadd",{"2":{"716":1,"720":1,"723":1,"724":3}}],["\\t\\tallow",{"2":{"713":1,"1136":2}}],["\\t\\talias",{"2":{"712":1,"1146":1}}],["\\t\\tindex",{"2":{"711":1,"712":1}}],["\\t\\tif",{"2":{"353":1,"715":1,"722":1,"724":1,"1136":3,"1137":1}}],["\\t\\treports",{"2":{"1139":1}}],["\\t\\trewrite",{"2":{"715":1}}],["\\t\\treturn",{"2":{"652":1,"716":2,"718":1}}],["\\t\\troot",{"2":{"711":1,"712":1}}],["\\t\\t\\tartifacts",{"2":{"1141":1}}],["\\t\\t\\tjest",{"2":{"1139":1}}],["\\t\\t\\tfiles",{"2":{"1138":1}}],["\\t\\t\\theaders",{"2":{"724":1}}],["\\t\\t\\tmode",{"2":{"724":1}}],["\\t\\t\\t\\t",{"2":{"703":2,"724":1,"1138":2}}],["\\t\\t\\t",{"2":{"703":10,"724":1,"797":7,"1132":2,"1138":3,"1139":3,"1148":2}}],["\\t\\t\\treturn",{"2":{"353":1,"722":1}}],["\\t\\t",{"2":{"350":4,"353":2,"703":2,"715":7,"718":1,"721":14,"722":1,"723":10,"724":9,"727":1,"728":1,"797":3,"829":3,"877":1,"1014":3,"1124":6,"1125":4,"1127":3,"1128":2,"1129":5,"1130":1,"1135":1,"1136":3,"1137":2,"1138":2,"1139":4,"1141":4,"1142":1,"1145":2,"1147":2,"1179":1}}],["\\trules",{"2":{"1136":2,"1137":1}}],["\\tremote",{"2":{"1142":1}}],["\\tref",{"2":{"1142":1}}],["\\tretry",{"2":{"1132":3,"1148":1}}],["\\treturn",{"2":{"671":1}}],["\\tres",{"2":{"350":3,"723":1}}],["\\troot",{"2":{"325":1,"710":1}}],["\\timage",{"2":{"1148":1}}],["\\tinherit",{"2":{"1148":2}}],["\\tinterface",{"2":{"728":1}}],["\\tinterval",{"2":{"728":1}}],["\\tindex",{"2":{"325":1,"710":1}}],["\\tif",{"2":{"350":1,"726":1}}],["\\tcache",{"2":{"1138":2}}],["\\tcbs",{"2":{"950":1}}],["\\tcgroup",{"2":{"728":1}}],["\\tcontext",{"2":{"1018":1,"1021":1}}],["\\tconst",{"2":{"338":1,"354":7,"724":1}}],["\\tconsole",{"2":{"338":1,"350":1}}],["\\tcolor",{"2":{"350":1}}],["\\tcreatejsonp",{"2":{"338":1}}],["\\t",{"2":{"325":1,"338":1,"350":16,"353":2,"354":27,"603":1,"629":1,"651":1,"652":2,"671":2,"703":2,"709":13,"711":5,"712":8,"713":7,"715":2,"716":2,"718":18,"720":2,"721":1,"722":1,"723":2,"724":2,"725":8,"726":12,"727":2,"728":10,"771":1,"772":3,"797":6,"828":1,"829":5,"830":3,"831":3,"840":3,"845":1,"847":2,"849":1,"850":1,"858":1,"877":2,"932":3,"937":3,"941":3,"942":1,"950":1,"951":1,"954":3,"955":7,"1014":6,"1018":1,"1022":7,"1034":1,"1083":1,"1125":4,"1127":1,"1128":1,"1141":2,"1142":3,"1146":1,"1171":2,"1172":1,"1208":2,"1214":5,"1215":1,"1217":1,"1232":3}}],["某个函数内部的测试覆盖率",{"2":{"872":1}}],["某个功能模块",{"2":{"665":1}}],["某个具体的请求",{"2":{"414":1}}],["某个数据流的帧因为网络问题或其他原因无法及时传输到对端时",{"2":{"324":1}}],["某一个花销很大的操作",{"2":{"198":1,"748":1}}],["来自官方的解释",{"2":{"1098":1}}],["来自同一个",{"2":{"532":1}}],["来覆盖原来的值",{"2":{"1055":1}}],["来获取和分享",{"2":{"1012":1}}],["来实现镜像层之间的共享和复用",{"2":{"997":1}}],["来验证它的响应式",{"2":{"963":1}}],["来表示是计算属性",{"2":{"934":1}}],["来证明下以上的想法",{"2":{"933":1}}],["来缓存计算属性的值",{"2":{"932":1}}],["来进行增量打包",{"2":{"814":1}}],["来管理仓库",{"2":{"814":1}}],["来管理对象的创建和依赖关系",{"2":{"601":1}}],["来达到或者完善它的整个流程",{"2":{"810":1}}],["来弥补纯js语言的性能短板",{"2":{"784":1}}],["来设置",{"2":{"720":1}}],["来构造一个普通对象",{"2":{"573":1}}],["来看effect的实现",{"2":{"964":1}}],["来看它的实现",{"2":{"939":1}}],["来看看dep的实现",{"2":{"954":1}}],["来看看计算watcher实例化时会怎么样",{"2":{"932":1}}],["来看看原型结构",{"2":{"582":1}}],["来看个基本的例子",{"2":{"765":1}}],["来看一段代码",{"2":{"594":1}}],["来看下简单改造",{"2":{"961":1}}],["来看下实现",{"2":{"960":1}}],["来看下实例的原型结构",{"2":{"583":1}}],["来看下改造后的执行结果",{"2":{"951":1}}],["来看下teardown的实现",{"2":{"940":1}}],["来看下效果",{"2":{"765":1}}],["来看下child本身的原型",{"2":{"583":1}}],["来看下这种继承的原型结构",{"2":{"579":1}}],["来看下面一段代码",{"2":{"588":1}}],["来看下面这段代码",{"2":{"579":1}}],["来看下面代码run还是会正常执行",{"2":{"587":1}}],["来看下面代码",{"2":{"533":1,"578":1,"581":1,"583":1}}],["来看使用",{"2":{"574":1}}],["来看回收抓包记录",{"2":{"457":1}}],["来执行",{"2":{"532":1}}],["来用于数据操作",{"2":{"493":1}}],["来理解arp的简单概念",{"2":{"454":1}}],["来显示记录",{"2":{"414":1}}],["来心跳检测是否还处于连接状态",{"2":{"384":1}}],["来避免历史或其他连接的错误问题",{"2":{"378":1}}],["来确定子网的数量和大小",{"2":{"364":1}}],["来勾引你点击",{"2":{"352":1}}],["来动态地读取消息体一部分一部分的返回内容",{"2":{"341":1}}],["来传输",{"2":{"324":1}}],["来支持背景图",{"2":{"246":1}}],["连接到外部服务器并运行构建",{"2":{"1168":1}}],["连接到刚刚的node",{"2":{"400":1}}],["连接虚拟机并在上面运行构建",{"2":{"1164":1}}],["连接最小数",{"2":{"725":1}}],["连接方式为",{"2":{"400":1}}],["连接状态等等",{"2":{"383":1}}],["连接队列",{"0":{"380":1}}],["连接与终止",{"0":{"377":1},"1":{"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1}}],["连接建立成功后",{"2":{"354":1}}],["连接请求",{"2":{"354":1}}],["连接是长久保持的",{"2":{"354":1}}],["连接上可以并发处理多个数据流",{"2":{"324":1}}],["连接上同时传输多个数据流",{"2":{"324":1}}],["连接上同时传输多个请求和响应",{"2":{"324":1}}],["连接上并发处理",{"2":{"324":1}}],["连接",{"2":{"324":1,"400":1,"702":1}}],["连接被强行关闭",{"2":{"97":1}}],["逐行jpeg",{"2":{"718":1}}],["逐渐增加了新的特性和功能",{"2":{"321":1}}],["逐个成员依次拷贝",{"2":{"26":1}}],["跨",{"2":{"1121":1}}],["跨多个模块",{"2":{"854":1}}],["跨平台支持",{"2":{"785":1}}],["跨站请求伪造攻击",{"2":{"349":1}}],["跨站请求伪造攻击等安全威胁",{"2":{"320":1}}],["跨站脚本攻击",{"2":{"349":1}}],["跨域是怎么产生的这里不再赘述",{"2":{"724":1}}],["跨域会先进行options请求",{"2":{"692":1}}],["跨域资源共享",{"2":{"336":1,"339":1}}],["跨域问题的本质是浏览器为了保护用户的安全而采取的安全策略同源策略",{"2":{"336":1}}],["跨域",{"0":{"336":1,"691":1},"1":{"337":1,"338":1,"339":1,"340":1,"692":1,"693":1}}],["跨域请求",{"2":{"190":1}}],["包吃包住就干了几年了",{"2":{"1232":1}}],["包版本",{"2":{"1187":1}}],["包的注册表名字是scope形式",{"2":{"1186":1}}],["包名",{"2":{"831":1,"1187":1}}],["包名会创建对应的子包",{"2":{"814":1}}],["包管理方案",{"0":{"812":1},"1":{"813":1,"814":1,"815":1}}],["包含项目名称的项目命名空间",{"2":{"1121":1}}],["包含了运行服务所需的所有信息",{"2":{"1020":1}}],["包含了大量的",{"2":{"1012":1}}],["包含了镜像的构建信息和运行时所需要的依赖项",{"2":{"997":1}}],["包含以下可选属性",{"2":{"949":1}}],["包含以下功能",{"2":{"771":1}}],["包含单测和组件测试",{"2":{"878":1}}],["包含请求的主要信息",{"2":{"729":1}}],["包含k8s图片",{"2":{"728":1}}],["包含",{"2":{"709":1,"1121":3}}],["包含自己的序列号seq=79和ack=125来确认对方最近一次发送的数据",{"2":{"457":1}}],["包含服务器的证书信息",{"2":{"333":1}}],["包含常见的头部键或键值",{"2":{"326":1}}],["包含一些警告信息",{"2":{"319":1}}],["包括协议和端口",{"2":{"1121":1}}],["包括协议tcp和udp等",{"2":{"309":1}}],["包括默认分支的流水线",{"2":{"1121":1}}],["包括镜像",{"2":{"1019":1}}],["包括已经停止的容器",{"2":{"1006":1}}],["包括基本架构",{"2":{"992":1}}],["包括不限于后端",{"2":{"991":1}}],["包括vue3",{"2":{"927":1}}],["包括缩进",{"2":{"837":1}}],["包括插件",{"2":{"786":1}}],["包括常见的前端开发语言",{"2":{"785":1}}],["包括语言支持",{"2":{"785":1}}],["包括语法高亮",{"2":{"785":1}}],["包括主题",{"2":{"785":1}}],["包括客户端和代理服务器",{"2":{"720":2}}],["包括请求方法",{"2":{"634":1}}],["包括ip首部和数据负载",{"2":{"367":1}}],["包括公钥和证书链",{"2":{"333":1}}],["包括支持多种请求方法",{"2":{"321":1}}],["包括建立物理连接",{"2":{"309":1}}],["包括需要登录",{"2":{"216":1}}],["包括空格",{"2":{"139":1,"888":1}}],["包括",{"2":{"122":1,"729":1,"872":1}}],["包括npm",{"2":{"96":1}}],["包括前台内容和后台管理系统",{"2":{"50":1}}],["包括自己",{"2":{"47":1,"553":1}}],["升级协议",{"2":{"354":1}}],["升级为",{"2":{"354":1}}],["升级为其他协议",{"2":{"319":1}}],["升序",{"2":{"81":1}}],["路径或远程文件到容器文件系统",{"2":{"1060":1}}],["路径匹配",{"2":{"715":1}}],["路径映射",{"0":{"861":1},"1":{"862":1,"863":1},"2":{"712":1}}],["路径前缀",{"2":{"695":1}}],["路径访问",{"2":{"695":1}}],["路径标识",{"2":{"688":1}}],["路径",{"2":{"316":1,"347":1,"414":1,"715":1}}],["路由",{"2":{"690":1,"718":1}}],["路由渲染",{"2":{"671":1}}],["路由配置",{"0":{"666":1}}],["路由定义",{"0":{"612":1}}],["路由前缀控制",{"2":{"611":1}}],["路由分组",{"0":{"611":1}}],["路由表",{"2":{"383":1}}],["路由器可以通过动态路由协议和静态路由配置来学习和维护路由表",{"2":{"371":1}}],["路由器根据数据包中的目标ip地址和路由表来选择最佳路径",{"2":{"371":1}}],["路由器的作用是实现不同网络之间的通信",{"2":{"371":1}}],["路由器通常位于不同的网络之间",{"2":{"371":1}}],["路由器",{"0":{"371":1},"2":{"371":1}}],["路由器会为内部网络中的每个设备分配一个私有ip地址",{"2":{"370":1}}],["路由器会直接返回目标主机的mac地址",{"2":{"296":1}}],["路由器也会维护一份路由表",{"2":{"296":1}}],["路由器等设备也会学习ip",{"2":{"296":1}}],["路由器等设备接收到arp请求后",{"2":{"296":1}}],["路由文件",{"2":{"54":1}}],["路由守卫",{"2":{"53":1}}],["客户端",{"2":{"977":1,"993":1,"1080":1}}],["客户端拿到地址就可以访问了",{"2":{"770":1}}],["客户端拿到此值后会对值进行验证",{"2":{"354":1}}],["客户端请求主体信息的临时文件名",{"2":{"729":1}}],["客户端的端口",{"2":{"729":1}}],["客户端的ip地址",{"2":{"729":1}}],["客户端在该日期之前可以缓存响应",{"2":{"720":1}}],["客户端会再发送ack报文",{"2":{"457":1}}],["客户端也进入closed状态",{"2":{"457":1}}],["客户端进入fin",{"2":{"457":1}}],["客户端再发送数据到服务端",{"2":{"456":1}}],["客户端接接收后知道服务端的接收能力正常",{"2":{"456":1}}],["客户端接收到后",{"2":{"458":1}}],["客户端接收到后会在发送ack=126的ack报文",{"2":{"457":1}}],["客户端接收到了服务端的syn数据包和ack包后",{"2":{"456":1}}],["客户端接收到服务器发送的消息后",{"2":{"333":1}}],["客户端接收到服务器发送的",{"2":{"333":1}}],["客户端抓包",{"0":{"422":1,"438":1}}],["客户端建立通信将客户端的请求数据发送服务器",{"2":{"411":1}}],["客户端和服务端可以运行在同一台机器上",{"2":{"993":1,"1080":1}}],["客户端和服务端维护维护一份动态字典表",{"2":{"326":1}}],["客户端和服务端维护一份相同的静态字典表",{"2":{"326":1}}],["客户端和服务器之间的连接就建立了",{"2":{"380":1}}],["客户端和服务器可以发送文本",{"2":{"354":1}}],["客户端和服务器就可以进行实时的双向通信了",{"2":{"354":1}}],["客户端随机生成的字符串",{"2":{"354":1}}],["客户端通过",{"2":{"354":1}}],["客户端通过发送请求到服务器来获取资源",{"2":{"315":1}}],["客户端可以使用范围请求来获取特定的时间段内的数据",{"2":{"344":1}}],["客户端使用服务器的公钥和dh密钥交换的临时公钥",{"2":{"333":1}}],["客户端使用会话密钥加密消息发送一个会话摘要",{"2":{"332":1}}],["客户端发送数据到服务端",{"2":{"456":1}}],["客户端发送一个",{"2":{"333":4}}],["客户端发送问候消息",{"2":{"332":1}}],["客户端从证书中取出公钥",{"2":{"332":1}}],["客户端根据ca机构验证证书的合法性",{"2":{"332":1}}],["客户端缓存的资源是最新的",{"2":{"317":1}}],["客户只需要和适配器打交道",{"2":{"206":1,"756":1}}],["期间会将源mac地址修改为路由器另一出口网卡的mac地址",{"2":{"311":1}}],["期望username为string",{"2":{"232":1}}],["期望的效果是子元素的中心居中显示",{"2":{"12":1}}],["链接文案语义化个性化吸引用户",{"2":{"778":1}}],["链接数据库",{"2":{"54":1}}],["链路层将添加以源mac地址和目标mac地址等信息为首部",{"2":{"311":1}}],["形成数据段",{"2":{"311":1}}],["高质量的应用程序",{"2":{"851":1}}],["高质量的代码可以促进团队协作和知识共享",{"2":{"824":1}}],["高质量的代码应具有良好的可读性",{"2":{"824":1}}],["高可靠性",{"2":{"705":1}}],["高可扩展性",{"2":{"705":1}}],["高性能",{"2":{"705":1}}],["高亮或者聚焦",{"2":{"414":1}}],["高效的特性",{"2":{"1051":1}}],["高效的消息传输方式",{"2":{"343":1}}],["高效",{"2":{"387":1}}],["高级研究计划局",{"2":{"310":1}}],["高度",{"2":{"61":1}}],["信号",{"2":{"1008":1}}],["信号给容器中运行的主进程",{"2":{"1008":1}}],["信号编码",{"2":{"309":1}}],["信任证书信任刚刚添加的证书",{"2":{"422":1}}],["信息系统函数",{"2":{"83":1}}],["物理层以比特流的形式开始转发",{"2":{"311":1}}],["物理层",{"2":{"309":1}}],["电子邮件代理",{"2":{"706":1}}],["电子邮件",{"2":{"309":1}}],["互联网的通信都必须建立在同一标准上才能够正常进行",{"2":{"308":1}}],["互不影响",{"2":{"275":1,"1079":1}}],["城域网",{"2":{"307":1}}],["伪造成主机c",{"2":{"303":1}}],["伪代码",{"2":{"127":1}}],["与宿主机共享网络栈",{"2":{"1087":1}}],["与现有生态系统兼容",{"2":{"664":1}}],["与帧率有很大关系",{"2":{"536":1}}],["与http",{"2":{"327":2}}],["与",{"2":{"320":1,"345":1,"720":1,"729":2,"1121":2}}],["与arp相反",{"2":{"301":1}}],["与ip地址对应的mac地址",{"2":{"298":1}}],["动图演示",{"2":{"877":1,"879":1}}],["动图展示请求过程",{"2":{"343":1}}],["动画绘制等等",{"2":{"526":1}}],["动态处理timeout任务",{"2":{"661":1}}],["动态处理interval任务",{"2":{"661":1}}],["动态处理cron任务",{"2":{"661":1}}],["动态调度",{"0":{"661":1}}],["动态路由",{"2":{"612":1}}],["动态模块",{"0":{"609":1}}],["动态arp检测工具可以检测网络中的arp欺骗攻击",{"2":{"303":1}}],["动态arp表是由arp和计算机自动维护的",{"2":{"299":1}}],["动态arp表",{"0":{"299":1}}],["动态主机配置协议",{"2":{"301":1}}],["动动小手分享出去",{"2":{"10":1}}],["交由容器来管理",{"2":{"601":1}}],["交换两次后",{"2":{"559":1}}],["交换机转发给局域网内的主机",{"2":{"454":1}}],["交换机等会继续向上发送数据包直到找到位置",{"2":{"454":1}}],["交换机",{"2":{"298":1,"454":1}}],["交给物理层",{"2":{"311":1}}],["交互运行",{"2":{"1004":1}}],["交互式注册看下方图",{"2":{"1156":1}}],["交互式注册",{"0":{"1156":1}}],["交互式",{"2":{"797":1,"1014":1}}],["交互",{"0":{"291":1},"2":{"854":1}}],["操作系统的包",{"2":{"1208":1}}],["操作系统的一种机制",{"2":{"1203":1}}],["操作系统启动后",{"2":{"997":1}}],["操作简单透明",{"2":{"1051":1}}],["操作等策略",{"2":{"762":1}}],["操作数据库等都属于macrotask",{"2":{"532":1}}],["操作数据库的语句时",{"2":{"71":1}}],["操作码",{"2":{"454":1}}],["操作类型",{"2":{"297":1}}],["硬件地址大小",{"2":{"454":1}}],["硬件地址类型",{"2":{"297":1}}],["硬件类型",{"2":{"297":1,"454":1}}],["圆弧",{"0":{"285":1}}],["圆周率",{"2":{"83":1}}],["测",{"2":{"491":3}}],["测量文字宽度",{"2":{"284":1}}],["测试代码",{"2":{"1191":1}}],["测试代码条件分支比例",{"2":{"874":1}}],["测试环境和生产环境",{"2":{"1017":1}}],["测试框架中",{"2":{"881":1}}],["测试外观",{"2":{"879":1}}],["测试数据",{"2":{"878":1}}],["测试用例文件",{"2":{"878":1}}],["测试的开源测试框架",{"2":{"876":1}}],["测试的文件",{"2":{"874":1}}],["测试vue组件",{"2":{"875":2}}],["测试中被执行代码行数比例",{"2":{"874":1}}],["测试中被执行函数比例",{"2":{"874":1}}],["测试中被执行的代码语句的比例",{"2":{"874":1}}],["测试覆盖率",{"0":{"874":1},"2":{"874":2}}],["测试异步代码",{"2":{"866":1,"867":1,"868":1}}],["测试整个应用程序的功能和流程",{"2":{"854":1}}],["测试和文档化",{"2":{"678":1}}],["测试和故障排查",{"2":{"361":1}}],["测试相关",{"2":{"665":1}}],["测试一下不同类型装饰器的执行顺序是如何的",{"2":{"233":1}}],["测试结束后",{"2":{"219":1}}],["测试淘宝网站",{"2":{"218":1}}],["测试某网站",{"0":{"216":1}}],["测试",{"0":{"219":1},"2":{"64":1,"491":3,"494":1,"665":1,"708":1,"797":3,"801":1}}],["测试文件修改如下",{"2":{"864":1}}],["测试文件",{"2":{"54":1}}],["描边文字",{"2":{"284":1}}],["描述长度限制为前",{"2":{"1121":1}}],["描述等",{"2":{"1099":1}}],["描述子元素",{"2":{"850":1}}],["描述button的不同状态",{"2":{"850":1}}],["描述信息等",{"2":{"688":1}}],["描述",{"2":{"139":1,"317":1,"504":1,"888":1,"1121":1,"1122":1,"1159":1}}],["填充文字",{"2":{"284":1}}],["填充闭合路径",{"2":{"283":1}}],["填写对应的角色名",{"2":{"1099":1}}],["填写值",{"2":{"77":1}}],["填写的验证码进行对比",{"2":{"61":1}}],["恢复至上一个save状态",{"2":{"283":1}}],["增量标记",{"0":{"563":1},"1":{"564":1,"565":1},"2":{"559":1}}],["增量编译",{"2":{"281":1}}],["增强网络安全性",{"2":{"370":1}}],["增强了安全性和性能",{"2":{"329":1}}],["增加确实的测试或者矫正已存在的测试",{"2":{"789":1}}],["增加新的特征",{"2":{"789":1}}],["增加最终图像的清晰度",{"2":{"718":1}}],["增加速度比较快",{"2":{"393":1}}],["增加一个eventsinks",{"2":{"195":1,"745":1}}],["增加缩进",{"2":{"157":1}}],["画圆",{"2":{"285":1}}],["画",{"2":{"279":1}}],["绘制矩形",{"2":{"283":1}}],["绘制图形轮廓",{"2":{"283":1}}],["绘制",{"2":{"279":1}}],["绘制顺序",{"2":{"279":1}}],["光栅化位图",{"2":{"279":1}}],["光栅",{"2":{"279":1}}],["几秒几毫秒",{"2":{"1078":1}}],["几何形状",{"2":{"279":1}}],["几个重要概念",{"2":{"144":1,"893":1}}],["嗅探mime",{"2":{"279":1}}],["网易",{"2":{"1083":1}}],["网址语义化",{"2":{"778":1}}],["网上各大平台关于它的文章也是成百上千质量参差不一",{"2":{"523":1}}],["网卡上没了vip",{"2":{"728":1}}],["网卡",{"2":{"452":1,"728":1}}],["网速配置",{"2":{"415":1}}],["网速",{"2":{"414":1}}],["网页七大断点技巧",{"0":{"404":1}}],["网页浏览等",{"2":{"309":1}}],["网关192",{"2":{"454":1}}],["网关或路由器等设备接收到广播包后",{"2":{"454":1}}],["网关也具有地址转换和防火墙等功能",{"2":{"371":1}}],["网关的作用是实现不同网络之间的通信",{"2":{"371":1}}],["网关通常是一台计算机或路由器",{"2":{"371":1}}],["网关",{"0":{"371":1},"2":{"371":1}}],["网关等",{"2":{"298":1}}],["网段等等",{"2":{"312":1}}],["网络接口",{"2":{"1217":1}}],["网络接口主要告诉wireshark要抓取哪个接口的网络数据包如",{"2":{"453":1}}],["网络组件",{"0":{"1217":1}}],["网络列表",{"0":{"1088":1}}],["网络隔离等",{"2":{"1087":1}}],["网络驱动实现高级的网络功能",{"2":{"1087":1}}],["网络中",{"2":{"1087":2}}],["网络中真实存在的ip地址",{"2":{"361":1}}],["网络是一种特殊的网络类型",{"2":{"1087":1}}],["网络是",{"2":{"1087":1}}],["网络类型",{"0":{"1087":1}}],["网络的核心原理是通过创建网络命名空间和虚拟网络设备来实现容器间的网络隔离和通信",{"2":{"1085":1,"1091":1}}],["网络的基本配置",{"2":{"1022":1}}],["网络和卷",{"2":{"1030":1,"1031":2}}],["网络和进程空间",{"2":{"1003":1}}],["网络其实都是类似",{"2":{"1022":1}}],["网络",{"2":{"1019":1,"1022":2}}],["网络设置",{"2":{"1017":1}}],["网络资源请求如ajax请求",{"2":{"532":1}}],["网络进程",{"2":{"526":1}}],["网络线程协调执行异步回调",{"2":{"525":1}}],["网络管理员",{"2":{"449":1}}],["网络管理员需要根据网络规模和需求",{"2":{"364":1}}],["网络地址转换",{"2":{"370":1}}],["网络掩码必须和ip地址一起使用",{"2":{"363":1}}],["网络部分用1表示",{"2":{"363":1}}],["网络划分一般遵循以下规则",{"2":{"364":1}}],["网络划分可以实现网络地址的细分",{"2":{"362":1}}],["网络划分指的是将一个较大的ip地址空间划分成多个较小的子网",{"2":{"362":1}}],["网络划分",{"0":{"362":1},"1":{"363":1,"364":1}}],["网络同源",{"2":{"336":1}}],["网络层去掉ip首部给到传输层",{"2":{"311":1}}],["网络层arp协议会探测源ip地址的mac地址",{"2":{"311":1}}],["网络层负责数据包的路由和寻址",{"2":{"310":1}}],["网络层",{"2":{"309":1,"310":1,"312":1}}],["网络层次划分",{"0":{"308":1},"1":{"309":1,"310":1}}],["网络协议是否正确等",{"2":{"361":1}}],["网络协议是计算机之间进行数据交换的一类规则协议",{"2":{"307":1}}],["网络协议层次划分的两个经典代表",{"2":{"308":1}}],["网络请求等异步任务",{"2":{"536":1}}],["网络请求线程等等",{"2":{"526":1}}],["网络请求",{"2":{"276":1,"528":1,"532":1,"854":1}}],["网站层析结构",{"2":{"778":1}}],["网站会给出一份性能测试监控报告",{"2":{"220":1}}],["网站也让我感到种种好奇",{"2":{"123":1}}],["您可以使用",{"2":{"1186":1}}],["您可以向极狐gitlab",{"2":{"1169":1}}],["您的构建所需的所有必须依赖项都需要手动安装在极狐gitlab",{"2":{"1163":1}}],["您也可以将本博客分享出去",{"2":{"271":1,"991":1}}],["您还可以通过设置",{"2":{"115":1}}],["麻烦您在github给我个star",{"2":{"271":1,"991":1}}],["协调作业的",{"2":{"1121":1}}],["协议的",{"2":{"1062":1}}],["协议的版本号",{"2":{"354":1}}],["协议相关的参数",{"2":{"709":1}}],["协议地址大小",{"2":{"454":1}}],["协议方面的选项通常告诉其抓取什么协议",{"2":{"453":1}}],["协议号和标识符等信息来确定这些分片属于同一个原始数据包",{"2":{"369":1}}],["协议是互联网通信中最重要的协议之一",{"2":{"357":1}}],["协议是用于保护网络通信安全的协议",{"2":{"329":1}}],["协议向服务器发送",{"2":{"354":1}}],["协议通常会和ip协议一起使用",{"2":{"357":1}}],["协议通常使用",{"2":{"315":1}}],["协议通过在",{"2":{"339":1}}],["协议进行跨域请求",{"2":{"339":1}}],["协议版本号",{"2":{"333":1}}],["协议版本",{"2":{"332":1}}],["协议版本发送给服务端",{"2":{"332":1}}],["协议版本的迭代",{"2":{"329":1}}],["协议得以诞生并逐渐取代了",{"2":{"329":1}}],["协议存在一些安全漏洞和缺陷",{"2":{"329":1}}],["协议工作在传输层之上",{"2":{"329":1}}],["协议和",{"2":{"329":1}}],["协议对数据进行加密和认证",{"2":{"328":1}}],["协议中",{"2":{"324":1,"339":1,"354":1}}],["协议用于电子邮件传输等等",{"2":{"307":1}}],["协议用于网页浏览",{"2":{"307":1}}],["协议用于互联网通信",{"2":{"307":1}}],["协议",{"2":{"306":1,"314":1,"316":1,"329":1,"367":1,"373":1,"396":1,"432":1,"691":1,"1062":1}}],["协议类型",{"2":{"297":1,"367":1,"454":1}}],["协议以及提升自己技能方面的记录",{"2":{"271":1}}],["协商缓存等等",{"2":{"335":1}}],["协商缓存",{"2":{"168":1}}],["何处寻芳迹",{"2":{"271":1}}],["落叶满空山",{"2":{"271":1}}],["尽管使用切片传输会解决前面的问题",{"2":{"772":1}}],["尽管使用了http2但在一个连接上无法发挥其优势",{"2":{"764":1}}],["尽管es6有class这种类似java的语法",{"2":{"573":1}}],["尽管server可能已经被关闭了",{"2":{"382":1}}],["尽管可以使用keepalive减少tcp的握手",{"2":{"324":1}}],["尽管有着一些限制和缺点",{"2":{"322":1}}],["尽量在一行中定义完所有的label",{"2":{"1057":1}}],["尽量不要污染全局共用的模块",{"2":{"666":1}}],["尽量避免使用过大的ip数据包",{"2":{"369":1}}],["尽量使用仅合成动画",{"2":{"280":1}}],["尽量匹配少",{"2":{"150":1,"899":1}}],["尽量匹配多的",{"2":{"150":1,"899":1}}],["尽力更新中",{"2":{"252":1,"271":1,"991":1}}],["转发",{"0":{"1205":1}}],["转译器",{"0":{"858":1}}],["转为为",{"2":{"497":2}}],["转账",{"2":{"351":1}}],["转义不会影响页面渲染时",{"2":{"350":1}}],["转化",{"2":{"254":1}}],["转载须知",{"0":{"1226":1},"2":{"252":1,"271":1,"991":1}}],["转换jsx",{"2":{"858":1}}],["转换typescript",{"2":{"858":1}}],["转换器等等",{"2":{"670":1}}],["转换失败默认10",{"2":{"646":1}}],["转换为与",{"2":{"829":1}}],["转换为string",{"2":{"643":1}}],["转换为",{"2":{"643":3,"646":1}}],["转换为一个",{"2":{"32":1}}],["转换流",{"2":{"517":1}}],["转换",{"2":{"494":1}}],["转换前第几列",{"2":{"410":1}}],["转换前第几行",{"2":{"410":1}}],["转换前所有的变量名和属性名",{"2":{"410":1}}],["转换后代码的第几列",{"2":{"410":1}}],["转换后的文件名",{"2":{"410":1}}],["转换后并不能兼容数字所以是nan",{"2":{"43":1,"549":1}}],["转换规则1",{"2":{"44":1,"550":1}}],["⚪",{"2":{"251":1}}],["⚫",{"2":{"251":1}}],["✅",{"2":{"251":1,"801":2}}],["➰",{"2":{"251":1}}],["☑️",{"2":{"251":1}}],["➗",{"2":{"251":1}}],["➖",{"2":{"251":1}}],["➕",{"2":{"251":1}}],["⭕",{"2":{"251":1}}],["️",{"2":{"251":4}}],["️⃣",{"2":{"251":1}}],["❌",{"2":{"251":1,"431":1}}],["™️",{"2":{"251":1}}],["®️",{"2":{"251":1}}],["©️",{"2":{"251":1}}],["♻️",{"2":{"251":1,"801":3}}],["❎",{"2":{"251":1}}],["⛎",{"2":{"251":1}}],["♓",{"2":{"251":1}}],["♒",{"2":{"251":1}}],["♑",{"2":{"251":1}}],["♐",{"2":{"251":1}}],["♏",{"2":{"251":1}}],["♎",{"2":{"251":1}}],["♍",{"2":{"251":1}}],["♌",{"2":{"251":1}}],["♋",{"2":{"251":1}}],["♊",{"2":{"251":1}}],["♉",{"2":{"251":1}}],["♈",{"2":{"251":1}}],["✴️",{"2":{"251":1}}],["✳️",{"2":{"251":1}}],["⛔",{"2":{"251":1}}],["ⓜ️",{"2":{"251":1}}],["㊗️",{"2":{"251":1}}],["㊙️",{"2":{"251":1}}],["♿",{"2":{"251":1}}],["ℹ️",{"2":{"251":1}}],["⏩",{"2":{"251":1}}],["⏪️",{"2":{"801":2}}],["⏪",{"2":{"251":1}}],["↕️",{"2":{"251":1}}],["↔️",{"2":{"251":1}}],["↪️",{"2":{"251":1}}],["↩️",{"2":{"251":1}}],["⤴️",{"2":{"251":1}}],["⤵️",{"2":{"251":1}}],["⏫",{"2":{"251":1}}],["⏬",{"2":{"251":1}}],["↗️",{"2":{"251":1}}],["↖️",{"2":{"251":1}}],["⬆️",{"2":{"251":1}}],["➡️",{"2":{"251":1}}],["↘️",{"2":{"251":1}}],["↙️",{"2":{"251":1}}],["⬅️",{"2":{"251":1}}],["▶️",{"2":{"251":1}}],["⬇️",{"2":{"251":1}}],["◀️",{"2":{"251":1}}],["♨️",{"2":{"251":1}}],["⚠️",{"2":{"251":1}}],["⛽",{"2":{"251":1}}],["✈️",{"2":{"251":1}}],["⚓",{"2":{"251":1}}],["⛵",{"2":{"251":2}}],["⛲",{"2":{"251":1}}],["⛺",{"2":{"251":1}}],["⛪",{"2":{"251":1}}],["☕",{"2":{"251":1}}],["♦️",{"2":{"251":1}}],["♣️",{"2":{"251":1}}],["♥️",{"2":{"251":1}}],["♠️",{"2":{"251":1}}],["⛳",{"2":{"251":1}}],["⚾",{"2":{"251":1}}],["⚽",{"2":{"251":1}}],["✏️",{"2":{"251":1,"801":3,"857":1}}],["✒️",{"2":{"251":1}}],["✂️",{"2":{"251":1}}],["✉️",{"2":{"251":1}}],["➿",{"2":{"251":1}}],["⌚",{"2":{"251":1}}],["⏰",{"2":{"251":1}}],["⏳",{"2":{"251":1}}],["⌛",{"2":{"251":1}}],["☎️",{"2":{"251":2}}],["⛅",{"2":{"251":1}}],["🥚",{"2":{"251":1}}],["🪲",{"2":{"251":1}}],["🤘",{"2":{"251":1}}],["⚡️",{"2":{"801":3}}],["⚡",{"2":{"251":1}}],["⛄",{"2":{"251":1}}],["❄️",{"2":{"251":1}}],["☁️",{"2":{"251":1}}],["☔",{"2":{"251":1}}],["☀️",{"2":{"251":1}}],["☝️",{"2":{"251":1}}],["✋",{"2":{"251":2}}],["✌️",{"2":{"251":1}}],["✊",{"2":{"251":1}}],["🅾️",{"2":{"251":1}}],["🆎",{"2":{"251":1}}],["🅱️",{"2":{"251":1}}],["🅰️",{"2":{"251":1}}],["🆚",{"2":{"251":1}}],["🆔",{"2":{"251":1}}],["🆘",{"2":{"251":1}}],["🆑",{"2":{"251":1}}],["🉐",{"2":{"251":1}}],["🉑",{"2":{"251":1}}],["🅿️",{"2":{"251":1}}],["🈂️",{"2":{"251":1}}],["🈵",{"2":{"251":1}}],["🈁",{"2":{"251":1}}],["🎦",{"2":{"251":1}}],["🆖",{"2":{"251":1}}],["🆓",{"2":{"251":1}}],["🆒",{"2":{"251":1}}],["🆙",{"2":{"251":1}}],["🆕",{"2":{"251":1}}],["🆗",{"2":{"251":1}}],["🇩🇪",{"2":{"251":1}}],["🇬🇧",{"2":{"251":2}}],["🇷🇺",{"2":{"251":1}}],["🇮🇹",{"2":{"251":1}}],["🇪🇸",{"2":{"251":1}}],["🇫🇷",{"2":{"251":1}}],["🇺🇸",{"2":{"251":1}}],["🇨🇳",{"2":{"251":1}}],["🇰🇷",{"2":{"251":1}}],["🇯🇵",{"2":{"251":1}}],["🎭",{"2":{"251":1}}],["🎪",{"2":{"251":1}}],["🏮",{"2":{"251":1}}],["🎌",{"2":{"251":1}}],["🏁",{"2":{"251":1}}],["🎰",{"2":{"251":1}}],["🏧",{"2":{"251":1}}],["🎫",{"2":{"251":1}}],["🎢",{"2":{"251":1}}],["🎡",{"2":{"251":1}}],["🌈",{"2":{"251":1}}],["🎠",{"2":{"251":1}}],["🌉",{"2":{"251":1}}],["🌠",{"2":{"251":1}}],["🌅",{"2":{"251":1}}],["🌄",{"2":{"251":1}}],["🏭",{"2":{"251":1}}],["🏰",{"2":{"251":1}}],["🏯",{"2":{"251":1}}],["🌆",{"2":{"251":1}}],["🌇",{"2":{"251":1}}],["🏤",{"2":{"251":1}}],["🏬",{"2":{"251":1}}],["🏨",{"2":{"251":1}}],["🏩",{"2":{"251":1}}],["🏪",{"2":{"251":1}}],["🏦",{"2":{"251":1}}],["🏥",{"2":{"251":1}}],["🏣",{"2":{"251":1}}],["🏢",{"2":{"251":1}}],["🏫",{"2":{"251":1}}],["🏡",{"2":{"251":1}}],["🏠",{"2":{"251":1}}],["🌽",{"2":{"251":1}}],["🍅",{"2":{"251":1}}],["🍆",{"2":{"251":1}}],["🍠",{"2":{"251":1}}],["🍍",{"2":{"251":1}}],["🍐",{"2":{"251":1}}],["🍌",{"2":{"251":1}}],["🍈",{"2":{"251":1}}],["🍑",{"2":{"251":1}}],["🍓",{"2":{"251":1}}],["🍉",{"2":{"251":1}}],["🍇",{"2":{"251":1}}],["🍒",{"2":{"251":1}}],["🍋",{"2":{"251":1}}],["🍊",{"2":{"251":1}}],["🍏",{"2":{"251":1}}],["🍎",{"2":{"251":1}}],["🍯",{"2":{"251":1}}],["🍭",{"2":{"251":1}}],["🍬",{"2":{"251":1}}],["🍫",{"2":{"251":1}}],["🍪",{"2":{"251":1}}],["🍰",{"2":{"251":1}}],["🎂",{"2":{"251":1}}],["🍧",{"2":{"251":1}}],["🍨",{"2":{"251":1}}],["🍦",{"2":{"251":1}}],["🍮",{"2":{"251":1}}],["🍩",{"2":{"251":1}}],["🍞",{"2":{"251":1}}],["🍡",{"2":{"251":1}}],["🍢",{"2":{"251":1}}],["🍲",{"2":{"251":1}}],["🍜",{"2":{"251":1}}],["🍚",{"2":{"251":1}}],["🍘",{"2":{"251":1}}],["🍙",{"2":{"251":1}}],["🍥",{"2":{"251":1}}],["🍣",{"2":{"251":1}}],["🍱",{"2":{"251":1}}],["🍤",{"2":{"251":1}}],["🍛",{"2":{"251":1}}],["🍝",{"2":{"251":1}}],["🍖",{"2":{"251":1}}],["🍗",{"2":{"251":1}}],["🍟",{"2":{"251":1}}],["🍔",{"2":{"251":1}}],["🍕",{"2":{"251":1}}],["🍴",{"2":{"251":1}}],["🍷",{"2":{"251":1}}],["🍹",{"2":{"251":1}}],["🍸",{"2":{"251":1}}],["🍻",{"2":{"251":1}}],["🍺",{"2":{"251":1}}],["🍼",{"2":{"251":1}}],["🍶",{"2":{"251":1}}],["🍵",{"2":{"251":1}}],["🎣",{"2":{"251":1}}],["🌂",{"2":{"251":1}}],["🎩",{"2":{"251":1}}],["🎀",{"2":{"251":1}}],["🎽",{"2":{"251":1}}],["🎸",{"2":{"251":1}}],["🎷",{"2":{"251":1}}],["🎺",{"2":{"251":1}}],["🎧",{"2":{"251":1}}],["🎤",{"2":{"251":1}}],["🎨",{"2":{"251":1}}],["🎬",{"2":{"251":1}}],["🀄",{"2":{"251":1}}],["🎯",{"2":{"251":1}}],["🎲",{"2":{"251":1}}],["🎴",{"2":{"251":1}}],["🃏",{"2":{"251":1}}],["🎮",{"2":{"251":1}}],["🎻",{"2":{"251":1}}],["🎹",{"2":{"251":1}}],["🎼",{"2":{"251":1}}],["🏆",{"2":{"251":1}}],["🎿",{"2":{"251":1}}],["🏄",{"2":{"251":1}}],["🏊",{"2":{"251":1}}],["🏂",{"2":{"251":1}}],["🏇",{"2":{"251":1}}],["🎳",{"2":{"251":1}}],["🏉",{"2":{"251":1}}],["🎱",{"2":{"251":1}}],["🎾",{"2":{"251":1}}],["🏀",{"2":{"251":1}}],["🏈",{"2":{"251":1}}],["🎥",{"2":{"251":1}}],["🎈",{"2":{"251":1}}],["🎊",{"2":{"251":1}}],["🎉",{"2":{"251":1,"801":3,"806":1}}],["🎋",{"2":{"251":1}}],["🎁",{"2":{"251":1}}],["🎄",{"2":{"251":1}}],["🎅",{"2":{"251":1}}],["🎃",{"2":{"251":1}}],["🎑",{"2":{"251":1}}],["🎐",{"2":{"251":1}}],["🎇",{"2":{"251":1}}],["🎆",{"2":{"251":1}}],["🎏",{"2":{"251":1}}],["🎓",{"2":{"251":1}}],["🎒",{"2":{"251":1}}],["🎎",{"2":{"251":1}}],["🎍后续会不断补充相关知识",{"2":{"703":1}}],["🎍",{"2":{"251":1}}],["🌌",{"2":{"251":1}}],["🌋",{"2":{"251":1}}],["🌏",{"2":{"251":1}}],["🌎",{"2":{"251":1}}],["🌍",{"2":{"251":1}}],["🌛",{"2":{"251":1}}],["🌜",{"2":{"251":1}}],["🌘",{"2":{"251":1}}],["🌗",{"2":{"251":1}}],["🌖",{"2":{"251":1}}],["🌕",{"2":{"251":1}}],["🌔",{"2":{"251":2}}],["🌓",{"2":{"251":1}}],["🌒",{"2":{"251":1}}],["🌑",{"2":{"251":1}}],["🌚",{"2":{"251":1}}],["🌝",{"2":{"251":1}}],["🌞",{"2":{"251":1}}],["🌐",{"2":{"251":1}}],["🌾",{"2":{"251":1}}],["🌼",{"2":{"251":1}}],["🌱",{"2":{"251":1}}],["🌰",{"2":{"251":1}}],["🌳",{"2":{"251":1}}],["🌲",{"2":{"251":1}}],["🌴",{"2":{"251":1}}],["🌵",{"2":{"251":1}}],["🍄",{"2":{"251":1}}],["🌿",{"2":{"251":1}}],["🍂",{"2":{"251":1}}],["🍃",{"2":{"251":1}}],["🍁",{"2":{"251":1}}],["🌺",{"2":{"251":1}}],["🌻",{"2":{"251":1}}],["🌹",{"2":{"251":1}}],["🍀",{"2":{"251":1}}],["🌷",{"2":{"251":1}}],["🌸",{"2":{"251":1}}],["🌊",{"2":{"251":1}}],["🌁",{"2":{"251":1}}],["🌀",{"2":{"251":1}}],["🏃",{"2":{"251":2}}],["🎵",{"2":{"251":1}}],["🎶",{"2":{"251":1}}],["🌟",{"2":{"251":1}}],["❔",{"2":{"251":1}}],["❕",{"2":{"251":1}}],["❓",{"2":{"251":1}}],["❗",{"2":{"251":2}}],["⭐️⭐️⭐️⭐️⭐️",{"2":{"1066":1}}],["⭐",{"2":{"251":1}}],["✨",{"2":{"251":1,"800":1,"801":3,"860":1,"864":1}}],["❤️",{"2":{"251":1}}],["☺️",{"2":{"251":1}}],["判断当前的值是不是对象",{"2":{"960":1}}],["判断当前请求路由不需要鉴权直接放行",{"2":{"648":1}}],["判断索引是否合法",{"2":{"956":1}}],["判断参数的值",{"2":{"859":1}}],["判断有多种方式",{"2":{"726":1}}],["判断必须大于0",{"2":{"646":1}}],["判断类型",{"2":{"576":1}}],["判断节点是否相交",{"2":{"462":1}}],["判断某个节点在range里",{"2":{"462":1}}],["判断最小子网数",{"2":{"364":1}}],["判断是不是背景参数",{"2":{"249":1}}],["判断是否命中缓存",{"2":{"248":1}}],["判断是否过期用户",{"2":{"64":1}}],["判断指令是否具有backgroundimage",{"2":{"249":1}}],["判断时是否可以命中缓存",{"2":{"248":1}}],["滚动事件等等",{"2":{"527":1}}],["滚动时执行判断每个manager是否已经达到条件加载图片",{"2":{"247":1}}],["滚动到底部",{"2":{"166":1}}],["滚动到顶部",{"2":{"166":1}}],["兼容的形式的解析器",{"2":{"829":1}}],["兼容的的包装器",{"2":{"829":1}}],["兼容ipv4",{"2":{"366":1}}],["兼容处理",{"0":{"247":1}}],["兼容性也还不错",{"2":{"19":1}}],["兼容性也很好",{"2":{"12":1}}],["错误重试5次",{"2":{"771":1}}],["错误时",{"2":{"718":1}}],["错误的客户端请求",{"2":{"645":1}}],["错误图片",{"2":{"245":1,"718":1}}],["错误处理",{"0":{"118":1}}],["导出容器的文件系统为一个",{"2":{"1010":1}}],["导出的",{"2":{"1010":2}}],["导出当前模块的依赖以便其他模块可以使用",{"2":{"608":1}}],["导出插件",{"2":{"245":1}}],["导致空闲内存空间不连续",{"2":{"558":1}}],["导致也很难排查",{"2":{"408":1}}],["导入容器的文件系统为一个镜像",{"2":{"1010":1}}],["导入的镜像只包含容器的文件系统",{"2":{"1010":1}}],["导入",{"2":{"659":1}}],["导入user模块",{"2":{"607":1}}],["导入导出",{"0":{"1010":1}}],["导入导出功能便会发挥友好作用",{"2":{"430":1}}],["导入导出捕获记录",{"2":{"430":1}}],["导入导出记录",{"2":{"430":1}}],["导入或保存存档",{"2":{"430":1}}],["导航指南",{"0":{"1229":1},"1":{"1230":1,"1231":1}}],["导航和history操作",{"2":{"532":1}}],["导航线程",{"2":{"276":1}}],["导航",{"0":{"161":1}}],["渲染watcher",{"2":{"953":1}}],["渲染函数",{"2":{"951":1}}],["渲染模式",{"0":{"904":1}}],["渲染user",{"2":{"671":1}}],["渲染用户页面",{"2":{"671":1}}],["渲染错误页面",{"2":{"639":1}}],["渲染进程会为页面提供不同的线程来负责不同的任务",{"2":{"526":1}}],["渲染进程会包括很多线程",{"2":{"526":1}}],["渲染进程",{"2":{"526":1}}],["渲染进程渲染页面",{"2":{"276":1}}],["渲染时恶意代码直接渲染到页面上了",{"2":{"350":1}}],["渲染优化",{"0":{"280":1},"2":{"762":1}}],["渲染内核",{"0":{"277":1}}],["渲染dom图片",{"2":{"244":1}}],["渲染完毕了",{"2":{"199":1,"749":1}}],["抽象出来",{"2":{"242":1}}],["抽离成一个单独的store",{"2":{"208":1,"758":1}}],["抽离css",{"2":{"191":1}}],["抽离公共配置",{"2":{"190":1}}],["抽离公共代码块",{"2":{"187":1,"190":1}}],["抽离公共代码等等~",{"2":{"187":1}}],["省略了部分代码",{"2":{"954":1}}],["省略一大堆代码",{"2":{"954":1}}],["省略代码",{"2":{"944":1}}],["省略",{"2":{"773":1,"930":1,"934":3,"939":1,"940":2,"941":1,"942":1,"944":1,"945":1,"954":1,"955":1,"960":1,"964":2}}],["省略其它",{"2":{"769":1,"771":1}}],["省略其他pod",{"2":{"1218":1}}],["省略其他",{"2":{"640":1,"728":1,"857":1,"858":1,"955":1,"1021":1,"1022":1}}],["省略部分代码",{"2":{"237":3,"238":4,"239":1,"247":2,"932":3,"950":1,"954":1}}],["省略前面代码",{"2":{"232":1}}],["遍历当前user",{"2":{"940":1}}],["遍历所有收集了当前计算watcher的dep",{"2":{"932":1}}],["遍历",{"2":{"932":1}}],["遍历computed为每一个属性生成对应的watcher",{"2":{"932":1}}],["遍历builds将其作为buildentry方法参数执行",{"2":{"237":1}}],["遍历对象",{"2":{"33":1}}],["运维知识",{"2":{"1223":1}}],["运维等技术",{"2":{"991":1}}],["运用nest的强大架构能力让前端服务变得更加简单易用",{"2":{"664":1}}],["运行gitlab容器",{"2":{"1172":1}}],["运行gitlab",{"2":{"1171":1}}],["运行runner",{"0":{"1153":1}}],["运行作业的",{"2":{"1121":3}}],["运行后根据机器配置一般需要等待一段时间",{"2":{"1094":1}}],["运行hello",{"2":{"1082":1}}],["运行一个完整的操作系统",{"2":{"1079":1}}],["运行在操作系统之上的",{"2":{"1078":1}}],["运行在硬件之上",{"2":{"1078":1}}],["运行容器",{"2":{"1051":1,"1064":1,"1094":1}}],["运行",{"2":{"1038":1}}],["运行我们的serve静态服务",{"2":{"966":1}}],["运行完毕之后执行",{"2":{"881":2}}],["运行之前执行",{"2":{"881":2}}],["运行命令",{"2":{"718":1}}],["运行时",{"0":{"987":1},"2":{"525":1}}],["运行了不明来历的代码",{"2":{"350":1}}],["运行不同脚本用来构建不同版本的文件",{"2":{"237":1}}],["运算转换",{"0":{"46":1,"552":1}}],["运算符转换为number类型的规则",{"2":{"43":1,"549":1}}],["谈谈vue内部的运行机制",{"0":{"235":1},"1":{"236":1,"237":1,"238":1,"239":1}}],["响应式对比",{"0":{"965":1}}],["响应式对象确实收集了计算watcher和渲染watcher",{"2":{"933":1}}],["响应式原理本质是使用了proxy",{"2":{"957":1}}],["响应式核心",{"2":{"951":1}}],["响应式",{"2":{"948":1}}],["响应式遵循发布",{"2":{"946":1}}],["响应式懂了这里才不会迷茫",{"2":{"927":1}}],["响应式canonical",{"2":{"778":1}}],["响应中的内容转为小写",{"2":{"729":1}}],["响应头中的内容",{"2":{"729":1}}],["响应头部包括若干个字段和值",{"2":{"318":1}}],["响应头部和响应正文组成",{"2":{"318":1}}],["响应进行压缩",{"2":{"717":1}}],["响应码",{"2":{"716":1}}],["响应结束时打印相关耗时",{"2":{"634":1}}],["响应",{"2":{"518":1}}],["响应类型",{"2":{"436":1}}],["响应状态码",{"2":{"436":1}}],["响应会命中断点",{"2":{"434":1}}],["响应主体",{"2":{"413":1}}],["响应的传输路径",{"2":{"320":1}}],["响应的执行顺序也会按着从上往下定义的顺序执行",{"2":{"233":1}}],["响应首部字段",{"2":{"319":1}}],["响应报文",{"2":{"318":1}}],["响应报文由状态行",{"2":{"318":1}}],["响应正文通常包含响应的实际内容",{"2":{"318":1}}],["响应程序",{"2":{"64":1}}],["构造器",{"0":{"494":1}}],["构造器参数",{"2":{"233":1}}],["构造方法",{"0":{"487":1}}],["构造blob对象",{"2":{"485":1}}],["构造函数继承",{"0":{"578":1}}],["构造函数会生成一个新的对象",{"2":{"573":1}}],["构造函数创建你自己的流",{"2":{"508":1}}],["构造函数",{"0":{"483":1,"503":1,"510":1,"514":1,"573":1},"2":{"479":1,"499":2}}],["构建缓存可以加速镜像构建过程",{"2":{"1075":1}}],["构建时使用缓存",{"2":{"1075":1}}],["构建时会将构建上下文的文件全部上传到服务端",{"2":{"1071":1}}],["构建优化在生产环境中是非常必要的",{"2":{"1075":1}}],["构建优化",{"0":{"1075":1}}],["构建前端项目",{"0":{"1072":1},"1":{"1073":1,"1074":1}}],["构建是在服务端",{"2":{"1069":1}}],["构建上下文的大小会直接影响构建时间和构建过程中网络传输的数据量",{"2":{"1068":1}}],["构建上下文中包含的所有文件和目录都会被上传到",{"2":{"1068":1}}],["构建上下文通过docker",{"2":{"1068":1}}],["构建上下文",{"0":{"1068":1},"2":{"1069":1}}],["构建新版本的镜像时",{"2":{"1002":1}}],["构建方案",{"0":{"816":1},"1":{"817":1,"818":1,"819":1}}],["构建",{"2":{"801":1,"1027":1}}],["构建过程或辅助工具的变动",{"2":{"789":1}}],["构建和文档化",{"2":{"678":1}}],["构建对比差异",{"2":{"183":1}}],["构建流程中的特定时机注入扩展逻辑来改变构建结果或做你想要做的事情",{"2":{"172":1}}],["静态项目用node打包",{"2":{"1073":1}}],["静态项目",{"0":{"1073":1}}],["静态分析",{"2":{"842":1}}],["静态服务",{"0":{"712":1}}],["静态文件处理",{"2":{"705":1}}],["静态资源缓存",{"0":{"720":1}}],["静态资源压缩",{"2":{"690":1}}],["静态资源",{"0":{"694":1},"1":{"695":1,"696":1,"697":1,"698":1},"2":{"665":1}}],["静态资源也不一定存在同一个服务上",{"2":{"325":1}}],["静态资源文件夹",{"2":{"54":2}}],["静态arp表的管理比较困难",{"2":{"304":1}}],["静态arp表是手动配置的arp表",{"2":{"303":1}}],["静态arp表是由管理员手动设置的",{"2":{"300":1}}],["静态arp表",{"0":{"300":1}}],["静态属性",{"2":{"233":1}}],["私库搭建方式有很多",{"2":{"1092":1}}],["私有",{"2":{"1013":2}}],["私有仓库",{"0":{"1013":1}}],["私有registry",{"2":{"1011":1}}],["私有ip地址只在内部网络中使用",{"2":{"360":1}}],["私有属性装饰器",{"2":{"231":1}}],["私网地址",{"0":{"360":1}}],["私钥解密",{"2":{"332":1}}],["私钥",{"2":{"64":1}}],["唯一一处不一样的就是响应式对象不会直接收集render函数",{"2":{"934":1}}],["唯一一点不好就是收费",{"2":{"70":1}}],["唯一的区别就是",{"2":{"769":1}}],["唯一的名称",{"2":{"316":1}}],["唯一不同的是不同的视图对象对buffer的解析不同如",{"2":{"481":1}}],["唯一不同的就是key不同",{"2":{"231":1}}],["唯一标识符",{"2":{"244":1}}],["借用了parent的构造函数",{"2":{"580":1}}],["借用中间件机制",{"2":{"127":1}}],["借助reflect",{"2":{"227":1}}],["像很多骨折慢慢修养都是可以修复的",{"2":{"1232":1}}],["像一些面向对象语言如java",{"2":{"582":1}}],["像",{"2":{"404":1}}],["像素操作",{"0":{"290":1}}],["像素的图标",{"2":{"222":1}}],["像素和一个",{"2":{"222":1}}],["像==比较者可以为任意类型任意值",{"2":{"41":1,"547":1}}],["具备强大的路由和请求处理能力",{"2":{"664":1}}],["具有简单易用的",{"2":{"855":1}}],["具有广泛的插件生态系统",{"2":{"784":1}}],["具有非常高的性能",{"2":{"705":1}}],["具有user原型方法的对象",{"2":{"576":1}}],["具有更低的延迟和更好的拥塞控制",{"2":{"327":1}}],["具有一个",{"2":{"222":1}}],["具体配置文件如下",{"2":{"1034":1}}],["具体如下",{"2":{"993":1,"1080":1}}],["具体实现",{"0":{"954":1}}],["具体实现步骤如下",{"2":{"354":1}}],["具体修复的bug",{"2":{"797":1}}],["具体规则",{"2":{"797":1,"827":1}}],["具体步骤如下",{"2":{"352":1}}],["具体的方法在",{"2":{"955":1}}],["具体的使用方法不做介绍",{"2":{"772":1}}],["具体的也就是将所有的chunk按顺序写入同一个文件就可以了",{"2":{"770":1}}],["具体的请参考基础文章",{"2":{"669":1}}],["具体的大文件下载可以查看我的",{"2":{"521":1}}],["具体的字段这里就不解释了",{"2":{"350":1}}],["具体的密码学原理不做介绍",{"2":{"331":1}}],["具体是用户登录后服务器将会生成一个session对象",{"2":{"348":1}}],["具体过程如下",{"2":{"333":1}}],["具体来说",{"2":{"324":1,"842":1,"1066":1}}],["具体请看下表",{"2":{"26":1}}],["性能更好",{"2":{"957":1}}],["性能可以说特别好",{"2":{"814":1}}],["性能和可维护性",{"2":{"786":1}}],["性能和扩展性",{"2":{"329":1}}],["性能好的放前面之类",{"2":{"727":1}}],["性能问题",{"2":{"222":1}}],["性能优化越来越被重视",{"2":{"241":1}}],["性能优化",{"0":{"129":1},"2":{"801":2}}],["端点进行身份验证的令牌",{"2":{"1121":1}}],["端测我们要提供页面真实的模拟用户的交互等等",{"2":{"879":1}}],["端测访问的基本地址",{"2":{"878":1}}],["端测配置",{"2":{"878":1}}],["端测",{"2":{"878":1}}],["端测相对来说比较繁琐点",{"2":{"854":1}}],["端到端测试cypress会检测本地计算机安装的浏览器",{"2":{"877":1}}],["端到端测试",{"0":{"854":1,"876":1},"1":{"877":1,"878":1,"879":1,"880":1,"881":1,"882":1}}],["端到端校验机制确保数据的正确性",{"2":{"376":1}}],["端口映射到",{"2":{"1062":1}}],["端口映射到主机的",{"2":{"1018":1}}],["端口映射",{"2":{"1020":1}}],["端口映射等配置的管理更加方便和统一",{"2":{"1017":1}}],["端口等信息",{"2":{"1010":1}}],["端口选择9999",{"2":{"455":1}}],["端口为443",{"2":{"421":1}}],["端口对应node的debugger",{"2":{"399":1}}],["端口被占用",{"2":{"382":1}}],["端口访问nginx",{"2":{"382":1}}],["端口关联了",{"2":{"382":1}}],["端口",{"2":{"316":1,"691":1,"1018":1,"1019":1,"1022":3,"1062":1,"1066":1}}],["端口号都相同",{"2":{"336":1}}],["端口号",{"2":{"177":1,"182":1}}],["端性能测试工具",{"2":{"221":1}}],["嗯",{"2":{"221":1}}],["想哭没有哭",{"2":{"1232":1}}],["想必市面上已经议论纷纷了吧",{"2":{"601":1}}],["想监听子节点的属性变化或者或者节点变化可以用开头提到的mutatorobserverapi",{"2":{"404":1}}],["想要升级当前协议",{"2":{"354":1}}],["想要限制资源的访问",{"2":{"346":1}}],["想要对这个页面进行性能分析都非常简单",{"2":{"216":1}}],["想法有出入那又是问什么",{"2":{"48":1,"554":1}}],["得知我爸是在前天16号就受伤了",{"2":{"1232":1}}],["得益于ts的转译插件可以让jest的测试文件",{"2":{"858":1}}],["得出性能分析报告",{"2":{"216":1}}],["得到50元优惠券",{"2":{"205":2,"755":2}}],["得到100元优惠券",{"2":{"205":2,"755":2}}],["功能函数",{"2":{"878":1}}],["功能和扩展性",{"2":{"785":1}}],["功能完善",{"0":{"775":1}}],["功能角度是链路层协议",{"2":{"454":1}}],["功能强大且高度可配置",{"2":{"784":1}}],["功能强大",{"2":{"450":1}}],["功能分析",{"2":{"242":1}}],["功能实现",{"0":{"242":1},"1":{"243":1,"244":1,"245":1}}],["功能",{"0":{"706":1},"2":{"215":1}}],["功能介绍",{"0":{"53":1}}],["渐进式",{"2":{"214":1}}],["适合包含在",{"2":{"1121":1}}],["适合团队协作和跨平台开发",{"2":{"785":1}}],["适合处理大型项目和高效开发",{"2":{"785":1}}],["适合于需要快速传输的数据",{"2":{"310":1}}],["适用于在",{"2":{"1121":3}}],["适用于多阶段构建",{"2":{"1053":1}}],["适用于简单和快速的构建流程",{"2":{"784":1}}],["适用于小型项目和快速原型开发",{"2":{"784":1}}],["适用于开发库和组件等需要精简输出的场景",{"2":{"784":1}}],["适用于复杂的项目",{"2":{"784":1}}],["适用于需要向同一子网内所有设备发送相同信息的情况",{"2":{"365":1}}],["适用于需要向特定设备组发送相同信息的情况",{"2":{"365":1}}],["适用于需要向所有设备发送相同信息的情况",{"2":{"365":1}}],["适用于流式数据的传输和动态调整消息体长度的场景",{"2":{"343":1}}],["适用于少量数据的加密和解密",{"2":{"330":1}}],["适用于大量数据的加密和解密",{"2":{"330":1}}],["适用于网页版和移动端",{"2":{"214":1}}],["适配器",{"2":{"210":1,"760":1}}],["适配器的别名是包装器",{"2":{"206":1,"756":1}}],["适配器模式通常只包装一次",{"2":{"206":1,"756":1}}],["适配器模式不需要改变已有的接口",{"2":{"206":1,"756":1}}],["适配器模式",{"0":{"206":1,"756":1}}],["桌面设备访问页面结果分析",{"2":{"213":1}}],["谷歌开发的一个免费的网页分析工具",{"2":{"213":1}}],["图像转换",{"0":{"718":1}}],["图像合成",{"0":{"287":1}}],["图块转换为位图",{"2":{"279":1}}],["图片优化",{"2":{"778":1}}],["图片大小3",{"2":{"765":1}}],["图片等",{"2":{"705":1}}],["图片等等",{"2":{"352":1}}],["图片缓存",{"0":{"248":1}}],["图片的唯一标识符",{"2":{"244":1}}],["图片状态",{"2":{"244":1}}],["图片状态管理器有了",{"2":{"242":1}}],["图片有3中状态",{"2":{"244":1}}],["图片管理器",{"0":{"244":1},"2":{"244":1}}],["图片",{"2":{"243":2,"316":1}}],["图片响应的状态为loaded",{"2":{"242":1}}],["图片加载完毕",{"2":{"242":1}}],["图片懒加载的方式",{"2":{"198":1,"748":1}}],["图解设计模式",{"2":{"211":1,"761":1}}],["终于等到中午下班了",{"2":{"1236":1}}],["终端发送syn类型请求",{"2":{"456":1}}],["终端",{"2":{"456":1}}],["终端配置mysql",{"0":{"69":1}}],["终止",{"2":{"244":1}}],["终结者",{"2":{"210":1,"760":1}}],["状态等",{"2":{"1006":1}}],["状态栏可以看一些简单信息如",{"2":{"435":1}}],["状态栏",{"0":{"435":1},"2":{"429":1}}],["状态下的端口还不能重新被使用",{"2":{"382":1}}],["状态101协议转换",{"2":{"354":1}}],["状态码200",{"2":{"458":1}}],["状态码等等信息",{"2":{"413":1}}],["状态码和状态描述",{"2":{"318":1}}],["状态码",{"0":{"615":1},"2":{"317":1,"432":1}}],["状态保存恢复",{"0":{"289":1}}],["状态为loading",{"2":{"244":1}}],["状态变为error",{"2":{"242":1}}],["状态",{"2":{"210":1,"760":1}}],["状态管理文件夹",{"2":{"54":2}}],["责任链",{"2":{"210":1,"760":1}}],["迭代器generator",{"0":{"473":1}}],["迭代器",{"2":{"210":1,"760":1}}],["迭代器模式可以把迭代的过程从业务逻辑中分离出来",{"2":{"203":1,"753":1}}],["迭代器模式",{"0":{"203":1,"753":1}}],["桥接",{"2":{"210":1,"760":1,"1088":1}}],["享元",{"2":{"210":1,"760":1}}],["享元模式就是非常有用了",{"2":{"204":1,"754":1}}],["享元模式的核心是运用共享技术来有效支持大量细粒度的对象",{"2":{"204":1,"754":1}}],["享元模式",{"0":{"204":1,"754":1}}],["仅存在于合并结果流水线中",{"2":{"1122":2}}],["仅存在于容器的生命周期中",{"2":{"1111":1}}],["仅在当前项目中是唯一的",{"2":{"1121":1}}],["仅在标签流水线上可用",{"2":{"1121":1}}],["仅在标签流水线中可用",{"2":{"1121":2}}],["仅为该作业创建并在执行后处理",{"2":{"1121":1}}],["仅当为项目启用了",{"2":{"1121":4}}],["仅当作业在共享环境中执行时才可用",{"2":{"1121":1}}],["仅当作业在一次性环境中执行时才可用",{"2":{"1121":1}}],["仅当作业使用",{"2":{"1121":1}}],["仅当流水线使用",{"2":{"1121":1}}],["仅当流水线具有可用于部署的",{"2":{"1121":1}}],["仅当流水线的项目具有打开的需求",{"2":{"1121":1}}],["仅当流水线在部署冻结窗口期间运行时才可用",{"2":{"1121":1}}],["仅作为连字符使用",{"2":{"850":1}}],["仅vscode调试",{"0":{"401":1}}],["仅仅维护中介者对象即可",{"2":{"208":1,"758":1}}],["仅居中元素定宽高适用",{"2":{"11":1}}],["存在一系列的缺点",{"2":{"1079":1}}],["存在一些性能和限制方面的问题",{"2":{"965":1}}],["存在商品选择表单",{"2":{"208":1,"758":1}}],["存活时间长",{"2":{"559":1}}],["存放了当前dep的",{"2":{"954":1}}],["存放一些空间大",{"2":{"559":1}}],["存放着来自不同任务源",{"2":{"532":1}}],["存储发包token不能忘记",{"2":{"1190":1}}],["存储集",{"2":{"1098":1}}],["存储型",{"2":{"350":2}}],["存储型xss和dom",{"2":{"350":1}}],["存储区",{"2":{"350":1}}],["存储大小通常为4kb",{"2":{"347":1}}],["存储后缀名",{"2":{"62":1}}],["存储歌曲信息",{"2":{"54":1}}],["存储的是该对象在栈中引用",{"2":{"24":1}}],["航线上的飞机只需要和机场的塔台通信就能确定航线和飞行状态",{"2":{"208":1,"758":1}}],["现阶段k8s的迭代速度还是很快的",{"2":{"1194":1}}],["现如今前端领域开发基本离不开vue",{"2":{"786":1}}],["现代浏览器架构",{"0":{"272":1},"1":{"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1},"2":{"526":1}}],["现实生活中",{"2":{"208":1,"758":1}}],["现在简单用官方的方式实现一下",{"2":{"951":1}}],["现在设置值时",{"2":{"950":1}}],["现在package中配置",{"2":{"860":1}}],["现在来看下使用",{"2":{"814":1}}],["现在yarn已经具备了workspace的能力",{"2":{"814":1}}],["现在需要将切片的hash传给服务器",{"2":{"772":1}}],["现在的页面渲染以完全有前端来处理了",{"2":{"671":1}}],["现在的前后端模式已经和后端分开处理了",{"2":{"671":1}}],["现在要求新建一个student对象",{"2":{"575":1}}],["现在要查出课程2比课程1分数要高的学生",{"2":{"88":1}}],["现在修改prototype的属性和原型",{"2":{"573":1}}],["现在看下cat的结构",{"2":{"572":1}}],["现在看看当前的抓包情况",{"2":{"453":1}}],["现在将上面的代码稍作修改",{"2":{"539":1}}],["现在让它请求网关192",{"2":{"454":1}}],["现在就来看看组件data和watcher是如何联系起来的",{"2":{"954":1}}],["现在就来使用它来抓取数据包分析吧",{"2":{"454":1}}],["现在就进入mysql的安装界面了",{"2":{"68":1}}],["现在打开safari重新访问https",{"2":{"439":1}}],["现在访问http",{"2":{"425":1}}],["现在也可以编辑响应内容了",{"2":{"419":1}}],["现在发布上线",{"2":{"408":1}}],["现在可以在项目中尝试写入错误格式eslint便会进行识别报错",{"2":{"840":1}}],["现在可以用编辑器打开目标文件夹",{"2":{"407":1}}],["现在可以打开ie浏览器",{"2":{"247":1}}],["现在比如我们想调试一个index",{"2":{"407":1}}],["现在我们尝试访问和设置它的属性",{"2":{"950":1}}],["现在我们在浏览器中添加对应的断点",{"2":{"404":1}}],["现在我们可以这样使用它",{"2":{"244":1}}],["现在我们可以同时使用不同的装饰器",{"2":{"233":1}}],["现在你可以打开过个tab访问此页面",{"2":{"354":1}}],["现在大量使用cdn",{"2":{"325":1}}],["现在已经到了正式购买的阶段",{"2":{"205":1,"755":1}}],["现在构造函数接受的参数是一个对象",{"2":{"184":1}}],["现在不是",{"2":{"184":1}}],["现在做个笔记",{"2":{"92":1}}],["现在有一个这样的需求",{"2":{"88":1}}],["现在创建一张老师的表",{"2":{"87":1}}],["现在创建两张表来为后面的了联接做准备",{"2":{"86":1}}],["现在没人这么做了",{"2":{"18":1}}],["传统的虚拟技术要在一个机器上安装虚拟机",{"2":{"1079":1}}],["传统的开发和部署存在着许多环境和配置的不兼容的问题",{"2":{"1078":1}}],["传统的模板",{"2":{"671":1}}],["传递进去",{"2":{"938":1}}],["传递请求给某个节点",{"2":{"205":1,"755":1}}],["传",{"2":{"729":1}}],["传送页面的字节数",{"2":{"729":1}}],["传送门",{"2":{"66":1}}],["传给目标服务器设置的头部信息",{"2":{"723":1}}],["传输大小等等",{"2":{"436":1}}],["传输完成后再释放连接",{"2":{"375":1}}],["传输和确认",{"2":{"374":1}}],["传输控制协议",{"2":{"374":1}}],["传输过程",{"0":{"311":1},"2":{"395":1}}],["传输层去掉tcp首部给到应用层",{"2":{"311":1}}],["传输层负责处理数据的传输",{"2":{"310":1}}],["传输层",{"2":{"309":1,"310":1,"312":1}}],["传播中没有身份验证",{"2":{"303":1}}],["传入存在的buffer",{"2":{"483":1}}],["传入",{"2":{"249":1}}],["库",{"2":{"996":1,"1065":2}}],["库存不足",{"2":{"205":2,"755":2}}],["库文件已经采用cdn的方式引用",{"2":{"131":1}}],["且容易移植",{"2":{"1078":1}}],["且不容易移植",{"2":{"1078":1}}],["且不依赖于外部资源或其他模块",{"2":{"853":1}}],["且会作为第一进程执行",{"2":{"1058":1}}],["且制作多镜像时相同阶段也无法共用已构建的产物",{"2":{"1048":1}}],["且这对于应用的开发没有丝毫影响",{"2":{"785":1}}],["且可以用在任意的",{"2":{"498":1}}],["且在存库有限的情况下不一定保证买到",{"2":{"205":1,"755":1}}],["且必须带上",{"2":{"154":1,"903":1}}],["公网和内网都可以",{"2":{"1195":1}}],["公司维护的一组公共镜像仓库",{"2":{"1012":1}}],["公司针对支付过预定金的用户有一定的优惠政策",{"2":{"205":1,"755":1}}],["公有仓库",{"0":{"1012":1}}],["公开使用",{"2":{"1186":1}}],["公开仓库的镜像完整地址由三个部分组成",{"2":{"1012":1}}],["公开",{"2":{"333":1}}],["公开参数后",{"2":{"333":1}}],["公开参数和签名信息",{"2":{"333":1}}],["公钥可以随意分发给其他人",{"2":{"330":1}}],["公共",{"2":{"1012":1}}],["公共registry",{"2":{"1011":1}}],["公共的webpack配置",{"2":{"190":1}}],["公共模块",{"2":{"187":1,"190":1}}],["公共组件",{"2":{"54":2}}],["公共代码",{"2":{"12":2}}],["直达你最中意的内容",{"2":{"1223":1}}],["直到null",{"2":{"591":1}}],["直到原型链的顶端",{"2":{"571":1}}],["直到object的原型null",{"2":{"571":1}}],["直到所有执行完",{"2":{"536":1}}],["直到执行完for循环才会去macrotask",{"2":{"533":1}}],["直到执行完后面所有的then",{"2":{"532":1}}],["直到清空当前执行栈后才会执行",{"2":{"533":1}}],["直到传输完毕将包按顺序组装在上交给应用层",{"2":{"456":1}}],["直到为0时将会丢弃报文",{"2":{"382":1}}],["直到收到client的ack响应后",{"2":{"380":1}}],["直到该数据流的所有帧全部传输完成",{"2":{"324":1}}],["直到管理员手动删除或更新它",{"2":{"300":1}}],["直到遇到一个可以处理它的对象",{"2":{"205":1,"755":1}}],["直线",{"2":{"283":1}}],["直接下载安装包",{"2":{"1208":1}}],["直接将防火墙关闭了",{"2":{"1201":1}}],["直接使用本地镜像",{"2":{"1159":1}}],["直接使用gz静态服务器",{"2":{"697":1}}],["直接运行与宿主机的内核",{"2":{"1079":1}}],["直接在最后加上",{"2":{"1022":1}}],["直接在docker的$home",{"2":{"1014":1}}],["直接上传不行吗",{"2":{"764":1}}],["直接写成数据形式或者下面方式",{"2":{"606":1}}],["直接覆盖了原型对象",{"2":{"572":1}}],["直接设置原型对象而不是添加属性",{"2":{"572":1}}],["直接设置父元素的display",{"2":{"111":1}}],["直接打开链接时禁止访问",{"2":{"520":1}}],["直接打开官网下载页面",{"2":{"450":1}}],["直接渲染目标图片即可",{"2":{"246":1}}],["直接removemanager卸载对其的观测",{"2":{"245":1}}],["直接看instance",{"2":{"238":1}}],["直接返回不做处理",{"2":{"956":1}}],["直接返回啥都不做",{"2":{"956":1}}],["直接返回上次的值",{"2":{"934":1}}],["直接返回上一次计算后的结果watcher",{"2":{"932":1}}],["直接返回",{"2":{"196":1,"746":1}}],["直接解析到出错的源码位置",{"2":{"183":1}}],["直接排除掉基础类型值",{"2":{"48":1,"554":1}}],["直接存储在栈",{"2":{"24":1}}],["职责链模式的名字非常形象",{"2":{"205":1,"755":1}}],["职责链模式",{"0":{"205":1,"755":1}}],["职位",{"2":{"88":1}}],["普通对象",{"2":{"576":1}}],["普通购买",{"2":{"205":2,"755":2}}],["普通的做法",{"2":{"204":1,"754":1}}],["普通写法",{"2":{"197":1,"747":1}}],["正确看待工作的属性",{"2":{"1233":1}}],["正在使用的",{"2":{"1121":1}}],["正文",{"2":{"788":1}}],["正如前面讲的当前作用域以内的作用域的可以访问到当前作用域的变量",{"2":{"588":1}}],["正如上述分析",{"2":{"244":1}}],["正常工作",{"2":{"1195":1}}],["正常情况会生成一个全新的内部对象",{"2":{"577":1}}],["正常情况下内部会涉及到以下步骤",{"2":{"576":1}}],["正常情况下需要50个男模特和50个女模特",{"2":{"204":1,"754":1}}],["正常的tcp连接双方都可以收发数据报文",{"2":{"384":1}}],["正常加载",{"2":{"245":1}}],["正则表达式",{"0":{"885":1},"1":{"886":1,"887":1,"888":1,"889":1,"890":1,"891":1,"892":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1}}],["正则表达式是由模式和修饰符",{"2":{"138":1,"887":1}}],["正则表达式是用于匹配字符串中字符组合的模式",{"2":{"136":1,"885":1}}],["正则判断是纯数字且大于0时将值",{"2":{"718":1}}],["正则匹配",{"2":{"711":1,"717":1}}],["正则搜索",{"2":{"453":1}}],["正则的量词通常都是遵循贪婪原则",{"2":{"150":1,"899":1}}],["正则配置",{"2":{"127":1}}],["意为蝇量级",{"2":{"204":1,"754":1}}],["指的是没有被任何容器使用的镜像",{"2":{"1002":1}}],["指令从上到下执行",{"2":{"1067":1}}],["指令将自动运行",{"2":{"1065":2}}],["指令中的命令将自动执行",{"2":{"1065":1}}],["指令中指定多个端口号",{"2":{"1062":1}}],["指令中指定的值",{"2":{"729":1}}],["指令会生效",{"2":{"1063":1}}],["指令用于指定容器启动时默认要执行的命令",{"2":{"1063":1}}],["指令用于声明容器运行时要监听的网络端口号",{"2":{"1062":1}}],["指令用于设置容器中的工作目录",{"2":{"1056":1}}],["指令用于设置构建时的参数",{"2":{"1054":1}}],["指令进行修改",{"2":{"729":1}}],["指令的镜像作为下一个",{"2":{"1065":1}}],["指令的",{"2":{"729":1}}],["指令的值",{"2":{"729":1}}],["指令与",{"2":{"729":1}}],["指令来实现防盗链的功能",{"2":{"722":1}}],["指令来进行访问控制",{"2":{"713":1}}],["指令设置重定向的最大次数或者超时时间",{"2":{"715":1}}],["指令",{"2":{"710":1,"1056":1,"1063":2,"1065":1}}],["指令之间使用",{"2":{"350":1}}],["指向构造函数的prototype属性",{"2":{"571":1}}],["指明客户端的初始化序号为0",{"2":{"456":1}}],["指下一次应该收到的数据的序列号",{"2":{"376":1}}],["指示在过期之后",{"2":{"720":1}}],["指示不应将响应存储在任何缓存中",{"2":{"720":1}}],["指示客户端必须在使用缓存之前重新验证资源的有效性",{"2":{"720":1}}],["指示客户端使用的",{"2":{"354":1}}],["指示缓存存储的最长时间",{"2":{"720":1}}],["指示响应只能被客户端缓存",{"2":{"720":1}}],["指示响应可以被任何中间缓存缓存",{"2":{"720":1}}],["指示了ip数据包中包含的上层协议类型",{"2":{"367":1}}],["指示该片段相对于原始数据包的偏移量",{"2":{"367":1}}],["指提供一种方法顺序访问一个聚合对象中的各个元素",{"2":{"203":1,"753":1}}],["指定发布到main指定分支时进行发包",{"2":{"1190":1}}],["指定gitlab的ip地址",{"2":{"1172":1}}],["指定gitlab的地址",{"2":{"1158":1}}],["指定作业什么状态下才会执行",{"2":{"1131":1}}],["指定dockerfile文件路径",{"2":{"1069":1}}],["指定上下文目录",{"2":{"1069":1}}],["指定平台",{"2":{"1053":1}}],["指定构建阶段的名称",{"2":{"1053":1}}],["指定信号量",{"2":{"1032":1}}],["指定等待容器停止的时间",{"2":{"1008":1}}],["指定显示到某个时间戳结束的日志",{"2":{"1007":1}}],["指定显示从某个时间戳开始的日志",{"2":{"1007":1}}],["指定显示最后几行日志",{"2":{"1007":1}}],["指定容器健康检查的方式和频率",{"2":{"1066":1}}],["指定容器工作目录为",{"2":{"1056":1}}],["指定容器与主机之间的文件共享",{"2":{"1004":1}}],["指定容器的端口映射",{"2":{"1004":1}}],["指定要停止的服务",{"2":{"1030":1}}],["指定要测试哪些文件",{"2":{"857":1}}],["指定要跨域请求的url",{"2":{"190":1}}],["指定网卡",{"2":{"728":1}}],["指定keepalived的角色",{"2":{"728":1}}],["指定哪些不需要",{"2":{"717":1}}],["指定静态文件的根目录",{"2":{"712":1}}],["指定header头断点等等",{"2":{"436":1}}],["指定端口",{"2":{"399":1}}],["指定了缓存的最长时间",{"2":{"720":1}}],["指定了ip数据包的优先级和qos",{"2":{"367":1}}],["指定了接收违规报告的",{"2":{"350":1}}],["指定了用于获取",{"2":{"350":1}}],["指定了可以嵌入到文档中的子资源",{"2":{"350":2}}],["指定了可以嵌入到文档中的父级的源",{"2":{"350":1}}],["指定了可以从文档加载的资源的来源",{"2":{"350":1}}],["指定了可以加载图像资源的源",{"2":{"350":1}}],["指定了可以加载",{"2":{"350":2}}],["指定了所有其他资源类型的默认源",{"2":{"350":1}}],["指定cookie是否只能通过https连接传输",{"2":{"347":1}}],["指定cookie的过期时间",{"2":{"347":1}}],["指定cookie可访问的域名",{"2":{"347":1}}],["指定开始一直到结尾",{"2":{"344":1}}],["指定开始和结束",{"2":{"344":1}}],["指定服务器的信息",{"2":{"319":1}}],["指定响应正文的类型",{"2":{"319":1}}],["指定响应正文的长度",{"2":{"319":1}}],["指定响应正文的编码方式",{"2":{"319":1}}],["指定缓存资源生成的时间",{"2":{"319":1}}],["指定缓存机制",{"2":{"319":2}}],["指定客户端的用户代理信息",{"2":{"319":1}}],["指定请求来源",{"2":{"319":1}}],["指定请求的主机名和端口号",{"2":{"319":1}}],["指定来自客户端的cookie信息",{"2":{"319":1}}],["指定身份认证信息",{"2":{"319":1}}],["指定可接受的字节范围",{"2":{"319":1}}],["指定可接受的内容编码方式",{"2":{"319":1}}],["指定可接受的响应类型",{"2":{"319":1}}],["指定代理服务器的相关信息",{"2":{"319":1}}],["指定传输编码方式",{"2":{"319":1}}],["指定尾部",{"2":{"319":1}}],["指定消息创建时间",{"2":{"319":1}}],["指定连接类型",{"2":{"319":1}}],["指定本次arp报文类型",{"2":{"297":1}}],["指定在链中的下一个节点",{"2":{"205":1,"755":1}}],["指定特定的图片",{"2":{"198":1,"748":1}}],["指定版本",{"2":{"97":1}}],["指定的目录中运行",{"2":{"1056":1}}],["指定的",{"2":{"2":1}}],["建立断开",{"2":{"395":1}}],["建议给每个机器起一个有意义的名字方便管理",{"2":{"1199":1}}],["建议你结合这两篇响应式原理文章尝试写几个例子并进行断点调试",{"2":{"946":1}}],["建议先阅读上一篇搞明白响应式原理再来看本篇文章",{"2":{"927":1}}],["建议",{"2":{"717":1}}],["建议设置成大于",{"2":{"717":1}}],["建议使用cache",{"2":{"720":1}}],["建议使用",{"2":{"329":1,"350":1,"353":1,"1068":1}}],["建议将装箱和拆箱的内容多读",{"2":{"41":1,"547":1}}],["建造者",{"2":{"210":1,"760":1}}],["建造者模式builder",{"0":{"202":1,"752":1}}],["出于安全策略每个公司都会将自己的镜像存到自己的私有仓库中",{"2":{"1036":1}}],["出发当前key依赖更新",{"2":{"959":1}}],["出栈",{"2":{"932":1,"954":1}}],["出错跳过",{"2":{"771":1}}],["出错重试",{"2":{"771":1}}],["出错等等",{"2":{"510":1}}],["出错了",{"2":{"245":1}}],["出码结果",{"2":{"350":1}}],["出了用浏览器查看serverpush的请求",{"2":{"325":1}}],["出现在分支或标签上的上一个最新提交",{"2":{"1121":1}}],["出现了内存碎片",{"2":{"558":1}}],["出现条件",{"2":{"222":1}}],["出现诸如以下错误",{"2":{"97":1}}],["出实例",{"2":{"201":1,"751":1}}],["工资相对来说不低我爸就考虑去了",{"2":{"1232":1}}],["工资高点",{"2":{"1232":1}}],["工作期间运行的另一个docker镜像",{"2":{"1146":1}}],["工作节点负责运行",{"2":{"993":1,"1080":1}}],["工件将被发送至gitlab",{"2":{"1139":1}}],["工程依赖",{"2":{"801":1}}],["工具和配置文件",{"2":{"811":1}}],["工具",{"2":{"786":1,"801":1}}],["工具包",{"2":{"665":1}}],["工具毕竟是工具比较简单",{"2":{"437":1}}],["工具栏主要使用来控制抓包的",{"2":{"452":1}}],["工具栏主要是一些快捷设置菜单栏",{"2":{"415":1}}],["工具栏基本是对抓包做一些具体配置和操作",{"2":{"431":1}}],["工具栏",{"0":{"415":1,"431":1,"452":1},"2":{"413":1,"429":1}}],["工具推荐",{"0":{"70":1}}],["工厂",{"2":{"210":1,"760":1}}],["工厂决定生产一些塑料模特来穿上他们的内衣拍成广告照片",{"2":{"204":1,"754":1}}],["工厂模式",{"0":{"201":1,"751":1}}],["装饰的接口",{"2":{"687":1}}],["装饰器访问顺序",{"2":{"233":1}}],["装饰器类别",{"0":{"226":1}}],["装饰器就像高阶函数一样",{"2":{"225":1}}],["装饰器本身就是一种特殊的函数",{"2":{"225":1}}],["装饰器让typescript的世界更好",{"2":{"224":1}}],["装饰器",{"2":{"210":1,"760":1}}],["装饰器模式常常形成一条长的装饰链",{"2":{"206":1,"756":1}}],["装饰器模式和代理模式的结构看起来非常相似",{"2":{"199":1,"749":1}}],["装饰器模式",{"0":{"199":1,"749":1}}],["装饰模式和代理模式也不会改变原有对象的接口",{"2":{"206":1,"756":1}}],["装饰模式目的是",{"2":{"199":1,"749":1}}],["装箱可以通过显式new进行装箱",{"2":{"38":1,"544":1}}],["装箱",{"0":{"38":1,"544":1}}],["装箱就是将基础类型转换为对应的包装类型",{"2":{"37":1,"543":1}}],["装箱与拆箱",{"0":{"37":1,"543":1},"1":{"38":1,"39":1,"544":1,"545":1}}],["栗子",{"2":{"198":1,"208":1,"748":1,"758":1}}],["获得巨大性能优势和新特性",{"2":{"977":1}}],["获得证书",{"2":{"726":1}}],["获得校验结果",{"2":{"197":1,"747":1}}],["获取结果",{"2":{"964":1}}],["获取使用reflect获取值",{"2":{"964":1}}],["获取到",{"2":{"955":1}}],["获取函数",{"2":{"949":1}}],["获取处理请求的优先级越高",{"2":{"728":1}}],["获取多少内存用于缓存压缩结果",{"2":{"717":1}}],["获取formdata中其他的字段",{"2":{"701":1}}],["获取用户信息",{"2":{"666":1}}],["获取延时任务",{"2":{"661":1}}],["获取间隔任务",{"2":{"661":1}}],["获取指定的cron",{"2":{"661":3}}],["获取调度任务",{"2":{"661":1}}],["获取元数据",{"2":{"648":1}}],["获取http协议的参数装饰器",{"2":{"619":1}}],["获取body的name属性",{"2":{"613":2}}],["获取buffer的字节长度和构造函数传入的值相等",{"2":{"479":1}}],["获取对象属性时对依赖进行收集",{"2":{"959":1}}],["获取对象类型",{"2":{"576":1}}],["获取对应的manager",{"2":{"245":1}}],["获取原型",{"2":{"575":1}}],["获取writer对象",{"2":{"516":1}}],["获取返回一个新的",{"2":{"516":1}}],["获取",{"2":{"512":1}}],["获取聚焦元素focus",{"2":{"462":1}}],["获取注入的service装饰器",{"2":{"229":1}}],["获取当前",{"2":{"959":1}}],["获取当前数组的dep",{"2":{"955":1}}],["获取当前系统时间",{"2":{"83":1}}],["获取当前页",{"2":{"63":1}}],["获取异常",{"2":{"62":1}}],["获取验证码cookie",{"2":{"61":1}}],["举一个重复构建同名同tag的nginx镜像",{"2":{"1002":1}}],["举个简单例子看下这两个api的强大",{"2":{"958":1}}],["举个简单的栗子",{"2":{"200":1,"750":1}}],["举个表单校验栗子",{"2":{"197":1,"747":1}}],["举例被保护的网站是",{"2":{"726":1,"1178":1}}],["举例",{"2":{"110":1,"111":1,"112":1,"139":1,"888":1}}],["策略的方式",{"2":{"350":1}}],["策略",{"2":{"210":1,"760":1}}],["策略类封装了具体的算法",{"2":{"197":1,"747":1}}],["策略模式的目的就是将算法的使用",{"2":{"197":1,"747":1}}],["策略模式的定义",{"2":{"197":1,"747":1}}],["策略模式",{"0":{"197":1,"747":1}}],["算法",{"2":{"991":1,"1223":1}}],["算法简单",{"2":{"558":1}}],["算法过程",{"2":{"207":1,"757":1}}],["算法的实现分离出来",{"2":{"197":1,"747":1}}],["算术运算符主要包括+",{"2":{"42":1,"548":1}}],["算术运算符转换",{"0":{"42":1,"548":1},"1":{"43":1,"44":1,"549":1,"550":1}}],["定期将活动对象和不活动的对象进行分别标记",{"2":{"558":1}}],["定时器",{"0":{"870":1}}],["定时器误差",{"0":{"533":1}}],["定时器线程",{"2":{"526":2}}],["定时任务",{"2":{"528":1}}],["定向广播是一种有限的通信方式",{"2":{"365":1}}],["定向广播是一种将数据包发送给网络中某个子网内所有设备的通信方式",{"2":{"365":1}}],["定向广播使用子网广播地址",{"2":{"365":1}}],["定向广播等通信方式",{"2":{"365":1}}],["定长传输还可以简化协议的实现",{"2":{"342":1}}],["定长传输是一种http消息传输方式",{"2":{"342":1}}],["定长传输",{"0":{"342":1}}],["定长传输需要在",{"2":{"341":1}}],["定义job发布的环境",{"2":{"1147":1}}],["定义获取工件的作业列表",{"2":{"1140":1}}],["定义变量",{"2":{"1128":1}}],["定义容器数据挂载点",{"2":{"1061":1}}],["定义容器的工作目录为",{"2":{"1051":1}}],["定义网络",{"2":{"1022":1}}],["定义网关",{"2":{"702":1}}],["定义数据卷",{"2":{"1022":1}}],["定义数组类型",{"2":{"606":1}}],["定义如下",{"2":{"949":1}}],["定义当前",{"2":{"932":1}}],["定义全局组件可以解决这个问题",{"2":{"875":1}}],["定义全局的loading和error",{"2":{"243":1}}],["定义个待测试的函数foreach",{"2":{"869":1}}],["定义测试",{"2":{"868":1}}],["定义了两个容器",{"2":{"1018":1}}],["定义了",{"2":{"828":1}}],["定义提交类型",{"2":{"797":1}}],["定义缓存的键名",{"2":{"721":1}}],["定义在使用调色板指定的颜色转换gif图像或png图像时是否应保留透明度",{"2":{"718":1}}],["定义文件类型映射表",{"2":{"709":1}}],["定义错误格式",{"2":{"639":1}}],["定义",{"2":{"631":1}}],["定义env配置文件路径",{"2":{"628":1}}],["定义可注入的类",{"2":{"606":1,"624":1}}],["定义string类型的值",{"2":{"606":1}}],["定义一组提交信息规则",{"2":{"795":1}}],["定义一个空数组将跳过下载该作业的任何工件不会考虑先前作业的状态",{"2":{"1140":1}}],["定义一个包装响应数据格式的拦截器",{"2":{"651":1}}],["定义一个控制器类",{"2":{"605":1}}],["定义一系列的算法",{"2":{"197":1,"747":1}}],["定义后不能修改",{"2":{"588":1}}],["定义时必须要赋值否则报错",{"2":{"588":1}}],["定义原型为null的对象",{"2":{"574":1}}],["定义背压",{"2":{"510":1,"514":1}}],["定义流的队列策略",{"2":{"510":1,"514":1}}],["定义先加上对应的字段",{"2":{"248":1}}],["定义属性来判断是否支持",{"2":{"247":1}}],["定义指令绑定值得类型",{"2":{"243":1}}],["定位到源代码",{"2":{"183":1}}],["定位代码",{"2":{"12":1,"13":1,"14":1,"15":1,"16":1,"17":1}}],["弹窗只应该被创建一次",{"2":{"196":1,"746":1}}],["弹窗",{"2":{"196":1,"746":1}}],["单测和端测区别",{"0":{"852":1},"1":{"853":1,"854":1}}],["单元测试报告",{"2":{"1139":1}}],["单元测试主要关注代码内部的正确性",{"2":{"854":1}}],["单元测试关注于最小的可测试单元",{"2":{"853":1}}],["单元测试和端到端测试不是相互排斥的",{"2":{"851":1}}],["单元测试",{"0":{"853":1,"855":1},"1":{"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1},"2":{"851":1}}],["单元测试等方式来提高代码的可靠性",{"2":{"824":1}}],["单下划线用来描述一个块或者块的子元素的一种状态",{"2":{"850":1}}],["单下划线",{"2":{"850":1}}],["单引号变双引号",{"2":{"839":1}}],["单个",{"2":{"1121":2}}],["单个规则设置了选项",{"2":{"830":1}}],["单个仓库管理多个包",{"2":{"809":1}}],["单个字段与多个字段",{"2":{"84":1}}],["单个字段",{"2":{"81":1}}],["单仓库多模块",{"2":{"809":1}}],["单体应用",{"2":{"809":2}}],["单一代码仓库",{"2":{"808":1}}],["单独列出模块",{"2":{"737":1}}],["单独的线程",{"2":{"279":1}}],["单位使用等",{"2":{"842":1}}],["单位为秒",{"2":{"720":1,"1008":1,"1030":1}}],["单位为4字节",{"2":{"376":1}}],["单位kb",{"2":{"712":1}}],["单位是byte",{"2":{"712":1}}],["单渲染进程到多渲染进程等多种机制的演变",{"2":{"526":1}}],["单击请求断点",{"2":{"435":1}}],["单击会显示右侧的详情面板",{"2":{"413":1}}],["单例",{"2":{"210":1,"760":1}}],["单例模式的定义",{"2":{"196":1,"746":1}}],["单例模式",{"0":{"196":1,"746":1}}],["卸载掉机器上可能存在的docker相关依赖",{"2":{"1082":1}}],["卸载掉operator事件中的eventsinks",{"2":{"195":1,"745":1}}],["卸载operator事件的所有回调函数",{"2":{"195":1,"745":1}}],["卸载事件",{"2":{"195":1,"745":1,"944":1}}],["乘积",{"2":{"195":2,"745":2}}],["异常捕获层默认会有固定的错误格式返回客户端",{"2":{"639":1}}],["异常",{"2":{"601":1,"637":1}}],["异常上报+监控系统+map映射",{"0":{"408":1},"1":{"409":1,"410":1}}],["异常断点可以在vscode中设置",{"2":{"404":1}}],["异常断点",{"2":{"404":1}}],["异常处理",{"2":{"195":1,"668":1,"745":1}}],["异步批量更新",{"2":{"954":1}}],["异步测试",{"0":{"865":1},"1":{"866":1,"867":1,"868":1}}],["异步provider",{"2":{"606":1}}],["异步编程",{"2":{"532":1}}],["异步请求线程",{"2":{"526":1}}],["异步返回blob的所有内容的utf8格式的字符串",{"2":{"496":1}}],["异步返回blob的二进制格式的arraybuffer",{"2":{"496":1}}],["异步",{"0":{"468":1},"2":{"632":1}}],["异步获取图片",{"2":{"244":1}}],["异步加载资源",{"2":{"244":1}}],["异步进行缓存回调函数",{"2":{"98":1}}],["触发时可用",{"2":{"1121":1}}],["触发时退出代码为",{"2":{"830":1}}],["触发",{"2":{"1121":2}}],["触发外部函数执行",{"2":{"964":1}}],["触发依赖收集",{"2":{"956":1}}],["触发对象的getter对当前渲染watcher进行收集",{"2":{"954":1}}],["触发它们的get",{"2":{"941":1}}],["触发number对computed的收集",{"2":{"934":1}}],["触发number的get这样number就会收集当前的activeeffect也就是total中的函数",{"2":{"934":1}}],["触发当前的图片管理器请求真实图片",{"2":{"242":1}}],["触发一次后卸载",{"2":{"195":1,"745":1}}],["触发一次",{"2":{"195":1,"745":1}}],["触发事件",{"2":{"195":1,"745":1}}],["避免不必要的网关问题",{"2":{"1201":1}}],["避免出现一些特殊的问题",{"2":{"1195":1}}],["避免上传无用文件和目录",{"2":{"1068":1}}],["避免和cmd参数追加的问题",{"2":{"1064":1}}],["避免了因为不同的环境或依赖出现的差异",{"2":{"1050":1}}],["避免了手动操作的繁琐和错误",{"2":{"1050":1}}],["避免了重复编写和维护相似的代码",{"2":{"811":1}}],["避免了重复写相同的模式",{"2":{"141":1,"890":1}}],["避免了将文件数据从内核缓冲区复制到用户空间的开销",{"2":{"709":1}}],["避免频繁修改原型",{"2":{"571":1}}],["避免大文件读到内存中",{"2":{"514":1}}],["避免网络拥塞导致数据丢失和延迟",{"2":{"375":1}}],["避免网络数据包在网络中无限循环",{"2":{"368":1}}],["避免数据混乱",{"2":{"375":1}}],["避免数据包在网络中迷路或被错误地传输到其他地方",{"2":{"368":1}}],["避免数据包在网络中长时间滞留",{"2":{"368":1}}],["避免应用之间的干扰和冲突",{"2":{"364":1}}],["避免浪费时间",{"2":{"831":1}}],["避免浪费",{"2":{"364":1}}],["避免重复传输相同的头部信息",{"2":{"326":1}}],["避免重复绑定",{"2":{"195":2,"745":2}}],["绑定为当前实例",{"2":{"964":1}}],["绑定interceptor",{"0":{"652":1}}],["绑定guard",{"0":{"649":1}}],["绑定pipe",{"0":{"643":1}}],["绑定filter",{"0":{"640":1}}],["绑定事件",{"2":{"195":1,"745":1}}],["绑定的域名",{"2":{"128":1}}],["发烧的我也不敢开空调",{"2":{"1236":1}}],["发这篇文章只是想记录下我对qooapp的不舍",{"2":{"1233":1}}],["发个pull",{"2":{"1225":1}}],["发行版在内核版本",{"2":{"1198":1}}],["发展历程",{"0":{"809":1}}],["发音为",{"2":{"704":1}}],["发布准备",{"0":{"1187":1}}],["发布的描述",{"2":{"1121":1}}],["发布",{"2":{"1102":1}}],["发布npm包可以手动发布也可以自动构建发布",{"2":{"1188":1}}],["发布npm包",{"0":{"1102":1,"1188":1},"1":{"1189":1,"1190":1}}],["发布策略中包含集中策略",{"2":{"1098":1}}],["发布策略",{"2":{"1098":1}}],["发布镜像",{"2":{"1046":2}}],["发布和运行应用程序",{"2":{"992":1}}],["发布订阅",{"0":{"471":1},"2":{"465":1}}],["发布模式",{"0":{"195":1,"745":1}}],["发生变化时",{"2":{"404":1}}],["发起端发送syn",{"2":{"378":1}}],["发起范围请求",{"2":{"344":1}}],["发送tcp的ack数据包表示已经接收到了数据",{"2":{"458":1}}],["发送包含自己的seq=125和ack=80的ack报文给客户端",{"2":{"457":1}}],["发送能力也没问题",{"2":{"456":1}}],["发送自己的应答syn包",{"2":{"456":1}}],["发送者ip地址",{"2":{"454":1}}],["发送者mac地址",{"2":{"454":1}}],["发送主机方就会知道目标ip所对应的mac地址了",{"2":{"454":1}}],["发送主机通常在每次",{"2":{"367":1}}],["发送窗口会取拥塞窗口和接收窗口的最小值",{"2":{"392":1}}],["发送窗口一般等于接收窗口",{"2":{"392":1}}],["发送时延",{"2":{"387":1}}],["发送端便会重传丢失的包",{"2":{"385":1}}],["发送端发送ack",{"2":{"378":1}}],["发送数据报时都将一个内部计数器",{"2":{"367":1}}],["发送广播包时",{"2":{"365":1}}],["发送垃圾邮件等",{"2":{"351":1}}],["发送方arp广播发送数据包请求到交换机",{"2":{"454":1}}],["发送方将进入拥塞避免阶段",{"2":{"393":1}}],["发送方将拥塞窗口的大小逐渐增加",{"2":{"393":1}}],["发送方将消息体的长度包含在消息头中的content",{"2":{"342":1}}],["发送方会将拥塞窗口的大小设置为一个较小的值",{"2":{"393":1}}],["发送方一般都会维护一个缓冲区用来标识已发送的和超时的",{"2":{"391":1}}],["发送方接受到了一个更早的拥塞通知",{"2":{"376":1}}],["发送方降低发送速率",{"2":{"376":1}}],["发送方端口",{"2":{"376":1}}],["发送方的ip地址",{"2":{"297":1}}],["发送方的硬件地址",{"2":{"297":1}}],["发送给容器的信号",{"2":{"1008":1}}],["发送给",{"2":{"333":2}}],["发送的arp数据包被hacker截取后",{"2":{"303":1}}],["发现自己有点发烧没有精神",{"2":{"1236":1}}],["发现已经抓包成功",{"2":{"422":1}}],["发现竟是打包后的",{"2":{"408":1}}],["发现一个bug报错了",{"2":{"408":1}}],["发现也是好使的",{"2":{"247":1}}],["发现居然要加载15s才能进来",{"2":{"129":1}}],["订阅模式",{"2":{"946":1,"952":1}}],["订阅者因此也成为观察者",{"2":{"195":1,"745":1}}],["订阅",{"0":{"195":1,"745":1}}],["订单已在此时生成",{"2":{"205":1,"755":1}}],["订单信息持久化",{"2":{"67":1}}],["订单管理",{"2":{"54":1}}],["经常会在一个docker中发现连",{"2":{"1078":1}}],["经过后面的语音消息",{"2":{"1232":1}}],["经过多次演变和改进",{"2":{"321":1}}],["经过分类的",{"2":{"194":1,"744":1}}],["经测试",{"2":{"139":1,"888":1}}],["解压镜像",{"2":{"1001":1}}],["解压",{"2":{"718":1}}],["解析器与",{"2":{"829":1}}],["解析器负责将代码转换成抽象语法树ast",{"2":{"829":1}}],["解析器选项",{"2":{"827":1}}],["解析器",{"2":{"827":1}}],["解析css",{"2":{"279":1}}],["解析js",{"2":{"279":1}}],["解析第三方模块",{"2":{"190":1}}],["解释器",{"2":{"210":1,"760":1}}],["解决这个也很简单",{"2":{"963":1}}],["解决这个问题就需要针对每个属性做区分或者分开存储",{"2":{"951":1}}],["解决方案",{"0":{"767":1}}],["解决方法",{"2":{"112":1}}],["解决方法上面已经介绍过",{"2":{"110":1}}],["解决跨域可以使用代理服务器",{"2":{"691":1}}],["解决跨域的方式有很多如",{"2":{"336":1}}],["解决ip地址冲突问题",{"2":{"370":1}}],["解决了http",{"2":{"323":1}}],["解决两个软件实体间的接口不兼容的问题",{"2":{"206":1,"756":1}}],["解决浮动问题",{"2":{"112":1}}],["解决浮动元素的父元素高度塌陷的问题",{"0":{"112":1}}],["解决margin重叠问题",{"2":{"110":2}}],["解决margin重叠的问题",{"0":{"110":1}}],["解决办法",{"2":{"97":1}}],["解决循环引用问题",{"2":{"33":1}}],["外面初始化时也就不会执行函数",{"2":{"932":1}}],["外层也指向它的外层作用域直到null",{"2":{"591":1}}],["外界只能执行函数然后才会知道内部的内容",{"2":{"589":1}}],["外观",{"2":{"210":1,"760":1}}],["外观模式的作用倒是和适配器比较相似",{"2":{"206":1,"756":1}}],["外观模式",{"0":{"200":1,"750":1}}],["外部重启",{"2":{"1179":1}}],["外部是无感的无法访问到的",{"2":{"1085":1}}],["外部不能访问内部",{"2":{"591":1}}],["外部状态不能被共享",{"2":{"204":1,"754":1}}],["外部状态取决于具体的场景",{"2":{"204":1,"754":1}}],["外部的",{"2":{"190":1}}],["外键",{"0":{"91":1}}],["话不多说",{"2":{"190":1}}],["防盗链",{"0":{"722":1},"2":{"722":2}}],["防止和旧的仓库重名",{"2":{"1098":1}}],["防止未经授权的用户访问和下载镜像",{"2":{"1014":1}}],["防止出错时没有执行done",{"2":{"868":1}}],["防止非法盗链",{"2":{"722":1}}],["防止变量污染",{"2":{"595":1}}],["防止影响其他操作",{"2":{"436":1}}],["防止csrf攻击的方式还是有很多种",{"2":{"353":1}}],["防止数据被窃取",{"2":{"328":1}}],["防止暴力破解密码",{"2":{"61":1}}],["防抖",{"2":{"188":1,"190":1}}],["第41行",{"2":{"1212":1}}],["第4行",{"2":{"588":1}}],["第4行打印出了全局变量global",{"2":{"588":1}}],["第34行",{"2":{"1212":1}}],["第20行",{"2":{"1217":1}}],["第22行",{"2":{"1212":1}}],["第2步await后面的语句已经被放入微任务队列了",{"2":{"532":1}}],["第14行",{"2":{"1217":1}}],["第129行",{"2":{"1212":1}}],["第16行",{"2":{"1212":1}}],["第13行",{"2":{"1212":1}}],["第8行看到镜像内部设置的k1变量",{"2":{"1055":1}}],["第5行",{"2":{"580":1,"588":1}}],["第三次",{"2":{"456":1}}],["第三个小块点击可以快速打断点",{"2":{"435":1}}],["第三方包的忽略",{"2":{"191":1}}],["第三方模块等等",{"2":{"604":1}}],["第三方模块",{"2":{"187":1,"190":1}}],["第二阶段以nginx",{"2":{"1070":1}}],["第二个帧就被弹出栈",{"2":{"529":1}}],["第二个帧被创建并被压入栈中",{"2":{"529":1}}],["第二个会显示抓包范围",{"2":{"435":1}}],["第二次",{"2":{"456":1}}],["第二种方法是创建一个适配器",{"2":{"206":1,"756":1}}],["第二部分是环境类context",{"2":{"197":1,"747":1}}],["第一阶段为build阶段",{"2":{"1070":1}}],["第一轮同步任务执行完毕",{"2":{"532":1}}],["第一次会执行evaluate函数",{"2":{"933":1}}],["第一次",{"2":{"456":1,"934":1}}],["第一种是修改原来的接口实现",{"2":{"206":1,"756":1}}],["第一部分是一组策略类",{"2":{"197":1,"747":1}}],["第一个测试",{"2":{"858":1,"859":2,"860":1,"864":2}}],["第一个帧也被弹出",{"2":{"529":1}}],["第一个帧被创建并压入栈中",{"2":{"529":1}}],["第一个数字表示响应类别",{"2":{"317":1}}],["第一个参数是要被判断的值或表达式",{"2":{"83":1}}],["第一个是要被判断的表达式",{"2":{"83":1}}],["第一层数据为基本数据类型",{"2":{"26":1}}],["依赖自动收集与更新",{"0":{"951":1}}],["依赖收集后那么在修改属性值时会触发set同通过trigger用来派发更新",{"2":{"964":1}}],["依赖收集的过程就是收集activeeffect它是如何运作的呢",{"2":{"964":1}}],["依赖收集集合",{"2":{"959":1}}],["依赖收集时",{"2":{"954":1}}],["依赖收集等等",{"2":{"951":1}}],["依赖收集",{"2":{"932":1}}],["依赖名来为指定的子包安装依赖",{"2":{"815":1}}],["依赖注入",{"0":{"623":1},"1":{"624":1,"625":1,"626":1}}],["依赖关系的管理等",{"2":{"601":1}}],["依次解析",{"2":{"186":1,"190":1}}],["依照字符串fmt格式化时间time值",{"2":{"83":1}}],["依照字符串fmt格式化日期date值",{"2":{"83":1}}],["依照指定的fmt格式格式化日期date值",{"2":{"83":1}}],["扩展指定服务的容器数量",{"2":{"1029":1}}],["扩展",{"2":{"827":1,"842":1}}],["扩展ip地址",{"2":{"370":1}}],["扩展一个tostring方法",{"2":{"228":1}}],["扩展名",{"2":{"186":1,"190":1}}],["扩展插件",{"2":{"172":1}}],["傻傻分不清楚究竟哪个是新生成文件的情况",{"2":{"184":1}}],["综合构建速度",{"2":{"183":1}}],["能够根据预定义的规则和配置",{"2":{"837":1}}],["能够保证服务器在遇到问题时仍能继续提供服务",{"2":{"705":1}}],["能够有效的降低网络带宽",{"2":{"344":1}}],["能够将相关资源预加载到客户端",{"2":{"323":1}}],["能够确保数据的完整性和顺序性",{"2":{"310":1}}],["能够定位到源码的行即可",{"2":{"183":1}}],["能生成一个包括页面性能",{"2":{"214":1}}],["能匹配多的不匹配少的",{"2":{"150":1,"899":1}}],["了解容器化技术",{"2":{"1194":1}}],["了解更多",{"2":{"879":1}}],["了解每个模块的作用对理解整体eslint的配置非常重要",{"2":{"827":1}}],["了解框架的生态系统和社区活跃度",{"2":{"786":1}}],["了解打包工具的生态系统和可用插件",{"2":{"784":1}}],["了解浏览器",{"0":{"526":1},"1":{"527":1}}],["了解和掌握二进制数据有助于优化性能",{"2":{"478":1}}],["了解协议本身有助于我们抓取的准备和方向",{"2":{"454":1}}],["了解相关属性",{"2":{"400":1}}],["了解超时重传前需要知道rtt",{"2":{"389":1}}],["了解如何进行大文件上传与下载对于http的使用难点",{"2":{"345":1}}],["了解它会让我们明白其背后的原理是怎么样的",{"2":{"313":1}}],["了解网络传输本质对于网络的学习也很有帮助",{"2":{"312":1}}],["了解了这几种仓库类型",{"2":{"1104":1}}],["了解了dockerfile的便捷之处后",{"2":{"1051":1}}],["了解了网络模型后那数据到底是怎么传输的呢",{"2":{"311":1}}],["了解了对象转换为原始类型",{"2":{"40":1,"546":1}}],["了",{"2":{"181":1}}],["到家后二话不说立马测了个体温",{"2":{"1236":1}}],["到公司后就开始不断擦鼻涕",{"2":{"1236":1}}],["到了这里相信你也知道数据驱动视图的背后原理了",{"2":{"968":1}}],["到仓库会随着业务的复杂度提升",{"2":{"809":1}}],["到",{"2":{"485":4,"1085":1}}],["到本篇已经讲了3款抓包软件了",{"2":{"460":1}}],["到目前为止还没有任何用处",{"2":{"376":1}}],["到这里你基本上已经会简单的构建镜像了",{"2":{"1070":1}}],["到这里你应该对fiddler有一定的认识了",{"2":{"439":1}}],["到这里其实还差对数组结构方法的拦截",{"2":{"960":1}}],["到这里其实就已经解决了大文件上传的痛处",{"2":{"770":1}}],["到这里关于dockerfile的语法知识已经讲的差不多了",{"2":{"1066":1}}],["到这里关于vue2的响应式过程就结束了",{"2":{"956":1}}],["到这里关于js的eventloop就讲完了",{"2":{"541":1}}],["到这里就把vue的响应式原理全部讲解完了",{"2":{"946":1}}],["到这里基本上将大文件上传的核心功能都已讲完",{"2":{"775":1}}],["到这里基本上都可以看到我们定义的接口了",{"2":{"683":1}}],["到这里已经讲了5中继承方式了",{"2":{"582":1}}],["到这里已经讲了两个抓包工具的使用了",{"2":{"449":1}}],["到这里已经了解了如何用wireshark分析arp协议",{"2":{"458":1}}],["到这里",{"2":{"191":1}}],["到这里我们已经介绍了中",{"2":{"181":1}}],["到时间自动下机",{"2":{"53":1}}],["编写ts文件并将以下代码写入",{"2":{"839":1}}],["编程风格",{"2":{"833":1}}],["编码风格指南",{"2":{"833":1}}],["编辑此文件",{"2":{"1203":1}}],["编辑",{"2":{"1045":1}}],["编辑响应内容",{"2":{"419":1}}],["编辑器集成",{"0":{"832":1}}],["编辑器对于前端开发的效率也会有一定的影响",{"2":{"785":1}}],["编辑器相关",{"0":{"462":1}}],["编辑器分屏",{"2":{"162":1}}],["编辑器管理",{"0":{"162":1}}],["编辑器历史记录",{"2":{"161":1}}],["编译原理",{"2":{"948":1}}],["编译安装文件",{"2":{"718":1}}],["编译nginx",{"2":{"718":1}}],["编译成计算机可以读懂的0",{"2":{"586":1}}],["编译器版本",{"2":{"708":1}}],["编译器假设compiler",{"0":{"269":1}}],["编译器可以拿到的类型有三种",{"2":{"227":1}}],["编译",{"2":{"179":1}}],["根",{"2":{"1121":1}}],["根文件",{"2":{"836":1}}],["根目录下创建",{"2":{"797":1}}],["根目录下匹配路径",{"2":{"712":1}}],["根本的转化都是离不开他们两个",{"2":{"179":1}}],["根据上面提示执行相关命令",{"2":{"1215":1}}],["根据上面三条规则的优先级进行转换",{"2":{"44":1,"550":1}}],["根据提示写入仓库地址",{"2":{"1191":1}}],["根据提供的template",{"2":{"954":1}}],["根据runner的使用范围可以将其分为以下几类",{"2":{"1161":1}}],["根据gitlab的配置地址填写",{"2":{"1158":1}}],["根据文件中的流水线自动构建",{"2":{"1118":1}}],["根据你的需求设置",{"2":{"1098":1}}],["根据自己机器的配置高低等待一段时间",{"2":{"1217":1}}],["根据自己机器的配置等待一段时间",{"2":{"1172":1}}],["根据自己的情况修改",{"2":{"1212":1}}],["根据自己的需求设置发布策略",{"2":{"1042":1}}],["根据自己需求将有关docker的权限移至右侧",{"2":{"1043":1}}],["根据自己节点网卡的名称",{"2":{"728":1}}],["根据名字或标签进行筛选镜像",{"2":{"998":1}}],["根据预定义的风格规则自动格式化",{"2":{"842":1}}],["根据配置的复杂度和灵活度进行选择",{"2":{"784":1}}],["根据当前节点的ip网段设置",{"2":{"728":1}}],["根据节点的性能自行调整",{"2":{"728":1}}],["根据下一步骤创建",{"2":{"728":1}}],["根据检测机制将虚拟ip绑定到指定的机器上",{"2":{"728":1}}],["根据",{"2":{"721":1}}],["根据实际业务调整",{"2":{"674":1}}],["根据实际情况动态添加字典表",{"2":{"326":1}}],["根据词法环境最初定义app方法时",{"2":{"591":1}}],["根据流的背压来判断流有没有满",{"2":{"510":1}}],["根据需要处理错误和取消流",{"2":{"508":1}}],["根据不同状态码显示记录",{"2":{"436":1}}],["根据不同的选项删除抓包记录",{"2":{"431":1}}],["根据不同环境",{"2":{"190":1}}],["根据延时确认机制便会将2",{"2":{"382":1}}],["根据重传机制client等待一段时间重新发送syn",{"2":{"380":1}}],["根据公式可以知道主机位往后移动2位可以得到4段子网",{"2":{"364":1}}],["根据公式2^n",{"2":{"364":1}}],["根据最小子网数往后移动主机位",{"2":{"364":1}}],["根据请求头中的信息判断是否允许跨域请求",{"2":{"337":1}}],["根据身份信息拦截即可",{"2":{"127":1}}],["根据age和name字段",{"2":{"84":1}}],["根据age字段",{"2":{"84":1}}],["根据指定的fmt格式",{"2":{"83":1}}],["根据toprimitive签名定义方法",{"2":{"40":1,"546":1}}],["预检请求会先使用",{"2":{"337":1}}],["预检请求",{"2":{"337":2,"339":1,"724":1}}],["预处理器",{"2":{"179":1}}],["预加载和懒加载等方面",{"2":{"135":1}}],["预加载相对的就是预加载",{"2":{"133":1}}],["预加载顾名思义就是提前加载资源",{"2":{"131":1}}],["预加载",{"0":{"131":1},"2":{"131":2}}],["生态系统和社区支持",{"2":{"785":1,"786":1}}],["生命周期",{"0":{"621":1},"2":{"606":1}}],["生活中会遇到文件的下载这种场景",{"2":{"521":1}}],["生存期ttl",{"0":{"368":1}}],["生存期",{"2":{"367":1}}],["生效的路径",{"2":{"347":1}}],["生效的域名",{"2":{"347":1}}],["生产环境下的配置",{"2":{"190":1}}],["生产环境下默认是true",{"2":{"187":1,"190":1}}],["生产环境打包",{"2":{"182":1}}],["生产环境",{"2":{"177":1,"190":1}}],["生成配置文件",{"2":{"1212":1}}],["生成证书",{"2":{"1178":1}}],["生成证书签名请求",{"2":{"726":1,"1178":1}}],["生成干净的构建环境",{"2":{"1165":1}}],["生成对应的watcher",{"2":{"932":1}}],["生成对应的抽象语法树",{"2":{"587":1}}],["生成git",{"2":{"804":1}}],["生成gz压缩文件",{"2":{"697":1}}],["生成服务器私钥",{"2":{"726":1,"1178":1}}],["生成后的项目目录结构大概长这个样子",{"2":{"665":1}}],["生成一个全新对象",{"2":{"576":1}}],["生成一个随机数",{"2":{"333":1}}],["生成相同的共享密钥",{"2":{"333":1}}],["生成第二个随机数",{"2":{"332":1}}],["生成预主密钥",{"2":{"332":1}}],["生成布局树",{"2":{"279":1}}],["生成css树",{"2":{"279":1}}],["生成dom树",{"2":{"279":1}}],["生成",{"2":{"254":1,"726":1,"954":1,"1178":1}}],["生成报告",{"2":{"216":1}}],["生成的对象会一直对函数内部的作用域变量进行引用",{"2":{"595":1}}],["生成的对象会拥有实例属性和原型对象",{"2":{"582":1}}],["生成的对象的原型指向函数的prototype对象",{"2":{"576":1}}],["生成的hash值和之前dist中的不一样",{"2":{"184":1}}],["生成的html名称",{"2":{"176":1}}],["生成的验证码",{"2":{"61":1}}],["生成bfc元素的子元素中",{"2":{"106":1}}],["作业创建新的",{"2":{"1167":1}}],["作业完成后",{"2":{"1139":1}}],["作业级别的超时",{"2":{"1133":1}}],["作业按照阶段的顺序执行",{"2":{"1125":1}}],["作业定义了在约束条件下进行相关操作",{"2":{"1124":1}}],["作业的失败不会影响after",{"2":{"1124":1}}],["作业的根项目命名空间",{"2":{"1121":1}}],["作业的项目命名空间",{"2":{"1121":1}}],["作业的内部",{"2":{"1121":1}}],["作业集中的作业",{"2":{"1121":1}}],["作业开始时的",{"2":{"1121":1}}],["作业详细信息",{"2":{"1121":1}}],["作业阶段名称",{"2":{"1121":1}}],["作业名称",{"2":{"1121":1}}],["作用",{"0":{"794":1,"811":1,"1050":1}}],["作用范围",{"2":{"606":1}}],["作用域问题等等",{"2":{"825":1}}],["作用域链和执行栈的作用",{"2":{"596":1}}],["作用域链和闭包",{"0":{"585":1},"1":{"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"596":1}}],["作用域链是针对变量可访性的",{"2":{"591":1}}],["作用域链是一种访问方式",{"2":{"591":1}}],["作用域链",{"0":{"591":1}}],["作用域等一些信息",{"2":{"590":1}}],["作用域是可以嵌套的",{"2":{"589":1}}],["作用域和词法环境其实很简单",{"2":{"589":1}}],["作用域的block",{"2":{"588":1}}],["作用域的变量",{"2":{"587":1}}],["作用域",{"0":{"585":1,"589":1,"625":1,"790":1},"1":{"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"596":1},"2":{"788":1}}],["作者本人也是在不断学习中",{"2":{"271":1}}],["作者打算对项目将会进行重构",{"2":{"66":1}}],["作为负载均衡方式",{"2":{"1206":1}}],["作为制作镜像的最基础的镜像层",{"2":{"1069":1}}],["作为参数传入",{"2":{"945":1}}],["作为值",{"2":{"830":1}}],["作为静态服务使用时",{"2":{"712":1}}],["作为电子邮件服务器",{"2":{"706":1}}],["作为web服务器",{"2":{"706":1}}],["作为函数的参数",{"2":{"606":1}}],["作为函数内部的this指向",{"2":{"577":1}}],["作为普通函数",{"2":{"573":1}}],["作为构造函数",{"2":{"573":1}}],["作为原型属性介绍",{"2":{"571":1}}],["作为ack数据包发送给服务端",{"2":{"456":1}}],["作为非网络工程师对于更深的概念了解下即可",{"2":{"395":1}}],["作为",{"2":{"176":1,"1063":1}}],["打了个喷嚏",{"2":{"1236":1}}],["打电话又被拒绝",{"2":{"1232":1}}],["打赏",{"0":{"1227":1}}],["打tag",{"2":{"1046":1,"1184":1}}],["打一个新镜像",{"2":{"1002":1}}],["打标签",{"0":{"1108":1},"2":{"728":1}}],["打印顺序",{"2":{"538":1}}],["打印如下",{"2":{"232":1}}],["打印请求耗时",{"2":{"230":1}}],["打印结果如下",{"2":{"229":1}}],["打印",{"2":{"225":1,"532":1}}],["打印更新了文件的路径",{"2":{"190":1}}],["打包管理流程",{"2":{"814":1}}],["打包",{"2":{"801":1}}],["打包工具要选择适合自己的",{"2":{"784":1}}],["打包工具的出现使得前端开发更加规范和可维护",{"2":{"784":1}}],["打包路径",{"2":{"181":1}}],["打包后的文件名",{"2":{"175":1}}],["打包的目的路径",{"2":{"175":1}}],["打开vue3的项目首先看package",{"2":{"966":1}}],["打开报告页面",{"2":{"874":1}}],["打开配置文件",{"2":{"858":1}}],["打开配置文件如下",{"2":{"709":1}}],["打开游览器访问general",{"2":{"726":1}}],["打开本地捕获文件",{"2":{"452":1}}],["打开手机设置",{"2":{"439":1}}],["打开rules",{"2":{"438":1}}],["打开safari输入网址http",{"2":{"438":1}}],["打开safari输入charles地址192",{"2":{"422":1}}],["打开safari访问https",{"2":{"422":1}}],["打开浏览器输入nest的服务地址加上swagger的urlhttp",{"2":{"682":1}}],["打开浏览器输入chrome",{"2":{"399":1}}],["打开浏览器的开发者工具",{"2":{"216":1}}],["打开开发者工具",{"2":{"215":1}}],["打开新终端",{"2":{"164":1}}],["打开新窗口",{"2":{"156":1}}],["打开上一个",{"2":{"163":1}}],["打开下一个",{"2":{"163":1}}],["打开下载页面后",{"2":{"68":1}}],["打开文件",{"2":{"163":1}}],["打开问题面板",{"2":{"161":1}}],["打开建议",{"2":{"160":1}}],["打开需要10几秒",{"2":{"129":1}}],["打开终端",{"2":{"69":1}}],["打开我们的系统偏好设置就多出现mysql服务",{"2":{"68":1}}],["打开后将网站拉到最底部",{"2":{"68":1}}],["打开命令板",{"2":{"56":2}}],["模版引擎用的ejs",{"2":{"673":1}}],["模拟vue的组件递归渲染",{"2":{"951":1}}],["模拟每个组件的真实渲染数据",{"2":{"951":1}}],["模拟函数",{"0":{"869":1},"2":{"869":2}}],["模拟真实的用户交互和场景",{"2":{"854":1}}],["模拟请求等",{"2":{"881":1}}],["模拟请求",{"2":{"514":1}}],["模拟或覆盖服务器返回的数据",{"2":{"428":1}}],["模拟不同的网络俗",{"2":{"411":1}}],["模拟获取用户信息",{"2":{"229":1}}],["模式的配置设置",{"2":{"1121":1}}],["模式",{"2":{"329":1}}],["模式了",{"2":{"195":1,"745":1}}],["模块引用转换",{"2":{"858":1}}],["模块匹配规则",{"2":{"857":1}}],["模块化和清晰的代码结构可以促进团队协作",{"2":{"824":1}}],["模块",{"2":{"811":1,"1206":1}}],["模块对",{"2":{"717":1}}],["模块划分",{"0":{"687":1}}],["模块注册",{"0":{"659":1}}],["模块没有注入不会报错",{"2":{"626":1}}],["模块是nest应用程序的起点",{"2":{"604":1}}],["模块打包器常用于构建库",{"2":{"237":1}}],["模块转换器",{"2":{"172":1}}],["模板进行编译",{"2":{"954":1}}],["模板编译",{"2":{"951":1,"954":2}}],["模板渲染时并不会触发计算属性的多次执行",{"2":{"931":1}}],["模板中使用3个计算属性",{"2":{"930":1}}],["模板内的表达式非常便利",{"2":{"928":1}}],["模板引擎文件夹下的文件路径",{"2":{"671":1}}],["模板引擎文件夹",{"2":{"671":1}}],["模板引擎",{"0":{"671":1}}],["模板方法",{"2":{"210":1,"760":1}}],["模板方法使得子类可以在不改变算法结构的情况下",{"2":{"207":1,"757":1}}],["模板方法模式",{"0":{"207":1,"757":1}}],["模板",{"2":{"176":1}}],["模糊查询的效率非常低",{"2":{"85":1}}],["模糊查询",{"0":{"85":1}}],["各种软件",{"2":{"1079":1}}],["各种页面五花八门的交互以及并发资源请求等都出现了",{"2":{"524":1}}],["各个版本大同小异",{"2":{"170":1}}],["各大云服务厂商各种推广",{"2":{"123":1}}],["待改写的方法",{"2":{"955":1}}],["待拦截的对象",{"2":{"951":1}}],["待当前同步任务执行完后",{"2":{"532":1}}],["待补充",{"2":{"168":1,"192":1,"234":1,"253":1,"258":1,"259":1,"281":1,"463":1,"464":1,"598":1,"600":1,"735":1,"737":1,"738":1,"741":1,"742":1,"777":1,"778":1,"904":1,"922":1,"977":1,"981":1,"982":1,"988":1,"989":1,"990":1}}],["待更新",{"2":{"91":1,"98":1,"134":1,"272":1,"410":1,"427":1,"441":1,"442":1,"733":1,"763":1,"780":1,"781":1,"921":1,"1193":1}}],["共有",{"2":{"1085":1}}],["共有两处",{"2":{"140":1,"889":1}}],["共同构成了一个全面的测试策略",{"2":{"851":1}}],["共同完成缓存",{"2":{"168":1}}],["共享runner",{"2":{"1161":1}}],["共享模块可以定义一组公共的",{"2":{"609":1}}],["共享模块是一种用于组织和重用代码的机制",{"2":{"609":1}}],["共享密钥加密",{"2":{"330":1}}],["共两步",{"2":{"422":1}}],["概念与作用",{"0":{"1110":1}}],["概念的具体实现",{"2":{"517":1}}],["概念",{"0":{"168":1,"225":1,"810":1,"1049":1}}],["又或成员更偏于react则选其",{"2":{"786":1}}],["又会绑定到另一个健康的机器上",{"2":{"728":1}}],["又可以冒充正常的原型对象",{"2":{"582":1}}],["又在哪里创建缓存器呢",{"2":{"248":1}}],["又有那些缓存策略呢",{"2":{"167":1}}],["又根据拆箱优先级会先执行valueof方法",{"2":{"48":1,"554":1}}],["跳过错误",{"2":{"771":1}}],["跳过的文件",{"2":{"400":1}}],["跳过",{"2":{"165":1,"195":1,"745":1}}],["跳出",{"2":{"165":1}}],["跳转至某行",{"2":{"161":1}}],["跳转至文件结尾",{"2":{"157":1}}],["跳转至文件开头",{"2":{"157":1}}],["跳转至行首",{"2":{"157":1}}],["跳转到某个符号",{"2":{"161":1}}],["跳转到某个文件",{"2":{"161":1}}],["跳转到声明位置",{"2":{"160":1}}],["跳转到行尾",{"2":{"157":1}}],["跳转到匹配的括号",{"2":{"157":1}}],["调整ide关于prettier的配置",{"2":{"840":1}}],["调度系统支持",{"2":{"660":1}}],["调度页面的加载解析",{"2":{"526":1}}],["调度等全局作用",{"2":{"526":1}}],["调制解调制等",{"2":{"309":1}}],["调试成本变大",{"2":{"809":1}}],["调试工具",{"2":{"785":1}}],["调试功能",{"2":{"785":1}}],["调试请求",{"2":{"428":1}}],["调试vue",{"0":{"406":1}}],["调试react",{"0":{"405":1}}],["调试网页程序",{"0":{"403":1},"1":{"404":1,"405":1,"406":1,"407":1}}],["调试需编译的程序",{"0":{"402":1}}],["调试面板中会和chrome一样有作用域",{"2":{"400":1}}],["调试node程序",{"0":{"398":1},"1":{"399":1,"400":1,"401":1,"402":1}}],["调试",{"0":{"165":1},"2":{"399":1}}],["调用持久化的",{"2":{"1121":1}}],["调用栈就是来执行js代码的",{"2":{"529":1}}],["调用栈",{"0":{"529":1},"2":{"528":1}}],["调用栈等一些信息",{"2":{"404":1}}],["调用堆栈等信息",{"2":{"400":1}}],["调用tologin方法",{"2":{"232":1}}],["调用者不需要知道内部的构造",{"2":{"200":1,"750":1}}],["调用",{"2":{"195":1,"529":1,"745":1}}],["调用encode",{"2":{"83":1}}],["调用aes",{"2":{"83":1}}],["隐藏相关地址",{"2":{"436":1}}],["隐藏内部网络拓扑结构",{"2":{"370":1}}],["隐藏了一个表单",{"2":{"352":1}}],["隐藏高级搜索",{"2":{"164":1}}],["隐藏侧边栏",{"2":{"164":1}}],["隐式自动注入只会对参数做处理",{"2":{"685":1}}],["隐式转换",{"2":{"643":2,"646":1}}],["隐式转换等等",{"2":{"477":1}}],["隐式转换就可以搞懂了",{"2":{"47":1,"553":1}}],["隐式装箱",{"2":{"38":1,"544":1}}],["竖",{"2":{"164":1}}],["横",{"2":{"164":1}}],["激活右侧编辑组",{"2":{"162":1}}],["激活左侧编辑组",{"2":{"162":1}}],["拖动鼠标",{"2":{"158":1}}],["选项值",{"2":{"1131":1}}],["选项主要是加载最近",{"2":{"430":1}}],["选项类型",{"2":{"376":1}}],["选项",{"2":{"367":1,"376":1}}],["选取渲染进程准备渲染",{"2":{"276":1}}],["选中移入右侧后创建",{"2":{"1106":1}}],["选中节点",{"2":{"462":1}}],["选中所有匹配项",{"2":{"159":1}}],["选中所有与当前选中单词相同的单词",{"2":{"158":1}}],["选中所有与当前选中内容相同部分",{"2":{"158":1}}],["选中代码块",{"2":{"158":1}}],["选中当前行",{"2":{"158":1}}],["选择存储集",{"2":{"1106":1}}],["选择存储集为npm",{"2":{"1105":1}}],["选择存储集docker",{"2":{"1042":1}}],["选择active",{"2":{"1100":1}}],["选择提交类型",{"2":{"800":1}}],["选择应更倾于项目本身的复杂度和项目小组的偏向",{"2":{"786":1}}],["选择最适合自己的",{"2":{"785":1}}],["选择最佳传输路径",{"2":{"309":1}}],["选择一款合适的编辑器也是很重要的",{"2":{"785":1}}],["选择一个跨平台支持的编辑器能够方便你在不同环境中进行开发工作",{"2":{"785":1}}],["选择一个有活跃的社区和丰富的插件生态系统的编辑器",{"2":{"785":1}}],["选择一个具备你需要的功能和扩展性的编辑器",{"2":{"785":1}}],["选择一个网卡开始捕获",{"2":{"450":1}}],["选择一个私钥",{"2":{"333":2}}],["选择connectionstab",{"2":{"438":1}}],["选择不同的进程来抓包",{"2":{"436":1}}],["选择不同的操作系统",{"2":{"68":1}}],["选择适合自己的操作系统",{"2":{"450":1}}],["选择适合自己的工具",{"2":{"217":1}}],["选择适合自己系统的点击",{"2":{"412":1}}],["选择save",{"2":{"407":1}}],["选择完后chrome会提示访问权限",{"2":{"407":1}}],["选择overrides",{"2":{"407":1}}],["选择两个质数",{"2":{"333":1}}],["选择要默认访问网站的设备",{"2":{"220":1}}],["选择是由|标识进行匹配",{"2":{"143":1,"892":1}}],["选择",{"0":{"142":1,"143":1,"891":1,"892":1},"1":{"143":1,"144":1,"145":1,"146":1,"892":1,"893":1,"894":1,"895":1},"2":{"430":1}}],["选择字段",{"2":{"80":1}}],["选择插入",{"2":{"77":1}}],["选择插入对应值",{"2":{"77":1}}],["撤销上一个光标操作",{"2":{"158":1}}],["取代了",{"2":{"965":1}}],["取代传统的middleware鉴权处理",{"2":{"647":1}}],["取代非标准的",{"2":{"571":1}}],["取出最老的一个任务将其压入调用栈中执行",{"2":{"531":1}}],["取到链接参数渲染页面",{"2":{"350":1}}],["取到自定义验证器",{"2":{"232":1}}],["取消流的写入",{"2":{"516":1}}],["取消流的读取",{"2":{"512":1}}],["取消后会触发内部的cancel属性",{"2":{"512":1}}],["取消",{"2":{"510":1}}],["取消它等等",{"2":{"508":1}}],["取消断点",{"2":{"165":1}}],["取消自动换行",{"2":{"157":1}}],["取得地址后从堆中获得实体",{"2":{"24":1}}],["移动画笔",{"2":{"283":1}}],["移动端易用测试",{"2":{"779":1}}],["移动端兼容性",{"2":{"22":1}}],["移动端推荐使用flex",{"2":{"22":1}}],["移除cri",{"2":{"1209":1}}],["移除目标manager",{"2":{"245":1}}],["移除前一个向下选中相同内容",{"2":{"159":1}}],["移除块注释",{"2":{"157":1}}],["移除行注释",{"2":{"157":2}}],["添加域名",{"2":{"1175":1}}],["添加了对应的dns记录",{"2":{"1090":1}}],["添加判断",{"2":{"964":1}}],["添加到当前",{"2":{"959":1}}],["添加待执行的方法",{"2":{"950":1}}],["添加分号",{"2":{"839":1}}],["添加prettier自动格式化配置",{"2":{"838":1}}],["添加以下脚本在commit时启动commitlint检查提交信息",{"2":{"806":1}}],["添加以下内容",{"2":{"728":1}}],["添加响应头部返回给客户端",{"2":{"723":1}}],["添加延时任务",{"2":{"661":1}}],["添加间隔任务",{"2":{"661":1}}],["添加调度任务",{"2":{"661":1}}],["添加child自定义的原型方法",{"2":{"582":1}}],["添加自定义方法属性",{"2":{"581":1}}],["添加抓取的ip为",{"2":{"421":1}}],["添加vscode调试配置",{"2":{"404":1}}],["添加对xhr的请求url的断点",{"2":{"404":1}}],["添加配置直接生成配置文件",{"2":{"400":1}}],["添加当前元素",{"2":{"245":1}}],["添加less",{"2":{"179":1}}],["添加html",{"2":{"176":1}}],["添加",{"2":{"157":2,"571":1,"839":1,"955":1}}],["添加行注释",{"2":{"157":1}}],["添加mysql环境变量",{"2":{"69":1}}],["展开选中",{"2":{"158":1}}],["展开全部代码块",{"2":{"157":1}}],["展开全部子代码块",{"2":{"157":1}}],["展开代码块",{"2":{"157":1}}],["折叠空格",{"2":{"176":1}}],["折叠选中",{"2":{"158":1}}],["折叠全部代码块",{"2":{"157":1}}],["折叠全部子代码块",{"2":{"157":1}}],["折叠代码块",{"2":{"157":1}}],["按下e\\t进入控制台",{"2":{"1202":1}}],["按i进入编辑模式",{"2":{"1202":1}}],["按需创建构建主机",{"2":{"1166":1}}],["按理说p1只用到name属性不会执行",{"2":{"951":1}}],["按理说这里直接执行函数会报错啊",{"2":{"587":1}}],["按钮",{"2":{"875":1,"879":1,"1097":1,"1098":1}}],["按文件名等划分一些公共方法",{"2":{"809":1}}],["按比例将图像缩小到较大的一侧",{"2":{"718":1}}],["按比例缩放图像",{"2":{"718":1}}],["按模块划分",{"2":{"665":1}}],["按定义从上往下",{"2":{"233":2}}],["按",{"2":{"215":1}}],["按照自己需求进行配置",{"2":{"1045":1}}],["按照new规范将构造器指向child自己",{"2":{"582":1}}],["按照执行时机",{"2":{"540":1}}],["按照事件循环机制check阶段会在timer阶段前执行",{"2":{"539":1}}],["按照数据存储类型分为",{"2":{"168":1}}],["按照缓存位置可以分为",{"2":{"168":1}}],["按照失效缓存策略分为",{"2":{"168":1}}],["按屏向下滚动",{"2":{"157":1}}],["按屏向上滚动",{"2":{"157":1}}],["按行向下滚动",{"2":{"157":1}}],["按行向上滚动",{"2":{"157":1}}],["向客户端发送一个",{"2":{"333":1}}],["向右",{"2":{"158":1}}],["向左",{"2":{"158":1}}],["向下滚动",{"2":{"166":1}}],["向下选中相同内容",{"2":{"159":1}}],["向下翻页",{"2":{"158":1,"166":1}}],["向下",{"2":{"158":1}}],["向下插入光标",{"2":{"158":1}}],["向下复制行",{"2":{"157":1}}],["向下移动行",{"2":{"157":1}}],["向上滚动",{"2":{"166":1}}],["向上翻页",{"2":{"158":1,"166":1}}],["向上",{"2":{"158":1}}],["向上插入光标",{"2":{"158":1}}],["向上复制行",{"2":{"157":1}}],["向上移动行",{"2":{"157":1}}],["复原dep",{"2":{"954":1}}],["复杂度有更深入的认识",{"2":{"345":1}}],["复制本地文件",{"2":{"1060":1}}],["复制本地文件或路径到容器的文件系统",{"2":{"1059":1}}],["复制粘贴记录",{"2":{"414":1}}],["复制当前文件路径",{"2":{"163":1}}],["复制光标所在行",{"2":{"157":1}}],["复制",{"2":{"157":1}}],["复用tcp连接",{"2":{"321":1}}],["复用即量词",{"2":{"141":1,"890":1}}],["复用",{"0":{"141":1,"890":1}}],["剪切光标所在行",{"2":{"157":1}}],["剪切",{"2":{"157":1}}],["快照保存路径",{"2":{"878":1}}],["快照之类",{"2":{"877":1}}],["快捷设置菜单",{"2":{"413":1}}],["快捷键设置",{"2":{"785":1}}],["快捷键忘了的可以查阅此文档",{"2":{"155":1}}],["快捷键",{"2":{"155":1}}],["快速定位",{"2":{"1202":1}}],["快速部署和易于管理的目的",{"2":{"992":1}}],["快速执行的",{"2":{"853":1}}],["快速导航等功能",{"2":{"785":1}}],["快速诊断配置文件问题",{"2":{"708":1}}],["快速重传会推断出现丢包",{"2":{"391":1}}],["快速重传不是基于定时器",{"2":{"391":1}}],["快速重传",{"0":{"391":1}}],["快速返回",{"2":{"339":1,"724":1}}],["快速修复",{"2":{"160":1}}],["快速打开",{"2":{"156":1}}],["显式模块",{"2":{"688":1}}],["显式定义",{"0":{"686":1}}],["显式注入配置的key",{"2":{"631":1}}],["显式注入",{"2":{"606":2,"624":1}}],["显式返回一个对象",{"2":{"576":1}}],["显式装箱",{"2":{"38":1,"544":1}}],["显示名字",{"2":{"1100":1}}],["显示容器的磁盘使用情况",{"2":{"1006":1}}],["显示完整的容器",{"2":{"1006":1}}],["显示有无使用的镜像",{"2":{"998":1}}],["显示所有容器",{"2":{"1006":1}}],["显示所有镜像中间层镜像",{"2":{"998":1}}],["显示所有符号",{"2":{"161":1}}],["显示文件的确切大小",{"2":{"712":1}}],["显示http协议的请求",{"2":{"453":1}}],["显示过滤器主要是对抓取到的网络数据包进行过滤显示",{"2":{"453":1}}],["显示详细的封包资料",{"2":{"449":1}}],["显示请求地址包含xxx的请求",{"2":{"436":1}}],["显示抓包的记录",{"2":{"413":1}}],["显示终端",{"2":{"166":1}}],["显示悬停信息",{"2":{"165":1}}],["显示输出面板",{"2":{"164":1}}],["显示插件面板",{"2":{"164":1}}],["显示调试面板",{"2":{"164":1}}],["显示git面板",{"2":{"164":1}}],["显示搜索框",{"2":{"164":1}}],["显示资源管理器",{"2":{"164":1}}],["显示",{"0":{"164":1},"2":{"164":2,"279":1}}],["显示引用",{"2":{"160":1}}],["显示命令面板",{"2":{"156":1}}],["全栈知识如java",{"2":{"1223":1}}],["全栈",{"2":{"1223":1}}],["全称域名",{"2":{"726":1,"1178":1}}],["全匹配",{"2":{"711":2}}],["全停顿",{"2":{"559":1}}],["全双工的单播协议",{"2":{"455":1}}],["全双工连接指的是通信双方可以同时发送和接收数据",{"2":{"384":1}}],["全是乱码",{"2":{"421":1}}],["全连接队列",{"2":{"380":1}}],["全1表示广播地址不能作为ip使用",{"2":{"358":1}}],["全屏",{"2":{"164":1}}],["全部关闭",{"2":{"163":1}}],["全部保存",{"2":{"163":1}}],["全部插入",{"2":{"77":1}}],["全局未指定image",{"2":{"1145":1}}],["全局命令",{"0":{"994":1},"2":{"992":1,"1015":1}}],["全局唯一激活的",{"2":{"954":1}}],["全局配置",{"2":{"878":1}}],["全局配置中间件",{"2":{"635":1}}],["全局return",{"2":{"829":1}}],["全局变量",{"2":{"827":1}}],["全局共享配置",{"2":{"669":1}}],["全局共享一个实例",{"2":{"606":1}}],["全局作用域",{"2":{"588":2}}],["全局注册",{"2":{"245":1}}],["全局插件",{"2":{"191":1}}],["全局提供插件",{"2":{"190":1}}],["全局搜索替换",{"2":{"164":1}}],["全局",{"0":{"156":1},"2":{"589":1}}],["版权",{"0":{"1228":1}}],["版起",{"2":{"1207":1}}],["版本直接集成了",{"2":{"1207":1}}],["版本为教程",{"2":{"1170":1}}],["版本之前",{"2":{"1121":1}}],["版本方案",{"0":{"820":1},"1":{"821":1}}],["版本引擎",{"2":{"665":1}}],["版本控制和问题跟踪",{"2":{"811":1}}],["版本控制功能",{"2":{"785":1}}],["版本控制集成",{"2":{"785":2}}],["版本控制集成等",{"2":{"785":1}}],["版本控制",{"0":{"654":1},"1":{"655":1,"656":1},"2":{"654":1,"655":1}}],["版本",{"2":{"367":1,"1018":1}}],["版本号",{"2":{"708":1,"729":1}}],["版本号卸载指定node含npm",{"2":{"96":1}}],["版本号下载指定版本node",{"2":{"96":1}}],["版本号切换版本",{"2":{"95":1}}],["版",{"2":{"155":1}}],["初识kubernetes",{"0":{"1193":1}}],["初识dockerfile",{"0":{"1051":1}}],["初识dockercompose",{"0":{"1018":1}}],["初步探索",{"2":{"980":1}}],["初次提交",{"2":{"1183":1}}],["初次进入后可以修改密码",{"2":{"1096":1}}],["初次使用我们先点击生成官方例子",{"2":{"877":1}}],["初次下载不会有任何测试用例的",{"2":{"877":1}}],["初次之外还可以注入其他类作为函数的参数使用",{"2":{"606":1}}],["初次之外还有set方法常用来合并多个类型数组",{"2":{"485":1}}],["初次访问时对静态资源进行缓存或储存",{"2":{"132":1}}],["初学者不适",{"2":{"211":1,"761":1}}],["初始密码在容器内",{"2":{"1095":1}}],["初始密码",{"0":{"1095":1}}],["初始化k8s集群",{"0":{"1214":1}}],["初始化新的配置",{"2":{"1209":1}}],["初始化集群master节点时作为",{"2":{"1200":1}}],["初始化基础的镜像",{"2":{"1053":1}}],["初始化过程",{"0":{"937":1}}],["初始化时由于opts传入lazy",{"2":{"932":1}}],["初始化computed",{"2":{"932":1}}],["初始化仓库",{"2":{"814":1}}],["初始化",{"0":{"857":1},"2":{"718":1,"801":2,"814":1,"937":1,"953":1,"1183":1}}],["初始化默认错误",{"2":{"245":1}}],["初始化插件时",{"2":{"243":1}}],["初始化全局api",{"2":{"238":1}}],["初始化项目",{"0":{"173":1,"1183":1},"2":{"800":2,"1074":1}}],["初始为0",{"2":{"152":1,"901":1}}],["惰性清理",{"0":{"566":1},"2":{"559":1}}],["惰性",{"2":{"150":1,"899":1}}],["惰性使用",{"2":{"150":1,"899":1}}],["贪婪",{"2":{"150":1,"899":1}}],["贪婪与惰性",{"0":{"150":1,"899":1}}],["€",{"2":{"148":1,"897":1}}],["详情见",{"2":{"1228":1}}],["详情面板",{"0":{"436":1},"1":{"437":1},"2":{"429":1}}],["详情请查看文档",{"2":{"350":1}}],["详细内容",{"2":{"708":1}}],["详细使用请看wriablestream",{"2":{"512":1}}],["详细过程请自行翻阅相关文档",{"2":{"333":1}}],["详细步骤已经在",{"2":{"323":1,"328":1}}],["详细的文档地址",{"2":{"61":1,"64":1}}],["详见前面",{"2":{"146":1,"895":1}}],["斜杠和数字",{"2":{"146":1,"895":1}}],["斜杠加一个数字的形式引用所有引用的第一个",{"2":{"145":1,"894":1}}],["遇到await",{"2":{"532":1}}],["遇到settimeout定时宏任务时交给定时线程去执行",{"2":{"532":1}}],["遇到不太懂的或者自己的疑问",{"2":{"271":1}}],["遇到不会的就百度搜一搜",{"2":{"124":1}}],["遇到排除捕获跳过当前",{"2":{"145":1,"146":1,"894":1,"895":1}}],["由以下三种符号来表示扩展的关系",{"2":{"850":1}}],["由管道一侧转换成管道另一侧的产物",{"2":{"784":1}}],["由",{"2":{"729":1}}],["由单进程到多进程",{"2":{"526":1}}],["由javascript的宿主环境提供额外的属性和方法",{"2":{"525":1}}],["由google开发",{"2":{"525":1}}],["由blob",{"2":{"494":1}}],["由发送方通过头部",{"2":{"376":1}}],["由此可知可选部分的最大长度为40字节",{"2":{"376":1}}],["由4个8位二进制组成的数字",{"2":{"358":1}}],["由服务器进行管理",{"2":{"348":1}}],["由服务器设置",{"2":{"347":1}}],["由外到内",{"2":{"145":1,"146":1,"894":1,"895":1}}],["由左到右分别是cwr",{"2":{"376":1}}],["由左到右",{"2":{"145":1,"146":1,"894":1,"895":1}}],["由于没有任何措施周五就开始发烧了",{"2":{"1236":1}}],["由于机器上可能有多个网卡",{"2":{"1217":1}}],["由于k8s时区不同可能会影响容器中应用程序的时间戳和日志记录",{"2":{"1204":1}}],["由于本人是在虚拟机上演示",{"2":{"1201":1}}],["由于自签证书不安全",{"2":{"1178":1}}],["由于自签证书没有被ca认证会被浏览器鉴定不安全的链接",{"2":{"726":1}}],["由于我们挂载了卷",{"2":{"1174":1}}],["由于我们是基于http发送的",{"2":{"775":1}}],["由于虚拟机占用了ssh端口22",{"2":{"1172":1}}],["由于官方镜像没有提供支持arm架构的镜像",{"2":{"1094":1}}],["由于官方并没有提供i18n的服务",{"2":{"672":1}}],["由于docker的官方仓库在国外",{"2":{"1082":1}}],["由于dhcp",{"2":{"301":1}}],["由于一条run指令便会产生新的镜像层",{"2":{"1058":1}}],["由于一些历史原因",{"2":{"450":1}}],["由于proxy只能拦截对象无法对原始类型进行拦截",{"2":{"962":1}}],["由于parent也是c2原型链",{"2":{"579":1}}],["由于sync位true",{"2":{"942":1}}],["由于session存放在服务端",{"2":{"348":1}}],["由于lazy为true",{"2":{"932":1}}],["由于定义在computed中又被称为计算wathcer",{"2":{"931":1}}],["由于所有项目或组件在同一个代码仓库中",{"2":{"811":1}}],["由于文件太大需要将其分割成若干个小块分批次传输",{"2":{"776":1}}],["由于文件的上传是由用户在前端表单发送的",{"2":{"764":1}}],["由于流量都是通过nginx入口分发给应用服务",{"2":{"728":1}}],["由于其存在队头阻塞的问题",{"2":{"727":1}}],["由于太大将会重定向到错误图片",{"2":{"718":1}}],["由于每个项目或者业务的不同语言匹配也需要定制化",{"2":{"674":1}}],["由于全局作用域的存在",{"2":{"594":1}}],["由于jest和cypress有着形同的api",{"2":{"882":1}}],["由于javascript是单线程的",{"2":{"592":1}}],["由于js是单线程的且js引擎执行会阻塞浏览器渲染",{"2":{"773":1}}],["由于js通常伴随着它的宿主环境浏览器而出现",{"2":{"524":1}}],["由于js没有元素格式化日期的方法",{"2":{"60":1}}],["由于js的弱类型特征",{"2":{"41":1,"547":1}}],["由于js被定位成动态弱类型语言",{"2":{"36":1,"542":1}}],["由于原型式继承返回的是空对象",{"2":{"581":1}}],["由于原型链的作用父类中的实例属性并没有作用",{"2":{"580":1}}],["由于c1本身是不存在的",{"2":{"579":1}}],["由于修改原型是个极其耗时的工作",{"2":{"571":1}}],["由于历史原因",{"2":{"571":1}}],["由于浏览器内部也在不断的升级优化",{"2":{"526":1}}],["由于读取文件是非常耗时的过程",{"2":{"507":1}}],["由于file继承于blob对象所以也用了blob的相关属性",{"2":{"500":1,"501":1}}],["由于http",{"2":{"727":1}}],["由于http协议是基于tcp协议的",{"2":{"458":1}}],["由于http2都会共用同一个tcp连接",{"2":{"324":1}}],["由于为了提高传输效率http使用keep",{"2":{"457":1}}],["由于是不同工具",{"2":{"411":1}}],["由于网络波动等种种原因",{"2":{"388":1}}],["由于链路层的最大mtu为1500",{"2":{"372":1}}],["由于私有ip地址在internet上是不可路由的",{"2":{"370":1}}],["由于回环地址不会通过网络传输",{"2":{"361":1}}],["由于篇幅原因这里不做演示了",{"2":{"345":1}}],["由于篇幅原因这里不再详细展开",{"2":{"335":1}}],["由于非对称加密过程很耗时",{"2":{"330":1}}],["由于握手阶段双方还没有互相认证",{"2":{"330":1}}],["由于密钥需要在通信双方之间共享",{"2":{"330":1}}],["由于同一",{"2":{"324":1}}],["由于不同的厂商和组织都在开发自己的网络协议",{"2":{"309":1}}],["由于arp缓存表中的信息是动态的",{"2":{"298":1}}],["由于工作原因我们奔波在四海",{"2":{"1232":1}}],["由于工作原因我也无法立马飞过去去照顾我爸",{"2":{"1232":1}}],["由于工作原因",{"2":{"239":1,"252":1,"271":1,"991":1}}],["由于",{"2":{"107":1,"111":1,"320":1,"329":1,"1065":1}}],["由于兼容性不太好",{"2":{"21":1}}],["类class",{"0":{"916":1}}],["类",{"2":{"606":2,"995":1,"1081":1}}],["类的构造器",{"2":{"228":1}}],["类装饰器可以继承现有类添加或修改一些属性或方法",{"2":{"228":1}}],["类装饰器",{"0":{"228":1},"2":{"233":2}}],["类访问器属性",{"2":{"226":1}}],["类访问器",{"2":{"225":1}}],["类方法参数装饰器",{"2":{"226":1}}],["类方法的参数",{"2":{"225":1}}],["类方法",{"2":{"225":1,"226":1}}],["类属性",{"2":{"225":1,"226":1}}],["类本身",{"2":{"225":1}}],["类似与linux或dfs这种文件系统的挂载",{"2":{"1110":1}}],["类似java虚拟机",{"2":{"525":1}}],["类似于以前的jsp",{"2":{"671":1}}],["类似于array的slice",{"2":{"496":1}}],["类似于嵌套文件夹",{"2":{"414":1}}],["类似",{"2":{"145":1,"720":1,"894":1}}],["类型提示更加友好",{"2":{"957":1}}],["类型推导",{"2":{"915":1}}],["类型推断",{"2":{"629":1}}],["类型收窄",{"2":{"915":1}}],["类型守卫",{"0":{"915":1}}],["类型查询typeof",{"0":{"914":1}}],["类型是否为空",{"2":{"797":1}}],["类型为number",{"2":{"646":1}}],["类型转换和验证pipe",{"2":{"643":1}}],["类型转换函数",{"2":{"83":1}}],["类型的",{"2":{"498":1}}],["类型的迭代器",{"2":{"154":1,"903":1}}],["类型化数组对象",{"2":{"479":1}}],["类型嗅探行为",{"2":{"350":1}}],["类型定义",{"2":{"249":1,"483":1,"611":2}}],["类型有",{"2":{"83":1}}],["类型相同的变量会直接比较",{"2":{"48":1,"554":1}}],["类型",{"2":{"41":1,"154":1,"228":1,"229":1,"230":1,"232":1,"317":1,"319":1,"350":1,"547":1,"797":1,"903":1,"1097":1}}],["类型隐式转换可以归结为number",{"2":{"41":1,"547":1}}],["类型隐式转换",{"0":{"41":1,"547":1}}],["类型时",{"2":{"40":1,"546":1}}],["类型不同的变量永远不会相等",{"2":{"36":1,"542":1}}],["写法就像一个一维数组",{"2":{"1058":1}}],["写法不一样",{"2":{"145":1,"894":1}}],["写上自己仓库",{"2":{"1046":1}}],["写一份更优质的代码",{"2":{"991":1}}],["写作中",{"2":{"924":1,"947":1,"967":1,"969":1,"970":1,"971":1,"972":1,"973":1,"976":1}}],["写作时间有限",{"2":{"252":1,"271":1,"991":1}}],["写测试的时候你经常需要在运行测试前做一些准备工作",{"2":{"871":1}}],["写入不需要格式化的文件或路径",{"2":{"848":1}}],["写入不想要文件或路径",{"2":{"841":1}}],["写入文件的指定位置",{"2":{"770":1}}],["写屏障",{"0":{"565":1},"2":{"559":1}}],["写的所以要懂一些c",{"2":{"436":1}}],["写在了此版本node",{"2":{"96":1}}],["搜索npm",{"2":{"1099":1}}],["搜索镜像",{"2":{"999":1}}],["搜索后并不会将不在范围的记录隐藏掉",{"2":{"453":1}}],["搜索static",{"2":{"438":1}}],["搜索请求方式",{"2":{"434":1}}],["搜索目标状态码",{"2":{"434":1}}],["搜索",{"0":{"999":1},"2":{"434":1,"452":1}}],["搜索段落标红关键字",{"2":{"145":1,"894":1}}],["搜索订单",{"2":{"53":1}}],["排除jquery",{"2":{"185":1}}],["排除捕获",{"2":{"145":2,"894":2}}],["排除捕获也很重要很常用",{"2":{"145":1,"894":1}}],["排序整理",{"2":{"559":1}}],["排序方式",{"2":{"81":1}}],["排序字段",{"2":{"81":1}}],["排序",{"2":{"81":5}}],["他有个朋友在一个公司里有一定职权",{"2":{"1232":1}}],["他们从job",{"2":{"1134":1}}],["他们的区别只是传入的参数不同",{"2":{"5":1}}],["他解决ip动态改变",{"2":{"1090":1}}],["他通过执行render生成vnode",{"2":{"954":1}}],["他只会收集对应的computed函数",{"2":{"934":1}}],["他只是扩展了eslint解析当前plugin中规则的能力",{"2":{"831":1}}],["他不会受到主线程的阻塞",{"2":{"535":1}}],["他是从config",{"2":{"237":1}}],["他可以实现增量打包并对产物实现缓存的逻辑",{"2":{"817":1}}],["他可以用于将编码或解码视频帧",{"2":{"517":1}}],["他可以让自动监视代码有没有修改",{"2":{"188":1}}],["他可以将",{"2":{"179":1}}],["他主要用在生产环境下",{"2":{"187":1}}],["他的作用非常强大",{"2":{"145":1,"894":1}}],["捕获常见的错误和警告",{"2":{"842":1}}],["捕获选项",{"2":{"452":1}}],["捕获小结的使用方法即可",{"2":{"146":1,"895":1}}],["捕获到的内容会按照捕获的顺序出现在",{"2":{"145":1,"894":1}}],["捕获经常和引用或者修饰符",{"2":{"145":1,"894":1}}],["捕获在匹配表达式中经常看到",{"2":{"145":1,"894":1}}],["捕获",{"0":{"142":1,"145":1,"891":1,"894":1},"1":{"143":1,"144":1,"145":1,"146":1,"892":1,"893":1,"894":1,"895":1}}],["组级别",{"2":{"1186":1}}],["组建在访问内部的数据",{"2":{"953":1}}],["组件创建及渲染",{"2":{"948":1}}],["组件实例上定义",{"2":{"932":1}}],["组件初始化时对computed属性进行初始化",{"2":{"932":1}}],["组件测试配置",{"2":{"878":1}}],["组件测试几个方面",{"2":{"878":1}}],["组件内部引用的其它组件会因为没有引用而报错",{"2":{"875":1}}],["组件和服务进行",{"2":{"854":1}}],["组件",{"2":{"809":1}}],["组件等等",{"2":{"238":1}}],["组",{"2":{"709":1}}],["组装",{"2":{"374":1}}],["组合多个仓库为一个地址",{"2":{"1104":1}}],["组合式继承则是结合原型链继承和构造函数继承",{"2":{"580":1}}],["组合式继承",{"0":{"580":1}}],["组合在常用的匹配模式中还是常用的",{"2":{"144":1,"893":1}}],["组合",{"0":{"142":1,"144":1,"891":1,"893":1},"1":{"143":1,"144":1,"145":1,"146":1,"892":1,"893":1,"894":1,"895":1},"2":{"210":1,"760":1}}],["组成",{"2":{"138":1,"887":1}}],["量词可以在匹配多个相同的模式的时候很管用",{"2":{"141":1,"890":1}}],["被截断为",{"2":{"1121":1}}],["被系统强制启用",{"2":{"717":1}}],["被",{"2":{"606":1}}],["被用于类的各个属性",{"2":{"225":1}}],["被友好的和谐了",{"2":{"221":1}}],["被一个",{"2":{"139":1,"888":1}}],["被显示的dom点调用",{"2":{"63":1}}],["换行和空格",{"2":{"842":1}}],["换行符",{"2":{"839":1}}],["换行符使用",{"2":{"836":1}}],["换行",{"2":{"837":1}}],["换行风格",{"2":{"836":1}}],["换成什么协议可以加快数据传输等等",{"2":{"313":1}}],["换下一行从头匹配",{"2":{"152":1,"901":1}}],["换句话说",{"2":{"139":1,"888":1}}],["换页符和换行符",{"2":{"139":1,"888":1}}],["均返回false",{"2":{"139":1,"888":1}}],["控制作业的运行",{"2":{"1131":1}}],["控制并发缓存请求",{"2":{"721":1}}],["控制某个路由守卫",{"2":{"648":1}}],["控制器使用",{"0":{"675":1}}],["控制器用来接受具体的路由",{"2":{"610":1}}],["控制器",{"2":{"609":1}}],["控制器类并不直接参与业务",{"2":{"605":1}}],["控制反转原理等等",{"2":{"601":1}}],["控制位",{"2":{"376":1}}],["控制台打印的结果如下",{"2":{"230":1}}],["控制台输入",{"2":{"139":1,"888":1}}],["控制流函数",{"2":{"83":1}}],["默认账户是root",{"2":{"1172":1}}],["默认在注册runner的时候需要填写一个基础镜像",{"2":{"1145":1}}],["默认在没有结束范围时只返回1m的数据",{"2":{"520":1}}],["默认30天会清除掉",{"2":{"1139":1}}],["默认变量",{"0":{"1120":1},"1":{"1121":1,"1122":1}}],["默认当前路径下的dockerfile文件",{"2":{"1069":1}}],["默认是docker官方的仓库地址",{"2":{"1014":1}}],["默认10s",{"2":{"1008":1}}],["默认table",{"2":{"998":1}}],["默认true",{"2":{"695":1}}],["默认值false",{"2":{"1130":1}}],["默认值",{"2":{"1025":1,"1131":1}}],["默认值为",{"2":{"949":6}}],["默认值为pre会推送到queuejob队列中",{"2":{"944":1}}],["默认值是",{"2":{"717":1}}],["默认路径cypress",{"2":{"878":2}}],["默认的网络类型",{"2":{"1087":1}}],["默认的路径为cypress",{"2":{"878":1}}],["默认的配置文件应该有很多",{"2":{"728":1}}],["默认读取根路径下的cypress",{"2":{"878":1}}],["默认false",{"2":{"839":1}}],["默认情况eslint使用espree作为解析器",{"2":{"829":1}}],["默认情况下runner注册后都是锁定状态",{"2":{"1158":1}}],["默认情况下提供的元数据的生命周期是全局跟着整个应用程序实例化一次",{"2":{"606":1}}],["默认情况下改属性对象只有constructor属性执行函数本身",{"2":{"573":1}}],["默认6",{"2":{"717":1}}],["默认生成的密码会被加密",{"2":{"713":1}}],["默认流类型",{"2":{"709":1}}],["默认注入",{"0":{"684":1}}],["默认语言",{"2":{"673":1}}],["默认加载根路径下的",{"2":{"628":1}}],["默认只有一个属性constructor",{"2":{"573":1}}],["默认为latest",{"2":{"1108":1}}],["默认为10秒",{"2":{"1008":1}}],["默认为所有日志",{"2":{"1007":1}}],["默认为false",{"2":{"839":1}}],["默认为",{"2":{"494":1,"1121":1}}],["默认会false",{"2":{"878":1}}],["默认会抓取所有接口的数据",{"2":{"453":1}}],["默认会允许所有ip代理的",{"2":{"414":1}}],["默认这些都是开启的",{"2":{"414":1}}],["默认http",{"2":{"414":1}}],["默认操作系统的重传次数可以通过以下方式进行查看",{"2":{"390":1}}],["默认跳数",{"2":{"382":1}}],["默认",{"2":{"347":1,"438":1,"712":1,"717":3,"1069":1,"1139":1}}],["默认loading",{"2":{"245":1}}],["默认匹配除换行符之外的任何单个字符",{"2":{"139":1,"888":1}}],["默认mysql的服务开启状态",{"2":{"68":1}}],["含义",{"2":{"139":1,"317":1,"888":1}}],["匹配图片url上的",{"2":{"718":1}}],["匹配完后",{"2":{"715":1}}],["匹配完后继续向下匹配",{"2":{"715":1}}],["匹配主机路径",{"2":{"709":1}}],["匹配规则",{"2":{"709":1}}],["匹配正则表达式",{"2":{"154":1,"903":1}}],["匹配所有符合表达式的内容",{"2":{"154":1,"903":1}}],["匹配所有的数字",{"2":{"139":1,"888":1}}],["匹配带",{"2":{"150":1,"899":1}}],["匹配0个数字",{"2":{"150":1,"899":1}}],["匹配1个字母就行",{"2":{"150":1,"899":1}}],["匹配表达式结合引用使用",{"2":{"145":1,"894":1}}],["匹配到了",{"2":{"145":1,"154":1,"894":1,"903":1}}],["匹配后",{"2":{"145":1,"894":1}}],["匹配字符",{"2":{"145":1,"894":1}}],["匹配字符串中的数字",{"2":{"139":1,"888":1}}],["匹配第一位不是字母",{"2":{"144":1,"893":1}}],["匹配第一位是字母或者数字的",{"2":{"144":1,"893":1}}],["匹配第一位是字符全是大写或者全是小写的字母",{"2":{"144":1,"893":1}}],["匹配s或者d",{"2":{"143":1,"892":1}}],["匹配前面模式0个或1个",{"2":{"141":1,"890":1}}],["匹配前面的模式1个或多个",{"2":{"141":1,"890":1}}],["匹配前面的模式0个或多个",{"2":{"141":1,"890":1}}],["匹配两个结果",{"2":{"140":1,"889":1}}],["匹配的是",{"2":{"140":1,"889":1}}],["匹配换行符",{"2":{"139":1,"888":1}}],["匹配如下几种情况",{"2":{"139":1,"888":1}}],["匹配中不包括匹配的字边界",{"2":{"139":1,"888":1}}],["匹配空白字符",{"2":{"139":1,"888":1}}],["匹配非单词边界",{"2":{"139":1,"888":1}}],["匹配非单词字符",{"2":{"139":1,"888":1}}],["匹配非空白字符",{"2":{"139":1,"888":1}}],["匹配非数字字符",{"2":{"139":1,"888":1}}],["匹配数字",{"2":{"139":1,"888":1}}],["匹配一个退格",{"2":{"144":1,"893":1}}],["匹配一个换行符",{"2":{"139":1,"888":1}}],["匹配一个词的边界",{"2":{"139":1,"888":1}}],["匹配一个空白字符",{"2":{"139":1,"888":1}}],["匹配一个非单词边界",{"2":{"139":1,"888":1}}],["匹配一个非单字字符",{"2":{"139":1,"888":1}}],["匹配一个非空白字符",{"2":{"139":1,"888":1}}],["匹配一个非数字字符",{"2":{"139":1,"888":1}}],["匹配一个数字就行",{"2":{"150":1,"899":1}}],["匹配一个数字",{"2":{"139":1,"888":1}}],["匹配一个单字字符",{"2":{"139":1,"888":1}}],["匹配",{"2":{"139":8,"711":1,"888":8}}],["匹配单词边界",{"2":{"139":1,"888":1}}],["匹配单词字符",{"2":{"139":1,"888":1}}],["匹配单个字符",{"2":{"139":1,"888":1}}],["匹配多行",{"2":{"138":1,"887":1}}],["匹配时会查找所有的匹配项",{"2":{"138":1,"887":1}}],["匹配时不区分大小写jsstr",{"2":{"138":1,"887":1}}],["深层拦截",{"2":{"964":1}}],["深层嵌套",{"0":{"960":1}}],["深层遍历就会触发每个key的get",{"2":{"941":1}}],["深度遍历对象",{"2":{"951":1,"954":1}}],["深度理解nodejs",{"2":{"734":1}}],["深入浅出regexp",{"0":{"136":1},"1":{"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1}}],["深拷贝的实现方式",{"0":{"31":1},"1":{"32":1,"33":1,"34":1}}],["深拷贝",{"2":{"26":1}}],["深拷贝和浅拷贝的示意图大致如下",{"2":{"25":1}}],["深拷贝和浅拷贝是只针对",{"2":{"25":1}}],["再部署应用",{"2":{"1079":1}}],["再通过网络传输到客户端",{"2":{"709":1}}],["再通过构造函数对实例属性和方法进行继承",{"2":{"580":1}}],["再来看看依赖的结构",{"2":{"959":1}}],["再来看看const",{"2":{"588":1}}],["再来看下observer对象的过程",{"2":{"955":1}}],["再来看下child的原型链",{"2":{"578":1}}],["再者就是vue3的computed依赖收集能真正反映出依赖的收集关系",{"2":{"934":1}}],["再者就是动态控制切片大小",{"2":{"775":1}}],["再者其也成为面试的频考点",{"2":{"585":1}}],["再者charles把一些常用的功能选项直接封装好了",{"2":{"411":1}}],["再以单播的形式发送arp",{"2":{"454":1}}],["再查看arp缓存表中已经缓存了网关信息",{"2":{"454":1}}],["再看看整体的流程是怎么样的",{"2":{"948":1}}],["再看看接口文档的显示",{"2":{"685":1}}],["再看看抓包记录",{"2":{"438":1}}],["再看builds其实就是针对构建不同规范",{"2":{"237":1}}],["再做一些详情案列说明",{"2":{"429":1}}],["再作为序列号发送给client",{"2":{"381":1}}],["再提交给数据链路层",{"2":{"311":1}}],["再提交给网络层",{"2":{"311":1}}],["再比如使用验证码",{"2":{"353":1}}],["再比如说",{"2":{"246":1}}],["再比如下面vue这个例子",{"2":{"201":1,"751":1}}],["再重写$mount",{"2":{"238":1}}],["再次检查job中是否指定",{"2":{"1145":1}}],["再次查看集群信息",{"2":{"1217":1}}],["再次查看会发现数据都不见了",{"2":{"1109":1}}],["再次查看还是那个nginx",{"2":{"1012":1}}],["再次查看抓取的https请求",{"2":{"421":1}}],["再次触发回调执行",{"2":{"945":1}}],["再次会访问计算属性的getter",{"2":{"932":1}}],["再次上传此图片就不会上传了",{"2":{"772":1}}],["再次刷新浏览器发现网页变了",{"2":{"728":1}}],["再次拿出经典图",{"2":{"532":1}}],["再次执行会验证默认的类型验证器",{"2":{"232":1}}],["再次登录",{"2":{"197":1,"747":1}}],["再找main",{"2":{"186":1,"190":1}}],["再进行下一部门内容的加载",{"2":{"133":1}}],["再用wireshark进行抓包分析后应该已经对arp协议不陌生了",{"2":{"454":1}}],["再用这张虚拟表和teacher表联表",{"2":{"87":1}}],["再用",{"2":{"32":1}}],["采用服务名的方式在集群系统里是常见的",{"2":{"1090":1}}],["采用主从架构",{"2":{"993":1,"1080":1}}],["采用客户端",{"2":{"993":1,"1080":1}}],["采用monorepo方式将核心功能拆分独立的包",{"2":{"957":1}}],["采用http3",{"2":{"727":1}}],["采用hpack算法对请求头和响应头进行压缩",{"2":{"323":1}}],["采用",{"2":{"525":1,"1121":2}}],["采用负载均衡时要保持数据的同步和一致",{"2":{"348":1}}],["采用quic协议",{"2":{"327":1}}],["采用懒加载和预加载是解决其的良好手段",{"2":{"241":1}}],["采用分页加载",{"2":{"133":1}}],["采用了前后端分离进行开发",{"2":{"125":1}}],["针对对象的不同key单独来存储对应的cbs",{"2":{"951":1}}],["针对markdown文件",{"2":{"836":1}}],["针对所有文件",{"2":{"836":1}}],["针对所有路由",{"2":{"635":1}}],["针对所有的",{"2":{"179":1}}],["针对以上代码在不用count时",{"2":{"595":1}}],["针对当前作用域来说的",{"2":{"587":1}}],["针对windows做的一些配置",{"2":{"431":1}}],["针对代理对象fiddler会记录其所有的会话记录",{"2":{"428":1}}],["针对上报上来的数据存储分析",{"2":{"350":1}}],["针对项目中文件的相对位置",{"2":{"268":1}}],["针对缓存可以创建一个set",{"2":{"248":1}}],["针对样式文件",{"2":{"179":1}}],["针对接口请求",{"2":{"133":1}}],["针对图片资源",{"2":{"133":1}}],["哦",{"2":{"133":1}}],["非商业性使用",{"2":{"1228":1}}],["非arm架构",{"2":{"1171":1}}],["非交互式",{"0":{"1157":1}}],["非计算属性",{"2":{"964":1}}],["非group类",{"2":{"831":1}}],["非同源",{"2":{"691":1}}],["非class的依赖",{"2":{"624":1}}],["非range请求返回整个视频",{"2":{"520":1}}],["非简单请求",{"0":{"337":1},"2":{"337":1}}],["非对称加密算法的优点是密钥不需要在通信双方之间共享",{"2":{"330":1}}],["非对称加密则使用不同的密钥进行加密和解密",{"2":{"330":1}}],["非对称加密",{"0":{"330":1}}],["非对称加密和消息摘要等算法",{"2":{"329":1}}],["非首次访问",{"2":{"132":1}}],["非常欢迎大家提供issue",{"2":{"1223":1}}],["非常方便",{"2":{"1223":1}}],["非常易于使用",{"2":{"784":1}}],["非常适合网络协议的学习和认识",{"2":{"450":1}}],["非常简单",{"2":{"418":1}}],["非常有用",{"2":{"83":1}}],["非常强大",{"2":{"70":1}}],["代表当前的执行函数为p1",{"2":{"951":1}}],["代表一个位置",{"2":{"410":1}}],["代表空行",{"2":{"410":1}}],["代表着数据包开始的位置",{"2":{"376":1}}],["代表着数据的位置",{"2":{"376":1}}],["代替",{"2":{"350":1}}],["代理仓库",{"2":{"1104":1}}],["代理hosted和proxy",{"2":{"1042":1}}],["代理第三方的仓库",{"2":{"1042":1}}],["代理对象",{"2":{"958":1}}],["代理computed中的每个key到this实例上",{"2":{"932":1}}],["代理每个computed属性到实例上",{"2":{"932":1}}],["代理缓存",{"0":{"721":1}}],["代理服务器",{"2":{"704":1}}],["代理客户端和服务器之间的通信",{"2":{"440":1}}],["代理监控面板",{"0":{"432":1},"2":{"429":1}}],["代理配置",{"2":{"413":1}}],["代理arp通常在路由器或交换机等设备上实现",{"2":{"302":1}}],["代理arp",{"0":{"302":1},"2":{"302":1}}],["代理模式为了控制对对象的访问",{"2":{"206":1,"756":1}}],["代理模式的目的是",{"2":{"199":1,"749":1}}],["代理模式和装饰器模式最重要的区别在于它们的意图和设计目的",{"2":{"199":1,"749":1}}],["代理模式",{"0":{"198":1,"748":1}}],["代理",{"2":{"177":1,"182":1,"210":1,"709":3,"710":1,"760":1}}],["代理过期时间",{"2":{"132":1}}],["代码调试",{"0":{"933":1}}],["代码覆盖率",{"0":{"880":1}}],["代码的情况下就可以使用它",{"2":{"977":1}}],["代码的语法和结构",{"2":{"842":1}}],["代码的样式美化",{"2":{"801":2}}],["代码时遵循一致的规范和最佳实践",{"2":{"842":1}}],["代码形式",{"2":{"829":1}}],["代码中可以使用browser",{"2":{"828":1}}],["代码中包含了全局作用域和函数作用域",{"2":{"591":1}}],["代码风格和一致性的工具",{"2":{"842":1}}],["代码风格等问题",{"2":{"826":1}}],["代码风格不一致",{"2":{"783":1}}],["代码规范",{"2":{"824":1}}],["代码共享和复用",{"2":{"811":1}}],["代码共享难度大等一系列的问题",{"2":{"809":1}}],["代码格式化等功能",{"2":{"785":1}}],["代码片段等",{"2":{"785":1}}],["代码片段",{"2":{"785":1}}],["代码压缩等特性",{"2":{"784":1}}],["代码压缩等任务",{"2":{"784":1}}],["代码拆分和代码压缩",{"2":{"784":1}}],["代码拆分",{"2":{"784":1}}],["代码在运行时会从执行上下文中访问到范围内的变量",{"2":{"593":1}}],["代码13",{"2":{"583":1}}],["代码26",{"2":{"577":1}}],["代码很简单",{"2":{"408":1}}],["代码之前进行了一些必要的检查之后才能执行",{"2":{"350":1}}],["代码",{"2":{"350":3,"842":1}}],["代码设计经验的总结",{"2":{"194":1,"744":1}}],["代码向低版本转换",{"2":{"180":1}}],["代码插入到",{"2":{"179":1}}],["代码环境模式",{"2":{"175":1}}],["代码分割",{"2":{"130":1,"135":1}}],["代码如下",{"2":{"14":1,"15":1,"16":1}}],["~",{"2":{"132":4,"353":1,"360":3,"364":3,"376":1,"655":2,"711":4,"712":1,"716":1,"717":1,"718":1,"720":2,"722":2,"1039":3,"1045":1,"1046":2,"1047":1,"1157":1,"1217":1}}],["给镜像添加标签",{"2":{"1057":1}}],["给某个子包安装依赖",{"2":{"814":1}}],["给应用程序提供数据",{"2":{"622":1}}],["给当前module提供可注入的数据",{"2":{"604":1}}],["给client回了一个ack响应",{"2":{"382":1}}],["给个人和企业带来极大的损失",{"2":{"349":1}}],["给服务器",{"2":{"337":1}}],["给类添加方法等等",{"2":{"229":1}}],["给女模特依次穿上所有的女装",{"2":{"204":1,"754":1}}],["给男模特依次穿上所有的男装",{"2":{"204":1,"754":1}}],["给operator事件增加一个eventsinks",{"2":{"195":1,"745":1}}],["给文件添加hash值",{"2":{"132":1}}],["给用户开户",{"2":{"54":1}}],["📦",{"2":{"1103":1,"1189":1}}],["📦️",{"2":{"801":2}}],["🔻",{"2":{"251":1}}],["🔺",{"2":{"251":1}}],["🔸",{"2":{"251":1}}],["🔹",{"2":{"251":1}}],["🔶",{"2":{"251":1}}],["🔷",{"2":{"251":1}}],["🔵",{"2":{"251":1}}],["🔴",{"2":{"251":1}}],["🔳",{"2":{"251":1}}],["🔲",{"2":{"251":1}}],["🔱",{"2":{"251":1}}],["🔗",{"0":{"352":1},"2":{"251":1}}],["🔘",{"2":{"251":1}}],["💯",{"2":{"251":1}}],["💮",{"2":{"251":1}}],["💲",{"2":{"251":1}}],["🕤",{"2":{"251":1}}],["🕘",{"2":{"251":1}}],["🕣",{"2":{"251":1}}],["🕗",{"2":{"251":1}}],["🕢",{"2":{"251":1}}],["🕖",{"2":{"251":1}}],["🕡",{"2":{"251":1}}],["🕕",{"2":{"251":1}}],["🕠",{"2":{"251":1}}],["🕔",{"2":{"251":1}}],["🕟",{"2":{"251":1}}],["🕓",{"2":{"251":1}}],["🕞",{"2":{"251":1}}],["🕒",{"2":{"251":1}}],["🕝",{"2":{"251":1}}],["🕑",{"2":{"251":1}}],["🕧",{"2":{"251":1}}],["🕛",{"2":{"251":1}}],["🕦",{"2":{"251":1}}],["🕚",{"2":{"251":1}}],["🕥",{"2":{"251":1}}],["🕙",{"2":{"251":1}}],["🕜",{"2":{"251":1}}],["🕐",{"2":{"251":1}}],["🔜",{"2":{"251":1}}],["🔛",{"2":{"251":1}}],["🔚",{"2":{"251":1}}],["💠",{"2":{"251":1}}],["🔯",{"2":{"251":1}}],["💱",{"2":{"251":1}}],["💹",{"2":{"251":1}}],["📴",{"2":{"251":1}}],["📳",{"2":{"251":1}}],["💟",{"2":{"251":1}}],["🚸",{"2":{"251":1}}],["🚷",{"2":{"251":1}}],["🚳",{"2":{"251":1}}],["🚱",{"2":{"251":1}}],["🚯",{"2":{"251":1}}],["📵",{"2":{"251":1}}],["🔞",{"2":{"251":1}}],["🚫",{"2":{"251":1}}],["🛃",{"2":{"251":1}}],["🛅",{"2":{"251":1}}],["🛂",{"2":{"251":1}}],["🚮",{"2":{"251":1}}],["🚰",{"2":{"251":1}}],["🚾",{"2":{"251":1}}],["🛄",{"2":{"251":1}}],["🚇",{"2":{"251":1}}],["🚭",{"2":{"251":1}}],["🚼",{"2":{"251":1}}],["🚺",{"2":{"251":1}}],["🚹",{"2":{"251":1}}],["🚻",{"2":{"251":1}}],["📶",{"2":{"251":1}}],["🔝",{"2":{"251":1}}],["🔂",{"2":{"251":1}}],["🔁",{"2":{"251":1}}],["🔀",{"2":{"251":1}}],["🔄",{"2":{"251":1}}],["🔃",{"2":{"251":1}}],["🔼",{"2":{"251":1}}],["🔽",{"2":{"251":1}}],["🔤",{"2":{"251":1}}],["🔡",{"2":{"251":1}}],["🔠",{"2":{"251":1}}],["🔣",{"2":{"251":1}}],["🔢",{"2":{"251":1}}],["🔟",{"2":{"251":1}}],["🚩",{"2":{"251":1}}],["📍",{"2":{"251":1}}],["🗿",{"2":{"251":1}}],["💈",{"2":{"251":1}}],["🚏",{"2":{"251":1}}],["🔰",{"2":{"251":1}}],["🚧",{"2":{"251":1}}],["🚥",{"2":{"251":1}}],["🚦",{"2":{"251":1}}],["🚎",{"2":{"251":1}}],["🚃",{"2":{"251":1}}],["🚝",{"2":{"251":1}}],["🚈",{"2":{"251":1}}],["🚄",{"2":{"251":1}}],["🚅",{"2":{"251":1}}],["🚆",{"2":{"251":1}}],["🚉",{"2":{"251":1}}],["🚋",{"2":{"251":1}}],["🚚",{"2":{"251":1}}],["🚐",{"2":{"251":1}}],["🚑",{"2":{"251":1}}],["🚒",{"2":{"251":1}}],["🚔",{"2":{"251":1}}],["🚓",{"2":{"251":1}}],["🚨",{"2":{"251":1}}],["🚍",{"2":{"251":1}}],["🚌",{"2":{"251":1}}],["🚛",{"2":{"251":1}}],["🚖",{"2":{"251":1}}],["🚕",{"2":{"251":1}}],["🚗",{"2":{"251":2}}],["🚘",{"2":{"251":1}}],["🚙",{"2":{"251":1}}],["🚜",{"2":{"251":1}}],["🚠",{"2":{"251":1}}],["🚟",{"2":{"251":1}}],["🚡",{"2":{"251":1}}],["🚲",{"2":{"251":1}}],["🚞",{"2":{"251":1}}],["🚊",{"2":{"251":1}}],["🚂",{"2":{"251":1}}],["🚁",{"2":{"251":1}}],["🚀",{"2":{"251":1,"801":2}}],["🚣",{"2":{"251":1}}],["🚤",{"2":{"251":1}}],["🚢",{"2":{"251":1}}],["🗽",{"2":{"251":1}}],["🗻",{"2":{"251":1}}],["🗾",{"2":{"251":1}}],["🗼",{"2":{"251":1}}],["💒",{"2":{"251":1}}],["👓",{"2":{"251":1}}],["👛",{"2":{"251":1}}],["👝",{"2":{"251":1}}],["👜",{"2":{"251":1}}],["💼",{"2":{"251":1}}],["👒",{"2":{"251":1}}],["👑",{"2":{"251":1}}],["👙",{"2":{"251":1}}],["👘",{"2":{"251":1}}],["👖",{"2":{"251":1}}],["👗",{"2":{"251":1}}],["👚",{"2":{"251":1}}],["👔",{"2":{"251":1}}],["👕",{"2":{"251":2}}],["👢",{"2":{"251":1}}],["💄",{"2":{"251":1,"801":3}}],["👠",{"2":{"251":1}}],["👡",{"2":{"251":1}}],["👞",{"2":{"251":2}}],["📖",{"2":{"251":1}}],["📝",{"2":{"251":2,"857":1}}],["👾",{"2":{"251":1}}],["💍",{"2":{"251":1}}],["💎",{"2":{"251":1}}],["🚴",{"2":{"251":1}}],["🚵",{"2":{"251":1}}],["📰",{"2":{"251":1}}],["🔭",{"2":{"251":1}}],["🔬",{"2":{"251":1}}],["📛",{"2":{"251":1}}],["🔖",{"2":{"251":1}}],["📚",{"2":{"251":1}}],["📒",{"2":{"251":1}}],["📔",{"2":{"251":1}}],["📓",{"2":{"251":1}}],["📙",{"2":{"251":1}}],["📘",{"2":{"251":1}}],["📗",{"2":{"251":1}}],["📕",{"2":{"251":1}}],["📐",{"2":{"251":1}}],["📏",{"2":{"251":1}}],["📎",{"2":{"251":1}}],["📌",{"2":{"251":1,"354":1}}],["📂",{"2":{"251":1}}],["📁",{"2":{"251":1}}],["📇",{"2":{"251":1}}],["📅",{"2":{"251":1}}],["📆",{"2":{"251":1}}],["📋",{"2":{"251":1}}],["📜",{"2":{"251":1}}],["📉",{"2":{"251":1}}],["📈",{"2":{"251":1}}],["📊",{"2":{"251":1}}],["📑",{"2":{"251":1}}],["📃",{"2":{"251":1}}],["📄",{"2":{"251":1}}],["💉",{"2":{"251":1}}],["💊",{"2":{"251":1}}],["🔪",{"2":{"251":1}}],["🔫",{"2":{"251":1}}],["💣",{"0":{"783":1},"2":{"251":1}}],["🚬",{"2":{"251":1}}],["🚪",{"2":{"251":1}}],["📭",{"2":{"251":1}}],["📬",{"2":{"251":1}}],["📪",{"2":{"251":1}}],["📯",{"2":{"251":1}}],["📨",{"2":{"251":1}}],["📤",{"2":{"251":1}}],["📥",{"2":{"251":1}}],["💸",{"2":{"251":1}}],["💳",{"2":{"251":1}}],["💶",{"2":{"251":1}}],["💷",{"2":{"251":1}}],["💵",{"2":{"251":1}}],["💴",{"2":{"251":1}}],["💰",{"2":{"251":1}}],["💺",{"2":{"251":1}}],["🔨",{"2":{"251":1}}],["🔩",{"2":{"251":1}}],["🔧",{"2":{"251":1}}],["🚽",{"2":{"251":1}}],["🚿",{"2":{"251":1}}],["🛁",{"2":{"251":1}}],["🛀",{"2":{"251":1}}],["📮",{"2":{"251":1}}],["📫",{"2":{"251":1}}],["📧",{"2":{"251":2}}],["📲",{"2":{"251":1}}],["🔋",{"2":{"251":1}}],["🔌",{"2":{"251":1}}],["🔅",{"2":{"251":1}}],["🔆",{"2":{"251":1}}],["🔦",{"2":{"251":1}}],["💡为什么看到的是3次挥手",{"2":{"382":1}}],["💡localhost",{"2":{"361":1}}],["💡那么如何防止xss攻击呢",{"2":{"350":1}}],["💡如何解决跨域呢",{"2":{"336":1}}],["💡如何防范arp欺骗",{"2":{"303":1}}],["💡什么是msl",{"2":{"382":1}}],["💡什么是前向安全性",{"2":{"334":1}}],["💡什么是队头阻塞",{"2":{"322":1}}],["💡使用了http2就不会有队头阻塞了吗",{"2":{"324":1}}],["💡",{"0":{"353":1},"2":{"251":1,"350":1,"772":1,"1126":1}}],["🔑",{"2":{"251":1,"948":1}}],["🔐",{"2":{"251":1}}],["🔏",{"2":{"251":1}}],["🔒",{"2":{"251":1}}],["🔓",{"2":{"251":1}}],["🔎",{"2":{"251":1}}],["🔍",{"2":{"251":1,"350":1,"351":1}}],["📡",{"2":{"251":1}}],["📻",{"2":{"251":1}}],["📣",{"2":{"251":1,"806":1}}],["📢",{"2":{"251":1}}],["🔇",{"2":{"251":1}}],["🔈",{"2":{"251":1,"682":1}}],["🔉",{"2":{"251":1}}],["📼",{"2":{"251":1}}],["💽",{"2":{"251":1}}],["📠",{"2":{"251":1}}],["📟",{"2":{"251":1}}],["📞",{"2":{"251":1}}],["📱",{"2":{"251":1}}],["📺",{"2":{"251":1}}],["💻",{"2":{"251":1}}],["📹",{"2":{"251":1}}],["📷",{"2":{"251":1}}],["💾",{"2":{"251":1}}],["📀",{"2":{"251":1}}],["💿",{"2":{"251":1}}],["🔮",{"2":{"251":1}}],["🔕",{"2":{"251":1}}],["🔔",{"2":{"251":1}}],["👻",{"2":{"251":1}}],["💝",{"2":{"251":1}}],["🐚",{"2":{"251":1}}],["💐",{"2":{"251":1}}],["🐩",{"2":{"251":1}}],["🐈",{"2":{"251":1}}],["🐆",{"2":{"251":1}}],["🐪",{"2":{"251":1}}],["🐊",{"2":{"251":1}}],["🐡",{"2":{"251":1}}],["🐲",{"2":{"251":1}}],["🐂",{"2":{"251":1}}],["🐁",{"2":{"251":1}}],["🐖",{"2":{"251":1}}],["🐕",{"2":{"251":1}}],["🐓",{"2":{"251":1}}],["🐐",{"2":{"251":1}}],["🐉",{"2":{"251":1}}],["🐇",{"2":{"251":1}}],["🐅",{"2":{"251":1}}],["🐃",{"2":{"251":1}}],["🐀",{"2":{"251":1}}],["🐏",{"2":{"251":1}}],["🐄",{"2":{"251":1}}],["🐬",{"2":{"251":1}}],["🐋",{"2":{"251":1}}],["🐳",{"2":{"251":1}}],["🐟",{"2":{"251":1}}],["🐠",{"2":{"251":1}}],["🐙",{"2":{"251":1}}],["🐌",{"2":{"251":1}}],["🐜",{"2":{"251":1}}],["🐝",{"2":{"251":1}}],["🐛",{"2":{"251":1,"801":3}}],["🐢",{"2":{"251":1}}],["🐧",{"2":{"251":1}}],["🐔",{"2":{"251":1}}],["🐣",{"2":{"251":1}}],["🐥",{"2":{"251":1}}],["🐤",{"2":{"251":1}}],["🐦",{"2":{"251":1}}],["🐍",{"2":{"251":1}}],["🐼",{"2":{"251":1}}],["🐘",{"2":{"251":1}}],["🐑",{"2":{"251":1}}],["🐫",{"2":{"251":1}}],["🐎",{"2":{"251":1}}],["🐴",{"2":{"251":1}}],["🐒",{"2":{"251":1}}],["🐵",{"2":{"251":1}}],["🐗",{"2":{"251":1}}],["🐮",{"2":{"251":1}}],["🐽",{"2":{"251":1}}],["🐷",{"2":{"251":1}}],["🐻",{"2":{"251":1}}],["🐨",{"2":{"251":1}}],["🐯",{"2":{"251":1}}],["🐸",{"2":{"251":1}}],["🐺",{"2":{"251":1}}],["🐰",{"2":{"251":1}}],["🐹",{"2":{"251":1}}],["🐭",{"2":{"251":1}}],["🐶",{"2":{"251":1}}],["🐱",{"2":{"251":1}}],["💭",{"2":{"251":1}}],["💬",{"2":{"251":1}}],["👥",{"2":{"251":1}}],["👤",{"2":{"251":1}}],["💌",{"2":{"251":1}}],["👅",{"2":{"251":1}}],["👃",{"2":{"251":1}}],["👀",{"2":{"251":1}}],["👂",{"2":{"251":1}}],["💧",{"2":{"251":1}}],["💋",{"2":{"251":1}}],["👄",{"2":{"251":1}}],["🐾",{"2":{"251":2}}],["💀",{"2":{"251":1}}],["💂‍♂️",{"2":{"251":1}}],["🙊",{"2":{"251":1}}],["🙉",{"2":{"251":1}}],["🙈",{"2":{"251":1}}],["👺",{"2":{"251":1}}],["👹",{"2":{"251":1}}],["😾",{"2":{"251":1}}],["😹",{"2":{"251":1}}],["😿",{"2":{"251":1}}],["🙀",{"2":{"251":1}}],["😼",{"2":{"251":1}}],["😽",{"2":{"251":1}}],["😻",{"2":{"251":1}}],["😸",{"2":{"251":1}}],["😺",{"2":{"251":1}}],["👸",{"2":{"251":1}}],["👼",{"2":{"251":1}}],["👮",{"2":{"251":1}}],["👷",{"2":{"251":1,"801":2}}],["👳‍♂️",{"2":{"251":1}}],["👲",{"2":{"251":1}}],["👴",{"2":{"251":1}}],["👵",{"2":{"251":1}}],["👶",{"2":{"251":1}}],["👨",{"2":{"251":1}}],["👩",{"2":{"251":1}}],["👧",{"2":{"251":1}}],["👦",{"2":{"251":1}}],["💅",{"2":{"251":1}}],["💇",{"2":{"251":1}}],["💆",{"2":{"251":1}}],["💑",{"2":{"251":1}}],["💏",{"2":{"251":1}}],["🙇",{"2":{"251":1}}],["👰‍♀️",{"2":{"251":1}}],["🙋",{"2":{"251":1}}],["💁",{"2":{"251":1}}],["🙅",{"2":{"251":1}}],["🙆‍♀️",{"2":{"251":1}}],["👯",{"2":{"251":1}}],["💃",{"2":{"251":1}}],["👭",{"2":{"251":1}}],["👬",{"2":{"251":1}}],["👪",{"2":{"251":1}}],["👫",{"2":{"251":1}}],["🚶",{"2":{"251":1}}],["🖕",{"2":{"251":1}}],["💪",{"2":{"251":1,"948":1}}],["👏",{"2":{"251":1}}],["👆",{"2":{"251":1}}],["🙏",{"2":{"251":1}}],["🙌",{"2":{"251":1}}],["👉",{"2":{"251":1}}],["👉mysql",{"2":{"68":1}}],["👈",{"2":{"251":1}}],["👐",{"2":{"251":1}}],["👋",{"2":{"251":1,"1223":1}}],["👊",{"2":{"251":2}}],["👌",{"2":{"251":1}}],["👎",{"2":{"251":2}}],["👍",{"2":{"251":2,"1227":1}}],["💩",{"2":{"251":3}}],["🔥",{"2":{"251":1}}],["💦",{"2":{"251":1}}],["💨",{"2":{"251":1,"535":1}}],["💤",{"2":{"251":1}}],["💢",{"2":{"251":1}}],["💥",{"2":{"251":2}}],["💫",{"2":{"251":1}}],["💖",{"2":{"251":1}}],["💘",{"2":{"251":1}}],["💞",{"2":{"251":1}}],["💕",{"2":{"251":1}}],["💗",{"2":{"251":1}}],["💓",{"2":{"251":1}}],["💔",{"2":{"251":1}}],["💚",{"2":{"251":1}}],["💜",{"2":{"251":1}}],["💙",{"2":{"251":1}}],["💛",{"2":{"251":1}}],["👽",{"2":{"251":1}}],["😇",{"2":{"251":1}}],["😶",{"2":{"251":1}}],["😐",{"2":{"251":1}}],["😈",{"2":{"251":1}}],["👿",{"2":{"251":1}}],["😵",{"2":{"251":1}}],["😎",{"2":{"251":1}}],["😷",{"2":{"251":1}}],["😋",{"2":{"251":1}}],["😪",{"2":{"251":1}}],["😤",{"2":{"251":1}}],["😡",{"2":{"251":1}}],["😠",{"2":{"251":1}}],["😫",{"2":{"251":1}}],["😱",{"2":{"251":1}}],["😲",{"2":{"251":1}}],["😂",{"2":{"251":1}}],["😭",{"2":{"251":1}}],["😢",{"2":{"251":1}}],["😣",{"2":{"251":1}}],["😰",{"2":{"251":1}}],["😨",{"2":{"251":1}}],["😖",{"2":{"251":1}}],["😞",{"2":{"251":1}}],["😔",{"2":{"251":1}}],["😩",{"2":{"251":1}}],["😥",{"2":{"251":1}}],["😓",{"2":{"251":1}}],["😅",{"2":{"251":1}}],["😒",{"2":{"251":1}}],["😑",{"2":{"251":1}}],["😯",{"2":{"251":1}}],["😕",{"2":{"251":1}}],["😬",{"2":{"251":1}}],["😮",{"2":{"251":1}}],["😧",{"2":{"251":1}}],["😦",{"2":{"251":1}}],["😟",{"2":{"251":1}}],["😴",{"2":{"251":1}}],["😛",{"2":{"251":1}}],["😙",{"2":{"251":1}}],["😗",{"2":{"251":1}}],["😀",{"2":{"251":1}}],["😝",{"2":{"251":1}}],["😜",{"2":{"251":1}}],["😉",{"2":{"251":1}}],["😁",{"2":{"251":1}}],["😌",{"2":{"251":1}}],["😳",{"2":{"251":1}}],["😚",{"2":{"251":1}}],["😘",{"2":{"251":1}}],["😍",{"2":{"251":1}}],["😏",{"2":{"251":1}}],["😃",{"2":{"251":1}}],["😊",{"2":{"251":1}}],["😆",{"2":{"251":2}}],["😄",{"2":{"251":1}}],["👇",{"2":{"131":1,"251":1,"350":1}}],["资源占用多",{"2":{"1079":1}}],["资源",{"2":{"996":1}}],["资源优化",{"2":{"784":1}}],["资源大小",{"2":{"762":1}}],["资源加载",{"2":{"762":1}}],["资源加载中",{"2":{"133":1}}],["资源列表",{"2":{"712":1}}],["资源压缩",{"0":{"696":1}}],["资源压缩gzip",{"0":{"134":1}}],["资源浪费的情况",{"2":{"344":1}}],["资源修改时间",{"2":{"319":1}}],["资源所在服务器上的路径和文件名",{"2":{"316":1}}],["资源所在的服务器的主机名或ip地址",{"2":{"316":1}}],["资源隔离",{"2":{"275":1}}],["资源过期时间",{"2":{"132":1,"319":1}}],["资源防盗链",{"2":{"132":1}}],["资源缓存",{"2":{"131":1,"135":1}}],["资源存放处",{"2":{"54":1}}],["好聚好散",{"2":{"1233":1}}],["好好工作",{"2":{"1232":1}}],["好多天没有和我妈打视频了",{"2":{"1232":1}}],["好了",{"2":{"221":1}}],["好处就是消除对象直接的耦合",{"2":{"201":1,"751":1}}],["好感十足😂",{"2":{"131":1}}],["好像是刚发布不久",{"2":{"131":1}}],["白嫖不容易",{"2":{"135":1}}],["白嫖",{"2":{"131":1}}],["标准实现的解析器",{"2":{"829":1}}],["标准集合",{"2":{"307":1}}],["标记整理",{"2":{"559":1}}],["标记整理算法在标记结束后",{"2":{"558":1}}],["标记清除法",{"0":{"558":1},"2":{"558":1,"559":1}}],["标记了",{"2":{"131":1}}],["标识mac地址长度",{"2":{"454":1}}],["标识网络层协议",{"2":{"454":1}}],["标识链路层协议",{"2":{"454":1}}],["标识符",{"2":{"367":1,"715":1}}],["标识符是用来唯一标识一个资源的字符串",{"2":{"316":1}}],["标识符和解析器",{"2":{"316":1}}],["标志位",{"2":{"367":1,"455":1}}],["标志位被设为",{"2":{"139":1,"888":1}}],["标签可以指定多个",{"2":{"1129":1}}],["标签列表",{"2":{"1121":1}}],["标签",{"2":{"998":1}}],["标签加载不安全的跨域脚本文件",{"2":{"338":1}}],["标签的",{"2":{"117":1}}],["碰巧看到了就试试水",{"2":{"131":1}}],["更简单的运维",{"2":{"1079":1}}],["更简洁的语法",{"2":{"965":1}}],["更快交付",{"2":{"1079":1}}],["更快的连接建立和恢复",{"2":{"727":1}}],["更轻量",{"2":{"1079":1}}],["更全面的响应式追踪",{"2":{"965":1}}],["更高效",{"2":{"965":1}}],["更新队列执行时会执行watcher",{"2":{"938":1}}],["更新的节点",{"2":{"404":1}}],["更有益于项目的长远维护",{"2":{"823":1}}],["更容易进行代码评审和知识共享",{"2":{"811":1}}],["更不是所谓的框架",{"2":{"810":1}}],["更好的移植性",{"2":{"1110":1}}],["更好的数组响应",{"2":{"965":1}}],["更好的性能",{"2":{"965":1,"1110":1}}],["更好的代码可视性和管理",{"2":{"811":1}}],["更好的拥塞控制",{"2":{"727":1}}],["更好的多路复用",{"2":{"727":1}}],["更好的路由支持",{"2":{"366":1}}],["更复杂的应用包括使用",{"2":{"508":1}}],["更详细过滤一些选项",{"2":{"453":1}}],["更准确地转发数据包",{"2":{"371":1}}],["更强的安全性",{"2":{"366":1}}],["更大的地址空间",{"2":{"366":1}}],["更完善更复杂的websocket应用还需要你自己发挥想象",{"2":{"354":1}}],["更加便于后期的维护",{"2":{"190":1}}],["更希望将",{"2":{"183":1}}],["更改主机名",{"0":{"1199":1}}],["更改镜像标签",{"2":{"1039":1}}],["更改或重写",{"2":{"729":1}}],["更改文件语言",{"2":{"160":1}}],["更改名字和路径",{"2":{"62":1}}],["更多注意事项详细请参考官方文档",{"2":{"1195":1}}],["更多",{"0":{"1026":1,"1033":1}}],["更多配置参考👉",{"2":{"878":1}}],["更多配置戳这里查看官方文档",{"2":{"134":1}}],["更多的api使用可以查看官方文档",{"2":{"875":1}}],["更多命令使用请参考官方文档",{"2":{"815":1}}],["更多关于docker",{"2":{"1033":1,"1069":1}}],["更多关于两者的使用这里就不再多说",{"2":{"958":1}}],["更多关于i18n的用法请查阅相关文档",{"2":{"676":1}}],["更多关于浏览器的演变可以阅读我的",{"2":{"526":1}}],["更多使用详情查看这里以及响应序列化",{"2":{"646":1}}],["更多点击查看",{"2":{"644":1}}],["更多相关验证使用方式请访问文档",{"2":{"632":1}}],["更多类型的依赖可以查看providers",{"2":{"623":1}}],["更多功能自己可以动手试试",{"2":{"458":1}}],["更多tcp的详细内容请查看我的",{"2":{"455":1}}],["更多字段的使用你可以查看mdn相关文档",{"2":{"350":1}}],["更多详情点此处查看",{"2":{"529":1}}],["更多详看官网",{"2":{"177":1}}],["更多详细配置戳这里",{"2":{"131":1}}],["访问地址为yourip",{"2":{"1096":1}}],["访问nexus3",{"0":{"1096":1}}],["访问过程",{"0":{"1086":1}}],["访问serve服务的地址",{"2":{"966":1}}],["访问了",{"2":{"958":1}}],["访问属性",{"2":{"950":2,"951":2}}],["访问的协议",{"2":{"723":1}}],["访问的是页面时渲染错误页面",{"2":{"639":1}}],["访问控制",{"0":{"713":1}}],["访问日志",{"2":{"709":1}}],["访问到外部变量的函数都会存在闭包",{"2":{"594":1}}],["访问和修改原型",{"2":{"571":1}}],["访问本地nginx",{"2":{"382":1}}],["访问该变量会打印undefined而不会报错",{"2":{"588":1}}],["访问该站点的所有尝试都应自动重定向到",{"2":{"350":1}}],["访问该站点",{"2":{"350":1}}],["访问该资源所使用的协议",{"2":{"316":1}}],["访问器装饰器和方法装饰器差不多",{"2":{"231":1}}],["访问器装饰器",{"0":{"231":1},"2":{"231":1}}],["访问后",{"2":{"220":1}}],["访问被测网站",{"2":{"216":1}}],["访问一个被测试网站",{"2":{"215":1}}],["访问者",{"2":{"210":1,"760":1}}],["访问",{"2":{"131":1}}],["及更高版本中",{"2":{"1121":1}}],["及之前的版本中",{"2":{"729":1}}],["及以上版本的协议",{"2":{"329":1}}],["及",{"2":{"131":1,"498":1}}],["介绍异步的不同源",{"2":{"468":1}}],["介绍完代码分割及cdn",{"2":{"130":1}}],["介绍与使用方法",{"0":{"1":1},"1":{"2":1,"3":1,"4":1}}],["引擎管理的卷",{"2":{"1111":1}}],["引擎会自动创建一对",{"2":{"1086":1}}],["引擎中进行构建",{"2":{"1068":1}}],["引擎需要读取的文件和目录的集合",{"2":{"1068":1}}],["引擎",{"2":{"993":1,"1080":1}}],["引擎实现的",{"2":{"537":1}}],["引号",{"2":{"837":1}}],["引入",{"2":{"1186":1}}],["引入第三方插件",{"2":{"831":1}}],["引入指定模块",{"2":{"688":1}}],["引入自定义配置",{"2":{"630":1}}],["引入模块",{"2":{"628":1}}],["引入其他依赖或模块",{"2":{"604":1}}],["引入了ssl",{"2":{"329":1}}],["引入了jquery",{"2":{"130":1}}],["引用vue官方描述",{"2":{"928":1}}],["引用计数只需要在计数为0",{"2":{"557":1}}],["引用计数法",{"0":{"557":1},"2":{"557":1}}],["引用次数为0",{"2":{"557":1}}],["引用js",{"2":{"350":1}}],["引用的数字和使用",{"2":{"146":1,"895":1}}],["引用的顺序与",{"2":{"145":1,"894":1}}],["引用在匹配表达式中使用",{"2":{"146":1,"895":1}}],["引用其实和前面讲到的regexp的静态属性类似",{"2":{"145":1,"894":1}}],["引用",{"0":{"142":1,"146":1,"891":1,"895":1},"1":{"143":1,"144":1,"145":1,"146":1,"892":1,"893":1,"894":1,"895":1}}],["引用类型和基础类型的==比较",{"2":{"48":1,"554":1}}],["引用类型根据拆箱规则转换成基础类型后进行比较",{"2":{"47":1,"553":1}}],["引用类型根据拆箱规则结合转换优先级即可",{"2":{"44":1,"550":1}}],["引用类型",{"2":{"26":1,"37":1,"543":1}}],["引用数据类型在栈中存储了指针",{"2":{"24":1}}],["引用数据类型的特点",{"2":{"24":1}}],["骨架html提供了原生和pug",{"2":{"130":1}}],["忽略掉第三方的某些不需要的包",{"2":{"190":1}}],["忽略不需要解析的包",{"2":{"190":1}}],["忽略node",{"2":{"179":1}}],["忽略打包采用cdn",{"2":{"130":1}}],["忽略大小写",{"2":{"61":1,"145":1,"894":1}}],["懒人推动科技进步",{"2":{"184":1}}],["懒加载管理器",{"0":{"245":1}}],["懒加载器实例化参数类型和指令绑定值类型如下",{"2":{"243":1}}],["懒加载",{"0":{"133":1},"2":{"778":1}}],["懒加载优化网站友好过渡信息",{"2":{"129":1}}],["懒羊羊",{"2":{"86":1}}],["减去12字节的时间戳选项",{"2":{"376":1}}],["减轻服务器负载提高网站的可用性",{"2":{"335":1}}],["减小网络开支",{"2":{"384":1}}],["减小重传次数让其达到最大重传次数时",{"2":{"381":1}}],["减小syn",{"2":{"381":1}}],["减小syn队列",{"2":{"381":1}}],["减小拥塞窗口",{"2":{"376":1}}],["减小打包体积",{"2":{"187":1,"190":1}}],["减小下载请求",{"2":{"131":1}}],["减少错误",{"2":{"851":1}}],["减少格式化返回",{"2":{"841":1}}],["减少因为代码质量差异而引起的摩擦和冲突",{"2":{"824":1}}],["减少引入错误的风险",{"2":{"824":1}}],["减少沟通成本",{"2":{"794":1}}],["减少开发者的等待时间",{"2":{"784":1}}],["减少",{"2":{"762":1}}],["减少带宽浪费",{"2":{"722":1}}],["减少ip分片的发生",{"2":{"369":1}}],["减少网络拥堵和流量",{"2":{"368":1}}],["减少网络流量和提高传输速度",{"2":{"344":1}}],["减少网络延迟和响应时间",{"2":{"324":1}}],["减少了手动操作",{"2":{"968":1}}],["减少了页面加载时间",{"2":{"784":1}}],["减少了页面加载的延迟",{"2":{"325":1}}],["减少了首部长度",{"2":{"366":1}}],["减少了传输数据的大小",{"2":{"323":1}}],["减少缩进",{"2":{"157":1}}],["减少不必要的代码格式差异和冲突",{"2":{"836":1}}],["减少不必要的资源请求是很提倡的做法",{"2":{"133":1}}],["减少不必要的请求",{"2":{"129":1}}],["减少请求次数",{"2":{"762":1}}],["减少请求量",{"2":{"133":1}}],["减少请求",{"2":{"132":1}}],["减乘除",{"0":{"43":1,"549":1}}],["既然可以拦截到对象属性的值访问和修改",{"2":{"950":1}}],["既然top的百分比是基于元素的左上角",{"2":{"14":1}}],["既不是修复bug也不是添加特征的代码重构",{"2":{"789":1}}],["既不影响页面的加载",{"2":{"129":1}}],["主文件为index",{"2":{"1102":1}}],["主从架构",{"2":{"993":1,"1080":1}}],["主页面入口",{"2":{"874":1}}],["主题信息",{"2":{"797":1}}],["主题通常用简洁描述概括本次修改的内容",{"2":{"791":1}}],["主题",{"0":{"791":1},"2":{"800":1}}],["主打就是一个轻量开发很舒服",{"2":{"785":1}}],["主次分明",{"2":{"778":1}}],["主节点上查看ip",{"2":{"728":1}}],["主节点上停止",{"2":{"728":1}}],["主服务",{"2":{"665":1}}],["主模块",{"2":{"665":1}}],["主控制器",{"2":{"665":1}}],["主线程上不能执行高密集型的计算任务",{"2":{"776":1}}],["主线程挂起这些异步任务",{"2":{"536":1}}],["主线程挂起当前异步任务继续执行后面的代码",{"2":{"532":1}}],["主线程遇到settimeout挂起它",{"2":{"533":1}}],["主线程什么都不会做",{"2":{"532":1}}],["主线程接着从任务队列中选取一个最老的宏任务",{"2":{"532":1}}],["主线程判断任务队列中是否有合适的任务",{"2":{"531":1}}],["主线程",{"2":{"526":1}}],["主线程解析dom",{"2":{"279":1}}],["主动执行一次",{"2":{"959":1}}],["主动将key属性变成响应式",{"2":{"956":1}}],["主动进行依赖收集并触发更新",{"2":{"956":1}}],["主动让这些响应式对象对当前的dep",{"2":{"932":1}}],["主动抛出友好的500错误",{"2":{"637":2,"640":3}}],["主动抛出",{"2":{"637":1}}],["主动抛出错误",{"2":{"404":1}}],["主动加载",{"2":{"129":1}}],["主机名和域名中使用",{"2":{"1121":1}}],["主机挂载的优点是简单易用",{"2":{"1111":1}}],["主机挂载是最基本的数据卷类型",{"2":{"1111":1}}],["主机挂载",{"2":{"1111":2}}],["主机上独立于容器生命周期而存在",{"2":{"1110":1}}],["主机以广播的形式发送数据包",{"2":{"454":1}}],["主机与主机之间通信",{"2":{"454":1}}],["主机",{"2":{"436":1,"1195":1}}],["主机b192",{"2":{"379":1}}],["主机部分用0表示",{"2":{"363":1}}],["主机a就会将hacker的mac地址存到自己的arp缓存表中",{"2":{"303":1}}],["主机a想要和主机c进行通信",{"2":{"303":1}}],["主机a先从自己的arp缓存表中获取主机b的mac地址",{"2":{"296":1}}],["主要由以下三个部分组成",{"2":{"997":1}}],["主要就是通过traverse方法深度遍历嵌套对象访问对应的key就会触发dep收集当前watcher",{"2":{"941":1}}],["主要涉及到这两个配置",{"2":{"873":1}}],["主要体现在以下几点",{"2":{"824":1}}],["主要包含全局配置参数",{"2":{"709":1}}],["主要包括",{"2":{"429":1,"1223":1}}],["主要包括比较晦涩的概念",{"2":{"271":1}}],["主要包括以下几个方面",{"2":{"100":1}}],["主要来告诉swagger这个属性当前接口会用到",{"2":{"685":1}}],["主要负责点击等事件",{"2":{"528":1}}],["主要负责传输比特流",{"2":{"309":1}}],["主要还是读取文件流写入到blob中",{"2":{"521":1}}],["主要目的就是从",{"2":{"502":1}}],["主要原理是作为中间代理",{"2":{"440":1}}],["主要分为请求报文和响应报文",{"2":{"436":1}}],["主要用来编辑抓包监控记录",{"2":{"430":1}}],["主要步骤如下",{"2":{"422":1}}],["主要基于",{"2":{"329":1}}],["主要有有下面两个",{"2":{"122":1}}],["主要是为了避免不必要的渲染",{"2":{"954":1}}],["主要是使用setmetadata方法",{"2":{"648":1}}],["主要是提供http请求可以在同一个tcp连接上完成",{"2":{"384":1}}],["主要是在",{"2":{"329":2}}],["主要是指客户端和服务器间的通信缓存",{"2":{"168":1}}],["主要是讲没有命中缓存",{"2":{"129":1}}],["主要是用了limit关键字",{"2":{"90":1}}],["主要是设置颜色和宽高",{"2":{"12":1}}],["虽然拿到了n+1的赔偿",{"2":{"1233":1}}],["虽然在这里只有一年多半年的时间",{"2":{"1233":1}}],["虽然docker的命令在生产环境的使用几率不是很多",{"2":{"1015":1}}],["虽然内部拦截了数组的一些方法",{"2":{"955":1}}],["虽然http2使用多路复用技术减少连接时间",{"2":{"727":1}}],["虽然http2解决了http",{"2":{"323":1}}],["虽然官方不推荐",{"2":{"571":1}}],["虽然js引擎是单线程的",{"2":{"525":1}}],["虽然单线程会造成任务执行阻塞",{"2":{"524":1}}],["虽然原理相同",{"2":{"411":1}}],["虽然client已经收到server的fin报文并发送了ack报文确定要断开连接了",{"2":{"382":1}}],["虽然samesite能够防止一定的csrf攻击",{"2":{"353":1}}],["虽然进行了代码分割但还是比较大",{"2":{"129":1}}],["虽然很累却很开心",{"2":{"123":1}}],["刚开始dirty的值时true",{"2":{"932":1}}],["刚开始就传输一个大胖子肯定吃不消",{"2":{"775":1}}],["刚开始就进行一些列的环境配置",{"2":{"124":1}}],["刚开始client处于close状态",{"2":{"378":1}}],["刚开始忘记截图",{"2":{"129":1}}],["别着急接着下面的内容阅读完后再回头试试",{"2":{"571":1}}],["别放弃白嫖",{"2":{"135":1}}],["别说别人浏览文章",{"2":{"129":1}}],["别名",{"0":{"82":1},"2":{"82":3,"186":1,"190":1}}],["突然对白嫖的感觉不那么香了",{"2":{"129":1}}],["简要概述及特点",{"2":{"466":1}}],["简化多容器应用部署",{"2":{"1017":1}}],["简化协作和协同开发",{"2":{"811":1}}],["简化了开发过程中的版本控制流程",{"2":{"785":1}}],["简化的首部格式",{"2":{"366":1}}],["简化整体设计更有利于不同标准的实现",{"2":{"308":1}}],["简直要吐了",{"2":{"129":1}}],["简单创建一个index",{"2":{"1102":1}}],["简单配置",{"2":{"828":1}}],["简单看看使用",{"2":{"688":1}}],["简单试下闭包",{"2":{"594":1}}],["简单方便易懂",{"2":{"573":1}}],["简单演示下",{"2":{"350":1}}],["简单来说就是一个管道对原始数据做点什么",{"2":{"512":1}}],["简单来说writing",{"2":{"17":1}}],["简单来讲此属性就是来配置资源加载白名单",{"2":{"350":1}}],["简单请求不需要进行额外的",{"2":{"337":1}}],["简单请求",{"2":{"337":1}}],["简单请求和非简单请求是浏览器在向服务器发送跨域请求时的两种不同类型",{"2":{"337":1}}],["简单",{"0":{"337":1}}],["简单使用",{"0":{"929":1,"936":1},"2":{"245":1}}],["简单实现",{"0":{"950":1,"959":1},"2":{"199":1,"749":1}}],["简单实现单例模式",{"2":{"196":1,"746":1}}],["简单的docker",{"2":{"1016":1}}],["简单的介绍了docker的基本使用",{"2":{"1015":1}}],["简单的就不赘述了",{"2":{"431":1}}],["简单的html页面",{"2":{"354":1}}],["简单的栗子",{"2":{"201":1,"205":1,"751":1,"755":1}}],["简单的策略模式",{"2":{"197":1,"747":1}}],["简单的实现发布订阅设计模式",{"2":{"195":1,"745":1}}],["简单的webpack配置学习",{"2":{"190":1}}],["简单解释",{"2":{"190":1}}],["简单查询",{"0":{"80":1}}],["简单总结下",{"2":{"22":1}}],["屡试不爽",{"2":{"128":1}}],["鉴权设计理念",{"2":{"601":1}}],["鉴权",{"2":{"127":1}}],["鉴权机制",{"2":{"127":1}}],["鉴权拦截主要是针对登录信息进行拦截的",{"2":{"127":1}}],["鉴权拦截器",{"0":{"127":1}}],["整体命令为ping",{"2":{"1064":1}}],["整体构建的操作也会是黑箱操作",{"2":{"1051":1}}],["整体来说vue3的实现更加清晰",{"2":{"934":1}}],["整体来说文件切片传输的优势有以下几点",{"2":{"767":1}}],["整体配置繁琐",{"2":{"786":1}}],["整体总结可以直奔文中",{"2":{"478":1}}],["整体通信大致过程示意图如下",{"2":{"377":1}}],["整体流程",{"0":{"254":1,"953":1,"985":1}}],["整个过程主要分为以下步骤",{"2":{"1175":1}}],["整个流水将认为作业通过",{"2":{"1130":1}}],["整个流水线将不会执行",{"2":{"1127":1}}],["整个文件的覆盖率",{"2":{"872":1}}],["整个body对象",{"2":{"613":1}}],["整个应用程序",{"2":{"606":2}}],["整个ip数据包的长度",{"2":{"367":1}}],["整个工程划分了免登录和登录机制模块",{"2":{"127":1}}],["整合express框架和mongodb数据库服务器开发",{"2":{"50":1}}],["目的是验证代码中的每个独立单元",{"2":{"853":1}}],["目的和执行方式上有所不同",{"2":{"851":1}}],["目的用来截取网络通信",{"2":{"449":1}}],["目的ip",{"2":{"367":1}}],["目的ip地址",{"2":{"297":1}}],["目的mac地址",{"2":{"297":1}}],["目的就是减少耦合",{"2":{"208":1,"758":1}}],["目标对象没有",{"2":{"956":1}}],["目标对象是",{"2":{"956":1}}],["目标属性所拥有的特性",{"2":{"949":1}}],["目标服务器响应超时时间",{"2":{"723":1}}],["目标服务器数据回传超时时间",{"2":{"723":1}}],["目标mac地址",{"2":{"454":1}}],["目标主机以单播的形式回应发送方",{"2":{"454":1}}],["目标主机链路层去掉链路首部给到网络层",{"2":{"311":1}}],["目标ip",{"2":{"455":1}}],["目标ip主机接收数据包",{"2":{"454":1}}],["目标ip地址",{"2":{"369":1,"454":1}}],["目标",{"2":{"431":1}}],["目标端口构成了tcp四元组",{"2":{"455":1}}],["目标端口",{"2":{"376":1,"455":1}}],["目标设备将丢弃这些数据包并请求重新发送它们",{"2":{"369":1}}],["目标设备将重新组合这些分组数据包",{"2":{"369":1}}],["目标element",{"2":{"243":1}}],["目标盘随便更改",{"2":{"93":1}}],["目录中的所有文件到新的镜像中",{"2":{"1065":1}}],["目录中",{"2":{"1056":1}}],["目录下的文件或子目录",{"2":{"184":1}}],["目录都被清空",{"2":{"184":1}}],["目录",{"0":{"184":1},"2":{"184":2}}],["目录作为静态路由",{"2":{"126":1}}],["目前只想先给自己一段小时间的放松",{"2":{"1233":1}}],["目前公司要大力去做tob方向的业务",{"2":{"1233":1}}],["目前28号了",{"2":{"1232":1}}],["目前重新建了一个qq群",{"2":{"1224":1}}],["目前在深圳就职于qooapp",{"2":{"1223":1}}],["目前就差一个watcher了",{"2":{"954":1}}],["目前vue从主流版本vue2升级到vue3了",{"2":{"948":1}}],["目前项目中的文件都是以ts编写的",{"2":{"858":1}}],["目前最受欢迎的是",{"2":{"788":1}}],["目前市面上还有各种各样的打包工具",{"2":{"784":1}}],["目前没有看到其它处理formdata的方法",{"2":{"613":1}}],["目前已被大多数现代浏览器等",{"2":{"525":1}}],["目前高版本window都会默认设置为系统代理",{"2":{"414":1}}],["目前用vite或者webpack生成的vue项目目前这样的都可以这样调试",{"2":{"406":1}}],["目前大多数浏览器都开始限制对",{"2":{"338":1}}],["目前大部分使用https的都使用了tls1",{"2":{"329":1}}],["目前的产品有50中男衣和50中女士内衣",{"2":{"204":1,"754":1}}],["目前",{"2":{"181":1,"327":1}}],["至此cri",{"2":{"1208":1}}],["至此https配置成功了",{"2":{"1178":1}}],["至此已经成功的展示出query参数",{"2":{"685":1}}],["至此",{"2":{"233":1,"439":1}}],["至于具体的规则还需要在rules中配置",{"2":{"831":1}}],["至于sublime可以做个草稿",{"2":{"785":1}}],["至于ack值不断加1是为了标识数据包保证接收方的顺序性",{"2":{"456":1}}],["至于arp的更详细的概念可以看看其他文章",{"2":{"454":1}}],["至于https",{"2":{"440":1}}],["至于它内部的实现原理我们并不关心",{"2":{"201":1,"751":1}}],["至于这些参数怎么使用",{"2":{"201":1,"751":1}}],["至于题外话就简单一概而过了",{"2":{"124":1}}],["至少都会有一个module",{"2":{"604":1}}],["至少得有2个ab",{"2":{"141":1,"890":1}}],["至少得一个才能匹配上",{"2":{"141":1,"890":1}}],["至少8位",{"2":{"68":1}}],["起步",{"0":{"124":1,"665":1,"679":1},"1":{"680":1,"681":1,"682":1}}],["起始位置",{"2":{"90":1}}],["买到手后就开始各种折腾",{"2":{"123":1}}],["说让我喝点退烧药",{"2":{"1236":1}}],["说了关于今年上半年公司营收很差的现象",{"2":{"1233":1}}],["说npm",{"2":{"1103":1}}],["说白了就是用nexus托管存储包的仓库",{"2":{"1104":1}}],["说白了就是让eslint有解析其他自定义规则的能力",{"2":{"831":1}}],["说白了就是关于变量能为谁提供服务",{"2":{"589":1}}],["说完基本的项目配置文件后",{"2":{"670":1}}],["说",{"2":{"354":2}}],["说是白嫖也不为过😂",{"2":{"123":1}}],["说明绝大多数api都有异步的影子",{"2":{"468":1}}],["说明context中要维持对某个策略对象的引用",{"2":{"197":1,"747":1}}],["说明左右两个盒子并不会自动调整宽度来自适应的布局",{"2":{"111":1}}],["说明第一行的margin",{"2":{"110":1}}],["百度成了解决问题的最大老师",{"2":{"123":1}}],["坎坷往往不会缺席",{"2":{"123":1}}],["谁请求就设置",{"2":{"692":1}}],["谁",{"2":{"123":1}}],["秃",{"2":{"123":2}}],["食用对象",{"2":{"123":1}}],["支持containerd",{"2":{"1207":1}}],["支持的主要网络类型",{"2":{"1087":1}}],["支持的语言选择项有",{"2":{"828":1}}],["支持的语言和框架",{"2":{"785":1}}],["支持通配符匹配",{"2":{"1059":1}}],["支持深度嵌套",{"2":{"951":2}}],["支持glob形式",{"2":{"878":1}}],["支持快速开发和即时刷新",{"2":{"784":1}}],["支持ssl",{"2":{"706":1}}],["支持多种检查方式",{"2":{"1066":1}}],["支持多种调试器和调试配置",{"2":{"785":1}}],["支持多种编程语言",{"2":{"785":1}}],["支持多协议",{"2":{"664":1}}],["支持多个网络应用",{"2":{"364":1}}],["支持qos",{"2":{"366":1}}],["支持网络扩展",{"2":{"364":1}}],["支持更安全的加密算法和协商过程",{"2":{"329":1}}],["支持更安全的加密算法和扩展性",{"2":{"329":1}}],["支持对称加密",{"2":{"329":1}}],["支持我不断更新",{"2":{"252":1,"271":1,"991":1}}],["支持背景图需要用到指令参数",{"2":{"249":1}}],["支持",{"2":{"138":1,"329":1,"841":1,"887":1}}],["支持vue",{"2":{"125":1}}],["支持下表这些参数值",{"2":{"117":1}}],["支出多少钱等等",{"2":{"83":1}}],["文中大多都是在说原理实现",{"2":{"775":1}}],["文本节点",{"2":{"404":1}}],["文章",{"2":{"1223":1}}],["文章中的一些配置可能不适用了",{"2":{"1194":1}}],["文章中说明了",{"2":{"323":1,"328":1}}],["文章难免会有一些疏漏或者错误之处",{"2":{"271":1,"1223":1}}],["文字方向",{"2":{"284":1}}],["文字",{"0":{"284":1}}],["文件在添加了",{"2":{"1202":1}}],["文件可以避免将不必要的文件和目录复制到镜像中",{"2":{"1075":1}}],["文件定义容器的配置",{"2":{"1017":1}}],["文件导入为一个名为",{"2":{"1010":1}}],["文件导入为一个新的",{"2":{"1010":1}}],["文件和导入的镜像都是针对单个容器的",{"2":{"1010":1}}],["文件和图片等",{"2":{"325":1}}],["文件只包含容器的文件系统",{"2":{"1010":1}}],["文件系统加载到内存中",{"2":{"997":1}}],["文件系统是一个只读的文件系统",{"2":{"997":1}}],["文件报告的结构大概如下",{"2":{"874":1}}],["文件夹",{"2":{"857":1}}],["文件秒传",{"0":{"774":1}}],["文件被分成若干个切片后是按照一定的时机或顺序传输的",{"2":{"772":1}}],["文件的路径为当前目录下的",{"2":{"1068":1}}],["文件的路径",{"2":{"1068":1}}],["文件的hash计算会消耗大量的时间尤其对于大型文件",{"2":{"773":1}}],["文件的唯一性不能使用文件名简单判断",{"2":{"772":1}}],["文件的切片涉及到的二进制方面的内容",{"2":{"768":1}}],["文件的mime类型",{"2":{"500":1}}],["文件切片后就是传输了和普通的上传没啥区别",{"2":{"769":1}}],["文件切片就是对整个文件进行切割处理",{"2":{"768":1}}],["文件切片",{"0":{"768":1},"2":{"768":1,"769":1}}],["文件切片传输就和小文件传输一致了",{"2":{"767":1}}],["文件内容比较多",{"2":{"1202":1}}],["文件内容",{"2":{"717":1}}],["文件内容的格式取决于哪种读取方式",{"2":{"504":1}}],["文件类型",{"2":{"717":1}}],["文件路径",{"2":{"709":1}}],["文件转换要对应传过来的key",{"2":{"701":1}}],["文件转换成浏览器识别的",{"2":{"179":1}}],["文件上传",{"0":{"701":1,"765":1}}],["文件上传与下载",{"0":{"699":1},"1":{"700":1,"701":1}}],["文件扩展",{"2":{"695":1}}],["文件i",{"2":{"537":1}}],["文件下载",{"0":{"521":1}}],["文件大小",{"2":{"500":1}}],["文件分片上传",{"2":{"497":1}}],["文件会以",{"2":{"414":1}}],["文件开头添加debugger",{"2":{"407":1}}],["文件编码",{"2":{"319":1}}],["文件传到错误解析系统",{"2":{"183":1}}],["文件部署到",{"2":{"183":1}}],["文件名字",{"2":{"500":1,"769":1}}],["文件名对应的内容就是",{"2":{"410":1}}],["文件名",{"2":{"181":1,"190":1,"701":1}}],["文件中定义多个阶段",{"2":{"1070":1}}],["文件中的指令构建",{"2":{"1068":1}}],["文件中增加一个引用注释",{"2":{"183":1}}],["文件中使用图片哦~",{"2":{"181":1}}],["文件中",{"2":{"179":1}}],["文件",{"2":{"176":1,"179":2,"183":3,"219":1,"325":1,"498":1,"857":1,"1010":4,"1068":1,"1075":1,"1228":1}}],["文件管理",{"0":{"163":1}}],["文件还是比较大的",{"2":{"131":1}}],["文件处理库",{"2":{"62":1}}],["文档变更",{"2":{"801":2}}],["文档和技术支持等",{"2":{"786":1}}],["文档卸载时浏览器进程和渲染进程要进行通信确保unload事件",{"2":{"276":1}}],["文档加载完后会通知浏览器进程",{"2":{"276":1}}],["文档",{"2":{"117":1,"184":1,"665":1,"797":1}}],["参考断点续传",{"2":{"774":1}}],["参考以上blob的切片操作这里就不演示了",{"2":{"501":1}}],["参考文献",{"0":{"270":1,"293":1,"306":1,"314":1,"373":1,"396":1},"2":{"280":1}}],["参考文章",{"0":{"223":1}}],["参考文档",{"0":{"193":1,"211":1,"355":1,"568":1,"663":1,"689":1,"693":1,"698":1,"730":1,"734":1,"736":1,"761":1,"779":1,"807":1,"883":1,"980":1,"1035":1,"1076":1,"1149":1,"1192":1,"1222":1},"2":{"448":1}}],["参与了更多创建过程或者更加复杂",{"2":{"202":1,"752":1}}],["参与双方若是基础类型都会转换为number类型",{"2":{"43":1,"549":1}}],["参数而不重新启动",{"2":{"1205":1}}],["参数在重新启动后保持不变",{"2":{"1205":1}}],["参数使用",{"2":{"1200":1}}],["参数说明",{"0":{"1158":1}}],["参数来指定数据卷的挂载方式",{"2":{"1116":1}}],["参数来传递一个新的值给指定的参数",{"2":{"1054":1}}],["参数可以查看构建构建日志和进度",{"2":{"1069":1}}],["参数用于指定构建上下文的路径",{"2":{"1068":1}}],["参数用于指定",{"2":{"1068":1}}],["参数指定构建上下文的路径为当前目录",{"2":{"1068":1}}],["参数指定",{"2":{"1068":2}}],["参数指定端口映射规则",{"2":{"1062":1}}],["参数位于",{"2":{"729":1}}],["参数位置",{"2":{"232":1}}],["参数的值",{"2":{"729":1}}],["参数值可以包含变量",{"2":{"718":2}}],["参数处理",{"0":{"613":1}}],["参数装饰器单独使用很有限",{"2":{"232":1}}],["参数装饰器",{"0":{"232":1},"2":{"232":1}}],["参数支持多格式",{"2":{"200":1,"750":1}}],["参数提示",{"2":{"160":1}}],["参数为",{"2":{"154":1,"903":1}}],["参数",{"2":{"117":1,"233":2,"249":1,"944":2,"1121":1,"1205":1}}],["片段",{"2":{"115":1}}],["子包之间可能也会存在复杂的依赖关系",{"2":{"816":1}}],["子包名",{"2":{"815":1}}],["子包b",{"2":{"810":1}}],["子包a",{"2":{"810":1}}],["子域路由",{"0":{"618":1}}],["子类实例会拥有父类相同的属性的实例属性",{"2":{"580":1}}],["子类实例共享父类状态易篡改",{"2":{"579":1,"581":1}}],["子几点的改变不会监听到",{"2":{"404":1}}],["子节点的字节点变化",{"2":{"404":1}}],["子节点增加",{"2":{"404":1}}],["子节点删除",{"2":{"404":1}}],["子节点替换",{"2":{"404":1}}],["子网c",{"2":{"364":1}}],["子网b",{"2":{"364":1}}],["子网a",{"2":{"364":1}}],["子网掩码255",{"2":{"364":3}}],["子网掩码中",{"2":{"363":1}}],["子网掩码",{"0":{"363":1},"2":{"312":1,"363":1}}],["子树的",{"2":{"115":1}}],["子查询",{"0":{"89":1}}],["树的xml字符串",{"2":{"119":1}}],["树",{"2":{"115":1}}],["源对象",{"2":{"958":1}}],["源host",{"2":{"723":1}}],["源文件内容字符串",{"2":{"410":1}}],["源文件名路径",{"2":{"410":1}}],["源端口",{"2":{"376":1,"455":2}}],["源端口和目标端口",{"2":{"311":1}}],["源ip",{"2":{"367":1,"455":1}}],["源ip地址",{"2":{"297":1}}],["源主机就可以使用该mac地址向目标主机发送数据包",{"2":{"302":1}}],["源mac地址",{"2":{"297":1}}],["源类型验证器",{"2":{"232":1}}],["源验证器或自定义参数验证器",{"2":{"232":1}}],["源码地址👉点击这里",{"2":{"1073":1,"1074":1}}],["源码调试技巧",{"0":{"966":1}}],["源码写的很健壮这里大家了解下大概流程即可",{"2":{"964":1}}],["源码体量太大了",{"2":{"948":1}}],["源码会涉及到大量的代码",{"2":{"948":1}}],["源码好找的情况下可以直接在浏览器中找到对应的js文件直接打个条件注释断点就行",{"2":{"404":1}}],["源码映射",{"2":{"187":1,"190":1}}],["源码在这里",{"0":{"66":1}}],["源代码解析为一个",{"2":{"115":1}}],["利用rust或go的高性能和并发特性",{"2":{"784":1}}],["利用双重验证来提高安全性",{"2":{"353":1}}],["利用这一缓存可以提升服务器资源利用率",{"2":{"168":1}}],["利用这些渲染规则可以达到一定的布局效果",{"2":{"113":1}}],["利用浏览器的空闲时间",{"2":{"129":1}}],["利用行内元素居中属性也可以做到水平垂直居中",{"2":{"16":1}}],["小写",{"2":{"1121":2}}],["小卫",{"2":{"955":1}}],["小王",{"2":{"951":1}}],["小李",{"2":{"866":1,"951":1,"955":1}}],["小李不喜欢加分号",{"2":{"782":1}}],["小略几篇真是苦笑不已",{"2":{"785":1}}],["小张喜欢在行末加上分号",{"2":{"782":1}}],["小于",{"2":{"717":1}}],["小白",{"2":{"612":2,"613":7}}],["小红同学",{"2":{"582":2,"583":2}}],["小红",{"2":{"580":4,"582":2,"583":2,"955":1}}],["小提示",{"2":{"454":1,"932":1}}],["小明同学",{"2":{"582":2,"583":2}}],["小明登录后",{"2":{"352":1}}],["小明",{"2":{"202":1,"436":1,"580":4,"582":2,"583":2,"752":1,"866":1,"867":1,"950":1,"951":2,"955":1,"958":1,"959":2,"960":2}}],["小数点",{"2":{"139":1,"888":1}}],["小编开发完基本的功能后",{"2":{"126":1}}],["小编的博客主要是基于自己的webpack",{"2":{"125":1}}],["小编用的是一台centos机器",{"2":{"124":1}}],["小结",{"0":{"113":1,"460":1}}],["小时",{"2":{"60":1,"720":1,"721":1}}],["让我爸管理下面的一些人",{"2":{"1232":1}}],["让我们做简单的修改",{"2":{"685":1}}],["让我们以arp协议开始吧",{"2":{"454":1}}],["让我们用localhost",{"2":{"425":1}}],["让我们开始吧",{"2":{"411":1}}],["让我们共同进步",{"2":{"271":1}}],["让我们在浏览器中查看效果",{"2":{"176":1}}],["让我们简单的配置一下package",{"2":{"175":1}}],["让容器中的进程进行清理和保存工作",{"2":{"1008":1}}],["让解构的属性值获取的还是原来的对象",{"2":{"963":1}}],["让它支持数组",{"2":{"955":1}}],["让不同作用域的变量互不干扰和污染",{"2":{"589":1}}],["让其换成回调函数模式",{"2":{"868":1}}],["让其拥有prettier的规则",{"2":{"845":1}}],["让其支持静态属性这个特点",{"2":{"583":1}}],["让其内部的this的属性可以转嫁给子类",{"2":{"578":1}}],["让其在io回调里执行",{"2":{"539":1}}],["让其兼容各种浏览器",{"2":{"200":1,"750":1}}],["让其兼容各个浏览器",{"2":{"200":1,"750":1}}],["让更多同学看到",{"2":{"271":1,"991":1}}],["让base",{"2":{"229":1}}],["让当前service变成可注入",{"2":{"229":1}}],["让父元素生成bfc",{"2":{"112":1}}],["让你不再产生烦恼",{"2":{"63":1}}],["结构",{"2":{"920":1,"955":1}}],["结构化",{"2":{"779":1}}],["结构化设计模式",{"2":{"210":1,"760":1}}],["结果已经标识出来了",{"2":{"587":1}}],["结果也确实如此",{"2":{"111":1}}],["结束时通过fin断开连接",{"2":{"455":1}}],["结合了很多其他包管理器优秀的方案",{"2":{"815":1}}],["结合commitlint",{"0":{"802":1}}],["结合工具的特长用之",{"2":{"784":1}}],["结合vue",{"2":{"677":1}}],["结合的方式使用",{"2":{"146":1,"895":1}}],["结合使用这两种测试方法可以提高软件的质量和可靠性",{"2":{"854":1}}],["结合使用",{"2":{"145":1,"894":1}}],["结尾的文件",{"2":{"717":1}}],["结尾",{"2":{"709":1}}],["结尾容我感叹一句",{"2":{"135":1}}],["结尾是固定内容",{"2":{"85":1}}],["结尾一定不能漏掉分号",{"2":{"71":1}}],["右侧的顺序有优先级",{"2":{"1106":1}}],["右侧便是web界面",{"2":{"877":1}}],["右侧自己来创建测试用例",{"2":{"877":1}}],["右侧有一个act",{"2":{"438":1}}],["右至左符号",{"2":{"462":1}}],["右击有一些菜单功能",{"2":{"413":1}}],["右击想要调试的文件",{"2":{"407":1}}],["右移编辑器",{"2":{"162":1}}],["右栏",{"2":{"111":1}}],["右栏新宽度=3",{"2":{"111":1}}],["右联查询的定义",{"2":{"86":1}}],["右联接",{"2":{"86":1}}],["设备转发到目标容器或宿主机的网络命名空间中",{"2":{"1086":1}}],["设备发送到宿主机的虚拟网桥",{"2":{"1086":1}}],["设备通常被命名为",{"2":{"1086":2}}],["设备",{"2":{"1086":1}}],["设备可以向网络中的rarp服务器发送一个rarp请求",{"2":{"301":1}}],["设为",{"2":{"729":1}}],["设为一个小于左盒子的宽度+右边盒子的宽度值",{"2":{"111":1}}],["设计模式就是写代码中常见的套路",{"2":{"194":1,"744":1}}],["设计模式",{"0":{"744":1},"1":{"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"753":1,"754":1,"755":1,"756":1,"757":1,"758":1,"759":1,"760":1,"761":1},"2":{"194":1,"211":1,"744":1,"761":1}}],["设置所需的",{"2":{"1205":1}}],["设置作业失败情况下重试的次数",{"2":{"1132":1}}],["设置中设置",{"2":{"1121":3}}],["设置npm仓库",{"2":{"1102":1}}],["设置ali仓库加速地址",{"2":{"1082":1}}],["设置app静态方法",{"2":{"583":1}}],["设置时区",{"2":{"1055":1}}],["设置容器的环境变量",{"2":{"1004":1}}],["设置当前watcher",{"2":{"954":2}}],["设置属性时执行intro方法",{"2":{"950":1}}],["设置属性",{"2":{"950":1,"951":2}}],["设置函数",{"2":{"949":1}}],["设置user为true",{"2":{"938":1}}],["设置dep",{"2":{"932":1}}],["设置描述对象",{"2":{"932":1}}],["设置端测用例的位置",{"2":{"879":1}}],["设置界面视口大小",{"2":{"878":1}}],["设置成false不会生成",{"2":{"878":1}}],["设置代码的语言环境",{"2":{"828":1}}],["设置代理",{"2":{"414":1}}],["设置其中一个虚拟ip为",{"2":{"728":1}}],["设置缓存失效时使用旧的缓存数据的有效期为",{"2":{"721":1}}],["设置缓存锁定的超时时间为",{"2":{"721":1}}],["设置缓存背景更新时使用的临时文件路径",{"2":{"721":1}}],["设置缓存背景更新的失败重试次数为",{"2":{"721":1}}],["设置缓存背景更新的时间间隔为",{"2":{"721":1}}],["设置缓冲区",{"2":{"718":1}}],["设置webp图片质量",{"2":{"718":1}}],["设置转换的jpeg图像的质量",{"2":{"718":1}}],["设置状态码",{"2":{"715":1}}],["设置用户名和密码鉴权",{"2":{"713":1}}],["设置头信息",{"2":{"695":1}}],["设置请求允许的方法",{"2":{"692":1}}],["设置请求允许的头",{"2":{"692":1}}],["设置请求头",{"2":{"436":1}}],["设置路径标识",{"2":{"688":1}}],["设置路由守卫",{"2":{"648":1}}],["设置页面信息",{"2":{"688":1}}],["设置swagger的地址url",{"2":{"681":1}}],["设置元数据",{"2":{"648":2}}],["设置原型",{"2":{"575":1}}],["设置背压",{"2":{"514":1}}],["设置起点",{"2":{"462":1}}],["设置range终点",{"2":{"462":1}}],["设置包含节点内容",{"2":{"462":1}}],["设置它很简单",{"2":{"453":1}}],["设置断点",{"2":{"428":1}}],["设置前面已经介绍了",{"2":{"419":1}}],["设置以structure",{"2":{"414":1}}],["设置记录查看方式",{"2":{"414":1}}],["设置一个数据报可经过的路由器数量的上限",{"2":{"367":1}}],["设置cache",{"2":{"616":1}}],["设置cookie相关参数包括",{"2":{"347":1}}],["设置cdn",{"0":{"130":1}}],["设置允许的请求头",{"2":{"339":1,"724":1}}],["设置允许的",{"2":{"339":1,"724":1}}],["设置允许的源",{"2":{"339":1,"724":1}}],["设置图形或图片的透明度",{"2":{"283":1}}],["设置",{"2":{"165":1,"729":1}}],["设置黑名单用来鉴权",{"2":{"127":1}}],["设置后安装完成后登录使用",{"2":{"68":1}}],["设置token",{"2":{"64":1}}],["设置默认分页数据",{"2":{"63":2}}],["设置文件大小",{"2":{"62":1}}],["设置上传目录",{"2":{"62":1}}],["设置编码格式",{"2":{"62":1}}],["浮在文档流元素上",{"2":{"111":1}}],["浮动元素也参与计算",{"2":{"107":1,"108":1,"112":1}}],["左至右符号",{"2":{"462":1}}],["左下角第一个点击切换可以快速开关抓包",{"2":{"435":1}}],["左侧的测试日志鼠标移到对应的位置会显示对应的快照",{"2":{"879":1}}],["左侧主要是测试日志",{"2":{"877":1}}],["左侧用来生成官方的测试例子",{"2":{"877":1}}],["左侧",{"2":{"400":1}}],["左移编辑器",{"2":{"162":1}}],["左栏",{"2":{"111":1}}],["左栏新宽度=2",{"2":{"111":1}}],["左栏是浮动元素",{"2":{"111":1}}],["左联查询的定义",{"2":{"86":1}}],["左联接",{"2":{"86":1}}],["应输入",{"2":{"726":1,"1178":1}}],["应合理设置处理流程",{"2":{"718":1}}],["应以实际的情况进行绑定",{"2":{"640":1}}],["应该没啥事不要让我太担心",{"2":{"1232":1}}],["应该都听说过计算属性有缓存吧",{"2":{"930":1}}],["应该不会掉太多帧",{"2":{"534":1}}],["应该还需要一个懒加载管理器lazy",{"2":{"242":1}}],["应该是50px",{"2":{"110":1}}],["应用各种规则和约定",{"2":{"842":1}}],["应用都处在一个仓库内",{"2":{"809":1}}],["应用配置文件",{"2":{"665":1}}],["应用配置",{"0":{"627":1,"668":1},"1":{"628":1,"629":1,"630":1,"631":1,"632":1,"669":1,"670":1}}],["应用层拿到数据后根据不同情况进行响应或拒绝",{"2":{"311":1}}],["应用层是tcp",{"2":{"310":1}}],["应用层",{"2":{"309":1,"310":1,"312":1}}],["应用清单",{"2":{"222":1}}],["应用程序进行自动化测试",{"2":{"876":1}}],["应用程序的部署和运行",{"2":{"1016":1}}],["应用程序的开源测试框架",{"2":{"855":1}}],["应用程序的静态模块打包器",{"2":{"171":1}}],["应用程序需要不同的配置文件分别在不同的环境进行运行",{"2":{"627":1}}],["应用程序异步读取存储在用户计算机上的文件",{"2":{"502":1}}],["应用程序清单文件的源",{"2":{"350":1}}],["应用程序通信的应用层协议",{"2":{"315":1}}],["应用程序",{"2":{"222":1,"601":1,"662":1,"1065":2}}],["应用部署镜像",{"2":{"665":1}}],["应用部署",{"0":{"126":1},"1":{"127":1,"128":1},"2":{"1223":1}}],["应用搭建",{"0":{"125":1}}],["应用",{"0":{"109":1},"1":{"110":1,"111":1,"112":1},"2":{"84":1,"100":1,"214":1,"1205":1}}],["应用场景",{"2":{"83":2}}],["反向代理到",{"2":{"1034":1}}],["反向代理与负载均衡",{"2":{"705":1}}],["反向代理",{"0":{"723":1},"2":{"414":1,"706":1}}],["反向地址解析协议",{"2":{"301":1}}],["反之对象取",{"2":{"932":1}}],["反之没权限",{"2":{"648":1}}],["反之没有收到另一方的ack",{"2":{"390":1}}],["反之是不可以的",{"2":{"589":1}}],["反之返回自定义的对象",{"2":{"576":1}}],["反之执行其会首先打印settimeout",{"2":{"532":1}}],["反之继续",{"2":{"332":1}}],["反之亦然",{"2":{"107":1}}],["反射型",{"2":{"350":2}}],["反射型xss",{"2":{"350":1}}],["反射获取参数源类型",{"2":{"232":1}}],["反射赋值",{"2":{"229":1}}],["反正把请求往后面传递",{"2":{"205":1,"755":1}}],["反正我是懒得手动去清理的",{"2":{"184":1}}],["反馈的这个方案",{"2":{"21":1}}],["属于进程级别",{"2":{"1078":1}}],["属于server块中的模块",{"2":{"709":1}}],["属于http块中的模块",{"2":{"709":1}}],["属于同一个bfc的两个相邻的box的margin会发生重叠",{"2":{"105":1}}],["属性的依赖里",{"2":{"959":1}}],["属性的值为普通对象",{"2":{"937":1}}],["属性的值",{"2":{"115":1,"949":1}}],["属性值改变时对新的值重新进行观测",{"2":{"955":1}}],["属性很重要",{"2":{"934":1}}],["属性用来存放所有的computedwatcher",{"2":{"932":1}}],["属性顺序规则",{"2":{"846":1}}],["属性顺序",{"2":{"842":1}}],["属性概念一样",{"2":{"577":1}}],["属性指向它的构造函数的prototype属性也就是原型",{"2":{"571":1}}],["属性进行访问",{"2":{"571":1}}],["属性上",{"2":{"570":1}}],["属性构建的任意的",{"2":{"518":1}}],["属性监听",{"2":{"404":1}}],["属性和",{"2":{"350":1}}],["属性定义",{"0":{"243":1}}],["属性访问器",{"0":{"572":1},"2":{"233":2}}],["属性名",{"2":{"232":1}}],["属性名称",{"2":{"230":1}}],["属性描述器或不返回",{"2":{"230":1}}],["属性描述器",{"2":{"230":1}}],["属性装饰器可以收集信息",{"2":{"229":1}}],["属性装饰器",{"0":{"229":1}}],["属性类型",{"2":{"227":1}}],["属性",{"0":{"152":1,"484":1,"488":1,"495":1,"500":1,"504":1,"901":1},"2":{"7":1,"233":2,"353":2,"462":1,"571":4,"920":1,"932":1,"937":1,"959":1}}],["内心一定要强大",{"2":{"1232":1}}],["内心提心吊胆",{"2":{"1232":1}}],["内心很难受",{"2":{"1232":1}}],["内容都是以平时的积累和自己的见解作为基础的",{"2":{"1223":1}}],["内容涉及到前端的学习路线",{"2":{"1223":1}}],["内容如下",{"2":{"712":1}}],["内核升级",{"0":{"1198":1}}],["内核启动后会挂载root文件系统为用户提供空间支持",{"2":{"996":1}}],["内置的",{"2":{"1091":1}}],["内置的规则",{"2":{"847":1}}],["内置工具类型",{"0":{"920":1}}],["内置any",{"0":{"909":1}}],["内置null",{"0":{"908":1}}],["内置了丰富的版本管理",{"2":{"814":1}}],["内置了强大的调试功能",{"2":{"785":1}}],["内置调试功能",{"2":{"785":1}}],["内置变量",{"0":{"729":1}}],["内置功能",{"0":{"670":1}}],["内置pipe",{"0":{"644":1}}],["内置filter",{"0":{"638":1}}],["内存占用小",{"2":{"767":1}}],["内存占用大",{"2":{"766":1}}],["内存",{"2":{"740":1}}],["内存碎片化",{"2":{"558":1}}],["内存等相关因素的影响",{"2":{"380":1}}],["内嵌脚本执行",{"2":{"350":1}}],["内嵌js",{"2":{"350":2}}],["内嵌css脚本",{"2":{"350":1}}],["内部",{"2":{"1121":1,"1122":1}}],["内部往往包含了一些无用的内容文件",{"2":{"1070":1}}],["内部配置",{"2":{"1055":1}}],["内部由一条条具体的构建指令组合而成",{"2":{"1051":1}}],["内部通过ob",{"2":{"955":1}}],["内部通过initstate进行组件相关属性的设置",{"2":{"954":1}}],["内部访问number值",{"2":{"934":1}}],["内部使用我们待测试的vue组件",{"2":{"879":1}}],["内部基于koa的洋葱模型",{"2":{"633":1}}],["内部自动注入",{"2":{"624":1}}],["内部会循环遍历key",{"2":{"941":1}}],["内部会访问响应式对象使computed被对应的data收集",{"2":{"934":1}}],["内部会访问number触发它的get然后对computed的effect进行收集",{"2":{"934":1}}],["内部会对传入的参数做统一处理",{"2":{"934":1}}],["内部会执行watcher的get方法",{"2":{"932":1}}],["内部会执行parent方法",{"2":{"578":1}}],["内部会自动进行注入",{"2":{"623":1}}],["内部会查找当前模块所提供的providers标识进行注入",{"2":{"606":1}}],["内部提供了中间件",{"2":{"601":1}}],["内部作用域可以访问外部作用域的变量",{"2":{"589":1}}],["内部有很多属性和方法",{"2":{"575":1}}],["内部有什么逻辑是不关心的",{"2":{"201":1,"751":1}}],["内部调度不用关心",{"2":{"538":1}}],["内部也会resolve返回promise也是个微任务放入微任务队列",{"2":{"532":1}}],["内部的回调会主动执行",{"2":{"945":1}}],["内部的数据",{"2":{"512":1}}],["内部的元素会在垂直方向上一个接一个的放置",{"2":{"105":1}}],["内部还是之后",{"2":{"462":1}}],["内部网络中的多个设备可能会使用相同的ip地址",{"2":{"370":1}}],["内部执行的是mountcomponent函数",{"2":{"238":1}}],["内部状态独立于具体的场景",{"2":{"204":1,"754":1}}],["内部状态可以被一些对象共享",{"2":{"204":1,"754":1}}],["内部状态存储于对象内部",{"2":{"204":1,"754":1}}],["内部判断实现",{"2":{"200":1,"750":1}}],["内联理解起来比左右联更简单",{"2":{"86":1}}],["内联",{"2":{"86":1}}],["常量",{"2":{"665":1}}],["常量名",{"2":{"504":1}}],["常量装饰器",{"2":{"229":1}}],["常被用来当做标示文件是以utf",{"2":{"462":1}}],["常见无规范问题",{"0":{"783":1}}],["常见状态码",{"0":{"317":1}}],["常见插件",{"0":{"267":1}}],["常见预设",{"0":{"266":1}}],["常见应用",{"2":{"199":1,"749":1}}],["常见的优化手段有",{"2":{"1075":1}}],["常见的有如下多种类型",{"2":{"789":1}}],["常见的前端编辑器包括",{"2":{"785":1}}],["常见的键盘",{"2":{"532":1}}],["常见的就有文件的上传",{"2":{"478":1}}],["常见的就是app抓包",{"2":{"437":1}}],["常见的跨端技术",{"2":{"464":1}}],["常见的syn攻击就是基于半连接漏洞产生的",{"2":{"384":1}}],["常见的认证机制如cookie",{"2":{"346":1}}],["常见的状态码如下",{"2":{"317":1}}],["常见的构建工具",{"2":{"281":1}}],["常见的栗子",{"2":{"201":1,"751":1}}],["常见的方法",{"2":{"153":1,"902":1}}],["常见的属性",{"2":{"152":1,"901":1}}],["常见的断言x",{"2":{"147":1,"896":1}}],["常见的量词包括",{"2":{"141":1,"890":1}}],["常见用法",{"2":{"145":1,"894":1}}],["常见问题",{"0":{"97":1,"424":1,"882":1},"1":{"425":1}}],["常用来添加一些全局环境模拟数据",{"2":{"857":1}}],["常用server来配置虚拟主机",{"2":{"709":1}}],["常用命令",{"0":{"708":1}}],["常用",{"0":{"921":1},"2":{"643":1}}],["常用工具",{"2":{"414":1}}],["常用的参数如下",{"2":{"1069":1}}],["常用的参数",{"2":{"998":1}}],["常用的规则属性如",{"2":{"797":1}}],["常用的指令包括max",{"2":{"720":1}}],["常用的工具",{"2":{"413":1}}],["常用的虚拟代理形式",{"2":{"198":1,"748":1}}],["常用的方法",{"2":{"154":1,"903":1}}],["常用的修饰符有",{"2":{"138":1,"887":1}}],["常用的关系型数据库有很多",{"2":{"67":1}}],["常用函数",{"0":{"83":1}}],["常用数据类型",{"2":{"75":1}}],["重载配置有两种",{"2":{"1179":1}}],["重载配置",{"2":{"1175":1}}],["重启",{"2":{"1203":1}}],["重启服务shsystemctl",{"2":{"1045":1}}],["重启策略等等",{"2":{"1019":1}}],["重启nginx",{"2":{"718":1}}],["重构",{"2":{"801":2}}],["重试次数3",{"2":{"771":1}}],["重定向https",{"2":{"726":1}}],["重定向到",{"2":{"718":1}}],["重定向到指定的位置更为友好",{"2":{"718":1}}],["重定向",{"0":{"617":1,"714":1},"1":{"715":1,"716":1},"2":{"436":1,"715":1,"1058":1}}],["重放功能",{"2":{"431":1}}],["重放等功能",{"2":{"431":1}}],["重传有两种机制",{"2":{"388":1}}],["重传机制",{"0":{"388":1},"1":{"389":1,"390":1,"391":1},"2":{"395":1}}],["重组和重命名",{"2":{"811":1}}],["重组是指在目标设备上重新组合ip分片",{"2":{"369":1}}],["重组",{"0":{"369":1}}],["重要性",{"0":{"824":1}}],["重要",{"2":{"350":1,"414":2,"436":1}}],["重置密码",{"2":{"1174":1}}],["重置连接",{"0":{"379":1}}],["重置",{"2":{"283":1}}],["重写路径",{"2":{"190":1}}],["重现构建",{"2":{"184":1}}],["重命名符号",{"2":{"160":1}}],["重新启动",{"2":{"1179":1}}],["重新拉取",{"2":{"1107":1}}],["重新在我们的npm包里安装一个私有仓库没有的依赖",{"2":{"1103":1}}],["重新用完整的地址下载nginx",{"2":{"1012":1}}],["重新查看",{"2":{"1002":1}}],["重新计时2msl",{"2":{"457":1}}],["重新加载捕获文件",{"2":{"452":1}}],["重新加载配置",{"2":{"128":1}}],["重新捕获",{"2":{"452":1}}],["重新输入输入https",{"2":{"438":1}}],["重新发起请求",{"2":{"431":1}}],["重新请求",{"2":{"415":1}}],["重新请求等等",{"2":{"413":1}}],["重新定义算法中某些步骤的具体实现",{"2":{"207":1,"757":1}}],["重新打开被关闭的编辑器",{"2":{"163":1}}],["重新从头开始",{"2":{"152":1,"901":1}}],["重新安装nodemon",{"2":{"96":1}}],["重点",{"2":{"40":1,"546":1}}],["老是爱瞎想",{"2":{"1232":1}}],["老生代使用",{"2":{"559":1}}],["老生代",{"0":{"561":1},"2":{"559":1}}],["老版本的node已经无法友好支持",{"2":{"92":1}}],["老项目和新项目对node版本依赖不同",{"2":{"92":1}}],["老村长",{"2":{"86":1}}],["都填写后点击保存按钮即可",{"2":{"1097":1}}],["都有",{"2":{"878":1}}],["都写成ts类型的",{"2":{"858":1}}],["都比较简单这里就不再赘述了",{"2":{"775":1}}],["都非常值得我们思考和学习",{"2":{"601":1}}],["都可以正确的访问到自己的词法环境中提供的变量",{"2":{"590":1}}],["都可以通过自联的方式获取想要的结果",{"2":{"88":1}}],["都不会发生变量提升",{"2":{"588":1}}],["都能处理",{"2":{"498":1}}],["都很简单的",{"2":{"426":1}}],["都使用以下方法设置",{"2":{"337":1}}],["都是通过osi模型从上到下的协议将数据封装最终发送到目的主机",{"2":{"454":1}}],["都是为了避免2msl期间server重传fin报文",{"2":{"382":1}}],["都是从new",{"2":{"236":1}}],["都是调用api",{"2":{"201":1,"751":1}}],["都删除",{"2":{"184":1}}],["都会立即执行user",{"2":{"942":1}}],["都会正确的打印出name的值",{"2":{"590":1}}],["都会影响到其它的子类",{"2":{"577":1}}],["都会以字面量的方式创建",{"2":{"573":1}}],["都会在自己的arp缓存表中存储已经进行过arp请求并得到回应的ip地址和mac地址的对应关系",{"2":{"298":1}}],["都会执行loadimage函数",{"2":{"246":1}}],["都会触发change事件",{"2":{"208":1,"758":1}}],["都会帮我们先清空一波",{"2":{"184":1}}],["都会打包生成单独的",{"2":{"183":1}}],["都会变为垂直方向上的属性",{"2":{"17":1}}],["先创建nexus配置卷",{"2":{"1094":1}}],["先创建一个分数表",{"2":{"88":1}}],["先使用以下命令开始监听server端",{"2":{"994":1}}],["先来分析下watcher的执行过程",{"2":{"954":1}}],["先来看看二者优缺点",{"2":{"1078":1}}],["先来看看updatecomponent函数的作用",{"2":{"954":1}}],["先来看看new操作",{"2":{"576":1}}],["先来看看js内存结构概念",{"2":{"528":1}}],["先搞明白自己熟悉的部分如",{"2":{"948":1}}],["先对watch对象的值进行规范化",{"2":{"944":1}}],["先记住概念",{"2":{"571":2}}],["先看有没有setimmediate回调",{"2":{"538":1}}],["先看储存的缓存里是否存在",{"2":{"167":1}}],["先别看答案自己先过一遍写出结果",{"2":{"532":1}}],["先判断有没有对应的缓存",{"2":{"248":1}}],["先介绍个工具库",{"2":{"226":1}}],["先通过一张loading图占位",{"2":{"198":1,"748":1}}],["先找style",{"2":{"186":1,"190":1}}],["先下载cross",{"2":{"182":1}}],["先下载",{"2":{"181":1}}],["先下载依赖",{"2":{"179":1}}],["先匹配数字",{"2":{"140":2,"889":2}}],["先大概了解下",{"2":{"132":1}}],["先转换转换为false",{"2":{"48":1,"554":1}}],["合适的时机打印inner",{"2":{"532":1}}],["合并时暴露工件",{"2":{"1139":1}}],["合并请求差异的基本",{"2":{"1122":1}}],["合并请求差异的版本",{"2":{"1122":1}}],["合并请求的事件类型",{"2":{"1122":1}}],["合并请求的标题",{"2":{"1122":1}}],["合并请求的目标分支的",{"2":{"1122":1}}],["合并请求的目标分支的保护状态",{"2":{"1122":1}}],["合并请求的目标分支名称",{"2":{"1122":1}}],["合并请求的源项目路径",{"2":{"1122":1}}],["合并请求的源项目的",{"2":{"1122":2}}],["合并请求的源分支的",{"2":{"1122":1}}],["合并请求的源分支名称",{"2":{"1122":1}}],["合并请求的引用路径",{"2":{"1122":1}}],["合并请求的项目的",{"2":{"1122":1}}],["合并请求的项目路径",{"2":{"1122":1}}],["合并请求的项目",{"2":{"1122":1}}],["合并请求的项目级",{"2":{"1122":1}}],["合并请求的里程碑标题",{"2":{"1122":1}}],["合并请求的逗号分隔标签名称",{"2":{"1122":1}}],["合并请求的实例级",{"2":{"1122":1}}],["合并请求的指派人用户名的逗号分隔列表",{"2":{"1122":1}}],["合并请求的批准状态",{"2":{"1122":1}}],["合并请求变量",{"0":{"1122":1}}],["合并等",{"2":{"784":1}}],["合并后的图片",{"2":{"770":1}}],["合并位置",{"2":{"770":1}}],["合并大文件",{"2":{"770":1}}],["合并成最后的buffer",{"2":{"485":1}}],["合并成一次数据返回",{"2":{"382":1}}],["合并公共配置完成配置",{"2":{"190":1}}],["合成线程分块",{"2":{"279":1}}],["合成帧",{"2":{"279":1}}],["合成",{"2":{"279":1}}],["合成新的表格",{"2":{"86":2}}],["合法用户",{"2":{"64":1}}],["娘炮班",{"2":{"86":1}}],["仙女班",{"2":{"86":1}}],["班级表",{"2":{"86":1}}],["红太狼",{"2":{"86":1}}],["沸羊羊",{"2":{"86":1}}],["美羊羊",{"2":{"86":1}}],["美化了滚动条",{"2":{"56":1}}],["喜羊羊",{"2":{"86":1}}],["学习服务端技术不仅可以提高我们的知识技能拓宽视野",{"2":{"991":1}}],["学习vue源码对于每一个使用它的伙伴都很重要",{"2":{"948":1}}],["学习曲线和学习资源",{"2":{"786":1}}],["学习曲线较陡峭",{"2":{"784":1}}],["学习资源和扩展工具",{"2":{"785":1}}],["学习成本很高",{"2":{"784":1}}],["学习nest最重要的就是它的设计思想",{"2":{"601":1}}],["学习的过程往往会产生种种疑惑与不解",{"2":{"123":1}}],["学到了设置原型的几种方法",{"2":{"584":1}}],["学生表",{"2":{"86":1}}],["学会在工作中做一些有意义的事情",{"2":{"1232":1}}],["学会自己打断点调试",{"2":{"927":1}}],["学会这个",{"2":{"63":1}}],["学会引用类型根据toprimitive优先级规则进行转换",{"2":{"49":1,"555":1}}],["顺便贴出大神总结的mysql通配符的文章",{"2":{"85":1}}],["顺序",{"2":{"84":1}}],["真冷",{"2":{"1236":1}}],["真正存储我们自己的镜像仓库",{"2":{"1042":1}}],["真正",{"2":{"964":1}}],["真正丢包的",{"2":{"391":1}}],["真正在做搜索的时候一般会自己建立索引",{"2":{"85":1}}],["真实值3338838224",{"2":{"456":1}}],["真实环境抓包情况如下",{"2":{"296":1}}],["真实图片",{"2":{"243":1}}],["真实的数据存放在堆内存里",{"2":{"24":1}}],["叔",{"2":{"85":1}}],["大部分中小企业可能都面临着倒闭的风险",{"2":{"1233":1}}],["大部分浏览器也支持其特性",{"2":{"246":1}}],["大佬以及ui设计",{"2":{"1233":1}}],["大于0都可以正常处理",{"2":{"718":1}}],["大于0",{"2":{"646":2}}],["大于时也可以",{"2":{"111":1}}],["大概就是watcher的更新只被dep控制",{"2":{"931":1}}],["大概的配置结构如下",{"2":{"878":1}}],["大概的滑动窗口示意图如下",{"2":{"387":1}}],["大概如上图这样",{"2":{"429":1}}],["大概过程如下图",{"2":{"328":1}}],["大量的syn请求也会消耗server的资源",{"2":{"381":1}}],["大致处理过程示意图如下",{"2":{"380":1}}],["大文件说白了就是太大了",{"2":{"767":1}}],["大文件问题",{"0":{"766":1}}],["大文件下载",{"0":{"777":1},"2":{"345":1}}],["大文件上传就好比高速公路上运输一个超大超大东西",{"2":{"776":1}}],["大文件上传不能像传统的数据传输一样直接发送",{"2":{"776":1}}],["大文件上传",{"0":{"522":1},"2":{"345":1}}],["大文件上传与下载",{"0":{"345":1}}],["大大提升用户体验",{"2":{"773":1}}],["大大提高安全性",{"2":{"330":1}}],["大大提高了网站的性能和吞吐量",{"2":{"324":1}}],["大大减小头部长度",{"2":{"326":1}}],["大大减少服务器的压力",{"2":{"168":1}}],["大体上已经完成所有功能了",{"2":{"245":1}}],["大家也都知道要干嘛了",{"2":{"1233":1}}],["大家一起来探讨技术",{"2":{"1224":1}}],["大家好",{"2":{"1223":1}}],["大家都了解了如何去运行一个容器",{"2":{"1109":1}}],["大家根据自己的需求选择即可",{"2":{"829":1}}],["大家应该对抓包不是很陌生了",{"2":{"449":1}}],["大家知道tcp是个可靠的传输协议",{"2":{"388":1}}],["大家在用浏览器访问任意一个页面",{"2":{"216":1}}],["大家可以根据自己的环境进行配置",{"2":{"412":1}}],["大家可以查看clean",{"2":{"184":1}}],["大家可能还有疑惑那前端打包的页面是如何托管的",{"2":{"126":1}}],["大话设计模式",{"2":{"211":1,"761":1}}],["大小只有20mb左右",{"2":{"1073":1}}],["大小等等",{"2":{"998":1}}],["大小",{"2":{"768":1}}],["大小1",{"2":{"129":1}}],["大小972kb",{"2":{"129":1}}],["大",{"2":{"85":1}}],["要知道",{"2":{"1232":1}}],["要相信苦尽甘来",{"2":{"1232":1}}],["要将名为",{"2":{"1010":2}}],["要查看当前系统中正在运行的",{"2":{"1006":1}}],["要查询的字段必须是",{"2":{"84":1}}],["要解决这个问题很简单",{"2":{"960":1}}],["要解决以上的问题就要深层对对象进行代理",{"2":{"960":1}}],["要解析的",{"2":{"117":1}}],["要定义或修改的属性的名称",{"2":{"949":1}}],["要定义属性的对象",{"2":{"949":1}}],["要想达到覆盖率100",{"2":{"872":1}}],["要想实现自适应的两栏布局也很简单",{"2":{"111":1}}],["要在nginx中启用http",{"2":{"727":1}}],["要减少一个维度可以将另一个值设置为",{"2":{"718":1}}],["要采用",{"2":{"717":1}}],["要采取必要的措施来防止攻击",{"2":{"305":1}}],["要使用任务调度需要导入任务调度模块",{"2":{"659":1}}],["要实现自定义pipe需要实现pipetransform类中的transform方法",{"2":{"645":1}}],["要实现自定义错误格式需要实现exceptipnfilter类中的catch方法",{"2":{"639":1}}],["要实现上图的效果看似很简单",{"2":{"11":1}}],["要明白执行栈首先来了解下js的内存结构",{"2":{"592":1}}],["要勾选use",{"2":{"436":1}}],["要勾选enable",{"2":{"419":1}}],["要开启start",{"2":{"420":1}}],["要是可以将线上运行的代码代理到本地",{"2":{"407":1}}],["要了解这几种状态含义需要明白tcp是个全双工连接协议",{"2":{"384":1}}],["要做到这一点",{"2":{"197":1,"747":1}}],["未类型化",{"2":{"486":1}}],["未发送的数据等等",{"2":{"387":1}}],["未被上层应用程序使用",{"2":{"380":1}}],["未安装",{"2":{"222":1}}],["未选中文本的情况下",{"2":{"157":2}}],["未匹配到则返回",{"2":{"153":1,"902":1}}],["未激活",{"2":{"83":1}}],["未知错误",{"2":{"57":1}}],["已保存",{"2":{"1208":1}}],["已从",{"2":{"1207":1,"1208":1}}],["已启用为true",{"2":{"1121":1}}],["已传输的切片也会被保存在服务器",{"2":{"772":1}}],["已生成的对象已经对原型对象做了引用",{"2":{"573":1}}],["已被浏览器包括服务端都已支持",{"2":{"571":1}}],["已弃用",{"2":{"532":1}}],["已完成全部的读取请求",{"2":{"504":1}}],["已发送的数据",{"2":{"387":1}}],["已经上传过了",{"2":{"772":1}}],["已经经过",{"2":{"729":1}}],["已经掌握了分析数据包的基本能力",{"2":{"460":1}}],["已经完美解码了",{"2":{"421":1}}],["已经相当慢了",{"2":{"420":1}}],["已经不足以满足当今互联网设备的需要",{"2":{"366":1}}],["已经支付过500元定金的用户会受到100元的商城优惠券",{"2":{"205":1,"755":1}}],["已激活",{"2":{"83":1}}],["已选歌曲",{"2":{"54":1}}],["9m57s",{"2":{"1218":1}}],["9153",{"2":{"1218":1}}],["9的虚拟机环境进行的",{"2":{"1194":1}}],["94b",{"2":{"1189":1}}],["948",{"2":{"1039":1,"1046":1}}],["9虚拟机上进行的",{"2":{"1171":1}}],["9虚拟机环境进行搭建",{"2":{"1092":1}}],["9s",{"2":{"1054":1}}],["98824065f066d6839af42c512cb672fb0151322fa80fd6dc4019bfa8bd6affae",{"2":{"1039":2,"1046":1,"1047":1}}],["958016229+08",{"2":{"994":1}}],["953543859+08",{"2":{"994":1}}],["93288797bd35",{"2":{"1082":1}}],["936509503+08",{"2":{"994":1}}],["93",{"2":{"994":1}}],["968m",{"2":{"1203":1}}],["96",{"2":{"874":4,"1212":2,"1214":1,"1218":15}}],["92",{"2":{"728":1}}],["9229",{"2":{"399":1}}],["9和192",{"2":{"728":1}}],["90",{"2":{"723":1}}],["90|180|270",{"2":{"718":1}}],["90234",{"2":{"316":1}}],["9行",{"2":{"578":1}}],["972",{"2":{"454":1}}],["978",{"2":{"316":1}}],["9b",{"2":{"298":1}}],["9cd64756d",{"2":{"1217":2}}],["9c",{"2":{"298":1}}],["9️⃣",{"2":{"251":1}}],["999511b43ca0ffa61979ccb6561ff20f499b087be99aba95836cee20edb794a3",{"2":{"994":3}}],["9999确实抓取到了",{"2":{"425":1}}],["9999则不会",{"2":{"414":1}}],["9999",{"2":{"177":1,"182":1,"414":1,"453":1,"455":1,"456":2,"703":1,"771":1}}],["9999999",{"2":{"83":1}}],["99",{"2":{"347":1}}],["99k",{"2":{"325":1}}],["9901",{"2":{"132":1}}],["9",{"2":{"83":1,"86":3,"96":4,"139":8,"321":1,"347":2,"379":4,"383":1,"538":1,"717":2,"718":1,"724":1,"727":1,"728":2,"875":1,"888":8,"1051":2,"1082":3,"1107":1,"1121":22,"1122":6,"1179":1,"1180":1,"1217":1}}],["所安装的机器上",{"2":{"1163":1}}],["所持有的dep将会通知收集的watcher进行更新",{"2":{"953":1}}],["所用的协议",{"2":{"729":1}}],["所需的",{"2":{"717":1}}],["所谓全局作用域就是在代码最顶层定义的变量",{"2":{"589":1}}],["所谓的变量提升是关于作用域的问题",{"2":{"588":1}}],["所谓的构造函数继承是在实例化子类时",{"2":{"578":1}}],["所谓继承这里都指函数的继承",{"2":{"582":1}}],["所引用的arraybuffer的长度",{"2":{"484":1}}],["所引用的arraybuffer",{"2":{"484":1}}],["所有构建项目所需的依赖项都可以放到",{"2":{"1165":1}}],["所有watcher",{"2":{"954":1}}],["所有项目或组件的代码都在同一个代码仓库中",{"2":{"811":1}}],["所有项目或组件共享同一个代码仓库",{"2":{"808":1}}],["所有不兼容修改都必须在页脚中作为中断更改块提到",{"2":{"792":1}}],["所有切片并发传输提高传输效率",{"2":{"767":1}}],["所有节点启动nginx和keepalived",{"2":{"728":1}}],["所有节点添加keepalived",{"2":{"728":1}}],["所有节点的值必须一致",{"2":{"728":1}}],["所有注入的依赖都比在当前模块的providers中提供注入的标识",{"2":{"623":1}}],["所有的仓库储存",{"2":{"1096":1}}],["所有的回调p1",{"2":{"951":1}}],["所有的切片上传完了后就需要将文件的切片进行合并成一个完整的文件",{"2":{"770":1}}],["所有的代码都会在同一个地方执行即",{"2":{"592":1}}],["所有的子对象的原型都会同步改变",{"2":{"571":1}}],["所有的when",{"2":{"83":1}}],["所有数据写入完毕后将会调用此方法",{"2":{"514":1}}],["所有内容的读取都是异步的",{"2":{"505":1}}],["所有设备的通信方式",{"2":{"365":1}}],["所有路径生效",{"2":{"347":1}}],["所有请求和响应都可以在同一个",{"2":{"324":1}}],["所有添加到队列中的manager",{"2":{"246":1}}],["所有订阅者并且可能经常以事件对象的形式传递消息",{"2":{"195":1,"745":1}}],["所以一定要珍惜见面的机会",{"2":{"1232":1}}],["所以一般情况下我们应该避免使用模糊查询",{"2":{"85":1}}],["所以疼的时候也会吃止疼药能缓解一下",{"2":{"1232":1}}],["所以我打了好多次电话没接也感觉到可能家里出了什么事",{"2":{"1232":1}}],["所以我们还可以使用$watch进行函数侦听",{"2":{"938":1}}],["所以我们为box增加size类",{"2":{"14":1}}],["所以我们需要将两边的参数拼接起来",{"2":{"9":1}}],["所以容器间都可以通过docker0网关进行访问",{"2":{"1085":1}}],["所以请确保你安装了docker",{"2":{"1036":1}}],["所以才会都执行",{"2":{"951":1}}],["所以它会执行",{"2":{"934":1}}],["所以需要创建新的用户并授权npm相关权限",{"2":{"1099":1}}],["所以需要一个web服务应用",{"2":{"879":1}}],["所以需要将参数剥离出来",{"2":{"7":1}}],["所以动态改变每个chunk大小可能传输效果更好",{"2":{"775":1}}],["所以服务器可以很好的知道已经上传了哪些切片",{"2":{"772":1}}],["所以只要在options请求时快速返回且设置客户端的请求域名和端口时",{"2":{"692":1}}],["所以只能提前定义好原型对象",{"2":{"574":1}}],["所以只能使用索引方式获取",{"2":{"486":1}}],["所以这里不需要有额外的担心",{"2":{"685":1}}],["所以这种继承并不能继承父类的prototype中的属性",{"2":{"578":1}}],["所以使用",{"2":{"648":1}}],["所以如果你对eslint已经熟练了",{"2":{"842":1}}],["所以如果不清除掉外部变量",{"2":{"595":1}}],["所以如果当前作用域一个变量没有定义前去访问它并不会报错",{"2":{"587":1}}],["所以作用域就像个堡垒一样把控着变量的可见性",{"2":{"589":1}}],["所以直接访问会报错",{"2":{"588":1}}],["所以为什么以上直接执行run时可以正确执行",{"2":{"587":1}}],["所以为什么打印顺序不会变",{"2":{"539":1}}],["所以就自己做起了汽修行业",{"2":{"1232":1}}],["所以就只能在深圳这边耐心等待了",{"2":{"1232":1}}],["所以就不会再执行watcher",{"2":{"932":1}}],["所以就出现了一些优秀的打包器",{"2":{"816":1}}],["所以就会实例属性或方法",{"2":{"580":1}}],["所以就有类",{"2":{"226":1}}],["所以c2的name还是parent中的不会发生变化",{"2":{"579":1}}],["所以c1修改name时",{"2":{"579":1}}],["所以也会被改掉",{"2":{"579":1}}],["所以能从people那边将方法移植到student上",{"2":{"575":1}}],["所以很适合做动画",{"2":{"535":1}}],["所以用settimeout做动画掉帧的可能性非常大",{"2":{"534":1}}],["所以settimeout回调的调度也会被推迟",{"2":{"533":1}}],["所以会造成这种现象",{"2":{"1103":1}}],["所以会返回主节点上的nginx首页",{"2":{"728":1}}],["所以会在parent中找到然后执行push方法",{"2":{"579":1}}],["所以会打印promise2",{"2":{"532":1}}],["所以会有特殊的机制来保证传输数据的可靠性",{"2":{"388":1}}],["所以常说的eventloop是面向宿主环境的也就是runtime",{"2":{"525":1}}],["所以对于大型计算最好交给其他线程来做",{"2":{"773":1}}],["所以对于这种情况我们需要忽略传入的",{"2":{"9":1}}],["所以对buffer或array的截取一致获取的结果也一样",{"2":{"491":1}}],["所以更加灵活",{"2":{"486":1}}],["所以搞懂某一个通用方法就可以了",{"2":{"481":1}}],["所以上面我们用curl发起的是http请求",{"2":{"458":1}}],["所以发送syn+ack数据包",{"2":{"457":1}}],["所以发送方收到不同数据片段的ack时间也会不同",{"2":{"387":1}}],["所以tcp为了不让数据在ip分片",{"2":{"386":1}}],["所以2msl是最保险的时间",{"2":{"382":1}}],["所以",{"2":{"221":1,"956":1}}],["所以现在你想去学习这款工具",{"2":{"221":1}}],["所以现在public文件夹下创建index",{"2":{"176":1}}],["所以可以访问到i的值5",{"2":{"594":1}}],["所以可以进行通信",{"2":{"440":1}}],["所以可以抓取记录",{"2":{"426":1}}],["所以可以安排所有飞机的起降和航信安排",{"2":{"208":1,"758":1}}],["所以可以讲translate设置为",{"2":{"15":1}}],["所以不要轻易将加密后的密码泄露掉",{"2":{"1014":1}}],["所以不会立即执行函数",{"2":{"932":1}}],["所以不会出现太多文件",{"2":{"184":1}}],["所以不推荐频繁修改它",{"2":{"571":1}}],["所以不再需要size类了",{"2":{"15":1}}],["所以引用的时候",{"2":{"184":1}}],["所以是个空函数",{"2":{"238":1}}],["所以是",{"2":{"145":1,"894":1}}],["所以每个位置都会匹配到空字符",{"2":{"141":1,"890":1}}],["所以单独开了一张出来没有和左联这几章一起写",{"2":{"88":1}}],["所以本章内容只做了解",{"2":{"85":1}}],["所以在模板渲染时并不会触发计算属性的多次执行",{"2":{"931":1}}],["所以在执行它的时候总能够得到正确的值",{"2":{"590":1}}],["所以在第4行时访问block",{"2":{"588":1}}],["所以在密钥分发和管理方面存在安全隐患",{"2":{"330":1}}],["所以在删除数据时",{"2":{"79":1}}],["所以在修改数据库时一定要加上条件语句",{"2":{"78":1}}],["然统一规范若要求每个人改掉自己不同的习惯是很难的",{"2":{"782":1}}],["然每位开发者可能都有自己的代码风格",{"2":{"782":1}}],["然在此基础上再以age为基础再继续分组",{"2":{"84":1}}],["然在此基础上再以name为基础再继续分组",{"2":{"84":1}}],["然而当我点击某篇文章时",{"2":{"129":1}}],["然而结果总是出人意料😂",{"2":{"129":1}}],["然而前进的道路",{"2":{"123":1}}],["然而",{"2":{"83":1,"227":1,"320":1,"784":3}}],["然后也没什么问题",{"2":{"1236":1}}],["然后脚部打上钢钉在家休养大半年后取掉钢钉就可以好了",{"2":{"1232":1}}],["然后我就不断的接开水喝",{"2":{"1236":1}}],["然后我就问她在干嘛呢",{"2":{"1232":1}}],["然后我们找到",{"2":{"966":1}}],["然后我们使用其格式日期",{"2":{"60":1}}],["然后移动到指定位置",{"2":{"1208":1}}],["然后编辑内核启动文件shvim",{"2":{"1202":1}}],["然后项目中可以下载指定tag",{"2":{"1184":1}}],["然后极狐gitlab",{"2":{"1164":1}}],["然后使用group关联hosted和proxy",{"2":{"1104":1}}],["然后使用git",{"2":{"806":1}}],["然后选择对应的权限",{"2":{"1099":1}}],["然后选择npm",{"2":{"1098":1}}],["然后选择我们设置调试配置名字launch",{"2":{"966":1}}],["然后给数据存储单元命名",{"2":{"1097":1}}],["然后创建页面先选择数据类型",{"2":{"1097":1}}],["然后点击右侧",{"2":{"1097":1,"1098":1}}],["然后点击select",{"2":{"407":1}}],["然后才可以运行",{"2":{"1082":1}}],["然后向上提供一套独立的操作系统",{"2":{"1078":1}}],["然后新开一个终端",{"2":{"994":1}}],["然后新建一个弹窗或者message的实例",{"2":{"201":1,"751":1}}],["然后其访问某个属性时",{"2":{"959":1}}],["然后多调试一下思路就会很清晰了",{"2":{"956":1}}],["然后可以尝试自己手写一遍加强理解",{"2":{"948":1}}],["然后触发对当前回调函数的收集",{"2":{"945":1}}],["然后触发每个key的dep执行depend",{"2":{"941":1}}],["然后按顺序进行更新",{"2":{"942":1}}],["然后返回",{"2":{"938":1}}],["然后返回目标对象",{"2":{"28":1}}],["然后立即执行getter",{"2":{"938":1}}],["然后通知更新",{"2":{"955":1}}],["然后通知computed自己的dep中的所有effect进行更新",{"2":{"934":1}}],["然后通过宿主机ip",{"2":{"1034":1}}],["然后通过这个镜像来创建一个或多个容器实例",{"2":{"1003":1}}],["然后通过索引触发set",{"2":{"961":1}}],["然后通过异步更新队列策略",{"2":{"938":1}}],["然后通过异步的方式加载图片",{"2":{"198":1,"748":1}}],["然后通过以太网的广播形式发送出去",{"2":{"454":1}}],["然后通过vscode连接这个server就可以调试了",{"2":{"400":1}}],["然后由于初次",{"2":{"934":1}}],["然后当组件render函数执行时会获取computed的value属性",{"2":{"934":1}}],["然后computed初次执行会访问number属性",{"2":{"934":1}}],["然后定义了一个计算属性total",{"2":{"934":1}}],["然后啥都不用做",{"2":{"932":1}}],["然后下一步判断dep",{"2":{"932":1}}],["然后模拟用户行为",{"2":{"879":1}}],["然后对此代码的功能进行测试",{"2":{"858":1}}],["然后针对markdown文件设置两个不一样的属性值",{"2":{"836":1}}],["然后应用配置的规则来对代码进行检查和分析",{"2":{"826":1}}],["然后结合团队和成本实际情况进行选择",{"2":{"786":1}}],["然后停止上传",{"2":{"772":1}}],["然后不同域名的请求越来越多",{"2":{"691":1}}],["然后不断重复以上操作",{"2":{"536":1}}],["然后不断读取接受的数据",{"2":{"512":1}}],["然后推入执行栈中",{"2":{"592":1}}],["然后动态解释脚本进行赋值",{"2":{"587":1}}],["然后生成的对象指向子类函数的prototype对象",{"2":{"582":1}}],["然后parent内部的this上绑定的属性转移到child上",{"2":{"578":1}}],["然后开始清除工作",{"2":{"558":1}}],["然后主线程根据调度优先级从宏任务队列中适合执行的任务执行",{"2":{"536":1}}],["然后主线程挂起当前任务",{"2":{"527":1}}],["然后等1s后将其放入macrotask",{"2":{"533":1}}],["然后执行脚本即可",{"2":{"1178":1}}],["然后执行computed中我们定义函数",{"2":{"934":1}}],["然后执行测试",{"2":{"860":1}}],["然后执行for循环",{"2":{"533":1}}],["然后执行`tostring`",{"2":{"40":1,"546":1}}],["然后出栈",{"2":{"532":1}}],["然后回到async1函数内部",{"2":{"532":1}}],["然后重复前面的步骤不断循环",{"2":{"532":1}}],["然后重0开始",{"2":{"152":1,"901":1}}],["然后查看是否有微任务",{"2":{"532":1}}],["然后表示我没有其他请求了",{"2":{"457":1}}],["然后会断开进行四次挥手",{"2":{"455":1}}],["然后会找到以下信息",{"2":{"454":1}}],["然后封装arp数据包",{"2":{"454":1}}],["然后就被紧急送到医院了",{"2":{"1232":1}}],["然后就可以在操作系统之上再运行各种软件应用等",{"2":{"1078":1}}],["然后就可以知道目标主机的位置了",{"2":{"454":1}}],["然后就会拥有对应的方法",{"2":{"38":1,"544":1}}],["然后添加child自己的属性和方法intro",{"2":{"582":1}}],["然后添加",{"2":{"405":1}}],["然后接受到2个ack后变成窗口大小变为4",{"2":{"393":1}}],["然后来控制发送速率",{"2":{"387":1}}],["然后便会以窗口大小为基本单位按顺序发送数据",{"2":{"387":1}}],["然后发布",{"2":{"1189":1}}],["然后发送seq=x+1",{"2":{"378":1}}],["然后发送time",{"2":{"368":1}}],["然后发现这里找到了$mount方法的位置",{"2":{"238":1}}],["然后被相应的协议处理",{"2":{"361":1}}],["然后小明点击了黑客在页面上发的链接",{"2":{"352":1}}],["然后将上面的代码每个位置打上断点",{"2":{"954":1}}],["然后将当前的activefn添加到cbs中",{"2":{"951":1}}],["然后将activefn设置为p2再执行p2",{"2":{"951":1}}],["然后将文件名",{"2":{"769":1}}],["然后将每个块批次传输",{"2":{"768":1}}],["然后将小块一批一批的传输给服务器",{"2":{"767":1}}],["然后将child的prototype的constructor指向child自己",{"2":{"582":1}}],["然后将自己的mac地址和ip地址封装数据后以单播的形式回应发送给发送方",{"2":{"454":1}}],["然后将",{"2":{"333":2}}],["然后将这些模块打包成一个或多个",{"2":{"171":1}}],["然后",{"2":{"333":1,"1065":2}}],["然后再暴露一个端口范围供后续其他使用",{"2":{"1094":1}}],["然后再通过宿主机的",{"2":{"1086":1}}],["然后再启动web服务",{"2":{"1023":1}}],["然后再将容器层以可读写的方式挂载到虚拟文件系统上",{"2":{"997":1}}],["然后再以一张响应式模型图描述整个流程",{"2":{"953":1}}],["然后再做点什么👀",{"2":{"935":1}}],["然后再从macrotask队列中选择一个合适的任务放入执行栈执行",{"2":{"532":1}}],["然后再经过其他的路由器或交换机",{"2":{"311":1}}],["然后再去复制",{"2":{"33":1}}],["然后先对vue的原型方法$mount进行缓存",{"2":{"238":1}}],["然后让他们每人分别穿上一件内衣来拍照",{"2":{"204":1,"754":1}}],["然后根据watch监听的key循环获取到对应的响应式属性的值",{"2":{"938":1}}],["然后根据上报的错误信息",{"2":{"183":1}}],["然后根据前两条规则执行",{"2":{"40":1,"546":1}}],["然后随便写一点样式进去",{"2":{"179":1}}],["然后一步一步加载图片",{"2":{"133":1}}],["然后用程序来维护",{"2":{"85":1}}],["然后用postman注册或者其他工具",{"0":{"58":1}}],["然后进行构建",{"2":{"1069":1}}],["然后进行配置",{"2":{"858":1}}],["然后进行提交",{"2":{"800":1}}],["然后进行编译器",{"2":{"587":1}}],["然后进行字符串拼接",{"2":{"48":1,"554":1}}],["然后进行计算",{"2":{"43":1,"549":1}}],["然后在运行时可以通过",{"2":{"1062":1}}],["然后在其基础上进行定制",{"2":{"831":1}}],["然后在其静态属性options上扩展了和平台相关的指令",{"2":{"238":1}}],["然后在后面添加上",{"2":{"718":1}}],["然后在7行再次打印name时",{"2":{"587":1}}],["然后在实例化对象时",{"2":{"570":1}}],["然后在浏览器渲染时执行",{"2":{"350":1}}],["然后在src文件夹下创建index",{"2":{"175":1}}],["然后在根据类型隐式转换的规则进行转换",{"2":{"41":1,"547":1}}],["然后在执行下一行前又会销毁此对象",{"2":{"38":1,"544":1}}],["然后调用函数并将对象上的函数删除",{"2":{"7":1}}],["月数",{"2":{"83":1}}],["月份",{"2":{"60":1}}],["6月份也到了二🐑的阶段",{"2":{"1236":1}}],["6b7b9c649d",{"2":{"1217":1,"1218":2}}],["6m",{"2":{"1203":1}}],["6mb",{"2":{"994":2}}],["66",{"2":{"1064":1}}],["666ms一次",{"2":{"534":1}}],["612",{"2":{"1007":1,"1218":1}}],["63",{"2":{"1121":3}}],["634mb",{"2":{"994":2}}],["633",{"2":{"875":1}}],["6c381d5dc2a11dcdb693f0301e8587e43f440c90cdb8933eaaaabb905d44cdb9",{"2":{"703":1}}],["6s",{"2":{"703":1,"1054":1}}],["6行",{"2":{"587":1}}],["6981588276356317214",{"2":{"568":1}}],["65gtc容器",{"2":{"1218":1}}],["65gtc",{"2":{"1217":1,"1218":2}}],["65536",{"2":{"1090":2}}],["65534",{"2":{"1085":1}}],["65535",{"2":{"376":1,"485":1}}],["65308",{"2":{"383":1}}],["65",{"2":{"364":1,"709":1}}],["62",{"2":{"364":1}}],["60g",{"2":{"1196":1}}],["607",{"2":{"994":1}}],["60s",{"2":{"660":1}}],["60",{"2":{"344":1,"347":1,"382":1,"535":1,"660":2}}],["67",{"2":{"325":1}}],["6e",{"2":{"298":1}}],["6字节",{"2":{"297":2}}],["6️⃣",{"2":{"251":1}}],["6443",{"2":{"1212":1,"1214":3,"1215":1}}],["649",{"2":{"994":1}}],["64秒增1",{"2":{"381":1}}],["64",{"2":{"97":1,"364":1,"368":1,"382":1,"456":1,"1063":3,"1064":4,"1090":6,"1218":5}}],["6",{"2":{"83":2,"96":2,"98":1,"134":1,"152":1,"367":1,"390":1,"422":1,"491":4,"703":9,"717":3,"901":1,"949":1,"1054":3,"1055":3,"1064":3,"1082":1,"1108":1,"1121":12,"1122":11,"1151":1,"1153":1,"1156":1,"1157":4,"1173":1,"1217":5}}],["随意填",{"2":{"1100":2}}],["随便找一个已下载的镜像",{"2":{"1046":1}}],["随便起的名字",{"2":{"726":1,"1178":1}}],["随便起个名字",{"2":{"400":1}}],["随机生成的字符串",{"2":{"354":1}}],["随机数等信息",{"2":{"333":2}}],["随机数生成器生成一个指定的值",{"2":{"83":1}}],["随着服务器到期和成本的考虑",{"2":{"1223":1}}],["随着网页复杂性和性能要求的提高",{"2":{"525":1}}],["随着",{"2":{"329":1}}],["随着每次不断在其上寻求解答外",{"2":{"123":1}}],["随后将请求委托给某一个策略类",{"2":{"197":1,"747":1}}],["随后路由的鉴权或者其他鉴权可以在这里进行",{"2":{"127":1}}],["随心点歌随心听",{"2":{"50":1}}],["使数据持久化",{"2":{"1110":1}}],["使其在主机上可以被访问和修改",{"2":{"997":1}}],["使其保持一致的缩进",{"2":{"842":1}}],["使代码保持一致的风格",{"2":{"837":1}}],["使代码易于扩展和重用",{"2":{"824":1}}],["使代理服务器根据请求头中的",{"2":{"717":1}}],["使团队成员能够更轻松地理解和使用彼此的代码",{"2":{"824":1}}],["使团队成员能够轻松理解代码逻辑和意图",{"2":{"824":1}}],["使团队能够更轻松地维护和修改代码",{"2":{"824":1}}],["使",{"2":{"494":1,"829":1}}],["使网络更加不透明",{"2":{"370":1}}],["使外部网络无法直接访问内部网络",{"2":{"370":1}}],["使得容器更易于移植和部署",{"2":{"1110":1}}],["使得容器可以通过容器名称或服务名称来互相访问",{"2":{"1091":1}}],["使得容器中的应用程序可以访问这些文件系统中的文件和数据",{"2":{"997":1}}],["使得构建体积变大",{"2":{"1058":1}}],["使得用户可以看到一个统一的文件系统结构",{"2":{"997":2}}],["使得数组的处理更加直观和灵活",{"2":{"965":1}}],["使得js如其他语言java一样可以对类型进行限制",{"2":{"825":1}}],["使得开发人员可以轻松地定义",{"2":{"678":1}}],["使得代码更加简洁",{"2":{"601":1}}],["使得这两个本不会发生连字的字符产生了连字效果",{"2":{"462":1}}],["使得当用户在访问一个被攻击者控制的网站时",{"2":{"351":1}}],["使得当其他用户访问这个网站时",{"2":{"350":1}}],["使得",{"2":{"343":1}}],["使得web性能更加高效",{"2":{"327":1}}],["使得http2比http",{"2":{"323":1}}],["使得不同的计算机和网络设备能够相互通信",{"2":{"357":1}}],["使得不同的供应商和组织可以遵循相同的标准进行设计和实现",{"2":{"308":1}}],["使得不同类型的计算机和网络设备能够相互通信",{"2":{"310":1}}],["使多个对象都有机会处理请求",{"2":{"205":1,"755":1}}],["使rand",{"2":{"83":1}}],["使用kubeadm安装k8s",{"2":{"1211":1}}],["使用kubeadm安装",{"0":{"1211":1},"1":{"1212":1,"1213":1,"1214":1,"1215":1,"1216":1}}],["使用keepalived实现高可用至少需要2台主机",{"2":{"728":1}}],["使用key作为密钥加密字符串str",{"2":{"83":1}}],["使用key作为密钥解密加密字符串str",{"2":{"83":1}}],["使用它需要你的",{"2":{"1198":1}}],["使用它可以简化应用程序的部署和管理",{"2":{"1077":1}}],["使用域名",{"2":{"1176":1}}],["使用域名映射到node",{"2":{"128":1}}],["使用https",{"2":{"1175":1}}],["使用gitlab的仓库注册表特性需要版本14",{"2":{"1181":1}}],["使用gitlab",{"2":{"1174":1,"1179":1}}],["使用或禁用全局定义的环境变量或默认值",{"2":{"1148":1}}],["使用官方的模板",{"2":{"1142":2}}],["使用工件",{"2":{"1139":1}}],["使用缓存指定要在作业之间缓存的文件和目录列表",{"2":{"1138":1}}],["使用缓存可以高效的减少网络资源的请求",{"2":{"335":1}}],["使用前八个字符",{"2":{"1121":1}}],["使用前先下载",{"2":{"177":1}}],["使用当前分支和项目作为合并请求源的最多四个合并请求的逗号分隔列表",{"2":{"1121":1}}],["使用当前集合进行映射处理",{"2":{"673":1}}],["使用某些",{"2":{"1121":1}}],["使用临时卷",{"2":{"1116":1}}],["使用命名卷",{"2":{"1116":1}}],["使用命令npm",{"2":{"56":3}}],["使用宿主机路径",{"2":{"1116":2}}],["使用宿主机的ip+port方式",{"2":{"1039":1}}],["使用数据卷",{"2":{"1116":1}}],["使用数据卷可以将容器中的数据存储在宿主机上",{"2":{"1110":1}}],["使用数据卷可以将容器与数据分离",{"2":{"1110":1}}],["使用数据卷可以将数据存储在宿主机上",{"2":{"1110":1}}],["使用数据库",{"2":{"73":1}}],["使用创建的用户登录",{"2":{"1102":1}}],["使用容器名",{"2":{"1090":1}}],["使用容器技术",{"2":{"992":1}}],["使用镜像",{"2":{"1078":1}}],["使用更小的基础镜像可以减小镜像大小",{"2":{"1075":1}}],["使用更小的基础镜像",{"2":{"1075":1}}],["使用多阶段构建可以减小镜像大小",{"2":{"1075":1}}],["使用多阶段构建是一种优化手段",{"2":{"1071":1}}],["使用其作为基础镜像再次构建新的镜像",{"2":{"1065":1}}],["使用其提供的get方法获取变量",{"2":{"629":1}}],["使用react+ts模板",{"2":{"1073":1}}],["使用restart字段来定义容器的重启策略",{"2":{"1025":1}}],["使用resolves测试promise",{"2":{"866":1}}],["使用run执行命令时当前阶段必须包含所执行的命令才可以",{"2":{"1058":1}}],["使用仓库关联当前存储集",{"2":{"1041":1}}],["使用仓库",{"0":{"1039":1}}],["使用了自定义的web应用镜像",{"2":{"1023":1,"1024":1,"1025":1}}],["使用了mysql镜像",{"2":{"1023":1}}],["使用了quic协议代替了tcp协议",{"2":{"327":1}}],["使用depends",{"2":{"1023":1}}],["使用docker创建的volume",{"2":{"1113":1}}],["使用dockerfile可以清晰地描述容器的配置和依赖",{"2":{"1050":1}}],["使用dockerfile可以自动构建docker镜像",{"2":{"1050":1}}],["使用dockerfile为镜像的构建使得更加便利",{"2":{"1050":1}}],["使用dockerfile构建镜像",{"0":{"1048":1},"1":{"1049":1,"1050":1,"1051":1,"1052":1,"1053":1,"1054":1,"1055":1,"1056":1,"1057":1,"1058":1,"1059":1,"1060":1,"1061":1,"1062":1,"1063":1,"1064":1,"1065":1,"1066":1,"1067":1,"1068":1,"1069":1,"1070":1,"1071":1,"1072":1,"1073":1,"1074":1,"1075":1,"1076":1,"1077":1},"2":{"1000":1}}],["使用docker搭建npm仓库",{"0":{"1092":1},"1":{"1093":1,"1094":1,"1095":1,"1096":1,"1097":1,"1098":1,"1099":1,"1100":1,"1101":1,"1102":1,"1103":1,"1104":1,"1105":1,"1106":1,"1107":1,"1108":1},"2":{"1040":2}}],["使用docker",{"2":{"1017":1,"1046":1,"1110":1,"1208":1}}],["使用dockercompose部署服务",{"0":{"1016":1},"1":{"1017":1,"1018":1,"1019":1,"1020":1,"1021":1,"1022":1,"1023":1,"1024":1,"1025":1,"1026":1,"1027":1,"1028":1,"1029":1,"1030":1,"1031":1,"1032":1,"1033":1,"1034":1,"1035":1}}],["使用网络",{"0":{"1090":1}}],["使用网络和数据卷类似",{"2":{"1022":1}}],["使用网络安全设备",{"2":{"304":1}}],["使用第三方",{"2":{"1021":1}}],["使用该命令会发送一个",{"2":{"1008":1}}],["使用交互式运行centos容器",{"2":{"1004":1}}],["使用vscode的好处就是",{"2":{"966":1}}],["使用vpn可以将网络流量加密并隧道化",{"2":{"303":1}}],["使用解构的属性",{"2":{"963":1}}],["使用索引修改值时却没有执行回调",{"2":{"955":1}}],["使用observer对象用来标识当前属性已经被拦截了",{"2":{"951":1}}],["使用openssl签发证书",{"2":{"726":1,"1178":1}}],["使用计算属性模板更易维护也方便后续的扩展",{"2":{"929":1}}],["使用非常自由",{"2":{"906":1}}],["使用回调函数",{"0":{"868":1},"2":{"868":1}}],["使用回环地址发送的数据包不会离开本地计算机",{"2":{"361":1}}],["使用浏览器环境时需要安装对应的包",{"2":{"864":1}}],["使用一些插件对代码进行转义以便jest可以理解",{"2":{"857":1}}],["使用一定的css声明可以生成bfc",{"2":{"113":1}}],["使用exec方式可以和entrypoint结合并作为其参数使用",{"2":{"1063":1}}],["使用exec可以减少启动新shell进程的开销",{"2":{"1058":1}}],["使用expires进行缓存",{"2":{"720":1}}],["使用eslint修复所有错误",{"2":{"840":1}}],["使用配置文件可以使配置和共享更加容易",{"2":{"839":1}}],["使用空格缩进",{"2":{"836":1}}],["使用的",{"2":{"977":1}}],["使用的解析器",{"2":{"829":1}}],["使用的什么协议",{"2":{"313":1}}],["使用then",{"2":{"866":1}}],["使用typescript可以增强类型提示提高开发效率降低协作成本",{"2":{"834":1}}],["使用ts可以加强类型提示",{"2":{"825":1}}],["使用tls",{"2":{"327":1}}],["使用pm2进行发布",{"2":{"1074":1}}],["使用ping",{"2":{"1063":1}}],["使用pipeto方法",{"2":{"514":1}}],["使用promise",{"0":{"866":1},"2":{"865":1}}],["使用pnpm",{"2":{"815":2}}],["使用lerna平滑升级包",{"2":{"814":1}}],["使用lerna",{"2":{"814":2}}],["使用load加载自定义的配置",{"2":{"630":1}}],["使用loader来处理",{"2":{"179":1}}],["使用相同的网络compose",{"2":{"1034":1}}],["使用相同的方式验证信息的正确性",{"2":{"333":1}}],["使用相应的技术手段或者工具",{"2":{"810":1}}],["使用最适合自己",{"2":{"785":1}}],["使用不同的包管理器",{"2":{"783":1}}],["使用此属性时重试将不会起作用",{"2":{"771":1}}],["使用此功能需要安装这个模块",{"2":{"718":1}}],["使用流来分隔请求和响应",{"2":{"727":1}}],["使用流可以将大型数据拆分成小块并逐步处理",{"2":{"508":1}}],["使用上一步的证书签名请求签发证书",{"2":{"726":1,"1178":1}}],["使用上面的nodejs",{"2":{"724":1}}],["使用三个后端服务地址",{"2":{"725":1}}],["使用正则匹配只允许refer为",{"2":{"722":1}}],["使用正则将一个数字以科学计数法进行表示",{"2":{"137":1,"886":1}}],["使用和原版本的nginx同样的编译参数",{"2":{"718":1}}],["使用插件时可以省略掉插件名的前的eslint",{"2":{"831":1}}],["使用插件",{"2":{"697":1}}],["使用压缩可以更好的减小响应内容的体积",{"2":{"696":1}}],["使用as可以为当前阶段命名",{"2":{"1070":1}}],["使用async测试",{"0":{"867":1},"2":{"867":1}}],["使用arg可以简化镜像的构建过程",{"2":{"1054":1}}],["使用arp防火墙",{"2":{"304":1}}],["使用apiresponse定义响应体类型",{"2":{"686":1}}],["使用apibody定义请求体的body数据",{"2":{"686":1}}],["使用apiquery定义查询参数",{"2":{"686":1}}],["使用swagger首先需要安装相关的工具包",{"2":{"679":1}}],["使用swagger可以很方便的测试接口",{"2":{"678":1}}],["使用ssl",{"2":{"303":1}}],["使用cache",{"2":{"720":1}}],["使用compression提供资源压缩功能",{"2":{"696":1}}],["使用cli创建空的项目",{"2":{"665":1}}],["使用cli生成interceptor",{"2":{"650":1}}],["使用cli生成pipe",{"2":{"645":1}}],["使用cli生成filter",{"2":{"639":1}}],["使用cli生成",{"2":{"634":1}}],["使用ci生成guard",{"2":{"648":1}}],["使用middleware可以很轻松的创建通用的日志中间件",{"2":{"633":1}}],["使用可选注入可以解决报错",{"2":{"626":1}}],["使用原始的res进行数据响应",{"2":{"614":1}}],["使用表单拦截器对数据进行表单转换",{"2":{"613":1}}],["使用共享模块",{"2":{"609":1}}],["使用动态模块可以在不同的模块之间共享配置",{"2":{"609":1}}],["使用动态arp检测工具",{"2":{"303":1}}],["使用区和空闲区",{"2":{"559":1}}],["使用高版本node打印顺序和浏览器一致",{"2":{"538":1}}],["使用后销毁",{"2":{"497":1}}],["使用unionfs",{"2":{"997":1}}],["使用unixcrypt",{"2":{"83":1}}],["使用url版本控制",{"2":{"654":1}}],["使用url的createobjecturl方法生成一个唯一映射此blob的url",{"2":{"497":1}}],["使用对象更适合于网络相关人员",{"2":{"449":1}}],["使用时需要把use",{"2":{"436":1}}],["使用主机a192",{"2":{"379":1}}],["使用ip方式",{"2":{"1090":1}}],["使用ipv6可以完美的解决nat问题",{"2":{"370":1}}],["使用intersectionobserver观测managerqueue里的manager",{"2":{"245":1}}],["使用websocket简单实现多人聊天",{"2":{"354":1}}],["使用范围请求需要服务端的支持",{"2":{"344":1}}],["使用定长传输的主要优点是",{"2":{"342":1}}],["使用jsonp解决跨域问题",{"2":{"338":1}}],["使用以下方法之一",{"2":{"337":1}}],["使用新密钥解密",{"2":{"333":1}}],["使用自己的私钥解密得到预主密钥",{"2":{"332":1}}],["使用公钥加密后发送给服务端",{"2":{"332":1}}],["使用公钥加密的数据只能用私钥解密",{"2":{"330":1}}],["使用私钥加密的数据只能用公钥解密",{"2":{"330":1}}],["使用哈弗编码",{"2":{"326":1}}],["使用npm包你可以用根端点或项目端点",{"2":{"1191":1}}],["使用npm包",{"0":{"1191":1}}],["使用npx进行交互式生成默认的配置文件",{"2":{"857":1}}],["使用nexus3你需要先安装",{"2":{"1040":1}}],["使用nexus3搭建",{"0":{"1040":1},"1":{"1041":1,"1042":1,"1043":1,"1044":1,"1045":1,"1046":1,"1047":1}}],["使用nest的streamablefile方法可以快速的对流内容响应",{"2":{"700":1}}],["使用nest可以很好的实现多种渲染模式如",{"2":{"671":1}}],["使用nestjs提供工具就够用了如",{"2":{"614":1}}],["使用nx创建monorepo仓库",{"2":{"818":1}}],["使用node",{"2":{"1070":1}}],["使用node版本",{"2":{"538":1}}],["使用nodejs监听33196端口",{"2":{"382":1}}],["使用nodejs模拟cookie",{"2":{"347":1}}],["使用nat技术可以避免这种冲突",{"2":{"370":1}}],["使用nat可以隐藏内部网络拓扑结构",{"2":{"370":1}}],["使用nginx配置serverpush",{"2":{"325":1}}],["使用nvm下载node等等",{"0":{"96":1}}],["使用nvm查看信息",{"0":{"95":1}}],["使用虚拟专用网络",{"2":{"303":1}}],["使用虚拟代理实现图片懒加载",{"2":{"198":1,"748":1}}],["使用加密协议可以保护网络中的通信",{"2":{"303":1}}],["使用加密协议",{"2":{"303":1}}],["使用静态arp表",{"2":{"303":1,"304":1}}],["使用babel开发插件",{"0":{"258":1}}],["使用指令时",{"2":{"245":1}}],["使用这种对象值",{"2":{"243":1}}],["使用方法",{"0":{"215":1}}],["使用适配器模式之后",{"2":{"206":1,"756":1}}],["使用场景",{"2":{"196":1,"746":1}}],["使用哪个",{"2":{"181":1}}],["使用`replace`方法",{"2":{"145":1,"894":1}}],["使用捕获获取具体内容",{"2":{"145":1,"894":1}}],["使用量词",{"2":{"141":1,"890":1}}],["使用如下",{"2":{"117":1,"121":1}}],["使用10",{"2":{"96":1}}],["使用",{"0":{"624":1,"800":1,"979":1},"2":{"64":1,"139":1,"141":2,"145":1,"183":1,"189":1,"190":1,"222":1,"320":1,"353":1,"400":1,"508":1,"510":1,"619":1,"623":1,"631":1,"633":1,"640":2,"702":1,"713":1,"717":1,"795":1,"864":1,"866":1,"888":1,"890":2,"894":1,"965":2,"997":1,"1010":2,"1017":1,"1022":1,"1028":2,"1029":2,"1030":1,"1031":1,"1032":1,"1057":1,"1068":1,"1075":3,"1117":1,"1121":2,"1165":1}}],["使用验证码",{"2":{"61":1}}],["余数",{"2":{"83":1}}],["另一个设备则被添加到宿主机的网络命名空间中",{"2":{"1086":1}}],["另一个重要的概念便是dockerignore",{"2":{"1071":1}}],["另一个就是多次使用同一个计算属性不会再执行",{"2":{"933":1}}],["另一节点上查看",{"2":{"728":1}}],["另一侧按比例缩放",{"2":{"718":1}}],["另一端也不会知道是不是断开了",{"2":{"384":1}}],["另一方的端口",{"2":{"376":1}}],["另一方为引用类型",{"2":{"44":1,"550":1}}],["另一方为原始类型",{"2":{"44":1,"550":1}}],["另外",{"2":{"184":1,"583":1}}],["另外sun",{"2":{"83":1}}],["另存为",{"2":{"163":1}}],["求和",{"2":{"83":1}}],["点文件",{"2":{"695":1}}],["点三次取消断点",{"2":{"435":1}}],["点两次响应断点",{"2":{"435":1}}],["点击查看安装文档",{"2":{"1150":1}}],["点击创建",{"2":{"1100":1,"1105":1}}],["点击transfer",{"2":{"1099":1}}],["点击左侧realms菜单",{"2":{"1101":1}}],["点击左侧roles菜单栏",{"2":{"1099":1}}],["点击左侧users菜单",{"2":{"1100":1}}],["点击左侧菜单repositories",{"2":{"1098":1}}],["点击左侧菜单blob",{"2":{"1097":1}}],["点击copy按钮查看仓库地址",{"2":{"1098":1}}],["点击continue会在项目中生成对应的文件",{"2":{"877":1}}],["点击发送请求到",{"2":{"1034":1}}],["点击侧边栏debugger图标",{"2":{"966":1}}],["点击测试用例开始测试",{"2":{"879":1}}],["点击高级进一步访问即可",{"2":{"726":1}}],["点击这里👉下载示例源码",{"2":{"1034":1}}],["点击这里查看",{"2":{"532":1}}],["点击这里官方做了解释",{"2":{"425":1}}],["点击事件",{"2":{"527":1,"531":1}}],["点击搜索即可",{"2":{"453":1}}],["点击后可以在输入框中添加",{"2":{"453":1}}],["点击输入框前面的小图标",{"2":{"453":1}}],["点击内部的流量图可以很清晰的看到网络通信",{"2":{"451":1}}],["点击信任安装证书iphone要输入手机密码",{"2":{"439":1}}],["点击保存",{"2":{"438":1,"1101":1}}],["点击保存后最好重启下fiddler",{"2":{"438":1}}],["点击wifi",{"2":{"438":1}}],["点击右上角执行",{"2":{"436":1}}],["点击execute发送请求",{"2":{"436":1}}],["点击execute执行下一步",{"2":{"419":1}}],["点击inspectors可以查看请求的具体信息",{"2":{"436":1}}],["点击inspect会打开新的调试窗口",{"2":{"399":1}}],["点击面板右上角actions的run",{"2":{"436":1}}],["点击不放手拖动到指定的应用程序",{"2":{"431":1}}],["点击执行下一步",{"2":{"431":1}}],["点击help",{"2":{"422":1}}],["点击按钮手动抛出一个错误",{"2":{"408":1}}],["点击按钮发起请求",{"2":{"404":1}}],["点击netword面板",{"2":{"407":1}}],["点击允许下载证书",{"2":{"439":1}}],["点击允许",{"2":{"407":1,"422":1}}],["点击debugger",{"2":{"405":1}}],["点击更新子节点属性不会监听到",{"2":{"404":1}}],["点击播放键",{"2":{"400":1}}],["点击vscode",{"2":{"400":1}}],["点击分析",{"2":{"213":2}}],["点击",{"2":{"158":1,"216":1,"404":1,"422":1}}],["点击安装",{"2":{"93":1}}],["点击下载安装",{"2":{"838":1}}],["点击下载即可",{"2":{"68":1}}],["点击下载栏目中的",{"2":{"68":1}}],["点击下面不同格式的安装包",{"2":{"68":1}}],["点赞量",{"2":{"83":1}}],["多项目管道",{"2":{"1144":1}}],["多阶段构建可以将构建环境和运行环境分离",{"2":{"1075":1}}],["多阶段构建是一种优化",{"2":{"1070":1}}],["多阶段构建",{"0":{"1070":1},"2":{"1075":1}}],["多种格式",{"2":{"844":1}}],["多仓库",{"2":{"809":1}}],["多平台支持",{"2":{"785":1}}],["多次刷新请求有完整请求成功的",{"2":{"771":1}}],["多播是一种有选择性的通信方式",{"2":{"365":1}}],["多播是一种将数据包发送给网络中一组设备的通信方式",{"2":{"365":1}}],["多播使用特殊的组播地址",{"2":{"365":1}}],["多播",{"0":{"365":1}}],["多人游戏",{"2":{"354":1}}],["多个节点之间的时钟同步也是保证集群中各组件之间时间一致性的必要条件",{"2":{"1204":1}}],["多个容器可以通过挂载同一个数据卷来共享数据",{"2":{"1110":1}}],["多个仓库管理一个应用",{"2":{"809":1}}],["多个请求和响应可以通过单个tcp连接并行传输",{"2":{"727":1}}],["多个值之间使用空格分隔",{"2":{"350":1}}],["多个范围",{"2":{"344":1}}],["多个字段的顺序",{"2":{"84":1}}],["多个字段",{"2":{"81":1}}],["多路复用",{"0":{"324":1},"2":{"323":1,"324":1}}],["多线程",{"2":{"274":1}}],["多进程",{"2":{"274":1}}],["多数人知晓的",{"2":{"194":1,"744":1}}],["多光标与选择",{"0":{"158":1}}],["多练几遍",{"2":{"41":1,"547":1}}],["条件类型",{"0":{"918":1}}],["条件断点",{"2":{"404":1}}],["条件查询",{"2":{"80":1}}],["条件语句可有可无",{"2":{"79":1}}],["条件语句",{"2":{"78":2,"79":1,"80":1}}],["查找等等",{"2":{"430":1}}],["查找范围多个维度进行查找",{"2":{"414":1}}],["查找记录",{"2":{"414":1}}],["查找上一个",{"2":{"159":1}}],["查找下一个",{"2":{"159":1}}],["查找",{"2":{"159":1,"431":1}}],["查找替换",{"0":{"159":1}}],["查找数据非常费时",{"2":{"85":1}}],["查询",{"2":{"434":1}}],["查询两条",{"2":{"90":1}}],["查询条数",{"2":{"90":2}}],["查询条件应该放到order",{"2":{"81":1}}],["查询每个学生所在的班级",{"2":{"89":1}}],["查询每个学生课程2分数高于课程1的学生",{"2":{"88":1}}],["查询每个年龄的人数",{"2":{"84":1}}],["查询排序",{"0":{"81":1}}],["查询指定字段",{"2":{"80":1}}],["查询所有字段",{"2":{"80":1}}],["查看k8s",{"2":{"1218":1}}],["查看keepalive状态",{"2":{"728":1}}],["查看pod信息",{"2":{"1217":1}}],["查看节点到容器之间能否互通",{"2":{"1218":1}}],["查看节点信息",{"2":{"1217":1}}],["查看节点网卡",{"2":{"728":1}}],["查看是否关闭",{"2":{"1202":1}}],["查看是否安装成功",{"2":{"93":1}}],["查看内核版本",{"2":{"1198":1}}],["查看内部运行的细节",{"2":{"1006":1}}],["查看仓库",{"2":{"1190":1}}],["查看流水线执行情况",{"2":{"1190":1}}],["查看root初始密码",{"2":{"1174":1}}],["查看root初始",{"2":{"1174":1}}],["查看已经创建的数据卷",{"2":{"1114":1}}],["查看",{"0":{"1114":1},"2":{"1112":1,"1203":1}}],["查看包信息",{"2":{"1108":1}}],["查看day也被成功安装了",{"2":{"1107":1}}],["查看docker状态",{"2":{"1082":1}}],["查看docker",{"2":{"994":1}}],["查看docker磁盘使用情况sh➜",{"2":{"994":1}}],["查看docker详细信息shdocker",{"2":{"994":1}}],["查看docker版本shdocker",{"2":{"994":1}}],["查看其ip为172",{"2":{"1090":2}}],["查看其他机器是没有当前vip的",{"2":{"728":1}}],["查看主机上的docker0虚拟网卡",{"2":{"1085":1}}],["查看主机维护的arp缓存表",{"2":{"298":1}}],["查看版本",{"2":{"1082":1}}],["查看运行状态",{"2":{"1082":1}}],["查看可安装的docker版本",{"2":{"1093":1}}],["查看可安装的版本",{"2":{"1082":1}}],["查看可以安装的版本号",{"2":{"95":1}}],["查看容器",{"2":{"1055":1}}],["查看镜像已经存在",{"2":{"1051":1}}],["查看镜像详细信息",{"2":{"1001":1}}],["查看镜像构建历史",{"2":{"1001":1}}],["查看本地镜像",{"0":{"998":1}}],["查看本地请求4s才完成",{"2":{"420":1}}],["查看对象的详细信息",{"2":{"994":1}}],["查看nginx的进程数",{"2":{"728":1}}],["查看nginx版本sh➜",{"2":{"708":1}}],["查看原来版本的编译参数",{"2":{"718":1}}],["查看arp缓存表信息",{"2":{"454":1}}],["查看fiddler抓包记录",{"2":{"438":1}}],["查看浏览器内容已经经结果修改了",{"2":{"419":1}}],["查看请求体",{"2":{"419":1}}],["查看官方文档",{"2":{"398":1}}],["查看tcp状态",{"0":{"383":1}}],["查看tcp的连接状态",{"2":{"382":1}}],["查看syn队列最大值",{"2":{"380":1}}],["查看具体声明内容",{"2":{"160":1}}],["查看安装了所有的node版本",{"2":{"95":1}}],["查看当前数据库所有表",{"0":{"74":1}}],["查看数据库列表",{"2":{"72":1}}],["无疑都会对我们的人生产生深远的影响",{"2":{"1237":1}}],["无需按照阶段运行某些作业",{"2":{"1141":1}}],["无需递归地转换整个对象",{"2":{"965":1}}],["无分组",{"2":{"859":1}}],["无规矩不成方圆",{"2":{"824":1}}],["无用代码剔除",{"2":{"784":1}}],["无操作",{"2":{"376":1}}],["无类别域间路由选择",{"2":{"366":1}}],["无法满足简单",{"2":{"1051":1}}],["无法了解制作的具体细节",{"2":{"1048":1}}],["无法精确按文件夹进行权限分配",{"2":{"811":1}}],["无法继承父类的prototype中的属性和方法",{"2":{"578":1}}],["无法给父类传参",{"2":{"577":1,"579":1,"581":1}}],["无法解决循环引用无法回收的问题",{"2":{"557":1}}],["无法在页面中获取",{"2":{"347":1}}],["无法完成请求",{"2":{"317":1}}],["无法获得指定的校验文件",{"2":{"97":1}}],["无障碍",{"2":{"214":1,"778":1}}],["无优惠券",{"2":{"205":2,"755":2}}],["无论点击多少次",{"2":{"196":1,"746":1}}],["无论哪个对象发生改变",{"2":{"26":1}}],["无条件",{"2":{"79":1}}],["刷新请求",{"2":{"428":1}}],["刷新浏览器发现已经命中断点",{"2":{"419":1}}],["刷新发现多了一条数据",{"2":{"77":1}}],["刷新验证码",{"2":{"61":1}}],["键盘等ui交互事件",{"2":{"532":1}}],["键盘事件等等",{"2":{"404":1}}],["键",{"2":{"77":2}}],["键值是对应的",{"2":{"77":1}}],["插槽和状态管理等等相关方面",{"2":{"948":1}}],["插入点",{"2":{"350":1}}],["插入多个光标",{"2":{"158":1}}],["插入多条",{"2":{"77":1}}],["插入多条数据",{"2":{"77":1}}],["插入数据",{"0":{"77":1},"2":{"86":2}}],["插件安装",{"0":{"843":1}}],["插件和扩展等",{"2":{"785":1}}],["插件进程",{"2":{"526":1}}],["插件",{"2":{"54":2,"172":1,"827":1}}],["表单选择的文件属于file类型",{"2":{"768":1}}],["表明它不再应用背压",{"2":{"516":1}}],["表明出现失序报文段时",{"2":{"391":1}}],["表达式就是",{"2":{"932":1}}],["表达式匹配",{"2":{"154":1,"903":1}}],["表达式",{"2":{"139":1,"888":1}}],["表达式9999999次",{"2":{"83":1}}],["表2的数据为主",{"2":{"86":1}}],["表1的数据为主",{"2":{"86":1}}],["表示协议类型",{"2":{"1062":1}}],["表示要监听",{"2":{"1062":1}}],["表示要监听的端口号",{"2":{"1062":1}}],["表示要设置的环境变量的值",{"2":{"1055":1}}],["表示要设置的环境变量的名称",{"2":{"1055":1}}],["表示总是重启容器",{"2":{"1025":1}}],["表示web服务依赖于db服务",{"2":{"1023":1}}],["表示最新版本的",{"2":{"1012":1}}],["表示某个块或者某个子元素的多单词之间的连接记号",{"2":{"850":1}}],["表示已经上传成功了",{"2":{"772":1}}],["表示成功请求",{"2":{"771":1}}],["表示缓存有效期为",{"2":{"720":1}}],["表示缓存",{"2":{"720":1}}],["表示以",{"2":{"717":1}}],["表示",{"2":{"515":1,"1012":1}}],["表示流的内容类型",{"2":{"510":1}}],["表示blob类型",{"2":{"494":1}}],["表示可以断开连接了",{"2":{"457":1}}],["表示可以通过任意网卡进行访问此服务",{"2":{"361":1}}],["表示我知道了",{"2":{"457":1}}],["表示arp请求类型",{"2":{"454":1}}],["表示ip地址长度",{"2":{"454":1}}],["表示ip的长度",{"2":{"297":1}}],["表示关闭",{"2":{"381":1}}],["表示连接错误",{"2":{"379":1}}],["表示连接出现非常严重的错误必须重新连接",{"2":{"376":1}}],["表示确认了server的连接请求",{"2":{"378":1}}],["表示确认需要有效",{"2":{"376":1}}],["表示希望断开连接不会有数据发送了",{"2":{"376":1}}],["表示希望建立连接",{"2":{"376":1}}],["表示数据需要立刻传给上层协议",{"2":{"376":1}}],["表示当前数据需要紧急处理",{"2":{"376":1}}],["表示当前匹配的的索引",{"2":{"152":1,"901":1}}],["表示一个字符测",{"2":{"491":1}}],["表示一个范围",{"2":{"141":1,"890":1}}],["表示一组或多组0",{"2":{"366":1}}],["表示任意主机或任意网络",{"2":{"361":1}}],["表示任意地址",{"2":{"297":1}}],["表示本地计算机的回环地址",{"2":{"361":1}}],["表示只允许",{"2":{"353":1}}],["表示只允许从同一域名加载资源",{"2":{"350":1}}],["表示完全禁止第三方",{"2":{"353":1}}],["表示允许所有请求携带第三方",{"2":{"353":1}}],["表示允许执行指定源的",{"2":{"350":1}}],["表示允许使用",{"2":{"350":1}}],["表示允许在",{"2":{"350":1}}],["表示不允许从任何来源加载资源",{"2":{"350":1}}],["表示文档不能被嵌入到任何父级中",{"2":{"350":1}}],["表示清除cookie",{"2":{"347":1}}],["表示范围请求单位",{"2":{"344":1}}],["表示消息体的长度为",{"2":{"342":1}}],["表示从现在开始使用新的密钥加密通信",{"2":{"333":1}}],["表示层",{"2":{"309":1}}],["表示mac地址长度",{"2":{"297":1}}],["表示映射的协议地址类型",{"2":{"297":1}}],["表示多行匹配",{"2":{"152":1,"901":1}}],["表示匹配是否忽略大小写",{"2":{"152":1,"901":1}}],["表示匹配后面不是y的x",{"2":{"148":1,"897":1}}],["表示匹配后面紧跟着y的x",{"2":{"148":1,"897":1}}],["表示是否匹配全部内容",{"2":{"152":1,"901":1}}],["表示正则对象的原表达式内容以字符串的形式输出",{"2":{"152":1,"901":1}}],["表示非组合的内容",{"2":{"144":1,"893":1}}],["表示知道得有左位数和最多位数jsstr",{"2":{"141":1,"890":1}}],["表示前面的",{"2":{"141":1,"890":1}}],["表示解析的文档类型",{"2":{"117":1}}],["表示0个或多个",{"2":{"85":1}}],["表示倒序",{"2":{"81":1}}],["表名",{"2":{"75":1,"76":1,"77":4,"78":2,"79":1,"80":3,"81":2,"82":2,"83":3,"84":1,"85":1,"90":1}}],["表的操作",{"2":{"73":1}}],["那会给我妈打个视频或者发个消息",{"2":{"1232":1}}],["那样会相对繁琐",{"2":{"1051":1}}],["那它又是怎么来的呢",{"2":{"954":1}}],["那它到底有什么用呢",{"2":{"575":1}}],["那在页面渲染时也就只会执行一次",{"2":{"930":1}}],["那在js中如何解释这个呢",{"2":{"583":1}}],["那在js中前面讲了new的过程和本质",{"2":{"582":1}}],["那如何解决队头阻塞问题呢",{"2":{"727":1}}],["那如果没有条件语句会是什么样子呢",{"2":{"79":1}}],["那全部换成let声明后呢",{"2":{"588":1}}],["那class真正的实现方式是如何的呢",{"2":{"583":1}}],["那我们就明白了class继承时",{"2":{"583":1}}],["那我们看下http请求过程",{"2":{"458":1}}],["那不就是child",{"2":{"583":1}}],["那什么是静态属性呢",{"2":{"583":1}}],["那这个一定不陌生",{"2":{"583":1}}],["那这些文件将会被babel",{"2":{"268":1}}],["那是因为字面量创建的对象js内部会隐式的以new",{"2":{"573":1}}],["那可能有人好奇",{"2":{"573":1}}],["那原型的对象是不是就是prototype的原型",{"2":{"573":1}}],["那原型链也很快就懂了",{"2":{"571":1}}],["那为什么要使用数据卷呢",{"2":{"1109":1}}],["那为什么js不像其他语言一样也是个多线程语言呢",{"2":{"524":1}}],["那为何不直接线上排查呢",{"2":{"408":1}}],["那怎么用vscode连接node",{"2":{"400":1}}],["那内部到底是怎么个流程呢",{"2":{"236":1}}],["那两者有啥不同呢",{"2":{"131":1}}],["那时对于编程解答最常用的就是csdn了",{"2":{"123":1}}],["那个版本的全局环境下的工具也全部删除掉了",{"2":{"96":1}}],["那就会有数据丢失的风险",{"2":{"1109":1}}],["那就要等到指定的容器启动后再去启动另一个容器",{"2":{"1016":1}}],["那就通知更新数组length属性的依赖",{"2":{"961":1}}],["那就是判断当前属性的值是不是原始类型",{"2":{"960":1}}],["那就是limit",{"2":{"90":1}}],["那就是查找以这个内容结尾的数据",{"2":{"85":1}}],["那就是查找以这个内容开头的数据",{"2":{"85":1}}],["那就创建表吧",{"2":{"74":1}}],["那么依赖作业将失败",{"2":{"1140":1}}],["那么流水线的执行过程就通过",{"2":{"1123":1}}],["那么将会执行",{"2":{"1063":1}}],["那么docker",{"2":{"1024":1}}],["那么dep到底是如何收集到渲染watcher的",{"2":{"931":1}}],["那么对于数组的方法又是如何拦截的呢",{"2":{"961":1}}],["那么对于大团队或者有多种想法和爱折腾的团队来说",{"2":{"786":1}}],["那么key就是索引",{"2":{"956":1}}],["那么vue是如何实现对数组拦截的呢❓答案就是改写数组的原型方法",{"2":{"955":1}}],["那么深层嵌套的属性值改变时也会通知user",{"2":{"941":1}}],["那么当值被修改时就会通知当前属性的所有依赖进行更新",{"2":{"959":1}}],["那么当foo或者bar改变时都会触发user",{"2":{"941":1}}],["那么当组件执行render函数的过程中就会访问computed属性",{"2":{"932":1}}],["那么回调函数就为",{"2":{"937":1}}],["那么来看看watcher的depend干了啥",{"2":{"932":1}}],["那么渲染watcher又是如何知道需要重新渲染的呢",{"2":{"931":1}}],["那么计算属性其实本质就是一个watcher",{"2":{"931":1}}],["那么stylelint也没什么难度",{"2":{"842":1}}],["那么plugins就是来扩展除内置以外的其他规则",{"2":{"831":1}}],["那么通过eslint结合ts就可以完美的解决这些问题",{"2":{"825":1}}],["那么打包的顺序就很关键了",{"2":{"816":1}}],["那么打了断点一般用来做什么",{"2":{"419":1}}],["那么具体是如何实现的呢",{"2":{"812":1}}],["那么commitlint",{"2":{"802":1}}],["那么commitlint可以继承commitizen的规则",{"2":{"802":1}}],["那么该如何进一步选择",{"2":{"786":1}}],["那么这些眼花缭乱的打包工具该如何选择",{"2":{"784":1}}],["那么这样一来",{"2":{"87":1}}],["那么如何做好这方面的工作呢",{"2":{"823":1}}],["那么如何在工作中选择适合自己团队的框架",{"2":{"786":1}}],["那么如何选择适当的打包工具作为当前项目的神器呢",{"2":{"784":1}}],["那么如何防止csrf攻击呢",{"0":{"353":1}}],["那么可以对大文件把大文件划分成很多小块",{"2":{"767":1}}],["那么可以考虑通过并发文件内容可以提高传输速度和效率",{"2":{"764":1}}],["那么可以通过中介者来转发处理这些事件",{"2":{"208":1,"758":1}}],["那么此处",{"2":{"726":1,"1178":1}}],["那么针对没有任何参数问题就要进一步解决了",{"2":{"684":1}}],["那么本篇文章的相关使用方法可能不适用了",{"2":{"679":1}}],["那么只要给每次循环内的代码重新引用每次循环的i的值",{"2":{"594":1}}],["那么究竟什么是闭包呢",{"2":{"594":1}}],["那么js引擎是如何处理变量的",{"2":{"586":1}}],["那么子类函数是不是只要在函数内部和原型对象上prototype拥有父类的属性和方法就行了",{"2":{"582":1}}],["那么寄生式就是在空对象中再添加一些属性和方法",{"2":{"581":1}}],["那么所有子类对于父类的继承都是引用",{"2":{"577":1}}],["那么为什么任务队列中会有宏任务",{"2":{"532":1}}],["那么浏览器处理用户的操作将会变得非常复杂",{"2":{"524":1}}],["那么arp协议是如何获取目标主机的mac地址的",{"2":{"454":1}}],["那么a一定是个引用类型",{"2":{"48":1,"554":1}}],["那么你可以试试charles",{"2":{"411":1}}],["那么它是如何实现数据传输的可靠性的呢",{"2":{"385":1}}],["那么它可以接受来自任意ip地址的网络请求",{"2":{"361":1}}],["那么服务器才会为该syn重新构建队列",{"2":{"381":1}}],["那么实际传输的数据大小为1500",{"2":{"369":1}}],["那么知道缓存的内容了",{"2":{"248":1}}],["那么前端缓存主要指什么",{"2":{"167":1}}],["那么父元素的高度会发生高度塌陷",{"2":{"108":1,"112":1}}],["那么下一页就是第三条和第四条了",{"2":{"90":1}}],["那么返回的结果就是第一条和第二条",{"2":{"90":1}}],["那么就对当前值执行",{"2":{"941":1}}],["那么就来看看它内部具体实现",{"2":{"938":1}}],["那么就和第一次页面渲染访问计算属性一样的逻辑",{"2":{"932":1}}],["那么就需要对ts进行转译让jest识别",{"2":{"858":1}}],["那么就可以使用overrides进行规则覆盖",{"2":{"830":1}}],["那么就只能重新发送整个文件",{"2":{"766":1}}],["那么就会通过他自己的",{"2":{"955":1}}],["那么就会走这里",{"2":{"938":1}}],["那么就会打印多次",{"2":{"932":1}}],["那么就会再次访问当前实例的计算属性getter",{"2":{"932":1}}],["那么就会执行watcher",{"2":{"932":1}}],["那么就会执行valueof",{"2":{"48":1,"554":1}}],["那么就会报错",{"2":{"626":1}}],["那么就会连续发送3个数据包",{"2":{"387":1}}],["那么就是查找包含这个内容的数据",{"2":{"85":1}}],["那么在所有的切片上传完后告诉服务器切片已经上传完了",{"2":{"770":1}}],["那么在uint8长度也为2",{"2":{"481":1}}],["那么在",{"2":{"108":1,"112":1}}],["那么在此方法做文章就可以了",{"2":{"48":1,"554":1}}],["那么在减去宽度的一半就好了",{"2":{"14":1}}],["删除名为",{"2":{"1115":1}}],["删除卷会删除宿主机",{"2":{"1115":1}}],["删除等相关的命令",{"2":{"1112":1}}],["删除等等",{"2":{"1027":1}}],["删除等操作集成到一起",{"2":{"1017":1}}],["删除和迁移等操作",{"2":{"1003":1}}],["删除容器时",{"2":{"1002":1}}],["删除虚悬镜像",{"2":{"1000":1}}],["删除所有镜像",{"2":{"1000":1}}],["删除latest版本nginx",{"2":{"1000":1}}],["删除",{"0":{"1000":1,"1009":1,"1115":1},"2":{"964":1,"1000":2,"1003":1}}],["删除前端发送过来的不存在的属性",{"2":{"643":1}}],["删除发送过来的不存在的属性",{"2":{"643":1,"646":1}}],["删除请求头等等",{"2":{"436":1}}],["删除了原来的返回数据",{"2":{"419":1}}],["删除原来的webpack",{"2":{"190":1}}],["删除导入导出",{"2":{"187":1,"190":1}}],["删除行尾多余空格",{"2":{"160":1}}],["删除行",{"2":{"157":1}}],["删除数据",{"0":{"79":1}}],["删除数据库",{"0":{"73":1}}],["删除user表",{"2":{"76":1}}],["删除表",{"0":{"76":1}}],["删除订单",{"2":{"53":1}}],["输入联系作者会得到我的微信二维码",{"2":{"1224":1}}],["输入刚刚查询的ip和fiddler监听的端口",{"2":{"438":1}}],["输入手机密码等等",{"2":{"422":1}}],["输入url后发生了什么",{"0":{"276":1}}],["输入被测试的网站",{"2":{"221":1}}],["输入安装过程中创建的密码",{"2":{"69":1}}],["输出和错误流",{"2":{"1005":1}}],["输出",{"2":{"33":1,"172":1}}],["zfs",{"2":{"1209":1}}],["zoneinfo",{"2":{"1204":1}}],["zone=my",{"2":{"721":1}}],["zip",{"2":{"1139":1}}],["zindex",{"2":{"201":1,"751":1}}],["zu8+k0q2vjwgd",{"2":{"1103":1}}],["zwj",{"2":{"462":1}}],["zwnj",{"2":{"462":1}}],["zwsp",{"2":{"462":1}}],["zhihu",{"2":{"280":1,"410":1}}],["zhuanlan",{"2":{"280":1,"410":1}}],["zh",{"2":{"270":1,"293":1,"347":2,"462":2,"568":1,"673":6,"674":2,"676":1,"724":1,"726":1}}],["zhangsan",{"2":{"26":2}}],["zero",{"2":{"251":1,"462":3}}],["zzz",{"2":{"251":1}}],["z|0",{"2":{"144":1,"893":1}}],["z|",{"2":{"144":1,"893":1}}],["z",{"2":{"144":2,"154":1,"157":1,"708":2,"718":4,"893":2,"903":1,"1121":3}}],["z0",{"2":{"139":3,"888":3}}],["zap",{"2":{"251":1}}],["za",{"2":{"139":3,"888":3}}],["zshrc",{"2":{"69":1}}],["zshrc配置文件",{"2":{"69":1}}],["等到10月中下旬了再准备面试吧",{"2":{"1233":1}}],["等到render时才会执行",{"2":{"934":1}}],["等参数覆盖",{"2":{"1066":1}}],["等低级源语言提供一个高效的编译目标",{"2":{"977":1}}],["等内置对象的变化",{"2":{"965":1}}],["等结尾的文件时对应",{"2":{"857":1}}],["等多个操作系统上运行",{"2":{"785":1}}],["等js的执行栈中当前同步任务执行完毕后",{"2":{"527":1}}],["等服务端接收到ack报文后",{"2":{"457":1}}],["等一会时间服务端再发送包含seq=125",{"2":{"457":1}}],["等信息",{"2":{"367":1}}],["等技术来实现实时通信",{"2":{"354":1}}],["等方法执行动态生成的",{"2":{"350":1}}],["等",{"2":{"320":1,"367":1,"720":1,"785":1,"797":1,"1011":1,"1013":1,"1121":1}}],["等图片加载好了再把请求成功的图片加载到img标签上",{"2":{"198":1,"748":1}}],["等下次需要取到相应的内容时",{"2":{"167":1}}],["等价于",{"2":{"139":6,"888":6}}],["等标签",{"2":{"117":1}}],["等待",{"2":{"558":1}}],["等待新的请求连接或i",{"2":{"538":1}}],["等待主线程的调度",{"2":{"533":1}}],["等待server发送fin请求",{"2":{"382":1}}],["等待应用程序使用",{"2":{"380":1}}],["等待服务端的验证",{"2":{"332":1}}],["等待接收方来补充",{"2":{"297":1}}],["等待安装完成",{"2":{"68":1}}],["等待下载完成后双击安装包进行安装",{"2":{"68":1}}],["等等其他",{"2":{"139":1,"888":1}}],["等等",{"2":{"46":1,"53":1,"181":1,"238":1,"336":1,"526":1,"552":1,"582":1,"964":1}}],["安全增强型linux",{"2":{"1202":1}}],["安全组",{"2":{"1087":1}}],["安全性",{"2":{"706":1}}],["安全策略等等",{"2":{"526":1}}],["安全",{"2":{"347":1,"762":1}}],["安装dashborad",{"0":{"1221":1}}],["安装docker",{"0":{"1093":1}}],["安装metrics",{"0":{"1220":1}}],["安装ipvs",{"0":{"1206":1}}],["安装包时用npm",{"2":{"1107":1}}],["安装包的在bin文件下执行",{"2":{"728":1}}],["安装ntpdate",{"2":{"1204":1}}],["安装nexus3",{"0":{"1094":1}}],["安装nginx",{"0":{"707":1}}],["安装前端依赖并进行打包",{"2":{"1070":1}}],["安装registry",{"0":{"1038":1}}],["安装使用",{"0":{"877":1}}],["安装对应的依赖",{"2":{"875":1}}],["安装jest的类型文件包",{"2":{"858":1}}],["安装stylelint",{"2":{"844":1}}],["安装插件",{"2":{"843":1}}],["安装完后",{"2":{"804":1}}],["安装完成后",{"2":{"68":1}}],["安装完成之后会弹出一个对话框",{"2":{"68":1}}],["安装配置",{"0":{"804":1}}],["安装方式和工具可自行选择",{"2":{"799":1}}],["安装commitlint",{"2":{"802":1}}],["安装commitizen",{"2":{"799":1}}],["安装cz",{"2":{"801":1}}],["安装charles证书",{"2":{"422":1}}],["安装httpd",{"2":{"713":1}}],["安装路径",{"2":{"708":1}}],["安装模块类型文件",{"2":{"701":1}}],["安装好以后在程序入口进行简单的配置就可以使用了",{"2":{"681":1}}],["安装相关依赖",{"2":{"632":1,"840":1}}],["安装证书到系统",{"2":{"422":1}}],["安装条件",{"2":{"222":1}}],["安装依赖",{"2":{"184":1}}],["安装基本的依赖",{"0":{"174":1}}],["安装",{"0":{"218":1,"602":1,"658":1,"680":1,"796":1,"799":1,"856":1,"1082":1},"2":{"68":1,"218":1}}],["安卓6+",{"2":{"22":1}}],["安卓3+",{"2":{"22":1}}],["安卓4",{"2":{"22":1}}],["安卓2",{"2":{"22":7}}],["首次dirty为true",{"2":{"934":1}}],["首次加载",{"2":{"130":1}}],["首页静态页面",{"2":{"1034":1}}],["首页测试",{"2":{"879":1}}],["首页打开mysql的官方网站",{"2":{"68":1}}],["首位在arraybuffer中的偏移量",{"2":{"488":1}}],["首5位是t模32的结果",{"2":{"381":1}}],["首部字段",{"0":{"319":1}}],["首先创建挂载卷",{"2":{"1172":1}}],["首先得知道他的ip地址",{"2":{"1084":1}}],["首先判断可以收集",{"2":{"964":1}}],["首先组件的初始化会执行vue的",{"2":{"954":1}}],["首先但我们用computed",{"2":{"934":1}}],["首先是data的dep会收集渲染watcher",{"2":{"933":1}}],["首先还是获取到当前计算属性的watcher",{"2":{"932":1}}],["首先进来为",{"2":{"932":1}}],["首先下载eslint插件",{"2":{"832":1}}],["首先需要在每个人的编码功底的基础上使用统一的编码规范",{"2":{"825":1}}],["首先安装pnpm",{"2":{"815":1}}],["首先安装一下babel",{"2":{"180":1}}],["首先设置相关的lint脚本",{"2":{"805":1}}],["首先设置原型的方式有多种",{"2":{"571":1}}],["首先评估项目的复杂度",{"2":{"784":1}}],["首先就是要对切片上传进行并发限制",{"2":{"771":1}}],["首先检查是否安装了此模块",{"2":{"718":1}}],["首先检查是否存在请求静态文件的",{"2":{"717":1}}],["首先这个会涉及到异步编程和eventloop",{"2":{"594":1}}],["首先语法分析时",{"2":{"587":1}}],["首先script整体作为宏任务执行",{"2":{"536":1}}],["首先script整体作为同步任务执行",{"2":{"532":1}}],["首先执行promise",{"2":{"532":1}}],["首先会执行trackrefvalue函数内部会让当前计算属性的dep对render函数进行收集",{"2":{"934":1}}],["首先会执行symbol",{"2":{"40":1,"546":1}}],["首先会判断执行它的时机到了没",{"2":{"532":1}}],["首先打印async1",{"2":{"532":1}}],["首先打开tools",{"2":{"439":1}}],["首先打开source面板",{"2":{"407":1}}],["首先客户端发送get请求给服务端",{"2":{"458":1}}],["首先apple",{"2":{"454":1}}],["首先先打开wireshark监听抓包",{"2":{"454":1}}],["首先先用student表和class表联表",{"2":{"87":1}}],["首先查询计算机ip",{"2":{"438":1}}],["首先client主动发送syn连接请求",{"2":{"380":1}}],["首先在vscode中搜索",{"2":{"838":1}}],["首先在vscode中安装editorconfig插件",{"2":{"836":1}}],["首先在菜单栏中一次点击tools",{"2":{"438":1}}],["首先在加载目标图片时",{"2":{"242":1}}],["首先在最外层文件夹下载依赖",{"2":{"56":1}}],["首先肯定会想到是在vue原型上定义的方法",{"2":{"239":1}}],["首先我们来看下面一段代码",{"2":{"589":1}}],["首先我们要先找到vue的定义所在",{"2":{"238":1}}],["首先我们得找到vue的入口",{"2":{"237":1}}],["首先我们在webpack",{"2":{"175":1}}],["首先定义一个事件池",{"2":{"195":1,"745":1}}],["首先要明白vue的更新粒度是组件级别",{"2":{"953":1}}],["首先要知道为什么需要大文件上传",{"2":{"764":1}}],["首先要知道js是动态解释脚本语言",{"2":{"587":1}}],["首先要提一下两个重要的",{"2":{"179":1}}],["首先要想a同时满足1",{"2":{"48":1,"554":1}}],["首先看下什么是formatting",{"0":{"102":1}}],["首先取出表1",{"2":{"86":2}}],["首先不要改变服务器端口",{"2":{"56":1}}],["首先",{"0":{"56":1},"2":{"7":1,"150":1,"899":1}}],["截图",{"0":{"65":1}}],["帐号过期",{"2":{"64":1}}],["7b2f630ecb3fac019db7f487525aaf34f609a0690808dcd873c542984be875c5",{"2":{"1214":3,"1215":1}}],["755",{"2":{"1206":1}}],["73",{"2":{"1218":3}}],["735",{"2":{"1179":1}}],["73acd36f196e",{"2":{"1088":1,"1089":1}}],["7334",{"2":{"366":2}}],["7h",{"2":{"1082":1}}],["7s",{"2":{"1055":1,"1208":1}}],["713",{"2":{"994":1}}],["7mb",{"2":{"994":1}}],["7m大小",{"2":{"771":1}}],["7m大小的图片分为每块1m总共4块的切片",{"2":{"768":1}}],["7m",{"2":{"765":1}}],["72gfintp1jgtlzfn",{"2":{"1191":1}}],["72",{"2":{"728":2,"801":1}}],["7200",{"2":{"64":1}}],["78kb",{"2":{"703":1}}],["77",{"2":{"874":4}}],["772b",{"2":{"703":1}}],["7777",{"2":{"422":1}}],["7作为演示版本",{"2":{"679":1}}],["7行",{"2":{"581":1}}],["70s",{"2":{"1217":3}}],["701",{"2":{"864":1}}],["70",{"2":{"454":1}}],["7999",{"2":{"1039":4,"1045":1}}],["79657sec",{"2":{"728":2}}],["79",{"2":{"453":1}}],["7️⃣",{"2":{"251":1}}],["747bff",{"2":{"222":2}}],["7",{"2":{"152":1,"245":1,"347":1,"454":1,"456":1,"529":1,"729":1,"801":1,"813":1,"901":1,"1005":1,"1007":3,"1054":1,"1055":2,"1074":1,"1121":10,"1122":2,"1208":1,"1209":1,"1217":6}}],["761",{"2":{"1218":1}}],["769",{"2":{"1208":1}}],["76f5d72",{"2":{"800":1}}],["76",{"2":{"139":1,"728":1,"888":1}}],["7dec",{"2":{"316":1}}],["7d",{"2":{"132":2}}],["7版本",{"2":{"93":1}}],["7天撸完ktv点歌系统",{"0":{"50":1},"1":{"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1}}],["没想到还真中奖了",{"2":{"1236":1}}],["没想到这个月很突然的轮到了自己",{"2":{"1233":1}}],["没想到今天我爸受伤了",{"2":{"1232":1}}],["没想到今天还是不接电话",{"2":{"1232":1}}],["没必要那么折腾了",{"2":{"1232":1}}],["没必要汉化",{"2":{"423":1}}],["没安装网络组件时查看当前k8s集群状态",{"2":{"1217":1}}],["没此文件自行创建",{"2":{"1045":1}}],["没上传",{"2":{"772":1}}],["没嵌套也没类型推断",{"2":{"631":1}}],["没啥区别啊",{"2":{"581":1}}],["没意义",{"2":{"576":1}}],["没什么说的",{"2":{"452":1}}],["没有则使用注册runner时指定的默认镜像",{"2":{"1145":1}}],["没有则会执行ordinarytoprimitive的方法",{"2":{"40":1,"546":1}}],["没有主机或端口",{"2":{"1121":1}}],["没有主机或协议",{"2":{"1121":1}}],["没有协议或端口",{"2":{"1121":1}}],["没有前导",{"2":{"1121":2}}],["没有经过docker管理",{"2":{"1114":1}}],["没有指定标签",{"2":{"1108":1}}],["没有指定其他特殊的配置",{"2":{"1018":1}}],["没有进行硬件虚拟",{"2":{"1079":1}}],["没有进行转义就会收到攻击sh",{"2":{"350":1}}],["没有默认运行命令则会自动退出",{"2":{"1063":1}}],["没有此文件自行创建",{"2":{"1039":1}}],["没有可以自己build",{"2":{"1039":1}}],["没有tag时默认",{"2":{"999":1}}],["没有cb",{"2":{"945":1}}],["没有设置noop",{"2":{"932":1}}],["没有测试到的行数",{"2":{"874":1}}],["没有错误",{"2":{"868":1}}],["没有的则表示当前仓库的执行脚本",{"2":{"818":1}}],["没有讲过多的细节",{"2":{"775":1}}],["没有超时问题",{"2":{"767":1}}],["没有",{"2":{"687":1}}],["没有mac地址就像快递只写了收件人姓名",{"2":{"454":1}}],["没有时默认显示游客+时间戳",{"2":{"354":1}}],["没有登录认证等相关操作",{"2":{"354":1}}],["没有转义时就会收到攻击sh",{"2":{"350":1}}],["没有及时从上游服务器收到请求",{"2":{"317":1}}],["没有命中缓存时",{"2":{"248":1}}],["没有自定义验证器执行默认验证器",{"2":{"232":1}}],["没有数据则显示null",{"2":{"86":2}}],["没了吗",{"2":{"63":1}}],["翻译",{"2":{"525":1}}],["翻页属性",{"2":{"63":1}}],["翻转颜色",{"2":{"61":1}}],["每天三点一线重复的过着",{"2":{"1232":1}}],["每年都是11月就回家了",{"2":{"1232":1}}],["每台机器上配置以上的dns确保可以通过主机名互相进行访问",{"2":{"1200":1}}],["每台机器",{"2":{"1195":1}}],["每注册一个",{"2":{"1159":1}}],["每条指令都会创建一个新的镜像层并对镜像进行提交",{"2":{"1067":1}}],["每条数据之间用逗号隔开就行了",{"2":{"77":1}}],["每行最大长度",{"2":{"830":1,"839":1}}],["每位开发者或多团队成员或少即团队都离不开成员协作",{"2":{"782":1}}],["每种方式都有自己的优点和缺点",{"2":{"582":1}}],["每段代码的含义知道大概意思即可",{"2":{"954":1}}],["每段数据被实际接收的时间会因为网络原因进行波动",{"2":{"387":1}}],["每段最大传输数据大小",{"2":{"376":1}}],["每发送一个数据段就将窗口大小加1",{"2":{"393":1}}],["每发送一个数据包会通过另一方的确认来判断是否丢包",{"2":{"387":1}}],["每发一次数据就要累加一次该数据的长度",{"2":{"376":1}}],["每过一个路由器ttl都会减去1",{"2":{"382":1}}],["每隔",{"2":{"381":1}}],["每当一个ip数据包经过一个网络设备",{"2":{"368":1}}],["每当加载真实或者错误图片时",{"2":{"246":1}}],["每组之间使用冒号分隔",{"2":{"366":1}}],["每个人的脸上都表现出了严肃的信号",{"2":{"1233":1}}],["每个人心里都有爱自己的爸妈",{"2":{"1232":1}}],["每个作业必须包含一个script",{"2":{"1124":1}}],["每个作业独立执行",{"2":{"1124":1}}],["每个作业的名字必须唯一",{"2":{"1124":1}}],["每个容器都可以通过",{"2":{"1091":1}}],["每个容器都会分配一个唯一的",{"2":{"1087":1}}],["每个容器都是一个子字段",{"2":{"1018":1}}],["每个阶段可以使用不同的基础镜像和构建步骤",{"2":{"1070":1}}],["每个阶段提示信息",{"2":{"801":1}}],["每个端口号用空格分隔",{"2":{"1062":1}}],["每个键值对用空格分隔",{"2":{"1055":1}}],["每个环境变量之间用",{"2":{"1024":1}}],["每个registry中包含多个仓库",{"2":{"1011":1}}],["每个新构建的镜像都会创建一个新的镜像",{"2":{"1002":1}}],["每个仓库有多个tag来表示不同版本的仓库镜像",{"2":{"1011":1}}],["每个仓库可以包含多个tag",{"2":{"995":1,"1081":1}}],["每个仓库都是一个独立的包",{"2":{"809":1}}],["每个组件都会生成对应的渲染watcher",{"2":{"954":1}}],["每个组件渲染函数都有一个watcher",{"2":{"951":1}}],["每个对象的属性都有一个对应的dep",{"2":{"952":1}}],["每个被observe过的对象都会有一个",{"2":{"951":1}}],["每个属性都有自己的dep对象",{"2":{"951":1}}],["每个key对应一个set数据结构",{"2":{"951":1}}],["每个key对应一个打包脚本",{"2":{"818":1}}],["每个watch",{"2":{"937":1}}],["每个函数内部的所有分支条件",{"2":{"872":1}}],["每个函数都有prototype属性",{"2":{"573":1}}],["每个项目或组件都有自己独立的代码仓库",{"2":{"808":1}}],["每个切片大小0",{"2":{"772":1}}],["每个切片的大小为1m",{"2":{"771":1}}],["每个节点都安装keepalived和nginx",{"2":{"728":1}}],["每个",{"2":{"710":1,"1085":1}}],["每个块都以花括号",{"2":{"709":1}}],["每个块都带有自己的大小信息和一个表示块结束的标志",{"2":{"343":1}}],["每个方法都有自己的作用",{"2":{"627":1}}],["每个请求一个实例",{"2":{"606":1}}],["每个请求和响应都需要建立一次",{"2":{"324":1}}],["每个注入一个实例",{"2":{"606":1}}],["每个chunk的大小",{"2":{"510":1}}],["每个字节是",{"2":{"485":1}}],["每个元素的字节数",{"2":{"484":1}}],["每个选项的第一个字节为种类指明选项的类型",{"2":{"376":1}}],["每个数据包的大小被限制在最大传输单元",{"2":{"369":1}}],["每个子网都有独立的网络地址",{"2":{"364":1}}],["每个网络设备都需要具有一个唯一的ip地址",{"2":{"358":1}}],["每个网段中的全0和全1不能使用",{"2":{"358":1}}],["每个指令都可以定义多个值",{"2":{"350":1}}],["每个协议版本都有多个加密算法如",{"2":{"331":1}}],["每个版本都在不断地改进和完善",{"2":{"321":1}}],["每个arp请求包都包含一个虚假的ip地址和mac地址",{"2":{"304":1}}],["每个设备",{"2":{"298":1}}],["每个层次都会分享一些重要的知识点",{"2":{"271":1}}],["每个都通过tore这个中介者来操作对象",{"2":{"208":1,"758":1}}],["每个用户面对的都是有固定尺寸的显示器",{"2":{"133":1}}],["每秒检查一次",{"2":{"188":1,"190":1}}],["每次监听对象值的更新",{"2":{"942":1}}],["每次提交必须包含页眉内容",{"2":{"788":1}}],["每次都是配置一大堆",{"2":{"782":1}}],["每次只能有1个请求",{"2":{"771":1}}],["每次tick只会有一个微任务队列",{"2":{"532":1}}],["每次循环都会选择不同类型任务队列的第一个可执行任务",{"2":{"532":1}}],["每次没有结束值",{"2":{"520":1}}],["每次请求都会携带上相关的cookie",{"2":{"347":1}}],["每次打包的时候",{"2":{"184":1}}],["每次打包前清空",{"0":{"184":1}}],["每次重复请求",{"2":{"129":1}}],["每次读取值时进行自加",{"2":{"48":1,"554":1}}],["每一层都对应了具体的构建指令",{"2":{"1049":1}}],["每一种库都可以适配websocketgateway",{"2":{"702":1}}],["每一次tick都会先执行同步任务",{"2":{"532":1}}],["每一方都会在缓存空间中维护着一些有用的信息",{"2":{"387":1}}],["每一个子元素的margin与包含块的左边界border相接触",{"2":{"106":1}}],["每一个小括号算是一条数据",{"2":{"77":1}}],["每一块的第一个参数指定要比较的值",{"2":{"83":1}}],["每页显示多少条",{"2":{"63":1}}],["关联issue",{"0":{"793":1}}],["关键词",{"2":{"778":1}}],["关心核心socket通信就行了",{"2":{"354":1}}],["关闭锁定",{"2":{"1158":1}}],["关闭目标container",{"2":{"1087":1}}],["关闭tabs",{"2":{"830":1}}],["关闭规则",{"2":{"830":1}}],["关闭模块",{"2":{"718":1}}],["关闭nginxsh",{"2":{"708":1}}],["关闭可写流",{"2":{"516":1}}],["关闭捕获",{"2":{"452":1}}],["关闭调试窗口后",{"2":{"399":1}}],["关闭浏览器会失效",{"2":{"347":1}}],["关闭",{"2":{"163":1,"510":1}}],["关闭文件夹",{"2":{"162":1}}],["关闭编辑器",{"2":{"162":1}}],["关闭窗口",{"2":{"156":1}}],["关于贡献内容",{"2":{"1225":1}}],["关于本博客已有好久的历史",{"2":{"1223":1}}],["关于我",{"0":{"1223":1},"1":{"1224":1,"1225":1,"1226":1,"1227":1,"1228":1}}],["关于更多配置可以查看👉官方文档",{"2":{"1026":1}}],["关于更多rxjs的使用",{"2":{"651":1}}],["关于docker安装nexus3这里不再做介绍了",{"2":{"1040":1}}],["关于docker",{"2":{"1026":1}}],["关于domparser",{"0":{"114":1},"1":{"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["关于vscode的更多调试技巧可以看我的",{"2":{"966":1}}],["关于typescript的使用可以查看我有关typescript的文章",{"2":{"834":1}}],["关于tcp的三次握手和四次挥手是常问的考点",{"2":{"378":1}}],["关于ejs的模板语法请自行翻阅相关文档",{"2":{"671":1}}],["关于elementui分页详细请见",{"2":{"63":1}}],["关于service大家应该知道主要是为controller提供数据的",{"2":{"667":1}}],["关于setmetadata的使用点击这里查看文档了解更多",{"2":{"648":1}}],["关于作用域的概念下面会讲",{"2":{"588":1}}],["关于作用域以及执行上下文",{"2":{"585":1}}],["关于构造函数或prototype属性不是很清楚后面会介绍",{"2":{"571":2}}],["关于定时器误差也会很容易理解",{"2":{"533":1}}],["关于浏览器的架构的发展也进行了很长一段时间",{"2":{"526":1}}],["关于fiddler的常用的抓包功能已经介绍的差不多了",{"2":{"439":1}}],["关于如何将http升级为https",{"2":{"328":1}}],["关于如何使用http2",{"2":{"323":1}}],["关于runtime和compiler版本后面再做介绍",{"2":{"237":1}}],["关于引用的用法",{"2":{"146":1,"895":1}}],["关于bfc只需要知道",{"2":{"113":1}}],["关于bfc的内容也是属于老生常谈的问题",{"2":{"113":1}}],["关于passport",{"2":{"64":1}}],["关注github更多优质项目等你来开箱😄",{"2":{"10":1}}],["拼接",{"2":{"723":1}}],["拼接新的文件名",{"2":{"62":1}}],["拼音点歌",{"2":{"54":1}}],["音视频",{"0":{"475":1},"1":{"476":1}}],["音视频流的播放",{"2":{"344":1}}],["音频可视化",{"0":{"476":1}}],["音频等资源",{"2":{"132":1}}],["音频上传成功",{"2":{"62":1}}],["音频上传失败",{"2":{"62":1}}],["音频不能超过20m",{"2":{"62":1}}],["音乐管理",{"2":{"54":1}}],["保护好自己",{"2":{"1236":1}}],["保护数据的机密性和完整性",{"2":{"366":1}}],["保持容器的数据独立性",{"2":{"1061":1}}],["保持项目技术的纯度",{"2":{"786":1}}],["保持打开",{"2":{"163":1}}],["保留字指令必须大写",{"2":{"1067":1}}],["保留位",{"2":{"376":1}}],["保留为将来使用",{"2":{"359":1}}],["保留文件后缀名",{"2":{"62":1}}],["保证可以抓取虚拟机的所有网卡接口",{"2":{"1217":1}}],["保证了处处环境的一致性",{"2":{"1078":1}}],["保证了数据在传输过程中的安全性",{"2":{"328":1}}],["保证只会生成一次",{"2":{"951":1}}],["保证数据的安全性",{"2":{"706":1}}],["保证数据包能够到达目的地址",{"2":{"368":1}}],["保证数据包能够在网络中迅速传输",{"2":{"368":1}}],["保证通信过程中的机密性",{"2":{"329":1}}],["保证一个类仅有一个实例",{"2":{"196":1,"746":1}}],["保存退出后",{"2":{"1174":1}}],["保存镜像的仓库",{"2":{"995":1,"1081":1}}],["保存捕获文件",{"2":{"452":1}}],["保存配置后最好重启一下",{"2":{"438":1}}],["保存在客户端计算机上",{"2":{"347":1}}],["保存",{"2":{"283":1,"430":1}}],["保存文件即可对代码进行格式化",{"2":{"839":1}}],["保存文件",{"2":{"163":1}}],["保存到cookie",{"2":{"61":1}}],["保存到session",{"2":{"61":1}}],["创建cri",{"2":{"1208":1}}],["创建ci文件",{"2":{"1190":1}}],["创建换将ci变量npm",{"2":{"1190":1}}],["创建token",{"2":{"1189":1}}],["创建js文件",{"2":{"1184":1}}],["创建jsonp标签加载数据",{"2":{"338":1}}],["创建路径",{"2":{"1183":1}}],["创建项目",{"2":{"1182":1}}],["创建组",{"2":{"1182":1}}],["创建组与项目",{"0":{"1182":1}}],["创建组件的渲染watcher",{"2":{"954":1}}],["创建组件过程会对相关属性的初始化",{"2":{"953":1}}],["创建构建环境",{"2":{"1165":1}}],["创建挂载卷",{"0":{"1152":1}}],["创建挂载点",{"2":{"1061":1}}],["创建流水线时的",{"2":{"1121":1}}],["创建group",{"0":{"1106":1}}],["创建group仓库",{"2":{"1042":1}}],["创建proxy",{"0":{"1105":1}}],["创建proxy仓库",{"2":{"1042":1}}],["创建角色",{"0":{"1099":1}}],["创建自定义网络mynetwork",{"2":{"1089":1}}],["创建自己的reactiveeffect对象",{"2":{"934":1}}],["创建网络",{"0":{"1089":1}}],["创建文件夹",{"2":{"1061":1}}],["创建用户",{"0":{"1100":1},"2":{"1043":1}}],["创建用0太填满的指定长度",{"2":{"483":1}}],["创建hosted仓库",{"2":{"1042":1}}],["创建仓库选择npm",{"2":{"1106":1}}],["创建仓库关联存储集",{"2":{"1098":1}}],["创建仓库",{"0":{"1042":1,"1098":1}}],["创建存储集来存储我们的docker镜像",{"2":{"1041":1}}],["创建存储集",{"0":{"1041":1,"1097":1}}],["创建卷映射文件夹shmkdir",{"2":{"1038":1}}],["创建镜像构建文件",{"2":{"1034":1}}],["创建docker角色用来管理docker相关操作",{"2":{"1043":1}}],["创建docker",{"2":{"1034":1}}],["创建default",{"2":{"1034":1}}],["创建nodejs作为后端服务",{"2":{"1034":1}}],["创建前端页面静态文件index",{"2":{"1034":1}}],["创建新镜像的方式有很多",{"2":{"1000":1}}],["创建时间",{"2":{"998":1}}],["创建时指定值",{"2":{"483":1}}],["创建userwatcher时会标识当前watcher为user",{"2":{"938":1}}],["创建user",{"2":{"938":1}}],["创建对应的watch",{"2":{"937":1}}],["创建",{"0":{"1000":1,"1113":1},"2":{"848":1,"944":1,"964":1,"1000":1,"1102":1,"1191":1}}],["创建effect后执行",{"2":{"964":1}}],["创建eslint忽略的检查文件",{"2":{"827":1}}],["创建eventbus",{"2":{"195":1,"745":1}}],["创建可写流",{"2":{"769":1}}],["创建数据存储单元集用来存放数据",{"2":{"1097":1}}],["创建数据模型",{"2":{"646":1}}],["创建数据库",{"0":{"72":1}}],["创建middleware",{"2":{"634":1}}],["创建manager时将cache传入",{"2":{"248":1}}],["创建配置文件",{"2":{"844":1}}],["创建配置",{"0":{"634":1}}],["创建日志中间件",{"2":{"633":1}}],["创建名为",{"2":{"610":1,"707":1}}],["创建共享模块",{"2":{"609":1}}],["创建原型为",{"2":{"571":1}}],["创建原型对象为user的u1",{"2":{"571":1}}],["创建原型对象",{"2":{"571":1}}],["创建指定长度",{"2":{"483":1}}],["创建指定字节的buffer缓冲区",{"2":{"479":1}}],["创建空长度",{"2":{"483":1}}],["创建响应断点",{"2":{"434":1}}],["创建请求断点",{"2":{"434":1}}],["创建全连接对象将其连接放入accept队列",{"2":{"380":1}}],["创建img",{"2":{"246":1}}],["创建设计模式",{"2":{"210":1,"760":1}}],["创建应聘者期望职位",{"2":{"202":1,"752":1}}],["创建应聘者姓名解析对象",{"2":{"202":1,"752":1}}],["创建应聘者缓存对象",{"2":{"202":1,"752":1}}],["创建校验器",{"2":{"197":1,"747":1}}],["创建完成后",{"2":{"173":1}}],["创建表",{"0":{"75":1}}],["创建上传表单",{"2":{"62":1}}],["创建一个alpine使用自定义网络",{"2":{"1090":1}}],["创建一个busybox并使用自定义网络",{"2":{"1090":1}}],["创建一个读取器并将流锁定于其上",{"2":{"512":1}}],["创建一个validator对象",{"2":{"197":1,"747":1}}],["创建一个user表",{"2":{"75":1}}],["创建一个",{"2":{"7":1,"508":1}}],["很着急",{"2":{"1232":1}}],["很高兴在这里见到你",{"2":{"1223":1}}],["很大原因是没有权限",{"2":{"1191":1}}],["很有可能很长时间后制作者也会对其忘却",{"2":{"1048":1}}],["很简单",{"2":{"960":1}}],["很重要",{"2":{"932":1}}],["很适合纯粹的",{"2":{"829":1}}],["很常见的axios对响应数据进行拦截处理",{"2":{"650":1}}],["很显然这种声明会有很多弊端",{"2":{"588":1}}],["很明显多余",{"2":{"580":1}}],["很明显false",{"2":{"144":1,"893":1}}],["很快就会玩转它",{"2":{"437":1}}],["很纳闷",{"2":{"425":1}}],["很方便进行网速相关的测试如",{"2":{"420":1}}],["很容易泄露数据",{"2":{"303":1}}],["很少从构建开始讲起",{"2":{"236":1}}],["很",{"2":{"175":1}}],["很直观的能让用户感受到",{"2":{"133":1}}],["很值得推荐",{"2":{"126":1}}],["很友好",{"2":{"62":1}}],["很多同学一定和我一样不知道writing",{"2":{"17":1}}],["上个月还在和上一家公司的同事聊天得知她也被裁掉后",{"2":{"1233":1}}],["上个章节终于找到了vue的定义所在",{"2":{"239":1}}],["上午得知我爸脚受伤时",{"2":{"1232":1}}],["上创建虚拟机",{"2":{"1164":1}}],["上所有项目的唯一",{"2":{"1122":1}}],["上手",{"2":{"734":1}}],["上手吧~",{"2":{"190":1}}],["上层请求真实ip",{"2":{"723":1}}],["上层应用程序只关心ip地址而不关系mac地址",{"2":{"454":1}}],["上传完后发送合并切片请求",{"2":{"772":1}}],["上传切片",{"2":{"772":1}}],["上传前先请求当前文件上传情况",{"2":{"772":1}}],["上传前要先请求服务器判断哪些切片已经上传过了",{"2":{"772":1}}],["上传所有切片",{"2":{"771":1}}],["上传成功",{"2":{"770":1}}],["上传接口",{"2":{"701":1}}],["上传",{"2":{"701":1}}],["上传歌曲或图片",{"0":{"62":1}}],["上下文以外进行绑定",{"2":{"649":1}}],["上下文以外",{"2":{"640":1}}],["上下文中的module",{"2":{"636":1,"640":1}}],["上下文感知存储已经传输过的头部信息",{"2":{"326":1}}],["上述我们知道了eventloop主要是宿主环境实现的如",{"2":{"526":1}}],["上述例子只是刚好父容器的宽度=左盒子宽度+右盒子宽度",{"2":{"111":1}}],["上的一种特殊的超灵活",{"2":{"486":1}}],["上线了",{"2":{"354":1}}],["上次从目标设备获取该mac地址的时间",{"2":{"298":1}}],["上部分我们终于找到了vue打包的入口",{"2":{"238":1}}],["上有很多",{"2":{"181":1}}],["上一步骤我们知道了computed在初始化watcher时并不会立马执行",{"2":{"932":1}}],["上一步已经讲了配置手机代理",{"2":{"422":1}}],["上一节我们从头到尾分析了vue的响应式原理",{"2":{"927":1}}],["上一篇的语法规范中我们使用eslint和typescript来降低代码的错误几率",{"2":{"835":1}}],["上一篇介绍了fiddler抓包工具",{"2":{"411":1}}],["上一个错误或警告位置",{"2":{"161":1}}],["上一行插入",{"2":{"157":1}}],["上代码",{"2":{"131":1}}],["上",{"2":{"97":1}}],["上级id是0",{"2":{"88":1}}],["上图也反映了一个问题",{"2":{"931":1}}],["上图清晰的展示了只有data改变时便会通过dep通知计算watcher进行更新也就会执行计算属性的get函数",{"2":{"931":1}}],["上图简单的画了请求的过程",{"2":{"454":1}}],["上图即添加nginx缓存后",{"2":{"132":1}}],["上图即在使用cdn后的网络加载图",{"2":{"130":1}}],["上图便是进行了prefetch配置后的网络加载图",{"2":{"131":1}}],["上图是js加载网络图",{"2":{"129":1}}],["上图是后来优化后的性能分析一张图",{"2":{"129":1}}],["上图",{"2":{"63":1}}],["上面还提示如果再加入其他master节点可以执行",{"2":{"1214":1}}],["上面列出了alpine和nginx两个镜像",{"2":{"998":1}}],["上面列出的typearray由于固定了格式所以每个索引的格式都是相同的",{"2":{"486":1}}],["上面启动后会新开一个chrome",{"2":{"966":1}}],["上面借用了object",{"2":{"950":1}}],["上面执行这里时",{"2":{"934":1}}],["上面讲了dep会收集渲染watcher",{"2":{"932":1}}],["上面讲了关于monorepo单仓库多包管理方案的优势和必要性",{"2":{"812":1}}],["上面在测试代码时会先引入对应的工具代码",{"2":{"861":1}}],["上面配置好prettier后如果对于不规范的格式并不会触发错误提示",{"2":{"840":1}}],["上面配置好了后就可以启动nest服务了",{"2":{"682":1}}],["上面展示了如何使用",{"2":{"830":1}}],["上面我们尝试着使用proxy简单实现了下vue3的响应式原理和一些函数",{"2":{"964":1}}],["上面我们只说了这里",{"2":{"955":1}}],["上面我们验证了确实无法对数组修改进行拦截",{"2":{"955":1}}],["上面我们也说了vue响应式主要由dep",{"2":{"954":1}}],["上面我们也对commitizen进行了自定义规则",{"2":{"802":1}}],["上面我们说了当前的target为渲染watcher",{"2":{"932":1}}],["上面我们针对每个类型的装饰器分别做了介绍并作了相关的例子实验",{"2":{"233":1}}],["上面主节点优先级最高",{"2":{"728":1}}],["上面使用了tobe也就是等于的意思",{"2":{"859":1}}],["上面使用",{"2":{"649":1}}],["上面给parent添加了静态属性getuuid",{"2":{"583":1}}],["上面给c2添加了属性privateattr属性",{"2":{"581":1}}],["上面已经介绍过原型直接通过链接的方式引用",{"2":{"573":1}}],["上面代码每次都是宏任务会经历10次tick",{"2":{"534":1}}],["上面代码中12",{"2":{"40":1,"546":1}}],["上面演示了下从自己创建的可读流中读取",{"2":{"512":1}}],["上面简单的介绍了tcp头部部分信息",{"2":{"455":1}}],["上面的设置按钮需要有权限才可以看到",{"2":{"1096":1}}],["上面的执行结果如下图",{"2":{"951":1}}],["上面的过滤器我选择了抓取本地接口和端口为9999的数据包",{"2":{"453":1}}],["上面的三次握手只是简单的概述了主要的连接过程",{"2":{"380":1}}],["上面都是要在命令行启动node",{"2":{"401":1}}],["上面两种启动都会在首行断住",{"2":{"399":1}}],["上面仅仅是处理了src图片",{"2":{"246":1}}],["上面可以看出",{"2":{"196":1,"746":1}}],["上面说了",{"2":{"79":1}}],["上面例子中",{"2":{"26":1}}],["方式2",{"2":{"1156":1}}],["方式1",{"2":{"1156":1}}],["方式访问到nginx",{"2":{"1062":1}}],["方式添加原型",{"2":{"572":1}}],["方式给原型添加方法",{"2":{"572":1}}],["方式",{"2":{"343":1,"866":1}}],["方式来使用",{"2":{"217":1}}],["方便以后扩展为多master节点集群",{"2":{"1212":1}}],["方便以后查看",{"2":{"1097":1}}],["方便以后查阅",{"2":{"92":1}}],["方便修改配置",{"2":{"1172":1}}],["方便全局的stages进行调度管理",{"2":{"1126":1}}],["方便了数据的共享和备份",{"2":{"1110":1}}],["方便了应用程序的开发和部署",{"2":{"1017":1}}],["方便数据共享",{"2":{"1110":1}}],["方便数据的管理和迁移",{"2":{"1110":1}}],["方便团队协作和共享",{"2":{"1050":1}}],["方便维护和升级",{"2":{"1050":1}}],["方便参考",{"2":{"857":1}}],["方便自己对node框架方面的延伸扩展",{"2":{"678":1}}],["方便调试",{"2":{"414":1}}],["方便配置使用灵活",{"2":{"404":1}}],["方便操作",{"2":{"182":1}}],["方便我们打包",{"2":{"190":1}}],["方便我们启动devserver",{"2":{"177":1}}],["方便我们调试",{"2":{"177":1}}],["方便后面使用",{"2":{"173":1}}],["方便前端调用验证",{"2":{"61":1}}],["方法即可",{"2":{"954":1}}],["方法或模块",{"2":{"853":1}}],["方法等等都是函数作用域中的变量",{"2":{"589":1}}],["方法等等",{"2":{"570":1}}],["方法往可读流中添加数据",{"2":{"510":1}}],["方法来提高重传的效率",{"2":{"391":1}}],["方法来构建一个代表",{"2":{"119":1}}],["方法发送一个带有特定",{"2":{"337":1}}],["方法时应当注意避免将敏感信息暴露在",{"2":{"320":1}}],["方法是幂等的",{"2":{"320":1}}],["方法是将一个",{"2":{"32":1}}],["方法在非浏览器环境下",{"2":{"238":1}}],["方法名",{"2":{"233":2}}],["方法装饰器可以高阶目标方法",{"2":{"230":1}}],["方法装饰器",{"0":{"230":1},"2":{"231":1}}],["方法返回值的类型",{"2":{"227":1}}],["方法的参数类型",{"2":{"227":1}}],["方法适用于任意节点类型",{"2":{"122":1}}],["方法不修改原数组",{"2":{"30":1}}],["方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象",{"2":{"28":1}}],["方法",{"0":{"117":1,"121":1,"151":1,"153":1,"485":1,"489":1,"496":1,"501":1,"506":1,"900":1,"902":1},"1":{"152":1,"153":1,"901":1,"902":1},"2":{"22":1,"64":1,"233":2,"238":1,"462":1,"648":2,"937":1,"941":1,"954":2}}],["方法创建一个新的函数",{"2":{"5":1}}],["83",{"2":{"1218":1}}],["8rbd8",{"2":{"1217":1}}],["8707677a5773",{"2":{"1039":1,"1046":2}}],["872",{"2":{"383":1}}],["8e1d7573f448",{"2":{"998":1}}],["82行",{"2":{"964":1}}],["8207",{"2":{"462":1}}],["8206",{"2":{"462":1}}],["8205",{"2":{"462":1}}],["8204",{"2":{"462":1}}],["8203",{"2":{"462":1}}],["8s",{"2":{"703":1}}],["8x10308",{"2":{"485":1}}],["8位为一个字节用来表示每个位置上的数字",{"2":{"482":1}}],["8位长度",{"2":{"376":1}}],["8种可能之一",{"2":{"381":1}}],["8登录",{"2":{"379":1}}],["8601",{"2":{"1121":3}}],["86b",{"2":{"1055":1}}],["86",{"2":{"368":1,"728":2,"800":1}}],["8633",{"2":{"56":1}}],["8422",{"2":{"1171":2,"1172":1,"1173":1}}],["8443",{"2":{"727":6}}],["84",{"2":{"368":1,"1218":2}}],["8a2e",{"2":{"366":2}}],["85a3",{"2":{"366":1}}],["8用于环回测试",{"2":{"359":1}}],["8f",{"2":{"298":1}}],["8️⃣",{"2":{"251":1}}],["8ball",{"2":{"251":1}}],["8k",{"2":{"134":1,"717":3}}],["8882",{"2":{"132":1}}],["89",{"2":{"83":1}}],["8999",{"2":{"62":1}}],["8",{"2":{"62":1,"86":2,"96":2,"110":2,"111":1,"112":1,"175":1,"181":1,"190":3,"195":1,"222":1,"342":1,"347":2,"453":1,"454":3,"462":1,"482":1,"485":3,"671":1,"697":1,"708":2,"723":1,"728":2,"729":1,"745":1,"836":1,"1090":2,"1121":25,"1198":1,"1202":3,"1203":1}}],["8010",{"2":{"1094":2}}],["8001",{"2":{"1045":2,"1046":3,"1047":3}}],["8000",{"2":{"1014":1,"1045":1,"1046":3,"1094":2}}],["8081",{"2":{"1045":1,"1094":2,"1096":1,"1102":2,"1103":2,"1107":2,"1108":1}}],["8088访问页面就可以页面了",{"2":{"1074":1}}],["8088访问页面就可以看到静态页面了",{"2":{"1073":1}}],["8088",{"2":{"439":1,"1007":2,"1051":1,"1062":2,"1073":1,"1074":1}}],["8080到nginx容器的80端口",{"2":{"1004":1}}],["8080",{"2":{"177":1,"182":1,"379":2,"406":1,"878":1,"1004":1,"1018":2,"1020":1,"1022":1,"1055":1,"1121":2}}],["80端口",{"2":{"382":1,"1062":1}}],["80ms",{"2":{"325":1}}],["80",{"2":{"61":2,"128":1,"382":3,"383":2,"454":1,"709":1,"710":1,"726":1,"830":1,"1004":1,"1006":1,"1018":2,"1020":1,"1022":1,"1034":3,"1051":2,"1055":1,"1062":4,"1073":1,"1171":4,"1172":2,"1173":2,"1177":1}}],["宽度",{"2":{"61":1}}],["宽高不固定",{"2":{"22":1}}],["宽高固定",{"2":{"22":1}}],["噪声线条数",{"2":{"61":1}}],["字面量定义的对象为什么符合这样的逻辑",{"2":{"573":1}}],["字节",{"2":{"1121":3}}],["字节长度",{"2":{"488":1}}],["字节顺序标记",{"2":{"462":1}}],["字体",{"2":{"284":1}}],["字体大小",{"2":{"61":1}}],["字",{"2":{"139":8,"888":8}}],["字母",{"2":{"139":1,"888":1}}],["字符二进制通常用来处理比较大的数据字符流",{"2":{"492":1}}],["字符二进制流",{"0":{"492":1}}],["字符二进制",{"0":{"491":1}}],["字符集合范围",{"0":{"144":1,"893":1}}],["字符跟随两种情况",{"2":{"139":1,"888":1}}],["字符跟随和有",{"2":{"139":1,"888":1}}],["字符跟随的位置或者前面跟其他",{"2":{"139":1,"888":1}}],["字符紧跟着",{"2":{"139":1,"888":1}}],["字符",{"2":{"139":3,"140":1,"830":1,"888":3,"889":1}}],["字符的位置",{"2":{"139":1,"888":1}}],["字符类是个特殊的字符",{"2":{"139":1,"888":1}}],["字符类",{"0":{"139":1,"888":1},"1":{"140":1,"889":1}}],["字符串时回调函数会从this上拿",{"2":{"937":1}}],["字符串等等",{"2":{"453":1}}],["字符串替换指定的内容",{"2":{"154":1,"903":1}}],["字符串最后一个字符为非",{"2":{"139":1,"888":1}}],["字符串第一个字符为非",{"2":{"139":1,"888":1}}],["字符串函数",{"2":{"83":1}}],["字符串",{"2":{"2":1,"32":2,"937":1,"938":1}}],["字段中",{"2":{"1018":1}}],["字段用于定义多个",{"2":{"1018":1}}],["字段指定了",{"2":{"1018":1}}],["字段显示为",{"2":{"1002":1}}],["字段决定是否跳过缓存",{"2":{"721":1}}],["字段长为16位",{"2":{"376":1}}],["字段长4位",{"2":{"376":1}}],["字段值",{"2":{"354":1}}],["字段值生成的随机字符串",{"2":{"354":1}}],["字段和握手阶段",{"2":{"334":1}}],["字段",{"2":{"85":1,"729":3}}],["字段别名",{"2":{"82":1}}],["字段名",{"2":{"78":3,"80":2,"81":3,"82":2,"83":2,"84":2,"685":1}}],["$mainpid",{"2":{"1208":1}}],["$mount",{"2":{"201":1,"238":3,"239":1,"751":1,"954":5}}],["$rspec",{"2":{"1143":1}}],["$redirect",{"2":{"715":1}}],["$releasever",{"2":{"707":2}}],["$request",{"2":{"339":1,"709":1,"724":1,"729":6,"1034":1}}],["$remote",{"2":{"128":1,"339":1,"709":2,"723":2,"724":1,"729":3,"1034":1}}],["$refs",{"2":{"61":1}}],["$name",{"2":{"1128":1}}],["$nginx",{"2":{"729":1}}],["$k1",{"2":{"1055":1}}],["$keepalived",{"2":{"728":1}}],["$version",{"2":{"1054":1}}],["$vnode",{"2":{"238":2}}],["$domain",{"2":{"1128":1,"1136":1,"1137":1}}],["$document",{"2":{"729":2}}],["$desc",{"2":{"1051":1}}],["$watch是实现侦听函数的核心",{"2":{"938":1}}],["$watch",{"0":{"938":1},"2":{"937":2,"938":4,"939":1,"940":2,"941":1}}],["$width",{"2":{"718":3}}],["$0",{"2":{"805":1,"806":1}}],["$$scheme",{"2":{"729":1}}],["$query",{"2":{"729":1}}],["$limit",{"2":{"729":1}}],["$uri",{"2":{"729":3}}],["$userdomain",{"2":{"726":8,"1178":8}}],["$ci",{"2":{"1121":3,"1136":4,"1139":1}}],["$cookie",{"2":{"729":1}}],["$content",{"2":{"729":2}}],["$confirm",{"2":{"726":2,"1178":2}}],["$custom",{"2":{"726":1,"1178":1}}],["$a",{"2":{"728":1}}],["$args",{"2":{"729":3}}],["$arg",{"2":{"718":2}}],["$apr1$fvo5arnb$nsrzq8e",{"2":{"713":1}}],["$binary",{"2":{"729":1}}],["$body",{"2":{"709":1,"729":1}}],["$basearch",{"2":{"707":2,"1210":1}}],["$time",{"2":{"709":1}}],["$typeerror",{"2":{"40":3,"546":3}}],["$proxy",{"2":{"339":1,"723":1,"724":1,"1034":1}}],["$schema",{"2":{"814":1,"817":1,"818":1}}],["$scheme$proxy",{"2":{"721":1}}],["$scheme",{"2":{"339":1,"723":1,"724":1,"726":1,"729":1}}],["$set",{"2":{"956":1}}],["$set原理",{"0":{"956":1}}],["$sent",{"2":{"729":1}}],["$server",{"2":{"726":2,"729":4}}],["$ssl",{"2":{"726":1}}],["$ssrcontext",{"2":{"238":1}}],["$status",{"2":{"709":1}}],["$slots",{"2":{"201":1,"751":1}}],["$el",{"2":{"201":3,"751":3,"954":1}}],["$emit",{"2":{"195":4,"745":4}}],["$is",{"2":{"729":1}}],["$isserver",{"2":{"201":1,"238":1,"751":1}}],["$invalid",{"2":{"132":1,"353":1,"722":1}}],["$options",{"2":{"239":3,"932":1,"937":1,"954":3}}],["$off参数支持多种情况",{"2":{"200":1,"750":1}}],["$off",{"2":{"195":4,"745":4}}],["$once",{"2":{"195":2,"745":2}}],["$on",{"2":{"195":5,"745":5}}],["$2",{"2":{"145":2,"894":2}}],["$50",{"2":{"149":1,"154":1,"898":1,"903":1}}],["$5",{"2":{"139":1,"888":1}}],["$操作符",{"2":{"138":1,"887":1}}],["$home",{"2":{"1214":6}}],["$hostname",{"2":{"729":1}}],["$host",{"2":{"128":1,"132":2,"339":1,"724":1,"729":1}}],["$http",{"2":{"128":1,"339":2,"709":3,"721":1,"723":2,"724":2,"729":2,"1034":2}}],["$",{"2":{"62":2,"132":2,"145":3,"149":2,"154":3,"180":1,"181":1,"190":3,"195":1,"218":2,"230":1,"232":4,"244":2,"249":1,"354":3,"401":1,"404":2,"405":1,"406":2,"455":1,"520":3,"521":1,"580":2,"582":3,"583":3,"634":3,"688":1,"697":1,"715":2,"716":1,"717":1,"720":2,"722":1,"745":1,"771":1,"800":1,"801":1,"805":2,"806":1,"857":1,"858":3,"894":3,"898":2,"903":3,"929":4,"930":2,"931":2,"932":2,"938":1,"941":1,"950":2,"951":7,"955":2,"958":3,"959":6,"960":6,"963":3,"966":1,"1000":1,"1024":3,"1187":1,"1190":2,"1214":4}}],["$1>",{"2":{"154":1,"903":1}}],["$1script",{"2":{"145":1,"894":1}}],["$1",{"2":{"60":4,"145":6,"154":3,"857":1,"862":1,"894":6,"903":3}}],["毫秒数",{"2":{"500":1}}],["毫秒",{"2":{"60":1}}],["季度",{"2":{"60":1}}],["q9lpt",{"2":{"1217":1}}],["qps",{"2":{"1212":1}}],["qa",{"2":{"1000":1}}],["qaaaabbbb11q",{"2":{"145":1,"894":1}}],["qaabbccddq",{"2":{"145":1,"894":1}}],["qlen",{"2":{"728":3,"1090":2}}],["qdisc",{"2":{"728":3,"1085":1,"1090":4}}],["q043=",{"2":{"727":1}}],["q046=",{"2":{"727":1}}],["q050=",{"2":{"727":1}}],["q",{"2":{"383":2,"998":1,"1006":1}}],["qos",{"2":{"366":1}}],["q=$",{"2":{"1034":1}}],["q=0",{"2":{"347":5}}],["q=ordinarytoprimitive",{"2":{"49":1,"555":1}}],["qetvahuymmve97quvzif9el6tqm",{"2":{"342":1}}],["qq",{"2":{"132":1,"1064":4}}],["quiet",{"2":{"1202":1}}],["quiche配置nginx",{"2":{"727":1}}],["quic官方配置",{"2":{"727":1}}],["quic官方配置或quiche配置nginx",{"2":{"727":1}}],["quic=",{"2":{"727":1}}],["quic",{"2":{"727":4}}],["quic使用其功能",{"2":{"727":1}}],["quic使用tls",{"2":{"727":1}}],["quic还支持源地址验证和连接迁移等功能",{"2":{"727":1}}],["quic还支持基于连接的流量控制",{"2":{"727":1}}],["quic还支持优先级",{"2":{"727":1}}],["quic采用基于tcp的拥塞控制算法",{"2":{"727":1}}],["quic等等",{"2":{"312":1}}],["quit",{"2":{"708":1}}],["qualified",{"2":{"726":1,"1178":1}}],["quality",{"2":{"367":1,"718":2}}],["quarter",{"2":{"83":2,"251":4}}],["queuejob",{"2":{"944":1}}],["queuepostrendereffect",{"2":{"944":2}}],["queuewatcher",{"2":{"938":1,"942":1,"954":3}}],["queues",{"2":{"541":1}}],["queue后就会进行视图的更新",{"2":{"534":1}}],["queue调度下一个task也就是settimeout",{"2":{"533":1}}],["queue就剩下一个settimeout任务了",{"2":{"532":1}}],["queue中的macrotask按顺序排列",{"2":{"532":1}}],["queue",{"2":{"532":1,"533":1,"771":4}}],["queue有相关约定",{"2":{"532":1}}],["queuemicrotask",{"2":{"98":4,"532":1}}],["queuingstrategy",{"2":{"510":2,"514":2}}],["questions",{"2":{"857":1}}],["question",{"2":{"251":2}}],["query等等",{"2":{"685":1}}],["query",{"2":{"238":1,"453":1,"455":1,"613":6,"614":1,"642":3,"645":1,"646":4,"674":1,"683":3,"684":2,"686":6,"954":2,"1074":2}}],["queryselectorall",{"2":{"404":1}}],["queryselector",{"2":{"197":2,"338":1,"352":1,"354":3,"404":3,"497":1,"534":1,"724":1,"747":2,"1034":2}}],["quot",{"0":{"468":2},"2":{"139":30,"494":4,"499":2,"704":2,"718":12,"720":4,"726":4,"830":6,"888":30,"1209":2,"1232":4}}],["quotes",{"2":{"830":2,"847":1}}],["quote",{"2":{"83":1}}],["q+",{"2":{"60":1}}],["秒",{"2":{"60":1,"721":1}}],["分支",{"2":{"1142":1}}],["分支切换等操作",{"2":{"785":1}}],["分发和管理",{"2":{"1011":1}}],["分布式条件类型",{"2":{"918":1}}],["分组以及测试覆盖率",{"2":{"860":1}}],["分组1",{"2":{"859":1,"860":1,"864":2}}],["分组查询",{"0":{"84":1}}],["分片大小",{"2":{"768":1}}],["分片上传",{"2":{"764":1}}],["分片偏移",{"2":{"367":1}}],["分钟",{"2":{"721":2}}],["分代式垃圾回收",{"2":{"559":1}}],["分代式回收",{"0":{"559":1},"1":{"560":1,"561":1}}],["分配速度慢",{"2":{"558":1}}],["分段传输",{"0":{"386":1}}],["分包组装等等",{"2":{"377":1}}],["分隔",{"2":{"350":1,"1024":1}}],["分块传输编码",{"2":{"321":1,"322":1}}],["分层",{"2":{"279":1}}],["分析",{"0":{"740":1}}],["分析请求数据",{"2":{"428":1}}],["分析2",{"2":{"242":1}}],["分析1",{"2":{"242":1}}],["分析逗号分隔的list列表",{"2":{"83":1}}],["分屏显示",{"2":{"164":1}}],["分屏查看具体声明内容",{"2":{"160":1}}],["分别创建组",{"2":{"1182":1}}],["分别创建一个男模特和一个女模特对象",{"2":{"204":1,"754":1}}],["分别使用dockerfile",{"2":{"1034":1}}],["分别表示端点在",{"2":{"462":1}}],["分别实现了对图片状态的管理",{"2":{"250":1}}],["分别经过缴纳500元定金和200元定金的两轮预定后",{"2":{"205":1,"755":1}}],["分别是",{"2":{"140":1,"889":1}}],["分别指定node和npm的mirror",{"2":{"97":1}}],["分割的代码也会变小",{"2":{"130":1}}],["分数等数据的计算",{"2":{"83":1}}],["分页",{"0":{"90":1},"2":{"90":1}}],["分页就是这么简单",{"2":{"63":1}}],["分页组件信息",{"2":{"63":1}}],["分",{"2":{"60":1}}],["日期时间",{"2":{"1121":2}}],["日期和时间函数",{"2":{"83":1}}],["日拱一卒",{"0":{"252":1}}],["日志存放路径等",{"2":{"709":1}}],["日志格式",{"2":{"709":1}}],["日志路径",{"2":{"708":1}}],["日志",{"2":{"670":1,"690":1,"1121":1,"1179":1}}],["日志收集",{"2":{"230":1,"668":1}}],["日志收集等等爽到不能再爽的功能",{"2":{"126":1}}],["日志打印",{"2":{"225":1}}],["日",{"2":{"60":1}}],["技术能够将多个文件系统合并成为一个虚拟的文件系统",{"2":{"997":1}}],["技术来实现镜像层之间的共享和复用",{"2":{"997":1}}],["技术掺和一起臃肿且很有可能产生潜在莫名bug且定位困难",{"2":{"786":1}}],["技术攻关",{"0":{"59":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1}}],["技术栈",{"0":{"52":1}}],["ydmfotouq0rqq==",{"2":{"1189":1}}],["yrzr",{"2":{"1171":3,"1172":1,"1173":1}}],["yml>",{"2":{"1142":1}}],["yml",{"2":{"1121":1,"1142":6,"1190":1}}],["yml文件设置的",{"2":{"1123":1}}],["yml文件来检测并执行流水线的",{"2":{"1123":1}}],["yml文件",{"2":{"1118":1}}],["yml或在package",{"2":{"827":1}}],["yml配置文件",{"2":{"1034":1}}],["yml配置",{"2":{"703":1}}],["y2",{"2":{"285":1}}],["y1",{"2":{"285":1}}],["yes",{"2":{"726":3,"857":3,"1178":3}}],["yen",{"2":{"251":1}}],["yellow",{"2":{"251":1}}],["years",{"2":{"998":2,"1002":2,"1012":1}}],["year",{"2":{"83":2}}],["yum",{"2":{"251":1,"707":2,"718":1,"1082":6,"1093":6,"1125":1,"1209":1,"1210":6}}],["yslow",{"2":{"221":2}}],["yamlapiversion",{"2":{"1212":1}}],["yamldefault",{"2":{"1148":1}}],["yamldepoly",{"2":{"1147":1}}],["yamldepends",{"2":{"1023":1}}],["yamlimage",{"2":{"1145":1,"1146":1}}],["yamlbuild",{"2":{"1139":1}}],["yamlcache",{"2":{"1138":1}}],["yamljob",{"2":{"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1}}],["yamljob1",{"2":{"1124":1,"1129":1}}],["yamlvariables",{"2":{"1128":1,"1136":1,"1137":1}}],["yamlversion",{"2":{"1018":1,"1020":1,"1023":1,"1024":2,"1025":1,"1034":1,"1173":1}}],["yamltest",{"2":{"1127":1}}],["yamlstages",{"2":{"1119":1,"1125":1,"1141":1}}],["yamlservices",{"2":{"1020":1}}],["yamlrestart",{"2":{"1025":1}}],["yamlenvironment",{"2":{"1024":1}}],["yaml",{"2":{"1017":1,"1018":1,"1021":1,"1022":1,"1124":1,"1125":1,"1126":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1,"1141":1,"1142":2,"1143":2,"1144":1,"1145":1,"1147":1,"1148":1,"1149":1,"1190":1,"1212":1,"1213":1,"1214":2,"1217":6}}],["yamlpackages",{"2":{"815":1}}],["yaml文件使用yaml语法定义所有的子包",{"2":{"815":1}}],["yamlnginx",{"2":{"128":1}}],["yamlyarn",{"2":{"126":1}}],["yarn",{"0":{"814":1},"2":{"126":1,"632":1,"658":2,"671":1,"672":1,"680":1,"696":1,"697":1,"703":6,"799":2,"800":1,"801":2,"802":1,"804":1,"805":4,"814":4,"1138":2,"1192":1}}],["y是结果的小数位数",{"2":{"83":1}}],["y个字符长的子串替换为字符串instr",{"2":{"83":1}}],["y的模",{"2":{"83":1}}],["y",{"2":{"83":12,"138":3,"147":2,"148":2,"149":2,"173":1,"195":4,"233":3,"283":2,"284":2,"285":1,"404":2,"529":2,"707":1,"713":1,"718":1,"728":1,"745":4,"814":1,"887":3,"896":2,"897":2,"898":2,"1056":1,"1065":1,"1074":1,"1082":1,"1093":1,"1102":3,"1183":4,"1184":1,"1198":1,"1204":1,"1206":1,"1209":1,"1211":1}}],["yourself",{"2":{"1103":1}}],["your",{"2":{"726":1,"857":2,"1014":1,"1021":1,"1045":1,"1098":1,"1178":1,"1187":6,"1214":1}}],["youtu",{"2":{"350":1}}],["youtube",{"2":{"49":1,"350":2,"541":1,"555":1,"568":1}}],["you",{"2":{"64":1,"800":2,"857":3,"1014":1,"1098":3,"1103":3,"1107":1,"1184":1,"1191":1,"1214":7,"1223":1,"1225":2,"1227":4}}],["y+",{"2":{"60":1}}],["yyyymmddhhmmss",{"2":{"62":1}}],["yyyy",{"2":{"57":1,"60":2,"190":1,"1074":1}}],["邮箱被占用",{"2":{"57":1}}],["进去后将上面修改的selinux",{"2":{"1202":1}}],["进去后由于是初次使用cypress会引导对项目做初始化配置",{"2":{"877":1}}],["进而实现合理依赖收集的过程",{"2":{"968":1}}],["进栈",{"2":{"954":1}}],["进来后就到了测试用例界面",{"2":{"877":1}}],["进度包含总进度",{"2":{"775":1}}],["进度条等等",{"2":{"775":1}}],["进程的连接数",{"2":{"709":1}}],["进程数位0时",{"2":{"728":1}}],["进程数",{"2":{"709":1}}],["进程",{"2":{"383":1,"709":1}}],["进一步提高了web性能",{"2":{"323":1}}],["进入gitlab容器中",{"2":{"1174":1}}],["进入创建仓库配置页面",{"2":{"1098":1}}],["进入容器中",{"2":{"1179":1}}],["进入容器查看admin密码",{"2":{"1095":1}}],["进入容器",{"0":{"1005":1},"2":{"1179":1}}],["进入downloadtab页",{"2":{"412":1}}],["进入calico",{"2":{"1218":1}}],["进入charles的官网https",{"2":{"412":1}}],["进入closed",{"2":{"382":1}}],["进入last",{"2":{"382":1}}],["进入fin",{"2":{"382":1}}],["进入页面会自动请求http",{"2":{"352":1}}],["进入",{"2":{"165":1,"1156":1}}],["进入ktv",{"2":{"56":2}}],["进阶",{"0":{"160":1}}],["进行映射",{"2":{"1176":1}}],["进行runner的安装和注册",{"2":{"1150":1}}],["进行的",{"2":{"1069":1}}],["进行的是浅拷贝",{"2":{"28":1}}],["进行镜像的下载",{"2":{"1046":1}}],["进行特殊处理",{"2":{"965":1}}],["进行响应式数据的劫持和侦听",{"2":{"965":1}}],["进行vip的转移",{"2":{"728":1}}],["进行装饰",{"2":{"606":1}}],["进行内存的回收",{"2":{"595":1}}],["进行垃圾回收并释放掉相关的资源",{"2":{"592":1}}],["进行操作原型",{"2":{"571":1}}],["进行获取",{"2":{"570":1}}],["进行清除",{"2":{"559":1}}],["进行网络请求",{"2":{"526":1}}],["进行网络资源请求",{"2":{"526":1}}],["进行解析执行js",{"2":{"526":1}}],["进行解释",{"2":{"525":1}}],["进行讲解",{"2":{"477":1}}],["进行属性的进一步过滤",{"2":{"453":1}}],["进行修改",{"2":{"407":1}}],["进行实时通讯吧",{"2":{"354":1}}],["进行数据帧的传输和接收",{"2":{"309":1}}],["进行数据包的传输和路由选择",{"2":{"309":1}}],["进行模块划分",{"2":{"308":1}}],["进行模拟访问",{"2":{"220":1}}],["进行图片加载",{"2":{"247":1}}],["进行差值计算",{"2":{"247":1}}],["进行config改造",{"2":{"237":1}}],["进行getconfig加工",{"2":{"237":1}}],["进行配置构建",{"2":{"237":1}}],["进行构建的",{"2":{"237":1}}],["进行测试",{"2":{"220":1}}],["进行监控打包",{"2":{"188":1}}],["进行错误解析",{"2":{"183":1}}],["进行分割",{"2":{"154":1,"903":1}}],["进行反向代理",{"2":{"128":1}}],["进行身份鉴权等问题",{"2":{"126":1}}],["进行拆箱变成0",{"2":{"48":1,"554":1}}],["进行算术相加",{"2":{"44":1,"550":1}}],["进行字符串的拼接",{"2":{"44":2,"550":2}}],["请替换成",{"2":{"1212":1}}],["请悉知本人安装环境",{"2":{"1171":1}}],["请你阅前了解",{"2":{"1092":1}}],["请耐心等待",{"2":{"948":1}}],["请根据自己实际情况配置机器网络",{"2":{"1200":1}}],["请根据版本可以选择jsdom或jest",{"2":{"864":1}}],["请根据具体场景调整",{"2":{"667":1}}],["请简要描述提交信息",{"2":{"801":1}}],["请选择文件修改范围",{"2":{"801":1}}],["请选择提交类型",{"2":{"801":2}}],["请查看",{"2":{"729":1}}],["请查看相关文档",{"2":{"651":1}}],["请填写待写入host的域名",{"2":{"726":1,"1178":1}}],["请输入要关闭的issue",{"2":{"801":1}}],["请输入详细描述",{"2":{"801":1}}],["请输入域名",{"2":{"726":1,"1178":1}}],["请输入用户名和密码",{"2":{"713":1}}],["请使用sudo运行以获取系统权限",{"2":{"726":1,"1178":1}}],["请使用report",{"2":{"350":1}}],["请确保节点的主机名",{"2":{"1195":1}}],["请确保runner版本和gitlab版本兼容以及docker相关版本兼容问题",{"2":{"1150":1}}],["请确保nginx可以正常访问",{"2":{"728":1}}],["请确保已安装",{"2":{"725":1}}],["请确保相关的参数装饰器用到了此类型",{"2":{"685":1}}],["请按照提示安装上相关的依赖即可解决",{"2":{"718":1}}],["请参考我的",{"2":{"1208":1}}],["请参考htpasswd",{"2":{"713":1}}],["请参考mdn",{"2":{"489":1}}],["请先根据自己的需求合理升级后再使用",{"2":{"1181":1}}],["请先阅读",{"2":{"665":1}}],["请先了解vue插件注册机制和自定义指令",{"2":{"241":1}}],["请阅读我的",{"2":{"522":1}}],["请访问",{"2":{"400":1}}],["请在github给我点个star",{"2":{"252":1}}],["请联系本人",{"2":{"252":1,"271":1,"991":1,"1226":1}}],["请联系管理员",{"2":{"64":1}}],["请求其停止运行",{"2":{"1008":1}}],["请求数也会限制在10个以内",{"2":{"771":1}}],["请求过程",{"2":{"770":1}}],["请求使用的协议",{"2":{"729":1}}],["请求到达服务器的端口号",{"2":{"729":1}}],["请求生成",{"2":{"729":1}}],["请求时会对query的数据进行验证",{"2":{"646":1}}],["请求时携带给后端",{"2":{"353":1}}],["请求时携带第三方",{"2":{"353":1}}],["请求对象",{"0":{"614":1}}],["请求瞬间",{"2":{"606":1}}],["请求资源",{"2":{"521":1}}],["请求返回的响应体可以暴露为",{"2":{"508":1}}],["请求便会发送出去",{"2":{"436":1}}],["请求代理等等",{"2":{"436":1}}],["请求代理与篡改可以参考菜单栏tools中的map",{"2":{"418":1}}],["请求代理与篡改",{"0":{"418":1}}],["请求地址中包含xxx时",{"2":{"434":1}}],["请求来源",{"2":{"432":1}}],["请求响应打断点",{"2":{"430":1}}],["请求rewrite",{"2":{"414":1}}],["请求拦截代理",{"2":{"414":1}}],["请求顺序",{"2":{"414":1}}],["请求主体",{"2":{"413":1}}],["请求详情来显示当前请求的具体信息",{"2":{"413":1}}],["请求详情",{"2":{"413":1}}],["请求相同",{"2":{"354":1}}],["请求的队列",{"2":{"380":1}}],["请求的格式与普通的",{"2":{"354":1}}],["请求的资源不存在",{"2":{"317":1}}],["请求的资源已经临时转移到新的url",{"2":{"317":2}}],["请求的资源已经被永久转移到新的url",{"2":{"317":1}}],["请求也携带了小明cookie",{"2":{"352":1}}],["请求中的当前",{"2":{"729":1}}],["请求中的内容转为小写",{"2":{"729":1}}],["请求中的主机头",{"2":{"729":1}}],["请求中的参数",{"2":{"729":1}}],["请求中的任何自定义",{"2":{"337":1}}],["请求中变量名",{"2":{"729":1}}],["请求中没有使用",{"2":{"337":1}}],["请求中使用",{"2":{"320":1}}],["请求头中的内容",{"2":{"729":1}}],["请求头中的",{"2":{"729":2}}],["请求头中指定传输编码",{"2":{"343":1}}],["请求头中指定消息体的长度",{"2":{"341":1}}],["请求头的user",{"2":{"717":1}}],["请求头",{"2":{"413":1}}],["请求头和响应头",{"2":{"321":1}}],["请求头部包括若干个字段和值",{"2":{"318":1}}],["请求头部和请求正文组成",{"2":{"318":1}}],["请求可以用于请求服务器返回资源的部分内容",{"2":{"344":1}}],["请求可以用于更新资源的一部分",{"2":{"320":1}}],["请求可能会导致服务器的状态发生变化",{"2":{"320":1}}],["请求用于删除服务器上的资源",{"2":{"320":1}}],["请求通常用于上传文件或者更新资源",{"2":{"320":1}}],["请求通常包含用户输入的敏感数据",{"2":{"320":1}}],["请求",{"2":{"320":1}}],["请求是幂等的",{"2":{"320":1}}],["请求常用于提交表单数据",{"2":{"320":1}}],["请求常用于获取资源的元信息",{"2":{"320":1}}],["请求类似",{"2":{"320":1}}],["请求应该只用于获取资源",{"2":{"320":1}}],["请求方法等多个维度来设置",{"2":{"414":1}}],["请求方法",{"0":{"320":1},"2":{"339":1,"724":1}}],["请求首部字段",{"2":{"319":1}}],["请求首部和响应首部三类",{"2":{"319":1}}],["请求报文",{"2":{"318":1}}],["请求报文由请求行",{"2":{"318":1}}],["请求正文可选",{"2":{"318":1}}],["请求uri和http协议版本",{"2":{"318":1}}],["请求次数超过了限制",{"2":{"317":1}}],["请求与服务器上的资源发生冲突",{"2":{"317":1}}],["请求超时",{"2":{"317":1}}],["请求被拒绝",{"2":{"317":1}}],["请求未经授权",{"2":{"317":1}}],["请求格式错误",{"2":{"317":1}}],["请求成功",{"2":{"317":1,"453":1}}],["请求已经被接受",{"2":{"317":1}}],["请求已经成功",{"2":{"317":3}}],["请求网关的mac地址",{"2":{"302":1}}],["请求服务器将自己的mac地址转换为ip地址",{"2":{"301":1}}],["请求图片",{"2":{"246":1}}],["请求在这些对象之间依次传递",{"2":{"205":1,"755":1}}],["请记住这两点",{"2":{"179":1}}],["请移步html",{"2":{"176":1}}],["请移步官网查询更多详细配置",{"2":{"170":1}}],["请忽略时间",{"2":{"129":1}}],["请用管理员方式安装",{"2":{"93":1}}],["请注意保存",{"2":{"68":1}}],["请自行查阅相关文档",{"2":{"526":1}}],["请自行修改secret",{"2":{"56":1}}],["请自行下载",{"2":{"56":1}}],["请让变量a满足以下条件",{"2":{"48":1,"554":1}}],["项目实战等等",{"2":{"1223":1}}],["项目级别",{"2":{"1186":1}}],["项目作为依赖",{"0":{"1184":1}}],["项目外部授权分类标记",{"2":{"1121":1}}],["项目可见性",{"2":{"1121":1}}],["项目的",{"2":{"1121":2}}],["项目的复杂度增长",{"2":{"809":1}}],["项目目录的名称",{"2":{"1121":1}}],["项目默认分支的名称",{"2":{"1121":1}}],["项目为其构建的提交修订",{"2":{"1121":1}}],["项目安装",{"0":{"844":1}}],["项目中移除",{"2":{"1207":1,"1208":1}}],["项目中可能会使用jest进行单元测试",{"2":{"882":1}}],["项目中根路径下新建",{"2":{"836":1}}],["项目中引入",{"2":{"810":1}}],["项目",{"2":{"829":1,"1158":1,"1182":1}}],["项目语法规范在大型项目以及团队成员之间的协作中发挥着非常重要的作用",{"2":{"823":1}}],["项目多种技术不针对大型复杂项目如",{"2":{"786":1}}],["项目集成之提交规范",{"0":{"787":1},"1":{"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"795":1,"796":1,"797":1,"798":1,"799":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1}}],["项目集成之编辑器",{"0":{"785":1}}],["项目集成之编辑器选择",{"2":{"783":1}}],["项目集成之自动化",{"2":{"783":1}}],["项目集成之调试技巧",{"2":{"783":1}}],["项目集成之发布规范",{"2":{"783":1}}],["项目集成之代码测试",{"2":{"783":1}}],["项目集成之monorepo",{"0":{"808":1},"1":{"809":1,"810":1,"811":1,"812":1,"813":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1},"2":{"783":1}}],["项目集成之git",{"2":{"783":1}}],["项目集成之风格指南",{"0":{"835":1},"1":{"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"850":1},"2":{"783":1}}],["项目集成之语法规范",{"0":{"823":1},"1":{"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1},"2":{"783":1}}],["项目集成之打包工具",{"0":{"784":1},"2":{"783":1}}],["项目集成之框架选型",{"0":{"786":1},"2":{"783":1}}],["项目集成",{"0":{"782":1},"1":{"783":1}}],["项目和相对文件配置",{"0":{"268":1}}],["项目模板已经集成好了",{"2":{"125":1}}],["项目启动成功",{"2":{"56":1}}],["项目启动介绍",{"0":{"55":1},"1":{"56":1,"57":1,"58":1}}],["项目设计结构",{"0":{"54":1}}],["热部署等功能",{"2":{"705":1}}],["热门的框架",{"2":{"271":1}}],["热门歌曲等等",{"2":{"53":1}}],["热重启",{"2":{"126":1}}],["热播歌曲",{"2":{"54":1}}],["验证节点与k8s核心service互通",{"2":{"1218":1}}],["验证私库",{"0":{"1107":1}}],["验证npm包",{"0":{"1103":1}}],["验证单个代码单元的行为",{"2":{"853":1}}],["验证的用户名",{"2":{"729":1}}],["验证配置",{"2":{"628":1}}],["验证来源站点referer",{"2":{"353":1}}],["验证通过后",{"2":{"333":2}}],["验证证书",{"2":{"332":1}}],["验证参数",{"2":{"232":1}}],["验证码",{"0":{"61":1},"2":{"353":1}}],["验证账户合法性",{"2":{"54":1}}],["验证token是否合法",{"2":{"54":1}}],["开机自启",{"2":{"1209":1}}],["开源的http和反向代理服务器",{"2":{"704":1}}],["开关fiddler捕获抓包等功能",{"2":{"430":1}}],["开关抓包",{"2":{"415":1}}],["开关记录",{"2":{"413":1}}],["开头",{"2":{"792":1}}],["开头的作业不会被执行",{"2":{"1124":1}}],["开头的的对应到",{"2":{"857":1}}],["开头的path",{"2":{"711":1}}],["开头的",{"2":{"676":1}}],["开头和非点开头",{"2":{"261":1}}],["开头是固定内容",{"2":{"85":1}}],["开启selinux会提高系统的安全性",{"2":{"1202":1}}],["开启syn",{"2":{"381":1}}],["开启机器上的某些端口",{"2":{"1195":1}}],["开启https",{"0":{"1177":1}}],["开启覆盖率",{"0":{"873":1}}],["开启",{"2":{"727":1}}],["开启gzip",{"2":{"717":1}}],["开启资源列表目录",{"2":{"712":1}}],["开启断点调试的条件",{"2":{"419":1}}],["开启弱网",{"2":{"413":1}}],["开启后你就不用再手动进行打包了",{"2":{"188":1}}],["开启完整的",{"2":{"138":1,"887":1}}],["开发和维护的",{"2":{"855":1}}],["开发人员可以在同一个代码库中共享问题和解决方案",{"2":{"811":1}}],["开发人员需要根据不同场景",{"2":{"810":1}}],["开发者可以通过",{"2":{"1012":1}}],["开发者需要修改提交信息以满足规则要求",{"2":{"795":1}}],["开发者无需过度关注配置",{"2":{"784":1}}],["开发好的项目上线后",{"2":{"408":1}}],["开发而来",{"2":{"329":1}}],["开发环境下的配置",{"2":{"190":1}}],["开发环境下使用",{"2":{"183":1}}],["开发环境",{"2":{"177":1,"182":1,"190":1}}],["开发文件夹",{"2":{"54":2}}],["开箱即用",{"2":{"125":2}}],["开始作业的用户的用户名",{"2":{"1121":1}}],["开始作业的用户的电子邮件",{"2":{"1121":1}}],["开始读取",{"2":{"510":1}}],["开始新的路径",{"2":{"283":1}}],["开始构建的",{"2":{"236":1}}],["开始渲染百度地图",{"2":{"206":2,"756":2}}],["开始渲染谷歌地图",{"2":{"206":2,"756":2}}],["开始校验",{"2":{"197":1,"747":1}}],["开始",{"2":{"165":1}}],["开始朝着我不",{"2":{"123":1}}],["开始位置",{"2":{"90":1}}],["开始可以使用类数组对象",{"2":{"2":1}}],["歌曲海报上传目标文件夹",{"2":{"54":1}}],["歌曲上传目标文件夹",{"2":{"54":1}}],["封装一些事件",{"2":{"200":1,"750":1}}],["封装歌曲方法uploadmusic",{"2":{"62":1}}],["封装上一首歌曲方法",{"2":{"54":1}}],["封装上传音乐方法",{"2":{"62":1}}],["封装上传歌曲方法",{"2":{"54":1}}],["封装上传图片方法",{"2":{"54":1}}],["封装下一首歌曲方法",{"2":{"54":1}}],["封装选取歌曲方法",{"2":{"54":1}}],["封装随机开户方法",{"2":{"54":1}}],["封装账户是否合法",{"2":{"54":1}}],["封装闲置删除闲置资源方法",{"2":{"54":1}}],["配置镜像加速地址",{"2":{"1212":1}}],["配置ip转发模式",{"2":{"1212":1}}],["配置pod网段",{"2":{"1212":2}}],["配置pm2",{"2":{"703":1}}],["配置国内镜像",{"2":{"1212":1}}],["配置面板controlplaneendpoint对应的master的地址",{"2":{"1212":1}}],["配置面板",{"2":{"1212":1}}],["配置api服务器地址",{"2":{"1212":2}}],["配置aliyun镜像",{"2":{"1209":1}}],["配置kube",{"2":{"1212":1}}],["配置k8s国内源",{"0":{"1210":1}}],["配置keepalived",{"2":{"728":1}}],["配置完后重启containerd",{"2":{"1209":1}}],["配置完后保存退出后执行👇",{"2":{"128":1}}],["配置防火墙",{"0":{"1201":1}}],["配置cluster",{"2":{"1200":1}}],["配置cypress的单测baseurl",{"2":{"879":1}}],["配置要求",{"0":{"1195":1}}],["配置要并行运行的作业实例数",{"2":{"1134":1}}],["配置域名",{"0":{"1176":1}}],["配置证书",{"2":{"1175":1,"1178":1}}],["配置重载",{"0":{"1160":1,"1179":1}}],["配置后无需重启",{"2":{"1126":1}}],["配置vim",{"2":{"1083":1}}],["配置docker仓库地址",{"2":{"1082":1}}],["配置dns",{"0":{"1200":1},"2":{"414":1}}],["配置这个",{"2":{"1045":1}}],["配置realms允许docker相关规则进行授权",{"2":{"1044":1}}],["配置realms",{"0":{"1044":1}}],["配置角色与用户",{"0":{"1043":1}}],["配置仓库ip",{"2":{"1039":1}}],["配置中被设置为",{"2":{"1205":1}}],["配置中services",{"2":{"1019":1}}],["配置中有很多注释提供我们参考",{"2":{"857":1}}],["配置等文件外",{"2":{"996":1}}],["配置web基本地址",{"2":{"879":1}}],["配置wifi代理",{"2":{"438":1}}],["配置tsconfig",{"0":{"863":1}}],["配置jest路径映射",{"0":{"862":1}}],["配置路径映射需要满足两个条件",{"2":{"861":1}}],["配置检查的文件",{"2":{"843":1}}],["配置检测nginx状态脚本",{"2":{"728":1}}],["配置stylelint将以下配置写入vscode的配置文件中",{"2":{"843":1}}],["配置插件",{"0":{"838":1}}],["配置插件中的规则",{"2":{"831":1}}],["配置繁重了可能编辑器也会受不了",{"2":{"786":1}}],["配置也相当繁琐",{"2":{"784":1}}],["配置较为繁琐",{"2":{"784":2}}],["配置http2",{"0":{"727":1}}],["配置https步骤",{"2":{"421":1}}],["配置https",{"0":{"421":1,"439":1,"726":1},"2":{"430":2}}],["配置https的",{"2":{"414":1}}],["配置代理选择手动",{"2":{"438":1}}],["配置手机代理到charles",{"2":{"422":1}}],["配置客户端抓包首先需要和主机在同一局域网下",{"2":{"422":1}}],["配置好后",{"2":{"399":1}}],["配置文件安装",{"0":{"1173":1}}],["配置文件的路径",{"2":{"1121":1}}],["配置文件的语法和逻辑是否正确sh➜",{"2":{"708":1}}],["配置文件格式正确性可以在gitlab进行文件校验",{"2":{"1118":1}}],["配置文件构建镜像",{"2":{"1018":1}}],["配置文件示例",{"2":{"1018":1}}],["配置文件是一个",{"2":{"1018":1}}],["配置文件是项目共用的",{"2":{"669":1}}],["配置文件可以在不同的环境中使用",{"2":{"1017":1}}],["配置文件如下",{"2":{"1014":1}}],["配置文件采用了一种层次结构的格式",{"2":{"709":1}}],["配置文件",{"0":{"261":1,"669":1,"709":1,"827":1,"839":1,"1159":1},"1":{"262":1,"263":1,"264":1,"265":1,"710":1,"711":1},"2":{"668":1,"709":1,"878":1}}],["配置都是千篇一律",{"2":{"181":1}}],["配置环境变量",{"0":{"94":1}}],["配置404文件",{"2":{"54":1}}],["配置mongodb",{"2":{"54":1}}],["配置跨域时通常使用204返回",{"2":{"317":1}}],["配置跨域",{"0":{"724":1},"2":{"54":3,"692":1}}],["配置日期格式化插件",{"2":{"54":1}}],["配置",{"0":{"178":1,"681":1,"797":1,"843":1,"878":1,"1083":1},"1":{"179":1,"180":1,"181":1},"2":{"54":2,"64":1,"75":1,"1159":1}}],["配置安全码",{"2":{"54":1}}],["配置用户的相关操作",{"2":{"54":1}}],["配置歌曲信息",{"2":{"54":1}}],["配置管理员的操作",{"2":{"54":1}}],["|grep",{"2":{"1084":1}}],["|=",{"2":{"964":1}}],["|attr|属性节点|",{"2":{"122":1}}],["|application",{"2":{"117":2}}],["|processinginstruction|处理指令|",{"2":{"122":1}}],["|comment|注释节点|",{"2":{"122":1}}],["|element|元素|",{"2":{"122":1}}],["|documentfragment|文档片段|",{"2":{"122":1}}],["|document|文档|",{"2":{"122":1}}],["|documenttype|文档类型|",{"2":{"122":1}}],["|节点类型|释义|",{"2":{"122":1}}],["|image",{"2":{"117":1}}],["|text|文本节点|",{"2":{"122":1}}],["|text",{"2":{"117":2}}],["|mimetype|返回文档类型|",{"2":{"117":1}}],["|",{"2":{"54":106,"117":3,"122":3,"228":1,"229":3,"230":2,"232":4,"238":2,"243":3,"382":1,"383":1,"483":1,"499":3,"611":5,"628":1,"637":1,"648":2,"656":1,"660":21,"674":3,"695":3,"718":3,"726":1,"728":2,"797":3,"829":1,"860":30,"864":25,"874":30,"875":30,"932":2,"934":2,"937":1,"938":2,"939":1,"940":1,"944":7,"945":6,"951":2,"954":4,"956":1,"959":1,"962":2,"964":6,"1012":1,"1014":1,"1051":1,"1054":1,"1055":2,"1069":2,"1082":1,"1085":1,"1093":1,"1108":3,"1205":4,"1206":1,"1230":5}}],["||",{"2":{"7":1,"8":1,"33":1,"40":1,"195":1,"201":3,"229":1,"237":2,"239":1,"245":6,"247":2,"249":1,"354":2,"455":1,"520":3,"521":3,"546":1,"576":1,"583":4,"630":1,"631":1,"639":2,"646":2,"651":1,"669":3,"674":1,"745":1,"751":3,"771":1,"932":2,"934":3,"938":3,"941":2,"951":2,"954":2,"964":1,"1066":1}}],["│\\t│\\t",{"2":{"665":3}}],["│\\t│\\t└──",{"2":{"665":2}}],["│\\t│\\t├──",{"2":{"665":7}}],["│\\t└──",{"2":{"665":3,"676":1}}],["│\\t├──",{"2":{"665":16}}],["│",{"2":{"54":1,"810":5,"874":10,"878":5,"1107":10}}],["语言匹配",{"0":{"674":1}}],["语言包位置",{"2":{"673":1}}],["语言包",{"0":{"676":1},"2":{"665":1}}],["语种点歌",{"2":{"53":1,"54":1}}],["语法如上",{"2":{"1022":1}}],["语法规范的检查器",{"2":{"826":1}}],["语法高亮",{"2":{"785":1}}],["语法分析",{"2":{"254":1}}],["语法错误",{"2":{"90":1}}],["语法",{"0":{"116":1,"120":1,"1019":1,"1052":1},"1":{"1020":1,"1021":1,"1022":1,"1023":1,"1024":1,"1025":1,"1026":1,"1053":1,"1054":1,"1055":1,"1056":1,"1057":1,"1058":1,"1059":1,"1060":1,"1061":1,"1062":1,"1063":1,"1064":1,"1065":1,"1066":1},"2":{"2":1,"3":1,"4":1,"814":1,"1020":1,"1021":1,"1022":1,"1023":1,"1024":1,"1025":1,"1053":1,"1054":1,"1055":1,"1056":1,"1057":1,"1058":1,"1059":1,"1060":1,"1061":1,"1062":1,"1063":1,"1064":1,"1065":1,"1066":1,"1069":1,"1070":1}}],["前后端又是通过http请求进行传输数据的",{"2":{"764":1}}],["前后端的数据传输",{"2":{"313":1}}],["前者在容器内只能通过ip进行通信",{"2":{"1087":1}}],["前者只读",{"2":{"828":1}}],["前者为全局作用域",{"2":{"628":1}}],["前者声明的变量可以不用初始化赋值",{"2":{"588":1}}],["前24位表示网络地址",{"2":{"359":1}}],["前16位表示网络地址",{"2":{"359":1}}],["前8位表示网络地址",{"2":{"359":1}}],["前提",{"2":{"181":1}}],["前进",{"2":{"161":1,"526":1}}],["前瞻断言主要是",{"2":{"149":1}}],["前瞻断言主要是x",{"2":{"148":1,"897":1}}],["前瞻断言",{"0":{"148":1,"897":1}}],["前言",{"0":{"100":1,"236":1,"241":1,"524":1}}],["前查后查想起来",{"2":{"92":1}}],["前面阶段中的所有作业都成功时才会执行",{"2":{"1131":1}}],["前面npm",{"2":{"1099":1}}],["前面也提到了docker是一个c",{"2":{"1071":1}}],["前面也说了内部作用域可以访问外部的作用域",{"2":{"591":1}}],["前面知道eslint内置了很多规则和默认解析解析器",{"2":{"831":1}}],["前面知道了ip作为主机的唯一标志",{"2":{"365":1}}],["前面简单讲了下随心所欲的代码会变得难以维护",{"2":{"824":1}}],["前面说了filter",{"2":{"640":1}}],["前面说了值支持多种类型",{"2":{"606":1}}],["前面说了装饰器主要是用于类中",{"2":{"226":1}}],["前面用var声明变量前",{"2":{"588":1}}],["前面同样是提前访问变量却打印的时undefined",{"2":{"587":1}}],["前面我们学习了可以使用docker",{"2":{"1048":1}}],["前面我们演示了一个比较小的图片只有3",{"2":{"771":1}}],["前面我们知道new时会生成一个权限的对象作为this指向",{"2":{"580":1}}],["前面我们讲了arraybuffer和typearray等相关二进制的方法",{"2":{"493":1}}],["前面介绍了",{"2":{"572":1}}],["前面讲的设置原型的几种方式",{"2":{"579":1}}],["前面讲了new操作",{"2":{"577":1}}],["前面讲了node刚开始会进入poll阶段",{"2":{"539":1}}],["前面讲到它在check阶段执行",{"2":{"539":1}}],["前面讲述了我们的应用已经正常运行",{"2":{"128":1}}],["前面已经讲了在每一次tick执行完所有的mircotask",{"2":{"534":1}}],["前面",{"2":{"81":1}}],["前面的语法和前面插入单条是一样的",{"2":{"77":1}}],["前台获取验证码",{"2":{"61":1}}],["前台用户听歌架构",{"2":{"54":1}}],["前台用户点歌项目界面",{"2":{"54":1}}],["前端通用库",{"2":{"1183":1,"1187":1}}],["前端和后端",{"2":{"1034":1}}],["前端工程师",{"2":{"991":1}}],["前端自动化测试在提高代码质量",{"2":{"851":1}}],["前端自动化测试",{"0":{"851":1},"1":{"852":1,"853":1,"854":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1}}],["前端打包工具发挥着重要作用",{"2":{"784":1}}],["前端上传时跳过已经上传过的切片",{"2":{"772":1}}],["前端发送合并请求",{"2":{"770":1}}],["前端二进制",{"2":{"768":1}}],["前端二进制是一种关键的数据表示和处理技术",{"2":{"478":1}}],["前端性能优化是一个涉及多个方面的综合性工作",{"2":{"762":1}}],["前端性能优化的手段涉及到多个方面",{"2":{"762":1}}],["前端性能优化",{"0":{"762":1}}],["前端性能测试工具",{"0":{"212":1},"1":{"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1},"2":{"214":1}}],["前端监控系统",{"0":{"600":1}}],["前端的同学们应该都听说过eventloop的概念",{"2":{"523":1}}],["前端可以根据请求相关时间做一些优化",{"2":{"417":1}}],["前端或后端对传入的内容进行转义",{"2":{"350":1}}],["前端存储",{"2":{"350":1}}],["前端主流构建工具",{"0":{"281":1}}],["前端开发工程师",{"2":{"213":1}}],["前端缓存是",{"2":{"168":1}}],["前端使用传统的webpack",{"2":{"125":1}}],["前端林子",{"2":{"113":1}}],["前端",{"2":{"52":1,"350":1,"765":1,"1223":1}}],["前几步和之前的实现差不多",{"2":{"9":1}}],["思维导图",{"0":{"51":1}}],["教你用vue",{"2":{"50":1}}],["相较于其他软件的安装k8s的安装其实相对繁琐",{"2":{"1197":1}}],["相反不使用dockerfile",{"2":{"1051":1}}],["相同方式共享",{"2":{"1228":1}}],["相同的值",{"2":{"1121":1}}],["相同",{"2":{"729":2,"1121":1}}],["相继也出现csr",{"2":{"671":1}}],["相比copy可以远程文件",{"2":{"1060":1}}],["相比add指令一般使用这个也够用了",{"2":{"1059":1}}],["相比启动单个容器",{"2":{"1017":1}}],["相比setupfiles更加通用",{"2":{"857":1}}],["相比express",{"2":{"601":1}}],["相比tcp协议",{"2":{"327":1}}],["相信现在你应该对vue2的响应式有一定的认识了",{"2":{"956":1}}],["相信每个小伙伴都经历过前端项目复杂的配置",{"2":{"782":1}}],["相信每个初次遇到此情况的同学都会很迷惑",{"2":{"336":1}}],["相信大家都听说了大文件上传",{"2":{"764":1}}],["相信大家对抓包已经不陌生了",{"2":{"460":1}}],["相信看懂它想必并不难",{"2":{"571":1}}],["相信看到这里的小伙伴也会对其有相关的了解",{"2":{"233":1}}],["相信很多开发者对这方面可能一知半解或者就是久而忘之",{"2":{"478":1}}],["相信你已经对fiddler已经有了基本认识",{"2":{"437":1}}],["相信到这里已经可以满足你的常用需求了",{"2":{"426":1}}],["相似",{"2":{"221":1}}],["相关配置参数此处不做解释",{"2":{"1173":1}}],["相关参数说明",{"2":{"1172":1}}],["相关参考",{"2":{"49":1,"427":1,"541":1,"555":1}}],["相关运维等等",{"2":{"449":1}}],["相关文档",{"2":{"426":1}}],["相关文章",{"0":{"169":1},"2":{"345":1}}],["相关标识等等",{"2":{"311":1}}],["相当于执行了undefined",{"2":{"587":1}}],["相当于",{"2":{"141":3,"890":3,"995":1,"1081":1,"1121":1}}],["相对路径",{"2":{"1059":1}}],["相对来说更加自由一些",{"2":{"436":1}}],["相对来说非常简单",{"2":{"46":1,"552":1}}],["相对于前端项目切换频繁就比较繁重",{"2":{"785":1}}],["相对于前两者作用比较实用",{"2":{"430":1}}],["相对于其他打包工具",{"2":{"784":2}}],["相对于object",{"2":{"575":1}}],["相对于传统的oop面向对象编程还是有一点区别的",{"2":{"570":1}}],["相对于比较低级的数据更容易大家所理解",{"2":{"493":1}}],["相对于开发人员",{"2":{"449":1}}],["相对于ipv4的32位地址",{"2":{"366":1}}],["相对大批前端同学来说更加友好",{"2":{"125":1}}],["相爱相杀",{"2":{"123":1}}],["看到桥接流量",{"0":{"1205":1}}],["看到最后一个项就是",{"2":{"215":1}}],["看是否能ping通",{"2":{"1090":1}}],["看是否需要返回数据",{"2":{"382":1}}],["看如下代码",{"2":{"960":1}}],["看watcher方法",{"2":{"954":1}}],["看上去还挺神奇的",{"2":{"930":1}}],["看上去模块划分已经生效了",{"2":{"687":1}}],["看这里会打印几次",{"2":{"930":1}}],["看和你想的一致不",{"2":{"587":1}}],["看和你的想法一直不",{"2":{"48":1,"554":1}}],["看下图简单的画了js内存部分图",{"2":{"592":1}}],["看下使用",{"2":{"583":1}}],["看下原型图",{"2":{"581":1}}],["看下面代码",{"2":{"580":1}}],["看下此时的cat结构",{"2":{"572":1}}],["看下node原理图",{"2":{"537":1}}],["看下你现在的电脑上能非常方便的使用这个工具吗",{"2":{"221":1}}],["看描述的意思是firefox旧版本可能会需要下载charles的插件来支持抓包",{"2":{"412":1}}],["看看如何使用",{"2":{"803":1}}],["看看可以采取哪些措施来改进您的应用",{"2":{"214":1}}],["看看通过上面的知识你能解决吗",{"2":{"48":1,"554":1}}],["看剩下的能不能匹配到",{"2":{"150":1,"899":1}}],["答案是否定的",{"2":{"378":1}}],["答案",{"2":{"48":3,"554":3}}],["提前拉取安装k8s时所需要的组件",{"2":{"1213":1}}],["提前加载涉及到",{"2":{"131":1}}],["提前加载",{"2":{"131":1}}],["提交的标题",{"2":{"1121":1}}],["提交的描述",{"2":{"1121":1}}],["提交标签消息",{"2":{"1121":1}}],["提交标签名称",{"2":{"1121":1}}],["提交分支名称",{"2":{"1121":1}}],["提交代码后",{"2":{"1118":1}}],["提交将被拒绝",{"2":{"795":1}}],["提交信息不能为空",{"2":{"797":1}}],["提交信息的工具",{"2":{"795":1}}],["提交信息多了将会显得杂乱无章",{"2":{"787":1}}],["提交类型不能为空",{"2":{"797":1}}],["提交类型大小写",{"2":{"797":1}}],["提交类型用来表示本次修改的类型",{"2":{"789":1}}],["提交类型",{"0":{"789":1}}],["提交格式如下",{"2":{"788":1}}],["提交",{"2":{"785":1}}],["提升开发效率",{"2":{"785":1}}],["提升用户体验和网站的性能",{"2":{"762":1}}],["提升用户体验",{"2":{"712":1}}],["提升和暂时性死区的本质",{"2":{"596":1}}],["提升了性能和安全性",{"2":{"329":1}}],["提高容器的性能",{"2":{"1110":1}}],["提高容器的可维护性",{"2":{"1054":1}}],["提高镜像构建和部署的效率",{"2":{"1075":1}}],["提高构建速度",{"2":{"1075":1}}],["提高效率",{"2":{"1070":1}}],["提高应用的部署效率和可靠性",{"2":{"1011":1}}],["提高自我技能和成长的过程",{"2":{"948":1}}],["提高团队协作和加速交付流程方面发挥着重要作用",{"2":{"851":1}}],["提高团队协作水平",{"2":{"794":1}}],["提高开发效率和一致性",{"2":{"811":1}}],["提高开发效率",{"2":{"811":1}}],["提高图像加载",{"2":{"718":1}}],["提高代码审查效率",{"2":{"794":1}}],["提高代码的可维护性和可重用性",{"2":{"601":2}}],["提高代码可读性",{"2":{"242":1}}],["提高内存的吞吐量",{"2":{"508":1}}],["提高安全性",{"2":{"353":1,"706":1}}],["提高了容器应用程序的可用性",{"2":{"1206":1}}],["提高了文件传输的效率",{"2":{"709":1}}],["提高了路由器处理包的效率",{"2":{"366":1}}],["提高了连接速度",{"2":{"334":1}}],["提高了握手效率",{"2":{"334":1}}],["提高了网络性能",{"2":{"323":1}}],["提高网络安全性",{"2":{"364":2}}],["提高网络的安全性和性能",{"2":{"362":1}}],["提高网络的灵活性",{"2":{"308":1}}],["提高网络性能",{"2":{"300":1,"364":2}}],["提供的免费证书",{"2":{"1178":1}}],["提供的全局函数",{"2":{"881":1}}],["提供您自己的可执行文件",{"2":{"1169":1}}],["提供辅助函数来处理这个问题",{"2":{"871":1}}],["提供快速反馈",{"2":{"853":1}}],["提供邮件收发服务",{"2":{"706":1}}],["提供网页浏览服务",{"2":{"706":1}}],["提供负载均衡功能",{"2":{"705":1}}],["提供完善的测试工具和丰富的文档和社区支持",{"2":{"664":1}}],["提供依赖注入",{"2":{"664":1}}],["提供注入的标识",{"2":{"624":1}}],["提供给用户更多的选择权",{"2":{"957":1}}],["提供给模块的providers做为源数据的标识",{"2":{"622":1}}],["提供给大家练习",{"2":{"48":1,"554":1}}],["提供register方法",{"2":{"609":1}}],["提供实例",{"2":{"606":1}}],["提供元数据",{"2":{"606":1}}],["提供当前模块的控制器来定义路由处理http请求",{"2":{"604":1}}],["提供浏览器url",{"2":{"526":1}}],["提供将当前流管道输出到一个转换",{"2":{"512":1}}],["提供更加安全的传输",{"2":{"327":1}}],["提供了多种网络类型和网络驱动",{"2":{"1087":1}}],["提供了多路复用",{"2":{"323":1}}],["提供了更全面的响应式能力",{"2":{"965":1}}],["提供了更高效的开发和部署方式",{"2":{"784":1}}],["提供了丰富的学习资源和技术支持",{"2":{"785":1}}],["提供了一个具有增强的资源管理能力的统一控制系统",{"2":{"1198":1}}],["提供了一种在网络平台以接近本地速度的方式运行多种语言编写的代码的方式",{"2":{"977":1}}],["提供了一种高效",{"2":{"601":1,"662":1}}],["提供了一致的开发环境和体验",{"2":{"785":1}}],["提供了一些新特性来进一步提高web性能",{"2":{"327":1}}],["提供数据流的分段和重组功能",{"2":{"309":1}}],["提供数据交换和同步功能",{"2":{"309":1}}],["提供数据加密和压缩等功能",{"2":{"309":1}}],["提供后面缓存使用",{"2":{"248":1}}],["提供服务",{"2":{"222":1}}],["提供创建对象的接口",{"2":{"201":1,"751":1}}],["提供我们使用",{"2":{"181":1}}],["提示用户重新获取合法的token信息",{"2":{"64":1}}],["提示",{"2":{"41":1,"547":1,"831":1,"1170":1}}],["问题解答和功能改进",{"2":{"785":1}}],["问题主要在于查看文章时",{"2":{"131":1}}],["问题",{"0":{"48":1,"554":1}}],["把它映射到主机上",{"2":{"1094":1}}],["把它当成vue的组件render函数",{"2":{"951":1}}],["把run合并成一条指令执行",{"2":{"1058":1}}],["把一些值得学习的记录下来分享给大家",{"2":{"252":1}}],["把成员对象的创建工作转交给一个外部对象",{"2":{"201":1,"751":1}}],["把他们一个个封装起来",{"2":{"197":1,"747":1}}],["把x格式化为以逗号隔开的数字序列",{"2":{"83":1}}],["把这些转换概念摸清楚就可以游刃有余",{"2":{"47":1,"553":1}}],["把字符串解析成对象",{"2":{"32":1}}],["自",{"2":{"1207":1}}],["自身都是空对象",{"2":{"571":1}}],["自己使用意义不大了解下即可",{"2":{"1057":1}}],["自己尝试看看应该能看懂",{"2":{"964":1}}],["自己看看吧",{"2":{"956":1}}],["自己看看就行了",{"2":{"945":1}}],["自己的dep",{"2":{"955":1}}],["自己过几遍就应该明白了",{"2":{"954":1}}],["自己不喜欢怎么推荐也都无济于事",{"2":{"785":1}}],["自己可以从原型那里获得额外的属性",{"2":{"570":1}}],["自己可以试试",{"2":{"414":1}}],["自己动手试试就会明白",{"2":{"459":1}}],["自己动手试试即可",{"2":{"452":1}}],["自己一定要动手实践一遍玩一玩才不会忘记",{"2":{"439":1}}],["自己学习时要结合实际练习",{"2":{"356":1}}],["自己转化为number类型然后进行比较",{"2":{"47":1,"553":1}}],["自行编译",{"2":{"1208":1}}],["自行查阅文档",{"2":{"772":1}}],["自行搜索即可",{"2":{"411":1}}],["自行发挥",{"2":{"354":1}}],["自行科普",{"2":{"331":1}}],["自行创建即可",{"2":{"69":1}}],["自定以interceptor需要实现nestinterceptor类的intercept方法",{"2":{"651":1}}],["自定向下方法第7版",{"2":{"306":1,"314":1,"373":1,"396":1}}],["自定义执行器允许您指定您自己的执行环境",{"2":{"1169":1}}],["自定义执行器",{"0":{"1169":1}}],["自定义网络",{"2":{"1087":1}}],["自定义命令",{"2":{"878":1}}],["自定义全局配置",{"2":{"878":1}}],["自定义提交类型",{"2":{"801":1}}],["自定义提取器",{"2":{"656":1}}],["自定义规范",{"0":{"801":1}}],["自定义中间件",{"2":{"692":1}}],["自定义语言的匹配规则",{"2":{"673":1}}],["自定义版本就是获取版本的逻辑是如何的",{"2":{"656":1}}],["自定义版本",{"0":{"656":1}}],["自定义等等",{"2":{"654":1}}],["自定义interceptor",{"0":{"651":1}}],["自定义pipe",{"0":{"645":1}}],["自定义filter",{"0":{"639":1}}],["自定义配置",{"0":{"630":1}}],["自定义参数装饰器",{"2":{"619":1}}],["自定义装饰器",{"0":{"619":1}}],["自定义下载速率为5kb",{"2":{"420":1}}],["自定义一条数据",{"2":{"419":1}}],["自定义请求的请求或响应的查看方式",{"2":{"414":1}}],["自定义",{"2":{"249":1}}],["自定义验证器",{"2":{"232":2}}],["自定义验证方法",{"2":{"64":1}}],["自右往左",{"2":{"179":1}}],["自下往上",{"2":{"179":1}}],["自由配置",{"2":{"127":1}}],["自动化构建",{"2":{"1050":1}}],["自动构建镜像",{"2":{"1029":1}}],["自动重新启动容器",{"2":{"1025":1}}],["自动删除容器",{"2":{"1004":1}}],["自动响应请求内容",{"2":{"436":1}}],["自动映射",{"0":{"410":1}}],["自动换行",{"2":{"157":1}}],["自动会把打包后的前端页面推到后端的",{"2":{"126":1}}],["自动装箱",{"2":{"38":1,"544":1}}],["自联的用途也挺广泛的",{"2":{"88":1}}],["自联其实是一种联表的用法",{"2":{"88":1}}],["自联",{"0":{"88":1}}],["自然对数的底",{"2":{"83":1}}],["逻辑运算的转换常见的就是",{"2":{"46":1,"552":1}}],["逻辑运算转换",{"0":{"45":1,"551":1},"1":{"46":1,"47":1,"552":1,"553":1}}],["加入集群的token有效期为1天",{"2":{"1216":1}}],["加上selinux=0然后按ctrl+x就可以进去了",{"2":{"1202":1}}],["加上http是基于tcp协议的",{"2":{"764":1}}],["加深其作用印象",{"2":{"1070":1}}],["加深印象和理解",{"2":{"307":1}}],["加1",{"2":{"367":1}}],["加快页面的渲染",{"2":{"335":1}}],["加载自定义配置文件",{"2":{"669":1}}],["加载自定义的配置文件",{"2":{"628":1}}],["加载好了配置后使用configservice来获取配置",{"2":{"629":1}}],["加载资源",{"2":{"244":1}}],["加载失败或成功对其缓存",{"2":{"248":1}}],["加载失败",{"2":{"244":2}}],["加载成功",{"2":{"244":2}}],["加载中",{"2":{"244":2,"962":1}}],["加载管理器需要对每个图片进行是否是要请求真实资源进行判断",{"2":{"242":1}}],["加载完成后替换成真是的数据",{"2":{"198":1,"748":1}}],["加载时间过长",{"2":{"131":1}}],["加载动画loading",{"2":{"54":2}}],["加解密放在一起",{"2":{"83":1}}],["加密保护网络服务器和客户端之间的数据流",{"2":{"726":1,"1178":1}}],["加密后的",{"2":{"354":1}}],["加密",{"2":{"354":1}}],["加密套件根据自己需求调整",{"2":{"726":1}}],["加密套件列表",{"2":{"333":1}}],["加密套件",{"2":{"332":1,"333":1,"726":1}}],["加密和解密都使用相同的密钥",{"2":{"330":1}}],["加密字符串str",{"2":{"83":1}}],["加密函数",{"2":{"83":1}}],["加强安全性",{"2":{"61":1}}],["加法运算最为特殊同时也是类型转换最多的",{"2":{"44":1,"550":1}}],["加运算",{"0":{"44":1,"550":1}}],["以逗号分隔的",{"2":{"1121":1}}],["以外的所有内容都替换为",{"2":{"1121":1}}],["以满足不同场景下的网络需求",{"2":{"1087":1,"1091":1}}],["以满足不同的需求和应用场景",{"2":{"321":1}}],["以影响镜像的构建",{"2":{"1054":1}}],["以描述如何构建和运行一个docker容器",{"2":{"1049":1}}],["以后就可以用此用户进行登录私有仓库了",{"2":{"1043":1}}],["以后扩展使用",{"2":{"376":1}}],["以执行任意的命令或者进入容器内部进行交互式操作",{"2":{"1005":1}}],["以哪种格式输出",{"2":{"998":1}}],["以来收集",{"2":{"964":1}}],["以n+1的形式进行赔偿",{"2":{"1233":1}}],["以new",{"2":{"953":1}}],["以node方式调试",{"2":{"400":1}}],["以验证整个应用程序的功能和可用性",{"2":{"854":1}}],["以减少bug和错误的发生",{"2":{"824":1}}],["以减少确认消息的数量和网络负载",{"2":{"382":1}}],["以^开头的表示依赖的其他包的脚本",{"2":{"818":1}}],["以breaking",{"2":{"792":1}}],["以blob类型存储",{"2":{"83":1}}],["以当前形式来看大多数都开始转向基于go",{"2":{"784":1}}],["以至于传输负载太大",{"2":{"767":1}}],["以至于现在它可以变成出色的框架得到业界的重视",{"2":{"601":1}}],["以确保web服务可以连接到db服务并正常运行",{"2":{"1023":1}}],["以确保在启动容器时",{"2":{"1023":1}}],["以确保在一个节点故障时",{"2":{"728":1}}],["以确保它们也是响应式的",{"2":{"965":1}}],["以确保整个应用程序的各个部分正常协同工作",{"2":{"854":1}}],["以确保项目的可持续发展",{"2":{"786":1}}],["以确保缓存仍然有效",{"2":{"720":1}}],["以确定是否允许跨域访问资源",{"2":{"337":1}}],["以达到减少数据传输",{"2":{"718":1}}],["以json的形式输出图片的信息",{"2":{"718":1}}],["以",{"2":{"711":1,"1124":1}}],["以适应不同的需求和场景",{"2":{"709":1}}],["以cats开头的路径会走这里",{"2":{"611":1}}],["以chrome为例",{"2":{"526":1}}],["以快速响应用户的交互",{"2":{"532":1}}],["以编程方式访问从网络接收的数据流",{"2":{"508":1}}],["以uint8格式设置某个索引位置的值",{"2":{"489":1}}],["以uint8格式获取指定索引的数据",{"2":{"489":1}}],["以此类推",{"2":{"484":1}}],["以太网",{"2":{"453":1}}],["以前生意还好也能赚下钱",{"2":{"1232":1}}],["以前给她打电话基本上都会接也很快",{"2":{"1232":1}}],["以前我们总是用命令管理每个容器的启动",{"2":{"1016":1}}],["以前还可以使用docker",{"2":{"1008":1}}],["以前的wepack要用sourcemap进行映射",{"2":{"406":1}}],["以前学会了用nvm来管理node版本",{"2":{"92":1}}],["以防止指数级的发送造成网络堵塞问题",{"2":{"394":1}}],["以防止数据包在网络中无限制地循环传输",{"2":{"367":1}}],["以避免过多的数据流入网络中而导致拥塞",{"2":{"392":1}}],["以保证数据的可靠传输",{"2":{"374":1}}],["以恢复原始数据包",{"2":{"369":2}}],["以免造成网络故障",{"2":{"360":1}}],["以提高构建效率",{"2":{"1068":1}}],["以提高构建速度",{"2":{"1028":1}}],["以提高web性能和效率",{"2":{"321":1}}],["以提供可靠的数据传输服务",{"2":{"357":1}}],["以获得更好的安全性保障",{"2":{"329":1}}],["以下步骤需要在每台机器上进行配置",{"2":{"1197":1}}],["以下对于nexus3的使用不是很详细",{"2":{"1040":1}}],["以下本文都默认安装了nexus3",{"2":{"1040":1}}],["以下为友链申请格式",{"2":{"1230":1}}],["以下为实际打印情况",{"2":{"950":1}}],["以下为集成后的使用效果",{"2":{"806":1}}],["以下在main文件中配置",{"2":{"681":1}}],["以下在请求api后会执行jsonpcb回调",{"2":{"338":1}}],["以下都会以let关键字进行变量的声明",{"2":{"589":1}}],["以下都以",{"2":{"571":1}}],["以下都以mac版本为基础介绍",{"2":{"450":1}}],["以下fiddler文案全部代表的是fiddler",{"2":{"428":1}}],["以下内容都以mac版charles作为基础",{"2":{"412":1}}],["以下",{"2":{"369":1}}],["以下是",{"2":{"1007":1,"1009":1,"1087":1}}],["以下是docker",{"2":{"1005":1}}],["以下是官方通过custom",{"2":{"656":1}}],["以下是来自官网的一张事件循环图⬇️",{"2":{"538":1}}],["以下是一个简单的dockerfile",{"2":{"1051":1}}],["以下是一个最简单的vue的computed使用例子",{"2":{"934":1}}],["以下是一个将小写字母变成大写字母例子",{"2":{"517":1}}],["以下是一些常用的",{"2":{"1006":1}}],["以下是一些常用的内置变量",{"2":{"729":1}}],["以下是一些url的例子",{"2":{"316":1}}],["以下是几个不同类型的array对同一段buffer的处理不同点",{"2":{"485":1}}],["以下是几个截图",{"2":{"354":1}}],["以下是两者常见的指令",{"2":{"350":1}}],["以下是chrome",{"2":{"325":1}}],["以下是这三类首部字段的一些常见示例",{"2":{"319":1}}],["以下列出tcp",{"2":{"312":1}}],["以下以mac为例",{"2":{"155":1}}],["以应对核战争带来的威胁",{"2":{"310":1}}],["以字节为单位",{"2":{"297":2}}],["以便产生不必要的疑惑",{"2":{"1171":1}}],["以便可以同时执行多个job",{"2":{"1126":1}}],["以便可读流可以读取到数据",{"2":{"510":1}}],["以便将宿主机上的目录或文件夹挂载到",{"2":{"1113":1}}],["以便在基于该镜像构建更高级别的应用程序时",{"2":{"1065":1}}],["以便在网络中传输",{"2":{"369":1}}],["以便在网络中进行通信",{"2":{"358":1}}],["以便在网络中发送数据包",{"2":{"295":1}}],["以便简化多容器应用的部署和管理",{"2":{"1017":1}}],["以便后续使用",{"2":{"1003":1}}],["以便",{"2":{"829":1,"1217":1}}],["以便友好的引导开发者修改配置",{"2":{"669":1}}],["以便统一规划管理",{"2":{"665":1}}],["以便使用其他模块的服务和依赖",{"2":{"607":1}}],["以便其他引用了当前模块的模块可以使用当前暴露出的内容",{"2":{"604":1}}],["以便更轻松地管理",{"2":{"1016":1}}],["以便更快",{"2":{"371":1}}],["以便更好地管理和利用ip地址资源",{"2":{"362":1}}],["以便目标设备可以接收到请求",{"2":{"370":1}}],["以便以后使用",{"2":{"347":1}}],["以便访问该资源",{"2":{"316":1}}],["以便解决这些问题",{"2":{"309":1}}],["以便控制它的访问",{"2":{"198":1,"748":1}}],["以便开发工具知道在哪里可以找到它",{"2":{"183":1}}],["以`$`开头",{"2":{"145":1,"894":1}}],["以第一行来看",{"2":{"110":1}}],["以联表之后的大表作为一张虚拟表",{"2":{"87":1}}],["以及对我们被裁掉的同事的关心",{"2":{"1233":1}}],["以及新兴的ai方面新颖的业务了",{"2":{"1233":1}}],["以及作业从哪里运行",{"2":{"1121":1}}],["以及容器健康检查失败时的行为",{"2":{"1066":1}}],["以及容器内部运行的进程的日志信息",{"2":{"1007":1}}],["以及它的存储原理",{"2":{"996":1}}],["以及网站的评分指标和对药下症",{"2":{"762":1}}],["以及通用的tcp",{"2":{"704":1}}],["以及处理流内容的方式",{"2":{"699":1}}],["以及new的本质和作用",{"2":{"584":1}}],["以及子网掩码",{"2":{"364":1}}],["以及使用",{"2":{"350":1}}],["以及200",{"2":{"322":1}}],["以及",{"2":{"184":1,"701":1}}],["以及与其他元素的关系和相互作用",{"2":{"102":1}}],["以及当前版本全局工具",{"2":{"96":1}}],["以及多级回复等等场景",{"2":{"88":1}}],["以及老师所教的课程",{"2":{"87":1}}],["以及如何实现它们",{"2":{"35":1}}],["以age和name两个字段分组",{"2":{"84":1}}],["以上配置好以后运行此配置文件",{"2":{"1217":1}}],["以上配置好了应用及域名",{"2":{"129":1}}],["以上初始化好后还需要安装网络组件",{"2":{"1217":1}}],["以上需要在所有节点执行",{"2":{"1211":1}}],["以上需要使用",{"2":{"1178":1}}],["以上安装好后需要进一步配置系统文件",{"2":{"1208":1}}],["以上安装此模块后编译如果出现其他的错误",{"2":{"718":1}}],["以上相关配置都是在gitlab",{"2":{"1175":1}}],["以上红框中需要重视其他可以随意填",{"2":{"1100":1}}],["以上镜像构建使用的是docker",{"2":{"1069":1}}],["以上并没有使用账户密码",{"2":{"1039":1}}],["以上我们使用object",{"2":{"952":1}}],["以上基本上实现了依赖的自动收集和派发更新",{"2":{"951":1}}],["以上基本实现了所需的功能",{"2":{"246":1}}],["以上有个弊端就是需要将执行方法写死在set里",{"2":{"950":1}}],["以上是最基本的配置",{"2":{"857":1}}],["以上是针对团队使用一种技术或者小团队而言",{"2":{"786":1}}],["以上是osi七层模型",{"2":{"309":1}}],["以上根据实际情况自行处理",{"2":{"718":1}}],["以上pipe绑定到了参数上",{"2":{"643":1}}],["以上不同的绑定方式作用的返回也不一样",{"2":{"640":1}}],["以上都是将nest作为类似api服务进行使用",{"2":{"671":1}}],["以上都是关于普通变量的声明",{"2":{"587":1}}],["以上都会打印",{"2":{"594":1}}],["以上代码只是简单的演示",{"2":{"769":1}}],["以上代码可以看出原型对象和普通对象没有什么区别",{"2":{"571":1}}],["以上代码就两个异步任务",{"2":{"539":1}}],["以上每个阶段的任务执行完在进入下一个阶段前会先清空当前阶段的微任务队列",{"2":{"538":1}}],["以上简单介绍了浏览器每个页面进行渲染时",{"2":{"526":1}}],["以上简单的实现了对对象的拦截",{"2":{"959":1}}],["以上简单的演示了攻击过程",{"2":{"352":1}}],["以上简单的概述了两端数据转发的过程",{"2":{"311":1}}],["以上通过将fetch的response的body可读流通过自定义的wriablestream写入",{"2":{"514":1}}],["以上还可以再细分",{"2":{"453":1}}],["以上的auth值其实就是账户",{"2":{"1014":1}}],["以上的属性如不作特殊定制可以不进行配置",{"2":{"830":1}}],["以上的代码自己可以跑一下试一试",{"2":{"771":1}}],["以上的图标按顺序依次是开始抓包",{"2":{"452":1}}],["以上的字段明细都可以使用wireshark抓包工具捕获到",{"2":{"376":1}}],["以上看到已经抓取了大量的网络数据包",{"2":{"452":1}}],["以上就是大文件上传的基本原理",{"2":{"764":1}}],["以上就是tcp挥手的基本原理了",{"2":{"457":1}}],["以上就是charles的使用方法",{"2":{"426":1}}],["以上就是断点调试的基本使用",{"2":{"419":1}}],["以上三种断点",{"2":{"404":1}}],["以上假如ttl的值为5",{"2":{"368":1}}],["以上两个字段的区别在于content",{"2":{"350":1}}],["以上源码可以在github下载",{"2":{"250":1}}],["以上工作完成后",{"2":{"56":1}}],["以上转换规则优先级从高到低进行转换",{"2":{"44":1,"550":1}}],["以上便是手动发布npm包的整个流程",{"2":{"1190":1}}],["以上便是使用官方registry搭建仓库的步骤",{"2":{"1039":1}}],["以上便是用最最简洁的代码还原了下官方的实现过程",{"2":{"951":1}}],["以上便是一个最简单上手的端测用例",{"2":{"879":1}}],["以上便是大文件上传的基本操作原理",{"2":{"770":1}}],["以上便是arp协议的基本原理",{"2":{"454":1}}],["以上便是fiddler各个模块的介绍",{"2":{"437":1}}],["以上便是ios的配置抓包流程",{"2":{"422":1}}],["以上便是",{"2":{"43":1,"549":1,"572":1}}],["时验证极狐gitlab",{"2":{"1121":3}}],["时可用",{"2":{"1121":1}}],["时才可用",{"2":{"1121":5}}],["时前面表示宿主机端口",{"2":{"1022":1}}],["时显示的文件时间为gmt时间",{"2":{"712":1}}],["时区",{"2":{"660":1}}],["时就可以回收",{"2":{"557":1}}],["时就会分片",{"2":{"369":1}}],["时会访问",{"2":{"710":1}}],["时会阻塞dom的解析",{"2":{"526":1}}],["时会自动指向全局对象",{"2":{"2":1}}],["时",{"2":{"368":1,"529":2,"932":1,"953":1,"997":1,"1065":1}}],["时间长了可能更不便于维护",{"2":{"786":1}}],["时间",{"2":{"634":2}}],["时间监听断点",{"2":{"404":1}}],["时间旅行的功能",{"2":{"209":1,"759":1}}],["时间戳等等",{"2":{"376":1}}],["时间戳",{"2":{"41":1,"298":1,"547":1}}],["通俗的讲docker会在宿主机上创建一个默认的docker网桥",{"2":{"1085":1}}],["通知length属性依赖更新",{"2":{"961":1}}],["通知更新",{"2":{"954":1,"956":1,"964":1}}],["通知浏览器应该只通过",{"2":{"350":1}}],["通用变量",{"0":{"1121":1}}],["通用的模块",{"2":{"665":1}}],["通用的一些配置",{"2":{"665":1}}],["通用首部字段",{"2":{"319":1}}],["通信双方还需要知道双方的mac地址才能通信",{"2":{"454":1}}],["通信",{"2":{"359":1}}],["通信过程",{"0":{"296":1}}],["通配符匹配",{"2":{"612":1}}],["通配符表示一个字符",{"2":{"85":1}}],["通配符放到开头",{"2":{"85":1}}],["通配符放到结尾",{"2":{"85":1}}],["通常由两部分组成",{"2":{"1012":1}}],["通常设置属性的",{"2":{"949":1}}],["通常设置为每片ip最大数据承载大小也称为mss",{"2":{"386":1}}],["通常watch用来检测响应式对象",{"2":{"938":1}}],["通常也可以使用命令行",{"2":{"857":1}}],["通常也只包装一次",{"2":{"206":1,"756":1}}],["通常建议在项目中同时使用editorconfig和prettier",{"2":{"837":1}}],["通常yarn",{"2":{"814":1}}],["通常结构如下所示",{"2":{"810":1}}],["通常就是官方提供的规则",{"2":{"797":1}}],["通常就是前端使用form表单传输文件数据",{"2":{"765":1}}],["通常编辑器的选择倾向于以下几个功能点",{"2":{"785":1}}],["通常我会把项目集成分为两大类",{"2":{"782":1}}],["通常我们只需要关注下图红框中的配置即可",{"2":{"1096":1}}],["通常我们会将不同的功能划分到不同的模块",{"2":{"687":1}}],["通常我们都要new一个vue",{"2":{"239":1}}],["通常我们要匹配的内容后面要跟着指定的内容",{"2":{"147":1,"896":1}}],["通常前端性能优化是非常重要和必不可少的工作",{"2":{"762":1}}],["通常服务端返回流内容都是直接返回文件或者使用流对象pipe到响应对象",{"2":{"700":1}}],["通常配置文件都会使用",{"2":{"669":1}}],["通常一个功能模块中包含controller",{"2":{"667":1}}],["通常的业务中我们也会对的某个任务进行动态执行和注册",{"2":{"661":1}}],["通常获取用户信息进行鉴权",{"2":{"648":1}}],["通常使用promise",{"2":{"865":1}}],["通常使用",{"2":{"623":1}}],["通常使用大家熟悉的express",{"2":{"603":1}}],["通常http请求时前端都会携带或多或少的数据传递给服务端",{"2":{"613":1}}],["通常可以按功能划分模块或路由",{"2":{"607":1}}],["通常可以使用帧优先级的策略",{"2":{"324":1}}],["通常provider被缩写成数组形式",{"2":{"606":1}}],["通常类都会使用",{"2":{"606":1}}],["通常和业务分开",{"2":{"605":1}}],["通常根据功能来划分不同的模块",{"2":{"604":1}}],["通常分为不同的执行阶段",{"2":{"538":1}}],["通常这里不做任何事",{"2":{"510":1}}],["通常在ts项目中使用其作为解析器",{"2":{"829":1}}],["通常在服务端node都需要做一些相关的配置",{"2":{"690":1}}],["通常在自己构造可读流时在此方法中",{"2":{"510":1}}],["通常在其他语言中称为",{"2":{"479":1}}],["通常用来设置基本的规范如缩进形式",{"2":{"836":1}}],["通常用来eslint",{"2":{"803":1}}],["通常用来对请求和响应数据进行拦截改造",{"2":{"650":1}}],["通常用来对大文件做切片处理",{"2":{"501":1}}],["通常用来执行密集复杂的计算",{"2":{"526":1}}],["通常用于单元测试",{"2":{"855":1}}],["通常用于调试和测试",{"2":{"320":1}}],["通常用于跨域请求中的预检请求",{"2":{"320":1}}],["通常用于",{"2":{"320":1}}],["通常用于传输post请求中的表单数据等内容",{"2":{"318":1}}],["通常有两种方式获取file对象",{"2":{"499":1}}],["通常流用来处理比较大的内容",{"2":{"496":1}}],["通常情况在发布生产时",{"2":{"408":1}}],["通常情况下user",{"2":{"942":1}}],["通常情况下以这个作为继承版本",{"2":{"582":1}}],["通常情况下大家都喜欢用",{"2":{"571":1}}],["通常情况下我们都会使用settimeout执行延时任务",{"2":{"539":1}}],["通常情况下我们常见的是对应主机的ip",{"2":{"454":1}}],["通常情况下",{"2":{"526":1}}],["通常情况下tcp会对传输的数据进行分段并进行编号",{"2":{"385":1}}],["通常情况下tcp会根据窗口大小进行分段传输",{"2":{"376":1}}],["通常情况下记住这张表的转换规则就可以解决所有隐式转换的问题了",{"2":{"41":1,"547":1}}],["通常开发时大家都喜欢console",{"2":{"404":1}}],["通常为",{"2":{"729":1,"938":1}}],["通常为2个最大分段大小",{"2":{"393":1}}],["通常为127",{"2":{"361":1}}],["通常来说",{"2":{"391":1}}],["通常发生在没有延时的情况下",{"2":{"391":1}}],["通常略大于rtt的时间",{"2":{"389":1}}],["通常后者比前者更高效",{"2":{"388":1}}],["通常都是对需要的配置项做修改即可",{"2":{"857":1}}],["通常都是发送一个合并请求",{"2":{"770":1}}],["通常都是从fetch的response的body属性中获取reader",{"2":{"512":1}}],["通常都是使用",{"2":{"512":1}}],["通常都是bytes",{"2":{"510":1}}],["通常都是mime类型",{"2":{"494":1}}],["通常都是一对一这种通信方式",{"2":{"365":1}}],["通常都会用诱人的内容",{"2":{"352":1}}],["通常",{"2":{"364":1,"371":1}}],["通常被表示成四个由点分隔的十进制数",{"2":{"358":1}}],["通常是自动化的",{"2":{"853":1}}],["通常是",{"2":{"729":1}}],["通常是200ms",{"2":{"382":1}}],["通常是将恶意代码存在链接中",{"2":{"350":1}}],["通常是后端没有对sql进行过滤",{"2":{"350":1}}],["通常是由于服务器过载或维护",{"2":{"317":1}}],["通常缓存由浏览器和服务器二者相互协商的实现的",{"2":{"335":1}}],["通常客户端必须首先发送请求才能获取到服务器上的资源",{"2":{"325":1}}],["通常不会改变",{"2":{"204":1,"754":1}}],["通常如下所示",{"2":{"83":1}}],["通过商务与第三方企业合作来实现tob方向的盈利",{"2":{"1233":1}}],["通过运行指令确认`br",{"2":{"1205":1}}],["通过将项目或组的权限设置public解决",{"2":{"1191":1}}],["通过将数据和视图进行绑定",{"2":{"968":1}}],["通过前面文章的学习",{"2":{"1109":1}}],["通过前面的学习你应该对wireshark这款软件的抓包基本功能有了了解",{"2":{"454":1}}],["通过proxy代理其他的仓库",{"2":{"1104":1}}],["通过复制发布",{"2":{"1098":1}}],["通过ip",{"2":{"1085":1}}],["通过构建命令会将当前上下文的文件传递给服务端",{"2":{"1069":1}}],["通过docker以容器的形式部署",{"2":{"1036":1}}],["通过dockerfile可以确保每次构建出的镜像都是相同的",{"2":{"1050":1}}],["通过dockerfile",{"2":{"1000":1}}],["通过命令行登录后",{"2":{"1014":1}}],["通过commit",{"2":{"1000":1}}],["通过class继承",{"2":{"582":1}}],["通过打新标签",{"2":{"1000":1}}],["通过对对象的get",{"2":{"959":1}}],["通过对比referer字段来判断是不是本站请求",{"2":{"353":1}}],["通过原始方法拿到结果",{"2":{"955":1}}],["通过原型延伸到js的继承方式",{"2":{"584":1}}],["通过原型链对构造函数的原型进行继承",{"2":{"580":1}}],["通过observe入口为每一个级别对象生成对应的observer对象",{"2":{"954":1}}],["通过调试堆栈也可以很清晰看到流程是怎么样的",{"2":{"948":1}}],["通过拦截对象的getter",{"2":{"946":1}}],["通过它可以设置成不同的getter",{"2":{"932":1}}],["通过这个疑问并根据响应式原理应该能推出dep肯定和渲染watcher也会有关系的",{"2":{"931":1}}],["通过这个特性也可以实现水平垂直居中",{"2":{"19":1}}],["通过这个特性可以让子元素的居中显示",{"2":{"12":1}}],["通过计算得到的一个值",{"2":{"929":1}}],["通过安装对应的插件就可以轻松搞定",{"2":{"880":1}}],["通过设置stylelintignore忽略不需要进行样式检查的文件",{"2":{"848":1}}],["通过二者配置可以轻松使用环境中的语法和变量以及自定义全局变量",{"2":{"828":1}}],["通过解析代码构建抽象语法树",{"2":{"826":1}}],["通过丰富的插件生态系统提供了众多功能扩展",{"2":{"785":1}}],["通过合理的资源管理",{"2":{"762":1}}],["通过启用ssl会话缓存",{"2":{"726":1}}],["通过启用ssl会话重用来优化",{"2":{"726":1}}],["通过修改",{"2":{"709":1}}],["通过修改不同的网速可以模拟不同的网络环境",{"2":{"420":1}}],["通过配置虚拟主机",{"2":{"706":1}}],["通过负载均衡",{"2":{"705":1}}],["通过数据库增删改查然后返回给控制器",{"2":{"622":1}}],["通过数据分段",{"2":{"375":1}}],["通过提供可注入的标识",{"2":{"606":1}}],["通过module来给应用程序提供元数据",{"2":{"604":1}}],["通过改变prototype",{"2":{"582":1}}],["通过改变发送窗口进行速率的控制",{"2":{"392":1}}],["通过nestjs可以很好的拿到params",{"2":{"613":1}}],["通过new操作来生成对象继承父类的属性和方法",{"2":{"582":1}}],["通过nmap扫描工具",{"2":{"454":1}}],["通过上面实现遗留的问题",{"2":{"951":1}}],["通过上面原型的学习",{"2":{"575":1}}],["通过上面构造函数的知识我们知道以new的形式生成的对象如何指向prototype属性",{"2":{"573":1}}],["通过上面的三种方式进行测试",{"2":{"865":1}}],["通过上面的介绍你应该会了解到浏览器的多线程其实就是让js拥有多线程并发处理异步任务的能力",{"2":{"528":1}}],["通过上面的分析已经对四次挥手有了更深理解了",{"2":{"457":1}}],["通过直接覆盖原型对象的方式添加原型不再是object",{"2":{"572":1}}],["通过一个简单的例子看下效果",{"2":{"950":1}}],["通过一个中介者对象",{"2":{"208":1,"758":1}}],["通过一步一步的分析相信你已经对其执行过程有了初步认识",{"2":{"532":1}}],["通过全方位的学习后其实也挺简单",{"2":{"478":1}}],["通过三次握手两端都知道了对方发送和接收没有问题",{"2":{"456":1}}],["通过和服务端",{"2":{"411":1}}],["通过映射线上环境的sourcemap",{"2":{"408":1}}],["通过动态改变窗口的大小进行控制发送速率",{"2":{"387":1}}],["通过划分子网可以提高网络ip的利用率",{"2":{"372":1}}],["通过http",{"2":{"354":1}}],["通过简单的html页面和nodejs实现多人聊天",{"2":{"354":1}}],["通过以上了解到浏览器是多线程的",{"2":{"536":1}}],["通过以上的分析可以得出xss攻击产生恶意的脚本",{"2":{"350":1}}],["通过以下方式查看系统默认的ttl跳数和msl时间",{"2":{"382":1}}],["通过以下设置允许youtube的iframe",{"2":{"350":1}}],["通过指定可信任资源的白名单",{"2":{"350":1}}],["通过指定子元素的外边距为子元素宽度一半的负值",{"2":{"12":1}}],["通过js将恶意代码渲染到页面上js",{"2":{"350":1}}],["通过在镜像之上创建一个运行实例",{"2":{"1003":1}}],["通过在提交信息中描述功能",{"2":{"788":1}}],["通过在请求头中添加range字段来实现",{"2":{"344":1}}],["通过在传输层与应用层之间插入一层安全层来保护应用层数据的安全性",{"2":{"329":1}}],["通过使用合适的会话超时时间",{"2":{"726":1}}],["通过使用",{"2":{"328":1}}],["通过使用交叉观测器intersectionobserver来观测图片的临界值来加载真实资源",{"2":{"250":1}}],["通过多路复用的技术",{"2":{"324":1}}],["通过抓包工具就可以看到数据内容",{"2":{"303":1}}],["通过getallbuilds遍历builds",{"2":{"237":1}}],["通过grid也可以实现水平垂直居中",{"2":{"21":1}}],["通过",{"2":{"222":1,"572":1,"814":1,"1003":1,"1121":4,"1202":1}}],["通过中介者模式可以解除对象与对象之间的紧耦合关系",{"2":{"208":1,"758":1}}],["通过语句可以看出",{"2":{"88":1}}],["通过观察上述两条语句的结果可以得出",{"2":{"81":1}}],["通过观察上述两个语句的执行结果",{"2":{"81":1}}],["通过拆箱和装箱了解到js引擎对程序的包容性还是很高的",{"2":{"49":1,"555":1}}],["通过执行valueof方法可以得到它的原始值",{"2":{"39":1,"545":1}}],["通过writing",{"2":{"17":1}}],["通过text",{"2":{"16":1}}],["后添加了",{"2":{"1202":1}}],["后16位是主机地址",{"2":{"1085":1}}],["后16位表示主机地址",{"2":{"359":1}}],["后者表示容器端口",{"2":{"1022":1}}],["后者是天生的元编程性能更好",{"2":{"958":1}}],["后者在文件中只会执行一次",{"2":{"871":1}}],["后者可以修改",{"2":{"828":1}}],["后者为当前面模块作用域",{"2":{"628":1}}],["后跟一个空格或者两个换行符",{"2":{"792":1}}],["后突然网络中断",{"2":{"766":1}}],["后续更新",{"2":{"1180":1}}],["后续的请求或响应也必须等待前面的请求或响应完成后才能发送或接收",{"2":{"727":1}}],["后续请求或响应也会被阻塞",{"2":{"727":1}}],["后续会不断补充",{"2":{"239":1}}],["后停止并删除添加的任务",{"2":{"661":1}}],["后执行",{"2":{"660":1}}],["后进先出",{"2":{"592":1}}],["后8位表示主机地址",{"2":{"359":1}}],["后24位表示主机地址",{"2":{"359":1}}],["后两个数字没有分类的作用",{"2":{"317":1}}],["后又使用scroll监测window滚动来兼容ie对intersectionobserver的不支持",{"2":{"250":1}}],["后退",{"2":{"161":1,"526":1}}],["后瞻断言主要是",{"2":{"898":1}}],["后瞻断言",{"0":{"149":1,"898":1}}],["后来就专心搞开发了",{"2":{"92":1}}],["后面得知好好修养脚就会愈合的",{"2":{"1232":1}}],["后面就挂断了",{"2":{"1232":1}}],["后面就会解释",{"2":{"571":2}}],["后面要跟随至少一个参数",{"2":{"1067":1}}],["后面的命令需要基于最初的镜像进行操作",{"2":{"1053":1}}],["后面的代码会作为promise的then代码块执行",{"2":{"532":1}}],["后面的都是对界面的一些控制",{"2":{"452":1}}],["后面的依次类推",{"2":{"90":1}}],["后面会用到",{"2":{"932":1}}],["后面会详细对controller展开讲解",{"2":{"605":1}}],["后面会有其他类型的数组都是同一个道理",{"2":{"482":1}}],["后面会显示一些quickexec操作的信息",{"2":{"435":1}}],["后面会讲到",{"2":{"141":1,"890":1}}],["后面再讲",{"2":{"238":1}}],["后面不在重复这段公共代码",{"2":{"12":1}}],["后台运行nginx",{"2":{"1004":1}}],["后台运行容器",{"2":{"1004":1}}],["后台考虑到",{"2":{"125":1}}],["后台生成验证码",{"2":{"61":1}}],["后台登录",{"2":{"54":1}}],["后台首页",{"2":{"54":2}}],["后台根页面",{"2":{"54":2}}],["后台导航栏",{"2":{"54":1}}],["后台管理系统架构",{"2":{"54":1}}],["后台管理系统界面",{"2":{"54":1}}],["后台文件入口",{"2":{"54":1}}],["后台开发和服务器开发",{"2":{"53":1}}],["后端使用nodejs作为api服务",{"2":{"1034":1}}],["后端语言",{"2":{"785":1}}],["后端服务器",{"2":{"724":1}}],["后端获取文件和其他信息",{"2":{"701":1}}],["后端拿到后验证token的合法性",{"2":{"353":1}}],["后端存储入库时进行转义",{"2":{"350":1}}],["后端数据库",{"2":{"350":2}}],["后端主要是以node作为支撑服务的",{"2":{"126":1}}],["后端一开始采用spring+mysql开发",{"2":{"125":1}}],["后端",{"2":{"52":1}}],["后",{"2":{"40":1,"546":1,"557":1,"711":1}}],["两眼开始眩晕",{"2":{"1236":1}}],["两种方式都演示下",{"2":{"1188":1}}],["两种加密算法各有优缺点",{"2":{"330":1}}],["两秒后nginx进程还是0则杀死keepalived",{"2":{"728":1}}],["两个全局变量",{"2":{"828":1}}],["两个节点的ip分别为192",{"2":{"728":1}}],["两个控制点画圆",{"2":{"285":1}}],["两个非单词字符之间",{"2":{"139":1,"888":1}}],["两个单词字符之间",{"2":{"139":1,"888":1}}],["两个对象引用都引用了同一个对象",{"2":{"30":1}}],["两个对象是联动的",{"2":{"26":1}}],["两栏布局有很多解决方案",{"2":{"111":1}}],["两栏布局问题",{"0":{"111":1}}],["两者对于包的上传没有什么影响",{"2":{"1186":1}}],["两者都是用本地的dockerfile进行构建镜像",{"2":{"1034":1}}],["两者都是引用类型",{"2":{"48":1,"554":1}}],["两者是多对多的关系",{"2":{"954":1}}],["两者声明的变量都是块级作用域",{"2":{"588":1}}],["两者优先级不是固定的",{"2":{"539":1}}],["两者差距太大",{"2":{"326":1}}],["两者相辅相成",{"2":{"168":1}}],["两者首先拆箱转换为基础类型",{"2":{"48":1,"554":1}}],["两者只因相加位类型的不同结果也不同",{"2":{"40":1,"546":1}}],["^feature",{"2":{"1136":2}}],["^4",{"2":{"1074":1}}],["^1",{"2":{"1074":1}}],["^$",{"2":{"938":1}}],["^build",{"2":{"817":1,"818":1}}],["^~",{"2":{"711":1}}],["^在开头代表不是后面要匹配的内容",{"2":{"144":1,"893":1}}],["^0",{"2":{"139":2,"888":2}}],["^a",{"2":{"139":2,"144":1,"888":2,"893":1}}],["^ab",{"2":{"138":1,"887":1}}],["^d+",{"2":{"40":2,"546":2}}],["^",{"2":{"40":2,"43":1,"127":2,"132":1,"139":1,"144":5,"150":1,"177":1,"182":1,"190":1,"350":1,"382":1,"521":2,"546":2,"549":1,"639":1,"687":1,"711":2,"715":3,"716":1,"718":1,"726":2,"729":1,"858":3,"888":1,"893":5,"899":1}}],["执行器的成功案例",{"2":{"1168":1}}],["执行器是为执行器介绍完整性而添加进来的",{"2":{"1168":1}}],["执行器会调用",{"2":{"1167":1}}],["执行器允许您使用您构建现存的",{"2":{"1167":1}}],["执行器允许您很容易地使用依赖的服务",{"2":{"1165":1}}],["执行器",{"0":{"1163":1,"1165":1,"1166":1,"1167":1,"1168":1},"2":{"1166":2}}],["执行每个",{"2":{"1121":1}}],["执行每个dep的depend方法",{"2":{"932":1}}],["执行构建的顶级目录",{"2":{"1121":1}}],["执行这些操作不必重复编写代码",{"2":{"1065":1}}],["执行run函数",{"2":{"964":1}}],["执行removesub这样就会让dep移除对user",{"2":{"940":1}}],["执行传进来的函数",{"2":{"964":1}}],["执行他们",{"2":{"959":1}}],["执行get方法",{"2":{"954":1}}],["执行mount真正执行的函数",{"2":{"954":1}}],["执行挂载时$mount",{"2":{"953":1}}],["执行了$mount才会真正的进行页面渲染",{"2":{"954":1}}],["执行了所有的cbs",{"2":{"951":1}}],["执行了intro函数",{"2":{"930":1,"932":1}}],["执行p1时将activefn设置为p1",{"2":{"951":1}}],["执行intro都可以获取到最新的值",{"2":{"950":1}}],["执行也就会被提前",{"2":{"942":1}}],["执行cbs里的方法也就是p1",{"2":{"951":1}}],["执行cb",{"2":{"938":1}}],["执行computed",{"2":{"934":1}}],["执行console",{"2":{"532":1}}],["执行时会将当前vm传入",{"2":{"938":1}}],["执行它就会卸载监听",{"2":{"940":1}}],["执行它",{"2":{"938":1,"940":1}}],["执行的是methods中对应的方法",{"2":{"936":1}}],["执行的就是这个",{"2":{"239":1}}],["执行update函数",{"2":{"932":1}}],["执行dep的depend方法主动进行依赖收集",{"2":{"932":1}}],["执行dom",{"2":{"526":1}}],["执行计算属性函数触发依赖收集",{"2":{"933":1}}],["执行计算属性的函数得到最新的值",{"2":{"932":1}}],["执行计算属性",{"2":{"932":1,"934":1}}],["执行脚本时带上参数",{"2":{"873":1}}],["执行所有的定时器",{"2":{"870":1}}],["执行测试",{"0":{"860":1}}],["执行栈",{"0":{"592":1},"2":{"592":1}}],["执行等相关操作",{"2":{"587":1}}],["执行上下文包含了当前运行代码的变量对象和词法环境",{"2":{"593":1}}],["执行上下文主要是为当前代码块服务的",{"2":{"593":1}}],["执行上下文",{"0":{"585":1,"593":1},"1":{"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"596":1},"2":{"596":1}}],["执行原型中的eat方法",{"2":{"572":1}}],["执行socket等关闭操作回调",{"2":{"538":1}}],["执行setimmediate回调",{"2":{"538":1}}],["执行除了定时器",{"2":{"538":1}}],["执行定时器任务队列回调",{"2":{"538":1}}],["执行阶段",{"0":{"538":1}}],["执行同步任务",{"2":{"536":1}}],["执行后面的for循环",{"2":{"533":1}}],["执行后打印async1",{"2":{"532":1}}],["执行打印promise1",{"2":{"532":1}}],["执行async1",{"2":{"532":1}}],["执行完后还原",{"2":{"964":1}}],["执行完后",{"2":{"954":1}}],["执行完后再次出栈",{"2":{"531":1}}],["执行完毕然后返回时",{"2":{"529":1}}],["执行结果如下图",{"2":{"436":1}}],["执行请求等等功能",{"2":{"414":1}}],["执行请求",{"2":{"413":1}}],["执行顺序",{"0":{"233":1}}],["执行源函数",{"2":{"232":1}}],["执行",{"2":{"40":1,"540":1,"546":1,"954":1,"964":1,"1063":1,"1178":1}}],["执行tosting",{"2":{"40":1,"546":1}}],["除",{"2":{"1121":2}}],["除非手动停止容器",{"2":{"1025":2}}],["除非是一些应用级别的配置之类的",{"2":{"666":1}}],["除此还支持协议",{"2":{"1022":1}}],["除此之外良好的代码风格会看起来整体划一",{"2":{"835":1}}],["除此之外还会分享一些平时归纳的文章",{"2":{"1223":1}}],["除此之外还定义了环境变量desc的值为dockerfile",{"2":{"1051":1}}],["除此之外还可以使用",{"2":{"1024":1}}],["除此之外还可以针对单个规则添加额外的配置",{"2":{"830":1}}],["除此之外还包括",{"2":{"537":1}}],["除此之外常用的解析器有以下几种",{"2":{"829":1}}],["除此之外子包变多时对于版本的控制也会变得麻烦",{"2":{"811":1}}],["除此之外可以在项目中添加typescript",{"2":{"825":1}}],["除此之外可以在controller",{"2":{"649":1}}],["除此之外可以检测流何时开始或结束",{"2":{"508":1}}],["除了前端也会涉及相关的后端",{"2":{"1223":1}}],["除了",{"2":{"1121":1}}],["除了上述网络类型外",{"2":{"1087":1}}],["除了上面的方法",{"2":{"425":1}}],["除了网络外",{"2":{"1087":1}}],["除了容器中的镜像外",{"2":{"1022":1}}],["除了docker",{"2":{"1008":1}}],["除了date会优先执行tostring方法",{"2":{"40":1,"546":1}}],["除了新启动一个容器外",{"2":{"1004":1}}],["除了提供容器运行时所需的程序",{"2":{"996":1}}],["除了$set外vue还提供了$delete方法当删除某个属性时通知更新视图",{"2":{"956":1}}],["除了查看终端的表格外",{"2":{"874":1}}],["除了对程序进行断言外",{"2":{"872":1}}],["除了次此断言有很多断言的条件",{"2":{"859":1}}],["除了使用docker",{"2":{"1005":1}}],["除了使用open打开对应的界面外",{"2":{"877":1}}],["除了使用ts转义器也可以使用ts",{"2":{"858":1}}],["除了使用自身的方法外",{"2":{"496":1}}],["除了基本参数外",{"2":{"710":1}}],["除了内置的pipe外",{"2":{"645":1}}],["除了参数外",{"2":{"643":1}}],["除了通用的httpexception外",{"2":{"638":1}}],["除了生成并没有提供对应的获取原型的方法",{"2":{"574":1}}],["除了以上列出的工具外",{"2":{"784":1}}],["除了以上列出的进程外",{"2":{"526":1}}],["除了以上对图片进行转换外",{"2":{"718":1}}],["除了以上外对于canvas也可以转换为blob",{"2":{"497":1}}],["除了一些二进制数据外",{"2":{"491":1}}],["除了uint8格式外还有其它typearray的格式相同方法",{"2":{"489":1}}],["除了在欢迎页选择不同的网络接口外",{"2":{"453":1}}],["除了返回本地资源文件外",{"2":{"436":1}}],["除了options",{"2":{"430":1}}],["除了这种方式还可以通过容器的日志",{"2":{"1006":1}}],["除了这种调试",{"2":{"404":1}}],["除了这个内置的显示过滤外",{"2":{"453":1}}],["除了这些还有managerqueue队列",{"2":{"245":1}}],["除了单独监听外",{"2":{"404":1}}],["除了慢启动",{"2":{"394":1}}],["除了referer",{"2":{"353":1}}],["除了配置csp来限制资源的下载",{"2":{"350":1}}],["除了简单的转义操作",{"2":{"350":1}}],["除了指定域名外",{"2":{"347":1}}],["除了jsonp之外大多数都可以使用cors",{"2":{"339":1}}],["除了换行和行结束符",{"2":{"139":1,"888":1}}],["除了联表查询",{"2":{"89":1}}],["除了文中这样",{"2":{"88":1}}],["除了+运算符外",{"2":{"42":1,"548":1}}],["除date外",{"2":{"40":1,"546":1}}],["除date类型其它会优先执行`valueof`",{"2":{"40":1,"546":1}}],["若您愿意深度交流",{"2":{"1224":1}}],["若你确定节点的时间一致可以忽略此步骤",{"2":{"1204":1}}],["若果一个阶段有多个作业",{"2":{"1126":1}}],["若果用settimeout做动画时间设置成17ms",{"2":{"534":1}}],["若全局有",{"2":{"1124":1}}],["若想覆盖dockerfile中的entrypoint时",{"2":{"1064":1}}],["若运行容器时再次指定了cmd的参数",{"2":{"1064":1}}],["若dockerfile中cmd和entrypoint都存在",{"2":{"1064":1}}],["若有多个容器时可能还存在启动优先级的问题",{"2":{"1016":1}}],["若有会直接进入timer阶段执行回调",{"2":{"538":1}}],["若key已经存在了",{"2":{"956":1}}],["若lint",{"2":{"805":1}}],["若加以工具辅助",{"2":{"782":1}}],["若图片太大缓冲区太小则会抛415错误",{"2":{"718":1}}],["若已安装可以跳过此步骤",{"2":{"718":1}}],["若要在controller中使用需要在构造器中注入",{"2":{"661":1}}],["若在某个代码块中声明的变量是不能在外部作用域中访问到的",{"2":{"588":1}}],["若在传输的过程中出现了丢包",{"2":{"385":1}}],["若将settimeout的时间设置为0是不是和前者有同样的效果",{"2":{"539":1}}],["若执行栈的任务还没有执行完",{"2":{"533":1}}],["若执行结果为基础类型则返回",{"2":{"40":2,"546":2}}],["若js变成一个多线程的语言",{"2":{"524":1}}],["若tcp累积确认无法返回新的ack",{"2":{"391":1}}],["若项目中的存在",{"2":{"268":1}}],["若项目中引用了根目录以上的文件",{"2":{"268":1}}],["若一方为number类型",{"2":{"44":2,"550":2}}],["若一方是string类型",{"2":{"44":1,"550":1}}],["若转换者存在对象类型",{"2":{"41":1,"547":1}}],["若某一个方法返回的不是基础类型",{"2":{"40":1,"546":1}}],["若返回的结果不是基础类型则抛异常",{"2":{"40":1,"546":1}}],["`p4",{"2":{"960":1}}],["`p3",{"2":{"959":1,"960":1}}],["`p2",{"2":{"959":1,"963":1}}],["`p1",{"2":{"959":1,"963":1}}],["`ps",{"2":{"728":1}}],["`设置",{"2":{"958":1}}],["`页面3",{"2":{"951":1}}],["`页面2",{"2":{"951":1}}],["`页面1",{"2":{"951":1}}],["`属性",{"2":{"951":1}}],["`getter",{"2":{"941":1}}],["`出错了",{"2":{"771":1}}],["`my",{"2":{"580":1,"582":2,"583":2}}],["`transform",{"2":{"521":1}}],["`bytes",{"2":{"520":1}}],["`birth`",{"2":{"75":1}}],["`server",{"2":{"404":1,"455":1}}],["`student`",{"2":{"86":1}}],["`33196`",{"2":{"382":1}}],["`url",{"2":{"249":1}}],["`v",{"2":{"244":1}}],["`new`",{"2":{"238":1}}],["`name`",{"2":{"75":1,"86":2}}],["`failed",{"2":{"232":1}}],["`我的名字",{"2":{"201":1,"751":1,"929":2,"930":1,"931":1,"932":1,"950":1,"955":1}}],["`号的水果",{"2":{"150":1,"899":1}}],["`€`",{"2":{"148":2,"897":2}}],["`匹配到了java`",{"2":{"145":1,"154":1,"894":1,"903":1}}],["`regexp`的静态属性上",{"2":{"145":1,"894":1}}],["`class`",{"2":{"86":1}}],["`class",{"2":{"86":1}}],["`age`",{"2":{"75":1,"86":1}}],["`id`",{"2":{"75":2,"86":4}}],["`",{"2":{"40":3,"62":1,"140":3,"145":8,"150":13,"154":2,"166":2,"190":2,"195":1,"201":1,"230":2,"232":1,"239":1,"244":1,"249":1,"343":1,"354":4,"404":1,"455":1,"520":1,"521":1,"546":3,"576":1,"582":2,"583":2,"639":2,"687":2,"688":1,"718":2,"745":1,"751":1,"771":1,"772":2,"889":3,"894":8,"899":13,"903":2,"938":2,"941":1,"950":1,"951":5,"955":1,"958":1,"959":3,"960":2,"963":2,"1034":2}}],["`$`",{"2":{"149":2,"898":2}}],["`$",{"2":{"40":3,"62":1,"195":1,"203":1,"230":1,"343":1,"546":3,"576":1,"634":1,"688":1,"745":1,"753":1}}],["`hint`",{"2":{"40":1,"546":1}}],["xpdhn",{"2":{"1217":1}}],["xkkkt",{"2":{"1217":1}}],["xr",{"2":{"1064":10}}],["xenial",{"2":{"1060":1}}],["x509",{"2":{"726":3,"1178":2,"1209":1,"1212":1}}],["xf",{"2":{"718":1,"1208":1}}],["xhr",{"2":{"350":1}}],["xhtml+xml|xmldocument|",{"2":{"117":1}}],["xhtml+xml",{"2":{"117":1,"347":1}}],["xsstrike",{"2":{"355":1}}],["xss攻击通常分为三种类型",{"2":{"350":1}}],["xss",{"0":{"350":1},"2":{"350":13,"355":2}}],["x才发布的",{"2":{"182":1}}],["x是必选的字段",{"2":{"175":1}}],["x开始增加mode为必要字段",{"2":{"173":1}}],["x进行配置",{"2":{"170":1}}],["x表示匹配前面不是y的x",{"2":{"149":1,"898":1}}],["x表示匹配前面紧跟着y的x",{"2":{"149":1,"898":1}}],["x和",{"2":{"149":1,"898":1}}],["xx",{"2":{"131":1,"298":15,"454":8,"497":1,"728":12,"1142":1}}],["xxx",{"2":{"190":1,"199":1,"232":1,"350":1,"434":3,"454":1,"514":1,"606":7,"609":2,"613":1,"711":1,"749":1,"770":1,"1070":1,"1142":1,"1178":1}}],["xxx$",{"2":{"127":1}}],["xxxxx",{"2":{"1096":1,"1174":1}}],["xxxxxx",{"2":{"1083":1}}],["xxxx",{"2":{"56":2,"404":1,"1102":1,"1174":1}}],["xvg+xml|xmldocument|",{"2":{"117":1}}],["xml格式",{"2":{"874":1}}],["xmlhttprequest",{"2":{"498":1}}],["xmlns=",{"2":{"118":1}}],["xml|xmldocument|",{"2":{"117":2}}],["xmldocument",{"2":{"117":1}}],["xml",{"2":{"115":1,"117":1,"118":4,"347":1,"874":1,"1139":1}}],["xmlserializer对象拥有一个serializetostring的方法",{"2":{"121":1}}],["xmlserializer接口提供serializetostring",{"2":{"119":1}}],["xmlserializer",{"0":{"114":1,"119":1},"1":{"115":1,"116":1,"117":1,"118":1,"119":1,"120":2,"121":2,"122":2},"2":{"120":1}}],["xufeng",{"2":{"83":2}}],["xn",{"2":{"83":2}}],["x200f",{"2":{"462":1}}],["x200e",{"2":{"462":1}}],["x2",{"2":{"83":2,"285":1}}],["x26",{"2":{"40":2,"48":4,"173":2,"195":8,"205":6,"229":2,"232":2,"237":1,"238":7,"239":2,"244":4,"247":2,"249":2,"462":9,"473":2,"520":2,"546":2,"554":4,"571":1,"576":2,"581":2,"583":6,"651":2,"687":2,"718":4,"726":2,"729":1,"745":8,"755":6,"771":4,"772":1,"805":2,"813":2,"850":3,"870":2,"932":2,"937":2,"941":2,"944":8,"945":4,"954":16,"955":4,"956":4,"962":2,"964":6,"1056":2,"1065":2,"1070":2,"1073":2,"1074":2,"1136":2,"1152":2,"1172":2,"1183":2,"1184":4,"1206":2}}],["x1",{"2":{"83":2,"285":1}}],["x",{"2":{"83":22,"98":13,"128":3,"130":1,"147":3,"148":2,"149":1,"157":1,"160":1,"164":1,"174":1,"177":1,"195":4,"222":1,"233":3,"251":2,"283":2,"284":2,"285":1,"337":1,"339":7,"342":1,"343":1,"344":1,"350":7,"404":4,"438":1,"453":1,"529":2,"606":1,"671":1,"692":2,"704":1,"709":1,"723":7,"724":8,"745":4,"869":2,"896":3,"897":2,"898":1,"1005":1,"1007":1,"1034":4,"1064":8,"1102":2,"1183":4}}],["x3c",{"2":{"12":4,"13":4,"14":4,"15":4,"16":4,"17":10,"18":10,"19":4,"20":4,"21":4,"22":4,"40":1,"61":2,"63":6,"83":4,"98":1,"110":42,"111":18,"112":18,"118":4,"145":4,"149":2,"154":3,"197":2,"199":2,"203":1,"204":4,"207":28,"222":24,"228":2,"229":8,"230":5,"231":4,"232":7,"237":1,"239":3,"245":6,"247":1,"248":3,"249":2,"350":37,"352":7,"354":7,"400":1,"401":1,"404":24,"485":1,"497":1,"499":2,"510":1,"517":1,"520":2,"533":1,"534":3,"535":1,"546":1,"581":1,"594":2,"603":1,"611":1,"619":1,"628":1,"629":1,"631":1,"637":1,"639":2,"648":3,"651":2,"671":16,"674":2,"692":1,"712":10,"715":2,"716":1,"724":12,"726":1,"728":3,"747":2,"749":2,"753":1,"754":4,"757":28,"765":1,"768":1,"771":4,"788":7,"857":3,"862":1,"863":1,"869":1,"875":4,"878":1,"879":1,"894":4,"898":2,"903":3,"920":7,"921":1,"929":12,"930":11,"934":22,"936":6,"937":1,"938":1,"943":6,"944":4,"950":1,"951":10,"954":3,"955":5,"956":1,"959":4,"960":1,"964":9,"994":3,"1002":1,"1020":2,"1021":1,"1022":4,"1023":2,"1024":4,"1025":1,"1027":2,"1034":5,"1053":3,"1054":2,"1055":2,"1057":6,"1058":1,"1059":10,"1060":11,"1062":3,"1065":1,"1085":1,"1090":4,"1142":1,"1147":1,"1183":2,"1205":4,"1206":2,"1210":2,"1217":7,"1218":6,"1230":1}}],["返回状态码",{"2":{"715":1}}],["返回浏览器会在头部加上对应的文件类型",{"2":{"709":1}}],["返回应用实例",{"2":{"603":1}}],["返回包含两个",{"2":{"512":1}}],["返回改可读流是否被锁定到一个reader",{"2":{"511":1}}],["返回blob的可读流readablestream",{"2":{"496":1}}],["返回boolean类型",{"2":{"152":2,"901":2}}],["返回具体其引用arraybuffer的起始位置偏移量",{"2":{"484":1}}],["返回范围内容的domrect",{"2":{"462":1}}],["返回range中所有节点文档片段",{"2":{"462":1}}],["返回不同状态码",{"2":{"436":1}}],["返回本地图片",{"2":{"436":1}}],["返回的数据可以在模板引擎中拿到",{"2":{"671":1}}],["返回的值将被忽略",{"2":{"229":1}}],["返回的结果取决于相应的条件测试是否为真",{"2":{"83":1}}],["返回的结果是个字符串1而不是数字",{"2":{"40":1,"546":1}}],["返回匹配正则表达式的迭代器",{"2":{"154":1,"903":1}}],["返回数据",{"2":{"652":1}}],["返回数组",{"2":{"154":1,"903":1}}],["返回数字所代表的ip地址",{"2":{"83":1}}],["返回数字x截短为y位小数的结果",{"2":{"83":1}}],["返回",{"2":{"117":1,"462":1,"529":1}}],["返回mysql服务器的版本",{"2":{"83":1}}],["返回最后一个select查询进行检索的总行数",{"2":{"83":1}}],["返回当前",{"2":{"934":1}}],["返回当前登陆用户名",{"2":{"83":1}}],["返回当前客户的连接id",{"2":{"83":1}}],["返回当前数据库名",{"2":{"83":1}}],["返回当前的时间",{"2":{"83":1}}],["返回当前的日期和时间",{"2":{"83":1}}],["返回当前的日期",{"2":{"83":1}}],["返回ip地址的数字表示",{"2":{"83":1}}],["返回arg1",{"2":{"83":1}}],["返回t",{"2":{"83":1}}],["返回time的分钟值",{"2":{"83":1}}],["返回time的小时值",{"2":{"83":1}}],["返回用密钥key对字符串str利用高级加密标准算法解密后的结果",{"2":{"83":1}}],["返回用密钥key对字符串str利用高级加密标准算法加密后的结果",{"2":{"83":1}}],["返回两个日期值之间的差值",{"2":{"83":1}}],["返回日期date的年份",{"2":{"83":1}}],["返回日期date为一年中第几周",{"2":{"83":1}}],["返回日期date加上间隔时间int的结果",{"2":{"83":2}}],["返回date在一年中的季度",{"2":{"83":1}}],["返回date的月份名",{"2":{"83":1}}],["返回date的月份值",{"2":{"83":1}}],["返回date的星期名",{"2":{"83":1}}],["返回date是一年的第几天",{"2":{"83":1}}],["返回date是一个月的第几天",{"2":{"83":1}}],["返回date所代表的一星期中的第几天",{"2":{"83":1}}],["返回default条件结果",{"2":{"40":1,"546":1}}],["返回将字符串str中所有字符转变为大写后的结果",{"2":{"83":1}}],["返回将字符串str中所有字符改变为小写后的结果",{"2":{"83":1}}],["返回颠倒字符串str的结果",{"2":{"83":1}}],["返回子串substr在字符串str中第一次出现的位置",{"2":{"83":1}}],["返回str在list中的位置",{"2":{"83":1}}],["返回string条件结果",{"2":{"40":1,"546":1}}],["返回结果基本和迭代器一致",{"2":{"154":1,"903":1}}],["返回结果",{"2":{"83":1}}],["返回字符串str的加密版本",{"2":{"83":1}}],["返回字符串str尾部的空格",{"2":{"83":1}}],["返回字符串str重复x次的结果",{"2":{"83":1}}],["返回字符串str中最右边的x个字符",{"2":{"83":1}}],["返回字符串str中最左边的x个字符",{"2":{"83":1}}],["返回字符串str中的字符数",{"2":{"83":1}}],["返回字符串的比特长度",{"2":{"83":1}}],["返回字符的ascii码值",{"2":{"83":1}}],["返回一个数的平方根",{"2":{"83":1}}],["返回代表数字x的符号的值",{"2":{"83":1}}],["返回参数x的四舍五入的有y位小数的值",{"2":{"83":1}}],["返回0到1内的随机值",{"2":{"83":1}}],["返回pi的值",{"2":{"83":1}}],["返回x",{"2":{"83":1}}],["返回x的以y为底的对数",{"2":{"83":1}}],["返回x的自然对数",{"2":{"83":1}}],["返回x的二进制",{"2":{"83":1}}],["返回x的绝对值",{"2":{"83":1}}],["返回集合中最小的值",{"2":{"83":1}}],["返回集合中最大的值",{"2":{"83":1}}],["返回小于x的最大整数值",{"2":{"83":1}}],["返回值e",{"2":{"83":1}}],["返回大于x的最小整数值",{"2":{"83":1}}],["返回由属于一组的列值连接组合而成的结果",{"2":{"83":1}}],["返回指定列的所有值之和",{"2":{"83":1}}],["返回指定列的最大值",{"2":{"83":1}}],["返回指定列的最小值",{"2":{"83":1}}],["返回指定列的平均值",{"2":{"83":1}}],["返回指定列中非null值的个数",{"2":{"83":1}}],["返回了一个函数",{"2":{"9":1}}],["有挑战也有机遇",{"2":{"1237":1}}],["有成功也有失败",{"2":{"1237":1}}],["有欢笑也有泪水",{"2":{"1237":1}}],["有个姐也早成家有自己的新居了",{"2":{"1232":1}}],["有个optimization",{"2":{"130":1}}],["有需要的话",{"2":{"1224":1}}],["有很多",{"2":{"1158":1}}],["有很多这种代码",{"2":{"200":1,"750":1}}],["有ssd不算",{"2":{"1078":1}}],["有string",{"2":{"40":1,"546":1}}],["有空格的值要用双引号包括",{"2":{"1057":1}}],["有图形化",{"2":{"1039":1}}],["有多少个运行函数就会收集多少个",{"2":{"959":1}}],["有一些钩子函数可以用于在测试执行的不同阶段执行额外的操作或设置",{"2":{"881":1}}],["有一个问题就是如何判断上传的文件是上次上传的文件",{"2":{"772":1}}],["有的配置对于",{"2":{"878":1}}],["有的话进行背景图渲染",{"2":{"249":1}}],["有以下优势",{"2":{"785":1}}],["有兴趣的可以试试",{"2":{"775":1}}],["有兴趣的小伙伴可以动手试试",{"2":{"233":1}}],["有了相关的角色后",{"2":{"1101":1}}],["有了角色就可以创建用户关联此角色了",{"2":{"1100":1}}],["有了角色权限后就可以创建对应的用户赋予权限",{"2":{"1043":1}}],["有了容器化技术对于应用的部署更加方便",{"2":{"1079":1}}],["有了配置文件后可以通过命令行对整个服务进行发布",{"2":{"1027":1}}],["有了i18n还需要语言包",{"2":{"676":1}}],["有了路由只是程序的基础功能",{"2":{"668":1}}],["有了reflect",{"2":{"227":1}}],["有可能有丢失的包的可能",{"2":{"457":1}}],["有三种",{"2":{"404":1}}],["有时候需要两种版本api同时存在",{"2":{"654":1}}],["有时候需要改代码啥的",{"2":{"407":1}}],["有时头部的长度可能都会大于真实的数据长度",{"2":{"326":1}}],["有时使用起来非常方便",{"2":{"83":1}}],["有关dockerfile的概念和使用可以查看我的",{"2":{"1000":1}}],["有关更多注册方式你可以点击这里参考文档",{"2":{"635":1}}],["有关intersectionobserver的使用可以详见mdn",{"2":{"245":1}}],["有关typescript的装饰器的基本使用就介绍完了",{"2":{"233":1}}],["有人把外观模式看成一组对象的适配器",{"2":{"206":1,"756":1}}],["有默认值",{"2":{"206":1,"756":1}}],["有development和production两种模式",{"2":{"182":1}}],["有回车符",{"2":{"152":1,"901":1}}],["有或者没有都行",{"2":{"141":1,"890":1}}],["有没有想过",{"2":{"100":1}}],["有点魔鬼",{"2":{"79":1}}],["有点流氓",{"2":{"78":1}}],["有条件",{"2":{"79":1}}],["有些用来确认数据包",{"2":{"455":1}}],["有些写法我们日常都在使用",{"2":{"194":1,"744":1}}],["有些时候",{"2":{"184":1}}],["有些前端开发的同学总是对分页比较陌生",{"2":{"63":1}}],["有些同学可能看到这里",{"2":{"48":1,"554":1}}],["有缓存时不用递归",{"2":{"33":1}}],["拆箱则是将包装类型转化为对应的基础类型",{"2":{"39":1,"545":1}}],["拆箱",{"0":{"39":1,"545":1},"2":{"40":1,"546":1}}],["拆箱和类型的隐式转换规则",{"2":{"36":1,"542":1}}],["也越来越蓝瘦",{"2":{"1236":1}}],["也想说明目前市场形势暗淡",{"2":{"1233":1}}],["也希望今年国庆能在家里呆久一点陪陪我爸妈",{"2":{"1233":1}}],["也没有怎么说话",{"2":{"1232":1}}],["也没有找到vue的定义",{"2":{"238":1}}],["也解决了第一种方法关闭卡顿的问题",{"2":{"1202":1}}],["也请参考下官方文档",{"2":{"1194":1}}],["也及时可以当做包仓库使用",{"2":{"1185":1}}],["也无法被外部网络访问",{"2":{"1087":1}}],["也更好维护",{"2":{"1079":1}}],["也需要确保容器运行的应用程序实际上监听了指定的端口号",{"2":{"1062":1}}],["也需要在顶级进行定义",{"2":{"1022":1}}],["也便于在主机上修改相应的配置文件",{"2":{"1061":1}}],["也方便后续的维护",{"2":{"834":1}}],["也声明了block",{"2":{"588":1}}],["也来稍微改造",{"2":{"583":1}}],["也继承了父类的原型",{"2":{"583":1}}],["也称为c",{"2":{"993":1}}],["也称为原型链的顶端",{"2":{"571":1}}],["也称二进制指数避退",{"2":{"390":1}}],["也指向到它的构造函数的prototype属性",{"2":{"571":1}}],["也能在ci",{"2":{"1070":1}}],["也能更好的通过事件循环机制调度任务执行的优先级",{"2":{"541":1}}],["也能用来表示动态资源",{"2":{"316":1}}],["也不推荐使用",{"2":{"813":1}}],["也不会占用过高内存和带宽",{"2":{"767":1}}],["也不会影响到原有的对象",{"2":{"573":1}}],["也不会卡顿",{"2":{"535":1}}],["也不考虑他们将来可能会如何演化",{"2":{"206":1,"756":1}}],["也永远不会去执行",{"2":{"533":1}}],["也执行完毕然后返回时",{"2":{"529":1}}],["也将服务端的syn+1",{"2":{"456":1}}],["也有跳过错误和重试成功的",{"2":{"771":1}}],["也有互联网上其他人的一些问题",{"2":{"424":1}}],["也有些场景下还是会用到背景图",{"2":{"246":1}}],["也可能会删除不正确的镜像",{"2":{"1002":1}}],["也可用mutationobserverapi来代替",{"2":{"404":1}}],["也可以自签证书",{"2":{"1178":1}}],["也可以自定义域名",{"2":{"1175":1}}],["也可以自己编写底层的操作系统配置和应用程序安装脚本",{"2":{"1049":1}}],["也可以重置密码",{"2":{"1174":1}}],["也可以选择已经存在的角色",{"2":{"1099":1}}],["也可以选择不同的接口和详细的抓包选项",{"2":{"453":1}}],["也可以通过网络连接运行在不同的机器上",{"2":{"993":2,"1080":2}}],["也可以通过",{"2":{"955":1}}],["也可以通过前面提到的mutatorobserverapi来调试",{"2":{"404":1}}],["也可以作为资源目录列表",{"2":{"712":1}}],["也可以作为电子邮件",{"2":{"704":1}}],["也可以参考express的使用方式",{"2":{"694":1}}],["也可以对controller进行版本区分",{"2":{"655":1}}],["也可以针对某个请求方法等等",{"2":{"635":1}}],["也可以转换成",{"2":{"493":1}}],["也可以在多个主机上运行同一组容器",{"2":{"1016":1}}],["也可以在公有云上部署",{"2":{"1013":1}}],["也可以在不同类型的测试中进行覆盖",{"2":{"878":1}}],["也可以在抓包页面上方的类似设置的按钮中",{"2":{"453":1}}],["也可以在终端输入ipconfig查询或其他方法",{"2":{"438":1}}],["也可以将左侧的抓包记录鼠标按住拖到当前面板",{"2":{"436":1}}],["也可以限制不同的网速模拟网络环境",{"2":{"430":1}}],["也可以编辑请求内容",{"2":{"419":1}}],["也可以设置系统代理",{"2":{"414":1}}],["也可以理解成tcp首部总长度",{"2":{"376":1}}],["也可以用其他以127开头的地址",{"2":{"361":1}}],["也可以使用https",{"2":{"1175":1}}],["也可以使用docker创建的卷",{"2":{"1022":1}}],["也可以使用build来进行本地镜像的构建",{"2":{"1021":1}}],["也可以使用本地dockerfile进行构建",{"2":{"1021":1}}],["也可以使用其他的镜像仓库地址",{"2":{"1012":1}}],["也可以使用终端进行测试不用打开界面",{"2":{"877":1}}],["也可以使用相关的装饰器进行显示定义",{"2":{"686":1}}],["也可以使用底层库相应对象进行处理",{"2":{"616":1}}],["也可以使用",{"2":{"347":1}}],["也可以使用nghttp工具进行查看",{"2":{"325":1}}],["也可以指定loading",{"2":{"249":1}}],["也可以按顺序访问其中的每个元素",{"2":{"203":1,"753":1}}],["也可以减小请求时间",{"2":{"129":1}}],["也可以子查询",{"2":{"89":1}}],["也可以是左联右联",{"2":{"88":1}}],["也可以连接sql",{"2":{"70":1}}],["也会下载包的依赖",{"2":{"1103":1}}],["也会自动解压",{"2":{"1060":1}}],["也会创建一个新的函数上下文并推入执行栈中",{"2":{"593":1}}],["也会将构造器本身作为子类构造器的原型来让其拥有其静态属性",{"2":{"583":1}}],["也会将name转换为new",{"2":{"38":1,"544":1}}],["也会拥有prototype对象中的属性和方法",{"2":{"577":1}}],["也会记住发送方的ip和mac地址",{"2":{"454":1}}],["也会显示出过滤的输入框",{"2":{"453":1}}],["也会启动一个web",{"2":{"399":1}}],["也就可以做一些其他的操作",{"2":{"950":1}}],["也就会让这些函数重新执行一遍",{"2":{"959":1}}],["也就会重新页面渲染",{"2":{"954":1}}],["也就会执行parsepath返回的函数",{"2":{"938":1}}],["也就会读取commitizen的规则",{"2":{"802":1}}],["也就会污染全局变量",{"2":{"588":1}}],["也就会涉及到变量声明",{"2":{"586":1}}],["也就无法进行正常的tcp连接了",{"2":{"381":1}}],["也就是重试2次",{"2":{"1132":1}}],["也就是在我们的私有仓库中找不到daynpm包",{"2":{"1103":1}}],["也就是在自己本地启动一个服务器",{"2":{"425":1}}],["也就是需要登录认证",{"2":{"1101":1}}],["也就是触发render",{"2":{"954":1}}],["也就是进行setter",{"2":{"954":1}}],["也就是getter",{"2":{"953":1}}],["也就是数据更新只会触发当前组件重新渲染",{"2":{"953":1}}],["也就是有了dep对象",{"2":{"951":1}}],["也就是有量词的时候",{"2":{"150":1,"899":1}}],["也就是vm",{"2":{"937":1}}],["也就是不会立马执行computed回调",{"2":{"934":1}}],["也就是这个操作会让响应式对象和渲染watcher产生关系",{"2":{"932":1}}],["也就是这些模块是外部的",{"2":{"185":1}}],["也就是某些对象等key的dep",{"2":{"932":1}}],["也就是收集了当前计算watcher的所有dep",{"2":{"932":1}}],["也就是会收集当前计算属性的watcher",{"2":{"932":1}}],["也就是会一行一行解释",{"2":{"587":1}}],["也就是访问",{"2":{"932":1}}],["也就是计算属性watcher",{"2":{"932":1}}],["也就是当你执行数组的方法时如",{"2":{"955":1}}],["也就是当前的",{"2":{"954":1}}],["也就是当前作用域的",{"2":{"588":1}}],["也就是当计算属性依赖的data值没有发生变化时",{"2":{"930":1}}],["也就是sh脚本",{"2":{"805":1}}],["也就是原始大小",{"2":{"718":1}}],["也就是没将代码中定义的相关参数表现出来",{"2":{"683":1}}],["也就是没有优惠券",{"2":{"205":1,"755":1}}],["也就是let",{"2":{"588":1}}],["也就是赋值后不能再修改",{"2":{"588":1}}],["也就是未定义值的变量",{"2":{"587":1}}],["也就是变量声明等一系列的处理",{"2":{"587":1}}],["也就是new的时候也会拥有父类的实例属性和方法",{"2":{"582":1}}],["也就是js引擎的执行会阻塞gui线程渲染的执行",{"2":{"526":1}}],["也就是发送服务端的fin报文",{"2":{"457":1}}],["也就是常说的三次握手",{"2":{"455":1}}],["也就是ack为1时上图中的确认号才会有效",{"2":{"376":1}}],["也就是预主密钥",{"2":{"332":1}}],["也就是占位图",{"2":{"242":1}}],["也就是相互影响",{"2":{"201":1,"751":1}}],["也就是我们创建好的",{"2":{"176":1}}],["也就是说包名是",{"2":{"1186":1}}],["也就是说每次运行一个函数时都会将其设置为正在运行的函数",{"2":{"959":1}}],["也就是说在模板渲染中对intro函数的执行只触发了一次",{"2":{"930":1}}],["也就是说在下次需要使用该资源或该资源可能会被使用时",{"2":{"131":1}}],["也就是说作用域链决定了你可以访问到哪些不属于当前作用域的一些变量等信息",{"2":{"591":1}}],["也就是说会先声明函数",{"2":{"587":1}}],["也就是说视图更新的帧率为60fps",{"2":{"535":1}}],["也就是说当被锁定时",{"2":{"511":1}}],["也就是说uint8的每一位的数字范围为",{"2":{"482":1}}],["也就是说网络中最大的存活时间",{"2":{"382":1}}],["也就是说从数据的开始到紧急指针的位置为紧急数据",{"2":{"376":1}}],["也就是说",{"2":{"330":1}}],["也就是说项目中所有的文件都会受作用",{"2":{"268":1}}],["也就是说打包运行的就是这个文件",{"2":{"237":1}}],["也就是说不用转义这个文件夹里面的",{"2":{"179":1}}],["也就是说运算双方都必须是或转换为数字",{"2":{"42":1,"548":1}}],["也就是储存在数据库中",{"2":{"67":1}}],["也就是两个对象指向的是同一个存储空间",{"2":{"26":1}}],["也使用会话秘钥给客户端发送一个会话摘要",{"2":{"332":1}}],["也负责接收物理层传输的帧并解封装成数据包",{"2":{"310":1}}],["也容易管理",{"2":{"237":1}}],["也是他们不想让我知道怕影响我工作让我伤心",{"2":{"1232":1}}],["也是要干活",{"2":{"1232":1}}],["也是只能最后一个生效",{"2":{"1064":1}}],["也是通过dirty来控制的",{"2":{"934":1}}],["也是外部不能访问",{"2":{"589":1}}],["也是个普通对象",{"2":{"577":1}}],["也是看了高程",{"2":{"523":1}}],["也是作者刚开始使用时面临的问题",{"2":{"424":1}}],["也是攻击者经常利用的目标之一",{"2":{"349":1}}],["也是我觉得比较重要的内容",{"2":{"271":1}}],["也是在一个网站中",{"2":{"221":1}}],["也是一款开源的",{"2":{"217":1}}],["也算是适配器的一种应用",{"2":{"206":1,"756":1}}],["也学会了从简单的算术运算到逻辑运算的隐式转换规则",{"2":{"49":1,"555":1}}],["基于条件过滤输出",{"2":{"1006":1}}],["基于",{"2":{"829":1,"965":1}}],["基于流的构建工具",{"2":{"784":1}}],["基于typescript装饰器结合ioc让nest的框架设计更加清晰明了",{"2":{"601":1}}],["基于v8",{"2":{"525":1}}],["基于时间和基于冗余ack",{"2":{"388":1}}],["基于字节流的传输层协议",{"2":{"374":1}}],["基于具体时间",{"2":{"319":1}}],["基于ip协议",{"2":{"295":1}}],["基线对齐",{"2":{"284":1}}],["基础镜像可以是空镜像如",{"2":{"1069":1}}],["基础文件系统",{"2":{"997":1}}],["基础类型",{"0":{"907":1}}],["基础类型不会有属性的",{"2":{"38":1,"544":1}}],["基础不同类型转换的值可以根据上面的表格进行判断",{"2":{"44":1,"550":1}}],["基本面板左侧可以查找对应的仓库包文件",{"2":{"1096":1}}],["基本端测",{"0":{"879":1}}],["基本环境配置好后",{"2":{"859":1}}],["基本断言",{"0":{"859":1},"1":{"860":1}}],["基本断点",{"2":{"404":1}}],["基本不会超时",{"2":{"767":1}}],["基本的form表单上传",{"2":{"765":1}}],["基本的架构设计",{"2":{"601":1}}],["基本使用",{"0":{"637":1,"642":1,"648":1,"655":1,"695":1}}],["基本和我们自己写的寄生组合式继承的对象一致",{"2":{"583":1}}],["基本就是一问一答简单形式",{"2":{"454":1}}],["基本都一样",{"2":{"418":1}}],["基本上已经可以满足上传需求了",{"2":{"775":1}}],["基本上都是静态页面和简单的功能",{"2":{"524":1}}],["基本上的图标控制按钮就这么简单",{"2":{"452":1}}],["基本上常见的操作系统都可以支持的",{"2":{"450":1}}],["基本上在菜单栏已经介绍的差不多了",{"2":{"415":1}}],["基本上200ms",{"2":{"130":1}}],["基本配置就说这么多",{"2":{"878":1}}],["基本配置",{"0":{"175":1,"692":1}}],["基本",{"0":{"157":1,"283":1}}],["基本操作",{"0":{"71":1}}],["基本类型结果将会返回",{"2":{"40":2,"546":2}}],["基本数据类型的特点",{"2":{"24":1}}],["基本相似",{"2":{"8":1}}],["下的对应的html文件",{"2":{"966":1}}],["下图便是官方的测试例子",{"2":{"877":1}}],["下图是在没有配置https的情况下",{"2":{"421":1}}],["下图模拟了当请求http",{"2":{"414":1}}],["下方是三次握手连接的示意图",{"2":{"378":1}}],["下一篇讲",{"2":{"953":1}}],["下一次ssl握手将会重新生成一个新的会话密钥",{"2":{"726":1}}],["下一轮清除工作",{"2":{"558":1}}],["下一个错误或警告位置",{"2":{"161":1}}],["下一行插入",{"2":{"157":1}}],["下一行前销毁当前对象",{"2":{"38":1,"544":1}}],["下标都是由0开始",{"2":{"90":1}}],["下载配置文件",{"2":{"1217":1}}],["下载npm包",{"2":{"1191":1}}],["下载nginx",{"2":{"999":1}}],["下载好后使用docker",{"2":{"1171":1}}],["下载好后查看nginx版本",{"2":{"707":1}}],["下载docker",{"2":{"1082":1}}],["下载镜像并运行",{"2":{"1094":1}}],["下载镜像并运行sh",{"2":{"1038":1}}],["下载镜像可以使用docker",{"2":{"1047":1}}],["下载镜像",{"0":{"1047":1,"1151":1},"2":{"1038":1}}],["下载准备",{"2":{"707":1}}],["下载等等",{"2":{"478":1}}],["下载后打开大概长这个样子",{"2":{"450":1}}],["下载后端依赖",{"2":{"56":1}}],["下载完后一路点击确定安装就可",{"2":{"450":1}}],["下载完毕后",{"2":{"93":1}}],["下载即可",{"2":{"450":1}}],["下载简单",{"2":{"450":1}}],["下载大文件",{"2":{"344":1}}],["下载依赖webpack",{"2":{"190":1}}],["下载了全局nodemon",{"2":{"96":1}}],["下载8",{"2":{"68":1}}],["下载",{"0":{"999":1},"2":{"68":1,"521":1,"718":1,"999":2}}],["下载安装到电脑shnpm",{"2":{"215":1}}],["下载安装好后使用命令nvm",{"2":{"97":1}}],["下载安装nvm",{"0":{"93":1}}],["下载安装",{"0":{"68":1,"412":1,"450":1}}],["下载管理员前端依赖",{"2":{"56":1}}],["下载用户前端依赖",{"2":{"56":1}}],["下面看下实现过程",{"2":{"959":1}}],["下面通过一张图来加强理解计算属性的工作过程",{"2":{"931":1}}],["下面以openssl自签证书为例",{"2":{"1178":1}}],["下面以",{"2":{"827":1}}],["下面就定义了packages路径下的为子包",{"2":{"814":1}}],["下面就来看看如何在项目中规定提交的规范格式",{"2":{"787":1}}],["下面就来一起看看",{"2":{"39":1,"545":1}}],["下面就来了解下两种不同的装箱操作",{"2":{"38":1,"544":1}}],["下面来看如何使用",{"2":{"798":1}}],["下面来简单实现下",{"2":{"582":1}}],["下面来说函数特有属性prototype的作用",{"2":{"573":1}}],["下面来演示csp的使用",{"2":{"350":1}}],["下面介绍多种方式加深大家的理解",{"2":{"571":1}}],["下面介绍一个验证器案例",{"2":{"232":1}}],["下面介绍一个完整的例子",{"2":{"229":1}}],["下面再画个图总结下",{"2":{"457":1}}],["下面这张图概况了三次握手的摘要",{"2":{"456":1}}],["下面开看看工具栏的作用",{"2":{"452":1}}],["下面有一个选项为allow",{"2":{"438":1}}],["下面列举一些常用的",{"2":{"434":1}}],["下面对常用的做简单介绍",{"2":{"431":1}}],["下面对比下各个方式的优缺点",{"2":{"22":1}}],["下面会降到",{"2":{"243":1}}],["下面我们再对自己实现的进行改造",{"2":{"955":1}}],["下面我们进行简单改造",{"2":{"951":1}}],["下面我们就通过wireshark进行抓包分析",{"2":{"455":1}}],["下面我们来介绍一下",{"2":{"194":1,"744":1}}],["下面我们来简单的实现一下这三者",{"2":{"6":1}}],["下面我们介绍几个简单的loader为大家演示下使用方式",{"2":{"178":1}}],["下面是一个使用",{"2":{"1068":1}}],["下面是一个简单的",{"2":{"1018":1}}],["下面是",{"2":{"1004":1}}],["下面是http的请求方法及其用途",{"2":{"320":1}}],["下面是鉴权拦截器的部分👇",{"2":{"127":1}}],["下面是所有效果都要用到的公共代码",{"2":{"12":1}}],["下面按序分别举例说明",{"2":{"109":1}}],["下面应用中会举例阐述",{"2":{"106":1,"107":1,"108":1}}],["下面的sql语句计算员工的绝对年龄",{"2":{"83":1}}],["下面用几个例子演示这些规则",{"2":{"44":1,"550":1}}],["下面用一段代码加深下印象",{"2":{"43":1,"549":1}}],["下面代码也证明了ordinarytoprimitive的执行的执行步骤",{"2":{"40":1,"546":1}}],["例",{"2":{"198":1,"748":1}}],["例子",{"0":{"140":1,"889":1},"2":{"117":1,"121":1,"494":1,"499":1,"510":1,"514":1,"711":1,"715":1,"716":1,"717":1,"718":1,"722":1,"1020":1,"1023":1,"1024":1,"1025":1,"1054":1,"1055":1,"1058":1,"1059":1,"1061":1,"1062":1,"1063":1,"1064":1,"1069":1,"1070":1}}],["例如https",{"2":{"1121":1}}],["例如gitlab",{"2":{"1121":1}}],["例如get",{"2":{"322":1}}],["例如ruby",{"2":{"1121":1}}],["例如暴露端口和运行run",{"2":{"1065":1}}],["例如在web应用的配置文件中",{"2":{"1024":1}}],["例如在字母和空格之间",{"2":{"139":1,"888":1}}],["例如无法监听数组索引的变化",{"2":{"965":1}}],["例如清除临时数据",{"2":{"881":1}}],["例如清除测试数据",{"2":{"881":1}}],["例如重置状态",{"2":{"881":1}}],["例如初始化测试数据",{"2":{"881":1}}],["例如选择器命名",{"2":{"842":1}}],["例如代码高亮",{"2":{"785":1}}],["例如编译",{"2":{"784":1}}],["例如监听的端口",{"2":{"709":1,"710":1}}],["例如服务器监听的端口",{"2":{"709":1}}],["例如进入",{"2":{"508":1}}],["例如丢包",{"2":{"392":1}}],["例如arp协议中用于查找mac地址的请求",{"2":{"365":1}}],["例如angular和nestjs",{"2":{"224":1}}],["例如视频流媒体服务向所有订阅者发送视频数据",{"2":{"365":1}}],["例如dhcp服务器向所有客户端发送ip地址信息",{"2":{"365":1}}],["例如ipv4网络中使用255",{"2":{"365":1}}],["例如消息类型",{"2":{"354":1}}],["例如聊天室",{"2":{"354":1}}],["例如请求一个视频文件的某个时间段的内容",{"2":{"344":1}}],["例如复用tcp连接",{"2":{"322":1}}],["例如登录",{"2":{"320":1}}],["例如交换机和路由器等",{"2":{"304":1}}],["例如string和number",{"2":{"227":1}}],["例如购物车需求",{"2":{"208":1,"758":1}}],["例如文本节点",{"2":{"122":1}}],["例如",{"2":{"83":12,"139":7,"303":2,"307":1,"325":1,"337":1,"350":1,"366":1,"508":1,"601":1,"709":2,"720":1,"729":6,"888":7,"1010":2,"1012":2,"1062":1,"1066":1,"1068":1,"1075":1,"1087":1,"1121":9,"1122":3,"1165":1,"1169":1}}],["例2",{"2":{"38":1,"544":1}}],["例1",{"2":{"38":1,"544":1}}],["它提供支持访问控制的安全政策保护机制",{"2":{"1202":1}}],["它提供了一组简单规则来创建清晰的提交历史",{"2":{"788":1}}],["它提供了一套规范和工具",{"2":{"678":1}}],["它提供了智能提示",{"2":{"785":1}}],["它提供了更为灵活的缓存控制方式",{"2":{"720":1}}],["它提供了全双工的数据传输能力",{"2":{"384":1}}],["它使极狐gitlab",{"2":{"1168":1}}],["它使用",{"2":{"1087":1}}],["它使用ip协议来实现数据包的传输",{"2":{"310":1}}],["它类似正常的",{"2":{"1166":1}}],["它被克隆且用于运行构建",{"2":{"1164":1}}],["它被设计用于对",{"2":{"876":1}}],["它用于创建一个新的",{"2":{"1113":1}}],["它用于限制数据包在网络中的生存时间",{"2":{"368":1}}],["它对于容器资源的隔离也起着非常重要的作用",{"2":{"1084":1}}],["它向下面对一套硬件和硬件接口",{"2":{"1078":1}}],["它就是用来构建镜像的",{"2":{"1069":1}}],["它就会响应arp请求",{"2":{"302":1}}],["它位于",{"2":{"997":1}}],["它能够将多个不同的文件系统合并成为一个虚拟的文件系统",{"2":{"997":1}}],["它设计的目的不是为了手写代码而是为诸如",{"2":{"977":1}}],["它通常用于清理每个测试用例的后续操作",{"2":{"881":1}}],["它通常用于设置每个测试用例的前置条件",{"2":{"881":1}}],["它通常知道自己的mac地址",{"2":{"301":1}}],["它具有优秀的性能和响应速度",{"2":{"785":1}}],["它自动处理资源文件",{"2":{"784":1}}],["它支持tree",{"2":{"784":1}}],["它支持模块化开发",{"2":{"784":1}}],["它无法修改",{"2":{"729":1}}],["它指定了会话缓存的有效期为1个小时",{"2":{"726":1}}],["它指定了缓存的名称",{"2":{"726":1}}],["它指定了在过期之前客户端可以缓存响应的时间",{"2":{"720":1}}],["它指向函数本身",{"2":{"573":1}}],["它指向它的构造函数的prototype属性",{"2":{"571":1}}],["它采用异步非阻塞的事件驱动模型",{"2":{"704":1}}],["它由俄罗斯的程序员igor",{"2":{"704":1}}],["它由web服务器发送给web浏览器",{"2":{"347":1}}],["它结合了",{"2":{"601":1,"662":1}}],["它和使用具体的库没有关系",{"2":{"702":1}}],["它和原型对象",{"2":{"573":1}}],["它和php及perl语言的switch",{"2":{"83":1}}],["它也提供了自定义装饰器的功能",{"2":{"619":1}}],["它也有自己的原型即",{"2":{"571":1}}],["它也一样返回微任务",{"2":{"532":1}}],["它也会匹配换行符",{"2":{"139":1,"888":1}}],["它的特点是快速的冷启动和热模块替换",{"2":{"784":1}}],["它的值是一个相对时间",{"2":{"720":1}}],["它的数据可以按文本或二进制的格式进行读取",{"2":{"493":1}}],["它的ttl值会减少1",{"2":{"368":1}}],["它在前端开发中具有广泛的应用",{"2":{"478":1}}],["它相对来说更加实用",{"2":{"451":1}}],["它来控制charles全局",{"2":{"414":1}}],["它将宿主机上的目录或文件夹直接挂载到容器中",{"2":{"1111":1}}],["它将控制权",{"2":{"601":1}}],["它将使用源ip地址",{"2":{"369":1}}],["它将数据包从一个网络设备传输到另一个网络设备",{"2":{"310":1}}],["它将数据分成小的数据包并确保它们以正确的顺序被发送到目的地",{"2":{"310":1}}],["它仅仅负责将数据包从源地址传输到目的地址",{"2":{"357":1}}],["它要求浏览器限制脚本在不同源之间的交互",{"2":{"336":1}}],["它引入了多个新特性",{"2":{"322":1}}],["它表示了服务器对请求的处理结果和状态",{"2":{"317":1}}],["它包括两个主要的部分",{"2":{"316":1}}],["它负责处理应用程序之间的通信",{"2":{"310":1}}],["它们很有用",{"2":{"1164":1}}],["它们将在",{"2":{"1056":1}}],["它们的",{"2":{"1002":1}}],["它们的主要区别在于加密和解密时使用的密钥类型不同",{"2":{"330":1}}],["它们在不同的层面和阶段提供了不同的价值",{"2":{"851":1}}],["它们在测试的范围",{"2":{"851":1}}],["它们帮助开发者处理模块化开发",{"2":{"784":1}}],["它们分别用于处理连接请求和已经建立连接的数据传输",{"2":{"380":1}}],["它们都是简单的防御策略",{"2":{"353":1}}],["它们都有对应的包装类型",{"2":{"37":1,"543":1}}],["它们主要用于在客户端和服务器之间建立加密连接",{"2":{"329":1}}],["它们会按顺序进行数据传输",{"2":{"322":1}}],["它们会更新自己的arp缓存",{"2":{"304":1}}],["它们决定了数据在物理层如何传输",{"2":{"310":1}}],["它利用arp协议的特性向网络中广播大量的虚假arp请求",{"2":{"304":1}}],["它允许用户将容器中的数据与容器实例分离",{"2":{"1110":1}}],["它允许用户通过配置文件定义和运行多个",{"2":{"1016":1}}],["它允许",{"2":{"1087":1}}],["它允许以任何格式访问任何偏移量",{"2":{"486":1}}],["它允许在同一",{"2":{"324":1}}],["它允许一个主机为另一个主机响应arp请求",{"2":{"302":1}}],["它允许主机查找目标主机的mac地址",{"2":{"295":1}}],["它不为容器分配任何网络资源",{"2":{"1087":1}}],["它不但会有people的所有方法还会有自定义的方法",{"2":{"575":1}}],["它不对数据包进行任何形式的确认或控制",{"2":{"357":1}}],["它不会自动更新",{"2":{"300":1}}],["它不考虑这接口时怎么实现的",{"2":{"206":1,"756":1}}],["它会将",{"2":{"997":1}}],["它会在实例化时递归地将对象的属性转换为",{"2":{"965":1}}],["它会提示你每步的选择",{"2":{"857":1}}],["它会对js做解释运行",{"2":{"586":1}}],["它会记录函数调用的整个过程",{"2":{"529":1}}],["它会记录最近进行过通信的ip地址和mac地址的映射关系",{"2":{"299":1}}],["它会采取一系列措施来减少发送数据的速率",{"2":{"392":1}}],["它会向服务器发送一个syn包",{"2":{"380":1}}],["它会向本地网段的网关发送arp请求",{"2":{"302":1}}],["它会根据时间戳变化",{"2":{"378":1}}],["它会创建一个新对象",{"2":{"26":1}}],["它需要知道目标主机的mac地址",{"2":{"295":1}}],["它可以将内部流量分发到多个后端",{"2":{"1206":1}}],["它可以将文件数据直接从磁盘读取到内核缓冲区",{"2":{"709":1}}],["它可以降低基础设施的成本",{"2":{"1164":1}}],["它可以在一个",{"2":{"1070":1}}],["它可以在浏览器和服务器之间建立双向实时通信的连接",{"2":{"354":1}}],["它可以简化",{"2":{"1011":1}}],["它可以用于清理测试套件级别的资源",{"2":{"881":1}}],["它可以用于设置测试套件级别的准备工作",{"2":{"881":1}}],["它可以自动处理代码的各种样式细节",{"2":{"837":1}}],["它可以帮助开发人员在编写",{"2":{"842":1}}],["它可以帮助团队成员在不同的编辑环境中保持一致的代码风格",{"2":{"836":1}}],["它可以帮助团队遵循一致的提交信息规范",{"2":{"795":1}}],["它可以帮助检查修复运行时漏洞",{"2":{"826":1}}],["它可以帮助将对象之间的依赖关系自动注入到类中",{"2":{"601":1}}],["它可以通过内部重定向",{"2":{"729":1}}],["它可以指定缓存的时间",{"2":{"720":1}}],["它可以捕获机器上所有物理网卡虚拟网卡的流量",{"2":{"450":1}}],["它可以找到",{"2":{"184":1}}],["它可以把一个值转化为指定的数据类型",{"2":{"83":1}}],["它可以把大的数值格式化为以逗号间隔的易读的序列",{"2":{"83":1}}],["它返回的是个promise",{"2":{"532":1}}],["它返回",{"2":{"153":1,"902":1}}],["它返回一个数组",{"2":{"153":1,"902":1}}],["它必须包含",{"2":{"117":1}}],["它距离顶部的垂直距离",{"2":{"110":1}}],["它是所有执行器中最不受支持的一个",{"2":{"1168":1}}],["它是用来做什么的",{"2":{"1071":1}}],["它是通过number的值并进行计算得到的",{"2":{"934":1}}],["它是由基础文件系统和其他层共同组成的",{"2":{"997":1}}],["它是由",{"2":{"855":1}}],["它是现代软件开发中不可或缺的一部分",{"2":{"851":1}}],["它是有babel为解决monorepo而创建的",{"2":{"814":1}}],["它是",{"2":{"720":1}}],["它是个lifo结构",{"2":{"592":1}}],["它是前端开发者最必要的关注点",{"2":{"526":1}}],["它是多进程和多线程的架构",{"2":{"526":1}}],["它是vscode的内置强大功能",{"2":{"442":1}}],["它是在tcp",{"2":{"357":1}}],["它是一个用于存储",{"2":{"1011":1}}],["它是一个只读的文件系统",{"2":{"997":1}}],["它是一个字节数组",{"2":{"479":1}}],["它是一个32位",{"2":{"358":1}}],["它是一个独立的渲染区域",{"2":{"103":1}}],["它是一种持久化存储数据的机制",{"2":{"1117":1}}],["它是一种面向连接的",{"2":{"374":1}}],["它是一种具体的uri形式",{"2":{"316":1}}],["它是一种客户端",{"2":{"315":1}}],["它是万物互联的基础",{"2":{"312":1}}],["它是互联网的基础",{"2":{"310":1}}],["它是指页面中的一块渲染区域",{"2":{"102":1}}],["它决定了其子元素将如何定位",{"2":{"102":1}}],["它有两个参数",{"2":{"83":1}}],["它以blob类型存储",{"2":{"83":1}}],["注释掉所有swap的行",{"2":{"1203":1}}],["注释节点",{"2":{"404":1}}],["注释节点之类",{"2":{"122":1}}],["注入configservice",{"2":{"629":1}}],["注入依赖",{"2":{"624":1,"626":1}}],["注入",{"2":{"614":1,"661":4}}],["注入xxx",{"2":{"606":1}}],["注入userservice",{"2":{"229":1,"230":1,"231":1}}],["注入装饰器",{"2":{"229":1}}],["注解也可以理解为装饰器",{"2":{"199":1,"749":1}}],["注意需要先把",{"2":{"1103":1}}],["注意如果你没有设置npm全局仓库配置",{"2":{"1103":1}}],["注意以下几点",{"2":{"1098":1}}],["注意以上大部分操作都会耗时",{"2":{"718":1}}],["注意使用ip和暴露的http端口进行登录",{"2":{"1045":1}}],["注意使用commitizen需要使用cz钩子而不能使用git",{"2":{"806":1}}],["注意事项",{"0":{"943":1,"1067":1}}],["注意这里",{"2":{"954":1}}],["注意这里要",{"2":{"866":1}}],["注意这个",{"2":{"932":1,"934":1}}],["注意这个选项很重要",{"2":{"932":1}}],["注意引入plugin并不是引入了当前plugin中所有的规则",{"2":{"831":1}}],["注意每个节点都需要配置以下内容",{"2":{"728":1}}],["注意每个子网中的最后一个地址不能使用",{"2":{"364":1}}],["注意csp",{"2":{"350":1}}],["注意",{"2":{"68":1,"96":1,"139":1,"350":1,"358":1,"370":1,"376":1,"378":1,"384":1,"888":1,"1024":1,"1058":1,"1062":1,"1063":1,"1069":1,"1103":1,"1195":1,"1207":1}}],["注册表",{"2":{"1186":1}}],["注册表类型",{"0":{"1186":1}}],["注册的runner",{"2":{"1159":1}}],["注册token",{"0":{"1155":1},"2":{"1159":1}}],["注册runner需要runner的token",{"2":{"1154":1}}],["注册runner",{"0":{"1154":1},"1":{"1155":1,"1156":1,"1157":1,"1158":1},"2":{"1156":1}}],["注册调度任务",{"0":{"660":1}}],["注册非常灵活",{"2":{"635":1}}],["注册",{"0":{"635":1,"673":1}}],["注册模块",{"2":{"609":1}}],["注册等",{"2":{"320":1}}],["注册失败",{"2":{"57":1}}],["注册成功",{"2":{"57":1,"1157":1}}],["注",{"2":{"36":1,"428":1,"436":1,"512":1,"523":1,"542":1}}],["接受一个cb",{"2":{"868":1}}],["接受到apple发送来的数据包后",{"2":{"454":1}}],["接收端发送syn+ack",{"2":{"378":1}}],["接收方方会重新校验进行对比",{"2":{"376":1}}],["接收方可以在读取消息体之前知道其长度",{"2":{"342":1}}],["接收方使用该字段来确定消息体的长度",{"2":{"342":1}}],["接收方的ip地址",{"2":{"297":1}}],["接收方硬件地址",{"2":{"297":1}}],["接口interface和类型别名type",{"0":{"911":1}}],["接口的相关参数除了可以使用隐式定义外",{"2":{"686":1}}],["接口参数",{"0":{"683":1},"1":{"684":1,"685":1,"686":1}}],["接口表示链式管道传输",{"2":{"517":1}}],["接口表示一个包含节点与文本节点的一部分的文档片段",{"2":{"462":1}}],["接口将流数据写入目的地",{"2":{"513":1}}],["接口提供有关文件的信息",{"2":{"498":1}}],["接口状态等",{"2":{"383":1}}],["接口",{"2":{"298":1,"1066":1}}],["接口执行相反的操作",{"2":{"115":1}}],["接着创建index",{"2":{"1103":1}}],["接着关联角色",{"2":{"1100":1}}],["接着来看依赖收集过程也就是track函数的实现",{"2":{"964":1}}],["接着来看看如何解决并实现它们",{"2":{"951":1}}],["接着来说说预加载",{"2":{"130":1}}],["接着dep会通知渲染watcher进行更新",{"2":{"932":1}}],["接着第2步骤最后代码",{"2":{"932":1}}],["接着又讲了什么是作用域",{"2":{"596":1}}],["接着看下面代码",{"2":{"587":1}}],["接着看下面的内容吧",{"2":{"36":1,"542":1}}],["接着上面代码",{"2":{"572":1}}],["接着上面的介绍",{"2":{"230":1}}],["接着执行后面的代码",{"2":{"536":1}}],["接着执行promise1",{"2":{"532":1}}],["接着执行promise",{"2":{"532":1}}],["接着就是settimeout放入宏任务队列",{"2":{"532":1}}],["接着就是给网站搭建应用了",{"2":{"124":1}}],["接着new",{"2":{"532":1}}],["接着会执行resolve",{"2":{"532":1}}],["接着用curl请求这个地址",{"2":{"453":1}}],["接着发送4个syn收到后大小变成8",{"2":{"393":1}}],["接着进入fin",{"2":{"382":1}}],["接着进入ktv",{"2":{"56":2}}],["接着3位是对服务器最大段大小",{"2":{"381":1}}],["接着将数据发送到传输层当然这里会使用tcp协议作为可靠传输",{"2":{"311":1}}],["接着再看下面给vue进行了多个mixin",{"2":{"239":1}}],["接着我们来到了core",{"2":{"238":1}}],["接着我们来到src",{"2":{"238":1}}],["接着以上的webpack配置",{"2":{"176":1}}],["接着需要在nginx中进行静态资源的缓存",{"2":{"132":1}}],["接着",{"2":{"131":1}}],["接着注册管理员账号",{"0":{"57":1}}],["接下来的安排",{"2":{"1233":1}}],["接下来的是一系列的when",{"2":{"83":1}}],["接下来可以看看containerd的安装",{"2":{"1208":1}}],["接下来可以套用上面的概念看一段代码的执行结果",{"2":{"532":1}}],["接下来使用gitlab官方的仓库注册表",{"2":{"1184":1}}],["接下来介绍proxy",{"2":{"1103":1}}],["接下来介绍下其基本作用",{"2":{"226":1}}],["接下来学习详细语法",{"2":{"1051":1}}],["接下来构建生成目标镜像",{"2":{"1051":1}}],["接下来我用最简单的代码同样实现上面自己实现的响应式",{"2":{"958":1}}],["接下来我们接着分析",{"2":{"968":1}}],["接下来我们就来看看通过如下几个方式实现monorepo",{"2":{"812":1}}],["接下来我们就一个个介绍",{"2":{"226":1}}],["接下来我们逐行分析",{"2":{"532":1}}],["接下来我们修改package",{"2":{"190":1}}],["接下来带着好奇往下看吧",{"2":{"955":1}}],["接下来带着这个疑问进一步了解下",{"2":{"931":1}}],["接下来一起来看看vue的模板编译过程吧",{"2":{"946":1}}],["接下来一起配置https",{"2":{"438":1}}],["接下来简单分析下整个流程👇",{"2":{"934":1}}],["接下来趁热打铁分析下computed",{"2":{"927":1}}],["接下来来聊聊上传的优化",{"2":{"770":1}}],["接下来来介绍charles的使用",{"2":{"440":1}}],["接下来来介绍远程抓包",{"2":{"437":1}}],["接下来让我们看看js继承吧",{"2":{"575":1}}],["接下来证明上面的概念",{"2":{"573":1}}],["接下来又会执行promise",{"2":{"532":1}}],["接下来会可能会进行视图的渲染",{"2":{"532":1}}],["接下来会对不同的面板进行介绍",{"2":{"429":1}}],["接下来分别具体讲讲每个模块的使用",{"2":{"413":1}}],["接下来分组查询",{"2":{"84":1}}],["接下来了解下tcp如何完成数据传输的可靠性",{"2":{"387":1}}],["接下来以tcp",{"2":{"312":1}}],["接下来看下其常用语法",{"2":{"1018":1}}],["接下来看下什么是变量提升",{"2":{"587":1}}],["接下来看作用域",{"2":{"588":1}}],["接下来看看暂时性死区",{"2":{"588":1}}],["接下来看看抓包情况",{"2":{"454":1}}],["接下来看看config",{"2":{"237":1}}],["接下来看看build",{"2":{"237":1}}],["接下来看ordinarytoprimitive",{"2":{"40":1,"546":1}}],["接下来就可以回家好好修养了",{"2":{"1232":1}}],["接下来就一步一步来配置吧",{"2":{"1197":1}}],["接下来就一探究竟👇",{"2":{"930":1}}],["接下来就来学习下如何使用gitlab搭建npm仓库",{"2":{"1181":1}}],["接下来就来扫一下源码是如何实现的",{"2":{"964":1}}],["接下来就来看看类型隐式转换是如何运作的",{"2":{"40":1,"546":1}}],["接下来就讲讲基本使用",{"2":{"842":1}}],["接下来就要针对项目做一些健壮性的配置了",{"2":{"670":1}}],["接下来就用wireshark抓包看看实际的网络请求情况",{"2":{"454":1}}],["接下来就开始进行分析吧",{"2":{"236":1}}],["接下来就着手不同问题对症下药",{"2":{"129":1}}],["接下来就需要进行http配置",{"2":{"128":1}}],["接下来就是傻瓜式的安装",{"2":{"68":1}}],["接下来给",{"2":{"7":1}}],["你爸脚受伤了在医院",{"2":{"1232":1}}],["你必须禁用交换分区",{"2":{"1195":1}}],["你的仓库id",{"2":{"1187":1}}],["你的gitlab域名或ip",{"2":{"1187":1}}],["你的scopename",{"2":{"1187":1}}],["你的密码",{"2":{"1100":1}}],["你需要忽略安全提示即可",{"2":{"1178":1}}],["你需要重新加载配置文件",{"2":{"1160":1}}],["你需要在装有node和vue的环境中测试",{"2":{"56":1}}],["你想在主机上访问它",{"2":{"1084":1}}],["你有没有在启动一个容器后查看它的ip",{"2":{"1084":1}}],["你还可以控制台查看日志输出",{"2":{"1074":1}}],["你还可以添加其他更多配置",{"2":{"839":1}}],["你在不知道如何编写",{"2":{"977":1}}],["你可能对当前dep是哪个dep",{"2":{"955":1}}],["你可能有以下几个疑问❓",{"2":{"950":1}}],["你可以fork本篇博客",{"2":{"1225":1}}],["你可以先加入qq群",{"2":{"1224":1}}],["你可以为不同的组设置权限",{"2":{"1186":1}}],["你可以理解为group级别",{"2":{"1186":1}}],["你可以理解何时和如何使用这一强的的特性",{"2":{"224":1}}],["你可以把相关文件移至",{"2":{"1178":1}}],["你可以根据自己的需求来选择安装方式",{"2":{"1173":1}}],["你可以查看启动日志",{"2":{"1172":1}}],["你可以查看其运行日志",{"2":{"1094":1}}],["你可以联系root账户创建group的runner或admin全局的runner",{"2":{"1155":1}}],["你可以发布包的时候用npm",{"2":{"1107":1}}],["你可以将blob",{"2":{"1097":1}}],["你可以将registry看做是一个gitlab",{"2":{"1011":1}}],["你可以尝试将以上的dockerfile分别用单阶段和多阶段进行构建",{"2":{"1070":1}}],["你可以从多阶段构建了解其作用",{"2":{"1059":1}}],["你可以登录hosted地址推送",{"2":{"1046":1}}],["你可以直接将token写在这里",{"2":{"1187":1}}],["你可以直接使用宿主机的目录进行映射",{"2":{"1022":1}}],["你可以直接在此文件中添加你想要登录的地址和密码",{"2":{"1014":1}}],["你可以进行映射",{"2":{"1022":1}}],["你可以进行补充",{"2":{"10":1}}],["你可以这样使用",{"2":{"1014":1}}],["你可以去阅读我的",{"2":{"1013":1}}],["你可以去搜索下",{"2":{"221":1}}],["你可以认为这里就是为数组准备的",{"2":{"955":1}}],["你可以传函数也可以传对象",{"2":{"934":1}}],["你可以通过",{"2":{"879":1}}],["你可以通过此属性修改对应的测试数据路径",{"2":{"878":1}}],["你可以选择非arm架构的官方镜像",{"2":{"1094":1}}],["你可以选择要用哪个浏览器进行测试",{"2":{"877":1}}],["你可以选择自己的npm包管理器进行安装",{"2":{"877":1}}],["你可以选择对所有的路由生效",{"2":{"635":1}}],["你可以点击这里阅读官方文档",{"2":{"859":1}}],["你可以点击这里跳转阅读",{"2":{"605":1}}],["你可以创建多个blobstore关联多个repository",{"2":{"1097":1}}],["你可以创建",{"2":{"827":1}}],["你可以控制下已经上传过的切片",{"2":{"772":1}}],["你可以参考我的",{"2":{"677":1}}],["你可以参考我的项目骨架webpack",{"2":{"125":1}}],["你可以参考其并结合wireshark等其他工具进行抓包分析",{"2":{"328":1}}],["你可以快速浏览整个大纲",{"2":{"271":1}}],["你可以当场查看文档就行了",{"2":{"181":1}}],["你可以使用相关云厂商",{"2":{"1178":1}}],["你可以使用自签证书并信任",{"2":{"1175":1}}],["你可以使用一下方式",{"2":{"1160":1}}],["你可以使用npm",{"2":{"1102":1}}],["你可以使用",{"2":{"999":1}}],["你可以使用typescript编译器直接编译或使用babel",{"2":{"583":1}}],["你可以使用token",{"2":{"127":1}}],["你可以使用本地局域网ip也可以抓取到",{"2":{"425":1}}],["你可以使用不同的值",{"2":{"183":1}}],["你可以使用xmlserializer",{"2":{"115":1}}],["你可以",{"2":{"95":1}}],["你可以在某个项目中把刚刚上传的项目作为依赖安装",{"2":{"1184":1}}],["你可以在宿主机的",{"2":{"1175":1}}],["你可以在官方文档中查看更多的配置信息",{"2":{"688":1}}],["你可以在这里链接少量静态资源",{"2":{"54":2}}],["你可以在source",{"2":{"40":1,"546":1}}],["你是否也有一样的疑问呢❓",{"2":{"931":1}}],["你是不是很好奇如何做到的",{"2":{"126":1}}],["你应该也已经明白了什么是eventloop了",{"2":{"541":1}}],["你不能直接操作",{"2":{"479":1}}],["你不知道的javascript",{"0":{"477":1}}],["你也可以补充一些比较好的网站",{"2":{"1229":1}}],["你也可以直接通过命令行的方式进行初始化",{"2":{"1214":1}}],["你也可以选择自行编译",{"2":{"1208":1}}],["你也可以创建其他用户并分配适当的权限",{"2":{"1096":1}}],["你也可以在宿主机上查看",{"2":{"1174":1}}],["你也可以在下方留言我会及时回复",{"2":{"946":1}}],["你也可以在proxy",{"2":{"422":1}}],["你也可以继续添加你想要格式化的文件",{"2":{"838":1}}],["你也可以使用明文密码",{"2":{"713":1}}],["你也可以修改它",{"2":{"438":1}}],["你也可以输入help回车就会打开文档",{"2":{"434":1}}],["你也可以查看上一篇fiddler这块",{"2":{"418":1}}],["你也可以通过在需要console的地方加上debugger来断住js",{"2":{"404":1}}],["你也可以将js脚本添加到网站中",{"2":{"220":1}}],["你总是同时需要它们",{"2":{"227":1}}],["你总是会找到好办法的",{"2":{"184":1}}],["你都了解吗",{"2":{"221":1}}],["你要在",{"2":{"181":1}}],["你先在可以看到背景色为teal",{"2":{"179":1}}],["你或许需要以下依赖",{"2":{"174":1}}],["你中有我我中有你",{"2":{"132":1}}],["你只需要在",{"2":{"127":1}}],["你学废了吗",{"2":{"97":1}}],["你学会了吗",{"2":{"63":1}}],["你会发现竟然结果都为true",{"2":{"36":1,"542":1}}],["假设模板中用到了computed属性",{"2":{"932":1}}],["假设我们有这么一个函数",{"2":{"874":1}}],["假设我们负责一个售卖手机的电商网站",{"2":{"205":1,"755":1}}],["假设测试如下定时器代码",{"2":{"870":1}}],["假设要模拟一个工具函数的内部实现",{"2":{"869":1}}],["假设切片的大小也为1m",{"2":{"771":1}}],["假设这里使用vite搭建一个web应用",{"2":{"879":1}}],["假设这里创建一个用户相关的服务",{"2":{"667":1}}],["假设这个是文件",{"2":{"701":1}}],["假设以下是我们的网站页面",{"2":{"350":1}}],["假设有1000个切片",{"2":{"771":1}}],["假设有个内衣工厂",{"2":{"204":1,"754":1}}],["假设有一份很复杂的代码需要用户去调用",{"2":{"201":1,"751":1}}],["假设html代码如下",{"2":{"12":1}}],["假如你在本地测试运行一个mysql的容器",{"2":{"1109":1}}],["假如你启动了一个nignx容器",{"2":{"1084":1}}],["假如你会写num",{"2":{"36":1,"542":1}}],["假如以上的镜像名为myimage",{"2":{"1065":1}}],["假如以上计算机a",{"2":{"311":1}}],["假如",{"2":{"960":1}}],["假如项目中使用了jsx那么也要对jsx进行转义",{"2":{"858":1}}],["假如是图片",{"2":{"770":1}}],["假如前端使用formdata上传文件",{"2":{"701":1}}],["假如已经定义了一个people对象",{"2":{"575":1}}],["假如自定义的可读流内部有数据",{"2":{"512":1}}],["假如这里有两台机器",{"2":{"454":1}}],["假如发布一个react项目如下",{"2":{"408":1}}],["假如发送方的窗口大小为3",{"2":{"387":1}}],["假如给一个元素绑定click",{"2":{"404":1}}],["假如下面代码",{"2":{"404":1}}],["假如下面一段代码",{"2":{"404":1}}],["假如有下面一段代码",{"2":{"404":2}}],["假如有一个场景",{"2":{"408":1}}],["假如有一个恶意的链接",{"2":{"350":1}}],["假如有一张成绩表",{"2":{"88":1}}],["假如拥塞窗口刚开始为1",{"2":{"393":1}}],["假如在某时间段两端不进行任何数据传输",{"2":{"384":1}}],["假如在局域网192",{"2":{"364":1}}],["假如ack报文由于网络原因在msl时间内没有到达server",{"2":{"382":1}}],["假如client想要释放连接将会发送fin请求给server端",{"2":{"382":1}}],["假如每次表单提交",{"2":{"353":1}}],["假如插入一个脚本",{"2":{"350":1}}],["假如遇到路由器时路由器识别目标ip并根据路由表进行转发",{"2":{"311":1}}],["假如网页上没有使用https证书",{"2":{"303":1}}],["假如局域网内有多个主机",{"2":{"296":1}}],["假如要匹配前面不是",{"2":{"149":1,"898":1}}],["假如要匹配前面是",{"2":{"149":1,"898":1}}],["假如要匹配后面不是",{"2":{"148":1,"897":1}}],["假如要匹配后面是",{"2":{"148":1,"897":1}}],["比tls",{"2":{"334":1}}],["比较杂的内容",{"2":{"797":1}}],["比较它们是否相等时结果很明显是false",{"2":{"542":1}}],["比较实用",{"2":{"414":1}}],["比较好用",{"2":{"414":1}}],["比较清爽",{"2":{"411":1}}],["比较单一",{"2":{"404":1}}],["比较字符串s1和s2",{"2":{"83":1}}],["比较值都是false",{"2":{"47":1,"553":1}}],["比较简单相应你已经也成功了",{"2":{"879":1}}],["比较简单可以自行翻阅文档",{"2":{"653":1}}],["比较简单",{"2":{"43":1,"430":1,"549":1}}],["比较两个变量是否相等时结果很明显时false",{"2":{"36":1}}],["比如使用docker",{"2":{"1181":1}}],["比如手动发布",{"2":{"1131":1}}],["比如一个docker中只有一个python3",{"2":{"1078":1}}],["比如开发环境",{"2":{"1017":1}}],["比如设计模式",{"2":{"991":1}}],["比如data",{"2":{"953":1}}],["比如改变属性时执行某个方法",{"2":{"950":1}}],["比如下面深层监听foo",{"2":{"941":1}}],["比如下面的这么简单的问题都有那么多同学不会",{"2":{"22":1}}],["比如测试本地的web服务http",{"2":{"878":1}}],["比如支持的js版本",{"2":{"829":1}}],["比如空格",{"2":{"789":1}}],["比如成员大多或招的人基本面向vue那就选择vue",{"2":{"786":1}}],["比如保持请求数为5",{"2":{"771":1}}],["比如代理服务器",{"2":{"720":1}}],["比如换成",{"2":{"715":1}}],["比如内部作用域声明的变量若是和全局变量同名将会覆盖全局的变量",{"2":{"588":1}}],["比如修改",{"2":{"512":1}}],["比如修改账户信息",{"2":{"351":1}}],["比如说",{"2":{"498":1}}],["比如主机a使用telnet连接主机b的某个未开放端口",{"2":{"379":1}}],["比如攻击者可以伪造一个包含恶意操作的表单",{"2":{"351":1}}],["比如窃取用户的敏感信息",{"2":{"350":1}}],["比如升级websocket协议",{"2":{"317":1}}],["比如常用的",{"2":{"203":1,"753":1}}],["比如上面的$on支持数组",{"2":{"200":1,"750":1}}],["比如用flex",{"2":{"111":1}}],["比如用户账户信息",{"2":{"67":1}}],["比如",{"2":{"90":1,"96":1,"131":1,"184":1,"187":1,"189":1,"191":1,"196":1,"313":1,"746":1,"957":1}}],["比如limit",{"2":{"90":1}}],["比如有一个职工表",{"2":{"88":1}}],["比如求平台用户每个月收入多少钱",{"2":{"83":1}}],["比如过期时长",{"2":{"64":1}}],["比如text",{"2":{"17":1}}],["比如可以通过writing",{"2":{"17":1}}],["如这里是web1项目的runner",{"2":{"1155":1}}],["如npm官方仓库",{"2":{"1104":1}}],["如npm",{"2":{"1098":1}}],["如nginx",{"2":{"691":1}}],["如策略路由",{"2":{"1087":1}}],["如前端静态项目可能需要用node进行打包",{"2":{"1070":1}}],["如前面的object是个创建对象的构造器",{"2":{"573":1}}],["如arm",{"2":{"1053":1}}],["如access",{"2":{"67":1}}],["如接下来的nexus3",{"2":{"1039":1}}],["如镜像",{"2":{"1020":1}}],["如容器的名称",{"2":{"1010":1}}],["如容器",{"2":{"1006":1}}],["如容器层和其他镜像层",{"2":{"997":1}}],["如添加",{"2":{"1003":1}}],["如将项目代码提交到远程的git仓库",{"2":{"999":1}}],["如一个基本的centos镜像就包含了一套完整的centos的root文件系统",{"2":{"996":1}}],["如匿名卷",{"2":{"996":1}}],["如v",{"2":{"954":1}}],["如设置tsx转义",{"2":{"857":1}}],["如函数",{"2":{"853":2}}],["如同同一个人所写",{"2":{"835":1}}],["如同时并发多个tcp请求",{"2":{"380":1}}],["如使用了plugin时",{"2":{"831":1}}],["如使用gulp",{"2":{"784":1}}],["如eslint",{"2":{"831":1}}],["如修复bug",{"2":{"793":1}}],["如let",{"2":{"726":1}}],["如匹配",{"2":{"715":1}}],["如访问https",{"2":{"711":1}}],["如监听https端口可以写listen",{"2":{"710":1}}],["如html",{"2":{"705":1}}],["如http请求的携带了query",{"2":{"453":1}}],["如http协议",{"2":{"449":1}}],["如http",{"2":{"310":1,"316":1}}],["如webpack比较繁重配置复杂",{"2":{"784":1}}],["如web服务api",{"2":{"316":1}}],["如ws",{"2":{"702":1}}],["如定义以下接口",{"2":{"683":1}}],["如定义两个变量",{"2":{"36":1,"542":1}}],["如请求某个接口新建一个任务或立即执行",{"2":{"661":1}}],["如请求欺骗",{"2":{"349":1}}],["如传入",{"2":{"646":1}}],["如查询所有的猫咪",{"2":{"612":1}}],["如引入子模块",{"2":{"604":1}}],["如相关的service",{"2":{"604":1}}],["如在浏览器宿主环境中全局定义的变量都可以用window访问到",{"2":{"589":1}}],["如全局的block",{"2":{"588":1}}],["如上id属性",{"2":{"958":1}}],["如上面的写法其实内部会变成",{"2":{"931":1}}],["如上name",{"2":{"587":1}}],["如上12",{"2":{"571":1}}],["如上图",{"2":{"122":1,"404":1,"436":3}}],["如操作系统tcp连接回调",{"2":{"538":1}}],["如没有阻塞的插入元素",{"2":{"532":1}}],["如此反复不断循环",{"2":{"531":1}}],["如浏览器和nodejs",{"2":{"525":1}}],["如浏览器提供了用户交互和一些异步任务的功能",{"2":{"525":1}}],["如通过浏览器的定时任务线程",{"2":{"525":1}}],["如视频播放不需要加载全部减小延迟",{"2":{"508":1}}],["如slice方法",{"2":{"501":1}}],["如setuint8",{"2":{"489":1}}],["如阿拉伯语",{"2":{"462":1}}],["如无特殊备注",{"2":{"450":1}}],["如断点",{"2":{"431":1}}],["如复制",{"2":{"430":1}}],["如时间戳",{"2":{"367":1}}],["如tcp协议会通过数据分段将数据分割成每段mss",{"2":{"369":1}}],["如tcp协议提供了可靠的连接服务",{"2":{"310":1}}],["如tcp",{"2":{"367":1}}],["如127",{"2":{"361":1}}],["如分块编码",{"2":{"341":1}}],["如网页",{"2":{"316":1}}],["如文件传输",{"2":{"309":1}}],["如路由器",{"2":{"298":1,"368":1}}],["如有发现有不对或需改进的地方",{"2":{"1223":1}}],["如有不清楚地方可以评论区写下自己的疑问或联系作者",{"2":{"477":1}}],["如有直接渲染",{"2":{"248":1}}],["如有直接加载即可",{"2":{"248":1}}],["如有的话直接进行渲染即可",{"2":{"248":1}}],["如日志收集",{"2":{"230":1}}],["如何自动收集",{"2":{"950":1}}],["如何解决这个问题呢",{"2":{"950":1}}],["如何解决跨域请求",{"2":{"691":1}}],["如何做",{"0":{"825":1}}],["如何使用",{"2":{"727":1}}],["如何实现大文件上传",{"0":{"764":1},"1":{"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1},"2":{"522":1}}],["如何实现大文件下载",{"2":{"521":1}}],["如何确定rto的时间是非常关键的",{"2":{"389":1}}],["如何避免syn攻击呢",{"2":{"381":1}}],["如何节省内存就成了一件非常有意义的事情",{"2":{"204":1,"754":1}}],["如何生成bfc",{"0":{"104":1},"2":{"100":1}}],["如400px时",{"2":{"111":1}}],["如今一些所谓的vue",{"2":{"92":1}}],["如下面代码",{"2":{"825":1}}],["如下面一段代码",{"2":{"587":1}}],["如下定义一个计数器",{"2":{"595":1}}],["如下没有区别",{"2":{"573":1}}],["如下代码修改了info",{"2":{"959":1}}],["如下代码",{"2":{"529":1,"538":1,"591":1}}],["如下图左",{"2":{"1078":1}}],["如下图右",{"2":{"1078":1}}],["如下图搜索本博客时打开",{"2":{"353":1}}],["如下图chrome",{"2":{"352":1}}],["如下图",{"2":{"231":1,"303":1,"326":1,"438":2,"439":1,"453":2,"456":2,"528":1,"531":1,"966":1}}],["如下图表示配置成功",{"2":{"69":1}}],["如下",{"2":{"68":1,"83":1,"239":1,"407":1,"955":1,"1098":1}}],["如",{"2":{"40":1,"46":1,"83":2,"85":3,"124":1,"137":1,"139":1,"143":1,"150":1,"181":1,"237":1,"238":2,"246":1,"307":1,"311":1,"312":1,"320":1,"329":1,"333":1,"350":2,"352":1,"378":1,"383":1,"387":1,"404":2,"411":1,"413":3,"414":1,"415":1,"428":1,"430":1,"434":1,"436":1,"451":1,"453":1,"459":1,"477":1,"510":1,"526":1,"527":1,"533":1,"546":1,"552":1,"579":1,"589":1,"601":1,"611":1,"668":1,"670":1,"685":2,"688":1,"710":2,"718":2,"720":2,"768":1,"775":1,"782":1,"785":2,"790":1,"794":1,"795":1,"801":1,"831":1,"845":1,"882":1,"886":1,"888":1,"892":1,"899":1,"938":2,"964":1,"1011":1,"1013":1,"1069":1,"1121":1,"1194":2}}],["如遇到有一些链接无法访问可能需要科学上网",{"2":{"36":1,"523":1,"542":1}}],["如果已经关闭进行重启了",{"2":{"1202":1}}],["如果已经不是loading状态",{"2":{"244":1}}],["如果少于这个数字将会影响你应用的运行内存",{"2":{"1195":1}}],["如果登不上",{"2":{"1174":1}}],["如果您想在不同操作系统上运行构建",{"2":{"1164":1}}],["如果您使用",{"2":{"726":1,"1178":1}}],["如果流水线的作业没指定tag也可以用此runner运行",{"2":{"1158":1}}],["如果流水线中仅包含",{"2":{"1127":1}}],["如果全局指定了image则所有的job使用此image创建容器并在其中运行",{"2":{"1145":1}}],["如果它失败或是未运行的手动作业",{"2":{"1140":1}}],["如果未提供",{"2":{"1137":1}}],["如果未设置",{"2":{"347":1}}],["如果版本为",{"2":{"1121":3}}],["如果ci",{"2":{"1121":1}}],["如果分支具有关联的合并请求",{"2":{"1121":1}}],["如果作业运行失败",{"2":{"1130":1}}],["如果作业中没有before",{"2":{"1124":1}}],["如果作业是触发的为",{"2":{"1121":1}}],["如果作业是手动启动为",{"2":{"1121":1}}],["如果作业不使用",{"2":{"1121":1}}],["如果作业正在运行以获取受保护的",{"2":{"1121":1}}],["如果项目",{"2":{"1121":1}}],["如果项目有的话",{"2":{"1121":2}}],["如果项目中用了ts",{"2":{"861":1}}],["如果标题短于",{"2":{"1121":1}}],["如果直接使用宿主机的文件或路径",{"2":{"1114":1}}],["如果上传了一些不必要的文件",{"2":{"1071":1}}],["如果文件是个tar压缩包",{"2":{"1069":1}}],["如果文件太多便会造成编辑器卡顿现象",{"2":{"841":1}}],["如果健康检查失败",{"2":{"1066":1}}],["如果需要将容器的端口映射到主机上",{"2":{"1062":1}}],["如果需要连接互联网或与其他网络通信",{"2":{"360":1}}],["如果下载失败",{"2":{"1047":1}}],["如果只想停止服务的容器而不删除它们",{"2":{"1031":1}}],["如果只需要停止一个或几个服务的容器",{"2":{"1030":1}}],["如果服务的容器正在运行或者网络和卷正在被使用",{"2":{"1031":1}}],["如果服务的镜像已经存在",{"2":{"1029":1}}],["如果服务器绑定了0",{"2":{"361":1}}],["如果服务器返回允许跨域请求的响应头",{"2":{"337":1}}],["如果基础镜像版本已经过时",{"2":{"1028":1}}],["如果使用了缓存",{"2":{"1028":1}}],["如果使用对称加密共享秘话",{"2":{"330":1}}],["如果属性值为对象",{"2":{"964":1}}],["如果属性是内存地址",{"2":{"26":1}}],["如果属性是基本类型",{"2":{"26":1}}],["如果目标不是数组对象",{"2":{"956":1}}],["如果目标主机的ip地址已知",{"2":{"295":1}}],["如果数据中的数据是对象",{"2":{"955":1}}],["如果能自动收集需要执行的方法就完美了",{"2":{"950":1}}],["如果值为post那么会将回调推送到postflushcbs中",{"2":{"944":1}}],["如果用户设置了deep",{"2":{"941":1}}],["如果设置为依赖项的作业的工件已过期或删除",{"2":{"1140":1}}],["如果设置了",{"2":{"1121":5}}],["如果设置",{"2":{"938":1,"939":1}}],["如果定义了watch",{"2":{"937":1}}],["如果同时构建多个镜像",{"2":{"1028":1}}],["如果同时设置了max",{"2":{"720":1}}],["如果同样的函数定义在方法体中就会执行多遍",{"2":{"930":1}}],["如果都使用相对路径引入会显得很麻烦",{"2":{"861":1}}],["如果对于特殊的目标文件不想使用rules的规则",{"2":{"830":1}}],["如果源文件的内容没变时就会直接跳过打包流程使用缓存",{"2":{"817":1}}],["如果手动来管理就会变得非常麻烦",{"2":{"816":1}}],["如果本次提交目的是修改issue的话",{"2":{"793":1}}],["如果本博客对您有帮助",{"2":{"252":1}}],["如果将计算机的层次做一下简单的划分",{"2":{"1078":1}}],["如果将这个搭建分成好多小件交给n辆车",{"2":{"776":1}}],["如果将prototype设置为null",{"2":{"573":1}}],["如果一个项目中使用了多种技术框架可能造成以下诸多问题",{"2":{"786":1}}],["如果一个大文件在上传了90",{"2":{"766":1}}],["如果一直可以说清楚具体逻辑不",{"2":{"48":1,"554":1}}],["如果遇到文件很大的情况就会造成http请求堵塞",{"2":{"766":1}}],["如果遇到异步代码如ajax请求时",{"2":{"527":1}}],["如果请求未完成或者不是一系列请求中最后一部分则设为空",{"2":{"729":1}}],["如果请求成功",{"2":{"729":1}}],["如果请求中的主机头不可用或者空",{"2":{"729":1}}],["如果资源未被修改",{"2":{"720":1}}],["如果裁剪",{"2":{"718":1}}],["如果启用了服务容器日志",{"2":{"1121":1}}],["如果启用",{"2":{"718":1}}],["如果重写规则不正确",{"2":{"715":1}}],["如果运行接口也没法输入对应的参数导致接口报错",{"2":{"683":1}}],["如果程序中没有捕获错误将会在异常层被捕获",{"2":{"636":1}}],["如果程序中注入了某个依赖",{"2":{"626":1}}],["如果注入了res那么必须手动执行res原始的响应",{"2":{"614":1}}],["如果访问当前作用域不存在的变量时",{"2":{"591":1}}],["如果了解这方面的知识",{"2":{"585":1}}],["如果返回非对象类型的值",{"2":{"576":1}}],["如果函数显式返回对象类型的值",{"2":{"576":1}}],["如果再次给原型对象赋值新的值",{"2":{"573":1}}],["如果再收到syn请求不会为其分配任何存储资源",{"2":{"381":1}}],["如果放在新生代频繁复制交换",{"2":{"559":1}}],["如果交换后空闲区超过25",{"2":{"559":1}}],["如果到期也会立马进入timer阶段去执行定时器的回调",{"2":{"539":1}}],["如果当前属性时数组",{"2":{"955":1}}],["如果当前的属性的值",{"2":{"937":1}}],["如果当前请求是一个子请求",{"2":{"729":1}}],["如果当前阶段没有任何任务要执行时",{"2":{"539":1}}],["如果当前阶段的任务队列执行空",{"2":{"538":1}}],["如果当前环境支持websocket协议就会升级成功",{"2":{"354":1}}],["如果还遇到微任务也会将其放入当前微任务队列后",{"2":{"536":1}}],["如果没到由于没有其他宏任务了",{"2":{"532":1}}],["如果没有将token写入npmrc",{"2":{"1189":1}}],["如果没有可以跳过",{"2":{"1178":1}}],["如果没有安装可以阅读此篇",{"2":{"1040":1}}],["如果没有此文件自行创建即可",{"2":{"1014":1}}],["如果没有指定要执行的命令",{"2":{"1063":1}}],["如果没有指定正确的镜像id或名称",{"2":{"1002":1}}],["如果没有指定else块",{"2":{"83":1}}],["如果没有全局的配置请设置成false",{"2":{"878":1}}],["如果没有执行则会被认为超时错误",{"2":{"868":1}}],["如果没有统一的规范提交格式",{"2":{"787":1}}],["如果没有什么都不会输出",{"2":{"718":1}}],["如果没有显式返回对象",{"2":{"576":1}}],["如果没有彻底理解请根据文中例子和概念不断反复练习",{"2":{"541":1}}],["如果没有后面也会更新相关文章",{"2":{"454":1}}],["如果没有其他资源类型的特定源被指定",{"2":{"350":1}}],["如果没有",{"2":{"69":1}}],["如果没有mongodb数据库",{"2":{"56":1}}],["如果没有symbol",{"2":{"40":1,"546":1}}],["如果执行微任务阶段再次产生微任务也会把他执行完",{"2":{"532":1}}],["如果发现有此模块将会高亮显示",{"2":{"718":1}}],["如果发现有不一致的地方可以阅读google开发者文档",{"2":{"526":1}}],["如果发现str",{"2":{"83":1}}],["如果buffer的长度为2字节",{"2":{"481":1}}],["如果brithday是未来的年月日的话",{"2":{"83":1}}],["如果现在只想分析http协议的数据包呢",{"2":{"453":1}}],["如果后续配置后正常话不重启也行",{"2":{"438":1}}],["如果抛出异常就会打住断点",{"2":{"404":1}}],["如果断点的url包含请求url",{"2":{"404":1}}],["如果在其他环境请自行处理好防火墙",{"2":{"1201":1}}],["如果在镜像库配置中指定了一个值",{"2":{"1121":1}}],["如果在",{"2":{"1056":1,"1063":1}}],["如果在docker",{"2":{"1024":1}}],["如果在指定的时间内容器中的进程仍未停止",{"2":{"1008":1}}],["如果在每次tick中不断修改dom并不会立即更新",{"2":{"534":1}}],["如果在局域网中没找到响应的主机",{"2":{"454":1}}],["如果在rto的时间范围内收到了对方的ack包则重置定时器不会重传报文",{"2":{"390":1}}],["如果在传输过程中有任何一个或多个数据包丢失或损坏",{"2":{"369":1}}],["如果ip分片传输中有一个ip片丢失了就会重传所有的ip片段",{"2":{"386":1}}],["如果过大会造成网络中路由器的缓冲压力",{"2":{"386":1}}],["如果无需数据就会等待一会看后面的请求是否需要返回数据",{"2":{"382":1}}],["如果合法将会放入accept队列",{"2":{"381":1}}],["如果窗口的值为0时表示可以发送窗口侦测",{"2":{"376":1}}],["如果要监听的端口号是使用",{"2":{"1062":1}}],["如果要监听多个端口号",{"2":{"1062":1}}],["如果要设置多个环境变量",{"2":{"1055":1}}],["如果要迁移一个应用程序",{"2":{"1010":1}}],["如果要删除正在运行的容器",{"2":{"1009":1}}],["如果要绕开系统调用",{"2":{"729":1}}],["如果要对响应数据类型字段展示",{"2":{"685":1}}],["如果要操作buffer对象需要使用视图对象",{"2":{"480":1}}],["如果要发送的数据包超过mtu大小",{"2":{"369":1}}],["如果要用联表查询查出每个学生所在的班级",{"2":{"87":1}}],["如果检测到攻击",{"2":{"350":1}}],["如果客户端在网络不稳定或带宽较小的情况下下载完整的文件会导致下载速度慢或者下载失败",{"2":{"344":1}}],["如果前者丢包或者响应时间过长就会阻塞后面的请求",{"2":{"322":1}}],["如果前面的每一个块都不匹配就会返回else块指定的默认结果",{"2":{"83":1}}],["如果攻击者拦截这些数据包并篡改它们",{"2":{"304":1}}],["如果网关启用了代理arp功能",{"2":{"302":1}}],["如果网页的图片太多",{"2":{"241":1}}],["如果有此job按照指定镜像创建容器并执行",{"2":{"1145":1}}],["如果有依赖私有仓库没有的npm包",{"2":{"1103":1}}],["如果有很多个方法也是需要先写死在里面",{"2":{"950":1}}],["如果有n个依赖方法要写n个",{"2":{"950":1}}],["如果有set函数",{"2":{"932":1}}],["如果有则直接返回该",{"2":{"717":1}}],["如果有看不懂的",{"2":{"571":1}}],["如果有的话进入check阶段执行回调",{"2":{"539":1}}],["如果有进入check执行setimmediate回调",{"2":{"538":1}}],["如果有结束返回就返回指定范围的数据",{"2":{"520":1}}],["如果有多个时",{"2":{"400":1}}],["如果有多个图片的地址是一样的",{"2":{"246":1}}],["如果有值将会替代原有的类构造器的声明",{"2":{"228":1}}],["如果想使用在ie里的项目",{"2":{"246":1}}],["如果系统中因为创建了大量类似的对象而导致内存占用过高",{"2":{"204":1,"754":1}}],["如果实例化了",{"2":{"196":1,"746":1}}],["如果存在会直接登录",{"2":{"1014":1}}],["如果存在则直接返回",{"2":{"196":1,"746":1}}],["如果存在直接拿缓存的内容",{"2":{"167":1}}],["如果匹配成功返回第一个匹配的位置",{"2":{"154":1,"903":1}}],["如果把父容器的container的宽度",{"2":{"111":1}}],["如果父元素的子元素都是浮动元素",{"2":{"108":1,"112":1}}],["如果通配符放到首尾",{"2":{"85":1}}],["如果",{"2":{"85":2,"139":1,"729":1,"888":1,"1121":1}}],["如果是压缩文件",{"2":{"1060":1}}],["如果是对象继续代理拦截",{"2":{"960":1}}],["如果是",{"2":{"955":1}}],["如果是user",{"2":{"938":1}}],["如果是function就直接取值",{"2":{"932":1}}],["如果是宏任务就会交给其它线程处理",{"2":{"536":1}}],["如果是纯数字枚举为number",{"2":{"227":1}}],["如果是开发环境就加上",{"2":{"182":1}}],["如果是win10",{"2":{"93":1}}],["如果是最高级",{"2":{"88":1}}],["如果是name在前面就主要以name来进行分组",{"2":{"84":1}}],["如果是null",{"2":{"83":1}}],["如果是age在前面就主要以age来进行分组",{"2":{"84":1}}],["如果为真",{"2":{"83":1}}],["如果为假",{"2":{"83":1}}],["如果表达式为真",{"2":{"83":1}}],["如果不使用",{"2":{"1029":1}}],["如果不是就需要对值再进行拦截也就是再执行reactive方法进行代理",{"2":{"960":1}}],["如果不是则会将包丢弃掉不做任何应答",{"2":{"454":1}}],["如果不能从原始服务器重新获取资源",{"2":{"720":1}}],["如果不能匹配到结果了",{"2":{"152":1,"901":1}}],["如果不符合",{"2":{"646":1,"795":1}}],["如果不传id不会报错",{"2":{"642":1}}],["如果不传的话默认上下文为",{"2":{"7":1}}],["如果不存在则会从它的原型链上去查询",{"2":{"575":1}}],["如果不存在会从当前对象的原型链中查找属性",{"2":{"571":1}}],["如果不存在重新获取即可",{"2":{"167":1}}],["如果不影响其他的请求",{"2":{"436":1}}],["如果不合法将会握手失败",{"2":{"332":1}}],["如果不把limit放在最后面就会报错",{"2":{"90":1}}],["如果不相等",{"2":{"83":1}}],["如果相等",{"2":{"83":1}}],["如果第一个参数不是null",{"2":{"83":1}}],["如果arg1=arg2返回null",{"2":{"83":1}}],["如果arg1不是空",{"2":{"83":1}}],["如果test是真",{"2":{"83":1}}],["如果test和valn相等",{"2":{"83":1}}],["如果test1是真",{"2":{"83":1}}],["如果带了查询条件",{"2":{"81":1}}],["如果超过签证的合法时间",{"2":{"64":1}}],["如果其中一个没有请先下载",{"2":{"56":1}}],["如果以上返回的结果不是基本类型时抛异常cannot",{"2":{"40":1,"546":1}}],["如果你觉得本博客对你有帮助",{"2":{"1227":1}}],["如果你觉得本博客让您有所收益",{"2":{"271":1,"991":1}}],["如果你感兴趣的话就把我放到收藏夹吧💼",{"2":{"1223":1}}],["如果你也遇到以上关闭后重启很慢并且启动不了",{"2":{"1202":1}}],["如果你也是arm架构",{"2":{"1171":1}}],["如果你按照文档过程中遇到了问题",{"2":{"1194":1}}],["如果你使用的是docker",{"2":{"1212":1}}],["如果你使用的是非arm架构的系统",{"2":{"1194":1}}],["如果你使用了虚拟机搭建",{"2":{"1195":1}}],["如果你使用了https且使用了自签证书",{"2":{"1158":1}}],["如果你下载失败了如404",{"2":{"1191":1}}],["如果你启用了https",{"2":{"1175":1}}],["如果你需要定制一些操作可以使用此步骤",{"2":{"1208":1}}],["如果你需要https",{"2":{"1175":1}}],["如果你需要在不同的操作系统上进行开发",{"2":{"785":1}}],["如果你忘记填写",{"2":{"1158":1}}],["如果你有还需要其他权限可以自行添加",{"2":{"1099":1}}],["如果你有这些疑惑",{"2":{"36":1,"542":1}}],["如果你进行了卷挂载也可以在宿主机卷中查看",{"2":{"1095":1}}],["如果你的主机上已经安装了docker",{"2":{"1209":1}}],["如果你的主机名没有重复可以跳过此步骤",{"2":{"1199":1}}],["如果你的项目或组需要权限才能访问就需要添加token",{"2":{"1191":1}}],["如果你的版本比较低",{"2":{"1181":1}}],["如果你的版本有差别",{"2":{"170":1}}],["如果你的gitlab使用https",{"2":{"1157":1}}],["如果你的gitlab使用http",{"2":{"1157":1}}],["如果你的环境和我不一致",{"2":{"1082":1}}],["如果你允许了游客下载镜像",{"2":{"1044":1}}],["如果你发现有些概念不清楚",{"2":{"1040":1}}],["如果你看了我的另一篇",{"2":{"1040":1}}],["如果你是个专业的",{"2":{"991":1}}],["如果你是小白也可以尝试阅读",{"2":{"271":1}}],["如果你不允许则不用勾选",{"2":{"1042":1}}],["如果你不熟悉的话我推荐你断点调试一个最简单的vue组件",{"2":{"954":1}}],["如果你不了解js内部的装箱",{"2":{"36":1,"542":1}}],["如果你没有安装过",{"2":{"1082":1}}],["如果你没有看到h2",{"2":{"727":1}}],["如果你没有接触过文件操作",{"2":{"62":1}}],["如果你和我一样",{"2":{"707":1}}],["如果你了解过如java的继承",{"2":{"583":1}}],["如果你了解了事件循环机制eventloop",{"2":{"533":1}}],["如果你已经掌握了原型的知识",{"2":{"571":1}}],["如果你想要很短时间内熟悉它的使用",{"2":{"437":1}}],["如果你想实现像是反射这样的能力",{"2":{"227":1}}],["如果你正因此困扰",{"2":{"424":1}}],["如果你更喜欢中文",{"2":{"423":1}}],["如果你熟悉spring框架那nest也会让你轻而易举的理解",{"2":{"601":1}}],["如果你熟悉java的ide调试这个没啥问题",{"2":{"400":1}}],["如果你熟悉nginx",{"2":{"128":1}}],["如果你还需要更多有关dockerfile语法请阅读官方文档",{"2":{"1066":1}}],["如果你还没安装或不了解docker",{"2":{"1036":1}}],["如果你还没有项目",{"2":{"173":1}}],["如果你还不了解",{"2":{"241":1}}],["如果你对这两者api还不太熟悉的话",{"2":{"958":1}}],["如果你对这方面还不是很熟悉",{"2":{"768":1}}],["如果你对它的响应式还是比较模糊",{"2":{"946":1}}],["如果你对vue的响应式原理还很模糊",{"2":{"927":1}}],["如果你对nest还不是很熟悉",{"2":{"665":1}}],["如果你对此工具还不熟悉可以参考我的",{"2":{"376":1}}],["如果你对缓存还不太了解",{"2":{"132":1}}],["如果你对拆箱操作不了解",{"2":{"37":1,"543":1}}],["如果你把mongodb部署在其他地方",{"2":{"56":1}}],["如果你仔细阅读了这篇文档",{"2":{"56":1}}],["如果你在类型隐式转换的阅读过程中产生的疑问过多",{"2":{"41":1,"547":1}}],["如果你写过大多数强类型语言如java对数据的类型一定不会陌生",{"2":{"36":1,"542":1}}],["如果你喜欢本篇文章",{"2":{"10":1}}],["如果被引用的对象发生改变",{"2":{"30":1}}],["如果该元素是个对象引用",{"2":{"30":1}}],["如果该参数的值为null",{"2":{"2":1}}],["如果这个函数处于非严格模式下",{"2":{"2":1}}],["并让",{"0":{"1205":1}}],["并标记是手动发布",{"2":{"1189":1}}],["并标识当前computed属性",{"2":{"934":1}}],["并认证自签证书",{"2":{"1175":1}}],["并为每个极狐gitlab",{"2":{"1167":1}}],["并为当前函数提供一些变量上下文",{"2":{"532":1}}],["并link到image关键字定义的docker镜像",{"2":{"1146":1}}],["并可在gitlab对应的ci",{"2":{"1139":1}}],["并可以从",{"2":{"1011":1}}],["并确定是否创建管道",{"2":{"1137":1}}],["并确保网络能够承载传输的数据量",{"2":{"392":1}}],["并缩短为",{"2":{"1121":1}}],["并添加",{"2":{"1116":1}}],["并添加program属性指定调试的文件即可",{"2":{"401":1}}],["并采用容器名的方式方式进行访问",{"2":{"1090":1}}],["并被分配一个与容器在同一子网中的",{"2":{"1086":1}}],["并被分配一个",{"2":{"1086":1}}],["并安装相应的依赖",{"2":{"1074":1}}],["并安装",{"2":{"1065":2}}],["并自动下载复制到目标位置",{"2":{"1060":1}}],["并commited一个新的镜像层提供给下一层阶段使用",{"2":{"1058":1}}],["并打印其结果",{"2":{"1051":1}}],["并规定容器启动后让nginx以前台的形式运行",{"2":{"1051":1}}],["并修改成自己仓库的ip和包名",{"2":{"1046":1}}],["并监听10010端口",{"2":{"1034":1}}],["并输出日志信息",{"2":{"1029":1}}],["并行构建多个docker镜像",{"2":{"1028":1}}],["并行回收",{"0":{"562":1},"2":{"559":1}}],["并设置了重启策略为always",{"2":{"1025":1}}],["并设置了三个环境变量",{"2":{"1024":1}}],["并设置了相关的属性",{"2":{"347":1}}],["并等待一定时间",{"2":{"1008":1}}],["并分配一个容器伪终端",{"2":{"1004":1}}],["并触发相应的更新",{"2":{"965":1}}],["并触发该容器生成bfc",{"2":{"106":1,"110":1}}],["并改变childob",{"2":{"955":1}}],["并改变状态",{"2":{"244":1}}],["并深度遍历实现对组件data属性的拦截",{"2":{"954":1}}],["并访问set时",{"2":{"951":1}}],["并生成对应的dep",{"2":{"953":1}}],["并生成对应的日志",{"2":{"877":1}}],["并生成一个随机数",{"2":{"332":1}}],["并验证应用程序的功能和用户体验",{"2":{"876":1}}],["并帮助捕获和修复问题",{"2":{"853":1}}],["并减少在项目维护过程中出现的潜在问题",{"2":{"824":1}}],["并复制configure",{"2":{"718":1}}],["并复制以下内容",{"2":{"707":1}}],["并取消",{"2":{"661":2}}],["并取得校验后的返回值",{"2":{"197":1,"747":1}}],["并停止",{"2":{"661":3}}],["并使用definereactive方法访问和设置该对象的属性时打印日志",{"2":{"950":1}}],["并使用",{"2":{"639":1,"1018":1,"1184":1}}],["并使用tls",{"2":{"327":1}}],["并返回固定格式",{"2":{"609":1}}],["并返回了请求所需要的信息",{"2":{"317":1}}],["并推入执行栈中",{"2":{"592":1}}],["并向parent传递了参数name",{"2":{"583":1}}],["并向客户端发送一个syn",{"2":{"380":1}}],["并实例化一个空对象达到继承的目的",{"2":{"579":1}}],["并发数限制",{"2":{"771":1}}],["并发限制",{"0":{"771":1}}],["并发传输减小传输时间",{"2":{"767":1}}],["并发高",{"2":{"709":1}}],["并发回收",{"0":{"567":1}}],["并发打包",{"2":{"187":1,"190":1}}],["并把任务放入到对应的任务队列等待主线程的调度",{"2":{"537":1}}],["并放入对应的任务队列中",{"2":{"536":1}}],["并完成内存分配和垃圾回收等等",{"2":{"525":1}}],["并没有改变原型链中的name属性",{"2":{"579":1}}],["并没有覆盖原型",{"2":{"572":1}}],["并没有考虑到复杂的交互功能",{"2":{"524":1}}],["并没有看到vue的定义",{"2":{"238":1}}],["并计算进度",{"2":{"514":1}}],["并计算出",{"2":{"333":3}}],["并对",{"2":{"830":1}}],["并对流的读取速度做出反应",{"2":{"508":1}}],["并对其进行oberve",{"2":{"245":1}}],["并扩展了与文件系统相关的功能",{"2":{"498":1}}],["并加强了相关协议的理解",{"2":{"460":1}}],["并加载其真实图片",{"2":{"245":1}}],["并通过一个虚拟网桥连接到宿主机的网络中",{"2":{"1087":1}}],["并通过新的数组方法实现了可响应的变异操作",{"2":{"965":1}}],["并通过对arp协议",{"2":{"460":1}}],["并通知上层应用另一端发起了关闭操作",{"2":{"457":1}}],["并告诉下次序列号为1",{"2":{"456":1}}],["并告诉下次的序列号为1",{"2":{"456":1}}],["并指定了一些额外的操作",{"2":{"1065":1}}],["并指定缓存区名称",{"2":{"721":1}}],["并指定类型为",{"2":{"494":1}}],["并指定自己的序列号0",{"2":{"456":1}}],["并指定如何访问该资源",{"2":{"316":1}}],["并以单播的形式回应发送主机方",{"2":{"454":1}}],["并重启定时器",{"2":{"390":1}}],["并期望server下一次发送的序号为y+1",{"2":{"378":1}}],["并提高可重复性",{"2":{"1077":1}}],["并提高路由效率",{"2":{"366":1}}],["并提供一个访问它的全局访问点",{"2":{"196":1,"746":1}}],["并结合例子演示攻击过程以及有效的防御措施",{"2":{"349":1}}],["并保存在用户的本地计算机上",{"2":{"347":1}}],["并在depends",{"2":{"1023":1}}],["并在另一台机器上重新导入为一个新的",{"2":{"1010":1}}],["并在另一侧产生无关边缘",{"2":{"718":1}}],["并在其上启动操作系统",{"2":{"997":1}}],["并在服务器上创建了新的资源",{"2":{"317":1}}],["并在一定时间内保持这种关系",{"2":{"299":1}}],["并进行",{"2":{"354":1}}],["并进行错误检测和纠正",{"2":{"309":1}}],["并进行拍照",{"2":{"204":2,"754":2}}],["并根据",{"2":{"1068":1}}],["并根据需要向其他子网中的主机发送arp响应",{"2":{"302":1}}],["并根据场景而变化",{"2":{"204":1,"754":1}}],["并初始化一些初始状态loading",{"2":{"245":1}}],["并将检查间隔设置为10s",{"2":{"1066":1}}],["并将其结果添加到子镜像中",{"2":{"1065":1}}],["并将宿主机当前目录下的文件复制到容器的工作目录下",{"2":{"1051":1}}],["并将",{"2":{"1004":1}}],["并将vnode传递给update进行patch页面渲染真实dom",{"2":{"954":1}}],["并将重要的updatecomponent参数传进去",{"2":{"954":1}}],["并将以下配置写入",{"2":{"836":1}}],["并将已经上传的切片列表返回给客户端",{"2":{"772":1}}],["并将path拼接到后面",{"2":{"716":1}}],["并将路径拼接到后面",{"2":{"715":1}}],["并将服务器的响应返回给客户端",{"2":{"706":1}}],["并将每次循环时的i作为参数传递进去",{"2":{"594":1}}],["并将name传递给parent",{"2":{"578":1}}],["并将child绑定为this",{"2":{"578":1}}],["并将函数的变量等信息以栈帧的形式压入",{"2":{"529":1}}],["并将range起始节点的父节点和node的父节点相同",{"2":{"462":1}}],["并将客户端的序列号+1发送ack=1确认包",{"2":{"456":1}}],["并将响应数据传输给客户端",{"2":{"411":1}}],["并将响应数据返回给前端",{"2":{"337":1}}],["并将当前的序号作为初始值",{"2":{"376":1}}],["并将所有对互联网的请求发送到一个公共ip地址上",{"2":{"370":1}}],["并将它们重新组合成一个完整的数据包",{"2":{"369":1}}],["并将该计数器值复制到ipv4标识字",{"2":{"367":1}}],["并将密钥交换过程和认证过程合并到了一个握手消息中",{"2":{"334":1}}],["并将ip地址返回给设备",{"2":{"301":1}}],["并将图片状态置为loading",{"2":{"242":1}}],["并将值设置为需要调用的函数",{"2":{"7":1}}],["并给vue原型定义了",{"2":{"238":1}}],["并沿着这条链传递该请求",{"2":{"205":1,"755":1}}],["并负责具体的计算过程",{"2":{"197":1,"747":1}}],["并不包含容器的元数据",{"2":{"1010":1}}],["并不会是渲染watcher",{"2":{"931":1}}],["并不会带上自己的实体",{"2":{"587":1}}],["并不使用这个当前请求的动作",{"2":{"729":1}}],["并不是我们常用的函数或者对象",{"2":{"936":1}}],["并不是单一的",{"2":{"217":1}}],["并不是一个对象调用另一个对象的方法",{"2":{"195":1,"745":1}}],["并不是一种联表方式",{"2":{"88":1}}],["并不匹配",{"2":{"139":1,"888":1}}],["并拥有一套渲染规则",{"2":{"102":1}}],["并且使用前",{"2":{"1121":1}}],["并且使他们可以互相替换",{"2":{"197":1,"747":1}}],["并且仅在作业运行时有效",{"2":{"1121":1}}],["并且同阶段的构建会被缓存起来复用",{"2":{"1051":1}}],["并且两者的启动顺序为compose",{"2":{"1034":1}}],["并且你还可以使用没有创建的数据卷",{"2":{"1022":1}}],["并且和直接用docker",{"2":{"1022":1}}],["并且和普通变量声明不一样的是",{"2":{"587":1}}],["并且旧的镜像",{"2":{"1002":1}}],["并且暴露出供",{"2":{"977":1}}],["并且提供新的性能特性和效果",{"2":{"977":1}}],["并且支持只读和可读写两种模式",{"2":{"997":1}}],["并且支持对未初始化的属性进行拦截",{"2":{"958":1}}],["并且支持0",{"2":{"727":1}}],["并且有一个`",{"2":{"951":1}}],["并且有cb也就是watch的回调函数",{"2":{"938":1}}],["并且当内部的依赖发生改变时",{"2":{"945":1}}],["并且dep也会收集渲染watcher",{"2":{"932":1}}],["并且只会执行一次",{"2":{"881":2}}],["并且只有在执行",{"2":{"350":1}}],["并且具有丰富的插件生态系统",{"2":{"784":1}}],["并且不会阻塞后面的作业执行",{"2":{"1130":1}}],["并且不需要使用帧头部",{"2":{"727":1}}],["并且不能在当前作用域被重复定义",{"2":{"588":1}}],["并且初始化时必须赋值否则报错",{"2":{"588":1}}],["并且可以挑取上一阶段的产物",{"2":{"1070":1}}],["并且可以实现容器之间的相互通信和协作",{"2":{"1016":1}}],["并且可以在后面修改",{"2":{"588":1}}],["并且可以发出警报或者自动阻止攻击",{"2":{"303":1}}],["并且也有对应的值",{"2":{"587":1}}],["并且规定",{"2":{"583":1}}],["并且instanceof等判断原型的方法也可以正常工作",{"2":{"582":1}}],["并且多个实例不共享",{"2":{"578":1}}],["并且向父类传参",{"2":{"578":1}}],["并且向那个对象发送请求",{"2":{"199":1,"749":1}}],["并且原型指向构造函数的prototype属性",{"2":{"577":1}}],["并且nexttick印永远会在promise之前打印",{"2":{"540":1}}],["并且优先于微任务",{"2":{"540":1}}],["并且执行时间间隔非常稳定",{"2":{"535":1}}],["并且允许开发人员根据需要处理它们",{"2":{"508":1}}],["并且基于https步骤",{"2":{"422":1}}],["并且会伴随重启",{"2":{"1202":1}}],["并且会将动态添加的参数追加到",{"2":{"1064":1}}],["并且会在首行断住",{"2":{"399":1}}],["并且会打印",{"2":{"145":1,"154":1,"894":1,"903":1}}],["并且确保数据包在传输过程中不会丢失或损坏",{"2":{"357":1}}],["并且以后使用",{"2":{"350":1}}],["并且每个数据流可以被细分成若干个数据帧",{"2":{"324":1}}],["并且客户端应继续发送请求主体部分",{"2":{"317":1}}],["并且能够在全球范围内进行数据传输",{"2":{"310":1}}],["并且知道目标主机的mac地址",{"2":{"302":1}}],["并且用",{"2":{"131":1}}],["并且完全不会消耗自己服务器的性能",{"2":{"130":1}}],["并且与这个区域外部无关",{"2":{"103":1}}],["并且一定是放在最后面的",{"2":{"90":1}}],["并且对第一个参数进行判断",{"2":{"83":1}}],["并显示在合成表格的右边",{"2":{"86":1}}],["并显示在合成表格的左边",{"2":{"86":1}}],["并用sep字符间隔",{"2":{"83":1}}],["并介绍了一些注意点",{"2":{"35":1}}],["本周一到公司下午就收到了boss的会议邀请",{"2":{"1233":1}}],["本次安装的版本为1",{"2":{"1194":1}}],["本次演示项目上传至github了",{"2":{"1188":1}}],["本次就分别以前端的静态项目和nodejs项目为例子做个简单的构建演示",{"2":{"1072":1}}],["本次将部署两个容器服务",{"2":{"1034":1}}],["本次以vue3为例",{"2":{"966":1}}],["本次分析的vue3版本为3",{"2":{"957":1}}],["本次分析的vue2版本为2",{"2":{"949":1}}],["本次代码你可以在",{"2":{"354":1}}],["本质也是vue实例",{"2":{"976":1}}],["本质也是函数",{"2":{"583":1}}],["本质还是调用了splice方法",{"2":{"956":1}}],["本质底层还是装饰器和reflect两者结合的结果",{"2":{"619":1}}],["本段代码来自mdn",{"2":{"529":1}}],["本人也是一位和大家一样正在不断努力学习的同学",{"2":{"1223":1}}],["本人使用arm架构centos7",{"2":{"1092":1}}],["本人认为相对繁琐",{"2":{"798":1}}],["本人刚开始也是对这方面空白",{"2":{"478":1}}],["本人在工作中使用fiddler",{"2":{"428":1}}],["本地跑起",{"2":{"1225":1}}],["本地创建一个简单的项目",{"2":{"1183":1}}],["本地当前项目当前分支的文件",{"2":{"1142":1}}],["本地存储仓库",{"2":{"1104":1}}],["本地使用npm初始化创建一个项目",{"2":{"1102":1}}],["本地构建",{"2":{"1021":1}}],["本地已经存在了",{"2":{"1012":1}}],["本地回环",{"2":{"453":1}}],["本地",{"2":{"452":1}}],["本地地址无法抓取",{"0":{"425":1}}],["本地node",{"2":{"128":1}}],["本机地址都是真实的ip地址",{"2":{"361":1}}],["本机地址",{"2":{"361":2}}],["本模块记录了本人所有全栈知识技能",{"2":{"991":1}}],["本模块都是vue原理系列文章",{"2":{"948":1}}],["本模块将根据以下几个方面层层渐进介绍规范处理及常用的便捷功能",{"2":{"783":1}}],["本模块会从多个方面讲解常见的优化手段",{"2":{"762":1}}],["本模块会列出常见的协议并进一步分析",{"2":{"307":1}}],["本模块的代码可以点击这里查看",{"2":{"350":1,"351":1}}],["本博客中的一些链接可能需要科学上网才能访问哦",{"2":{"1223":1}}],["本博客的大体划分表现在顶部导航栏上",{"2":{"1223":1}}],["本博客的所有文章允许转载",{"2":{"271":1}}],["本博客文章允许大家转载",{"2":{"252":1,"991":1,"1226":1}}],["本体定义了关键功能",{"2":{"199":1,"749":1}}],["本篇收纳了一些技术博客和好用的工具网站",{"2":{"1229":1}}],["本篇以gitlab",{"2":{"1170":1}}],["本篇以最新版",{"2":{"679":1}}],["本篇使用docker",{"2":{"1150":1}}],["本篇讲了docker数据卷的使用",{"2":{"1117":1}}],["本篇来讲docker数据卷",{"2":{"1109":1}}],["本篇来讲解如何实现大文件的上传",{"2":{"764":1}}],["本篇通过docker+nexus3的进行搭建",{"2":{"1092":1}}],["本篇通过对eventloop的学习可以对js的执行顺序和浏览器渲染时机等等有更深的理解",{"2":{"541":1}}],["本篇将会通过docker官方registry和nexus3两种方式进行私库的搭建",{"2":{"1036":1}}],["本篇将会对浏览器和nodejs的eventloop逐一展开介绍",{"2":{"525":1}}],["本篇",{"2":{"956":1}}],["本篇就开始讲解相关辅助工具的使用方法",{"2":{"782":1}}],["本篇就来用vue和typescript来撸一个懒加载插件",{"2":{"241":1}}],["本篇开始来介绍如何做好前端项目集成",{"2":{"782":1}}],["本篇带着大家一起领略nginx的常见使用技巧",{"2":{"704":1}}],["本篇文档就来看看如何使用swagger",{"2":{"678":1}}],["本篇文章大部分偏概念总结",{"2":{"356":1}}],["本篇文章主要针对webpack4",{"2":{"170":1}}],["本篇会简单演示一下nest作为通用web服务的使用技巧",{"2":{"665":1}}],["本篇介绍如何使用nest搭建通用的web服务",{"2":{"664":1}}],["本篇介绍了wireshark的基本使用",{"2":{"460":1}}],["本篇内容循序渐进比较长",{"2":{"523":1}}],["本篇ip内容主要以ipv4为主",{"2":{"358":1}}],["本篇分析runtime+compiler的commonjs版本",{"2":{"237":1}}],["本篇主要讲解了什么是原型",{"2":{"584":1}}],["本篇主要讲了js怎么进行隐式转换的",{"2":{"49":1,"555":1}}],["本篇主要讲了深拷贝和浅拷贝的特点",{"2":{"35":1}}],["本篇主要通过一个图片管理器imagemanager和一个懒加载管理器lazy",{"2":{"250":1}}],["本篇主要阐述网站性能优化",{"2":{"124":1}}],["本例中将mongodb部署在本地电脑上",{"2":{"56":1}}],["本项目分前台开发",{"2":{"53":1}}],["本文带着大家按照官方文档进行k8s搭建",{"2":{"1194":1}}],["本文基于arm架构centos7虚拟机安装的",{"2":{"1082":1}}],["本文从docker的架构",{"2":{"1015":1}}],["本文从tcp的首部",{"2":{"395":1}}],["本文主要从docker的基础开始学习",{"2":{"992":1}}],["本文主要从cdn",{"2":{"135":1}}],["本文主要讲了变量声明",{"2":{"596":1}}],["本文将会全面介绍原型",{"2":{"570":1}}],["本文将逐一介绍一下",{"2":{"11":1}}],["本文不再做相关赘述",{"2":{"526":1}}],["本文不对头部压缩做深入解释",{"2":{"326":1}}],["本文以chrome浏览器作为介绍",{"2":{"526":1}}],["本文以fiddler",{"2":{"428":1}}],["本文会分别介绍arp协议",{"2":{"454":1}}],["本文会介绍vscode和chrome调试技巧",{"2":{"397":1}}],["本文假设你对nginx有基本了解",{"2":{"132":1}}],["本文就不讲述搭建应用的详细内容了",{"2":{"125":1}}],["本文就快速介绍下css样式中经常使用的bfc",{"2":{"100":1}}],["本文内容摘自",{"2":{"113":1,"251":1}}],["本文总结了一下css实现水平垂直居中的方式大概有下面这些",{"2":{"11":1}}],["该变量在合并请求流水线中为空",{"2":{"1122":2}}],["该",{"2":{"1121":2}}],["该命令只能删除已经停止的容器",{"2":{"1009":1}}],["该命令可以查看容器的标准输出和标准错误输出",{"2":{"1007":1}}],["该命令可以让用户在运行中的容器中打开一个新的终端",{"2":{"1005":1}}],["该命令显示了所有正在运行的容器的相关信息",{"2":{"1006":1}}],["该命令用于创建和启动一个新的",{"2":{"1004":1}}],["该方法会直接在一个对象上定义一个新属性",{"2":{"949":1}}],["该方法返回一个observable类型数据",{"2":{"651":1}}],["该模块启用后",{"2":{"717":1}}],["该指令并不会在容器运行时自动将端口号映射到主机上",{"2":{"1062":1}}],["该指令用于设置环境变量",{"2":{"1055":1}}],["该指令用于设置有效的引用来源",{"2":{"722":1}}],["该指令可以限制某些",{"2":{"713":1}}],["该指针指向堆中该实体的起始地址",{"2":{"24":1}}],["该实例对象包含abort",{"2":{"516":1}}],["该对象带有内置的背压和队列",{"2":{"513":1}}],["该对象包含一个唯一的sessionid还有过期时间等其他信息",{"2":{"348":1}}],["该接口只能在webwoker中使用",{"2":{"507":1}}],["该面板主要来记录抓包的数据记录",{"2":{"432":1}}],["该机制通过动态调整发送数据的速率来控制网络中的拥塞程度",{"2":{"392":1}}],["该机制允许接收方向发送方发送选择性确认",{"2":{"391":1}}],["该数值是根据服务器选定的散列加密算法计算得到的",{"2":{"381":1}}],["该字段的数值表示数据中的紧急数据",{"2":{"376":1}}],["该页面不允许在",{"2":{"350":1}}],["该mac地址所在的网络接口",{"2":{"298":1}}],["该怎么办呢",{"2":{"184":1}}],["该文章内容翻译自visual",{"2":{"155":1}}],["该区域拥有一套渲染规则来约束块级盒子的布局",{"2":{"103":1}}],["该例中",{"2":{"83":1}}],["该函数库也有提供",{"2":{"34":1}}],["从刚开始到我上高中那段时间都是在家里做老板",{"2":{"1232":1}}],["从第9行看到已经被赋新值0",{"2":{"1054":1}}],["从第3步应该知道this",{"2":{"932":1}}],["从下图可以很明显的看到name只有一个依赖p1",{"2":{"959":1}}],["从下图界面可以看出不管是端测还是组件测试都没有配置",{"2":{"877":1}}],["从vue2到使用vue3是个无感过程应该很多人也在用了",{"2":{"957":1}}],["从设计模式看其也是典型发布",{"2":{"952":1}}],["从以上可以看出docker",{"2":{"1018":1}}],["从以上代码分析我们将对象的每个属性的依赖都添加到了同一个cbs中",{"2":{"951":1}}],["从以上结果可以看到intro函数只打印了一次",{"2":{"930":1}}],["从以上的角度可以理解不存在队头阻塞了",{"2":{"324":1}}],["从应用程序的外部进行测试",{"2":{"854":1}}],["从应用程序代码中转移出去",{"2":{"601":1}}],["从用户角度出发",{"2":{"854":1}}],["从本模块开始都是关于性能优化的一系列文章",{"2":{"762":1}}],["从本篇开始讲nest的基本使用",{"2":{"601":1}}],["从本篇文章开始讲解node中最为出色的框架",{"2":{"601":1}}],["从访问方向上只能从内部访问外部也就是3",{"2":{"589":1}}],["从中可看到child继承了父类的实例属性",{"2":{"583":1}}],["从图中可以看出执行主动p1",{"2":{"951":1}}],["从图中可以看到child的原型为child的prototype属性",{"2":{"578":1}}],["从图中可以明显看到",{"2":{"580":1}}],["从图中可以知道首部的固定长度为20字节",{"2":{"376":1}}],["从js的内存模型图可以将js内存大致的分为",{"2":{"528":1}}],["从存在的buffer中的指定位置截取指定长度",{"2":{"483":1}}],["从抓包数据可以看到",{"2":{"454":1}}],["从osi协议封装顺序发送方自顶向下封装数据",{"2":{"454":1}}],["从协议层次角度是个网络层协议",{"2":{"454":1}}],["从ip的头部信息可以知道ip协议的最大长度为2^16",{"2":{"369":1}}],["从它的一个ip地址",{"2":{"367":1}}],["从上图可以很明显的看到继承关系",{"2":{"582":1}}],["从上图和代码中可以证明原型链都是以引用的方式存在",{"2":{"573":1}}],["从上图抓包记录可以将记录分为三部分",{"2":{"456":1}}],["从上游服务器收到的响应无效或错误",{"2":{"317":1}}],["从上面执行结果可以看到改造后当修改age时只会执行p2函数",{"2":{"951":1}}],["从上面第8行中看到",{"2":{"580":1}}],["从上面可以看到uint8array中的",{"2":{"491":1}}],["从上面可以看出",{"2":{"33":1}}],["从上面可以分析出",{"2":{"129":1}}],["从上面的例子可以看到使用proxy可以对对象进行get",{"2":{"958":1}}],["从上面的结果可以得出结论",{"2":{"233":1}}],["从上面的两个分组查询我们可以得出结论",{"2":{"84":1}}],["从上面的表格中得到转换值为1",{"2":{"43":1,"549":1}}],["从而利用缓存",{"2":{"1075":1}}],["从而减小镜像大小",{"2":{"1075":1}}],["从而减少了公共ip地址的需求",{"2":{"370":1}}],["从而减少广播消息的传输量",{"2":{"364":1}}],["从而缩短文件上传耗时",{"2":{"1071":1}}],["从而方便了应用程序的开发和测试",{"2":{"1017":1}}],["从而产生虚悬镜像",{"2":{"1002":1}}],["从而节省存储空间和加速构建过程",{"2":{"997":2}}],["从而在属性访问时触发依赖收集和更新",{"2":{"965":1}}],["从而降低代码错误风险",{"2":{"825":1}}],["从而达到更好的开发和管理体验",{"2":{"810":1}}],["从而达到攻击者的目的",{"2":{"350":1}}],["从而便可校验通过",{"2":{"802":1}}],["从而使提交历史更加整洁",{"2":{"794":1}}],["从而使得跨域请求得以正常进行",{"2":{"339":1}}],["从而导致调试和排错变得困难",{"2":{"1204":1}}],["从而导致整个连接的性能下降",{"2":{"727":1}}],["从而导致网络中所有主机的arp缓存被污染",{"2":{"304":1}}],["从而加快页面加载速度",{"2":{"727":1}}],["从而加速网站的加载速度",{"2":{"712":1}}],["从而让发送方只重传丢失的数据块",{"2":{"391":1}}],["从而改变窗口大小和位置",{"2":{"387":1}}],["从而主动丢弃后面的syn请求",{"2":{"381":1}}],["从而实现应用程序的可移植性",{"2":{"1017":1}}],["从而实现容器的统一管理",{"2":{"1017":1}}],["从而实现了容器间的网络隔离和通信",{"2":{"1085":1}}],["从而实现了镜像的共享和复用",{"2":{"997":1}}],["从而实现了构建可扩展",{"2":{"664":1}}],["从而实现镜像的复用和节省存储空间的目的",{"2":{"997":1}}],["从而实现跨平台",{"2":{"992":1}}],["从而实现对属性的拦截和控制",{"2":{"949":1}}],["从而实现高可用和高性能的服务",{"2":{"705":1}}],["从而实现定制化的功能",{"2":{"705":1}}],["从而实现攻击",{"2":{"351":1}}],["从而实现两个不在同一子网内的主机之间的通信",{"2":{"302":1}}],["从而完成攻击",{"2":{"351":1}}],["从而有效地减少了攻击者利用恶意脚本注入攻击的可能性",{"2":{"350":1}}],["从而提高代码质量",{"2":{"842":1}}],["从而提高代码库的可读性和可维护性",{"2":{"795":1}}],["从而提高开发效率和项目的可扩展性",{"2":{"824":1}}],["从而提高应用程序的可用性和稳定性",{"2":{"728":1}}],["从而提高了网络传输的效率",{"2":{"727":1}}],["从而提高了网络性能和效率",{"2":{"727":1}}],["从而提高了头部压缩效率",{"2":{"727":1}}],["从而提高了web性能和效率",{"2":{"322":1}}],["从而提高服务器的性能",{"2":{"726":1}}],["从而提高网站的性能和响应速度",{"2":{"717":1}}],["从而提高下载速度和成功率",{"2":{"344":1}}],["从而动态地读取消息体",{"2":{"343":1}}],["从而可以更好地管理接收缓冲区的大小和减少内存分配的需求",{"2":{"342":1}}],["从而可以在lazy中创建缓存器",{"2":{"248":1}}],["从而正确读取消息",{"2":{"342":1}}],["从而大大减少了握手时间和握手消息数量",{"2":{"334":1}}],["从而保护网络安全",{"2":{"304":1}}],["从而保护网络通信的安全",{"2":{"303":1}}],["从而无法到达真正的目标主机",{"2":{"304":1}}],["从而避免网络拥塞",{"2":{"376":1}}],["从而避免数据包在网络中无限循环",{"2":{"368":1}}],["从而避免了连接建立时的握手延迟",{"2":{"334":1}}],["从而避免了等待服务器响应的时间",{"2":{"325":1}}],["从而避免中间人攻击",{"2":{"303":1}}],["从而避免arp欺骗攻击",{"2":{"303":2}}],["从而避免请求发送者和接受者之间的耦合关系",{"2":{"205":1,"755":1}}],["从而及时发现并防止arp欺骗攻击",{"2":{"303":1}}],["从而限制arp欺骗攻击",{"2":{"303":1}}],["从脚本中可以看出",{"2":{"237":1}}],["从构建开始",{"0":{"237":1}}],["从node",{"2":{"186":1}}],["从零配置webpack工程",{"0":{"170":1},"1":{"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1}}],["从字符串str中切掉开头的空格",{"2":{"83":1}}],["从拆箱中应该也看到了类型转换的影子",{"2":{"40":1,"546":1}}],["从ecmascript",{"2":{"2":1}}],["owide",{"2":{"1217":1,"1218":1}}],["ownership",{"2":{"1209":1}}],["otlp",{"2":{"1209":1}}],["other",{"2":{"190":1,"350":1,"874":1}}],["omit",{"2":{"771":1,"920":1}}],["oldvalue",{"2":{"938":3,"944":2,"959":2,"964":2}}],["old",{"2":{"726":2,"1178":2}}],["older",{"2":{"251":2}}],["o回调会在pending",{"2":{"539":1}}],["o请求连接",{"2":{"538":1}}],["o事件",{"2":{"538":1}}],["os=linux",{"2":{"1157":1}}],["os",{"2":{"1005":1,"1007":1,"1082":2,"1217":1}}],["osession",{"2":{"438":3}}],["osi七层模型推动了网络协议的标准化和互操作性",{"2":{"309":1}}],["osi七层模型是国际标准化组织",{"2":{"309":1}}],["osi模型",{"0":{"309":1},"2":{"308":1}}],["o2",{"2":{"251":1,"708":1,"718":2}}],["overlayfs",{"2":{"1209":2}}],["overlay",{"2":{"1205":3}}],["overwrite",{"2":{"1159":1}}],["overrides用来配置具体的样式规则",{"2":{"847":1}}],["overrides等几个模块的配置",{"2":{"827":1}}],["overrides",{"0":{"830":1,"847":1},"2":{"407":1,"827":1,"830":3,"847":1}}],["overrides按钮",{"2":{"407":1}}],["override",{"2":{"407":1}}],["over",{"2":{"251":1,"1014":1}}],["overflow",{"2":{"106":1,"107":1,"108":1,"110":2,"111":2,"112":2}}],["overflow的值不为visible",{"2":{"104":1}}],["oden",{"2":{"251":1}}],["ox",{"2":{"251":1}}],["oci",{"2":{"1209":4}}],["ocicrypt",{"2":{"1209":10}}],["octet",{"2":{"709":1}}],["oct",{"2":{"453":1,"720":1}}],["octocat",{"2":{"251":2}}],["octopus",{"2":{"251":1}}],["oct返回八进制",{"2":{"83":1}}],["ocean",{"2":{"251":1}}],["ob中的dep进行依赖收集",{"2":{"955":1}}],["ob",{"2":{"941":2,"951":3,"954":1,"955":14,"956":6}}],["observable",{"2":{"648":2,"651":2}}],["observatory",{"2":{"355":1}}],["observearray",{"2":{"955":6}}],["observe",{"2":{"245":1,"247":1,"532":1,"951":4,"954":4,"955":5}}],["observer",{"2":{"245":5,"247":1,"932":1,"941":1,"951":3,"954":8,"955":5}}],["observed",{"2":{"239":1}}],["obj3",{"2":{"26":6}}],["obj2",{"2":{"26":6,"28":2,"34":2}}],["obj1",{"2":{"26":9,"34":3}}],["object>",{"2":{"964":1}}],["objectref",{"2":{"963":2}}],["object创建对象",{"2":{"573":1}}],["objects",{"2":{"251":1}}],["objectobject",{"2":{"44":1,"550":1}}],["object",{"0":{"28":1,"574":1,"575":1},"2":{"25":1,"28":5,"33":8,"38":3,"39":3,"40":11,"41":3,"44":2,"48":4,"154":2,"229":2,"230":1,"231":2,"232":2,"237":2,"238":3,"239":1,"245":1,"532":1,"544":3,"545":3,"546":11,"547":3,"550":2,"554":4,"571":3,"572":4,"573":8,"574":2,"575":3,"576":5,"579":1,"581":1,"582":1,"583":4,"632":1,"645":1,"669":2,"687":3,"874":3,"903":2,"932":4,"937":2,"938":2,"939":1,"940":1,"941":2,"944":1,"945":1,"949":1,"950":4,"951":12,"954":6,"955":7,"956":2,"960":1,"963":4,"964":6,"965":3}}],["obj",{"2":{"9":1,"28":6,"33":4,"40":7,"546":7,"571":1,"938":5,"944":1,"945":1,"949":2,"950":4,"951":13,"954":9,"955":5,"963":3}}],["ogre",{"2":{"251":1}}],["og",{"2":{"222":1}}],["ops",{"2":{"687":3,"938":1}}],["opcode",{"2":{"454":1}}],["opacity",{"2":{"280":1}}],["ophiuchus",{"2":{"251":1}}],["operations",{"2":{"726":1}}],["operationidfactory",{"2":{"688":1}}],["operation",{"2":{"687":4}}],["operator",{"2":{"195":10,"745":10,"1217":7}}],["openssl",{"2":{"708":1,"726":8,"1178":6}}],["openapi",{"2":{"689":1}}],["open",{"2":{"177":1,"182":1,"190":1,"251":3,"354":1,"454":2,"800":1,"877":2,"1007":1,"1121":2,"1209":1}}],["opt",{"2":{"1171":2,"1172":1,"1173":1,"1179":1,"1209":3}}],["opt=",{"2":{"708":2,"718":4}}],["optimize",{"0":{"732":1},"2":{"190":1,"971":2}}],["optimizecssassetsplugin",{"2":{"187":1,"190":2}}],["optimization是webpack自带的选项",{"2":{"187":1}}],["optimization",{"0":{"187":1},"2":{"130":1,"187":1,"190":1}}],["optional",{"0":{"626":1},"2":{"626":1,"642":1,"643":1,"660":1}}],["options是可选参数",{"2":{"1005":1}}],["options请求快速返回",{"2":{"692":1}}],["options弹出options面板",{"2":{"438":1}}],["options来加强安全防范",{"2":{"350":1}}],["options",{"2":{"180":1,"181":1,"190":2,"201":11,"238":4,"239":7,"243":1,"245":5,"247":3,"320":1,"336":1,"337":1,"339":2,"350":5,"439":1,"494":2,"512":2,"612":1,"629":1,"637":1,"692":3,"693":1,"695":1,"724":2,"728":1,"751":11,"818":1,"932":2,"937":3,"938":9,"939":3,"940":2,"944":2,"945":3,"954":8,"964":1,"971":5,"998":1,"999":1,"1004":2,"1005":1,"1007":2,"1008":1,"1009":2,"1014":2,"1027":1,"1028":1,"1029":1,"1030":1,"1031":1,"1032":1,"1034":2,"1066":1,"1069":1,"1209":4,"1212":1,"1214":1}}],["option",{"2":{"157":6,"158":9,"159":2,"160":2,"163":1,"164":1}}],["opts",{"2":{"64":4,"237":9,"244":5,"248":2,"249":2,"609":2,"771":7,"932":5,"937":4,"954":2,"1208":1}}],["oomscoreadj",{"2":{"1212":1}}],["oom",{"2":{"1159":1,"1209":2}}],["oon",{"2":{"139":3,"888":3}}],["oo",{"2":{"139":3,"888":3}}],["outform",{"2":{"726":1}}],["outer",{"2":{"590":4,"591":1}}],["outerhtml只能作用在element元素上",{"2":{"122":1}}],["outbox",{"2":{"251":1}}],["out",{"2":{"251":3,"589":4,"726":5,"1132":1,"1178":6,"1218":1}}],["outputsourcerange",{"2":{"954":1}}],["outputs表示打包后的产物路径",{"2":{"818":1}}],["outputs",{"2":{"818":1}}],["outputpath",{"2":{"181":1,"184":1,"190":1}}],["output",{"2":{"132":1,"172":1,"175":1,"190":1,"237":5,"857":1}}],["ok",{"2":{"64":1,"83":2,"251":3,"317":1,"342":1,"343":1,"453":1,"615":1,"708":1,"716":1,"723":2,"729":1,"765":2,"769":1,"770":1,"999":2}}],["onbuild",{"0":{"1065":1},"2":{"1065":6}}],["onbeforerequest",{"2":{"438":2}}],["on字段中指定了db服务",{"2":{"1023":1}}],["on字段来定义容器之间的依赖关系",{"2":{"1023":1}}],["onstop",{"2":{"944":1,"945":1}}],["onsubmit",{"2":{"197":2,"747":2}}],["ontrigger",{"2":{"944":1,"945":1}}],["ontrack",{"2":{"944":1,"945":1}}],["onmessage",{"2":{"773":2}}],["onmoduledestroy",{"2":{"621":2}}],["onmoduleinit",{"2":{"621":1}}],["onfilechange",{"2":{"765":2,"768":1}}],["onfulfilled",{"2":{"98":6}}],["onfulfilledcallback",{"2":{"98":4}}],["on|off",{"2":{"718":1}}],["on显示的文件时间为服务器时间",{"2":{"712":1}}],["onapplicationshutdown",{"2":{"621":1}}],["onapplicationbootstrap",{"2":{"621":1}}],["onabort",{"2":{"505":1}}],["one",{"2":{"251":2,"797":1,"1014":1,"1214":1}}],["onerror",{"2":{"244":2,"505":1}}],["onwarn",{"2":{"237":1}}],["online",{"2":{"431":1,"1208":2}}],["only定义哪些分支和标签的git项目将会被执行job",{"2":{"1135":1}}],["only和except用分支策略来限制jobs的构建",{"2":{"1135":1}}],["onlygetter",{"2":{"934":3}}],["only并不会阻止不安全的内容被加载",{"2":{"350":1}}],["onlyhttp头部的语法规则",{"2":{"350":1}}],["only",{"0":{"271":1,"1135":1},"2":{"237":2,"350":2,"439":1,"800":1,"805":1,"1098":2,"1135":1,"1143":2,"1190":1}}],["onload",{"2":{"198":1,"244":2,"354":1,"496":1,"505":1,"748":1,"772":1,"773":1}}],["onchange=",{"2":{"765":1}}],["once",{"2":{"621":3}}],["onceevent",{"2":{"195":10,"745":10}}],["oncoming",{"2":{"251":4}}],["oncleanup",{"2":{"944":2,"945":6}}],["onclick=",{"2":{"229":1,"230":1,"231":1,"232":1}}],["onclose",{"2":{"201":2,"751":2}}],["onrejected",{"2":{"98":6}}],["onrejectedcallback",{"2":{"98":4}}],["on",{"0":{"1023":1},"2":{"56":1,"134":3,"139":2,"140":2,"200":2,"251":3,"354":3,"404":1,"422":1,"454":2,"455":1,"634":1,"709":3,"712":3,"717":5,"718":1,"721":4,"723":1,"726":1,"727":1,"728":2,"750":2,"770":3,"880":3,"888":2,"889":2,"1018":1,"1023":2,"1025":1,"1034":2,"1051":4,"1074":1,"1116":5,"1131":3,"1132":2,"1139":1,"1214":3}}],["or进行连接过滤",{"2":{"453":1}}],["originname=$",{"2":{"772":1}}],["originname",{"2":{"770":2,"772":2}}],["origin等头部信息进行判断是不是允许跨域",{"2":{"692":1}}],["origin等头部信息来指定允许跨域请求的源和方法",{"2":{"339":1}}],["origin头字段也可以用来判断请求的来源",{"2":{"353":1}}],["origin",{"2":{"230":2,"232":2,"336":1,"339":2,"353":1,"404":1,"692":4,"724":2,"1034":2,"1183":2}}],["original",{"2":{"955":4}}],["originalname",{"2":{"765":1}}],["originalurl",{"2":{"634":1,"639":1}}],["originalversion",{"2":{"97":1}}],["originalpath",{"2":{"97":1}}],["orange",{"2":{"251":3}}],["oranges",{"2":{"150":4,"899":4}}],["oracle等等",{"2":{"67":1}}],["ordernormal",{"2":{"205":2,"755":2}}],["order200",{"2":{"205":2,"755":2}}],["ordertype",{"2":{"205":5,"755":5}}],["order500",{"2":{"205":2,"755":2}}],["order",{"0":{"81":1},"2":{"81":4,"462":1,"846":2}}],["ordinarytoprimitive证明",{"2":{"40":1,"546":1}}],["ordinarytoprimitive签名如下",{"2":{"40":1,"546":1}}],["ordinarytoprimitive",{"0":{"40":1,"546":1},"2":{"40":2,"49":1,"546":2,"555":1}}],["org",{"2":{"49":1,"97":3,"118":1,"454":1,"462":3,"541":1,"555":1,"568":1,"707":4,"718":1,"817":1,"1121":2,"1142":1,"1190":1}}],["org中搜索对应的关键字ordinarytoprimitive",{"2":{"40":1,"546":1}}],["or",{"2":{"40":1,"64":1,"141":1,"195":2,"546":1,"583":1,"621":2,"745":2,"800":2,"890":1,"1007":1,"1103":2,"1132":2,"1225":1}}],["o",{"2":{"40":9,"60":5,"140":1,"161":1,"163":2,"251":2,"537":2,"546":9,"889":1,"936":2,"943":2,"1207":1,"1208":2,"1217":1}}],["official",{"2":{"999":2}}],["office",{"2":{"251":3}}],["off显示文件大概大小",{"2":{"712":1}}],["offset++",{"2":{"517":1}}],["offsetheight",{"2":{"201":1,"751":1}}],["offset",{"2":{"201":1,"462":4,"486":1,"487":1,"497":4,"510":3,"514":4,"517":3,"646":1,"683":1,"685":1,"751":1,"768":5,"770":3}}],["off",{"2":{"128":1,"132":1,"251":1,"712":1,"717":2,"718":1,"726":2,"830":1,"1034":1,"1051":1,"1066":1,"1070":1,"1073":1}}],["of",{"2":{"33":1,"40":1,"118":1,"195":2,"222":2,"232":1,"251":2,"355":1,"367":1,"368":1,"546":1,"660":2,"745":2,"797":1,"800":6,"814":1,"836":1,"857":4,"934":1,"964":3,"999":1,"1006":1,"1051":1,"1103":2,"1214":4,"1218":3,"1225":1,"1227":1}}],["ksfqx",{"2":{"1217":1}}],["kcn6c",{"2":{"1217":1}}],["kube",{"2":{"1212":1,"1214":6,"1217":16,"1218":4}}],["kubeconfig=",{"2":{"1214":2}}],["kubeconfig",{"2":{"1212":2}}],["kubectl",{"2":{"1211":1,"1214":1,"1217":3,"1218":4}}],["kubeproxy",{"2":{"1212":1}}],["kubeproxyconfiguration",{"2":{"1212":2}}],["kubeadm",{"2":{"1211":1,"1212":5,"1213":2,"1214":3}}],["kubeadm等等",{"2":{"1194":1}}],["kubeletconfiguration",{"2":{"1212":2}}],["kubelet",{"2":{"1195":1,"1211":2,"1212":1}}],["kubernetes官方文档",{"2":{"1222":1}}],["kubernetesversion",{"2":{"1212":1}}],["kubernetes项目为基于debian和redhat的linux发行版以及一些不提供包管理器的发行版提供通用的指令",{"2":{"1195":1}}],["kubernetes",{"0":{"1167":1},"2":{"1121":3,"1167":3,"1207":3,"1208":1,"1210":7,"1212":4,"1214":7,"1218":1}}],["klo2k",{"2":{"1094":2}}],["k1=v2",{"2":{"1055":2}}],["k1=v1",{"2":{"1055":2}}],["khtml",{"2":{"1005":1,"1007":1}}],["kaao",{"2":{"410":1}}],["k8s默认使用containerd",{"2":{"1212":1}}],["k8s使用container",{"2":{"1207":1}}],["k8s使用cgroup来管理容器资源",{"2":{"1198":1}}],["k8s",{"2":{"325":1,"350":1,"1128":1,"1129":2,"1199":6,"1200":3,"1205":2,"1206":1,"1212":4,"1217":11,"1218":2,"1223":1}}],["kr",{"2":{"251":1}}],["knife",{"2":{"251":1}}],["kind",{"2":{"1212":4,"1217":2}}],["killmode=process",{"2":{"1208":1}}],["kill命令",{"2":{"1008":1}}],["kill",{"0":{"1032":1},"2":{"994":1,"1032":1,"1159":1,"1208":1}}],["killall",{"2":{"728":1}}],["kimono",{"2":{"251":1}}],["kiss",{"2":{"251":1}}],["kissing",{"2":{"251":5}}],["ko",{"2":{"673":2}}],["koko",{"2":{"251":1}}],["koala",{"2":{"251":1}}],["koa",{"2":{"92":1,"601":1,"737":1}}],["kobe",{"2":{"28":3,"29":1,"30":2,"32":2}}],["kernel",{"2":{"1198":1,"1217":1}}],["keepalived",{"2":{"728":26}}],["keepalived需要绑定和主机同一网段的一个或多个虚拟ip",{"2":{"728":1}}],["keepalived是一款常用于搭建高可用性服务的软件",{"2":{"728":1}}],["keepalived实现高可用",{"0":{"728":1}}],["keepalive",{"2":{"384":1,"709":1}}],["keep",{"2":{"342":2,"343":2,"344":1,"347":1,"431":1,"453":2,"723":1}}],["keepextensions",{"2":{"62":1}}],["keyprovider",{"2":{"1209":4}}],["key和",{"2":{"1178":1}}],["key2>=",{"2":{"1024":1}}],["key>=",{"2":{"1024":1,"1055":1,"1057":3}}],["keyof",{"2":{"920":6}}],["keyout",{"2":{"726":1}}],["keyorsecret",{"2":{"64":1}}],["key用于配置",{"2":{"710":1}}],["keycap",{"2":{"251":1}}],["keyboard",{"2":{"251":1}}],["keywords",{"2":{"1102":1,"1103":1,"1124":1,"1183":1,"1184":1,"1187":1}}],["keyword",{"2":{"83":2,"238":1}}],["keys",{"2":{"33":1,"64":1,"237":1,"581":1,"687":3,"707":2,"721":1,"800":1,"801":1,"814":1,"941":5,"950":1,"951":2,"954":4,"963":1,"1209":4,"1214":2}}],["key",{"2":{"33":4,"64":4,"75":1,"83":10,"86":2,"225":2,"229":5,"230":2,"231":2,"233":3,"251":2,"353":1,"354":4,"629":1,"631":1,"648":2,"707":2,"721":1,"726":9,"932":13,"937":4,"938":2,"950":7,"951":14,"954":3,"955":2,"956":9,"958":7,"959":12,"960":3,"961":3,"963":3,"964":20,"1024":1,"1054":1,"1055":2,"1121":1,"1178":11,"1209":4,"1210":2}}],["k",{"2":{"60":5,"157":7,"159":1,"160":4,"162":7,"163":5,"164":1,"165":1,"333":3,"581":3,"920":13,"950":2,"951":9,"955":2,"963":3}}],["ktv推荐歌曲",{"2":{"54":1}}],["ktvlikes",{"2":{"54":1}}],["ktv",{"2":{"54":5,"66":1}}],["eof",{"2":{"1183":2,"1205":4,"1206":2,"1210":2}}],["ee",{"2":{"1120":1,"1124":1,"1125":1,"1126":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1,"1141":1,"1142":1,"1143":1,"1144":1,"1145":1,"1147":1,"1148":1,"1149":2,"1170":1,"1171":2,"1192":3}}],["eee9e9",{"2":{"61":1}}],["e404",{"2":{"1103":1}}],["eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2",{"2":{"1054":1,"1055":1}}],["eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333",{"2":{"1051":1}}],["ejs视图引擎",{"2":{"671":1}}],["ejs",{"2":{"671":4,"673":1}}],["eq",{"2":{"728":2}}],["equeue",{"2":{"510":1}}],["equiv=",{"2":{"222":1}}],["eqdupdo",{"2":{"453":1}}],["edu",{"2":{"1039":1,"1045":1,"1083":1}}],["editorconfig定义基本的代码风格规范",{"2":{"837":1}}],["editorconfig更注重于代码的基本格式",{"2":{"837":1}}],["editorconfig配置提示",{"2":{"836":1}}],["editorconfig文件",{"2":{"836":1}}],["editorconfig",{"0":{"836":1},"2":{"836":1}}],["editor",{"2":{"448":1,"832":1,"838":8,"840":3,"843":1}}],["edit",{"2":{"414":1,"430":1}}],["edge",{"2":{"215":1,"525":1}}],["e类地址最高位为1111",{"2":{"359":1}}],["e类地址",{"2":{"359":1}}],["eth0",{"2":{"1086":1,"1090":4}}],["ether",{"2":{"298":6,"454":2,"728":3,"1090":2}}],["etcd",{"2":{"1212":2,"1217":1}}],["etc",{"2":{"707":2,"708":4,"709":4,"713":5,"718":4,"726":6,"728":4,"800":1,"827":1,"1004":1,"1022":2,"1034":1,"1039":1,"1045":1,"1051":2,"1064":1,"1070":1,"1083":1,"1126":1,"1153":4,"1156":1,"1157":10,"1159":1,"1171":2,"1172":1,"1173":1,"1174":2,"1175":1,"1176":1,"1178":9,"1202":3,"1203":1,"1204":2,"1205":2,"1206":3,"1208":3,"1209":7,"1210":1,"1212":3,"1214":4}}],["etag",{"2":{"319":1,"342":1,"453":1,"695":1,"723":1}}],["efi",{"2":{"1202":2}}],["effect是个reactiveeffect类",{"2":{"964":1}}],["effectscheduler",{"2":{"944":1}}],["effects",{"2":{"934":2,"944":1,"945":1,"964":6}}],["effect进行更新",{"2":{"934":1}}],["effecttrackdepth",{"2":{"934":1,"964":1}}],["effect",{"2":{"934":16,"944":10,"945":10,"959":4,"960":2,"962":1,"963":2,"964":15}}],["ef",{"2":{"298":1}}],["e2dde05711a25e6c9df33567ae205f603eeeaead",{"2":{"1108":1}}],["e2e和component",{"2":{"878":1}}],["e2e下",{"2":{"877":1}}],["e2e",{"2":{"665":2,"818":1,"876":1,"877":1,"878":1,"879":4,"880":1,"882":1}}],["e2",{"2":{"298":1}}],["eight",{"2":{"251":3}}],["egg等几种框架nest更有出色的架构能力",{"2":{"601":1}}],["egg等框架更新迭代太快",{"2":{"92":1}}],["eggplant",{"2":{"251":1}}],["egg",{"2":{"251":1,"737":1}}],["european",{"2":{"251":2}}],["euro",{"2":{"251":1}}],["eat",{"2":{"572":6,"577":6}}],["eaddrinuse",{"2":{"382":1}}],["early",{"2":{"727":1}}],["earth",{"2":{"251":3}}],["ear",{"2":{"251":2}}],["each",{"2":{"40":1,"203":2,"546":1,"753":2,"1214":3}}],["eyeglasses",{"2":{"251":1}}],["eye",{"2":{"251":1}}],["eyes",{"2":{"251":6}}],["evictionpressuretransitionperiod",{"2":{"1212":1}}],["evil",{"2":{"251":3}}],["ev",{"2":{"354":4}}],["evergreen",{"2":{"251":1}}],["everyone",{"2":{"1223":1}}],["everywhere功能最为强大同时支持多个系统",{"2":{"428":1}}],["everywhere",{"2":{"428":1}}],["every",{"2":{"203":1,"753":1,"857":2}}],["eventloop就是通过事件循环的机制当执行栈空闲时",{"2":{"531":1}}],["eventloop",{"2":{"527":1,"592":1}}],["eventloop事件循环机制",{"0":{"523":1},"1":{"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"537":1,"538":1,"539":1,"540":1,"541":1}}],["events块",{"2":{"709":1}}],["events",{"2":{"238":1,"382":1,"709":1,"994":1}}],["eventsmixin",{"2":{"238":2,"239":1}}],["eventsinks",{"2":{"195":6,"745":6}}],["event",{"2":{"222":5,"337":1,"382":1,"541":1,"621":1,"1121":2,"1122":1}}],["eventbus",{"2":{"195":2,"471":1,"745":2}}],["evaluate也就不会再执行计算属性的函数了",{"2":{"932":1}}],["evaluate",{"2":{"233":1,"932":4}}],["evaluated",{"2":{"83":1}}],["eval",{"2":{"183":2,"190":1,"350":2}}],["e",{"2":{"164":1,"200":9,"237":1,"244":2,"248":1,"251":1,"404":2,"496":2,"497":2,"499":1,"621":1,"724":1,"726":1,"750":9,"765":2,"768":2,"772":2,"773":6,"800":1,"806":2,"941":2,"1004":1,"1024":1,"1055":2,"1174":1,"1178":1,"1204":1,"1206":2,"1208":1}}],["er",{"2":{"382":1}}],["erabuiababidjabababkjlsdababababkl",{"2":{"141":1,"890":1}}],["err",{"2":{"57":2,"62":4,"64":4,"98":2,"222":2,"230":2,"244":2,"354":2,"404":2,"539":1,"771":5,"868":2,"1103":11}}],["errors",{"2":{"1209":1}}],["errorcodes",{"2":{"944":1,"945":3}}],["errorondeprecated",{"2":{"857":1}}],["errorexception",{"2":{"639":6}}],["error等等",{"2":{"249":1}}],["error图片",{"2":{"243":1}}],["errormsg",{"2":{"195":2,"197":10,"232":3,"745":2,"747":10}}],["error",{"2":{"7":1,"8":1,"9":1,"98":12,"118":1,"195":5,"197":1,"203":1,"230":1,"243":5,"244":7,"245":13,"247":2,"248":1,"249":1,"317":14,"354":1,"382":2,"404":2,"504":1,"634":1,"637":1,"639":10,"640":2,"646":1,"708":2,"709":4,"715":1,"718":9,"721":1,"745":5,"747":1,"753":1,"770":2,"830":4,"831":1,"840":1,"857":1,"868":4,"1007":1,"1039":1,"1184":1}}],["ecmafeatures",{"2":{"829":1}}],["ecmaversion",{"2":{"829":1}}],["ecmascript",{"2":{"829":1}}],["ecma262",{"2":{"49":1,"555":1}}],["ecdhe",{"2":{"726":1}}],["echo",{"2":{"703":1,"726":11,"797":3,"805":1,"806":1,"1014":1,"1051":2,"1054":2,"1055":2,"1119":3,"1124":5,"1127":1,"1128":2,"1130":1,"1142":1,"1148":2,"1178":11,"1184":1,"1190":2,"1204":1}}],["echarts",{"2":{"130":2}}],["ecn是一种拥塞控制机制",{"2":{"376":1}}],["ecn回显",{"2":{"376":1}}],["ece控制位可能不存在",{"2":{"376":1}}],["ece",{"2":{"376":2}}],["emscripten",{"2":{"980":1}}],["embed",{"2":{"350":1}}],["emoji",{"0":{"251":1}}],["emmmmm",{"2":{"354":1}}],["emmm",{"2":{"239":1}}],["emmet插件缩写补全",{"2":{"160":1}}],["empty",{"2":{"195":2,"504":1,"745":2,"797":8,"944":1,"945":1,"1051":1}}],["employee",{"2":{"83":2}}],["email",{"2":{"57":4,"64":2,"251":1,"1100":1,"1121":2}}],["enjoy",{"2":{"1227":1}}],["enforcing",{"2":{"1202":1}}],["enqueue",{"2":{"510":1,"517":2}}],["enp0s5",{"2":{"454":2}}],["enableprofiling",{"2":{"1212":1}}],["enabledsr",{"2":{"1212":1}}],["enabled",{"2":{"708":1,"1051":1,"1082":1,"1209":1,"1212":2,"1217":1}}],["enabled=0",{"2":{"707":1}}],["enabled=1",{"2":{"707":1,"1210":1}}],["enablecors",{"2":{"692":1}}],["enableversioning",{"2":{"654":1,"656":1}}],["enableimplicitconversion",{"2":{"643":2,"646":1}}],["enable",{"2":{"414":1,"421":1,"707":1,"1082":1,"1178":1,"1179":1,"1206":1,"1208":3,"1209":5,"1211":1}}],["ename",{"2":{"195":18,"745":18}}],["ens",{"2":{"1217":2}}],["ens256",{"2":{"298":1,"728":12}}],["ens160",{"2":{"298":5,"386":1,"728":2}}],["engine需要安装docker",{"2":{"1208":1}}],["engine两种使用",{"2":{"1207":1}}],["engine等多种容器运行时",{"2":{"1207":1}}],["engine构建的",{"2":{"1071":1}}],["engine",{"2":{"251":1,"525":2,"704":1,"1045":1,"1076":3,"1082":5,"1093":1,"1171":1,"1207":1,"1208":1,"1209":3}}],["engine=innodb",{"2":{"75":1,"86":2}}],["enumerate",{"2":{"231":1}}],["enumerable",{"2":{"229":1,"231":2,"932":1,"949":1,"950":2,"951":3,"954":1}}],["enum",{"2":{"227":1,"244":1,"771":1,"797":3}}],["env配置文件示例",{"2":{"1024":1}}],["env文件中的同名环境变量",{"2":{"1024":1}}],["env文件或命令行参数来设置环境变量",{"2":{"1024":1}}],["env文件进行配置",{"2":{"669":1}}],["env的依赖包需要安装下",{"2":{"858":1}}],["environment",{"0":{"1024":1,"1147":1},"2":{"857":2,"864":1,"1024":2,"1121":11,"1147":1}}],["environments",{"0":{"828":1},"2":{"828":2}}],["envfilepath",{"2":{"628":2}}],["envelope",{"2":{"251":2}}],["env变量来控制mode",{"2":{"182":1}}],["env=production",{"2":{"182":1,"190":1}}],["env=development",{"2":{"182":1,"190":1}}],["env",{"0":{"1055":1},"2":{"180":2,"182":7,"190":3,"229":1,"237":4,"238":3,"239":2,"455":1,"628":2,"630":1,"631":1,"632":1,"669":14,"703":6,"805":1,"806":1,"827":1,"828":2,"858":2,"954":2,"1024":1,"1051":1,"1054":3,"1055":14,"1074":5,"1209":2}}],["entity",{"2":{"237":2}}],["entries",{"2":{"222":2,"245":2}}],["entrypoint替换默认的entrypoint命令",{"2":{"1064":1}}],["entrypoint来指定要运行的程序",{"2":{"1064":1}}],["entrypoint参数",{"2":{"1063":1}}],["entrypoint",{"0":{"1064":1},"2":{"703":1,"1034":2,"1051":6,"1063":1,"1064":7,"1074":1,"1159":1}}],["entry",{"2":{"172":1,"175":1,"190":1,"237":11,"238":1,"245":3,"251":2,"954":1}}],["enter",{"2":{"157":2,"159":1,"163":1,"800":2}}],["en",{"2":{"110":2,"111":1,"112":1,"119":1,"222":1,"270":1,"347":1,"350":1,"462":1,"541":1,"669":1,"671":1,"673":2,"674":2,"676":1,"1202":1}}],["encourage",{"2":{"1227":1}}],["encoder",{"2":{"491":2}}],["encode",{"2":{"83":3,"491":1}}],["encoding设置分块编码",{"2":{"343":1}}],["encoding",{"2":{"62":1,"319":3,"343":3,"347":1,"717":2}}],["encapsulation",{"2":{"1217":1}}],["encrypted",{"2":{"332":2}}],["encrypt的结果是一个二进制字符串",{"2":{"83":1}}],["encrypt",{"2":{"83":6,"726":1}}],["endofline",{"2":{"839":1}}],["endoffset",{"2":{"462":1}}],["endings",{"2":{"494":1}}],["endcontainer",{"2":{"462":1}}],["endpoint=cluster",{"2":{"1214":1}}],["endpoint=",{"2":{"350":1}}],["endpoints",{"2":{"350":2,"355":1}}],["endpoint",{"2":{"350":1,"1200":3,"1209":2,"1212":1,"1214":4,"1215":1}}],["endangle",{"2":{"285":1}}],["end3r",{"2":{"222":2}}],["endtime",{"2":{"64":1}}],["end",{"0":{"854":2},"2":{"61":1,"83":8,"98":1,"157":1,"166":1,"230":2,"251":1,"284":1,"343":1,"520":4,"532":12,"639":1,"769":1,"771":5,"772":1,"773":1,"836":1,"851":2,"876":2}}],["es5",{"2":{"839":1}}],["esbenp",{"2":{"838":4,"840":1}}],["esbuildv",{"2":{"281":1}}],["estimated",{"2":{"864":1,"874":1}}],["estree",{"2":{"829":1}}],["established",{"2":{"383":2}}],["esprima",{"2":{"829":1}}],["eslint除了使用编辑器自动修复和格式化外",{"2":{"849":1}}],["eslint中添加prettier配置",{"2":{"840":1}}],["eslint中内置了很多规则",{"2":{"830":1}}],["eslint其实也可以对风格进行限制",{"2":{"835":1}}],["eslint虽然可以帮助降低代码出错的风险",{"2":{"834":1}}],["eslintignore",{"2":{"827":1}}],["eslintrc",{"2":{"827":4,"831":1}}],["eslint支持多种形式的配置文件",{"2":{"827":1}}],["eslint原理是基于静态代码分析",{"2":{"826":1}}],["eslint是一个javascript",{"2":{"826":1}}],["eslint",{"0":{"826":1},"1":{"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1},"2":{"827":1,"829":6,"831":8,"832":2,"833":2,"840":3}}],["es6的语法及变量",{"2":{"828":1}}],["es6",{"2":{"828":1,"833":1,"965":2}}],["es6等等",{"2":{"828":1}}],["es6推出了新的声明变量的关键字let和const",{"2":{"588":1}}],["es6也引进了class和extends关键字",{"2":{"583":1}}],["esm",{"2":{"237":2}}],["esmodule",{"2":{"190":1}}],["es",{"2":{"49":2,"237":3,"251":1,"555":2,"673":2}}],["el7",{"2":{"1198":1,"1202":1,"1210":2,"1217":3}}],["electronjs",{"2":{"464":1}}],["electric",{"2":{"251":1}}],["elephant",{"2":{"251":1}}],["elementui的pagination分页学习",{"2":{"63":1}}],["elementui分页使用",{"0":{"63":1}}],["elementui",{"2":{"52":1}}],["elementui和iviewui写出超漂亮的页面",{"2":{"50":1}}],["element",{"2":{"40":1,"115":1,"238":2,"484":1,"546":1,"850":1,"954":3,"1035":6}}],["el",{"2":{"63":2,"238":7,"239":2,"243":2,"244":5,"245":5,"247":3,"248":2,"249":3,"954":15}}],["else",{"2":{"33":2,"40":3,"57":1,"62":1,"64":5,"83":6,"98":3,"200":2,"205":3,"230":1,"232":1,"239":2,"245":1,"247":2,"354":1,"510":1,"512":1,"517":1,"520":1,"534":1,"535":1,"546":3,"651":1,"750":2,"755":3,"771":5,"874":1,"932":1,"934":3,"937":1,"938":4,"941":1,"942":2,"944":6,"945":2,"951":1,"954":4,"955":2,"964":3}}],["exit退出后",{"2":{"1004":1}}],["exitcode=0",{"2":{"994":1}}],["exit",{"2":{"726":3,"1066":1,"1178":3,"1184":1}}],["exists",{"2":{"1039":3,"1046":6,"1136":1}}],["exist",{"2":{"195":1,"745":1}}],["existing",{"2":{"97":1,"621":1,"800":1}}],["exact",{"2":{"712":1,"799":1}}],["examples",{"2":{"966":1}}],["example",{"2":{"222":2,"316":3,"354":1,"710":2,"725":3,"729":1,"1121":3,"1132":1,"1136":2,"1137":2,"1142":2,"1178":1}}],["except组合使用",{"2":{"1136":1}}],["except定义哪些分支和标签的git项目将不会执行job",{"2":{"1135":1}}],["except",{"0":{"1135":1},"2":{"801":1,"1098":1,"1135":1}}],["exceptionfilter",{"2":{"639":2}}],["exception",{"0":{"636":1},"1":{"637":1,"638":1,"639":1,"640":1},"2":{"40":2,"404":1,"546":2,"639":8}}],["exceeded",{"2":{"368":1,"1132":1}}],["exceeded报文告诉发送端已经超时",{"2":{"368":1}}],["exchange",{"2":{"251":1,"347":1}}],["exclamation",{"2":{"251":3}}],["excludecidrs",{"2":{"1212":1}}],["excludedfiles",{"2":{"830":1}}],["exclude",{"2":{"179":1,"180":1,"190":2,"635":1,"882":1}}],["execreload=",{"2":{"1208":1}}],["exec执行",{"2":{"1063":1}}],["exec进入容器做一些高级的操作",{"2":{"1005":1}}],["exec外",{"2":{"1005":1}}],["exec命令的基本语法",{"2":{"1005":1}}],["exec命令用于在运行中的docker容器中执行命令",{"2":{"1005":1}}],["execstart=",{"2":{"728":1,"1208":1}}],["execute",{"2":{"1179":2}}],["executed",{"2":{"1132":1}}],["executable",{"2":{"1058":1,"1063":1,"1064":1,"1121":1}}],["execution",{"2":{"1132":2}}],["executioncontext",{"2":{"619":2,"648":2,"651":2,"674":1}}],["executing",{"2":{"857":1}}],["executors",{"2":{"1165":1}}],["executor",{"2":{"98":2,"1121":5,"1157":3,"1158":1,"1159":1}}],["execquick是个快速执行命令的工具",{"2":{"434":1}}],["execquick和状态栏",{"0":{"433":1},"1":{"434":1,"435":1}}],["execquick",{"0":{"434":1},"2":{"429":1}}],["exec",{"2":{"138":1,"152":4,"153":2,"887":1,"901":4,"902":2,"1005":1,"1095":1,"1156":1,"1160":1,"1174":2,"1179":1,"1208":1,"1218":1}}],["external",{"2":{"237":2,"1121":2,"1176":1,"1217":1,"1218":2}}],["externals是webpack自带的选项",{"2":{"185":1}}],["externals",{"0":{"185":1},"2":{"130":1,"185":1,"190":1}}],["extended",{"2":{"354":1}}],["extend",{"2":{"238":2}}],["extends用来继承其他的规则",{"2":{"846":1}}],["extends用来继承第三方规则",{"2":{"797":1}}],["extendstatics",{"2":{"583":4}}],["extends",{"0":{"831":1,"846":1,"1143":1},"2":{"199":1,"228":3,"229":2,"230":1,"231":1,"243":1,"583":5,"686":1,"749":1,"797":2,"802":1,"818":1,"827":2,"830":1,"831":2,"840":1,"844":1,"918":1,"920":3,"921":3,"944":1,"964":1,"1143":2}}],["extensions",{"2":{"186":1,"190":1,"319":1,"695":1,"726":1}}],["ext",{"2":{"181":1,"190":1}}],["extractor",{"2":{"656":2}}],["extract",{"2":{"83":3}}],["extractjwt",{"2":{"64":3}}],["extname",{"2":{"62":4}}],["explicit",{"2":{"376":1}}],["exporfn是外面传进来的",{"2":{"954":1}}],["exporfn",{"2":{"932":3,"937":2,"938":7,"939":2,"940":2,"954":3}}],["exporting",{"2":{"703":2,"1051":2,"1054":2,"1055":2}}],["export",{"2":{"60":1,"69":1,"199":1,"238":4,"239":1,"243":4,"244":2,"245":1,"604":1,"605":2,"606":10,"607":1,"608":2,"609":2,"611":4,"612":1,"613":4,"614":1,"615":1,"616":1,"617":1,"618":1,"619":2,"622":2,"624":3,"626":1,"628":1,"629":1,"630":2,"631":3,"632":1,"634":1,"635":1,"637":1,"639":1,"640":3,"642":1,"643":4,"645":2,"646":3,"648":4,"651":1,"652":1,"655":1,"659":1,"660":3,"661":4,"666":1,"667":1,"669":3,"671":1,"673":1,"674":1,"675":1,"683":1,"685":1,"686":1,"687":1,"695":1,"700":2,"702":2,"749":1,"771":1,"863":1,"865":1,"868":1,"873":1,"875":3,"929":1,"930":1,"932":3,"934":6,"936":1,"937":1,"938":1,"940":1,"941":1,"943":1,"944":1,"954":9,"955":4,"964":8,"1010":2,"1214":2}}],["exports",{"0":{"608":1},"2":{"40":1,"62":1,"64":2,"130":1,"132":1,"175":1,"176":1,"177":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":2,"185":1,"186":1,"187":1,"188":1,"189":1,"190":3,"237":1,"263":1,"546":1,"604":2,"608":1,"797":3,"801":1,"802":1,"827":1,"828":2,"829":2,"830":2,"831":4,"839":1,"840":1,"844":1,"845":1,"846":1,"847":1,"857":1,"878":1,"879":1,"880":1,"1102":1,"1183":1}}],["exponential",{"2":{"390":1}}],["expose指令并不会自动将容器的端口映射到主机上",{"2":{"1062":1}}],["expose",{"0":{"1062":1},"2":{"238":1,"239":1,"703":1,"1034":2,"1051":1,"1062":4,"1065":1,"1074":1}}],["experimental",{"2":{"1082":1}}],["experimentalrunallspecs",{"2":{"878":1}}],["experiences",{"2":{"222":1}}],["expect",{"2":{"232":1,"859":3,"864":1,"866":2,"867":1,"868":1,"869":4,"870":2,"874":1,"875":1}}],["expired",{"2":{"134":1,"717":1}}],["expires设置具体的时间",{"2":{"347":1}}],["expires",{"2":{"132":2,"319":1,"347":2,"720":5}}],["expiresin",{"2":{"64":1}}],["expr",{"2":{"83":1}}],["expressstaticgzip",{"2":{"697":1}}],["expressjs",{"2":{"693":1,"698":2}}],["expressionless",{"2":{"251":1}}],["expression",{"2":{"83":1,"941":1}}],["express",{"2":{"52":1,"92":1,"342":1,"343":1,"344":1,"347":3,"354":4,"453":1,"455":3,"603":2,"613":1,"614":1,"619":1,"634":1,"639":1,"648":1,"651":1,"695":1,"697":1,"698":1,"701":1,"723":4,"737":1,"765":1,"769":1,"1034":3,"1074":4}}],["exp",{"2":{"83":1}}],["exotictoprim",{"2":{"40":3,"546":3}}],["g9xt7",{"2":{"1217":1}}],["gmsxc",{"2":{"1217":1}}],["gmt",{"2":{"342":1,"343":1,"347":1,"453":1,"720":2,"723":1}}],["gmt+0800",{"2":{"40":1,"41":1,"44":1,"546":1,"547":1,"550":1}}],["g5fd4c4d",{"2":{"1082":1}}],["gna",{"2":{"728":1}}],["gd",{"2":{"718":1}}],["gc",{"2":{"1209":1}}],["gcs",{"2":{"1159":1}}],["gcc",{"2":{"708":3,"718":2}}],["gcm",{"2":{"333":1,"726":1}}],["gpg",{"2":{"1210":2}}],["gpgcheck=0",{"2":{"1210":2}}],["gpgcheck=1",{"2":{"707":2}}],["gpgkey=https",{"2":{"707":2,"1210":1}}],["gpu进程",{"2":{"526":1}}],["gpu显示",{"2":{"279":1}}],["gpu",{"0":{"273":1}}],["gz",{"2":{"717":2,"718":2,"1060":1}}],["gz格式的压缩文件",{"2":{"697":1}}],["gzip压缩功能由ngx",{"2":{"717":1}}],["gzip压缩",{"0":{"717":1},"2":{"709":1}}],["gzip模块等等",{"2":{"708":1}}],["gzip",{"0":{"697":1},"2":{"134":10,"347":1,"697":2,"698":1,"708":1,"709":1,"717":18,"718":2,"1209":1}}],["g^b",{"2":{"333":1}}],["g^a",{"2":{"333":1}}],["gb",{"2":{"251":1,"712":1,"1195":1}}],["gates",{"2":{"1218":1}}],["gateway",{"2":{"298":1,"317":2,"371":1,"454":1,"726":2,"1084":1}}],["garp",{"2":{"728":1}}],["garden",{"2":{"251":1}}],["game",{"2":{"251":2}}],["glass",{"2":{"251":1}}],["globe",{"2":{"251":1}}],["glob",{"2":{"190":3,"814":1,"841":1,"857":1}}],["globalreturn",{"2":{"829":1}}],["globals都是用来设置设置当前代码的语言环境和全局变量的",{"2":{"828":1}}],["globals",{"0":{"828":1},"2":{"827":2,"828":1}}],["globaldependencies",{"2":{"817":1}}],["globalconfig",{"2":{"702":2}}],["globalconfiguration",{"2":{"669":2,"673":1,"702":2}}],["globalcompositeoperation",{"2":{"287":1}}],["global2",{"2":{"588":1}}],["globalalpha",{"2":{"283":1}}],["global",{"2":{"152":3,"238":1,"588":12,"589":3,"703":2,"728":5,"870":1,"875":1,"901":3,"1085":1,"1090":2}}],["guide",{"2":{"726":1,"833":1,"883":1}}],["guides",{"2":{"541":1,"1035":2}}],["gui线程",{"2":{"526":1}}],["guitar",{"2":{"251":1}}],["gulp",{"2":{"281":1,"784":1}}],["gunzip",{"2":{"708":1,"718":2}}],["gun",{"2":{"251":1}}],["guard在所有的middleware后执行",{"2":{"647":1}}],["guard是nestjs提供给应用程序进行鉴权守卫的手段",{"2":{"647":1}}],["guard",{"0":{"647":1},"1":{"648":1,"649":1},"2":{"636":1,"640":1,"648":3,"665":1}}],["guardsman",{"2":{"251":1}}],["gua",{"2":{"251":1}}],["ghost",{"2":{"251":1}}],["gecko",{"2":{"1005":1,"1007":1}}],["gemini",{"2":{"251":1}}],["gem",{"2":{"251":1}}],["genrsa",{"2":{"726":1,"1178":2}}],["gen",{"2":{"473":2}}],["generator",{"2":{"465":1,"473":1}}],["generate",{"0":{"257":1},"2":{"237":1,"726":1,"971":1,"1178":1}}],["general",{"2":{"325":1,"344":1,"350":3,"703":1,"722":3,"723":1,"726":6,"728":2}}],["genconfig",{"2":{"237":2}}],["getenforce",{"2":{"1202":1}}],["getdata",{"2":{"954":1}}],["getdate",{"2":{"60":1}}],["get中又会执行getter方法",{"2":{"932":1}}],["getting",{"2":{"1051":1}}],["gettimeout",{"2":{"661":2}}],["gettime",{"2":{"64":2}}],["getter拦截",{"2":{"954":1}}],["getteroroptions",{"2":{"934":5}}],["getter就是计算属性的函数",{"2":{"932":1}}],["getter",{"2":{"932":5,"934":8,"938":3,"941":1,"944":4,"945":5,"949":1,"951":4,"954":9,"955":2,"965":1,"968":1}}],["getfile",{"2":{"700":2}}],["getfuntionname",{"2":{"576":2}}],["getfullyear",{"2":{"60":1}}],["getversion2",{"2":{"655":1}}],["getversion1",{"2":{"655":1}}],["getvideoranges",{"2":{"520":1}}],["gets",{"2":{"944":1}}],["getstatus",{"2":{"639":1}}],["getselection",{"2":{"462":1}}],["getseconds",{"2":{"60":1}}],["get的类型定义如下",{"2":{"629":1}}],["gethostname",{"2":{"729":1}}],["gethours",{"2":{"60":1}}],["getheader",{"2":{"651":2}}],["gethello",{"2":{"622":1}}],["gethandler",{"2":{"648":2}}],["getlist",{"2":{"619":1,"637":1,"640":2,"642":1,"646":1,"683":1,"686":3}}],["getresponse",{"2":{"639":2,"651":1}}],["getrequest",{"2":{"619":1,"639":1,"648":1,"674":1}}],["getreader",{"2":{"496":1,"508":1,"512":2}}],["getouterhtml",{"2":{"954":1}}],["getownpropertydescriptor",{"2":{"951":2,"954":1}}],["getownpropertysymbols",{"2":{"33":1}}],["getone",{"2":{"612":1,"643":2}}],["get请求",{"2":{"612":1}}],["get请求手动添加两个字段",{"2":{"419":1}}],["getprototypeof分别用来设置和获取原型",{"2":{"575":1}}],["getprototypeof",{"0":{"575":1},"2":{"575":2}}],["getparameter",{"2":{"350":1}}],["getwriter",{"2":{"516":2}}],["getuuid",{"2":{"583":5}}],["getuint8",{"2":{"489":1}}],["geturlquery",{"2":{"350":1}}],["getuserinfo",{"2":{"648":1,"666":1,"667":1,"671":1}}],["getuser",{"2":{"229":4,"615":1,"616":1,"617":1,"865":1,"866":3,"867":2,"868":2}}],["getarticle",{"2":{"350":1}}],["getallcats",{"2":{"612":1}}],["getallbuilds",{"2":{"237":2}}],["getallusers",{"2":{"63":4}}],["getitem",{"2":{"864":1}}],["getinterval",{"2":{"661":2}}],["getinstance",{"2":{"196":3,"233":2,"746":3}}],["getispointinrange",{"2":{"462":1}}],["getimagedata",{"2":{"290":1}}],["getboundingclientrect",{"2":{"247":1,"462":1}}],["getcurrentscope",{"2":{"944":1}}],["getcronjob",{"2":{"661":1}}],["getcatbyid",{"2":{"612":1,"613":7,"614":1}}],["getcaptcha",{"2":{"61":3}}],["getclientrects",{"2":{"462":1}}],["getcontext",{"2":{"282":1,"497":1}}],["getconfig方法内部",{"2":{"237":1}}],["getcookie",{"2":{"61":1}}],["getmetadata",{"2":{"229":1,"232":1}}],["getmethod",{"2":{"40":1,"546":1}}],["getmilliseconds",{"2":{"60":1}}],["getminutes",{"2":{"60":1}}],["getmonth",{"2":{"60":2}}],["get",{"2":{"33":2,"40":2,"61":1,"225":4,"229":2,"231":3,"233":1,"238":2,"320":5,"337":1,"339":1,"344":1,"353":1,"354":1,"520":1,"521":2,"546":2,"571":1,"605":3,"612":7,"613":8,"615":2,"616":2,"617":2,"618":2,"619":2,"629":2,"635":1,"637":2,"640":4,"642":2,"643":3,"646":1,"648":3,"652":1,"655":3,"661":4,"666":1,"671":1,"675":1,"683":2,"686":3,"692":2,"700":3,"724":1,"729":3,"771":2,"879":1,"931":1,"932":11,"934":3,"938":2,"941":1,"949":1,"950":2,"951":9,"954":6,"955":2,"958":2,"959":6,"960":2,"961":3,"963":1,"964":8,"1005":1,"1007":2,"1034":2,"1039":1,"1056":2,"1065":2,"1103":2,"1217":3,"1218":3}}],["g|gif",{"2":{"190":1}}],["g|svg|gif",{"2":{"181":1}}],["got",{"2":{"1132":1}}],["go1",{"2":{"1082":2}}],["golf",{"2":{"251":1}}],["goat",{"2":{"251":1}}],["godmode",{"2":{"251":2}}],["goberserk",{"2":{"251":2}}],["goblin",{"2":{"251":1}}],["good",{"2":{"251":1}}],["googlemap",{"2":{"206":2,"756":2}}],["google",{"2":{"132":1,"347":1,"778":1,"1013":1,"1208":1,"1209":1,"1210":1,"1212":1,"1214":1}}],["go",{"2":{"83":1,"400":1,"431":1,"1082":2,"1208":1}}],["gid",{"2":{"1209":3}}],["git+http",{"2":{"1184":2}}],["gitcommit",{"2":{"1082":3}}],["gitignore中匹配的文件或路径",{"2":{"1071":1}}],["gitignore类似的配置文件",{"2":{"1071":1}}],["gitignore",{"2":{"800":1,"1183":1,"1187":1}}],["git规范提交在团队中发挥着重要的作用",{"2":{"787":1}}],["git信息五花八门",{"2":{"783":1}}],["gitlab支持两种的仓库注册表项目级别和示例级别",{"2":{"1186":1}}],["gitlab支持包仓库注册了",{"2":{"1185":1}}],["gitlab软件库",{"0":{"1185":1},"1":{"1186":1,"1187":1}}],["gitlab仓库有多种使用方法",{"2":{"1181":1}}],["gitlab搭建npm仓库",{"0":{"1181":1},"1":{"1182":1,"1183":1,"1184":1,"1185":1,"1186":1,"1187":1,"1188":1,"1189":1,"1190":1,"1191":1,"1192":1}}],["gitlab除了可以使用ip地址外",{"2":{"1175":1}}],["gitlab安装与配置",{"0":{"1170":1},"1":{"1171":1,"1172":1,"1173":1,"1174":1,"1175":1,"1176":1,"1177":1,"1178":1,"1179":1,"1180":1}}],["gitlab中的所有项目都可以使用",{"2":{"1161":1}}],["gitlab中的每个仓库代表着每个镜像",{"2":{"1011":1}}],["gitlab下指定的项目",{"2":{"1142":1}}],["gitlab其他项目其他分支的某个文件",{"2":{"1142":1}}],["gitlabrunner会通过项目根目录下的",{"2":{"1123":1}}],["gitlab会提供一些默认变量使用",{"2":{"1120":1}}],["gitlab会检测项目根目录里的",{"2":{"1118":1}}],["gitlab流水线配置",{"0":{"1118":1},"1":{"1119":1,"1120":1,"1121":1,"1122":1,"1123":1,"1124":1,"1125":1,"1126":1,"1127":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1,"1141":1,"1142":1,"1143":1,"1144":1,"1145":1,"1146":1,"1147":1,"1148":1,"1149":1}}],["gitlab",{"0":{"1150":1},"1":{"1151":1,"1152":1,"1153":1,"1154":1,"1155":1,"1156":1,"1157":1,"1158":1,"1159":1,"1160":1,"1161":1,"1162":1,"1163":1,"1164":1,"1165":1,"1166":1,"1167":1,"1168":1,"1169":1},"2":{"703":1,"726":3,"1120":1,"1121":36,"1122":2,"1123":2,"1124":1,"1125":1,"1126":2,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1,"1141":1,"1142":10,"1143":1,"1144":1,"1145":1,"1147":1,"1148":1,"1149":2,"1151":2,"1152":2,"1153":7,"1154":1,"1155":1,"1156":8,"1157":16,"1158":1,"1159":6,"1160":3,"1162":1,"1165":1,"1170":1,"1171":22,"1172":11,"1173":7,"1174":6,"1175":4,"1176":5,"1177":2,"1178":7,"1179":10,"1183":2,"1184":6,"1188":4,"1190":1,"1191":3,"1192":3}}],["git",{"2":{"602":3,"703":1,"785":2,"795":1,"797":3,"800":1,"801":1,"805":2,"1082":2,"1103":1,"1121":1,"1183":5,"1184":4,"1190":3,"1208":1}}],["githubusercontent",{"2":{"1217":2}}],["github下载地址https",{"2":{"93":1}}],["github",{"2":{"66":1,"93":1,"270":1,"293":1,"354":1,"602":1,"693":1,"698":3,"736":1,"821":1,"1118":1,"1188":2,"1208":2,"1230":1}}],["gibbous",{"2":{"251":2}}],["girlfriend",{"2":{"960":2}}],["girl",{"2":{"251":1}}],["gift",{"2":{"251":2}}],["gif",{"2":{"198":1,"245":3,"249":1,"717":1,"718":1,"748":1}}],["gi",{"2":{"44":1,"350":1,"550":1}}],["gt",{"2":{"38":1,"40":5,"43":1,"48":2,"117":4,"227":8,"232":1,"233":4,"254":3,"279":7,"400":1,"421":4,"422":5,"438":2,"439":2,"465":5,"499":1,"532":12,"538":6,"539":1,"544":1,"546":5,"549":1,"554":2,"589":2,"632":1,"679":1,"917":5,"934":3,"998":1,"1002":1,"1020":2,"1022":4,"1023":1,"1024":2,"1025":1,"1054":2,"1055":4,"1062":1,"1121":1}}],["g",{"2":{"34":1,"96":2,"137":1,"138":3,"139":1,"140":7,"150":3,"152":1,"154":3,"159":2,"161":1,"164":1,"215":1,"218":1,"237":1,"333":2,"473":3,"602":1,"621":1,"634":1,"639":1,"645":1,"648":1,"650":1,"708":1,"718":2,"726":1,"800":1,"814":1,"815":1,"819":1,"886":1,"887":3,"888":1,"889":7,"899":3,"901":1,"903":3,"1006":1,"1034":1,"1051":1,"1066":1,"1070":1,"1073":1,"1074":1,"1178":1,"1208":1,"1214":2}}],["grpc",{"2":{"1209":20}}],["grub2",{"2":{"1202":2}}],["grunt等工具更擅长进行任务流的工作",{"2":{"784":1}}],["grunt",{"2":{"281":1,"784":1}}],["grimacing",{"2":{"251":1}}],["grinning",{"2":{"251":1}}],["grin",{"2":{"251":1}}],["grid",{"0":{"21":1},"2":{"11":1,"21":1,"22":1}}],["grafana",{"2":{"1179":2}}],["grandchild",{"2":{"1121":1}}],["gratuitous",{"2":{"728":2}}],["grapes",{"2":{"251":1}}],["grammar",{"2":{"193":1}}],["grade",{"2":{"83":1,"233":3}}],["group的token都可以",{"2":{"1158":1}}],["group是个付费功能😂",{"2":{"1107":1}}],["group两种类型的仓库",{"2":{"1103":1}}],["group三类npm仓库",{"2":{"1098":1}}],["group三种类型的docker仓库",{"2":{"1042":1}}],["group>",{"2":{"1059":2,"1060":2}}],["group类",{"2":{"831":1}}],["group=nginx",{"2":{"708":1,"718":2}}],["groups",{"2":{"152":3,"901":3,"1046":1,"1212":1}}],["group",{"0":{"84":1},"2":{"83":1,"84":3,"728":3,"810":1,"1045":1,"1046":2,"1047":1,"1085":1,"1104":1,"1106":2,"1107":2,"1121":7,"1161":1}}],["grecord",{"2":{"708":1,"718":2}}],["grep",{"2":{"382":1,"718":2,"1012":1,"1051":1,"1054":1,"1055":2,"1085":1,"1174":1,"1205":2,"1206":1}}],["grey",{"2":{"251":2}}],["greatest",{"2":{"83":1}}],["great",{"2":{"56":1}}],["green",{"2":{"12":1,"83":2,"251":3,"850":1}}],["实时查看nginx的日志",{"2":{"1007":1}}],["实时跟踪容器的日志输出",{"2":{"1007":1}}],["实战",{"0":{"822":1,"1034":1}}],["实际并不需要node环境及文件",{"2":{"1070":1}}],["实际上并没有和宿主机进行映射而是一种定义",{"2":{"1022":1}}],["实际上它并不代表某项具体的技术",{"2":{"810":1}}],["实际上是向受害者网站发送了一个带有攻击代码的请求",{"2":{"351":1}}],["实际情况对于root账户没忘的话",{"2":{"1174":1}}],["实际情况应添加相关的交互",{"2":{"775":1}}],["实际情况应该做一次封装",{"2":{"770":1}}],["实际情况中也应该合理安排切片大小和并发数",{"2":{"771":1}}],["实际情况的最大长度为1448",{"2":{"376":1}}],["实际运行node",{"2":{"237":1}}],["实施各种攻击",{"2":{"349":1}}],["实践",{"0":{"234":1,"519":1},"1":{"520":1,"521":1,"522":1},"2":{"601":1}}],["实例级别",{"2":{"1186":1}}],["实例的完整版本",{"2":{"1121":1}}],["实例的补丁版本",{"2":{"1121":1}}],["实例的小版本",{"2":{"1121":1}}],["实例的主版本",{"2":{"1121":1}}],["实例的基本",{"2":{"1121":1}}],["实例中的所有作业中是唯一的",{"2":{"1121":1}}],["实例中是否启用",{"2":{"1121":1}}],["实例一样",{"2":{"995":1,"1081":1}}],["实例并且将流锁定到该实例",{"2":{"516":1}}],["实例分支的数组",{"2":{"512":1}}],["实例",{"2":{"512":1,"934":1,"965":1,"1121":3}}],["实例方法也会在new时巧妙借用",{"2":{"582":1}}],["实例方法",{"0":{"512":1,"516":1}}],["实例化时会传入",{"2":{"934":1}}],["实例化时",{"2":{"244":1}}],["实例化图片管理器的选项",{"2":{"243":1}}],["实例化对象",{"2":{"195":1,"745":1}}],["实例属性是在构造函数中在new的时候自动添加到内部生成的对象上",{"2":{"582":1}}],["实例属性",{"0":{"511":1,"515":1},"2":{"233":1}}],["实在是太香了",{"2":{"131":1}}],["实现容器与主机之间的数据共享",{"2":{"1061":1}}],["实现对象拦截代理",{"2":{"964":1}}],["实现torefs",{"0":{"963":1}}],["实现ref",{"0":{"962":1}}],["实现数组",{"0":{"961":1}}],["实现这一功能需要借助ts",{"2":{"863":1}}],["实现思路",{"2":{"772":1}}],["实现请求的负载均衡",{"2":{"706":1}}],["实现",{"2":{"648":1}}],["实现catch方法",{"2":{"639":1}}],["实现nestmiddleware中use方法",{"2":{"634":1}}],["实现nestmiddleware类中的use方法",{"2":{"633":1}}],["实现抓包记录",{"2":{"411":1}}],["实现双方在不直接交换密钥的情况下",{"2":{"333":1}}],["实现http2需要升级服务器和客户端软件",{"2":{"323":1}}],["实现效果",{"2":{"241":1}}],["实现各个事件间的解耦",{"2":{"208":1,"758":1}}],["实现起来也很简单",{"2":{"196":1,"746":1}}],["实现的方法为先判断实例存在与否",{"2":{"196":1,"746":1}}],["实现秒开功能",{"2":{"132":1}}],["实现了秒开😱",{"2":{"131":1}}],["实现了两栏布局效果",{"2":{"111":1}}],["实现清除了内部浮动的效果",{"2":{"108":1,"112":1}}],["实现深拷贝",{"2":{"32":1}}],["实则暗藏玄机",{"2":{"11":1}}],["用时",{"2":{"1208":1}}],["用默认",{"2":{"1178":1}}],["用以部署和清理任何您想使用的环境",{"2":{"1169":1}}],["用初始账号密码进行登录",{"2":{"1096":1}}],["用冒号",{"2":{"1012":1}}],["用一张图来描述这个过程",{"2":{"953":1}}],["用一个变量缓存起来即可",{"2":{"196":1,"746":1}}],["用最简单的例子多分析几遍有助于理解",{"2":{"927":1}}],["用就是了",{"2":{"786":1}}],["用在在切片上传中使用",{"2":{"771":1}}],["用它做点啥",{"2":{"516":1}}],["用blob对象构造url使用",{"2":{"497":1}}],["用fiddler发送请求",{"2":{"436":1}}],["用localhost",{"2":{"425":1}}],["用域名归纳请求",{"2":{"414":1}}],["用react",{"2":{"405":1}}],["用node",{"2":{"400":1}}],["用chrome",{"2":{"399":1}}],["用途",{"0":{"260":1,"497":1,"978":1},"2":{"228":1,"229":1,"230":1,"231":1,"232":1}}],["用于浏览器的访问",{"2":{"1172":1}}],["用于从允许运行该项目中的所有runner列表中选择指定的runner",{"2":{"1129":1}}],["用于验证新的作业请求",{"2":{"1121":1}}],["用于验证公开参数的合法性",{"2":{"333":1}}],["用于登录",{"2":{"1121":1}}],["用于告诉用户哪些端口可以被容器访问",{"2":{"1062":1}}],["用于定义多个",{"2":{"1018":1}}],["用于定义客户端与服务器之间进行请求和响应的行为",{"2":{"320":1}}],["用于保护docker镜像仓库中的镜像资源",{"2":{"1014":1}}],["用于保护数据的安全性",{"2":{"330":1}}],["用于与支持",{"2":{"1121":1}}],["用于与",{"2":{"993":1,"1080":1}}],["用于检测和报告代码中的潜在问题和编码规范的违规",{"2":{"826":1}}],["用于检查ip首部是否出错",{"2":{"367":1}}],["用于在物理内存不足时",{"2":{"1203":1}}],["用于在",{"2":{"1121":3}}],["用于在响应消息头中添加",{"2":{"717":1}}],["用于在发生拥塞时通知tcp发送方降低发送速率",{"2":{"376":1}}],["用于设置启用或禁用从代理服务器上收到相应内容",{"2":{"717":1}}],["用于不含正则表达式uri前",{"2":{"711":1}}],["用于指定在作业成功或失败时应附加到作业的文件或目录列表",{"2":{"1139":1}}],["用于指定响应正文",{"2":{"716":1}}],["用于指定虚拟主机监听的端口和",{"2":{"710":1}}],["用于指示服务器应该返回哪种类型的响应",{"2":{"716":1}}],["用于指示ip分片和重组的信息",{"2":{"367":1}}],["用于配置一个",{"2":{"709":1}}],["用于配置一个虚拟主机的参数",{"2":{"709":1}}],["用于配置",{"2":{"709":1}}],["用于配置事件模块的参数",{"2":{"709":1}}],["用于储存所有代码执行期间的执行上下文",{"2":{"592":1}}],["用于类似java等面向对象语言类的实现和继承",{"2":{"583":1}}],["用于计算机的双向文稿排版中",{"2":{"462":2}}],["用于可能需要换行处",{"2":{"462":1}}],["用于发起连接数据包同步初始序列号",{"2":{"455":1}}],["用于确定传输的是哪一段数据",{"2":{"455":1}}],["用于确认包的的顺序",{"2":{"455":1}}],["用于确保握手请求的唯一性",{"2":{"354":1}}],["用于避免在网络中发生拥塞而导致网络性能下降或崩溃",{"2":{"392":1}}],["用于存储和管理自己创建的",{"2":{"1013":1}}],["用于存储已经建立连接的队列",{"2":{"380":1}}],["用于存储syn",{"2":{"380":1}}],["用于通知从确认号开始能够接受的数据大小",{"2":{"376":1}}],["用于扩展ip首部的功能",{"2":{"367":1}}],["用于唯一标识一个ip数据包",{"2":{"367":1}}],["用于唯一地标识互联网上的任何资源",{"2":{"316":1}}],["用于将数据包从源网络传输到目标网络",{"2":{"371":1}}],["用于将数据包从一个网络传输到另一个网络",{"2":{"371":1}}],["用于将数据包发送到同一台计算机上的网络接口",{"2":{"361":1}}],["用于将私有ip地址转换为公共ip地址",{"2":{"370":1}}],["用于将一个ip地址分成网络和主机两部分",{"2":{"363":1}}],["用于标识一个ip地址所属的网络和主机部分",{"2":{"363":1}}],["用于标识cookie",{"2":{"347":1}}],["用于多播",{"2":{"359":1}}],["用于对资源进行局部更新",{"2":{"320":1}}],["用于对源代码进行转换",{"2":{"178":1}}],["用于跟踪请求",{"2":{"320":1}}],["用于查询服务器支持的请求方法和头部信息",{"2":{"320":1}}],["用于建立与服务器的隧道连接",{"2":{"320":1}}],["用于请求删除指定资源",{"2":{"320":1}}],["用于请求指定资源",{"2":{"320":1}}],["用于向服务器上传指定资源",{"2":{"320":1}}],["用于向服务器提交数据",{"2":{"320":1}}],["用于判断缓存",{"2":{"319":1}}],["用于缓存",{"2":{"319":1}}],["用于描述响应的相关信息",{"2":{"318":1}}],["用于描述请求的相关信息",{"2":{"318":1}}],["用于访问该资源的服务器端口号",{"2":{"316":1}}],["用于改进网络应用的质量",{"2":{"214":1}}],["用于把模块原内容按照需求转换成新内容",{"2":{"172":1}}],["用来做数据持久化的",{"2":{"1109":1}}],["用来登录npm的用户名",{"2":{"1100":1}}],["用来获取或设置原对象的值",{"2":{"958":1}}],["用来处理嵌套对象",{"2":{"955":1}}],["用来处理http请求",{"2":{"605":1}}],["用来告诉dep当前需要收集的watcher",{"2":{"953":1}}],["用来收集watcher",{"2":{"951":1}}],["用来收集相关联的watcher对象",{"2":{"931":1}}],["用来区别不同的执行时机",{"2":{"944":1}}],["用来区分你的运行环境",{"2":{"173":1}}],["用来标识当前作业的执行阶段",{"2":{"1126":1}}],["用来标识这个是计算属性watcher",{"2":{"932":1}}],["用来标识网络中每个主机的位置",{"2":{"372":1}}],["用来存放",{"2":{"954":1}}],["用来存放测试mock数据",{"2":{"878":1}}],["用来存储对象变量或其他复杂的数据结构变量",{"2":{"530":1}}],["用来存储最终信息",{"2":{"63":1}}],["用来描述当前测试",{"2":{"859":1}}],["用来描述当前测试的整体内容",{"2":{"859":1}}],["用来分组测试",{"2":{"859":1}}],["用来生成覆盖率报告",{"2":{"857":1}}],["用来生成账户名和密码",{"2":{"713":1}}],["用来继承某些规则",{"2":{"831":1}}],["用来限制提交类型",{"2":{"797":1}}],["用来指定本次修改的范围",{"2":{"790":1}}],["用来导入其他的模块",{"2":{"607":1}}],["用来提供类类型的元数据",{"2":{"606":1}}],["用来直接提供值类型的元数据",{"2":{"606":1}}],["用来控制对方发送的数据量",{"2":{"455":1}}],["用来控制面板显示",{"2":{"430":1}}],["用来发起连接同步初始序列号",{"2":{"455":1}}],["用来查询ip所对应的mac地址",{"2":{"454":1}}],["用来配置代码校验的一套规则",{"2":{"830":1}}],["用来配置自定义的全局变量",{"2":{"828":1}}],["用来配置相应规则来抓包",{"2":{"436":1}}],["用来配置局域网中的其他机器代理规则",{"2":{"414":1}}],["用来修改脚本",{"2":{"436":1}}],["用来解码和编码",{"2":{"431":1}}],["用来显示抓包记录条数的",{"2":{"431":1}}],["用来安装证书",{"2":{"414":1}}],["用来拦截请求可以代理到其他地址也可以返回本地的文件等等",{"2":{"414":1}}],["用来设置http",{"2":{"414":1}}],["用来设置断点请求",{"2":{"414":1}}],["用来设置代理",{"2":{"414":1}}],["用来设置代码的环境",{"2":{"182":1}}],["用来模拟网速",{"2":{"414":1}}],["用来和生产环境错误做映射",{"2":{"408":1}}],["用来和其他的主机进行通信",{"2":{"365":1}}],["用来保存后面调试的代码",{"2":{"407":1}}],["用来后续的通信加密",{"2":{"332":1}}],["用来给资源一个永久的",{"2":{"316":1}}],["用来唯一地标识互联网上的资源",{"2":{"316":1}}],["用来管理所有可注入的service",{"2":{"229":1}}],["用来优化项目",{"2":{"187":1}}],["用来组合匹配的范围或者其他",{"2":{"144":1,"893":1}}],["用来匹配字符集中字符",{"2":{"139":1,"888":1}}],["用其他展位图进行展示",{"2":{"133":1}}],["用关键词salt",{"2":{"83":1}}],["用反斜杠转义str中的单引号",{"2":{"83":1}}],["用法",{"2":{"64":1}}],["用起来方便",{"2":{"62":1}}],["用户发布的用户token",{"2":{"1187":1}}],["用户定义的阶段都在两者之间运行",{"2":{"1127":1}}],["用户状态",{"2":{"1100":1}}],["用户id",{"2":{"1100":1}}],["用户等",{"2":{"996":1}}],["用户没有提供",{"2":{"954":1}}],["用户监听的",{"2":{"938":1}}],["用户体验会变得非常差",{"2":{"773":1}}],["用户对网页的加载速度和响应速度有着越来越高的要求",{"2":{"762":1}}],["用户名或组名",{"2":{"1121":2}}],["用户名为ihengshuai",{"2":{"713":1}}],["用户名不能为空",{"2":{"197":2,"747":2}}],["用户可以根据自己的需求对nginx进行灵活的配置",{"2":{"705":1}}],["用户可以根据自己的需求选择相应的模块",{"2":{"705":1}}],["用户可以自定义验证器也可以使用原始类型来验证参数是否正确",{"2":{"232":1}}],["用户路由",{"2":{"666":1,"671":1}}],["用户进行输入",{"2":{"532":1}}],["用户交互",{"2":{"532":1,"536":1}}],["用户交互和页面渲染之间的的调度",{"2":{"528":1}}],["用户如果点击页面的上某个表单提交任务",{"2":{"524":1}}],["用户点击选择文件后",{"2":{"499":1}}],["用户选择的文本范围或光标的当前位置",{"2":{"462":1}}],["用户页面",{"2":{"229":1,"230":1,"231":1}}],["用户相关service",{"2":{"229":1}}],["用户留存",{"2":{"222":1}}],["用户只负责传递需要的参数",{"2":{"201":1,"751":1}}],["用户承接分页设置的数据",{"2":{"63":1}}],["用户登录听歌",{"2":{"53":1}}],["用户需要到管理员申请账号和密码",{"2":{"53":1}}],["用户听歌需要登录",{"2":{"53":1}}],["用express教你写ktv点歌系统",{"2":{"50":1}}],["用",{"2":{"32":1,"145":1,"894":1}}],["可无序执行作业",{"2":{"1141":1}}],["可用性和灵活性",{"2":{"1206":1}}],["可用并且合并请求已被批准时为",{"2":{"1122":1}}],["可用于实例和许可证的许可功能的逗号分隔列表",{"2":{"1121":1}}],["可用时为",{"2":{"1121":8}}],["可执行文件的操作系统",{"2":{"1121":1}}],["可自动化性",{"2":{"1077":1}}],["可自行查看文档",{"2":{"485":1}}],["可分享性",{"2":{"1050":1}}],["可dockerfile中的expose类似",{"2":{"1022":1}}],["可重复性",{"2":{"1050":1}}],["可重复性和可移植性",{"2":{"1017":1}}],["可重用的服务",{"2":{"609":1}}],["可扩展性和性能",{"2":{"1206":1}}],["可扩展性和重用性",{"2":{"824":1}}],["可扩展的方式来构建可维护的",{"2":{"601":1,"662":1}}],["可维护性",{"2":{"1050":1}}],["可维护性是指代码易于修改和扩展",{"2":{"824":1}}],["可维护的",{"2":{"664":1}}],["可结合团队成员的特征习惯和使用成本选之",{"2":{"786":1}}],["可定制性和可扩展性",{"2":{"1077":1}}],["可定制性",{"2":{"785":1}}],["可大大降低每个人的心智负担从而高效提高规范性",{"2":{"782":1}}],["可见这种一次传输对大文件是行不通的",{"2":{"766":1}}],["可接受的值是从1到100的范围内",{"2":{"718":1}}],["可注入的",{"2":{"634":1}}],["可读性和可维护性",{"2":{"824":1,"842":1}}],["可读性更高",{"2":{"601":1}}],["可读流对的链式方法",{"2":{"512":1}}],["可写流取消或出现错误时触发",{"2":{"514":1}}],["可靠性和稳定性",{"2":{"824":1}}],["可靠性",{"2":{"375":1}}],["可靠的",{"2":{"374":1,"455":1}}],["可靠的通信网络",{"2":{"310":1}}],["可选的文本字符串",{"2":{"716":1}}],["可选项",{"0":{"626":1}}],["可选",{"2":{"400":1,"646":1,"788":1,"801":4,"1053":2,"1175":2}}],["可选字段",{"2":{"367":1}}],["可选部分的最大长度为40",{"2":{"367":1}}],["可惜的是ie却都不支持",{"2":{"246":1}}],["可惜现在并无cdn引用的链接来使用",{"2":{"131":1}}],["可访问性",{"2":{"214":1}}],["可模拟移动设备访问页面结果分析",{"2":{"213":1}}],["可复用面向对象软件的基础",{"2":{"211":1,"761":1}}],["可变的",{"2":{"920":1}}],["可变",{"2":{"197":1,"747":1}}],["可缺省",{"2":{"184":1}}],["可参考mdn教程",{"2":{"136":1,"885":1}}],["可触发父元素生成bfc",{"2":{"108":1,"112":1}}],["可触发另一个非浮动元素生成bfc",{"2":{"107":1,"111":1}}],["可应用到解决浮动元素的父元素高度塌陷问题中",{"0":{"108":1}}],["可应用到解决margin重叠的问题中",{"0":{"106":1}}],["可应用到两栏布局中",{"0":{"107":1}}],["可在其中一个元素外包裹一层容器",{"2":{"106":1,"110":1}}],["可能5",{"2":{"1236":1}}],["可能和",{"2":{"1121":1}}],["可能原因是没配置权限",{"2":{"1047":1}}],["可能对源码不熟悉的可能就有点懵",{"2":{"954":1}}],["可能是函数",{"2":{"937":1}}],["可能是添加了一个样式后就达到了预期效果",{"2":{"100":1}}],["可能出现罕见bug",{"2":{"783":1}}],["可能会觉得很无聊",{"2":{"1232":1}}],["可能会随时变化",{"2":{"1087":1}}],["可能会看到一些虚悬镜像",{"2":{"1002":1}}],["可能会产生莫名其妙的bug",{"2":{"783":1}}],["可能会越压越大",{"2":{"717":1}}],["可能会导致死循环或者无限重定向",{"2":{"715":1}}],["可能会被缓存",{"2":{"320":1}}],["可能看到本篇文档安装时的版本已经不是7了",{"2":{"679":1}}],["可能还有些其他的小配置或性能优化的方面需要处理",{"2":{"677":1}}],["可能还需要不断的优化",{"2":{"135":1}}],["可能平时学习时并没有仔细研究过",{"2":{"585":1}}],["可能每个版本会存在不同的差异",{"2":{"526":1}}],["可能直接用debugger可能会变得有点麻烦",{"2":{"407":1}}],["可能有人说还需要手动执行activefn的赋值操作",{"2":{"951":1}}],["可能有一种调试需要在线上环境下直接调试代码",{"2":{"407":1}}],["可能有同学会说为什么没有",{"2":{"221":1}}],["可能导致容器应用程序出现问题",{"2":{"1203":1}}],["可能导致不同人跑不起来的问题",{"2":{"783":1}}],["可能导致不稳定或性能问题",{"2":{"327":1}}],["可能导致缓存不一致",{"2":{"720":1}}],["可能导致应用程序错误等",{"2":{"370":1}}],["可能导致静态arp表中的信息不够实时",{"2":{"300":1}}],["可能初次目标已经达到加载条件",{"2":{"247":1}}],["可能事被功半",{"2":{"221":1}}],["可能这段话晦涩难懂",{"2":{"30":1}}],["可有可无",{"2":{"78":2,"79":1,"138":1,"835":1,"887":1}}],["可以扫描下方二维码关注公众号",{"2":{"1224":1}}],["可以相互通信",{"2":{"1217":1}}],["可以单独安装",{"2":{"1209":1}}],["可以单独写个类imagemanager来管理图片的不同状态",{"2":{"242":1}}],["可以超过项目级别的超时",{"2":{"1133":1}}],["可以代理到其他仓库",{"2":{"1104":1}}],["可以随意填",{"2":{"1100":1}}],["可以分配的有效",{"2":{"1085":1}}],["可以分为三种类型",{"2":{"1111":1}}],["可以分为两种类型",{"2":{"1011":1}}],["可以分为请求报文和响应报文两种类型",{"2":{"318":1}}],["可以忽略此步骤",{"2":{"1082":1}}],["可以忽略打包",{"2":{"130":1}}],["可以无视那个",{"2":{"1078":1}}],["可以运行时提供",{"2":{"1063":1}}],["可以体验出它相比命令式更加便捷",{"2":{"1051":1}}],["可以指定多个",{"2":{"1158":1}}],["可以指定runner标签",{"2":{"1129":1}}],["可以指定容器使用的网络类型和网络配置",{"2":{"1090":1}}],["可以指定具体版本",{"2":{"1038":1}}],["可以指定并发数",{"2":{"414":1}}],["可以任意命名",{"2":{"1020":1}}],["可以被创建",{"2":{"1003":1}}],["可以启动和运行应用程序",{"2":{"1003":1}}],["可以捕获对对象的任何属性的访问",{"2":{"965":1}}],["可以这样简单封装下",{"2":{"950":1}}],["可以进行端到端测试和组件测试",{"2":{"877":1}}],["可以进行热更新",{"2":{"177":1}}],["可以模拟不同尺寸的屏幕",{"2":{"878":1}}],["可以模拟用户与应用程序进行交互的行为",{"2":{"876":1}}],["可以模拟请求时长",{"2":{"419":1}}],["可以比做babel对代码做一些转换来兼容浏览器",{"2":{"858":1}}],["可以帮助用户更好地管理和保护",{"2":{"1011":1}}],["可以帮助开发者和运维人员更快地构建",{"2":{"992":1}}],["可以帮助开发团队构建可靠",{"2":{"851":1}}],["可以帮助你解决自己的疑惑",{"2":{"946":1}}],["可以帮助我们将编译后的代码映射回原始源代码",{"2":{"183":1}}],["可以执行以下任务",{"2":{"842":1}}],["可以当做gitignore使用",{"2":{"841":1}}],["可以借助辅助工具eslint帮助检查编码的规范降低错误风险",{"2":{"825":1}}],["可以借助外边距的负值",{"2":{"12":1}}],["可以方便地查看整个代码库的历史记录",{"2":{"811":1}}],["可以方便地进行代码调试和错误排查",{"2":{"785":1}}],["可以安装在全局也可以安装在项目中",{"2":{"799":1}}],["可以安装nginx",{"2":{"727":1}}],["可以快速定位到想要找到的内容",{"2":{"787":1}}],["可以快速上手sh",{"2":{"784":1}}],["可以提高开发效率",{"2":{"785":1}}],["可以提供更快的构建速度",{"2":{"784":1}}],["可以提供更强的网络安全性",{"2":{"366":1}}],["可以提供高效的静态文件传输和缓存服务",{"2":{"712":1}}],["可以配置prettier忽略的文件",{"2":{"841":1}}],["可以配置和运行一系列任务来完成代码的构建和优化",{"2":{"784":1}}],["可以配置哪些ip允许代理",{"2":{"414":1}}],["可以定义一系列任务来处理代码",{"2":{"784":1}}],["可以定义多个策略指令",{"2":{"350":1}}],["可以合并了",{"2":{"770":1}}],["可以与nginx等应用程序一起使用",{"2":{"728":1}}],["可以与其进行通信",{"2":{"361":1}}],["可以参考官方文档或其他资料",{"2":{"1082":1}}],["可以参考nginx",{"2":{"727":1}}],["可以参考elementui模态框的实现",{"2":{"196":1,"746":1}}],["可以更直接地将对象转换为响应式对象",{"2":{"965":1}}],["可以更容易地进行代码重构",{"2":{"811":1}}],["可以更轻松地管理共享的构建工具和配置文件",{"2":{"811":1}}],["可以更快地建立安全连接",{"2":{"727":1}}],["可以更好地防止网络攻击和提高网络的可靠性",{"2":{"727":1}}],["可以更好地适应不同的应用需求",{"2":{"727":1}}],["可以更好地控制请求和响应的优先级",{"2":{"727":1}}],["可以更好地控制缓存策略",{"2":{"720":1}}],["可以更好地实现多路复用",{"2":{"727":1}}],["可以平衡服务器的安全性和性能",{"2":{"726":1}}],["可以减少容器存储层的使用",{"2":{"1110":1}}],["可以减少网络流量和解析时间",{"2":{"727":1}}],["可以减少ssl握手的时间和cpu负载",{"2":{"726":1}}],["可以减少路由表的规模",{"2":{"366":1}}],["可以避免这个问题",{"2":{"720":1}}],["可以避免arp欺骗攻击",{"2":{"303":1}}],["可以和resize",{"2":{"718":1}}],["可以再次使用一下命令进行验证是否安装成功",{"2":{"718":1}}],["可以写正则来匹配",{"2":{"710":1}}],["可以写多个",{"2":{"710":1}}],["可以写一个规则将没有标签的过滤掉",{"2":{"687":1}}],["可以访问官方下载页面进行nginx的repo配置",{"2":{"707":1}}],["可以加快页面加载速度",{"2":{"706":1}}],["可以处理各种资源文件",{"2":{"784":1}}],["可以处理imap",{"2":{"706":1}}],["可以处理http请求",{"2":{"706":1}}],["可以处理成千上万个并发连接",{"2":{"704":1}}],["可以作为web服务器或者静态资源服务器使用",{"2":{"705":1}}],["可以作为系统的代理也可以代理具体的进程",{"2":{"428":1}}],["可以灵活增加新功能",{"2":{"705":1}}],["可以手动创建controller文件",{"2":{"610":1}}],["可以手动用charles来执行某个请求",{"2":{"414":1}}],["可以类比一下原型链",{"2":{"591":1}}],["可以正常访问全局的name",{"2":{"589":1}}],["可以给父类构造器传参",{"2":{"580":1}}],["可以继承父类函数体内的属性和方法",{"2":{"578":1}}],["可以继承父类的属性和原型方法",{"2":{"577":1}}],["可以继续根据模块或者第三方库进行划分",{"2":{"130":1}}],["可以添加自定义属性和方法",{"2":{"581":1}}],["可以添加属性和方法",{"2":{"577":1}}],["可以添加多个规则针对不同的请求做不同的响应",{"2":{"436":1}}],["可以认为是个普通的对象",{"2":{"573":1}}],["可以直接在编辑器中调试",{"2":{"966":1}}],["可以直接在编辑器中进行代码版本管理",{"2":{"785":1}}],["可以直接对象属性赋值的方式改变原型",{"2":{"572":1}}],["可以直接点击左上角的鲨鱼按钮开始抓取",{"2":{"453":1}}],["可以并行处理多个任务",{"2":{"526":1}}],["可以返回promise",{"2":{"510":1}}],["可以构造一个可读流",{"2":{"509":1}}],["可以跳过看下一篇",{"2":{"477":1}}],["可以使用本机dns映射域名",{"2":{"1175":1}}],["可以使用此镜像",{"2":{"1171":1}}],["可以使用管道",{"2":{"1058":1}}],["可以使用docker",{"2":{"1055":1}}],["可以使用environment字段来设置容器中的环境变量",{"2":{"1024":1}}],["可以使用expires和cache",{"2":{"720":1}}],["可以使用命令行登录",{"2":{"1014":1}}],["可以使用以下命令",{"2":{"1010":2}}],["可以使用停止命令停止正在运行的容器",{"2":{"1008":1}}],["可以使用mock函数来判断函数内部的值是否达到预期",{"2":{"869":1}}],["可以使用官方或者第三方直接配置好的规则",{"2":{"846":1}}],["可以使用统一的构建和部署流程来管理整个代码库",{"2":{"811":1}}],["可以使用其他线程",{"2":{"773":1}}],["可以使用多域名请求提高并发度",{"2":{"727":1}}],["可以使用通配符和正则表达式进行匹配",{"2":{"722":1}}],["可以使用",{"2":{"715":1,"722":1,"1006":1,"1025":1,"1028":1,"1031":1,"1066":1,"1087":1,"1186":1}}],["可以使用nginx",{"2":{"709":1}}],["可以使用一个nginx服务器处理多个域名的请求",{"2":{"706":1}}],["可以使用usestaticassets处理静态资源",{"2":{"694":1}}],["可以使用任何类型进行读取",{"2":{"486":1}}],["可以使用显示过滤",{"2":{"453":1}}],["可以使用抓包工具查看",{"2":{"379":1}}],["可以点击对应的文件查看更详细的报告",{"2":{"874":1}}],["可以点击菜单栏的放大镜按钮",{"2":{"453":1}}],["可以点击选择指定范围",{"2":{"435":1}}],["可以列出不同的选项",{"2":{"453":1}}],["可以结合多个过滤选项使用and",{"2":{"453":1}}],["可以先阅读👉🏻docker章节",{"2":{"1036":1}}],["可以先阅读我的nexus3",{"2":{"1040":1}}],["可以先阅读我的",{"2":{"958":1}}],["可以先抓取少量的包",{"2":{"451":1}}],["可以先创建一个简单的项目",{"2":{"173":1}}],["可以按照不同的格式去查看内容",{"2":{"436":1}}],["可以按自己的需要下载",{"2":{"423":1}}],["可以从证书颁发机构",{"2":{"726":1}}],["可以从不同维度去查看统计信息",{"2":{"451":1}}],["可以从多个维度去配置规则去抓包",{"2":{"436":1}}],["可以从防火墙",{"2":{"381":1}}],["可以大大提高传输效率",{"2":{"776":1}}],["可以大大减小bundle体积",{"2":{"129":1}}],["可以大概看出每个记录的简单信息如",{"2":{"432":1}}],["可以管理代理",{"2":{"430":1}}],["可以往上翻阅",{"2":{"420":1}}],["可以自行选择",{"2":{"1208":1}}],["可以自行修改",{"2":{"878":1}}],["可以自行定义",{"2":{"818":1}}],["可以自行百度下载破解版",{"2":{"70":1}}],["可以自动根据提交信息生成版本日志",{"2":{"794":1}}],["可以自己动手尝试",{"2":{"437":1}}],["可以自定义",{"2":{"709":1}}],["可以自定义请求",{"2":{"436":1}}],["可以自定义规则过滤对应的抓包记录",{"2":{"430":1}}],["可以自定义匹配地址来阻塞",{"2":{"414":1}}],["可以修改如7777",{"2":{"414":1}}],["可以修改age使之和id不一样进一步验证",{"2":{"81":1}}],["可以导入导出记录",{"2":{"414":2}}],["可以以域名归类记录也可以按请求顺序展示记录",{"2":{"413":1}}],["可以尝试用用感觉一下",{"2":{"411":1}}],["可以选择node",{"2":{"857":1}}],["可以选择指定的网络接口",{"2":{"452":1}}],["可以选择对应的host",{"2":{"436":1}}],["可以选择本地或互联网抓包",{"2":{"436":1}}],["可以选择",{"2":{"400":1}}],["可以选择上机的时间",{"2":{"53":1}}],["可以收发数据",{"2":{"378":1}}],["可以算出ip数据包的最大值为2^16",{"2":{"367":1}}],["可以支持更多的设备连接到互联网",{"2":{"366":1}}],["可以支持服务器主动向客户端推送数据",{"2":{"354":1}}],["可以为地球上的每一粒沙子分配一个ip",{"2":{"366":1}}],["可以组成的ip数为2^128大约是3",{"2":{"366":1}}],["可以设置always和never",{"2":{"1137":1}}],["可以设置多个环境变量",{"2":{"1024":1}}],["可以设置一个或多个",{"2":{"828":1}}],["可以设置不同的访问控制策略",{"2":{"364":1}}],["可以设置具体域名",{"2":{"347":1}}],["可以连接2^8台主机",{"2":{"359":1}}],["可以连接2^16台主机",{"2":{"359":1}}],["可以连接2^24台主机",{"2":{"359":1}}],["可以升级到websocket",{"2":{"354":1}}],["可以查看指定镜像",{"2":{"994":1}}],["可以查看官方文档",{"2":{"434":1}}],["可以查看官网上推荐的",{"2":{"181":1}}],["可以查看当前主机的ip",{"2":{"431":1}}],["可以查看mdn文档",{"2":{"350":1}}],["可以查看我的",{"2":{"345":1}}],["可以一次性读取整个消息体",{"2":{"342":1}}],["可以开始安全通信",{"2":{"333":1}}],["可以阅读我的",{"2":{"335":1}}],["可以阅读我的另一篇文章",{"2":{"132":1}}],["可以阅读详解",{"2":{"326":1}}],["可以拓宽自己视野发展",{"2":{"313":1}}],["可以说dockerfile是加强版的命令构建版本",{"2":{"1051":1}}],["可以说计算机网络是每个工程师的基础",{"2":{"313":1}}],["可以说是tcp",{"2":{"310":1}}],["可以对不同的环境进行管理",{"2":{"1017":1}}],["可以对容器内部的文件系统进行修改",{"2":{"1003":1}}],["可以对代码进行静态分析",{"2":{"829":1}}],["可以对外隐藏真实的路径",{"2":{"712":1}}],["可以对传输的数据进行加密",{"2":{"706":1}}],["可以对内部功能进行封装",{"2":{"595":1}}],["可以对arp请求和响应进行监控和过滤",{"2":{"304":1}}],["可以对浏览器进行滚动监听",{"2":{"133":1}}],["可以有效提高网页的加载速度和响应速度",{"2":{"762":1}}],["可以有效地防止arp欺骗和arp泛洪攻击",{"2":{"304":1}}],["可以有效的提高开发效率",{"2":{"224":1}}],["可以采取以下几种措施",{"2":{"304":1}}],["可以采用以下两种方式进行安装",{"2":{"1208":1}}],["可以采用图片懒加载",{"2":{"133":1}}],["可以采用cdn网络资源",{"2":{"129":1}}],["可以采用",{"2":{"127":1}}],["可以试试",{"2":{"248":1}}],["可以默认一张图片",{"2":{"245":1}}],["可以将相同的配置单独写出",{"2":{"1142":1}}],["可以将容器内的数据持久化到宿主机上",{"2":{"1117":1}}],["可以将容器镜像看作是mini版的虚拟机",{"2":{"1078":1}}],["可以将不经常更改的指令放在前面",{"2":{"1075":1}}],["可以将不同节点的nginx首页设置成不同的",{"2":{"728":1}}],["可以将应用程序的部署过程进行标准化",{"2":{"1017":1}}],["可以将多个容器的部署",{"2":{"1017":1}}],["可以将其放入公共模块",{"2":{"673":1}}],["可以将其放入公共模块共享",{"2":{"669":1}}],["可以将用户相关的功能单独划分一个模块",{"2":{"666":1}}],["可以将通用的工具放入通用模块里",{"2":{"665":1}}],["可以将配置放到一个配置文件合理处理后导出",{"2":{"630":1}}],["可以将本地的请求反向代理到其他请求",{"2":{"414":1}}],["可以将charles的分为以下几个模块",{"2":{"413":1}}],["可以将数据包发送给同一子网内的所有设备",{"2":{"365":1}}],["可以将数据包发送给一个或多个组中的设备",{"2":{"365":1}}],["可以将功能拆分为多个小功能",{"2":{"242":1}}],["可以将存储在字符串中的",{"2":{"115":1}}],["可以看做继承",{"2":{"570":1}}],["可以看看alloyteam这篇文章",{"2":{"325":1}}],["可以看看官方文档",{"2":{"241":1}}],["可以看到运行成功",{"2":{"1103":1}}],["可以看到安装成功",{"2":{"1103":1}}],["可以看到",{"2":{"1096":1}}],["可以看到我们的界面已经有了刚刚新建的测试用例文件了",{"2":{"879":1}}],["可以看到测试界面主要包含两大板块",{"2":{"877":1}}],["可以看到当前主节点的ens256网卡上会绑定一个vip",{"2":{"728":1}}],["可以看到已经抓取到了",{"2":{"453":1}}],["可以看到fiddler监听的端口为8088",{"2":{"438":1}}],["可以看到刚刚添加的两个字段已经带上了",{"2":{"419":1}}],["可以看到下面有多个系统版本可供下载",{"2":{"412":1}}],["可以看到为vue原型挂载了",{"2":{"239":1}}],["可以看到有很多",{"2":{"238":1,"877":1}}],["可以看出每个属性改变时都会正确的派发更新",{"2":{"959":1}}],["可以看出内部的config其实就是rollup的配置",{"2":{"237":1}}],["可以看出首次加载还是很快的",{"2":{"130":1}}],["可以看出左右盒子都按比例调整了自身的宽度",{"2":{"111":1}}],["可以看出",{"2":{"90":1,"131":1}}],["可以看出id为1的数据被删除了",{"2":{"79":1}}],["可以猜出就是rollup相关的配置",{"2":{"237":1}}],["可以根据评论里的yaml格式书写",{"2":{"1230":1}}],["可以根据应用程序的特点和需求选择适合的健康检查方式",{"2":{"1066":1}}],["可以根据需要对容器进行个性化配置",{"2":{"1050":1}}],["可以根据需要分配ip地址",{"2":{"364":1}}],["可以根据自己需求进行配置",{"2":{"830":1}}],["可以根据自己需要",{"2":{"217":1}}],["可以根据项目需求和个人偏好进行定制",{"2":{"785":1}}],["可以根据这些类型自定义prividers",{"2":{"606":1}}],["可以根据这个报告进行页面优化",{"2":{"213":1}}],["可以根据域名来归纳记录也可以使用请求顺序的方式展示记录",{"2":{"416":1}}],["可以根据不同的域名",{"2":{"414":1}}],["可以根据不同的应用需求提供不同的网络服务质量",{"2":{"366":1}}],["可以根据正则",{"2":{"414":1}}],["可以用命令行传入",{"2":{"1189":1}}],["可以用root账户重置其它账户的密码",{"2":{"1174":1}}],["可以用在http",{"2":{"717":1}}],["可以用o",{"2":{"573":1}}],["可以用vscode将两者异步完成",{"2":{"401":1}}],["可以用来分析一些基础的网络层面的基础",{"2":{"449":1}}],["可以用来查看系统的网络连接",{"2":{"383":1}}],["可以用来检查计算机的网络接口是否正常工作",{"2":{"361":1}}],["可以用于实现各种实时应用",{"2":{"354":1}}],["可以用于监控和检查网站性能的工具",{"2":{"217":1}}],["可以用class进行构造",{"2":{"244":1}}],["可以用一些需要",{"2":{"145":1,"894":1}}],["可以恢复到对象之前的某个状态",{"2":{"209":1,"759":1}}],["可以想象一个场景",{"2":{"201":1,"751":1}}],["可以通过以下的方式绕过",{"2":{"1202":1}}],["可以通过以下方式获取",{"2":{"1084":1}}],["可以通过以下方式进行查看和设置",{"2":{"381":1}}],["可以通过以下方式进行防御",{"2":{"350":1}}],["可以通过以下方式设置syncookies",{"2":{"381":1}}],["可以通过以下方式查看",{"2":{"368":1,"380":1}}],["可以通过交互式和非交互式注册",{"2":{"1154":1}}],["可以通过容器名进行访问",{"2":{"1087":1}}],["可以通过docker",{"2":{"1080":1}}],["可以通过一些参数来自定义启动过程",{"2":{"1029":1}}],["可以通过一些参数来自定义构建过程",{"2":{"1028":1}}],["可以通过base64反解码出来",{"2":{"1014":1}}],["可以通过打新的标签",{"2":{"1000":1}}],["可以通过cat",{"2":{"1195":1}}],["可以通过cypress",{"2":{"878":1}}],["可以通过cookie的具体参数精确设置使用范围",{"2":{"347":1}}],["可以通过配置文件",{"2":{"873":1}}],["可以通过我的",{"2":{"768":1}}],["可以通过路径前缀",{"2":{"610":1}}],["可以通过属性",{"2":{"570":1}}],["可以通过属性获取",{"2":{"499":1}}],["可以通过fiddler右上角计算机图标提示",{"2":{"438":1}}],["可以通过设备上的某个网卡查看mtu大小",{"2":{"386":1}}],["可以通过修改tcp的延迟发送值来禁用此功能",{"2":{"382":1}}],["可以通过调整tcp等传输协议的窗口大小来优化网络传输性能",{"2":{"369":1}}],["可以通过ipv4地址转换技术实现ipv4和ipv6之间的互通",{"2":{"366":1}}],["可以通过划分子网来扩展网络",{"2":{"364":1}}],["可以通过",{"2":{"217":1}}],["可以通过虚拟代理的方式延迟这种需要他的时候才去创建",{"2":{"198":1,"748":1}}],["可以通过提供一个参数",{"2":{"83":1}}],["可以动态增改",{"2":{"197":1,"747":1}}],["可以告诉webpack不解析哪些模块",{"2":{"189":1}}],["可以理解为or",{"2":{"143":1,"892":1}}],["可以理解为当前对象就是来为赋值操作服务的",{"2":{"38":1,"544":1}}],["可以是start",{"2":{"1121":1}}],["可以是任何文件系统路径",{"2":{"1069":1}}],["可以是1到65535之间的任意整数",{"2":{"1062":1}}],["可以是以下几种之一",{"2":{"1025":1}}],["可以是单个服务或多个服务",{"2":{"1023":1}}],["可以是可注入的类或者直接类的实例",{"2":{"606":1}}],["可以是",{"2":{"141":1,"890":1,"1121":3,"1122":1}}],["可以在注册后修改",{"2":{"1158":1}}],["可以在指定类型失败情况下重试",{"2":{"1132":1}}],["可以在多个容器之间共享数据卷",{"2":{"1111":1}}],["可以在多个容器之间共享和重用",{"2":{"1111":1}}],["可以在容器之间共享和重用",{"2":{"1110":1}}],["可以在容器运行时使用这些环境变量",{"2":{"1055":1}}],["可以在运行容器时通过",{"2":{"1064":1}}],["可以在运行容器时使用",{"2":{"1055":1}}],["可以在env指令中指定多个键值对",{"2":{"1055":1}}],["可以在extends中写入plugin的推荐配置",{"2":{"831":1}}],["可以在stop命令后面指定要停止的服务名",{"2":{"1030":1}}],["可以在内部部署",{"2":{"1013":1}}],["可以在访问属性时对正在执行的方法进行收集",{"2":{"950":1}}],["可以在测试文件中使用",{"2":{"881":1}}],["可以在全局配置",{"2":{"878":1}}],["可以在配置文件中添加ignorepatterns字段配置",{"2":{"827":1}}],["可以在项目中直接使用commitlint并定义相关规则",{"2":{"806":1}}],["可以在git的commit前和commit时添加自定义校验",{"2":{"803":1}}],["可以在单个tcp连接上同时发送多个请求和响应",{"2":{"727":1}}],["可以在具体的路由方法中轻松使用请求方式",{"2":{"612":1}}],["可以在文件右下角点击添加配置会有对应的提示",{"2":{"400":1}}],["可以在文章里留下自己的评论",{"2":{"271":1}}],["可以在控制台输入命令",{"2":{"399":1}}],["可以在主机上通过netstat命令查看tcp的连接状态",{"2":{"383":1}}],["可以在",{"2":{"320":1,"785":1,"1062":1}}],["可以在这里查看更多的mime类型",{"2":{"319":1}}],["可以在这里进行代码分割的逻辑",{"2":{"130":1}}],["可以在源码中找到entry",{"2":{"238":1}}],["可以在源码项目中build",{"2":{"237":1}}],["可以在网站输入被测网站的",{"2":{"220":1}}],["可以在webpack进行打包时",{"2":{"132":1}}],["可以很好的提高构建效率",{"2":{"1051":1}}],["可以很好地应对大流量的访问",{"2":{"705":1}}],["可以很明显本地的",{"2":{"382":1}}],["可以很明显看出entry",{"2":{"129":1}}],["可以很简洁的无痛修改一些功能和做一些有趣的功能",{"2":{"225":1}}],["可以很清楚当前是",{"2":{"131":1}}],["可以发现",{"2":{"84":1}}],["可以让多个阶段同时运行",{"2":{"1141":1}}],["可以让用户在单个主机上运行多个容器",{"2":{"1016":1}}],["可以让div显示的和table一样",{"2":{"19":1}}],["可以让我们把普通元素",{"2":{"19":1}}],["可以实现类似这样的代码",{"2":{"9":1}}],["可以传入多个参数作为调用函数的参数",{"2":{"7":1}}],["将一部分不常用的内存页交换到硬盘上",{"2":{"1203":1}}],["将参数修改为selinux=disabled",{"2":{"1202":1}}],["将值设置为发包的token",{"2":{"1190":1}}],["将gitlab的域名正式复制到",{"2":{"1152":1}}],["将你需要认证的权限移入右侧",{"2":{"1101":1}}],["将刚刚创建的角色移入右侧",{"2":{"1100":1}}],["将自动执行",{"2":{"1065":1}}],["将自动复制当前",{"2":{"1065":1}}],["将自己的mac地址封装仅需其他的保持不变",{"2":{"454":1}}],["将自己的mac地址发送给主机a",{"2":{"303":1}}],["将自己的ip地址和mac地址和对方的ip和mac占位地址封装",{"2":{"454":1}}],["将主机的",{"2":{"1062":1}}],["将容器推送到项目的",{"2":{"1121":2}}],["将容器外部的html文件复制到",{"2":{"1061":1}}],["将容器的数据和应用程序分离开来",{"2":{"1061":1}}],["将容器的配置信息与容器的代码分离",{"2":{"1054":1}}],["将容器的",{"2":{"1018":1}}],["将npm",{"2":{"1106":1}}],["将nginx端口映射到宿主机",{"2":{"1034":1}}],["将nvm中node和npm的源设置到国内源",{"2":{"97":1}}],["将镜像导出为",{"2":{"1001":1}}],["将应用程序和其依赖项打包到一个可移植的容器中",{"2":{"992":1}}],["将对象的dep添加进去",{"2":{"954":1}}],["将对象转成",{"2":{"32":1}}],["将oncleanup作为参数传入",{"2":{"945":1}}],["将多个项目或组件放置在同一个代码仓库中的开发模式",{"2":{"808":1}}],["将chunk写入",{"2":{"769":1}}],["将本地域名写入host",{"2":{"726":1,"1178":1}}],["将经过多个代理服务器的ip以",{"2":{"723":1}}],["将客户端的请求转发到其他服务器",{"2":{"706":1}}],["将传过来的类型转换为定义的类型",{"2":{"643":2,"646":1}}],["将parent原型上的方法和属性移植到child的原型上",{"2":{"582":1}}],["将parent的实例作为child的prototype",{"2":{"577":1}}],["将属性和方法复制到实例上",{"2":{"570":1}}],["将活动区还在的老对象",{"2":{"559":1}}],["将活动对象往内存一边移动",{"2":{"558":1}}],["将所有的切片请求append到rcl控制器中",{"2":{"771":1}}],["将所有的chunk进行从小到大排序",{"2":{"770":1}}],["将所有的微任务在这个阶段执行完",{"2":{"532":1}}],["将所有需要懒加载的图片推到加载队列中managerqueue用来管理所有图片的状态",{"2":{"242":1}}],["将栈顶的帧弹出",{"2":{"529":1}}],["将读取的数据储存",{"2":{"514":1}}],["将当前目录下的内容复制到容器中的",{"2":{"1056":1}}],["将当前的",{"2":{"959":1}}],["将当前",{"2":{"512":1}}],["将流链接在一起",{"2":{"508":1}}],["将文件内容读取为原始二进制数据",{"2":{"506":1}}],["将文件内容读取为文本字符串",{"2":{"506":1}}],["将文件内容读取为base64字符串",{"2":{"506":1}}],["将文件内容读取为arraybuffer形式的数据",{"2":{"506":1}}],["将buffersource转为blob",{"2":{"494":1}}],["将arraybuffer转换成字符",{"2":{"491":1}}],["将字符转为blob",{"2":{"494":1}}],["将字符转换成uint8array",{"2":{"491":1}}],["将字符串str从第x位置开始",{"2":{"83":1}}],["将二进制转为字符",{"2":{"491":1}}],["将每个参数放在每个位置即可",{"2":{"1058":1}}],["将每个切片标识在整个文件中的位置",{"2":{"769":1}}],["将每个ip地址与mac地址手动映射起来",{"2":{"304":1}}],["将每",{"2":{"485":3}}],["将",{"2":{"485":1,"829":1,"954":1}}],["将下图中的选项全部勾选",{"2":{"439":1}}],["将以下代码粘贴进去",{"2":{"438":1}}],["将以正则匹配的内容进行分割",{"2":{"154":1,"903":1}}],["将request改为launch",{"2":{"401":1}}],["将在syn队列中排队等待确认",{"2":{"380":1}}],["将数据按照字节流方式分段传输",{"2":{"375":1}}],["将数据包从源网络传输到目标网络",{"2":{"371":1}}],["将恶意代码存储到了数据库中",{"2":{"350":1}}],["将消息体分成多个大小相等的块",{"2":{"343":1}}],["将重要的数据优先传输",{"2":{"324":1}}],["将虚假的mac地址与ip地址映射起来",{"2":{"304":1}}],["将目标主机的mac地址发送给源主机",{"2":{"302":1}}],["将原接口转换为客户希望的另一个接口",{"2":{"206":1,"756":1}}],["将这些对象连成一条链",{"2":{"205":1,"755":1}}],["将公共的webpack配置抽离出来使用",{"2":{"190":1}}],["将编译后的",{"2":{"179":1}}],["将不同的功能模块化",{"2":{"242":1}}],["将不同渠道的样式文件进行",{"2":{"179":1}}],["将不会启动",{"2":{"1217":1}}],["将不会影响到已有的对象",{"2":{"573":1}}],["将不会影响另一个数组",{"2":{"30":1}}],["将不会满足0~255的范围限制",{"2":{"489":1}}],["将不会改变",{"2":{"231":1}}],["将不能匹配任何字符串",{"2":{"139":1,"888":1}}],["将部分",{"2":{"115":1}}],["将dom树转换为xml或html源",{"2":{"115":1}}],["将表达式expr重复运行count次",{"2":{"83":1}}],["将会通过多种工具进行搭建",{"2":{"1194":1}}],["将会先执行全局的",{"2":{"1124":1}}],["将会变为none",{"2":{"1087":1}}],["将会变成我们自定义的错误格式",{"2":{"640":1}}],["将会自动解压",{"2":{"1069":1}}],["将会覆盖默认的cmd参数",{"2":{"1064":1}}],["将会游刃有余",{"2":{"948":1}}],["将会飘到另一节点上",{"2":{"728":1}}],["将会增加耗时",{"2":{"718":1}}],["将会被浏览器拦截",{"2":{"691":1}}],["将会报异常",{"2":{"646":1}}],["将会拥有parent实例属性和方法",{"2":{"577":1}}],["将会忽略显式返回值并返回内部生成的新对象",{"2":{"576":1}}],["将会大大减小代码量",{"2":{"575":1}}],["将会作为对象的原型",{"2":{"573":1}}],["将会把对象都放到老生代",{"2":{"559":1}}],["将会接受此包并将自己的mac地址封装进去",{"2":{"454":1}}],["将会返回相应的头部字段",{"2":{"354":1}}],["将会返回第三个参数",{"2":{"83":1}}],["将会返回第二个参数",{"2":{"83":1}}],["将会和babel",{"2":{"268":1}}],["将会加载错误",{"2":{"245":1}}],["将会以",{"2":{"154":1,"903":1}}],["将会匹配",{"2":{"139":1,"888":1}}],["将会影响你对隐式转换的理解",{"2":{"37":1,"543":1}}],["将返回第二个参数",{"2":{"83":1}}],["将得到负值",{"2":{"83":1}}],["将soucemap放到指定位置",{"2":{"408":1}}],["将state",{"2":{"236":1}}],["将string类型转换为number类型后进行比较",{"2":{"47":1,"553":1}}],["将s1",{"2":{"83":2}}],["将其传入imagemanager",{"2":{"248":1}}],["将其添加到managerqueue中",{"2":{"245":1}}],["将其从managerqueue队列中剔除",{"2":{"242":1}}],["将其拆箱转换为基本类型后",{"2":{"44":1,"550":1}}],["将其转换为number类型",{"2":{"44":1,"550":1}}],["将其this关键字设置为提供的值",{"2":{"5":1}}],["将上面的例子小作修改",{"2":{"30":1}}],["ubuntu",{"2":{"1056":1,"1060":1,"1065":1}}],["uwsgi",{"2":{"708":2,"718":4}}],["u2为什么可以访问到自身不存在的属性name",{"2":{"571":1}}],["u2可以访问到自身不存在的属性关键所在",{"2":{"571":1}}],["u2",{"2":{"571":10,"573":4,"574":1}}],["u205f",{"2":{"139":2,"888":2}}],["u202f",{"2":{"139":2,"888":2}}],["u2029",{"2":{"139":2,"888":2}}],["u2028",{"2":{"139":2,"888":2}}],["u200a",{"2":{"139":2,"888":2}}],["u2000",{"2":{"139":2,"888":2}}],["u+feff",{"2":{"462":1}}],["u+200f",{"2":{"462":1}}],["u+200e",{"2":{"462":1}}],["u+200d",{"2":{"462":1}}],["u+200c",{"2":{"462":1}}],["u+200b",{"2":{"462":1}}],["u+000a",{"2":{"139":1,"888":1}}],["ultimate",{"2":{"355":1}}],["ul",{"2":{"354":1,"404":1}}],["ul>",{"2":{"354":2,"404":1}}],["uuid查看",{"2":{"1195":1}}],["uuid等不能重复",{"2":{"1195":1}}],["uuid",{"2":{"316":1,"1195":1}}],["urgent",{"2":{"376":1}}],["urg",{"2":{"376":2}}],["urn的例子包括",{"2":{"316":1}}],["urn不包括访问该资源的方式",{"2":{"316":1}}],["urn是另一种uri类型",{"2":{"316":1}}],["urn",{"0":{"316":1},"2":{"316":2}}],["uri已经被废弃了",{"2":{"350":1}}],["uri包括两种类型",{"2":{"316":1}}],["uri是一个通用的术语",{"2":{"316":1}}],["uri",{"0":{"316":1},"2":{"350":3,"453":1,"654":1,"709":2,"712":1,"721":1,"726":2,"729":7}}],["url仅针对该范围更新",{"2":{"1186":1}}],["url等等",{"2":{"432":1}}],["url断点",{"2":{"404":1}}],["url上的name参数表示用户的名字",{"2":{"354":1}}],["urlsearchparams",{"2":{"354":1}}],["urlencoded",{"2":{"337":1,"354":1}}],["url既能用来表示静态资源",{"2":{"316":1}}],["url是使用最广泛的uri类型",{"2":{"316":1}}],["url是uri的一个子集",{"2":{"316":1}}],["url包含以下信息",{"2":{"316":1}}],["url和urn",{"2":{"316":1}}],["url变成常量",{"2":{"229":1}}],["url",{"0":{"181":1,"316":1},"2":{"181":3,"190":1,"213":2,"220":1,"222":2,"225":2,"229":4,"245":3,"247":2,"320":2,"344":1,"350":2,"354":2,"404":1,"405":1,"406":1,"455":2,"456":1,"485":2,"497":4,"498":1,"520":3,"521":6,"617":1,"634":2,"654":1,"702":1,"723":1,"771":1,"772":1,"847":1,"966":1,"1014":2,"1034":1,"1069":1,"1074":2,"1103":2,"1121":23,"1122":4,"1157":3,"1158":1,"1159":1,"1176":1}}],["udptimeout",{"2":{"1212":1}}],["udp代理服务器",{"2":{"704":1}}],["udp多播",{"2":{"451":1}}],["udp协议",{"2":{"449":1}}],["udp协议则提供了无连接服务",{"2":{"310":1}}],["udp",{"2":{"312":1,"367":1,"459":1,"1062":2,"1218":1}}],["u7981",{"2":{"251":2}}],["u7a7a",{"2":{"251":2}}],["u7533",{"2":{"251":2}}],["u7121",{"2":{"251":2}}],["u6e80",{"2":{"251":1}}],["u6709",{"2":{"251":2}}],["u6708",{"2":{"251":2}}],["u6307",{"2":{"251":2}}],["u55b6",{"2":{"251":2}}],["u5408",{"2":{"251":2}}],["u5272",{"2":{"251":2}}],["uk",{"2":{"251":1}}],["umbrella",{"2":{"251":2}}],["utc",{"2":{"1063":1,"1121":2}}],["ut=123456",{"2":{"347":1,"453":1}}],["ut",{"2":{"347":2,"354":1}}],["util",{"2":{"238":2}}],["utils",{"2":{"238":1,"634":1,"665":1,"707":1,"801":1,"859":1,"860":1,"863":2,"865":1,"866":1,"867":1,"869":1,"870":1,"874":1,"875":4,"1082":1,"1093":1}}],["utf8",{"2":{"354":1,"491":2,"539":1,"724":1}}],["utf",{"2":{"62":1,"110":2,"111":1,"112":1,"222":1,"462":1,"671":1,"836":1,"1202":3}}],["uaer",{"2":{"729":1}}],["ua",{"2":{"222":1,"347":2}}],["uint16为2字节16位",{"2":{"484":1}}],["uint16array则是以2字节16位为一个基本单位",{"2":{"481":1}}],["uint16array",{"2":{"481":1,"485":1}}],["uint8",{"2":{"491":8,"514":2}}],["uint8为1字节8位",{"2":{"484":1}}],["uint8clampedarray",{"2":{"481":1}}],["uint8array等拥有数组array的所有方法",{"2":{"485":1}}],["uint8array中是以1字节8位为一个基本单位",{"2":{"481":1}}],["uint8array",{"0":{"482":1},"1":{"483":1,"484":1,"485":1},"2":{"481":1,"482":1,"483":7,"485":3,"491":2,"494":1,"514":2,"516":1}}],["uint32array",{"2":{"481":1,"485":1}}],["uid++",{"2":{"239":1,"244":1}}],["uid",{"2":{"239":3,"244":3,"245":2,"944":1,"1209":3}}],["ui",{"2":{"222":2,"438":1,"797":1,"854":1,"857":2}}],["uglifyjs",{"2":{"190":1}}],["uglifyjswebpackplugin",{"2":{"187":1,"190":2}}],["ufeff",{"2":{"139":2,"888":2}}],["u3000",{"2":{"139":2,"888":2}}],["u1",{"2":{"571":10,"573":10,"574":1}}],["u1和u2",{"2":{"571":1}}],["u180e",{"2":{"139":4,"888":4}}],["u1680",{"2":{"139":2,"888":2}}],["u00a0",{"2":{"139":2,"888":2}}],["u",{"2":{"138":2,"141":1,"157":1,"158":1,"164":1,"887":2,"890":1,"1014":2,"1214":2}}],["ucase",{"2":{"83":1}}],["up命令会在前台模式下启动服务",{"2":{"1029":1}}],["up>",{"2":{"728":3,"1085":1,"1090":2}}],["upstream",{"2":{"725":1,"1183":1}}],["updating",{"2":{"721":1}}],["updated",{"2":{"1179":1}}],["update用来将新的vnode渲染成dom",{"2":{"954":1}}],["updatecomponent",{"2":{"954":8}}],["update",{"0":{"78":1},"2":{"78":4,"721":4,"932":1,"938":1,"942":1,"951":3,"954":3,"1056":1,"1065":1,"1198":1}}],["upgrade",{"2":{"319":1,"354":5,"723":3}}],["upward",{"2":{"268":1}}],["upwards",{"2":{"251":1}}],["upperdir",{"2":{"1209":1}}],["upper",{"2":{"251":2}}],["up",{"0":{"1029":1},"2":{"157":3,"158":2,"166":1,"251":9,"454":1,"728":6,"800":1,"801":1,"1006":1,"1029":1,"1034":1,"1085":2,"1090":7,"1173":1,"1179":3}}],["uploadedlist",{"2":{"772":4}}],["uploadedfile",{"2":{"701":1,"765":1,"769":1}}],["uploadedfile装饰器对文件参数的注入",{"2":{"701":1}}],["uploadbiggerfile",{"2":{"769":1}}],["uploadnormalfile",{"2":{"765":1}}],["uploadfile",{"2":{"701":1}}],["upload",{"2":{"701":1,"765":2,"769":2,"770":2,"771":1,"772":5,"773":2}}],["uploaddir",{"2":{"62":2}}],["uploadmusic",{"2":{"54":1}}],["uploadimg",{"2":{"54":1}}],["usages",{"2":{"1212":1}}],["ustc",{"2":{"1039":1,"1045":1,"1083":1}}],["using",{"2":{"814":1,"1098":1,"1214":1}}],["usworn",{"2":{"711":1}}],["usword",{"2":{"132":1,"222":1,"350":1,"422":1,"438":2,"439":1,"611":2,"617":1,"618":1,"715":4,"716":2}}],["us",{"2":{"119":1,"190":1,"251":1,"462":1,"1202":2}}],["usr",{"2":{"69":1,"325":1,"707":1,"708":2,"709":2,"710":2,"711":1,"712":1,"718":4,"728":6,"805":1,"806":1,"1007":1,"1034":2,"1054":4,"1055":8,"1064":1,"1073":1,"1082":2,"1204":1,"1208":8}}],["usetimer",{"2":{"870":3}}],["usestaticassets",{"2":{"695":2}}],["useguards在方法上进行了绑定",{"2":{"649":1}}],["useguards",{"2":{"648":2}}],["useglobalpipes",{"2":{"643":1}}],["useglobalfilters",{"2":{"640":1}}],["usepipes装饰器进行包装",{"2":{"643":1}}],["usepipes",{"2":{"643":4}}],["usefaketimers",{"2":{"870":1}}],["usefactory",{"2":{"606":6,"632":1}}],["usefilters装饰器绑定",{"2":{"640":2}}],["usefilters",{"2":{"640":4}}],["useinterceptors",{"2":{"613":2,"701":1,"765":1,"769":1}}],["usevalue",{"2":{"606":5,"609":2,"624":1,"643":1,"646":1}}],["useclass",{"2":{"606":4,"640":1,"652":1}}],["usedownload",{"2":{"521":2}}],["used",{"2":{"222":2,"237":1,"857":5,"1203":1}}],["usedexports",{"2":{"187":1,"190":1}}],["use",{"2":{"64":1,"73":2,"95":1,"96":1,"127":1,"132":2,"179":1,"180":1,"181":1,"190":4,"245":1,"343":1,"344":1,"350":2,"354":4,"382":1,"404":1,"455":1,"634":1,"692":1,"695":1,"696":1,"697":1,"721":1,"723":1,"800":1,"801":1,"814":1,"857":3,"880":1,"1034":1,"1074":1,"1103":3,"1107":5,"1184":2,"1191":2}}],["user=user",{"2":{"1024":1}}],["user=nginx",{"2":{"708":1,"718":2}}],["user和mysql",{"2":{"1024":1}}],["userdef",{"2":{"932":11}}],["userdomain",{"2":{"726":1,"1178":1}}],["useradd",{"2":{"728":1}}],["userid",{"2":{"648":2}}],["userinfo",{"2":{"64":8}}],["usercontroller",{"2":{"615":1,"616":1,"617":1,"666":1,"671":1,"675":1}}],["usermodule",{"2":{"607":2}}],["user>",{"2":{"350":2,"1059":2,"1060":2}}],["userpage",{"2":{"229":1,"230":1,"231":1}}],["useronclose",{"2":{"201":2,"751":2}}],["userororders",{"2":{"64":2}}],["users时会以我们定义的格式返回",{"2":{"652":1}}],["userservice",{"2":{"229":2,"230":2,"231":1,"666":2,"667":1}}],["users",{"2":{"83":1,"643":2,"652":1}}],["userlogininfo",{"2":{"83":1}}],["user",{"2":{"54":2,"61":2,"64":10,"75":1,"76":1,"77":3,"78":3,"79":2,"80":3,"81":2,"83":3,"229":1,"319":1,"456":1,"532":1,"571":8,"573":12,"575":4,"576":8,"606":1,"607":2,"615":1,"616":1,"617":1,"635":1,"648":1,"666":1,"671":3,"675":1,"707":1,"709":3,"713":2,"729":1,"839":1,"866":6,"867":3,"878":1,"931":1,"938":8,"941":1,"950":5,"951":18,"955":5,"958":2,"959":8,"960":8,"963":3,"1024":4,"1121":8,"1174":6,"1192":3,"1208":1,"1214":2}}],["username",{"2":{"28":3,"29":2,"30":3,"32":4,"57":3,"64":2,"197":3,"230":4,"232":2,"747":3,"1014":1,"1045":1}}],["unprivileged",{"2":{"1209":2}}],["unpacked",{"2":{"1103":1,"1189":1,"1209":1}}],["untrusted",{"2":{"1209":2}}],["untagged",{"2":{"1158":1}}],["untagged=",{"2":{"1157":3}}],["until",{"2":{"1007":1}}],["unmet",{"2":{"1132":1}}],["unencrypted",{"2":{"1045":1}}],["unwrapnestedrefs",{"2":{"964":1}}],["unwatchfn",{"2":{"938":1,"940":1}}],["unwatch",{"2":{"938":1,"944":2,"945":2}}],["uncovered",{"2":{"860":1,"864":1,"874":2,"875":1}}],["uncaught",{"2":{"40":2,"546":2}}],["unhandled",{"2":{"382":1}}],["unknown",{"0":{"909":1},"2":{"343":1,"771":1,"964":3,"1090":1,"1132":2}}],["unable",{"2":{"1082":1}}],["unavailable",{"2":{"317":1}}],["unauthorizedexception",{"2":{"638":1}}],["unauthorized",{"2":{"317":1}}],["unamused",{"2":{"251":1}}],["uname",{"2":{"83":1,"1198":1}}],["unless",{"2":{"1025":1}}],["unleashing",{"2":{"355":1}}],["unlock",{"2":{"251":1}}],["unlinksync",{"2":{"770":1}}],["unlink",{"2":{"62":2}}],["unobserve",{"2":{"245":1}}],["undefinded",{"2":{"577":1,"581":1}}],["undefined除了和null比较结果为true外",{"2":{"47":1,"553":1}}],["undefined",{"0":{"908":1},"2":{"2":2,"24":1,"38":1,"40":2,"41":3,"43":1,"44":2,"46":2,"47":2,"145":1,"152":3,"154":1,"195":1,"227":1,"231":1,"238":1,"544":1,"546":2,"547":3,"549":1,"550":2,"552":2,"553":2,"571":1,"573":1,"587":4,"745":1,"857":1,"894":1,"901":3,"903":1,"932":1,"934":3,"938":1,"949":3,"954":1,"964":2}}],["under",{"2":{"1209":1}}],["underlyingsink",{"2":{"514":1}}],["underlyingsource",{"2":{"510":1}}],["underage",{"2":{"251":1}}],["underwear=",{"2":{"204":2,"754":2}}],["underwear",{"2":{"204":11,"754":11}}],["unset",{"2":{"836":1,"1209":1}}],["unsafe",{"2":{"350":3}}],["unsupported",{"2":{"317":1,"1132":2}}],["unshift",{"2":{"197":1,"747":1,"955":4}}],["unsigned",{"2":{"83":1}}],["unionfs将多个文件系统合并成为一个虚拟的文件系统",{"2":{"997":1}}],["unionfs",{"2":{"997":6}}],["uniapp",{"2":{"464":1}}],["unit",{"0":{"853":1},"2":{"386":1,"851":1,"1208":2}}],["unicoderegexp",{"2":{"938":1}}],["unicode",{"2":{"138":1,"462":6,"887":1}}],["uninstall",{"2":{"96":2}}],["unix",{"2":{"83":1,"1212":1,"1214":1}}],["unixtime",{"2":{"83":2}}],["原来在语法分析时",{"2":{"587":1}}],["原来就是一个函数",{"2":{"238":1}}],["原始方法",{"2":{"955":1}}],["原始请求对象响应数据",{"2":{"614":1}}],["原始数据的类文件对象",{"2":{"493":1}}],["原始值和引用类型进行比较时",{"2":{"47":1,"553":1}}],["原生数据的处理等等",{"2":{"478":1}}],["原地址和目标地址都是192",{"2":{"453":1}}],["原书第2版",{"2":{"306":1,"314":1,"373":1,"396":1}}],["原型式继承加强",{"2":{"581":1}}],["原型式继承通过修改构造函数的prototype为目标对象",{"2":{"579":1}}],["原型式继承",{"0":{"579":1}}],["原型的getter",{"2":{"572":1}}],["原型对象的引用数将会变成已经存在的对象的数量",{"2":{"573":1}}],["原型对象也是个普通对象",{"2":{"571":1}}],["原型对象不能形成闭环",{"2":{"571":1}}],["原型大家理解了后",{"2":{"571":1}}],["原型只能是对象或者null",{"2":{"571":1}}],["原型也是一个普通对象",{"2":{"571":1}}],["原型链",{"2":{"584":1}}],["原型链继承是最基本的继承",{"2":{"577":1}}],["原型链继承",{"0":{"577":1}}],["原型链和继承",{"2":{"570":1}}],["原型链与继承",{"0":{"570":1},"1":{"571":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1}}],["原型",{"0":{"570":1},"1":{"571":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1},"2":{"210":1,"477":1,"760":1}}],["原本由于接口不兼容而不能工作的两个软件实体可以一起工作",{"2":{"206":1,"756":1}}],["原因就是默认是贪婪原则",{"2":{"150":1,"899":1}}],["原理非常简单",{"2":{"956":1}}],["原理就是通过watcher的teardown方法遍历当前watcher的所有dep执行移除当前watcher",{"2":{"940":1}}],["原理就是让一张表自己和自己联表",{"2":{"88":1}}],["原理实现",{"0":{"932":1}}],["原理等等",{"2":{"601":1}}],["原理图可以看fiddler这篇",{"2":{"426":1}}],["原理",{"0":{"1085":1},"2":{"32":1,"965":2}}],["原数组的元素会按照下述规则拷贝",{"2":{"30":1}}],["原数据中包含子对象",{"2":{"26":1}}],["原文链接",{"2":{"22":1}}],["三色标记法",{"0":{"564":1}}],["三色标记",{"2":{"559":1}}],["三次正好符合可靠传输的特点",{"2":{"378":1}}],["三次握手的简单理解",{"2":{"456":1}}],["三次握手是tcp连接的正常过程",{"2":{"379":1}}],["三次握手完毕可以进行数据传输了",{"2":{"378":1}}],["三次握手",{"0":{"378":1,"456":1}}],["三种状态渲染不同的url",{"2":{"244":1}}],["三",{"2":{"26":2}}],["三者区别后面会讲",{"2":{"1098":1}}],["三者区别",{"0":{"5":1}}],["二进制码形式的客户端地址",{"2":{"729":1}}],["二进制流也包含textencoderstream和textdecoderstream两种方法",{"2":{"492":1}}],["二进制1111",{"2":{"376":1}}],["二进制表示0101",{"2":{"376":1}}],["二进制数据等消息",{"2":{"354":1}}],["二者是等价的",{"2":{"1175":1}}],["二者进行映射",{"2":{"1022":1}}],["二者的区别和对比",{"2":{"720":1}}],["二者缺一不可",{"2":{"311":1}}],["二者相同",{"2":{"196":1,"746":1}}],["二者相辅相成",{"2":{"132":1}}],["二者都是为提前加载资源而生的",{"2":{"131":1}}],["二",{"2":{"26":2}}],["4°c",{"2":{"1236":1}}],["4h0m0s",{"2":{"1209":1}}],["4g",{"2":{"1196":1,"1203":1}}],["4c",{"2":{"1196":1}}],["4px",{"2":{"850":1}}],["4月",{"2":{"728":2}}],["4dx",{"2":{"713":1}}],["443",{"2":{"710":1,"726":2,"727":3,"1022":2,"1171":4,"1172":2,"1173":2,"1218":1}}],["44",{"2":{"708":1}}],["444us",{"2":{"325":1}}],["4行",{"2":{"587":1}}],["46",{"2":{"453":1,"727":1}}],["4f",{"2":{"453":1}}],["4元组与t值的散列值",{"2":{"381":1}}],["4位长度",{"2":{"376":1}}],["4×10的38次方",{"2":{"366":1}}],["497642694+08",{"2":{"994":1}}],["49",{"2":{"343":1,"640":1,"1082":1}}],["491",{"2":{"316":1}}],["42h",{"2":{"1217":13,"1218":3}}],["42",{"2":{"529":1,"1082":2,"1090":2}}],["4294967295",{"2":{"485":1}}],["429",{"2":{"317":1}}],["422",{"2":{"57":2}}],["41h",{"2":{"1217":7}}],["410",{"2":{"1090":1}}],["41",{"2":{"723":1}}],["418",{"2":{"715":4}}],["415",{"2":{"317":1,"718":2}}],["412",{"2":{"62":4}}],["45f1",{"2":{"1095":1}}],["45",{"2":{"298":1,"347":1}}],["4字节",{"2":{"297":2}}],["4️⃣",{"2":{"251":1}}],["43",{"2":{"154":3,"727":1,"903":3}}],["4m0s",{"2":{"1212":1}}],["4mb",{"2":{"1073":1}}],["4m",{"2":{"129":1}}],["4版本",{"2":{"96":2}}],["47437424c9652266929c74a9870e54c0fb0db253",{"2":{"1103":1}}],["475",{"2":{"1090":1}}],["472z",{"2":{"646":1}}],["47",{"2":{"83":1,"1082":1}}],["48行",{"2":{"964":1}}],["486",{"2":{"874":1}}],["48bit",{"2":{"454":1}}],["48",{"2":{"44":1,"550":1}}],["40g",{"2":{"1196":1}}],["40px",{"2":{"850":1}}],["4096",{"2":{"726":2,"1178":2}}],["409",{"2":{"317":1}}],["408",{"2":{"317":1}}],["403",{"2":{"132":1,"317":1,"353":2,"722":1}}],["400",{"2":{"317":1,"646":1}}],["400到499表示客户端错误",{"2":{"317":1}}],["400=240px",{"2":{"111":1}}],["400=160px",{"2":{"111":1}}],["400px",{"2":{"111":1,"112":1}}],["401",{"2":{"64":2,"317":1,"1191":1}}],["404页面",{"2":{"54":2}}],["404",{"2":{"54":2,"317":1,"322":1,"638":1,"709":3,"721":1,"1103":9}}],["40",{"2":{"44":1,"550":1}}],["4",{"2":{"26":2,"33":2,"40":2,"60":1,"83":2,"96":3,"98":1,"130":2,"132":2,"134":1,"139":1,"141":1,"152":1,"203":1,"218":1,"297":1,"404":1,"422":1,"485":1,"534":1,"546":2,"594":1,"703":1,"708":2,"717":2,"753":1,"771":1,"800":2,"801":1,"874":1,"888":1,"890":1,"901":1,"994":1,"998":2,"1002":2,"1012":1,"1051":5,"1064":1,"1082":2,"1085":1,"1121":10,"1187":2,"1191":1,"1218":2,"1228":2}}],["4+1",{"2":{"83":1}}],["4+",{"2":{"22":1}}],["对数组的修改通常都会获取length属性触发track",{"2":{"961":1}}],["对新增的数据再进行",{"2":{"955":1}}],["对每个对象拦截",{"2":{"955":1}}],["对回调做一次包装",{"2":{"944":1}}],["对key进行getter",{"2":{"932":1}}],["对代码进行自动格式化",{"2":{"837":1}}],["对团队之间的协作也更有益",{"2":{"835":1}}],["对源码没有改变的包会进行增量打包",{"2":{"818":1}}],["对文档进行了修改",{"2":{"789":1}}],["对文件进行hash计算",{"2":{"772":1}}],["对其进行虚拟",{"2":{"1078":1}}],["对其的基本使用构建或者原理都有一定的了解",{"2":{"784":1}}],["对其缺乏一定的认识",{"2":{"585":1}}],["对内容易造成不同的成员产生不同的感受",{"2":{"782":1}}],["对图片进行压缩",{"2":{"717":1}}],["对接口进行管理",{"2":{"678":1}}],["对传入的值进行转换",{"2":{"646":1}}],["对比下两者的大小",{"2":{"1070":1}}],["对比不同的继承让原型及原型链的知识进一步巩固",{"2":{"584":1}}],["对比赋值与浅拷贝会对原对象带来哪些改变",{"2":{"26":1}}],["对父类构造函数通过call",{"2":{"578":1}}],["对活动区的对象进行标记",{"2":{"559":1}}],["对视频进行范围请求",{"2":{"520":1}}],["对应不同的镜像",{"2":{"995":1,"1081":1}}],["对应的文件路径在cypress",{"2":{"877":1}}],["对应于当前操作系统的换行符",{"2":{"494":1}}],["对应值",{"2":{"77":1}}],["对实例的操作都是作用到arraybuffer上",{"2":{"483":1}}],["对实例成员是原型链",{"2":{"230":1}}],["对macos用户也比较友好",{"2":{"411":1}}],["对称加密算法的优点是加密和解密速度快",{"2":{"330":1}}],["对称加密是指在加密和解密过程中使用同一个密钥的加密算法",{"2":{"330":1}}],["对称加密和非对称加密都是计算机安全领域中常用的加密算法",{"2":{"330":1}}],["对称",{"0":{"330":1}}],["对现有的web生态系统具有一定的影响",{"2":{"323":1}}],["对服务器的影响是相同的",{"2":{"320":1}}],["对所有的arp请求和响应进行过滤和验证",{"2":{"304":1}}],["对所有图片进行收集",{"2":{"248":1}}],["对齐方式",{"2":{"284":1}}],["对对应的url进行缓存",{"2":{"248":1}}],["对当前元素提供指定错误图片",{"2":{"245":1}}],["对目标做了一层中间操作",{"2":{"225":1}}],["对外给人不统一犹如盗版之感",{"2":{"782":1}}],["对外部提供api",{"2":{"201":1,"751":1}}],["对外暴露统一api",{"2":{"200":1,"750":1}}],["对面只用一个函数",{"2":{"200":1,"750":1}}],["对原生input和checkbox做一层装饰",{"2":{"199":1,"749":1}}],["对没有使用的依赖",{"2":{"187":1,"190":1}}],["对我而言",{"2":{"183":1}}],["对",{"2":{"63":1,"329":1}}],["对象响应化",{"2":{"953":1}}],["对象进行拦截",{"2":{"951":1}}],["对象的属性值改变时会通过自己的dep",{"2":{"954":1}}],["对象的",{"2":{"937":1}}],["对象形式和vue2一样",{"2":{"934":1}}],["对象之间的依赖关系是在代码中直接编写的",{"2":{"601":1}}],["对象本身和原型对象以引用的关系存在",{"2":{"571":1}}],["对象自己和原型之间通过链接的方式引用",{"2":{"571":1}}],["对象被引用一次引用次数就",{"2":{"557":1}}],["对象被构建时立刻执行",{"2":{"514":1}}],["对象在创建时会执行",{"2":{"510":1}}],["对象中的内容",{"2":{"507":1}}],["对象中读取的文件或数据",{"2":{"502":1}}],["对象允许",{"2":{"502":1}}],["对象继承了",{"2":{"498":1}}],["对象表示一个不可变",{"2":{"493":1}}],["对象来操作",{"2":{"479":1}}],["对象用来表示通用的",{"2":{"479":1}}],["对象类型转number",{"2":{"43":1,"549":1}}],["对象或者数组",{"2":{"32":1}}],["对象",{"2":{"30":1,"337":1,"514":1,"518":1,"937":2,"944":1}}],["对象赋值",{"2":{"26":1}}],["对于海量数据你可以通过导航栏的搜索进行过滤",{"2":{"1223":1}}],["对于非arm架构的环境请使用https",{"2":{"1210":1}}],["对于gitlab的安装本人都是在arm架构centos7",{"2":{"1171":1}}],["对于当前项目是唯一的",{"2":{"1122":1}}],["对于当前模块",{"2":{"130":1}}],["对于国内用户访问比较慢",{"2":{"1082":1}}],["对于相同镜像的共享也只需拿到配置文件即可制作完全一样的镜像",{"2":{"1051":1}}],["对于相关变量的类型要求没有约束",{"2":{"825":1}}],["对于整体的应用服务管理极其不方便",{"2":{"1016":1}}],["对于自己的容器需要做好日志的输出方便查看日志和错误追溯",{"2":{"1007":1}}],["对于linux而言",{"2":{"996":1}}],["对于网络平台而言",{"2":{"977":1}}],["对于网络中的任意主机都可以接收到发送者的arp包",{"2":{"303":1}}],["对于新增或删除的属性",{"2":{"965":1}}],["对于新成员可能无法立马理解透彻",{"2":{"786":1}}],["对于其中特殊的实现这里不再赘述",{"2":{"964":1}}],["对于特殊情况可以单独进行分析",{"2":{"964":1}}],["对于module语法jest不认识就会报错",{"2":{"858":1}}],["对于引入文件可以省去文件后缀",{"2":{"857":1}}],["对于引用类型在特殊条件下都会转换为基础类型",{"2":{"40":1,"546":1}}],["对于默认的配置就不用删除多语的注释了",{"2":{"857":1}}],["对于可修复的保存后也会自动修复",{"2":{"840":1}}],["对于风格问题可以使用其他专业工具",{"2":{"835":1}}],["对于约束性不强的开发者来说仍是个头疼的问题",{"2":{"834":1}}],["对于插件的规则配置也是基于插件名的两种形式",{"2":{"831":1}}],["对于协同编码规范eslint是必不可少的工具",{"2":{"826":1}}],["对于团队协作具有很大的益处",{"2":{"795":1}}],["对于团队协作而言",{"2":{"794":1}}],["对于平时专注于一个项目的webstorm其实可比较推荐",{"2":{"785":1}}],["对于平时的需求一般用不上",{"2":{"512":1}}],["对于简单的项目结合使用框架可以考虑直接使用官方脚手架",{"2":{"784":1}}],["对于简单的调试直接使用debugger即可",{"2":{"407":1}}],["对于更大的文件如镜像",{"2":{"771":1}}],["对于小文件将整个文件传输问题不大",{"2":{"766":1}}],["对于小文件使用传统的http请求一次就可以上传成功",{"2":{"765":1}}],["对于小白可以先看看",{"2":{"477":1}}],["对于丢失的数据包只需要重传某个数据块而已",{"2":{"764":1}}],["对于较小的文件可以很快的传输",{"2":{"764":1}}],["对于配置是有很大帮助的",{"2":{"729":1}}],["对于ssl相关配置",{"2":{"726":1}}],["对于jpeg",{"2":{"718":1}}],["对于js",{"2":{"132":1}}],["对于生产环境可以将资源打包成",{"2":{"697":1}}],["对于后端来说swagger是最熟悉不过的",{"2":{"678":1}}],["对于i18n没有resolve没有匹配到的语言",{"2":{"673":1}}],["对于ip协议值为0x0800",{"2":{"297":1}}],["对于以上观点先创建功能模块存放共享的内容",{"2":{"669":1}}],["对于每个模块的专业或详细知识点还请参考基础文章",{"2":{"665":1}}],["对于目前前后端分离的模式可能用不上它的所有功能",{"2":{"664":1}}],["对于目前的webpack4",{"2":{"174":1}}],["对于前端来说用node生成api",{"2":{"678":1}}],["对于前端来讲这种api版本场景可能很难遇到",{"2":{"654":1}}],["对于前者的配置方案如果有嵌套的配置对于类型提示非常不友好",{"2":{"631":1}}],["对于页面模板的使用请查看后续的mvc文章",{"2":{"639":1}}],["对于初学者也可以使用nestjs的cli命令创建",{"2":{"610":1}}],["对于作用域的范围有全局变量对象go和局部变量对象vo",{"2":{"593":1}}],["对于如",{"2":{"586":1}}],["对于原型链查找的规则",{"2":{"580":1}}],["对于prototype属性接下来看看构造器",{"2":{"572":1}}],["对于电脑性能不好的可能要更久",{"2":{"533":1}}],["对于宏任务macrotask",{"2":{"532":1}}],["对于需要将测试抓包的一些数据分享给别人排查场景",{"2":{"430":1}}],["对于https请求的请求和响应数据无法解码都是乱码",{"2":{"421":1}}],["对于html文档",{"2":{"115":1}}],["对于重要敏感的操作都进行验证码验证",{"2":{"353":1}}],["对于内联的css资源就会发出report报错",{"2":{"350":1}}],["对于上面的网页内嵌css就会被上报",{"2":{"350":1}}],["对于鉴别了身份的人才可以获取相关资源",{"2":{"346":1}}],["对于跨域请求浏览器都会先进行预检请求",{"2":{"336":1}}],["对于推动计算机网络的发展和应用具有重要的作用",{"2":{"309":1}}],["对于标注不允许转载的",{"2":{"252":1,"271":1,"991":1,"1226":1}}],["对于监测两者是否交叉一个友好的api",{"2":{"245":1}}],["对于实例属性是类的原型链",{"2":{"232":1}}],["对于实例属性成员是类的原型链",{"2":{"229":1}}],["对于静态成员是类构造器",{"2":{"230":1}}],["对于静态属性是类的构造器",{"2":{"229":1,"232":1}}],["对于一个大的项目来讲可能会有很多子包",{"2":{"816":1}}],["对于一个通用型的传统的前端服务来说以上已经足够用了",{"2":{"677":1}}],["对于一个便于扩展和健壮的web应用来说配置是少不了的",{"2":{"668":1}}],["对于一个程序的功能而言",{"2":{"67":1}}],["对于一些复杂需求可能不够灵活",{"2":{"784":1}}],["对于一些异步任务",{"2":{"592":1}}],["对于一些常用的库文件",{"2":{"130":1}}],["对于仅有一个月生活费的大学生来说机会来了",{"2":{"123":1}}],["对于从左到右的格式化",{"2":{"106":1}}],["对于数据量大的项目",{"2":{"85":1}}],["对于环境就不多讲了",{"2":{"56":1}}],["对于字符串",{"2":{"30":1}}],["对于",{"2":{"9":1}}],["对于直接调用来说",{"2":{"9":1}}],["对于函数来说有两种方式调用",{"2":{"9":1}}],["即镜像的命名空间和镜像的名称",{"2":{"1012":1}}],["即文件的唯一性如何确定",{"2":{"772":1}}],["即控制权从应用程序代码中反转过来",{"2":{"601":1}}],["即对象的创建",{"2":{"601":1}}],["即child",{"2":{"583":1}}],["即curl随机选用了",{"2":{"382":1}}],["即原型对象为构造函数的",{"2":{"571":1}}],["即原型",{"2":{"570":1}}],["即确认接收到的连续数据块",{"2":{"391":1}}],["即接收方不会立即发送确认消息",{"2":{"382":1}}],["即便是在相同域名的页面中嵌套也不允许",{"2":{"350":1}}],["即只允许从当前网站的域名加载资源",{"2":{"350":1}}],["即只复制对象空间而不复制资源",{"2":{"26":1}}],["即多次执行相同的",{"2":{"320":1}}],["即00",{"2":{"297":1}}],["即",{"2":{"244":1,"342":1,"691":1,"1005":1}}],["即使容器被删除或重建",{"2":{"1110":1}}],["即使容器被删除",{"2":{"1110":1}}],["即使容器正在运行",{"2":{"1009":1}}],["即使该线程崩溃也不会影响页面渲染",{"2":{"773":1}}],["即使黑客拿到了密钥也只会对当前会话造成影响",{"2":{"334":1}}],["即使不关心对象的内部构造",{"2":{"203":1,"753":1}}],["即使存在浮动也是如此",{"2":{"106":1}}],["即在内部让多个方法一起被调用",{"2":{"200":1,"750":1}}],["即可以同时处理10000个并发连接",{"2":{"704":1}}],["即可下载",{"2":{"412":1}}],["即可跨域访问资源",{"2":{"337":1}}],["即可",{"2":{"111":1,"1022":1}}],["即当birthday是未来的日期时",{"2":{"83":1}}],["即默认拷贝构造函数只是对对象进行浅拷贝复制",{"2":{"26":1}}],["因而直接把一台电脑的操作系统文件考到另一台一般是没法启动的",{"2":{"1078":1}}],["因此你的主机上需要安装go",{"2":{"1208":1}}],["因此docker中引入了数据卷的概念",{"2":{"1109":1}}],["因此需要创建对应的角色和权限",{"2":{"1099":1}}],["因此需要配置一些国内镜像加速地址",{"2":{"1082":1}}],["因此如npm私库的搭建在公司内部必不可少",{"2":{"1092":1}}],["因此如果前面的请求或响应被阻塞",{"2":{"727":1}}],["因此如果其中一个对象改变了这个地址",{"2":{"26":1}}],["因此速度更快",{"2":{"957":1}}],["因此targetwatcher",{"2":{"953":1}}],["因此tcp中引入了窗口的概念",{"2":{"387":1}}],["因此tcp的请求就会被延时",{"2":{"380":1}}],["因此更新周期会拉长",{"2":{"948":1}}],["因此文章中也会比对两个版本之间同一原理实现差别",{"2":{"948":1}}],["因此所有对象都可能是effect",{"2":{"934":1}}],["因此引入了extends的概念",{"2":{"831":1}}],["因此团队统一代码规范及质量有利于团队之间的协作",{"2":{"823":1}}],["因此lerna可以专注用来管理monorepo的版本发布",{"2":{"814":1}}],["因此项目规范对于团队的协同有极其重要作用",{"2":{"783":1}}],["因此跳过已经上传过的文件切片可以提高传输效率",{"2":{"772":1}}],["因此用户的留存率和性能优化及页面指标有着密不可分的关系",{"2":{"762":1}}],["因此只能在https上使用",{"2":{"727":1}}],["因此只能容纳那么多",{"2":{"485":1}}],["因此它仍不是完美的协议也是存在一些缺点",{"2":{"727":1}}],["因此它的缺点是服务器时间和客户端时间可能不同步",{"2":{"720":1}}],["因此它也被称为",{"2":{"357":1}}],["因此在使用数组方法触发trigger时判断当前对象是不是数组并且当前key为数字",{"2":{"961":1}}],["因此在获取深层属性时",{"2":{"960":1}}],["因此在页面render时会访问total",{"2":{"934":1}}],["因此在不能正常处理图像情况下",{"2":{"718":1}}],["因此在数据库中有前面两种连接有部分为null的数据这一整行都没有了",{"2":{"86":1}}],["因此还要单独的创建一个配置文件来处理默认的配置",{"2":{"669":1}}],["因此还需要一些改造",{"2":{"246":1}}],["因此对于高级编程语言而言",{"2":{"586":1}}],["因此对于文件的操作在webwoker不会影响主线程",{"2":{"507":1}}],["因此cat的原型还是object",{"2":{"572":1}}],["因此charles做了一个代理",{"2":{"425":1}}],["因此node的eventloop是libuv里实现的",{"2":{"537":1}}],["因此关于js单线程处理异步任务等等概念也就被关注起来了",{"2":{"524":1}}],["因此窗口范围内的数据发送期必早于窗口后的数据",{"2":{"387":1}}],["因此mss的值通常为1500",{"2":{"386":1}}],["因此紧急指针也代表了紧急数据的末尾",{"2":{"376":1}}],["因此最大值为2的16次方65536",{"2":{"376":1}}],["因此最小值为5",{"2":{"367":1}}],["因此当响应式对象的值发生变化时更新遵循以下规则",{"2":{"934":1}}],["因此当大于mtu时会进行ip分片和重组",{"2":{"372":1}}],["因此当new",{"2":{"239":1}}],["因此每个网络至少需要一个网关",{"2":{"371":1}}],["因此使用纯原生js很有可能造成相关问题",{"2":{"825":1}}],["因此使用多个机器进行备份待用实现高可用是必然的",{"2":{"728":1}}],["因此使用nat可以增强网络安全性",{"2":{"370":1}}],["因此使用范围请求可以只下载部分文件",{"2":{"344":1}}],["因此的当ip数据包超过mtu",{"2":{"369":1}}],["因此首部长度的最大值60",{"2":{"367":1}}],["因此ipv6被广泛应用可以完美的解决ipv4的多种问题",{"2":{"366":1}}],["因此ip地址决定了数据的起点和终点",{"2":{"311":1}}],["因此划分如下",{"2":{"364":1}}],["因此不用担心使用",{"2":{"571":1}}],["因此不需要担心安全问题",{"2":{"361":1}}],["因此不会对安全造成威胁",{"2":{"320":1}}],["因此安全性更高",{"2":{"330":1}}],["因此这种加密算法也称为",{"2":{"330":1}}],["因此多个请求和响应之间存在着明显的串行化和等待时间",{"2":{"324":1}}],["因此可能会留下一些虚悬镜像",{"2":{"1002":1}}],["因此可能会以不同的顺序到达目标设备",{"2":{"369":1}}],["因此可能会存在一些不确定因素",{"2":{"327":1}}],["因此可能受到跨站脚本攻击",{"2":{"320":1}}],["因此可以将原始对象包装成对象然后再进行拦截即可",{"2":{"962":1}}],["因此可以假装成目标主机并返回给源主机错误的mac地址",{"2":{"303":1}}],["因此可以缓存静态资源",{"2":{"129":1}}],["因此可以进行预加载",{"2":{"129":1}}],["因此可以实现两栏布局",{"2":{"107":1,"111":1}}],["因此很容易称为攻击的漏洞",{"2":{"305":1}}],["因此有时需要手动清除过期的arp缓存表项",{"2":{"298":1}}],["因此为了兼容各个操作系统环境",{"2":{"182":1}}],["因此自联和左联右联不一样",{"2":{"88":1}}],["因此值可以根据键的顺序",{"2":{"77":1}}],["因此我们在~目录进行zsh配置",{"2":{"69":1}}],["因此",{"2":{"26":1,"131":1,"183":1,"242":1,"324":1,"329":1,"369":1,"1065":1,"1068":1,"1140":1}}],["因为也有其他地区的同事要参加google会议所以我也带着笔记本",{"2":{"1233":1}}],["因为docker0网关是在主机上虚拟出来的",{"2":{"1085":1}}],["因为我们知道",{"2":{"1078":1}}],["因为包含了一整套操作系统",{"2":{"1078":1}}],["因为它允许使用简单的依赖项管理",{"2":{"1165":1}}],["因为它允许在",{"2":{"1164":1}}],["因为它可以直接捕获属性的操作",{"2":{"965":1}}],["因为它在匹配数据的时候是一行行往下找的",{"2":{"85":1}}],["因为新增的值可能是对象",{"2":{"955":1}}],["因为只需要对变化的组件进行更新",{"2":{"953":1}}],["因为只要开一个client",{"2":{"400":1}}],["因为他和age没有任何关联",{"2":{"951":1}}],["因为他们没有在全局中定义",{"2":{"589":1}}],["因为他们项目中使用",{"2":{"179":1}}],["因为computed对应的data值没变",{"2":{"931":1}}],["因为比较简单执行的比较快",{"2":{"879":1}}],["因为所有相关代码都在同一个仓库中",{"2":{"811":1}}],["因为这里的guard是针对某个路由的",{"2":{"648":1}}],["因为settimeout内部引用到了外部的作用域",{"2":{"594":1}}],["因为返回的匿名函数会记住自己的此法环境",{"2":{"590":1}}],["因为此时name已经进行赋值了",{"2":{"587":1}}],["因为此涉及到判断是否加载真正图片",{"2":{"247":1}}],["因为上面代码是在io回调里执行的",{"2":{"539":1}}],["因为服务端此时可能数据并没有发送完毕",{"2":{"457":1}}],["因为握手时服务端直接确认连接不需要等待",{"2":{"457":1}}],["因为发送时数据可能乱序",{"2":{"456":1}}],["因为发送方和接收方都不需要解析消息体的内容来确定其长度",{"2":{"342":1}}],["因为http请求也是基于tcp协议的",{"2":{"455":1}}],["因为没有在手机上安装charles证书",{"2":{"422":1}}],["因为每个设备都被分配了唯一的私有ip地址",{"2":{"370":1}}],["因为外部网络无法直接访问内部网络",{"2":{"370":1}}],["因为路由器需要确保数据包不会在网络中无限循环",{"2":{"368":1}}],["因为在大多数情况下都足够安全",{"2":{"353":1}}],["因为在一个单词中间的字符永远也不可能同时满足没有",{"2":{"139":1,"888":1}}],["因为从搜索引擎中打开链接都会携带相关联的referer头",{"2":{"353":1}}],["因为tcp",{"2":{"312":1}}],["因为mac地址是在数据链路层使用的地址",{"2":{"295":1}}],["因为vue是基于rollup",{"2":{"237":1}}],["因为jquery",{"2":{"190":1}}],["因为会直接映射到源码",{"2":{"183":1}}],["因为网站使用的是",{"2":{"131":1}}],["因为首页并没有什么太大的资源需要加载",{"2":{"131":1}}],["因为要结合cdn",{"2":{"130":1}}],["因为有定宽和不定宽的区别",{"2":{"12":1}}],["因为",{"2":{"7":1,"9":1,"139":2,"320":1,"888":2}}],["赋值和删除操作",{"2":{"965":1}}],["赋值和浅拷贝的区别",{"0":{"26":1}}],["赋值给",{"2":{"718":1}}],["赋值",{"2":{"26":1}}],["赋的其实是该对象的在栈中的地址",{"2":{"26":1}}],["修订版",{"2":{"1121":1}}],["修复的功能",{"2":{"797":1}}],["修复bug",{"2":{"789":1,"801":2}}],["修复和破坏性变更",{"2":{"788":1}}],["修复和新功能的推出",{"2":{"784":1}}],["修复了",{"2":{"329":1}}],["修饰符",{"0":{"138":1,"887":1},"2":{"154":1,"850":1,"903":1}}],["修改完后",{"2":{"1225":1}}],["修改interface",{"2":{"1217":1}}],["修改cidr值保持和k8s设置的pod网段一致",{"2":{"1217":1}}],["修改版本号提交代码",{"2":{"1190":1}}],["修改了配置文件后需要重启服务",{"2":{"1083":1}}],["修改文件权限",{"2":{"1059":1}}],["修改文件等",{"2":{"1003":1}}],["修改一下配置文件让docker忽略当前地址",{"2":{"1039":1}}],["修改属性时还是触发的原来响应式对象",{"2":{"963":1}}],["修改对象属性时派发更新",{"2":{"959":1}}],["修改对个值",{"2":{"78":1}}],["修改范围",{"2":{"800":1,"801":1}}],["修改的理由和修改注释",{"2":{"792":1}}],["修改时间等等内容",{"2":{"768":1}}],["修改prototype原型",{"2":{"573":1}}],["修改原型的属性会同步改变",{"2":{"573":1}}],["修改原型是个非常耗时的操作",{"2":{"571":1}}],["修改原接口就显得不太现实了",{"2":{"206":1,"756":1}}],["修改请求内容",{"2":{"436":1}}],["修改请求体和响应体等等",{"2":{"419":1}}],["修改会同步保存到浏览器",{"2":{"407":1}}],["修改自身属性",{"2":{"404":1}}],["修改样式",{"2":{"111":1,"112":1}}],["修改",{"2":{"111":1,"1107":1,"1208":1}}],["修改单个值",{"2":{"78":1}}],["修改数据库重置",{"2":{"1174":1}}],["修改数据",{"0":{"78":1}}],["修改date的tostring方法",{"2":{"40":2,"546":2}}],["修改新对象不会改到原对象",{"2":{"25":1}}],["修正文字",{"2":{"16":1}}],["新方法",{"2":{"955":1}}],["新功能",{"2":{"797":1,"801":2}}],["新增",{"2":{"955":1}}],["新增的延时任务",{"2":{"661":1}}],["新增的间隔任务",{"2":{"661":1}}],["新增的调度任务执行",{"2":{"661":1}}],["新增的节点",{"2":{"404":1}}],["新增一个猫",{"2":{"612":1}}],["新生代",{"0":{"560":1}}],["新生代回收",{"2":{"559":1}}],["新版本就不需要下载了",{"2":{"412":1}}],["新版本都会有8位控制位",{"2":{"376":1}}],["新的连接会生成新的序列号",{"2":{"378":1}}],["新的arp请求会替换最早的条目",{"2":{"298":1}}],["新的对象产生了",{"2":{"32":1}}],["新建一个项目初始化",{"2":{"1191":1}}],["新建的网络默认是桥接bridge",{"2":{"1087":1}}],["新建的容器不会创建自己的网卡而是共同使用指定容器的",{"2":{"1087":1}}],["新建button组件的测试用例",{"2":{"879":1}}],["新建",{"2":{"841":1}}],["新建webpack",{"2":{"190":1}}],["新建终端",{"2":{"166":1}}],["新建文件",{"2":{"163":1,"801":1}}],["新窗口打开当前文件",{"2":{"163":1}}],["新值",{"2":{"78":3}}],["新对象跟原对象不共享内存",{"2":{"25":1}}],["新旧对象还是共享同一块内存",{"2":{"25":1}}],["而k8s默认使用systemd",{"2":{"1208":1}}],["而涉及到的一些安装链接需要根据情况替换成兼容你自己系统的链接",{"2":{"1194":1}}],["而ip又是动态的",{"2":{"1087":1}}],["而ip地址不会",{"2":{"311":1}}],["而容器是一个应用层抽象",{"2":{"1078":1}}],["而每台电脑的硬件配置几乎不会完全一样",{"2":{"1078":1}}],["而exec格式不会采用shell执行",{"2":{"1058":1}}],["而expires则可以用作向后兼容",{"2":{"720":1}}],["而此方式相对来说比较繁琐且对于旁人来说内部都是黑箱操作",{"2":{"1048":1}}],["而此种方式对于搜索引擎打开是硬伤",{"2":{"353":1}}],["而我更推荐用其他方式搭建",{"2":{"1039":1}}],["而我们往往会针对某个网络包进行分析",{"2":{"453":1}}],["而新的镜像",{"2":{"1002":1}}],["而age就有两个依赖p1",{"2":{"959":1}}],["而proxy却可以优雅的解决掉这个问题",{"2":{"958":1}}],["而由proxy和reflect代替",{"2":{"958":1}}],["而由谷歌开发的v8引擎最为出色",{"2":{"525":1}}],["而get会执行",{"2":{"954":1}}],["而渲染又是从mount开始的",{"2":{"954":1}}],["而修改了name属性值后p1",{"2":{"951":1}}],["而其他就是没有任何关联性的方法",{"2":{"950":1}}],["而其中一个重要的特性就是超时重传",{"2":{"388":1}}],["而没有像vue2中那样死板",{"2":{"934":1}}],["而没有使用",{"2":{"606":1}}],["而执行scheduler函数",{"2":{"934":1}}],["而计算watcher并不会通知渲染watcher更新",{"2":{"931":1}}],["而默认情况下jest只识别js文件的",{"2":{"858":1}}],["而前端通常都是以esmodule的形式进行函数的导出",{"2":{"858":1}}],["而端到端测试关注整体功能和用户体验",{"2":{"854":1}}],["而包的管理交给yarn处理就可以了",{"2":{"814":1}}],["而功能类则是为项目coding或deploy提供便捷功能",{"2":{"782":1}}],["而好的做法就是限制并发数",{"2":{"771":1}}],["而blob拥有slice方法可以对blob进行分割",{"2":{"768":1}}],["而blob则是有类型的二进制数据",{"2":{"493":1}}],["而如果使用小文件就可以很快的传输成功",{"2":{"767":1}}],["而如果当前主机和目的ip一致的话",{"2":{"454":1}}],["而大文件就不会那么快",{"2":{"764":1}}],["而帧必须按顺序发送和接收",{"2":{"727":1}}],["而接口的什么参数会用到",{"2":{"685":1}}],["而比如偏后端的使用如数据库相关",{"2":{"677":1}}],["而对于配置文件的管理也更加方便",{"2":{"1018":1}}],["而对于只读的镜像层",{"2":{"997":1}}],["而对于更细致的代码样式调整则有限",{"2":{"837":1}}],["而对于页面渲染不和后端冗余一起对前端更有好点",{"2":{"671":1}}],["而对于传统的oop",{"2":{"570":1}}],["而用的比较多的还是使用node渲染页面这种场景",{"2":{"671":1}}],["而该模块没有提供当前依赖",{"2":{"626":1}}],["而依赖注入",{"2":{"601":1}}],["而词法环境则记录了代码的位置和作用域let",{"2":{"593":1}}],["而外部无法访问内部变量",{"2":{"589":1}}],["而块级作用域就是用let",{"2":{"589":1}}],["而访问变量时会优先取当前作用域的变量",{"2":{"588":1}}],["而这些经历",{"2":{"1237":1}}],["而这种声明有一个坏处就是所有的变量都会提升到全局作用域",{"2":{"588":1}}],["而这里super方法其实就是这个逻辑",{"2":{"583":1}}],["而这里for循环执行耗时时间已经远超1s",{"2":{"533":1}}],["而watcher又是被dep控制的",{"2":{"931":1}}],["而walk函数将会报错walk",{"2":{"587":1}}],["而wireshark相对于fiddler和charles更加偏向于网络层面的抓包或者说是一个网络封包分析工具",{"2":{"449":1}}],["而变量式声明的函数和普通变量没区别",{"2":{"587":1}}],["而函数的声明会有点点区别",{"2":{"587":1}}],["而最后一行访问不存在的addr变量时则会报错",{"2":{"587":1}}],["而赋值只会在js引擎解释到当前赋值操作时才会真正赋值",{"2":{"587":1}}],["而computed函数会收集render函数",{"2":{"934":1}}],["而commitizen是在commit前通过交互式进行提交",{"2":{"798":1}}],["而class其实也是这个道理",{"2":{"583":1}}],["而cwr",{"2":{"376":1}}],["而以函数的角度去看",{"2":{"583":1}}],["而原型prototype对象会作为对象的原型",{"2":{"582":1}}],["而原型的原型才会是object",{"2":{"572":1}}],["而子类也是个简单的对象",{"2":{"579":1}}],["而子节点属性变化监听不到",{"2":{"404":1}}],["而作为普通函数使用时",{"2":{"573":1}}],["而swagger提供apitags来给对应的controller打上标签",{"2":{"687":1}}],["而setimmediate只会在check阶段打印",{"2":{"540":1}}],["而syn表示也想连接client且序号为y",{"2":{"378":1}}],["而老版本的node则会先把当前阶段的代码回调执行完后才会执行微任务队列",{"2":{"538":1}}],["而node又被libuv驱动执行对应的任务",{"2":{"537":1}}],["而实际图中也就一两次",{"2":{"534":1}}],["而定时任务",{"2":{"533":1}}],["而macrotask会交给其他线程去处理",{"2":{"532":1}}],["而具体优先取哪一个这就是要取决于事件循环机制了",{"2":{"527":1}}],["而事件循环机制",{"2":{"527":1}}],["而浏览器的eventloop总被频繁讨论",{"2":{"525":1}}],["而js单线程则会阻塞页面的渲染",{"2":{"524":1}}],["而js只能同时执行一个任务",{"2":{"524":1}}],["而docker允许你使用自定义网络",{"2":{"1087":1}}],["而docker使用容器化技术完美的解决了这些问题",{"2":{"1079":1}}],["而dockerfile中每一条指令也代表着每层的构建过程",{"2":{"1049":1}}],["而docker",{"2":{"1046":1}}],["而dataview没有固定格式直接作用于arraybuffer上",{"2":{"486":1}}],["而dh算法在握手时都会生成临时的密钥对",{"2":{"334":1}}],["而uint16的长度则为1",{"2":{"481":1}}],["而挥手时服务端接受到了客户端的fin包后",{"2":{"457":1}}],["而握手是3次",{"2":{"457":1}}],["而会做一个缓存",{"2":{"456":1}}],["而知识将目标高亮而已",{"2":{"453":1}}],["而捕获过滤器则是从源头进行过滤",{"2":{"453":1}}],["而捕获过滤器又可以对网络接口和协议相关的两个维度的过滤",{"2":{"453":1}}],["而fiddler则需要改代码",{"2":{"420":1}}],["而fiddler可能有时需要修改代码",{"2":{"411":1}}],["而http",{"2":{"414":1}}],["而当计算watcher表达式执行时",{"2":{"931":1}}],["而当宕机恢复后keepalived又会根据优先级回到原来的节点上",{"2":{"728":1}}],["而当我们展开相关的接口时会发现没有任何参数类型",{"2":{"683":1}}],["而当执行c1",{"2":{"579":1}}],["而当点击更新子节点属性或者当前元素属性时反而监听不到的",{"2":{"404":1}}],["而当页面重定向时origin头不会存在",{"2":{"353":1}}],["而有了拥塞控制后",{"2":{"392":1}}],["而窗口内通常会包含多个数据片段",{"2":{"387":1}}],["而系统内核一般对tcp有一个保活机制",{"2":{"384":1}}],["而一端由于某种原因断开了且不发送任何fin报文",{"2":{"384":1}}],["而一方为引用类型时会先进行内部拆箱转换成最兼容number类型的基本类型",{"2":{"43":1,"549":1}}],["而三次回收的情况通常是接收端不需要再发送数据了",{"2":{"382":1}}],["而只有当syn+ack报文段被确认时才分配到accept队列里",{"2":{"381":1}}],["而链路层的最大mtu",{"2":{"369":1}}],["而头部的固定长度为20",{"2":{"367":1}}],["而就是这么简单的操作就会被攻击",{"2":{"352":1}}],["而使用非对称加密",{"2":{"330":1}}],["而ts可以更好的进行类型约束",{"2":{"906":1}}],["而then会当做微任务进入微任务队列",{"2":{"532":1}}],["而textencoder这种通常是一次性进行转换",{"2":{"492":1}}],["而tcp远不止这么简单内容",{"2":{"395":1}}],["而tcp的keepalive是个保活机制",{"2":{"384":1}}],["而tcp连接也是这样的",{"2":{"378":1}}],["而tls结合了两种加密算法的优点",{"2":{"330":1}}],["而tostring一定会返回string类型",{"2":{"40":1,"546":1}}],["而私钥则必须保持私密",{"2":{"330":1}}],["而响应实体部分的长度才6字节",{"2":{"326":1}}],["而在宿主机上",{"2":{"1086":1}}],["而在dockerfile中也定义了同名的环境变量",{"2":{"1024":1}}],["而在ts文件中对于不识别的jest工具会报错或者没有提示",{"2":{"858":1}}],["而在monorepo中",{"2":{"808":1}}],["而在循环完后执行",{"2":{"594":1}}],["而在代码块中第一次访问",{"2":{"588":1}}],["而在最后一行打印内部作用域变量inner时也打印出了正确的值",{"2":{"588":1}}],["而在首行定义函数前就执行了此函数",{"2":{"587":1}}],["而在这些不同的执行阶段都会对应执行任务",{"2":{"538":1}}],["而在这种大量数据下会严重影响到分析进度",{"2":{"453":1}}],["而在",{"2":{"324":1,"325":1}}],["而解析器则是用来解析这个字符串",{"2":{"316":1}}],["而rarp",{"2":{"301":1}}],["而真正的主机接收到后",{"2":{"296":1}}],["而初次执行doscrollcallback",{"2":{"247":1}}],["而图片的状态也为懒加载管理器做好了铺垫",{"2":{"242":1}}],["而将一些步骤的实现延迟到子类中",{"2":{"207":1,"757":1}}],["而之前没有支付定金的用户只能进入普通购买模式",{"2":{"205":1,"755":1}}],["而又不需要暴露该对象的内部表示",{"2":{"203":1,"753":1}}],["而装饰器提供或拒绝它的访问",{"2":{"199":1,"749":1}}],["而被观察的对象成为发布者或主题",{"2":{"195":1,"745":1}}],["而是直接使用宿主机的",{"2":{"1087":1}}],["而是直接在容器中执行",{"2":{"1058":1}}],["而是作为一种文档形式的标记",{"2":{"1062":1}}],["而是互补的",{"2":{"851":1}}],["而是打印出undefined",{"2":{"587":1}}],["而是在object",{"2":{"572":1}}],["而是v8自己内部的实现",{"2":{"532":1}}],["而是要通过",{"2":{"479":1}}],["而是以这两个字符原本的字形来绘制",{"2":{"462":1}}],["而是基于数据进行重传的",{"2":{"391":1}}],["而是等待一定时间",{"2":{"382":1}}],["而是从建立连接的随机数作为其初始值",{"2":{"376":1}}],["而是从core",{"2":{"238":1}}],["而是会被传递到本地计算机上的网络协议栈",{"2":{"361":1}}],["而是会返回一个给定的错误文档",{"2":{"118":1}}],["而是只会向服务器报告违规的内容",{"2":{"350":1}}],["而是一些浏览器实现了这个非标准的",{"2":{"571":1}}],["而是一组工具集合",{"2":{"217":1}}],["而是一个对象订阅另一个对象",{"2":{"195":1,"745":1}}],["而惰性则和这种原则相反",{"2":{"150":1,"899":1}}],["而后者定义的变量都是常量",{"2":{"588":1}}],["而后来官方推出object",{"2":{"571":1}}],["而后的then也是个微任务会被放入当前微任务队列",{"2":{"532":1}}],["而后匹配下一个`",{"2":{"150":1,"899":1}}],["而后非单词边界的是",{"2":{"140":1,"889":1}}],["而后单词边界的是",{"2":{"140":1,"889":1}}],["而xmldocument文档类型则不会主动添加",{"2":{"117":1}}],["而+运算符最为特殊",{"2":{"42":1,"548":1}}],["而===比较者的类型不同永远不会相等",{"2":{"41":1,"547":1}}],["而1",{"2":{"40":1,"546":1}}],["而给其设置age属性后重新获取却为undefined",{"2":{"38":1,"544":1}}],["而拆箱则将包装类型转换为对应的基础类型",{"2":{"37":1,"543":1}}],["而且还能使得各种功能保持对网络开发者的易用性",{"2":{"977":1}}],["而且",{"2":{"977":1}}],["而且修改了name属性后确实会触发cbs执行",{"2":{"951":1}}],["而且不同方面的配置冗余在一起对于后续维护不够友好",{"2":{"631":1}}],["而且不会有soucemap",{"2":{"408":1}}],["而且父类构造器只会执行一次",{"2":{"582":1}}],["而且需要安装fiddler证书为根证书",{"2":{"438":1}}],["而且市面上破解的很多",{"2":{"411":1}}],["而且刷新浏览器也同样会被代理到本地文件夹哦",{"2":{"407":1}}],["而且cdn自带缓存",{"2":{"130":1}}],["而且所有的when",{"2":{"83":1}}],["而且对象会开辟新的栈",{"2":{"32":1}}],["而且也不是table的正确用法",{"2":{"18":1}}],["而",{"2":{"26":1,"43":1,"328":1,"549":1,"720":1,"837":1}}],["而不像vue2中data还需要额外对render收集一次",{"2":{"934":1}}],["而不会影响容器的启动顺序或依赖关系",{"2":{"1025":1}}],["而不会影响页面的渲染推翻js单线程的理念",{"2":{"526":1}}],["而不会被推到异步更新队列中去",{"2":{"942":1}}],["而不会对实际的安全策略产生影响",{"2":{"350":1}}],["而不会对之前的历史消息造成影响",{"2":{"334":1}}],["而不受对方数据传输的影响",{"2":{"384":1}}],["而不应该对资源进行修改",{"2":{"320":1}}],["而不需要使用联合文件系统",{"2":{"1110":1}}],["而不需要频繁改ip地址的问题",{"2":{"1090":1}}],["而不需要重新渲染整个应用",{"2":{"953":1}}],["而不需要定义",{"2":{"608":1}}],["而不需要等待一个一个确认",{"2":{"387":1}}],["而不需要等待对方的回复",{"2":{"384":1}}],["而不需要等待某个请求或响应的完成",{"2":{"324":1}}],["而不需要客户端频繁地向服务器发送请求",{"2":{"354":1}}],["而不需要替换整个资源",{"2":{"320":1}}],["而不需要依赖于rarp服务器",{"2":{"301":1}}],["而不需要和所有飞机通信",{"2":{"208":1,"758":1}}],["而不用再次发送arp请求",{"2":{"298":1}}],["而不只是第一个jsstr",{"2":{"138":1,"887":1}}],["而不是defineproperty中的那个闭包dep",{"2":{"955":1}}],["而不是array整体原型",{"2":{"955":1}}],["而不是整个应用",{"2":{"953":1}}],["而不是run函数",{"2":{"934":1}}],["而不是获取整个文件",{"2":{"344":1}}],["而不是标识该资源的位置",{"2":{"316":1}}],["而不是相互引用",{"2":{"208":1,"758":1}}],["而不是匹配到第一个就停止匹配",{"2":{"152":1,"901":1}}],["而不是",{"2":{"145":2,"894":2}}],["而不是对象本身",{"2":{"28":1}}],["而不是堆中的数据",{"2":{"26":1}}],["而不复制对象本身",{"2":{"25":1}}],["和域名中使用",{"2":{"1121":1}}],["和项目中构建执行的唯一",{"2":{"1121":1}}],["和其他如镜像",{"2":{"1112":1}}],["和其他ide调试类似",{"2":{"400":1}}],["和临时卷",{"2":{"1111":1}}],["和npm",{"2":{"1106":1}}],["和cmd一样entrypoint命令也是用于指定容器启动时默认要执行的命令",{"2":{"1064":1}}],["和cookie相比session是将认证信息存储在服务器",{"2":{"348":1}}],["和大部分配置文件不同",{"2":{"1051":1}}],["和大小",{"2":{"726":1}}],["和在运行测试后进行一些收尾工作",{"2":{"871":1}}],["和在浏览器调试一模一样",{"2":{"399":1}}],["和端到端测试",{"2":{"851":1}}],["和主题",{"2":{"788":1}}],["和页脚",{"2":{"788":1}}],["和目标服务器连接超时时间",{"2":{"723":1}}],["和前端中使用i18n一样",{"2":{"675":1}}],["和前面重复步骤",{"2":{"532":1}}],["和原型链的概念差不多",{"2":{"591":1}}],["和原数据是否指向同一个对象",{"2":{"26":1}}],["和微任务",{"2":{"531":1,"532":1}}],["和9999",{"2":{"456":1}}],["和fiddler一样",{"2":{"426":1}}],["和firefox",{"2":{"139":1,"325":1,"888":1}}],["和sequence",{"2":{"414":1}}],["和sources一一对应",{"2":{"410":1}}],["和上面一样",{"2":{"401":1}}],["和上面的",{"2":{"221":1}}],["和accept队列",{"2":{"380":1}}],["和http没有半点关系",{"2":{"354":1}}],["和对图片请求真实资源的管理",{"2":{"250":1}}],["和对象数据类型",{"2":{"24":1}}],["和工厂者模式相比",{"2":{"202":1,"752":1}}],["和重要的配置",{"2":{"191":1}}],["和x",{"2":{"148":1,"897":1}}],["和outerhtml区别",{"0":{"122":1}}],["和outerhtml",{"2":{"115":1}}],["和距离第二行的垂直距离是一样的",{"2":{"110":1}}],["和ifc",{"2":{"102":1}}],["和第三张表联表的方式可以是右联还可以是自联",{"2":{"87":1}}],["和unix密码加密过程使用不同的算法",{"2":{"83":1}}],["和==的转换",{"2":{"46":1,"552":1}}],["和",{"2":{"25":1,"30":1,"117":2,"132":1,"139":2,"168":1,"183":1,"329":2,"333":2,"337":1,"350":3,"353":1,"498":1,"687":1,"710":1,"720":2,"785":1,"830":1,"869":1,"875":1,"888":2,"955":1,"965":1,"980":1,"995":1,"1002":1,"1005":1,"1011":1,"1013":1,"1014":1,"1018":1,"1065":1,"1081":1,"1121":3,"1164":1}}],["会议开始了包括深圳",{"2":{"1233":1}}],["会议室中坐在我旁边的有后端的同事",{"2":{"1233":1}}],["会从远程拉取镜像",{"2":{"1094":1}}],["会从这些任务队列中取出待执行的任务",{"2":{"527":1}}],["会覆盖旧的镜像",{"2":{"1002":1}}],["会访问组件实例vm中的数据",{"2":{"954":1}}],["会访问外层的作用域",{"2":{"591":1}}],["会触发getter函数然后通过当前属性的dep收集当前的watcher渲染watcher",{"2":{"953":1}}],["会触发内部的close属性方法",{"2":{"516":1}}],["会触发内部的abort属性方法",{"2":{"516":1}}],["会涉及到大量的分析和调试",{"2":{"948":1}}],["会涉及到string",{"2":{"43":1,"549":1}}],["会立即执行run得到最新的值然后执行cb",{"2":{"942":1}}],["会立即执行一次",{"2":{"938":1,"939":1}}],["会进入更新队列",{"2":{"938":1}}],["会返回一个函数",{"2":{"938":1}}],["会取到methods上的方法",{"2":{"937":1}}],["会派发更新通知number的dep中的所有effect进行更新",{"2":{"934":1}}],["会导致编译速度变慢",{"2":{"809":1}}],["会检查提交信息是否符合这些规则",{"2":{"795":1}}],["会划分一定的时间",{"2":{"773":1}}],["会出现类型冲突的错误",{"2":{"882":1}}],["会出现超时",{"2":{"766":1}}],["会出现无法正常进行测试的情况",{"2":{"221":1}}],["会提示输入一些信息",{"2":{"726":1,"1178":1}}],["会受到硬件的配置影响",{"2":{"709":1}}],["会得到json数据",{"2":{"613":1}}],["会创建全局上下文并推入执行栈中",{"2":{"593":1}}],["会以整体script代码为基础创建全局上下文",{"2":{"592":1}}],["会记住自己的当前的作用域",{"2":{"591":1}}],["会对所有文件进行格式化",{"2":{"839":1}}],["会对所有的请求进行解码操作",{"2":{"431":1}}],["会对每个变量",{"2":{"590":1}}],["会被保留在本地",{"2":{"1002":2}}],["会被提前到所有普通变量声明前进行声明",{"2":{"587":1}}],["会被存放到指定的任务队列中",{"2":{"527":1}}],["会拥有父类相同的实例属性",{"2":{"580":1}}],["会造成数据之间的污染和篡改",{"2":{"577":1}}],["会先查看当前对象是否存在此属性",{"2":{"571":1}}],["会先以最前面一个规则来排序",{"2":{"81":1}}],["会非常耗时",{"2":{"559":1}}],["会交给定时器线程去执行",{"2":{"533":1}}],["会交给别的线程去执行异步任务",{"2":{"527":1}}],["会认为自己发的fin报文可能客户端没有收到",{"2":{"457":1}}],["会判断自己是不是这个发送者寻找的ip",{"2":{"454":1}}],["会发现绑定了vip",{"2":{"728":1}}],["会发现没有任何反应",{"2":{"524":1}}],["会发现已经抓到了",{"2":{"439":1}}],["会发现啥记录都没有",{"2":{"438":1}}],["会发现结果并不理想",{"2":{"150":1,"899":1}}],["会看到请求头中会携带刚刚添加的字段",{"2":{"436":1}}],["会弹出手机的步骤",{"2":{"422":1}}],["会打开本地文件系统让你选择一个文件夹",{"2":{"407":1}}],["会在你的$home",{"2":{"1014":1}}],["会在文件首行断住",{"2":{"401":1}}],["会在打包出的",{"2":{"183":1}}],["会开启node",{"2":{"400":1}}],["会结束调试",{"2":{"399":1}}],["会带上google的域名",{"2":{"353":1}}],["会话密钥将被删除",{"2":{"726":1}}],["会话密钥",{"2":{"332":1}}],["会话层",{"2":{"309":1}}],["会有重传的阈值",{"2":{"390":1}}],["会有很大的安全隐患",{"2":{"330":1}}],["会有默认的图片来占位",{"2":{"242":1}}],["会将各个镜像层以只读的方式合并到一个虚拟的文件系统中",{"2":{"997":1}}],["会将其他文件系统",{"2":{"997":1}}],["会将其他请求折叠进一个文件夹",{"2":{"414":1}}],["会将容器文件系统挂载到主机上",{"2":{"997":1}}],["会将数据发给同一局域网的其他主机",{"2":{"454":1}}],["会将自己的mac地址以单播的形式响应给发送端",{"2":{"296":1}}],["会将请求发送给局域网中的每个主机",{"2":{"296":1}}],["会控制编译的输出",{"2":{"269":1}}],["会执行当前watcher的adddep",{"2":{"954":1}}],["会执行",{"2":{"938":1,"940":1}}],["会执行run也就是执行computed回调函数",{"2":{"934":1}}],["会执行一个实例化parent的操作",{"2":{"580":1}}],["会执行new",{"2":{"532":1}}],["会执行lazy的add方法",{"2":{"245":1}}],["会执行内部的ordinarytoprimitive方法",{"2":{"40":1,"546":1}}],["会实例化一个lazy对象",{"2":{"245":1}}],["会把测试结果写到",{"2":{"219":1}}],["会递归构建一个依赖关系图",{"2":{"171":1}}],["会匹配到第一个`",{"2":{"150":1,"899":1}}],["会影响^",{"2":{"138":1,"887":1}}],["会根据硬件的不同编译出不同的内核",{"2":{"1078":1}}],["会根据",{"2":{"712":1}}],["会根据接收方的确认消息动态调整",{"2":{"387":1}}],["会根据hash不同主动进行资源获取",{"2":{"132":1}}],["会根据拆箱优先级进行拆箱转换为基础类型后",{"2":{"41":1,"547":1}}],["会脱离文档流",{"2":{"111":1}}],["会通过拆箱规则转换",{"2":{"48":1,"554":1}}],["会优先调用valueof方法",{"2":{"40":1,"546":1}}],["会优先调用tostring方法",{"2":{"40":1,"546":1}}],["会拷贝这些值到新的数组里",{"2":{"30":1}}],["会拷贝这个对象引用到新的数组里",{"2":{"30":1}}],["会首先检索其在栈中的地址",{"2":{"24":1}}],["会指向该原始值的自动包装对象",{"2":{"2":1}}],["当过期后可以采用以下方式重新生成token",{"2":{"1216":1}}],["当以上工作都做好了",{"2":{"1178":1}}],["当极狐gitlab",{"2":{"1169":1}}],["当合并请求批准",{"2":{"1122":1}}],["当多个仓库都有同一个包时",{"2":{"1106":1}}],["当仅指定一个端口是",{"2":{"1022":1}}],["当容器需要与宿主机或其他容器进行通信时",{"2":{"1086":1}}],["当容器运行后可以在容器列表中看到",{"2":{"1006":1}}],["当容器启动时",{"2":{"997":1}}],["当对象改变时便通知以来进行更新",{"2":{"968":1}}],["当对应的响应式对象更新时就会触发计算属性的watcher更新",{"2":{"932":1}}],["当key为数字时",{"2":{"961":1}}],["当是数组时在observer中就会对数组进行改写",{"2":{"955":1}}],["当分别改变",{"2":{"955":1}}],["当用户在页面改变值或者其他方法改变某个数据的值时",{"2":{"954":1}}],["当用户在攻击者控制的网站上提交这个表单时",{"2":{"351":1}}],["当组件的data更新时通知渲染watcher更新",{"2":{"954":1}}],["当值变化时通知所有的watcher进行更新",{"2":{"951":1}}],["当new时内部会触发一系列操作如",{"2":{"951":1}}],["当nginx挂了时就会导致所有应用都无法访问",{"2":{"728":1}}],["当修改friends的值时也会执行对应的回调",{"2":{"955":1}}],["当修改age属性值时",{"2":{"951":1}}],["当修改user的属性值时触发set",{"2":{"951":1}}],["当将拆解的模块搞熟搞透了",{"2":{"948":1}}],["当将isstring代码改为",{"2":{"232":1}}],["当watch的对象值改变时会立马执行不需要进入队列异步更新",{"2":{"944":1}}],["当watch监听的key值被修改后就会让dep通知user",{"2":{"938":1}}],["当web应用使用此ip监听时",{"2":{"361":1}}],["当响应式对象setter执行时会通过dep通知user",{"2":{"935":1}}],["当data改变时只会通知计算watcher进行更新",{"2":{"931":1}}],["当domparser对象按指定的mimetype解析错误时",{"2":{"118":1}}],["当触发setter时便通知watcher进行更新",{"2":{"931":1}}],["当测试用例中下载文件时保存的路径",{"2":{"878":1}}],["当cypress",{"2":{"878":1}}],["当client等待2msl内没有收到任何server的包就会被关闭掉",{"2":{"382":1}}],["当client向server疯狂发送syn请求",{"2":{"381":1}}],["当单测某个组件时",{"2":{"875":1}}],["当匹配",{"2":{"857":1}}],["当匹配到",{"2":{"716":1,"857":1}}],["当匹配到结果时",{"2":{"152":1,"901":1}}],["当匹配到`apples",{"2":{"150":1,"899":1}}],["当开发者提交更改时",{"2":{"795":1}}],["当上传过此图片后",{"2":{"772":1}}],["当length等于",{"2":{"772":1}}],["当客户端再次上传时过滤掉已经上传的切片即可",{"2":{"772":1}}],["当客户端请求毕后就会断开连接",{"2":{"457":1}}],["当切片合并完后既可以将完整图片地址响应给客户端",{"2":{"770":1}}],["当切片总大小小于文件大小时还需要继续分片",{"2":{"768":1}}],["当机器宕机时",{"2":{"728":1}}],["当图像大小大于5m时",{"2":{"718":1}}],["当图片的状态不再是loading状态时",{"2":{"242":1}}],["当抛出",{"2":{"718":1}}],["当提交代码时就会自动触发打包机制",{"2":{"703":1}}],["当返回结果为true时表示有权限",{"2":{"648":1}}],["当再次上传同一个文件时又要从头开始删除",{"2":{"772":1}}],["当再次访问路由后",{"2":{"640":1}}],["当再次刷新时cdn全部命中缓存",{"2":{"130":1}}],["当内部作用域引用了外部作用域的参数",{"2":{"594":1}}],["当运行一个新的函数时",{"2":{"593":1}}],["当运行时第一行就会报错not",{"2":{"588":1}}],["当当的任务执行完毕时会从执行栈中弹出",{"2":{"592":1}}],["当赋值prototype为null时",{"2":{"573":1}}],["当函数作为构造函数时",{"2":{"573":1}}],["当手动给原型添加eat方法时",{"2":{"572":1}}],["当改变某个对象的属性值时便会触发setter",{"2":{"953":1}}],["当改变number的值时",{"2":{"934":1}}],["当改变原型对象时",{"2":{"571":1}}],["当改变实例或者静态属性的定义顺序",{"2":{"233":1}}],["当所有节点都没有问题时keepalived会将访问导向priority优先级最高的节点上",{"2":{"728":1}}],["当所有微任务执行完后",{"2":{"536":1}}],["当所有的写入操作结束后表示结束",{"2":{"512":1}}],["当遇到一个函数时会为函数创建新的执行上下文",{"2":{"592":1}}],["当遇到异步任务时",{"2":{"536":1}}],["当遇到js脚本",{"2":{"526":1}}],["当程序遇到settimeout后",{"2":{"533":1}}],["当指定了时间后执行",{"2":{"533":1}}],["当指定转换类型为number时",{"2":{"40":1,"546":1}}],["当指定转换类型为string时",{"2":{"40":1,"546":1}}],["当这些异步任务执行完毕后",{"2":{"527":1}}],["当这些主机向虚假ip地址发送数据包时",{"2":{"304":1}}],["当js执行代码时",{"2":{"527":1}}],["当流填充内部队列的所需大小从非正数变为正数时兑现",{"2":{"516":1}}],["当流被取消时触发",{"2":{"510":1}}],["当huawei",{"2":{"454":1}}],["当p1想和p2通信时",{"2":{"454":1}}],["当perferedtype为空时",{"2":{"40":1,"546":1}}],["当perferedtype为number时返回number条件结果",{"2":{"40":1,"546":1}}],["当perferedtype为string时",{"2":{"40":1,"546":1}}],["当进来时会进入欢迎页面",{"2":{"452":1}}],["当进行类型转换时会首先判断有没有symbol",{"2":{"40":1,"546":1}}],["当打开抖音app发现抓取不到信息",{"2":{"439":1}}],["当打开网站时发现",{"2":{"129":1}}],["当打了断点时",{"2":{"436":1}}],["当选择好对应的配置后",{"2":{"436":1}}],["当抓包是会显示capturing",{"2":{"435":1}}],["当请求时返回一下结果",{"2":{"637":1}}],["当请求url地址中包含xxx时命中断点",{"2":{"434":1}}],["当请求是这个域名时",{"2":{"419":1}}],["当断点卡主时",{"2":{"431":1}}],["当你需要在不同的组创建包时",{"2":{"1186":1}}],["当你开启了https需要配置ssl证书",{"2":{"1178":1}}],["当你更改了runner的配置文件后",{"2":{"1160":1}}],["当你创建了某个blobstore就会某个关联的repository的内容存储到这里",{"2":{"1097":1}}],["当你了解原型链和new的原理相信一看就懂",{"2":{"577":1}}],["当你执行后会发现打印的时间已经远超1s",{"2":{"533":1}}],["当你下载安装完fiddler双击打开后",{"2":{"429":1}}],["当你卸载哪个版本的node时",{"2":{"96":1}}],["当熟悉以后就不需要这么麻烦了",{"2":{"414":1}}],["当浏览器发起http请求时",{"2":{"404":1}}],["当浏览器运行时就会弹出",{"2":{"350":1}}],["当监听子节点变化时",{"2":{"404":1}}],["当x",{"2":{"404":1}}],["当执行上面命令后",{"2":{"1172":1}}],["当执行当前get方法获取到响应式对应的value时",{"2":{"941":1}}],["当执行cypress",{"2":{"878":1}}],["当执行c1",{"2":{"579":1}}],["当执行以下命令时提示没有可用的安装包",{"2":{"707":1}}],["当执行app方法时可以正确的打印出name的值",{"2":{"591":1}}],["当执行这个匿名函数时总是会打印出outer",{"2":{"590":1}}],["当执行栈中的代码执行完后",{"2":{"533":1}}],["当执行完函数式",{"2":{"529":1}}],["当执行到这里时",{"2":{"404":1}}],["当执行此方法时会隐式的将name转换为对象name",{"2":{"38":1,"544":1}}],["当接受到1个ack后",{"2":{"393":1}}],["当接受方收到数据后重新进行组装",{"2":{"385":1}}],["当拥塞窗口大小达到一个阈值时",{"2":{"393":1}}],["当超过了这个值就会断开tcp连接",{"2":{"390":1}}],["当超时重传时会把定时器的时间设置为上一次的2倍",{"2":{"390":1}}],["当发送端认为接收端可能出现数据丢失时",{"2":{"391":1}}],["当发送方发送一个报文后在指定的时间内没有收到另一方的响应后",{"2":{"388":1}}],["当发生了一个重要事件的时候发布者会通知",{"2":{"195":1,"745":1}}],["当窗口的前部分被确认后",{"2":{"387":1}}],["当ip层所传输的数据大小大于mtu时就会进行ip分片",{"2":{"386":1}}],["当tcp发送方收到这些反馈信息时",{"2":{"392":1}}],["当tcp发送一个数据包时会启用一个定时器进行倒计时",{"2":{"390":1}}],["当tcp在指定时间不发送任何数据",{"2":{"384":1}}],["当ttl=0时还没有到达目的地时",{"2":{"368":1}}],["当ttl值减少到0时",{"2":{"368":1}}],["当syn队列溢出时",{"2":{"381":1}}],["当服务器收到客户端第三次握手的ack请求后",{"2":{"380":1}}],["当他们的值为1时都表示一定的含义",{"2":{"376":1}}],["当序号超过最大值又会从0开始",{"2":{"376":1}}],["当目标主机找到后",{"2":{"454":1}}],["当目标主机响应源主机时",{"2":{"296":1}}],["当目标设备接收到分片的ip数据包时",{"2":{"369":1}}],["当数据发生变化时",{"2":{"968":1}}],["当数据包经过交换机时ttl的值并不会减去1",{"2":{"368":1}}],["当数据量大时会消耗很多资源",{"2":{"348":1}}],["当网络规模增大时",{"2":{"364":1}}],["当网络中的其他主机接收到arp请求包时",{"2":{"304":1}}],["当访问时返回code和时间戳jsconst",{"2":{"1034":1}}],["当访问时会走本机的内部网卡访问本机的服务",{"2":{"361":1}}],["当访问当前页面时就会debug",{"2":{"966":1}}],["当访问某个属性时",{"2":{"955":1}}],["当访问",{"2":{"710":1,"1034":1}}],["当访问本机地址时会转发到路由器再转发到本机地址",{"2":{"361":1}}],["当小明点击了黑客的链接后跳转到黑客页面后自动提交表单发起转账请求",{"2":{"352":1}}],["当受害人登录后点击黑客发布的链接",{"2":{"352":1}}],["当设置了这个属性后",{"2":{"942":1}}],["当设置了httponly后",{"2":{"347":1}}],["当设备需要与该ip地址对应的设备进行通信时",{"2":{"298":1}}],["当maxage位0时表示要清楚当前cookie",{"2":{"347":1}}],["当需要下载大文件时",{"2":{"344":1}}],["当需要加载真实资源时",{"2":{"244":1}}],["当使用包含",{"2":{"1065":1}}],["当使用不存在的自定义的网络时",{"2":{"1022":1}}],["当使用docker",{"2":{"1014":1}}],["当使用",{"2":{"1002":1}}],["当使用wireshark抓包时难免会有大量的抓包记录",{"2":{"453":1}}],["当使用http2时头部长度已经压缩为64字节",{"2":{"326":1}}],["当使用vue时也是如此",{"2":{"951":1}}],["当使用v",{"2":{"245":1}}],["当一些密码忘记后",{"2":{"1174":1}}],["当一些静态资源设置了缓存时",{"2":{"325":1}}],["当一个请求或响应被阻塞时",{"2":{"727":1}}],["当一个子类修改父类中的属性或方法时",{"2":{"577":1}}],["当一个新的数据准备好写入底层接收器时调用此方法",{"2":{"514":1}}],["当一个客户端请求与服务器建立tcp连接时",{"2":{"380":1}}],["当一个主机需要与另一个不在同一子网内的主机通信时",{"2":{"302":1}}],["当一个主机需要向另一个主机发送数据包时",{"2":{"295":1}}],["当一个网络设备启动时",{"2":{"301":1}}],["当同一个连接同时请求多个资源时",{"2":{"322":1}}],["当时还有点懵逼我这边开发只有我和我对面两个同事参会",{"2":{"1233":1}}],["当时美国国防部的arpa",{"2":{"310":1}}],["当时",{"2":{"309":1}}],["当时加载快20s",{"2":{"129":1}}],["当在网页上提交表单",{"2":{"303":1}}],["当在ie时",{"2":{"247":1}}],["当源主机发送数据时就会将数据发送到错误的主机上",{"2":{"303":1}}],["当通信终止一段时间后",{"2":{"299":1}}],["当表满了时",{"2":{"298":1}}],["当每个主机接收到arp请求后发现目标ip不是自己",{"2":{"296":1}}],["当没有时会想局域网中发送arp广播请求",{"2":{"296":1}}],["当主机a需要和主机c进行通讯时",{"2":{"296":1}}],["当babel编译时文件会在当前路径及向上找",{"2":{"268":1}}],["当家在完毕或失败时",{"2":{"248":1}}],["当后面的图片进行请求时",{"2":{"248":1}}],["当不同的主机接受到广播包后",{"2":{"454":1}}],["当不用的时候记得关掉面板规则",{"2":{"436":1}}],["当不支持intersectionobserver时",{"2":{"247":1}}],["当不指定",{"2":{"40":1,"546":1}}],["当元素处于交叉状态时",{"2":{"245":1}}],["当注册插件时",{"2":{"245":1}}],["当达到慢启动的阈值时就会进入拥塞避免算法",{"2":{"394":1}}],["当达到条件时",{"2":{"242":1}}],["当达到某种条件时获取真实的图片",{"2":{"242":1}}],["当真实图片加载失败时",{"2":{"242":1}}],["当真实的图片获取成功时",{"2":{"242":1}}],["当删除自定义验证器",{"2":{"232":1}}],["当其中的一个对象发生改变时",{"2":{"208":1,"758":1}}],["当我们使用docker",{"2":{"1063":1}}],["当我们在容器中运行命令时",{"2":{"1056":1}}],["当我们试图调用模块或者对象的某个接口时",{"2":{"206":1,"756":1}}],["当我们把一个对象赋值给一个新的变量时",{"2":{"26":1}}],["当直接访问本体不方便或者不符合需要时",{"2":{"199":1,"749":1}}],["当事件名和回调函数相同时",{"2":{"195":1,"745":1}}],["当到快到底部时",{"2":{"133":1}}],["当点击具体的抓包信息后",{"2":{"436":1}}],["当点击按钮时就会报错",{"2":{"408":1}}],["当点击删除自己就会监听到",{"2":{"404":1}}],["当点击更新当前元素属性时如下图所示",{"2":{"404":1}}],["当点击上面的删除节点时就会被监听到",{"2":{"404":1}}],["当点击不同的按钮对ul进行增删改查",{"2":{"404":1}}],["当点击文章跳转到详情页时",{"2":{"131":1}}],["当点击某篇文章时需要等待20s时间",{"2":{"129":1}}],["当前项目当前分支下的文件",{"2":{"1142":1}}],["当前项目的",{"2":{"1121":1}}],["当前面阶段出现失败时执行",{"2":{"1131":1}}],["当前流水线的项目级",{"2":{"1121":1}}],["当前流水线的实例级",{"2":{"1121":1}}],["当前admin用户",{"2":{"1096":1}}],["当前activefn为",{"2":{"951":4}}],["当前示例的render属性",{"2":{"954":1}}],["当前watcher为栈最后一个",{"2":{"954":1}}],["当前正在运行的函数",{"2":{"951":1,"959":1}}],["当前属性的值",{"2":{"937":1}}],["当前属性名称",{"2":{"229":1}}],["当前计算属性函数执行完后就会将dep",{"2":{"932":1}}],["当前的watcher",{"2":{"954":1}}],["当前的dep",{"2":{"931":1}}],["当前的读取状态",{"2":{"504":1}}],["当前chunk的写入位置",{"2":{"770":1}}],["当前连接请求的文件路径",{"2":{"729":1}}],["当前运行的",{"2":{"729":1}}],["当前请求重试10次",{"2":{"771":1}}],["当前请求在",{"2":{"729":1}}],["当前请求断点",{"2":{"419":1}}],["当前节点设置为master",{"2":{"728":1}}],["当前代码块中",{"2":{"588":1}}],["当前代码块作用域中声明了",{"2":{"588":2}}],["当前执行栈清空会先执行所有的微任务",{"2":{"536":1}}],["当前数据块",{"2":{"512":1}}],["当前file的最后修改时间",{"2":{"500":1}}],["当前其实已经可以抓取手机包了",{"2":{"422":1}}],["当前为响应断点",{"2":{"419":1}}],["当前页面从不同的层次列出了前端知识学习路线",{"2":{"271":1}}],["当前模块相同的配置会覆盖全局配置",{"2":{"130":1}}],["当前位于哪页",{"2":{"63":1}}],["当然了你可能不会自己删除",{"2":{"1109":1}}],["当然在测试构建时分开写更容易排查构建错误",{"2":{"1058":1}}],["当然在以上的例子中确实每次都要手动赋值",{"2":{"951":1}}],["当然只是笼统的梳理下响应式的过程",{"2":{"964":1}}],["当然需要你多动动手多写几个例子",{"2":{"956":1}}],["当然组件创建或render是个递归过程",{"2":{"953":1}}],["当然是谁使用了当前对象的属性就收集时",{"2":{"950":1}}],["当然一般也用不到这个选项",{"2":{"932":1}}],["当然computed也是有缓存的功能",{"2":{"934":1}}],["当然computed",{"2":{"927":1}}],["当然会报错",{"2":{"587":1}}],["当然会改变其中的值",{"2":{"579":1}}],["当然对提升自己对js的认识也有很大的帮助",{"2":{"585":1}}],["当然对象类型转换为基础类型要学会前面讲的拆箱规则",{"2":{"41":1,"547":1}}],["当然用户也不知道可以做什么",{"2":{"524":1}}],["当然你若已经对js已经有了很深的理解了",{"2":{"477":1}}],["当然你可以上网搜索破解版",{"2":{"428":1}}],["当然这个方法已经改写了",{"2":{"956":1}}],["当然这里对于语法规范及质量要求只是个辅助工具",{"2":{"823":1}}],["当然这里主要还是讲wireshark怎么抓取arp数据包",{"2":{"454":1}}],["当然这种方式也会造成服务器负载压力过大",{"2":{"766":1}}],["当然这只是简单的讲解",{"2":{"458":1}}],["当然这些功能都有对应的快捷键",{"2":{"414":1}}],["当然如果你熟练操作网络可以没有任何限制",{"2":{"449":1}}],["当然还有一些功能需要自己去查看",{"2":{"437":1}}],["当然本篇也是挑了一些必懂的使用方法",{"2":{"426":1}}],["当然不会无线重传下去",{"2":{"390":1}}],["当然黑客不可能发布这么明显的链接",{"2":{"352":1}}],["当然可以在这里判断如果manager的状态已经不是loading",{"2":{"245":1}}],["当然前端的知识是最多的",{"2":{"1223":1}}],["当然前提是参数不能为空的",{"2":{"232":1}}],["当然前面还有`than",{"2":{"150":1,"899":1}}],["当然要提交代码到github了",{"2":{"126":1}}],["当然中间也有不少的挫折",{"2":{"124":1}}],["当然",{"2":{"85":1}}],["当end结束了所有外部的case块时",{"2":{"83":1}}],["当",{"2":{"28":1,"171":1,"529":3,"997":1}}],["当解释器寻找引用值时",{"2":{"24":1}}],["当被调用时",{"2":{"5":1}}],["中午部门一起出去吃了分手饭",{"2":{"1233":1}}],["中构建执行的唯一",{"2":{"1121":1}}],["中执行的所有作业",{"2":{"1121":3}}],["中安装",{"2":{"1103":1}}],["中设置的健康检查参数",{"2":{"1066":1}}],["中指定的",{"2":{"1065":2}}],["中指定的命令",{"2":{"1063":1}}],["中使用了多个",{"2":{"1063":1}}],["中只能使用一条",{"2":{"1063":1}}],["中只有bfc和ifc",{"2":{"102":1}}],["中没有使用",{"2":{"1056":1}}],["中下载和使用其他用户共享的镜像",{"2":{"1011":1}}],["中处理",{"2":{"964":1}}],["中会执行此方法",{"2":{"954":1}}],["中划线",{"2":{"850":1}}],["中比较有意义",{"2":{"729":1}}],["中定义的字段",{"2":{"720":2}}],["中进行获取",{"2":{"717":1}}],["中文",{"2":{"676":1}}],["中间是操作系统",{"2":{"1078":1}}],["中间是固定内容",{"2":{"85":1}}],["中间使用斜杠",{"2":{"1012":1}}],["中间件",{"2":{"670":1}}],["中断读取",{"2":{"506":1}}],["中查看",{"2":{"354":1}}],["中奖",{"2":{"352":1}}],["中展示",{"2":{"350":1}}],["中",{"2":{"320":1,"324":1,"325":1,"498":1,"722":1,"977":1,"997":1,"1002":1,"1003":1,"1011":1,"1065":1,"1066":1,"1075":1,"1152":1,"1206":1}}],["中介者模式使用场景",{"2":{"208":1,"758":1}}],["中介者模式",{"0":{"208":1,"758":1}}],["中增加引用注释",{"2":{"183":1}}],["中的动作",{"2":{"729":1}}],["中的正则匹配",{"2":{"711":1}}],["中的每个字节视为",{"2":{"485":1}}],["中的内容",{"2":{"479":1}}],["中的一些缺陷和漏洞",{"2":{"329":1}}],["中的一些安全漏洞做了修复",{"2":{"329":1}}],["中的一些设置",{"2":{"183":1}}],["中的",{"2":{"139":12,"888":12}}],["中的数据",{"2":{"24":1}}],["中我们进行打包时",{"2":{"130":1}}],["中与表1所取数据相对应的所有数据",{"2":{"86":2}}],["中所有数据和表2",{"2":{"86":2}}],["中国标准时间",{"2":{"40":1,"41":1,"44":1,"546":1,"547":1,"550":1}}],["中找到",{"2":{"40":1,"546":1}}],["中还有很多同学不知道为什么",{"2":{"22":1}}],["数值",{"2":{"830":1}}],["数值越大",{"2":{"728":1}}],["数量大",{"2":{"709":1}}],["数组处理逻辑",{"2":{"964":1}}],["数组时",{"2":{"956":1}}],["数组改写方法中通过this拿到ob",{"2":{"955":1}}],["数组的dep又是如何收集到watcher的",{"2":{"955":1}}],["数组的长度",{"2":{"484":1}}],["数组实现",{"0":{"955":1}}],["数组",{"2":{"944":1}}],["数组和字符串",{"2":{"937":1}}],["数组类型表示一个",{"2":{"482":1}}],["数组直到里边都是基本数据类型",{"2":{"33":1}}],["数学函数",{"2":{"83":1}}],["数据仍然可以保留",{"2":{"1110":1}}],["数据卷可以实现高效的数据管理和迁移",{"2":{"1117":1}}],["数据卷可以在容器之间传递数据",{"2":{"1110":1}}],["数据卷相比使用容器储存来讲的好处有",{"2":{"1110":1}}],["数据卷也不会受到影响",{"2":{"1110":1}}],["数据卷在",{"2":{"1110":1}}],["数据卷是",{"2":{"1110":1}}],["数据卷",{"2":{"1019":1,"1022":4,"1110":1,"1111":1,"1113":1}}],["数据时",{"2":{"955":1}}],["数据正在被加载",{"2":{"504":1}}],["数据还是重传所有的问题",{"2":{"391":1}}],["数据可以沿着两个方向同时传输",{"2":{"384":1}}],["数据计算得到的校验和",{"2":{"376":1}}],["数据偏移",{"2":{"376":1}}],["数据包将通过容器内部的",{"2":{"1086":1}}],["数据包将会被抛弃掉",{"2":{"368":1}}],["数据包将被丢弃",{"2":{"368":1}}],["数据包的接收者的ip",{"2":{"367":1}}],["数据包的发送者的ip",{"2":{"367":1}}],["数据包会被发送到错误的mac地址",{"2":{"304":1}}],["数据帧由帧头和帧体组成",{"2":{"354":1}}],["数据丢失等严重后果",{"2":{"349":1}}],["数据同源",{"2":{"336":1}}],["数据和网络三个层面均有体现",{"2":{"336":1}}],["数据链路层负责将数据包封装成帧并发送到物理层",{"2":{"310":1}}],["数据链路层",{"2":{"309":1,"310":1,"312":1}}],["数据都会以明文的形式传输",{"2":{"303":1}}],["数据传输过程中不加密",{"2":{"328":1}}],["数据传输",{"0":{"341":1,"385":1},"1":{"342":1,"343":1,"344":1,"345":1,"386":1,"387":1},"2":{"276":1}}],["数据收集等等",{"2":{"230":1}}],["数据库配置",{"2":{"669":1}}],["数据库查询等",{"2":{"316":1}}],["数据库名字",{"2":{"72":1,"73":2}}],["数据库操作等",{"2":{"854":1}}],["数据库操作",{"2":{"72":1}}],["数据存储也是一项很重要的技术",{"2":{"67":1}}],["数据分为基本数据类型",{"2":{"24":1}}],["数据类型",{"0":{"24":1}}],["数字与字符串的转换问题",{"2":{"825":1}}],["数字或者下划线",{"2":{"139":1,"888":1}}],["数字及布尔值来说",{"2":{"30":1}}],["数字",{"2":{"2":1,"41":1,"547":1}}],["希望在外的每一个人还是提高警惕注意防护",{"2":{"1236":1}}],["希望通过本文可以让你对js有更深的认识",{"2":{"596":1}}],["希望通过这些抓包工具可以提高你的分析能力和对原理的认识",{"2":{"460":1}}],["希望可以帮助到你😏",{"2":{"271":1}}],["希望这些可以帮到你",{"2":{"424":1}}],["希望这些文章对你也有所帮助😊",{"2":{"252":1}}],["希望这些同学好好补习下css基础",{"2":{"22":1}}],["希望读完后自己动手实践",{"2":{"233":1}}],["希望以上的解析还可以帮助你进一步理解三者的概念和使用方法",{"2":{"10":1}}],["我猜自己可能早就阳了只是这次空调成为诱因吧",{"2":{"1236":1}}],["我二🐑了",{"0":{"1236":1},"2":{"1236":1}}],["我还很自觉的新建了一个文件来记录今日的会议内容",{"2":{"1233":1}}],["我心里也感觉的很万幸",{"2":{"1232":1}}],["我心里就有不好的感觉",{"2":{"1232":1}}],["我给憋回去了",{"2":{"1232":1}}],["我妈说医生通知半个月后就可以办理出院了",{"2":{"1232":1}}],["我妈说我爸疼的都叫起来了",{"2":{"1232":1}}],["我妈说不用让我着急",{"2":{"1232":1}}],["我也顿时反应过来要裁员了",{"2":{"1233":1}}],["我也赶上了裁员",{"0":{"1233":1}}],["我也知道我们这些年轻人在外上班其实也挺累的",{"2":{"1232":1}}],["我也在网上翻阅了很多资料和百科",{"2":{"1232":1}}],["我也是很无语",{"2":{"22":1}}],["我都已经毕业工作了",{"2":{"1232":1}}],["我当时还劝说没必要了",{"2":{"1232":1}}],["我爸这么要强的人也疼的叫起来我内心是真的很难受",{"2":{"1232":1}}],["我爸妈就想着怎么解决当前不景气的现象",{"2":{"1232":1}}],["我爸可以说是一位老牌资深汽修人员",{"2":{"1232":1}}],["我爸脚受伤了",{"0":{"1232":1}}],["我顿时就鸡皮疙瘩起来了",{"2":{"1232":1}}],["我看见一个陌生的环境",{"2":{"1232":1}}],["我叫卫恒帅",{"2":{"1223":1}}],["我只记到这里了",{"2":{"1078":1}}],["我这里配置了其他的",{"2":{"1045":1}}],["我有$",{"2":{"951":2}}],["我的朋友",{"2":{"955":1}}],["我的回答是必须的",{"2":{"951":1}}],["我的名字",{"2":{"201":1,"751":1,"951":2,"959":2,"960":2,"963":1}}],["我是一段文本信息",{"2":{"499":1}}],["我会考虑建个微信交流群",{"2":{"1224":1}}],["我会及时添加的",{"2":{"1229":1}}],["我会及时处理的",{"2":{"1225":1}}],["我会及时查看进行修改的",{"2":{"1223":1}}],["我会及时回复解答的",{"2":{"271":1}}],["我会抽空为你解答",{"2":{"477":1}}],["我觉得英文版也很好优化",{"2":{"423":1}}],["我",{"2":{"354":1}}],["我希望在读完这篇文章后",{"2":{"224":1}}],["我不知道下一个节点是谁",{"2":{"205":1,"755":1}}],["我就执行一次",{"2":{"195":1,"745":1}}],["我执行一次后就自动卸载",{"2":{"195":1,"745":1}}],["我设置的",{"2":{"183":1}}],["我自己都嫌弃",{"2":{"129":1}}],["我差点一头撞死😭",{"2":{"129":1}}],["我来个去的蜗牛速度",{"2":{"129":1}}],["我记得那年像大同学一样怀揣着一颗it梦进军了互联网的大门",{"2":{"123":1}}],["我去数据全部被删除了",{"2":{"79":1}}],["我去没一个表",{"2":{"74":1}}],["我们会遇到各种各样的人和事",{"2":{"1237":1}}],["我们会发现表中的数据全被改了",{"2":{"78":1}}],["我们打工人也不必要那么慌",{"2":{"1233":1}}],["我们提供两个完整的系统虚拟化选项",{"2":{"1164":1}}],["我们复现下",{"2":{"1103":1}}],["我们非常熟悉的虚拟机",{"2":{"1078":1}}],["我们去掉以上的cmd命令重新构建镜像",{"2":{"1063":1}}],["我们定义了一个名为web的服务",{"2":{"1024":1,"1025":1}}],["我们定义了两个服务",{"2":{"1023":1}}],["我们定义的watch最终内部会调用原型$watch方法",{"2":{"938":1}}],["我们定义的函数或者get函数",{"2":{"932":1}}],["我们试下",{"2":{"1014":1}}],["我们本地的registry其实也是这样",{"2":{"1011":1}}],["我们从架构可以知道docker是基于c",{"2":{"994":1}}],["我们直接看看它的实现过程",{"2":{"956":1}}],["我们直接看build",{"2":{"237":1}}],["我们接着上面自己实现的响应式举个例子",{"2":{"955":1}}],["我们并没有实现递归组件创建等过程",{"2":{"951":1}}],["我们并不希望整个",{"2":{"184":1}}],["我们使用healthcheck指令设置了容器健康检查的方式",{"2":{"1066":1}}],["我们使用",{"2":{"1065":1,"1066":1,"1068":1}}],["我们使用以下脚本",{"2":{"966":1}}],["我们使用上面的例子简单来验证下",{"2":{"930":1}}],["我们使用的许多库都基于这一强大特性构建",{"2":{"224":1}}],["我们只需要遵循以下的规则即可",{"2":{"784":1}}],["我们只讲runtime+compiler的commonjs版本",{"2":{"238":1}}],["我们也可以根据自己的需求控制错误的格式",{"2":{"639":1}}],["我们用eventloop分析下上面的代码",{"2":{"533":1}}],["我们已经知道异步的macrotask其实会交给其它线程去处理",{"2":{"533":1}}],["我们通过跟踪http数据流看下细节",{"2":{"458":1}}],["我们来简单的实现下这个功能",{"2":{"963":1}}],["我们来优化下文件hash计算",{"2":{"773":1}}],["我们来证明下",{"2":{"583":1}}],["我们来先了解下tcp头部",{"2":{"455":1}}],["我们来验证下端口不可用",{"2":{"382":1}}],["我们的代码使用new",{"2":{"960":1}}],["我们的应用程序可能达不到很高的并发处理请求",{"2":{"380":1}}],["我们的弹窗message",{"2":{"201":1,"751":1}}],["我们知道",{"2":{"1078":1}}],["我们知道docker是典型的c",{"2":{"1069":1}}],["我们知道新属性对于object",{"2":{"958":1}}],["我们知道vue中存在3种watcher分别是",{"2":{"931":1}}],["我们知道nest采用模块化架构",{"2":{"664":1}}],["我们知道js有自己的v8引擎",{"2":{"586":1}}],["我们知道js访问对象的属性时会先访问对象本身是否存在该属性",{"2":{"575":1}}],["我们知道了new做了什么后",{"2":{"576":1}}],["我们知道tcp是个可靠传输协议",{"2":{"385":1}}],["我们知道此类攻击是盗用了受害者的身份信息",{"2":{"353":1}}],["我们知道csrf攻击是通过第三方网站进行攻击的",{"2":{"352":1}}],["我们知道http是个无状态协议",{"2":{"346":1}}],["我们先看initmixin",{"2":{"239":1}}],["我们先来最简单的配置用起",{"2":{"859":1}}],["我们先来看两个例子",{"2":{"26":1}}],["我们先来说直接调用的方式",{"2":{"9":1}}],["我们在reactivity",{"2":{"966":1}}],["我们在package",{"2":{"237":1}}],["我们在以上的配置基础上添加配置",{"2":{"180":1}}],["我们把共享的数据",{"2":{"208":1,"758":1}}],["我们把这些对象称为链中的节点",{"2":{"205":1,"755":1}}],["我们常用的有很多",{"2":{"207":1,"757":1}}],["我们设计很多插件",{"2":{"206":1,"756":1}}],["我们不希望",{"2":{"184":1}}],["我们需要插件",{"2":{"184":1}}],["我们需要用到cross",{"2":{"182":1}}],["我们需要使用",{"2":{"180":1}}],["我们还需要配置",{"2":{"180":1}}],["我们让元素生成bfc",{"2":{"113":1}}],["我们可能发现在条件测试中会需要多个分支",{"2":{"83":1}}],["我们可以查看其具体的操作步骤",{"2":{"994":1}}],["我们可以获取编译期的类型",{"2":{"227":1}}],["我们可以调用它封装好的方法就可以创建对象实例",{"2":{"201":1,"751":1}}],["我们可以根据不同的环境设置特定的webpack配置",{"2":{"190":1}}],["我们可以根据报错信息和此",{"2":{"183":1}}],["我们可以吧这个看做是一页",{"2":{"90":1}}],["我们可以得出以下几点结论",{"2":{"81":1}}],["我们可以很清晰看到对原始数据的影响",{"2":{"26":1}}],["我们一般将程序产生的数据",{"2":{"67":1}}],["我们举个例子",{"2":{"30":1}}],["最新版amd架构",{"2":{"1171":1}}],["最好不用使用虚拟机克隆",{"2":{"1195":1}}],["最好语义明确如",{"2":{"1097":1}}],["最好用",{"2":{"56":1}}],["最上层是软件",{"2":{"1078":1}}],["最底层是硬件",{"2":{"1078":1}}],["最佳规范实践",{"2":{"826":1}}],["最佳实践",{"2":{"214":1}}],["最重要的核心性能提升还是要靠每个人的开发功底",{"2":{"823":1}}],["最重要的还是接口可视化方便任何人的操作",{"2":{"678":1}}],["最近多看到网上各大平台有关编辑器的选择之争",{"2":{"785":1}}],["最近发现很多同学都对css不够重视",{"2":{"22":1}}],["最左边是用户真实ip",{"2":{"723":1}}],["最低版本",{"2":{"717":1}}],["最高",{"2":{"717":1}}],["最下面还展示了下载firefox插件",{"2":{"412":1}}],["最大设置次数2",{"2":{"1132":1}}],["最大请求并发数为10",{"2":{"771":1,"772":1}}],["最大段大小mss",{"2":{"376":1}}],["最大值2的4次方减1",{"2":{"376":1}}],["最大序号为2的32次方",{"2":{"376":1}}],["最大传输单元计算的",{"2":{"386":1}}],["最大传输单元",{"2":{"369":1}}],["最大200kb",{"2":{"181":1}}],["最小的linux内核文件和运行的应用程序",{"2":{"995":1,"1081":1}}],["最小主机位64",{"2":{"364":1}}],["最小子网数为64",{"2":{"364":1}}],["最常用",{"2":{"431":1}}],["最常用的编码方式是通过transfer",{"2":{"343":1}}],["最常见的formatting",{"2":{"102":1}}],["最终以nginx发布",{"2":{"1073":1}}],["最终打包出来的镜像只包含了最后一阶段的文件",{"2":{"1070":1}}],["最终设置容器的启动命令",{"2":{"1070":1}}],["最终生成一个精简的镜像",{"2":{"1070":1}}],["最终还是调用了",{"2":{"956":1}}],["最终会执行watcher的",{"2":{"954":1}}],["最终会单独打包出一个",{"2":{"183":1}}],["最终p1和p2都会添加进去",{"2":{"951":1}}],["最终图像将采用",{"2":{"718":1}}],["最终图像将交错",{"2":{"718":1}}],["最终根据不同环境部署到k8s集群",{"2":{"703":1}}],["最终返回改造好的config",{"2":{"237":1}}],["最多匹配3个ab",{"2":{"141":1,"890":1}}],["最后决定下午请假",{"2":{"1236":1}}],["最后我想说",{"2":{"1232":1}}],["最后我妈发了一句语音过来",{"2":{"1232":1}}],["最后没想到真的出事了",{"2":{"1232":1}}],["最后生成",{"2":{"954":1}}],["最后patch整个vnode生成dom",{"2":{"953":1}}],["最后返回",{"2":{"938":1}}],["最后执行mount",{"2":{"954":1}}],["最后执行watcher的run方法",{"2":{"938":1}}],["最后执行得到值",{"2":{"938":1}}],["最后执行执行",{"2":{"937":1}}],["最后执行完后",{"2":{"934":1}}],["最后执行settimeout",{"2":{"532":1}}],["最后实例化computedrefimpl并返回",{"2":{"934":1}}],["最后计算的值赋值给当前watcher的value",{"2":{"932":1}}],["最后点击保存",{"2":{"1099":1}}],["最后点击保存重启ide",{"2":{"843":1}}],["最后点击创建仓库按钮",{"2":{"1098":1}}],["最后点击安装",{"2":{"68":1}}],["最后服务器将这些小块再拼接成一个整体文件就可以完美解决大文件传输的痛点",{"2":{"767":1}}],["最后一个阶段",{"2":{"1070":1}}],["最后一个值sync和vue2一样",{"2":{"944":1}}],["最后一个第一位是字母或者0",{"2":{"144":1,"893":1}}],["最后一行再次定义已经定义过的global时也会报错",{"2":{"588":1}}],["最后还原标记",{"2":{"558":1}}],["最后再对比下哪里的想法有问题",{"2":{"532":1}}],["最后再等2msl",{"2":{"457":1}}],["最后修改时间date对象",{"2":{"500":1}}],["最后断开连接",{"2":{"457":1}}],["最后会看到已验证",{"2":{"439":1}}],["最后由应用程序接受处理",{"2":{"380":1}}],["最后使用https和域名访问",{"2":{"1178":1}}],["最后使用",{"2":{"280":1}}],["最后进行各种优化完成插件功能",{"2":{"250":1}}],["最后导出vue",{"2":{"238":1}}],["最后导出了vue",{"2":{"238":1}}],["最后匹配到了`oranges",{"2":{"150":1,"899":1}}],["最后查询出结果",{"2":{"87":1}}],["最后用nginx提供http服务",{"2":{"1070":1}}],["最后用",{"2":{"61":1}}],["最后",{"0":{"10":1,"191":1},"2":{"1236":1}}],["最后来说通过",{"2":{"9":1}}],["否则端口号将无法被访问",{"2":{"1062":1}}],["否则需要先安装相关命令",{"2":{"1058":1}}],["否则需要数据就会立刻返回ack",{"2":{"382":1}}],["否则总是重启容器",{"2":{"1025":1}}],["否则计算一次旧的值",{"2":{"944":1}}],["否则都会使用上次的值",{"2":{"932":1}}],["否则为",{"2":{"729":1}}],["否则为object",{"2":{"227":1}}],["否则",{"2":{"720":1}}],["否则将会丢弃",{"2":{"382":1}}],["否则将会抛异常",{"2":{"40":2,"546":2}}],["否则直接丢弃",{"2":{"381":1}}],["否则就创建实例再返回",{"2":{"196":1,"746":1}}],["否则null",{"2":{"154":1,"903":1}}],["否则相反",{"2":{"106":1}}],["否则返回415状态码",{"2":{"718":1}}],["否则返回",{"2":{"154":1,"903":1}}],["否则返回arg1",{"2":{"83":1}}],["否则返回arg2",{"2":{"83":1}}],["否则返回f",{"2":{"83":1}}],["否则返回default",{"2":{"83":2}}],["否则会和第一步一样重新输入账号",{"2":{"1014":1}}],["否则会报错",{"2":{"81":1,"814":1}}],["否则会产生很严重的后果",{"2":{"79":1}}],["否则重设密码会比较麻烦",{"2":{"68":1}}],["否则无法继续请求加密的信息",{"2":{"64":1}}],["否则报错",{"2":{"56":1,"154":1,"903":1}}],["否则抛异常",{"2":{"40":1,"546":1}}],["否则执行tostring方法",{"2":{"40":1,"546":1}}],["否则执行valueof方法",{"2":{"40":1,"546":1}}],["否",{"2":{"22":7,"26":2,"800":1}}],["是我们每个人都必须经历的一段旅程",{"2":{"1237":1}}],["是我们在不经意间触发了什么",{"2":{"100":1}}],["是特殊版本的支持弹性伸缩的",{"2":{"1166":1}}],["是最简单的执行器",{"2":{"1163":1}}],["是最常用的前端打包工具",{"2":{"784":1}}],["是子网的广播地址",{"2":{"1085":1}}],["是子网的网络地址",{"2":{"1085":1}}],["是构建和管理",{"2":{"1077":1}}],["是免费的",{"2":{"1046":1}}],["是付费功能",{"2":{"1046":1}}],["是端口",{"2":{"1039":1}}],["是返回前端页面",{"2":{"1034":1}}],["是重启策略",{"2":{"1025":1}}],["是环境变量的值",{"2":{"1024":1}}],["是环境变量的名称",{"2":{"1024":1}}],["是所依赖的服务名称",{"2":{"1023":1}}],["是服务的配置信息",{"2":{"1020":1}}],["是服务名称",{"2":{"1020":1}}],["是由",{"2":{"1012":1}}],["是命令的参数",{"2":{"1004":1}}],["是容器启动后要运行的命令",{"2":{"1004":1}}],["是要删除的一个或多个容器名称或",{"2":{"1009":1}}],["是要停止的一个或多个容器名称或",{"2":{"1008":1}}],["是要查看日志的容器名称或",{"2":{"1007":1}}],["是要在容器中执行的命令",{"2":{"1005":1}}],["是要执行命令的容器名称或",{"2":{"1005":1}}],["是要创建容器的镜像名称或",{"2":{"1004":1}}],["是要配置在plugins中的",{"2":{"176":1}}],["是的",{"2":{"955":1}}],["是不可能做到的",{"2":{"977":1}}],["是不会触发拦截的",{"2":{"960":1}}],["是不会重新执行计算属性的函数的",{"2":{"930":1}}],["是不是体会到了nestjs的强大了",{"2":{"652":1}}],["是不是很方便",{"2":{"175":1}}],["是不是很简单",{"2":{"48":1,"554":1}}],["是两种常见的测试方法",{"2":{"851":1}}],["是个很好的选择",{"2":{"1165":1}}],["是个数组可以使用",{"2":{"814":1}}],["是个协议簇包含了很多不同层次协议",{"2":{"312":1}}],["是基于服务器时间的绝对时间",{"2":{"720":1}}],["是原型对象的getter",{"2":{"571":1}}],["是原始数据",{"2":{"26":1}}],["是在",{"2":{"486":1}}],["是在不同网络之间进行数据交换的设备",{"2":{"371":1}}],["是web调试的利器",{"2":{"428":1}}],["是位于客户端和服务器端的http代理",{"2":{"428":1}}],["是指由用户自己搭建的",{"2":{"1013":1}}],["是指在构建",{"2":{"1068":1}}],["是指在软件开发中",{"2":{"808":1}}],["是指在网站或服务器端设置一些规则",{"2":{"722":1}}],["是指tcp发送方在未收到确认的情况下等待重传的时间",{"2":{"389":1}}],["是指tcp数据包从发送方发送到收到接收到另一方的ack所需的时间",{"2":{"389":1}}],["是指浏览器向服务器发送的请求",{"2":{"337":2}}],["是报文最大生存时间",{"2":{"382":1}}],["是tcp常见的网络攻击手段",{"2":{"381":1}}],["是明文协议",{"2":{"328":1}}],["是其最重要的特性之一",{"2":{"324":1}}],["是必须学习的协议",{"2":{"307":1}}],["是整个项目范围的配置",{"2":{"268":1}}],["是谷歌开源的一款",{"2":{"214":1}}],["是一些可选的命令选项",{"2":{"1004":1,"1007":1,"1008":1,"1009":1}}],["是一款零配置的打包工具",{"2":{"784":1}}],["是一款面向现代javascript模块的打包工具",{"2":{"784":1}}],["是一款经典的",{"2":{"221":1}}],["是一种特殊的目录",{"2":{"1110":1}}],["是一种纯文本文件",{"2":{"1049":1}}],["是一种基于文件系统的技术",{"2":{"997":1}}],["是一种基于tcp协议的新型网络通信协议",{"2":{"354":1}}],["是一种高效的文件传输方式",{"2":{"709":1}}],["是一种控制字符",{"2":{"462":2}}],["是一种优化tcp传输性能的机制",{"2":{"382":1}}],["是一种用于在多个网络之间转发数据包的设备",{"2":{"371":1}}],["是一种用于将mac地址转换为ip地址的协议",{"2":{"301":1}}],["是一种在计算机网络中常用的协议",{"2":{"374":1}}],["是一种在计算机网络中用于将ip地址映射到mac地址的协议",{"2":{"295":1}}],["是一种在网络路由器上执行的技术",{"2":{"370":1}}],["是一种在ip协议中使用的字段",{"2":{"368":1}}],["是一种网络攻击方法",{"2":{"304":1}}],["是一种网络协议",{"2":{"302":1}}],["是一套被反复使用",{"2":{"194":1,"744":1}}],["是一个linux内核的功能",{"2":{"1202":1}}],["是一个内核级虚拟技术",{"2":{"1078":1}}],["是一个公共的",{"2":{"1012":1}}],["是一个特殊的文件系统",{"2":{"996":1}}],["是一个特殊的ip地址",{"2":{"361":1}}],["是一个开源的容器化平台",{"2":{"992":1}}],["是一个用于管理多个",{"2":{"993":1,"1080":1}}],["是一个用于前端端到端",{"2":{"876":1}}],["是一个用于",{"2":{"855":1}}],["是一个用于检查和强化",{"2":{"842":1}}],["是一个用于维护和定义跨不同编辑器和ide的代码风格和格式的文件",{"2":{"836":1}}],["是一个用于规范",{"2":{"795":1}}],["是一个用于设计",{"2":{"678":1}}],["是一个轻量级的前端构建工具",{"2":{"784":1}}],["是一个高性能的负载均衡技术",{"2":{"1206":1}}],["是一个高性能",{"2":{"704":1}}],["是一个基于",{"2":{"601":1,"662":1}}],["是一个控制字符",{"2":{"462":1}}],["是一个强大的抓包工具",{"2":{"428":1}}],["是一个流量控制机制",{"2":{"387":1}}],["是一个32位二进制数",{"2":{"363":1}}],["是一个前端性能综合监控网站",{"2":{"220":1}}],["是一个数组",{"2":{"176":1}}],["是一个现代",{"2":{"171":1}}],["是一个dom节点",{"2":{"121":1}}],["是默认导出的",{"2":{"184":1}}],["是否能ping通",{"2":{"1218":2}}],["是否有正在运行的函数",{"2":{"964":1}}],["是否可被赋值运算符改变其值",{"2":{"949":1}}],["是否可被枚举",{"2":{"949":1}}],["是否允许属性被删除或修改",{"2":{"949":1}}],["是否按照预期工作",{"2":{"853":1}}],["是否对已经格式化的文件开头插入注释",{"2":{"839":1}}],["是否仅对文件开头有格式化注释的生效",{"2":{"839":1}}],["是否影响相关issue",{"2":{"800":1}}],["是否是不兼容性的改变",{"2":{"800":1}}],["是否返回错误码",{"2":{"721":1}}],["是否必填等等",{"2":{"685":1}}],["是否为全局",{"2":{"628":1}}],["是否忽略env文件",{"2":{"628":1}}],["是否锁定到一个",{"2":{"515":1}}],["是否转换换行符",{"2":{"494":1}}],["是否正在抓包",{"2":{"435":1}}],["是否",{"2":{"177":1,"182":1}}],["是否自动打开浏览器",{"2":{"177":1,"182":1}}],["是否热更新",{"2":{"177":1,"182":1}}],["是否登录",{"2":{"54":1}}],["是什么",{"0":{"171":1},"2":{"178":1}}],["是这个字符串的结束部分",{"2":{"139":1,"888":1}}],["是因为我们的库中没有依赖其他的npm包",{"2":{"1103":1}}],["是因为有些controller没有添加标签就会全部放到default中",{"2":{"687":1}}],["是因为fiddler证书已经被系统根证书信任了",{"2":{"440":1}}],["是因为异步加载的js文件过大",{"2":{"129":1}}],["是因为作为后端路由后可以很好的路由拦截",{"2":{"126":1}}],["是第一行距离顶部距离的两倍",{"2":{"110":1}}],["是用来对用户请求时所带的token信息进行过期验证",{"2":{"64":1}}],["是深拷贝",{"2":{"28":1}}],["是赋值操作得到",{"2":{"26":1}}],["是",{"2":{"22":3,"26":1,"571":1,"720":1,"1011":1,"1113":1,"1121":4,"1198":1,"1203":1}}],["居中元素定宽高固定",{"2":{"22":1}}],["居中元素不定宽高",{"2":{"11":1}}],["肯定又双叒叕该有同学说回字的写法了",{"2":{"22":1}}],["总是执行作业",{"2":{"1131":1}}],["总是重启容器",{"2":{"1025":1}}],["总的来说",{"2":{"997":1,"1091":1}}],["总的配置",{"2":{"130":1}}],["总而言之",{"2":{"785":1}}],["总体来说还好",{"2":{"1232":1}}],["总体来说有点麻烦",{"2":{"401":1}}],["总体来说tcp通信是个复杂的过程",{"2":{"377":1}}],["总体来说配置完觉得挺开心的",{"2":{"124":1}}],["总长度",{"2":{"367":1}}],["总共运行3次",{"2":{"1132":1}}],["总共也就是4个切片4个请求",{"2":{"771":1}}],["总共返回9次",{"2":{"343":1}}],["总共两个元素",{"2":{"12":1}}],["总之熟能生巧",{"2":{"1015":1}}],["总之vue的响应式都是通过拦截对象的setter",{"2":{"968":1}}],["总之都会有一次主动执行",{"2":{"951":1}}],["总之对于vue的使用及核心思想这里都会涉及到",{"2":{"948":1}}],["总之没有typescript也不能没有eslint",{"2":{"826":1}}],["总之万不得已应减少项目中的技术框架数量",{"2":{"786":1}}],["总之多了解一些还是有好处的",{"2":{"678":1}}],["总之功能强大",{"2":{"428":1}}],["总之关于网络中的盲区最好还是填补一下",{"2":{"313":1}}],["总之学习计算机网络是很重要的",{"2":{"313":1}}],["总之搞懂这些协议是非常有用的",{"2":{"312":1}}],["总之",{"2":{"309":1,"344":1,"762":1,"784":1,"786":1,"854":1,"1236":1}}],["总和",{"2":{"195":2,"745":2}}],["总页数",{"2":{"63":1}}],["总数",{"2":{"63":1}}],["总结",{"0":{"22":1,"35":1,"49":1,"135":1,"210":1,"250":1,"305":1,"356":1,"372":1,"395":1,"426":1,"440":1,"541":1,"555":1,"584":1,"596":1,"662":1,"760":1,"776":1,"946":1,"968":1,"1015":1,"1077":1,"1091":1,"1117":1},"2":{"84":1}}],["不积跬步无以至千里",{"2":{"1232":1}}],["不介意的话随意打赏一笔",{"2":{"1227":1}}],["不提供执行器",{"2":{"1169":1}}],["不下载缓存",{"2":{"1138":1}}],["不写默认是读写",{"2":{"1116":1}}],["不推荐",{"2":{"1098":1}}],["不推荐使用",{"2":{"21":1}}],["不指定版本默认latest最新版本",{"2":{"1082":1}}],["不指定镜像tag默认为latest",{"2":{"1053":1}}],["不安全的仓库",{"2":{"1045":1}}],["不重启容器",{"2":{"1025":1}}],["不重要的放后面",{"2":{"324":1}}],["不设置全局配置",{"2":{"879":1}}],["不生成快照",{"2":{"879":1}}],["不生成视频",{"2":{"879":1}}],["不适用单引号",{"2":{"839":1}}],["不存在",{"2":{"797":1}}],["不存在`$2`属性",{"2":{"145":1,"894":1}}],["不兼容修改指的是本次提交修改了不兼容之前版本的api或者环境变量",{"2":{"792":1}}],["不稳定等各种问题",{"2":{"766":1}}],["不包括协议和主机名",{"2":{"729":1}}],["不包含容器依赖的镜像和容器的运行环境等信息",{"2":{"1010":1}}],["不包含容器的元数据和启动命令等信息",{"2":{"1010":1}}],["不包含",{"2":{"996":1}}],["不包含端口",{"2":{"729":1}}],["不包含修饰符",{"2":{"152":1,"901":1}}],["不",{"2":{"729":1}}],["不允许单独打开图片",{"2":{"722":1}}],["不允许通过",{"2":{"338":1}}],["不应该被代理服务器缓存",{"2":{"720":1}}],["不限于跨域",{"2":{"690":1}}],["不合法的值直接return",{"2":{"941":1}}],["不合法就报错提示",{"2":{"632":1}}],["不合法用户",{"2":{"64":1}}],["不用这么麻烦啰嗦",{"2":{"579":1}}],["不用太关心",{"2":{"430":1}}],["不等于",{"2":{"571":1}}],["不影响退出",{"2":{"830":1}}],["不影响代码含义的修改",{"2":{"789":1}}],["不影响页面渲染",{"2":{"526":1}}],["不影响学习",{"2":{"170":1}}],["不像诸如java",{"2":{"524":1}}],["不然会卡顿页面造成假死现象",{"2":{"776":1}}],["不然程序请求将会挂起",{"2":{"633":1}}],["不然nest将会被挂起",{"2":{"614":1}}],["不然其他的也会被阻塞",{"2":{"436":1}}],["不然第一行到第二行的距离",{"2":{"110":1}}],["不带请求参数",{"2":{"729":1}}],["不带参数取消断点",{"2":{"434":1}}],["不带参数时会取消断点",{"2":{"434":1}}],["不带条件",{"2":{"78":1}}],["不怎么用",{"2":{"414":1}}],["不就可以查找到错误位置了吗",{"2":{"408":1}}],["不嫌麻烦的同学可能会在本地重启项目排查",{"2":{"408":1}}],["不仅可以看到你想要的信息",{"2":{"404":1}}],["不仅可以进行算术运算也可以进行字符串的拼接",{"2":{"44":1,"550":1}}],["不管怎么在依赖收集前都是要主动执行一次",{"2":{"951":1}}],["不管页面多大都压缩",{"2":{"717":1}}],["不管是啥都重定向到另一个域名",{"2":{"715":1}}],["不管是内网还是公网",{"2":{"361":1}}],["不管这个函数在哪调用",{"2":{"590":1}}],["不管这个函数最后在哪调用",{"2":{"590":1}}],["不管和你预期的结果是否一样",{"2":{"532":1}}],["不管你是使用什么css预处理器",{"2":{"179":1}}],["不可以执行",{"2":{"1158":1}}],["不可靠协议",{"2":{"357":1}}],["不可否认",{"2":{"221":1}}],["不支持压缩包自动解压",{"2":{"1059":1}}],["不支持远程url文件地址",{"2":{"1059":1}}],["不支持mac",{"2":{"428":1}}],["不支持时为none",{"2":{"344":1}}],["不支持intersectionobserver时直接初始化",{"2":{"247":1}}],["不定长传输",{"0":{"343":1}}],["不定长传输通过传输编码",{"2":{"341":1}}],["不做解释",{"2":{"340":1}}],["不做任何回应",{"2":{"296":1}}],["不满足简单请求的所有条件",{"2":{"337":1}}],["不断更新中",{"2":{"1231":1}}],["不断将任务队列中的任务送入执行栈中执行",{"2":{"592":1}}],["不断读取数据",{"2":{"512":1}}],["不断加强了安全性",{"2":{"329":1}}],["不断优化了网站的加载速度",{"2":{"135":1}}],["不常用",{"2":{"319":1}}],["不要躺平去做一些有意义的事情",{"2":{"1233":1}}],["不要做躺平青年",{"2":{"1232":1}}],["不要忘记上面说过组件在渲染的过程中会执行render函数",{"2":{"954":1}}],["不要在编辑器的择优上浪费时间",{"2":{"785":1}}],["不要classcallcheck",{"2":{"269":1}}],["不要和service",{"2":{"1212":1}}],["不要和",{"2":{"139":1,"144":1,"888":1,"893":1}}],["不输出文档",{"2":{"269":1}}],["不再需要依赖全局的",{"2":{"965":1}}],["不再匹配后面的规则",{"2":{"715":1}}],["不再用location",{"2":{"711":1}}],["不再赘述",{"2":{"670":1}}],["不再继续传输",{"2":{"368":1}}],["不再observe目标",{"2":{"247":1}}],["不再使用intersectionobserver",{"2":{"247":1}}],["不能下床走动",{"2":{"1232":1}}],["不能为空壳及涉及法律等相关反社会的内容",{"2":{"1230":1}}],["不能与only",{"2":{"1136":1}}],["不能是关键字",{"2":{"1124":1}}],["不能通过容器名进行通信",{"2":{"1087":1}}],["不能被分配给主机",{"2":{"1085":1}}],["不能缓存",{"2":{"455":1}}],["不能有",{"2":{"222":1}}],["不能接受函数",{"2":{"32":1}}],["不变装饰器",{"2":{"231":1}}],["不变",{"2":{"197":1,"747":1}}],["不需要交互",{"2":{"1158":1}}],["不需要手动创建和管理",{"2":{"1111":1}}],["不需要看chrome的打印结果",{"2":{"966":1}}],["不需要再兼容大量代码",{"2":{"957":1}}],["不需要inject显式注入",{"2":{"624":1}}],["不需要遍历所有对象",{"2":{"557":1}}],["不需要选择时",{"2":{"453":1}}],["不需要考虑数据的长度和格式",{"2":{"375":1}}],["不需要解析jquery",{"2":{"189":1}}],["不需要打包",{"2":{"185":1}}],["不需要传参数喔",{"2":{"184":1}}],["不删除dll目录下的文件",{"2":{"184":1}}],["不过根据消息后半年的形势会有好转",{"2":{"1233":1}}],["不过手术后要在床上躺着2~3个月",{"2":{"1232":1}}],["不过旧博客都是自己从零搭建的前后端分离项目",{"2":{"1223":1}}],["不过有很多不方便",{"2":{"1190":1}}],["不过不够灵活",{"2":{"1184":1}}],["不过docker默认会使用https进行登录",{"2":{"1045":1}}],["不过已经被废弃掉",{"2":{"1008":1}}],["不过使用的效果并不是很好",{"2":{"813":1}}],["不过使用此功能可以很方便的做到一些有趣的效果",{"2":{"512":1}}],["不过对于以上的代码我们也用到了",{"2":{"684":1}}],["不过在作为bff的情况下也是可以的",{"2":{"667":1}}],["不过一般不常用",{"2":{"1009":1}}],["不过一般不会这样创建对象",{"2":{"573":1}}],["不过一等公民也是有约束的",{"2":{"587":1}}],["不过渲染进程也提供了不同的线程去处理异步任务",{"2":{"526":1}}],["不过要讲明白eventloop这个东东还是要从头说起",{"2":{"523":1}}],["不过也可以是",{"2":{"494":1}}],["不过",{"2":{"357":1,"571":1}}],["不过我使用的不多",{"2":{"184":1}}],["不过我个人觉得这样做只是让bfc的区域不会与float元素区域重叠",{"2":{"111":1}}],["不过呢",{"2":{"184":1}}],["不区分大小写",{"2":{"154":1,"711":1,"903":1}}],["不匹配多",{"2":{"150":1,"899":1}}],["不会包含build阶段的node内容",{"2":{"1070":1}}],["不会删除容器",{"2":{"1030":1}}],["不会走这里",{"2":{"945":1}}],["不会执行",{"2":{"932":1}}],["不会有黑箱操作产生奇怪的问题",{"2":{"669":1}}],["不会实例化父类构造器",{"2":{"582":1}}],["不会实例化父类的构造函数",{"2":{"582":1}}],["不会造成污染",{"2":{"578":1}}],["不会影响到主线程和js引擎线程",{"2":{"527":1}}],["不会阻塞后面代码的执行",{"2":{"527":1}}],["不会与其他设备冲突",{"2":{"370":1}}],["不会检查数据的正确性",{"2":{"367":1}}],["不会对资源造成任何更改",{"2":{"320":1}}],["不会抛出任何异常",{"2":{"118":1}}],["不会被任何方式改变",{"2":{"9":1}}],["不同阶段的按顺序执行",{"2":{"1125":1}}],["不同硬件上的同一操作系统向上提供相同的接口",{"2":{"1078":1}}],["不同这个自己也可以写个逻辑实现",{"2":{"863":1}}],["不同项目之间可以更轻松地共享代码",{"2":{"811":1}}],["不同于浏览器传递的",{"2":{"729":2}}],["不同类型会使用不同的值字段",{"2":{"606":1}}],["不同类型的任务优先级以及执行时机会有所不同",{"2":{"531":1}}],["不同类型的事件触发不同的任务",{"2":{"527":1}}],["不同类型直接会报错",{"2":{"36":1,"542":1}}],["不同手机型号操作有差异",{"2":{"439":1}}],["不同版本可能不同",{"2":{"438":1}}],["不同请求方式断点",{"2":{"436":1}}],["不同源站点无法请求网络数据",{"2":{"336":1}}],["不同源站点无法获取cookie",{"2":{"336":1}}],["不同源的页面无法操作dom",{"2":{"336":1}}],["不同计算机之间的通信必须建立在相同的标准上",{"2":{"307":1}}],["不同环境进行的配置",{"2":{"237":1}}],["不同平台",{"2":{"237":1}}],["不同的研发习惯",{"2":{"810":1}}],["不同的文件内容不一样hash值也就不一样",{"2":{"772":1}}],["不同的节点请注意配置文件中的提示进行修改",{"2":{"728":1}}],["不同的值会明显影响到构建和重新构建的速度",{"2":{"183":1}}],["不同的排序又会是啥样子呢",{"2":{"84":1}}],["不一样就是不同的组",{"2":{"84":1}}],["不是说内部作用域可以访问外部作用域吗",{"2":{"588":1}}],["不是说tcp断开需要4次挥手吗",{"2":{"382":1}}],["不是所有的函数都会在提前声明有自己的实体",{"2":{"587":1}}],["不是一个概念",{"2":{"573":1}}],["不是目标ip的主机丢弃掉数据包",{"2":{"454":1}}],["不是很友好",{"2":{"420":1}}],["不是的都统统禁止掉",{"2":{"353":1}}],["不是土豪但是有点土",{"2":{"123":1}}],["不是",{"2":{"30":1,"1121":1}}],["不是实际的对象",{"2":{"30":1}}],["jbz8f",{"2":{"1217":1}}],["jh",{"2":{"1174":1}}],["jhsd123fg903d",{"2":{"139":1,"888":1}}],["jest最佳实践",{"2":{"883":1}}],["jest官方文档",{"2":{"883":1}}],["jest也可以对vue组件进行测试",{"2":{"875":1}}],["jest还收集代码的测试覆盖率并生成对应的报告",{"2":{"872":1}}],["jest可以通过一个函数转换计时器以便允许你控制时间流量",{"2":{"870":1}}],["jest可以使用多种方式进行异步代码测试",{"2":{"865":1}}],["jest支持浏览器环境",{"2":{"864":1}}],["jest工具包",{"2":{"863":1}}],["jest识别路径映射",{"2":{"861":1}}],["jest来告诉ts对应的jest类型",{"2":{"858":1}}],["jest直接运行ts代码",{"2":{"858":1}}],["jest和",{"2":{"858":1}}],["jest默认使用的是commonjs",{"2":{"858":1}}],["jest中有转义器的概念来帮助它理解编写的代码",{"2":{"858":1}}],["jest的配置还是很多的",{"2":{"857":1}}],["jest模拟的环境",{"2":{"857":1}}],["jest会根据规则一一匹配",{"2":{"857":1}}],["jest",{"0":{"855":1},"1":{"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1},"2":{"665":1,"855":2,"856":1,"857":7,"858":8,"860":2,"862":1,"863":2,"869":1,"870":4,"871":1,"873":2,"875":4,"883":1}}],["jerry",{"2":{"571":3,"577":5}}],["jei",{"2":{"350":1}}],["jeans",{"2":{"251":1}}],["jpeg",{"2":{"717":1,"718":3}}],["jp",{"2":{"251":1}}],["jpg",{"2":{"132":1,"245":2,"249":1,"325":1,"350":1,"717":1,"770":1,"848":1}}],["jpg|jpeg|gif|png|ico|cur|gz|svg|gz|mp3|mp4|ogg|webm",{"2":{"132":1}}],["jan",{"2":{"708":1}}],["ja",{"2":{"673":2}}],["jakearchibald",{"2":{"541":1}}],["jamiebuilds",{"2":{"270":1}}],["japan",{"2":{"251":1}}],["japanese",{"2":{"251":3}}],["jack",{"2":{"251":1,"609":1,"648":1,"839":3,"929":1}}],["java等高级编程语言",{"2":{"586":1}}],["javas",{"2":{"154":2,"903":2}}],["javascript任务运行器",{"2":{"784":1}}],["javascript有string",{"2":{"571":1}}],["javascript元编程",{"0":{"569":1}}],["javascript异步编程",{"0":{"465":1},"1":{"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1}}],["javascript设计模式和开发实践",{"2":{"211":1,"761":1}}],["javascript中的正则是perl的大子集",{"2":{"136":1,"885":1}}],["javascript",{"0":{"444":1},"2":{"32":1,"134":1,"138":2,"145":1,"171":1,"201":2,"237":1,"325":1,"350":6,"508":1,"568":1,"717":1,"751":2,"785":1,"829":2,"833":1,"838":1,"855":1,"887":2,"894":1,"977":2,"1121":1}}],["java>",{"2":{"154":1,"903":1}}],["java",{"2":{"124":1,"145":5,"154":5,"202":1,"752":1,"785":1,"894":5,"903":5}}],["job3",{"2":{"1131":1,"1132":1}}],["job变量的优先级大",{"2":{"1128":1}}],["job变量",{"2":{"1128":1}}],["job2",{"2":{"1124":3,"1129":1,"1131":1,"1132":1,"1136":1,"1138":1,"1148":2}}],["job1",{"2":{"1124":1,"1128":1,"1148":1}}],["job",{"0":{"1124":1},"2":{"661":10,"944":7,"945":1,"1119":3,"1121":15,"1124":1,"1132":8,"1136":1,"1138":1,"1139":2,"1141":2,"1145":1}}],["joi",{"2":{"632":6,"669":6}}],["joiner",{"2":{"462":2}}],["join++",{"2":{"204":1,"754":1}}],["join右边的表格",{"2":{"86":2}}],["join左边的表格",{"2":{"86":2}}],["join",{"0":{"86":1},"2":{"62":1,"86":3,"204":3,"671":1,"695":1,"700":3,"754":3,"769":1,"770":1,"955":1,"960":1,"1214":6,"1215":1,"1216":1}}],["joker",{"2":{"251":1}}],["joy",{"2":{"251":2}}],["joe",{"2":{"207":2,"757":2}}],["j++",{"2":{"204":1,"754":1}}],["j",{"2":{"157":1,"164":1,"204":3,"754":3}}],["jquery|lodash",{"2":{"189":1,"190":1}}],["jquery就没有依赖第三方模块",{"2":{"189":1}}],["jquery",{"2":{"130":4,"185":2,"190":3}}],["jquery等技术",{"2":{"125":1}}],["jwt合法验证",{"2":{"64":1}}],["jwtfromrequest",{"2":{"64":1}}],["jwtstrategy",{"2":{"64":2}}],["jwt",{"2":{"64":9,"1121":4}}],["jwtkey",{"2":{"54":1}}],["juejin",{"2":{"190":1,"568":1,"1230":1}}],["jumper",{"2":{"63":1}}],["justify",{"2":{"20":1,"21":1}}],["js就可以开始测试了",{"2":{"877":1}}],["jsdom包进行安装",{"2":{"864":1}}],["jsdom来模拟node和浏览器环境",{"2":{"857":1}}],["jsdom",{"2":{"857":2}}],["js外只能使用单引号",{"2":{"830":1}}],["js版本",{"2":{"829":1}}],["js形式配置",{"2":{"827":1}}],["js报错",{"2":{"778":1}}],["jsfor",{"2":{"594":2}}],["jsfunction",{"2":{"7":1,"8":1,"9":1,"239":1,"529":1,"535":1,"573":3,"576":1,"577":1,"578":1,"579":1,"580":1,"583":1,"590":1,"595":1}}],["js会在",{"2":{"592":1}}],["js首先会对当前作用域的变量进行申明",{"2":{"588":1}}],["jsrun",{"2":{"587":2}}],["jsreg",{"2":{"152":4,"901":4}}],["js是个动态弱类型语言",{"2":{"906":1}}],["js是个弱类型语言没有相关的类型约束",{"2":{"834":1}}],["js是如何从原型链中查找属性的",{"2":{"584":1}}],["js是一个动态解释性语言",{"2":{"525":1}}],["js内部会以",{"2":{"573":1}}],["jsuser",{"2":{"575":1}}],["jsu1",{"2":{"573":1,"574":1}}],["jsundefined",{"2":{"43":1,"549":1}}],["js垃圾回收机制",{"0":{"556":1},"1":{"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"567":1,"568":1}}],["jssettimeout",{"2":{"532":1,"533":1,"538":1,"539":1,"540":1}}],["jsstr",{"2":{"138":1,"141":2,"143":1,"145":2,"148":1,"149":1,"152":1,"153":1,"154":5,"887":1,"890":2,"892":1,"894":2,"897":1,"898":1,"901":1,"902":1,"903":5}}],["js操作处理等等",{"2":{"526":1}}],["js的自定义规则进行校验",{"2":{"802":1}}],["js的是通过异步回调的方式解决单线程的执行阻塞问题",{"2":{"525":1}}],["js的engine和runtime",{"0":{"525":1}}],["js的创作者因此也没必要做更复杂的设计",{"2":{"524":1}}],["js的深浅拷贝",{"0":{"23":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1}}],["js提供了多种视图对象",{"2":{"481":1}}],["js有一段这样的逻辑",{"2":{"350":1}}],["js无法访问防止xss攻击",{"2":{"347":1}}],["js合并",{"2":{"268":1}}],["js配置文件进行配置",{"2":{"878":1}}],["js配置文件",{"2":{"797":1}}],["js配置文件信息",{"2":{"56":1}}],["js配置影响到",{"2":{"268":1}}],["js里面都是些什么内容",{"2":{"237":1}}],["js里面简单的写几个语句进行打包处理",{"2":{"175":1}}],["jsimport",{"2":{"199":1,"749":1}}],["jscount",{"2":{"595":1}}],["jsconsole",{"2":{"587":1,"588":1}}],["jsconst",{"2":{"98":1,"121":1,"137":1,"139":1,"190":2,"198":1,"201":1,"202":1,"203":1,"204":2,"237":1,"354":1,"455":1,"539":1,"572":2,"588":1,"723":1,"748":1,"751":1,"752":1,"753":1,"754":2,"878":1,"886":1,"888":1,"1074":1,"1102":1,"1183":1}}],["jschild",{"2":{"583":1}}],["jsctx",{"2":{"282":1}}],["jsclass",{"2":{"196":1,"201":1,"207":1,"583":1,"746":1,"751":1,"757":1}}],["js中变量的声明只能在当前作用域或当前作用域以内的作用域访问到",{"2":{"588":1}}],["js中所有函数的原型指向它的构造函数function的prototype属性如",{"2":{"573":1}}],["js中当访问对象的属性时",{"2":{"571":1}}],["js中每个对象都有一个",{"2":{"571":1}}],["js中每个对象内部都会包含一个隐藏的",{"2":{"571":1}}],["js中提供了textencoder和textdecoder分别将字符转为二进制",{"2":{"491":1}}],["js中的getallbuilds方法获取的",{"2":{"237":1}}],["js中的设计模式",{"0":{"194":1},"1":{"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1}}],["js中",{"2":{"237":1,"239":1}}],["js中看到rollup的相关配置",{"2":{"237":1}}],["js中有string",{"2":{"37":1,"543":1}}],["js加上hash",{"2":{"190":1}}],["js加载了10多s",{"2":{"129":1}}],["js$",{"2":{"190":1,"237":1}}],["jsx为例",{"2":{"858":1}}],["jsx支持等等",{"2":{"829":1}}],["jsx",{"2":{"180":1,"829":1,"831":2,"858":1}}],["js`",{"2":{"150":1,"238":1,"899":1}}],["js|css",{"2":{"132":1,"697":1}}],["js文件并引用里面的add方法",{"2":{"1103":1}}],["js文件中配置",{"2":{"400":1}}],["js文件已经预加载好了",{"2":{"131":1}}],["js文件",{"2":{"131":1,"407":1,"801":1,"1074":1,"1102":1,"1183":1}}],["js资源",{"2":{"131":2}}],["js资源没有合理进行缓存",{"2":{"129":1}}],["js最下面有个注册接口",{"2":{"57":1}}],["jsadmin",{"2":{"57":1}}],["jsa",{"2":{"48":1,"554":1}}],["js13kgames",{"2":{"222":2}}],["js1",{"2":{"44":2,"550":2}}],["jstrue",{"2":{"43":1,"549":1}}],["jsmodule",{"2":{"40":1,"263":1,"546":1,"801":1,"839":1,"844":1}}],["js代码",{"2":{"40":1,"546":1}}],["jsnew",{"2":{"239":1}}],["jsnan",{"2":{"47":1,"553":1}}],["jsname",{"2":{"38":1,"544":1}}],["jsnum",{"2":{"39":1,"545":1}}],["js引擎会扫描当前",{"2":{"587":1}}],["js引擎线程",{"2":{"526":1}}],["js引擎也经历了从spidermonkey到v8",{"2":{"525":1}}],["js引擎也可以隐式装箱",{"2":{"38":1,"544":1}}],["js引擎內部toprimitive的签名如下",{"2":{"40":1,"546":1}}],["js引擎往往会最大限度的降低程序的错误",{"2":{"36":1,"542":1}}],["js类型隐式转换与装箱拆箱",{"0":{"36":1,"542":1},"1":{"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1}}],["json没有此文件的可以自行创建json文件",{"2":{"1083":1}}],["json文件中添加待安装的依赖项目",{"2":{"1184":1}}],["json文件中添加仓库和登录凭证",{"2":{"1014":1}}],["json文件内容实例",{"2":{"1183":1}}],["json文件内容如下",{"2":{"1102":1}}],["json文件",{"2":{"1074":1}}],["json格式",{"2":{"874":1}}],["json配置文件",{"2":{"818":1,"1074":1,"1208":1}}],["json中添加",{"2":{"1102":1}}],["json中添加脚本",{"2":{"804":1}}],["json中对应的仓库地址和密码",{"2":{"1014":1}}],["json中是否存在已经登录的凭证",{"2":{"1014":1}}],["json中的脚本",{"2":{"966":1}}],["json中定制脚本",{"2":{"849":1}}],["json中配置仓库地址和登录凭证",{"2":{"1014":1}}],["json中配置eslint",{"2":{"827":1}}],["json中配置",{"2":{"813":1}}],["json中配置脚本",{"2":{"799":1}}],["json中看到有很多脚本用于vue的构建",{"2":{"237":1}}],["jsonpcb",{"2":{"338":1}}],["jsonp仅支持get请求",{"2":{"338":1}}],["jsonp",{"0":{"338":1},"2":{"336":1,"338":1}}],["json停止",{"2":{"268":1}}],["json的脚本",{"2":{"190":1}}],["json里修改脚本",{"2":{"182":1}}],["json进行简单的配置",{"2":{"177":1}}],["json脚本",{"2":{"175":1}}],["jsonwebtoken是对用户信息加密成不可逆向破解的token",{"2":{"64":1}}],["jsonwebtoken等等",{"2":{"52":1}}],["json",{"0":{"32":2,"262":1},"2":{"32":9,"57":3,"62":4,"64":2,"175":2,"177":2,"182":2,"186":1,"190":3,"222":2,"228":1,"232":1,"269":1,"342":1,"350":1,"354":4,"400":1,"401":1,"404":3,"405":1,"406":1,"410":1,"453":1,"455":1,"614":1,"639":1,"640":1,"646":1,"652":1,"665":10,"676":2,"700":2,"703":10,"716":1,"723":2,"724":1,"765":1,"769":1,"770":3,"772":3,"799":1,"800":1,"801":2,"804":1,"805":1,"810":3,"813":1,"814":3,"817":2,"818":3,"827":1,"832":1,"838":3,"840":1,"843":1,"849":1,"857":3,"858":5,"863":2,"874":1,"877":1,"878":1,"880":1,"882":1,"966":2,"998":1,"1014":1,"1034":3,"1039":2,"1045":3,"1070":1,"1074":4,"1083":1,"1102":2,"1103":4,"1107":5,"1121":1,"1138":1,"1183":1,"1184":2,"1187":2,"1189":1,"1190":1,"1191":1,"1208":1,"1212":1}}],["jslet",{"2":{"28":1,"29":1,"30":2,"32":2,"33":1,"48":1,"116":1,"117":1,"120":1,"205":1,"206":1,"554":1,"588":1,"589":1,"591":1,"755":1,"756":1}}],["jsvar",{"2":{"2":1,"3":1,"4":1,"28":1,"34":1,"140":6,"583":1,"588":1,"889":6}}],["js",{"2":{"1":1,"26":2,"38":4,"40":3,"43":2,"44":1,"46":1,"48":3,"49":1,"50":1,"52":1,"54":38,"60":2,"61":2,"62":2,"63":2,"64":1,"96":1,"127":3,"129":1,"130":3,"131":1,"132":10,"137":1,"141":2,"144":1,"150":1,"175":10,"176":2,"177":4,"179":2,"180":3,"181":4,"182":4,"183":4,"184":4,"185":2,"186":4,"187":2,"188":2,"189":2,"190":15,"195":2,"197":2,"200":1,"222":2,"237":14,"238":8,"239":2,"268":1,"283":1,"284":1,"285":1,"286":1,"293":1,"350":1,"382":2,"399":3,"401":1,"404":4,"410":1,"473":1,"525":1,"526":1,"539":1,"544":4,"546":3,"549":2,"550":1,"552":1,"554":3,"555":1,"568":1,"571":1,"576":1,"582":1,"586":1,"589":1,"601":2,"662":2,"703":1,"705":1,"734":1,"745":2,"747":2,"750":1,"773":6,"795":1,"802":2,"805":2,"827":1,"830":3,"839":1,"841":1,"844":1,"855":1,"857":1,"858":2,"863":1,"874":3,"878":2,"880":2,"886":1,"890":2,"893":1,"899":1,"954":1,"965":2,"977":1,"980":1,"1034":2,"1074":2,"1102":2,"1103":4,"1107":4,"1183":1,"1184":4,"1187":1,"1189":1,"1191":1}}],["颠覆了过去的经验",{"2":{"20":1}}],["曾经table被用来做页面布局",{"2":{"18":1}}],["只读",{"2":{"1098":1}}],["只读对象",{"2":{"964":1}}],["只保留必要的文件和组件",{"2":{"1075":1}}],["只保留了部分的加密算法",{"2":{"334":1}}],["只显示nginx",{"2":{"1006":1}}],["只显示容器的",{"2":{"1006":1}}],["只输出镜像id",{"2":{"998":1}}],["只支持在加密通道上运行",{"2":{"727":1}}],["只支持mp3格式音频",{"2":{"62":1}}],["只生成api开头的接口",{"2":{"687":1}}],["只获取query中的id",{"2":{"613":1}}],["只获取id",{"2":{"613":1}}],["只返回1mb的数据",{"2":{"520":1}}],["只返回头部信息",{"2":{"320":1}}],["只允许指定的域名或网站引用自己的资源",{"2":{"722":1}}],["只允许",{"2":{"353":1}}],["只允许http请求使用",{"2":{"347":1}}],["只能说目前国内市场上面的形势很不景气",{"2":{"1233":1}}],["只能从当前阶段之前执行的阶段定义作业",{"2":{"1140":1}}],["只能使用本地工作包中的路径",{"2":{"1138":1}}],["只能设置正整数",{"2":{"1132":1}}],["只能内部进行访问",{"2":{"1085":1}}],["只能通过http协议传输",{"2":{"347":1}}],["只能采用模块打包",{"2":{"131":1}}],["只有最后一个",{"2":{"1063":1}}],["只有name改变才会重新执行",{"2":{"955":1}}],["只有data的值改变时计算属性才会执行",{"2":{"932":1}}],["只有dep会收集watcher",{"2":{"931":1}}],["只有大家达成同一种编码意识",{"2":{"824":1}}],["只有确定了是哪个文件才可以进一步判断文件已经上传过的切片",{"2":{"772":1}}],["只有在该列表中的来源才能访问指定的资源",{"2":{"722":1}}],["只有在同源的情况下",{"2":{"336":1}}],["只有函数式声明才会满足一等公民的要求",{"2":{"587":1}}],["只有object对象才会有原型",{"2":{"571":1}}],["只有当前项目才可以使用",{"2":{"1161":1}}],["只有当前组才可以使用",{"2":{"1161":1}}],["只有当前域名才可以使用",{"2":{"347":1}}],["只有当compose中的容器使用同一个网络时才可以使用服务名的形式访问nginxupstream",{"2":{"1034":1}}],["只有当ack=1时有效",{"2":{"455":1}}],["只有当子节点",{"2":{"404":1}}],["只有经过路由器时才会减1",{"2":{"368":1}}],["只有2^32",{"2":{"366":1}}],["只有一个捕获",{"2":{"145":1,"894":1}}],["只有一层的时候",{"2":{"28":1}}],["只为您提供更加优质的文章阅读体验",{"2":{"271":1}}],["只许对lazy管理器进行改造即可",{"2":{"247":1}}],["只需要将cbs里的方法执行一遍",{"2":{"950":1}}],["只需要执行cypress",{"2":{"877":1}}],["只需要以下配置即可",{"2":{"728":1}}],["只需要记住每位是由1字节8位组成就可以推到出来",{"2":{"482":1}}],["只需要通知中介者对象即可",{"2":{"208":1,"758":1}}],["只需要你最后返回我一个实例",{"2":{"201":1,"751":1}}],["只需要你提供给我一个接口去调用",{"2":{"201":1,"751":1}}],["只需几行代码就可以优雅的做到水平垂直居中",{"2":{"20":1}}],["只是作用于包的安装",{"2":{"1186":1}}],["只是更好的提高团队协作效率而已",{"2":{"835":1}}],["只是一个管理概念",{"2":{"810":1}}],["只是这种闭包并没有什么意义",{"2":{"594":1}}],["只是我们不能使用",{"2":{"588":1}}],["只是在自己身上添加了name属性",{"2":{"579":1}}],["只是提供了一种测试",{"2":{"350":1}}],["只是简单的从core",{"2":{"238":1}}],["只是从runtime",{"2":{"238":1}}],["只是来验证参数的类型罢了",{"2":{"232":1}}],["只是添加了两个生命周期函数",{"2":{"199":1,"749":1}}],["只是加载了16",{"2":{"131":1}}],["只要使用执行器为docker类型的runner所有的操作运行都会在容器中运行",{"2":{"1145":1}}],["只要作业正在运行",{"2":{"1121":1}}],["只要对应的响应式对象的值不变",{"2":{"934":1}}],["只要dep所属的属性值没变就不会通知watcher进行更新",{"2":{"931":1}}],["只要遵循一定的原则就可以实现自己的装饰器",{"2":{"619":1}}],["只要prototype拥有父类的的prorotype属性和方法就可以了",{"2":{"582":1}}],["只要记住赋值操作=不会查找原型链",{"2":{"579":1}}],["只要勾选上就行",{"2":{"404":1}}],["只要限制了第三方使用身份信息也能阻止攻击",{"2":{"353":1}}],["只要知道这个方法怎么用就行了",{"2":{"200":1,"750":1}}],["只要有个变量确保实例只创建一次",{"2":{"196":1,"746":1}}],["只要你足够懒",{"2":{"184":1}}],["只要添加一个水平居中属性就好了",{"2":{"18":1}}],["只花了424ms",{"2":{"131":1}}],["只不过推送镜像到docker",{"2":{"1046":1}}],["只不过参数调换了位置而已",{"2":{"945":1}}],["只不过比较重",{"2":{"785":1}}],["只不过js引擎自己知道已有这些变量",{"2":{"588":1}}],["只不过换成了let关键字",{"2":{"588":1}}],["只不过添加了一些相同的属性和方法",{"2":{"581":1}}],["只不过会牺牲点加载或等待时间",{"2":{"524":1}}],["只不过前者的读取是同步的",{"2":{"507":1}}],["只不过引用是在匹配表达式中使用",{"2":{"145":1,"894":1}}],["只不过是score表自己和自己联表",{"2":{"88":1}}],["只不过要稍微麻烦一点",{"2":{"17":1}}],["只给出部分截图",{"0":{"65":1}}],["只会在当前对象中修改或添加属性",{"2":{"579":1}}],["只会返回一个浅复制了原数组中的元素的一个新数组",{"2":{"30":1}}],["只会给出相应提示",{"2":{"12":1}}],["张鑫旭老师的反馈",{"2":{"17":1}}],["vjkb7",{"2":{"1217":1}}],["vjbmywludf",{"2":{"723":1}}],["vxlancrosssubnet",{"2":{"1217":1}}],["vnd",{"2":{"1209":4}}],["vnode",{"0":{"925":1},"2":{"201":1,"751":1,"941":1,"954":1}}],["v0",{"2":{"1208":1}}],["v4",{"2":{"1121":2,"1187":4,"1190":2,"1191":2}}],["vulnerabilities",{"2":{"1103":1}}],["vue提供了$set方法",{"2":{"955":1}}],["vue通过用object",{"2":{"955":1}}],["vue针对不同的环境做了一些参数处理",{"2":{"954":1}}],["vue为例开始创建根组件",{"2":{"953":1}}],["vue2响应式原理及缺点",{"2":{"965":1}}],["vue2分析",{"0":{"949":1},"1":{"950":1,"951":1,"952":1,"953":1,"954":1,"955":1,"956":1}}],["vue2版本的可以查看这里",{"2":{"875":1}}],["vue2版本工具包",{"2":{"875":1}}],["vue系列模块都是深入原理知识",{"2":{"948":1}}],["vue3响应式原理和优势",{"2":{"965":1}}],["vue3最明显的特点就是不再支持ie了",{"2":{"957":1}}],["vue3分析",{"0":{"957":1},"1":{"958":1,"959":1,"960":1,"961":1,"962":1,"963":1,"964":1}}],["vue3的官方仓库全部采用了typescript开发",{"2":{"957":1}}],["vue3的选项多了一个flush",{"2":{"944":1}}],["vue3的watch",{"0":{"944":1}}],["vue3的computed",{"0":{"934":1}}],["vue3中的watch其实和vue2的没啥区别",{"2":{"944":1}}],["vue3中的computed其实可vue2差不多",{"2":{"934":1}}],["vue3中通过track",{"2":{"934":1}}],["vue3版本工具包",{"2":{"875":1}}],["vue内部会统一把computed变成对象形式包含get",{"2":{"931":1}}],["vue内部就自动处理最后生成html呈现在页面上",{"2":{"236":1}}],["vue源码分析之视图更新",{"0":{"973":1},"1":{"974":1,"975":1}}],["vue源码分析之过渡",{"0":{"972":1}}],["vue源码分析之模板编译",{"0":{"971":1}}],["vue源码分析之插槽",{"0":{"970":1}}],["vue源码分析之响应式原理",{"0":{"948":1},"1":{"949":1,"950":1,"951":1,"952":1,"953":1,"954":1,"955":1,"956":1,"957":1,"958":1,"959":1,"960":1,"961":1,"962":1,"963":1,"964":1,"965":1,"966":1,"967":1,"968":1}}],["vue源码分析之计算属性与侦听函数",{"0":{"927":1},"1":{"928":1,"929":1,"930":1,"931":1,"932":1,"933":1,"934":1,"935":1,"936":1,"937":1,"938":1,"939":1,"940":1,"941":1,"942":1,"943":1,"944":1,"945":1,"946":1}}],["vue源码分析之组件创建",{"0":{"924":1},"1":{"925":1,"926":1}}],["vue官方提供了",{"2":{"875":1}}],["vue组件测试",{"0":{"875":1}}],["vue规则",{"2":{"846":1}}],["vue使用nuxtjs",{"2":{"784":1}}],["vue项目同理",{"2":{"409":1}}],["vuecli",{"2":{"406":1}}],["vue的响应式实现大体涵盖了observe",{"2":{"954":1}}],["vue的时候",{"2":{"239":1}}],["vue的prop校验",{"2":{"206":1,"756":1}}],["vue发生了什么",{"0":{"239":1}}],["vuevue是在哪里定义的",{"2":{"237":1}}],["vue中的slot",{"2":{"207":1,"757":1}}],["vuex源码分析",{"0":{"976":1}}],["vuex都属于中介者模式的实际应用",{"2":{"208":1,"758":1}}],["vuex",{"2":{"130":2}}],["vuex的状态管理文件",{"2":{"54":2}}],["vuerouter源码分析",{"0":{"969":1}}],["vuerouter",{"2":{"130":1}}],["vue下载",{"2":{"56":1}}],["vue配置",{"2":{"54":1}}],["vue路由配置文件",{"2":{"54":2}}],["vue程序入口文件",{"2":{"54":2}}],["vue挂载根页面",{"2":{"54":2}}],["vue挂载页面",{"2":{"54":2}}],["vue",{"0":{"63":1},"2":{"52":1,"54":24,"125":1,"130":3,"201":1,"236":1,"237":6,"238":28,"239":9,"243":1,"245":3,"671":1,"751":1,"784":2,"805":2,"814":1,"833":1,"843":1,"846":2,"849":2,"858":1,"875":6,"929":1,"930":1,"934":2,"936":1,"943":1,"951":1,"954":5,"965":5,"966":1}}],["v进行挂载",{"2":{"1061":1}}],["v或",{"2":{"1061":1}}],["v>",{"2":{"920":1}}],["v7",{"2":{"814":1}}],["v7开始引入了workspace的概念",{"2":{"813":1}}],["vrrp实例id",{"2":{"728":1}}],["vrrp",{"2":{"728":9}}],["v3",{"2":{"654":1,"1217":2}}],["v8",{"2":{"568":1,"857":2,"1209":1}}],["v8回收机制优化",{"2":{"559":1}}],["v8引擎会分析对应的js代码然后调用node的api",{"2":{"537":1}}],["v80",{"2":{"139":1,"888":1}}],["vlq编码",{"2":{"410":2}}],["vlazy",{"2":{"245":2}}],["v=easvmccbfkq",{"2":{"568":1}}],["v=8aghzqkofbq",{"2":{"541":1}}],["v=",{"2":{"347":3,"727":1}}],["v=b3",{"2":{"347":1}}],["v=xyfg6",{"2":{"49":1,"555":1}}],["vpn可以将本地网络与远程网络之间建立一个安全的隧道",{"2":{"303":1}}],["vpn",{"2":{"303":1}}],["vscode调试技巧",{"2":{"966":1}}],["vscode中搜索",{"2":{"843":1}}],["vscode开发实际图",{"2":{"785":1}}],["vscode天生支持javascript调试",{"2":{"442":1}}],["vscode配置",{"2":{"405":1}}],["vscode",{"0":{"442":1},"1":{"443":1,"444":1,"445":1,"446":1,"447":1,"448":1},"2":{"400":1,"785":2,"838":4,"840":1,"841":1,"883":1,"966":1}}],["vscode快捷键",{"0":{"155":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1}}],["vs",{"2":{"251":1,"785":7,"1206":5}}],["vhs",{"2":{"251":1}}],["volume等等",{"2":{"1019":1}}],["volume",{"0":{"1061":1},"2":{"1009":1,"1061":2,"1109":1,"1111":3,"1113":3,"1114":3,"1115":2}}],["volumestatsaggperiod",{"2":{"1212":1}}],["volumes路径下指定的文件夹",{"2":{"1115":1}}],["volumes文件路径下",{"2":{"1113":1}}],["volumes等这些都可以在最顶端定义表示需要创建的全局network",{"2":{"1019":1}}],["volumes",{"0":{"1022":1},"2":{"994":1,"1022":2,"1035":1,"1110":1,"1159":1,"1173":1,"1209":1}}],["volcano",{"2":{"251":1}}],["void",{"0":{"908":1},"2":{"227":1,"228":1,"229":1,"230":1,"232":2,"634":1,"771":2,"868":1,"869":1,"944":2,"945":3,"954":1,"964":1}}],["vmlinuz",{"2":{"1202":1}}],["vm",{"2":{"239":23,"932":19,"937":9,"938":9,"939":2,"940":1,"941":5,"954":26,"1205":1}}],["vdom",{"2":{"238":1}}],["veth",{"2":{"1086":5}}],["vendor",{"2":{"728":1,"1082":1}}],["vender",{"2":{"130":1,"187":1,"190":1}}],["veil",{"2":{"251":1}}],["verbosity",{"2":{"1212":1}}],["verify",{"2":{"1159":1}}],["verifyauth",{"2":{"127":1}}],["version=14",{"2":{"1157":1}}],["version=1",{"2":{"1054":1,"1055":2}}],["version=$version",{"2":{"1054":1}}],["version=0",{"2":{"1054":4,"1055":2}}],["versioning",{"2":{"656":2,"814":1}}],["versioningtype",{"2":{"654":1,"656":1}}],["version2",{"2":{"655":2}}],["version1",{"2":{"655":2}}],["versions",{"2":{"606":4,"1108":1}}],["version等几个重要的头部字段",{"2":{"354":1}}],["version",{"2":{"60":1,"62":1,"64":1,"83":2,"134":1,"238":2,"354":1,"400":1,"410":1,"655":10,"707":1,"708":2,"717":2,"729":1,"814":5,"828":4,"966":1,"994":1,"1018":1,"1035":1,"1046":1,"1074":1,"1082":11,"1102":1,"1103":2,"1108":1,"1121":8,"1148":3,"1183":1,"1184":1,"1187":1,"1189":1,"1190":1,"1209":1,"1214":1,"1217":3}}],["verticaloffset",{"2":{"201":5,"751":5}}],["vertical",{"2":{"16":1,"17":2,"19":1,"251":1}}],["v2",{"2":{"98":2,"654":1,"655":2,"708":1,"718":2,"1039":1,"1074":2,"1198":1,"1209":2}}],["v1alpha1",{"2":{"1212":1}}],["v1beta1",{"2":{"1212":1}}],["v1beta3",{"2":{"1212":2}}],["v14",{"2":{"1151":1,"1153":1,"1156":1,"1157":3}}],["v1",{"2":{"98":2,"654":1,"655":2,"1000":1,"1014":1,"1046":5,"1047":4,"1055":1,"1073":2,"1082":1,"1121":1,"1207":1,"1209":40,"1214":1,"1217":10}}],["virtualbox",{"0":{"1164":1},"2":{"1164":1}}],["virtual",{"2":{"1006":1,"1206":1}}],["virgo",{"2":{"251":1}}],["vip51",{"2":{"728":3}}],["vim",{"2":{"713":1,"728":2,"1126":1,"1176":2,"1177":1,"1178":1,"1208":2,"1209":1,"1217":1}}],["visibility",{"2":{"1121":1}}],["visible",{"2":{"201":1,"751":1}}],["visit",{"2":{"879":1}}],["visual",{"0":{"923":1}}],["visualstudio",{"2":{"443":1,"448":3}}],["visudo",{"2":{"728":1}}],["via",{"2":{"319":1,"726":1}}],["vite等适合项目的模块化开发",{"2":{"784":1}}],["vite",{"2":{"281":1,"784":2,"1073":1}}],["vibration",{"2":{"251":1}}],["violin",{"2":{"251":1}}],["videos",{"2":{"878":1}}],["videosfolder",{"2":{"878":1}}],["video>",{"2":{"520":1}}],["video",{"2":{"251":2,"520":6,"878":1,"879":1}}],["viewengine",{"2":{"673":1}}],["viewportheight",{"2":{"878":1}}],["viewportwidth",{"2":{"878":1}}],["viewport",{"2":{"222":1,"671":1}}],["views",{"2":{"54":2,"665":1,"671":2}}],["view",{"2":{"54":1,"414":1,"430":1}}],["vi",{"2":{"40":1,"546":1,"728":1,"1203":1}}],["v",{"2":{"40":1,"49":1,"63":1,"98":4,"139":2,"164":2,"195":4,"197":2,"199":1,"218":1,"243":1,"245":3,"249":1,"251":1,"546":1,"555":1,"656":4,"707":1,"708":2,"718":3,"745":4,"747":2,"749":1,"888":2,"920":1,"1004":2,"1009":1,"1038":1,"1061":1,"1094":1,"1116":3,"1145":1,"1153":4,"1156":1,"1157":6,"1171":6,"1172":4}}],["vault",{"2":{"1121":1}}],["valit",{"2":{"197":6,"747":6}}],["validationpipe",{"2":{"643":7,"644":1,"646":2}}],["validationschema",{"2":{"628":1,"632":1,"669":2}}],["validate",{"2":{"232":4,"843":1}}],["validater",{"2":{"232":3}}],["validateauth",{"2":{"127":2}}],["validator结合validationpipe进行数据格式转换和验证",{"2":{"646":1}}],["validators",{"2":{"232":2}}],["validatorstorage",{"2":{"232":4}}],["validatorfunc",{"2":{"197":5,"747":5}}],["validator",{"0":{"646":1},"2":{"197":4,"232":4,"646":1,"747":4}}],["valid",{"2":{"132":5,"632":1,"669":2,"721":2,"722":1,"728":4,"1090":4}}],["val1",{"2":{"83":1}}],["value>",{"2":{"1024":1,"1054":1,"1055":1,"1057":3}}],["value=",{"2":{"352":2}}],["value2>",{"2":{"1024":1}}],["value2",{"2":{"350":1}}],["value1",{"2":{"350":1}}],["value是类数组",{"2":{"154":1,"903":1}}],["values之后的",{"2":{"77":1}}],["values",{"2":{"77":7,"86":2,"350":1}}],["value++",{"2":{"48":1,"554":1}}],["value",{"2":{"40":4,"48":1,"98":9,"154":5,"197":4,"229":3,"230":2,"231":3,"232":2,"238":1,"243":2,"245":5,"347":1,"353":1,"354":3,"489":1,"496":1,"512":2,"546":4,"554":1,"583":1,"606":1,"616":1,"645":4,"646":2,"747":4,"771":1,"801":12,"831":1,"869":1,"903":5,"932":11,"934":8,"938":12,"939":1,"941":4,"944":2,"949":1,"950":5,"951":17,"954":16,"955":22,"956":1,"962":5,"963":3,"964":5,"1024":1,"1034":1,"1054":1,"1055":2}}],["valueof",{"2":{"39":2,"40":19,"48":1,"545":2,"546":19,"554":1}}],["val",{"2":{"33":4,"83":4,"231":5,"646":4,"941":13,"951":5,"954":5,"955":3,"956":9,"963":2}}],["variables",{"0":{"1128":1},"2":{"1120":2,"1128":1,"1136":1,"1143":1,"1148":1}}],["variable",{"2":{"588":1}}],["vary",{"2":{"134":1,"717":3}}],["varchar",{"2":{"75":1,"86":2}}],["var",{"2":{"2":1,"3":1,"4":1,"26":6,"28":1,"34":2,"40":5,"60":2,"61":5,"64":1,"546":5,"583":5,"587":3,"588":1,"594":2,"708":9,"709":3,"718":18,"721":1,"825":1,"1051":3,"1064":1,"1070":1,"1113":1,"1115":1,"1153":2,"1159":2,"1171":4,"1172":2,"1173":2,"1209":1,"1212":4,"1214":1}}],["其安装这里不详细列出了",{"2":{"1208":1}}],["其对应的相关配置如下",{"2":{"1196":1}}],["其文件路径会被存放到",{"2":{"1113":1}}],["其前16位是个网络地址",{"2":{"1085":1}}],["其具备",{"2":{"1079":1}}],["其具体实现看下一小节",{"2":{"385":1}}],["其命名可以随意",{"2":{"1069":1}}],["其优势大致如下",{"2":{"1050":1}}],["其优势如下",{"2":{"727":1}}],["其配置和docker",{"2":{"1026":1}}],["其与docker",{"2":{"1024":1}}],["其默认会使用当前目录下的dockerfile文件进行构建",{"2":{"1021":1}}],["其都会包含镜像文件",{"2":{"1021":1}}],["其都会作为广播地址使用",{"2":{"364":1}}],["其依赖redis的启动后才会启动自己",{"2":{"1018":1}}],["其依赖的0",{"2":{"131":1}}],["其值是一个包含容器配置的键值对",{"2":{"1018":1}}],["其值将会变为0",{"2":{"489":1}}],["其键名是容器的名称",{"2":{"1018":1}}],["其加密结果并不安全",{"2":{"1014":1}}],["其内容在构建之后也不会被改变",{"2":{"996":1}}],["其内部本质还是将名字和ip进行的动态绑定",{"2":{"1090":1}}],["其内部含义和provide类似",{"2":{"620":1}}],["其内部包括",{"2":{"526":1}}],["其内部转换可以概括步骤如下",{"2":{"40":1,"546":1}}],["其原理和set道理一样",{"2":{"956":1}}],["其也会自动管理容器的启动先后顺序",{"2":{"1018":1}}],["其也就是vue的",{"2":{"954":1}}],["其也是个同步代码",{"2":{"532":1}}],["其在生成vnode的过程中",{"2":{"954":1}}],["其主要涉及到observe",{"2":{"951":1}}],["其主要针对登录模块进行拦截的",{"2":{"127":1}}],["其用来控制回调函数的执行时机",{"2":{"944":1}}],["其用来服务超时重传等功能",{"2":{"386":1}}],["其可以作为用例的参考",{"2":{"877":1}}],["其可展示的内容就只占一屏",{"2":{"133":1}}],["其的返回值有多个断言方法",{"2":{"859":1}}],["其和eslint配置用法一致",{"2":{"847":1}}],["其目的是解决c10k问题",{"2":{"704":1}}],["其目的就是让不同类型的任务源有不同的执行优先级",{"2":{"532":1}}],["其底层都是使用express",{"2":{"694":1}}],["其生命周期为request",{"2":{"633":1}}],["其支持的生命周期范围有",{"2":{"606":1}}],["其本质还是",{"2":{"606":1}}],["其本质还是函数",{"2":{"573":1}}],["其本质还是string对象的方法",{"2":{"38":1,"544":1}}],["其不是阶段性的任务",{"2":{"540":1}}],["其不会阻塞主线程进行渲染",{"2":{"131":1}}],["其eventloop包括以下执行阶段",{"2":{"538":1}}],["其大致过程如下",{"2":{"536":1}}],["其通过事件驱动模型用eventloop事件循环机制来调度定时任务",{"2":{"536":1}}],["其返回promise是个微任务会放入微任务队列",{"2":{"532":1}}],["其结果会放入宏任务队列",{"2":{"532":1}}],["其包含forroot",{"2":{"628":1}}],["其包含",{"2":{"512":1}}],["其包含多个方法和属性",{"2":{"510":1,"514":1}}],["其构造方法需要传入buffer实例",{"2":{"487":1}}],["其真实性值为3059428279",{"2":{"456":1}}],["其针对的显示方面的的过滤",{"2":{"453":1}}],["其功能也不逊色够开发和测试用了",{"2":{"428":1}}],["其界面简单宜人",{"2":{"411":1}}],["其利用tcp连接三次握手的第一阶段",{"2":{"381":1}}],["其数据传输前通信双方必须建立一条连接",{"2":{"377":1}}],["其有三个值",{"2":{"353":1}}],["其有很好的负载均衡",{"2":{"126":1}}],["其后面的数据流会一直等待",{"2":{"324":1}}],["其后面的数据就算加载了用户也看不到",{"2":{"133":1}}],["其匹配结果返回一个",{"2":{"154":1,"903":1}}],["其他喉咙什么的都没有症状",{"2":{"1236":1}}],["其他大咖以及我两边的同事都没有参加",{"2":{"1233":1}}],["其他大同小异",{"2":{"438":1,"450":1}}],["其他主机重复此步骤或直接将其拷贝到目标主机",{"2":{"1208":1}}],["其他作业将不会再执行",{"2":{"1124":1}}],["其他如文件系统等等都是隔离的",{"2":{"1087":1}}],["其他如",{"2":{"1022":1}}],["其他仓库",{"2":{"1014":1}}],["其他命令",{"0":{"1001":1}}],["其他更多的测试用例api这里不做过多介绍",{"2":{"879":1}}],["其他相关配置",{"2":{"838":1}}],["其他相关的协议都大同小异",{"2":{"460":1}}],["其他框架类似",{"2":{"765":1}}],["其他可以直接删除掉",{"2":{"728":1}}],["其他",{"0":{"677":1,"688":1}}],["其他关于controller中的配置请参考我nest基础文章",{"2":{"666":1}}],["其他浏览器可能存在差异",{"2":{"526":1}}],["其他或未来可能会发生变化",{"2":{"526":1}}],["其他读取器将不能读取它直到它被释放",{"2":{"512":1}}],["其他协议都大同小异",{"2":{"458":1}}],["其他使用可以自行摸索",{"2":{"426":1}}],["其他手机系统大同小异",{"2":{"422":1}}],["其他的全局配置",{"2":{"878":1}}],["其他的优化可以自行脑补",{"2":{"775":1}}],["其他的都会以原始大小返回",{"2":{"718":1}}],["其他的可以根据自己的需求进行配置即可",{"2":{"419":1}}],["其他的高亮",{"2":{"416":1}}],["其他的引用类型也会根据一定的规则进行转换",{"2":{"39":1,"545":1}}],["其他种类选项根据种类来确定字节数",{"2":{"376":1}}],["其他设置",{"2":{"353":1}}],["其他方式请浏览相关文档",{"2":{"1150":1}}],["其他方式无法获取",{"2":{"347":1}}],["其他方法",{"2":{"150":1,"899":1}}],["其他路径则不能使用当前cookie",{"2":{"347":1}}],["其他自定义",{"2":{"339":1,"724":1}}],["其他所有的相关对象都通过该中介者来通信",{"2":{"208":1,"758":1}}],["其他页面需要的js文件过大",{"2":{"131":1}}],["其他配置",{"2":{"130":1,"132":1}}],["其绑定了blog",{"2":{"128":1}}],["其它版本大同小异",{"2":{"1170":1}}],["其它的归于commitlint的自定义规则全部注释掉",{"2":{"802":1}}],["其它值都会被忽略",{"2":{"571":1}}],["其它都可以看做object类型",{"2":{"571":1}}],["其它",{"2":{"83":1,"858":1}}],["其中前端使用nginx进行部署",{"2":{"1034":1}}],["其中前两者在每个测试前都会执行一次",{"2":{"871":1}}],["其中最著名的是",{"2":{"1012":1}}],["其中最简单的是format",{"2":{"83":1}}],["其中客户端是",{"2":{"993":1,"1080":1}}],["其中就包含了对data的拦截",{"2":{"954":1}}],["其中就包含窗口的大小",{"2":{"387":1}}],["其中在render过程中每个组件都会生成对应的watcher",{"2":{"953":1}}],["其中p1使用了name属性",{"2":{"951":1}}],["其中常用的就是extends",{"2":{"797":1}}],["其中常见的强缓存",{"2":{"335":1}}],["其中vscode和webstorm青睐度最高",{"2":{"785":1}}],["其中规范化对于团队协作非常重要",{"2":{"782":1}}],["其中不限于代码优化",{"2":{"762":1}}],["其中一个提示是",{"2":{"726":1,"1178":1}}],["其中cron更常用",{"2":{"660":1}}],["其中仅pipe支持在param位置使用",{"2":{"636":1,"640":1}}],["其中fiddler",{"2":{"428":1}}],["其中t是一个32位的计数器",{"2":{"381":1}}],["其中确认号为x+1且有效期望下一次客户端的发送序列号应为x+1",{"2":{"378":1}}],["其中1",{"2":{"359":1}}],["其中100到199是信息性状态码",{"2":{"317":1}}],["其中请求头包含connection",{"2":{"354":1}}],["其中请求行包括请求方法",{"2":{"318":1}}],["其中",{"2":{"353":1,"359":3,"717":1,"720":1,"1012":1,"1018":1,"1068":1,"1085":1}}],["其中消息体的长度在请求或响应中预先指定",{"2":{"342":1}}],["其中状态行包括http协议版本",{"2":{"318":1}}],["其中典型的的代表是tcp和ip协议",{"2":{"310":1}}],["其中的参数和指令以分号",{"2":{"709":1}}],["其中的静态资源加载称为重灾区",{"2":{"241":1}}],["其中的数组元素将作为单独的参数传给",{"2":{"2":1}}],["其中包含了一个虚拟网络设备和一个",{"2":{"1085":1}}],["其中包含了一系列的指令和配置信息",{"2":{"1049":1}}],["其中包含了镜像仓库",{"2":{"998":1}}],["其中包含了引用的css脚本",{"2":{"350":1}}],["其中包含响应式原理",{"2":{"948":1}}],["其中包含以下几个常量",{"2":{"504":1}}],["其中包含upgrade",{"2":{"354":1}}],["其中包含使用新密钥加密的随机数和一个验证信息",{"2":{"333":1}}],["其中包含使用服务器的公钥和dh密钥交换的临时公钥计算出的共享密钥的信息",{"2":{"333":1}}],["其中包含",{"2":{"333":2}}],["其中包含ssl",{"2":{"333":1}}],["其中包含密码套件",{"2":{"332":1}}],["其中包含应用程序需要的每个模块",{"2":{"171":1}}],["其中包括vue3的",{"2":{"946":1}}],["其中包括",{"2":{"222":1,"606":1}}],["其中有详细说明",{"2":{"127":1}}],["其中document文档类型是会自动包含",{"2":{"117":1}}],["其中目前最常用的还是mysql",{"2":{"67":1}}],["其转换规则为",{"2":{"44":1,"550":1}}],["其余节点设置为backup",{"2":{"728":1}}],["其余使用方法一致",{"2":{"606":1}}],["其余29位用于网络地址和主机地址的划分",{"2":{"359":1}}],["其余30位用于网络地址和主机地址的划分",{"2":{"359":1}}],["其余31位用于网络地址和主机地址的划分",{"2":{"359":1}}],["其余都会返回",{"2":{"353":1}}],["其余都是object",{"2":{"227":1}}],["其余的信息就是对此次修改的描述",{"2":{"792":1}}],["其余的的长度为已经上传了的切片长度",{"2":{"772":1}}],["其余的浏览器都会阻止资源加载",{"2":{"350":1}}],["其余的依次类推",{"2":{"178":1}}],["其余的比较都是false",{"2":{"47":1,"553":1}}],["其余的都会返回403",{"2":{"722":1}}],["其余的都会优先执行valueof方法",{"2":{"40":1,"546":1}}],["其余的都是true",{"2":{"46":1,"552":1}}],["其余算术运算符都针对的是数字number",{"2":{"42":1,"548":1}}],["其调用顺序如下",{"2":{"40":1,"546":1}}],["其拆箱都会遵循",{"2":{"40":1,"546":1}}],["其实我知道这个消息但还是有点放不下",{"2":{"1232":1}}],["其实npm下载时",{"2":{"1103":1}}],["其实nest也是支持页面渲染的",{"2":{"671":1}}],["其实就可以上传自己的npm包到这个仓库了",{"2":{"1099":1}}],["其实就是函数的一个普通属性而已",{"2":{"583":1}}],["其实就是让子类的属性能够覆盖父类的实例属性",{"2":{"583":1}}],["其实就是对builds中的每个属性",{"2":{"237":1}}],["其实就是执行了build方法",{"2":{"237":1}}],["其实访问的代理对象",{"2":{"960":1}}],["其实响应式万变不离其宗",{"2":{"959":1}}],["其实$set的实现没有那么神秘",{"2":{"956":1}}],["其实每次添加有个去重的关系",{"2":{"954":1}}],["其实道理很简单只要让深层嵌套的属性的dep也都收集当前的user",{"2":{"941":1}}],["其实通过vm",{"2":{"937":1}}],["其实通过响应式过程你大概已经知道了计算属性缓存的原因了",{"2":{"931":1}}],["其实user",{"2":{"937":1}}],["其实很简单",{"2":{"932":1}}],["其实和jest差不多",{"2":{"879":1}}],["其实和js差不多",{"2":{"436":1}}],["其实本人觉得使用commitizen交互性比较繁琐",{"2":{"806":1}}],["其实搞懂跨域本质配置跨域请求就很简单了",{"2":{"692":1}}],["其实swagger内部会对所有的controller的每个方法中的",{"2":{"684":1}}],["其实也是平衡前面几种继承的优点和缺点",{"2":{"582":1}}],["其实也没什么难度",{"2":{"47":1,"553":1}}],["其实可以自己手动实现new的操作",{"2":{"576":1}}],["其实是",{"2":{"572":1}}],["其实都不是",{"2":{"535":1}}],["其实都是改变的存储空间的内容",{"2":{"26":1}}],["其实浏览器多线程执行异步任务的原理背后是基于事件驱动机制的",{"2":{"527":1}}],["其实在寄生组合继承中借用父类实例属性时会执行父类构造函数并将this指向子类",{"2":{"583":1}}],["其实在最初使用浏览器呈现页面时",{"2":{"524":1}}],["其实在笔者刚开始接触js的时候这对这方面一头雾水",{"2":{"523":1}}],["其实将域名localhost",{"2":{"425":1}}],["其实这样设计能更好的反映出每个对象的真正effect",{"2":{"934":1}}],["其实这里就是为vue做不同平台的构建做了一些扩展和准备",{"2":{"238":1}}],["其实这是一个内联",{"2":{"88":1}}],["其实大家学习react或者redux的时候",{"2":{"209":1,"759":1}}],["其实vue中的v",{"2":{"199":1,"749":1}}],["其实valueof执行结果更趋向于自己原本的值",{"2":{"40":1,"546":1}}],["其实还有很多详细的配置",{"2":{"191":1}}],["其实webpack的基本配置已经讲了不少了",{"2":{"191":1}}],["其实它还有很多详细的配置",{"2":{"176":1}}],["其实再执行yarn",{"2":{"126":1}}],["其实转换者可以是基础类型和对象类型",{"2":{"41":1,"547":1}}],["其实除了以上几个包装类型拆箱",{"2":{"39":1,"545":1}}],["其往往会颠覆你的认知",{"2":{"36":1,"542":1}}],["其是相对于自身的宽和高",{"2":{"15":1}}],["还需要安装cri",{"2":{"1208":1}}],["还需要注意避免与公有ip地址冲突",{"2":{"360":1}}],["还可能有一套单独的存储空间",{"2":{"1078":1}}],["还可以添加自定义属性或方法",{"2":{"581":1}}],["还可以使用docker",{"2":{"1004":1,"1009":1}}],["还可以使用更直观的报告",{"2":{"874":1}}],["还可以使用脚本进行格式化",{"2":{"849":1}}],["还可以使用本地的规则",{"2":{"831":1}}],["还可以使用ngx",{"2":{"718":1}}],["还可以使用filereader读取内容并转换",{"2":{"496":1}}],["还可以使用csp",{"2":{"350":1}}],["还可以使用css3新增的transform",{"2":{"15":1}}],["还可以将一些字符进行二进制的相互转换",{"2":{"491":1}}],["还可以模拟其他操作",{"2":{"436":1}}],["还可以修改请求内容",{"2":{"436":1}}],["还可以进行解码编码",{"2":{"430":1}}],["还可以调试https请求",{"2":{"428":1}}],["还可以用不同类型格式查看请求或响应内容",{"2":{"413":1}}],["还可以同时监听三种类型",{"2":{"404":1}}],["还可以看到当前作用域",{"2":{"404":1}}],["还可以帮助网络管理员更好地组织和管理网络设备和资源",{"2":{"362":1}}],["还可以设置一些x",{"2":{"350":1}}],["还可以设置指定的路径",{"2":{"347":1}}],["还可以设置其他的devtool值",{"2":{"183":1}}],["还可以读取这些属性以获取对应于相应",{"2":{"115":1}}],["还支持使用第三方网络驱动来实现自定义的网络类型和网络功能",{"2":{"1087":1}}],["还支持远程url",{"2":{"1069":1}}],["还支持nestjs上下文以外",{"2":{"643":1}}],["还提供了一系列的管理工具和服务",{"2":{"1011":1}}],["还原状态等",{"2":{"881":1}}],["还要官方有列举了一个表可以随时翻阅不用死记",{"2":{"857":1}}],["还能实现秒传",{"2":{"776":1}}],["还能提高加载速度",{"2":{"129":1}}],["还请查看官方文档",{"2":{"679":1}}],["还包含了一些为运行时准备的一些配置参数",{"2":{"996":1}}],["还包含了http的所有状态码类型的异常",{"2":{"638":1}}],["还包含一个ready属性返回一个promise",{"2":{"516":1}}],["还看到tcp协议",{"2":{"453":1}}],["还扮演了服务器和客户端进行tls加密通信",{"2":{"440":1}}],["还没有加载任何数据",{"2":{"504":1}}],["还没有结束",{"2":{"190":1}}],["还没有完全掌握",{"2":{"48":1,"554":1}}],["还会继续往后匹配",{"2":{"150":1,"899":1}}],["还是那么要强",{"2":{"1232":1}}],["还是一样自己多调试几遍简单的demo就会明白的",{"2":{"955":1}}],["还是一样如果你对于某些原理不是很明白时",{"2":{"927":1}}],["还是没有相关的参数显示",{"2":{"684":1}}],["还是上面的例子",{"2":{"141":1,"890":1}}],["还是班级表",{"2":{"89":1}}],["还是绝对定位",{"2":{"15":1}}],["还有tensorflow以及其他的package",{"2":{"1078":1}}],["还有header",{"2":{"612":1}}],["还有一个缺点无法对父类进行传参",{"2":{"577":1}}],["还有一些其它功能如",{"2":{"964":1}}],["还有一些其它的进程",{"2":{"526":1}}],["还有一些其它的配置",{"2":{"184":1}}],["还有一些computed",{"2":{"956":1}}],["还有一些内置的值",{"2":{"350":1}}],["还有比较重要的图片裁剪",{"2":{"478":1}}],["还有用来结束连接的",{"2":{"455":1}}],["还有快速恢复算法快速来恢复发送速率",{"2":{"394":1}}],["还有常见参考内容",{"2":{"252":1}}],["还有size大小",{"2":{"129":1}}],["还有上级id",{"2":{"88":1}}],["还有别的场景可以使用",{"2":{"88":1}}],["还有老师",{"2":{"87":1}}],["还有1",{"2":{"36":1,"542":1}}],["rjsbb",{"2":{"1217":1}}],["rvnvf2",{"2":{"1214":3,"1215":1}}],["rr",{"2":{"1206":1}}],["rhgb",{"2":{"1202":1}}],["rdt",{"2":{"1209":2}}],["rd",{"2":{"1202":2}}],["rb",{"2":{"1175":1,"1176":1,"1177":1,"1178":1}}],["rb文件中进行修改",{"2":{"1175":1}}],["rb配置文件中修改的",{"2":{"1175":1}}],["rw",{"2":{"1116":3}}],["rcl",{"2":{"771":2,"772":2}}],["rc4",{"2":{"726":1}}],["rcvd状态",{"2":{"378":1,"384":1}}],["rxjs",{"2":{"648":1,"651":1}}],["rxaviers",{"2":{"251":1}}],["rf",{"2":{"535":3,"1103":1}}],["rlm",{"2":{"462":2}}],["rpm",{"2":{"1210":1}}],["rpcbind",{"2":{"383":1}}],["rplcstr",{"2":{"83":1}}],["rto是根据rtt进行动态计算的",{"2":{"389":1}}],["rto两个时间概念",{"2":{"389":1}}],["rto",{"0":{"389":1},"2":{"389":1}}],["rtt握手",{"2":{"727":1}}],["rtt模式",{"2":{"334":1}}],["rtt",{"0":{"389":1},"2":{"329":1,"389":1,"727":2}}],["rtl",{"2":{"284":1}}],["rtrim",{"2":{"83":1}}],["ribbon",{"2":{"251":1}}],["ring",{"2":{"251":1}}],["rice",{"2":{"251":5,"577":2}}],["rightwards",{"2":{"251":1}}],["right的样式",{"2":{"111":1}}],["right",{"2":{"13":1,"83":1,"86":3,"111":3,"112":2,"158":2,"162":3,"201":1,"251":7,"284":1,"462":2,"751":1}}],["raw",{"2":{"1217":2}}],["rake",{"2":{"1143":2,"1179":1}}],["radius",{"2":{"850":1}}],["radio",{"2":{"251":2}}],["ran",{"2":{"860":1,"864":1}}],["range请求返回部分内容",{"2":{"520":1}}],["range",{"2":{"344":12,"462":3,"520":4,"1209":1}}],["ranges",{"2":{"319":1,"344":1,"520":1}}],["rand",{"2":{"83":3}}],["random",{"2":{"61":1,"62":1,"230":2,"708":1,"718":2,"771":1}}],["rarp协议已经逐渐被淘汰",{"2":{"301":1}}],["rarp服务器将在自己的rarp表中查找该mac地址对应的ip地址",{"2":{"301":1}}],["rarp",{"0":{"301":1},"2":{"312":1}}],["rarp应答",{"2":{"297":1}}],["rarp请求",{"2":{"297":1}}],["rails",{"2":{"1174":2,"1179":2}}],["rail",{"2":{"251":1}}],["railway",{"2":{"251":3}}],["rainbow",{"2":{"251":1}}],["raising",{"2":{"251":1}}],["raised",{"2":{"251":2}}],["racing",{"2":{"251":1}}],["racehorse",{"2":{"251":1}}],["ratio",{"2":{"1209":1}}],["rate",{"2":{"729":1}}],["rat",{"2":{"251":1}}],["ramen",{"2":{"251":1}}],["ram",{"2":{"251":1,"1195":1}}],["rabbit2",{"2":{"251":1}}],["rabbit",{"2":{"251":1}}],["rage4",{"2":{"251":2}}],["rage3",{"2":{"251":2}}],["rage2",{"2":{"251":2}}],["rage1",{"2":{"251":2}}],["rage",{"2":{"251":1}}],["rspec",{"2":{"1143":2}}],["rspack",{"2":{"784":1}}],["rs256",{"2":{"1121":1}}],["rss",{"2":{"778":1}}],["rst",{"2":{"376":2,"455":1}}],["rsa握手",{"0":{"332":1}}],["rsa",{"2":{"331":1,"333":1,"726":2}}],["rs",{"2":{"230":4,"404":2}}],["rm命令外",{"2":{"1009":1}}],["rmi命令删除镜像时",{"2":{"1002":1}}],["rmi",{"2":{"1000":3}}],["rm",{"0":{"1031":1},"2":{"218":1,"1000":1,"1004":2,"1009":4,"1031":1,"1051":1,"1063":3,"1064":3,"1073":1,"1074":1,"1090":2,"1103":1,"1115":2,"1156":1,"1157":3}}],["r",{"2":{"83":1,"139":2,"141":1,"163":1,"285":2,"494":1,"888":2,"890":1,"1065":1,"1082":1,"1093":1,"1094":1,"1198":1}}],["roles",{"2":{"1217":2}}],["roller",{"2":{"251":1}}],["rollup有很好的treeshaking更适合第三方库的开发",{"2":{"784":1}}],["rollup对于一些非标准模块格式的支持可能不够完善",{"2":{"784":1}}],["rollup",{"2":{"237":2,"281":1,"784":1}}],["robots",{"2":{"778":1}}],["robin",{"2":{"725":1}}],["rotatecertificates",{"2":{"1212":1}}],["rotate",{"2":{"718":1}}],["rotating",{"2":{"251":1}}],["ro对于不是当前域名的样式发出报告",{"2":{"350":1}}],["ro",{"2":{"350":1,"1202":1}}],["rocket",{"2":{"251":1}}],["rowboat",{"2":{"251":1}}],["rows",{"2":{"83":1}}],["rose",{"2":{"251":1}}],["rooster",{"2":{"251":1}}],["roothnsendpointname",{"2":{"1212":1}}],["root=",{"2":{"1202":1}}],["root>",{"2":{"878":1}}],["rootdir>",{"2":{"857":3,"862":1,"863":1,"875":1}}],["roots",{"2":{"857":1}}],["rootmargin",{"2":{"245":1}}],["root",{"2":{"83":3,"97":1,"383":1,"421":1,"422":1,"709":2,"726":4,"729":3,"800":1,"814":1,"827":1,"836":1,"1014":2,"1022":1,"1034":1,"1045":1,"1060":1,"1064":19,"1121":4,"1148":1,"1174":2,"1202":2,"1208":2,"1209":12,"1214":4}}],["route",{"2":{"648":3}}],["router",{"2":{"54":2,"57":1,"61":1,"64":1,"130":1,"371":1,"728":2}}],["round",{"2":{"83":1,"251":1,"389":1,"725":1,"1063":1,"1064":2}}],["ruby",{"2":{"1176":1}}],["rust",{"2":{"977":1}}],["rust的打包方案",{"2":{"784":1}}],["rush是微软公司推出的monorepo仓库的解决方案",{"2":{"819":1}}],["rush",{"0":{"819":1},"2":{"281":1,"816":1,"819":1}}],["ru",{"2":{"251":1}}],["rugby",{"2":{"251":1}}],["ruanyifeng",{"2":{"193":1}}],["ruler",{"2":{"251":2}}],["rules允许按顺序评估单个规则",{"2":{"1136":1}}],["rules是对设置的指定目标进行代码检查",{"2":{"830":1}}],["rules是eslint的核心模块",{"2":{"830":1}}],["rules才会工作",{"2":{"436":1}}],["rules`",{"2":{"430":1}}],["rules",{"0":{"830":1,"847":1,"1136":1},"2":{"180":1,"181":1,"190":1,"438":1,"797":3,"827":3,"830":4,"831":2,"840":1,"844":1,"845":1,"847":2,"1136":1}}],["rule",{"2":{"64":2,"179":1,"197":1,"747":1}}],["runit",{"2":{"1179":2}}],["runc",{"2":{"1082":1,"1209":5}}],["run很相似",{"2":{"1026":1}}],["run启动容器时使用差不多",{"2":{"1022":1}}],["run启动一个新容器的基本玩法",{"2":{"1004":1}}],["run命令启动容器时",{"2":{"1063":1}}],["run命令更适合初学者或者调试使用",{"2":{"1016":1}}],["run命令即可",{"2":{"877":1}}],["run的几个小例子",{"2":{"1004":1}}],["runs",{"2":{"964":1}}],["run方法",{"2":{"954":1,"964":1}}],["run也就是reactiveeffect的run",{"2":{"934":1}}],["run失败时生成对应的快照",{"2":{"878":1}}],["run进行测试后生成对应的视频文件",{"2":{"878":1}}],["runalltimers",{"2":{"870":1}}],["runnning",{"2":{"1034":1}}],["runner由很多可以在不同场景下运行构建的执行器",{"2":{"1162":1}}],["runner类型",{"0":{"1161":1}}],["runner缓存",{"2":{"1159":1}}],["runner在注册后会生成对应的配置文件",{"2":{"1159":1}}],["runner的标签",{"2":{"1158":1}}],["runner的注册token需要从gitlab中获取",{"2":{"1155":1}}],["runner相关描述",{"2":{"1158":1}}],["runner注册token",{"2":{"1158":1}}],["runner注册文档地址",{"2":{"1154":1}}],["runner基础镜像",{"2":{"1158":1}}],["runner执行器",{"0":{"1162":1},"1":{"1163":1,"1164":1,"1165":1,"1166":1,"1167":1,"1168":1,"1169":1},"2":{"1158":1,"1159":1}}],["runner=",{"2":{"1157":1}}],["runner安装与配置",{"0":{"1150":1},"1":{"1151":1,"1152":1,"1153":1,"1154":1,"1155":1,"1156":1,"1157":1,"1158":1,"1159":1,"1160":1,"1161":1,"1162":1,"1163":1,"1164":1,"1165":1,"1166":1,"1167":1,"1168":1,"1169":1}}],["runners",{"2":{"818":1,"1159":9}}],["runner",{"2":{"251":1,"818":1,"964":1,"1121":20,"1122":1,"1126":1,"1132":5,"1151":1,"1152":2,"1153":6,"1154":1,"1156":7,"1157":16,"1158":1,"1159":5,"1160":3,"1163":1,"1164":1,"1165":1,"1168":1,"1169":2,"1171":1}}],["running",{"2":{"56":1,"251":2,"404":1,"455":1,"573":1,"578":2,"723":1,"728":1,"857":1,"1074":1,"1082":1,"1157":2,"1179":2,"1214":3,"1217":21,"1218":2,"1225":1}}],["runtimerequesttimeout",{"2":{"1212":1}}],["runtimes",{"2":{"1209":3}}],["runtime+comiler版",{"2":{"237":1}}],["runtime+compiler",{"2":{"237":1}}],["runtime版本",{"2":{"237":1}}],["runtime",{"2":{"180":4,"190":1,"237":13,"238":7,"525":2,"703":1,"944":1,"954":3,"1074":1,"1157":1,"1207":1,"1209":24,"1217":1}}],["run",{"0":{"1058":1},"2":{"56":3,"126":3,"175":1,"176":1,"177":1,"179":1,"181":1,"182":2,"190":2,"218":1,"573":1,"578":2,"587":6,"703":7,"708":2,"709":1,"718":4,"800":2,"813":1,"814":2,"860":1,"864":1,"874":1,"875":1,"879":1,"934":3,"938":3,"942":1,"944":4,"945":3,"954":1,"964":3,"995":1,"1002":1,"1004":6,"1024":1,"1034":2,"1038":1,"1051":3,"1054":2,"1055":3,"1056":1,"1058":2,"1062":1,"1063":3,"1064":3,"1065":4,"1070":2,"1073":3,"1074":2,"1076":1,"1081":1,"1082":2,"1090":2,"1094":1,"1103":1,"1116":5,"1125":1,"1132":1,"1141":1,"1145":1,"1153":3,"1156":1,"1157":6,"1158":1,"1159":2,"1171":2,"1172":1,"1179":1,"1190":1,"1209":2,"1212":2,"1214":4}}],["reboot",{"2":{"1198":1,"1203":1}}],["reuseport",{"2":{"727":1}}],["re",{"2":{"713":1,"800":2}}],["rewind",{"2":{"251":1}}],["rewrite等几个来调试",{"2":{"418":1}}],["rewrite",{"0":{"715":1},"2":{"132":1,"414":1,"715":1,"726":2,"729":1}}],["recipe",{"2":{"1179":3}}],["reclaimable",{"2":{"994":1}}],["recess",{"2":{"846":2}}],["received",{"2":{"621":1,"1063":1,"1064":2}}],["receiver",{"2":{"251":1,"958":4,"959":4,"960":2,"964":5}}],["reconfigured",{"2":{"1179":1}}],["reconfigure",{"2":{"1179":1}}],["recommended",{"2":{"831":2,"840":1,"846":3}}],["record",{"2":{"229":2,"230":1,"232":3,"581":1,"637":1,"920":1,"950":1,"951":3,"955":1,"959":1,"960":1}}],["recv",{"2":{"383":1,"1209":1}}],["recycle",{"2":{"251":1}}],["revision=5316d4ac",{"2":{"1157":1}}],["revision",{"2":{"1121":2}}],["reveal",{"2":{"800":1,"801":1}}],["revert",{"2":{"797":1,"801":2}}],["reverse",{"2":{"83":1,"301":1,"414":1,"656":1,"955":2}}],["revalidate",{"2":{"720":2,"721":1}}],["revokeobjecturl",{"2":{"497":1,"521":1}}],["revolving",{"2":{"251":1}}],["render前先对",{"2":{"951":1}}],["renderfn",{"2":{"951":6}}],["render获取计算属性值时触发",{"2":{"934":1}}],["render函数会生成vnode此过程会获取到对应的对象就会触发getter",{"2":{"954":1}}],["render函数",{"2":{"954":2}}],["render函数生成vnode",{"2":{"953":1}}],["render函数后面访问计算属性不再执行",{"2":{"933":1}}],["render函数第一次访问计算属性",{"2":{"933":1}}],["renderpage",{"2":{"675":1}}],["renderproxy",{"2":{"239":1}}],["rendersrc",{"2":{"244":2,"248":1}}],["rendermixin",{"2":{"238":2,"239":1}}],["rendermap",{"2":{"206":2,"756":2}}],["render等做为参数选项传入",{"2":{"236":1}}],["render",{"0":{"926":1},"2":{"199":1,"207":2,"229":1,"230":1,"231":1,"232":1,"238":1,"244":5,"248":1,"249":1,"639":1,"671":1,"675":1,"749":1,"757":2,"875":1,"931":1,"934":1,"951":5,"953":1,"954":10,"955":1,"971":2}}],["rename",{"2":{"62":1}}],["removal",{"2":{"404":2}}],["removesub",{"2":{"940":1}}],["remove",{"2":{"404":1,"521":1,"944":1,"945":1,"1045":1,"1082":1,"1093":1,"1209":1}}],["removechild",{"2":{"404":1}}],["removemanager",{"2":{"245":2,"247":1}}],["removeattributequotes",{"2":{"176":1,"190":2}}],["remote",{"2":{"97":1,"414":1,"418":1,"438":1,"439":1,"729":1,"1142":2,"1183":1}}],["reject",{"2":{"98":21,"229":1,"230":2,"244":2,"770":3,"771":8}}],["rejected",{"2":{"98":4,"621":2}}],["retry",{"0":{"1132":1},"2":{"771":16,"772":1,"1132":14,"1148":1}}],["retransmission",{"2":{"389":1}}],["retries",{"2":{"381":1,"390":1,"721":1}}],["retrieve",{"2":{"97":1}}],["ret",{"2":{"205":3,"755":3}}],["returns",{"2":{"1209":2}}],["returntypes",{"2":{"227":1}}],["returnvalue",{"2":{"200":2,"750":2}}],["return",{"0":{"716":1},"2":{"7":1,"8":1,"9":3,"26":1,"33":2,"40":11,"57":1,"60":1,"61":2,"62":5,"63":6,"64":7,"98":9,"132":1,"145":1,"154":1,"196":2,"197":8,"198":2,"199":2,"201":2,"202":1,"205":5,"206":1,"225":2,"228":3,"229":7,"230":5,"231":4,"232":3,"233":4,"237":2,"238":3,"244":2,"245":1,"247":1,"248":1,"249":1,"339":1,"404":1,"507":1,"514":1,"516":1,"529":2,"532":1,"546":11,"576":3,"579":1,"581":1,"583":7,"590":1,"595":2,"606":2,"609":1,"612":4,"613":7,"615":1,"616":1,"617":1,"618":1,"619":3,"622":1,"639":1,"642":1,"643":2,"645":2,"646":1,"648":3,"651":2,"655":2,"667":1,"674":2,"675":1,"683":1,"687":5,"692":1,"696":2,"700":1,"702":2,"715":2,"724":1,"746":2,"747":8,"748":2,"749":2,"751":2,"752":1,"755":5,"756":1,"765":2,"768":2,"769":2,"770":1,"771":4,"772":2,"773":1,"865":1,"866":2,"868":1,"874":2,"875":3,"880":1,"894":1,"903":1,"929":1,"930":1,"931":1,"932":5,"934":5,"937":1,"938":5,"940":1,"941":3,"944":3,"945":5,"950":2,"951":7,"954":7,"955":4,"956":4,"958":2,"959":5,"960":3,"961":2,"962":1,"963":2,"964":11,"971":1,"1034":1}}],["release=1",{"2":{"1054":1,"1055":2}}],["release",{"2":{"794":1,"797":1,"1121":1}}],["releases",{"2":{"93":1,"1208":1}}],["relro",{"2":{"708":1,"718":2}}],["relieved",{"2":{"251":2}}],["relaxed",{"2":{"251":1}}],["relation",{"2":{"268":1}}],["relative",{"2":{"12":1,"13":1,"14":1,"15":1}}],["related",{"2":{"222":1,"801":1}}],["rel=",{"2":{"222":2,"350":1,"671":1}}],["reloaded",{"2":{"1157":1}}],["reload",{"2":{"128":1,"708":1,"718":1,"1039":1,"1045":1,"1083":1,"1208":2,"1209":1}}],["readiness",{"2":{"1218":1}}],["readdirsync",{"2":{"770":1}}],["readonly",{"2":{"606":4,"608":1,"624":2,"626":1,"629":1,"631":1,"646":2,"648":1,"661":4,"666":1,"683":2,"685":2,"686":2,"920":3,"934":3,"944":1,"963":2,"964":1}}],["readfile",{"2":{"539":1}}],["readfilesync",{"2":{"507":1}}],["ready",{"2":{"516":1,"1217":4,"1218":1}}],["readystate",{"2":{"504":1}}],["readstream",{"2":{"512":2}}],["read来读取",{"2":{"512":1}}],["read",{"2":{"496":1,"510":3,"512":2,"517":3,"723":1,"726":6,"1178":6}}],["readable",{"2":{"512":2}}],["readablestreamdefaultreader",{"2":{"512":1}}],["readablestreamdefaultcontroller",{"2":{"510":1}}],["readablestream构造函数返回一个可读流实例",{"2":{"510":1}}],["readablestream",{"0":{"509":1},"1":{"510":1,"511":1,"512":1},"2":{"337":1,"493":1,"496":2,"508":4,"509":1,"510":2,"512":5,"517":1,"518":1}}],["readasbinarystring",{"2":{"506":1}}],["readasdataurl",{"2":{"506":1}}],["readasarraybuffer",{"2":{"506":1,"507":1,"772":1,"773":1}}],["readastext",{"2":{"354":1,"496":1,"506":1}}],["reader对象",{"2":{"512":1}}],["reader",{"2":{"354":4,"496":4,"503":1,"507":2,"508":1,"512":2,"517":2,"770":4,"772":3,"773":3}}],["readme",{"2":{"54":3,"270":1,"293":1,"665":2,"1107":1,"1189":1}}],["realworld",{"2":{"883":1}}],["realonly",{"2":{"828":1}}],["realip",{"2":{"708":2,"718":4}}],["real",{"2":{"128":1,"239":1,"339":1,"723":3,"724":1,"1034":1}}],["reason",{"2":{"98":11,"510":1,"514":1,"771":1,"1132":1}}],["reactivemap",{"2":{"964":1}}],["reactive",{"2":{"959":3,"960":4,"962":1,"964":5,"965":1}}],["reactivesetter",{"2":{"954":1,"955":1}}],["reactivegetter",{"2":{"954":1,"955":1}}],["reactiveeffect实现",{"2":{"964":1}}],["reactiveeffectrunner",{"2":{"964":1}}],["reactiveeffectoptions",{"2":{"964":1}}],["reactiveeffect",{"2":{"934":7,"944":2,"945":1,"964":5}}],["reactivity",{"2":{"934":2,"964":7}}],["react可以写成",{"2":{"831":1}}],["react可以写成react",{"2":{"831":1}}],["react简写",{"2":{"831":1}}],["react或angular",{"2":{"786":1}}],["react使用nextjs",{"2":{"784":1}}],["reactnative",{"2":{"464":1}}],["react项目",{"2":{"405":1}}],["react中的children",{"2":{"207":1,"757":1}}],["react的高阶组件",{"2":{"199":1,"749":1}}],["react",{"0":{"884":1},"2":{"92":1,"125":2,"130":2,"199":3,"229":1,"230":1,"231":1,"405":1,"671":1,"677":1,"749":3,"784":2,"831":23,"833":1}}],["repo",{"2":{"707":2,"1082":2,"1093":2,"1209":2,"1210":2}}],["repo的文件",{"2":{"707":1}}],["repositry",{"2":{"995":1,"1081":1}}],["repository相当于数据库用来映射文件路径",{"2":{"1097":1}}],["repository",{"2":{"727":1,"998":3,"1002":3,"1039":1,"1042":1,"1046":2,"1098":3,"1102":2,"1103":3,"1107":3,"1108":1,"1121":2,"1184":1,"1191":1,"1192":1,"1214":1}}],["repos",{"2":{"707":1,"1210":3}}],["reports",{"2":{"857":1}}],["reporting",{"2":{"350":1,"355":1}}],["report",{"2":{"350":15,"454":1,"874":1,"1139":1}}],["replication",{"2":{"1098":5}}],["reply数据包",{"2":{"454":1}}],["replay",{"2":{"431":1}}],["replacement",{"2":{"715":1}}],["replacement>",{"2":{"715":1}}],["replacechild",{"2":{"404":1}}],["replaced",{"2":{"201":1,"751":1}}],["replace",{"2":{"60":2,"137":1,"145":5,"154":5,"520":1,"674":1,"886":1,"894":5,"903":5}}],["repeat",{"2":{"83":1,"251":2,"414":1}}],["refs",{"2":{"1122":1,"1143":1}}],["ref",{"2":{"934":2,"962":3,"964":1,"1121":5,"1122":1}}],["refactor",{"2":{"789":1,"797":1,"800":1,"801":3}}],["refers",{"2":{"1039":1,"1046":1}}],["referrer",{"2":{"1007":1}}],["reference=",{"2":{"998":1}}],["reference=nginx",{"2":{"998":1,"1002":2}}],["reference",{"2":{"879":1,"1035":1,"1045":1,"1076":3,"1217":2}}],["referencenode",{"2":{"462":1}}],["referer头可能被篡改",{"2":{"353":1}}],["referer",{"2":{"132":1,"319":1,"353":1,"520":5,"709":1,"722":7}}],["referers",{"2":{"132":1,"353":1,"722":3}}],["refencenode",{"2":{"462":1}}],["refused",{"2":{"379":1,"1039":1}}],["reflect方法提供了多个静态方法",{"2":{"958":1}}],["reflect等api",{"2":{"957":1}}],["reflector",{"2":{"648":4}}],["reflect",{"0":{"227":1},"2":{"226":1,"229":2,"232":1,"958":2,"959":2,"960":1,"964":2}}],["refreshcaptcha",{"2":{"61":2}}],["ref=",{"2":{"61":1}}],["requset",{"2":{"436":1}}],["request请求即可",{"2":{"1225":1}}],["requestlist",{"2":{"771":3,"772":6}}],["requestqueue",{"2":{"771":7}}],["requestmethod",{"2":{"635":2}}],["request>",{"2":{"619":1,"639":1,"648":1,"674":1}}],["requestanimation会在每次更新视图前执行",{"2":{"535":1}}],["requestanimationframe也会执行60次",{"2":{"535":1}}],["requestanimationframe是微任务还是宏任务",{"2":{"535":1}}],["requestanimationframe",{"0":{"535":1},"2":{"535":1}}],["requestrange",{"2":{"520":3}}],["requeststart",{"2":{"325":1}}],["requests",{"2":{"317":1,"1121":1,"1122":1}}],["request",{"0":{"446":1,"447":1},"2":{"230":1,"317":2,"320":2,"325":1,"337":6,"344":3,"351":1,"400":1,"401":1,"404":1,"405":1,"406":1,"436":1,"453":1,"520":1,"606":3,"614":3,"619":3,"625":1,"634":2,"639":3,"645":1,"646":1,"648":3,"656":2,"674":4,"692":2,"696":1,"702":2,"708":1,"718":2,"729":2,"771":8,"772":3,"966":1,"1007":1,"1074":1,"1121":2,"1122":22,"1136":3,"1225":2}}],["requires=cri",{"2":{"1208":1}}],["requirements",{"2":{"1065":3,"1121":1}}],["requirepragma",{"2":{"839":1}}],["required",{"2":{"669":2,"686":2,"920":1,"1209":1}}],["requiredid",{"2":{"645":2}}],["requireid",{"2":{"645":1}}],["require",{"2":{"34":1,"60":1,"62":4,"64":4,"175":1,"176":1,"184":1,"190":12,"237":1,"347":1,"354":4,"455":1,"539":1,"723":1,"863":2,"878":2,"880":4,"1034":1,"1074":2,"1103":1,"1184":1}}],["req",{"2":{"57":7,"61":4,"62":2,"64":3,"343":1,"344":1,"350":3,"354":1,"404":1,"455":4,"520":5,"614":5,"634":3,"692":5,"696":3,"723":2,"726":3,"1034":2,"1074":4,"1178":4}}],["regarding",{"2":{"1225":1}}],["regular",{"2":{"1214":1}}],["registration",{"2":{"1157":3,"1158":1}}],["registries",{"2":{"1039":1,"1045":1}}],["registry=https",{"2":{"1187":1}}],["registry=http",{"2":{"1102":1,"1107":2,"1187":1,"1190":1,"1191":1}}],["registry",{"2":{"1011":7,"1012":2,"1013":2,"1038":6,"1039":2,"1045":1,"1083":2,"1102":2,"1103":1,"1121":12,"1190":2,"1192":2,"1209":7,"1212":1,"1214":1}}],["registry进行搜索",{"2":{"999":1}}],["registering",{"2":{"1157":1}}],["registerauthenticationroute",{"2":{"648":4}}],["registeras",{"0":{"631":1},"2":{"631":1,"669":1}}],["registeras等几种工具方法",{"2":{"627":1}}],["registered",{"2":{"251":1,"1157":1}}],["register",{"2":{"57":1,"222":2,"609":2,"648":1,"1154":1,"1156":2,"1157":5}}],["reg4",{"2":{"144":3,"893":3}}],["reg3",{"2":{"144":2,"893":2}}],["reg2",{"2":{"144":3,"145":1,"893":3,"894":1}}],["reg1",{"2":{"144":2,"145":3,"893":2,"894":3}}],["reg",{"2":{"137":2,"138":8,"145":11,"152":13,"153":2,"154":1,"886":2,"887":8,"894":11,"901":13,"902":2,"903":1}}],["regexp>",{"2":{"611":1,"715":1}}],["regexpstringiterator",{"2":{"154":2,"903":2}}],["regexp属性",{"0":{"151":1,"900":1},"1":{"152":1,"153":1,"901":1,"902":1}}],["regexp",{"2":{"40":2,"43":1,"44":1,"60":5,"85":1,"138":1,"145":3,"154":2,"546":2,"549":1,"550":1,"573":1,"576":1,"611":1,"697":1,"715":1,"857":1,"887":1,"894":3,"903":2,"938":1}}],["resources",{"2":{"1179":1,"1217":1}}],["resolution",{"2":{"295":1,"301":1}}],["resolver",{"2":{"674":1}}],["resolvers",{"2":{"673":1}}],["resolves",{"2":{"621":1,"866":2}}],["resolved",{"2":{"621":3}}],["resolve4",{"2":{"532":2}}],["resolve3",{"2":{"532":2}}],["resolve2",{"2":{"532":3}}],["resolve1",{"2":{"532":3}}],["resolveconstructoroptions",{"2":{"239":1}}],["resolve也是webpack自带的选项",{"2":{"186":1}}],["resolvepromise",{"2":{"98":5}}],["resolve",{"0":{"186":1},"2":{"64":5,"98":25,"132":1,"175":2,"176":1,"186":3,"190":9,"229":2,"230":2,"237":10,"244":2,"344":1,"514":2,"516":2,"520":1,"532":6,"538":2,"540":1,"606":1,"628":1,"673":1,"674":1,"695":2,"697":1,"702":2,"770":2,"771":9,"865":2,"878":1,"880":1}}],["resize",{"2":{"718":3}}],["resid",{"2":{"354":3}}],["reset",{"2":{"376":1,"1174":1}}],["response>",{"2":{"639":1,"651":1}}],["response的body属性是一个",{"2":{"512":1}}],["response的body属性",{"2":{"509":1}}],["response",{"0":{"518":1},"2":{"344":1,"355":1,"518":1,"520":1,"614":3,"633":1,"634":2,"637":1,"639":5,"650":1,"651":4,"652":1,"692":1,"695":1,"696":1,"700":2,"1039":1}}],["responseend",{"2":{"325":1}}],["restrict",{"2":{"1209":1}}],["restroom",{"2":{"251":1}}],["restarts",{"2":{"1217":1,"1218":1}}],["restartsec=2",{"2":{"1208":1}}],["restart和进入容器中使用gitlab",{"2":{"1179":1}}],["restart=always",{"2":{"1038":1,"1094":1,"1208":1}}],["restart字段只会在容器异常退出或停止时才会生效",{"2":{"1025":1}}],["restart重启一个容器",{"2":{"1004":1}}],["restart",{"0":{"1025":1},"2":{"703":1,"1004":1,"1025":3,"1039":2,"1045":1,"1074":1,"1083":1,"1153":1,"1160":2,"1171":2,"1172":1,"1173":1,"1179":4,"1209":2}}],["restful",{"2":{"678":1}}],["restores",{"2":{"1098":1}}],["restore",{"2":{"283":1,"289":1}}],["rest",{"2":{"247":3}}],["res",{"2":{"33":6,"57":3,"61":5,"62":6,"64":4,"98":2,"222":1,"338":2,"343":4,"344":2,"347":1,"350":3,"354":2,"404":3,"455":3,"514":2,"520":6,"521":5,"614":5,"634":2,"692":5,"695":3,"696":2,"700":5,"723":1,"724":4,"771":5,"772":1,"866":2,"867":2,"963":3,"964":5,"1034":6,"1074":2}}],["results",{"2":{"857":2,"869":1}}],["result1",{"2":{"83":1}}],["result",{"2":{"7":2,"8":3,"40":9,"57":3,"62":5,"64":1,"83":10,"354":1,"496":1,"504":1,"546":9,"772":1,"773":1,"955":4,"959":4,"960":4,"964":2,"1122":1}}],["redis",{"2":{"1018":6}}],["redirection",{"2":{"317":4}}],["redirect",{"2":{"128":1,"132":1,"317":1,"617":3,"709":1,"715":4,"729":1,"1177":2}}],["reduce",{"2":{"485":1,"687":2}}],["reduced",{"2":{"376":1}}],["redux",{"2":{"208":1,"758":1}}],["redux中的",{"2":{"199":1,"749":1}}],["red",{"2":{"12":1,"22":4,"83":1,"145":2,"251":4,"534":4,"535":3,"708":1,"850":1,"894":2}}],["0并设置开机启动",{"2":{"1211":1}}],["0g",{"2":{"1203":2}}],["0版本",{"2":{"1194":1}}],["0版本的",{"2":{"70":1}}],["0+",{"2":{"1181":1,"1185":1}}],["0≤n≤2",{"2":{"1132":1}}],["0mb",{"2":{"1208":1}}],["0m",{"2":{"1082":1}}],["03",{"2":{"994":4,"1007":1,"1082":1,"1090":1}}],["0370",{"2":{"366":2}}],["0b",{"2":{"994":2,"1203":1}}],["069",{"2":{"1064":2}}],["064",{"2":{"1063":2}}],["06",{"2":{"723":1,"1007":2,"1236":1}}],["0spzz3dbzzhpm",{"2":{"1189":1}}],["0s",{"2":{"703":14,"1051":13,"1054":8,"1055":8,"1209":2,"1212":24}}],["0x10",{"2":{"485":1}}],["0xtg",{"2":{"61":1}}],["0db8",{"2":{"366":2}}],["0一种特殊的ip",{"2":{"361":1}}],["0地址",{"2":{"361":1}}],["0地址不能作为ip",{"2":{"358":1}}],["0的区别",{"2":{"361":1}}],["0被保留作为本地环回地址",{"2":{"359":1}}],["04",{"2":{"347":1,"728":1,"1208":2}}],["05s",{"2":{"800":1}}],["05",{"2":{"298":1,"454":1,"1082":1,"1208":1}}],["0aad8cc1e782",{"2":{"1039":1,"1046":2}}],["0a",{"2":{"298":1}}],["0️⃣",{"2":{"251":1}}],["0755",{"2":{"1208":1}}],["07",{"2":{"193":1,"454":1,"640":1,"646":1,"720":1,"1063":2,"1064":4}}],["0个也会匹配",{"2":{"141":1,"890":1}}],["0node",{"2":{"96":1}}],["0~255",{"2":{"359":1}}],["0~223",{"2":{"359":1}}],["0~239",{"2":{"359":1}}],["0~23",{"2":{"83":1}}],["0~191",{"2":{"359":1}}],["0~127",{"2":{"359":1}}],["0~53",{"2":{"83":1}}],["0~59",{"2":{"83":1}}],["08",{"2":{"62":1,"343":1,"453":1,"728":6,"1208":1}}],["0070s",{"2":{"454":1}}],["00a0c91e6bf6",{"2":{"316":1}}],["0000000000000000000000000000000000000000",{"2":{"1121":1}}],["0000",{"2":{"366":2}}],["000",{"2":{"137":4,"886":4}}],["005hv6avgy1gvn4e450oxj602",{"2":{"132":1}}],["00",{"2":{"60":1,"83":2,"297":5,"454":5,"521":1,"720":1,"994":4,"1090":26}}],["09",{"2":{"60":1,"342":1,"1232":1}}],["02s",{"2":{"860":1}}],["02",{"2":{"44":1,"454":1,"550":1,"1005":1,"1090":3,"1209":1,"1236":1}}],["0123456789abcdef",{"2":{"1212":1}}],["0121",{"2":{"410":1}}],["0101",{"2":{"367":1}}],["01",{"2":{"40":1,"347":1,"546":1,"1007":2}}],["0px",{"2":{"16":1,"245":1}}],["0",{"2":{"13":4,"40":1,"41":7,"43":8,"46":1,"47":1,"60":2,"62":3,"63":2,"64":2,"68":1,"78":1,"90":1,"96":1,"98":1,"108":1,"110":4,"111":2,"112":2,"128":2,"131":1,"132":4,"134":1,"139":5,"141":3,"152":2,"154":1,"157":1,"177":4,"179":1,"182":4,"187":2,"190":2,"195":3,"197":1,"201":1,"203":1,"205":2,"218":1,"222":1,"233":2,"237":1,"239":1,"245":1,"247":1,"283":1,"285":1,"321":2,"329":7,"347":2,"359":21,"360":7,"361":20,"364":4,"381":1,"382":16,"383":55,"400":2,"404":1,"410":2,"425":2,"454":1,"462":1,"482":1,"485":6,"489":1,"491":3,"497":3,"499":1,"504":1,"510":1,"514":2,"517":1,"520":2,"521":6,"532":1,"533":1,"534":1,"546":1,"547":7,"549":8,"552":1,"553":1,"594":3,"595":2,"660":1,"671":1,"674":1,"687":2,"697":1,"703":12,"708":1,"713":1,"717":2,"720":1,"726":4,"727":1,"728":4,"729":3,"745":3,"747":1,"751":1,"753":1,"755":2,"765":1,"768":2,"770":1,"771":4,"772":2,"773":1,"797":2,"800":2,"801":3,"814":21,"830":2,"860":2,"864":6,"869":7,"874":2,"875":2,"888":5,"890":3,"901":2,"903":1,"936":1,"937":1,"938":1,"943":1,"951":1,"954":3,"955":2,"957":1,"964":1,"966":2,"994":3,"1005":5,"1007":4,"1051":13,"1054":15,"1055":9,"1063":12,"1064":15,"1074":2,"1082":5,"1084":5,"1085":6,"1090":22,"1102":2,"1103":15,"1107":5,"1108":7,"1121":38,"1151":1,"1153":1,"1156":1,"1157":4,"1159":1,"1170":1,"1178":4,"1183":3,"1184":13,"1187":2,"1189":6,"1190":3,"1191":7,"1205":1,"1208":5,"1209":18,"1211":3,"1212":17,"1214":5,"1217":12,"1218":15,"1228":2}}],["此命令会正式在master节点上初始化k8s集群",{"2":{"1214":1}}],["此值必须大于或等于2并且小于等于50",{"2":{"1134":1}}],["此密码值与",{"2":{"1121":1}}],["此",{"2":{"1121":1,"1122":1}}],["此作业并行运行的实例总数",{"2":{"1121":1}}],["此作业的环境部署级别",{"2":{"1121":1}}],["此作业的环境",{"2":{"1121":1}}],["此作业的环境名称",{"2":{"1121":1}}],["此过程就会触发检测的key对当前userwatcher的收集",{"2":{"938":1}}],["此过程会获取当前组件数据",{"2":{"954":1}}],["此过程会让computed对render进行收集",{"2":{"934":1}}],["此过程会设置activeeffect为当前computed",{"2":{"934":1}}],["此过程会访问响应式对应",{"2":{"932":1}}],["此过程会耗时",{"2":{"726":1}}],["此模块处理图像出现异常的情况下基本都是抛出415错误",{"2":{"718":1}}],["此模块针对前端方面的知识体系",{"2":{"271":1}}],["此依赖内部有过多次的升级",{"2":{"679":1}}],["此文件我们会进行默认值的处理",{"2":{"669":1}}],["此功能了解使用即可",{"2":{"654":1}}],["此方式使用docker",{"2":{"1173":1}}],["此方式不能代理xhr请求",{"2":{"407":1}}],["此方法都无法监听到值的改变",{"2":{"955":1}}],["此方法是个异步方法",{"2":{"512":1}}],["此方法会根据优先级调用tostring和valueof方法",{"2":{"40":1,"546":1}}],["此版本不支持",{"2":{"329":1}}],["此外还有多播",{"2":{"365":1}}],["此外还可以使用token的方式进行认证",{"2":{"348":1}}],["此外",{"2":{"298":1,"342":1,"720":1,"727":2,"1204":1}}],["此选项已经内置",{"2":{"187":1,"190":1}}],["此处不再赘述",{"2":{"1171":1}}],["此处为4",{"2":{"297":1}}],["此处为6",{"2":{"297":1}}],["此处`",{"2":{"140":1,"889":1}}],["此处",{"2":{"140":1,"889":1}}],["此处就不在详细展开",{"2":{"132":1}}],["此处引用上面的公共代码",{"2":{"12":2,"13":2,"14":2,"15":2,"16":2,"17":2}}],["此时我还没想到🐑",{"2":{"1236":1}}],["此时就会触发对象的getter进行依赖收集",{"2":{"954":1}}],["此时就会通过标记rst来重置连接",{"2":{"379":1}}],["此时i已经变成5了",{"2":{"594":1}}],["此时访问的是当前块级作用域的block",{"2":{"588":1}}],["此时并不能被访问到",{"2":{"588":1}}],["此时的walk就是undefined",{"2":{"587":1}}],["此时客户端进入timed",{"2":{"457":1}}],["此时客户端和服务端都有3个随机数",{"2":{"332":1}}],["此时服务端进入close",{"2":{"457":1}}],["此时服务端并不会立马发起关闭操作",{"2":{"457":1}}],["此时当前文件就会被保存到目标文件夹里了",{"2":{"407":1}}],["此时network面板会出现一个黄色三角形",{"2":{"407":1}}],["此时拥塞窗口的增加速率将变慢",{"2":{"393":1}}],["此时client只能收到报文而不能发送报文",{"2":{"384":1}}],["此时client进入syn",{"2":{"378":1}}],["此时server已经完全关闭",{"2":{"382":1}}],["此时server表现出繁忙的状态",{"2":{"380":1}}],["此时server进入syn",{"2":{"378":1}}],["此时连接会被添加到accept队列中",{"2":{"380":1}}],["此时主机b会主动发送一个rst的响应",{"2":{"379":1}}],["此时",{"2":{"301":1,"399":1,"571":1}}],["此时心里突然对",{"2":{"131":1}}],["此时再讲margin设为auto",{"2":{"13":1}}],["此次请求",{"2":{"131":1}}],["此项目2018年7天快速写的",{"2":{"66":1}}],["这次体温都保持在38°c以下属于低烧",{"2":{"1236":1}}],["这天周五早上起床",{"2":{"1236":1}}],["这几天不接电话",{"2":{"1232":1}}],["这几年大前端技术呈爆炸式发展中",{"2":{"271":1}}],["这虽然可以让系统在内存不足时继续运行",{"2":{"1203":1}}],["这将创建n个并行运行的统一作业的实例",{"2":{"1134":1}}],["这将影响到工具的稳定性",{"2":{"784":1}}],["这使得数据卷成为容器中数据持久化的理想选择",{"2":{"1110":1}}],["这使得在多容器应用中对于环境变量",{"2":{"1017":1}}],["这使得追踪更改",{"2":{"811":1}}],["这为客户端",{"2":{"977":1}}],["这具有巨大的意义",{"2":{"977":1}}],["这符合我们的预期",{"2":{"951":1}}],["这其中包括beforeeach",{"2":{"871":1}}],["这其实就是执行了父类的构造函数",{"2":{"583":1}}],["这其实就是组合继承和寄生继承的加强版",{"2":{"582":1}}],["这其实是不正确的",{"2":{"22":1}}],["这有助于提高团队的整体协作水平和项目成功率",{"2":{"794":1}}],["这有助于提高项目的可读性和可维护性",{"2":{"794":1}}],["这更有利于编写自动化工具",{"2":{"788":1}}],["这一项应填入",{"2":{"726":1,"1178":1}}],["这一点相比fiddler",{"2":{"420":1}}],["这一点很重要",{"2":{"146":1,"895":1}}],["这可以提高代码审查的效率",{"2":{"794":1}}],["这可以提高播放的响应速度和减少缓冲时间",{"2":{"344":1}}],["这可以显著减少传输数据的大小",{"2":{"717":1}}],["这类类都会被",{"2":{"605":1}}],["这类通常是js的一些漏洞",{"2":{"350":1}}],["这和我们讲的就有出入了",{"2":{"588":1}}],["这和所有对象都有",{"2":{"577":1}}],["这往往会变成深入了解js的绊脚石",{"2":{"585":1}}],["这又是为什么",{"2":{"583":1}}],["这再次说明了更新视图会在合适的点进行更新",{"2":{"534":1}}],["这难免会让用户产生一些想法",{"2":{"524":1}}],["这称为",{"2":{"485":3}}],["这也促使云原生的发展",{"2":{"1079":1}}],["这也就是为什么计算属性会缓存的真实面目",{"2":{"932":1}}],["这也就是为什么最后一行可以访问到inner的原因",{"2":{"588":1}}],["这也就是所谓的计算属性缓存",{"2":{"930":1}}],["这也就解释了u1",{"2":{"571":1}}],["这也是vue核心概念数据驱动视图",{"2":{"968":1}}],["这也是vue的问题",{"2":{"955":1}}],["这也是为什么vue的更新粒度可以做到组件的原因",{"2":{"946":1}}],["这也是个非常好的代码架构方式",{"2":{"575":1}}],["这也是以上u1",{"2":{"571":1}}],["这也符合js是个单线程语言的特征",{"2":{"526":1}}],["这也说明了异步的重要性",{"2":{"468":1}}],["这也太香了",{"2":{"130":1}}],["这导致服务端还没有收到客户端的ack报文",{"2":{"457":1}}],["这导致了网络之间的互操作性和标准化问题",{"2":{"309":1}}],["这两种方式都需要先安装docker",{"2":{"1036":1}}],["这两种模式都描述了怎样为对象提供一定程度上的间接引用",{"2":{"199":1,"749":1}}],["这两个方法是es6新添加的",{"2":{"575":1}}],["这两块位于fiddler面板底部和左下角",{"2":{"433":1}}],["这点可能已经吸了一大半的用户了吧",{"2":{"411":1}}],["这篇就来看看charles的使用",{"2":{"411":1}}],["这让错误排查变得棘手",{"2":{"408":1}}],["这通常是tcp的头部选项部分会多12字节的时间戳等信息",{"2":{"386":1}}],["这无疑会浪费网络资源",{"2":{"386":1}}],["这时dirty值为false",{"2":{"932":1}}],["这时将dirty设置为false",{"2":{"932":1}}],["这时就会重新执行render",{"2":{"934":1}}],["这时就会触发下方的getter函数",{"2":{"932":1}}],["这时就处于半打开状态",{"2":{"384":1}}],["这时候可以使用版本来标识不同的路由",{"2":{"654":1}}],["这时候有两种解决办法",{"2":{"206":1,"756":1}}],["这时客户端进入fin",{"2":{"457":1}}],["这意味着",{"2":{"384":1}}],["这便是session的原理",{"2":{"348":1}}],["这对于后期维护或者是错误定位及回滚尤其是大型项目将是个灾难",{"2":{"787":1}}],["这对于团队协作来说是不友好的",{"2":{"782":1}}],["这对于新手来说难免有些吃力",{"2":{"782":1}}],["这对于1m宽带的服务器来说加载很慢是肯定的",{"2":{"129":1}}],["这对外部来说隐藏了内部的真实地址",{"2":{"712":1}}],["这对外界都是透明的",{"2":{"330":1}}],["这对一些基础薄弱的小伙伴是非常不友好的",{"2":{"411":1}}],["这会在queue执行完后再执行postflushcbs中的回调",{"2":{"944":1}}],["这会大大减少程序运行的不确定性",{"2":{"541":1}}],["这会导致性能瓶颈",{"2":{"324":1}}],["这会对vue的构建有一些疑惑",{"2":{"236":1}}],["这就使得虚拟机这个东西非常庞大沉重",{"2":{"1078":1}}],["这就好比2人打电话",{"2":{"378":1}}],["这就是原理",{"2":{"931":1}}],["这就是原型链",{"2":{"571":1}}],["这就是响应式的过程",{"2":{"931":1}}],["这就是文件秒传的实现",{"2":{"772":1}}],["这就是作用域链",{"2":{"591":1}}],["这就是暂时性死区",{"2":{"588":1}}],["这就是构造函数继承",{"2":{"578":1}}],["这就是为什么当修改数据时页面也会实时更新的原因",{"2":{"952":1}}],["这就是为什么我们的例子可以写成字符串的形式",{"2":{"937":1}}],["这就是为什么",{"2":{"932":1}}],["这就是为什么打印顺序并不是一致的原因",{"2":{"539":1}}],["这就是为什么settimeout定义了1s执行却没有执行的本质原因",{"2":{"533":1}}],["这就是为什么实际网络中看到的是3次挥手的原因",{"2":{"382":1}}],["这就是前向安全性",{"2":{"334":1}}],["这就是http2的压缩技术",{"2":{"326":1}}],["这就是队头阻塞的问题",{"2":{"727":1}}],["这就是队头阻塞",{"2":{"322":1}}],["这就是打包入口",{"2":{"238":1}}],["这就保证了一个类只实例化一次",{"2":{"196":1,"746":1}}],["这三种方式拿到的结果都是构造函数",{"2":{"227":1}}],["这款工具",{"2":{"216":1}}],["这款工具不仅可以连接mysql数据库",{"2":{"70":1}}],["这正是我们现在所需要的",{"2":{"178":1}}],["这是任何金钱都换不来的宝贵财富",{"2":{"1232":1}}],["这是有多疼啊",{"2":{"1232":1}}],["这是我的博客系统",{"2":{"1223":1}}],["这是原生的bug",{"2":{"1202":1}}],["这是",{"2":{"1122":1}}],["这是硬伤也是object",{"2":{"955":1}}],["这是关键",{"2":{"955":1}}],["这是必须的",{"2":{"628":1,"631":1}}],["这是正常情况",{"2":{"582":1}}],["这是正常的论坛页面",{"2":{"352":1}}],["这是一种极为笼统且不严谨不专业的划分",{"2":{"1078":1}}],["这是一段很普通的定义变量的代码块",{"2":{"587":1}}],["这是一张非常经典的原型链图",{"2":{"571":1}}],["这是一个相对简单的模式",{"2":{"206":1,"756":1}}],["这是为什么呢",{"2":{"539":1,"579":1}}],["这是ip层协议的事情",{"2":{"455":1}}],["这是方便以后其他主机向目标主机通信",{"2":{"454":1}}],["这是由于一些系统硬编码的问题",{"2":{"425":1}}],["这是优化后的",{"2":{"129":1}}],["这是因为docker默认使用https的方式进行连接",{"2":{"1039":1}}],["这是因为当客户端发送了ack报文后",{"2":{"457":1}}],["这是因为现在有的app已经有了反抓包手段",{"2":{"439":1}}],["这是因为",{"2":{"32":1}}],["这要是真的是这样",{"2":{"129":1}}],["这种特殊的直接整合不再是",{"2":{"1207":1}}],["这种特性对于减小镜像构建体积作用很大",{"2":{"1059":1}}],["这种类型的执行器允许您使用已经创建的虚拟机",{"2":{"1164":1}}],["这种架构也天然的支持分布式远端构建",{"2":{"1069":1}}],["这种就是告诉外面容器内使用了1000端口",{"2":{"1022":1}}],["这种响应式的设计方式使得开发者可以更加方便地管理和更新应用程序的状态",{"2":{"968":1}}],["这种更新方式可以提高渲染性能",{"2":{"953":1}}],["这种写法后面你就会明白",{"2":{"936":1}}],["这种情况真是束手无策",{"2":{"1236":1}}],["这种情况可以使用多阶段构建解决",{"2":{"1070":1}}],["这种情况除非特殊情况尽量减少使用",{"2":{"786":1}}],["这种情况当然所有技术都可以选择",{"2":{"786":1}}],["这种形式",{"2":{"606":1}}],["这种功能可以将记录发给别人查看比较方便",{"2":{"414":1}}],["这种连接方式可以保证数据的有序传输",{"2":{"375":1}}],["这种加密算法需要一对密钥",{"2":{"330":1}}],["这种清除机制可以确保arp表中的信息是最新的",{"2":{"299":1}}],["这种以空间换时间的策略会提升性能",{"2":{"246":1}}],["这种以",{"2":{"146":1,"895":1}}],["这种条件下",{"2":{"83":1}}],["这种方法巧妙的将父类原型方法拿到自己身上",{"2":{"582":1}}],["这种方法虽然可以实现数组或对象深拷贝",{"2":{"32":1}}],["这种方式常用",{"2":{"1087":1}}],["这种方式可以方便地将一个容器迁移到另一台机器上",{"2":{"1010":1}}],["这种方式可以减少arp请求的次数",{"2":{"300":1}}],["这种方式应该用过",{"2":{"937":1}}],["这种方式引入文件",{"2":{"861":1}}],["这种方式比较成熟",{"2":{"582":1}}],["这种方式比较好理解",{"2":{"12":1}}],["这种方式最好理解",{"2":{"572":1}}],["这种方式控制台会开启debugger模式",{"2":{"399":1}}],["这种方式也被称为消息长度未确定",{"2":{"343":1}}],["这种方式也要求居中元素的宽高必须固定",{"2":{"13":1,"14":1}}],["这些东西又是比较敏感的信息",{"2":{"1092":1}}],["这些参数可以在构建时传递给",{"2":{"1054":1}}],["这些环境变量可以在容器内部使用",{"2":{"1024":1}}],["这些命令基本上囊括了docker常见的命令行使用方式",{"2":{"1015":1}}],["这些修改可以通过",{"2":{"1003":1}}],["这些容器实例都是基于同一个镜像创建的",{"2":{"1003":1}}],["这些api原生支持属性拦截",{"2":{"957":1}}],["这些特性只被现代浏览器支持",{"2":{"957":1}}],["这些特性使得http",{"2":{"322":1}}],["这些钩子函数是",{"2":{"881":1}}],["这些单测例子中随便点击一个就会测试对应的用例",{"2":{"877":1}}],["这些问题monorepo模式都可以解决",{"2":{"809":1}}],["这些条件以上框架其实都符合",{"2":{"786":1}}],["这些框架都是前端的新秀",{"2":{"786":1}}],["这些插件可以提供额外的功能和集成",{"2":{"784":1}}],["这些打包工具相信大家或多或少都用过",{"2":{"784":1}}],["这些都是大文件上传的通用技术",{"2":{"764":1}}],["这些会话密钥可以被重用来加速后续的ssl握手过程",{"2":{"726":1}}],["这些文件跳过不需要压缩",{"2":{"696":1}}],["这些组件可以被其他模块引用和使用",{"2":{"609":1}}],["这些元数据可以是类",{"2":{"606":1}}],["这些属性和方法都是定义在其构造函数的prototype",{"2":{"570":1}}],["这些异步任务会由浏览器不同的线程进行负责",{"2":{"527":1}}],["这些值需满足uint8的值范围",{"2":{"489":1}}],["这些视图对象享有共有的方法和属性",{"2":{"481":1}}],["这些视图对象看上去更像数组array",{"2":{"481":1}}],["这些视图对象只是用来解析buffer中的内容实际并不会储存任何内容",{"2":{"480":1}}],["这些场景都会涉及到二进制",{"2":{"478":1}}],["这些统计比较简单",{"2":{"459":1}}],["这些数据包在传输过程中可能会经过不同的路径",{"2":{"369":1}}],["这些技术效率低下",{"2":{"354":1}}],["这些字段的具体使用可以点击查看官方文档",{"2":{"350":1}}],["这些字段的值可以设置成自己配置允许的域名外",{"2":{"350":1}}],["这些恶意脚本代码会在他们的浏览器中执行",{"2":{"350":1}}],["这些攻击可能会导致用户隐私泄露",{"2":{"349":1}}],["这些协议决定了应用程序如何在网络上进行通信",{"2":{"310":1}}],["这些设备会监视网络中的arp请求",{"2":{"302":1}}],["这些映射关系就会被清除",{"2":{"299":1}}],["这些是现在比较方便的前端性能测试工具",{"2":{"221":1}}],["这些函数的第一个是ifnull",{"2":{"83":1}}],["这些可能都会让你产生困惑",{"2":{"36":1,"542":1}}],["这样虽然每个容器的ip不一致",{"2":{"1085":1}}],["这样体积就很小",{"2":{"1078":1}}],["这样会使镜像的体积减小很多",{"2":{"1070":1}}],["这样docker会帮你自动创建数据卷",{"2":{"1022":1}}],["这样data更新时就不会再被通知更新了",{"2":{"940":1}}],["这样借助vscode调试对于源码的阅读更加友好和清晰",{"2":{"966":1}}],["这样重新渲染页面就会看到新的数据了",{"2":{"955":1}}],["这样执行两者的过程中会访问到user属性",{"2":{"951":1}}],["这样很难让自己专注于某个功能",{"2":{"948":1}}],["这样深层嵌套的key就会收集当前的user",{"2":{"941":1}}],["这样深层嵌套的属性值改变时也会通知watcher进行更新",{"2":{"941":1}}],["这样render函数重新执行时就和第一次执行一致了",{"2":{"934":1}}],["这样当使用数组的方法修改时就可以正确派发更新了",{"2":{"961":1}}],["这样当在页面中点击按钮改变number的值时",{"2":{"934":1}}],["这样当数据传输到网络层时就不会有ip分片的发生了",{"2":{"369":1}}],["这样降低配置复杂性",{"2":{"846":1}}],["这样编辑器的插件就配置好了",{"2":{"838":1}}],["这样编辑器就会对不同的文件进行内容编写进行风格统一",{"2":{"836":1}}],["这样对于没有定义的全局变量就不会报错了",{"2":{"828":1}}],["这样对于后续的维护也会大大降低成本",{"2":{"666":1}}],["这样打包时就会有个先后顺序",{"2":{"818":1}}],["这样打开时就会被禁止掉403",{"2":{"353":1}}],["这样你可以从社区中获得支持",{"2":{"785":1}}],["这样服务器在接受到切片后可以按顺序整合文件",{"2":{"769":1}}],["这样再次访问时就会访问到另一节点的nginx上",{"2":{"728":1}}],["这样注入service就可以使用",{"2":{"622":1}}],["这样也会拥有其权限",{"2":{"1099":1}}],["这样也可以和项目中的文件路径保持一致",{"2":{"861":1}}],["这样也可以获取到指定的进度",{"2":{"521":1}}],["这样也方便动态控制值",{"2":{"606":1}}],["这样的代码时先执行computed函数",{"2":{"934":1}}],["这样的逻辑也合情合理",{"2":{"932":1}}],["这样的",{"2":{"606":1}}],["这样的引用数据类型的",{"2":{"25":1}}],["这样做会导致代码之间的耦合度很高",{"2":{"601":1}}],["这样做有利于解耦应用程序中的各个组件",{"2":{"601":1}}],["这样做可以降低应用程序代码的复杂度",{"2":{"601":1}}],["这样settimeout执行时就可以正确访问到i的值了",{"2":{"594":1}}],["这样child也会拥有parent自身上其他的属性",{"2":{"583":1}}],["这样child就会拥有name和run属性",{"2":{"578":1}}],["这样子类可以更加灵活的修改父类的实例属性",{"2":{"583":1}}],["这样子类就会拥有父类的实例属性name",{"2":{"583":1}}],["这样子类就会拥有父类的的属性和prototype中的属性方法",{"2":{"577":1}}],["这样在安装包文件时对于私库不存在的包就会代理到其他仓库下载",{"2":{"1104":1}}],["这样在访问",{"2":{"963":1}}],["这样在访问深层对象时",{"2":{"960":1}}],["这样在更新某个属性的值时只会触发对应key的所有cb执行",{"2":{"951":1}}],["这样在每次访问计算属性时都会执行它的函数",{"2":{"932":1}}],["这样在用例中就可以使用相对地址了tsmodule",{"2":{"879":1}}],["这样在测试用例中就可以使用相对路径了",{"2":{"878":1}}],["这样在运行相关代码时可以访问到自己作用域的属性",{"2":{"590":1}}],["这样在创建child实例时",{"2":{"582":1}}],["这样在apple接收到数据包后就知道了目标的mac地址了",{"2":{"454":1}}],["这样首先继承了parent的prototype对象中的属性和方法",{"2":{"582":1}}],["这样new生成的对象就会拥有实例属性和原型属性了",{"2":{"582":1}}],["这样继承子类可以拿到父类的属性还有prototype上的方法",{"2":{"577":1}}],["这样请求对于fiddler就是透明的",{"2":{"440":1}}],["这样看起来更直观也更方便",{"2":{"404":1}}],["这样窗口的增长速率会越来越小",{"2":{"394":1}}],["这样后面未在窗口内的数据段就会被放入窗口内等待发送",{"2":{"387":1}}],["这样下来双方都知道对方的身份并且知道电话已经打通了",{"2":{"378":1}}],["这样才不会觉得那么枯燥空洞",{"2":{"356":1}}],["这样用户下次访问时便会带上cookie",{"2":{"348":1}}],["这样将会严重浪费浪费流量",{"2":{"326":1}}],["这样客户端就可以提前获取到这些资源",{"2":{"325":1}}],["这样层层转发直到目标主机",{"2":{"311":1}}],["这样可以从官方的npm仓库中下载",{"2":{"1103":1}}],["这样可以在构建镜像时预先处理一些操作",{"2":{"1065":1}}],["这样可以避免将敏感信息硬编码到docker",{"2":{"1024":1}}],["这样可以避免arp缓存被污染",{"2":{"304":1}}],["这样可以针对不同的编辑器和操作系统进行风格统一",{"2":{"836":1}}],["这样可以提高团队的协同效率",{"2":{"811":1}}],["这样可以减少繁琐的配置",{"2":{"831":1}}],["这样可以减少维护多个独立仓库的复杂性",{"2":{"811":1}}],["这样可以减少代码冗余",{"2":{"811":1}}],["这样可以减少延迟和提高并发性",{"2":{"727":1}}],["这样可以根据不同的server模块进行划分配置",{"2":{"709":1}}],["这样可以隐藏服务器的真实ip地址",{"2":{"706":1}}],["这样可以使得发送方逐渐探测网络的可用带宽",{"2":{"393":1}}],["这样可以集中处理需要构建的目标版本等等",{"2":{"237":1}}],["这样以后发送到主机c的数据全都会发送到hacker的主机上",{"2":{"303":1}}],["这样以应用配置方便以后管理及维护",{"2":{"128":1}}],["这样arp表中就会一直保持这种映射关系",{"2":{"300":1}}],["这样写配置是不是更加友好",{"2":{"190":1}}],["这样他没有被一个",{"2":{"139":1,"888":1}}],["这样两个元素就不属于同一个bfc了",{"2":{"106":1,"110":1}}],["这样就防止了数据的污染",{"2":{"1097":1}}],["这样就完成了依赖的收集",{"2":{"953":1}}],["这样就完成了初次的依赖回收过程",{"2":{"934":1}}],["这样就减少了多处的修改",{"2":{"863":1}}],["这样就不会造成浏览器的卡顿了",{"2":{"771":1}}],["这样就不会造成浏览器的卡顿或崩溃了",{"2":{"771":1}}],["这样就不用再检测当前imagemanager了",{"2":{"242":1}}],["这样就大大提高了文件传输效率和速度",{"2":{"764":1}}],["这样就绕过了syn队列资源",{"2":{"381":1}}],["这样就可以使用npm",{"2":{"1106":1}}],["这样就可以知道服务的ip了",{"2":{"1090":1}}],["这样就可以精确的进行更新",{"2":{"946":1}}],["这样就可以自定义测试用例的位置了",{"2":{"878":1}}],["这样就可以对项目中的代码进行格式化了",{"2":{"839":1}}],["这样就可以统一输入内容",{"2":{"798":1}}],["这样就可以确定文件的唯一性了",{"2":{"772":1}}],["这样就可以实现文件的分片了",{"2":{"768":1}}],["这样就可以减少压缩消耗的时间",{"2":{"697":1}}],["这样就可以减小打包体积",{"2":{"130":1}}],["这样就可以形成统一的格式",{"2":{"650":1}}],["这样就可以直接使用不同状态的异常不需要再指定具体的状态码了",{"2":{"638":1}}],["这样就可以更快的解决错误了",{"2":{"408":1}}],["这样就可以在构建期间访问服务镜像",{"2":{"1146":1}}],["这样就可以在开发环境中查看错误的位置了",{"2":{"408":1}}],["这样就可以在vscode中直接调试了",{"2":{"401":1}}],["这样就可以捕获到匹配到里面的内容",{"2":{"145":1,"894":1}}],["这样就会正常的拦截到深层嵌套的属性了",{"2":{"960":1}}],["这样就会造成死循环不断执行回调函数",{"2":{"943":1}}],["这样就会重新执行render函数",{"2":{"932":1}}],["这样就会将当前controller接口划分到对应的名字",{"2":{"687":1}}],["这样就会转账成功",{"2":{"352":1}}],["这样就会提高响应速度",{"2":{"131":1}}],["这样就会满足1",{"2":{"48":1,"554":1}}],["这样就解决了margin重叠的问题",{"2":{"110":1}}],["这样就解决好了~",{"2":{"97":1}}],["这样就行啦",{"2":{"88":1}}],["这样联表的思路是",{"2":{"87":1}}],["这样",{"2":{"83":1,"304":1,"324":1,"997":1}}],["这个",{"2":{"1086":2}}],["这个命令可以让用户实时地查看容器中的输出信息",{"2":{"1005":1}}],["这个命令要加在语句的最后面",{"2":{"81":1}}],["这个函数很重要",{"2":{"954":1}}],["这个函数有三个参数",{"2":{"83":1}}],["这个闭包dep很重要",{"2":{"954":1}}],["这个api实现响应式的",{"2":{"949":1}}],["这个过程中就会访问到对应的响应式对象",{"2":{"945":1}}],["这个过程称为ip分片",{"2":{"369":1}}],["这个属性就会收集当前运行函数",{"2":{"959":1}}],["这个属性就是原型",{"2":{"571":1}}],["这个属性顾名思义同步执行",{"2":{"942":1}}],["这个很重要用来表示当前watcher为user",{"2":{"938":1}}],["这个就是",{"2":{"934":1}}],["这个就直接在vscode中调试了",{"2":{"400":1}}],["这个在",{"2":{"934":1}}],["这个步骤很关键也是重点",{"2":{"932":1}}],["这个库可以采用增量式形式对整个文件进行hash计算性能比较出色",{"2":{"772":1}}],["这个buffer就是文件内容",{"2":{"765":1}}],["这个比较简单",{"2":{"765":1}}],["这个变量是相对于",{"2":{"1121":1}}],["这个变量是客户端请求的动作",{"2":{"729":1}}],["这个变量总为",{"2":{"729":1}}],["这个变量",{"2":{"729":1}}],["这个变量可以限制连接速率",{"2":{"729":1}}],["这个变量可以被修改",{"2":{"729":1}}],["这个变量等于包含一些客户端请求参数的原始",{"2":{"729":1}}],["这个变量等于",{"2":{"729":1}}],["这个指令用于配置ssl会话缓存的超时时间",{"2":{"726":1}}],["这个指令用于配置ssl会话缓存",{"2":{"726":1}}],["这个非常重要",{"2":{"726":1,"1178":1}}],["这个已经成了约定的做法",{"2":{"669":1}}],["这个是什么",{"2":{"583":1}}],["这个方法也常来定义一个指定原型的对象",{"2":{"574":1}}],["这个对象会继承user的原型prototype",{"2":{"576":1}}],["这个对象的原型会指向构造函数的prototype属性",{"2":{"573":1}}],["这个对象有着原始对象属性值的一份精确拷贝",{"2":{"26":1}}],["这个读取器是一个",{"2":{"512":1}}],["这个例子自定义了一个可读流",{"2":{"510":1}}],["这个问题大概对于所有charles新手来说都会遇到",{"2":{"425":1}}],["这个设置可以直接在记录面板点击即可",{"2":{"414":1}}],["这个只监听当前元素被删除",{"2":{"404":1}}],["这个配置文件可以直接在工具bar运行",{"2":{"400":1}}],["这个值是根据ip层mtu",{"2":{"386":1}}],["这个原因其实和为啥要等待2msl道理一样",{"2":{"382":1}}],["这个层次包括了以太网",{"2":{"310":1}}],["这个层次包括许多协议",{"2":{"310":1}}],["这个也是前端性能测工具",{"2":{"221":1}}],["这个网站在国内",{"2":{"221":1}}],["这个工具",{"2":{"217":1}}],["这个构造过程就是工厂",{"2":{"201":1,"751":1}}],["这个关键字是这样的",{"2":{"90":1}}],["这个鄙人完全没有使用过",{"2":{"85":1}}],["这个加密过程是不可逆转的",{"2":{"83":1}}],["这个版本会让你自己设置密码",{"2":{"68":1}}],["这个目录必须先创建好",{"2":{"62":1}}],["这个相对来说简单直接套上面的表格即可",{"2":{"42":1,"548":1}}],["这里固定版本为1",{"2":{"1211":1}}],["这里固定返回的值为true",{"2":{"868":1}}],["这里写入了npmrc",{"2":{"1189":1}}],["这里修改前面的仓库",{"2":{"1187":1}}],["这里修改一个number返回对象",{"2":{"40":1,"546":1}}],["这里都会讲解到",{"2":{"1181":1}}],["这里讲述如何使用gitlab作为npm仓库方法",{"2":{"1181":1}}],["这里讲下除了可以选择权限外",{"2":{"1099":1}}],["这里容器中gitlab的位置为",{"2":{"1178":1}}],["这里http使用主机的80端口",{"2":{"1172":1}}],["这里指定",{"2":{"1184":1}}],["这里指定虚拟的ip192",{"2":{"1172":1}}],["这里指全局",{"2":{"587":1}}],["这里直接注册时打开",{"2":{"1158":1}}],["这里直接抓取所有的接口",{"2":{"454":1}}],["这里进行域名和hosts进行挂载",{"2":{"1153":1}}],["这里进行改造",{"2":{"243":1}}],["这里安装day",{"2":{"1103":1}}],["这里安装时就会报错",{"2":{"1103":1}}],["这里安装最新版",{"2":{"1082":1}}],["这里推荐使用第二种方式",{"2":{"1179":1}}],["这里推荐使用contenthash及文件内容不变",{"2":{"132":1}}],["这里推荐在项目创建",{"2":{"1102":1}}],["这里本人是在arm架构的centos上安装的",{"2":{"1094":1}}],["这里你可以选择根配置或者项目级别的配置都可以",{"2":{"1191":1}}],["这里你可以根据自己的需求安装指定版本的docker",{"2":{"1082":1}}],["这里你会看到有hosted",{"2":{"1098":1}}],["这里你首先要了解二进制相关的内容",{"2":{"768":1}}],["这里改为ping",{"2":{"1064":1}}],["这里执行ping",{"2":{"1063":1}}],["这里代理到网易加速地址",{"2":{"1042":1}}],["这里配置了http和https两个端口",{"2":{"1042":1}}],["这里每个值都会生成自己的ob",{"2":{"955":1}}],["这里ob是自己的ob",{"2":{"955":1}}],["这里根据流程给出对应的代码",{"2":{"954":1}}],["这里省略了computed",{"2":{"953":1}}],["这里更像react的useeffect",{"2":{"945":1}}],["这里user",{"2":{"938":1}}],["这里会创建hosted",{"2":{"1042":1}}],["这里会发现拉取不成功",{"2":{"1039":1}}],["这里会请求nginx",{"2":{"1034":1}}],["这里会通过parsepath将",{"2":{"938":1}}],["这里会对handler做统一处理",{"2":{"937":1}}],["这里最根本原因是内部使用了一些新的语言特性",{"2":{"957":1}}],["这里最重要的就是parsepath对exporfn的解析",{"2":{"938":1}}],["这里最好新建一个空文件夹",{"2":{"407":1}}],["这里lazy为true顾将dirty设置为true",{"2":{"932":1}}],["这里看下get和set实现",{"2":{"964":1}}],["这里看到",{"2":{"932":1}}],["这里看出两端通信的端口为54987",{"2":{"456":1}}],["这里基于vue3组件进行测试",{"2":{"875":1}}],["这里一定要使用try",{"2":{"868":1}}],["这里一台机器的ip为192",{"2":{"454":1}}],["这里模拟一个异步方法",{"2":{"865":1}}],["这里模拟两个网站",{"2":{"352":1}}],["这里jest版本为28+使用后者",{"2":{"864":1}}],["这里js引擎就处理了错误的赋值操作",{"2":{"38":1,"544":1}}],["这里创建",{"2":{"844":1}}],["这里选择docker",{"2":{"1158":1}}],["这里选择允许重发",{"2":{"1098":1}}],["这里选择",{"2":{"1097":1}}],["这里选择cypress作为端测框架",{"2":{"876":1}}],["这里选择在项目根目录中新建文件prettier",{"2":{"839":1}}],["这里选择feat",{"2":{"800":1}}],["这里选择了别人编译好的支持arm架构的镜像",{"2":{"1094":1}}],["这里选择了",{"2":{"9":1}}],["这里对值继续进行oberve",{"2":{"955":1}}],["这里对于多种技术我想说的更是偏向于项目中的多种技术框架",{"2":{"786":1}}],["这里对应",{"2":{"671":1}}],["这里采用宿主机卷映射",{"2":{"1094":1}}],["这里采用",{"2":{"772":1}}],["这里采用openssl自签证书",{"2":{"726":1}}],["这里按文件名作为文件夹",{"2":{"769":1}}],["这里停用主节点上的keepalived来演示宕机的情况",{"2":{"728":1}}],["这里显示我有两张网卡ens160和ens256",{"2":{"728":1}}],["这里准备两台虚拟机",{"2":{"728":1}}],["这里来讲quic协议",{"2":{"727":1}}],["这里将使用calico作为网络组件",{"2":{"1217":1}}],["这里将分别演示containerd和docker",{"2":{"1207":1}}],["这里将准备1台master节点",{"2":{"1196":1}}],["这里将会生成新的文件",{"2":{"713":1}}],["这里将列举常见的几种攻击",{"2":{"349":1}}],["这里希望接口的query参数类型为",{"2":{"683":1}}],["这里暂时使用了第三方的工具包",{"2":{"672":1}}],["这里已经在",{"2":{"670":1}}],["这里假如我们要创建一个有关用户信息模块的功能",{"2":{"666":1}}],["这里定义两个版本的方法来模拟不同版本",{"2":{"655":1}}],["这里定义以api开始的代表接口数据",{"2":{"639":1}}],["这里响应内容包裹了一层",{"2":{"651":1}}],["这里也通常对响应数据做一次包装进行返回",{"2":{"650":1}}],["这里也需要判断",{"2":{"247":1}}],["这里获取定义的元数据",{"2":{"648":1}}],["这里实现在每次http请求时打印请求日志",{"2":{"634":1}}],["这里注册命名空间变量",{"2":{"631":1}}],["这里注意使用了",{"2":{"145":1,"894":1}}],["这里注意是",{"2":{"145":1,"894":1}}],["这里导出test",{"2":{"608":1}}],["这里有一个坑",{"2":{"1103":1}}],["这里有两个开箱即用的http框架",{"2":{"603":1}}],["这里有人喜欢将其作为队列结构遵循先进先出的规则",{"2":{"532":1}}],["这里为了方便使用tsc直接编译",{"2":{"583":1}}],["这里为vue扩展了静态属性config并设置了一些配置属性",{"2":{"238":1}}],["这里录制了一个视频来动画展示其运行过程",{"2":{"532":1}}],["这里任务队列中只有一个settimeout定时任务",{"2":{"532":1}}],["这里没有演示",{"2":{"1039":1}}],["这里没有",{"2":{"800":1}}],["这里没有涉及到视图更新等等",{"2":{"532":1}}],["这里没有用内置的网络环境",{"2":{"420":1}}],["这里借用mdn的图",{"2":{"528":1}}],["这里需要注意配置docker的默认情况会使用cgroupfs来管理容器的资源",{"2":{"1208":1}}],["这里需要注意",{"2":{"938":1}}],["这里需要对以上的异步函数进行调整",{"2":{"868":1}}],["这里需要了解正则表达式使用",{"2":{"715":1}}],["这里需要知道用let关键字变量并没有改变js引擎会提前声明变量的规则",{"2":{"588":1}}],["这里需要知道当加载页面时会从上到下解析文档",{"2":{"526":1}}],["这里需要借助一个反射库",{"2":{"229":1}}],["这里主要来说下渲染进程",{"2":{"526":1}}],["这里主要是对其进行预加载",{"2":{"131":1}}],["这里只能查看使用docker创建管理的卷",{"2":{"1114":1}}],["这里只要知道会执行",{"2":{"954":1}}],["这里只看这一步即可",{"2":{"964":1}}],["这里只看",{"2":{"954":1}}],["这里只需知道",{"2":{"954":1}}],["这里只需要继承cz的规则",{"2":{"802":1}}],["这里只是演示一下如何触发依赖收集",{"2":{"951":1}}],["这里只是简单的演示下合并的逻辑",{"2":{"770":1}}],["这里只是扩展下nest的使用",{"2":{"678":1}}],["这里只是针对其中的某段版本内部架构进行说明",{"2":{"526":1}}],["这里只讲模板引擎",{"2":{"671":1}}],["这里只举一个重载",{"2":{"629":1}}],["这里只会对javascript一些经常提到的知识",{"2":{"477":1}}],["这里只列出了部分的字段",{"2":{"350":1}}],["这里解释一下两个问题",{"2":{"457":1}}],["这里设置允许重新发布相同版本",{"2":{"1042":1}}],["这里设置http头部connection=close表示请求完毕后立即断开连接",{"2":{"457":1}}],["这里设置断点http",{"2":{"419":1}}],["这里的compose",{"2":{"1034":1}}],["这里的exporfn就是计算属性的getter",{"2":{"932":1}}],["这里的大小值需减1",{"2":{"520":1}}],["这里的0位相对值",{"2":{"456":1}}],["这里的长度和tcp的长度一致",{"2":{"367":1}}],["这里开启一个node服务作为web服务器",{"2":{"455":1}}],["这里以root账户为例",{"2":{"1174":1}}],["这里以vue",{"2":{"858":1}}],["这里以http请求为例展开三次握手和四次挥手的细节",{"2":{"455":1}}],["这里以iphone为例",{"2":{"438":2}}],["这里以ios为例",{"2":{"422":1}}],["这里0表示坑位待目标填写",{"2":{"454":1}}],["这里使用了https",{"2":{"1176":1}}],["这里使用8422端口作为gitlab的ssh端口",{"2":{"1172":1}}],["这里使用docker安装",{"2":{"1171":1}}],["这里使用date命令代替了dockerfile中cmd的命令",{"2":{"1063":1}}],["这里使用vite简单创建一个demo",{"2":{"1073":1}}],["这里使用vscode进行eslint的集成",{"2":{"832":1}}],["这里使用set作为数据结构去重",{"2":{"951":1}}],["这里使用jest作为单元测试工具",{"2":{"855":1}}],["这里使用length和list两个属性",{"2":{"772":1}}],["这里使用linux的nmap扫描工具扫描网关",{"2":{"454":1}}],["这里使用ens256网卡地址",{"2":{"728":1}}],["这里使用ws作用底层的库使用",{"2":{"702":1}}],["这里使用url来控制",{"2":{"654":1}}],["这里使用curl发起服务请求",{"2":{"456":1}}],["这里使用nest框架",{"2":{"765":1}}],["这里使用nginx演示不是website",{"2":{"353":1}}],["这里使用nginx代理进行cors的配置",{"2":{"339":1}}],["这里使用nodejs简单的模拟银行转账的过程",{"2":{"352":1}}],["这里简单演示module绑定",{"2":{"652":1}}],["这里简单的实现一个通用的并发请求工具函数",{"2":{"771":1}}],["这里简单的使用切片的下角标作为索引位置",{"2":{"769":1}}],["这里简单的对语言值进行判断",{"2":{"674":1}}],["这里简单的了解下不做过深解释",{"2":{"588":1}}],["这里简单的概述下",{"2":{"454":1}}],["这里简单实现原理",{"2":{"576":1}}],["这里简单说下arp数据包中一些字段",{"2":{"454":1}}],["这里简单介绍下cookie和session",{"2":{"346":1}}],["这里简单介绍下tls1",{"2":{"331":1}}],["这里相对来说有了更广的过滤条件",{"2":{"453":1}}],["这里把抓包改为只抓远程的包",{"2":{"438":1}}],["这里列出默认变量",{"2":{"1120":1}}],["这里列出一张不同类型转换表格",{"2":{"41":1,"547":1}}],["这里列举一些常见的问题",{"2":{"424":1}}],["这里是官方地址",{"2":{"1014":1}}],["这里是docker",{"2":{"1004":1}}],["这里是关键",{"2":{"955":1}}],["这里是最外层的watcher",{"2":{"954":1}}],["这里是用来设置当前的watcher",{"2":{"954":1}}],["这里是手动写入",{"2":{"805":1}}],["这里是4字节",{"2":{"454":1}}],["这里是6字节",{"2":{"454":1}}],["这里是互联网提供的补丁连接",{"2":{"423":1}}],["这里是本人在工作或学习中get到的一些技能技巧",{"2":{"252":1}}],["这里自己手动操作一遍就可以了",{"2":{"415":1}}],["这里作者是macos",{"2":{"412":1,"450":1}}],["这里作者安装了1",{"2":{"93":1}}],["这里总结下二者",{"2":{"378":1}}],["这里介绍webpack中使用compression",{"2":{"697":1}}],["这里介绍使用中间件和nest提供的方法",{"2":{"691":1}}],["这里介绍下nest中如何配置跨域请求",{"2":{"691":1}}],["这里介绍常见的抵御方式",{"2":{"353":1}}],["这里介绍bfc的解决方案",{"2":{"111":1}}],["这里nodejs模拟一个上报接口",{"2":{"350":1}}],["这里举例用nginx配置https",{"2":{"328":1}}],["这里举例用nginx配置http2",{"2":{"323":1}}],["这里查看静态哈弗编码表",{"2":{"326":1}}],["这里我发了两次",{"2":{"1190":1}}],["这里我的虚拟机为centos7",{"2":{"1180":1}}],["这里我写成了一个脚本",{"2":{"1178":1}}],["这里我先简述一下vue响应式的整体过程",{"2":{"953":1}}],["这里我是在tsconfig中屏蔽掉cypress测试文件就可以了",{"2":{"882":1}}],["这里我选择使用electron",{"2":{"877":1}}],["这里我还是推荐大家使用轻量的vscode",{"2":{"785":1}}],["这里我以1",{"2":{"718":1}}],["这里我用nodejs监听9999端口号开启了一个web服务",{"2":{"453":1}}],["这里我们看最普通的reactive",{"2":{"964":1}}],["这里我们看浏览器环境下",{"2":{"954":1}}],["这里我们先来看看vue3的响应式是如何实现的吧👇",{"2":{"957":1}}],["这里我们简单调试下上面的代码",{"2":{"933":1}}],["这里我们尝试使用端测来测试vue3的组件",{"2":{"879":1}}],["这里我们点击todo",{"2":{"877":1}}],["这里我们选择第一个端到端测试",{"2":{"877":1}}],["这里我们使用启动chrome",{"2":{"966":1}}],["这里我们使用pnpm结合turbo一起使用",{"2":{"817":1}}],["这里我们使用ejs作为页面模板引擎",{"2":{"671":1}}],["这里我们往下看",{"2":{"586":1}}],["这里我们可以对class这种语法进行降级处理看看其实现方式",{"2":{"583":1}}],["这里我们需要先了解下浏览器的架构",{"2":{"526":1}}],["这里我们访问地址chls",{"2":{"422":1}}],["这里我们认定他使用http协议",{"2":{"311":1}}],["这里我在主机用terminal连接了虚拟机",{"2":{"383":1}}],["这里我下载了15",{"2":{"70":1}}],["这里先枚举出三种状态",{"2":{"244":1}}],["这里做了很好的区分",{"2":{"237":1}}],["这里可以看下一小节",{"2":{"1178":1}}],["这里可以从源码中定义初始化计算属性的getter时会进行判断",{"2":{"932":1}}],["这里可以获取到formdata中的",{"2":{"701":1}}],["这里可以使用joi进行验证",{"2":{"669":1}}],["这里可以直接注入test",{"2":{"608":1}}],["这里可以传入express类型",{"2":{"603":1}}],["这里可以做一些相关收集",{"2":{"230":1}}],["这里可以根据身份信息进行鉴权",{"2":{"127":1}}],["这里要注意loader的执行顺序",{"2":{"179":1}}],["这里不用了解太多",{"2":{"1069":1}}],["这里不展开讲了",{"2":{"954":1}}],["这里不区分大小写相当于",{"2":{"711":1}}],["这里不推荐在main",{"2":{"666":1}}],["这里不具体展开其实现算法",{"2":{"389":1}}],["这里不再赘述",{"2":{"1208":1}}],["这里不再演示了",{"2":{"649":1}}],["这里不再演示session的使用方法",{"2":{"348":1}}],["这里不再展开了",{"2":{"394":1}}],["这里不再展开",{"2":{"382":1}}],["这里不再介绍",{"2":{"348":1}}],["这里不再直接初始化intersectionobserver",{"2":{"247":1}}],["这里不做详细的问题分析",{"2":{"325":1}}],["这里不做详解",{"2":{"176":1}}],["这里不会进行拆箱",{"2":{"48":1,"554":1}}],["这里因为",{"2":{"141":1,"890":1}}],["这里涉及到了贪婪原则",{"2":{"141":1,"890":1}}],["这里演示npm仓库注册表来管理npm包",{"2":{"1185":1}}],["这里演示多个容器使用同一个网络",{"2":{"1090":1}}],["这里演示在centos中的安装过程",{"2":{"718":1}}],["这里演示卸载8",{"2":{"96":1}}],["这里演示下载8",{"2":{"96":1}}],["这里",{"2":{"83":1,"141":1,"184":1,"890":1}}],["这里笔者发现一个有趣的问题",{"2":{"48":1,"554":1}}],["这里就会把",{"2":{"945":1}}],["这里就会通知computed",{"2":{"934":1}}],["这里就简单的啃下源码",{"2":{"937":1}}],["这里就假设为渲染watcher",{"2":{"932":1}}],["这里就以lint为例",{"2":{"805":1}}],["这里就来谈谈常见的配置",{"2":{"690":1}}],["这里就来自定义语言的匹配规则",{"2":{"674":1}}],["这里就需要说明一个装饰器了",{"2":{"684":1}}],["这里就需要了解什么是变量提升了",{"2":{"588":1}}],["这里就需要了解tcp的延时确认机制",{"2":{"382":1}}],["这里就是替换这个值的原型",{"2":{"955":1}}],["这里就是改写",{"2":{"955":1}}],["这里就是让子类的prototype属性指向实例化后的父类实例",{"2":{"577":1}}],["这里就是网关被找到了",{"2":{"454":1}}],["这里就不再重复了",{"2":{"932":1}}],["这里就不再讲了",{"2":{"688":1}}],["这里就不介绍如何安装了",{"2":{"727":1}}],["这里就不介绍了",{"2":{"418":1,"718":1}}],["这里就不说了",{"2":{"581":1}}],["这里就不赘述了",{"2":{"428":1}}],["这里就做这么多介绍",{"2":{"354":1}}],["这里就可以在",{"2":{"243":1}}],["这里就提供几个小菜",{"2":{"48":1,"554":1}}],["这里就涉及到了类型的隐式转换",{"2":{"40":1,"546":1}}],["这里就涉及到了装箱和拆箱",{"2":{"36":1,"542":1}}],["这40",{"2":{"22":1}}],["pki",{"2":{"1212":2}}],["pkg",{"2":{"1054":1,"1055":2}}],["pkg2",{"2":{"814":1}}],["pkg1",{"2":{"814":3}}],["pkg安装包",{"2":{"68":1}}],["p和主机进行端口之间的映射",{"2":{"1062":1}}],["py文件",{"2":{"1065":1}}],["py",{"2":{"1056":1,"1065":2}}],["python3",{"2":{"1056":2,"1065":3}}],["python",{"2":{"785":1,"1065":4}}],["python等多线程语言对并发处理比较友好",{"2":{"524":1}}],["ps",{"2":{"1006":4,"1009":2}}],["psh",{"2":{"376":2,"455":1}}],["p2都会被执行",{"2":{"951":1}}],["p2都会打印正确的值",{"2":{"951":1}}],["p2都执行了",{"2":{"951":1}}],["p2使用name",{"2":{"951":1}}],["p2",{"2":{"951":5,"959":2}}],["p2的ip地址192",{"2":{"454":1}}],["p1",{"2":{"951":3,"959":1}}],["p1的ip地址192",{"2":{"454":1}}],["pnpm命令使用",{"2":{"815":1}}],["pnpm就是为解决monorepo问题而产生的的包管理方案",{"2":{"815":1}}],["pnpm",{"0":{"815":1},"2":{"815":2,"817":1,"966":2}}],["png|jpg|jpeg|gif|webp",{"2":{"720":2,"722":1}}],["png|jpeg|gif",{"2":{"717":1}}],["png|jpe",{"2":{"181":1,"190":1}}],["png中的alpha通道透明度始终保留",{"2":{"718":1}}],["png",{"2":{"198":1,"222":9,"245":1,"485":1,"497":1,"521":1,"701":1,"712":2,"717":1,"718":2,"748":1,"874":2}}],["pts",{"2":{"383":1}}],["ppp",{"2":{"312":1}}],["pwd",{"2":{"218":1,"703":1,"726":1,"1139":1,"1141":1}}],["pwa渐进式应用",{"0":{"222":1},"1":{"223":1}}],["pwa",{"2":{"214":1,"966":1}}],["pgdown",{"2":{"157":2,"158":1,"166":1}}],["pgup",{"2":{"157":2,"158":1,"166":1}}],["physical",{"2":{"309":1}}],["php这种ssr模式",{"2":{"671":1}}],["php",{"2":{"145":2,"154":2,"894":2,"903":2}}],["phones",{"2":{"251":1}}],["phone",{"2":{"64":2,"251":2}}],["pm2部署脚本",{"2":{"665":1}}],["pm2",{"2":{"126":1,"665":1,"703":5,"1074":3}}],["p>",{"2":{"110":6}}],["p>the",{"2":{"110":6}}],["pulling",{"2":{"1039":1,"1047":1,"1082":1}}],["pull选项可以确保构建的镜像使用最新的基础镜像",{"2":{"1028":1}}],["pull",{"2":{"510":1,"999":2,"1012":1,"1014":1,"1028":1,"1038":1,"1039":3,"1042":1,"1047":1,"1069":2,"1082":1,"1094":1,"1121":1,"1138":1,"1151":1,"1159":1,"1171":2,"1213":1,"1225":1}}],["putimagedata",{"2":{"290":1}}],["put",{"2":{"251":1,"320":4,"322":1,"339":1,"692":2,"724":1}}],["punch",{"2":{"251":1}}],["pure",{"2":{"964":2}}],["purse",{"2":{"251":1}}],["purple",{"2":{"251":1}}],["purgecss",{"2":{"190":1}}],["purgecsswebpackplugin",{"2":{"190":2}}],["published",{"2":{"1108":1}}],["publishconfig",{"2":{"1102":1}}],["publish",{"2":{"1062":1,"1102":1,"1103":2,"1108":1,"1125":1,"1147":1,"1171":6,"1172":2,"1189":2,"1190":1}}],["publicpath",{"2":{"132":1,"190":1}}],["public",{"2":{"54":2,"126":1,"176":1,"228":3,"229":3,"230":2,"231":1,"232":1,"233":5,"238":1,"344":1,"665":1,"695":4,"697":1,"703":1,"720":2,"934":8,"964":1,"1121":1,"1138":2,"1139":1}}],["pub",{"2":{"195":1,"316":1,"745":1}}],["pug",{"2":{"130":2}}],["push时",{"2":{"955":1}}],["pushtarget",{"2":{"932":1,"941":1,"954":2}}],["push功能",{"2":{"727":1}}],["pushed",{"2":{"581":6}}],["push某个静态资源",{"2":{"325":1}}],["pushpin",{"2":{"251":2}}],["push",{"2":{"98":2,"168":1,"169":1,"195":1,"197":2,"201":1,"245":1,"323":1,"325":1,"376":1,"497":1,"521":1,"577":1,"579":3,"581":2,"582":1,"583":2,"727":1,"745":1,"747":2,"751":1,"768":1,"771":1,"950":1,"951":1,"954":4,"955":5,"964":3,"999":1,"1014":1,"1039":2,"1046":3,"1121":1,"1183":1,"1184":1,"1190":1}}],["p",{"2":{"83":1,"110":2,"156":2,"161":1,"163":1,"201":2,"202":2,"280":1,"333":6,"410":1,"485":2,"583":4,"751":2,"752":2,"920":3,"966":1,"1004":2,"1014":2,"1038":2,"1051":1,"1055":1,"1062":2,"1073":1,"1074":1,"1094":3,"1152":1,"1172":3,"1208":1,"1214":2}}],["pivot",{"2":{"1209":1}}],["pip3",{"2":{"1065":1}}],["pipeline",{"2":{"817":1,"1121":8,"1128":1}}],["pipe是nestjs中的管道技术主要用来对请求的数据进行转换和类型验证",{"2":{"641":1}}],["pipe",{"0":{"641":1},"1":{"642":1,"643":1,"644":1,"645":1,"646":1},"2":{"517":1,"520":2,"636":1,"640":1,"643":2,"645":1,"646":2,"651":1,"665":1,"700":1,"708":1,"718":2,"770":1}}],["pipetransform",{"2":{"645":2}}],["pipeto类型定义",{"2":{"512":1}}],["pipeto",{"2":{"512":1,"514":1,"517":1,"521":1}}],["pipethrough类型定义为",{"2":{"512":1}}],["pipethrough",{"2":{"512":1,"517":1}}],["pie",{"2":{"708":1,"718":2}}],["pid=7",{"2":{"1157":1}}],["pid文件路径",{"2":{"708":1}}],["pid",{"2":{"383":1,"708":2,"709":2,"718":4,"728":1,"1082":1}}],["pinia源码分析",{"0":{"947":1}}],["ping完localhost",{"2":{"1064":1}}],["ping",{"2":{"368":2,"1063":3,"1064":5,"1090":8,"1218":7}}],["pineapple",{"2":{"251":1}}],["pisces",{"2":{"251":1}}],["pizza",{"2":{"251":1}}],["pill",{"2":{"251":1}}],["pig2",{"2":{"251":1}}],["pig",{"2":{"251":2}}],["pick",{"2":{"920":1}}],["pic",{"2":{"198":1,"748":1}}],["pi",{"2":{"83":3,"251":1,"285":1}}],["pem",{"2":{"726":6}}],["pedestrians",{"2":{"251":1}}],["pear",{"2":{"251":1}}],["peach",{"2":{"251":1}}],["peachick02",{"2":{"78":1}}],["peachick1",{"2":{"78":1}}],["peachick4",{"2":{"77":1}}],["peachick3",{"2":{"77":1}}],["peachick2",{"2":{"77":1}}],["peachick",{"2":{"77":1,"78":1}}],["pencil",{"2":{"251":1}}],["pencil2",{"2":{"251":1}}],["pen",{"2":{"251":1}}],["penguin",{"2":{"251":1}}],["pensive",{"2":{"251":1}}],["pendingcount",{"2":{"771":1}}],["pending",{"2":{"98":6,"538":1,"771":5}}],["people2",{"2":{"951":1}}],["people1",{"2":{"951":1}}],["people",{"2":{"233":4,"251":1,"702":1}}],["percentcomplete",{"2":{"521":3}}],["per",{"2":{"484":1}}],["permissive",{"2":{"1202":1}}],["permission",{"2":{"127":1}}],["perms>",{"2":{"1059":2,"1060":2}}],["permanent",{"2":{"715":2,"726":2}}],["permanently",{"2":{"317":1,"617":1}}],["perform",{"2":{"1051":1}}],["performance",{"2":{"800":1}}],["performing",{"2":{"251":1}}],["perf",{"2":{"797":1,"800":1,"801":3}}],["perfect",{"2":{"797":1}}],["perferedtype为",{"2":{"40":1,"546":1}}],["perferedtype为number",{"2":{"40":1,"546":1}}],["perferedtype为string",{"2":{"40":1,"546":1}}],["perferedtype为转换的类型",{"2":{"40":1,"546":1}}],["perferedtype",{"2":{"40":7,"546":7}}],["persevere",{"2":{"251":1}}],["person",{"2":{"202":6,"251":7,"752":6}}],["period",{"2":{"83":1,"1209":1}}],["plus",{"2":{"251":1}}],["plug",{"2":{"251":1}}],["plugin=cni",{"2":{"1208":1}}],["plugin让stylelint拥有处理其他自定义规则的能力",{"2":{"845":1}}],["plugin插件打包",{"2":{"697":1}}],["plugin可以使用模板",{"2":{"176":1}}],["plugin可以让我们动态生成",{"2":{"176":1}}],["plugin",{"0":{"176":1},"2":{"176":6,"180":2,"184":8,"190":6,"697":1,"831":11,"833":2,"840":2,"858":1,"880":1,"1082":2,"1093":2,"1209":1}}],["plugins",{"0":{"265":1,"831":1,"845":1},"2":{"54":2,"172":1,"176":2,"180":1,"184":2,"190":4,"237":2,"827":2,"831":3,"840":1,"844":1,"845":1,"858":1,"880":1,"1209":40}}],["plane",{"2":{"1200":1,"1214":6,"1217":2}}],["plain文本类型",{"2":{"494":1}}],["plain",{"2":{"337":1,"494":1,"496":2,"497":1,"499":1}}],["placeholder",{"2":{"286":1}}],["place",{"2":{"251":1}}],["places",{"2":{"251":1}}],["playing",{"2":{"251":1}}],["platform>",{"2":{"1053":1}}],["platform=arm",{"2":{"1057":1}}],["platform=",{"2":{"1053":1}}],["platform",{"2":{"238":3,"603":1,"613":1,"1013":1,"1053":1,"1157":1}}],["platformcomponents",{"2":{"238":2}}],["platformdirectives",{"2":{"238":2}}],["platforms",{"2":{"238":3,"954":2,"1209":1}}],["please",{"2":{"56":1}}],["pod网段",{"2":{"1217":1}}],["podnetwork",{"2":{"1214":1}}],["podsubnet",{"2":{"1212":1}}],["pod",{"2":{"1125":1,"1167":1,"1206":1,"1208":1,"1209":3,"1214":2,"1217":2,"1218":1}}],["powered",{"2":{"342":1,"343":1,"344":1,"453":1,"723":1}}],["pop",{"2":{"954":1,"955":2}}],["poptarget",{"2":{"932":1,"954":2}}],["pop3协议",{"2":{"706":1}}],["pop3",{"2":{"704":1}}],["pop3等等",{"2":{"312":1}}],["popupmanager",{"2":{"201":1,"751":1}}],["potable",{"2":{"251":2}}],["potato",{"2":{"251":1}}],["pot",{"2":{"251":1}}],["polyglot",{"2":{"355":1}}],["policy>",{"2":{"1025":1}}],["policy和content",{"2":{"350":1}}],["policy",{"2":{"336":1,"350":10,"355":1,"1025":1,"1042":1,"1098":3,"1159":1,"1209":1}}],["police",{"2":{"251":2}}],["pole",{"2":{"251":1}}],["polling",{"2":{"354":2}}],["poll",{"2":{"188":1,"190":1,"538":1}}],["poultry",{"2":{"251":1}}],["pouch",{"2":{"251":1}}],["pound",{"2":{"251":1}}],["pouting",{"2":{"251":3}}],["pool",{"2":{"1209":1}}],["poodle",{"2":{"251":1}}],["poop",{"2":{"251":1}}],["pointed",{"2":{"251":2}}],["point",{"2":{"251":5}}],["portrange",{"2":{"1212":1}}],["port如localhost",{"2":{"1096":1}}],["port形式访问前端页面",{"2":{"1034":1}}],["port>",{"2":{"1022":2,"1062":2}}],["port对应",{"2":{"703":1}}],["ports",{"0":{"1022":1},"2":{"454":1,"1006":1,"1018":1,"1020":1,"1022":1,"1034":1,"1173":1,"1209":1}}],["port去访问服务",{"2":{"425":1}}],["port的值",{"2":{"231":1}}],["port",{"2":{"56":1,"177":1,"182":1,"190":1,"231":8,"404":3,"454":1,"455":5,"629":4,"630":2,"632":1,"669":4,"702":1,"723":4,"728":1,"729":3,"1022":3,"1034":1,"1046":2,"1062":2,"1074":1,"1121":3,"1177":1,"1209":1,"1218":2}}],["positive",{"2":{"646":1}}],["position的值为absolute或者fixed",{"2":{"104":1}}],["position",{"2":{"12":2,"13":2,"14":2,"15":2,"83":1,"485":3}}],["post作业",{"2":{"1127":1}}],["post的顺序无法更改",{"2":{"1127":1}}],["post始终是整个流水线最后运行的作业",{"2":{"1127":1}}],["postinstall",{"2":{"804":1}}],["postion",{"2":{"201":2,"751":2}}],["post请求外",{"2":{"612":1}}],["post请求",{"2":{"612":1}}],["postmessage",{"0":{"340":1},"2":{"773":2}}],["postal",{"2":{"251":1}}],["postbox",{"2":{"251":1}}],["postlogin",{"2":{"230":2,"232":1}}],["postcss",{"2":{"190":2,"843":1,"847":1}}],["post",{"0":{"1127":1},"2":{"57":1,"64":1,"251":3,"320":5,"322":1,"337":1,"339":1,"352":1,"568":1,"612":2,"613":3,"614":2,"661":4,"692":2,"701":1,"724":1,"729":1,"765":2,"769":2,"770":2,"771":1,"772":2,"944":3,"945":1,"1034":1,"1217":1}}],["poster",{"2":{"54":1}}],["pair",{"2":{"1209":1}}],["paint",{"2":{"279":1}}],["pause",{"2":{"1208":1,"1209":2}}],["packaging",{"2":{"1208":1}}],["packagename这种形式",{"2":{"1186":1}}],["packagename",{"2":{"1046":1,"1108":1,"1186":1}}],["packageb",{"2":{"810":1}}],["packagea",{"2":{"810":2}}],["packages",{"2":{"707":2,"727":1,"810":1,"813":4,"814":2,"815":1,"934":2,"944":1,"964":7,"966":1,"1107":1,"1187":4,"1190":2,"1191":2,"1192":3,"1210":1}}],["package",{"0":{"743":1},"2":{"175":1,"177":1,"182":1,"190":1,"665":2,"700":2,"703":1,"800":1,"801":1,"810":3,"813":2,"857":2,"1034":1,"1070":1,"1074":2,"1103":10,"1107":10,"1138":1,"1184":2,"1187":1,"1189":2,"1190":1,"1191":2,"1192":1,"1210":1}}],["packet",{"2":{"1063":1,"1064":2}}],["packets",{"2":{"1063":2,"1064":4}}],["paperclip",{"2":{"251":1}}],["palm",{"2":{"251":1}}],["palevioletred",{"2":{"110":2,"111":1,"112":1}}],["paw",{"2":{"251":1}}],["panda",{"2":{"251":1}}],["pay",{"2":{"205":5,"755":5}}],["payload",{"2":{"64":2,"771":2,"1121":1}}],["patch重新渲染页面",{"2":{"954":1}}],["patch等常见的http请求",{"2":{"612":1}}],["patch",{"0":{"974":1},"2":{"238":7,"320":2,"814":1,"954":1,"1121":2}}],["patterns",{"2":{"211":1,"761":1,"857":1}}],["pattern",{"2":{"194":1,"744":1,"857":1}}],["pathitem",{"2":{"687":3}}],["path=",{"2":{"453":1,"708":12,"718":24,"1054":1,"1055":2}}],["path=$",{"2":{"69":1}}],["pathstomodulenamemapper",{"2":{"863":2}}],["paths",{"2":{"190":1,"687":7,"857":1,"863":2}}],["pathrewrite",{"2":{"190":1}}],["path",{"2":{"62":6,"69":1,"132":1,"175":5,"176":1,"186":2,"190":11,"325":1,"344":1,"347":2,"350":1,"354":1,"611":2,"612":1,"613":4,"614":1,"618":1,"635":2,"655":2,"666":1,"671":1,"673":1,"687":4,"695":4,"696":1,"700":1,"711":1,"721":2,"769":1,"801":1,"878":1,"880":1,"938":3,"1056":1,"1069":1,"1074":1,"1116":5,"1121":4,"1122":3,"1209":16}}],["padding",{"2":{"110":2,"111":1,"112":1,"179":1}}],["page3",{"2":{"951":2}}],["page2",{"2":{"951":2}}],["page1",{"2":{"951":2}}],["page指令或者",{"2":{"715":1}}],["pagespeed",{"0":{"213":1}}],["pages",{"2":{"130":1,"709":1,"1121":5}}],["pager",{"2":{"63":1,"251":1,"686":1}}],["page",{"2":{"63":22,"251":2,"671":1,"675":1,"709":2,"715":1,"718":1}}],["paginationlistdto",{"2":{"686":1}}],["paginationquerydto类型为",{"2":{"685":1}}],["paginationquerydto类型",{"2":{"683":1}}],["paginationquerydto",{"2":{"646":3,"683":3,"685":1,"686":3}}],["pagination>",{"2":{"63":1}}],["paginations",{"2":{"63":16}}],["pagination",{"2":{"63":1,"646":1}}],["passed",{"2":{"860":2,"864":2,"874":2,"875":2}}],["passthrough选项",{"2":{"436":1}}],["passrequest",{"2":{"205":7,"755":7}}],["pass",{"2":{"128":1,"132":2,"339":1,"721":1,"723":1,"724":1,"725":1,"728":2,"729":2,"860":1,"864":1,"874":1,"875":1,"1034":1}}],["password这个文件里",{"2":{"1174":1}}],["password文件中",{"2":{"1095":1}}],["password=password",{"2":{"1024":1}}],["password",{"2":{"57":3,"83":1,"197":2,"713":3,"747":2,"1014":2,"1024":5,"1045":2,"1095":2,"1100":1,"1121":4,"1174":5}}],["passport",{"2":{"54":1,"64":7,"251":1}}],["parcel配置简单但不是很灵活无法胜任大型项目",{"2":{"784":1}}],["parcel的定制化程度较低",{"2":{"784":1}}],["parcel",{"2":{"281":1,"784":2}}],["parking",{"2":{"251":1}}],["partof=cri",{"2":{"1208":1}}],["parts",{"2":{"520":3}}],["partial",{"2":{"317":1,"344":2,"920":1}}],["part4",{"2":{"280":1}}],["part3",{"2":{"280":1}}],["part2",{"2":{"280":1}}],["part1",{"2":{"280":1}}],["part",{"2":{"251":1}}],["partly",{"2":{"251":1}}],["party",{"2":{"49":1,"555":1}}],["parent吗",{"2":{"583":1}}],["parent实例中的属性永远访问不到",{"2":{"580":1}}],["parent等等",{"2":{"571":1}}],["parent>",{"2":{"207":4,"757":4}}],["parent",{"2":{"207":1,"571":7,"577":3,"578":3,"579":11,"580":5,"581":7,"582":5,"583":14,"757":1,"934":7,"964":3,"1121":1}}],["parallels",{"0":{"1164":1},"2":{"1164":1}}],["parallel选项加快构建速度",{"2":{"1028":1}}],["parallel",{"0":{"1134":1},"2":{"187":1,"190":1,"1028":1,"1121":2,"1134":1}}],["param2",{"2":{"1058":1,"1063":3,"1064":2}}],["param1",{"2":{"1058":1,"1063":3,"1064":2}}],["param=ssp",{"2":{"708":1,"718":2}}],["parameter",{"2":{"232":1,"233":1,"453":1,"729":2}}],["paramerdecorator",{"2":{"232":3}}],["paramidx",{"2":{"232":3}}],["paramtypes",{"2":{"227":1,"232":1}}],["param",{"2":{"98":8,"233":3,"613":3,"614":1,"643":4,"648":2,"684":1}}],["params",{"2":{"64":4,"613":2,"674":1}}],["parsepath",{"2":{"938":3}}],["parsepath返回一个函数并赋值给watcher",{"2":{"938":1}}],["parseboolpipe",{"2":{"644":1}}],["parsefloatpipe",{"2":{"644":1}}],["parsefromstring的参数解释",{"2":{"117":1}}],["parsefromstring",{"2":{"117":1}}],["parsearraypipe",{"2":{"643":1}}],["parseintpipe",{"2":{"642":3,"643":3,"644":1}}],["parseint",{"2":{"520":2,"645":2,"646":2,"770":2}}],["parser用于指定",{"2":{"829":1}}],["parseroptions",{"0":{"829":1},"2":{"827":2,"829":1}}],["parser",{"0":{"255":1,"829":1},"2":{"354":1,"827":2,"829":4}}],["parsererror>",{"2":{"118":1}}],["parsererror",{"2":{"118":2}}],["parse",{"0":{"32":1},"2":{"32":3,"62":1,"354":2,"971":1}}],["prune命令来删除所有已经停止的容器并释放容器占用的资源",{"2":{"1009":1}}],["prune",{"2":{"1000":1,"1009":1}}],["practice",{"2":{"1188":2}}],["practive",{"2":{"703":1}}],["pragma",{"2":{"319":1,"721":2}}],["pray",{"2":{"251":1}}],["privileged",{"2":{"1038":1,"1159":1,"1209":3}}],["privoders",{"2":{"652":1}}],["privateattr",{"2":{"581":3}}],["private",{"2":{"229":1,"231":1,"606":4,"608":1,"624":2,"626":1,"648":1,"661":4,"666":1,"720":1,"771":8,"813":1,"814":2,"934":3,"963":2,"1121":1}}],["print",{"2":{"1212":1,"1216":1}}],["printwidth",{"2":{"839":1}}],["prints",{"2":{"251":1}}],["princess",{"2":{"251":1}}],["prize",{"2":{"228":2}}],["priority",{"2":{"187":1,"190":1}}],["primary",{"2":{"75":1,"86":2}}],["primitive",{"2":{"40":4,"546":4}}],["pre和",{"2":{"1127":2}}],["pre始终是整个流水线第一个运行的作业",{"2":{"1127":1}}],["predefined",{"2":{"1120":1}}],["preprocessor",{"2":{"880":1}}],["prepatch",{"2":{"814":1}}],["prepare",{"2":{"538":1,"1121":1}}],["prettify",{"2":{"874":2}}],["prettier插件设置",{"2":{"847":1}}],["prettier规则",{"2":{"846":1}}],["prettier默认会对项目中的所有文件进行格式化",{"2":{"841":1}}],["prettierignore文件",{"2":{"841":1}}],["prettierignore",{"0":{"841":1}}],["prettier也提供了相关的eslint插件来结合eslint使用",{"2":{"840":1}}],["prettier支持多种格式的配置文件",{"2":{"839":1}}],["prettier根据项目中的配置文件进行格式化",{"2":{"839":1}}],["prettier来自动格式化代码",{"2":{"837":1}}],["prettier",{"0":{"837":1},"1":{"838":1,"839":1,"840":1,"841":1},"2":{"837":1,"838":5,"840":8,"845":4,"846":1,"847":2}}],["prerequisite",{"2":{"1132":1}}],["prerequisites",{"2":{"1132":1}}],["prerelease",{"2":{"814":1}}],["preread",{"2":{"708":1,"718":2}}],["premajor",{"2":{"814":1}}],["preminor",{"2":{"814":1}}],["premium",{"2":{"70":1}}],["press",{"2":{"800":2}}],["presets和plugins执行顺序",{"2":{"264":1}}],["presets",{"0":{"264":1},"2":{"180":1,"190":1,"818":1,"858":2}}],["preset",{"2":{"180":2,"190":1,"728":1,"858":5,"1082":1}}],["presentation",{"2":{"309":1}}],["present",{"2":{"40":2,"546":2,"1159":1,"1228":1}}],["pre",{"0":{"1127":1},"2":{"332":1,"805":2,"944":2,"945":1,"954":1,"1127":1}}],["pref",{"2":{"1209":1}}],["prefix=",{"2":{"708":1,"718":2}}],["prefix",{"2":{"611":1,"695":1,"863":1,"1121":2}}],["preflight",{"2":{"320":1,"337":2}}],["preferred",{"2":{"728":4,"1090":4}}],["preferredtype",{"2":{"40":6,"546":6}}],["prefer",{"2":{"222":1,"726":1}}],["prefetch一般是用来其他页面可能会用到的资源",{"2":{"131":1}}],["prefetch",{"2":{"131":4}}],["preload和prefetch都可以在webpack中进行配置",{"2":{"131":1}}],["preload一般是提前加载当前页面需要使用的资源",{"2":{"131":1}}],["preload",{"2":{"131":2}}],["previous",{"2":{"1098":1}}],["preview",{"2":{"727":1}}],["preventdefault",{"2":{"200":2,"750":2}}],["prev",{"2":{"63":1}}],["prevsong",{"2":{"54":1}}],["problem",{"2":{"1132":1}}],["problems",{"2":{"797":2,"832":1}}],["projectcalico",{"2":{"1217":4}}],["projects",{"2":{"1187":4,"1190":2,"1191":1}}],["projectroot",{"2":{"818":1}}],["project",{"2":{"784":2,"857":1,"1121":20,"1122":8,"1187":3,"1190":2}}],["profile",{"2":{"740":1,"1027":1,"1209":1}}],["provider还支持生命周期的定义",{"2":{"606":1}}],["provider",{"2":{"606":8,"608":1,"624":1,"857":2}}],["providers用来给当前模块提供可注入的元数据",{"2":{"606":1}}],["providers",{"0":{"606":1},"2":{"604":2,"606":7,"608":2,"609":1,"622":1,"624":1,"635":1,"640":1,"643":1,"646":1,"702":1}}],["provide",{"2":{"606":8,"609":1,"624":1,"640":1,"643":1,"646":1,"652":1,"800":1}}],["provideplugin",{"2":{"190":1}}],["pro",{"2":{"422":2,"1046":1}}],["program",{"0":{"599":1},"2":{"383":1,"401":1}}],["progressnum",{"2":{"521":2}}],["progressive",{"2":{"214":1,"222":2}}],["progress",{"2":{"190":1,"222":1,"436":1,"514":1,"521":2}}],["proc",{"2":{"368":1,"380":2,"381":2,"382":2,"390":1,"1064":1,"1209":1}}],["processors",{"2":{"1209":3}}],["processor",{"2":{"1209":1}}],["processes",{"2":{"709":1}}],["processinfo",{"2":{"438":1}}],["processing",{"2":{"317":1}}],["process",{"0":{"540":1},"2":{"182":1,"229":1,"238":1,"239":1,"325":1,"431":1,"455":1,"537":1,"540":4,"630":1,"631":1,"669":7,"700":2,"728":1,"828":1,"954":1}}],["protype",{"2":{"571":1}}],["protector",{"2":{"708":1,"718":2}}],["protection",{"2":{"350":2}}],["protected",{"2":{"233":1,"1121":1,"1122":1}}],["protoaugment",{"2":{"955":1}}],["proto",{"2":{"383":1,"570":1,"571":13,"572":10,"573":28,"574":1,"575":3,"577":3,"579":3,"582":1,"583":5}}],["protocol>",{"2":{"1022":1,"1062":1}}],["protocols",{"2":{"317":1,"354":1,"726":1,"727":1}}],["protocol",{"2":{"295":1,"301":2,"315":1,"357":2,"374":1,"454":2,"619":7,"726":1,"729":1,"1022":1,"1121":1,"1209":1}}],["prototype和普通的对象属性没有区别",{"2":{"573":1}}],["prototype对象现在是parent实例",{"2":{"577":1}}],["prototype对象",{"2":{"572":1}}],["prototype的基础上添加了eat方法",{"2":{"572":1}}],["prototype",{"0":{"29":1,"30":1},"2":{"7":1,"8":1,"9":1,"33":2,"40":4,"60":2,"154":1,"197":2,"201":1,"204":2,"205":4,"238":6,"239":1,"546":4,"571":4,"572":8,"573":23,"576":3,"577":3,"578":1,"579":1,"580":4,"581":1,"582":7,"583":7,"747":2,"751":1,"754":2,"755":4,"874":1,"903":1,"938":1,"939":1,"940":1,"951":1,"954":4,"955":2,"956":1}}],["proxied",{"2":{"134":1,"717":2}}],["proxy使用ipvs作为路由转发",{"2":{"1212":1}}],["proxy和group仓库",{"0":{"1104":1},"1":{"1105":1,"1106":1,"1107":1}}],["proxymap",{"2":{"964":2}}],["proxyhandler",{"2":{"964":2}}],["proxy仅仅会拦截对象的第一层对象",{"2":{"960":1}}],["proxyuser",{"2":{"958":1}}],["proxy让fiddler作为系统代理",{"2":{"438":1}}],["proxying开启ssl",{"2":{"421":1}}],["proxying",{"2":{"421":2,"422":1}}],["proxyimage",{"2":{"198":2,"748":2}}],["proxy代理监听端口为8888",{"2":{"414":1}}],["proxy",{"2":{"97":1,"128":5,"132":11,"177":1,"182":1,"190":1,"302":1,"339":6,"414":3,"421":2,"708":2,"718":4,"721":1,"723":2,"724":2,"729":1,"958":1,"959":1,"960":1,"964":5,"965":3,"1034":6,"1042":1,"1098":1,"1104":1,"1106":1,"1121":10,"1209":1,"1212":1,"1217":3}}],["product",{"2":{"1046":1,"1195":3}}],["production",{"2":{"175":1,"182":1,"187":1,"190":1,"237":2,"238":1,"239":1,"632":1,"669":4,"703":3,"954":1,"1074":3,"1147":1,"1174":1}}],["prodconfig",{"2":{"190":2}}],["prod",{"2":{"130":1,"190":3,"237":4,"669":1}}],["prometheus",{"2":{"1209":1}}],["prompt",{"2":{"355":1,"797":2}}],["promsie",{"2":{"98":1}}],["promise调用方式测试",{"2":{"866":1}}],["promisec",{"2":{"771":6}}],["promiseconcurrency",{"2":{"771":3,"772":1}}],["promisefn",{"2":{"771":7}}],["promises",{"2":{"621":2}}],["promise不清楚的可以看我",{"2":{"532":1}}],["promise2",{"2":{"532":5,"538":3}}],["promise1",{"2":{"532":4,"538":3}}],["promise>",{"2":{"98":1}}],["promise使用与原理",{"0":{"98":1}}],["promise",{"0":{"472":1},"2":{"64":1,"98":9,"229":1,"230":1,"244":1,"465":1,"514":1,"516":1,"532":14,"538":2,"540":3,"606":1,"648":1,"674":1,"702":1,"769":1,"770":2,"771":4,"772":1,"828":1,"865":1,"917":1}}],["property",{"2":{"233":3,"954":5,"958":1}}],["propertykey",{"2":{"231":1}}],["propertydescriptor",{"2":{"230":3,"231":1,"232":1}}],["propertydecorator",{"2":{"229":1}}],["property=",{"2":{"222":1}}],["properties",{"2":{"190":1}}],["props等等",{"2":{"953":1}}],["props",{"2":{"199":1,"207":1,"236":1,"749":1,"757":1}}],["proposal",{"2":{"190":2}}],["prop",{"2":{"26":4,"229":2,"230":2,"232":10,"949":2}}],["pckn6",{"2":{"1217":1}}],["pcre",{"2":{"718":2}}],["pc兼容性",{"2":{"22":1}}],["pc端无兼容性要求",{"2":{"22":1}}],["pc端有兼容要求",{"2":{"22":1}}],["pc端有兼容性要求",{"2":{"22":1}}],["pc端需要看自己业务的兼容性情况",{"2":{"20":1}}],["就拿出家里备用的药💊喝了后躺床上了",{"2":{"1236":1}}],["就在昨天",{"2":{"1236":1}}],["就祈福我爸早日康复吧🙏🏻",{"2":{"1232":1}}],["就叫我爸可以来他那边工作",{"2":{"1232":1}}],["就进行初始化",{"2":{"937":1}}],["就好像是用户在操作一样",{"2":{"877":1}}],["就好比我们的代码一样嵌套函数等等",{"2":{"589":1}}],["就要测试到每个文件的所有代码",{"2":{"872":1}}],["就到了测试的时间了",{"2":{"859":1}}],["就整合好了那么在提交时就会先触发commitizen然后通过commitlint对commit进行校验",{"2":{"802":1}}],["就必须要显示定义了",{"2":{"685":1}}],["就看当前类类型被什么参数装饰器用到了",{"2":{"685":1}}],["就比如一个函数在返回函数时",{"2":{"590":1}}],["就正确打印了name的值",{"2":{"587":1}}],["就这样一直熬到傍晚",{"2":{"1236":1}}],["就这样层层向上",{"2":{"571":1}}],["就这样反复增加直到达到最大阈值",{"2":{"393":1}}],["就算定时器时间到了",{"2":{"533":1}}],["就算是备忘录模式的一个应用",{"2":{"209":1,"759":1}}],["就完成了三次握手",{"2":{"456":1}}],["就安装了mac版",{"2":{"412":1,"450":1}}],["就开始调试了",{"2":{"400":1}}],["就需要客户端与服务端建立一套身份认证机制",{"2":{"346":1}}],["就需要使用arp协议进行地址解析",{"2":{"295":1}}],["就知道了消息体的长度",{"2":{"342":1}}],["就没必要再执行loadimage操作了",{"2":{"246":1}}],["就得做兼容处理了",{"2":{"246":1}}],["就像是面向对象程序设计中的",{"2":{"995":1,"1081":1}}],["就像java那种注解",{"2":{"224":1}}],["就像钥匙一样",{"2":{"83":1}}],["就能够使他们协同作用",{"2":{"206":1,"756":1}}],["就已经可以使用devserver了",{"2":{"177":1}}],["就让我们进行简单的配置吧",{"2":{"173":1}}],["就准备部署到服务器上了",{"2":{"126":1}}],["就走上了koa+mysql的主体方案",{"2":{"125":1}}],["就会多一份",{"2":{"1159":1}}],["就会影响总体耗时",{"2":{"1071":1}}],["就会影响到另一个对象",{"2":{"26":1}}],["就会执行",{"2":{"954":1}}],["就会执行我们watch中定义的回调函数",{"2":{"935":1}}],["就会执行effect",{"2":{"934":1}}],["就会执行内部方法",{"2":{"239":1}}],["就会触发对象的setter",{"2":{"954":1}}],["就会触发get函数",{"2":{"951":1}}],["就会触发get进行dep进行depend当前watcher",{"2":{"932":1}}],["就会触发这里的get",{"2":{"932":1}}],["就会访问下方的getter函数",{"2":{"932":1}}],["就会读取",{"2":{"802":1}}],["就会进入commitizen交互阶段",{"2":{"800":1}}],["就会进行窗口滑动",{"2":{"387":1}}],["就会存在内存泄漏的风险",{"2":{"595":1}}],["就会形成闭包",{"2":{"594":1}}],["就会往原型链中找",{"2":{"579":1}}],["就会看看有无setimmediate回调",{"2":{"539":1}}],["就会看到这样的效果",{"2":{"111":1}}],["就会打住断点",{"2":{"404":1}}],["就会发现下面remove",{"2":{"399":1}}],["就会认为数据包已经丢失",{"2":{"388":1}}],["就会将其排列成队列进行处理",{"2":{"380":1}}],["就会被主机b拒绝",{"2":{"379":1}}],["就会被攻击",{"2":{"352":1}}],["就会丢弃掉arp数据包",{"2":{"296":1}}],["就会用到传统的滚动检测目标对象",{"2":{"247":1}}],["就会验证username的参数是否合法",{"2":{"232":1}}],["就会自动分析你访问的网站",{"2":{"216":1}}],["就不会再拉取了",{"2":{"1159":1}}],["就不会包含在卷的列表中",{"2":{"1114":1}}],["就不会有当前弹窗提示了",{"2":{"422":1}}],["就不会发生margin重叠的问题了",{"2":{"106":1,"110":1}}],["就不需要patch",{"2":{"238":1}}],["就不在实例化",{"2":{"196":1,"746":1}}],["就不再往下讲了",{"2":{"181":1}}],["就不赘述了",{"2":{"9":1}}],["就是最近几年生意也没那么好做了",{"2":{"1232":1}}],["就是observer对象",{"2":{"955":1}}],["就是",{"2":{"938":1}}],["就是这个类中的属性",{"2":{"934":1}}],["就是这个关系是怎么建立起来的❓从响应式原理中我们知道dep会通过dep",{"2":{"931":1}}],["就是keepalived设置的虚拟ip192",{"2":{"728":1}}],["就是因为run首先被提前声明了",{"2":{"587":1}}],["就是所谓的加强版",{"2":{"581":1}}],["就是所谓的事件循环机制eventloop",{"2":{"531":1}}],["就是基于事件驱动机制的",{"2":{"527":1}}],["就是一个物理硬件层抽象",{"2":{"1078":1}}],["就是一个readablestream对象",{"2":{"509":1}}],["就是一个普通函数",{"2":{"239":1}}],["就是命中断点",{"2":{"419":1}}],["就是不允许其他域名的js",{"2":{"350":1}}],["就是典型的工厂模式",{"2":{"201":1,"751":1}}],["就是把两个表中",{"2":{"86":1}}],["就是深度拷贝",{"2":{"33":1}}],["就返回函数返回的值",{"2":{"576":1}}],["就返回结果",{"2":{"83":1}}],["就返回第一个参数",{"2":{"83":1}}],["就瞎掰一个",{"2":{"60":1}}],["就可以加我了",{"2":{"1224":1}}],["就可以解决上面的问题了",{"2":{"1104":1}}],["就可以使用",{"2":{"1062":1}}],["就可以很快解决这个问题了",{"2":{"776":1}}],["就可以上传切片了",{"2":{"772":1}}],["就可以打印出正确的值",{"2":{"594":1}}],["就可以进行数据发送了",{"2":{"454":1}}],["就可以进行终端登录了",{"2":{"69":1}}],["就可以用上显示过滤器了",{"2":{"453":1}}],["就可以",{"2":{"400":1}}],["就可以调试了",{"2":{"399":1}}],["就可以对以往的会话进行破解",{"2":{"334":1}}],["就可以对被测网站页面进行分析",{"2":{"221":1}}],["就可以在仓库列表中找到刚刚创建的仓库了",{"2":{"1098":1}}],["就可以在本地调试代码了",{"2":{"407":1}}],["就可以在vscode中调试代码了",{"2":{"405":1}}],["就可以在浏览器中调试了",{"2":{"399":1}}],["就可以在同一个",{"2":{"324":1}}],["就可以在各个方向上居中了",{"2":{"13":1}}],["就可以实现中间人攻击或拒绝服务攻击等行为",{"2":{"304":1}}],["就可以直接从arp缓存表中获取对应的mac地址",{"2":{"298":1}}],["就可以找到vue开始的位置了",{"2":{"237":1}}],["就可以找到",{"2":{"40":1,"546":1}}],["就可以做到居中了",{"2":{"15":1}}],["就可以让子元素居中了",{"2":{"12":1}}],["负载",{"2":{"1121":1}}],["负载均衡",{"0":{"725":1},"2":{"706":1}}],["负责管理和运行",{"2":{"993":1,"1080":1}}],["负责页面的渲染",{"2":{"526":1}}],["负责每个tab页面加载解析",{"2":{"526":1}}],["负责在物理层上建立数据链路",{"2":{"309":1}}],["负责在数据链路层上建立逻辑连接",{"2":{"309":1}}],["负责建立端到端的可靠传输连接",{"2":{"309":1}}],["负责建立和管理会话连接",{"2":{"309":1}}],["负责数据格式的转换",{"2":{"309":1}}],["负责提供各种应用程序所需的服务",{"2":{"309":1}}],["负的外边距可以让元素向相反方向定位",{"2":{"12":1}}],["负margin",{"0":{"12":1},"2":{"11":1,"22":2}}],["但我爸还是坚持要干点啥",{"2":{"1232":1}}],["但我们更倾向于检查语法错误",{"2":{"835":1}}],["但由",{"2":{"1166":1}}],["但由于在实例child时",{"2":{"580":1}}],["但缺点是数据不会持久化",{"2":{"1111":1}}],["但缺点是需要手动创建和管理",{"2":{"1111":1}}],["但缺点是不够灵活",{"2":{"1111":1}}],["但两者并不相通",{"2":{"1078":1}}],["但往往构建的镜像体积比较大",{"2":{"1070":1}}],["但参数也会追加到entrypoint作为参数使用",{"2":{"1064":1}}],["但同时你必须在顶级定义指定的数据卷",{"2":{"1022":1}}],["但建议使用有意义的名称",{"2":{"1020":1}}],["但对于值为数组类型array或者添加新属性时",{"2":{"955":1}}],["但对于一个通用的web服务搭建还是有非常重要的意义",{"2":{"664":1}}],["但再仔细看一看问题又来了",{"2":{"950":1}}],["但最重要的还是一种透过表象看本质的态度",{"2":{"948":1}}],["但随着项目的不断演变代码越多产生的不确定性就会越大",{"2":{"906":1}}],["但仍无法更直接表达相关的类型约束",{"2":{"834":1}}],["但仍然是web传输协议中的重要参考标准之一",{"2":{"322":1}}],["但推荐仅作为漏洞",{"2":{"826":1}}],["但配置灵活扩展性极强",{"2":{"784":1}}],["但可以更快地适应网络环境的变化",{"2":{"727":1}}],["但可能还有一些优化点需要做",{"2":{"246":1}}],["但只适用于共享缓存",{"2":{"720":1}}],["但仅仅env文件是不够的还需要对配置文件进行容错处理",{"2":{"669":1}}],["但仅限于上面三个可选值",{"2":{"337":1}}],["但会在所有pipe",{"2":{"647":1}}],["但原型链针对对象属性而言的",{"2":{"591":1}}],["但当你删除这个容器后重新启动一模一样的容器",{"2":{"1109":1}}],["但当你运行时却不会报错",{"2":{"36":1,"542":1}}],["但当访问全局中没有定义的block",{"2":{"589":1}}],["但并没有看到我妈",{"2":{"1232":1}}],["但并没有赋值也就是值为undefined",{"2":{"587":1}}],["但并不是更弱一些",{"2":{"411":1}}],["但并不是自适应的两栏布局",{"2":{"111":1}}],["但进行解释前js引擎会对代码进行语法分析",{"2":{"587":1}}],["但父类中的实例属性并没有被用到",{"2":{"580":1}}],["但很明显的缺点就是",{"2":{"577":1}}],["但很多同学可能不知道通过通过vertical",{"2":{"16":1}}],["但它们之间是相互独立的",{"2":{"1003":1}}],["但它不是es标准",{"2":{"571":1}}],["但它和setimmediate不一样的是",{"2":{"540":1}}],["但它的宿主环境一般都是多线程的",{"2":{"525":1}}],["但settimeout可能会被执行栈延迟调用",{"2":{"534":1}}],["但一般视图的更新会跟随这系统帧率通常都是60fps",{"2":{"534":1}}],["但js并没有改变它",{"2":{"524":1}}],["但近年来随着web技术的突飞猛进",{"2":{"524":1}}],["但他们并不是数组而是在arraybuffer上统称的类型术语",{"2":{"481":1}}],["但这就是生活",{"2":{"1232":1}}],["但这几次都没有理我也没有回消息",{"2":{"1232":1}}],["但这里不会执行reactiveeffect的run函数",{"2":{"934":1}}],["但这个需要你额外的计算每次传输时间来动态改变等等",{"2":{"775":1}}],["但这个方法不需要子元素固定宽高",{"2":{"15":1}}],["但这种方式可以用原型链继承代替",{"2":{"579":1}}],["但这些都是操作比较低级的数据",{"2":{"493":1}}],["但这只是表面上的",{"2":{"454":1}}],["但通常都会协商一些有用的信息",{"2":{"387":1}}],["但如果是团队使用呢",{"2":{"1109":1}}],["但如果每次只能发送一个数据包将大大提高时延",{"2":{"387":1}}],["但如果原来的模板很复杂",{"2":{"206":1,"756":1}}],["但与tcp的keepalive完全不同",{"2":{"384":1}}],["但实际情况中由于cpu",{"2":{"380":1}}],["但还存在一个问题那就是没有对深层对象进行拦截",{"2":{"959":1}}],["但还是有些不舍",{"2":{"1233":1}}],["但还是有点不舍",{"2":{"1233":1}}],["但还是有所区别",{"2":{"122":1}}],["但还是一并放进了镜像中",{"2":{"1070":1}}],["但还是会存在网络突发故障传输中断的问题或者页面刷新后停止传输",{"2":{"772":1}}],["但还有其他非正常的连接出现严重的连接错误",{"2":{"379":1}}],["但也会在自己的arp缓存表中记住发送方的ip和mac地址",{"2":{"454":1}}],["但也会对一些第三方登录等功能进行限制",{"2":{"353":1}}],["但也可以使用其它传输协议",{"2":{"315":1}}],["但也可能导致频繁地进行arp请求",{"2":{"299":1}}],["但加密和解密速度相对较慢",{"2":{"330":1}}],["但在生产环境高并发",{"2":{"696":1}}],["但在js中其本质还是function",{"2":{"583":1}}],["但在time",{"2":{"382":1}}],["但在这期间会进行相关重要数据的约定",{"2":{"378":1}}],["但在弱网环境下依然会存在",{"2":{"324":1}}],["但在高延迟的网络环境下仍然存在性能瓶颈",{"2":{"323":1}}],["但浏览器限制了同域名的的tcp最大连接数",{"2":{"324":1}}],["但尚未被处理完成",{"2":{"317":1}}],["但尚未完成处理",{"2":{"317":1}}],["但不能超过runner特定的超时",{"2":{"1133":1}}],["但不能处理函数",{"2":{"32":1}}],["但不删除它们",{"2":{"1031":1}}],["但不同环境数据可能不同",{"2":{"408":1}}],["但不幸的是",{"2":{"408":1}}],["但不可能一直这样增长下去",{"2":{"393":1}}],["但不会影响样式",{"2":{"350":1}}],["但不影响资源的加载",{"2":{"350":1}}],["但不需要返回任何数据",{"2":{"317":1}}],["但不知道自己的ip地址",{"2":{"301":1}}],["但需要管理员进行手动维护",{"2":{"300":1}}],["但外观模式最显著的特点是定义了一个新的接口",{"2":{"206":1,"756":1}}],["但装饰器模式的作用是为了给对象增加功能",{"2":{"206":1,"756":1}}],["但又不需要捕获后的值",{"2":{"145":1,"894":1}}],["但perl内部的一些表达式却没有继承",{"2":{"136":1,"885":1}}],["但至少现在比刚开始已经快的很多了",{"2":{"135":1}}],["但其不会阻塞主线程进行渲染",{"2":{"131":1}}],["但归根还是基础类型之间的转换",{"2":{"41":1,"547":1}}],["但却无法拦截通过索引修改值",{"2":{"955":1}}],["但却拥有touppercase方法",{"2":{"38":1,"544":1}}],["但却没有那么多冗余代码",{"2":{"19":1}}],["但深拷贝会另外创造一个一模一样的对象",{"2":{"25":1}}],["但兼容性不如flex",{"2":{"21":1}}],["但是没想到会发生在自己身上",{"2":{"1236":1}}],["但是在某些情况下会对系统性能和稳定性产生负面影响",{"2":{"1203":1}}],["但是会破坏操作系统的文件",{"2":{"1202":1}}],["但是会增加很多冗余代码",{"2":{"18":1}}],["但是通常我们推荐您使用其他类型的执行器",{"2":{"1168":1}}],["但是最常见的是运行数据库容器",{"2":{"1146":1}}],["但是都是处于同一个网关下",{"2":{"1085":1}}],["但是当你从电脑主机浏览器上访问此ip地址就会访问不通",{"2":{"1084":1}}],["但是他确实能监听到count的变化",{"2":{"936":1}}],["但是设计它们的初衷是用于简单运算的",{"2":{"928":1}}],["但是也是强烈建议使用exec形式",{"2":{"1064":1}}],["但是也是程序稳定的重要验证渠道",{"2":{"854":1}}],["但是也会作为1个字节增加对应的序列号",{"2":{"376":1}}],["但是还会生成default模块",{"2":{"687":1}}],["但是还不能使用",{"2":{"588":1}}],["但是对于我们快速启动一个想要的环境或验证一些想法都是非常友好的",{"2":{"1015":1}}],["但是对于前端来说这种场景很少用到",{"2":{"671":1}}],["但是对于一个前端来说service通常不会用到",{"2":{"667":1}}],["但是对于参数需要注意以下情况",{"2":{"9":1}}],["但是缺点也很明显和原型式继承一样",{"2":{"581":1}}],["但是同时也会监听settimeout的回调",{"2":{"539":1}}],["但是需要收费",{"2":{"428":1}}],["但是https请求还是有一些问题",{"2":{"422":1}}],["但是相比fiddler可以免费试用基础功能",{"2":{"411":1}}],["但是节点的属性发生变化不会监听到",{"2":{"404":1}}],["但是只有当这些源已经在页面中加载过了",{"2":{"350":1}}],["但是只返回了部分内容",{"2":{"317":1}}],["但是可以通过不定长的方式来传输消息体",{"2":{"343":1}}],["但是该协议存在一些缺陷",{"2":{"329":1}}],["但是服务器不会返回请求的资源",{"2":{"320":1}}],["但是它的mac地址未知",{"2":{"295":1}}],["但是它会只计算能求和的数据的和",{"2":{"83":1}}],["但是现在使用起来非常的不方便",{"2":{"221":1}}],["但是用户并不关心这些复杂的代码",{"2":{"201":1,"751":1}}],["但是因为每次",{"2":{"184":1}}],["但是我们一般不会直接将",{"2":{"183":1}}],["但是我们还要对package",{"2":{"177":1}}],["但是不会匹配",{"2":{"139":1,"888":1}}],["但是不能是其他节点类型",{"2":{"122":1}}],["但是serializetostring",{"2":{"122":1}}],["但是",{"2":{"28":1,"221":2,"304":1,"330":1,"727":1,"1130":1}}],["但table也能够实现水平垂直居中",{"2":{"18":1}}],["但绝对定位是基于子元素的左上角",{"2":{"12":1}}],["hxsd36svcudrfrsi",{"2":{"1214":3,"1215":1}}],["h了解",{"2":{"1069":1}}],["h了解更多",{"2":{"713":1}}],["hbuilder等",{"2":{"785":1}}],["h3",{"2":{"727":5}}],["hk",{"2":{"673":2}}],["h1>",{"2":{"671":1}}],["h1>user页面",{"2":{"671":1}}],["href",{"2":{"521":1}}],["href=",{"2":{"222":2,"350":1,"671":1}}],["h5调试",{"2":{"441":1}}],["h5",{"0":{"441":1},"2":{"464":1}}],["hpack实际应用文章了解更多",{"2":{"326":1}}],["hpack和http",{"2":{"326":1}}],["hypertext",{"2":{"315":1}}],["hydrating",{"2":{"238":4,"954":6}}],["hdlc",{"2":{"312":1}}],["hwaddress",{"2":{"298":1}}],["hwtype",{"2":{"298":1}}],["hugetlb",{"2":{"1209":2}}],["hup",{"2":{"1208":1}}],["hub",{"2":{"1012":3,"1014":2,"1083":1}}],["husky目录",{"2":{"804":1}}],["husky是一个git钩子",{"2":{"803":1}}],["husky",{"0":{"803":1},"1":{"804":1,"805":1,"806":1},"2":{"804":3,"805":4,"806":4}}],["hushed",{"2":{"251":1}}],["huffman",{"2":{"326":2}}],["hurtrealbad",{"2":{"251":2}}],["human",{"2":{"202":1,"752":1}}],["h2>论坛页面",{"2":{"350":1}}],["h2>",{"2":{"222":1,"350":1}}],["h2>hello",{"2":{"222":1}}],["hi",{"2":{"1223":1}}],["histogram",{"2":{"1209":1}}],["history",{"2":{"1001":1}}],["hide",{"2":{"438":1}}],["hidden",{"2":{"106":1,"107":1,"108":1,"110":2,"111":3,"112":2,"183":2,"352":2}}],["highwatermark",{"2":{"510":2,"514":4,"516":3}}],["high",{"2":{"251":2,"726":1,"728":1}}],["hibiscus",{"2":{"251":1}}],["hint为number会先执行valueof方法",{"2":{"40":1,"546":1}}],["hint为string会先执行tostring方法",{"2":{"40":1,"546":1}}],["hint",{"2":{"40":12,"546":12}}],["h",{"2":{"83":1,"164":1,"954":2,"1082":1,"1156":1,"1203":1}}],["here",{"2":{"1223":1,"1227":1}}],["herb",{"2":{"251":1}}],["heel",{"2":{"251":1}}],["healthzport",{"2":{"1212":1}}],["healthzbindaddress",{"2":{"1212":2}}],["health",{"2":{"1066":3}}],["healthcheck",{"0":{"1066":1},"2":{"1066":2}}],["heavy",{"2":{"251":7}}],["hear",{"2":{"251":1}}],["hearts",{"2":{"251":3}}],["heartpulse",{"2":{"251":1}}],["heartbeat",{"2":{"251":1}}],["heart",{"2":{"251":13}}],["heading",{"2":{"251":2,"728":2}}],["headphones",{"2":{"251":1}}],["head",{"2":{"211":1,"293":1,"320":2,"337":1,"338":1,"520":2,"761":1,"1014":1,"1122":3}}],["headers",{"2":{"337":1,"339":1,"344":3,"354":1,"455":1,"520":3,"521":2,"648":1,"656":1,"674":1,"692":3,"724":1,"1034":1,"1209":1}}],["header",{"2":{"128":3,"132":4,"326":2,"337":2,"339":8,"350":3,"355":1,"367":1,"404":1,"436":1,"616":3,"654":1,"692":1,"716":1,"717":1,"720":1,"723":7,"724":8,"727":1,"729":4,"765":1,"769":1,"770":1,"788":1,"1034":8}}],["head>",{"2":{"110":4,"111":2,"112":2,"222":2,"350":2,"671":2,"712":2,"724":2}}],["helpful",{"2":{"857":1,"1227":1}}],["help",{"2":{"414":1,"421":1,"430":1,"857":1}}],["helper依赖的地址为",{"2":{"1184":1}}],["helper",{"2":{"238":1,"1045":1,"1183":4,"1184":7,"1187":1,"1188":1,"1189":3,"1191":3}}],["hellman",{"0":{"333":1}}],["hello",{"2":{"138":1,"175":1,"332":2,"342":1,"354":1,"404":1,"578":1,"622":1,"887":1,"1082":5,"1124":3,"1148":1}}],["helicopter",{"2":{"251":1}}],["he",{"2":{"237":2}}],["hengshuai",{"2":{"222":2,"1228":1}}],["hex返回十六进制",{"2":{"83":1}}],["height=",{"2":{"61":1,"245":1}}],["height",{"2":{"12":2,"16":2,"61":1,"108":1,"111":2,"112":2,"283":3,"718":3,"850":1}}],["h+",{"2":{"60":1}}],["hh",{"2":{"57":1,"60":2,"190":1,"1074":1}}],["harbor",{"2":{"1011":1}}],["hardware",{"2":{"454":2}}],["hadkey",{"2":{"964":2}}],["happy",{"2":{"797":3}}],["hack",{"2":{"352":1}}],["haha",{"2":{"284":1}}],["hat",{"2":{"251":1,"708":1}}],["hatching",{"2":{"251":1}}],["hatched",{"2":{"251":1}}],["hamburger",{"2":{"251":1}}],["hammer",{"2":{"251":1}}],["hamster",{"2":{"251":1}}],["hair",{"2":{"251":2}}],["haircut",{"2":{"251":1}}],["hangzhou",{"2":{"1209":1}}],["hanging",{"2":{"284":1}}],["hans",{"2":{"270":1}}],["handbook",{"2":{"270":1}}],["handbag",{"2":{"251":1}}],["hands",{"2":{"251":4}}],["hand",{"2":{"251":4}}],["handleerror",{"2":{"941":1}}],["handler也就是回调函数",{"2":{"937":1}}],["handler",{"2":{"937":19}}],["handlers",{"2":{"621":1,"1179":2}}],["handleaddscheduletimeout",{"2":{"661":1}}],["handleaddscheduleinterval",{"2":{"661":1}}],["handleaddschedulecron",{"2":{"661":1}}],["handlescheduletimeout",{"2":{"661":1}}],["handlescheduleinterval",{"2":{"661":1}}],["handleschedule",{"2":{"661":1}}],["handleschedulecron",{"2":{"661":1}}],["handlesizechange",{"2":{"63":2}}],["handletimeout",{"2":{"660":1}}],["handleinterval",{"2":{"660":1}}],["handleconnection",{"2":{"702":1}}],["handlecron",{"2":{"660":1}}],["handlecurrentchange",{"2":{"63":2}}],["handle",{"2":{"651":2}}],["hankey",{"2":{"251":1}}],["having",{"2":{"195":2,"745":2}}],["have",{"2":{"56":1,"621":3,"1014":1}}],["haschanged",{"2":{"964":1}}],["hasproto",{"2":{"955":1}}],["has",{"2":{"248":1,"454":1,"588":1,"621":1,"941":1,"951":1,"954":2,"964":1,"1121":1,"1214":1}}],["hashicorp",{"2":{"1121":1}}],["hash计算进度等等",{"2":{"775":1}}],["hash=$",{"2":{"772":1}}],["hash",{"2":{"132":2,"175":1,"181":1,"190":4,"251":1,"725":1,"772":5,"773":3,"1214":3,"1215":1}}],["hash不变",{"2":{"132":1}}],["hasown",{"2":{"964":1}}],["hasownproperty",{"2":{"26":1,"583":1}}],["hasone",{"2":{"57":2}}],["hom",{"2":{"1059":1}}],["home",{"2":{"54":2,"157":1,"166":1,"1064":1}}],["hobby",{"2":{"959":2,"960":2}}],["hobby却不会正确的派发更新",{"2":{"959":1}}],["howto",{"2":{"726":1}}],["how",{"2":{"462":1}}],["howbrowserswork",{"2":{"280":1}}],["hooks",{"2":{"804":1,"805":1}}],["hook",{"2":{"251":2,"621":2}}],["hospital",{"2":{"251":1}}],["hostnameoverride",{"2":{"1212":1}}],["hostnamectl",{"2":{"1199":2}}],["hostname",{"2":{"1171":2,"1172":2,"1173":1,"1199":3}}],["hosted也行",{"2":{"1107":1}}],["hosted地址",{"2":{"1107":1}}],["hosted创建好后",{"2":{"1099":1}}],["hosted",{"2":{"1046":1,"1098":2,"1102":3,"1103":2,"1104":1,"1106":1,"1107":1,"1108":1}}],["host=db",{"2":{"1024":1}}],["hosts",{"2":{"726":6,"1153":2,"1157":6,"1176":1,"1178":6}}],["host$request",{"2":{"721":1}}],["host设置动态值",{"2":{"618":1}}],["hostparam获取域名的host值",{"2":{"618":1}}],["hostparam",{"2":{"618":2}}],["host",{"2":{"97":1,"128":1,"132":2,"177":1,"182":1,"301":1,"319":1,"339":3,"344":1,"347":1,"354":1,"432":1,"436":1,"454":1,"456":1,"520":4,"611":3,"618":6,"621":1,"631":3,"639":2,"669":2,"723":2,"724":3,"726":6,"729":1,"1007":1,"1022":2,"1024":4,"1034":2,"1087":3,"1088":3,"1089":2,"1090":2,"1111":1,"1116":2,"1121":2,"1178":6,"1209":3}}],["house",{"2":{"251":2}}],["hours",{"2":{"660":1}}],["hourglass",{"2":{"251":2}}],["hour",{"2":{"83":2}}],["honey",{"2":{"251":1}}],["honeybee",{"2":{"251":1}}],["hocho",{"2":{"251":1}}],["horn",{"2":{"251":1}}],["horse",{"2":{"251":3}}],["horizontal",{"2":{"17":1}}],["holding",{"2":{"251":2}}],["hotfixes=true",{"2":{"707":2}}],["hotsprings",{"2":{"251":1}}],["hotel",{"2":{"251":2}}],["hotmodulereplacementplugin",{"2":{"190":1}}],["hot",{"2":{"54":1,"177":1,"182":1,"190":1}}],["htpasswd",{"2":{"713":5}}],["htm",{"2":{"325":1,"709":1,"711":1,"1034":1}}],["html中打了断点",{"2":{"966":1}}],["html格式",{"2":{"874":1}}],["html很简单",{"2":{"352":1}}],["htmlelement",{"2":{"243":1}}],["htmlimageelement",{"2":{"243":1,"247":1,"248":1,"249":1}}],["htmlwebpackplugin",{"2":{"176":2,"190":2}}],["html文件",{"2":{"176":2,"710":1}}],["html|document|",{"2":{"117":1}}],["html>",{"2":{"110":4,"111":2,"112":2,"222":2,"350":2,"671":2,"712":3,"724":2}}],["html代码如下",{"2":{"13":1,"14":1,"15":1,"16":1}}],["html",{"0":{"176":1},"2":{"12":1,"14":1,"15":1,"16":1,"17":2,"18":1,"19":1,"20":1,"21":1,"22":1,"54":2,"61":1,"63":1,"110":4,"111":2,"112":2,"115":2,"117":3,"134":1,"176":10,"179":1,"190":4,"193":1,"219":1,"222":2,"245":1,"249":1,"316":1,"325":3,"347":2,"350":6,"352":1,"354":1,"404":1,"423":1,"462":5,"534":1,"671":2,"695":2,"709":6,"710":3,"711":2,"712":4,"717":2,"724":1,"729":1,"785":1,"874":3,"1004":1,"1007":1,"1022":2,"1034":5,"1051":3,"1061":1,"1070":1,"1073":1,"1120":1,"1121":1,"1154":1,"1158":1,"1165":1,"1171":2,"1174":1}}],["httpcheckfrequency",{"2":{"1212":1}}],["httpcode",{"2":{"615":3,"765":1,"769":1,"770":1}}],["http会视为不安全",{"2":{"1045":1}}],["http基于tcp",{"2":{"775":1}}],["http3",{"2":{"727":3}}],["httpd",{"2":{"713":1}}],["http块中可以包含多个server块",{"2":{"709":1}}],["http块",{"2":{"709":1}}],["http模块",{"2":{"708":1}}],["http服务器",{"2":{"706":1}}],["httpfilter",{"2":{"639":2,"640":8}}],["httpexceptionoptions",{"2":{"637":1}}],["httpexception",{"2":{"636":1,"637":2,"639":4,"640":4,"645":2}}],["http等等",{"2":{"451":1}}],["http也有一个keepalive的概念",{"2":{"384":1}}],["http安全标头",{"2":{"355":1}}],["http是互联网上最常用的协议之一",{"2":{"349":1}}],["http是一种用于在web上传输数据的协议",{"2":{"321":1}}],["http攻击",{"0":{"349":1},"1":{"350":1,"351":1,"352":1,"353":1}}],["httponly",{"2":{"347":2,"354":1}}],["http范围",{"2":{"344":1}}],["http定长传输和不定长传输是两种常见的",{"2":{"341":1}}],["http定义了一些请求方法",{"2":{"320":1}}],["http最常见的优化资源的手段就是缓存",{"2":{"335":1}}],["http2",{"2":{"325":1,"727":3}}],["http2的头部压缩技术大体包含以下部分",{"2":{"326":1}}],["http2的缺点",{"2":{"323":1}}],["http2的优点",{"2":{"323":1}}],["http的keepalive是开启长连接",{"2":{"384":1}}],["http的范围请求在大文件的下载中发挥着重要的地位",{"2":{"344":1}}],["http的演变版本包括http",{"2":{"321":1}}],["http的首部字段可以分为通用首部",{"2":{"319":1}}],["http演变",{"0":{"321":1}}],["http报文是http通信中的数据传输单位",{"2":{"318":1}}],["http报文",{"0":{"318":1}}],["http状态码",{"2":{"686":1}}],["http状态码会返回206",{"2":{"344":1}}],["http状态码范围从100到599",{"2":{"317":1}}],["http状态码由3个数字组成",{"2":{"317":1}}],["http状态码是指当客户端向服务器发送请求时",{"2":{"317":1}}],["http协议及安全防范",{"0":{"315":1},"1":{"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1},"2":{"726":1}}],["http协议对于web开发者了解其数据报文信息很有用",{"2":{"312":1}}],["http协议",{"0":{"458":1},"2":{"307":1,"453":2}}],["http缓存",{"0":{"335":1},"2":{"132":1,"168":2}}],["http",{"0":{"322":1,"323":1,"327":1},"1":{"324":1,"325":1,"326":1},"2":{"54":2,"61":2,"118":1,"128":1,"132":3,"134":1,"169":2,"177":1,"182":1,"190":1,"222":1,"225":2,"307":1,"312":1,"315":2,"316":1,"321":4,"322":5,"323":1,"324":4,"326":1,"327":6,"328":2,"338":1,"339":3,"341":2,"342":2,"343":4,"344":1,"350":5,"352":1,"354":8,"355":2,"404":2,"405":1,"406":1,"453":4,"454":1,"456":1,"459":1,"518":1,"541":1,"639":1,"640":4,"655":2,"702":1,"708":21,"709":2,"716":1,"717":6,"718":48,"720":3,"721":1,"723":2,"724":3,"725":2,"726":1,"727":2,"728":1,"729":9,"879":1,"966":1,"1005":1,"1007":3,"1034":1,"1058":2,"1066":3,"1102":1,"1103":3,"1108":1,"1121":1,"1122":1,"1142":2,"1157":2,"1159":1,"1177":2,"1183":1}}],["https证书",{"2":{"1178":1}}],["https使用主机443端口",{"2":{"1172":1}}],["httpstatus",{"2":{"615":2,"617":2,"637":2,"639":2,"640":4,"645":2,"686":1,"765":1,"769":1,"770":1}}],["https不是新的协议仍是基于http协议在传输层tcp之上添加了一层安全协议ssl",{"2":{"328":1}}],["https",{"0":{"328":1},"1":{"329":1,"330":1,"331":1,"332":1,"333":1,"334":1},"2":{"49":3,"66":1,"85":1,"97":1,"130":1,"177":1,"182":1,"193":1,"218":2,"222":2,"223":1,"229":1,"245":2,"249":1,"270":2,"280":6,"293":1,"316":1,"320":1,"325":1,"328":1,"350":9,"354":1,"400":1,"410":1,"414":1,"423":1,"426":1,"427":1,"438":1,"439":2,"443":1,"448":3,"454":1,"462":3,"541":3,"555":3,"568":4,"602":1,"611":2,"617":1,"663":1,"688":1,"689":1,"693":2,"698":5,"715":3,"716":1,"718":1,"726":4,"729":1,"736":1,"778":1,"817":1,"821":1,"1014":2,"1039":2,"1045":2,"1046":1,"1076":4,"1082":2,"1083":5,"1093":1,"1120":1,"1121":1,"1124":1,"1125":1,"1126":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1,"1141":1,"1142":2,"1143":1,"1144":1,"1145":1,"1147":2,"1148":1,"1149":2,"1154":1,"1157":1,"1158":1,"1165":1,"1170":1,"1171":2,"1172":1,"1174":1,"1176":2,"1177":2,"1178":1,"1188":2,"1190":1,"1192":3,"1208":2,"1209":2,"1210":1,"1214":1,"1217":4}}],["sf",{"2":{"1204":1}}],["s3",{"2":{"1159":1}}],["sdfsdfs",{"2":{"1057":1}}],["srv",{"2":{"1038":2,"1094":3,"1095":1,"1152":2,"1153":2,"1156":1,"1157":3,"1159":2,"1171":6,"1172":5,"1173":3,"1175":1,"1176":1,"1177":1,"1178":2}}],["src>",{"2":{"1059":2,"1060":2}}],["src文件夹",{"2":{"175":1}}],["srchstr",{"2":{"83":1}}],["src=",{"2":{"61":1,"130":1,"350":3,"520":1,"712":1}}],["src",{"2":{"26":4,"49":2,"54":2,"61":1,"62":1,"175":2,"186":1,"190":4,"198":7,"222":4,"238":4,"239":1,"243":4,"244":13,"245":6,"248":5,"249":6,"338":1,"350":13,"497":1,"555":2,"619":1,"634":1,"640":2,"648":2,"652":1,"665":2,"669":1,"674":1,"702":1,"703":1,"748":7,"805":1,"849":1,"857":2,"859":1,"862":1,"863":1,"865":1,"875":2,"879":2,"882":1,"932":3,"934":2,"937":1,"941":1,"944":1,"954":11,"955":2,"964":7,"1070":1}}],["s选项可以指定要发送的信号量",{"2":{"1032":1}}],["s架构的",{"2":{"994":1}}],["s架构",{"2":{"993":1,"1069":1,"1071":1}}],["svc",{"2":{"727":1,"1218":2}}],["svg+xml",{"2":{"61":1}}],["svgcaptcha",{"2":{"61":1}}],["svg",{"0":{"61":1},"2":{"61":2,"117":1}}],["sbin",{"2":{"708":2,"718":4,"728":5,"1054":3,"1055":6}}],["s`",{"2":{"634":1}}],["smtp等",{"2":{"310":1}}],["smtp",{"2":{"307":1,"312":1}}],["small",{"2":{"251":6}}],["smoking",{"2":{"251":2}}],["smiling",{"2":{"251":2}}],["smiley",{"2":{"251":2}}],["smile",{"2":{"251":3}}],["smirk",{"2":{"251":2}}],["swappiness",{"2":{"1205":1}}],["swap",{"2":{"1202":1,"1203":2}}],["swarm",{"2":{"993":2,"1080":2}}],["swagger还有一些其他的修饰配置",{"2":{"688":1}}],["swaggerconfig",{"2":{"687":2,"688":2}}],["swagger默认会对所有的controller划分到default模块中",{"2":{"687":1}}],["swagger内部会分析当前的属性属于当前接口的什么参数",{"2":{"685":1}}],["swaggermodule",{"2":{"681":3,"687":1,"688":1}}],["swagger工具包可以安装",{"2":{"679":1}}],["swagger",{"2":{"678":1,"680":1,"681":1,"688":1}}],["sweet",{"2":{"251":1}}],["sweat",{"2":{"251":4}}],["swimmer",{"2":{"251":1}}],["switches",{"2":{"708":1,"718":2}}],["switchtohttp",{"2":{"619":1,"639":1,"648":1,"651":1,"674":1}}],["switching",{"2":{"317":1,"354":1}}],["switch",{"2":{"62":1,"955":2}}],["s4",{"2":{"245":2,"249":1}}],["scss在保存时根据prettier规则进行格式化",{"2":{"838":1}}],["scss",{"2":{"838":1,"843":1}}],["scgi",{"2":{"708":2,"718":4}}],["scope参数可以指定对应的包",{"2":{"814":1}}],["scopeslot",{"2":{"970":1}}],["scopes",{"2":{"801":1}}],["scope>",{"2":{"788":1}}],["scope作用域",{"0":{"620":1}}],["scope",{"2":{"589":2,"606":5,"728":4,"788":1,"800":2,"944":3,"945":2,"1085":1,"1088":1,"1089":1,"1090":4,"1186":2,"1187":2}}],["scorpius",{"2":{"251":1}}],["score",{"2":{"251":1,"1209":2}}],["scale选项可以根据实际需要动态地扩展服务的容器数量",{"2":{"1029":1}}],["scale",{"2":{"1029":1}}],["scale=1",{"2":{"222":1,"671":1}}],["scavenge算法",{"2":{"559":1}}],["scan",{"2":{"454":1}}],["sched",{"2":{"1209":1}}],["schedulerjob",{"2":{"944":1,"945":1}}],["scheduler",{"2":{"934":5,"944":6,"945":1,"1132":3,"1209":1,"1212":2,"1217":1}}],["scheduler仅仅会将",{"2":{"934":1}}],["scheduleregistry",{"2":{"661":14}}],["schedulerregistry",{"2":{"661":9}}],["schedulemodule",{"2":{"659":3}}],["schedule",{"2":{"658":1,"659":2,"660":6,"661":7,"964":1,"1121":1,"1132":1,"1209":1}}],["schedules",{"2":{"541":1}}],["schema",{"2":{"814":1,"817":1,"818":1}}],["schemas",{"2":{"814":1,"818":1}}],["scheme",{"2":{"339":1,"723":1,"724":1}}],["school",{"2":{"251":2}}],["scissors",{"2":{"251":1}}],["scene",{"2":{"251":1}}],["scratch",{"2":{"1069":1}}],["screenshotonrunfailure",{"2":{"878":1,"879":1}}],["screenshots",{"2":{"878":1}}],["screenshotsfolder",{"2":{"878":1}}],["screenheight",{"2":{"247":6}}],["scream",{"2":{"251":2}}],["scroll",{"2":{"247":2,"251":1}}],["script运行",{"2":{"1124":1}}],["script失败会导致整个作业的失败",{"2":{"1124":1}}],["script或after",{"2":{"1124":1}}],["script以数组的形式存在",{"2":{"1124":1}}],["script用户并赋予执行脚本权限",{"2":{"728":1}}],["scripting",{"2":{"350":1}}],["script>alert",{"2":{"350":4}}],["script>",{"2":{"222":2,"350":6,"352":2,"354":1,"404":2,"534":2,"724":2,"929":2,"930":2,"934":2,"936":2,"943":2,"1034":2}}],["scripts",{"2":{"175":1,"177":1,"182":1,"190":1,"237":2,"799":1,"804":1,"805":1,"849":1,"877":1,"1051":1,"1102":1,"1103":1,"1184":1}}],["script",{"2":{"130":1,"338":4,"350":5,"354":1,"532":3,"703":1,"728":3,"829":1,"857":1,"1074":1,"1119":3,"1121":1,"1124":7,"1132":3,"1143":2,"1190":1}}],["slug",{"2":{"1121":6}}],["sl",{"2":{"710":1}}],["sleep",{"2":{"726":1,"728":1,"1178":1}}],["sleepy",{"2":{"251":1}}],["sleeping",{"2":{"251":1}}],["slot",{"2":{"207":1,"251":1,"757":1,"970":1}}],["slice",{"0":{"30":1},"2":{"7":1,"9":1,"30":5,"479":1,"491":2,"496":1,"497":1,"708":1,"718":2,"728":1,"768":1,"955":2,"1082":1}}],["sky",{"2":{"701":1}}],["skyblue",{"2":{"111":1,"112":1}}],["skiperror",{"2":{"771":13}}],["skip",{"2":{"728":1,"800":2,"857":1}}],["skipfiles",{"2":{"400":1,"401":1}}],["skipwaiting",{"2":{"222":1}}],["skill",{"0":{"397":1},"1":{"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1}}],["ski",{"2":{"251":1}}],["skull",{"2":{"251":1}}],["sk",{"2":{"154":1,"903":1}}],["skjavaslkdjavallksdfjavalp",{"2":{"154":1,"903":1}}],["spread",{"2":{"964":1}}],["sprite",{"2":{"874":1}}],["spyon",{"2":{"870":1}}],["spoked",{"2":{"251":1}}],["specified",{"2":{"1103":1,"1184":1}}],["specification",{"2":{"980":1}}],["specific",{"2":{"238":1,"1161":1}}],["specpattern",{"2":{"878":1,"879":1}}],["spec",{"2":{"634":1,"639":1,"645":1,"648":1,"650":1,"665":2,"859":1,"860":1,"863":1,"864":2,"866":1,"867":1,"869":1,"874":1,"875":1,"1209":3,"1217":2}}],["speedboat",{"2":{"251":1}}],["speedcurve",{"0":{"220":1},"2":{"220":1,"221":1}}],["speech",{"2":{"251":1}}],["speaker",{"2":{"251":1}}],["speak",{"2":{"251":1}}],["spend`",{"2":{"230":1}}],["splice方法",{"2":{"956":1}}],["splice",{"2":{"195":1,"245":1,"745":1,"955":4,"956":1}}],["splitchunks",{"2":{"130":1,"187":1,"190":1}}],["splitchunks字段",{"2":{"130":1}}],["split",{"2":{"61":1,"154":3,"197":1,"520":1,"521":2,"656":1,"674":1,"747":1,"903":3,"938":1}}],["sparkmd5",{"2":{"772":1,"773":1}}],["spark",{"2":{"772":4,"773":4}}],["sparkler",{"2":{"251":1}}],["sparkles",{"2":{"251":1,"801":1}}],["sparkling",{"2":{"251":1}}],["spaghetti",{"2":{"251":1}}],["spades",{"2":{"251":1}}],["space",{"2":{"160":2,"251":1,"462":1,"800":1,"836":2}}],["span>",{"2":{"145":2,"894":2}}],["span",{"2":{"145":2,"894":2}}],["s|d",{"2":{"143":1,"892":1}}],["s字符",{"2":{"140":1,"889":1}}],["s不匹配",{"2":{"139":1,"888":1}}],["sni",{"2":{"708":1}}],["snippet",{"2":{"118":1}}],["snapshotter",{"2":{"1209":7}}],["snapshot",{"2":{"1209":1}}],["snapshots",{"2":{"860":1,"864":1,"874":1,"875":1}}],["snail",{"2":{"251":1}}],["snake",{"2":{"251":1}}],["snowpack",{"2":{"281":1}}],["snowboarder",{"2":{"251":1}}],["snowman",{"2":{"251":1}}],["snowflake",{"2":{"251":1}}],["sn连接成字符串",{"2":{"83":2}}],["sn",{"2":{"83":2}}],["s2",{"2":{"83":5,"196":2,"746":2}}],["s12314",{"2":{"144":3,"893":3}}],["s1",{"2":{"83":3,"196":2,"746":2}}],["sudo",{"2":{"1078":1,"1082":2,"1093":5,"1171":2,"1174":1,"1205":3,"1211":1,"1214":4}}],["suitable",{"2":{"857":1}}],["suites",{"2":{"860":2,"864":2,"874":1,"875":1}}],["suite",{"2":{"139":2,"888":2}}],["succeeded",{"2":{"1045":1,"1157":1}}],["successfully",{"2":{"1157":1,"1214":1}}],["successful",{"2":{"708":1}}],["success",{"2":{"230":1,"317":5,"726":2,"728":1,"806":1,"850":1,"1121":1,"1131":2,"1139":1,"1178":2}}],["successor",{"2":{"205":7,"755":7}}],["such",{"2":{"1007":1}}],["sucessful",{"2":{"805":1}}],["supports",{"2":{"878":1,"880":1}}],["supportfile",{"2":{"878":1,"879":1,"880":1}}],["support",{"2":{"708":1,"878":1,"880":2}}],["supportobserver",{"2":{"247":3}}],["super在子类构造函数中必须先于this属性相关操作调用",{"2":{"583":1}}],["super",{"2":{"583":4}}],["susi",{"2":{"573":2}}],["suspense",{"2":{"944":2}}],["suspension",{"2":{"251":1}}],["suspect",{"2":{"251":2}}],["sushi",{"2":{"251":1}}],["surfer",{"2":{"251":1}}],["sunset",{"2":{"251":1}}],["sunrise",{"2":{"251":3}}],["sun",{"2":{"251":1}}],["sunflower",{"2":{"251":1}}],["sunny",{"2":{"251":2}}],["sunglasses",{"2":{"251":1}}],["sue",{"2":{"83":2}}],["subjectlimit",{"2":{"801":1}}],["subject",{"2":{"788":1,"797":4,"801":1}}],["subject>",{"2":{"788":1}}],["sublimetext",{"2":{"785":1}}],["subs",{"2":{"951":6,"954":4}}],["subscribemessage",{"2":{"702":3}}],["substring",{"2":{"61":1}}],["substr",{"2":{"60":2,"83":1}}],["subbuffer",{"2":{"485":3}}],["subtree",{"2":{"404":2}}],["subnet",{"2":{"363":1}}],["submit",{"2":{"352":1}}],["submitted",{"2":{"222":2}}],["sub这个应该大家用到的最广的设计",{"2":{"195":1,"745":1}}],["sub",{"2":{"83":2,"708":1,"718":2,"951":3,"954":2}}],["sum",{"2":{"83":4,"858":1,"859":3,"863":1}}],["shkubectl",{"2":{"1217":2}}],["shkubeadm",{"2":{"1213":1,"1214":3,"1215":1,"1216":1}}],["shyour",{"2":{"1214":1}}],["shyum",{"2":{"707":2,"713":1,"728":1,"1198":1,"1204":1,"1206":1,"1209":1,"1211":1}}],["shutdowngraceperiodcriticalpods",{"2":{"1212":1}}],["shutdowngraceperiod",{"2":{"1212":1}}],["shutdown",{"2":{"1209":1}}],["shtar",{"2":{"1208":1}}],["shln",{"2":{"1204":1}}],["shlabel",{"2":{"1057":1}}],["sh192",{"2":{"1200":1}}],["shhostnamectl",{"2":{"1199":1}}],["shhealthcheck",{"2":{"1066":1}}],["shm",{"2":{"1159":1,"1171":2,"1172":1,"1173":1}}],["shmkdir",{"2":{"173":1,"1094":1,"1152":1,"1172":1,"1184":1,"1214":1}}],["shvi",{"2":{"1202":1}}],["shvolume",{"2":{"1061":1}}],["shvalid",{"2":{"722":1}}],["shworkdir",{"2":{"1056":1}}],["shwebpack",{"2":{"175":1}}],["shfrom",{"2":{"1053":1,"1070":1}}],["shdocker",{"2":{"994":1,"999":1,"1004":2,"1005":1,"1007":1,"1008":1,"1009":1,"1010":2,"1014":2,"1027":1,"1028":1,"1029":1,"1030":1,"1031":1,"1032":1,"1034":1,"1039":1,"1055":3,"1063":2,"1068":1,"1069":2,"1073":2,"1074":2,"1082":1,"1084":1,"1094":1,"1113":1,"1114":1,"1115":1,"1151":1,"1153":1,"1160":1,"1172":1,"1173":1,"1179":1}}],["shgit",{"2":{"1183":1,"1208":1}}],["shgroup",{"2":{"810":1}}],["shget",{"2":{"354":1}}],["sh$arg",{"2":{"729":1}}],["shrun",{"2":{"1058":1}}],["shreturn",{"2":{"716":1}}],["shrewrite",{"2":{"715":1}}],["shrimp",{"2":{"251":1}}],["shsysctl",{"2":{"1205":1}}],["shsystemctl",{"2":{"1039":1,"1082":1,"1083":1,"1208":1,"1209":1}}],["shswapoff",{"2":{"1203":1}}],["shsudo",{"2":{"1082":2,"1093":1,"1172":1}}],["shsrc",{"2":{"676":1}}],["shselect",{"2":{"83":3,"84":1,"85":1,"90":1}}],["sh├──",{"2":{"665":1}}],["shntpdate",{"2":{"1204":1}}],["shnode",{"2":{"1184":1}}],["shnest",{"2":{"665":1}}],["shnmap",{"2":{"454":1}}],["shnpm",{"2":{"174":1,"175":1,"176":2,"177":2,"179":2,"180":2,"181":2,"182":1,"184":1,"190":1,"813":1,"840":1,"1073":1,"1074":1,"1102":1,"1108":1,"1191":1}}],["sh2001",{"2":{"366":2}}],["shcd",{"2":{"1208":1,"1209":1}}],["shcat",{"2":{"1205":1,"1206":1,"1210":1}}],["shchmod",{"2":{"1178":1}}],["shcopy",{"2":{"1059":1}}],["shcoverage",{"2":{"874":1}}],["shcontent",{"2":{"344":1,"350":1}}],["shcloses",{"2":{"793":1}}],["shcreate",{"2":{"86":2}}],["sh➜",{"2":{"298":1,"325":1,"342":1,"343":1,"368":2,"381":1,"383":1,"386":1,"390":1,"453":1,"456":1,"632":1,"655":1,"658":1,"665":1,"671":1,"672":1,"680":1,"696":1,"697":1,"701":1,"707":2,"713":2,"718":2,"723":1,"726":2,"728":2,"796":1,"797":3,"799":1,"800":2,"801":2,"802":1,"804":1,"805":1,"806":1,"813":3,"814":6,"815":2,"819":1,"831":1,"844":1,"846":1,"849":1,"856":1,"857":1,"858":1,"864":1,"873":1,"874":1,"875":2,"877":1,"880":1,"1002":1,"1005":1,"1014":1,"1039":1,"1047":1,"1051":1,"1054":2,"1063":3,"1064":3,"1088":1,"1089":1,"1090":2,"1103":2,"1107":1,"1157":1,"1184":1,"1198":1,"1208":1,"1217":1,"1218":1}}],["shentrypoint",{"2":{"1064":1}}],["shenv",{"2":{"1055":1}}],["shexpose",{"2":{"1062":1}}],["sheep",{"2":{"251":1}}],["shell格式就是在终端执行命令一样",{"2":{"1058":1}}],["shell格式和exec格式",{"2":{"1058":1}}],["shellselect",{"2":{"82":2}}],["shelldelete",{"2":{"79":1}}],["shellupdate",{"2":{"78":1}}],["shell",{"0":{"1163":1},"2":{"73":1,"78":2,"79":1,"80":3,"81":2,"251":1,"1051":1,"1063":1,"1121":2,"1163":1}}],["shim",{"2":{"1209":7}}],["shimcgroup",{"2":{"1209":1}}],["shipit",{"2":{"251":2}}],["ship",{"2":{"251":1,"1085":1}}],["shirt",{"2":{"251":2}}],["shit",{"2":{"251":1}}],["shift",{"2":{"98":2,"156":2,"157":8,"158":11,"159":1,"160":5,"161":6,"162":2,"163":3,"164":10,"165":1,"166":1,"197":1,"747":1,"771":1,"955":2}}],["shonbuild",{"2":{"1065":1}}],["shoe",{"2":{"251":2}}],["shortcut",{"2":{"222":1,"671":1}}],["short",{"2":{"222":2,"800":1,"1121":2}}],["showhiddenmetricsforversion",{"2":{"1212":1}}],["showduplicates",{"2":{"1082":1,"1093":1}}],["showcerts",{"2":{"726":1}}],["shown",{"2":{"454":1}}],["shower",{"2":{"251":1}}],["show",{"2":{"206":2,"581":2,"756":2}}],["shoulddecodenewlinesforhref",{"2":{"954":1}}],["shoulddecodenewlines",{"2":{"954":1}}],["shouldtrack",{"2":{"934":2,"964":6}}],["should",{"2":{"141":1,"238":1,"857":7,"890":1,"1098":1,"1103":2,"1107":1,"1157":1,"1184":1,"1191":1,"1214":1}}],["sh",{"2":{"96":1,"97":1,"182":1,"190":1,"344":3,"350":1,"354":1,"379":1,"380":1,"381":1,"382":2,"399":1,"434":1,"602":1,"610":1,"634":1,"639":1,"645":1,"648":1,"650":1,"718":2,"726":5,"728":5,"788":1,"805":3,"806":3,"817":1,"818":1,"850":1,"860":1,"878":1,"966":1,"998":1,"999":2,"1000":2,"1001":1,"1004":1,"1006":1,"1007":1,"1009":2,"1012":1,"1014":1,"1039":1,"1046":2,"1051":7,"1059":1,"1062":1,"1063":1,"1082":2,"1090":4,"1094":1,"1095":1,"1102":3,"1103":1,"1107":1,"1116":2,"1156":1,"1157":1,"1171":1,"1174":2,"1176":1,"1178":6,"1179":1,"1183":1,"1184":1,"1187":2,"1189":1,"1190":1,"1191":1,"1201":1,"1202":1,"1203":2,"1205":1,"1206":1,"1208":2,"1212":1,"1217":1,"1218":3}}],["sha512",{"2":{"1103":1,"1108":1,"1189":1}}],["shasum",{"2":{"1103":1,"1108":1,"1189":1}}],["shasums256",{"2":{"97":1}}],["shadd",{"2":{"1060":1}}],["shallow",{"2":{"954":2,"955":2,"964":2}}],["shallowcopy",{"2":{"26":2}}],["shaking",{"2":{"784":1,"957":1}}],["sha256",{"2":{"703":2,"726":1,"1002":1,"1039":2,"1046":1,"1047":1,"1051":2,"1054":2,"1055":2,"1082":1,"1214":3,"1215":1}}],["shanghai",{"2":{"660":1,"703":1,"1055":1,"1204":2}}],["shaccept",{"2":{"347":1}}],["sha384",{"2":{"333":1}}],["sharg",{"2":{"1054":1}}],["sharpen",{"2":{"718":1}}],["sharedpropertydefinition",{"2":{"932":6}}],["shared",{"2":{"726":3,"1121":1,"1161":1,"1203":1,"1209":1}}],["sharemodule",{"2":{"609":4}}],["share",{"2":{"325":1,"709":2,"710":2,"711":1,"712":1,"1004":1,"1007":1,"1034":2,"1073":1,"1204":1,"1227":1}}],["sharing",{"2":{"222":1,"1209":1}}],["shape",{"2":{"251":1}}],["shaved",{"2":{"251":1}}],["sha",{"2":{"83":3,"354":1,"1121":4,"1122":8}}],["square",{"2":{"251":6}}],["squared",{"2":{"251":1}}],["squirrel",{"2":{"251":2}}],["sqrt",{"2":{"83":1}}],["sql注入攻击",{"2":{"349":1}}],["sqldatabase",{"2":{"83":1}}],["sqldate",{"2":{"83":1}}],["sql为了进行数据类型转化",{"2":{"83":1}}],["sqlcase",{"2":{"83":1}}],["sqlcurdate",{"2":{"83":1}}],["sqlaes",{"2":{"83":1}}],["sqlascii",{"2":{"83":1}}],["sqlabs",{"2":{"83":1}}],["sqlavg",{"2":{"83":1}}],["sql",{"2":{"72":1,"75":1,"76":1,"77":3}}],["sqlshow",{"2":{"72":1,"74":1}}],["sqlserver",{"2":{"67":1}}],["sq=",{"2":{"49":1,"555":1}}],["sigkill",{"2":{"1008":1}}],["sigterm",{"2":{"621":1,"1008":1}}],["signkey",{"2":{"726":1,"1178":2}}],["signing",{"2":{"707":2,"1212":1}}],["signal=15",{"2":{"994":1}}],["signal",{"2":{"251":1,"621":1,"1008":1}}],["signed",{"2":{"83":2,"347":1,"726":1}}],["sign",{"2":{"64":2,"83":1,"251":5}}],["signcount",{"2":{"64":2}}],["signdate",{"2":{"64":2}}],["site",{"2":{"350":1,"351":1}}],["sitespeedio",{"2":{"218":1}}],["sitespeed",{"0":{"217":1},"1":{"218":1,"219":1},"2":{"217":1,"218":4}}],["simpleset",{"2":{"941":1}}],["simple",{"2":{"337":2}}],["six",{"2":{"251":2}}],["side",{"2":{"251":1}}],["silhouette",{"2":{"251":2}}],["silly",{"2":{"62":1}}],["singlequote",{"2":{"839":1}}],["single",{"2":{"830":1}}],["singleton",{"2":{"196":5,"746":5}}],["since",{"2":{"347":1,"728":1,"1007":1,"1082":1}}],["sinaimg",{"2":{"132":1}}],["size=4",{"2":{"708":1,"718":2}}],["size=",{"2":{"63":1}}],["sizes",{"2":{"63":3,"222":4}}],["sizes=",{"2":{"63":1}}],["size用来表示指定宽度",{"2":{"12":1}}],["size",{"2":{"12":2,"13":1,"14":1,"16":2,"62":1,"63":12,"179":1,"325":1,"386":1,"413":1,"454":2,"495":1,"497":1,"500":1,"510":1,"520":1,"521":1,"712":1,"718":2,"768":3,"770":1,"836":1,"994":1,"998":2,"1002":2,"1006":1,"1039":1,"1046":1,"1103":2,"1159":1,"1171":2,"1172":1,"1173":1,"1177":1,"1189":2,"1209":4}}],["s+",{"2":{"60":1,"576":1}}],["ssg",{"2":{"904":1}}],["ssh端口",{"2":{"1172":1}}],["ssh",{"0":{"1168":1},"2":{"1121":2,"1168":2}}],["ssh监听了22端口",{"2":{"383":1}}],["sshd",{"2":{"383":2}}],["ssl证书配置",{"0":{"1178":1}}],["ssl证书位置",{"2":{"1159":1}}],["ssl会话缓存是用来存储ssl握手过程中生成的会话密钥的",{"2":{"726":1}}],["ssl模块",{"2":{"708":1}}],["ssl来安装证书即可",{"2":{"422":1}}],["ssl来安装证书",{"2":{"422":1}}],["ssl开关",{"2":{"415":1}}],["ssl",{"0":{"329":1},"2":{"328":2,"329":8,"333":1,"421":3,"422":1,"708":4,"709":1,"710":4,"718":8,"726":9,"727":2,"1158":1,"1159":1,"1178":8}}],["ssr的参考后续文章",{"2":{"677":1}}],["ssr等等",{"2":{"671":1}}],["ssr等多种渲染模式",{"2":{"671":1}}],["ssrcontext",{"2":{"238":1}}],["ssr",{"2":{"238":2,"904":1}}],["ss",{"2":{"57":1,"60":2,"190":1,"1074":1}}],["ss=chromium",{"2":{"49":1,"555":1}}],["sampling",{"2":{"1209":1}}],["samesite",{"2":{"347":1,"353":2}}],["same",{"2":{"336":1}}],["sass",{"2":{"843":1}}],["sash",{"2":{"251":1}}],["safe",{"2":{"771":1}}],["safecode",{"2":{"54":1}}],["safari",{"2":{"525":1,"1005":1,"1007":1}}],["sack",{"2":{"391":2}}],["salmon",{"2":{"283":1}}],["salt",{"2":{"83":2}}],["sagittarius",{"2":{"251":1}}],["sa",{"2":{"251":1,"1228":1}}],["sailboat",{"2":{"251":1}}],["sake",{"2":{"251":1}}],["saxophone",{"2":{"251":1}}],["san",{"2":{"726":1}}],["sans",{"2":{"284":1}}],["sandbox",{"0":{"905":1},"2":{"1209":2}}],["sandal",{"2":{"251":1}}],["sand",{"2":{"251":1}}],["santa",{"2":{"251":1}}],["sat",{"2":{"453":1}}],["satellite",{"2":{"251":1}}],["satchel",{"2":{"251":1}}],["satisfied",{"2":{"251":1}}],["save",{"2":{"57":1,"283":1,"289":1,"1001":1,"1174":1}}],["say",{"2":{"33":5,"201":2,"573":2,"575":2,"576":1,"577":2,"578":4,"579":3,"580":3,"581":1,"582":1,"583":2,"751":2}}],["symlink",{"2":{"707":1}}],["symbols",{"2":{"251":2}}],["symbol",{"2":{"24":1,"33":4,"40":3,"41":2,"229":2,"230":1,"232":4,"251":1,"546":3,"547":2,"571":1,"771":4,"964":2}}],["syntax",{"2":{"708":1}}],["synack",{"2":{"381":1}}],["syn泛洪也称syn攻击",{"2":{"381":1}}],["syn泛洪",{"0":{"381":1}}],["syn队列溢出时开启",{"2":{"381":1}}],["syn队列的的最大限制通常是1000",{"2":{"380":1}}],["syn队列",{"2":{"380":1}}],["syn",{"2":{"376":2,"380":1,"381":4,"390":1,"455":1}}],["syncperiod",{"2":{"1212":2}}],["syncfrequency",{"2":{"1212":1}}],["syncookies",{"2":{"381":1}}],["synchronize",{"2":{"376":1}}],["sync",{"0":{"942":1},"2":{"190":1,"938":1,"942":1,"944":2,"945":1}}],["sync=",{"2":{"63":1}}],["sysconfig",{"2":{"1206":3}}],["sysctl",{"2":{"1205":5}}],["sysoev创建于2002年",{"2":{"704":1}}],["sys",{"2":{"368":1,"380":2,"381":2,"382":2,"386":1,"390":1,"1064":1,"1195":1}}],["system下的calico",{"2":{"1218":2}}],["systemdcgroup",{"2":{"1209":2}}],["systemd",{"2":{"707":2,"728":1,"1082":1,"1208":5,"1209":1,"1212":1}}],["systemctl",{"2":{"707":1,"728":4,"1039":1,"1045":1,"1082":1,"1083":1,"1093":1,"1201":2,"1206":1,"1208":4,"1209":2,"1211":1}}],["system",{"2":{"54":1,"66":1,"438":1,"707":2,"728":2,"994":2,"1082":2,"1132":2,"1157":1,"1205":1,"1208":4,"1212":1,"1217":18,"1218":4}}],["syringe",{"2":{"251":1}}],["sorter",{"2":{"874":1}}],["sort",{"2":{"656":1,"770":1,"874":1,"955":2,"1082":1,"1093":1}}],["sortnum",{"2":{"63":2}}],["sonatype",{"2":{"1046":1}}],["sons",{"2":{"577":6}}],["songname",{"2":{"62":3}}],["song",{"2":{"54":1}}],["sock",{"2":{"1082":1,"1153":2,"1159":2,"1208":1,"1209":1,"1212":2,"1214":1}}],["socketgroup=docker",{"2":{"1208":1}}],["socketuser=root",{"2":{"1208":1}}],["socketmode=0660",{"2":{"1208":1}}],["socketmodule",{"2":{"702":1}}],["socketcontroller",{"2":{"702":3}}],["socketio",{"2":{"702":1}}],["socket代理",{"2":{"414":1}}],["socket作为debugger",{"2":{"399":1}}],["socket",{"2":{"329":1,"354":2,"702":3,"1159":1,"1208":5,"1214":1}}],["soccer",{"2":{"251":1}}],["soon",{"2":{"251":1}}],["sos",{"2":{"251":1}}],["sound",{"2":{"251":1}}],["sourcevip",{"2":{"1212":1}}],["source=myvolume",{"2":{"1116":1}}],["source=",{"2":{"1116":1}}],["source=2",{"2":{"708":1,"718":2}}],["sourcetype",{"2":{"829":1}}],["sourcetext>",{"2":{"118":2}}],["source的定义非常广泛",{"2":{"532":1}}],["sourcerange",{"2":{"462":1}}],["sources中的位置",{"2":{"410":1}}],["sourcescontent",{"2":{"410":2}}],["sources",{"2":{"410":2}}],["sourcemaps",{"0":{"448":1}}],["sourcemap版本",{"2":{"410":1}}],["sourcemap结构",{"2":{"410":1}}],["sourcemap解密",{"2":{"410":1}}],["sourcemappathoverrides",{"2":{"406":1}}],["sourcemap",{"2":{"187":1,"190":1}}],["source",{"2":{"49":1,"118":1,"152":3,"183":8,"190":1,"251":1,"532":3,"555":1,"832":2,"840":1,"843":1,"901":3,"938":1,"944":4,"945":5,"1121":1,"1122":5,"1136":2}}],["sob",{"2":{"251":1}}],["somevolume",{"2":{"1116":1}}],["somedir",{"2":{"1004":1,"1059":1,"1061":1,"1116":1}}],["somepath",{"2":{"831":1}}],["some",{"2":{"195":1,"745":1}}],["something",{"2":{"64":1,"715":1,"956":1}}],["solid",{"2":{"12":1,"110":2,"111":1,"112":1}}],["s",{"2":{"44":2,"60":1,"83":1,"120":1,"121":1,"128":1,"138":4,"139":6,"140":1,"143":1,"152":5,"154":1,"163":3,"180":1,"222":2,"550":2,"621":1,"708":3,"718":1,"720":3,"726":2,"860":2,"864":3,"874":3,"875":2,"887":4,"888":6,"889":1,"892":1,"901":5,"903":1,"1006":1,"1032":1,"1121":2,"1157":1,"1208":4,"1218":2}}],["sed",{"2":{"1208":1}}],["semi",{"2":{"800":1,"839":1}}],["semantic",{"2":{"794":1}}],["segments",{"2":{"938":3}}],["segment",{"2":{"382":1,"386":1,"457":1}}],["sent",{"2":{"709":1,"729":2}}],["sent状态",{"2":{"378":1}}],["sending",{"2":{"728":2}}],["sendfile",{"2":{"709":2}}],["sendstatus",{"2":{"692":1}}],["sender",{"2":{"454":2}}],["sendmessage",{"2":{"354":3,"702":1}}],["send",{"2":{"61":1,"62":1,"64":1,"354":3,"383":1,"498":1,"723":1,"1209":1,"1225":1}}],["seq在初始化时是个随机数",{"2":{"378":1}}],["seq=3",{"2":{"1218":1}}],["seq=2",{"2":{"1063":1,"1064":1,"1218":2}}],["seq=0",{"2":{"1063":1,"1064":2,"1090":4}}],["seq=y请求",{"2":{"378":1}}],["seq=x请求表示主动连接",{"2":{"378":1}}],["seq=1",{"2":{"368":1,"1063":1,"1064":1,"1090":2,"1218":2}}],["seven",{"2":{"251":1}}],["seat",{"2":{"251":1}}],["search",{"2":{"154":5,"354":1,"857":1,"903":5,"999":2}}],["seen",{"2":{"941":5}}],["seenobjects",{"2":{"941":2}}],["seedling",{"2":{"251":1}}],["seed++",{"2":{"201":1,"751":1}}],["see",{"2":{"251":1,"1045":1,"1046":1,"1217":2}}],["seo维护",{"2":{"779":1}}],["seo指南",{"2":{"779":1}}],["seo优化",{"0":{"778":1},"1":{"779":1}}],["seo等等",{"2":{"762":1}}],["seo",{"2":{"214":1}}],["sex=",{"2":{"204":2,"754":2}}],["sex",{"2":{"204":8,"648":1,"754":8}}],["serif",{"2":{"284":1}}],["serializetostring方法会给根元素自动增加xmlns命名空间",{"2":{"122":1}}],["serializetostring方法和outerhtml有些类似",{"2":{"122":1}}],["serializetostring的参数解释",{"2":{"121":1}}],["serializetostring",{"2":{"121":1}}],["servestaticoptions",{"2":{"695":2}}],["serve",{"2":{"694":1,"698":1,"966":1}}],["server是可选部分",{"2":{"1014":1}}],["servername",{"2":{"726":1}}],["server级别",{"2":{"709":1}}],["server块",{"2":{"709":1}}],["server后",{"2":{"400":1}}],["server呢",{"2":{"400":1}}],["server的实时信息",{"2":{"994":1}}],["server的端口就可以了",{"2":{"399":1}}],["server的syn队列会很快被打满",{"2":{"381":1}}],["server端负责管理和运行docker容器",{"2":{"994":1}}],["server端就处于syn",{"2":{"384":1}}],["server端不知道直接推送已经被缓存的静态资源",{"2":{"325":1}}],["servers",{"2":{"383":1}}],["server会触发超时重传机制再次发送fin报文给client",{"2":{"382":1}}],["server处理完数据发送fin请求给client",{"2":{"382":1}}],["server处于listen状态",{"2":{"378":1}}],["server根据其中的t值可以计算出与加密",{"2":{"381":1}}],["server也会忽略掉client的syn请求包",{"2":{"380":1}}],["server发送ack+syn给client后",{"2":{"380":1}}],["server收到client的ack响应后进入close状态",{"2":{"382":1}}],["server收到client的ack报文后会校验合法性",{"2":{"381":1}}],["server收到client的fin请求后",{"2":{"382":1}}],["server收到后创建半连接对象将其放入syn队列",{"2":{"380":1}}],["server收到客户端的ack响应后也进入established状态",{"2":{"378":1}}],["server接受到客户端的syn请求后",{"2":{"378":1}}],["serverkeyexchange",{"2":{"333":1}}],["serverhello",{"2":{"333":1}}],["server随机数",{"2":{"332":1}}],["serverpush主动推送资源可能会存在以下问题",{"2":{"325":1}}],["serverpush问题",{"2":{"325":1}}],["serverpush顾名思义服务器推送技术",{"2":{"325":1}}],["serverpush",{"0":{"325":1}}],["server等数据库",{"2":{"70":1}}],["server社区免费版",{"2":{"68":1}}],["server",{"0":{"710":1},"2":{"56":2,"128":3,"132":1,"177":2,"182":1,"190":1,"317":6,"319":1,"323":1,"332":2,"353":1,"354":5,"399":2,"400":4,"401":1,"637":1,"639":1,"640":2,"702":4,"709":2,"710":5,"713":1,"717":1,"721":1,"722":2,"723":2,"724":1,"725":1,"726":1,"727":1,"729":3,"1007":1,"1014":3,"1034":6,"1074":2,"1082":1,"1121":20,"1158":1,"1159":1,"1206":1,"1209":2,"1217":1}}],["service模块",{"2":{"667":1}}],["service例子",{"2":{"622":1}}],["service通常是个被",{"2":{"622":1}}],["service通常都用来处理具体的业务",{"2":{"622":1}}],["servicesubnet",{"2":{"1212":1}}],["services中的每个容器都是一个服务",{"2":{"1021":1}}],["services是定义容器的基本单位",{"2":{"1020":1}}],["services",{"0":{"1020":1,"1146":1},"2":{"229":3,"801":1,"1013":1,"1018":3,"1020":1,"1023":1,"1024":2,"1025":1,"1034":1,"1035":1,"1121":1,"1146":1,"1173":1}}],["serviceworker",{"2":{"222":2}}],["service",{"0":{"622":1},"2":{"54":1,"168":1,"229":8,"230":3,"231":2,"232":1,"317":1,"367":1,"454":1,"508":1,"604":1,"665":3,"707":2,"728":3,"805":1,"1020":4,"1021":1,"1022":1,"1023":3,"1030":2,"1032":1,"1082":3,"1179":2,"1201":2,"1206":1,"1208":7,"1209":6,"1214":3,"1218":1}}],["sep",{"2":{"83":1}}],["session",{"0":{"348":1},"2":{"61":3,"64":1,"309":1,"336":1,"346":1,"431":1,"438":1,"726":8,"1159":2}}],["selinux=0这样每次重启也是关闭状态的",{"2":{"1202":1}}],["selinux=0",{"2":{"1202":1}}],["selinux的值为",{"2":{"1202":1}}],["selinux",{"2":{"1202":2,"1209":2}}],["selectnodecontents",{"2":{"462":1}}],["selectnode",{"2":{"462":1}}],["selection",{"2":{"462":1}}],["selection对象",{"2":{"462":1}}],["selective",{"2":{"391":1}}],["selectbenchmark",{"2":{"83":1}}],["selected",{"2":{"54":1}}],["select",{"2":{"54":1,"66":1,"80":6,"81":4,"83":38,"800":2,"814":1}}],["self",{"2":{"21":2,"98":2,"222":5,"239":2,"350":2,"726":1,"773":4,"934":8,"951":2}}],["section",{"2":{"1217":3}}],["seccomp",{"2":{"1209":1}}],["security",{"2":{"329":1,"350":9,"355":1,"693":1,"1174":1,"1209":1}}],["secure",{"2":{"329":1,"347":2,"350":1,"708":1,"718":2}}],["secondary",{"2":{"728":1}}],["seconds",{"2":{"660":1,"1002":1,"1006":2,"1051":1,"1179":1}}],["second",{"2":{"83":1,"110":2}}],["secrets",{"2":{"1035":1}}],["secretorkey",{"2":{"64":1}}],["secret",{"2":{"54":1,"251":1}}],["sec",{"2":{"49":1,"347":2,"354":8,"555":1}}],["set等等",{"2":{"959":1}}],["set进行拦截",{"2":{"959":1}}],["set拦截",{"2":{"958":1}}],["set两个函数",{"2":{"931":1}}],["setlicense",{"2":{"688":1}}],["setdescription",{"2":{"688":1}}],["setupnodeevents",{"2":{"880":1}}],["setup配置",{"0":{"871":1}}],["setupfilesafterenv",{"2":{"857":1}}],["setupfiles",{"2":{"857":1,"875":1}}],["setup",{"2":{"681":1,"875":3,"934":1,"1132":1}}],["setuint8",{"2":{"489":2}}],["setviewengine",{"2":{"671":1}}],["setbaseviewsdir",{"2":{"671":1}}],["setmetadata",{"2":{"648":1}}],["setter用来和watcher进行关联",{"2":{"954":1}}],["setters",{"2":{"954":1}}],["setter进行拦截",{"2":{"953":1}}],["setter实现对当前的effect进行收集和通知",{"2":{"946":1}}],["setter拦截",{"2":{"932":1}}],["setter拦截时所附加的一个对象",{"2":{"931":1}}],["setter",{"2":{"571":1,"572":1,"934":8,"949":1,"951":3,"954":3,"965":1}}],["settitle",{"2":{"688":1}}],["settimout",{"2":{"539":1}}],["settimeout和setimmediate",{"0":{"539":1}}],["settimeout2",{"2":{"538":3}}],["settimeout1",{"2":{"538":3}}],["settimeout",{"2":{"98":1,"229":1,"230":1,"247":1,"514":1,"532":9,"533":2,"538":2,"539":3,"594":2,"661":4,"702":1,"771":1,"865":1,"868":1,"870":2}}],["setting中直接配置允许的ip",{"2":{"422":1}}],["setting中勾选启用并且需要填写需要断点的域名",{"2":{"419":1}}],["settings",{"2":{"414":1,"421":1}}],["setting",{"2":{"414":4,"420":1}}],["setprototypeof",{"0":{"575":1},"2":{"571":1,"573":1,"575":2,"579":1,"583":2,"955":1}}],["setpaginations",{"2":{"63":1}}],["setitem",{"2":{"864":1}}],["setimmediate以外的大部分回调",{"2":{"538":1}}],["setimmediate",{"2":{"537":1,"539":4,"540":2}}],["setinterval",{"2":{"343":1,"532":1,"534":1,"538":1,"661":1}}],["setendbefore",{"2":{"462":1}}],["setendafter",{"2":{"462":1}}],["setend",{"2":{"462":1}}],["setstart",{"2":{"462":1}}],["setselection",{"2":{"462":1}}],["setsrc",{"2":{"198":5,"748":5}}],["setattribute",{"2":{"244":1,"249":1,"404":2,"521":3}}],["setnextsuccessor",{"2":{"205":4,"755":4}}],["setheaders",{"2":{"695":2}}],["setheader",{"2":{"61":1,"343":1,"455":1,"692":2,"695":1}}],["set",{"2":{"33":1,"78":5,"83":1,"128":3,"132":2,"229":2,"231":4,"238":1,"248":4,"339":5,"453":1,"485":1,"514":1,"718":3,"723":6,"724":5,"857":1,"931":1,"932":4,"934":3,"949":1,"950":3,"951":15,"954":4,"955":1,"956":1,"958":2,"959":6,"963":1,"964":9,"965":2,"1034":4,"1098":2,"1102":1,"1132":1,"1183":1,"1190":1,"1199":3}}],["stderr",{"2":{"1005":1}}],["stdout",{"2":{"1005":1}}],["stdin",{"2":{"1005":1}}],["stmts",{"2":{"860":1,"864":1,"874":2,"875":1}}],["steam",{"2":{"251":1}}],["stew",{"2":{"251":1}}],["stub",{"2":{"708":1,"718":2}}],["stuck",{"2":{"251":3,"1132":2}}],["studio",{"2":{"155":1}}],["student",{"2":{"86":1}}],["stylus",{"2":{"190":1}}],["styl",{"2":{"186":1,"190":2}}],["stylelintignore文件",{"2":{"848":1}}],["stylelintignore",{"0":{"848":1}}],["stylelintrc",{"2":{"844":1}}],["stylelint同样支持",{"2":{"844":1}}],["stylelint类似于eslint其核心也包括插件",{"2":{"842":1}}],["stylelint",{"0":{"842":1},"1":{"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1},"2":{"805":1,"842":2,"843":3,"844":1,"845":2,"846":9,"849":2}}],["stylelint检查",{"2":{"805":1}}],["stylelint和commitlint",{"2":{"803":1}}],["styles",{"2":{"801":1}}],["stylesheet",{"2":{"350":1}}],["style>",{"2":{"110":2,"111":1,"112":1,"350":1}}],["style=",{"2":{"61":1,"145":2,"350":1,"520":1,"894":2}}],["style",{"2":{"54":1,"110":2,"111":1,"112":1,"179":6,"186":1,"190":4,"201":1,"249":1,"325":2,"350":5,"521":2,"534":2,"535":2,"727":1,"751":1,"789":1,"797":1,"800":1,"801":3,"805":2,"833":1,"836":1,"849":1,"857":2}}],["stokerect",{"2":{"283":1}}],["stock",{"2":{"205":4,"755":4}}],["storage",{"2":{"168":1}}],["store呢",{"2":{"1097":1}}],["store理解为存储文件的地方",{"2":{"1097":1}}],["stored",{"2":{"1045":1}}],["stores",{"2":{"54":2,"1097":1}}],["store",{"2":{"54":2,"251":2,"720":2,"848":1,"1045":1,"1071":1,"1097":1,"1183":1}}],["stop选项",{"2":{"1031":1}}],["stopped",{"2":{"1025":1}}],["stoppropagation",{"2":{"200":2,"750":2}}],["stop命令停止容器",{"2":{"1009":1}}],["stop命令",{"2":{"1008":1}}],["stoponentry",{"2":{"401":1}}],["stopbubble",{"2":{"200":1,"750":1}}],["stop",{"0":{"1030":1},"2":{"83":1,"661":2,"708":1,"715":2,"728":1,"944":1,"945":1,"994":1,"1008":1,"1030":1,"1031":1,"1121":1}}],["stabilization",{"2":{"964":1}}],["stable",{"2":{"707":2}}],["standard",{"2":{"846":5}}],["standalone",{"2":{"222":1}}],["stale",{"2":{"721":1,"1132":1}}],["stars",{"2":{"251":1,"999":1}}],["star2",{"2":{"251":1}}],["star",{"2":{"251":3}}],["startup",{"2":{"1209":1}}],["startlimitinterval=60s",{"2":{"1208":1}}],["startlimitburst=3",{"2":{"1208":1}}],["started",{"2":{"1121":1}}],["starter",{"2":{"602":2}}],["start启动一个已经停止的容器或docker",{"2":{"1004":1}}],["startswith",{"2":{"674":1}}],["starttime",{"2":{"634":3}}],["startoffset",{"2":{"462":1}}],["startcontainer",{"2":{"462":1}}],["starting",{"2":{"454":1}}],["startangle",{"2":{"285":1}}],["starty",{"2":{"283":3}}],["startx",{"2":{"283":3}}],["start",{"2":{"126":1,"197":2,"222":2,"230":2,"284":1,"414":1,"510":2,"514":1,"517":1,"520":5,"532":9,"589":4,"661":1,"703":1,"728":2,"747":2,"770":1,"1004":1,"1045":1,"1074":1,"1093":1,"1157":1,"1214":1}}],["stage是在作业中使用的字段",{"2":{"1126":1}}],["stages",{"0":{"1125":1},"2":{"1125":1,"1190":1}}],["stagename",{"2":{"1070":1}}],["stage",{"0":{"1126":1},"2":{"207":1,"757":1,"1119":6,"1121":1,"1126":1,"1127":1,"1143":1,"1190":1}}],["stats",{"2":{"1209":1}}],["stat",{"2":{"520":1,"695":1,"770":1}}],["statistics",{"2":{"1063":1,"1064":2}}],["station",{"2":{"251":1}}],["staticpodpath",{"2":{"1212":1}}],["static可以覆盖容器中的文件",{"2":{"1061":1}}],["static中",{"2":{"1061":1}}],["staticrenderfns",{"2":{"954":3,"971":2}}],["static",{"2":{"54":1,"62":1,"98":4,"134":1,"225":1,"233":5,"354":2,"438":1,"583":2,"609":1,"694":1,"695":1,"697":1,"698":2,"708":1,"709":1,"717":3,"718":2,"951":1,"954":1,"1061":4}}],["statue",{"2":{"251":1}}],["status=0",{"2":{"728":1}}],["statuscode",{"2":{"615":1,"617":1,"637":1}}],["status",{"2":{"57":5,"62":9,"64":2,"83":1,"98":8,"244":11,"245":3,"247":2,"248":2,"344":1,"614":1,"637":1,"639":1,"708":1,"718":2,"728":1,"771":14,"1006":1,"1039":1,"1047":1,"1082":2,"1100":1,"1121":1,"1201":1,"1217":3,"1218":1}}],["state",{"2":{"238":1,"383":1,"454":1,"728":3,"932":2,"937":1,"954":2,"1085":1,"1090":2,"1209":3}}],["statemixin",{"2":{"238":2,"239":1}}],["stack",{"2":{"24":1,"592":1}}],["structural",{"2":{"1132":1}}],["strundefined",{"2":{"44":1,"550":1}}],["strong",{"2":{"708":1,"718":2}}],["stroketext",{"2":{"284":1}}],["strokestyle",{"2":{"283":1}}],["stroke颜色",{"2":{"283":1}}],["stroke",{"2":{"283":1}}],["strs",{"2":{"517":3}}],["strictarp",{"2":{"1212":1}}],["strict",{"2":{"347":1,"350":3,"353":2,"728":1}}],["strings",{"2":{"857":1}}],["string类型组成的数组值",{"2":{"494":1}}],["string>",{"2":{"248":3}}],["string|symbol",{"2":{"229":2,"230":1,"232":1}}],["string常见的正则方法",{"0":{"154":1,"903":1}}],["string转number",{"2":{"43":1,"549":1}}],["string和boolean等其它基础类型之间通过运算符==",{"2":{"41":1,"547":1}}],["string的转换",{"2":{"40":1,"546":1}}],["stringify",{"0":{"32":1},"2":{"32":4,"228":1,"232":1,"354":1,"770":1,"772":1}}],["string",{"2":{"24":1,"30":1,"37":1,"38":5,"40":9,"41":5,"61":1,"64":1,"117":2,"154":1,"225":2,"227":2,"228":1,"229":4,"230":4,"231":2,"232":8,"233":4,"238":2,"243":9,"244":5,"245":2,"249":1,"438":1,"499":1,"517":1,"543":1,"544":5,"546":9,"547":5,"573":1,"576":1,"581":1,"583":1,"606":3,"609":1,"611":6,"613":2,"616":2,"617":1,"618":1,"619":2,"622":1,"624":1,"626":1,"628":2,"632":1,"637":2,"639":1,"643":3,"646":1,"648":1,"651":1,"656":2,"667":1,"669":2,"674":5,"686":2,"695":9,"722":1,"729":1,"770":2,"772":1,"865":1,"874":2,"903":1,"921":2,"932":2,"937":2,"938":3,"939":1,"940":1,"950":1,"951":5,"954":5,"955":3,"959":6,"960":2,"961":1,"962":1,"964":2,"971":1,"1230":4}}],["streamingconnectionidletimeout",{"2":{"1212":1}}],["streaming",{"2":{"1209":2}}],["streamablefile",{"2":{"700":2}}],["stream",{"0":{"508":1},"1":{"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1},"2":{"324":1,"496":2,"508":1,"517":1,"520":2,"708":4,"709":1,"718":8,"1209":6}}],["strength",{"2":{"251":1}}],["strawberry",{"2":{"251":1}}],["straight",{"2":{"251":1}}],["strategy",{"2":{"64":1}}],["strcmp",{"2":{"83":1}}],["str",{"2":{"38":4,"40":3,"44":1,"83":22,"121":1,"137":2,"138":4,"139":2,"140":14,"141":6,"143":1,"145":10,"148":2,"149":2,"150":4,"152":4,"153":1,"154":13,"232":4,"544":4,"546":3,"550":1,"886":2,"887":4,"888":2,"889":14,"890":6,"892":1,"894":10,"897":2,"898":2,"899":4,"901":4,"902":1,"903":13}}],[">改变",{"2":{"936":1,"943":1}}],[">改变number",{"2":{"934":1}}],[">改变port",{"2":{"231":1}}],[">>",{"2":{"726":2,"1178":2,"1190":1}}],[">登录",{"2":{"230":1,"232":1}}],[">获取用户信息",{"2":{"229":1}}],[">java",{"2":{"145":1,"894":1}}],[">$1",{"2":{"145":1,"894":1}}],[">right",{"2":{"111":1,"112":1}}],[">left",{"2":{"111":1,"112":1}}],[">4",{"2":{"83":1}}],[">=",{"2":{"63":1,"247":1,"343":1,"964":1}}],[">123",{"2":{"22":2}}],[">123123",{"2":{"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1}}],[">垂直方向",{"2":{"17":1}}],[">水平方向",{"2":{"17":1}}],[">",{"2":{"12":1,"13":1,"14":1,"15":1,"16":1,"17":2,"18":1,"19":1,"20":1,"21":1,"61":1,"62":1,"63":2,"64":1,"110":9,"111":4,"112":4,"118":1,"179":2,"195":2,"199":1,"205":1,"207":6,"222":12,"229":2,"230":2,"231":2,"232":3,"244":1,"245":5,"247":1,"249":2,"350":8,"352":4,"354":2,"404":3,"499":1,"520":1,"534":2,"629":1,"671":6,"674":1,"687":2,"712":1,"715":1,"724":2,"726":1,"745":2,"749":1,"755":1,"757":6,"765":1,"771":1,"772":1,"875":1,"879":1,"930":1,"1001":1,"1010":1,"1034":1,"1156":2,"1157":12,"1183":1,"1190":1,"1204":1,"1206":1,"1209":1,"1210":1,"1212":1,"1230":1}}],["dmi",{"2":{"1195":1}}],["d2uxhf",{"2":{"1157":1}}],["d2uxhfkntifxm9oks1",{"2":{"1157":2}}],["d选项",{"2":{"1029":1}}],["dtr",{"2":{"1011":1}}],["dto",{"2":{"646":2}}],["df",{"0":{"1235":1},"2":{"994":1}}],["dw",{"2":{"817":1}}],["d路径下的所有",{"2":{"709":1}}],["d路径下我们建立单独的appname",{"2":{"128":1}}],["dc",{"2":{"454":1}}],["db2d3fa0bcb4",{"2":{"1002":1}}],["db2d3fa0bcb45bdc528960d1b06eb68496f044896d901e23d79bb1e54af56b9e",{"2":{"1002":1}}],["dbconfiguration",{"2":{"631":2}}],["db",{"2":{"454":1,"631":3,"669":2,"1023":2,"1024":1}}],["dbtns",{"2":{"404":7}}],["dbmodel",{"2":{"54":1,"64":1}}],["d类地址最高位为1110",{"2":{"359":1}}],["d类地址",{"2":{"359":1}}],["dh参数",{"2":{"726":1}}],["dhparam",{"2":{"726":4}}],["dh和dss等非对称加密算法作为握手过程的加密方式",{"2":{"334":1}}],["dh算法是tls1",{"2":{"333":1}}],["dh公开参数包括质数p",{"2":{"333":1}}],["dhe",{"2":{"333":1,"726":1}}],["dh",{"0":{"333":1},"2":{"331":1,"333":4}}],["dhcp协议可以动态地分配ip地址和其他网络配置信息",{"2":{"301":1}}],["dnsdomain",{"2":{"1212":1}}],["dns等相关的统计",{"2":{"459":1}}],["dns等等功能",{"2":{"414":1}}],["dns",{"2":{"312":1,"414":1,"1091":2,"1121":1,"1212":1,"1217":1,"1218":1}}],["dns解析",{"2":{"276":1}}],["dynamic",{"2":{"301":1,"350":1,"728":1}}],["d1",{"2":{"298":1}}],["d1sd2asf43d5",{"2":{"154":2,"903":2}}],["dvd",{"2":{"251":1}}],["driver",{"2":{"1088":1,"1089":1,"1114":1,"1217":3,"1218":1}}],["drink",{"2":{"251":1}}],["drwx",{"2":{"1064":1}}],["drwxrwxrwt",{"2":{"1064":1}}],["drwxr",{"2":{"1064":6}}],["dr",{"2":{"1064":2}}],["drawimage",{"2":{"290":1,"497":1}}],["dragon",{"2":{"251":2}}],["dress",{"2":{"251":1}}],["dromedary",{"2":{"251":1}}],["droplet",{"2":{"251":1}}],["drops",{"2":{"251":1}}],["drop",{"0":{"76":1},"2":{"73":2,"76":2}}],["dll静态库",{"2":{"191":1}}],["dll",{"2":{"184":4}}],["ds",{"2":{"848":1,"1071":1,"1183":1}}],["ds2",{"2":{"140":1,"889":1}}],["dst",{"2":{"26":3}}],["d字符",{"2":{"140":1,"889":1}}],["daemon",{"2":{"1006":1,"1034":1,"1039":3,"1045":1,"1051":1,"1066":1,"1070":1,"1073":1,"1083":2,"1208":3,"1209":1}}],["dav",{"2":{"708":1,"718":2}}],["dangling",{"2":{"1002":1}}],["dangling=true|false",{"2":{"998":1}}],["danger",{"2":{"850":1}}],["dango",{"2":{"251":1}}],["dancers",{"2":{"251":1}}],["dancer",{"2":{"251":1}}],["dart",{"2":{"251":1}}],["dashboard",{"0":{"1219":1},"1":{"1220":1,"1221":1}}],["dash",{"2":{"251":2}}],["dayjs",{"2":{"1074":4}}],["days",{"2":{"83":3,"726":2,"1178":2}}],["day",{"2":{"83":1,"152":10,"660":2,"901":10,"1103":9,"1107":2,"1108":1,"1139":1}}],["dayname",{"2":{"83":2}}],["dayofyear",{"2":{"83":1}}],["dayofmonth",{"2":{"83":1}}],["dayofweek",{"2":{"83":1}}],["datadir",{"2":{"1212":1}}],["data文件进行获取的中间件",{"2":{"699":1}}],["data等数据",{"2":{"613":1}}],["dataview",{"0":{"486":1},"1":{"487":1,"488":1,"489":1},"2":{"479":1,"486":1,"487":1}}],["databaseconfiguration>",{"2":{"631":1}}],["databaseconfiguration",{"2":{"631":3,"632":1,"669":1}}],["database",{"2":{"72":2,"73":2,"83":1}}],["databases",{"2":{"72":1}}],["data",{"2":{"61":1,"63":1,"201":1,"236":1,"239":1,"245":1,"309":1,"337":1,"354":6,"368":1,"404":2,"497":1,"520":1,"539":1,"651":2,"652":1,"655":2,"671":1,"701":1,"727":1,"751":1,"765":1,"769":1,"771":2,"772":5,"773":2,"868":3,"929":1,"934":1,"936":1,"941":1,"943":1,"953":1,"954":9,"1004":1,"1022":1,"1063":1,"1064":2,"1090":4,"1094":1,"1095":2,"1132":1,"1171":2,"1172":2,"1173":1,"1218":2}}],["datetime",{"2":{"62":1,"75":1,"83":1}}],["date方法",{"0":{"60":1}}],["date",{"2":{"40":7,"41":2,"43":1,"44":1,"54":3,"57":3,"60":7,"62":2,"64":5,"83":37,"190":3,"230":2,"251":1,"319":1,"342":1,"343":1,"347":1,"354":1,"453":1,"499":1,"546":7,"547":2,"549":1,"550":1,"573":1,"634":3,"639":1,"702":2,"723":1,"1034":2,"1063":1,"1074":1,"1179":3}}],["date正好相反",{"2":{"40":1,"546":1}}],["d=",{"2":{"61":1}}],["dd",{"2":{"57":1,"60":2,"145":1,"190":1,"894":1,"1074":1}}],["d+$",{"2":{"718":1}}],["d+",{"2":{"40":2,"60":1,"141":2,"148":2,"149":2,"150":1,"154":5,"546":2,"770":2,"890":2,"897":2,"898":2,"899":1,"903":5}}],["don",{"2":{"1014":1,"1227":1}}],["done",{"2":{"64":3,"154":5,"496":2,"504":1,"512":2,"800":1,"860":1,"864":1,"868":4,"903":5}}],["dowatch",{"2":{"944":2,"945":2}}],["down>",{"2":{"1090":2}}],["downloads",{"2":{"1209":1}}],["downloadsfolder",{"2":{"878":1}}],["downloaded",{"2":{"521":3,"1039":1,"1047":1,"1082":1}}],["download",{"2":{"344":1,"350":2,"521":2,"718":1,"1208":1}}],["downwards",{"2":{"251":1}}],["down",{"2":{"157":3,"158":2,"166":1,"251":7,"800":1,"801":1}}],["does",{"2":{"800":1}}],["dotfiles",{"2":{"695":1}}],["dot",{"2":{"251":1}}],["dotall",{"2":{"139":1,"888":1}}],["double",{"2":{"251":2,"830":1}}],["doughnut",{"2":{"251":1}}],["door",{"2":{"251":1}}],["dollar",{"2":{"251":2}}],["dolls",{"2":{"251":1}}],["dolphin",{"2":{"251":1}}],["dogs",{"2":{"611":1}}],["dog2",{"2":{"251":1}}],["dog",{"2":{"251":1}}],["doscrollcallback",{"2":{"247":3}}],["dom测试",{"0":{"864":1}}],["dom结构化",{"2":{"778":1}}],["dom也会更新10次",{"2":{"534":1}}],["dom操作",{"2":{"532":1}}],["dom等相关页面和用户操作",{"2":{"526":1}}],["domdebugger",{"2":{"404":2}}],["dom断点只能在浏览器中调试",{"2":{"404":1}}],["dom断点",{"2":{"404":1}}],["dom型",{"2":{"350":1}}],["domain",{"2":{"347":3,"454":1,"726":6,"1121":2,"1128":1,"1178":14,"1187":3}}],["dom同源",{"2":{"336":1}}],["domstring",{"2":{"117":1}}],["dom",{"2":{"115":4,"119":1,"197":2,"200":6,"201":2,"336":1,"350":1,"532":1,"747":2,"750":6,"751":2,"762":1,"968":1}}],["domparser对象拥有一个parsefromstring的方法",{"2":{"117":1}}],["domparser",{"0":{"115":1},"1":{"116":1,"117":1,"118":1},"2":{"115":1,"116":2,"117":1}}],["docs等等",{"2":{"790":1}}],["docs的场景可能很少见",{"2":{"678":1}}],["docs",{"2":{"223":1,"270":1,"355":1,"427":1,"443":1,"448":3,"462":3,"541":1,"568":1,"663":1,"688":1,"689":1,"693":1,"698":2,"726":1,"779":1,"789":1,"797":2,"800":1,"801":3,"815":1,"1045":1,"1076":4,"1082":2,"1120":1,"1124":1,"1125":1,"1126":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1,"1141":1,"1142":1,"1143":1,"1144":1,"1145":1,"1147":1,"1148":1,"1149":2,"1154":1,"1158":1,"1165":1,"1170":1,"1171":2,"1174":1,"1192":3,"1208":1,"1214":1,"1217":2}}],["docker官方文档",{"2":{"1222":1}}],["docker以及任何其他的网段重复",{"2":{"1212":1}}],["docker镜像加速",{"2":{"1209":1}}],["docker镜像中的每个层都有一个基础文件系统",{"2":{"997":1}}],["docker也会自动帮你安装上containerd",{"2":{"1209":1}}],["docker也支持像",{"2":{"1071":1}}],["docker启动文件",{"2":{"1208":1}}],["dockershim",{"2":{"1207":2}}],["docker执行器的基础镜像",{"2":{"1159":1}}],["docker卷也是其一种对象资源",{"2":{"1112":1}}],["docker数据卷与持久化",{"0":{"1109":1},"1":{"1110":1,"1111":1,"1112":1,"1113":1,"1114":1,"1115":1,"1116":1,"1117":1}}],["docker默认提供了一个dns服务",{"2":{"1091":1}}],["docker默认会存在三种网络",{"2":{"1088":1}}],["docker一个重要概念是容器间的dns服务",{"2":{"1091":1}}],["docker0",{"2":{"1085":3,"1086":1}}],["docker0172",{"2":{"1085":1}}],["docker中网络的概念也是非常重要",{"2":{"1084":1}}],["docker网络原理",{"0":{"1084":1},"1":{"1085":1,"1086":1,"1087":1,"1088":1,"1089":1,"1090":1,"1091":1}}],["dockerd使用",{"2":{"1222":1}}],["dockerd的安装就结束了",{"2":{"1208":1}}],["dockerd容器运行时接口来对接k8s",{"2":{"1208":1}}],["dockerd",{"2":{"1082":2,"1208":17,"1212":1,"1214":1}}],["docker三大组件",{"0":{"1081":1}}],["docker所安装的镜像在本地都是一个个文件",{"2":{"1080":1}}],["docker是一个统一了运行环境和配置问题的虚拟容器技术",{"2":{"1078":1}}],["docker就是将环境和代码统一打包的来解决这些兼容问题",{"2":{"1078":1}}],["docker发布前端静态项目简单demo",{"2":{"1073":1}}],["docker引擎",{"2":{"1069":1}}],["docker引擎将读取当前目录下的所有文件和目录",{"2":{"1068":1}}],["dockeradd",{"2":{"1060":1}}],["dockerrun",{"2":{"1058":1}}],["dockerlabel",{"2":{"1057":1}}],["docker和仓库",{"2":{"1039":1}}],["dockerfrom",{"2":{"1034":2,"1051":1,"1056":1,"1062":1,"1063":1,"1064":1,"1065":2,"1066":1,"1074":1}}],["dockerfile构建arg参数",{"2":{"1069":1}}],["dockerfile中env定义的变量会持久保存在镜像中",{"2":{"1055":1}}],["dockerfile中定义的env类似",{"2":{"1024":1}}],["dockerfile其实就是个普通的文本文件",{"2":{"1051":1}}],["dockerfile可以作为代码一样进行版本控制和分享",{"2":{"1050":1}}],["dockerfile提供了灵活的自定义选项",{"2":{"1050":1}}],["dockerfile的内容可以基于现有的镜像进行扩展和定制化",{"2":{"1049":1}}],["dockerfile是用于定义docker镜像的文件",{"2":{"1049":1}}],["dockerfile便可以完美解决这些问题",{"2":{"1048":1}}],["dockerfile来创建新镜像",{"2":{"1000":1}}],["dockerfilefrom",{"2":{"703":1}}],["dockerfile",{"2":{"665":1,"703":2,"1003":1,"1018":2,"1021":1,"1034":5,"1051":10,"1054":4,"1055":4,"1056":1,"1063":4,"1065":4,"1066":2,"1068":6,"1069":1,"1070":2,"1075":2,"1077":1}}],["docker会对前面相同的步骤进行构建缓存",{"2":{"1067":1}}],["docker会在构建镜像时尽可能地复用之前构建过的镜像层",{"2":{"1028":1}}],["docker会先启动db服务",{"2":{"1023":1}}],["docker提供docker",{"2":{"1016":1}}],["docker还支持docker",{"2":{"1005":1}}],["docker使用unionfs来管理镜像层之间的依赖关系和共享信息",{"2":{"997":1}}],["docker容器层有一个可读写的容器文件系统",{"2":{"997":1}}],["docker架构",{"0":{"993":1,"1080":1}}],["docker基础教程",{"0":{"992":1},"1":{"993":1,"994":1,"995":1,"996":1,"997":1,"998":1,"999":1,"1000":1,"1001":1,"1002":1,"1003":1,"1004":1,"1005":1,"1006":1,"1007":1,"1008":1,"1009":1,"1010":1,"1011":1,"1012":1,"1013":1,"1014":1,"1015":1}}],["dockerignore将构建上下文限制在必要的文件和目录范围内",{"2":{"1068":1}}],["dockerignore",{"0":{"1071":1},"2":{"703":1,"1051":1,"1054":1,"1055":1,"1071":1,"1075":2}}],["docker安装一文",{"2":{"1093":1}}],["docker安装步骤可以参考本人的",{"2":{"1093":1}}],["docker安装与配置",{"0":{"1078":1},"1":{"1079":1,"1080":1,"1081":1,"1082":1,"1083":1},"2":{"1208":1}}],["docker安装",{"0":{"1171":1},"1":{"1172":1,"1173":1,"1174":1,"1175":1,"1176":1,"1177":1,"1178":1,"1179":1},"2":{"218":1}}],["docker",{"0":{"1165":1,"1166":1,"1208":1},"2":{"217":1,"218":1,"703":5,"712":2,"992":2,"993":11,"994":8,"995":1,"996":1,"997":8,"998":3,"999":6,"1000":9,"1001":4,"1002":7,"1003":3,"1004":8,"1005":2,"1006":5,"1007":3,"1009":5,"1010":6,"1011":9,"1012":17,"1013":2,"1014":12,"1016":4,"1017":6,"1018":5,"1019":2,"1024":1,"1038":4,"1039":8,"1042":1,"1045":7,"1046":5,"1047":1,"1051":12,"1054":7,"1055":5,"1057":1,"1059":1,"1061":1,"1062":1,"1063":3,"1064":3,"1065":2,"1066":1,"1068":6,"1069":1,"1070":2,"1073":1,"1076":4,"1077":1,"1080":11,"1081":1,"1082":27,"1083":4,"1085":2,"1086":2,"1087":5,"1088":1,"1089":2,"1090":2,"1091":4,"1093":16,"1094":2,"1095":1,"1110":6,"1111":2,"1113":6,"1114":1,"1115":2,"1116":6,"1117":1,"1119":1,"1121":1,"1129":1,"1153":2,"1154":1,"1156":2,"1157":10,"1158":2,"1159":5,"1160":1,"1165":4,"1166":4,"1171":6,"1172":1,"1174":2,"1179":1,"1194":1,"1207":2,"1208":12,"1209":4,"1223":1}}],["doc",{"2":{"117":1,"1210":2}}],["doctype",{"2":{"110":2,"111":1,"112":1,"222":1,"350":1,"671":1,"712":1}}],["documents",{"2":{"712":2,"718":1}}],["documentbuilder",{"2":{"681":2,"687":1,"688":1}}],["documentorshadow",{"2":{"462":1}}],["documentation=https",{"2":{"1208":1}}],["documentation",{"2":{"426":1,"800":1}}],["documentelement",{"2":{"247":2}}],["document",{"2":{"61":1,"115":1,"117":1,"121":2,"197":2,"198":2,"201":1,"247":2,"338":1,"347":1,"350":1,"352":1,"354":5,"404":6,"462":1,"497":1,"521":1,"534":1,"681":2,"687":4,"688":1,"724":1,"747":2,"748":2,"751":1,"1034":2}}],["do",{"2":{"40":1,"64":1,"251":1,"546":1,"715":1,"800":1,"857":1}}],["d",{"2":{"40":1,"83":6,"137":1,"139":5,"140":3,"141":2,"143":1,"144":5,"145":3,"150":1,"152":5,"153":1,"154":4,"159":2,"164":1,"174":1,"176":1,"177":1,"179":1,"180":2,"181":1,"182":1,"190":1,"517":1,"546":1,"583":10,"658":1,"701":1,"707":1,"708":1,"709":2,"718":2,"728":3,"796":1,"799":1,"801":1,"802":1,"804":1,"814":2,"831":1,"840":1,"844":1,"846":1,"856":1,"858":1,"875":1,"877":1,"880":1,"886":1,"888":5,"889":3,"890":2,"892":1,"893":5,"894":3,"899":1,"901":5,"902":1,"903":4,"938":1,"1002":1,"1004":2,"1029":1,"1034":2,"1038":1,"1051":5,"1055":1,"1094":1,"1153":1,"1171":2,"1172":1,"1173":1,"1205":2,"1209":1,"1210":1}}],["deal",{"2":{"1225":1}}],["deamon",{"2":{"1045":1}}],["de40ad0",{"2":{"1082":1}}],["denied",{"2":{"1046":1}}],["deny",{"2":{"83":1,"350":1,"713":1}}],["debugoptions",{"2":{"934":1}}],["debugging",{"2":{"443":1,"448":3,"736":1}}],["debuggereventextrainfo",{"2":{"934":4,"964":8}}],["debuggeroptions",{"2":{"934":1}}],["debugger选项切换成调试面板",{"2":{"400":1}}],["debugger",{"2":{"400":4,"401":2,"404":2}}],["debugger模式开启debugger",{"2":{"401":1}}],["debugger模式启动",{"2":{"400":1}}],["debugger模式+vscode调试",{"0":{"400":1}}],["debugger模式+chrome调试",{"0":{"399":1}}],["debug",{"0":{"397":1,"444":1},"1":{"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1},"2":{"1121":3,"1209":2}}],["de",{"2":{"251":1}}],["depoly",{"2":{"1125":1,"1139":1}}],["dep这里有了",{"2":{"954":1}}],["dep和watcher进行联系的桥梁",{"2":{"954":1}}],["dep的实现很简单",{"2":{"954":1}}],["dep中收集了所有需要派发更新的回调即",{"2":{"952":1}}],["dep对象",{"2":{"951":1}}],["dep>",{"2":{"951":1}}],["dep通知更新时",{"2":{"942":1}}],["dep通知watch更新",{"2":{"938":1}}],["depids",{"2":{"954":2}}],["depid",{"2":{"941":3}}],["depsmap",{"2":{"959":8,"961":4,"964":9}}],["deps",{"2":{"932":2,"940":2,"951":7,"954":1,"959":2,"961":2,"964":6,"1108":1}}],["dep",{"2":{"932":1,"934":8,"941":1,"951":23,"954":24,"955":14,"956":1,"959":6,"961":4,"964":23}}],["dep也就不会收集到渲染watcher",{"2":{"931":1}}],["dep大家应该都知道在对data进行getter",{"2":{"931":1}}],["deprecated",{"2":{"857":1}}],["depends",{"0":{"1023":1},"2":{"1018":1,"1023":1,"1034":1}}],["dependson中定义当前脚本依赖哪个脚本",{"2":{"818":1}}],["dependson",{"2":{"817":1,"818":1}}],["dependarray",{"2":{"955":1}}],["depend",{"2":{"932":4,"951":2,"954":3,"955":4}}],["dependencies",{"0":{"1140":1},"2":{"621":1,"1074":1,"1103":1,"1108":1,"1140":1,"1184":1}}],["dependency",{"2":{"601":1,"1103":1,"1121":10}}],["department",{"2":{"251":1}}],["deploying",{"2":{"1046":1}}],["deployment",{"2":{"1042":1,"1098":2}}],["deploy后",{"2":{"126":1}}],["deploy",{"2":{"126":1,"797":1,"1098":2,"1102":1,"1103":11,"1107":1,"1108":5,"1119":4,"1121":6,"1124":3,"1125":2,"1142":5,"1190":3,"1214":1}}],["def",{"2":{"954":1,"955":2}}],["defs",{"2":{"728":1}}],["definition",{"2":{"703":1,"1051":1,"1054":1,"1055":1}}],["definereactives",{"2":{"951":1}}],["definereactive",{"2":{"950":2,"951":5,"954":2,"955":2,"956":1}}],["definecomputed",{"2":{"932":2}}],["definecomponent",{"2":{"875":2}}],["defineconfig",{"2":{"878":2,"879":1,"880":2}}],["defineproperty是拦截不到的",{"2":{"958":1}}],["defineproperty的缺陷",{"2":{"955":1}}],["defineproperty的set方法执行了cb",{"2":{"950":1}}],["defineproperty实现了对对象的的拦截",{"2":{"955":1}}],["defineproperty简单的实现了响应式的原理",{"2":{"952":1}}],["defineproperty",{"2":{"229":1,"231":1,"238":3,"932":1,"949":2,"950":3,"951":4,"954":1,"955":3,"965":3}}],["defined说是没定义",{"2":{"588":1}}],["defined",{"2":{"195":2,"587":1,"588":2,"589":2,"745":2,"954":1,"1209":1}}],["deflate",{"2":{"347":1}}],["defaulted",{"2":{"1218":1}}],["defaults",{"2":{"1212":1}}],["defaultformatter",{"2":{"838":4,"840":1}}],["defaultvalue",{"2":{"619":3,"629":1}}],["defaultimage",{"2":{"245":2}}],["default也算是适配器的应用了",{"2":{"206":1,"756":1}}],["default",{"2":{"40":4,"60":1,"83":4,"201":1,"238":4,"245":5,"247":2,"249":1,"350":1,"368":1,"382":1,"546":4,"606":3,"625":1,"669":2,"673":1,"703":1,"709":1,"713":1,"728":3,"751":1,"818":2,"863":1,"873":1,"875":3,"929":1,"930":1,"932":4,"934":1,"936":1,"938":2,"940":1,"941":1,"942":1,"943":1,"954":2,"1034":1,"1051":5,"1054":1,"1082":1,"1085":1,"1121":1,"1132":1,"1136":1,"1209":5,"1212":1,"1217":2}}],["desktop",{"0":{"461":1}}],["desk",{"2":{"251":1}}],["dest>",{"2":{"1059":2,"1060":2}}],["destroy",{"2":{"770":2}}],["destination=",{"2":{"1116":1}}],["destination",{"2":{"512":1}}],["dest",{"2":{"237":6}}],["design",{"2":{"194":1,"227":3,"229":1,"232":1,"744":1,"980":1}}],["desc=",{"2":{"1051":1}}],["describe",{"2":{"858":1,"859":2,"864":1,"866":1,"867":1,"868":1,"874":1,"879":1,"881":2,"882":1}}],["descriptor",{"2":{"230":5,"231":2,"232":3,"949":2}}],["description=cri",{"2":{"1208":2}}],["description",{"2":{"60":1,"62":1,"64":1,"118":1,"190":1,"222":3,"686":3,"778":1,"800":2,"999":1,"1102":1,"1103":2,"1107":1,"1121":4,"1157":3,"1158":1,"1183":1,"1184":2,"1187":1,"1191":1,"1230":1}}],["desc",{"2":{"81":3}}],["devmapper",{"2":{"1209":1}}],["devmode",{"2":{"190":2}}],["devops",{"2":{"1103":4,"1107":3,"1108":1,"1157":1}}],["devel",{"2":{"718":2,"728":1}}],["developer",{"2":{"223":1,"280":4,"427":1,"462":3,"568":1}}],["development",{"2":{"182":2,"190":1,"222":1,"237":2,"632":1,"669":3,"703":1,"1074":1}}],["devices",{"2":{"1209":3}}],["device",{"2":{"422":1,"1209":1}}],["dev及prod环境",{"2":{"237":1}}],["devconfig",{"2":{"190":2}}],["devtool",{"0":{"183":1},"2":{"183":3,"190":1}}],["devtools就是干这个的",{"2":{"407":1}}],["devtools连接",{"2":{"399":1}}],["devtools记录了整个请求流程",{"2":{"352":1}}],["devtools",{"2":{"49":1,"427":1,"555":1,"740":1}}],["dev",{"2":{"177":4,"179":1,"182":3,"190":6,"211":1,"237":4,"280":1,"669":1,"703":1,"726":2,"728":1,"761":1,"797":3,"799":1,"813":1,"828":4,"966":1,"1064":1,"1202":1}}],["devserver",{"0":{"177":1},"2":{"177":1,"182":2,"190":1}}],["detectlocalmode",{"2":{"1212":1}}],["detectlocal",{"2":{"1212":1}}],["detected",{"2":{"98":1,"1132":1}}],["detached",{"2":{"1122":1}}],["detail",{"2":{"671":1}}],["details",{"2":{"85":1,"1103":1,"1189":1}}],["demo文件下创建webpack",{"2":{"175":1}}],["demo",{"2":{"72":1,"73":2,"173":2,"859":1,"860":1,"863":1,"864":2,"866":1,"867":1,"869":1,"874":1,"875":1,"1051":3,"1115":2,"1142":1}}],["deletion",{"2":{"1209":1}}],["deleteinterval",{"2":{"661":1}}],["deletecronjob",{"2":{"661":1}}],["deletecontents",{"2":{"462":1}}],["deleteone",{"2":{"645":1}}],["delete等方法",{"2":{"322":1}}],["delete",{"0":{"79":1},"2":{"7":1,"8":1,"79":2,"320":2,"339":1,"612":1,"645":1,"692":2,"724":1,"964":1,"965":1}}],["delegate=yes",{"2":{"1208":1}}],["delimiters",{"2":{"954":2}}],["delay",{"2":{"771":2,"1209":2}}],["delayed",{"2":{"382":1,"1131":2,"1132":1}}],["delnouse",{"2":{"54":1}}],["declaration",{"2":{"588":1}}],["declared",{"2":{"588":1}}],["deciduous",{"2":{"251":1}}],["decoration",{"2":{"251":1}}],["decorative",{"2":{"251":1}}],["decorator",{"2":{"233":1,"619":1,"648":2,"665":1}}],["decorators",{"2":{"190":1}}],["decoder",{"2":{"237":2,"491":7,"1209":4}}],["decode",{"2":{"83":2,"431":1,"491":5,"1014":1}}],["decryption",{"2":{"1209":3}}],["decrypt",{"2":{"83":2}}],["dec",{"2":{"40":1,"44":1,"546":1,"550":1,"1064":6}}],["deep时深度遍历",{"2":{"944":1}}],["deep选项主要用来深层监听某个属性",{"2":{"941":1}}],["deep",{"0":{"941":1},"2":{"34":1,"938":1,"941":2,"944":2,"945":1}}],["deepcopy",{"2":{"33":3}}],["duncan",{"2":{"32":2}}],["dial",{"2":{"1039":1}}],["diamond",{"2":{"251":5}}],["diamonds",{"2":{"251":1}}],["digest",{"2":{"1039":2,"1046":1,"1047":1,"1082":1}}],["di",{"2":{"601":1}}],["die",{"2":{"251":1,"994":1}}],["dizzy",{"2":{"251":2}}],["dir9999",{"2":{"1061":1}}],["dir3",{"2":{"1061":1}}],["dir2",{"2":{"1061":1}}],["dir1",{"2":{"1061":2}}],["dir不需要指定上下文等等",{"2":{"1021":1}}],["dirtry为false时",{"2":{"932":1}}],["dirty的值改为false",{"2":{"934":1}}],["dirty变成false",{"2":{"934":1}}],["dirty为true",{"2":{"934":1}}],["dirty为true时执行",{"2":{"932":1}}],["dirty就为false不会执行",{"2":{"934":1}}],["dirty",{"2":{"932":7,"934":9,"938":1,"942":1}}],["direct",{"2":{"1121":1}}],["directly",{"2":{"944":1,"1225":1}}],["directories",{"2":{"857":1,"1107":1}}],["directory",{"2":{"857":1,"1007":1}}],["direction",{"2":{"284":1,"285":1}}],["directive>",{"2":{"350":2}}],["directive",{"2":{"245":1}}],["directivebindingelemtype",{"2":{"243":2,"244":2,"245":2}}],["directivebindingtype",{"2":{"243":1,"245":2,"247":1,"248":1,"249":1}}],["directivebinding",{"2":{"243":3}}],["directives",{"2":{"238":3,"245":1}}],["dir",{"2":{"572":1,"573":1,"1121":4,"1159":1,"1209":7}}],["dirname",{"2":{"62":1,"175":2,"176":1,"186":1,"190":7,"344":1,"520":1,"539":1,"628":1,"671":1,"673":1,"695":3,"697":1,"805":1,"806":1}}],["discovery",{"2":{"1214":3,"1215":1}}],["disconnect",{"2":{"994":1}}],["discard",{"2":{"1209":2}}],["disposable",{"2":{"1121":1}}],["disposition",{"2":{"521":1,"651":1}}],["display的值为inline",{"2":{"104":1}}],["display",{"2":{"16":1,"17":2,"18":1,"19":2,"20":1,"21":1,"111":1,"206":2,"222":2,"350":1,"756":2}}],["disappointed",{"2":{"251":2}}],["disableexcludes=kubernetes",{"2":{"1211":1}}],["disabled",{"2":{"728":2,"1082":1,"1202":1,"1209":1}}],["disable",{"2":{"134":1,"717":2,"1098":1,"1159":3,"1201":1,"1209":6}}],["disk",{"2":{"168":1,"251":1}}],["dist产物复制到第二阶段的nginx静态目录",{"2":{"1070":1}}],["dist",{"0":{"184":1},"2":{"97":1,"132":1,"175":1,"181":1,"184":2,"186":1,"190":3,"237":5,"703":1,"818":1,"848":1,"1070":1,"1071":1,"1073":1,"1108":2,"1138":1,"1139":1}}],["diffie",{"0":{"333":1}}],["diff",{"2":{"83":1,"805":1,"1122":2,"1209":1}}],["division",{"2":{"251":1}}],["div2",{"2":{"17":2}}],["div1",{"2":{"17":1}}],["div>`",{"2":{"239":1}}],["div>child",{"2":{"207":2,"757":2}}],["div>",{"2":{"12":2,"13":2,"14":2,"15":2,"16":2,"17":5,"18":1,"19":2,"20":2,"21":2,"22":2,"110":3,"111":3,"112":3,"207":12,"239":1,"404":1,"757":12,"929":8,"930":6}}],["div",{"2":{"12":2,"13":2,"14":2,"15":2,"16":2,"17":5,"18":1,"19":2,"20":2,"21":2,"22":2,"110":3,"111":3,"112":3,"207":4,"249":1,"404":2,"534":1,"757":4,"954":1}}],["为方便大家阅读",{"2":{"1223":1}}],["为方便测试descript",{"2":{"439":1}}],["为其构建项目的分支或标签名称",{"2":{"1121":1}}],["为你的本地应用程序做持久化服务",{"2":{"1109":1}}],["为容器指定一个名称",{"2":{"1004":1}}],["为function",{"2":{"945":1}}],["为字符串",{"2":{"937":1}}],["为对象",{"2":{"937":1}}],["为对象动态加入的行为",{"2":{"199":1,"749":1}}],["为true",{"2":{"934":1,"938":1}}],["为解析器服务",{"2":{"829":1}}],["为解决这个问题",{"2":{"588":1}}],["为前端技术的快速发展和应用提供了有力支持",{"2":{"784":1}}],["为单位获得",{"2":{"717":1}}],["为javascript解析和执行提供环境条件",{"2":{"525":1}}],["为它提供不同平台的运行时环境",{"2":{"525":1}}],["为啥需要2msl",{"2":{"382":1}}],["为1460",{"2":{"376":1}}],["为1520",{"2":{"369":1}}],["为",{"2":{"342":1,"571":1,"718":1,"729":2,"932":1,"1121":4}}],["为网络设计和实现提供了重要的参考模型",{"2":{"309":1}}],["为此作业的环境指定的操作注释",{"2":{"1121":1}}],["为此",{"2":{"309":1}}],["为此我们安装一下以下依赖",{"2":{"180":1}}],["为什么出现docker",{"2":{"1078":1}}],["为什么说它出色",{"2":{"601":1}}],["为什么这里会报错",{"2":{"588":1}}],["为什么呢",{"2":{"539":1,"573":1,"577":1,"580":1,"594":1}}],["为什么客户端挥手后发送了ack包还要等2msl段时间才会进入closed状态",{"2":{"457":1}}],["为什么挥手要四次",{"2":{"457":1}}],["为什么是2msl呢",{"2":{"382":1}}],["为什么实际抓包的结果却是3次就完成了",{"2":{"382":1}}],["为什么需要异步",{"0":{"467":1}}],["为什么需要三次呢",{"2":{"378":1}}],["为什么需要头部压缩",{"2":{"326":1}}],["为什么要创建blob",{"2":{"1097":1}}],["为什么要这么做呢",{"2":{"775":1}}],["为什么要这样设计呢",{"2":{"330":1}}],["为什么要懂计算机网络",{"0":{"313":1}}],["为什么要进行网络层次划分",{"2":{"308":1}}],["为什么要多进程",{"0":{"275":1}}],["为什么它们很重要呢",{"2":{"179":1}}],["为any类型",{"2":{"243":1}}],["为这个本体提供一个替代者",{"2":{"199":1,"749":1}}],["为一个对象提供一个代用品或占位符",{"2":{"198":1,"748":1}}],["为我们提供了参数",{"2":{"184":1}}],["为我们提供了devserver工具",{"2":{"177":1}}],["为右盒子的高度400px",{"2":{"112":1}}],["为了提高",{"2":{"1206":1}}],["为了提高网页的响应速度",{"2":{"133":1}}],["为了保证",{"2":{"1195":1}}],["为了安装的正常进行",{"2":{"1195":1}}],["为了解决这些问题可以使用gitlab",{"2":{"1190":1}}],["为了解决这个问题",{"2":{"955":1}}],["为了方便管理可以对上传的库打上tag",{"2":{"1184":1}}],["为了方便演示这里从头讲起",{"2":{"1182":1}}],["为了方便演示",{"2":{"728":1}}],["为了不让变量提升影响到",{"2":{"589":1}}],["为了不让其他本地请求影响到我们分析抓包",{"2":{"438":1}}],["为了加深大家的印象",{"2":{"532":1}}],["为了避免这种情况",{"2":{"715":1}}],["为了避免其它数据造成的干扰",{"2":{"453":1}}],["为了避免将一个数据报分片和其他数据",{"2":{"367":1}}],["为了避免每次通信都要进行这种转换",{"2":{"298":1}}],["为了兼容旧的http协议通常先使用http请求通过connect和upgrade头进行协议升级为websocket",{"2":{"354":1}}],["为了实现http报文加密传输",{"2":{"329":1}}],["为了实现上面的效果先来做些准备工作",{"2":{"12":1}}],["为了防止后续开发可以删除本地",{"2":{"1190":1}}],["为了防止这些攻击",{"2":{"320":1}}],["为了防止arp泛洪攻击",{"2":{"304":1}}],["为了防范arp攻击",{"2":{"305":1}}],["为了便于管理图片的各个状态",{"2":{"242":1}}],["为了推销产品",{"2":{"204":1,"754":1}}],["为了达到特定的布局效果",{"2":{"113":1}}],["为了修正这个问题",{"2":{"12":1}}],["为可选参数",{"2":{"7":1}}],["wmwd8",{"2":{"1217":1}}],["wntp",{"2":{"1204":1}}],["w表示在当前根路径安装",{"2":{"814":1}}],["w=xx",{"2":{"718":1}}],["w=1",{"2":{"718":1}}],["w=400",{"2":{"350":1}}],["w参数",{"2":{"718":1}}],["wget",{"2":{"718":1,"1208":1}}],["wl",{"2":{"708":2,"718":4}}],["wc",{"2":{"251":1,"728":2}}],["woker节点",{"2":{"1196":1}}],["would",{"2":{"857":2}}],["woff",{"2":{"848":1}}],["woff2|gz|robots",{"2":{"696":1}}],["wolf",{"2":{"251":1}}],["womans",{"2":{"251":2}}],["woman",{"2":{"251":3}}],["womens",{"2":{"251":1}}],["women",{"2":{"251":1}}],["worried",{"2":{"251":1}}],["work节点加入集群",{"0":{"1215":1}}],["workload",{"2":{"1209":2}}],["workflow",{"0":{"1137":1},"2":{"1137":2}}],["work相对于",{"2":{"1059":1}}],["workspace",{"2":{"814":2,"815":1,"818":1}}],["workspaces",{"2":{"813":1,"814":1}}],["workspacefolder",{"2":{"401":1,"404":1,"405":1,"406":2,"966":1}}],["workdir",{"0":{"1056":1},"2":{"703":2,"1034":1,"1051":2,"1056":5,"1059":1,"1065":1,"1070":1,"1073":1,"1074":1}}],["workbox",{"2":{"223":1}}],["work",{"2":{"202":3,"752":3,"1059":1}}],["worker线程",{"2":{"773":1}}],["worker",{"2":{"168":1,"202":1,"222":2,"251":1,"508":1,"709":4,"752":1,"773":8,"1214":1}}],["word3",{"2":{"140":2,"889":2}}],["world镜像时需要先从远程仓库下载镜像到本地",{"2":{"1082":1}}],["world镜像",{"2":{"1082":1}}],["world",{"2":{"138":1,"342":1,"404":1,"622":1,"887":1,"1082":4}}],["w字符",{"2":{"140":1,"889":1}}],["wrr",{"2":{"1206":1}}],["wrench",{"2":{"251":1}}],["wriable",{"2":{"231":1}}],["writablecomputedoptions",{"2":{"934":1}}],["writablestreamdefaultwriter",{"2":{"516":1}}],["writablestreamdefaultcontroller",{"2":{"514":1}}],["writablestream构造函数返回一个可写流实例",{"2":{"514":1}}],["writablestream",{"0":{"513":1},"1":{"514":1,"515":1,"516":1},"2":{"512":1,"513":1,"514":2,"515":1,"516":1,"517":1,"521":1}}],["writable",{"2":{"512":2,"828":1,"949":1}}],["writechunkstofile",{"2":{"770":2}}],["writehead",{"2":{"520":2}}],["writestream",{"2":{"516":2}}],["write方法",{"2":{"516":1}}],["writer",{"2":{"514":2,"515":1,"516":3,"517":2,"521":2,"769":3,"770":6}}],["write",{"2":{"141":1,"343":1,"514":2,"516":2,"517":2,"521":1,"726":3,"769":1,"800":1,"890":1,"1178":3}}],["writing",{"0":{"17":1},"2":{"11":1,"17":3,"22":1,"703":1,"1051":1,"1054":1,"1055":1}}],["wrapped",{"2":{"801":1}}],["wrapper",{"2":{"206":1,"534":3,"535":2,"756":1,"875":2}}],["wrap",{"2":{"110":2}}],["whattype",{"2":{"874":3}}],["what",{"2":{"473":1,"800":1}}],["whale2",{"2":{"251":1}}],["whale",{"2":{"251":1}}],["which",{"2":{"857":3}}],["whitespace",{"2":{"836":2}}],["whitelist",{"2":{"643":2,"646":1}}],["white",{"2":{"251":6,"800":1}}],["while",{"2":{"98":2,"485":1,"496":1,"497":1,"512":1,"768":1,"857":1,"932":1,"934":1,"940":1,"941":2}}],["whether",{"2":{"857":1}}],["wheelchair",{"2":{"251":1}}],["wheel",{"2":{"251":1}}],["when",{"0":{"1131":1},"2":{"83":17,"857":1,"1131":1,"1132":3,"1136":4,"1137":3}}],["where",{"2":{"78":2,"79":1,"80":1,"83":1,"85":1,"857":1,"1174":1}}],["w",{"2":{"83":1,"139":8,"140":5,"145":9,"150":1,"153":1,"156":1,"162":1,"163":2,"342":1,"347":1,"453":1,"718":2,"723":1,"813":4,"814":1,"888":8,"889":5,"894":9,"899":1,"902":1}}],["weakmap",{"2":{"959":1,"964":1}}],["weary",{"2":{"251":1}}],["weex",{"2":{"464":1}}],["week",{"2":{"83":1,"660":1}}],["weibo",{"2":{"1230":1}}],["weight=1",{"2":{"725":1}}],["wei",{"2":{"190":1}}],["webhook",{"2":{"1121":2,"1212":3}}],["webide",{"2":{"1121":1}}],["webassembly完全入门",{"2":{"980":1}}],["webassembly中文网",{"2":{"980":1}}],["webassembly官网",{"2":{"980":1}}],["webassembly是一种运行在现代网络浏览器中的新型代码",{"2":{"977":1}}],["webassembly",{"0":{"977":1},"1":{"978":1,"979":1,"980":1},"2":{"977":4,"980":4}}],["web界面会显示每个步骤的形态",{"2":{"877":1}}],["webbench",{"2":{"739":1}}],["webworker线程",{"2":{"526":1}}],["webwoker",{"2":{"507":1,"773":1}}],["webview",{"2":{"464":1}}],["webroot",{"2":{"404":1,"405":1,"406":1,"966":1}}],["webstorm如果喜欢也是可以",{"2":{"785":1}}],["webstorm",{"2":{"785":1}}],["websocketgateway",{"2":{"702":2}}],["websocketgateway装饰的类就拥有了websocket能力",{"2":{"702":1}}],["websocket是一种全新的协议",{"2":{"354":1}}],["websocket",{"0":{"354":1,"702":1},"2":{"354":17,"702":1,"723":1}}],["websocketserver",{"2":{"354":2,"702":2}}],["websockets",{"2":{"350":1,"702":1}}],["website",{"2":{"350":4,"353":2}}],["web内容安全策略",{"2":{"350":1}}],["webp",{"2":{"347":1,"718":2,"778":1}}],["webpagetest",{"0":{"221":1},"2":{"221":1}}],["webpacl",{"2":{"176":1}}],["webpack自定义插件",{"0":{"990":1}}],["webpack自定义loader",{"0":{"988":1}}],["webpack结合nodejs使用",{"0":{"989":1}}],["webpack原理分析",{"0":{"982":1},"1":{"983":1,"984":1,"985":1,"986":1,"987":1}}],["webpack基本使用",{"0":{"981":1}}],["webpack的配置复杂",{"2":{"784":1}}],["webpack支持热更新插件",{"2":{"190":1}}],["webpack公共配置",{"2":{"190":1}}],["webpack4",{"2":{"173":1,"175":1,"177":1}}],["webpackprefetch",{"2":{"131":1}}],["webpack",{"0":{"171":1,"172":1,"176":1,"190":1},"2":{"130":1,"132":1,"171":2,"172":1,"173":2,"174":4,"175":5,"176":9,"177":6,"179":1,"180":1,"181":1,"182":5,"183":1,"184":10,"185":1,"186":1,"187":1,"188":1,"189":1,"190":28,"237":1,"281":1,"406":1,"697":2,"784":2}}],["web平台",{"2":{"237":1}}],["web",{"2":{"168":1,"214":3,"221":1,"222":5,"237":10,"238":3,"280":1,"315":1,"336":1,"350":1,"355":1,"462":3,"502":1,"568":1,"601":1,"662":1,"664":1,"665":2,"703":1,"762":1,"773":2,"876":1,"954":2,"1013":1,"1018":5,"1020":1,"1023":2,"1024":4,"1025":2,"1121":4,"1142":1,"1173":1}}],["web缓存策略",{"0":{"167":1},"1":{"168":1,"169":1},"2":{"132":1,"335":1}}],["wedding",{"2":{"251":1}}],["wed",{"2":{"41":1,"547":1,"720":1}}],["wss",{"2":{"354":3}}],["ws",{"2":{"83":1,"354":7,"702":1}}],["wsmloading",{"2":{"54":1}}],["wai",{"2":{"779":1}}],["wait2状态",{"2":{"457":1}}],["wait1状态",{"2":{"457":1}}],["wait期间其端口还是不能被使用",{"2":{"382":1}}],["wait状态",{"2":{"382":2,"383":1,"457":2}}],["wait",{"2":{"382":4,"383":1}}],["waitunit",{"2":{"222":2}}],["wall",{"2":{"708":1,"718":2}}],["walk",{"2":{"587":4,"951":2,"954":2,"955":2}}],["walking",{"2":{"251":1,"1209":1}}],["wantedby=sockets",{"2":{"1208":1}}],["wantedby=multi",{"2":{"1208":1}}],["want",{"2":{"857":1}}],["wants=network",{"2":{"1208":1}}],["wants",{"2":{"707":1}}],["waning",{"2":{"251":2}}],["wavy",{"2":{"251":1}}],["wave",{"2":{"251":1}}],["way",{"2":{"251":1,"355":1}}],["waxing",{"2":{"251":2}}],["watermelon",{"2":{"251":1}}],["water",{"2":{"251":3}}],["watchcallback",{"2":{"944":1,"945":1}}],["watchcount",{"2":{"936":2,"937":1,"943":2}}],["watchsynceffect都和这个一样",{"2":{"945":1}}],["watchstophandle",{"2":{"944":2,"945":2}}],["watchsource",{"2":{"944":3,"945":2}}],["watch的实现没有讲我们放在",{"2":{"956":1}}],["watch的实现原理",{"2":{"927":1}}],["watch的侦听函数中不能再对所侦听的对象进行值的修改",{"2":{"943":1}}],["watch会返回一个函数",{"2":{"940":1}}],["watch可以主动进行监听的卸载",{"2":{"940":1}}],["watcheffect本质还是watch",{"2":{"945":1}}],["watcheffect",{"0":{"945":1},"2":{"944":2,"945":5}}],["watcheer",{"2":{"938":1}}],["watcher更新时会触发",{"2":{"954":1}}],["watcher实现后面看",{"2":{"954":1}}],["watcher实现了发布订阅模型",{"2":{"952":1}}],["watcher再次执行render更新页面",{"2":{"953":1}}],["watcher等方法完成",{"2":{"954":1}}],["watcher等方法与对象",{"2":{"954":1}}],["watcher等处理逻辑",{"2":{"953":1}}],["watcher等函数和对象",{"2":{"951":1}}],["watcher会再次执行当前函数",{"2":{"954":1}}],["watcher会添加当前的dep",{"2":{"954":1}}],["watcher会进行页面的重新渲染",{"2":{"952":1}}],["watcher会被push到异步更新队列中去",{"2":{"942":1}}],["watcher>",{"2":{"951":1,"954":1}}],["watcher中包含了被dep收集的所有dep",{"2":{"951":1}}],["watcher的cb",{"2":{"942":1}}],["watcher的回调函数执行",{"2":{"941":1}}],["watcher的收集",{"2":{"940":1}}],["watcher所有被收集的dep",{"2":{"940":1}}],["watcher就会执行update方法",{"2":{"938":1}}],["watcher进行更新",{"2":{"938":1,"941":1}}],["watcher执行",{"2":{"935":1}}],["watchers",{"2":{"932":3,"954":1}}],["watcher也只会是计算watcher的get函数",{"2":{"931":1}}],["watcher也就会执行对应的表达式进行更新",{"2":{"931":1}}],["watcher这个属性值和watcher产生关系也就是依赖收集",{"2":{"931":1}}],["watcher不会收集watcher",{"2":{"931":1}}],["watcher主要用来执行对应的表达式",{"2":{"931":1}}],["watcher",{"2":{"931":3,"932":15,"935":1,"938":11,"939":3,"940":5,"941":4,"942":1,"944":2,"951":11,"952":1,"954":9}}],["watch属性值为数组的情况",{"2":{"937":1}}],["watch很简单",{"2":{"937":1}}],["watch通常用来监听响应式对象",{"2":{"935":1}}],["watch是对响应式的扩展",{"2":{"927":1}}],["watch是webpack自带的属性",{"2":{"188":1}}],["watchoptionsbase",{"2":{"945":1}}],["watchoptions",{"2":{"188":1,"190":1,"944":2,"945":1}}],["watch",{"0":{"188":1},"2":{"49":1,"188":1,"190":1,"251":1,"541":1,"555":1,"568":1,"673":1,"703":1,"936":1,"937":7,"938":1,"943":1,"944":2,"945":3,"1074":1}}],["warnings",{"2":{"797":2}}],["warning",{"2":{"251":1,"319":1,"526":1,"1010":1,"1045":2,"1100":1,"1106":1,"1181":1}}],["warn",{"2":{"237":2,"238":2,"244":1,"830":2,"1103":2,"1107":2,"1184":2,"1191":2}}],["wastracked",{"2":{"964":1}}],["was",{"2":{"97":1,"1103":1}}],["wade",{"2":{"28":3,"29":1,"30":1}}],["www",{"2":{"49":1,"118":1,"193":1,"218":2,"229":1,"316":2,"337":1,"350":4,"412":1,"421":1,"423":1,"426":1,"541":1,"555":1,"568":1,"688":1,"1147":1}}],["w+",{"2":{"43":1,"138":1,"152":1,"232":1,"549":1,"576":1,"887":1,"901":1}}],["wifi",{"2":{"452":1,"453":1}}],["wireshark提供了过滤器来帮助过滤掉不必要的数据或只显示我们想要的数据",{"2":{"453":1}}],["wireshark支持windows",{"2":{"450":1}}],["wireshark已经是个免费软件",{"2":{"450":1}}],["wireshark可以用来检测网络环境",{"2":{"449":1}}],["wireshark网络抓包",{"0":{"449":1},"1":{"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1},"2":{"376":1}}],["wireshark抓包",{"2":{"332":1,"343":1}}],["wi",{"2":{"310":1}}],["will",{"2":{"280":1,"621":1,"801":1,"857":3,"1045":1,"1051":1,"1098":1,"1225":1}}],["without",{"2":{"1209":3}}],["with",{"2":{"237":2,"238":3,"251":28,"333":1,"708":27,"718":55,"945":1,"954":1,"1014":1,"1214":1,"1225":1}}],["withlog",{"2":{"199":3,"749":3}}],["winconfig",{"2":{"431":1}}],["wine",{"2":{"251":1}}],["wings",{"2":{"251":1}}],["wind",{"2":{"251":1}}],["windows基本一样",{"2":{"412":1}}],["windows",{"2":{"93":1,"785":1,"1129":1,"1164":1}}],["window",{"2":{"7":2,"8":1,"222":1,"247":2,"376":1,"387":1,"462":1,"828":1}}],["winkernel",{"2":{"1212":1}}],["winking",{"2":{"251":1}}],["wink",{"2":{"251":1}}],["win7system",{"2":{"85":1}}],["width=device",{"2":{"222":1,"671":1}}],["width=",{"2":{"61":1,"245":1,"350":1}}],["width",{"2":{"12":2,"17":1,"61":1,"111":3,"112":3,"222":1,"283":3,"462":3,"520":1,"671":1,"718":6,"850":1}}],["wp",{"2":{"12":3,"13":2,"14":2,"15":2,"16":2,"17":4,"18":2,"19":2,"20":2,"21":2,"708":1,"718":2}}],["mv",{"2":{"1209":1}}],["mvc",{"2":{"698":1}}],["mkdir",{"2":{"1061":1,"1152":1,"1172":1,"1183":1,"1208":2,"1214":1}}],["m1下也有感",{"2":{"786":1}}],["mb",{"2":{"712":1,"1208":1}}],["mtu的值为1500字节",{"2":{"386":1}}],["mtu值一般为1500",{"2":{"386":1}}],["mtu",{"2":{"369":1,"386":1,"728":3,"1085":1,"1090":4}}],["mr",{"2":{"190":1,"230":1,"232":1}}],["meet",{"2":{"1223":1}}],["mem",{"2":{"1203":1}}],["memo",{"2":{"251":1}}],["memoryswap",{"2":{"1212":1}}],["memory",{"2":{"168":1,"568":1,"703":1,"1074":1,"1082":1}}],["mechanism",{"2":{"1098":1}}],["me可以匹配path",{"2":{"711":1}}],["me",{"2":{"354":1,"711":3,"1000":1}}],["media",{"2":{"317":1,"654":1}}],["meaning",{"2":{"800":1}}],["measuretext",{"2":{"284":1}}],["meat",{"2":{"251":1}}],["melon",{"2":{"251":1}}],["mega",{"2":{"251":1}}],["meridians",{"2":{"251":1}}],["merged",{"2":{"772":2,"1122":1}}],["mergepath",{"2":{"770":4}}],["mergechunk",{"2":{"770":1}}],["mergeoptions",{"2":{"239":2}}],["merge用来帮助我们合并webpack配置",{"2":{"190":1}}],["merge",{"0":{"190":1},"2":{"190":8,"770":2,"772":1,"797":1,"1121":2,"1122":24,"1136":3}}],["mens",{"2":{"251":1}}],["men",{"2":{"251":1}}],["messages",{"2":{"801":1,"857":1}}],["messagebody",{"2":{"702":2}}],["message",{"2":{"201":3,"244":1,"332":2,"343":1,"354":2,"404":1,"637":1,"639":4,"640":1,"646":1,"702":1,"751":3,"770":1,"1121":2,"1209":2}}],["metricsbindaddress",{"2":{"1212":1}}],["metrics",{"2":{"1209":1}}],["metro",{"2":{"251":1}}],["metal",{"2":{"251":1}}],["metavalidate",{"2":{"232":3}}],["metadata的帮助",{"2":{"227":1}}],["metadata",{"0":{"227":1},"2":{"227":1,"229":1,"645":1,"703":1,"1051":1,"1054":1,"1055":1,"1209":1,"1217":2}}],["metadata库通常在装饰器中都会使用",{"2":{"226":1}}],["meta",{"2":{"110":2,"111":1,"112":1,"222":9,"671":2,"724":1}}],["methodkey",{"2":{"688":2}}],["method等几种方式绑定",{"2":{"652":1}}],["method都使用",{"2":{"643":1}}],["method以及param的位置使用",{"2":{"636":1,"640":1}}],["method=",{"2":{"352":1}}],["methoddecorator",{"2":{"230":1,"615":1,"616":1,"617":1}}],["methodstopatch",{"2":{"955":4}}],["methods",{"2":{"63":1,"236":1,"239":1,"339":1,"692":2,"724":1,"936":1,"943":1,"1034":1}}],["method",{"2":{"40":6,"232":1,"233":5,"238":1,"320":1,"337":1,"339":1,"344":1,"546":6,"583":1,"621":2,"634":3,"635":2,"640":1,"643":2,"687":3,"692":1,"724":1,"729":1,"765":1,"769":1,"771":1,"772":1,"955":8,"1034":2}}],["methodnames",{"2":{"40":6,"546":6}}],["multer",{"2":{"701":2,"765":1,"769":1}}],["multi",{"2":{"707":1}}],["multicast",{"2":{"359":1,"728":3,"1085":1,"1090":2}}],["multipart",{"2":{"337":1,"765":1}}],["multiplexing",{"2":{"324":1}}],["multiplication",{"2":{"251":1}}],["multipurpose",{"2":{"319":1}}],["multip回调函数",{"2":{"195":1,"745":1}}],["multip",{"2":{"195":5,"745":5}}],["multiline",{"2":{"152":3,"901":3}}],["mutation",{"2":{"1209":1}}],["mutationobserve",{"2":{"532":1}}],["mutator",{"2":{"955":1}}],["mutablecollectionhandlers",{"2":{"964":1}}],["mutablehandlers",{"2":{"964":1}}],["mutable",{"2":{"920":1}}],["muted",{"2":{"520":1}}],["mute",{"2":{"251":1}}],["mushroom",{"2":{"251":1}}],["muscle",{"2":{"251":1}}],["musical",{"2":{"251":3}}],["music",{"2":{"54":3,"62":1,"66":1}}],["mustuseprop",{"2":{"238":2}}],["must",{"2":{"40":1,"546":1,"645":1,"646":1,"720":2,"797":1}}],["mg",{"2":{"138":1,"887":1}}],["msl默认值通常为30",{"2":{"382":1}}],["msl的时间通常大于ttl的跳数时间",{"2":{"382":1}}],["msl",{"2":{"382":1}}],["mss等有用的信息",{"2":{"378":1}}],["mss",{"2":{"376":1,"393":1}}],["ms",{"2":{"188":1,"190":1,"230":1,"860":1,"864":1,"874":1,"875":1,"1063":4,"1064":6,"1090":6,"1218":5}}],["msie",{"2":{"134":1,"717":1}}],["msg中写入以下内容",{"2":{"806":1}}],["msg",{"2":{"62":1,"197":3,"237":3,"354":6,"614":1,"716":1,"747":3,"806":1}}],["mp4",{"2":{"520":3,"708":1,"718":2,"848":1}}],["mpa",{"2":{"125":2,"126":1}}],["mp3",{"2":{"62":2,"848":1}}],["milestone",{"2":{"1122":1}}],["milky",{"2":{"251":1}}],["mit",{"2":{"814":1}}],["misc",{"2":{"718":1}}],["missing",{"2":{"588":1,"800":2,"1209":1}}],["mirantis",{"2":{"1208":3}}],["mircotask执行完后macrotask",{"2":{"532":1}}],["mirco",{"2":{"531":1,"532":2}}],["mirrors",{"2":{"97":2,"1039":2,"1045":2,"1082":1,"1083":2,"1093":1,"1209":3,"1210":3}}],["mirror",{"2":{"97":4,"1083":3,"1209":1}}],["mime中无对应类型",{"2":{"709":1}}],["mime",{"2":{"319":1,"350":1,"709":1,"717":1}}],["mime嗅探",{"2":{"276":1}}],["mimetype",{"2":{"117":3,"765":1}}],["micro",{"0":{"599":1}}],["microtasks",{"2":{"541":1}}],["microsoft",{"2":{"400":1,"819":1,"1013":1}}],["microscope",{"2":{"251":1}}],["microphone",{"2":{"251":1}}],["mind",{"2":{"1227":1}}],["minsyncperiod",{"2":{"1212":2}}],["minsize",{"2":{"130":1,"187":2,"190":2}}],["minor",{"2":{"814":1,"1121":2}}],["minratio",{"2":{"697":1}}],["minus",{"2":{"251":1,"1183":2}}],["minutes",{"2":{"660":1,"1108":1}}],["minute",{"2":{"83":2}}],["min|prod",{"2":{"237":1}}],["ming",{"2":{"230":1,"232":1}}],["minlength",{"2":{"197":2,"747":2}}],["minikube",{"2":{"1194":1}}],["minibus",{"2":{"251":1}}],["minidisc",{"2":{"251":1}}],["minimum",{"2":{"1082":1}}],["minimal",{"2":{"222":2}}],["minimizer",{"2":{"187":1,"190":1}}],["minicssextractplugin",{"2":{"190":3}}],["minify",{"2":{"176":1,"190":2}}],["minchunks",{"2":{"130":1,"187":2,"190":2}}],["min",{"2":{"83":1,"130":1,"134":1,"410":1,"520":2,"717":2,"773":1,"1063":1,"1064":2,"1212":1}}],["middlewareconsumer",{"2":{"635":1}}],["middleware的注册可以针对不同的范围",{"2":{"635":1}}],["middleware需满足以下几点规则",{"2":{"633":1}}],["middleware作用于应用路由",{"2":{"633":1}}],["middleware",{"0":{"633":1},"1":{"634":1,"635":1},"2":{"127":2,"634":3,"665":1}}],["middle",{"2":{"16":1,"19":1,"284":1}}],["m+",{"2":{"60":2}}],["mm",{"2":{"57":2,"60":4,"190":2,"1074":2}}],["mdn",{"2":{"169":1,"222":2,"355":2,"980":1}}],["mdnode",{"2":{"97":1}}],["md5计算完hash后",{"2":{"772":1}}],["md5",{"2":{"83":2,"726":1,"772":1,"773":1}}],["md",{"2":{"53":1,"54":3,"97":1,"270":1,"293":1,"665":2,"836":1,"1059":1,"1060":1,"1071":1,"1107":1,"1189":1}}],["mockfn",{"2":{"869":6}}],["mocks",{"2":{"857":2}}],["mocked",{"2":{"857":1}}],["mock",{"2":{"606":3,"619":1,"624":1,"626":1,"629":1,"631":1,"635":2,"637":1,"640":2,"642":1,"643":3,"645":1,"646":1,"648":1,"655":5,"661":4,"683":1,"687":2,"857":4,"869":4}}],["mockcontroller",{"2":{"606":9,"619":1,"624":2,"626":1,"628":1,"629":1,"630":1,"631":2,"632":1,"637":1,"640":2,"642":1,"643":3,"645":1,"646":1,"648":1,"655":1,"661":4,"687":1,"688":1}}],["mockmodule",{"2":{"604":1,"606":6,"608":2,"624":1,"628":1,"630":1,"631":1,"632":1}}],["move",{"2":{"800":1,"801":1}}],["moved",{"2":{"317":1,"617":1}}],["moveto",{"2":{"283":1}}],["movie",{"2":{"251":1}}],["mobile",{"2":{"251":2,"347":1,"422":1}}],["moyai",{"2":{"251":1}}],["mortar",{"2":{"251":1}}],["more",{"2":{"150":2,"383":1,"695":1,"800":1,"801":1,"899":2,"1217":2}}],["mouseover",{"2":{"404":2}}],["mouseover事件",{"2":{"404":1}}],["mouse2",{"2":{"251":1}}],["mouse",{"2":{"251":1,"572":3}}],["mouth",{"2":{"251":2}}],["mounts",{"2":{"1209":1}}],["mount参数时指定数据卷的类型",{"2":{"1116":1}}],["mount参数指定宿主机目录或文件挂载到容器的挂载点",{"2":{"1061":1}}],["mounted",{"2":{"1111":1}}],["mountains",{"2":{"251":1}}],["mountain",{"2":{"251":3}}],["mountcomponent",{"2":{"238":1,"954":4}}],["mount",{"2":{"238":3,"251":1,"875":2,"954":2,"1116":4,"1209":1}}],["moon",{"2":{"139":4,"251":13,"888":4}}],["moment",{"2":{"130":2,"190":4}}],["mozilla",{"2":{"118":1,"355":1,"462":3,"568":1,"779":1,"1005":1,"1007":1}}],["mono",{"2":{"814":1}}],["monorepo会结合",{"2":{"814":1}}],["monorepo模式中代码对于成员都是透明的",{"2":{"811":1}}],["monorepo提供了更好的代码可视性和管理",{"2":{"811":1}}],["monorepo可以简化构建和部署过程",{"2":{"811":1}}],["monorepo使团队成员能够更紧密地协作开发",{"2":{"811":1}}],["monorepo将多个项目或组件放置在同一个代码仓库中",{"2":{"811":1}}],["monorepo中可以管理多个不同的包",{"2":{"810":1}}],["monorepo",{"2":{"268":1,"808":1,"810":1,"813":1}}],["monorail",{"2":{"251":1}}],["monitoring",{"2":{"1179":1}}],["monitor",{"2":{"728":1,"1209":1}}],["mon",{"2":{"342":1,"343":1,"347":1}}],["money",{"2":{"251":1}}],["moneybag",{"2":{"251":1}}],["monkey",{"2":{"251":2}}],["months",{"2":{"660":1,"998":1}}],["monthname",{"2":{"83":2}}],["month",{"2":{"83":4,"660":1}}],["mongodb地址",{"2":{"54":1}}],["mongodburi",{"2":{"54":1,"56":1}}],["mongodb数据库的一些模型",{"2":{"54":1}}],["mongodb",{"2":{"52":1,"54":2,"56":1}}],["modify",{"2":{"1225":1}}],["modification",{"2":{"1225":1}}],["modifications",{"2":{"404":4}}],["modifier",{"2":{"850":1}}],["modified",{"2":{"317":1,"319":1,"347":1,"857":1,"1217":1}}],["modprobe",{"2":{"1205":2,"1206":5}}],["mod",{"2":{"83":1,"333":4}}],["modulefileextensions",{"2":{"857":1}}],["module参数即可",{"2":{"718":1}}],["module`",{"2":{"718":2}}],["module模块实现负载均衡",{"2":{"725":1}}],["module模块或lua脚本将图片转换成webp格式",{"2":{"718":1}}],["module模块的功能了",{"2":{"718":1}}],["module模块的功能进行图片的转换如",{"2":{"718":1}}],["module模块提供",{"2":{"717":1}}],["module和ngx",{"2":{"717":1}}],["module就拥有了cat控制器中的路由",{"2":{"605":1}}],["module中有4个属性他们都有自己的作用",{"2":{"604":1}}],["module版等等",{"2":{"237":1}}],["modulenamemapper",{"2":{"857":2,"862":1,"863":1}}],["modulename",{"2":{"237":1}}],["module",{"0":{"604":1},"1":{"605":1,"606":1,"607":1,"608":1,"609":1},"2":{"62":1,"64":2,"130":1,"132":1,"175":1,"176":1,"177":1,"179":2,"180":2,"181":2,"182":1,"183":3,"184":2,"185":1,"186":1,"187":1,"188":1,"189":2,"190":6,"354":1,"603":1,"604":2,"605":1,"606":6,"607":2,"608":2,"609":3,"621":1,"622":1,"624":1,"628":1,"630":1,"631":1,"632":1,"635":1,"640":2,"643":4,"646":2,"649":1,"652":3,"659":2,"665":3,"669":3,"673":2,"681":1,"702":2,"707":2,"708":19,"718":40,"729":1,"802":1,"829":2,"831":1,"857":1,"878":1,"880":1,"1102":1,"1183":1}}],["modules中解析",{"2":{"186":1}}],["modules文件夹",{"2":{"179":1}}],["modules",{"2":{"49":1,"179":1,"180":1,"186":2,"187":1,"188":1,"190":6,"237":1,"555":1,"621":1,"665":1,"669":1,"673":1,"708":2,"718":4,"801":1,"810":1,"814":1,"818":1,"827":1,"841":1,"848":1,"857":2,"877":1,"1071":1,"1103":1,"1107":1,"1139":1,"1183":1,"1205":1,"1206":6}}],["mode=block",{"2":{"350":1}}],["model",{"2":{"204":8,"754":8,"1209":1}}],["mode是在webpack4",{"2":{"182":1}}],["mode和text",{"2":{"17":1}}],["mode让文字的显示变为垂直方向",{"2":{"17":1}}],["mode可以改变文字的显示方向",{"2":{"17":1}}],["mode属性",{"2":{"17":1}}],["mode",{"0":{"17":1,"182":1},"2":{"11":1,"17":3,"22":1,"175":1,"182":2,"187":1,"190":2,"251":1,"800":4,"832":1,"1034":1,"1121":1,"1157":1,"1212":2}}],["m",{"2":{"33":4,"83":5,"138":2,"139":1,"141":1,"160":1,"161":2,"245":2,"251":1,"576":1,"581":1,"887":2,"888":1,"890":1,"1090":2,"1183":1,"1190":1,"1208":1}}],["major",{"2":{"814":1,"1121":2}}],["may",{"2":{"797":2}}],["ma=2592000",{"2":{"727":6}}],["make",{"2":{"718":2,"857":1}}],["mahjong",{"2":{"251":1}}],["mail",{"2":{"251":3,"319":1,"708":2,"718":4,"1228":1}}],["mailbox",{"2":{"251":4}}],["maint",{"2":{"994":3}}],["maintainers",{"2":{"994":3}}],["maintainer=nginx",{"2":{"994":3}}],["main块",{"2":{"709":1}}],["mainline",{"2":{"707":3}}],["mainfile",{"2":{"186":1,"190":1}}],["mainfields",{"2":{"186":1,"190":1}}],["main",{"2":{"49":1,"54":2,"186":1,"190":1,"350":2,"555":1,"603":1,"640":1,"654":1,"665":2,"671":1,"703":1,"709":2,"728":1,"729":1,"800":2,"801":1,"1074":1,"1082":1,"1102":1,"1103":1,"1183":2,"1184":1,"1187":1,"1188":2,"1190":1}}],["mag",{"2":{"251":2}}],["mao",{"2":{"251":1}}],["masqueradebit",{"2":{"1212":1}}],["masqueradeall",{"2":{"1212":1}}],["master生成k8s集群配置",{"0":{"1212":1}}],["master节点",{"2":{"1196":1,"1212":2}}],["master为主",{"2":{"728":1}}],["master",{"2":{"270":1,"332":1,"383":3,"728":1,"1127":1,"1135":1,"1142":2,"1199":2,"1200":1,"1217":9}}],["massage",{"2":{"251":1}}],["mask",{"2":{"251":1,"298":1,"363":1}}],["male",{"2":{"204":2,"754":2}}],["malemodel",{"2":{"204":5,"754":5}}],["manaul",{"2":{"1131":1}}],["management",{"2":{"568":1}}],["managemusic",{"2":{"54":1}}],["manager状态不是loading时",{"2":{"245":1}}],["managerqueue",{"2":{"245":5,"247":1}}],["manager",{"2":{"244":2,"245":13,"247":5,"248":1,"249":1,"1082":1,"1093":1,"1209":1,"1217":1}}],["manual",{"2":{"1121":1,"1131":1,"1136":2}}],["manually",{"2":{"1098":1}}],["manipulation",{"2":{"532":1}}],["manifests",{"2":{"1212":1,"1217":2}}],["manifest",{"2":{"222":3,"350":1}}],["many",{"2":{"317":1}}],["mans",{"2":{"251":1}}],["man",{"2":{"201":2,"251":4,"751":2}}],["matchall",{"2":{"154":3,"903":3}}],["match",{"2":{"138":2,"139":1,"140":7,"141":6,"143":1,"145":4,"148":2,"149":2,"150":3,"154":7,"232":1,"347":1,"521":1,"576":1,"770":2,"887":2,"888":1,"889":7,"890":6,"892":1,"894":4,"897":2,"898":2,"899":3,"903":7}}],["math+sci+lit",{"2":{"83":4}}],["math",{"2":{"60":1,"61":1,"62":2,"230":4,"285":1,"520":2,"771":2,"956":1}}],["mar",{"2":{"1005":1,"1007":1,"1063":1,"1064":4}}],["marking",{"2":{"568":1}}],["mark",{"2":{"251":5,"462":3}}],["markup",{"0":{"251":1}}],["markdown",{"2":{"660":1}}],["markdownf9",{"2":{"165":1}}],["markdown预览窗口",{"2":{"164":2}}],["markdownctrl",{"2":{"160":1,"166":1}}],["markdowncommand",{"2":{"156":1,"157":1,"159":1,"161":1,"162":1,"163":1,"164":1}}],["markdownoption",{"2":{"158":1}}],["marks",{"2":{"83":1}}],["margin",{"0":{"13":1},"2":{"11":1,"12":2,"13":1,"17":1,"22":1,"61":1,"110":4,"111":1,"112":1}}],["maxpercore",{"2":{"1212":1}}],["maxmarkerbits",{"2":{"934":1,"964":1}}],["maximum",{"2":{"382":1,"386":2,"457":1,"1132":1}}],["maxinitialrequests",{"2":{"130":1}}],["maxage的优先级高于expires",{"2":{"347":1}}],["maxage设置相对时间",{"2":{"347":1}}],["maxage",{"2":{"347":3,"354":1,"695":1,"720":3}}],["maxasyncrequests",{"2":{"130":1}}],["maxwidth",{"2":{"284":2}}],["max",{"2":{"83":1,"344":1,"347":1,"350":1,"380":2,"520":1,"695":1,"703":1,"720":6,"771":1,"800":1,"830":2,"956":1,"1063":1,"1064":2,"1074":1,"1177":1,"1209":8}}],["maxfieldssize",{"2":{"62":2}}],["macintosh",{"2":{"1005":1,"1007":1}}],["macrotask执行完毕",{"2":{"532":1}}],["macrotask必须放到相同的macrotask",{"2":{"532":1}}],["macrotask",{"2":{"532":2}}],["macrotask和microtask",{"0":{"532":1}}],["macro",{"2":{"531":1,"532":1}}],["macos可以设置启动设置为系统代理",{"2":{"414":1}}],["macos",{"2":{"412":1,"450":1,"785":1,"1164":1}}],["mac地址需要通过arp协议获取目标主机地址",{"2":{"454":1}}],["mac地址等等",{"2":{"431":1}}],["mac地址决定了下一跳地址",{"2":{"311":1}}],["mac地址每经过一个路由器时都会将源mac地址修改会其某一网络接口的mac地址",{"2":{"311":1}}],["mac地址",{"2":{"298":1,"1195":1}}],["mac地址长度",{"2":{"297":1}}],["machine",{"0":{"1166":1},"2":{"251":1,"1166":2}}],["mac",{"2":{"155":1,"325":1,"350":3,"454":3,"703":1,"722":3,"723":1,"726":7,"728":2,"1005":1,"1007":1,"1195":1}}],["mac目前基本都是zsh终端",{"2":{"69":1}}],["mac双击后点击里面的",{"2":{"68":1}}],["mapper",{"2":{"1202":1}}],["mappings",{"2":{"410":1}}],["maple",{"2":{"251":1}}],["map",{"2":{"33":6,"183":13,"190":1,"203":1,"229":2,"237":1,"245":1,"414":2,"418":1,"497":1,"651":2,"753":1,"769":2,"770":1,"771":1,"772":2,"951":2,"959":2,"964":1,"965":1}}],["mynetwork",{"2":{"1022":1,"1089":2,"1090":2}}],["myvolume",{"2":{"1022":1}}],["myimage",{"2":{"1010":2,"1046":5,"1047":4,"1065":3,"1068":1,"1116":1}}],["mycontainer",{"2":{"1010":6}}],["mycall",{"2":{"7":1}}],["myevent",{"2":{"200":1,"750":1}}],["my",{"2":{"132":2,"573":2,"577":2,"579":3,"580":5,"583":2,"721":1,"1023":1,"1024":2,"1025":1}}],["mypromise",{"2":{"98":15}}],["mysql等一些列安装",{"2":{"124":1}}],["mysql自己也可以在插入数据的时候创建索引",{"2":{"85":1}}],["mysql计算log",{"2":{"83":1}}],["mysql提供了cast",{"2":{"83":1}}],["mysql将会返回null",{"2":{"83":1}}],["mysql排序先按前一个条件来排序",{"2":{"81":1}}],["mysql的if",{"2":{"83":1}}],["mysql的排序命令是order",{"2":{"81":1}}],["mysql的默认安装路径",{"2":{"68":1}}],["mysql常用数据类型传送门",{"2":{"75":1}}],["mysql",{"2":{"67":1,"68":1,"69":1,"1023":1,"1024":14,"1146":2,"1165":1}}],["mysql从入门到放弃",{"0":{"67":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1}}],["mybind",{"2":{"9":1}}],["myapply",{"2":{"8":1}}],["一杯又一杯",{"2":{"1236":1}}],["一杯茶的时间",{"2":{"734":1}}],["一切都来的太突然",{"2":{"1233":1}}],["一时搞不懂什么情况",{"2":{"1233":1}}],["一开始接了电话40秒",{"2":{"1232":1}}],["一位专注于web前端开发的工程师",{"2":{"1223":1}}],["一台兼容的",{"2":{"1195":1}}],["一起使用",{"2":{"1121":1}}],["一键式登录",{"2":{"1014":1}}],["一定指向当前的组件渲染watcher",{"2":{"953":1}}],["一定要学会调试技巧在工作中也是很有帮助的",{"2":{"966":1}}],["一定要自己动手实践才能熟能生巧",{"2":{"426":1}}],["一定要非常谨慎的加上条件",{"2":{"79":1}}],["一致的代码风格",{"2":{"824":1}}],["一致",{"2":{"794":1}}],["一辆车肯定很难完成任务很有可能翻车",{"2":{"776":1}}],["一旦会话缓存过期",{"2":{"726":1}}],["一图胜千言",{"2":{"577":1}}],["一段文本",{"2":{"496":3,"688":1}}],["一目了然",{"2":{"416":1}}],["一头雾水",{"2":{"408":1}}],["一次行不行",{"2":{"378":1}}],["一次加载会出现明显的卡顿",{"2":{"241":1}}],["一文熟悉nexus3的基本使用或者参考其他第三方资料都可以",{"2":{"1040":1}}],["一文你应该已经安装nexus3了",{"2":{"1040":1}}],["一文去了解完整的私库搭建过程",{"2":{"1013":1}}],["一文学习下",{"2":{"768":1}}],["一文",{"2":{"335":1,"376":1,"455":1,"521":1,"522":1,"526":1,"532":1,"726":1,"958":1,"966":1,"1000":1,"1208":1}}],["一些常用的选项包括",{"2":{"1004":1,"1007":1,"1008":1,"1009":1}}],["一些工具",{"2":{"794":1}}],["一些编辑器允许你根据自己的需求进行个性化定制",{"2":{"785":1}}],["一些ejs模版语法",{"2":{"671":1}}],["一些配置等等",{"2":{"415":1}}],["一些请求相关配置工具",{"2":{"414":1}}],["一些请求连接时间",{"2":{"413":1}}],["一些和查看记录的配置有关",{"2":{"414":1}}],["一些全局相关的配置",{"2":{"413":1}}],["一些功能还是有细微差距的",{"2":{"411":1}}],["一些需要身份验证的资源可能被错误的推送",{"2":{"325":1}}],["一些简单的东西已被忽略掉",{"2":{"271":1}}],["一朝风月",{"2":{"252":1}}],["一系列可能会处理请求的对象被连成一条链",{"2":{"205":1,"755":1}}],["一种技术肯定不切实际",{"2":{"786":1}}],["一种基于udp协议的传输层协议",{"2":{"727":1}}],["一种特殊的ip地址",{"2":{"361":1}}],["一种用于性能优化的模式",{"2":{"204":1,"754":1}}],["一种是通过",{"2":{"9":1}}],["一种是直接调用",{"2":{"9":1}}],["一对括号进行修饰",{"2":{"145":1,"894":1}}],["一步一个脚印完成配置的",{"2":{"124":1}}],["一样的为一组",{"2":{"84":1}}],["一个流水线中可以定义多个作业",{"2":{"1124":1}}],["一个yaml文件就是一个流水线",{"2":{"1118":1}}],["一个设备被添加到容器的网络命名空间",{"2":{"1086":1}}],["一个名为web的服务",{"2":{"1023":1}}],["一个名为db的服务",{"2":{"1023":1}}],["一个类",{"2":{"995":1,"1081":1}}],["一个类可能需要创建其他类的实例",{"2":{"601":1}}],["一个root文件系统的模板",{"2":{"995":1,"1081":1}}],["一个guard需要实现canactivate类的canactivate方法",{"2":{"648":1}}],["一个简单的例子",{"2":{"512":1}}],["一个成功的",{"2":{"508":1}}],["一个图片blob",{"2":{"497":1}}],["一个将很大的图片分段请求最后合并下载的例子",{"2":{"485":1}}],["一个四元组可以标识一个连接",{"2":{"455":1}}],["一个是正常的论坛类型网站192",{"2":{"352":1}}],["一个公钥和一个私钥",{"2":{"330":1}}],["一个",{"2":{"237":1,"518":1,"716":1,"1121":1}}],["一个基于策略模式的程序至少由两部分组成",{"2":{"197":1,"747":1}}],["一个单一对象",{"2":{"196":1,"746":1}}],["一个在字符串中测试是否匹配的regexp方法",{"2":{"153":1,"902":1}}],["一个在字符串中执行查找匹配的regexp方法",{"2":{"153":1,"902":1}}],["一个小例子",{"2":{"141":1,"225":1,"890":1}}],["一个匹配的词的边界的内容的长度是0",{"2":{"139":1,"888":1}}],["一个词的边界就是一个词不被另外一个",{"2":{"139":1,"888":1}}],["一个例子",{"0":{"137":1,"886":1}}],["一个元素是浮动元素",{"2":{"107":1}}],["一个老师只能交一个班级",{"2":{"87":1}}],["一个可以惟一确定口令的字符串",{"2":{"83":1}}],["一个数组或者类数组对象",{"2":{"2":1}}],["一般情况下",{"2":{"1202":1}}],["一般用来模板继承",{"2":{"1124":1}}],["一般用于金钱",{"2":{"83":1}}],["一般不会使用系统账户进行登录发包",{"2":{"1099":1}}],["一般不使用npm",{"2":{"813":1}}],["一般几分钟",{"2":{"1078":1}}],["一般都好几g",{"2":{"1078":1}}],["一般都会写对应的key也可以嵌套",{"2":{"938":1}}],["一般都是语言包都是以json的形式按语言划分在不同的文件夹中",{"2":{"676":1}}],["一般都是在继承时初始化值后尽量减少修改",{"2":{"571":1}}],["一般都是根据系统帧率60fps",{"2":{"534":1}}],["一般一个计算属性一个函数就行了",{"2":{"931":1}}],["一般一个网络内有255个范围主机可以进行划分",{"2":{"364":1}}],["一般推荐使用官方维护的eslint插件和配置",{"2":{"831":1}}],["一般官方的脚手架都会给我们配置的差不多",{"2":{"784":1}}],["一般设置在第一层代理服务器",{"2":{"723":1}}],["一般项目中都会有一个配置文件来灵活处理项目",{"2":{"669":1}}],["一般是对数据库的数据进行增删改查然后返回给controller的",{"2":{"667":1}}],["一般是将可读流的数据写入",{"2":{"513":1}}],["一般绑定到全局即可",{"2":{"640":1}}],["一般这种继承应用场景如上面代码那样",{"2":{"579":1}}],["一般以下几种被视为微任务",{"2":{"532":1}}],["一般可以在这里对数据的进行进度条计算",{"2":{"514":1}}],["一般上线项目都会打包压缩",{"2":{"408":1}}],["一般也不会由此字段",{"2":{"344":1}}],["一般结合其他装饰器一起使用",{"2":{"232":1}}],["一般使用taobao",{"2":{"97":1}}],["一般像null",{"2":{"46":1,"552":1}}],["一直下一步即可",{"2":{"422":1}}],["一直到最后一个规则",{"2":{"81":1}}],["一直点继续就可以了",{"2":{"68":1}}],["一直没太关注",{"2":{"21":1}}],["一去一来",{"2":{"32":1}}],["一丝姐",{"2":{"21":1}}],["iz1porca5zd5gv1uydx4",{"2":{"1159":1}}],["izakaya",{"2":{"251":1}}],["iresponseresultlistdto",{"2":{"686":2}}],["iresponsecodedto",{"2":{"686":2}}],["i18ncontext",{"2":{"675":1}}],["i18nresolver",{"2":{"674":1}}],["i18nmodule",{"2":{"673":1}}],["i18n也属于项目的公共部分",{"2":{"673":1}}],["i18n",{"2":{"665":2,"672":1,"673":1,"674":2,"675":3,"676":1}}],["iaaia",{"2":{"410":1}}],["ihl",{"2":{"367":1}}],["ihengshuai",{"2":{"60":1,"62":1,"64":1,"66":1,"713":3,"726":3,"1014":1,"1045":1,"1157":2,"1159":1,"1171":1,"1176":3,"1188":2,"1228":1}}],["it等等",{"2":{"882":1}}],["its",{"2":{"251":1,"857":1}}],["it",{"2":{"251":1,"859":2,"864":1,"866":2,"867":1,"868":1,"874":1,"879":1,"881":2,"1004":2,"1090":2,"1103":2,"1156":2,"1157":2,"1160":1,"1174":2,"1179":1,"1218":1,"1225":1}}],["iterator",{"2":{"154":8,"903":8}}],["item",{"2":{"63":5,"201":2,"751":2}}],["items",{"2":{"20":1,"686":1,"869":3,"955":6}}],["icmp",{"2":{"367":1,"368":1,"1209":1,"1218":5}}],["icmp网络诊断等在实际开发或网络排错中都很有用",{"2":{"312":1}}],["icmp等等",{"2":{"312":1}}],["ice",{"2":{"251":2}}],["icecream",{"2":{"251":1}}],["ico",{"2":{"222":1,"671":1,"1007":2}}],["icon",{"2":{"222":2,"671":2,"712":2,"850":1,"875":3,"1230":1}}],["icons",{"2":{"222":3,"712":2}}],["io镜像加速",{"2":{"1209":1}}],["iouid",{"2":{"1209":1}}],["iogid",{"2":{"1209":1}}],["ioc实现响应式",{"0":{"967":1}}],["io回调等等",{"2":{"538":1}}],["io",{"2":{"218":4,"270":1,"702":1,"703":3,"1012":2,"1014":1,"1051":3,"1054":3,"1055":3,"1082":1,"1093":1,"1209":44,"1212":4,"1214":1,"1217":6}}],["ios10",{"2":{"22":1}}],["ios5",{"2":{"22":1}}],["ios6+",{"2":{"22":8}}],["ippools",{"2":{"1217":2}}],["ipprefixlen",{"2":{"1084":1}}],["ipset",{"2":{"1206":1}}],["ip6tables",{"2":{"1205":2}}],["iptables",{"0":{"1205":1},"2":{"1205":2,"1212":1}}],["ip形式",{"2":{"1157":1}}],["ipromiseconcurrencyqueue",{"2":{"771":5}}],["ipromiseconcurrency",{"2":{"771":3}}],["ipaddress",{"2":{"728":1,"1084":1}}],["ip哈希",{"2":{"725":1}}],["ip等等",{"2":{"453":2}}],["ip头占用20字节",{"2":{"386":1}}],["ip的传输存活时间是基于ttl的跳数",{"2":{"382":1}}],["ip的最大传输长度位65535",{"2":{"372":1}}],["ip是一个无状态的网络层协议",{"2":{"372":1}}],["ip网络中",{"2":{"371":2}}],["ip分片会增加网络传输的复杂性和延迟",{"2":{"369":1}}],["ip分片是指将原始数据包分成若干个更小的数据包",{"2":{"369":1}}],["ip分片和重组是ip协议中用于处理大型数据包的机制",{"2":{"369":1}}],["ip分片",{"0":{"369":1}}],["ip首部的校验和",{"2":{"367":1}}],["ip首部长度占4位单位为4字节",{"2":{"367":1}}],["ip首部",{"0":{"367":1}}],["ipvsadm",{"2":{"1206":2}}],["ipvs",{"2":{"1206":6,"1212":2}}],["ipv6为6",{"2":{"367":1}}],["ipv6可以与ipv4兼容",{"2":{"366":1}}],["ipv6可以提供更大的地址空间",{"2":{"366":1}}],["ipv6支持ipsec",{"2":{"366":1}}],["ipv6支持服务质量",{"2":{"366":1}}],["ipv6采用一种称为",{"2":{"366":1}}],["ipv6的首部格式相对于ipv4更加简化",{"2":{"366":1}}],["ipv6使用128位地址",{"2":{"366":1}}],["ipv6使用8组4位的十六进制数表示",{"2":{"366":1}}],["ipv6使用8组二进制每组16位组成",{"2":{"366":1}}],["ipv6",{"0":{"366":1},"2":{"1051":4}}],["ipv6网络中使用ff02",{"2":{"365":1}}],["ipv6会单独的说明",{"2":{"358":1}}],["ipv4地址已经不够用了使用ipv6可以解决ip枯竭的问题",{"2":{"372":1}}],["ipv4地址的地址空间较小",{"2":{"366":1}}],["ipv4为4",{"2":{"367":1}}],["ipv4中私有ip地址的范围如下",{"2":{"360":1}}],["ipv4",{"0":{"1205":1},"2":{"358":1,"368":1,"380":1,"381":2,"382":2,"390":1,"1205":2}}],["ip+port",{"2":{"339":1,"724":1}}],["ip为范畴详细讲解部分协议",{"2":{"312":1}}],["ip划分",{"2":{"312":1}}],["ip两种协议比较经典而作为重要代表",{"2":{"312":1}}],["ip会添加源ip和目标ip等信息作为首部形成数据包",{"2":{"311":1}}],["ip模型",{"0":{"310":1},"2":{"308":1}}],["ip协议负责将数据包从源主机发送到目的主机",{"2":{"357":1}}],["ip协议为数据在网络中的传输提供了统一的标准",{"2":{"357":1}}],["ip协议族中的网络层协议",{"2":{"357":1}}],["ip协议中最重要的部分是ip地址",{"2":{"358":1}}],["ip协议中包含很多重要的协议",{"2":{"312":1}}],["ip协议中各层所包含的协议",{"2":{"312":1}}],["ip协议不是一种协议而是一类协议",{"2":{"312":1}}],["ip协议是一种无连接协议",{"2":{"357":1}}],["ip协议是互联网最重要的协议",{"2":{"312":1}}],["ip协议是osi的具体实现",{"2":{"310":1}}],["ip协议能够将数据包从一个网络设备传输到另一个网络设备",{"2":{"310":1}}],["ip协议的版本号",{"2":{"367":1}}],["ip协议的最高层",{"2":{"310":1}}],["ip协议的诞生背景是20世纪60年代末和70年代初",{"2":{"310":1}}],["ip协议则负责数据包的路由和寻址",{"2":{"310":1}}],["ip协议",{"0":{"312":1,"357":1},"1":{"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1},"2":{"310":1,"449":1}}],["ip协议影响力最大",{"2":{"307":1}}],["ip协议地址长度",{"2":{"297":1}}],["ip详解",{"2":{"306":1,"314":1,"373":1,"396":1}}],["ipc通知浏览器进程",{"2":{"276":1}}],["iphone",{"2":{"251":1}}],["ip地址为172",{"2":{"1084":1}}],["ip地址的数量是有限的",{"2":{"370":1}}],["ip地址的作用是唯一地标识一个计算机或网络设备",{"2":{"358":1}}],["ip地址范围192",{"2":{"364":1}}],["ip地址可用范围192",{"2":{"364":2}}],["ip地址分类",{"0":{"359":1},"1":{"360":1,"361":1}}],["ip地址示意图",{"2":{"358":1}}],["ip地址",{"0":{"358":1},"2":{"177":1,"182":1,"298":1}}],["ip",{"2":{"83":1,"128":1,"221":1,"307":1,"312":1,"339":1,"357":1,"368":1,"382":1,"454":3,"710":1,"713":2,"723":3,"724":1,"725":1,"728":5,"1034":1,"1046":1,"1062":1,"1085":4,"1086":2,"1087":4,"1090":2,"1171":1,"1205":2,"1206":6,"1209":1,"1217":2,"1218":6}}],["id为1的是root",{"2":{"1174":1}}],["idtotemplate",{"2":{"954":1}}],["id可选",{"2":{"642":1}}],["idle",{"2":{"538":1,"1209":1}}],["idygyravfqz+6sbfe27",{"2":{"453":1}}],["id=",{"2":{"350":2,"404":1,"534":1,"724":1}}],["ideographic",{"2":{"284":1}}],["ideograph",{"2":{"251":1}}],["identity",{"2":{"57":4}}],["idx",{"2":{"232":5,"489":1,"772":6,"773":2}}],["id都存在并且两个相等的数据连接成一条数据",{"2":{"86":1}}],["id`",{"2":{"86":1}}],["id",{"2":{"64":3,"78":2,"79":1,"80":1,"81":1,"83":1,"86":1,"201":4,"251":1,"325":1,"337":1,"350":2,"354":7,"612":3,"613":21,"614":1,"642":5,"643":9,"645":9,"648":2,"666":1,"667":1,"709":1,"728":2,"751":4,"941":1,"944":1,"954":5,"998":2,"1002":7,"1004":1,"1005":1,"1006":4,"1007":1,"1008":1,"1009":1,"1010":1,"1014":2,"1088":1,"1089":1,"1099":1,"1121":21,"1122":10,"1174":1,"1187":3,"1190":2,"1195":1,"1214":4}}],["i++",{"2":{"61":1,"197":1,"203":1,"204":2,"343":1,"747":1,"753":1,"754":2,"937":1,"938":1,"951":1,"954":2,"955":2}}],["i=0",{"2":{"61":1}}],["immediate>",{"2":{"944":1}}],["immediate会让watch立即执行一次",{"2":{"939":1}}],["immediate",{"0":{"939":1},"2":{"938":2,"939":2,"944":4,"945":1}}],["immutable",{"2":{"231":2,"695":1}}],["imap",{"2":{"704":1}}],["imageminimumgcage",{"2":{"1212":1}}],["imagemanager>",{"2":{"245":1}}],["imagemanager",{"2":{"244":3,"245":3,"248":2,"249":2}}],["imagemanageropts",{"2":{"243":1,"244":2,"248":2,"249":2}}],["imagerepository",{"2":{"1212":1}}],["imagepullpolicy",{"2":{"1212":1}}],["image=registry",{"2":{"1208":1}}],["image=nginx",{"2":{"994":3}}],["image查看内部的环境变量",{"2":{"1055":1}}],["image>",{"2":{"1053":1}}],["imagename",{"2":{"999":3,"1000":2,"1001":3}}],["images",{"2":{"325":1,"350":1,"712":2,"718":3,"994":1,"998":3,"1000":1,"1002":3,"1012":1,"1014":1,"1051":1,"1076":1,"1213":2}}],["imagedata",{"2":{"290":1}}],["image",{"0":{"1021":1,"1145":1},"2":{"61":1,"181":3,"190":1,"198":1,"222":5,"244":8,"245":3,"247":1,"248":1,"347":3,"485":1,"497":2,"671":1,"701":1,"703":2,"717":4,"718":26,"748":1,"995":1,"998":2,"999":1,"1000":4,"1002":3,"1004":2,"1006":1,"1018":1,"1020":1,"1021":1,"1022":1,"1023":2,"1024":2,"1025":1,"1039":1,"1047":1,"1051":2,"1054":2,"1055":2,"1081":1,"1082":2,"1121":4,"1145":1,"1157":3,"1158":1,"1159":1,"1173":1,"1190":1,"1209":9,"1214":1,"1217":1}}],["impliedstrict",{"2":{"829":1}}],["implementation",{"2":{"727":1}}],["implements",{"2":{"634":1,"635":1,"639":1,"645":1,"648":1,"651":1,"669":1,"674":1}}],["implement",{"2":{"576":1}}],["implemented",{"2":{"317":1}}],["imperative",{"2":{"800":1}}],["improves",{"2":{"800":1}}],["imp",{"2":{"251":2}}],["imported",{"2":{"857":1}}],["importscripts",{"2":{"773":1}}],["imports",{"0":{"607":1},"2":{"604":2,"607":1,"608":1,"609":1,"622":1,"628":1,"630":1,"631":1,"632":1,"659":1,"673":1,"1209":1}}],["import",{"2":{"131":1,"238":15,"243":1,"245":3,"603":2,"604":2,"613":1,"614":1,"619":3,"634":3,"639":1,"640":4,"643":1,"646":3,"648":6,"651":2,"652":2,"659":2,"660":3,"661":1,"681":2,"700":2,"702":6,"859":1,"863":1,"866":1,"867":1,"869":1,"875":4,"880":1,"934":1,"1010":2}}],["imgnode",{"2":{"198":3,"748":3}}],["imgfunc",{"2":{"198":3,"748":3}}],["img",{"2":{"61":1,"198":4,"244":7,"245":3,"249":1,"350":4,"497":3,"712":1,"718":1,"748":4,"770":2}}],["ignore|deny|allow",{"2":{"695":1}}],["ignoreenvfile",{"2":{"628":1}}],["ignore",{"2":{"238":1,"1209":2}}],["ignoreplugin",{"2":{"190":1}}],["ignored",{"2":{"188":1,"190":1}}],["ignorecase",{"2":{"152":3,"901":3}}],["ig",{"2":{"44":1,"141":6,"143":1,"144":4,"145":5,"152":4,"550":1,"890":6,"892":1,"893":4,"894":5,"901":4}}],["iviewui",{"2":{"52":1}}],["iv",{"2":{"40":1,"546":1}}],["iid",{"2":{"1121":2,"1122":2}}],["iiuhjil8m6gux+wo",{"2":{"723":1}}],["iii",{"0":{"334":1},"2":{"40":1,"546":1}}],["ii",{"0":{"333":1},"2":{"40":2,"546":2}}],["i",{"0":{"332":1},"2":{"40":10,"43":1,"61":2,"83":1,"138":3,"141":1,"145":6,"150":1,"154":7,"158":2,"165":1,"169":1,"197":1,"203":7,"204":6,"232":1,"342":1,"343":4,"453":1,"521":1,"537":1,"539":1,"546":10,"549":1,"573":1,"575":2,"576":2,"577":3,"578":2,"581":1,"594":10,"602":1,"639":1,"651":1,"674":1,"687":1,"695":1,"696":1,"701":1,"723":1,"747":1,"753":7,"754":6,"770":2,"815":1,"858":1,"879":1,"880":1,"887":3,"890":1,"894":6,"899":1,"903":7,"932":3,"937":3,"938":3,"940":3,"941":7,"951":3,"954":6,"955":6,"1001":1,"1058":2,"1066":1,"1103":1,"1107":1,"1184":1,"1191":2,"1208":1,"1214":2,"1225":1}}],["isintegerkey",{"2":{"964":1}}],["isintersecting",{"2":{"245":1}}],["isdestroyed",{"2":{"954":1}}],["isdev",{"2":{"182":3}}],["ismounted",{"2":{"954":1}}],["ismultisource",{"2":{"944":2}}],["isunmounted",{"2":{"945":1}}],["isfrozen",{"2":{"941":1}}],["isfunction",{"2":{"934":1,"945":1}}],["isjson",{"2":{"651":2}}],["isrenderwatcher",{"2":{"954":1}}],["isreadonly",{"2":{"934":1,"964":5}}],["isreservedtag",{"2":{"238":2}}],["isrouteauthenrication",{"2":{"648":2}}],["isnumber",{"2":{"646":3,"683":2,"685":2,"686":1}}],["isnullorempty",{"2":{"438":1}}],["isnan",{"2":{"645":1}}],["isglobal",{"2":{"628":1}}],["isbn",{"2":{"316":1}}],["isbackground",{"2":{"249":7}}],["isbadaccount",{"2":{"54":2,"64":2}}],["isoptional",{"2":{"646":3,"686":1}}],["iso组织提出了osi七层模型",{"2":{"309":1}}],["iso",{"2":{"309":1,"1121":3}}],["isobject",{"2":{"33":3,"938":1,"941":1,"964":1}}],["isplainobject",{"2":{"937":1}}],["ispositive",{"2":{"646":3}}],["ispointinpath",{"2":{"291":1}}],["isprod",{"2":{"237":1}}],["isc",{"2":{"1102":1,"1103":1,"1108":1,"1183":1,"1184":1,"1187":1}}],["iscomponent",{"2":{"239":1}}],["iscallable",{"2":{"40":2,"546":2}}],["isvalidarrayindex",{"2":{"956":1}}],["isvue",{"2":{"239":1}}],["isvnode",{"2":{"201":1,"751":1}}],["istanbul",{"2":{"238":1,"880":2}}],["isssr",{"2":{"934":3}}],["issues",{"2":{"800":1}}],["isserverrendering",{"2":{"238":2}}],["isstring",{"2":{"232":2,"686":1}}],["isempty",{"2":{"197":2,"747":2}}],["isa",{"2":{"941":3}}],["isattachment",{"2":{"651":2}}],["isaccesspage",{"2":{"639":2}}],["isactive",{"2":{"83":1}}],["isarray",{"2":{"33":1,"203":1,"686":1,"753":1,"934":1,"937":1,"941":1,"955":3,"956":1,"964":3}}],["islogin",{"2":{"54":1}}],["is",{"2":{"33":1,"40":11,"56":2,"132":2,"139":3,"140":1,"169":1,"195":6,"203":1,"238":1,"404":2,"454":1,"455":1,"473":1,"546":11,"573":2,"576":1,"578":1,"579":3,"580":6,"582":2,"583":5,"587":3,"588":2,"589":2,"669":2,"708":2,"723":1,"745":6,"753":1,"800":1,"828":3,"888":3,"889":1,"915":1,"1034":1,"1046":1,"1051":1,"1074":1,"1098":1,"1103":1,"1132":5,"1227":1}}],["ie=edge",{"2":{"222":1}}],["ie",{"2":{"200":1,"750":1}}],["ie10+",{"2":{"22":2}}],["ie8+",{"2":{"22":1}}],["ie9+",{"2":{"22":2}}],["ie6+",{"2":{"22":5}}],["indicating",{"2":{"857":1}}],["indicates",{"2":{"857":2}}],["indent",{"2":{"836":2}}],["independent",{"2":{"814":1}}],["index++",{"2":{"869":1}}],["index文件",{"2":{"238":1}}],["index文件中导出了vue",{"2":{"238":1}}],["index文件中引入了vue",{"2":{"238":1}}],["index中引入了vue",{"2":{"238":1}}],["indexdb等等",{"2":{"168":1,"336":1}}],["indexof",{"2":{"61":1,"245":1}}],["index命令启动node服务器",{"2":{"56":1}}],["index",{"2":{"54":5,"63":14,"127":2,"130":1,"152":3,"175":3,"176":2,"186":1,"190":7,"195":2,"238":12,"243":1,"251":1,"316":1,"325":2,"382":1,"399":3,"410":1,"639":1,"675":1,"695":1,"697":1,"708":1,"709":3,"710":2,"711":2,"712":1,"718":2,"729":1,"745":2,"769":5,"772":1,"869":3,"874":3,"878":1,"880":2,"901":3,"954":4,"955":1,"1014":1,"1034":4,"1074":1,"1102":1,"1103":3,"1107":3,"1121":2,"1154":1,"1183":1,"1184":3,"1187":1,"1189":1,"1191":1}}],["inactive=60m",{"2":{"721":1}}],["inestapplication",{"2":{"603":1}}],["inet",{"2":{"83":4,"728":4,"1085":1,"1090":4}}],["inherit",{"0":{"1148":1},"2":{"284":1,"539":1,"579":3,"581":3,"1148":1}}],["invader",{"2":{"251":1}}],["inverse",{"2":{"61":1}}],["inbox",{"2":{"251":1}}],["inbrowser",{"2":{"238":2,"954":1}}],["ink",{"2":{"251":1}}],["infra",{"2":{"1179":1,"1208":1}}],["infobuffersize",{"2":{"1212":1}}],["info查看存储位置",{"2":{"1080":1}}],["info",{"2":{"709":1,"814":3,"874":1,"959":2,"960":3,"994":1,"1051":2,"1108":2}}],["informational",{"2":{"317":3}}],["information",{"2":{"251":2,"857":2,"1217":2}}],["infer",{"2":{"629":2,"918":1}}],["infinity",{"2":{"41":3,"547":3}}],["innocent",{"2":{"251":1}}],["innerwidth",{"2":{"828":1}}],["innertext",{"2":{"404":2}}],["innerhtml",{"2":{"115":1,"354":2,"954":1}}],["inner",{"2":{"17":2,"86":1,"532":2,"588":12,"589":1}}],["inject用来注入可注入的依赖",{"2":{"623":1}}],["inject显式注入",{"2":{"606":1}}],["injectable支持三种类型的作用域",{"2":{"625":1}}],["injectable装饰作为提供者",{"2":{"633":1}}],["injectable装饰的类不需要显式的使用inject进行注入",{"2":{"623":1}}],["injectable装饰的类表示可被注入",{"2":{"623":1}}],["injectable装饰的类",{"2":{"622":1}}],["injectable装饰器的元数据需要显式注入",{"2":{"606":1}}],["injectable装饰器进行装饰的元数据不需要使用",{"2":{"606":1}}],["injectable",{"2":{"606":3,"622":2,"624":1,"634":2,"645":2,"648":2,"651":2,"667":1,"674":1}}],["injectable进行装饰来标识当前类可以被注入",{"2":{"606":1}}],["injection",{"2":{"601":1}}],["inject",{"2":{"229":2,"230":1,"606":4,"624":1,"626":1,"631":1}}],["incomingmessage",{"2":{"702":2}}],["incoming",{"2":{"251":1}}],["incomingform",{"2":{"62":1}}],["includes",{"2":{"772":1,"951":1,"1217":1}}],["includesubdomains",{"2":{"350":1}}],["include",{"0":{"1142":1},"2":{"190":1,"688":1,"709":2,"1142":2}}],["increment",{"2":{"75":1,"86":2}}],["insecure",{"2":{"1039":1,"1045":1,"1209":1}}],["inserted",{"2":{"955":10}}],["insertpragma",{"2":{"839":1}}],["insertions",{"2":{"800":1}}],["insertnode",{"2":{"462":1}}],["insert",{"0":{"77":1},"2":{"77":7,"83":1,"86":2,"350":1,"836":2}}],["inside",{"2":{"251":1,"280":4}}],["insights",{"0":{"213":1}}],["instruction>",{"2":{"1065":1}}],["instrument",{"2":{"857":2}}],["instr",{"2":{"83":1}}],["instances",{"2":{"201":2,"751":2,"857":2}}],["instance",{"2":{"196":4,"201":12,"233":10,"238":3,"239":1,"703":1,"728":1,"746":4,"751":12,"932":2,"937":1,"944":12,"945":8,"954":4,"1074":1}}],["instanceof",{"2":{"9":1,"98":3,"238":1,"354":1,"582":1,"583":1,"639":2,"915":1,"941":1}}],["installing",{"2":{"1158":1}}],["install会安装所有依赖",{"2":{"815":1}}],["installation",{"2":{"238":1,"1217":5}}],["install",{"2":{"56":3,"96":3,"97":1,"174":1,"176":1,"177":1,"179":1,"180":3,"181":1,"182":1,"184":1,"190":1,"215":1,"218":1,"222":2,"238":3,"245":1,"421":1,"422":1,"707":2,"713":1,"718":2,"728":1,"796":1,"804":2,"806":2,"810":1,"813":2,"814":1,"815":1,"819":1,"831":1,"840":1,"844":1,"846":1,"856":1,"875":1,"877":1,"1034":1,"1056":1,"1065":2,"1070":1,"1073":1,"1074":2,"1082":2,"1093":2,"1103":2,"1119":4,"1125":2,"1145":1,"1158":1,"1171":2,"1190":1,"1204":1,"1206":1,"1208":3,"1209":1,"1211":1,"1217":1,"1218":1}}],["inspect查看镜像的变量",{"2":{"1054":1}}],["inspectors",{"2":{"436":1}}],["inspect",{"2":{"40":1,"399":4,"546":1,"994":1,"1001":1,"1054":1,"1055":3,"1084":1}}],["input",{"2":{"40":6,"152":3,"199":1,"237":1,"352":2,"354":6,"499":2,"546":6,"724":2,"749":1,"765":1,"797":2,"901":3,"1034":4,"1121":1}}],["input是待转换的对象",{"2":{"40":1,"546":1}}],["introduction",{"2":{"689":1}}],["intro",{"2":{"580":3,"582":1,"583":2,"929":2,"930":4,"932":1,"950":2,"955":4}}],["int32array",{"2":{"481":1}}],["int16array",{"2":{"481":1}}],["int8array",{"2":{"481":1}}],["integrity",{"2":{"1103":1,"1108":1,"1132":2,"1189":1}}],["integer",{"2":{"83":1,"771":1}}],["intel",{"2":{"1005":1,"1007":1}}],["intellisense",{"2":{"400":1}}],["interactive",{"2":{"1157":3,"1158":1}}],["interaction",{"2":{"532":1}}],["interlace",{"2":{"718":1}}],["intercept",{"2":{"651":1}}],["interceptor也是支持nestjs上下文外全局绑定",{"2":{"652":1}}],["interceptor是nestjs提供的拦截器",{"2":{"650":1}}],["interceptor",{"0":{"650":1},"1":{"651":1,"652":1},"2":{"650":1,"652":4,"665":1}}],["interceptor前执行",{"2":{"647":1}}],["interceptor可以在nest上下文以外",{"2":{"636":1,"640":1}}],["intersectsnode",{"2":{"462":1}}],["intersectionobserver的api虽然很好用",{"2":{"246":1}}],["intersectionobserver",{"2":{"245":3,"247":1}}],["internet协议安全性",{"2":{"366":1}}],["internet",{"2":{"319":1,"357":1,"367":1,"383":1}}],["internals>",{"2":{"400":1,"401":1}}],["internal",{"2":{"317":1,"637":1,"639":1,"640":2,"703":4,"1051":4,"1054":3,"1055":3,"1091":1,"1098":1,"1121":1,"1209":3,"1217":1}}],["interrobang",{"2":{"251":1}}],["interfacenameprefix",{"2":{"1212":1}}],["interface",{"2":{"243":2,"695":1,"771":2,"917":1,"1207":1,"1208":1,"1217":1}}],["interval=10s",{"2":{"1066":1}}],["intervalid",{"2":{"661":2}}],["interval间隔任务其实就是使用setinterval定义的任务",{"2":{"660":1}}],["interval间隔任务",{"2":{"660":1}}],["interval间隔时间",{"2":{"660":1}}],["interval",{"2":{"83":4,"660":4,"661":5,"721":1,"728":2,"1066":1,"1159":1,"1209":1}}],["int必须按照关键字进行格式化",{"2":{"83":2}}],["into",{"0":{"77":1},"2":{"77":7,"86":2,"350":1,"964":1}}],["int",{"2":{"36":1,"75":2,"83":2,"86":4,"542":1,"728":1}}],["initconfiguration",{"2":{"1212":1}}],["initcomputed",{"2":{"932":2}}],["init实例方法",{"2":{"954":1}}],["initdata",{"2":{"951":1,"954":2}}],["initdepmarkers",{"2":{"934":1}}],["initwatch",{"2":{"937":2}}],["initscrolllistener",{"2":{"247":2}}],["initstate",{"2":{"239":1,"932":1,"937":1,"954":2}}],["init函数内部首先对传入的options进行了合并",{"2":{"239":1}}],["init方法",{"2":{"239":2}}],["init方法又是从哪来的",{"2":{"239":1}}],["initprovide",{"2":{"239":1}}],["initproxy",{"2":{"239":1}}],["initrender",{"2":{"239":1}}],["initevents",{"2":{"239":1}}],["initlifecycle",{"2":{"239":1}}],["initintersectionobserver",{"2":{"245":2,"247":1}}],["initinternalcomponent",{"2":{"239":1}}],["initinjections",{"2":{"239":1}}],["initialized",{"2":{"621":1,"1214":1}}],["initializer",{"2":{"588":1}}],["initialization",{"2":{"588":2}}],["initial",{"2":{"16":1,"187":2,"190":2,"222":1,"671":1,"944":2,"945":1,"1174":2}}],["initmixin在init",{"2":{"239":1}}],["initmixin",{"2":{"238":2,"239":2}}],["initglobalapi是对vue挂载了全局静态属性及方法",{"2":{"238":1}}],["initglobalapi",{"2":{"238":2}}],["init",{"2":{"98":1,"173":1,"238":2,"239":4,"247":2,"799":1,"801":3,"813":2,"814":2,"815":1,"857":1,"954":2,"1074":1,"1082":1,"1102":1,"1183":2,"1184":1,"1212":1,"1214":2,"1218":2}}],["initalobj",{"2":{"28":2}}],["in",{"2":{"26":1,"60":1,"83":1,"222":1,"247":1,"251":3,"382":1,"583":1,"588":1,"726":1,"736":1,"800":1,"857":3,"860":1,"864":1,"915":1,"920":6,"932":2,"937":1,"956":2,"1045":1,"1051":2,"1103":3,"1107":1,"1131":1,"1139":1,"1157":1,"1178":2,"1179":1,"1184":1,"1191":1,"1225":1}}],["inline",{"2":{"16":1,"17":2,"18":1,"19":1,"102":1,"104":1,"190":1,"350":2}}],["ifriend",{"2":{"1230":1}}],["iframe>",{"2":{"350":1}}],["iframe",{"2":{"350":4}}],["ifnotpresent",{"2":{"1212":1}}],["ifnull",{"2":{"83":4}}],["if25",{"2":{"1090":1}}],["if23",{"2":{"1090":1}}],["ifconfig",{"2":{"1085":1}}],["if为false时",{"2":{"954":1}}],["ifileprop",{"2":{"765":1,"769":1,"770":1}}],["iface",{"2":{"298":1}}],["if=",{"2":{"63":1}}],["if",{"2":{"7":1,"8":1,"9":2,"26":1,"33":3,"40":17,"48":1,"57":1,"60":2,"61":1,"62":4,"64":6,"83":8,"98":9,"132":1,"182":1,"195":2,"196":1,"197":6,"200":6,"201":2,"203":1,"205":4,"222":1,"230":1,"232":4,"233":1,"237":2,"238":1,"239":3,"244":1,"245":6,"247":4,"248":1,"249":1,"339":1,"343":1,"347":2,"354":2,"438":1,"496":1,"510":1,"512":1,"517":1,"520":2,"534":2,"535":2,"546":17,"554":1,"576":2,"583":2,"619":1,"639":1,"645":1,"648":1,"651":1,"674":3,"687":3,"692":1,"695":1,"696":1,"718":1,"726":4,"728":2,"745":2,"746":1,"747":6,"750":6,"751":2,"753":1,"755":4,"765":1,"768":1,"771":7,"772":3,"773":1,"828":1,"868":1,"874":2,"932":10,"934":9,"937":4,"938":10,"939":1,"940":1,"941":6,"942":2,"944":10,"945":7,"951":9,"954":16,"955":10,"956":3,"959":5,"960":1,"961":2,"964":18,"971":1,"1014":1,"1034":1,"1098":2,"1132":8,"1136":1,"1157":1,"1159":1,"1178":3,"1214":1,"1227":2}}],["同一类型的仓库名需要唯一",{"2":{"1098":1}}],["同一个macrotask",{"2":{"532":1}}],["同",{"2":{"729":1}}],["同样注意端口占用",{"2":{"1172":1}}],["同样可以使用get方法",{"2":{"950":1}}],["同样支持glob语法",{"2":{"848":1}}],["同样支持glob匹配",{"2":{"815":1}}],["同样每个节点都需要",{"2":{"728":1}}],["同样的最后两行看到",{"2":{"579":1}}],["同样关于网络配置其前面已经讲述了",{"2":{"420":1}}],["同样这里也是先在源码中指定位置debugger",{"2":{"404":1}}],["同步时区",{"0":{"1204":1}}],["同步任务执行完后先看有没有微任务",{"2":{"532":1}}],["同步和异步",{"0":{"466":1}}],["同步",{"2":{"380":1}}],["同站点使用",{"2":{"347":1}}],["同源策略在",{"2":{"336":1}}],["同源策略是一种安全策略",{"2":{"336":1}}],["同源是指协议",{"2":{"336":1}}],["同css",{"2":{"284":1}}],["同理data更新时也会通知回调再次执行",{"2":{"945":1}}],["同理",{"2":{"141":1,"890":1}}],["同时让自己变得更加强大",{"2":{"1233":1}}],["同时可以运行几个runner",{"2":{"1159":1}}],["同时提供了多种网络模式和网络驱动",{"2":{"1091":1}}],["同时docker网桥作为每个容器的默认网关",{"2":{"1085":1}}],["同时支持",{"2":{"1059":1}}],["同时删除与容器关联的卷",{"2":{"1009":1}}],["同时将自己添加到dep中",{"2":{"954":1}}],["同时watcher的adddep也会执行dep的addsub将watcher添加到当前dep",{"2":{"954":1}}],["同时使用少量的cpu和内存资源",{"2":{"704":1}}],["同时js也从以前浏览器单一的运行时",{"2":{"525":1}}],["同时只能被一个可读流使用",{"2":{"511":1}}],["同时生成soucemap",{"2":{"408":1}}],["同时告知发送方已经接收到丢失数据块的位置",{"2":{"391":1}}],["同时缓冲区会记录这些已发送和未发送的信息",{"2":{"387":1}}],["同时发送icmp报文通知源主机目标不可达",{"2":{"382":1}}],["同时上面提供了上报的地址为",{"2":{"350":1}}],["同时csp",{"2":{"350":1}}],["同时也可以提高容器的可移植性和灵活性",{"2":{"1117":1}}],["同时也能提升你的前端架构思想",{"2":{"991":1}}],["同时也能将错误记录到系统中",{"2":{"408":1}}],["同时也更有利于tree",{"2":{"957":1}}],["同时也要学会调试某个具体功能",{"2":{"948":1}}],["同时也提升了用户体验",{"2":{"784":1}}],["同时也提供了更加优化的异常使用如",{"2":{"636":1}}],["同时也为规范化进行服务",{"2":{"782":1}}],["同时也会检测timer是否有到期",{"2":{"538":1}}],["同时也会对用其他语言转换成js的调试支持",{"2":{"442":1}}],["同时也会通知发送者目的地不可达",{"2":{"368":1}}],["同时也具有地址转换",{"2":{"371":1}}],["同时也支持一些通配符如http",{"2":{"350":1}}],["同时也是最常见的隐式转换",{"2":{"42":1,"548":1}}],["同时",{"2":{"322":1,"727":1,"811":2,"1011":1,"1017":1,"1062":1}}],["同时还能够进行网络地址转换",{"2":{"310":1}}],["同时这些也大体见证着本人的成长过程",{"2":{"252":1}}],["同时塔台作为中介者",{"2":{"208":1,"758":1}}],["同时值为原始值",{"2":{"2":1}}],["同上lastindex例子",{"2":{"153":1,"902":1}}],["同上",{"2":{"8":1,"132":1,"350":2,"400":1,"711":1,"718":1}}],["lgzmt",{"2":{"1217":1}}],["lb04zzyw",{"2":{"1209":1}}],["lv=cl",{"2":{"1202":2}}],["lvm",{"2":{"1202":2}}],["lvs",{"2":{"728":2}}],["lxc",{"2":{"1169":1}}],["ll",{"2":{"1064":1}}],["llksdf",{"2":{"154":1,"903":1}}],["lcov",{"2":{"874":2}}],["lcase",{"2":{"83":1}}],["lf",{"2":{"836":3,"839":2}}],["lft",{"2":{"728":8,"1090":8}}],["l`",{"2":{"728":2}}],["lsmod",{"2":{"1205":2,"1206":1}}],["ls",{"2":{"726":1,"1064":1,"1088":1,"1089":1,"1114":2,"1139":1,"1141":1}}],["ld",{"2":{"708":1,"718":2}}],["lucky",{"2":{"576":3,"577":3}}],["luggage",{"2":{"251":1}}],["l",{"2":{"158":1,"203":2,"728":1,"753":2,"772":1,"951":2,"954":2,"955":4}}],["lp",{"2":{"154":1,"903":1}}],["lkd",{"2":{"154":1,"903":1}}],["ltr",{"2":{"284":1}}],["ltrim",{"2":{"83":1}}],["lt",{"2":{"117":4,"147":2,"149":4,"364":1,"499":1,"830":3,"896":2,"898":4,"917":5,"998":1,"1002":1,"1020":2,"1022":4,"1023":1,"1024":2,"1025":1,"1054":2,"1055":4,"1062":1,"1121":1}}],["lname",{"2":{"83":1}}],["ln",{"2":{"83":1}}],["labels",{"2":{"1121":1,"1122":1}}],["label3=",{"2":{"1057":1}}],["label2=123143",{"2":{"1057":1}}],["label1=xxxxx",{"2":{"1057":1}}],["label使用键值对的方式定义",{"2":{"1057":1}}],["label",{"0":{"1057":1},"2":{"728":1,"1121":1,"1209":1}}],["latentflip",{"2":{"541":1}}],["latency",{"2":{"454":1}}],["latest",{"2":{"97":1,"829":1,"998":1,"999":1,"1012":1,"1056":1,"1065":1,"1082":6,"1093":3,"1108":1,"1146":1,"1157":3,"1159":1}}],["launching",{"2":{"1051":1}}],["launch两种选项",{"2":{"400":1}}],["launch",{"0":{"445":1,"446":1},"1":{"446":1,"447":1,"448":1},"2":{"400":1,"401":2,"404":1,"405":1,"406":1,"771":1,"966":3}}],["laughing",{"2":{"251":1}}],["lax",{"2":{"353":4}}],["layers",{"2":{"703":1,"1051":1,"1054":1,"1055":1,"1209":1}}],["layer",{"2":{"279":1,"309":7,"329":2,"1039":3,"1046":6,"1209":4}}],["layout",{"2":{"63":2,"279":1}}],["layout=",{"2":{"63":1}}],["lantern",{"2":{"251":2}}],["lang=en",{"2":{"1202":1}}],["lang=",{"2":{"110":2,"111":1,"112":1,"222":1,"350":1,"671":1}}],["languages",{"2":{"1121":1}}],["language",{"2":{"26":4,"54":1,"337":2,"347":1,"669":2,"673":1,"674":1,"1076":1}}],["lastname",{"2":{"1100":1}}],["lastshouldtrack",{"2":{"934":1,"964":1}}],["lastmodifieddate",{"2":{"500":1}}],["lastmodified",{"2":{"499":2,"500":1,"695":1}}],["lastelementchild",{"2":{"404":3}}],["last",{"2":{"251":2,"319":1,"337":1,"715":1}}],["lastindex值变为最新匹配的位置",{"2":{"152":1,"901":1}}],["lastindex等等",{"2":{"152":1,"901":1}}],["lastindex",{"2":{"138":1,"152":5,"887":1,"901":5}}],["lazy指令时",{"2":{"245":1}}],["lazy=",{"2":{"243":1,"245":3}}],["lazyopts",{"2":{"243":1,"245":3,"247":1}}],["lazy",{"2":{"243":1,"244":1,"245":8,"247":1,"248":1,"249":2,"932":11,"938":2,"942":1}}],["large",{"2":{"132":1,"251":3}}],["l=16",{"2":{"49":1,"555":1}}],["lo",{"2":{"1090":4}}],["loss",{"2":{"1063":1,"1064":2}}],["loupe",{"2":{"541":1}}],["loudspeaker",{"2":{"251":1}}],["longer",{"2":{"800":1}}],["long",{"2":{"354":1}}],["lorry",{"2":{"251":1}}],["lollipop",{"2":{"251":1}}],["lowcoding",{"0":{"597":1}}],["lower",{"2":{"251":2,"728":3,"797":1,"1085":1,"1090":4}}],["low",{"2":{"251":1}}],["locomotive",{"2":{"251":1}}],["lockfile",{"2":{"1103":1,"1107":1,"1184":1,"1191":1}}],["locked=",{"2":{"1157":3}}],["locked",{"2":{"511":1,"515":1,"1158":1}}],["lock",{"2":{"251":3,"708":2,"718":4,"721":3,"800":1,"1103":2,"1107":2,"1138":1,"1184":1,"1191":1}}],["location中",{"2":{"717":1}}],["location支持全匹配和正则表达式",{"2":{"711":1}}],["location用来匹配server中的访问路径",{"2":{"711":1}}],["location块",{"2":{"709":1}}],["location",{"0":{"711":1},"2":{"128":1,"132":2,"354":1,"709":2,"710":1,"711":1,"715":1,"729":1,"1034":2}}],["localapiendpoint",{"2":{"1212":1}}],["locally",{"2":{"1082":1,"1225":1}}],["localtime",{"2":{"712":1,"1204":1}}],["localprocess",{"2":{"438":1}}],["localstorage",{"2":{"336":1,"864":3}}],["locale",{"2":{"190":1,"339":1,"674":10,"692":2,"724":2}}],["local",{"2":{"69":1,"383":1,"414":1,"418":1,"709":1,"814":1,"994":1,"1054":2,"1055":4,"1088":3,"1089":4,"1114":3,"1142":1,"1208":3,"1212":3}}],["localhostnodeports",{"2":{"1212":1}}],["localhost3次后停止",{"2":{"1063":1}}],["localhost为docker仓库的ip",{"2":{"1039":1}}],["localhost指本机的回环地址",{"2":{"361":1}}],["localhost是一种特殊的主机名",{"2":{"361":1}}],["localhost",{"2":{"56":2,"61":2,"177":1,"182":1,"190":1,"338":1,"342":1,"343":1,"344":2,"347":2,"350":1,"354":2,"361":1,"382":1,"404":3,"405":1,"406":1,"425":1,"436":1,"456":2,"631":1,"655":2,"669":1,"682":1,"709":1,"721":1,"723":1,"878":1,"879":1,"966":1,"1007":1,"1034":1,"1039":4,"1058":2,"1063":4,"1064":4,"1066":2}}],["looking",{"2":{"1051":1}}],["loopback",{"2":{"361":1,"1090":4}}],["loop",{"2":{"251":2,"541":1}}],["loose",{"2":{"190":1}}],["love",{"2":{"251":2}}],["loadnext",{"2":{"772":3,"773":3}}],["loadimage",{"2":{"244":2,"248":1}}],["loading",{"2":{"198":1,"243":6,"244":9,"245":12,"247":3,"249":3,"504":1,"748":1,"962":5}}],["loaded",{"2":{"244":2,"248":1,"728":2,"1082":2}}],["loaderoptions",{"2":{"673":1}}],["loader帮助我们处理静态文件",{"2":{"181":1}}],["loader可以将",{"2":{"180":1}}],["loader的配置",{"2":{"179":1}}],["loader主要用来让我们的项目可以识别lesscss",{"2":{"179":1}}],["loader",{"0":{"178":1,"179":1,"180":1,"181":1},"1":{"179":1,"180":1,"181":1},"2":{"172":1,"178":2,"179":15,"180":5,"181":7,"190":15,"268":1}}],["load",{"2":{"222":1,"244":3,"245":1,"247":1,"248":1,"628":1,"630":1,"632":1,"669":1,"703":4,"1001":1,"1051":4,"1054":3,"1055":3,"1205":1,"1209":1}}],["lodash不需要第三方依赖",{"2":{"190":1}}],["lodash",{"2":{"34":1}}],["logging",{"2":{"1212":1}}],["logger的使用这里不做解释",{"2":{"653":1}}],["loggermiddleware",{"2":{"634":1,"635":3}}],["logger",{"0":{"653":1},"2":{"225":2,"230":3}}],["logrotate",{"2":{"1082":2,"1093":2}}],["logout",{"2":{"1014":1}}],["logs可以很看到内部运行的详细日志",{"2":{"1007":1}}],["logs",{"2":{"1007":3,"1094":1,"1171":2,"1172":3,"1173":1}}],["logs命令用于查看docker容器的日志信息",{"2":{"1007":1}}],["log打印东西来看一些预期结果",{"2":{"404":1}}],["logerror",{"2":{"237":1}}],["login时如果不指明地址默认会登录官方仓库",{"2":{"1014":1}}],["loginpage",{"2":{"232":1}}],["logined",{"2":{"230":1}}],["loginresult",{"2":{"83":1}}],["login",{"2":{"54":1,"316":1,"999":1,"1014":4,"1045":3,"1046":1,"1102":1,"1121":1,"1147":1}}],["log",{"2":{"2":1,"3":1,"4":1,"26":4,"28":2,"29":1,"30":2,"32":2,"33":2,"34":1,"38":1,"48":1,"57":1,"61":1,"64":4,"83":2,"98":16,"145":3,"154":1,"175":2,"195":7,"196":1,"197":2,"199":2,"201":1,"202":1,"203":1,"204":2,"205":4,"206":2,"222":5,"225":1,"228":1,"229":1,"230":2,"233":2,"338":1,"347":1,"350":1,"354":5,"404":6,"455":1,"491":5,"496":1,"497":1,"499":1,"510":2,"512":2,"517":2,"529":1,"532":14,"533":1,"538":4,"539":4,"540":3,"544":1,"554":1,"571":7,"572":6,"573":10,"574":1,"575":3,"576":3,"577":6,"578":3,"579":6,"580":4,"581":6,"582":6,"583":9,"587":8,"588":8,"589":6,"590":1,"591":1,"594":2,"595":2,"606":5,"608":1,"613":7,"614":1,"618":1,"619":1,"624":2,"629":1,"631":1,"634":3,"642":1,"643":1,"645":1,"646":1,"648":1,"660":3,"661":4,"701":2,"702":2,"708":6,"709":7,"718":12,"723":1,"724":1,"745":7,"746":1,"747":2,"749":2,"751":1,"752":1,"753":1,"754":2,"755":4,"756":2,"771":3,"772":2,"828":2,"894":3,"903":1,"930":1,"932":1,"936":1,"943":1,"950":4,"951":13,"955":1,"958":2,"959":3,"960":2,"962":2,"963":2,"1034":3,"1074":2,"1103":2,"1171":2,"1172":1,"1173":1,"1184":1,"1209":1}}],["literaltoprimitive",{"2":{"921":1}}],["litter",{"2":{"251":2}}],["little",{"2":{"150":2,"899":2}}],["licensed",{"2":{"1046":1}}],["license",{"2":{"814":1,"1102":1,"1103":1,"1183":1,"1184":1,"1187":1,"1228":1}}],["li>2",{"2":{"404":1}}],["li>",{"2":{"404":2}}],["li>1",{"2":{"404":1}}],["lifetime",{"2":{"382":1,"457":1}}],["lifecycle",{"2":{"238":1,"621":2,"954":1}}],["lifecyclemixin",{"2":{"238":2,"239":1}}],["live",{"2":{"368":3}}],["li",{"2":{"354":9,"404":9}}],["light",{"2":{"251":4}}],["lighthouse",{"0":{"214":1},"1":{"215":1,"216":1},"2":{"214":1,"215":2}}],["lib下除了",{"2":{"830":1}}],["lib64",{"2":{"708":1,"718":2}}],["lib",{"2":{"707":1,"728":1,"830":1,"1082":1,"1113":1,"1115":1,"1142":1,"1183":3,"1184":3,"1187":2,"1188":1,"1189":3,"1190":1,"1191":4,"1208":2,"1209":1,"1212":2}}],["library",{"2":{"703":3,"1012":3,"1051":3,"1054":3,"1055":3,"1082":1}}],["libra",{"2":{"251":1}}],["liberty",{"2":{"251":1}}],["libs",{"2":{"130":1}}],["lipstick",{"2":{"251":1}}],["lips",{"2":{"251":1}}],["lint",{"2":{"805":9,"818":1,"849":1}}],["linux",{"2":{"785":1,"1082":3,"1087":1,"1093":1,"1164":1,"1195":1,"1198":2,"1202":1,"1203":1,"1209":3,"1217":3}}],["linux几个版本",{"2":{"450":1}}],["linux等多个版本",{"2":{"412":1}}],["links",{"2":{"1046":1,"1230":1}}],["linkid=830387",{"2":{"400":1}}],["link",{"2":{"222":2,"251":1,"309":1,"350":1,"671":1,"708":1,"718":2,"728":3,"1090":4,"1230":1}}],["lines",{"2":{"801":1,"860":1,"864":1,"874":2,"875":1}}],["line>",{"2":{"788":2}}],["lineto",{"2":{"283":1}}],["linewidth",{"2":{"283":1}}],["linecap",{"2":{"283":1}}],["linejoin",{"2":{"283":1}}],["line",{"2":{"16":2,"110":6,"836":1,"860":1,"864":1,"874":2,"875":1,"1035":1,"1209":1}}],["lineheight",{"0":{"16":1},"2":{"11":1,"22":1}}],["limitcore=infinity",{"2":{"1208":1}}],["limitnproc=infinity",{"2":{"1208":1}}],["limitnofile=infinity",{"2":{"1208":1}}],["limit参数限制搜索数",{"2":{"999":1}}],["limit也可以和我们上述的其它语句一起结合使用",{"2":{"90":1}}],["limit",{"0":{"90":1},"2":{"90":2,"181":1,"190":1,"646":2,"683":1,"685":1,"771":9,"772":1,"999":1}}],["like",{"0":{"85":1},"2":{"85":1,"145":6,"150":1,"154":4,"857":3,"894":6,"899":1,"903":4,"1005":1,"1007":1}}],["listed",{"2":{"1214":1}}],["listenstream=",{"2":{"1208":1}}],["listen表示当前虚拟主机监听的端口",{"2":{"710":1}}],["listening",{"2":{"621":1}}],["listen",{"2":{"128":1,"354":1,"382":2,"383":5,"404":1,"455":1,"603":1,"681":1,"709":1,"710":2,"723":1,"1034":2,"1051":4,"1074":1}}],["list里包含了上传过的切片",{"2":{"772":1}}],["list",{"2":{"83":1,"95":2,"222":2,"404":11,"414":2,"606":1,"772":1,"857":1,"1082":1,"1093":1,"1157":3,"1158":1,"1213":1}}],["lisi",{"2":{"26":2}}],["lrm",{"2":{"462":2}}],["lr",{"2":{"17":2}}],["lerna简单的使用命令",{"2":{"814":1}}],["lerna",{"2":{"814":10}}],["len",{"2":{"483":2,"487":1,"770":2,"830":2}}],["length字段中",{"2":{"342":1}}],["length",{"2":{"40":1,"60":3,"61":3,"62":1,"63":1,"83":2,"98":2,"134":1,"195":3,"197":4,"203":1,"237":1,"319":1,"320":1,"342":2,"343":1,"344":1,"367":1,"453":1,"484":1,"485":2,"491":1,"510":1,"517":1,"520":2,"521":2,"546":1,"573":1,"669":1,"687":2,"717":3,"723":1,"729":2,"745":3,"747":4,"753":1,"765":1,"768":1,"771":2,"772":2,"869":1,"932":1,"937":1,"938":1,"940":1,"941":2,"944":1,"951":1,"954":3,"955":2,"956":2,"961":1,"964":3}}],["leve3还没有完全被支持",{"2":{"350":1}}],["levels=1",{"2":{"721":1}}],["level",{"2":{"134":1,"717":3,"1035":6,"1209":1}}],["leo",{"2":{"251":1}}],["leopard",{"2":{"251":1}}],["lemon",{"2":{"251":1}}],["leg",{"2":{"251":1}}],["legacy",{"2":{"190":1}}],["ledger",{"2":{"251":1}}],["leaves",{"2":{"251":1}}],["leaf",{"2":{"251":3}}],["least",{"2":{"83":1,"725":1}}],["less解析语法",{"2":{"847":1}}],["lessbody",{"2":{"179":1}}],["less文件使用postcss",{"2":{"847":1}}],["less文件",{"2":{"179":1}}],["less",{"0":{"179":1},"2":{"179":9,"805":1,"843":1,"846":2,"847":2,"849":2,"850":1}}],["leftwards",{"2":{"251":1}}],["left",{"2":{"12":2,"13":1,"14":1,"15":1,"16":1,"17":1,"61":1,"83":1,"86":3,"111":3,"112":4,"158":2,"162":3,"251":6,"284":1,"462":2,"1082":1}}],["letsencrypt",{"2":{"1178":1}}],["letter",{"2":{"251":1}}],["let",{"2":{"7":1,"8":1,"28":1,"29":1,"30":2,"32":2,"33":1,"40":10,"62":7,"63":2,"195":5,"196":3,"197":7,"198":1,"201":4,"202":1,"203":1,"204":7,"205":7,"206":2,"231":1,"237":2,"239":1,"244":1,"245":1,"249":1,"343":1,"485":1,"510":1,"514":1,"517":1,"521":1,"529":2,"533":1,"534":2,"546":10,"588":4,"589":5,"590":1,"595":2,"674":1,"745":5,"746":3,"747":7,"748":1,"751":4,"752":1,"753":1,"754":7,"755":7,"756":2,"768":1,"770":1,"772":1,"869":1,"932":2,"934":4,"937":1,"938":1,"940":1,"941":2,"944":7,"945":2,"950":1,"951":8,"954":7,"955":5,"959":3,"964":4}}],["ttrpc",{"2":{"1209":1}}],["ttl=128",{"2":{"1218":5}}],["ttl=127",{"2":{"1064":1}}],["ttl=64",{"2":{"1063":3,"1064":3,"1090":6}}],["ttl的默认跳数为64",{"2":{"382":1}}],["ttl的默认值为64",{"2":{"368":1}}],["ttl生存期示意图",{"2":{"368":1}}],["ttl",{"2":{"367":1,"368":2,"382":2,"1212":1}}],["tgz",{"2":{"1108":1,"1208":3}}],["t选项可以指定停止服务的超时时间",{"2":{"1030":1}}],["t选项指定重启次数",{"2":{"1025":1}}],["t>",{"2":{"920":5,"921":1,"934":12,"944":1,"964":1}}],["t051=",{"2":{"727":1}}],["t知道nginx的配置文件路径具体位置",{"2":{"709":1}}],["tz=asia",{"2":{"703":1,"1055":1}}],["tkoenig89",{"2":{"698":1}}],["typha",{"2":{"1217":2}}],["typings",{"2":{"665":1}}],["type>",{"2":{"788":1}}],["typearray",{"0":{"481":1}}],["typemetadatas",{"2":{"232":2}}],["typedecoratorfactory",{"2":{"232":3}}],["types=",{"2":{"879":1}}],["typescriptinterface",{"2":{"1230":1}}],["typescript配置文件",{"0":{"922":1}}],["typescript的静态代码分析工具",{"2":{"826":1}}],["typescript",{"0":{"834":1,"906":1},"1":{"907":1,"908":1,"909":1,"910":1,"911":1,"912":1,"913":1,"914":1,"915":1,"916":1,"917":1,"918":1,"919":1,"920":1,"921":1},"2":{"448":2,"601":1,"602":1,"662":1,"785":1,"814":1,"829":3,"838":1,"840":1,"857":1,"858":2}}],["typescript装饰器模式",{"2":{"224":1}}],["typescript装饰器指南",{"0":{"224":1},"1":{"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1}}],["types",{"2":{"134":1,"243":2,"244":1,"245":1,"658":1,"701":1,"709":1,"717":3,"801":1,"858":2}}],["type=notify",{"2":{"1208":1}}],["type=tmpfs",{"2":{"1116":1}}],["type=volume",{"2":{"1116":1}}],["type=bind",{"2":{"1116":1}}],["type=bridge",{"2":{"994":1}}],["type=",{"2":{"110":2,"111":1,"112":1,"352":2,"354":2,"499":2,"671":1,"765":1,"1034":1}}],["type",{"2":{"40":4,"61":1,"62":1,"200":4,"222":4,"227":1,"228":1,"229":2,"232":2,"243":3,"248":1,"249":1,"317":1,"319":1,"320":1,"337":2,"342":1,"350":2,"400":1,"401":1,"404":1,"405":1,"406":1,"453":1,"454":2,"485":1,"494":2,"495":1,"496":2,"497":1,"499":2,"500":1,"510":2,"520":2,"546":4,"603":1,"646":3,"651":1,"654":1,"656":1,"686":6,"701":1,"709":1,"713":1,"716":1,"718":1,"723":1,"728":1,"729":3,"750":4,"765":1,"769":1,"770":2,"772":2,"788":1,"797":10,"800":2,"801":1,"874":3,"917":1,"920":5,"964":2,"966":1,"994":1,"1034":1,"1122":1,"1209":4,"1218":2}}],["typeerror",{"2":{"7":1,"8":1,"9":1,"40":4,"41":2,"98":1,"232":2,"546":4,"547":2,"576":1,"583":1}}],["typeof",{"2":{"7":1,"8":1,"9":1,"39":2,"98":2,"195":4,"200":4,"232":2,"245":1,"473":2,"545":2,"576":2,"583":1,"631":1,"639":1,"642":1,"645":2,"745":4,"750":4,"915":1,"932":3,"937":1,"938":1,"951":1,"954":3,"960":1}}],["tcptimeout",{"2":{"1212":1}}],["tcpfintimeout",{"2":{"1212":1}}],["tcpestablishedtimeout",{"2":{"1212":1}}],["tcpclosewaittimeout",{"2":{"1212":1}}],["tcp具有慢启动的特征",{"2":{"775":1}}],["tcp具有时延",{"2":{"764":1}}],["tcp不会直接把数据交给上层",{"2":{"456":1}}],["tcp使用确认号来告知对方下一个期望接受的序列号",{"2":{"455":1}}],["tcp里没有源ip和目的ip",{"2":{"455":1}}],["tcp流",{"2":{"451":1}}],["tcp提供了sack",{"2":{"391":1}}],["tcp在传输数据时会将数据分成多段mss大小的数据段并进行编号",{"2":{"387":1}}],["tcp头占用20字节",{"2":{"386":1}}],["tcp的连接由发送syn开始",{"2":{"455":1}}],["tcp的连接需要三个步骤",{"2":{"378":1}}],["tcp的拥塞控制算法通常基于网络拥塞的反馈信息",{"2":{"392":1}}],["tcp的数据可靠传输类似于一问一答的形式",{"2":{"387":1}}],["tcp的延迟确认",{"2":{"382":1}}],["tcp断开需要4步完成",{"2":{"382":1}}],["tcp握手期间虽然没有真实的数据进行传输",{"2":{"378":1}}],["tcp是可靠传输协议",{"2":{"377":1}}],["tcp首部",{"0":{"376":1}}],["tcp作为传输协议",{"2":{"315":1}}],["tcp协议和http协议的分析",{"2":{"460":1}}],["tcp协议和http协议了",{"2":{"458":1}}],["tcp协议是基于字节流面向连接",{"2":{"455":1}}],["tcp协议是基于字节流的传输层协议",{"2":{"375":1}}],["tcp协议等网络协议",{"2":{"454":1}}],["tcp协议等等",{"2":{"307":1}}],["tcp协议的每段最大数据长度通常被称为mss",{"2":{"386":1}}],["tcp协议默认采用延迟确认机制",{"2":{"382":1}}],["tcp协议可以根据网络状态来控制数据的发送速度",{"2":{"375":1}}],["tcp协议可以保证数据的可靠传输",{"2":{"375":1}}],["tcp协议在传输数据之前需要先建立连接",{"2":{"375":1}}],["tcp协议主要负责对数据进行分段",{"2":{"374":1}}],["tcp协议",{"0":{"374":1,"455":1},"1":{"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"456":1,"457":1},"2":{"453":1,"455":1}}],["tcp协议连接过程",{"2":{"312":1}}],["tcp协议中会添加自己的相关信息作为数据的首部",{"2":{"311":1}}],["tcp协议负责数据的可靠传输",{"2":{"310":1}}],["tcp",{"0":{"310":1,"312":1},"2":{"306":1,"307":1,"308":1,"310":1,"312":4,"314":1,"324":5,"357":1,"373":1,"374":1,"380":1,"381":2,"382":3,"383":7,"390":1,"396":1,"449":1,"454":3,"459":1,"709":1,"727":1,"1006":1,"1022":1,"1039":1,"1062":5,"1066":1,"1209":5,"1218":3}}],["tc39",{"2":{"49":1,"555":1}}],["tls会话恢复",{"2":{"726":1}}],["tlsv1",{"2":{"726":4,"727":1}}],["tls版本",{"2":{"726":1}}],["tls加密",{"2":{"706":1}}],["tls1",{"0":{"334":1}}],["tls有很多个版本目前主流的版本为tls1",{"2":{"331":1}}],["tls握手步骤",{"2":{"355":1}}],["tls握手",{"0":{"331":1},"1":{"332":1,"333":1,"334":1}}],["tls协议版本号",{"2":{"333":1}}],["tls协议",{"2":{"329":1}}],["tls",{"0":{"329":1},"2":{"312":1,"328":2,"329":12,"333":2,"334":4,"413":1,"708":1,"727":1,"1121":9,"1157":1,"1158":1,"1159":2,"1209":6}}],["tls等加密协议可以保护web应用程序的通信",{"2":{"303":1}}],["tls连接",{"2":{"276":1}}],["tj",{"2":{"293":1}}],["tmpfs",{"2":{"1111":1}}],["tmp",{"2":{"721":1,"1038":1,"1064":1}}],["tm",{"2":{"251":1}}],["twitter",{"2":{"1230":1}}],["twisted",{"2":{"251":1}}],["tw7nx",{"2":{"1217":1}}],["two",{"2":{"251":4}}],["tv",{"2":{"251":1}}],["tva1",{"2":{"132":1}}],["tue",{"2":{"1063":1}}],["tulip",{"2":{"251":1}}],["turborepo",{"2":{"817":1}}],["turbo是vercel公司推出的一款打包器",{"2":{"817":1}}],["turbo",{"0":{"817":1},"2":{"281":1,"816":1,"817":1}}],["turban",{"2":{"251":1}}],["turtle",{"2":{"251":1}}],["tuple",{"2":{"227":1}}],["tier",{"2":{"1121":1}}],["timing",{"2":{"413":1}}],["time2",{"2":{"1204":2}}],["timed",{"2":{"1132":1}}],["time=3",{"2":{"1218":1}}],["time=34",{"2":{"1064":1}}],["time=1",{"2":{"1090":1,"1218":2}}],["time=0",{"2":{"1063":3,"1064":3,"1090":5,"1218":2}}],["timezone",{"2":{"660":1,"1204":1}}],["timers",{"2":{"538":1,"541":1}}],["timer",{"2":{"343":3,"534":2,"870":1}}],["timeoutforcontrolplane",{"2":{"1212":1}}],["timeouts",{"2":{"1209":1}}],["timeoutsec=0",{"2":{"1208":1}}],["timeout=10s",{"2":{"1066":1}}],["timeout=5",{"2":{"342":1,"343":1,"453":1}}],["timeoutid",{"2":{"661":2}}],["timeout延时任务本质也是使用settimeout定义的任务",{"2":{"660":1}}],["timeout延时任务",{"2":{"660":1}}],["timeout延时时间几种调度任务",{"2":{"660":1}}],["timeout",{"0":{"1133":1},"2":{"317":2,"382":1,"389":1,"660":4,"661":5,"709":1,"721":2,"723":3,"726":3,"1066":1,"1132":2,"1133":1,"1159":1,"1209":6}}],["timeend",{"2":{"199":1,"749":1}}],["time全部为0",{"2":{"130":1}}],["timestamp",{"2":{"83":1,"639":1,"640":1,"646":1,"1121":1}}],["time",{"2":{"62":2,"83":6,"199":1,"230":2,"368":2,"382":1,"383":1,"389":1,"749":1,"860":1,"864":1,"874":1,"875":1,"1132":1,"1225":1}}],["tip",{"2":{"323":1,"328":1,"344":1,"369":1,"411":1,"428":1,"438":1,"450":1,"718":1,"1040":1,"1092":1,"1110":1,"1230":1}}],["tickets",{"2":{"726":2}}],["ticket",{"2":{"251":1}}],["tigera",{"2":{"1217":9}}],["tiger2",{"2":{"251":1}}],["tiger",{"2":{"251":1}}],["tired",{"2":{"251":1}}],["title",{"2":{"239":2,"534":2,"671":1,"675":2,"778":1,"1121":2,"1122":1,"1230":1}}],["title>welcome",{"2":{"712":1}}],["title>xxx",{"2":{"222":1}}],["title>",{"2":{"110":2,"111":1,"112":1,"222":1,"671":2,"712":1}}],["title>bfc的应用",{"2":{"110":2,"111":1,"112":1}}],["taints",{"2":{"1212":1}}],["tail",{"2":{"1007":1}}],["tag",{"2":{"998":3,"999":2,"1000":3,"1002":3,"1038":1,"1039":1,"1046":2,"1053":2,"1108":1,"1121":2,"1157":3,"1158":1,"1184":2}}],["tags",{"0":{"1129":1},"2":{"687":2,"1108":1,"1119":1,"1121":1,"1129":1,"1139":1,"1184":1,"1190":1}}],["tar+gzip",{"2":{"1209":1}}],["tar+gzip+encrypted",{"2":{"1209":1}}],["tar+encrypted",{"2":{"1209":1}}],["tarball",{"2":{"1103":3,"1108":1,"1189":2}}],["tar文件",{"2":{"1001":1}}],["tar",{"2":{"718":3,"1001":2,"1010":11,"1060":1,"1209":3}}],["target=",{"2":{"1116":1}}],["targetmap",{"2":{"959":4,"961":1,"964":3}}],["target进行收集",{"2":{"932":1}}],["target为当前计算属性的watcher",{"2":{"932":1}}],["target为true时执行watcher",{"2":{"932":1}}],["target变成上一个watcher",{"2":{"932":1}}],["targetstack",{"2":{"954":5}}],["targets",{"2":{"858":1}}],["targets中配置localhost",{"2":{"399":1}}],["targetdefaults来配置打包的流程",{"2":{"818":1}}],["targetdefaults",{"2":{"818":1}}],["target里会发现node的debugger",{"2":{"399":1}}],["targetvalidators",{"2":{"232":3}}],["target",{"2":{"177":1,"182":1,"190":1,"228":4,"229":10,"230":3,"231":3,"232":7,"245":1,"404":3,"454":2,"496":1,"579":2,"581":2,"707":1,"765":1,"768":1,"772":1,"773":1,"932":4,"951":7,"954":11,"955":2,"956":9,"958":5,"959":14,"960":5,"961":2,"964":28,"1122":3,"1136":1,"1208":4}}],["taurus",{"2":{"251":1}}],["taxi",{"2":{"251":2}}],["tangerine",{"2":{"251":1}}],["tanabata",{"2":{"251":1}}],["tada",{"2":{"251":1}}],["takephoto",{"2":{"204":6,"754":6}}],["task在html标准中并没有明确定义",{"2":{"532":1}}],["task",{"2":{"531":2,"532":3,"659":1,"880":1,"1209":2}}],["taskqueue",{"2":{"195":9,"745":9}}],["tasksmax=infinity",{"2":{"1208":1}}],["tasksrunneroptions",{"2":{"818":1}}],["taskschedulemodule",{"2":{"659":1}}],["taskschedulecontroller",{"2":{"659":2,"660":3}}],["tasksource",{"2":{"532":1}}],["tasksource和macrotask",{"2":{"532":1}}],["tasks",{"2":{"195":15,"541":1,"745":15,"818":1,"1082":1,"1132":1,"1209":1}}],["tab的加载按钮就停止了",{"2":{"276":1}}],["tabs",{"2":{"251":1,"830":1}}],["tab",{"2":{"160":1,"161":2,"163":2,"836":1}}],["tables",{"2":{"74":1}}],["table>",{"2":{"18":2}}],["table",{"0":{"18":1,"19":1},"2":{"11":2,"19":1,"22":3,"63":3,"75":2,"76":2,"86":2,"104":2,"998":1}}],["taobao",{"2":{"97":2,"218":2,"1190":1}}],["txtdist",{"2":{"841":1}}],["txtnode",{"2":{"827":1}}],["txt打开",{"2":{"97":1}}],["txt",{"2":{"97":1,"316":1,"344":1,"499":1,"521":2,"696":1,"848":1,"1059":1,"1065":3}}],["t",{"2":{"83":1,"139":2,"161":1,"163":1,"225":2,"228":3,"229":2,"233":3,"368":1,"634":4,"675":1,"703":1,"708":2,"888":2,"917":5,"920":11,"921":3,"934":4,"944":2,"964":6,"1000":1,"1008":1,"1014":1,"1030":1,"1051":1,"1054":1,"1055":1,"1063":2,"1068":1,"1069":2,"1073":1,"1074":1,"1132":1,"1208":1,"1227":1}}],["technical",{"2":{"1227":1}}],["techniques",{"2":{"698":2}}],["termination",{"2":{"621":1}}],["terminal",{"0":{"444":1}}],["tee",{"2":{"512":1,"1205":2}}],["temp",{"2":{"708":10,"718":20,"721":1,"1209":1}}],["temporary",{"2":{"317":1}}],["templates",{"2":{"1142":1}}],["template>",{"2":{"207":4,"245":2,"757":4,"929":2,"930":2,"934":2,"936":2,"943":2}}],["template里都进行了简单的说明",{"2":{"126":1}}],["template",{"2":{"125":1,"176":1,"190":2,"236":1,"239":1,"602":1,"606":1,"624":1,"703":2,"954":13,"971":2,"998":1,"1142":2,"1209":1}}],["template项目骨架集成的",{"2":{"125":1}}],["tell",{"2":{"454":1}}],["telnet",{"2":{"312":1,"379":2}}],["telescope",{"2":{"251":1}}],["telephone",{"2":{"251":2}}],["tencentyun",{"2":{"1083":1}}],["tense",{"2":{"800":1}}],["ten",{"2":{"251":1}}],["tent",{"2":{"251":2}}],["tennis",{"2":{"251":1}}],["teardown",{"2":{"938":2,"940":3}}],["tea",{"2":{"251":1}}],["teal",{"2":{"179":1}}],["test2",{"2":{"1141":2}}],["testmatch",{"2":{"857":1}}],["testenvironmentoptions",{"2":{"875":1}}],["testenvironment",{"2":{"857":2}}],["tests",{"2":{"800":2,"857":1,"859":1,"860":2,"863":1,"864":3,"866":1,"867":1,"869":1,"874":2,"875":2,"879":1,"1143":2}}],["testcontroller",{"2":{"652":1}}],["testing",{"2":{"632":1,"669":2,"851":2,"857":2,"883":1,"1157":2,"1159":1,"1190":1}}],["testins",{"2":{"606":1,"608":2,"624":1}}],["test类也不需要",{"2":{"606":1}}],["test1",{"2":{"83":1,"1141":1}}],["test",{"2":{"54":1,"60":2,"64":1,"83":4,"138":1,"139":1,"144":6,"145":1,"153":3,"179":1,"180":1,"181":1,"187":1,"190":5,"237":2,"344":1,"350":1,"404":1,"606":9,"608":3,"624":4,"639":1,"651":1,"665":6,"687":1,"695":1,"696":1,"697":1,"708":1,"718":2,"726":2,"789":1,"797":1,"800":1,"801":2,"818":1,"830":2,"841":2,"857":8,"859":2,"860":3,"864":3,"869":1,"870":2,"874":2,"875":8,"877":1,"879":1,"887":1,"888":1,"893":6,"894":1,"902":3,"938":1,"1102":1,"1103":11,"1107":1,"1108":5,"1125":4,"1127":1,"1141":3,"1143":2,"1178":2,"1184":2}}],["text|json",{"2":{"651":1}}],["textcontent",{"2":{"514":1,"521":2}}],["textdecoder",{"2":{"491":2}}],["textencoder",{"2":{"491":1}}],["textencoder例子",{"2":{"491":1}}],["textwizard",{"2":{"431":1}}],["textbaseline",{"2":{"284":1}}],["textalign",{"2":{"284":1}}],["text",{"2":{"16":2,"17":3,"18":1,"19":1,"61":1,"110":2,"111":1,"112":1,"134":2,"284":2,"337":1,"347":1,"354":1,"494":2,"496":5,"497":1,"499":2,"716":2,"717":3,"875":1,"1034":1}}],["tsuser",{"2":{"955":1}}],["tsusestaticassets",{"2":{"695":1}}],["tsobject",{"2":{"949":1}}],["tsordinarytoprimitive",{"2":{"40":1,"546":1}}],["tsvue",{"2":{"938":1,"939":1,"940":1}}],["tswatcheffect",{"2":{"945":1}}],["tswatch",{"2":{"937":1}}],["tstype",{"2":{"920":2,"921":1}}],["tstoprimitive",{"2":{"40":1,"546":1}}],["ts识别路径映射",{"2":{"861":1}}],["ts|tsx|js|jsx",{"2":{"858":3}}],["tsmodule",{"2":{"797":3,"827":1,"828":2,"829":2,"830":2,"831":3,"840":1,"845":1,"846":1,"847":1}}],["tsfetch",{"2":{"770":1}}],["tsfunction",{"2":{"33":1,"576":1,"581":1,"771":1,"960":1,"961":1,"962":1}}],["ts➜",{"2":{"703":1}}],["ts类型",{"2":{"665":1}}],["tsintro",{"2":{"931":1,"950":1}}],["tsinterface",{"2":{"611":1}}],["tsimport",{"2":{"244":1,"245":1,"603":1,"604":1,"607":1,"611":2,"612":1,"613":4,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"622":1,"632":1,"637":1,"639":1,"640":3,"642":1,"643":4,"645":1,"646":1,"648":2,"651":1,"652":1,"655":1,"659":1,"660":3,"661":1,"681":1,"697":1,"700":1,"702":1,"858":1,"870":1,"874":1,"875":1}}],["tsdeclare",{"2":{"611":1,"615":1,"616":1,"617":1}}],["tsdocument",{"2":{"338":1}}],["tspipeto",{"2":{"512":1}}],["tspipethrough",{"2":{"512":1}}],["tsreader",{"2":{"496":1}}],["tsblob",{"2":{"496":2}}],["tsbqhd",{"2":{"245":1}}],["tsnew",{"2":{"479":1,"483":1,"487":1,"494":1,"499":1,"510":1,"514":1}}],["tssetcookie",{"2":{"353":1}}],["tsasync",{"2":{"692":1,"772":1}}],["tsapp",{"2":{"350":1,"643":1,"692":1,"695":3,"696":1,"697":1}}],["tsadxqa",{"2":{"350":1}}],["tsl也经历多个版本的迭代",{"2":{"329":1}}],["tsl可以说https",{"2":{"328":1}}],["tshirt",{"2":{"251":1}}],["tscomputed",{"2":{"932":1}}],["tsconfig",{"2":{"665":4,"703":4,"858":1,"863":2}}],["tsconstructor",{"2":{"637":1}}],["tsconst",{"2":{"485":1,"491":1,"496":1,"497":2,"499":1,"503":1,"510":1,"516":1,"517":1,"656":1,"687":1,"688":2,"701":1,"768":1,"772":1,"773":1,"839":1,"857":1,"932":1,"938":1,"941":1,"950":1,"951":2,"959":1,"960":1,"962":1,"963":1}}],["tscwbd",{"2":{"249":1}}],["tsclass",{"2":{"247":1,"248":2,"249":1,"955":1,"963":1}}],["tsexport",{"2":{"248":1,"249":1,"686":2,"765":1,"869":1,"870":1,"874":1,"932":3,"934":1,"938":2,"941":1,"942":1,"945":1,"955":1,"956":1,"971":1}}],["ts7e29",{"2":{"245":1}}],["ts也是无法知道参数是否必填",{"2":{"232":1}}],["ts不会智能的推导出tostring方法",{"2":{"228":1}}],["tsx|ts",{"2":{"879":1}}],["tsximport",{"2":{"229":1,"875":1}}],["tsxtype",{"2":{"228":1,"229":1,"230":1,"232":1}}],["tsx",{"2":{"225":1,"228":1,"230":1,"231":1,"232":1,"233":1,"234":1,"520":1,"765":1,"805":1,"849":2,"875":2,"879":1,"882":1}}],["ts",{"2":{"83":2,"243":3,"244":2,"245":1,"343":1,"344":1,"347":2,"350":1,"483":1,"491":2,"494":1,"497":1,"499":1,"507":1,"512":1,"514":1,"520":1,"521":1,"603":2,"605":2,"606":6,"608":1,"609":2,"624":1,"626":1,"628":2,"629":2,"630":1,"631":1,"634":2,"635":1,"638":1,"640":2,"645":1,"646":3,"654":2,"661":3,"665":14,"666":1,"667":1,"669":3,"671":2,"673":1,"674":2,"675":1,"683":1,"685":1,"686":1,"687":1,"700":1,"701":1,"769":2,"770":1,"771":2,"773":1,"825":1,"831":1,"838":1,"841":1,"848":1,"857":2,"858":1,"859":2,"860":2,"862":2,"863":4,"864":3,"865":1,"866":2,"867":2,"868":1,"869":2,"873":2,"874":4,"875":7,"879":1,"880":3,"932":4,"934":2,"937":1,"944":1,"950":1,"951":1,"954":7,"955":3,"958":1,"959":1,"964":4}}],["tolerate",{"2":{"1209":1}}],["tolocaleuppercase",{"2":{"249":1}}],["tologin",{"2":{"230":2,"232":2}}],["tolowercase",{"2":{"61":1,"232":1,"692":1}}],["torefs",{"2":{"963":2,"964":1}}],["torefs主要用来解决对象解构后不再响应式的问题",{"2":{"963":1}}],["toraw",{"2":{"934":1,"964":1}}],["tohavelength",{"2":{"869":1}}],["tobecalled",{"2":{"870":2}}],["tobe",{"2":{"859":2,"864":1,"866":2,"867":1,"868":1,"869":3,"874":1,"875":1}}],["toblob",{"2":{"497":1}}],["todo",{"2":{"648":1,"674":1}}],["todataurl",{"2":{"497":1}}],["toisostring",{"2":{"639":1}}],["toilet",{"2":{"251":1}}],["tofixed",{"2":{"514":1,"521":2,"634":1}}],["to需要配合reporting",{"2":{"350":1}}],["to代替",{"2":{"350":1}}],["tools",{"2":{"414":1,"430":1,"713":2}}],["too",{"2":{"317":1}}],["tower",{"2":{"251":1}}],["tokyo",{"2":{"251":1}}],["token过期处理",{"0":{"1216":1}}],["token=huzudsos4wfnsgfubi6j",{"2":{"1189":1}}],["token可以从具体项目中获取也可以从gitlab全局获取",{"2":{"1155":1}}],["token用来连接gitlab和runner",{"2":{"1154":1}}],["token等技术",{"2":{"346":1}}],["token加密",{"2":{"64":1}}],["token",{"2":{"64":4,"320":1,"350":4,"353":1,"1121":5,"1155":1,"1157":4,"1158":1,"1159":1,"1187":2,"1190":2,"1212":2,"1214":6,"1215":2,"1216":1}}],["token和自定义验证合法性",{"0":{"64":1}}],["token的私钥",{"2":{"54":1}}],["tongue",{"2":{"251":4}}],["tomldisabled",{"2":{"1209":1}}],["toml",{"2":{"707":1,"836":1,"1126":1,"1159":3,"1177":1,"1209":4}}],["tomato",{"2":{"251":1}}],["tom",{"2":{"207":2,"571":3,"573":2,"574":2,"575":2,"577":5,"578":2,"587":2,"757":2}}],["tougher",{"2":{"169":1}}],["touppercase",{"2":{"38":1,"517":1,"544":1,"634":1}}],["total会收集当前的activeeffect也就是render函数",{"2":{"934":1}}],["totallength",{"2":{"514":3}}],["total=",{"2":{"63":1}}],["total",{"2":{"63":5,"83":1,"237":2,"825":3,"860":3,"864":3,"874":3,"875":3,"934":3,"951":3,"994":1,"1064":1,"1103":1,"1121":1,"1189":1,"1203":1}}],["to",{"0":{"854":1,"991":1},"2":{"40":3,"41":3,"83":3,"222":2,"239":1,"350":1,"352":1,"368":3,"379":1,"438":1,"462":2,"546":3,"547":3,"588":1,"703":2,"707":1,"709":1,"712":1,"727":1,"800":3,"801":1,"851":1,"857":9,"876":1,"1014":3,"1039":1,"1045":1,"1046":2,"1051":3,"1054":2,"1055":2,"1056":1,"1082":1,"1098":3,"1103":1,"1132":3,"1157":1,"1177":2,"1179":3,"1214":3,"1223":1,"1227":3}}],["tostring方法",{"2":{"48":1,"554":1}}],["tostring方法也可以将包装类型转换为基础类型字符串形式",{"2":{"39":1,"545":1}}],["tostring",{"2":{"33":2,"40":19,"154":1,"228":4,"232":1,"354":1,"546":19,"576":2,"874":1,"903":1,"951":1,"958":1}}],["tophat",{"2":{"251":1}}],["top发生了重叠",{"2":{"110":1}}],["topnav",{"2":{"54":1}}],["toprivate",{"2":{"231":2}}],["toprimitive证明",{"2":{"40":1,"546":1}}],["toprimitive方法",{"2":{"40":1,"546":1}}],["toprimitive属性",{"2":{"40":1,"546":1}}],["toprimitive规则",{"2":{"40":1,"546":1}}],["toprimitive",{"0":{"40":1,"546":1},"2":{"40":3,"49":1,"546":3,"555":1}}],["topromitive属性",{"2":{"40":2,"546":2}}],["top",{"2":{"12":2,"13":1,"14":1,"15":1,"201":1,"247":2,"251":1,"284":1,"751":1,"1035":6}}],["td>",{"2":{"18":1}}],["td",{"2":{"18":1}}],["trend",{"2":{"251":2}}],["tree",{"2":{"139":1,"140":1,"251":5,"279":1,"888":1,"889":1,"1107":1,"1142":1,"1188":2}}],["trolleybus",{"2":{"251":1}}],["trollface",{"2":{"251":2}}],["trophy",{"2":{"251":1}}],["tropical",{"2":{"251":2}}],["triggered",{"2":{"1121":1}}],["triggereffect机制完成依赖收集和派发更新",{"2":{"934":1}}],["triggereffect",{"2":{"934":2,"964":3}}],["triggereffects",{"2":{"934":1,"964":2}}],["triggeroptypes",{"2":{"964":3}}],["triggerrefvalue",{"2":{"934":2}}],["trigger",{"0":{"1144":1},"2":{"879":1,"959":2,"961":1,"964":3,"1121":2,"1144":1}}],["triggering",{"2":{"621":1}}],["trip",{"2":{"389":1,"1063":1,"1064":2}}],["triangle",{"2":{"251":2}}],["triangular",{"2":{"251":2}}],["trident",{"2":{"251":1}}],["triumph",{"2":{"251":1}}],["trim",{"2":{"61":1,"83":1,"836":2,"971":1}}],["trandition",{"2":{"404":1}}],["transmitted",{"2":{"1063":1,"1064":2}}],["transmission",{"2":{"357":1,"374":1,"386":1}}],["transitiongroup",{"2":{"972":1}}],["transition",{"2":{"972":1}}],["transient",{"2":{"606":2,"625":1}}],["transparency",{"2":{"718":1}}],["transparent",{"2":{"494":1}}],["transport",{"2":{"309":1,"329":1,"350":2}}],["transferring",{"2":{"703":3,"1051":3,"1054":2,"1055":2}}],["transfermessage",{"2":{"702":1}}],["transfer并设置对应的参数amount和to",{"2":{"352":1}}],["transfer",{"2":{"315":1,"319":1,"343":2,"352":1,"517":2}}],["transformer",{"0":{"646":1},"2":{"646":2}}],["transformoptions",{"2":{"643":2,"646":1}}],["transformstream",{"0":{"517":1},"2":{"512":2,"517":2}}],["transform的translate属性也可以设置百分比",{"2":{"15":1}}],["transform",{"0":{"15":1},"2":{"11":1,"15":1,"22":1,"180":2,"190":1,"280":1,"286":1,"512":1,"517":3,"521":1,"643":2,"645":1,"646":4,"857":1,"858":3}}],["translation",{"2":{"370":1}}],["translations",{"2":{"270":1}}],["translate3d",{"2":{"521":2}}],["translate",{"2":{"15":1,"286":1}}],["trailingcomma",{"2":{"839":1}}],["trailing",{"2":{"836":2}}],["trailer",{"2":{"319":1}}],["train2",{"2":{"251":1}}],["train",{"2":{"251":1,"1122":1}}],["traverse",{"0":{"256":1},"2":{"941":8,"944":1}}],["traffic选择from",{"2":{"439":1}}],["traffic",{"2":{"251":2}}],["tracing",{"2":{"1209":2}}],["tracked",{"2":{"964":1}}],["trackeffects",{"2":{"964":2}}],["trackoptypes",{"2":{"964":2}}],["trackopbit",{"2":{"934":1,"964":1}}],["track",{"2":{"959":2,"960":1,"964":2}}],["trackrefvalue",{"2":{"934":1}}],["tractor",{"2":{"251":1}}],["trace",{"2":{"233":12,"320":1,"1121":1}}],["tramway",{"2":{"251":1}}],["tram",{"2":{"251":1}}],["tray",{"2":{"251":2}}],["trying",{"2":{"379":1}}],["try",{"2":{"98":6,"230":1,"404":1,"639":1,"771":2,"868":1,"934":1,"941":1,"964":1}}],["trusted",{"2":{"1011":1,"1158":1}}],["trunc",{"2":{"1006":1}}],["truncate",{"2":{"83":1}}],["truck",{"2":{"251":1}}],["trumpet",{"2":{"251":1}}],["true",{"2":{"36":1,"38":2,"39":3,"40":1,"41":16,"43":1,"44":3,"46":3,"47":5,"48":2,"62":1,"64":1,"83":1,"131":1,"132":2,"138":1,"139":1,"144":4,"152":2,"153":2,"154":1,"176":2,"177":2,"182":3,"187":4,"188":1,"190":17,"195":1,"196":1,"201":1,"205":5,"239":1,"244":1,"269":2,"285":1,"344":1,"347":2,"350":1,"354":1,"401":1,"496":1,"512":1,"542":1,"544":2,"545":3,"546":1,"547":16,"549":1,"550":3,"552":3,"553":5,"554":2,"571":3,"572":3,"573":18,"575":1,"576":1,"577":1,"579":1,"581":1,"582":1,"612":1,"618":1,"629":1,"642":1,"643":6,"645":1,"646":2,"648":2,"686":2,"703":1,"745":1,"746":1,"751":1,"755":5,"770":1,"771":1,"801":1,"813":1,"814":1,"827":1,"828":3,"829":4,"832":2,"836":3,"838":4,"839":1,"840":2,"843":1,"845":1,"847":1,"857":2,"868":2,"873":1,"874":1,"887":1,"888":1,"893":4,"901":2,"902":2,"903":1,"932":7,"934":5,"938":3,"941":1,"942":1,"944":1,"950":4,"951":6,"954":5,"959":1,"962":1,"964":2,"1034":2,"1074":1,"1121":13,"1122":1,"1130":1,"1136":2,"1141":1,"1157":3,"1177":1,"1209":6,"1212":2}}],["tr>",{"2":{"18":2}}],["tbody>",{"2":{"18":2}}],["tb",{"2":{"17":1}}],["that",{"2":{"800":5,"857":3,"1103":1}}],["thank",{"2":{"1227":1}}],["than",{"2":{"150":2,"169":1,"899":2}}],["throttle和配置throttle",{"2":{"420":1}}],["throttle",{"2":{"414":1}}],["throttling",{"2":{"414":1}}],["throw",{"2":{"7":1,"8":1,"9":1,"40":5,"41":2,"64":1,"98":1,"195":1,"203":1,"232":2,"382":1,"404":1,"473":1,"520":1,"546":5,"547":2,"576":1,"583":1,"637":1,"640":2,"645":1,"745":1,"753":1,"857":1}}],["threads",{"2":{"708":1,"718":2}}],["thread",{"2":{"423":1}}],["three",{"2":{"251":1}}],["threshold",{"2":{"245":1,"1209":3}}],["thought",{"2":{"169":1,"251":1}}],["there",{"2":{"800":1,"1132":2}}],["theme",{"2":{"222":2}}],["the",{"2":{"97":1,"118":1,"139":3,"140":1,"222":4,"238":1,"621":2,"708":1,"709":1,"800":7,"857":7,"888":3,"889":1,"944":1,"1035":1,"1039":1,"1046":1,"1051":1,"1098":2,"1103":3,"1132":11,"1157":1,"1179":1,"1208":1,"1214":7,"1217":2,"1225":3,"1227":1}}],["then比较都不是真",{"2":{"83":1}}],["then块将以else块结束",{"2":{"83":1}}],["then块",{"2":{"83":1}}],["then",{"2":{"40":4,"57":2,"64":2,"83":17,"98":14,"222":1,"237":2,"244":1,"248":1,"516":1,"532":5,"538":2,"540":1,"546":4,"724":1,"726":3,"728":2,"866":1,"1034":2,"1178":3,"1214":3}}],["think",{"2":{"1227":1}}],["third",{"2":{"49":1,"110":2,"555":1}}],["this实例上获取",{"2":{"932":1}}],["this可以获取到计算属性的原因",{"2":{"932":1}}],["this指向",{"2":{"572":2}}],["this",{"2":{"2":4,"7":2,"8":2,"9":9,"60":8,"61":1,"63":17,"98":22,"195":16,"197":3,"198":1,"199":1,"201":2,"204":7,"205":8,"207":1,"228":1,"229":4,"230":3,"231":3,"232":3,"233":7,"238":6,"239":3,"244":19,"245":14,"247":12,"248":12,"249":4,"404":1,"572":2,"573":2,"575":1,"576":3,"577":5,"578":4,"580":6,"581":2,"582":8,"583":21,"606":3,"608":1,"629":1,"631":1,"648":1,"661":10,"695":1,"745":16,"747":3,"748":1,"749":1,"751":2,"754":7,"755":8,"757":1,"770":1,"771":33,"800":2,"929":4,"930":2,"931":2,"932":22,"934":18,"938":28,"940":5,"941":7,"942":5,"943":1,"951":14,"954":35,"955":14,"956":1,"963":4,"964":5,"1045":1,"1098":3,"1103":2,"1107":1,"1184":1,"1191":1,"1217":2,"1225":1,"1227":1}}],["thisarg代表若干个参数列表",{"2":{"3":1,"4":1}}],["thisarg",{"2":{"1":3,"2":2,"3":1,"4":1}}],["thumbsdown",{"2":{"251":1}}],["thumbsup",{"2":{"251":1}}],["thu",{"2":{"40":1,"546":1,"723":1,"1082":2}}],["3pnzuukdsupk7f0gzgwqxh4rfpzvvfhs+6brpkma9oxnsyybmb0l9ndh5+bw2ibrgygs91uxwoqwijjhgfo9cg==",{"2":{"1108":1}}],["3次就会停止",{"2":{"1064":1}}],["3次后停止",{"2":{"1063":1}}],["3次挥手",{"2":{"382":1}}],["3s内检查代码变动就会执行runner",{"2":{"1159":1}}],["3s",{"2":{"1051":2,"1054":1,"1209":1}}],["369",{"2":{"1189":1}}],["36",{"2":{"1005":2,"1007":2,"1218":3}}],["365",{"2":{"726":2,"1178":2}}],["37",{"2":{"1236":1}}],["37行",{"2":{"954":2}}],["377",{"2":{"382":1}}],["3来保护数据的安全性和隐私性",{"2":{"727":1}}],["3等",{"2":{"361":1}}],["3中增加了0",{"2":{"334":1}}],["3中取消了不必要的消息",{"2":{"334":1}}],["3相较于tls",{"2":{"334":1}}],["3握手",{"0":{"334":1}}],["3还处于实验阶段",{"2":{"327":1}}],["3在早期的实现中存在一些问题",{"2":{"327":1}}],["3协议",{"2":{"327":1}}],["3的握手协议只有两个往返",{"2":{"334":1}}],["3的缺点",{"2":{"327":1}}],["3的优点",{"2":{"327":1}}],["3的值",{"2":{"48":1,"554":1}}],["3作为底层安全传输协议",{"2":{"327":1}}],["3最大的不同在于底层传输协议的改变",{"2":{"327":1}}],["3基于quic协议进行开发",{"2":{"327":1}}],["3️⃣",{"2":{"251":1}}],["3`",{"2":{"145":2,"894":2}}],["3d9d929e9d34",{"2":{"1088":1,"1089":1}}],["3d9d929e9d34b4c776d993158c3bd8c6074fea2e1de0ab43c846e571c1191711",{"2":{"994":1}}],["3d渲染",{"2":{"526":1}}],["3d",{"2":{"139":1,"888":1}}],["333",{"2":{"1121":1}}],["3338838225",{"2":{"456":1}}],["33mb",{"2":{"998":1}}],["33196端口和80端口已经处于断开但还在time",{"2":{"383":1}}],["33196",{"2":{"382":3,"383":1}}],["3306",{"2":{"231":1}}],["3373",{"2":{"131":2}}],["33",{"2":{"86":1,"298":1,"454":1,"825":1,"1208":2}}],["340",{"2":{"1064":1}}],["34",{"2":{"1064":3}}],["345",{"2":{"141":3,"890":3}}],["34323432",{"2":{"83":1}}],["34234",{"2":{"83":1}}],["356",{"2":{"1208":1}}],["35行",{"2":{"583":1}}],["35",{"2":{"62":1,"1007":2,"1064":2}}],["30日下午收拾好工位也就离开了公司",{"2":{"1233":1}}],["306m",{"2":{"1203":1}}],["30m",{"2":{"1133":1}}],["305",{"2":{"1103":1}}],["305行",{"2":{"964":1}}],["30",{"2":{"660":1,"723":1,"1064":1,"1212":1,"1214":1,"1217":1,"1232":1}}],["30执行",{"2":{"660":1}}],["307",{"2":{"317":1}}],["302临时重定向",{"2":{"715":1}}],["302",{"2":{"317":1,"716":1}}],["301永久重定向",{"2":{"715":1}}],["301",{"2":{"317":1,"718":1}}],["304",{"2":{"132":2,"317":1,"1005":1}}],["300",{"2":{"350":1,"1198":1,"1202":1,"1217":3}}],["300到399表示重定向",{"2":{"317":1}}],["3000",{"2":{"190":1,"405":1,"603":1,"655":2,"681":1,"682":1,"1122":1}}],["30000",{"2":{"130":1}}],["3001服务",{"2":{"404":1}}],["3001",{"2":{"61":2,"404":1}}],["300px=2",{"2":{"111":1}}],["300px",{"2":{"12":2,"16":1,"111":1,"112":1}}],["30px",{"2":{"61":1}}],["38ms",{"2":{"325":1}}],["384x384",{"2":{"222":1}}],["384",{"2":{"222":1}}],["38",{"2":{"61":1,"454":1,"1005":1,"1208":1}}],["324",{"2":{"485":1}}],["32编码的标记",{"2":{"462":1}}],["32bit",{"2":{"454":1}}],["32",{"2":{"60":1,"61":2,"131":1,"485":1,"646":1}}],["314",{"2":{"1064":4}}],["312314",{"2":{"144":1,"893":1}}],["31",{"2":{"41":1,"360":1,"547":1}}],["3987",{"2":{"139":1,"888":1}}],["39",{"2":{"28":1}}],["3+",{"2":{"22":8}}],["3",{"0":{"30":1,"327":1,"727":1},"2":{"2":1,"3":1,"4":1,"26":2,"29":1,"30":2,"32":2,"33":3,"34":1,"40":13,"44":2,"48":2,"60":2,"61":1,"75":1,"77":1,"78":1,"83":4,"86":4,"93":1,"95":1,"97":1,"98":2,"111":1,"130":1,"137":1,"139":4,"140":7,"141":2,"145":1,"150":1,"152":1,"162":1,"180":1,"195":1,"205":1,"297":1,"321":1,"329":4,"331":1,"404":2,"410":1,"414":2,"419":1,"422":1,"453":2,"454":15,"483":1,"491":2,"494":1,"529":1,"546":13,"550":2,"554":2,"571":1,"589":1,"594":1,"606":2,"634":2,"652":2,"703":1,"726":2,"727":2,"728":4,"745":1,"755":1,"771":2,"772":1,"800":3,"801":2,"825":3,"859":2,"886":1,"888":4,"889":7,"890":2,"894":1,"899":1,"901":1,"951":1,"955":2,"957":1,"965":2,"994":3,"998":2,"1002":4,"1006":1,"1012":4,"1018":1,"1020":1,"1023":1,"1024":2,"1025":1,"1034":1,"1039":8,"1046":2,"1051":1,"1057":2,"1063":3,"1064":7,"1074":1,"1090":9,"1107":2,"1108":4,"1121":6,"1122":1,"1159":1,"1173":1,"1178":1,"1184":1,"1189":1,"1190":1,"1191":1,"1208":5,"1209":2}}],["2m",{"2":{"1217":9}}],["2msl",{"2":{"382":1}}],["2msl时间段后客户端正式进入closed状态",{"2":{"457":1}}],["2msl时间",{"2":{"382":1}}],["2msl是从client接收到server的fin报文后发送ack报文开始计算的",{"2":{"382":1}}],["27d",{"2":{"1217":3}}],["27行",{"2":{"577":1}}],["2台worker节点命名",{"2":{"1199":1}}],["2台worker节点进行搭建",{"2":{"1196":1}}],["2g",{"2":{"1196":1,"1203":1}}],["2c",{"2":{"1196":1}}],["2h",{"2":{"1133":1}}],["2发现是可以访问到nginx页面",{"2":{"1084":1}}],["2为基础镜像",{"2":{"1070":1}}],["2s",{"2":{"1055":1,"1209":1}}],["2split1",{"2":{"140":2,"889":2}}],["2b",{"2":{"1006":1,"1051":1,"1054":1,"1055":1}}],["294",{"2":{"1064":1}}],["29",{"2":{"1064":6}}],["29=",{"2":{"727":1}}],["290",{"2":{"723":1}}],["2中",{"2":{"727":1}}],["2中主流的加密算法",{"2":{"333":1}}],["2使用了帧的概念来分割请求和响应",{"2":{"727":1}}],["2使用二进制协议",{"2":{"727":1}}],["2使用多路复用技术",{"2":{"727":1}}],["2需要在nginx版本1",{"2":{"727":1}}],["21",{"2":{"720":1,"1054":1,"1055":2,"1082":1}}],["2>",{"2":{"718":2,"726":1}}],["2^8",{"2":{"482":1}}],["2表示应答",{"2":{"454":1}}],["2本机局域网地址",{"2":{"453":1}}],["2状态",{"2":{"382":1}}],["2位可以划分3个子网",{"2":{"364":1}}],["24356769",{"2":{"1208":2}}],["24网段",{"2":{"1200":1}}],["246",{"2":{"1090":2}}],["2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f",{"2":{"1082":1}}],["2456e983eb9e37e47538f59ea18f2043c9a73640",{"2":{"1082":1}}],["248",{"2":{"1064":1}}],["248行",{"2":{"964":1}}],["247行",{"2":{"964":1}}],["24上需要划分2个64位主机",{"2":{"364":1}}],["24",{"2":{"342":1,"343":1,"347":2,"640":1,"713":1,"728":6,"994":1,"1090":1,"1121":1,"1207":2,"1208":1,"1217":1}}],["24h0m0s",{"2":{"1212":1}}],["24h",{"2":{"132":2}}],["2简化了一半",{"2":{"334":1}}],["2在握手阶段做出了以下的改变",{"2":{"334":1}}],["2的rsa握手和dh握手",{"2":{"331":1}}],["2的基础上进一步优化",{"2":{"327":1}}],["2和tls1",{"2":{"331":1}}],["2不兼容",{"2":{"327":1}}],["2相比",{"2":{"327":1}}],["2头压缩算法",{"2":{"326":1}}],["2基于spdy协议进行了扩展和改进",{"2":{"323":1}}],["2字节",{"2":{"297":3}}],["2d",{"2":{"282":1,"497":1}}],["2️⃣",{"2":{"251":1,"965":1}}],["264",{"2":{"1103":1}}],["26t10",{"2":{"994":4}}],["26",{"2":{"230":1,"364":3,"708":1,"1005":1,"1007":2,"1194":1,"1211":4,"1212":1,"1214":1,"1217":7}}],["226",{"2":{"1064":2}}],["22t07",{"2":{"646":1}}],["22t06",{"2":{"640":1}}],["224",{"2":{"438":1,"439":1}}],["22端口和65308端口保持连接",{"2":{"383":1}}],["22",{"2":{"383":2,"453":1,"454":2,"707":1,"708":2,"718":4,"723":1,"1051":1,"1082":2,"1090":1,"1130":1,"1171":2,"1172":1,"1173":1,"1217":1}}],["2222",{"2":{"190":1}}],["22版本的dmg安装包",{"2":{"68":1}}],["2`",{"2":{"145":2,"894":2}}],["2之间的数字",{"2":{"144":1,"893":1}}],["280",{"2":{"1189":1}}],["28行已经证明了引用",{"2":{"577":1}}],["28",{"2":{"139":1,"720":1,"888":1,"1063":1,"1064":4}}],["2k",{"2":{"134":1,"708":1,"717":1}}],["25bcde10511ed5f253bdf2761f86a92d62959847",{"2":{"1189":1}}],["254",{"2":{"1085":1}}],["253",{"2":{"364":1}}],["25380611",{"2":{"280":1}}],["255地址",{"2":{"365":1}}],["255",{"2":{"359":9,"360":7,"364":6,"365":2,"482":1,"485":1,"728":3,"1085":5,"1090":4}}],["25",{"2":{"343":1,"383":1,"1217":2}}],["256m",{"2":{"1173":1}}],["256x256",{"2":{"222":1}}],["256",{"2":{"222":1,"333":1,"489":1,"1064":2}}],["25px",{"2":{"110":2}}],["250m",{"2":{"1177":1}}],["250",{"2":{"83":1}}],["2说明是从第一条开始查询",{"2":{"90":1}}],["2+2",{"2":{"83":2}}],["2+3",{"2":{"83":1,"111":2}}],["208b",{"2":{"1103":1}}],["20行",{"2":{"583":1,"954":1}}],["20=1460字节",{"2":{"386":1}}],["206",{"2":{"317":1,"344":1,"520":1}}],["2048",{"2":{"726":1}}],["204",{"2":{"317":1,"339":2,"724":2,"1034":1}}],["20px",{"2":{"284":1}}],["2018",{"2":{"329":1}}],["201",{"2":{"317":1,"347":1}}],["2017",{"2":{"222":2,"708":1}}],["20150623",{"2":{"708":1}}],["2015",{"2":{"193":1,"541":1,"720":1}}],["2019",{"2":{"60":1,"62":1,"64":1,"1228":1}}],["20",{"2":{"62":1,"63":1,"75":1,"344":2,"386":1,"729":1,"839":2,"1084":1,"1131":1,"1179":1,"1217":3,"1218":4}}],["2000",{"2":{"661":1}}],["2008",{"2":{"329":1}}],["2006",{"2":{"329":1}}],["200到299表示成功",{"2":{"317":1}}],["200元定金预购",{"2":{"205":2,"755":2}}],["200元定金的用户可以收到50元的优惠券",{"2":{"205":1,"755":1}}],["200px+300px",{"2":{"111":1}}],["200px",{"2":{"111":3,"112":2}}],["200302",{"2":{"83":1}}],["200",{"2":{"57":1,"62":1,"132":2,"181":1,"190":1,"245":2,"317":1,"325":3,"342":1,"343":1,"350":1,"404":1,"453":1,"520":1,"614":2,"639":1,"651":1,"652":1,"655":2,"692":1,"716":2,"721":1,"723":2,"1007":1,"1034":1,"1074":1,"1094":1}}],["2022",{"2":{"453":1,"454":1}}],["2023年08月30日是我在qooapp的最后一天",{"2":{"1233":1}}],["2023年08月18日星期五",{"2":{"1232":1}}],["2023",{"2":{"342":1,"343":1,"347":2,"723":1,"1082":3}}],["202",{"2":{"317":1}}],["2020",{"2":{"41":1,"44":1,"49":1,"547":1,"550":1,"555":1,"640":1,"646":1,"728":1,"994":4,"1005":1,"1007":2,"1063":1,"1208":1}}],["2021",{"2":{"40":1,"245":2,"249":1,"546":1,"1064":6}}],["2返回的却是数字2",{"2":{"40":1,"546":1}}],["232",{"2":{"491":1}}],["230",{"2":{"491":3}}],["235",{"2":{"298":1}}],["23",{"2":{"40":1,"298":1,"546":1,"994":4,"1063":1,"1082":3,"1236":1}}],["2",{"0":{"29":1,"33":1,"323":1},"1":{"324":1,"325":1,"326":1},"2":{"2":1,"3":1,"4":1,"9":1,"26":2,"29":1,"30":2,"32":2,"33":4,"34":1,"40":27,"44":6,"47":4,"48":3,"77":1,"78":3,"83":7,"84":1,"86":3,"90":2,"93":1,"95":1,"98":2,"130":3,"139":3,"140":7,"141":5,"144":1,"145":3,"150":1,"154":3,"162":1,"169":1,"179":1,"187":2,"190":2,"199":1,"203":1,"205":2,"231":1,"251":1,"285":1,"297":1,"321":1,"324":3,"325":1,"326":2,"329":5,"361":1,"368":1,"381":1,"400":1,"404":2,"419":1,"453":1,"454":2,"483":1,"485":1,"494":1,"504":1,"514":1,"521":2,"538":1,"546":27,"550":6,"553":4,"554":3,"571":2,"587":1,"588":1,"589":2,"594":1,"602":1,"606":2,"634":2,"652":2,"655":2,"702":1,"703":3,"721":3,"726":2,"728":4,"729":1,"749":1,"753":1,"755":2,"771":1,"793":1,"797":4,"801":1,"814":2,"830":1,"831":1,"836":1,"859":2,"860":1,"864":1,"869":1,"888":3,"889":7,"890":5,"893":1,"894":3,"899":1,"903":3,"954":1,"955":4,"956":1,"966":1,"994":3,"999":1,"1007":1,"1051":1,"1054":3,"1055":3,"1064":4,"1070":1,"1074":1,"1084":2,"1090":9,"1103":5,"1107":1,"1108":1,"1121":5,"1122":1,"1132":2,"1148":2,"1159":1,"1178":1,"1179":1,"1184":1,"1195":2,"1203":2,"1209":1,"1217":6}}],["1接下来k8s会创建calico的相关组件",{"2":{"1217":1}}],["1接着",{"2":{"182":1}}],["1接着创建一个demo数据库",{"2":{"72":1}}],["1编译",{"2":{"1208":1}}],["1编写dockerfile",{"2":{"1073":1}}],["1加载",{"2":{"1206":1}}],["1同步时区",{"2":{"1204":1}}],["1同样的每个阶段都是以from开始",{"2":{"1070":1}}],["1永久关闭",{"2":{"1203":1}}],["1版本",{"2":{"1184":1}}],["1版本为例",{"2":{"718":1}}],["1后续内容同上",{"2":{"1173":1}}],["1通常出现以下情况启动成功",{"2":{"1172":1}}],["1e1b4617ad8377a9b60029362215f35cc298c2d8d1c7fa5d1691d164795872c9",{"2":{"1114":1}}],["1以上是通过配置文件的形式进行初始化k8s集群的",{"2":{"1214":1}}],["1以本人为例以上镜像大小有200mb大小",{"2":{"1074":1}}],["1以本人为例以上镜像大小只有22",{"2":{"1073":1}}],["1以前",{"2":{"184":1}}],["1支持本地dockerfile文件",{"2":{"1069":1}}],["1在这个命令中",{"2":{"1068":1}}],["1次就停止",{"2":{"1064":1}}],["1然后运行容器",{"2":{"1063":1}}],["1然后在上面的基础上添加devserver",{"2":{"177":1}}],["1运行容器",{"2":{"1063":1,"1073":1,"1074":1}}],["1可以在构建时使用",{"2":{"1054":1}}],["1用于强制停止由docker",{"2":{"1032":1}}],["1用于停止并删除由docker",{"2":{"1031":1}}],["1用于停止由docker",{"2":{"1030":1}}],["1用于启动docker",{"2":{"1029":1}}],["1用于构建docker镜像",{"2":{"1028":1}}],["1退出后同样会删除$home",{"2":{"1014":1}}],["1options",{"2":{"1008":1}}],["1其中options",{"2":{"1014":1}}],["1其中",{"2":{"1004":1,"1005":1,"1007":1,"1009":1,"1025":1,"1055":1,"1062":1}}],["1其他用法",{"2":{"717":1}}],["1watcheffect原理很简单内部主动会执行一次回调函数",{"2":{"945":1}}],["1对于jestv28+以上版本还需要添加以下配置",{"2":{"875":1}}],["1这种方式的使用比较简单",{"2":{"1184":1}}],["1这里package",{"2":{"1102":1}}],["1这里过滤选项不需要记下来",{"2":{"453":1}}],["1这样就可以解决esmodule语法不识别的问题",{"2":{"858":1}}],["1或者在package",{"2":{"849":1}}],["1或http",{"2":{"729":1}}],["1插件名通常包含两种形式",{"2":{"831":1}}],["1创建pnpm",{"2":{"815":1}}],["1初始化项目",{"2":{"815":1}}],["1给某个子包安装其他的子包",{"2":{"814":1}}],["1定义workspaces字段",{"2":{"814":1}}],["1由于npm无法提高依赖的重复使用",{"2":{"813":1}}],["1执行命令",{"2":{"813":1}}],["1执行完后会在",{"2":{"806":1}}],["1依赖安装",{"2":{"813":1}}],["1添加babel配置",{"2":{"880":1}}],["1添加完后在",{"2":{"805":1}}],["1添加配置",{"2":{"181":1}}],["1修改commitizen的规则路径",{"2":{"801":1}}],["1当执行以上命令后",{"2":{"800":1}}],["1最终会产生如下文件",{"2":{"726":1}}],["1mb",{"2":{"1051":1}}],["1m",{"2":{"721":1,"768":1,"772":1}}],["1h",{"2":{"721":1,"726":1}}],["1如果原来是使用yum安装的nginx",{"2":{"718":1}}],["1如果配置没有错误的话",{"2":{"179":1}}],["1k",{"2":{"717":2}}],["1设置用户名和密码",{"2":{"713":1}}],["1设置yum存储库",{"2":{"707":1}}],["1本人使用的是arm架构的centos进行安装的",{"2":{"707":1}}],["1g",{"2":{"703":1,"1074":1}}],["1模拟场景使用",{"2":{"701":1}}],["1使用",{"2":{"696":1,"697":1}}],["1此方法也提供了可选的参数",{"2":{"695":1}}],["1此外",{"2":{"180":1}}],["1时代表已经上传过了",{"2":{"772":1}}],["1时",{"2":{"646":1}}],["1时传输数据时都会携带大量的头部信息",{"2":{"326":1}}],["1配置npm脚本打开cypress",{"2":{"877":1}}],["1配置commitlint",{"2":{"802":1}}],["1配置模板引擎",{"2":{"671":1}}],["1配置",{"2":{"632":1}}],["1例子",{"2":{"611":1,"615":1,"616":1,"617":1,"1056":1,"1057":1,"1065":1}}],["1指令才可以被执行",{"2":{"586":1}}],["1underlyingsink包括以下属性",{"2":{"514":1}}],["1underlyingsource包括以下属性",{"2":{"510":1}}],["1d",{"2":{"720":1}}],["1destination表示一个可写流wriablestream对象",{"2":{"512":1}}],["1domparser是个domparser对象",{"2":{"116":1}}],["1transformstream是由可读流和可写流组成的",{"2":{"512":1}}],["1输入框获取",{"2":{"499":1}}],["1构造函数方式类似于blob的构造函数",{"2":{"499":1}}],["1实例属性方法",{"2":{"479":1}}],["1表示请求",{"2":{"454":1}}],["1和mac地址00",{"2":{"454":1}}],["1和boolean",{"2":{"36":1,"542":1}}],["1所以可以抓到包了",{"2":{"425":1}}],["1默认会开启",{"2":{"384":1}}],["1状态",{"2":{"382":1}}],["1ipv6的主要特点如下",{"2":{"366":1}}],["1ipv6地址中也可以使用双冒号",{"2":{"366":1}}],["1地址",{"2":{"365":1}}],["1个128为主机",{"2":{"364":1}}],["1位可以划分2个子网",{"2":{"364":1}}],["1💡使用nodejs简单的示范一下范围请求",{"2":{"344":1}}],["1s返回一次",{"2":{"343":1}}],["1s是个xmlserializer对象",{"2":{"120":1}}],["17h",{"2":{"1217":2}}],["171b",{"2":{"1189":1}}],["177b",{"2":{"703":1}}],["177",{"2":{"703":1}}],["175",{"2":{"491":1}}],["175790383",{"2":{"83":1}}],["172",{"2":{"360":2,"1084":3,"1085":6,"1090":18,"1212":1,"1217":1,"1218":3}}],["17",{"2":{"347":1,"367":1,"580":3,"582":2,"583":2,"703":1,"723":1,"994":1,"1084":5,"1085":8,"1121":1,"1217":1}}],["176",{"2":{"325":1}}],["138gb",{"2":{"994":1}}],["135行",{"2":{"954":1}}],["1350618",{"2":{"423":1}}],["137行",{"2":{"932":1}}],["13s",{"2":{"864":1}}],["139",{"2":{"491":3}}],["136us",{"2":{"325":1}}],["13",{"2":{"325":1,"354":1,"723":1,"1121":20,"1122":2}}],["13行高亮部分",{"2":{"40":1,"546":1}}],["1更差",{"2":{"324":1}}],["1更加高效和快速",{"2":{"323":1}}],["1中的队头阻塞问题",{"2":{"323":2}}],["1中会复用同一个tcp连接",{"2":{"322":1}}],["1的缺点是队头阻塞",{"2":{"322":1}}],["1仍然是web开发中的重要组成部分",{"2":{"322":1}}],["1也支持多种请求方法和响应状态码",{"2":{"322":1}}],["1能够更加高效地传输数据",{"2":{"322":1}}],["1是目前应用最广泛的http协议版本之一",{"2":{"322":1}}],["1b",{"2":{"298":1}}],["1字节",{"2":{"297":2}}],["1属性与方法",{"2":{"282":1}}],["1️⃣",{"2":{"251":1,"965":1}}],["1参数",{"2":{"228":1,"229":1,"232":1}}],["1406",{"2":{"1082":1}}],["140z",{"2":{"640":1}}],["1453e55d41100b57f5f76ed036f65276e311db36c4f3e9afd3fce49a25c4f8b8",{"2":{"1002":1}}],["1454",{"2":{"383":1}}],["141行",{"2":{"954":1}}],["149",{"2":{"491":1}}],["1460",{"2":{"369":1,"386":1}}],["143",{"2":{"352":3}}],["142",{"2":{"350":1}}],["14",{"2":{"218":1,"1070":2,"1121":8,"1122":1,"1170":1}}],["1现在我们稍微改造下我们的配置代码",{"2":{"190":1}}],["1现在我们可以看出多了image文件夹",{"2":{"181":1}}],["1现在用一个正则来解决",{"2":{"137":1,"886":1}}],["1我们在以上的配置中",{"2":{"179":1}}],["1打包后会多出index",{"2":{"176":1}}],["1为了方便输入打包口令",{"2":{"175":1}}],["1完成后当我们访问blog",{"2":{"128":1}}],["1返回值是domstring类型",{"2":{"121":1}}],["1返回值基于",{"2":{"117":1}}],["1规定满足下列css声明之一的元素便会生成bfc",{"2":{"104":1}}],["1规范中的一个概念",{"2":{"102":1}}],["1先查下表里的数据",{"2":{"84":1}}],["1~4",{"2":{"83":1}}],["1~12",{"2":{"83":1}}],["1~366",{"2":{"83":1}}],["1~31",{"2":{"83":1}}],["1~7",{"2":{"83":1}}],["191",{"2":{"1064":1}}],["198",{"2":{"1063":2}}],["19行",{"2":{"581":1}}],["196",{"2":{"383":1,"1063":1}}],["194",{"2":{"298":1}}],["192x192",{"2":{"222":1}}],["192",{"2":{"222":2,"298":5,"350":1,"352":2,"360":2,"364":6,"368":4,"379":3,"383":2,"414":2,"419":1,"438":1,"453":1,"454":7,"713":3,"723":1,"724":1,"728":12,"1005":1,"1007":4,"1014":1,"1039":7,"1045":5,"1046":6,"1047":3,"1102":2,"1103":2,"1107":2,"1108":1,"1122":1,"1157":2,"1159":1,"1171":1,"1172":1,"1173":1,"1176":1,"1183":1,"1184":2,"1187":2,"1190":2,"1191":2,"1200":3,"1212":1,"1217":3,"1218":1}}],["1999",{"2":{"329":1}}],["19990330",{"2":{"83":1}}],["199802",{"2":{"83":1}}],["19",{"2":{"64":2,"453":1,"1082":5}}],["15b",{"2":{"1189":1}}],["152",{"2":{"1063":1}}],["155",{"2":{"999":1}}],["158行",{"2":{"944":1}}],["153",{"2":{"703":1}}],["15再乘4为60字节",{"2":{"376":1}}],["151",{"2":{"83":1}}],["1500",{"2":{"369":1,"386":1,"702":1,"728":3,"1085":1,"1090":2}}],["150",{"2":{"83":1}}],["15",{"2":{"63":1,"154":1,"195":1,"245":2,"249":1,"325":1,"745":1,"903":1,"994":3,"998":2,"1002":4,"1005":2,"1006":1,"1007":1,"1012":4,"1039":8,"1046":2,"1051":2,"1054":2,"1055":2,"1057":2,"1121":8,"1122":2}}],["1577836799999",{"2":{"43":1,"549":1}}],["1页显示多少条",{"2":{"63":1}}],["10h",{"2":{"1217":1}}],["10s",{"2":{"1209":1}}],["108s",{"2":{"1107":1}}],["103mb",{"2":{"998":2,"1002":3,"1006":1,"1012":1}}],["10个",{"2":{"771":1}}],["10次时",{"2":{"715":1}}],["10行",{"2":{"572":1}}],["104519418",{"2":{"410":1}}],["109",{"2":{"325":1}}],["102",{"2":{"317":1,"1200":1,"1217":1,"1218":1}}],["10248",{"2":{"1212":1}}],["1024",{"2":{"62":2,"181":1,"190":1,"497":2,"520":2,"709":1,"768":2,"1121":1,"1209":1}}],["101",{"2":{"317":1,"354":1,"1200":1,"1217":1}}],["10m",{"2":{"132":2,"721":1,"726":2}}],["10px",{"2":{"110":2}}],["10",{"2":{"60":1,"62":1,"63":1,"64":1,"77":1,"83":3,"86":2,"96":1,"137":2,"152":1,"197":1,"230":2,"298":1,"343":1,"344":1,"347":3,"360":2,"379":5,"383":2,"454":1,"483":2,"520":1,"529":1,"534":1,"573":2,"578":2,"646":2,"648":1,"683":1,"685":1,"713":3,"715":1,"723":2,"724":1,"728":15,"747":1,"770":2,"771":3,"772":1,"886":2,"901":1,"929":1,"950":1,"951":2,"958":1,"959":2,"960":2,"1005":2,"1007":7,"1014":2,"1039":14,"1045":10,"1046":12,"1047":6,"1051":3,"1064":4,"1082":1,"1102":4,"1103":4,"1107":4,"1108":2,"1121":34,"1122":1,"1157":4,"1159":2,"1171":2,"1172":4,"1173":2,"1176":2,"1183":2,"1184":4,"1187":4,"1190":4,"1191":4,"1200":5,"1209":1,"1212":4,"1214":1,"1217":5,"1218":22}}],["100ms",{"2":{"1209":1}}],["10046b8bc4b9",{"2":{"1095":1}}],["10020",{"2":{"879":1}}],["100644",{"2":{"800":4}}],["10010",{"2":{"383":1,"724":2,"966":2,"1034":6}}],["10001",{"2":{"350":1,"352":2,"723":2,"1074":4}}],["1000",{"2":{"188":1,"190":1,"228":2,"229":1,"230":1,"343":1,"347":1,"380":1,"533":1,"634":1,"660":2,"661":1,"728":3,"865":1,"870":1,"1022":1,"1090":2}}],["1000~9999",{"2":{"83":1}}],["10000回车后",{"2":{"438":1}}],["10000时",{"2":{"436":1}}],["10000访问页面",{"2":{"354":1}}],["10000000000",{"2":{"533":1}}],["1000000000",{"2":{"354":1}}],["10000000",{"2":{"137":2,"886":2}}],["10000",{"2":{"62":1,"338":1,"342":1,"343":1,"344":2,"347":1,"350":1,"352":4,"354":3,"721":1}}],["100abc",{"2":{"41":2,"547":2}}],["100",{"2":{"17":1,"41":6,"247":1,"251":1,"285":3,"317":1,"344":2,"510":1,"514":2,"516":1,"520":1,"521":3,"547":6,"718":3,"728":1,"771":1,"801":1,"860":8,"874":2,"875":8,"994":1,"1082":1,"1121":1,"1200":2,"1208":1,"1209":1,"1212":1,"1214":1,"1217":1}}],["100px",{"2":{"12":2,"850":1}}],["1查看结果",{"2":{"48":3,"554":3}}],["1fri",{"2":{"44":1,"550":1}}],["1function",{"2":{"44":1,"550":1}}],["1a1aklk2b2bp",{"2":{"153":1,"902":1}}],["1as可以省略",{"2":{"82":1}}],["1a",{"2":{"43":2,"549":2}}],["16777216",{"2":{"1209":2}}],["16384",{"2":{"1209":1}}],["163",{"2":{"1083":1,"1090":1}}],["169",{"2":{"800":1}}],["1691",{"2":{"383":1}}],["16或utf",{"2":{"462":1}}],["165535字节",{"2":{"367":1,"369":1}}],["168",{"2":{"298":5,"350":1,"352":3,"360":2,"364":10,"368":4,"379":5,"383":2,"414":2,"419":1,"422":1,"438":1,"439":1,"453":2,"454":14,"713":3,"723":1,"724":1,"728":17,"1005":1,"1007":4,"1014":1,"1039":7,"1045":5,"1046":6,"1047":3,"1102":2,"1103":2,"1107":2,"1108":1,"1122":1,"1157":2,"1159":1,"1171":1,"1172":2,"1173":1,"1176":1,"1183":1,"1184":2,"1187":2,"1190":2,"1191":2,"1200":5,"1212":1,"1214":1,"1217":3,"1218":1}}],["16",{"2":{"41":2,"60":1,"62":1,"134":1,"201":2,"360":1,"485":1,"534":1,"547":2,"703":3,"717":3,"751":2,"998":1,"1064":1,"1070":2,"1084":1,"1085":2,"1090":2,"1148":1,"1170":1,"1190":1,"1212":1,"1214":1,"1217":1}}],["1609459200000",{"2":{"40":1,"546":1}}],["16px",{"2":{"16":1}}],["12初始配置文件会生成如下配置模板",{"2":{"1212":1}}],["12需要以上的脚本复制到每个节点上",{"2":{"1208":1}}],["12同步时间",{"2":{"1204":1}}],["12本人使用以上关闭selinux后重启机器会很慢",{"2":{"1202":1}}],["12永久关闭",{"2":{"1202":1}}],["12版本升级",{"2":{"1198":1}}],["12或者在package",{"2":{"1102":1}}],["12尽管entrypoint支持两种形式的写法",{"2":{"1064":1}}],["12注意",{"2":{"1063":1}}],["12指明该容器运行是会监听容器中的80端口",{"2":{"1062":1}}],["12volume支持多个挂载点",{"2":{"1061":1}}],["12例子",{"2":{"1060":1}}],["12复制文件也支持设置指定的用户和权限组",{"2":{"1059":1}}],["12run支持两种执行形式",{"2":{"1058":1}}],["12编辑",{"2":{"1039":1}}],["12除了docker",{"2":{"1009":1}}],["12除了手动设置外还可以将tsconfig中的path直接作为路径映射",{"2":{"863":1}}],["12来从源码看看$mount的执行位置",{"2":{"954":1}}],["12对cypress进行配置",{"2":{"880":1}}],["12会生成nx",{"2":{"818":1}}],["12创建turbo配置文件",{"2":{"817":1}}],["12在package",{"2":{"813":1}}],["12在实际中mss的值通常都是1448比1460少了12个字节",{"2":{"386":1}}],["12上面安装后便会在根目录下生成",{"2":{"804":1}}],["12上面代码定义了一个名为run的普通函数",{"2":{"587":1}}],["12接下来进行nginx配置",{"2":{"713":1}}],["12配置开机启动",{"2":{"707":1}}],["12使用expressapi处理和这个是一样的",{"2":{"695":1}}],["12定义路由鉴权守卫",{"2":{"648":1}}],["12一个需要id参数的pipe",{"2":{"645":1}}],["12这里做一个http错误捕获处理格式",{"2":{"639":1}}],["12这样cat",{"2":{"605":1}}],["12这段代码很简单定时器在1s后打印settimeout",{"2":{"533":1}}],["12多次执行以上代码会发现打印顺序并不固定",{"2":{"539":1}}],["12node端进行返回请求数据",{"2":{"520":1}}],["12看下抓包情况",{"2":{"456":1}}],["1211",{"2":{"383":1}}],["129",{"2":{"364":1}}],["126",{"2":{"364":1}}],["12以上是定义content",{"2":{"350":1}}],["12当使用ctrl",{"2":{"1005":1}}],["12当页面有了相关cookie后",{"2":{"347":1}}],["12当服务器收到对应的范围请求后头部也会标识对应的范围字段和整体大小",{"2":{"344":1}}],["120",{"2":{"298":1,"839":1}}],["12参数",{"2":{"230":1}}],["128x128",{"2":{"222":1}}],["128",{"2":{"222":1,"364":2,"380":1}}],["12px",{"2":{"179":1}}],["1271",{"2":{"344":1}}],["1270",{"2":{"344":1}}],["127",{"2":{"128":1,"132":2,"359":1,"361":1,"382":2,"383":3,"726":2,"1063":4,"1064":4,"1090":2,"1178":2,"1209":1,"1212":1}}],["125",{"2":{"97":1}}],["12288",{"2":{"1064":1}}],["1229",{"2":{"383":2}}],["122",{"2":{"83":1,"139":1,"723":1,"888":1}}],["12",{"2":{"33":2,"40":1,"64":1,"76":1,"77":2,"78":2,"79":1,"80":3,"81":2,"140":5,"141":1,"173":1,"180":1,"218":2,"245":2,"249":1,"298":1,"342":4,"368":4,"381":1,"390":1,"404":1,"496":2,"546":1,"610":1,"629":1,"638":1,"650":1,"658":1,"707":1,"708":1,"726":1,"889":5,"890":1,"994":1,"1004":1,"1009":1,"1014":1,"1057":1,"1058":1,"1060":1,"1062":1,"1064":1,"1082":1,"1083":1,"1090":2,"1102":2,"1121":15,"1122":1,"1133":1,"1134":1,"1172":1,"1174":1,"1187":1,"1198":1,"1202":1,"1209":1,"1212":1,"1213":1,"1214":1,"1215":1,"1217":4}}],["123通过运行以下指令确认以上系统变量在你的",{"2":{"1205":1}}],["123通过上面代码了解到静态属性就是一个函数的普通属性而已",{"2":{"583":1}}],["123执行打印",{"2":{"1184":1}}],["123手动在package",{"2":{"1184":1}}],["123新建一个项目使用当前库",{"2":{"1184":1}}],["123从中看出docker0分配的网络为172",{"2":{"1085":1}}],["123在这个",{"2":{"1065":1}}],["123在package",{"2":{"799":1}}],["123以上指定容器运行程序为ping",{"2":{"1064":1}}],["123以上便是class继承",{"2":{"583":1}}],["123compose文件配置",{"2":{"1024":1}}],["123css",{"2":{"20":1,"21":1}}],["123其中",{"2":{"1020":1}}],["123现在我们来简单实现下ref函数",{"2":{"962":1}}],["123编写测试用例",{"2":{"870":1}}],["123比如定义一个button",{"2":{"850":1}}],["123对于这些工具",{"2":{"831":1}}],["123parseroptions用于提供解析器的选项和配置信息",{"2":{"829":1}}],["123初始化后会生成一个配置文件",{"2":{"814":1}}],["123rules用来配置具体的规则",{"2":{"797":1}}],["123生成dh加密参数",{"2":{"726":1}}],["123安装模块依赖环境",{"2":{"718":1}}],["123ttl的作用有以下几个方面",{"2":{"368":1}}],["123true转换为1",{"2":{"43":1,"549":1}}],["123我们按照上面的简单配置进行打包",{"2":{"175":1}}],["123例子",{"2":{"150":1,"899":1,"1057":1}}],["123jsstr",{"2":{"145":1,"894":1}}],["12314",{"2":{"144":1,"893":1}}],["123采用合适的时机进行资源",{"2":{"131":1}}],["1232",{"2":{"97":1}}],["123undefined转换为nan",{"2":{"43":1,"549":1}}],["123这种方式安装比较简单",{"2":{"1208":1}}],["123这种方式通过设置各个方向的距离都是0",{"2":{"13":1}}],["123这里将master节点命名",{"2":{"1199":1}}],["123这里规定packages下的路径和docs都是子包",{"2":{"815":1}}],["123这里",{"2":{"43":1,"549":1}}],["123",{"2":{"39":3,"41":5,"69":1,"72":1,"73":2,"77":1,"137":1,"138":3,"141":2,"143":1,"152":4,"153":1,"263":1,"350":1,"491":1,"496":1,"499":1,"545":3,"547":5,"603":1,"687":1,"726":1,"728":1,"827":1,"886":1,"887":3,"890":2,"892":1,"901":4,"902":1,"1102":1,"1103":1,"1135":1,"1176":1,"1198":1,"1203":1,"1204":1,"1211":1,"1214":1}}],["1234自定义配置文件",{"2":{"1217":1}}],["1234这里下载压缩包后解压文件",{"2":{"1208":1}}],["1234这里不对vue工具包api过多的解释",{"2":{"875":1}}],["1234由于dockershim",{"2":{"1208":1}}],["1234推送项目到gitlab",{"2":{"1183":1}}],["1234执行后根据提示一步一步填写相关内容",{"2":{"1178":1}}],["1234在你的主机上添加host记录",{"2":{"1176":1}}],["1234在这个",{"2":{"1066":1}}],["1234在vscode中添加调试配置",{"2":{"966":1}}],["1234构建镜像",{"2":{"1063":1}}],["1234其中",{"2":{"1023":1,"1024":1}}],["1234通过docker",{"2":{"1007":1}}],["1234添加全局功能配置",{"2":{"880":1}}],["1234除了上面的问题外还有很多常见的问题如",{"2":{"825":1}}],["1234除了以上的相关配置",{"2":{"688":1}}],["1234更多lerna的配置可以查看官方文档",{"2":{"814":1}}],["1234为了不影响原来的nginx的数据和配置",{"2":{"718":1}}],["1234查看用户名和密码",{"2":{"713":1}}],["1234查看结果",{"2":{"48":1,"554":1}}],["1234配置middleware",{"2":{"634":1}}],["1234例子",{"2":{"611":1,"1066":1}}],["1234上面对settimeout包了一层使其变为iife",{"2":{"594":1}}],["1234从当前作用域指向外层作用域",{"2":{"591":1}}],["1234textdecoder例子",{"2":{"491":1}}],["1234列子",{"2":{"483":1}}],["1234当主机b接受到tcp连接请求时被认为成错误的连接",{"2":{"379":1}}],["1234管理器改",{"2":{"249":1}}],["1234接着先创建缓存器",{"2":{"248":1}}],["1234常用的字符表达式见下表",{"2":{"139":1,"888":1}}],["1234以上在",{"2":{"1202":1}}],["1234以上所有机器均在192",{"2":{"1200":1}}],["1234以上代码打印的值都是5",{"2":{"594":1}}],["1234以上就是关于变量声明",{"2":{"588":1}}],["1234以上就是解决方案",{"2":{"48":1,"554":1}}],["1234以上简单概述了使用webpack代码分割和忽略打包采用cdn引用",{"2":{"130":1}}],["1234右盒子不需要设置overflow",{"2":{"111":1}}],["1234效果",{"2":{"111":1,"112":1}}],["1234转换规则3",{"2":{"44":1,"550":1}}],["1234",{"2":{"28":1,"118":1,"138":1,"141":1,"154":1,"156":1,"182":1,"190":1,"251":1,"269":1,"353":1,"473":1,"652":1,"655":1,"686":1,"708":1,"784":1,"858":1,"882":1,"887":1,"890":1,"903":1,"963":1,"999":2,"1071":1,"1094":1,"1115":1,"1130":1,"1152":1,"1191":1}}],["12345安装calico",{"2":{"1217":1}}],["12345配置containerd",{"2":{"1209":1}}],["12345配置并启动",{"2":{"1171":1}}],["12345临时关闭",{"2":{"1203":1}}],["12345package",{"2":{"1183":1}}],["12345可以使用",{"2":{"1116":1}}],["12345重新安装",{"2":{"1107":1}}],["12345构建镜像重新赋值",{"2":{"1054":1}}],["12345dockerfile",{"2":{"1034":1}}],["12345或者直接使用",{"2":{"877":1}}],["12345添加测试用例",{"2":{"869":1}}],["12345那么可以对jest添加转义器将esmodule模块的代码转换成commonjs就可以了",{"2":{"858":1}}],["12345那么接下来就来创建懒加载器来管理所有的图片管理器",{"2":{"244":1}}],["12345到这里就已经集成完毕了",{"2":{"806":1}}],["12345每次提交可以包含页眉",{"2":{"788":1}}],["12345服务器合并切片",{"2":{"770":1}}],["12345commitlint的配置也包含多种选项",{"2":{"797":1}}],["12345cache",{"2":{"720":1}}],["12345css",{"2":{"17":1}}],["12345页面模板",{"2":{"671":1}}],["12345版本控制支持多种形式的版本设置",{"2":{"654":1}}],["12345存放到当前模块的的controllers中",{"2":{"605":1}}],["12345更多详见mdn",{"2":{"574":1}}],["12345更神奇的是所有水平方向上的css属性",{"2":{"17":1}}],["12345上面执行结果promise和nexttick打印永远在一起",{"2":{"540":1}}],["12345以上打印结果如下",{"2":{"962":1}}],["12345以上的打印顺序永远是setimmediate",{"2":{"539":1}}],["12345以上responseend为",{"2":{"325":1}}],["12345在这个示例中",{"2":{"1025":1}}],["12345在浏览器上打上对应的断点",{"2":{"404":1}}],["12345在执行new操作后",{"2":{"239":1}}],["12345然后再进行打包",{"2":{"179":1}}],["12345来看下面的解释",{"2":{"141":1,"890":1}}],["12345前面说了",{"2":{"126":1}}],["12345",{"2":{"46":1,"77":1,"96":1,"140":1,"154":1,"249":1,"350":1,"381":1,"404":1,"494":1,"552":1,"640":1,"643":1,"676":1,"688":1,"697":1,"717":1,"720":1,"799":1,"804":1,"844":1,"849":1,"889":1,"903":1,"1045":1,"1047":1,"1082":2,"1088":1,"1102":1,"1160":1,"1201":1,"1214":1}}],["12345目前在移动端已经完全可以使用flex了",{"2":{"20":1}}],["123456备份默认旧的containerd配置并生成新的配置文件",{"2":{"1209":1}}],["123456验证helper包",{"2":{"1184":1}}],["123456如果你的gitlab使用的了本地域名和自签证书",{"2":{"1153":1}}],["123456如上代码分别定义了全局变量global和局部变量inner",{"2":{"588":1}}],["123456当使用这个镜像作为基础镜像创建一个新的",{"2":{"1065":1}}],["123456可以通过查看容器列表容器的状态查看启动的容器有没有正常运行",{"2":{"1006":1}}],["123456可以试试吧~",{"2":{"185":1}}],["123456搜索镜像会默认从官方的docker",{"2":{"999":1}}],["123456那么内部是如何实现deep的呢",{"2":{"941":1}}],["123456通常计算属性的set使用也不多也不推荐使用set",{"2":{"931":1}}],["123456通过cli",{"2":{"873":1}}],["123456创建一个简单的button组件",{"2":{"875":1}}],["123456这样在测试文件中就可以使用路径映射降低心智负担",{"2":{"863":1}}],["123456这样对于prettier设置的格式化规则对stylelint也会生效",{"2":{"845":1}}],["123456这种方法就是代码太冗余",{"2":{"18":1}}],["123456注意使用第三方插件需要先安装",{"2":{"831":1}}],["123456根路径安装依赖",{"2":{"814":1}}],["123456正确提交",{"2":{"797":1}}],["123456提交信息不能为空",{"2":{"797":1}}],["123456因为typearray位uint8array所以和arraybuffer的字节长度一致",{"2":{"491":1}}],["123456💡有趣的是处于time",{"2":{"382":1}}],["123456总的来说两个队列并不是很大",{"2":{"380":1}}],["123456range请求需要服务端的支持才可以",{"2":{"344":1}}],["123456图片管理器考虑到自身状态的维护",{"2":{"244":1}}],["123456生产环境可以使用",{"2":{"183":1}}],["123456以上便是加法的隐式转换",{"2":{"44":1,"550":1}}],["1234567构建镜像",{"2":{"1074":1}}],["1234567通过运行容器时使用",{"2":{"1064":1}}],["1234567在运行时通过",{"2":{"1061":1}}],["1234567配置完后要重启后台进程",{"2":{"1039":1}}],["1234567添加测试用例",{"2":{"875":1}}],["1234567添加git",{"2":{"805":1}}],["1234567执行测试用例",{"2":{"874":1}}],["1234567以上配置指定了构建以nginx",{"2":{"1051":1}}],["1234567以上配置好了后重新vscode",{"2":{"832":1}}],["1234567以上便于关于变量声明的理解和一些细节问题",{"2":{"587":1}}],["1234567除了可以扩展第三方插件的规则集",{"2":{"831":1}}],["1234567除了执行valueof",{"2":{"39":1,"545":1}}],["1234567创建子包",{"2":{"813":1}}],["1234567这样使用其他线程后即使再大的文件也不会影响主线程了",{"2":{"773":1}}],["1234567如上换成了let定义变量后",{"2":{"588":1}}],["1234567接下来看js继承",{"2":{"576":1}}],["1234567上面第4行高亮处已经证明了",{"2":{"573":1}}],["1234567上面隐式装箱name是个基础类型",{"2":{"38":1,"544":1}}],["1234567js",{"2":{"404":1}}],["1234567不定长传输是一种灵活",{"2":{"343":1}}],["1234567目前在笔者电脑浏览器上查看serverpush类型网络已经不明显了",{"2":{"325":1}}],["1234567然后使用以下的口令就可以完成打包啦",{"2":{"175":1}}],["1234567",{"2":{"148":1,"149":1,"154":1,"159":1,"189":1,"243":1,"404":1,"405":1,"609":1,"640":1,"692":1,"728":1,"830":1,"839":1,"878":1,"897":1,"898":1,"903":1,"921":1,"932":1,"994":1,"1034":1,"1045":1,"1056":1,"1114":1,"1147":1}}],["12345674",{"2":{"97":1}}],["1234567代码量也很少",{"2":{"21":1}}],["12345678cmd支持exec和shell两种写法",{"2":{"1063":1}}],["12345678commitizen默认会读取根项目下的",{"2":{"801":1}}],["12345678构建镜像",{"2":{"1055":1}}],["12345678在这个示例中",{"2":{"1023":1,"1024":1}}],["12345678在node端使用gzip静态资源服务器",{"2":{"697":1}}],["12345678添加测试用例",{"2":{"874":1}}],["12345678运行测试用例",{"2":{"864":1}}],["12345678以上初始化成功后会显示如下结果",{"2":{"1214":1}}],["12345678以上运行hello",{"2":{"1082":1}}],["12345678以上便是docker",{"2":{"1004":1}}],["12345678以上配置好了后",{"2":{"802":1}}],["12345678以上的server监听80端口并匹配域名exemple",{"2":{"710":1}}],["12345678这样即使切片再多",{"2":{"771":1}}],["12345678这种方法和table一样的原理",{"2":{"19":1}}],["12345678打开浏览器访问",{"2":{"727":1}}],["12345678使用docker",{"2":{"1024":1}}],["12345678使用",{"2":{"628":1}}],["12345678和前面的代码一样",{"2":{"588":1}}],["12345678上面我们已经了解了js会先进行语法分析声明变量",{"2":{"587":1}}],["12345678上报的格式长下面这个样子",{"2":{"350":1}}],["12345678通过这种方式node会以debugger模式运行",{"2":{"399":1}}],["12345678arp缓存表的大小有限",{"2":{"298":1}}],["12345678那么",{"2":{"239":1}}],["12345678大功告成",{"2":{"190":1}}],["12345678当然我们还要在我们的配置文件中接收node",{"2":{"182":1}}],["12345678然后我们就可以很方便的启动devserver了",{"2":{"177":1}}],["12345678对象类型会根据ordinarytoprimitive拆箱规则进行转换为基础类型number类型",{"2":{"43":1,"549":1}}],["123456789博客顺序不分前后",{"2":{"1230":1}}],["123456789注意以上的baseurl",{"2":{"1210":1}}],["123456789创建index",{"2":{"1183":1}}],["123456789执行以上命令会进入runner镜像内部交互式进行注册",{"2":{"1156":1}}],["123456789修改版本号",{"2":{"1103":1}}],["123456789nexus内部默认会使用8001作为http访问的端口",{"2":{"1094":1}}],["123456789nodejs",{"2":{"765":1}}],["123456789运行时通过传参覆盖掉默认的",{"2":{"1064":1}}],["123456789运行容器时提供默认运行的命令来覆盖默认的命令",{"2":{"1063":1}}],["123456789运行容器并覆盖镜像中默认的k1变量值",{"2":{"1055":1}}],["123456789你可以在容器中通过image指定第三方的镜像文件",{"2":{"1021":1}}],["123456789配置jest",{"2":{"875":1}}],["123456789到这里计算属性的原理就讲的差不多了",{"2":{"932":1}}],["123456789到这里就已经完成了prettier和eslint的整合",{"2":{"840":1}}],["123456789到这里基本上学会了以上的内容",{"2":{"47":1,"553":1}}],["123456789从plugin的使用中可以看到步骤繁琐",{"2":{"831":1}}],["123456789接下来集成commitlint",{"2":{"805":1}}],["123456789参考文档",{"2":{"727":1}}],["123456789访问页面时会请求请求图片",{"2":{"712":1}}],["123456789这样在每次访问intro都会执行",{"2":{"932":1}}],["123456789这样对于请求时不合法的数据类型将会自动返回错误",{"2":{"646":1}}],["123456789这种方式并不是很安全",{"2":{"353":1}}],["123456789当一个函数被返回出来的时并形成闭包时",{"2":{"595":1}}],["123456789以上简单的配置了prettier常见的几个属性",{"2":{"839":1}}],["123456789以上当访问",{"2":{"716":1}}],["123456789以上代码会返回有一个匿名函数",{"2":{"590":1}}],["123456789以下是具体的传输过程中所带的信息",{"2":{"344":1}}],["123456789实例化uint8array底层都会创建相应的arraybuffer",{"2":{"483":1}}],["123456789上面的例子中",{"2":{"342":1}}],["123456789此外",{"2":{"184":1}}],["123456789现在你再修改文件",{"2":{"184":1}}],["123456789转换规则2",{"2":{"44":1,"550":1}}],["123456789",{"2":{"34":1,"53":1,"75":1,"188":1,"352":1,"354":1,"497":1,"626":1,"659":1,"666":1,"696":1,"817":1,"848":1,"863":1,"879":1,"939":1,"1038":1,"1039":1,"1059":1,"1090":1,"1131":1,"1145":1}}],["12345678910这里的domain改为你自己生成的域名",{"2":{"1178":1}}],["12345678910两个容器创建好后",{"2":{"1090":1}}],["12345678910可以查看nginx容器的网关为172",{"2":{"1084":1}}],["12345678910可以从上看出tcp监听的端口号",{"2":{"383":1}}],["12345678910构建镜像",{"2":{"1073":1}}],["12345678910其实以上可以算是成功步骤",{"2":{"1046":1}}],["12345678910以下是一些常见的配置",{"2":{"878":1}}],["12345678910就这样其他啥也不需要修改",{"2":{"685":1}}],["12345678910通过将configservice注入到程序中",{"2":{"629":1}}],["12345678910nest可以与任何的http框架对接",{"2":{"603":1}}],["12345678910如上代码有三个作用域",{"2":{"589":1}}],["12345678910前面讲了当new构造函数时会产生一个全新的对象",{"2":{"576":1}}],["12345678910了解了构造函数的原型后",{"2":{"573":1}}],["12345678910上面高亮那行代码",{"2":{"572":1}}],["12345678910当然工厂模式并不仅仅是用来",{"2":{"201":1,"751":1}}],["12345678910然后再src",{"2":{"175":1}}],["12345678910",{"2":{"30":1,"32":1,"86":1,"350":1,"354":1,"453":1,"615":1,"616":1,"617":1,"628":1,"643":1,"656":1,"660":2,"671":1,"675":1,"708":1,"723":1,"828":1,"867":1,"920":1,"961":1,"1034":1,"1090":1,"1128":1,"1129":1,"1172":1,"1208":1,"1218":1}}],["12345678910同样修改新对象会改到原对象",{"2":{"30":1}}],["12345678910修改新对象会改到原对象",{"2":{"29":1}}],["1234567891011以上我们便使用dockerfile配置文件定制nginx镜像的完整流程",{"2":{"1051":1}}],["1234567891011需要安装对应的",{"2":{"858":1}}],["1234567891011上面使用了",{"2":{"858":1}}],["1234567891011上面的例子设置了不允许refer为none",{"2":{"722":1}}],["1234567891011使用这些规则同样需要先安装",{"2":{"846":1}}],["1234567891011eslint配置总体来说包含env",{"2":{"827":1}}],["1234567891011创建配置文件",{"2":{"669":1}}],["1234567891011当调用",{"2":{"529":1}}],["1234567891011这个dockerfile定义了两个阶段的构建",{"2":{"1070":1}}],["1234567891011这样就解决了更新问题",{"2":{"132":1}}],["1234567891011这种方法兼容性依赖calc的兼容性",{"2":{"14":1}}],["1234567891011通过上面的内容你应该对装箱与拆箱有了更深的认识",{"2":{"40":1,"546":1}}],["1234567891011",{"2":{"26":1,"32":1,"38":1,"145":1,"154":1,"161":1,"202":1,"203":1,"347":1,"406":1,"512":1,"544":1,"575":1,"604":1,"618":1,"752":1,"753":1,"810":1,"840":1,"894":1,"903":1,"955":1,"1039":1,"1055":1,"1090":1,"1102":1,"1183":1}}],["123456789101112重启cri",{"2":{"1208":1}}],["123456789101112记得忽略掉",{"2":{"1187":1}}],["123456789101112创建",{"2":{"1187":1}}],["123456789101112创建server",{"2":{"1074":1}}],["123456789101112到这里就发布成功了",{"2":{"1046":1}}],["123456789101112在这个示例配置文件中",{"2":{"1018":1}}],["123456789101112更多规则点击查看官方配置",{"2":{"847":1}}],["123456789101112这样解决了set里写很多执行方法的问题",{"2":{"950":1}}],["123456789101112这块应该比较好理解的",{"2":{"829":1}}],["123456789101112这种方法兼容性依赖translate2d的兼容性",{"2":{"15":1}}],["123456789101112globals",{"2":{"828":1}}],["123456789101112以上会以表格的方式列表镜像",{"2":{"998":1}}],["123456789101112以上就是一个简单的小文件上传和普通的json请求没有啥区别",{"2":{"765":1}}],["123456789101112以上代码使用原声写法如下",{"2":{"700":1}}],["123456789101112假如访问index",{"2":{"712":1}}],["123456789101112上面高亮代码判断如果函数返回的是object并且不是null类型的数据",{"2":{"576":1}}],["123456789101112",{"2":{"83":1,"134":1,"162":1,"197":1,"606":1,"611":1,"640":1,"643":1,"717":1,"747":1,"858":1,"937":1,"1064":1}}],["123456789101112ordinarytoprimitive的执行也可以在源码",{"2":{"40":1,"546":1}}],["12345678910111213发现安装失败",{"2":{"1103":1}}],["12345678910111213重新发布",{"2":{"1103":1}}],["12345678910111213查看镜像内部持久化的变量",{"2":{"1055":1}}],["12345678910111213然后可以通过docker",{"2":{"1054":1}}],["12345678910111213上面的配置文件中存在两个仓库地址",{"2":{"1014":1}}],["12345678910111213再来想想如果render函数中有很多地方用到了同一个计算属性",{"2":{"932":1}}],["12345678910111213运行测试",{"2":{"875":1}}],["12345678910111213这里介绍下几个关键字基本概念",{"2":{"859":1}}],["12345678910111213这是我比较常用的方式",{"2":{"12":1}}],["12345678910111213默认配置文件大概是下面的内容",{"2":{"857":1}}],["12345678910111213到这里就可以使用http",{"2":{"718":1}}],["12345678910111213可根据实际情况进行配置",{"2":{"695":1}}],["12345678910111213除了基本的配置外还可以对配置文件的值进行校验",{"2":{"669":1}}],["12345678910111213除此之外的其他有关的arraybuffer的视图api雷同",{"2":{"485":1}}],["12345678910111213从上面就已经展示了作用域的概念",{"2":{"589":1}}],["12345678910111213从代码可以看出cat的原始原型就是object",{"2":{"572":1}}],["12345678910111213",{"2":{"338":1,"401":1,"614":1,"643":1,"728":1,"1143":1}}],["12345678910111213是不是很高大上~",{"2":{"186":1}}],["12345678910111213以上就是针对当前应用的nginx配置",{"2":{"128":1}}],["1234567891011121314将以上的domain替换成你想都要的域名如",{"2":{"1178":1}}],["1234567891011121314更多配置参考👉官方文档",{"2":{"1083":1}}],["1234567891011121314更多关于模拟函数的例子请查看文档",{"2":{"869":1}}],["1234567891011121314添加全局组件",{"2":{"875":1}}],["1234567891011121314上面会对所有文件进行风格设置",{"2":{"836":1}}],["1234567891011121314上面列子展示了在bin",{"2":{"830":1}}],["1234567891011121314上面使用nodejs设置了key为",{"2":{"347":1}}],["1234567891011121314lerna目前结合了",{"2":{"814":1}}],["1234567891011121314服务器接收到切片后",{"2":{"769":1}}],["1234567891011121314测试",{"2":{"723":1}}],["1234567891011121314cron的时间是cron表达式",{"2":{"660":1}}],["1234567891011121314",{"2":{"163":1,"225":1,"613":1,"622":1,"630":1,"640":2,"671":1,"686":1,"801":1,"942":1,"966":1,"1034":1,"1132":1,"1174":1,"1191":1,"1206":1}}],["123456789101112131415然后运行此配置文件",{"2":{"1173":1}}],["123456789101112131415那在何时进行依赖收集的呢❓",{"2":{"955":1}}],["123456789101112131415更多请参考对应的👉",{"2":{"880":1}}],["123456789101112131415一般都来查看html报告",{"2":{"874":1}}],["123456789101112131415使用spark",{"2":{"772":1}}],["123456789101112131415以上配置好了后再次进行nginx的下载应该就可以了",{"2":{"707":1}}],["123456789101112131415而在swagger中是看不到任何参数信息的",{"2":{"683":1}}],["123456789101112131415这样在user的属性改变时",{"2":{"950":1}}],["123456789101112131415这个例子定义了一个number响应式对象",{"2":{"934":1}}],["123456789101112131415这里我们将目录结构过一个简单的整理",{"2":{"665":1}}],["123456789101112131415这种方法需要在子元素中将文字显示重置为想要的效果",{"2":{"16":1}}],["123456789101112131415在实例化child时",{"2":{"578":1}}],["123456789101112131415在上述入口文件中",{"2":{"238":1}}],["123456789101112131415上面通过扫描工具扫描网关",{"2":{"454":1}}],["123456789101112131415上述等再次查看33196已经被完全断开时就可以正常启动了",{"2":{"382":1}}],["123456789101112131415json",{"2":{"222":1}}],["123456789101112131415采用享元模式",{"2":{"204":1,"754":1}}],["123456789101112131415当我们再次创建时",{"2":{"196":1,"746":1}}],["12345678910111213141516安装当前项目依赖",{"2":{"1184":1}}],["12345678910111213141516更多见官方文档",{"2":{"870":1}}],["12345678910111213141516通过requestanimationframe将会在每次更新视图时都会正确的更新每次修改的内容",{"2":{"535":1}}],["12345678910111213141516wireshark我们选择本地回环地址网卡接口",{"2":{"455":1}}],["12345678910111213141516在另一个项目中重新安装我们的包",{"2":{"1103":1}}],["12345678910111213141516在浏览器访问网页时",{"2":{"350":1}}],["12345678910111213141516在imagemanager里需要在加载时",{"2":{"248":1}}],["12345678910111213141516范围请求通常的使用场景有如下",{"2":{"344":1}}],["12345678910111213141516打包代码吧~",{"2":{"176":1}}],["1234567891011121314151617创建pm2",{"2":{"1074":1}}],["1234567891011121314151617查看并运行",{"2":{"1051":1}}],["1234567891011121314151617当访问路径中以",{"2":{"715":1}}],["1234567891011121314151617三者区别",{"2":{"606":1}}],["1234567891011121314151617具体可以查看",{"2":{"339":1}}],["1234567891011121314151617图片管理器实例化参数类型如下",{"2":{"243":1}}],["1234567891011121314151617适配器模式主要用来解决两个已有接口不匹配的问题",{"2":{"206":1,"756":1}}],["1234567891011121314151617",{"2":{"83":1,"127":1,"158":1,"343":1,"462":1,"534":1,"573":1,"635":1,"930":1,"958":1,"1002":1}}],["123456789101112131415161718运行以下指令查看以上配置是否正确",{"2":{"1205":1}}],["123456789101112131415161718dockerfile配置文件",{"2":{"1074":1}}],["123456789101112131415161718你可以能没见过以上watch形式",{"2":{"936":1}}],["123456789101112131415161718可以看到对应的测试文件",{"2":{"860":1}}],["123456789101112131415161718更多有关bem的规则可以参考以下文档",{"2":{"850":1}}],["123456789101112131415161718以下是将一张3",{"2":{"768":1}}],["123456789101112131415161718配置docker",{"2":{"703":1}}],["123456789101112131415161718配置好client",{"2":{"400":1}}],["123456789101112131415161718打开终端分别访问接口",{"2":{"655":1}}],["123456789101112131415161718",{"2":{"228":1,"245":1,"613":3,"687":1,"769":1,"1157":1}}],["12345678910111213141516171819上面便是一个最简单的计算属性使用例子",{"2":{"929":1}}],["12345678910111213141516171819上面针对js",{"2":{"838":1}}],["12345678910111213141516171819上面组合继承看上去没什么问题",{"2":{"580":1}}],["12345678910111213141516171819项目中一般都会有",{"2":{"703":1}}],["12345678910111213141516171819配置validationpipe",{"2":{"646":1}}],["12345678910111213141516171819使用",{"2":{"645":1}}],["12345678910111213141516171819如上寄生式和原型式继承一样",{"2":{"581":1}}],["12345678910111213141516171819知识点",{"2":{"410":1}}],["12345678910111213141516171819完成以上配置后",{"2":{"177":1}}],["12345678910111213141516171819",{"2":{"83":2,"204":1,"434":1,"642":1,"692":1,"728":1,"754":1,"866":1,"943":1,"1124":1,"1190":1}}],["1234567891011121314151617181920在路由中使用",{"2":{"646":1}}],["1234567891011121314151617181920需要注意",{"2":{"571":1}}],["1234567891011121314151617181920html",{"2":{"207":1,"757":1}}],["1234567891011121314151617181920现在试着打包吧~",{"2":{"181":1}}],["123456789101112131415161718192021可以看到发布成功",{"2":{"1189":1}}],["123456789101112131415161718192021以上定义了一个user对象",{"2":{"950":1}}],["123456789101112131415161718192021提交类型错误",{"2":{"797":1}}],["123456789101112131415161718192021nginx可以根据不同的负载均衡策略进行流量分发",{"2":{"725":1}}],["123456789101112131415161718192021现在当访问get",{"2":{"652":1}}],["123456789101112131415161718192021除此之外还支持异步函数",{"2":{"606":1}}],["123456789101112131415161718192021首先从上面16行看到子类的原型都指向同一个父类对象parent",{"2":{"579":1}}],["123456789101112131415161718192021",{"2":{"145":1,"350":1,"674":1,"894":1,"954":1,"1119":1,"1125":1,"1148":1,"1218":1}}],["12345678910111213141516171819202122",{"2":{"1138":1,"1139":1,"1179":1}}],["12345678910111213141516171819202122使用torefs的功能验证是否结构后不会失去响应式",{"2":{"963":1}}],["12345678910111213141516171819202122上面的栗子实现了加载图片时",{"2":{"198":1,"748":1}}],["12345678910111213141516171819202122以上就是ordinarytoprimitive的执行步骤",{"2":{"40":1,"546":1}}],["1234567891011121314151617181920212223主线程",{"2":{"773":1}}],["1234567891011121314151617181920212223新建一个html页面",{"2":{"724":1}}],["1234567891011121314151617181920212223",{"2":{"514":1,"648":1,"940":1,"1141":1,"1171":1}}],["1234567891011121314151617181920212223在redux中可以找出装饰器的方式",{"2":{"199":1,"749":1}}],["1234567891011121314151617181920212223现在我们就可以进行不同的打包啦~",{"2":{"182":1}}],["123456789101112131415161718192021222324depend中会遍历所有的deps",{"2":{"932":1}}],["123456789101112131415161718192021222324打包镜像",{"2":{"703":1}}],["123456789101112131415161718192021222324httpexception的类型定义如下",{"2":{"637":1}}],["12345678910111213141516171819202122232425不断更新中",{"2":{"1108":1}}],["12345678910111213141516171819202122232425可能上面一时半会有点绕",{"2":{"955":1}}],["1234567891011121314151617181920212223242526仔细看看这段代码相信你已经可以搞明白它是如何运作的了",{"2":{"956":1}}],["1234567891011121314151617181920212223242526具体来看数组方法的改造实现",{"2":{"955":1}}],["123456789101112131415161718192021222324252627初始化完成后还需要根据以上步骤",{"2":{"1214":1}}],["123456789101112131415161718192021222324252627上面展示了端口",{"2":{"1022":1}}],["123456789101112131415161718192021222324252627上面将cbs改成map结构",{"2":{"951":1}}],["123456789101112131415161718192021222324252627上面的cacheableoperations属性用来配置可以被缓存的脚本",{"2":{"818":1}}],["123456789101112131415161718192021222324252627以上就用外观模式封装了两个基本事件",{"2":{"200":1,"750":1}}],["123456789101112131415161718192021222324252627",{"2":{"180":1,"195":1,"745":1,"938":1}}],["12345678910111213141516171819202122232425262728以上改造好了后看下执行结果",{"2":{"960":1}}],["12345678910111213141516171819202122232425262728以上就是最简单原型链继承",{"2":{"577":1}}],["12345678910111213141516171819202122232425262728在浏览器上测试使用w参数",{"2":{"718":1}}],["12345678910111213141516171819202122232425262728",{"2":{"132":1,"517":1,"634":1,"661":1}}],["1234567891011121314151617181920212223242526272829自定配置需要修改的有",{"2":{"1217":1}}],["1234567891011121314151617181920212223242526272829创建启动文件",{"2":{"1208":1}}],["1234567891011121314151617181920212223242526272829使用nodejs简单的写一个后端服务",{"2":{"723":1}}],["1234567891011121314151617181920212223242526272829",{"2":{"606":1}}],["1234567891011121314151617181920212223242526272829这里也没有找到vue定义",{"2":{"238":1}}],["1234567891011121314151617181920212223242526272829效果",{"2":{"110":1}}],["123456789101112131415161718192021222324252627282930这里执行非交互命令",{"2":{"1157":1}}],["123456789101112131415161718192021222324252627282930这样团队都是用此脚本时commit信息就会被规范化而不会出现五花八门现象",{"2":{"800":1}}],["123456789101112131415161718192021222324252627282930",{"2":{"661":1,"771":1,"1034":1}}],["123456789101112131415161718192021222324252627282930除了get",{"2":{"612":1}}],["123456789101112131415161718192021222324252627282930在build",{"2":{"237":1}}],["12345678910111213141516171819202122232425262728293031配置好后记得重启nginx",{"2":{"726":1}}],["12345678910111213141516171819202122232425262728293031以上通过将child的prototype对象的原型设置为parent的prototype对象",{"2":{"582":1}}],["12345678910111213141516171819202122232425262728293031在上述代码中",{"2":{"201":1,"751":1}}],["12345678910111213141516171819202122232425262728293031",{"2":{"57":1,"157":1,"651":1,"964":1,"1217":1}}],["1234567891011121314151617181920212223242526272829303132上面执行mountcomponent方法时会创建一个watcher对象",{"2":{"954":1}}],["1234567891011121314151617181920212223242526272829303132在上述文件中",{"2":{"238":1}}],["1234567891011121314151617181920212223242526272829303132",{"2":{"222":1,"624":1,"729":1}}],["123456789101112131415161718192021222324252627282930313233这里总结下上面方法改写",{"2":{"955":1}}],["123456789101112131415161718192021222324252627282930313233使用守卫",{"2":{"648":1}}],["123456789101112131415161718192021222324252627282930313233js",{"2":{"222":1}}],["12345678910111213141516171819202122232425262728293031323334",{"2":{"665":1,"938":1}}],["12345678910111213141516171819202122232425262728293031323334以上代码的打印顺序为",{"2":{"532":1}}],["12345678910111213141516171819202122232425262728293031323334以上创建好了后",{"2":{"354":1}}],["12345678910111213141516171819202122232425262728293031323334现在就可以使用背景图片渲染了",{"2":{"249":1}}],["12345678910111213141516171819202122232425262728293031323334缓存大致就这样",{"2":{"248":1}}],["12345678910111213141516171819202122232425262728293031323334webpack生产环境配置",{"2":{"190":1}}],["1234567891011121314151617181920212223242526272829303132333435上面定义了两个执行方法p1",{"2":{"951":1}}],["1234567891011121314151617181920212223242526272829303132333435363738",{"2":{"964":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940以上就是vue3的computed整体过程",{"2":{"934":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041下图为上传图片的演示效果",{"2":{"772":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041",{"2":{"770":1,"1082":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142",{"2":{"954":1,"1159":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243当创建完以上文件后",{"2":{"1178":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243首先通过this拿到当前computed属性的watcher",{"2":{"932":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243其实也没那么难",{"2":{"583":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445这里列举下以上watch的不同的定义形式",{"2":{"937":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647",{"2":{"702":1,"934":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647在init中",{"2":{"239":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647现在给port赋值",{"2":{"231":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051由以上的默认配置可以看出nginx配置是由以下几部分组成的",{"2":{"709":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051使用nodejs创建服务端",{"2":{"354":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051上面的打印结果如下",{"2":{"233":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354",{"2":{"205":1,"639":1,"755":1,"941":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556",{"2":{"934":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758执行脚本根据提示输入生成证书",{"2":{"726":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859",{"2":{"954":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859这样就解决了ie兼容的问题",{"2":{"247":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061修改后再看看结果确实符合预期",{"2":{"955":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263到这里基本上就关于vue3的响应式基本原理就讲通了",{"2":{"964":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465下图是执行结果",{"2":{"959":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566",{"2":{"954":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566watcheffect还是很好理解的",{"2":{"945":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768到这里也就讲完了vue的响应式过程",{"2":{"954":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576",{"2":{"964":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293",{"2":{"944":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139以上配置文件注意事项如下",{"2":{"1212":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148",{"2":{"951":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253以上对于默认配置修改了以下部分",{"2":{"1209":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174",{"2":{"98":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116并发演示",{"2":{"771":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108webpack开发环境配置",{"2":{"190":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",{"2":{"64":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586至此",{"2":{"245":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677现在当点击登录时",{"2":{"232":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677",{"2":{"83":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374接下来看下效果",{"2":{"801":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273以上基本上已经定义好了imagemanager",{"2":{"244":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172在config文件中",{"2":{"237":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869完成以上的配置分离",{"2":{"190":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667上面点击获取用户信息按钮就会去请求用户的信息",{"2":{"229":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162",{"2":{"62":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960",{"2":{"63":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556上面点击登录后会记录请求耗时",{"2":{"230":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556下面我们针对自己的模式进行简单的使用",{"2":{"195":1,"745":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253当创建校验器后",{"2":{"197":1,"747":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950",{"2":{"83":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940414243444546",{"2":{"61":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041424344",{"2":{"283":1}}],["123456789101112131415161718192021222324252627282930313233343536373839404142效果演示",{"2":{"520":1}}],["1234567891011121314151617181920212223242526272829303132333435363738394041效果",{"2":{"112":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940效果",{"2":{"111":1}}],["12345678910111213141516171819202122232425262728293031323334353637383940",{"2":{"54":1,"404":1,"728":1}}],["12345678910111213141516171819202122232425262728293031323334353637常用的配置",{"2":{"857":1}}],["1234567891011121314151617181920212223242526272829303132333435以上就是class的继承使用方式",{"2":{"583":1}}],["1234567891011121314151617181920212223242526272829303132333435现在需要在页面中主动引入库文件的cdn",{"2":{"130":1}}],["1234567891011121314151617181920212223242526272829303132333435效果",{"2":{"110":1}}],["1234567891011121314151617181920212223242526272829303132333435",{"2":{"60":1,"187":1,"521":1,"721":1}}],["1234567891011121314151617181920212223242526272829303132js",{"2":{"54":1}}],["123456789101112131415161718192021222324252627282930js",{"2":{"54":1}}],["123456789101112131415161718192021222324252627通过上面的代码再次证明了确实是以上的步骤",{"2":{"40":1,"546":1}}],["123456789101112131415161718192021222324252627测试",{"2":{"33":1}}],["12345678910111213141516171819202122232425",{"2":{"932":1,"1034":1}}],["12345678910111213141516171819202122232425回调模式一定要执行done函数",{"2":{"868":1}}],["12345678910111213141516171819202122232425除此之外还可以使用类的实例",{"2":{"606":1}}],["123456789101112131415161718192021222324",{"2":{"510":1,"619":1,"661":1,"673":1,"932":1,"1107":1}}],["123456789101112131415161718192021222324以上请求http",{"2":{"404":1}}],["123456789101112131415161718192021222324终于找到了vue定义",{"2":{"238":1}}],["123456789101112131415161718192021222324然后我们创建一个样式文件src",{"2":{"179":1}}],["1234567891011121314151617181920212223接下来通过下面的代码来证明以上总结的步骤",{"2":{"40":1,"546":1}}],["1234567891011121314151617181920",{"2":{"26":1,"284":1,"606":1,"631":1,"643":1,"724":1,"1093":1}}],["123456789101112131415161718这种方法实现起来和理解起来都稍微有些复杂",{"2":{"17":1}}],["12345678910111213141516",{"2":{"83":1,"150":1,"164":1,"207":1,"609":1,"757":1,"864":1,"899":1,"920":1,"938":1,"1136":1,"1142":1}}],["12345678910111213141516这里的toprimitive属性其实就是symbol",{"2":{"40":1,"546":1}}],["123456789101112131415",{"2":{"33":1,"144":1,"152":1,"160":1,"516":1,"608":1,"632":1,"681":1,"686":1,"711":1,"713":1,"728":1,"874":1,"893":1,"901":1,"971":1}}],["1234567891011121314这种方法兼容性也很好",{"2":{"13":1}}],["1234567891011121314绝对定位的百分比是相对于父元素的宽高",{"2":{"12":1}}],["12345678910111213解析",{"2":{"9":1}}],["1234567891011解析",{"2":{"7":1,"8":1}}],["123456789问两个div的颜色分别是什么",{"2":{"22":1}}],["123456789tabel单元格中的内容天然就是垂直居中的",{"2":{"18":1}}],["12345678",{"2":{"2":1,"3":1,"4":1,"86":1,"154":1,"166":1,"350":1,"538":1,"573":1,"611":1,"645":1,"646":1,"660":1,"661":1,"669":1,"695":1,"700":1,"712":1,"728":1,"857":1,"879":1,"903":1,"959":1,"1000":1,"1001":1,"1014":1,"1045":1,"1054":1,"1082":1,"1089":1,"1116":1,"1127":1,"1137":1}}],["123456",{"2":{"1":1,"28":1,"83":4,"165":1,"285":1,"344":1,"347":1,"438":1,"496":1,"497":2,"507":1,"602":1,"607":1,"667":1,"701":2,"708":1,"713":1,"841":1,"843":1,"862":1,"865":1,"932":1,"960":1,"994":1,"1000":1,"1012":1,"1014":1,"1020":1,"1095":1,"1146":1,"1177":1,"1190":1}}],["123下面通过css属性",{"2":{"19":1}}],["123把box设置为行内元素",{"2":{"16":1}}],["123修复绝对定位的问题",{"2":{"15":1}}],["123感谢css3带来了计算属性",{"2":{"14":1}}],["123wp是父元素的类名",{"2":{"12":1}}],["110s",{"2":{"1217":1}}],["110行",{"2":{"954":1}}],["119s",{"2":{"1217":3}}],["119b",{"2":{"1054":1}}],["114行",{"2":{"954":1}}],["1135",{"2":{"718":1}}],["11行",{"2":{"582":1}}],["1111",{"2":{"702":1,"728":1,"800":1}}],["111",{"2":{"383":1,"1005":1,"1007":1}}],["1171",{"2":{"344":1}}],["112行",{"2":{"934":1}}],["112",{"2":{"325":1,"347":2}}],["112314",{"2":{"144":1,"893":1}}],["11d0",{"2":{"316":1}}],["11",{"2":{"33":2,"44":2,"77":1,"86":1,"298":5,"350":1,"352":3,"438":1,"439":1,"529":1,"538":1,"550":2,"660":1,"703":2,"949":1,"1074":1,"1121":21,"1122":17,"1198":1,"1202":1,"1217":3}}],["18h",{"2":{"1217":3,"1218":1}}],["1800",{"2":{"1159":1}}],["180行",{"2":{"964":1}}],["183m",{"2":{"1203":1}}],["183",{"2":{"1064":2}}],["182b",{"2":{"1051":2}}],["18278",{"2":{"999":1}}],["18min",{"2":{"728":1}}],["18行c1往children中添加了一个数据",{"2":{"579":1}}],["18和19行",{"2":{"571":1}}],["181",{"2":{"491":3}}],["187b0d02a08",{"2":{"347":1}}],["18",{"2":{"26":2,"580":3,"582":2,"583":2,"703":3,"728":3,"1064":1,"1074":1,"1082":1,"1090":20,"1217":3}}],["1+",{"2":{"22":1,"153":1,"902":1}}],["1px",{"2":{"12":1,"110":2,"111":1,"112":1}}],["1",{"0":{"28":1,"32":1,"322":2},"2":{"2":1,"3":1,"4":1,"7":1,"8":2,"9":2,"26":4,"29":1,"30":3,"32":2,"33":6,"34":3,"36":3,"38":4,"40":30,"41":5,"43":24,"44":21,"47":13,"48":2,"60":3,"62":1,"63":4,"64":1,"74":1,"77":2,"78":3,"79":2,"80":1,"82":1,"83":13,"84":1,"85":1,"86":2,"90":1,"93":2,"95":1,"97":1,"98":2,"102":1,"128":1,"132":2,"134":2,"139":3,"140":8,"141":6,"145":5,"146":1,"148":2,"149":2,"150":2,"152":5,"154":7,"162":1,"164":1,"174":1,"175":1,"176":1,"177":1,"179":1,"187":1,"190":1,"195":2,"199":1,"203":1,"204":4,"205":3,"215":1,"232":1,"234":1,"244":1,"245":2,"251":1,"283":2,"286":1,"297":1,"298":1,"316":2,"321":3,"322":6,"323":3,"324":3,"325":1,"326":3,"327":2,"329":10,"334":6,"342":2,"343":3,"344":1,"350":1,"354":5,"361":2,"364":11,"367":1,"368":4,"376":2,"381":2,"382":2,"383":4,"384":1,"404":1,"419":1,"422":1,"423":2,"453":2,"454":8,"456":1,"462":2,"482":1,"483":1,"485":1,"487":1,"494":2,"503":1,"504":1,"520":4,"521":3,"542":3,"544":4,"546":30,"547":5,"549":24,"550":21,"553":13,"554":2,"571":2,"573":1,"576":3,"587":2,"588":1,"589":5,"594":1,"595":2,"602":1,"606":2,"612":3,"613":7,"634":2,"637":1,"646":4,"648":1,"652":2,"655":1,"660":1,"665":1,"667":1,"672":1,"680":1,"683":1,"685":1,"703":1,"707":2,"708":5,"709":1,"713":2,"715":1,"716":1,"717":6,"718":12,"720":5,"721":2,"722":1,"723":5,"726":5,"727":3,"728":3,"729":2,"745":2,"749":1,"753":1,"754":4,"755":3,"768":1,"770":2,"771":7,"772":2,"793":2,"796":1,"797":2,"801":1,"814":10,"819":1,"829":1,"830":2,"831":1,"840":1,"844":1,"846":1,"856":1,"859":2,"860":5,"864":8,"869":5,"873":1,"874":6,"875":4,"888":3,"889":8,"890":6,"894":5,"895":1,"897":2,"898":2,"899":2,"901":5,"903":7,"934":2,"938":1,"941":1,"944":1,"949":1,"954":2,"955":2,"956":1,"994":6,"998":2,"1000":2,"1002":4,"1005":3,"1006":1,"1007":7,"1010":2,"1012":4,"1027":1,"1034":1,"1038":1,"1039":13,"1046":2,"1051":1,"1053":1,"1054":7,"1055":3,"1057":2,"1063":5,"1064":8,"1066":1,"1069":5,"1074":1,"1082":10,"1084":2,"1085":4,"1090":4,"1094":1,"1102":1,"1103":15,"1107":3,"1108":7,"1113":1,"1121":16,"1122":2,"1132":1,"1134":1,"1139":2,"1148":1,"1151":1,"1174":1,"1178":4,"1179":2,"1183":1,"1184":8,"1187":1,"1189":3,"1191":3,"1203":2,"1205":5,"1207":1,"1208":4,"1209":3,"1211":3,"1212":2,"1216":1,"1217":40,"1218":11}}],["+x",{"2":{"1178":1}}],["++effecttrackdepth",{"2":{"934":1}}],["++idx",{"2":{"772":1,"773":1}}],["++",{"2":{"535":1,"594":2,"943":1}}],["+2",{"2":{"325":1}}],["+431us",{"2":{"325":1}}],["+494us",{"2":{"325":1}}],["+584us",{"2":{"325":1}}],["+567us",{"2":{"325":1}}],["+50us",{"2":{"325":1}}],["+1",{"2":{"251":1,"557":1}}],["+new",{"2":{"230":2,"354":1,"634":2,"702":1,"1034":1}}],["+$",{"2":{"137":1,"886":1}}],["+0000",{"2":{"1005":1,"1007":1}}],["+0",{"2":{"83":2}}],["+不仅可以进行算术运算也可以进行字符串的拼接",{"2":{"42":1,"548":1}}],["+obj",{"2":{"40":2,"546":2}}],["+=",{"2":{"40":1,"201":2,"485":2,"497":1,"514":1,"521":1,"546":1,"751":2,"768":1,"770":1,"771":1,"825":1}}],["+",{"0":{"12":1,"13":1,"14":1,"15":1},"2":{"2":1,"3":1,"4":1,"11":4,"22":5,"40":13,"41":1,"44":19,"48":1,"49":1,"52":5,"60":7,"61":2,"62":3,"64":1,"81":2,"141":3,"145":2,"150":4,"154":1,"156":6,"157":43,"158":38,"159":10,"160":18,"161":15,"162":18,"163":19,"164":29,"165":3,"166":7,"195":3,"200":2,"201":3,"204":10,"230":1,"233":1,"328":1,"354":2,"404":1,"464":1,"514":1,"520":2,"529":2,"539":1,"546":13,"547":1,"550":19,"554":1,"555":1,"581":2,"583":7,"703":1,"723":1,"729":1,"745":3,"750":2,"751":3,"754":10,"768":1,"769":3,"770":1,"800":1,"858":3,"869":1,"890":3,"894":2,"899":4,"903":1,"1005":1,"1051":1,"1054":1,"1055":1,"1074":1,"1102":1,"1103":2,"1157":1,"1183":1,"1189":1,"1191":1}}],["btrfs",{"2":{"1209":1}}],["btn",{"2":{"354":1,"404":3,"724":1,"879":1,"1034":2}}],["b75981d3",{"2":{"1095":1}}],["bc3805a",{"2":{"1082":1}}],["bcd9c0828a32",{"2":{"1051":1}}],["bcd9c0828a32f7f2816cc128ac1f1f7368066caf401c93057825d0f3b5df4864",{"2":{"1051":1}}],["bclass",{"2":{"606":1}}],["bff",{"0":{"731":1}}],["bfc就是页面上的一个隔离的独立容器",{"2":{"107":1}}],["bfc的解决方法",{"2":{"111":1}}],["bfc的区域不会与float元素区域重叠",{"2":{"106":1,"107":1,"111":1}}],["bfc的布局规则",{"0":{"105":1},"1":{"106":1,"107":1,"108":1},"2":{"100":1}}],["bfc",{"0":{"103":1}}],["bfc总结",{"0":{"99":1},"1":{"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["bpafter",{"2":{"434":3}}],["bpu",{"2":{"434":3}}],["b类私有地址",{"2":{"360":1}}],["b类地址的网络地址范围为128",{"2":{"359":1}}],["b类地址最高位为10",{"2":{"359":1}}],["b类地址",{"2":{"359":1}}],["b^a",{"2":{"333":1}}],["b要进行通讯",{"2":{"311":1}}],["b0",{"2":{"298":1,"728":1}}],["b5",{"2":{"298":1}}],["branches",{"2":{"1143":1}}],["branch",{"2":{"860":1,"864":1,"874":2,"875":1,"1121":2,"1122":5,"1136":4}}],["brand",{"2":{"347":1}}],["brd",{"2":{"728":6,"1085":1,"1090":6}}],["brk=8999",{"2":{"399":1}}],["brk",{"2":{"399":1}}],["br",{"2":{"347":1,"1205":3}}],["bread",{"2":{"251":1}}],["breaking",{"0":{"792":1},"2":{"800":1,"801":1}}],["breakpoint",{"2":{"419":1}}],["breakpoints",{"2":{"414":2}}],["break",{"2":{"62":1,"496":1,"715":1,"955":4}}],["brige",{"2":{"1088":1}}],["brightness",{"2":{"251":2}}],["bridgeinterface",{"2":{"1212":1}}],["bridge",{"2":{"251":1,"1084":1,"1087":3,"1088":2,"1089":3,"1205":8}}],["bride",{"2":{"251":1}}],["briefcase",{"2":{"251":1}}],["broadcast",{"2":{"728":3,"1085":1,"1090":2}}],["brower菜单进入可以看到对应的仓库",{"2":{"1096":1}}],["brower进程",{"2":{"526":1}}],["browser",{"2":{"280":4,"828":2,"857":1}}],["browserify",{"2":{"237":1}}],["broken",{"2":{"251":1}}],["b12a34",{"2":{"222":1}}],["bb97ae9f0f57",{"2":{"1039":1,"1046":2}}],["bbbb11",{"2":{"145":3,"894":3}}],["bb",{"2":{"145":1,"894":1}}],["b混淆了",{"2":{"144":1,"893":1}}],["b字符",{"2":{"140":2,"889":2}}],["bmw",{"2":{"228":2}}],["bm",{"2":{"139":1,"888":1}}],["b2",{"2":{"139":2,"888":2}}],["b页面",{"2":{"131":1}}],["burst",{"2":{"1212":1}}],["bullettrain",{"2":{"251":2}}],["bulb",{"2":{"251":1}}],["buff",{"2":{"1203":1}}],["buffer总长度",{"2":{"485":1}}],["buffertotallen",{"2":{"485":2}}],["buffer",{"2":{"483":3,"484":1,"485":1,"487":1,"488":1,"491":3,"496":1,"507":2,"708":1,"718":4,"765":1,"769":1}}],["buffersource",{"2":{"494":1}}],["buffers",{"2":{"134":1,"485":4,"717":2}}],["buffalo",{"2":{"251":1}}],["bug",{"2":{"251":1,"784":1,"797":2,"800":2,"801":1,"1103":1}}],["built++",{"2":{"237":1}}],["built",{"2":{"237":3,"708":2,"1082":2}}],["build2",{"2":{"1141":2}}],["build1",{"2":{"1141":2}}],["buildx",{"2":{"1082":1,"1093":1}}],["builder",{"2":{"1073":1,"1076":1}}],["buildentry",{"2":{"237":2}}],["build阶段",{"2":{"1070":1}}],["build的用法可以使用docker",{"2":{"1069":1}}],["buildkit=1",{"2":{"1069":1}}],["build命令",{"2":{"1069":1}}],["build命令的",{"2":{"1068":1}}],["build选项可以强制重新构建镜像",{"2":{"1029":1}}],["build可以简写成build",{"2":{"1021":1}}],["build就会执行所有包的build的命令",{"2":{"814":1}}],["building",{"2":{"703":1,"1051":1,"1054":1,"1055":1}}],["build方法的参数builds",{"2":{"237":1}}],["builds",{"2":{"237":8,"1121":3}}],["build",{"0":{"1028":1},"2":{"126":1,"175":2,"176":1,"177":1,"181":1,"182":2,"190":2,"237":6,"665":2,"681":1,"688":1,"703":7,"797":1,"801":2,"817":1,"818":2,"848":1,"994":1,"999":1,"1000":1,"1018":1,"1021":1,"1028":1,"1029":1,"1034":2,"1035":1,"1051":3,"1054":4,"1055":2,"1057":2,"1063":2,"1068":3,"1069":4,"1070":2,"1073":2,"1074":1,"1076":2,"1119":4,"1124":1,"1125":3,"1127":1,"1128":1,"1138":2,"1139":1,"1141":3,"1145":2,"1159":1,"1190":1,"1208":1}}],["but",{"2":{"232":1,"621":1,"1157":1}}],["button>按钮",{"2":{"875":1}}],["button>请求",{"2":{"724":1}}],["button>更新当前元素属性",{"2":{"404":1}}],["button>更新子节点属性",{"2":{"404":1}}],["button>更新子节点",{"2":{"404":1}}],["button>删除自己",{"2":{"404":1}}],["button>删除节点",{"2":{"404":1}}],["button>增加节点",{"2":{"404":1}}],["button>发送",{"2":{"354":1,"1034":1}}],["button>",{"2":{"229":1,"230":1,"231":1,"232":1,"354":1,"404":6,"724":1,"875":1,"934":1,"936":1,"943":1,"1034":1}}],["button",{"2":{"229":1,"230":1,"231":1,"232":1,"251":3,"338":1,"354":1,"404":2,"724":1,"850":1,"875":9,"879":3,"934":1,"936":1,"943":1,"1034":1}}],["busybox",{"2":{"1063":1,"1064":1,"1090":6}}],["busstop",{"2":{"251":1}}],["busts",{"2":{"251":1}}],["bust",{"2":{"251":1}}],["bus",{"2":{"195":14,"251":2,"745":14}}],["bundlers",{"2":{"237":2}}],["bundle",{"2":{"171":1,"175":1,"237":2}}],["bundle过大",{"2":{"129":1}}],["bypass",{"2":{"721":1}}],["byteoffset",{"2":{"483":1,"484":1,"488":1,"491":1}}],["bytelength",{"2":{"479":2,"484":1,"485":1,"488":1,"491":1,"514":1}}],["byte",{"2":{"462":1,"479":1}}],["bytes",{"2":{"344":5,"368":1,"484":1,"510":1,"520":1,"709":1,"729":1,"1063":4,"1064":6,"1090":10,"1218":7}}],["bytes=",{"2":{"520":1}}],["bytes=10",{"2":{"344":2}}],["bytes=100",{"2":{"344":2}}],["bytes=0",{"2":{"344":1}}],["bytemd",{"2":{"131":2}}],["bytemarkdown",{"2":{"131":2}}],["by后面的字段",{"2":{"84":1}}],["by会根据后面的字段进行分组",{"2":{"84":1}}],["by",{"0":{"81":1,"84":1},"2":{"81":6,"84":1,"97":1,"152":5,"201":1,"237":1,"342":1,"343":1,"344":1,"355":1,"453":1,"579":2,"581":6,"708":1,"723":1,"751":1,"901":5,"1051":3,"1098":3,"1214":3,"1228":1}}],["bigint等几种基本类型",{"2":{"571":1}}],["bigint64array",{"2":{"481":1}}],["big",{"2":{"521":1}}],["biguint64array等等",{"2":{"481":1}}],["bicycles",{"2":{"251":1}}],["bicyclist",{"2":{"251":2}}],["bike",{"2":{"251":1}}],["bikini",{"2":{"251":1}}],["bird",{"2":{"251":1}}],["birthday",{"2":{"83":3,"251":1}}],["birth",{"2":{"77":2,"78":1}}],["bitnami",{"2":{"999":2}}],["bits",{"2":{"499":1}}],["bit",{"2":{"83":1}}],["binaryname",{"2":{"1209":1}}],["binary",{"2":{"83":2,"390":1,"727":1}}],["bin",{"2":{"69":1,"83":1,"726":1,"728":1,"805":1,"806":1,"830":1,"877":1,"1004":1,"1054":3,"1055":6,"1064":1,"1082":1,"1090":2,"1178":1,"1179":1,"1206":1,"1208":10,"1209":2}}],["bindaddresshardfail",{"2":{"1212":1}}],["bindaddress",{"2":{"1212":1}}],["bindport",{"2":{"1212":1}}],["binding",{"2":{"245":6,"247":1,"248":1,"249":3}}],["bind改变this指向返回的是function需要手动调用",{"2":{"4":1}}],["bind的参数是thisarg",{"2":{"4":1}}],["bind介绍",{"0":{"4":1}}],["bind",{"0":{"0":1,"6":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":2,"8":2,"9":2,"10":1},"2":{"1":2,"4":2,"5":1,"9":3,"243":1,"245":2,"944":1}}],["bak",{"2":{"1209":1}}],["ba6f",{"2":{"1095":1}}],["bailre",{"2":{"938":2}}],["baidumapadapter",{"2":{"206":2,"756":2}}],["baidumap",{"2":{"206":2,"756":2}}],["baidu",{"2":{"132":1,"229":1,"421":1,"434":1,"688":1,"1147":1}}],["badrequestexception",{"2":{"638":1}}],["bad",{"2":{"317":2,"645":1,"646":1}}],["badge",{"2":{"251":1}}],["baggage",{"2":{"251":1}}],["bangbang",{"2":{"251":1}}],["bank",{"2":{"251":1}}],["banana",{"2":{"251":1}}],["banner",{"2":{"237":8}}],["bannerplugin",{"2":{"190":1}}],["bathtub",{"2":{"251":1}}],["bath",{"2":{"251":1}}],["battery",{"2":{"251":1}}],["ballot",{"2":{"251":1}}],["balloon",{"2":{"251":3}}],["ball",{"2":{"251":3}}],["bamboo",{"2":{"251":1}}],["baby",{"2":{"251":4}}],["babeljs",{"2":{"270":1}}],["babelrc适合针对某个具体文件进行配置",{"2":{"268":1}}],["babelrc直到出现package",{"2":{"268":1}}],["babelrc",{"2":{"268":2,"880":2}}],["babel基本使用",{"0":{"259":1},"1":{"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1}}],["babel原理分析",{"0":{"253":1},"1":{"254":1,"255":1,"256":1,"257":1}}],["babel编译文件缓存",{"2":{"190":1}}],["babel配置",{"2":{"54":2}}],["babel",{"0":{"180":1},"2":{"54":2,"180":12,"190":5,"268":2,"270":1,"829":2,"858":11,"880":1}}],["backup为备",{"2":{"728":1}}],["backof",{"2":{"390":1}}],["backlog",{"2":{"380":2}}],["backend3",{"2":{"725":1}}],["backend2",{"2":{"725":1}}],["backend1",{"2":{"725":1}}],["backend",{"2":{"339":1,"724":1,"725":2,"1034":2}}],["backward",{"2":{"251":1}}],["back",{"2":{"249":1}}],["backgroundimage=",{"2":{"249":1}}],["backgroundimage",{"2":{"249":2}}],["background",{"2":{"12":1,"61":1,"110":2,"111":2,"112":2,"179":1,"222":1,"534":2,"535":2,"721":4}}],["basic",{"2":{"713":2,"729":1}}],["basketball",{"2":{"251":1}}],["basecompile",{"2":{"971":1}}],["baseconfig",{"2":{"190":4}}],["basehandlers",{"2":{"964":3}}],["basegetter",{"2":{"944":2}}],["baseurl",{"2":{"878":1,"879":1}}],["baseurl=https",{"2":{"1210":1}}],["baseurl=http",{"2":{"707":2}}],["base64字符串",{"2":{"497":1}}],["base64",{"2":{"410":2,"1014":1}}],["based",{"2":{"350":1}}],["baseball",{"2":{"251":1}}],["base",{"2":{"179":1,"190":5,"229":4,"703":1,"874":1,"1122":1,"1209":4,"1217":1}}],["bash$",{"2":{"218":1}}],["bashsudo",{"2":{"218":1}}],["bash",{"2":{"73":1,"726":1,"728":2,"1004":1,"1156":1,"1160":1,"1171":1,"1174":1,"1178":1,"1179":1,"1206":2}}],["bashvim",{"2":{"69":1}}],["bar=blahblah",{"2":{"729":1}}],["barber",{"2":{"251":1}}],["bar",{"2":{"139":3,"251":2,"529":7,"571":3,"713":1,"729":1,"888":3,"938":1,"941":1}}],["befor",{"2":{"1124":1}}],["beforeupdate",{"2":{"954":1}}],["beforeeach",{"2":{"881":1}}],["beforeall",{"2":{"871":1}}],["beforeapplicationshutdown",{"2":{"621":1}}],["beforecreate",{"2":{"239":1}}],["before",{"2":{"190":1,"588":2,"621":1,"857":2,"881":1,"954":1,"1121":1,"1124":1}}],["beta",{"2":{"1108":2}}],["between",{"2":{"83":2}}],["bem",{"2":{"850":1}}],["bem代表",{"2":{"850":1}}],["bem命名约定",{"0":{"850":1}}],["beautyresponseinterceptor",{"2":{"651":1,"652":2}}],["beauty",{"2":{"650":1,"652":1}}],["bear",{"2":{"251":1}}],["bearer",{"2":{"64":1}}],["begin++",{"2":{"485":1}}],["begin",{"2":{"485":3}}],["beginpath",{"2":{"283":1}}],["beginner",{"2":{"251":1}}],["bento",{"2":{"251":1}}],["benchmark",{"2":{"83":1}}],["been",{"2":{"588":1,"621":3}}],["beers",{"2":{"251":1}}],["beer",{"2":{"251":1}}],["beetle",{"2":{"251":1}}],["bell",{"2":{"251":2}}],["being",{"2":{"239":1}}],["be",{"2":{"40":11,"83":1,"238":1,"350":1,"546":11,"621":1,"645":1,"646":1,"797":3,"801":1,"857":7,"1045":1,"1103":1,"1132":2,"1157":1,"1217":1}}],["blank",{"2":{"788":2}}],["black",{"2":{"110":2,"111":1,"112":1,"251":7}}],["blush",{"2":{"251":1}}],["blue",{"2":{"22":4,"251":6,"283":1,"350":1,"534":2,"535":2}}],["blob>",{"2":{"499":1}}],["blobs",{"2":{"497":3,"521":5}}],["blob的类型",{"2":{"495":1}}],["blob的数据大小",{"2":{"495":1}}],["blobparts",{"2":{"494":2}}],["blob",{"0":{"493":1},"1":{"494":1,"495":1,"496":1,"497":1},"2":{"270":1,"293":1,"354":1,"485":3,"493":1,"494":4,"496":6,"497":10,"498":3,"502":1,"507":1,"521":3,"573":1,"768":1,"1097":1}}],["blossom",{"2":{"251":2}}],["blowfish",{"2":{"251":1}}],["blond",{"2":{"251":2}}],["blog",{"2":{"85":1,"126":1,"128":1,"193":1,"222":4,"280":4,"422":1,"438":2,"439":1,"568":1,"611":2,"617":1,"711":1,"715":4,"716":2,"1073":2,"1074":2,"1128":1,"1225":1,"1227":1,"1230":1}}],["blocksize",{"2":{"1217":1}}],["blocks",{"2":{"1209":1}}],["block时却也会报错cannot",{"2":{"588":1}}],["blocked",{"2":{"353":1,"722":2}}],["block",{"2":{"16":1,"17":2,"18":1,"19":1,"102":1,"104":1,"350":1,"414":2,"588":13,"589":5,"850":1,"874":1,"1098":1}}],["boss声音很深沉感觉很为难的样子",{"2":{"1233":1}}],["bom",{"2":{"462":1}}],["bomb",{"2":{"251":1}}],["bob",{"2":{"333":3}}],["boat",{"2":{"251":1}}],["board",{"2":{"251":1}}],["boar",{"2":{"251":1}}],["bone",{"2":{"251":1}}],["bottle",{"2":{"251":1}}],["bottom和第二行的margin",{"2":{"110":1}}],["bottomnav",{"2":{"54":1}}],["bottom",{"2":{"13":1,"284":1}}],["bolt",{"2":{"251":1,"1209":2}}],["bouquet",{"2":{"251":1}}],["boy",{"2":{"251":1}}],["bowling",{"2":{"251":1}}],["bow",{"2":{"251":1}}],["bowtie",{"2":{"251":2}}],["books",{"2":{"251":1}}],["book",{"2":{"251":5}}],["bookmark",{"2":{"251":2}}],["boom",{"2":{"251":1}}],["bootfs",{"2":{"997":2}}],["boot",{"2":{"251":1}}],["bootstrappers",{"2":{"1212":1}}],["bootstraptokens",{"2":{"1212":1}}],["bootstrap",{"2":{"186":3,"190":3,"603":2,"640":1,"681":2,"692":1}}],["bootcdn",{"2":{"130":1}}],["booll",{"2":{"39":1,"545":1}}],["bool",{"2":{"36":1,"38":2,"39":2,"542":1,"544":2,"545":2}}],["boolean值",{"2":{"857":1}}],["boolean>",{"2":{"648":2,"944":1}}],["boolean和自定义类型",{"2":{"643":2,"646":1}}],["boolean和其他类型比较时",{"2":{"47":1,"553":1}}],["boolean转number",{"2":{"43":1,"549":1}}],["boolean基础类型",{"2":{"37":1,"543":1}}],["boolean",{"2":{"24":1,"30":1,"37":1,"38":2,"39":1,"41":3,"200":2,"227":2,"232":1,"238":2,"247":1,"249":3,"543":1,"544":2,"545":1,"547":3,"571":1,"573":1,"628":2,"629":1,"648":1,"695":5,"750":2,"771":3,"831":1,"874":3,"921":2,"932":4,"934":4,"938":1,"954":4,"962":1,"964":2}}],["body相关装饰器进行收集作为参数类型model",{"2":{"684":1}}],["body等等",{"2":{"614":1}}],["bodyparser",{"2":{"354":3}}],["body>",{"2":{"110":4,"111":2,"112":2,"222":2,"350":2,"671":2,"712":2,"724":2,"788":1}}],["body",{"0":{"518":1},"2":{"57":5,"110":2,"111":1,"112":1,"117":2,"198":1,"201":1,"350":1,"354":1,"514":1,"518":1,"521":1,"613":7,"643":2,"701":3,"702":2,"708":1,"718":2,"729":2,"748":1,"751":1,"765":3,"769":4,"770":3,"788":1,"801":1,"1177":1}}],["border",{"2":{"12":1,"110":2,"111":1,"112":1,"850":1}}],["box垂直方向的距离由margin决定",{"2":{"105":1}}],["box是子元素的类名",{"2":{"12":1}}],["box",{"2":{"12":4,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2,"19":2,"20":1,"21":2,"251":1,"404":2}}],["b",{"2":{"2":4,"3":4,"4":4,"28":1,"33":7,"34":3,"40":2,"83":3,"137":1,"139":7,"140":2,"144":1,"154":2,"164":1,"251":1,"333":3,"517":1,"529":2,"546":2,"583":16,"588":2,"770":2,"886":1,"888":7,"889":2,"893":1,"903":2,"938":1,"1103":2,"1189":2}}],["cfg",{"2":{"1202":2}}],["cm",{"2":{"1183":1,"1190":1}}],["cmd作为entrypoint的参数",{"2":{"1064":1}}],["cmd将作为entrypoint的参数",{"2":{"1064":1}}],["cmd",{"0":{"1063":1},"2":{"1051":1,"1056":1,"1063":17,"1064":2,"1065":4,"1066":4,"1070":1,"1073":1}}],["cgroupdriver",{"2":{"1212":1}}],["cgroupdriver=systemd",{"2":{"1208":1}}],["cgroups",{"2":{"1209":1}}],["cgroup来管理资源",{"2":{"1208":1}}],["cgroup",{"2":{"1082":1,"1198":2,"1209":3}}],["c6e1d107c5aa56a9c70fcd377c539e6ae28267e4f1660d9dd8ee5d7a40ac79e6",{"2":{"1055":1}}],["c073ffd0029a4a3e64b68f2a9e450a4389d0b81fc7221bfcd727448be48bea36",{"2":{"1054":1}}],["c时会退出容器并停止容器的运行",{"2":{"1005":1}}],["c++和",{"2":{"977":1}}],["cy",{"2":{"877":1,"879":2}}],["cypress进行端到端测试",{"2":{"882":1}}],["cypress也支持代码覆盖率的报告",{"2":{"880":1}}],["cypress配置包括全局",{"2":{"878":1}}],["cypress会根据测试用例模拟用户行为",{"2":{"877":1}}],["cypress",{"0":{"876":1},"1":{"877":1,"878":1,"879":1,"880":1,"881":1,"882":1},"2":{"876":1,"877":3,"878":3,"879":1,"880":8,"881":2,"883":3}}],["cyclone",{"2":{"251":1}}],["cycle",{"2":{"98":1}}],["cz",{"2":{"799":2,"800":3,"801":6,"802":4}}],["cp",{"2":{"726":2,"1178":2,"1208":2,"1214":2}}],["cpumanagerreconcileperiod",{"2":{"1212":1}}],["cpu",{"0":{"273":1},"2":{"740":1,"1195":1}}],["c8jusjjte1",{"2":{"713":1}}],["cwd",{"2":{"700":2}}],["cwr",{"2":{"376":1}}],["c2c2",{"2":{"581":2}}],["c2却没有改变",{"2":{"579":1}}],["c2中的children也发生了变化",{"2":{"579":1}}],["c2",{"2":{"577":5,"579":7,"580":6,"581":11,"582":5,"583":5}}],["c1f9f873cb89",{"2":{"1089":1}}],["c1f9f873cb89c803a905f3a8c61aed4bc8ab3f9184d00fa0327a9a6dfc6d70b7",{"2":{"1089":1}}],["c1并没有该属性",{"2":{"581":1}}],["c1c1",{"2":{"581":2}}],["c1改变了name后",{"2":{"579":1}}],["c1",{"2":{"577":7,"579":12,"580":4,"581":7,"582":6,"583":5}}],["c类私有地址",{"2":{"360":1}}],["c类地址的网络地址范围为192",{"2":{"359":1}}],["c类地址最高位为110",{"2":{"359":1}}],["c类地址",{"2":{"359":1}}],["c5e5a72af32f",{"2":{"998":2,"1002":2,"1012":1}}],["c5",{"2":{"298":1}}],["cicd",{"2":{"1223":1}}],["ci自动构建发布",{"2":{"1190":1}}],["ci更新",{"2":{"797":1}}],["ci",{"0":{"1190":1},"2":{"797":2,"801":3,"991":1,"1118":1,"1120":1,"1121":121,"1122":22,"1123":2,"1124":1,"1125":1,"1126":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1,"1141":1,"1142":7,"1143":1,"1144":1,"1145":1,"1147":1,"1148":1,"1149":2,"1167":1,"1190":4}}],["ciphers",{"2":{"726":2,"1178":1}}],["cidr=172",{"2":{"1214":1}}],["cidr=10",{"2":{"1214":1}}],["cidr",{"2":{"366":1,"1217":1}}],["circle",{"2":{"251":4}}],["circus",{"2":{"251":1}}],["circular",{"2":{"237":1}}],["cinema",{"2":{"251":1}}],["city",{"2":{"251":2}}],["cup",{"2":{"1227":1}}],["cupid",{"2":{"251":1}}],["customexportconditions",{"2":{"875":1}}],["customizable",{"2":{"801":3}}],["customizable插件进行自定义配置",{"2":{"801":1}}],["customi18nresolver",{"2":{"673":1,"674":1}}],["customproto",{"2":{"573":5}}],["custom",{"2":{"438":1,"573":1,"581":4,"656":2,"674":1,"726":1,"814":2,"1159":1,"1178":1,"1217":4}}],["customsyntax",{"2":{"847":1}}],["customscope",{"2":{"801":1}}],["customs",{"2":{"251":1}}],["custard",{"2":{"251":1}}],["currency",{"2":{"251":1}}],["currentinstance",{"2":{"944":3}}],["currently",{"2":{"814":1}}],["current",{"2":{"63":2,"83":8,"96":1,"771":7,"858":1}}],["curry",{"2":{"251":1}}],["curly",{"2":{"251":1}}],["curl",{"2":{"251":1,"342":1,"343":1,"382":1,"453":1,"456":2,"655":2,"723":1,"1058":2,"1066":2,"1217":1}}],["curdate",{"2":{"83":1}}],["curtime",{"2":{"83":1}}],["cjs",{"2":{"237":8}}],["crisocket",{"2":{"1212":1}}],["criuworkpath",{"2":{"1209":1}}],["criupath",{"2":{"1209":1}}],["criuimagepath",{"2":{"1209":1}}],["cri",{"2":{"1207":2,"1208":21,"1209":19,"1212":1,"1214":2,"1222":1}}],["crashkernel=auto",{"2":{"1202":1}}],["cracker",{"2":{"251":1}}],["crlf",{"2":{"836":1}}],["cr",{"2":{"836":1}}],["crt两个文件",{"2":{"1178":1}}],["crt",{"2":{"726":4,"1157":1,"1159":1,"1178":3,"1212":1}}],["credential",{"2":{"1045":1}}],["credentials",{"2":{"1034":1,"1045":1}}],["credit",{"2":{"251":1}}],["cref",{"2":{"934":2}}],["cream",{"2":{"251":1}}],["createsetter",{"2":{"964":2}}],["createserver",{"2":{"354":1}}],["creategetter",{"2":{"964":2}}],["creategetterinvoker",{"2":{"932":1}}],["createreactiveobject",{"2":{"964":2}}],["createreadstream",{"2":{"520":2,"700":3,"770":1}}],["createwatcher",{"2":{"937":3}}],["createwritestream",{"2":{"769":1,"770":1}}],["createcompilercreator",{"2":{"971":1}}],["createcompiler",{"2":{"971":1}}],["createcomputedgetter",{"2":{"932":3}}],["createchunks",{"2":{"768":2,"769":1,"772":1,"773":1}}],["createcat",{"2":{"612":1}}],["createuserdto",{"2":{"686":3}}],["createparamdecorator",{"2":{"619":2}}],["create方式更加完善",{"2":{"575":1}}],["create后面会讲",{"2":{"571":1}}],["createimagebitmap",{"2":{"498":1}}],["createobjecturl",{"2":{"485":1,"497":1,"498":1,"521":1}}],["createjsonp",{"2":{"338":1}}],["createdep",{"2":{"964":2}}],["createdocument",{"2":{"681":1,"687":1,"688":1}}],["created",{"2":{"239":1,"317":1,"707":1,"857":1,"998":2,"1002":2,"1006":1,"1103":1,"1107":1,"1121":1,"1184":1,"1191":1}}],["createelement",{"2":{"198":1,"338":1,"354":2,"404":2,"521":1,"748":1,"954":1}}],["createtreewalker使用",{"0":{"114":1},"1":{"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["create",{"0":{"574":1},"2":{"61":1,"64":1,"72":2,"75":2,"238":1,"405":1,"571":2,"574":2,"576":1,"579":1,"582":1,"583":1,"603":2,"606":4,"681":1,"692":1,"726":1,"784":2,"800":4,"814":2,"818":1,"857":1,"932":1,"955":2,"1014":1,"1073":1,"1089":1,"1097":1,"1098":1,"1113":2,"1216":1,"1217":2}}],["crescent",{"2":{"251":2}}],["crop",{"2":{"718":1}}],["crop一起使用",{"2":{"718":1}}],["crop等同时使用时无效果",{"2":{"718":1}}],["crontab",{"2":{"1204":1}}],["crontime",{"2":{"660":1,"661":1}}],["cronjob",{"2":{"661":1}}],["cron任务",{"2":{"660":1}}],["cron具体时间",{"2":{"660":1}}],["cron",{"2":{"658":1,"660":3,"661":2}}],["crown",{"2":{"251":1}}],["crocodile",{"2":{"251":1}}],["crossing",{"2":{"251":1}}],["crossed",{"2":{"251":1}}],["cross",{"2":{"182":3,"190":2,"251":1,"350":1,"351":1}}],["crystal",{"2":{"251":1}}],["crying",{"2":{"251":1}}],["cry",{"2":{"251":1}}],["cd自动构建npm包",{"0":{"1190":1}}],["cd中下载",{"2":{"1139":1}}],["cd中减小打包交付时间",{"2":{"1070":1}}],["cd等等",{"2":{"991":1}}],["cd",{"2":{"173":1,"251":1,"612":2,"718":1,"813":1,"1121":6,"1152":1,"1172":1,"1184":1}}],["cdn",{"2":{"130":1,"183":1}}],["ctd",{"2":{"1209":2}}],["ctl",{"2":{"1179":2}}],["ctl重启加载配置",{"2":{"1179":1}}],["ctl进行重新启动",{"2":{"1179":1}}],["ctorreturn",{"2":{"576":4}}],["ctor",{"2":{"576":5}}],["ctrl+x全部删除",{"2":{"431":1}}],["ctrl",{"2":{"157":2,"158":2,"161":5,"163":2,"164":2,"166":1}}],["ctx",{"2":{"127":2,"283":17,"284":7,"285":3,"497":2,"619":2,"639":3,"648":2,"651":2,"674":2}}],["ccd",{"2":{"1183":1}}],["ccs",{"2":{"1083":1}}],["cc",{"2":{"145":1,"708":1,"718":2,"894":1,"1128":1,"1228":1}}],["cni",{"2":{"1209":9,"1218":1}}],["cn$1",{"2":{"715":2,"716":1}}],["cn查看抓包记录",{"2":{"439":1}}],["cn查看charles的抓包",{"2":{"422":1}}],["cn是https协议地址",{"2":{"438":1}}],["cn就会打开我们的应用",{"2":{"128":1}}],["cn域名",{"2":{"128":1}}],["cn",{"2":{"128":1,"132":2,"222":1,"251":1,"293":1,"347":1,"350":1,"423":1,"438":1,"462":2,"568":3,"611":2,"617":1,"618":1,"673":1,"711":1,"715":2,"716":1,"726":4,"1039":1,"1045":1,"1083":2,"1174":1,"1178":2,"1209":1}}],["cname",{"2":{"61":2}}],["cbs中的执行方法需要手动添加",{"2":{"950":1}}],["cbs",{"2":{"950":2,"951":11}}],["cb2",{"2":{"937":1}}],["cb1",{"2":{"937":3}}],["cb为空",{"2":{"932":1}}],["cbc",{"2":{"329":1}}],["cb",{"2":{"98":4,"195":13,"200":4,"661":4,"692":2,"745":13,"750":4,"868":4,"870":7,"932":1,"938":13,"939":4,"940":2,"941":1,"944":6,"945":4,"950":2,"951":9,"954":4}}],["csi",{"2":{"1217":3}}],["csr",{"2":{"726":6,"904":1,"1178":7}}],["csrf攻击演示",{"0":{"352":1}}],["csrf攻击可以导致用户在不知情的情况下执行了恶意操作",{"2":{"351":1}}],["csrf",{"0":{"351":1},"1":{"352":1,"353":1},"2":{"320":1,"351":1}}],["cst",{"2":{"454":1,"728":1,"1082":1}}],["csp语法规则",{"2":{"350":1}}],["csp",{"2":{"350":8}}],["csma等等",{"2":{"312":1}}],["csdn",{"2":{"85":1}}],["css|less|scss|sass",{"2":{"857":1}}],["css$",{"2":{"190":1}}],["css文件",{"2":{"132":1}}],["css3中还增加了gfc和ffc",{"2":{"102":1}}],["css2",{"2":{"102":2,"104":1}}],["css新出的网格布局",{"2":{"21":1}}],["css新增的table属性",{"2":{"19":1}}],["css代码如下",{"2":{"12":1}}],["css",{"0":{"19":1,"850":1},"2":{"11":1,"12":2,"13":2,"14":1,"15":1,"16":1,"18":1,"19":1,"22":1,"110":2,"111":3,"112":2,"132":1,"134":1,"179":9,"181":1,"186":3,"190":7,"325":3,"350":2,"526":2,"705":1,"717":1,"727":1,"785":1,"842":4,"843":1,"857":1,"874":2,"1121":1}}],["css的10中居中方式",{"0":{"11":1},"1":{"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1}}],["c9q",{"2":{"49":1,"555":1}}],["capricorn",{"2":{"251":1}}],["capital",{"2":{"251":1}}],["caption",{"2":{"104":1}}],["captcha验证码的运用",{"2":{"61":1}}],["captcha",{"0":{"61":1},"2":{"61":7}}],["cableway",{"2":{"251":1}}],["cake",{"2":{"251":2}}],["camera",{"2":{"251":3}}],["camel",{"2":{"251":2}}],["cactus",{"2":{"251":1}}],["cacheunauthorizedttl",{"2":{"1212":1}}],["cacheauthorizedttl",{"2":{"1212":1}}],["cacheable",{"2":{"934":3}}],["cacheableoperations",{"2":{"818":1}}],["cachettl",{"2":{"1212":1}}],["cache选项可以强制docker从头开始构建镜像",{"2":{"1028":1}}],["cached",{"2":{"703":4,"805":1,"1051":2,"1054":1,"1055":1}}],["cachedirectory=true",{"2":{"190":1}}],["cache",{"0":{"1138":1},"2":{"132":10,"134":1,"168":4,"169":1,"187":1,"190":1,"197":3,"248":10,"263":1,"319":1,"344":1,"347":1,"616":1,"695":1,"708":5,"717":1,"718":10,"720":8,"721":19,"726":3,"747":3,"769":1,"770":1,"932":2,"994":1,"1028":1,"1069":2,"1138":2,"1159":6,"1179":2,"1203":1}}],["cachegroups",{"2":{"130":1,"187":1,"190":1}}],["category",{"2":{"1209":1}}],["cater",{"2":{"954":1}}],["cats",{"2":{"611":3,"612":1}}],["catmodule",{"2":{"605":1}}],["catcontroller",{"2":{"605":2}}],["catch装饰器装饰",{"2":{"639":1}}],["catch",{"0":{"639":1},"2":{"57":1,"98":6,"222":1,"230":1,"237":1,"244":1,"248":1,"404":1,"639":4,"771":2,"868":2,"941":1}}],["cat2",{"2":{"251":1}}],["cat",{"2":{"251":10,"368":1,"380":2,"381":2,"382":2,"386":1,"390":1,"572":14,"605":3,"610":2,"612":5,"613":4,"614":1,"618":1,"713":1,"718":1,"1095":2,"1183":1,"1205":1}}],["carousel",{"2":{"251":1}}],["cards",{"2":{"251":1}}],["card",{"2":{"251":2}}],["care",{"2":{"251":1}}],["car",{"2":{"228":2,"251":6}}],["can",{"2":{"1103":2,"1132":1,"1214":4,"1225":2}}],["canactivate",{"2":{"648":4}}],["canvasrenderingcontext2d",{"2":{"282":1}}],["canvas",{"0":{"282":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1},"2":{"282":1,"497":5}}],["canceled",{"2":{"1121":1}}],["cancel等方法",{"2":{"512":1}}],["cancel",{"2":{"508":1,"510":1,"512":1}}],["cancelbubble",{"2":{"200":2,"750":2}}],["cancer",{"2":{"251":1}}],["candy",{"2":{"148":1,"149":1,"251":1,"897":1,"898":1}}],["cannot",{"2":{"40":2,"546":2,"588":1,"1217":1}}],["castle",{"2":{"251":2}}],["cast",{"2":{"83":1}}],["case函数还有另外一种句法",{"2":{"83":1}}],["case函数的格式有些复杂",{"2":{"83":1}}],["case条件例程一样",{"2":{"83":1}}],["case",{"2":{"62":1,"83":7,"797":3,"955":6}}],["ca",{"2":{"61":3,"726":1,"1121":5,"1157":1,"1158":1,"1159":1,"1209":1,"1212":1,"1214":3,"1215":1}}],["calico网络组件",{"2":{"1222":1}}],["caliconetwork",{"2":{"1217":1}}],["calico",{"2":{"1087":1,"1217":27,"1218":9}}],["calendar",{"2":{"251":1}}],["calc",{"0":{"14":1},"2":{"11":1,"14":2,"22":1}}],["callwithasyncerrorhandling",{"2":{"945":1}}],["callwitherrorhandling",{"2":{"944":1,"945":2}}],["calls",{"2":{"857":2,"869":3}}],["callhandler",{"2":{"651":2}}],["callhook",{"2":{"239":2,"954":1}}],["calling",{"2":{"251":1,"857":1}}],["called",{"2":{"238":1,"621":6,"660":3,"944":1}}],["callback阶段执行",{"2":{"539":1}}],["callback=jsonpcb",{"2":{"338":1}}],["callback",{"2":{"195":2,"203":2,"465":1,"538":1,"745":2,"753":2,"869":2,"945":1}}],["call的参数是thisarg",{"2":{"3":1}}],["call介绍",{"0":{"3":1}}],["call",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"1":2,"3":2,"7":1,"33":2,"40":3,"154":1,"203":1,"225":2,"230":1,"232":1,"233":1,"238":1,"546":3,"576":1,"578":1,"580":1,"581":1,"582":1,"583":2,"592":1,"621":1,"753":1,"874":1,"903":1,"932":1,"938":3,"939":1,"941":1,"951":3,"954":5,"955":1,"1205":4}}],["c代码",{"2":{"40":1,"546":1}}],["c",{"2":{"34":1,"40":1,"61":4,"83":1,"97":1,"157":2,"164":1,"298":6,"342":1,"438":1,"485":2,"517":1,"546":1,"582":1,"713":1,"728":2,"785":1,"938":1,"977":1,"1063":1,"1064":3,"1083":1}}],["clusterip",{"2":{"1218":2}}],["clustercidr",{"2":{"1212":1}}],["clusterconfiguration",{"2":{"1212":1}}],["clusterdomain",{"2":{"1212":1}}],["clusterdns",{"2":{"1212":1}}],["clustername",{"2":{"1212":1}}],["cluster",{"2":{"1200":1,"1212":3,"1214":6,"1215":1,"1218":2}}],["clubs",{"2":{"251":1}}],["cls",{"2":{"434":2}}],["clearmocks",{"2":{"857":1}}],["clear",{"2":{"771":3,"857":2,"941":1,"1179":2}}],["cleartimeout",{"2":{"661":2}}],["clearinterval",{"2":{"343":1,"534":1,"661":2}}],["clearrect",{"2":{"283":1}}],["cleanupdeps",{"2":{"954":1}}],["cleanup",{"2":{"944":3,"945":5,"1209":1}}],["cleanupeffect",{"2":{"934":1}}],["cleanoncebeforebuildpatterns",{"2":{"184":2}}],["cleanwebpackplugin",{"2":{"184":3,"190":1}}],["clean",{"2":{"184":7}}],["cl",{"2":{"251":1,"1202":1}}],["clapper",{"2":{"251":1}}],["clap",{"2":{"251":1}}],["claim",{"2":{"222":1,"251":1}}],["classification",{"2":{"1121":1}}],["classic",{"2":{"428":1}}],["classic版本进行介绍",{"2":{"428":1}}],["classic版本",{"2":{"428":1}}],["classic等其他版本",{"2":{"428":1}}],["class继承",{"0":{"583":1}}],["classname",{"2":{"354":1}}],["classdecorator",{"2":{"228":1,"611":1}}],["class的id和student的class",{"2":{"86":1}}],["class",{"0":{"646":2},"2":{"86":2,"98":1,"190":1,"195":1,"199":2,"207":1,"225":1,"227":1,"228":2,"229":2,"230":2,"231":1,"232":1,"233":2,"239":1,"244":1,"245":1,"249":1,"386":1,"404":3,"583":4,"604":1,"605":2,"606":11,"607":1,"608":2,"609":2,"611":4,"612":1,"613":4,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"622":2,"624":3,"626":1,"628":1,"629":1,"630":1,"631":2,"632":1,"634":1,"635":1,"637":1,"639":1,"640":3,"642":1,"643":4,"645":2,"646":6,"648":2,"651":1,"652":2,"655":1,"659":1,"660":3,"661":4,"666":1,"667":1,"669":1,"671":1,"673":1,"674":1,"675":1,"683":1,"685":1,"686":3,"687":1,"700":2,"702":2,"745":1,"749":2,"757":1,"765":1,"771":1,"917":1,"932":4,"934":4,"938":2,"940":1,"941":1,"942":1,"951":3,"954":3,"955":2,"964":1,"1195":1}}],["class=",{"2":{"12":2,"13":2,"14":2,"15":2,"16":2,"17":5,"18":2,"19":2,"20":2,"21":2,"22":2,"110":3,"111":3,"112":3,"249":1,"404":2}}],["clone",{"2":{"602":2,"1208":1}}],["clonerange",{"2":{"462":1}}],["clonecontents",{"2":{"462":1}}],["clonedeep",{"2":{"34":1}}],["clonedeep用来做",{"2":{"34":1}}],["clothes",{"2":{"251":1}}],["clock930",{"2":{"251":1}}],["clock9",{"2":{"251":1}}],["clock830",{"2":{"251":1}}],["clock8",{"2":{"251":1}}],["clock730",{"2":{"251":1}}],["clock7",{"2":{"251":1}}],["clock630",{"2":{"251":1}}],["clock6",{"2":{"251":1}}],["clock530",{"2":{"251":1}}],["clock5",{"2":{"251":1}}],["clock430",{"2":{"251":1}}],["clock4",{"2":{"251":1}}],["clock330",{"2":{"251":1}}],["clock3",{"2":{"251":1}}],["clock230",{"2":{"251":1}}],["clock2",{"2":{"251":1}}],["clock1230",{"2":{"251":1}}],["clock12",{"2":{"251":1}}],["clock1130",{"2":{"251":1}}],["clock11",{"2":{"251":1}}],["clock1030",{"2":{"251":1}}],["clock10",{"2":{"251":1}}],["clock130",{"2":{"251":1}}],["clock1",{"2":{"251":1}}],["clockwise",{"2":{"251":1}}],["clock",{"2":{"251":1}}],["clover",{"2":{"251":1,"874":1}}],["cloudimg",{"2":{"1060":1}}],["cloud",{"2":{"251":1,"1013":1,"1210":1}}],["closepath",{"2":{"283":1}}],["close",{"2":{"201":1,"455":1,"510":1,"514":1,"516":2,"517":1,"521":1,"538":1,"621":3,"751":1,"770":1,"773":1}}],["closed",{"2":{"97":1,"251":6,"454":1,"621":1}}],["cli和容器运行时进行交互",{"2":{"1207":1}}],["clickcb",{"2":{"404":2}}],["click",{"2":{"338":1,"354":1,"404":10,"470":1,"521":1,"724":1,"879":1,"1034":1}}],["click=",{"2":{"61":1,"934":1,"936":1,"943":1}}],["clip",{"2":{"288":1}}],["clipboardevent",{"2":{"462":2}}],["clipboarddata",{"2":{"462":3}}],["clipboard",{"2":{"251":1}}],["cli",{"0":{"292":1},"1":{"293":1},"2":{"174":2,"602":2,"665":2,"703":2,"796":1,"800":1,"801":1,"805":1,"814":2,"1082":1,"1093":1}}],["clientcafile",{"2":{"1212":1}}],["clientconnection",{"2":{"1212":1}}],["clientconnect",{"2":{"354":2}}],["client去连接server",{"2":{"401":1}}],["client发送了fin报文后",{"2":{"384":1}}],["client如果不回复server端ack报文时",{"2":{"384":1}}],["client终于等到了server的fin请求",{"2":{"382":1}}],["client收到server的ack响应后",{"2":{"382":1}}],["client收到server的ack响应后进入established状态表示已连接",{"2":{"378":1}}],["client主动打开发送syn=1",{"2":{"378":1}}],["clientkeyexchange消息",{"2":{"333":1}}],["clientrandom",{"2":{"333":1}}],["clienthello",{"2":{"333":1}}],["clientheight",{"2":{"247":2}}],["clients",{"2":{"222":1,"354":1,"439":1}}],["client启动前台用户项目",{"2":{"56":1}}],["client",{"2":{"54":2,"56":2,"132":1,"317":8,"332":2,"354":2,"400":1,"436":1,"702":1,"708":2,"718":4,"726":1,"1007":1,"1082":3,"1093":2,"1177":1,"1179":1}}],["cosnole",{"2":{"643":1}}],["costs",{"2":{"148":1,"149":1,"154":1,"897":1,"898":1,"903":1}}],["cool",{"2":{"251":1}}],["cookiecookie会被拦截",{"2":{"414":1}}],["cookies是由server通过一定的算法加随机值计算而来",{"2":{"381":1}}],["cookies",{"2":{"381":3}}],["cookie支持",{"2":{"353":1}}],["cookie的路径",{"2":{"347":1}}],["cookie的作用域",{"2":{"347":1}}],["cookie的值",{"2":{"347":1}}],["cookie的名称",{"2":{"347":1}}],["cookie可以用于存储用户的会话信息",{"2":{"347":1}}],["cookie是一种存储在客户端的小型文本文件",{"2":{"347":1}}],["cookie或者其他",{"2":{"127":1}}],["cookie",{"0":{"347":1},"2":{"61":2,"168":1,"251":1,"319":1,"347":4,"353":5,"354":2,"414":1,"453":1,"729":3}}],["coaster",{"2":{"251":1}}],["corresponding",{"2":{"1225":1}}],["correcting",{"2":{"800":1}}],["cors",{"0":{"339":1},"2":{"336":1,"337":5,"339":2,"693":2,"724":1,"1034":1}}],["corn",{"2":{"251":1}}],["coredns",{"2":{"1217":3,"1218":1}}],["corejs",{"2":{"180":1}}],["corejs3",{"2":{"180":1}}],["core",{"2":{"180":1,"238":5,"239":1,"380":1,"603":1,"640":1,"643":1,"646":1,"648":1,"652":1,"681":1,"858":1,"932":3,"937":1,"941":1,"944":1,"954":9,"955":2,"1060":1,"1209":1}}],["coreybutler",{"2":{"93":1}}],["cocktail",{"2":{"251":1}}],["coffee",{"2":{"251":1,"1227":1}}],["coverage参数生成",{"2":{"857":1}}],["coverageprovider",{"2":{"857":1}}],["coveragepathignorepatterns",{"2":{"857":1}}],["coveragedirectory",{"2":{"857":1,"873":1}}],["coverage",{"2":{"841":1,"857":8,"873":2,"874":1,"880":4}}],["cover",{"2":{"251":1}}],["cow2",{"2":{"251":1}}],["cow",{"2":{"251":1}}],["cop",{"2":{"251":1}}],["copying",{"2":{"1214":2}}],["copyaugment",{"2":{"955":1}}],["copyright",{"2":{"251":1,"1228":1}}],["copy",{"0":{"1059":1},"2":{"34":1,"703":9,"1034":4,"1051":2,"1056":1,"1059":5,"1061":1,"1065":2,"1070":3,"1073":2,"1074":2}}],["collect",{"2":{"1209":1}}],["collectionhandlers",{"2":{"964":1}}],["collection",{"2":{"857":1}}],["collectcoveragefrom",{"2":{"857":1}}],["collectcoverage",{"2":{"857":2,"873":1}}],["collected",{"2":{"857":2}}],["collapse",{"2":{"462":1}}],["collapsed",{"2":{"462":1}}],["collapsewhitespace",{"2":{"176":1,"190":2}}],["collision",{"2":{"251":1}}],["cold",{"2":{"251":1}}],["colons",{"2":{"800":1}}],["colou",{"2":{"141":1,"890":1}}],["colour",{"2":{"141":2,"890":2}}],["color",{"2":{"22":2,"110":2,"111":2,"112":2,"141":2,"145":2,"179":1,"222":3,"534":4,"535":3,"890":2,"894":2}}],["codeactionsonsave",{"2":{"832":2,"840":1,"843":1}}],["code=exited",{"2":{"728":1}}],["codel",{"2":{"728":3}}],["code>",{"2":{"716":1}}],["code",{"2":{"155":1,"325":1,"344":1,"350":1,"404":1,"443":1,"448":3,"614":1,"639":3,"640":1,"646":1,"651":1,"652":1,"655":2,"686":1,"716":2,"785":7,"800":3,"830":1,"838":1,"857":2,"880":4,"971":3,"1034":1,"1074":1,"1103":1}}],["coding",{"2":{"56":1,"145":6,"154":4,"894":6,"903":4}}],["couplekiss",{"2":{"251":1}}],["couple",{"2":{"251":2}}],["count的值仅仅是一个字符串",{"2":{"936":1}}],["counter",{"2":{"595":2}}],["counterclockwise",{"2":{"251":1}}],["count++",{"2":{"533":1,"534":1,"595":1,"936":1,"943":1}}],["countqueuingstrategy",{"2":{"514":1,"516":1}}],["count",{"2":{"83":4,"533":2,"534":2,"535":2,"595":4,"715":1,"936":2,"937":4,"943":3}}],["could",{"2":{"64":1,"97":1,"1132":1}}],["com>",{"2":{"994":3,"1147":1}}],["com的所有二级域名都可以匹配到",{"2":{"710":1}}],["com的图片",{"2":{"350":1}}],["com表示exempe",{"2":{"710":1}}],["com映射到了127",{"2":{"425":1}}],["com来代替localhost域名",{"2":{"425":1}}],["com地址的请求",{"2":{"421":1}}],["com$1",{"2":{"729":1}}],["com$",{"2":{"353":1,"722":1}}],["com相关域名可以访问",{"2":{"353":1}}],["com域的都被禁止了",{"2":{"353":1}}],["com这种所有子域名等等",{"2":{"347":1}}],["comments",{"2":{"830":1,"954":2}}],["commit命令式构建新的镜像",{"2":{"1048":1}}],["commit对触发husky钩子并对commit信息进行验证",{"2":{"806":1}}],["commit了",{"2":{"806":1}}],["commit中就会添加一下信息",{"2":{"805":1}}],["commit简短信息",{"2":{"800":1}}],["committing",{"2":{"800":2}}],["commit",{"2":{"799":1,"800":3,"801":1,"805":1,"806":3,"807":1,"1000":2,"1002":1,"1003":1,"1082":2,"1103":1,"1107":1,"1121":16,"1184":1,"1191":1}}],["commitizen我更认为比较繁琐",{"2":{"802":1}}],["commitizen在commit前触发",{"2":{"802":1}}],["commitizen可以与commitlint结合使用",{"2":{"802":1}}],["commitizen",{"0":{"798":1},"1":{"799":1,"800":1,"801":1,"802":1},"2":{"799":2,"801":1}}],["commitlint主要在commit阶段对提交信息进行校验",{"2":{"802":1}}],["commitlint主要在commit时对提交信息进行校验",{"2":{"798":1}}],["commitlintrc",{"2":{"797":1,"802":1}}],["commitlint",{"0":{"795":1},"1":{"796":1,"797":1},"2":{"795":5,"796":3,"797":4,"802":2,"806":2}}],["commit规范",{"2":{"783":1}}],["commonmodule",{"2":{"643":1,"646":1,"652":1,"669":1,"673":1}}],["commonancestorcontainer",{"2":{"462":1}}],["commonjs规范",{"2":{"237":1}}],["commonjs",{"2":{"237":3,"828":1}}],["common",{"2":{"187":1,"190":1,"237":4,"604":1,"611":2,"612":1,"613":4,"614":1,"615":1,"616":1,"617":1,"618":1,"619":3,"622":1,"634":2,"637":1,"639":1,"640":6,"642":1,"643":4,"645":1,"646":1,"648":4,"651":1,"652":2,"655":1,"659":1,"660":3,"661":1,"665":2,"669":2,"673":2,"674":1,"675":1,"676":3,"700":1,"702":1,"726":2,"1082":1,"1093":1,"1178":2}}],["command>",{"2":{"1058":1}}],["commandline",{"2":{"1045":1,"1076":1}}],["commander",{"2":{"293":1}}],["command",{"2":{"156":3,"157":26,"158":14,"159":6,"160":10,"161":3,"162":15,"163":12,"164":14,"165":2,"166":4,"1004":2,"1005":2,"1006":1,"1027":1,"1035":1,"1063":1,"1064":1,"1066":1,"1216":1}}],["community",{"2":{"68":1,"1082":2}}],["compiledresult",{"2":{"971":1}}],["compiletofunctions",{"2":{"954":1}}],["compileroptions",{"2":{"863":2,"882":1,"971":1}}],["compiler",{"0":{"294":1},"2":{"237":2,"238":2,"954":2}}],["computed等这些功能其实都很简单",{"2":{"964":1}}],["computed等等",{"2":{"953":1}}],["computed通知自己dep中收集的所有依赖进行更新",{"2":{"934":1}}],["computed的effect",{"2":{"934":1}}],["computed的内部实现过程",{"2":{"934":1}}],["computed真正的对象",{"2":{"934":1}}],["computedrefimpl",{"2":{"934":6}}],["computedrefimpl实例化首先会创建reactiveeffect",{"2":{"934":1}}],["computedsetter",{"2":{"934":2}}],["computed在通知render函数重新渲染",{"2":{"934":1}}],["computed可以通过cache",{"2":{"932":1}}],["computedgetter",{"2":{"932":1,"934":3}}],["computed时",{"2":{"932":1}}],["computedwatchers",{"2":{"932":4}}],["computed",{"2":{"929":1,"930":1,"931":1,"932":6,"934":8,"964":2}}],["computers",{"2":{"438":1}}],["computer",{"2":{"251":1}}],["completion",{"2":{"729":1}}],["complete",{"2":{"621":1,"1082":1,"1103":1,"1132":1,"1179":1}}],["completed",{"2":{"621":1}}],["compat",{"2":{"708":1,"718":2}}],["compatible",{"2":{"222":1}}],["comparepoint",{"2":{"462":1}}],["compareboundarypoints",{"2":{"462":1}}],["compose配置文件安装",{"2":{"1173":1}}],["compose配置的讲解就到这里",{"2":{"1026":1}}],["compose命令使用方法参考👉官方文档",{"2":{"1033":1}}],["compose命令的",{"2":{"1024":1}}],["compose定义的服务的容器",{"2":{"1030":1,"1031":1,"1032":1}}],["compose定义的所有服务",{"2":{"1029":1}}],["compose文件中定义的环境变量会覆盖",{"2":{"1024":1}}],["compose文件中定义了环境变量",{"2":{"1024":1}}],["compose文件中",{"2":{"1024":1}}],["compose文件中的环境变量会覆盖dockerfile中的环境变量",{"2":{"1024":1}}],["compose文件时",{"2":{"1023":1}}],["compose中",{"2":{"1020":1}}],["compose帮我们统一管理这些服务",{"2":{"1019":1}}],["compose的配置是个yaml文件",{"2":{"1019":1}}],["compose是将整个应用的所有容器全部写在了同一个配置文件中",{"2":{"1018":1}}],["compose是docker官方提供的一个工具",{"2":{"1016":1}}],["compose有以下优势",{"2":{"1017":1}}],["compose来解决多容器部署",{"2":{"1016":1}}],["composer",{"2":{"436":1}}],["compose",{"2":{"414":1,"1016":1,"1017":6,"1018":3,"1027":1,"1028":1,"1029":2,"1030":1,"1031":1,"1032":1,"1034":12,"1035":2,"1082":1,"1093":1,"1173":1}}],["componentdidmount",{"2":{"199":1,"749":1}}],["component>",{"2":{"199":1,"239":1,"749":1}}],["componentrender",{"2":{"199":2,"749":2}}],["componentwillmount",{"2":{"199":1,"749":1}}],["component",{"2":{"199":3,"229":1,"230":1,"231":1,"238":3,"239":1,"749":3,"790":1,"800":1,"878":1,"883":1,"932":6,"937":3,"938":3,"954":9,"1212":1}}],["components",{"2":{"54":2,"131":1,"238":3,"801":1,"875":2}}],["competition",{"2":{"222":2}}],["compressionwebpackplugin",{"2":{"697":2}}],["compression",{"2":{"696":3,"697":1,"698":2}}],["compressnet",{"2":{"454":1}}],["compress",{"2":{"190":1}}],["comp",{"2":{"134":1,"717":3}}],["com",{"2":{"49":1,"66":1,"93":1,"132":1,"193":1,"218":2,"223":1,"229":1,"245":2,"249":1,"270":1,"280":5,"293":1,"316":3,"325":1,"350":8,"354":1,"400":1,"410":1,"412":1,"425":1,"426":1,"427":1,"443":1,"448":3,"541":3,"555":1,"568":1,"602":1,"663":1,"688":1,"689":1,"693":2,"698":5,"710":2,"722":2,"723":1,"725":3,"726":13,"736":1,"821":1,"1014":1,"1045":1,"1046":1,"1064":4,"1076":4,"1082":2,"1083":4,"1093":1,"1120":1,"1121":3,"1124":1,"1125":1,"1126":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":3,"1137":3,"1138":1,"1139":1,"1140":1,"1141":1,"1142":4,"1143":1,"1144":1,"1145":1,"1147":1,"1148":1,"1149":2,"1154":1,"1157":2,"1158":1,"1159":1,"1165":1,"1170":1,"1171":3,"1176":3,"1178":4,"1188":2,"1192":3,"1204":2,"1208":4,"1209":3,"1210":4,"1212":1,"1214":1,"1217":2,"1228":1}}],["conntrack",{"2":{"1206":2,"1212":1}}],["conn",{"2":{"725":1}}],["connectors",{"2":{"1042":1}}],["connect勾选上☑️",{"2":{"438":1}}],["connect",{"2":{"320":1,"350":1,"379":1,"723":1,"726":1,"1039":1}}],["connect或者自己定义一些高阶组件",{"2":{"199":1,"749":1}}],["connections",{"2":{"383":1,"621":3,"709":1}}],["connection",{"2":{"83":1,"97":1,"319":1,"342":1,"343":1,"344":1,"347":1,"354":4,"379":1,"453":1,"455":1,"723":2,"1039":1}}],["connected",{"2":{"56":1}}],["concepts",{"2":{"1214":1}}],["concurrency",{"2":{"771":8}}],["concurrent=10",{"2":{"1126":1}}],["concurrent",{"2":{"568":1,"1121":2,"1159":1,"1209":1}}],["concat",{"0":{"29":1},"2":{"9":2,"29":1,"30":1,"83":3,"237":1}}],["congestion",{"2":{"376":2}}],["congratulations",{"2":{"251":1}}],["conventional",{"2":{"796":1,"797":1,"799":1,"800":1,"802":1}}],["conventional常规的配置",{"2":{"796":1}}],["convenience",{"2":{"251":1}}],["convert",{"2":{"40":3,"546":3}}],["conf进行nginx的配置与转发",{"2":{"1034":1}}],["confirmation",{"2":{"1174":1}}],["confirmcommit",{"2":{"801":1}}],["confirm",{"2":{"726":2,"1178":2}}],["config=",{"2":{"1209":2}}],["config的selinux状态改为enforcing",{"2":{"1202":1}}],["configsyncperiod",{"2":{"1212":1}}],["configs",{"2":{"1035":1,"1209":1,"1212":1}}],["configservice",{"0":{"629":1},"2":{"627":1,"629":3}}],["config>",{"2":{"1020":1,"1021":1,"1022":1}}],["configures",{"2":{"1217":2}}],["configured",{"2":{"877":1}}],["configure",{"2":{"635":1,"708":1,"718":2,"1045":1}}],["configurations",{"2":{"400":1,"401":1,"966":1}}],["configuration",{"0":{"445":1},"1":{"446":1,"447":1,"448":1},"2":{"301":1,"630":2,"632":1,"693":1,"708":2,"728":1,"857":3,"1051":1,"1217":1}}],["configurable",{"2":{"229":1,"231":3,"932":1,"949":1,"950":2,"951":4,"954":1}}],["configtype",{"2":{"631":1}}],["configfactory>",{"2":{"628":1}}],["configmodule读取当前文件",{"2":{"669":1}}],["configmodule用来加载配置文件",{"2":{"628":1}}],["configmodule",{"0":{"628":1},"2":{"628":1,"630":1,"631":1,"632":1,"669":2}}],["config包来方便应用程序配置",{"2":{"627":1}}],["config作为了rollup的参数",{"2":{"237":1}}],["config",{"2":{"54":5,"64":1,"130":1,"132":1,"175":5,"176":1,"177":5,"179":1,"180":1,"181":1,"182":8,"183":1,"184":2,"185":1,"186":1,"187":1,"188":1,"189":1,"190":3,"237":6,"238":2,"268":3,"665":1,"681":2,"702":1,"790":1,"795":1,"796":2,"797":1,"800":2,"801":3,"802":4,"839":1,"840":1,"846":8,"857":3,"858":3,"862":1,"863":1,"873":1,"875":4,"878":2,"880":4,"1014":4,"1020":1,"1045":1,"1082":1,"1093":1,"1102":1,"1121":1,"1126":1,"1152":1,"1153":1,"1156":1,"1157":4,"1159":4,"1171":2,"1172":2,"1173":1,"1175":2,"1176":1,"1177":1,"1178":1,"1190":1,"1202":1,"1209":8,"1212":3,"1213":3,"1214":5}}],["conf结尾的配置文",{"2":{"709":1}}],["conflict",{"2":{"317":1}}],["confetti",{"2":{"251":1}}],["confounded",{"2":{"251":1}}],["confused",{"2":{"251":1}}],["conf",{"2":{"190":11,"708":4,"709":5,"713":1,"718":4,"728":2,"1034":2,"1051":4,"1205":2,"1209":11,"1212":1,"1214":4}}],["conf来配置单独应用",{"2":{"128":1}}],["contribution",{"2":{"1225":1}}],["contributor",{"2":{"1103":1,"1107":1}}],["controlplaneendpoint",{"2":{"1212":1}}],["control还支持更为灵活的控制方式",{"2":{"720":1}}],["control可以使用的参数如下",{"2":{"720":1}}],["control进行缓存",{"2":{"720":1}}],["control请求头设置缓存",{"2":{"720":1}}],["control头信息",{"2":{"616":1}}],["controls",{"2":{"520":1}}],["controls=",{"2":{"520":1}}],["controllermanager",{"2":{"1212":1}}],["controllerkey",{"2":{"688":2}}],["controller中创建业务相关的路由",{"2":{"666":1}}],["controller中使用",{"2":{"606":1}}],["controller和injectable的模块代码提供了生命周期钩子事件",{"2":{"621":1}}],["controller也支持provider的作用域生命周期",{"2":{"620":1}}],["controlleroptions",{"2":{"611":1}}],["controller装饰器进行装饰",{"2":{"605":1}}],["controllers用来给当前模块提供路由控制器类",{"2":{"605":1}}],["controllers",{"0":{"605":1},"2":{"604":2,"605":1,"606":6,"624":1,"628":1,"630":1,"631":1,"632":1,"635":1,"659":1,"1217":1,"1218":2}}],["controller同上",{"2":{"514":1}}],["controller是一个",{"2":{"514":1}}],["controller是个",{"2":{"510":1}}],["controller",{"0":{"610":1},"1":{"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"620":1},"2":{"510":6,"514":4,"517":5,"604":1,"605":1,"606":3,"610":1,"611":7,"612":2,"613":8,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"624":1,"626":1,"629":1,"631":1,"636":1,"637":2,"640":4,"642":2,"643":9,"645":1,"646":1,"648":2,"652":2,"655":2,"659":1,"660":6,"661":5,"665":4,"666":1,"671":1,"675":1,"687":1,"700":3,"702":1,"1209":2,"1217":1}}],["control",{"2":{"251":1,"319":1,"337":2,"339":4,"344":1,"347":1,"357":1,"374":1,"404":1,"414":1,"422":1,"616":1,"692":4,"695":1,"720":6,"724":3,"1034":4,"1200":1,"1214":6,"1217":2}}],["containter",{"2":{"1116":1}}],["contains",{"2":{"879":1}}],["containerd=",{"2":{"1082":1}}],["containerd",{"0":{"1209":1},"2":{"1082":4,"1093":1,"1209":68,"1212":2,"1217":3}}],["container=999511b43ca0ffa61979ccb6561ff20f499b087be99aba95836cee20edb794a3",{"2":{"994":1}}],["containers",{"2":{"994":1,"1208":1,"1209":1,"1212":1,"1214":1}}],["container",{"2":{"110":4,"111":3,"112":3,"994":3,"995":1,"1000":1,"1005":2,"1006":1,"1007":2,"1008":3,"1009":3,"1022":3,"1034":2,"1081":1,"1082":1,"1087":1,"1116":3,"1121":8,"1208":2,"1209":4,"1217":1,"1218":1}}],["continue",{"2":{"317":1,"1227":1}}],["contents",{"2":{"1103":1,"1189":1}}],["contenttype",{"2":{"651":3,"1212":1}}],["content=",{"2":{"222":8,"671":1}}],["contentbase",{"2":{"190":1}}],["content",{"2":{"20":1,"61":1,"317":2,"319":3,"320":2,"337":3,"342":3,"344":4,"350":6,"453":2,"520":5,"521":2,"651":2,"716":1,"717":1,"723":2,"729":3,"765":1,"769":1,"770":2,"772":2,"1034":1,"1209":1,"1225":1}}],["contexts",{"2":{"857":2}}],["context接受客户的请求",{"2":{"197":1,"747":1}}],["context有bfc",{"2":{"102":1}}],["context",{"0":{"102":1},"2":{"7":8,"8":7,"9":2,"102":2,"498":1,"648":3,"651":2,"674":2,"703":3,"1034":2,"1051":3,"1054":1,"1055":1,"1068":1,"1082":1,"1209":1}}],["conditional",{"2":{"83":2}}],["consumer",{"2":{"635":4}}],["const关键字定义的变量只能在当前代码块中使用",{"2":{"589":1}}],["const定义的变量未声明之前是不能使用的",{"2":{"588":1}}],["constants",{"2":{"665":1}}],["constant",{"2":{"229":2,"588":1}}],["consturctor>",{"2":{"228":1}}],["consturctor",{"2":{"228":1}}],["construction",{"2":{"251":2}}],["constructor属性为自己",{"2":{"582":1}}],["constructor>",{"2":{"229":2}}],["constructor",{"2":{"98":1,"195":1,"196":1,"201":1,"207":2,"228":1,"229":2,"232":2,"233":2,"238":1,"239":1,"244":1,"245":1,"247":1,"248":1,"249":1,"576":2,"582":1,"583":4,"606":3,"608":1,"624":1,"626":1,"629":1,"631":1,"648":1,"661":4,"666":1,"745":1,"746":1,"751":1,"757":2,"771":1,"932":1,"934":2,"938":1,"951":3,"954":2,"955":3,"963":1,"964":1}}],["construtor",{"2":{"227":1}}],["const",{"2":{"7":1,"9":2,"33":4,"57":6,"60":2,"62":4,"64":6,"98":10,"127":1,"137":1,"175":1,"176":1,"182":2,"184":1,"190":13,"195":1,"197":5,"198":2,"199":1,"200":1,"201":1,"202":1,"229":2,"230":6,"232":10,"237":7,"238":1,"239":1,"244":2,"245":5,"247":3,"248":1,"249":2,"347":2,"354":10,"404":10,"455":2,"483":1,"485":5,"491":4,"496":2,"497":3,"507":2,"510":1,"512":3,"514":5,"516":3,"517":3,"520":13,"521":9,"534":2,"571":4,"573":1,"576":5,"577":2,"578":1,"579":3,"580":2,"581":4,"582":2,"583":2,"588":2,"590":1,"593":1,"603":2,"619":2,"629":1,"630":1,"631":1,"634":3,"639":7,"645":1,"648":6,"651":5,"661":10,"669":2,"674":3,"681":3,"687":4,"692":1,"700":2,"702":1,"723":2,"745":1,"747":5,"748":2,"749":1,"750":1,"751":1,"752":1,"765":5,"768":5,"769":8,"770":6,"771":10,"772":9,"773":7,"839":2,"863":2,"866":2,"867":2,"869":1,"870":1,"874":1,"875":1,"878":1,"880":2,"886":1,"932":7,"934":7,"937":3,"938":6,"939":1,"940":1,"941":3,"944":6,"945":3,"950":1,"951":12,"954":16,"955":16,"956":1,"958":2,"959":7,"960":2,"961":2,"962":1,"963":2,"964":14,"971":3,"1034":3,"1074":2,"1103":1,"1183":1,"1184":1}}],["console警告",{"2":{"830":1}}],["console分析等等",{"2":{"778":1}}],["console",{"2":{"2":1,"3":1,"4":1,"26":4,"28":2,"29":1,"30":2,"32":2,"33":2,"34":1,"38":1,"48":1,"57":1,"61":1,"64":4,"98":16,"145":3,"154":1,"175":2,"195":7,"196":1,"197":3,"199":4,"201":1,"202":1,"203":1,"204":2,"205":4,"206":2,"222":5,"225":1,"228":1,"229":1,"230":2,"233":2,"244":1,"347":1,"354":5,"404":6,"455":1,"491":5,"496":1,"497":1,"499":1,"510":2,"512":2,"517":2,"529":1,"532":13,"533":1,"538":4,"539":4,"540":3,"544":1,"554":1,"571":7,"572":7,"573":11,"574":1,"575":3,"576":3,"577":6,"578":3,"579":6,"580":4,"581":6,"582":6,"583":9,"587":7,"588":7,"589":6,"590":1,"591":1,"594":2,"595":2,"606":4,"613":7,"614":1,"618":1,"619":1,"624":1,"629":1,"631":1,"634":1,"639":1,"642":1,"645":1,"646":1,"648":1,"660":3,"661":4,"701":2,"702":2,"723":1,"745":7,"746":1,"747":3,"749":4,"751":1,"752":1,"753":1,"754":2,"755":4,"756":2,"771":3,"772":2,"828":2,"830":1,"831":4,"894":3,"903":1,"930":1,"932":1,"936":1,"943":1,"950":4,"951":9,"955":1,"958":2,"959":3,"960":2,"962":2,"963":2,"1034":3,"1074":2,"1103":1,"1174":1,"1184":1}}],["chmod",{"2":{"1206":1}}],["chmod=",{"2":{"1059":2,"1060":2}}],["chown",{"2":{"1094":1,"1214":2}}],["chown=1",{"2":{"1059":1}}],["chown=",{"2":{"1059":2,"1060":2}}],["choose",{"2":{"857":1}}],["choices",{"2":{"800":1,"801":1}}],["chore",{"2":{"789":1,"797":2,"801":2}}],["chocolate",{"2":{"251":1}}],["chk",{"2":{"728":1}}],["chls后缀保存",{"2":{"414":1}}],["ch",{"2":{"347":2}}],["church",{"2":{"251":1}}],["chunkpaths",{"2":{"770":6}}],["chunkpath",{"2":{"769":2,"770":4}}],["chunk目标地址",{"2":{"769":1}}],["chunk索引",{"2":{"769":1}}],["chunk文件数据",{"2":{"769":1}}],["chunklist",{"2":{"768":3}}],["chunk为读取的数据",{"2":{"516":1}}],["chunk表示当前要写入的数据块",{"2":{"514":1}}],["chunk",{"2":{"510":2,"514":4,"516":3,"517":5,"521":3,"768":2,"769":9,"770":3,"771":1,"772":9,"773":3}}],["chunked",{"2":{"343":5}}],["chunkfilename",{"2":{"132":1}}],["chunkhash",{"2":{"132":2}}],["chunksrequest",{"2":{"769":2}}],["chunksformdata",{"2":{"769":2}}],["chunksize",{"2":{"497":3,"520":2,"768":3}}],["chunks",{"2":{"130":1,"187":2,"190":4,"510":3,"516":2,"768":1,"769":2,"772":3,"773":4}}],["christmas",{"2":{"251":1}}],["chromium",{"2":{"40":1,"49":3,"347":1,"546":1,"555":3}}],["chrome点击启动",{"2":{"966":1}}],["chrome为每个tab页面提供一个渲染进程",{"2":{"526":1}}],["chrome",{"0":{"427":1},"2":{"56":1,"223":1,"280":4,"347":1,"404":1,"405":1,"406":1,"407":1,"427":1,"428":1,"525":1,"740":1,"966":2,"1005":1,"1007":1}}],["chrome57+",{"2":{"22":1}}],["chrome19+",{"2":{"22":1}}],["chrome4+",{"2":{"22":8}}],["chinacloudsites",{"2":{"726":2,"1178":2}}],["chilrent",{"2":{"581":1}}],["childob",{"2":{"954":2,"955":7}}],["child也会继承parent的静态属性",{"2":{"583":1}}],["child也会拥有相同的静态属性",{"2":{"583":1}}],["child类也继承了父类的静态属性",{"2":{"583":1}}],["child实例也会拥有parent内部的实例属性和方法",{"2":{"580":1}}],["child2",{"2":{"579":4,"580":1,"581":3}}],["child1",{"2":{"579":4,"580":1,"581":3}}],["child",{"2":{"350":2,"577":6,"578":8,"580":5,"582":10,"583":14,"1121":1}}],["children获取属性时",{"2":{"579":1}}],["children的具体实现",{"2":{"207":2,"757":2}}],["children",{"2":{"207":1,"251":1,"579":5,"580":1,"581":6,"582":4,"583":7,"757":1}}],["children要渲染在name为joe的div中",{"2":{"207":1,"757":1}}],["chime",{"2":{"251":1}}],["chicken",{"2":{"251":1}}],["chick",{"2":{"85":1,"251":3}}],["chef",{"2":{"1179":1}}],["cheney算法将新生代内存一分为二",{"2":{"559":1}}],["cheney算法",{"2":{"559":1}}],["cherries",{"2":{"251":1}}],["cherry",{"2":{"2":1,"3":1,"4":1,"251":1}}],["chestnut",{"2":{"251":1}}],["checksum>",{"2":{"1060":1}}],["checksum=",{"2":{"1060":1}}],["checksum",{"2":{"1051":1}}],["check",{"2":{"251":3,"538":1,"728":3,"1159":1}}],["checkbox也可以认为是装饰器模式",{"2":{"199":1,"749":1}}],["checkered",{"2":{"251":1}}],["checker",{"2":{"197":2,"747":2}}],["cheap",{"2":{"183":2,"190":1}}],["channel",{"2":{"1121":1}}],["changed",{"2":{"800":1,"814":1}}],["changelog",{"2":{"799":1,"800":1}}],["changesets用来解决monorepo仓库的包版本管理方案",{"2":{"821":1}}],["changesets",{"0":{"821":1},"2":{"821":2}}],["changes",{"0":{"792":1},"2":{"800":3,"801":2,"1136":1}}],["changecipherspec",{"2":{"333":2}}],["change",{"2":{"280":1,"792":1,"800":8,"828":1}}],["change=",{"2":{"63":2}}],["chatops",{"2":{"1121":3}}],["chat",{"2":{"354":4,"1121":4}}],["chainordernormal",{"2":{"205":2,"755":2}}],["chainorder200",{"2":{"205":3,"755":3}}],["chainorder500",{"2":{"205":6,"755":6}}],["chain",{"2":{"205":8,"517":1,"755":8}}],["chaining",{"2":{"98":1}}],["charat",{"2":{"954":1}}],["characters",{"2":{"801":1}}],["charset",{"2":{"836":1}}],["charset=utf",{"2":{"342":1,"453":1,"723":1}}],["charset=utf8",{"2":{"75":1,"86":2}}],["charset=",{"2":{"110":2,"111":1,"112":1,"222":1,"671":1,"724":1}}],["chars",{"2":{"800":1}}],["charles也是基于客户端和服务端中间的代理",{"2":{"426":1}}],["charles抓取不到localhost的流量",{"2":{"425":1}}],["charles抓包工具和fiddler原理类似也是基于http请求中间人代理",{"2":{"411":1}}],["charles抓包工具",{"0":{"411":1},"1":{"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1}}],["charles却抓取不到",{"2":{"425":1}}],["charles",{"2":{"421":1,"422":1}}],["charles内部已经内置了集中网络环境",{"2":{"420":1}}],["charles可以模拟不同的网络环境",{"2":{"420":1}}],["charlesproxy",{"2":{"412":1,"425":3,"426":1}}],["charles支持windows",{"2":{"412":1}}],["charles同样有些功能也是需要收费的",{"2":{"411":1}}],["charles相比fiddler更加简洁",{"2":{"411":1}}],["chart",{"2":{"251":4}}],["char",{"2":{"83":2}}],["ce",{"2":{"1082":5,"1093":5,"1171":3,"1172":1,"1173":1,"1209":2}}],["certs",{"2":{"726":1,"1152":2,"1153":2,"1157":1}}],["cert",{"2":{"726":2,"1121":1,"1209":2,"1214":3,"1215":1}}],["certificatesdir",{"2":{"1212":1}}],["certificates",{"2":{"726":4,"1158":1}}],["certificate",{"2":{"333":1,"421":1,"422":1,"710":2,"726":2,"1178":2,"1214":2}}],["cetificate",{"2":{"726":3,"1178":3}}],["centos安装",{"0":{"1180":1}}],["centos",{"2":{"707":2,"1004":1,"1082":1,"1093":1,"1209":1,"1217":3}}],["center",{"2":{"16":1,"17":2,"18":1,"19":1,"20":2,"21":2,"284":2}}],["ceiling",{"2":{"83":1}}],["cell",{"2":{"19":1,"104":1}}],["nc",{"2":{"1228":1}}],["nf",{"2":{"1205":4,"1206":2}}],["ntpdate",{"2":{"1204":1}}],["ntoa",{"2":{"83":2}}],["n依次命名",{"2":{"1134":1}}],["n到job",{"2":{"1134":1}}],["nszuma5pkurmw==",{"2":{"1103":1}}],["nswbmw",{"2":{"736":1}}],["njs",{"2":{"1054":1,"1055":2}}],["npn",{"2":{"844":1}}],["npx",{"2":{"784":1,"797":3,"799":1,"804":1,"805":1,"806":3,"814":1,"818":1,"849":1,"857":1,"860":1,"873":1}}],["npm私有仓库的搭建方式有很多种",{"2":{"1181":1}}],["npmrc追踪",{"2":{"1187":1}}],["npmrc为你的group地址",{"2":{"1107":1}}],["npmrc添加仓库地址",{"2":{"1103":1}}],["npmrc添加npm仓库",{"2":{"1103":1}}],["npmrc中的仓库注释掉",{"2":{"1103":1}}],["npmrc文件中",{"2":{"1189":1}}],["npmrc文件",{"2":{"1102":1,"1187":1,"1190":1,"1191":1}}],["npmrc",{"2":{"800":1,"1107":2,"1187":1,"1190":2}}],["npm安装",{"2":{"218":1}}],["npm",{"0":{"743":1,"813":1},"2":{"56":3,"96":2,"97":5,"173":1,"180":1,"181":1,"182":2,"190":2,"217":1,"218":1,"602":1,"701":1,"796":1,"800":2,"810":1,"813":6,"814":1,"815":1,"818":1,"819":1,"831":1,"846":1,"856":1,"858":1,"860":1,"864":1,"874":1,"875":2,"877":1,"879":1,"880":1,"1034":2,"1070":2,"1073":2,"1074":2,"1097":1,"1102":5,"1103":35,"1107":11,"1108":4,"1125":3,"1141":1,"1142":1,"1145":2,"1147":2,"1183":2,"1184":10,"1187":6,"1188":1,"1189":18,"1190":9,"1191":9,"1192":1}}],["nvda无障碍测试",{"2":{"779":1}}],["nvm",{"2":{"93":1,"95":3,"96":4,"97":1}}],["nvm切换node版本",{"0":{"92":1},"1":{"93":1,"94":1,"95":1,"96":1,"97":1}}],["nmap",{"2":{"454":3}}],["n个大小",{"2":{"394":1}}],["nx会根据上次的产物进行计算",{"2":{"818":1}}],["nx是nrwl推出的专门为angular和react等现代web应用提供工具和解决方案的公司",{"2":{"818":1}}],["nx",{"0":{"818":1},"2":{"281":1,"814":1,"816":1,"818":5}}],["nghttp",{"2":{"325":1}}],["ng",{"2":{"251":1}}],["nginx和dockerfile",{"2":{"1034":1}}],["nginx映射宿主机10010端口到容器的80端口",{"2":{"1034":1}}],["nginx做反向代理到nodejshtml",{"2":{"1034":1}}],["nginx静态文件路径挂载到宿主机上指定位置",{"2":{"1004":1}}],["nginx容器内部的",{"2":{"1004":1}}],["nginx手册",{"2":{"730":1}}],["nginx官方文档",{"2":{"730":1}}],["nginx很难保持永久正常服务状态",{"2":{"728":1}}],["nginxssl",{"2":{"726":1}}],["nginxserver",{"2":{"128":1,"134":1,"353":1,"710":1,"711":1,"712":2,"713":1,"715":1,"716":1,"717":1,"718":1,"720":2,"722":1,"723":1,"726":1,"727":2}}],["nginxupstream",{"2":{"725":1}}],["nginxproxy",{"2":{"721":1}}],["nginx默认支持静态资源的缓存和代理缓存",{"2":{"719":1}}],["nginx中可以使用nginx",{"2":{"725":1}}],["nginx中可以使用http",{"2":{"718":1}}],["nginx中支持rewrite和return关键字进行重定向",{"2":{"714":1}}],["nginxgzip",{"2":{"717":1}}],["nginx找到和请求uri匹配度最高的",{"2":{"711":1}}],["nginxinclude",{"2":{"709":1}}],["nginx支持内容缓存和压缩",{"2":{"706":1}}],["nginx支持模块化扩展",{"2":{"705":1}}],["nginx的配置文件结构清晰",{"2":{"705":1}}],["nginx在处理静态文件方面",{"2":{"705":1}}],["nginx可以将请求分发到多个后端服务器",{"2":{"705":1}}],["nginx可以作为反向代理服务器",{"2":{"705":1}}],["nginx具有故障自动恢复",{"2":{"705":1}}],["nginx具有高并发",{"2":{"705":1}}],["nginx监听了80端口",{"2":{"383":1}}],["nginx配置跨域传送门",{"2":{"691":1}}],["nginx配置跨域",{"2":{"339":1}}],["nginxlocation",{"2":{"325":1,"717":1}}],["nginx使用手册",{"0":{"704":1},"1":{"705":1,"706":1,"707":1,"708":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1},"2":{"323":1,"328":1}}],["nginx示例配置",{"2":{"134":1}}],["nginx指定缓存项",{"2":{"132":1}}],["nginx代理情况下不要使用",{"2":{"696":1}}],["nginx代理",{"0":{"128":1}}],["nginx",{"2":{"124":1,"128":1,"132":1,"325":1,"339":1,"383":2,"704":1,"707":16,"708":33,"709":15,"710":2,"711":1,"712":3,"713":6,"717":2,"718":36,"721":2,"722":1,"723":1,"724":1,"727":3,"728":9,"729":1,"994":3,"998":2,"999":6,"1000":3,"1002":7,"1004":6,"1005":1,"1006":3,"1007":2,"1009":1,"1012":8,"1020":1,"1021":1,"1022":2,"1034":11,"1039":10,"1046":2,"1051":14,"1054":7,"1055":12,"1057":2,"1062":2,"1063":5,"1064":3,"1066":2,"1069":2,"1070":3,"1073":3,"1084":1,"1177":3,"1178":3,"1179":2}}],["nice",{"2":{"1223":1}}],["nice~",{"2":{"175":1}}],["nine",{"2":{"251":1}}],["night",{"2":{"251":1}}],["nib",{"2":{"251":1}}],["n",{"2":{"83":3,"139":5,"140":1,"141":7,"156":1,"163":1,"203":2,"364":1,"494":2,"610":1,"753":2,"801":2,"888":5,"889":1,"890":7,"936":2,"943":2,"964":1,"1134":1,"1218":2}}],["need",{"2":{"1214":1}}],["needs",{"0":{"1141":1},"2":{"1141":1}}],["nexus的默认账户为admin",{"2":{"1095":1}}],["nexus",{"2":{"1046":1,"1094":4,"1095":3,"1098":1}}],["nexus3准备了3种仓库类型",{"2":{"1104":1}}],["nexus3",{"2":{"1045":1,"1094":4,"1095":1}}],["nexus没启动的需要手动启动",{"2":{"1045":1}}],["nexktick",{"0":{"975":1}}],["nextrequest",{"2":{"771":2}}],["nexttick更适合于立即执行某个任务",{"2":{"540":1}}],["nexttick在每个阶段同步任务执行完后都会执行",{"2":{"540":1}}],["nexttick也是立即执行的意思",{"2":{"540":1}}],["nexttick",{"0":{"540":1},"2":{"238":1,"537":1,"540":2,"541":1}}],["nextsuccessor",{"2":{"205":3,"755":3}}],["nextsong",{"2":{"54":1}}],["nextzindex",{"2":{"201":1,"751":1}}],["next",{"2":{"63":1,"127":2,"154":5,"237":3,"238":1,"244":7,"248":2,"350":1,"354":2,"404":1,"455":1,"473":1,"634":2,"651":3,"692":2,"771":3,"903":5}}],["neither",{"2":{"800":1}}],["nest封装了websocket功能",{"2":{"702":1}}],["nest提供了fileinterceptor对文件类型进行处理",{"2":{"701":1}}],["nest提供了http传输的multipart",{"2":{"699":1}}],["nest提供了解决不同版本的方案",{"2":{"654":1}}],["nest实用手册",{"0":{"690":1},"1":{"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1}}],["nest使用swagger文档",{"0":{"678":1},"1":{"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1}}],["nest的enablecors",{"2":{"692":1}}],["nest的实用技巧",{"2":{"677":1}}],["nest的基础文章",{"2":{"665":1,"670":1}}],["nest搭建web服务",{"0":{"664":1},"1":{"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1}}],["nestinterceptor",{"2":{"651":2}}],["nest内置异常层来捕获程序中没有处理的错误",{"2":{"636":1}}],["nestmodule中configure方法",{"2":{"635":1}}],["nestmodule",{"2":{"635":1,"669":1}}],["nestmiddleware",{"2":{"634":2}}],["nest中内置了",{"2":{"679":1}}],["nest中提供了任务调度系统允许我们在固定的时间或时间间隔执行任务方法",{"2":{"657":1}}],["nest中提供了registeras来定义命名空间",{"2":{"631":1}}],["nest中可以使用class",{"2":{"646":1}}],["nest中的filter",{"2":{"636":1}}],["nest中使用了大量的ioc设计模式",{"2":{"601":1}}],["nest在module",{"2":{"621":1}}],["nestexpressapplication>",{"2":{"603":1,"692":1}}],["nestexpressapplication",{"2":{"603":1}}],["nestfactory",{"2":{"603":3,"681":2,"692":1}}],["nest",{"2":{"602":2,"610":1,"634":1,"639":1,"645":1,"648":1,"650":1,"665":4,"688":1,"703":5}}],["nest真正的实现了架构的能力",{"2":{"601":1}}],["nestjs默认底层框架使用express",{"2":{"694":1}}],["nestjs上下文以外",{"2":{"643":1}}],["nestjs提供了",{"2":{"627":1}}],["nestjs中还支持自定义pipe",{"2":{"645":1}}],["nestjs中可以使用joi对一些环境变量进行类型校验和定义检查",{"2":{"632":1}}],["nestjs中使用了大量了依赖注入",{"2":{"623":1}}],["nestjs中除了提供一些常用的装饰器",{"2":{"619":1}}],["nestjs中内置了http规范的请求方法装饰器",{"2":{"612":1}}],["nestjs",{"2":{"601":2,"602":4,"603":2,"604":1,"606":1,"611":2,"612":1,"613":5,"614":1,"615":1,"616":1,"617":1,"618":1,"619":2,"622":1,"624":1,"627":1,"634":1,"637":1,"639":1,"640":3,"642":1,"643":5,"645":1,"646":2,"648":3,"651":1,"652":2,"655":1,"658":1,"659":2,"660":6,"661":2,"662":1,"663":1,"667":1,"672":1,"679":1,"680":1,"681":2,"689":1,"693":1,"698":2,"700":1,"702":2,"703":1,"737":1}}],["nestjs基础教程",{"0":{"601":1},"1":{"602":1,"603":1,"604":1,"605":1,"606":1,"607":1,"608":1,"609":1,"610":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"620":1,"621":1,"622":1,"623":1,"624":1,"625":1,"626":1,"627":1,"628":1,"629":1,"630":1,"631":1,"632":1,"633":1,"634":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1}}],["negative",{"2":{"251":1}}],["necktie",{"2":{"251":1}}],["neckbeard",{"2":{"251":2}}],["neutral",{"2":{"251":1}}],["never",{"0":{"909":1},"2":{"227":1,"797":2,"921":1,"1136":1,"1137":1}}],["netns",{"2":{"1209":1}}],["netfilter`和`overlay`模块被加载",{"2":{"1205":1}}],["netfilter",{"2":{"1205":3}}],["netstat是一个用于显示网络状态和统计信息的命令行工具",{"2":{"383":1}}],["netstat",{"2":{"382":1,"383":1}}],["netdev",{"2":{"380":1}}],["networkname",{"2":{"1212":1}}],["networking",{"2":{"1212":1,"1217":1}}],["networks",{"0":{"1022":1},"2":{"1019":1,"1022":2,"1034":3,"1035":1,"1084":2}}],["network",{"2":{"309":1,"370":1,"399":1,"532":1,"994":1,"1088":2,"1089":3,"1090":2,"1208":1,"1214":2}}],["net",{"2":{"85":1,"130":1,"368":1,"380":2,"381":2,"382":2,"386":1,"390":1,"1205":6,"1209":1}}],["newer",{"2":{"1039":1,"1047":1,"1082":1}}],["newtracked",{"2":{"964":1}}],["newdepids",{"2":{"954":3}}],["newdeps",{"2":{"954":2}}],["newval",{"2":{"951":3,"954":7,"955":2,"963":2}}],["newvalue",{"2":{"934":2,"950":7,"951":4,"958":3,"959":3,"964":1}}],["newlength",{"2":{"964":2}}],["newly",{"2":{"964":1}}],["newline",{"2":{"836":2}}],["newlayout",{"2":{"118":1}}],["newkey",{"2":{"726":1}}],["new生成的对象可以用来做什么",{"2":{"576":1}}],["newobj",{"2":{"576":3,"581":4}}],["newoperator",{"2":{"576":1}}],["new和普通函数调用将没有任何区别",{"2":{"576":1}}],["new内幕",{"0":{"576":1}}],["newclass",{"2":{"404":1}}],["newcomponent",{"2":{"199":2,"749":2}}],["newspaper",{"2":{"251":1}}],["newpath",{"2":{"62":2}}],["newadmin",{"2":{"57":2}}],["newaccount",{"2":{"54":1}}],["new",{"0":{"239":1},"2":{"7":1,"8":1,"9":5,"33":1,"38":8,"39":2,"40":8,"41":1,"43":2,"44":2,"57":2,"60":3,"62":2,"64":5,"98":7,"116":1,"120":1,"176":1,"184":2,"187":2,"190":13,"195":1,"196":1,"197":1,"198":1,"201":3,"202":4,"204":4,"205":3,"228":2,"229":4,"230":1,"232":2,"233":1,"237":1,"243":1,"244":3,"245":3,"248":2,"249":1,"251":3,"347":1,"350":1,"354":4,"404":1,"483":7,"485":3,"491":4,"494":3,"496":3,"497":3,"499":1,"503":1,"507":1,"510":1,"512":1,"514":4,"516":3,"517":3,"520":2,"521":2,"532":2,"544":8,"545":2,"546":8,"547":1,"549":2,"550":2,"573":5,"576":4,"577":3,"578":1,"579":1,"580":3,"581":1,"582":2,"583":4,"602":1,"606":1,"634":1,"637":1,"638":1,"639":1,"640":3,"642":1,"643":5,"645":1,"646":1,"661":1,"665":1,"681":1,"687":1,"688":1,"697":2,"700":1,"701":1,"702":1,"713":2,"726":1,"745":1,"746":1,"747":1,"748":1,"751":3,"752":4,"754":4,"755":3,"765":1,"769":1,"770":1,"771":4,"772":4,"773":3,"800":2,"814":1,"865":1,"932":1,"934":3,"938":2,"939":1,"940":1,"944":2,"945":1,"951":10,"954":7,"955":2,"958":1,"959":4,"960":1,"963":1,"964":3,"1178":2}}],["naming",{"2":{"703":1,"1051":1,"1054":1,"1055":1}}],["name2>",{"2":{"1023":1}}],["name>",{"2":{"1020":1,"1023":1,"1027":1,"1053":1,"1054":1}}],["name|id",{"2":{"994":1}}],["name$request",{"2":{"726":2}}],["name表示匹配的域名",{"2":{"710":1}}],["namespace",{"2":{"1121":4,"1122":2,"1217":1,"1218":1}}],["names|string",{"2":{"722":1}}],["names",{"2":{"353":1,"410":1,"722":2,"1006":1}}],["name=kubernetes",{"2":{"1210":1}}],["name=bridge",{"2":{"994":1}}],["name=nginx",{"2":{"707":2,"994":3,"1006":1}}],["name=c1时",{"2":{"579":1}}],["name=",{"2":{"207":4,"222":6,"352":2,"671":1,"757":4}}],["name=xxx这种很明显的错误",{"2":{"36":1,"542":1}}],["named",{"2":{"1111":1}}],["namednodemap",{"2":{"202":1,"752":1}}],["namedmodulesplugin",{"2":{"190":1}}],["name",{"2":{"2":1,"3":1,"4":1,"26":4,"38":7,"40":6,"44":1,"61":3,"77":2,"78":3,"80":2,"83":1,"84":1,"86":2,"128":1,"130":1,"132":4,"181":2,"190":4,"201":4,"202":3,"222":4,"228":2,"232":2,"233":9,"237":3,"251":1,"347":1,"354":1,"383":1,"400":1,"401":1,"404":1,"405":1,"406":1,"499":1,"500":1,"544":7,"546":6,"550":1,"571":6,"572":2,"573":9,"574":2,"575":2,"576":8,"577":6,"578":6,"579":9,"580":15,"581":7,"582":11,"583":21,"587":5,"589":4,"590":2,"591":2,"606":5,"609":2,"612":2,"613":13,"616":1,"624":3,"626":2,"648":1,"660":1,"667":1,"686":4,"701":1,"702":1,"703":1,"709":1,"710":1,"722":1,"726":5,"729":2,"751":4,"752":3,"769":1,"770":1,"772":3,"784":2,"800":1,"801":17,"805":1,"813":1,"814":1,"839":2,"865":2,"929":4,"930":1,"931":1,"932":1,"950":2,"951":13,"955":4,"958":1,"959":4,"960":6,"963":1,"966":1,"999":1,"1002":1,"1004":2,"1020":1,"1023":1,"1034":3,"1035":1,"1038":1,"1053":1,"1055":1,"1074":2,"1088":1,"1089":1,"1090":2,"1094":1,"1102":1,"1103":3,"1113":1,"1114":1,"1115":1,"1121":14,"1122":2,"1134":2,"1136":3,"1139":2,"1141":1,"1146":1,"1148":1,"1153":1,"1159":1,"1171":2,"1172":1,"1178":4,"1183":1,"1184":1,"1187":4,"1189":1,"1209":3,"1212":1,"1217":5,"1218":3}}],["natoutgoing",{"2":{"1217":1}}],["nativewatch",{"2":{"937":1}}],["native",{"2":{"494":1,"1208":1,"1209":1}}],["nat增加网络延迟和复杂性",{"2":{"370":1}}],["nat技术允许多个设备共享同一个公共ip地址",{"2":{"370":1}}],["nat的作用有以下几点",{"2":{"370":1}}],["nat将发送到公共ip地址的请求转换为其相应的私有ip地址",{"2":{"370":1}}],["nat主要的作用是允许多个设备在一个公共ip地址下访问互联网",{"2":{"370":1}}],["nat",{"0":{"370":1},"2":{"310":1,"370":1}}],["nature",{"2":{"251":1}}],["nail",{"2":{"251":1}}],["nay",{"2":{"139":2,"140":1,"888":2,"889":1}}],["nab",{"2":{"138":1,"887":1}}],["navigation",{"2":{"874":1}}],["navigation和history",{"2":{"532":1}}],["navigator",{"2":{"222":2}}],["navicat",{"2":{"70":1}}],["nav",{"2":{"54":1}}],["nan和任何其他类型",{"2":{"47":1,"553":1}}],["nan",{"2":{"41":10,"43":6,"44":1,"46":2,"47":3,"547":10,"549":6,"550":1,"552":2,"553":3}}],["nominated",{"2":{"1218":1}}],["noqueue",{"2":{"1085":1,"1090":4}}],["nobody",{"2":{"1064":2}}],["nor",{"2":{"800":1}}],["normal",{"2":{"765":1}}],["nopivotroot",{"2":{"1209":1}}],["nopasswd",{"2":{"728":1}}],["noparse属于module中的属性",{"2":{"189":1}}],["noparse",{"0":{"189":1},"2":{"189":1,"190":1}}],["noprefixroute",{"2":{"728":3}}],["nopush",{"2":{"709":1}}],["noodles",{"2":{"577":2}}],["noopen",{"2":{"350":1}}],["noop",{"2":{"238":1,"931":1,"932":7,"934":1,"954":1}}],["nosniff",{"2":{"350":1}}],["nose",{"2":{"251":2}}],["noclasscalls",{"2":{"269":1}}],["nonce=",{"2":{"350":4}}],["non",{"2":{"251":1,"337":1,"462":1,"1157":3,"1158":1}}],["nonewkeyring",{"2":{"1209":1}}],["none网络是一种完全隔离的网络类型",{"2":{"1087":1}}],["none>",{"2":{"1002":1,"1217":7,"1218":6}}],["none|blocked|server",{"2":{"722":1}}],["none",{"2":{"97":1,"183":1,"347":1,"350":2,"353":3,"616":1,"722":1,"1002":1,"1066":1,"1087":1,"1088":2,"1089":1}}],["nodocumentall",{"2":{"269":1}}],["nodir",{"2":{"190":1}}],["nodeaddressautodetectionv4",{"2":{"1217":1}}],["nodeselector",{"2":{"1217":1}}],["nodes",{"2":{"1214":3}}],["nodestatusupdatefrequency",{"2":{"1212":1}}],["nodestatusreportfrequency",{"2":{"1212":1}}],["nodeportaddresses",{"2":{"1212":1}}],["noderegistration",{"2":{"1212":1}}],["node2节点",{"2":{"1218":1}}],["node2",{"2":{"1199":2,"1200":1,"1217":2,"1218":1}}],["node1节点",{"2":{"1218":1}}],["node1",{"2":{"1199":2,"1200":1,"1217":2,"1218":1}}],["nodetype",{"2":{"954":1}}],["node版本不一致",{"2":{"783":1}}],["node中都会被global访问到",{"2":{"589":1}}],["node中的事件循环机制是基于libuv",{"2":{"537":1}}],["node会先将timer阶段的回调执行完后",{"2":{"538":1}}],["node一开始进入这个阶段",{"2":{"538":1}}],["node就是这样不断循环这些不同的执行阶段调度任务的执行顺序",{"2":{"538":1}}],["node事件循环机制中和浏览器的不太一样",{"2":{"538":1}}],["node和浏览器都是基于v8引擎",{"2":{"537":1}}],["node的eventloop",{"0":{"537":1},"1":{"538":1,"539":1,"540":1}}],["node方式进行跨域",{"2":{"190":1}}],["node部署采用流行的pm2进行部署的",{"2":{"126":1}}],["nodejs项目",{"0":{"1074":1}}],["nodejs来构建nginx和nodejs镜像",{"2":{"1034":1}}],["nodejs使用express作为http服务",{"2":{"1034":1}}],["nodejs是nodejs的服务名",{"2":{"1034":1}}],["nodejs搭建web服务",{"0":{"742":1}}],["nodejs多进程与多线程",{"0":{"741":1}}],["nodejs性能优化",{"0":{"738":1},"1":{"739":1,"740":1}}],["nodejs常见框架",{"0":{"737":1}}],["nodejs调试技巧",{"0":{"735":1},"1":{"736":1}}],["nodejs学习指南",{"2":{"734":1}}],["nodejs技术栈",{"2":{"734":1}}],["nodejs最佳实践",{"2":{"734":1}}],["nodejs中文文档",{"2":{"734":1}}],["nodejs官方问答",{"2":{"734":1}}],["nodejs基本使用",{"0":{"733":1},"1":{"734":1}}],["nodejs通常都是使用pm2进行托管",{"2":{"703":1}}],["nodejs对于前端工程师来说是必不可少的技能",{"2":{"690":1}}],["nodejs服务项目",{"2":{"1074":1}}],["nodejs服务",{"2":{"344":1}}],["nodejs模拟不定长传输",{"2":{"343":1}}],["nodejs的轻巧及方便以及对大批前端同学友好的全栈项目而言",{"2":{"125":1}}],["nodejs",{"2":{"97":2,"443":2,"448":2,"541":1,"1034":9,"1035":1,"1074":2,"1076":1}}],["nodemon",{"2":{"96":2}}],["node下载",{"2":{"56":1}}],["node",{"0":{"399":1,"400":1,"731":1,"732":1},"2":{"49":1,"56":1,"96":1,"97":2,"124":1,"132":1,"179":1,"180":1,"182":3,"186":1,"187":1,"188":1,"190":7,"195":2,"238":1,"239":1,"382":1,"399":3,"400":2,"401":3,"404":3,"462":7,"555":1,"601":2,"632":1,"662":2,"669":7,"703":5,"734":1,"736":1,"745":2,"801":1,"810":1,"814":1,"818":1,"828":3,"841":1,"848":1,"855":1,"857":1,"858":1,"875":2,"877":1,"954":1,"977":1,"1034":1,"1070":1,"1071":1,"1073":1,"1074":3,"1103":1,"1107":2,"1121":2,"1125":1,"1139":1,"1145":1,"1148":3,"1183":1,"1190":1,"1191":1,"1209":1,"1212":2,"1214":2,"1217":8,"1218":7}}],["noise",{"2":{"61":1}}],["now",{"2":{"60":2,"77":4,"78":1,"83":8,"436":1,"499":1,"707":1,"708":1,"718":2,"1082":1,"1201":1,"1208":2,"1209":1,"1211":1,"1214":3}}],["nov",{"2":{"41":1,"547":1}}],["no",{"2":{"40":1,"134":1,"251":13,"317":1,"546":1,"634":1,"639":1,"645":1,"648":1,"650":1,"717":1,"720":4,"726":3,"728":2,"800":2,"806":2,"814":1,"830":2,"831":4,"857":1,"1006":1,"1007":1,"1025":1,"1028":2,"1069":2,"1103":2,"1107":2,"1178":3,"1184":3,"1191":2,"1209":3}}],["notready",{"2":{"1217":3}}],["notify的dep是",{"2":{"955":1}}],["notify手动通知更新",{"2":{"955":1}}],["notify会执行watcher的update方法",{"2":{"954":1}}],["notify通知所有的watcher执行update",{"2":{"954":1}}],["notify",{"2":{"951":2,"954":2,"955":2,"956":1}}],["notificationconstructor",{"2":{"201":1,"751":1}}],["notification",{"2":{"201":3,"376":1,"751":3}}],["notice",{"2":{"709":2,"814":1,"1103":15,"1107":1,"1184":1,"1189":15,"1191":1}}],["notfoundexception",{"2":{"638":2}}],["notebook",{"2":{"251":2}}],["note",{"2":{"251":1,"1103":1,"1217":1}}],["notes",{"2":{"251":1}}],["not",{"2":{"40":6,"75":3,"83":1,"86":5,"97":1,"195":4,"203":1,"251":1,"317":3,"347":1,"454":1,"546":6,"576":1,"578":1,"583":1,"587":3,"588":2,"589":2,"745":4,"753":1,"797":2,"800":1,"870":1,"877":1,"1051":1,"1098":1,"1103":5,"1132":1,"1159":1,"1209":1}}],["nut",{"2":{"251":1}}],["num",{"2":{"36":2,"38":2,"39":2,"62":2,"83":1,"542":2,"544":2,"545":2,"869":1,"1209":4}}],["number触发自己的依赖进行更新",{"2":{"934":1}}],["number首先会通知computed重新计算",{"2":{"934":1}}],["number++",{"2":{"934":1}}],["number和string类型比较",{"2":{"47":1,"553":1}}],["number的转换",{"2":{"43":1,"549":1}}],["number两种",{"2":{"40":1,"546":1}}],["number",{"2":{"24":1,"30":1,"37":2,"38":2,"39":2,"40":8,"41":5,"139":2,"227":2,"228":1,"231":2,"232":2,"233":5,"244":1,"247":3,"479":1,"483":1,"543":2,"544":2,"545":2,"546":8,"547":5,"571":1,"573":1,"613":2,"615":1,"617":1,"629":1,"632":1,"637":1,"642":2,"643":5,"645":1,"646":7,"669":3,"683":2,"685":2,"686":3,"695":1,"709":1,"771":6,"869":3,"888":2,"921":2,"934":3,"961":1,"962":1,"964":2,"1214":3}}],["nullif",{"2":{"83":5}}],["null转换为0",{"2":{"43":1,"549":1}}],["null转number",{"2":{"43":1,"549":1}}],["null",{"2":{"2":1,"24":1,"41":3,"43":2,"44":3,"46":1,"47":2,"57":1,"64":2,"75":3,"83":2,"86":5,"98":3,"138":1,"152":1,"153":1,"154":1,"205":1,"227":1,"244":2,"547":3,"549":2,"550":3,"552":1,"553":2,"571":1,"574":1,"576":1,"583":3,"595":1,"692":1,"726":2,"755":1,"868":1,"887":1,"901":1,"902":1,"903":1,"932":1,"944":2,"945":2,"951":6,"954":1,"959":2,"1088":1,"1089":1,"1212":10}}],["=~",{"2":{"1136":2}}],["=parent",{"2":{"583":1}}],["=post",{"2":{"434":1}}],["=method",{"2":{"434":2}}],["=301",{"2":{"434":1}}],["=status",{"2":{"434":2}}],["=0",{"2":{"404":1}}],["=8",{"2":{"364":1}}],["=€",{"2":{"148":1,"897":1}}],["=y",{"2":{"147":2,"148":2,"149":2,"896":2,"897":2,"898":2}}],["=cast",{"2":{"83":1}}],["=binary",{"2":{"83":1}}],["=upass",{"2":{"83":1}}],["=4",{"2":{"83":1}}],["=>",{"2":{"33":1,"38":3,"40":18,"47":4,"48":1,"57":4,"61":1,"62":3,"63":5,"64":8,"98":31,"127":2,"137":1,"138":4,"139":1,"140":7,"141":6,"143":1,"144":6,"145":12,"148":2,"149":2,"150":4,"152":12,"153":1,"154":20,"190":1,"195":5,"197":7,"198":2,"199":1,"201":1,"222":6,"228":1,"229":3,"230":4,"231":1,"232":8,"237":5,"244":5,"245":4,"247":3,"248":2,"263":1,"338":1,"343":2,"344":1,"350":2,"354":10,"404":12,"410":1,"455":2,"485":1,"496":1,"497":2,"514":1,"516":3,"532":9,"533":1,"534":1,"535":1,"538":4,"539":5,"540":4,"544":3,"546":18,"553":4,"554":1,"571":7,"572":1,"573":1,"576":3,"578":2,"581":2,"583":1,"594":3,"606":4,"609":1,"619":1,"630":1,"631":1,"634":2,"646":4,"648":1,"651":1,"656":3,"661":6,"669":2,"686":1,"687":2,"688":1,"692":2,"695":1,"696":1,"702":1,"703":23,"723":2,"724":2,"745":5,"747":7,"748":2,"749":1,"751":1,"765":1,"768":1,"769":2,"770":4,"771":14,"772":6,"773":4,"825":1,"831":2,"858":1,"859":3,"864":2,"865":2,"866":4,"867":2,"868":4,"869":3,"870":2,"874":2,"875":2,"879":2,"886":1,"887":4,"888":1,"889":7,"890":6,"892":1,"893":6,"894":12,"897":2,"898":2,"899":4,"901":12,"902":1,"903":20,"929":1,"934":3,"936":1,"943":1,"944":10,"945":9,"950":3,"951":16,"954":7,"955":1,"959":4,"960":2,"961":2,"962":1,"963":3,"964":3,"1034":5,"1051":21,"1054":16,"1055":16,"1074":2,"1102":1,"1183":2}}],["==0",{"2":{"61":1}}],["==转换规则一般总结为一下五条",{"2":{"47":1,"553":1}}],["==运算转换",{"0":{"47":1,"553":1}}],["====>",{"2":{"1014":1}}],["==========================================================>",{"2":{"1208":1}}],["=====>",{"2":{"951":3}}],["=====",{"2":{"404":2}}],["===>",{"2":{"646":1}}],["===",{"2":{"33":2,"34":1,"40":5,"41":1,"98":3,"195":2,"196":1,"197":1,"200":4,"205":5,"232":2,"245":2,"249":1,"473":2,"534":1,"535":1,"546":5,"547":1,"571":3,"572":4,"573":21,"575":1,"576":2,"577":1,"579":1,"581":1,"583":1,"639":1,"645":1,"648":1,"669":1,"692":1,"745":2,"746":1,"747":1,"750":4,"755":5,"771":3,"772":1,"874":2,"932":3,"934":1,"937":1,"938":1,"944":4,"951":1,"954":5,"959":1,"960":1,"964":3,"1103":4,"1189":4}}],["==",{"2":{"7":1,"8":1,"9":1,"36":2,"40":5,"41":1,"47":8,"48":5,"60":1,"62":1,"98":5,"182":1,"195":5,"197":1,"232":1,"238":1,"239":1,"354":1,"520":1,"542":2,"546":5,"547":1,"553":8,"554":5,"576":2,"583":2,"669":1,"726":1,"745":5,"747":1,"932":1,"934":1,"937":1,"938":1,"951":1,"954":3,"964":1,"971":1,"1136":1,"1137":1,"1178":1}}],["=",{"2":{"2":2,"3":2,"4":2,"7":5,"8":4,"9":3,"26":10,"28":6,"29":3,"30":6,"32":6,"33":12,"34":3,"36":3,"38":11,"39":2,"40":18,"43":1,"47":1,"48":3,"57":6,"60":6,"61":7,"62":17,"63":11,"64":12,"78":11,"79":1,"80":1,"83":2,"98":25,"116":1,"117":1,"120":1,"121":1,"127":1,"130":1,"132":1,"137":3,"138":9,"139":1,"140":7,"141":3,"143":1,"144":4,"145":8,"148":1,"149":2,"150":1,"152":6,"153":2,"154":7,"175":2,"176":2,"177":1,"179":1,"180":1,"181":1,"182":4,"183":1,"184":3,"185":1,"186":1,"187":1,"188":1,"189":1,"190":18,"195":10,"196":4,"197":18,"198":7,"199":1,"200":4,"201":17,"202":5,"203":3,"204":21,"205":13,"206":3,"228":2,"229":5,"230":8,"231":6,"232":17,"233":6,"237":11,"238":8,"239":8,"243":2,"244":16,"245":14,"247":7,"248":5,"249":5,"263":1,"282":1,"283":3,"284":4,"285":1,"328":1,"333":4,"338":2,"339":1,"343":2,"347":2,"350":3,"354":23,"404":13,"438":1,"455":3,"456":1,"465":5,"473":1,"483":1,"485":8,"491":5,"496":9,"497":10,"499":1,"503":1,"507":2,"510":3,"512":3,"514":7,"516":4,"517":5,"520":13,"521":14,"529":2,"532":12,"533":1,"534":8,"535":4,"538":6,"539":2,"542":3,"544":11,"545":2,"546":18,"549":1,"553":1,"554":3,"571":8,"572":4,"573":11,"574":2,"575":2,"576":9,"577":8,"578":5,"579":5,"580":8,"581":7,"582":10,"583":26,"587":3,"588":9,"589":6,"590":2,"591":1,"594":2,"595":3,"603":2,"619":2,"629":1,"630":1,"631":1,"632":1,"634":3,"639":7,"645":1,"646":2,"648":6,"651":5,"656":1,"661":10,"669":2,"671":1,"674":7,"681":3,"683":2,"685":2,"687":6,"688":2,"692":1,"700":2,"701":1,"702":1,"709":1,"711":2,"715":1,"723":3,"724":3,"726":3,"745":10,"746":4,"747":18,"748":7,"749":1,"750":4,"751":17,"752":5,"753":3,"754":21,"755":13,"756":3,"765":5,"768":8,"769":8,"770":8,"771":28,"772":15,"773":12,"797":3,"801":1,"802":1,"825":2,"827":1,"828":3,"829":2,"830":2,"831":4,"836":9,"839":4,"840":1,"844":1,"845":1,"846":1,"847":1,"857":2,"863":2,"866":2,"867":2,"869":2,"870":1,"874":1,"875":2,"878":3,"879":1,"880":3,"886":3,"887":9,"888":1,"889":7,"890":3,"892":1,"893":4,"894":8,"897":1,"898":2,"899":1,"901":6,"902":2,"903":7,"920":7,"921":1,"931":1,"932":24,"934":34,"937":6,"938":21,"939":2,"940":4,"941":8,"942":1,"944":22,"945":9,"950":7,"951":40,"954":52,"955":32,"956":4,"958":2,"959":14,"960":3,"961":2,"962":3,"963":5,"964":33,"971":3,"1034":5,"1054":2,"1055":1,"1063":1,"1064":2,"1074":3,"1102":2,"1103":1,"1136":1,"1159":17,"1174":3,"1177":3,"1178":5,"1183":3,"1184":1,"1205":4,"1209":162}}],["示例",{"0":{"1119":1},"2":{"2":1,"3":1,"4":1,"638":1,"710":1,"830":1,"839":1,"994":1,"1039":1,"1108":1,"1187":1,"1191":1}}],["55",{"2":{"1218":1}}],["5500",{"2":{"404":1}}],["5e58646a0a1d133084a671b03b4878b730cba730818e062edbecc539a6e6a80a",{"2":{"1114":1}}],["5cda6686c50d24138ea5285d035afb639e275b6cac3f0671dd8b3cf895eb3c3a",{"2":{"1114":1}}],["57bb7ddcf8",{"2":{"1217":2}}],["577s",{"2":{"1184":1}}],["57s",{"2":{"1103":1}}],["57行",{"2":{"954":1}}],["54b47459dd",{"2":{"1217":1}}],["54行",{"2":{"954":1}}],["54",{"2":{"728":2,"1006":1}}],["5或更高版本中启用",{"2":{"727":1}}],["5m",{"2":{"718":2,"721":1}}],["5s后取消并删除",{"2":{"661":1}}],["5s",{"2":{"661":1,"703":1,"721":1,"1055":1,"1209":2}}],["537s",{"2":{"1191":1}}],["537",{"2":{"1005":2,"1007":2}}],["53行",{"2":{"934":1,"964":1}}],["53",{"2":{"454":1,"994":4,"1006":1,"1218":2}}],["53508401",{"2":{"85":1}}],["588",{"2":{"1090":1}}],["58行",{"2":{"932":1,"937":1}}],["58+",{"2":{"729":1}}],["58",{"2":{"414":2,"419":1,"422":1}}],["52pojie",{"2":{"423":1}}],["52",{"2":{"342":1,"728":1,"1002":1}}],["5bbd96d687",{"2":{"1217":2}}],["5b",{"2":{"298":1}}],["5️⃣",{"2":{"251":1}}],["519",{"2":{"860":1}}],["5174",{"2":{"728":2}}],["5172",{"2":{"728":1}}],["5171",{"2":{"728":1}}],["512m",{"2":{"1171":2,"1172":1}}],["512",{"2":{"222":1}}],["51",{"2":{"41":1,"547":1,"728":1}}],["56b",{"2":{"1103":1}}],["5695",{"2":{"128":1}}],["56>100",{"2":{"83":1}}],["56",{"2":{"40":1,"368":1,"546":1,"1051":1,"1063":1,"1064":2,"1090":4,"1218":2}}],["5+",{"2":{"22":2}}],["50m",{"2":{"726":2}}],["50x",{"2":{"709":1}}],["504",{"2":{"317":1}}],["503",{"2":{"317":1,"721":1}}],["502",{"2":{"317":1}}],["501",{"2":{"317":1}}],["50€",{"2":{"148":1,"897":1}}],["5000",{"2":{"629":1,"630":1,"661":3,"669":1,"1038":2,"1039":8,"1065":1}}],["500等状态码",{"2":{"322":1}}],["500到599表示服务器错误",{"2":{"317":1}}],["500元定金预购",{"2":{"205":2,"755":2}}],["500ms",{"2":{"188":1,"190":1}}],["500px",{"2":{"111":1,"112":1}}],["500",{"2":{"57":2,"62":4,"188":1,"190":1,"205":3,"317":1,"637":2,"640":1,"718":1,"755":3,"868":1}}],["50px",{"2":{"12":2,"14":2}}],["50",{"2":{"12":2,"14":2,"15":5,"83":2,"139":1,"148":1,"149":1,"204":4,"344":1,"646":1,"754":4,"874":2,"888":1,"897":1,"898":1}}],["5",{"2":{"2":1,"26":2,"63":3,"96":1,"98":1,"130":1,"138":2,"139":2,"141":1,"154":3,"195":1,"381":1,"404":1,"422":1,"485":1,"581":1,"594":7,"660":2,"703":1,"708":2,"721":2,"728":8,"745":1,"771":3,"800":1,"814":1,"829":1,"887":2,"888":2,"890":1,"903":3,"934":2,"994":2,"998":1,"1005":1,"1007":1,"1054":1,"1055":3,"1064":1,"1082":2,"1085":1,"1108":1,"1121":22,"1134":1,"1191":1,"1198":2,"1202":1,"1204":1,"1217":6}}],["则需要重载配置",{"2":{"1174":1}}],["则需要在官方网站上找到对应版本的nginx包下载到本地",{"2":{"718":1}}],["则默认值always",{"2":{"1137":1}}],["则默认的工作目录是根目录",{"2":{"1056":1}}],["则ci",{"2":{"1121":3}}],["则此变量包括一个",{"2":{"1121":1}}],["则仅在分支和合并请求流水线中可用",{"2":{"1121":1}}],["则设置为",{"2":{"1121":1}}],["则可用",{"2":{"1121":4}}],["则可以在端口号后面添加",{"2":{"1062":1}}],["则可以从缓存中读取资源",{"2":{"720":1}}],["则消息没有第一行",{"2":{"1121":1}}],["则容器将退出",{"2":{"1066":1}}],["则entrypoint作为容器的运行命令",{"2":{"1064":1}}],["则docker",{"2":{"1029":1}}],["则必须在listen中指定地址并且使用bind参数",{"2":{"729":1}}],["则必须将其分成多个较小的数据包进行传输",{"2":{"369":1}}],["则为处理请求的",{"2":{"729":1}}],["则为null",{"2":{"518":1}}],["则是仓库的地址",{"2":{"1014":1}}],["则是一个功能更强大的代码格式化工具",{"2":{"837":1}}],["则是相对时间",{"2":{"720":1}}],["则是ioc模式的一种实现方式",{"2":{"601":1}}],["则缓存必须标记为过期",{"2":{"720":1}}],["则",{"2":{"720":1,"1121":2}}],["则下一次的必须等待上一次结束后才会执行",{"2":{"510":1}}],["则不会发生错误",{"2":{"1140":1}}],["则不会被修改",{"2":{"997":1}}],["则不会再发送fin报文",{"2":{"457":1}}],["则不会在打包的",{"2":{"183":1}}],["则证明override第一步成功了",{"2":{"407":1}}],["则会发送一个",{"2":{"1008":1}}],["则会定义对应的类",{"2":{"570":1}}],["则会查出url中包含baidu的记录",{"2":{"434":1}}],["则会重新发送数据包",{"2":{"390":1}}],["则会请前台发出token失效的信息",{"2":{"64":1}}],["则重组过程将无法完成",{"2":{"369":1}}],["则使用此默认源",{"2":{"350":1}}],["则只在当前会话中有效",{"2":{"347":1}}],["则移除对其的观测",{"2":{"245":1}}],["则在进行查看文章时实现秒开的感觉",{"2":{"131":1}}],["则无需担心加载问题",{"2":{"131":1}}],["则返回null",{"2":{"83":1}}],["则返回result",{"2":{"83":1}}],["则返回result1",{"2":{"83":1}}],["则另一方也会转换为字符串",{"2":{"44":1,"550":1}}],["则新的和原来的数组中的这个元素也会发生改变",{"2":{"30":1}}],["则表示不需要传入任何参数",{"2":{"2":1}}],["则指定为",{"2":{"2":1}}],["函数内部访问对象属性时就会触发依赖收集",{"2":{"959":1}}],["函数内部会打印outer内部定义的变量的name",{"2":{"590":1}}],["函数赋值给",{"2":{"954":1}}],["函数时",{"2":{"954":1}}],["函数等等",{"2":{"944":1}}],["函数等变量以及外部的词法环境",{"2":{"593":1}}],["函数会返回一个函数",{"2":{"938":1,"940":1}}],["函数会作为一等公民",{"2":{"587":1}}],["函数形式",{"2":{"934":1}}],["函数在每个测试用例",{"2":{"881":2}}],["函数在每个测试套件",{"2":{"881":2}}],["函数在只有两种可能结果时才适合使用",{"2":{"83":1}}],["函数条件覆盖率",{"2":{"874":2}}],["函数传参",{"2":{"606":1}}],["函数provider",{"2":{"606":1}}],["函数prototype的改变也会影响到对象的原型",{"2":{"573":1}}],["函数标记它们的位置",{"2":{"590":1}}],["函数inner",{"2":{"589":1}}],["函数start",{"2":{"589":1}}],["函数体等代码块",{"2":{"589":1}}],["函数作用域和块级作用域之分",{"2":{"589":1}}],["函数式声明",{"2":{"587":1}}],["函数声明会带上自己的实体也就是提前声明时就关联到自己的值了",{"2":{"587":1}}],["函数的this将会指向生成的对象上",{"2":{"576":1}}],["函数的prototype属性",{"2":{"573":1}}],["函数的调用帧",{"2":{"529":1}}],["函数都有个特殊的属性prototype",{"2":{"573":1}}],["函数也可以看做是一个特殊的对象也有自己的原型",{"2":{"573":1}}],["函数也可以建立一个简单的条件测试",{"2":{"83":1}}],["函数将会检验提供的两个参数是否相等",{"2":{"83":1}}],["函数就会向调用者返回第一个参数",{"2":{"83":1}}],["函数不仅可以求数字类型的字段的和还可以对字符串进行求和",{"2":{"83":1}}],["函数库lodash",{"0":{"34":1}}],["函数",{"2":{"2":1,"83":3,"606":2,"932":1,"937":1,"949":1,"954":1,"977":1}}],["函数运行时指定的",{"2":{"2":1}}],["的一部分",{"2":{"1207":1}}],["的一个组件",{"2":{"1207":1}}],["的性能",{"2":{"1206":1}}],["的最新版本",{"2":{"1198":1}}],["的协议",{"2":{"1121":1}}],["的端口",{"2":{"1121":1}}],["的主机",{"2":{"1121":1}}],["的版本",{"2":{"1121":1}}],["的版本号",{"2":{"1018":1}}],["的修订版",{"2":{"1121":1}}],["的唯一",{"2":{"1121":2}}],["的环境不一样",{"2":{"1121":1}}],["的描述",{"2":{"1121":1}}],["的用户名",{"2":{"1121":1}}],["的密码",{"2":{"1121":1}}],["的字符替换为",{"2":{"1121":1}}],["的字节数",{"2":{"717":1}}],["的子域名",{"2":{"1121":1}}],["的小写",{"2":{"1121":1}}],["的认证用户名",{"2":{"1121":1}}],["的认证密码",{"2":{"1121":1}}],["的服务器",{"2":{"1121":1}}],["的前八个字符",{"2":{"1121":1}}],["的使用",{"2":{"1109":1}}],["的使用顺序相关联",{"2":{"145":1,"894":1}}],["的虚拟网桥docker0实现容器间或与宿主机之间的通信",{"2":{"1087":1}}],["的构建上下文",{"2":{"1068":1}}],["的基础镜像时",{"2":{"1065":1}}],["的基础上进行了改进",{"2":{"329":2}}],["的镜像作为",{"2":{"1057":1}}],["的地址作为npm私库地址了",{"2":{"1106":1}}],["的地址",{"2":{"1047":1,"1121":2}}],["的仓库",{"2":{"1045":1}}],["的容器的文件系统导出为一个",{"2":{"1010":1}}],["的模块可以被导入的到一个网络",{"2":{"977":1}}],["的繁琐工作",{"2":{"968":1}}],["的响应式系统可以追踪",{"2":{"965":1}}],["的响应式系统可以直接监听数组索引的变化",{"2":{"965":1}}],["的响应式系统在某些情况下比",{"2":{"965":1}}],["的响应式系统",{"2":{"965":1}}],["的所有依赖",{"2":{"959":1}}],["的原型方法",{"2":{"955":1}}],["的innerhtml",{"2":{"954":1}}],["的回调函数",{"2":{"938":1}}],["的watcher",{"2":{"932":1}}],["的工作原理是通过配置文件",{"2":{"795":1}}],["的编辑器是最佳选择",{"2":{"785":1}}],["的编码值",{"2":{"381":1}}],["的设计目标是轻量级和快速响应",{"2":{"785":1}}],["的过程中",{"2":{"726":1,"1178":1}}],["的区别主要在于过期时间的计算方式不同",{"2":{"720":1}}],["的错误",{"2":{"715":1}}],["的参数包括",{"2":{"1014":1}}],["的参数",{"2":{"709":1}}],["的参数和局部变量",{"2":{"529":2}}],["的开源框架和工具集",{"2":{"678":1}}],["的controller",{"2":{"610":1}}],["的作用下",{"2":{"592":1}}],["的属性",{"2":{"582":1}}],["的形式创建",{"2":{"573":1}}],["的历史原因",{"2":{"571":1}}],["的任务",{"2":{"532":1}}],["的变革",{"2":{"525":1}}],["的对象",{"2":{"512":1,"571":1}}],["的内容",{"2":{"502":1}}],["的数据",{"2":{"486":1}}],["的数字",{"2":{"148":2,"149":2,"897":2,"898":2}}],["的两个字符之间",{"2":{"462":1}}],["的散列值相同的结果",{"2":{"381":1}}],["的大小",{"2":{"369":1}}],["的新的路由选择机制",{"2":{"366":1}}],["的源",{"2":{"350":2}}],["的支持",{"2":{"338":1}}],["的请求会被视为跨域请求",{"2":{"691":1}}],["的请求",{"2":{"337":1}}],["的值设置的",{"2":{"1121":1}}],["的值由",{"2":{"958":1}}],["的值时",{"2":{"955":1}}],["的值仅限于下列三者之一",{"2":{"337":1}}],["的值",{"2":{"333":1,"718":1,"729":3,"959":1}}],["的值是",{"2":{"183":1}}],["的表示serverpush类型的资源",{"2":{"325":1}}],["的面板结果",{"2":{"325":1}}],["的多路复用可以大大提高网站的性能",{"2":{"324":1}}],["的多路复用技术通过将所有的请求和响应分解成若干个小的数据流",{"2":{"324":1}}],["的代理服务器连接",{"2":{"320":1}}],["的出现",{"2":{"301":1}}],["的报告清单提供参考",{"2":{"214":1}}],["的插件使用",{"2":{"176":1}}],["的核心概念",{"0":{"172":1}}],["的结合",{"2":{"168":1}}],["的结果是一个二进制字符串",{"2":{"83":1}}],["的规则相关",{"2":{"146":1,"895":1}}],["的静态属性",{"2":{"145":1,"894":1}}],["的配置域名",{"2":{"1121":1}}],["的配置",{"2":{"130":1,"844":1}}],["的幻想一步步照亮前方的道路",{"2":{"123":1}}],["的x次方",{"2":{"83":1}}],["的同学能够答对",{"2":{"22":1}}],["的情况来说",{"2":{"9":1}}],["的方式实现",{"2":{"9":1}}],["的方式",{"2":{"9":2}}],["的",{"2":{"2":1,"30":1,"243":1,"532":1,"557":1,"729":2,"829":1,"1010":2}}],["布尔值",{"2":{"2":1}}],["或直接修改对应的文章",{"2":{"1225":1}}],["或直接点击左上角的鲨鱼图标开始抓包",{"2":{"452":1}}],["或更高版本",{"2":{"1198":1}}],["或更多的",{"2":{"1195":1}}],["或进入容器中修改",{"2":{"1175":1}}],["或进入容器",{"2":{"1160":1}}],["或许你已经注意到了",{"2":{"1069":1}}],["或设置新的环境变量",{"2":{"1055":1}}],["或配置文件",{"2":{"858":1}}],["或其任何子域名",{"2":{"722":1}}],["或其他文档类型",{"2":{"117":1}}],["或在某些场景下作为备用方案",{"2":{"720":1}}],["或服务端的支持",{"2":{"691":1}}],["或等待新的i",{"2":{"538":1}}],["或没有任何主体的实际",{"2":{"518":1}}],["或原始数据缓冲区",{"2":{"502":1}}],["或当syn",{"2":{"380":1}}],["或长轮询",{"2":{"354":1}}],["或不返回值也可以修改原有的类",{"2":{"228":1}}],["或值为",{"2":{"222":1}}],["或命中缓存",{"2":{"131":1}}],["或system",{"2":{"83":1}}],["或current",{"2":{"83":2}}],["或upper",{"2":{"83":1}}],["或lower",{"2":{"83":1}}],["或逻辑运算的转换",{"2":{"41":1,"547":1}}],["或者提供用户token就可以了",{"2":{"1191":1}}],["或者与本人的环境保持一致",{"2":{"1171":1}}],["或者构建时提供",{"2":{"1063":1}}],["或者分享容器镜像给其他人使用",{"2":{"1010":1}}],["或者其他方式创建一个镜像",{"2":{"1003":1}}],["或者el参数不为空",{"2":{"954":1}}],["或者修改一个对象的现有属性",{"2":{"949":1}}],["或者不用分组",{"2":{"859":1}}],["或者在多个容器之间共享数据",{"2":{"1117":1}}],["或者在设置面板中搜索eslint进行选择配置",{"2":{"832":1}}],["或者在访问本体前做一些额外的事",{"2":{"199":1,"749":1}}],["或者创建一个单独的配置文件",{"2":{"827":1}}],["或者覆盖继承的规则",{"2":{"797":1}}],["或者使用electron",{"2":{"877":1}}],["或者使用",{"2":{"729":1}}],["或者使用免费的证书颁发机构",{"2":{"726":1}}],["或者将证书放入系统根证书中让操作系统信任",{"2":{"726":1}}],["或者只针对某个路由",{"2":{"635":1}}],["或者自己创建",{"2":{"634":1}}],["或者需要依赖其他类的实例来完成某些操作",{"2":{"601":1}}],["或者说当前作用域和其他作用域",{"2":{"588":1}}],["或者对于使用空的",{"2":{"518":1}}],["或者结构为",{"2":{"512":1}}],["或者如果你的源码并没有采取打包",{"2":{"404":1}}],["或者当ack包含选择确认信息",{"2":{"391":1}}],["或者后面的tcp连接会等待前面的传输",{"2":{"322":1}}],["或者验证码等技术进行验证",{"2":{"320":1}}],["或者我们拿到模块是一段别人编写的经过压缩的代码",{"2":{"206":1,"756":1}}],["或者react",{"2":{"199":1,"749":1}}],["或者cdn方式引入",{"2":{"185":1}}],["或者是",{"2":{"183":1,"729":1}}],["或者配置有出入",{"2":{"170":1}}],["或者想了解下网站性能优化问题的同学",{"2":{"123":1}}],["或者直接使用搜索引擎",{"2":{"85":1}}],["或者",{"2":{"30":1,"56":1,"77":1,"80":1,"139":3,"141":1,"154":1,"350":1,"888":3,"890":1,"903":1}}],["或",{"2":{"2":2,"115":1,"117":2,"153":1,"164":1,"165":2,"215":1,"222":2,"319":1,"354":1,"462":3,"479":1,"494":1,"502":1,"507":1,"571":1,"583":1,"728":1,"729":3,"830":3,"902":1,"949":1,"965":1,"977":1,"1062":3,"1085":1,"1116":1,"1121":6,"1122":1,"1164":1}}],["值一样直接返回",{"2":{"959":1}}],["值可能是",{"2":{"944":1}}],["值可以使用函数",{"2":{"606":1}}],["值是数组或者对象时",{"2":{"941":1}}],["值为对象时",{"2":{"932":1}}],["值为函数时",{"2":{"932":1}}],["值为true时测试界面会有一个测试全部用例的按钮",{"2":{"878":1}}],["值为",{"2":{"729":1,"1121":1}}],["值为小写",{"2":{"729":1}}],["值为123456的cookie",{"2":{"347":1}}],["值为1时表示以太网",{"2":{"297":1}}],["值类型",{"2":{"606":1}}],["值得学习",{"2":{"60":1}}],["值并不一定是该函数执行时真正的",{"2":{"2":1}}],["值",{"2":{"2":2,"32":1,"41":1,"77":5,"85":1,"347":1,"504":1,"547":1,"606":1,"950":1,"1121":1}}],["在地铁上的我感觉体温升高",{"2":{"1236":1}}],["在地址栏中输入被分析的网站",{"2":{"213":2}}],["在医院也有医生照顾着所以不用担心",{"2":{"1232":1}}],["在每台机器",{"2":{"1218":2}}],["在每个测试文件执行前都会先加载执行全局的配置文件",{"2":{"878":1}}],["在重启界面",{"2":{"1202":1}}],["在外部直接docker",{"2":{"1179":1}}],["在artifacts之前恢复缓存",{"2":{"1138":1}}],["在arp请求广播过程中",{"2":{"454":1}}],["在路径中使用",{"2":{"1121":1}}],["在路由器的路由表没有过期时",{"2":{"296":1}}],["在正在运行的流水线中只读",{"2":{"1121":1}}],["在正式购买后",{"2":{"205":1,"755":1}}],["在合并请求流水线或标签流水线中不可用",{"2":{"1121":1}}],["在合并请求的流水线中总是",{"2":{"1121":1}}],["在分支流水线中可用",{"2":{"1121":1}}],["在运行",{"2":{"1116":1}}],["在运行容器时",{"2":{"1066":1}}],["在运行容器时通过",{"2":{"1061":1}}],["在运行容器时使用",{"2":{"1061":1}}],["在仓库中查看",{"2":{"1102":1}}],["在右侧面板中点击创建用户",{"2":{"1100":1}}],["在右侧面板点击创建角色",{"2":{"1099":1}}],["在公司团队内一般都会拥有私有的工具包或者其他依赖",{"2":{"1092":1}}],["在创建和管理容器时",{"2":{"1090":1}}],["在虚拟机上访问nginxcurl",{"2":{"1084":1}}],["在系统上运行所需的应用程序",{"2":{"1079":1}}],["在安装网络之前",{"2":{"1217":1}}],["在安装操作系统的时候",{"2":{"1078":1}}],["在安装jest框架后对jest做一些扩展",{"2":{"857":1}}],["在新的镜像中",{"2":{"1065":2}}],["在生产构建时尽量采用",{"2":{"1058":1}}],["在后台模式下启动服务",{"2":{"1029":1}}],["在构建上传文件时将会忽略掉",{"2":{"1071":1}}],["在构建命令前加上",{"2":{"1069":1}}],["在构建镜像之前",{"2":{"1028":1}}],["在构建readablestream时不断地往可读流中写入数据",{"2":{"510":1}}],["在启动服务之前",{"2":{"1029":1}}],["在启动这个docker",{"2":{"1023":1}}],["在启动一个server",{"2":{"401":1}}],["在容器内部",{"2":{"1086":1}}],["在容器异常退出时重启容器",{"2":{"1025":1}}],["在容器异常退出或停止时",{"2":{"1025":1}}],["在容器中使用ports来定义端口的的映射",{"2":{"1022":1}}],["在容器运行时",{"2":{"1003":1}}],["在docker中使用docker执行器",{"2":{"1159":1}}],["在dockerfile中必须的也是最开始就需要的",{"2":{"1053":1}}],["在docker",{"2":{"1020":1}}],["在devicestab中的discover",{"2":{"399":1}}],["在配置文件中容器将作为服务部署",{"2":{"1019":1}}],["在配置文件中再添加一个配置",{"2":{"401":1}}],["在示例配置文件中",{"2":{"1018":1}}],["在登录时docker会检查本地的$home",{"2":{"1014":1}}],["在数据更新时重新渲染也就是重新执行当前的updatecomponent方法",{"2":{"954":1}}],["在gitlab搭建好后",{"2":{"1174":1}}],["在git提交前对代码进行校验",{"2":{"805":1}}],["在getter中就是childob",{"2":{"955":1}}],["在getter",{"2":{"954":1}}],["在属性更新时dep会通知相关的watcher进行更新",{"2":{"952":1}}],["在页面渲染后执行",{"2":{"944":1}}],["在页面渲染前执行",{"2":{"944":1}}],["在页面中隐藏一个合法token",{"2":{"353":1}}],["在执行计算属性函数过程中就会对data进行访问触发响应式对象对应的dep的depend对当前watcher进行收集",{"2":{"932":1}}],["在模板中放入太多的逻辑会让模板过重且难以维护",{"2":{"928":1}}],["在vue3中通常这样使用",{"2":{"962":1}}],["在vue3中响应式的核心原理不再使用object",{"2":{"958":1}}],["在vue中主要通过dep",{"2":{"952":1}}],["在vue中通常用来使用需要通过简单计算后的属性",{"2":{"928":1}}],["在vscode设置中写入以下配置",{"2":{"838":1}}],["在vscode配置中加入以下配置",{"2":{"832":1}}],["在vscode中打个断点",{"2":{"405":1}}],["在测试环境依然可以使用",{"2":{"861":1}}],["在测试环境准备后和安装jest框架前做一些配置",{"2":{"857":1}}],["在单个测试文件中都会引入我们编写的代码",{"2":{"858":1}}],["在选择器中",{"2":{"850":1}}],["在多行对象和数组字面量中使用尾随逗号",{"2":{"839":1}}],["在多个服务器之间分配客户端的请求",{"2":{"706":1}}],["在工作区安装turbo",{"2":{"817":1}}],["在提交git时对项目代码进行eslint",{"2":{"805":1}}],["在项目级别注册包时",{"2":{"1186":1}}],["在项目配置文件中引入",{"2":{"1142":1}}],["在项目开发中代码的质量及语法规范发挥着重要的作用",{"2":{"824":1}}],["在项目开发完后进行提交前一般都会对代码进行lint或者测试",{"2":{"805":1}}],["在项目下载时自动对git生成钩子函数",{"2":{"804":1}}],["在项目中通常都喜欢使用",{"2":{"861":1}}],["在项目中尤其是公共依赖如组件库至少都需要单测",{"2":{"854":1}}],["在项目中先对代码进行暂存",{"2":{"800":1}}],["在项目中安装commitcli和",{"2":{"796":1}}],["在项目骨架中路由和鉴权有权衡约定",{"2":{"127":1}}],["在团队协作中尤其是对于大型项目",{"2":{"787":1}}],["在框架选型时应考虑以下因素",{"2":{"786":1}}],["在讨论打包工具的选择前先来说说常见的打包工具及其优势",{"2":{"784":1}}],["在前端发展的过程中",{"2":{"784":1}}],["在前端领域通常fetch的",{"2":{"509":1}}],["在现代",{"2":{"762":1}}],["在现实世界中",{"2":{"83":1}}],["在完成一次系统调用后可以确定这个值",{"2":{"729":1}}],["在主节点上查看ip",{"2":{"728":1}}],["在主线程使用会造成页面卡顿现象",{"2":{"507":1}}],["在以上的基础上添加http2",{"2":{"727":1}}],["在默认配置文件结尾会将conf",{"2":{"709":1}}],["在定义好httpexception",{"2":{"640":1}}],["在master节点上执行",{"2":{"1214":1}}],["在monorepo项目中打包可能会是很难受的",{"2":{"816":1}}],["在middleware中必须调用next",{"2":{"633":1}}],["在mysql中计算年龄",{"2":{"83":1}}],["在此感谢",{"2":{"1227":1}}],["在此包中包含了configmodule",{"2":{"627":1}}],["在此就详细展开了",{"2":{"127":1}}],["在控制器中定义具体的路由",{"2":{"612":1}}],["在当前镜像上层执行相关命令",{"2":{"1058":1}}],["在当前模块的controller中使用inject注入使用",{"2":{"606":2}}],["在当前模块内部就可以注入使用被提供的内容",{"2":{"606":1}}],["在当前版本chrome",{"2":{"139":1,"888":1}}],["在ioc模式中",{"2":{"601":1}}],["在ip协议中",{"2":{"369":1}}],["在ipv4中",{"2":{"361":1}}],["在刚开始运行代码时",{"2":{"593":1}}],["在展开作用域链前先来说说词法环境",{"2":{"590":1}}],["在函数外部是访问不到的",{"2":{"589":1}}],["在函数作为构造函数使用时new",{"2":{"573":1}}],["在第6行访问块级作用域变量inner时报错",{"2":{"588":1}}],["在es6以前声明变量都是用关键字var进行声明的",{"2":{"588":1}}],["在eventloop中的每一次循环成一个tick",{"2":{"532":1}}],["在真正的被计算机执行前都会进行一次编译",{"2":{"586":1}}],["在真实环境中存在请求队列的概念",{"2":{"380":1}}],["在寄生组合继承中",{"2":{"583":1}}],["在途中可以很明显看到class关键字继承",{"2":{"583":1}}],["在修改子类原型后",{"2":{"582":1}}],["在class中用static来标识这是类的静态属性或方法",{"2":{"583":1}}],["在class继承中若子类执行constructor构造器时必须执行super方法",{"2":{"583":1}}],["在child函数体内借用parent构造函数继承实例属性和方法",{"2":{"582":1}}],["在cookie没有过期时",{"2":{"347":1}}],["在conf",{"2":{"128":1}}],["在17",{"2":{"579":1}}],["在了解继承前",{"2":{"576":1}}],["在原型的定义中我们知道原型指向它的的构造函数的prototype属性",{"2":{"573":1}}],["在html标准中定义了常见的macrotask",{"2":{"532":1}}],["在http",{"2":{"326":1,"327":1,"384":1,"727":1}}],["在write方法中对每块数据进行获取",{"2":{"514":1}}],["在webpack",{"2":{"126":1,"130":1}}],["在背压前内部队列可以容纳的总块数",{"2":{"510":1,"514":1}}],["在runner注册期间",{"2":{"1129":1}}],["在reactive的基础上实现ref变得非常简单",{"2":{"962":1}}],["在range开头插入节点",{"2":{"462":1}}],["在rsa算法中如果黑客得到了证书密钥",{"2":{"334":1}}],["在客户端请求完毕后会发送fin报文给服务端",{"2":{"457":1}}],["在收到数据后",{"2":{"456":1}}],["在通信前必须建立连接",{"2":{"455":1}}],["在显示过滤器中输入arp协议来过滤显示arp协议的数据包",{"2":{"454":1}}],["在抓包开始前首先要明白什么是arp协议",{"2":{"454":1}}],["在记录上方的输入框即可过滤",{"2":{"453":1}}],["在进入wireshark时的欢迎页面就可以对进行不同的接口进行选择",{"2":{"453":1}}],["在safari中访问远程fiddler地址192",{"2":{"439":1}}],["在请求头部添加自定义的字段name",{"2":{"436":1}}],["在请求http",{"2":{"436":1}}],["在请求报文中该字段值全为0",{"2":{"297":1}}],["在关于手机",{"2":{"422":1}}],["在没有创建自定义网络的条件下",{"2":{"1088":1}}],["在没有配置https下",{"2":{"421":1}}],["在没有可选数据时其最小值为5",{"2":{"376":1}}],["在js最初运行时",{"2":{"592":1}}],["在js引擎刚开始是对代码进行静态分析时",{"2":{"590":1}}],["在js里对应的就是function",{"2":{"582":1}}],["在js中有全局作用域",{"2":{"588":1,"589":1}}],["在js中都是以原型为基础进行继承的",{"2":{"575":1}}],["在js中每个对象都会拥有一个原型对象",{"2":{"570":1}}],["在js世界里只有函数才会有构造器",{"2":{"573":1}}],["在js文件中左侧打个断点",{"2":{"401":1}}],["在javascript中",{"2":{"204":1,"754":1}}],["在三次握手期间虽然没有进行实质的数据传输",{"2":{"387":1}}],["在长时间没有进行数据传输时用来探测是否还处于连接状态",{"2":{"384":1}}],["在等待2msl时间后也会进入close状态",{"2":{"382":1}}],["在老版本的tcp协议中可能只会存在6为控制位",{"2":{"376":1}}],["在urg控制位为1时有效",{"2":{"376":1}}],["在建立连接和断开连接时发送的syn包和fin包虽然并不携带数据",{"2":{"376":1}}],["在tcp连接建立时",{"2":{"393":1}}],["在tcp连接中存在两个重要的队列syn队列",{"2":{"380":1}}],["在tcp四次挥手期间",{"2":{"384":1}}],["在tcp三次握手时",{"2":{"384":1}}],["在tcp",{"2":{"371":2}}],["在许多组织中",{"2":{"370":1}}],["在互联网通信中",{"2":{"454":1}}],["在互联网早期",{"2":{"370":1}}],["在互联网高速发展的时代",{"2":{"123":1}}],["在nginx中配置https",{"2":{"726":1}}],["在nginx中进行反向代理的跨域配置",{"2":{"724":1}}],["在nginx中替换掉图片地址为",{"2":{"712":1}}],["在nest中其实和express配置跨域是一致的",{"2":{"691":1}}],["在nest中使用swagger搭建接口文档",{"2":{"688":1}}],["在nest中也可以很好的使用i18n的功能",{"2":{"672":1}}],["在nestjs中一般不用获取原始的请求对象",{"2":{"614":1}}],["在node中也提供了setimmediate来执行异步任务表示立即执行",{"2":{"539":1}}],["在node中一般不说微任务和宏任务",{"2":{"538":1}}],["在nat的实现中",{"2":{"370":1}}],["在nvm的安装路径下找到settings",{"2":{"97":1}}],["在目的地址字段中使用特殊的广播地址",{"2":{"365":1}}],["在本地计算机上",{"2":{"361":1}}],["在播放音视频流时",{"2":{"344":1}}],["在支持range请求会返回响应的头部",{"2":{"344":1}}],["在握手成功后二者便使用对称加密进行数据传输缩短解密时间",{"2":{"330":1}}],["在传统的多仓库开发模式中",{"2":{"808":1}}],["在传统的编程模型中",{"2":{"601":1}}],["在传统的",{"2":{"324":1,"354":1}}],["在一个新项目中安装上传的npm包",{"2":{"1103":1}}],["在一个tcp连接中",{"2":{"384":1}}],["在一个tcp连接中同时传输多个请求和响应",{"2":{"323":1}}],["在一个方法中定义一个算法骨架",{"2":{"207":1,"757":1}}],["在实例上的所有项目中都是唯一的",{"2":{"1121":2}}],["在实际的开发过程中经常会遇到二进制数据",{"2":{"478":1}}],["在实际的网络中",{"2":{"357":1}}],["在实际应用中",{"2":{"316":1,"369":1}}],["在实现此功能前",{"2":{"242":1}}],["在研究如何建立一种去中心化",{"2":{"310":1}}],["在20世纪70年代提出的一个计算机网络通信模型",{"2":{"309":1}}],["在网络中使用网络安全设备",{"2":{"304":1}}],["在网络中使用arp防火墙",{"2":{"304":1}}],["在网络中使用静态arp表",{"2":{"304":1}}],["在网上看到的文章大多都是直接讲双向绑定原理等一些内部实现机制",{"2":{"236":1}}],["在阅读本编之前",{"2":{"241":1}}],["在源码中",{"2":{"239":1}}],["在buildentry函数中可以看到rollup字眼了",{"2":{"237":1}}],["在使用docker",{"2":{"1002":1}}],["在使用",{"2":{"729":1,"997":1}}],["在使用https之前",{"2":{"726":1}}],["在使用了原始的请求对象后就会脱离nestjs的本身",{"2":{"614":1}}],["在使用私有ip地址时",{"2":{"360":1}}],["在使用vue开发时",{"2":{"236":1}}],["在使用迭代器模式之后",{"2":{"203":1,"753":1}}],["在装饰器中反射往往发挥着很大作用",{"2":{"226":1}}],["在介绍装饰器前",{"2":{"226":1}}],["在这段旅程中",{"2":{"1237":1}}],["在这个子网中",{"2":{"1085":1}}],["在这之前",{"2":{"977":1}}],["在这里对于多种技术其实没有多大的讨论价值",{"2":{"786":1}}],["在这里我会对于常见前端技术经验进行分享",{"2":{"1223":1}}],["在这里我更推荐大家使用vscode",{"2":{"785":1}}],["在这里我们来看继承的本质",{"2":{"582":1}}],["在这里nest也可以使用swagger进行接口文档的生成",{"2":{"678":1}}],["在这儿就来和大家分享下我对它的的认识和理解",{"2":{"523":1}}],["在这些协议中tcp",{"2":{"307":1}}],["在这文章中我将介绍装饰器和它的许多细节",{"2":{"224":1}}],["在这种传输方式中",{"2":{"342":1}}],["在这种模式中",{"2":{"195":1,"745":1}}],["在这种情况下",{"2":{"83":1,"337":1}}],["在最新的谷歌浏览器",{"2":{"215":1}}],["在最前面一个规则的基础上按第二个规则再进行排序",{"2":{"81":1}}],["在parent中已经设定了children的渲染位置算法",{"2":{"207":1,"757":1}}],["在package",{"2":{"182":1,"804":1}}],["在程序开发过程中有许多这样的场景",{"2":{"206":1,"756":1}}],["在程序运行期间给对象动态地添加方法",{"2":{"199":1,"749":1}}],["在不改变对象自身的基础上",{"2":{"199":1,"749":1}}],["在不指定类型情况下",{"2":{"40":1,"546":1}}],["在我们生活中常用的事件代理",{"2":{"198":1,"748":1}}],["在图片加载成功前",{"2":{"198":1,"748":1}}],["在开发模式下",{"2":{"183":1}}],["在开发中还是非常有用的",{"2":{"176":1}}],["在资源的有效期内不用进行请求该资源",{"2":{"168":1}}],["在资源管理器中查看当前文件",{"2":{"163":1}}],["在所选行的行尾插入光标",{"2":{"158":1}}],["在全局匹配时",{"2":{"152":1,"901":1}}],["在匹配表达式中使用",{"2":{"145":1,"894":1}}],["在讲握手前先了解下对称和非对称加密的概念",{"2":{"330":1}}],["在讲用法前",{"2":{"145":1,"894":1}}],["在讲缓存前",{"2":{"132":1}}],["在位置",{"2":{"138":1,"887":1}}],["在效果上也会比较舒服",{"2":{"133":1}}],["在迭代项目时",{"2":{"132":1}}],["在下载访问时根据不同的缓存策略命中缓存返还资源",{"2":{"132":1}}],["在空闲时间浏览器主动加载了",{"2":{"131":1}}],["在加载首页时对其进行prefetch",{"2":{"131":1}}],["在上面的继承中",{"2":{"583":1}}],["在上面综合分析后",{"2":{"131":1}}],["在上述bfc的布局规则中已经简单介绍了下3个利用bfc布局规则的实例了",{"2":{"109":1}}],["在写css样式时",{"2":{"100":1}}],["在你还不知道下载node哪个版本前",{"2":{"95":1}}],["在别的数组里修改这些字符串或数字或是布尔值",{"2":{"30":1}}],["在之前的章节中我们学习过如何判断",{"2":{"9":1}}],["在任何提供之前提供一个给定的参数序列",{"2":{"5":1}}],["在调用新函数时",{"2":{"5":1}}],["在",{"2":{"2":1,"172":1,"239":1,"339":1,"343":1,"712":1,"722":1,"881":1,"997":1,"1002":1,"1003":1,"1018":1,"1075":1,"1087":2,"1121":5}}],["fk5fs容器",{"2":{"1218":1}}],["fk5fs",{"2":{"1217":1,"1218":1}}],["f71a4582a6c0",{"2":{"1088":1,"1089":1}}],["fd",{"2":{"1082":1}}],["f和",{"2":{"1068":1}}],["f选项可以强制停止并删除它们",{"2":{"1031":1}}],["ff21fc7bdfbe",{"2":{"1006":1}}],["ff",{"2":{"728":18,"1090":12}}],["ffb09b4da10527b212eda87e2b239bc6ae36748e769f203b21e384a66b349ff8",{"2":{"703":1}}],["fq",{"2":{"728":3}}],["fqdn",{"2":{"726":1,"1178":1}}],["fpic",{"2":{"708":1,"718":2}}],["f9",{"2":{"454":1}}],["fwlink",{"2":{"400":1}}],["ftp等",{"2":{"316":1}}],["ftp",{"2":{"310":1,"312":1,"316":2}}],["fruit",{"2":{"576":4}}],["freebsd",{"2":{"1164":1}}],["freeze",{"2":{"1121":1}}],["free",{"2":{"251":1,"1157":1,"1203":2}}],["fr",{"2":{"251":1}}],["friends",{"2":{"951":3,"955":4,"960":2}}],["fried",{"2":{"251":1}}],["fries",{"2":{"251":1}}],["frame",{"2":{"222":2,"324":1,"350":10}}],["front",{"2":{"251":1}}],["frontend开头的路径时重定向到https",{"2":{"716":1}}],["frontend开头时永久重定向到http",{"2":{"715":1}}],["frontend",{"0":{"271":1},"2":{"49":1,"555":1,"611":1,"715":1,"716":1,"1074":2,"1183":3,"1184":3,"1187":2,"1188":1,"1189":3,"1190":1,"1191":4}}],["frog",{"2":{"251":1}}],["frowning",{"2":{"251":3}}],["from=builder",{"2":{"1073":1}}],["from=build将build阶段的",{"2":{"1070":1}}],["from=build",{"2":{"1070":1}}],["from=xx多阶段产物的复制",{"2":{"1059":1}}],["from一般是最开始执行的",{"2":{"1053":1}}],["fromauthheaderasbearertoken",{"2":{"64":1}}],["from",{"0":{"79":1,"1053":1},"2":{"33":10,"79":3,"80":6,"81":4,"82":2,"83":14,"84":1,"85":1,"90":1,"199":1,"238":15,"243":1,"244":1,"245":4,"368":1,"603":3,"604":3,"607":1,"611":2,"612":1,"613":5,"614":2,"615":1,"616":1,"617":1,"618":1,"619":4,"622":1,"632":1,"634":3,"637":1,"639":2,"640":7,"642":1,"643":5,"645":1,"646":4,"648":8,"651":3,"652":3,"655":1,"659":3,"660":6,"661":2,"681":3,"697":1,"700":3,"702":7,"703":2,"707":1,"749":1,"858":1,"859":1,"863":1,"866":1,"867":1,"869":1,"870":1,"874":1,"875":6,"934":1,"1014":1,"1039":2,"1047":1,"1051":2,"1054":3,"1055":3,"1057":1,"1063":3,"1064":4,"1070":2,"1073":2,"1082":2,"1090":6,"1103":2,"1107":1,"1209":1,"1218":5}}],["fedora",{"2":{"1202":3}}],["feb",{"2":{"1082":2}}],["feflow",{"2":{"807":1}}],["features",{"2":{"1121":1}}],["feature",{"2":{"800":3,"1046":1}}],["feat",{"2":{"789":1,"797":5,"800":3,"801":4}}],["fearful",{"2":{"251":1}}],["fexceptions",{"2":{"708":1,"718":2}}],["ferris",{"2":{"251":1}}],["feel",{"2":{"1157":1}}],["feelsgood",{"2":{"251":2}}],["feet",{"2":{"251":1}}],["fetchbigimage",{"2":{"521":1}}],["fetch的response的body是个可读流",{"2":{"514":1}}],["fetchapi",{"2":{"404":2}}],["fetch",{"2":{"222":3,"344":1,"350":1,"404":1,"497":1,"508":1,"514":1,"521":1,"701":1,"724":1,"765":1,"769":1}}],["female",{"2":{"204":2,"754":2}}],["femalemodel",{"2":{"204":5,"754":5}}],["f5",{"2":{"165":1}}],["f81d4fae",{"2":{"316":1}}],["f8",{"2":{"161":2}}],["f2",{"2":{"158":1,"160":1}}],["f10",{"2":{"165":1}}],["f11",{"2":{"165":2}}],["f12",{"2":{"160":4,"215":2}}],["f1",{"2":{"156":1}}],["fuelpump",{"2":{"251":1}}],["fuji",{"2":{"251":1}}],["fu",{"2":{"251":1}}],["fullstack",{"0":{"991":1}}],["fullscreen",{"2":{"222":1}}],["fully",{"2":{"726":1,"1178":1}}],["full",{"2":{"237":2,"251":2}}],["fulfilled",{"2":{"98":4}}],["funcs",{"2":{"860":1,"864":1,"874":2,"875":1}}],["func",{"2":{"228":3,"576":2,"606":7}}],["functional",{"2":{"238":1}}],["functionalrendercontext",{"2":{"238":4}}],["function>>>",{"2":{"959":1}}],["function>>",{"2":{"951":1}}],["function>",{"2":{"228":1,"951":2}}],["function",{"0":{"263":1},"2":{"2":1,"3":1,"4":1,"7":2,"8":2,"9":3,"26":1,"32":1,"33":3,"40":2,"41":3,"43":1,"44":3,"60":1,"98":3,"127":1,"195":10,"196":2,"198":3,"200":2,"201":2,"202":1,"203":2,"204":4,"205":6,"206":3,"225":2,"227":2,"228":1,"229":4,"230":2,"231":3,"232":4,"233":2,"237":3,"238":4,"239":2,"244":3,"248":2,"338":2,"350":1,"404":1,"438":2,"473":3,"507":1,"510":1,"517":1,"521":2,"529":1,"532":2,"546":2,"547":3,"549":1,"550":3,"572":2,"573":15,"575":1,"576":8,"577":3,"578":3,"579":1,"580":3,"581":1,"582":5,"583":15,"587":5,"589":3,"590":1,"591":1,"595":1,"603":1,"611":1,"615":1,"616":1,"617":1,"640":1,"681":1,"692":1,"745":10,"746":2,"748":3,"750":2,"751":2,"752":1,"753":2,"754":4,"755":6,"756":3,"768":1,"772":1,"847":1,"865":1,"868":2,"869":1,"870":2,"874":1,"917":1,"932":11,"934":3,"937":4,"938":10,"939":3,"940":4,"941":2,"944":3,"945":2,"950":1,"951":9,"954":17,"955":7,"956":1,"959":6,"963":1,"964":13,"971":1}}],["fun",{"2":{"2":3,"3":1,"4":1}}],["fmt",{"2":{"83":4}}],["fstab",{"2":{"1203":1}}],["fstack",{"2":{"708":1,"718":2}}],["fs",{"2":{"62":5,"539":3,"700":1,"1209":2}}],["f+",{"2":{"60":1}}],["flv",{"2":{"708":1,"718":2}}],["flushfrequency",{"2":{"1212":1}}],["flush",{"2":{"944":4,"945":2}}],["flushed",{"2":{"251":1}}],["flutter",{"0":{"463":1},"2":{"464":1}}],["flatmap",{"2":{"656":1}}],["flashlight",{"2":{"251":1}}],["flags",{"2":{"251":2,"298":1}}],["flag",{"2":{"64":2,"239":1,"251":2,"376":6,"715":2,"771":2}}],["fly在这里是苍蝇的意思",{"2":{"204":1,"754":1}}],["flooding",{"2":{"304":1}}],["floor",{"2":{"60":1,"62":1,"83":1,"230":2,"771":1}}],["floppy",{"2":{"251":1}}],["flower",{"2":{"251":2}}],["flowing",{"2":{"251":1}}],["flow",{"2":{"237":1}}],["float64array",{"2":{"481":1,"485":1}}],["float32array",{"2":{"481":1}}],["float",{"2":{"111":1,"112":2}}],["float的值不为none",{"2":{"104":1}}],["flexvol",{"2":{"1218":1}}],["flex布局",{"0":{"192":1},"1":{"193":1}}],["flex作为现代的布局方案",{"2":{"20":1}}],["flex",{"0":{"20":1},"2":{"11":1,"20":1,"22":1,"104":2,"111":2,"193":1}}],["fi条件最后",{"2":{"1202":1}}],["fixtures",{"2":{"878":1}}],["fixtures路径下的文件",{"2":{"878":1}}],["fixturesfolder",{"2":{"878":1}}],["fixall",{"2":{"832":2,"840":1,"843":1}}],["fix后将已经暂存的文件继续暂存以commit",{"2":{"805":1}}],["fixes",{"2":{"800":1}}],["fix",{"2":{"789":1,"797":2,"800":2,"801":4,"805":2,"849":2}}],["fips",{"2":{"708":1,"1121":2}}],["fiddler不但扮演了客户端和服务器进行tls加密通信",{"2":{"440":1}}],["fiddler是个很强大的抓包工具",{"2":{"440":1}}],["fiddler是由c",{"2":{"436":1}}],["fiddler默认不会抓取https的",{"2":{"438":1}}],["fiddlerscript",{"2":{"436":1}}],["fiddler会自动识别到应用程序进程",{"2":{"431":1}}],["fiddler会弹出是否允许抓包当前ip",{"2":{"422":1}}],["fiddler由不同的面板模块组成",{"2":{"429":1}}],["fiddler有fiddler",{"2":{"428":1}}],["fiddler",{"2":{"428":2}}],["fiddler抓包",{"0":{"428":1},"1":{"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1}}],["field头信息获取版本的自定义版本提取器",{"2":{"656":1}}],["field",{"2":{"355":1,"656":1,"1103":1,"1107":1,"1184":1,"1191":1}}],["fields",{"2":{"62":1}}],["fi",{"2":{"310":1,"726":3,"728":2,"1178":3}}],["five",{"2":{"251":1}}],["fishing",{"2":{"251":1}}],["fish",{"2":{"251":4}}],["fist",{"2":{"251":1}}],["finally",{"2":{"941":1,"964":1}}],["final",{"2":{"836":2,"874":1}}],["finish",{"2":{"634":1,"770":1}}],["finished",{"2":{"333":3,"703":1,"1051":1,"1054":1,"1055":1,"1179":1}}],["fin默认超时时间",{"2":{"382":1}}],["fin",{"2":{"376":3,"382":2,"455":1}}],["fine",{"2":{"325":1,"350":1}}],["finnadie",{"2":{"251":2}}],["findcats",{"2":{"618":1}}],["findall",{"2":{"605":1}}],["findindex",{"2":{"195":2,"245":3,"745":2}}],["find",{"2":{"83":1,"245":1,"1082":1}}],["findbyid",{"2":{"64":1}}],["findone",{"2":{"57":1,"64":1}}],["firewalld",{"2":{"1201":2,"1208":1}}],["fireworks",{"2":{"251":1}}],["fire",{"2":{"251":2}}],["firefox",{"2":{"428":1}}],["firefox52+",{"2":{"22":1}}],["firefox3",{"2":{"22":2}}],["firefox4+",{"2":{"22":1}}],["firefox2+",{"2":{"22":6}}],["firstname",{"2":{"1100":1}}],["first设计模式",{"2":{"211":1,"761":1}}],["first",{"2":{"110":2,"251":2,"801":1,"1174":1}}],["filltext",{"2":{"284":1}}],["fill",{"2":{"283":1,"944":1}}],["fillrect",{"2":{"283":1}}],["fillstyle",{"2":{"283":1}}],["fill填充颜色",{"2":{"283":1}}],["filter使用参数",{"2":{"718":1}}],["filter支持除param以外的位置绑定",{"2":{"640":1}}],["filter后还需要绑定到应用程序中",{"2":{"640":1}}],["filteredoperations",{"2":{"687":3}}],["filtered",{"2":{"454":1}}],["filterset",{"2":{"436":1}}],["filters选项",{"2":{"436":1}}],["filters打开",{"2":{"436":1}}],["filters",{"2":{"436":1}}],["filter",{"0":{"636":1},"1":{"637":1,"638":1,"639":1,"640":1},"2":{"63":5,"201":1,"203":1,"639":2,"640":12,"656":1,"665":1,"696":2,"718":25,"751":1,"753":1,"772":1,"815":1,"998":2,"1002":2,"1006":2}}],["filecheckfrequency",{"2":{"1212":1}}],["filecontroller",{"2":{"700":2,"765":1}}],["file参数来指定环境变量文件",{"2":{"1024":1}}],["file继承于blob类型",{"2":{"768":1}}],["file类型中包含了文件的名字",{"2":{"768":1}}],["file字段的文件",{"2":{"701":1}}],["fileinterceptor",{"2":{"613":2,"701":1,"765":1,"769":1}}],["filepath",{"2":{"520":4}}],["file对象",{"0":{"499":1}}],["filereadersync和filereader拥有相同的方法和属性",{"2":{"507":1}}],["filereadersync接口允许以同步的方式读取",{"2":{"507":1}}],["filereadersync",{"0":{"507":1},"2":{"507":1}}],["filereader通过构造函数生成一个对象",{"2":{"503":1}}],["filereader",{"0":{"502":1},"1":{"503":1,"504":1,"505":1,"506":1},"2":{"354":1,"496":1,"498":1,"502":1,"503":1,"772":1,"773":1}}],["filename",{"2":{"132":1,"175":1,"176":1,"190":4,"521":4,"729":1,"769":4,"770":3}}],["file",{"0":{"498":1},"1":{"499":1,"500":1,"501":1},"2":{"62":7,"237":3,"251":2,"268":1,"316":1,"410":1,"414":1,"430":1,"498":3,"499":5,"502":1,"507":3,"521":1,"700":6,"701":6,"708":3,"713":1,"718":2,"728":1,"729":1,"765":9,"768":5,"769":5,"770":2,"771":1,"772":7,"773":1,"800":1,"857":2,"860":1,"864":1,"874":2,"875":1,"880":1,"1001":2,"1007":1,"1035":2,"1054":1,"1055":1,"1063":2,"1097":1,"1103":1,"1107":1,"1121":6,"1142":2,"1157":1,"1158":1,"1159":1,"1184":1,"1191":1,"1209":3}}],["filesize",{"2":{"520":5,"521":2}}],["filestat",{"2":{"520":2}}],["files",{"2":{"62":2,"499":1,"765":4,"768":4,"800":1,"827":1,"830":1,"847":1,"857":3,"860":1,"864":1,"874":1,"875":1,"1059":1,"1103":1,"1107":1,"1189":1}}],["failure",{"0":{"1130":1},"2":{"1025":1,"1130":2,"1131":1,"1132":15,"1136":3}}],["failed",{"2":{"40":2,"244":1,"546":2,"1007":1,"1121":1,"1132":4}}],["fastcgi",{"2":{"708":2,"718":4,"729":1}}],["fastifyrequest",{"2":{"656":1}}],["fastify",{"2":{"603":1}}],["fast",{"2":{"251":1}}],["factory",{"2":{"251":1}}],["facing",{"2":{"251":1}}],["facebook",{"2":{"855":1,"1230":1}}],["facepunch",{"2":{"251":1}}],["face",{"2":{"251":14}}],["fax",{"2":{"251":1}}],["fallthrough",{"2":{"695":1}}],["fallbacks",{"2":{"673":1}}],["fallbacklanguage",{"2":{"673":1}}],["fallen",{"2":{"251":1}}],["false>",{"2":{"944":1}}],["false来取消缓存",{"2":{"932":1}}],["false在转换成0",{"2":{"48":1,"554":1}}],["false等为false外",{"2":{"46":1,"552":1}}],["false转换为0",{"2":{"43":1,"549":1}}],["false",{"2":{"34":1,"36":1,"41":8,"43":1,"46":2,"47":7,"48":1,"61":1,"64":5,"83":2,"98":1,"130":1,"144":2,"152":1,"153":1,"154":4,"177":1,"182":2,"190":2,"197":3,"200":3,"205":1,"222":1,"229":2,"231":2,"249":1,"354":1,"542":1,"547":8,"549":1,"552":2,"553":7,"554":1,"572":1,"643":1,"646":1,"673":1,"686":1,"696":1,"697":1,"703":1,"747":3,"750":3,"755":1,"771":1,"836":2,"839":3,"857":2,"879":3,"893":2,"901":1,"902":1,"903":4,"932":3,"934":2,"940":1,"944":2,"949":3,"951":1,"962":2,"964":5,"971":1,"1074":1,"1082":1,"1148":2,"1157":3,"1159":5,"1178":1,"1209":29,"1212":7}}],["family",{"2":{"251":1}}],["favicon",{"2":{"222":1,"671":1,"874":1,"1007":2}}],["foss",{"2":{"1121":1}}],["following",{"2":{"857":1,"1214":4}}],["folder",{"2":{"251":2,"407":1,"1103":1}}],["fountain",{"2":{"251":1}}],["found",{"2":{"83":1,"317":2,"797":2,"1103":6}}],["four",{"2":{"251":2}}],["foggy",{"2":{"251":1}}],["footer",{"2":{"788":1,"801":1}}],["footer>",{"2":{"788":1}}],["football",{"2":{"251":2}}],["foo=123",{"2":{"729":1}}],["food",{"2":{"572":4,"577":4}}],["foo",{"2":{"139":3,"529":5,"571":3,"713":1,"729":1,"888":3,"938":2,"941":2}}],["fomatting",{"2":{"102":1}}],["forcetrigger",{"2":{"944":1}}],["forcibly",{"2":{"97":1}}],["fortify",{"2":{"708":1,"718":2}}],["forroutes",{"2":{"635":3}}],["forrootasync",{"2":{"632":1}}],["forroot",{"2":{"628":1,"630":1,"632":1,"659":1,"669":2,"673":1}}],["forroot数据结构如下",{"2":{"628":1}}],["forfeature",{"2":{"631":1}}],["forfeature两个方法",{"2":{"628":1}}],["forgery",{"2":{"351":1}}],["forbiddenexception",{"2":{"520":1}}],["forbidden",{"2":{"317":1}}],["foreign",{"2":{"383":1}}],["forever",{"2":{"263":1,"728":6,"1090":8}}],["foreach等等",{"2":{"203":1,"753":1}}],["foreach",{"2":{"195":1,"232":1,"245":1,"247":1,"354":1,"516":1,"581":1,"745":1,"869":3,"950":2,"951":5,"955":2,"959":1,"961":2,"963":1,"964":1}}],["forwardhealthcheckvip",{"2":{"1212":1}}],["forward",{"2":{"251":2,"1034":1,"1205":2}}],["forwarded",{"2":{"128":2,"339":3,"709":1,"723":3,"724":3,"1034":1}}],["fork",{"2":{"251":1,"1225":1}}],["fork后等待项目更新自动推送",{"2":{"66":1}}],["formdata",{"2":{"701":6,"765":4,"769":6,"772":7}}],["form>",{"2":{"352":1}}],["form",{"2":{"62":8,"197":10,"337":2,"352":2,"699":1,"747":10,"765":1}}],["formidable",{"2":{"62":3}}],["formidable来处理文件上传信息",{"2":{"62":1}}],["formatonsave",{"2":{"838":4,"840":1}}],["formatter",{"2":{"838":1}}],["formatting",{"2":{"102":1,"800":1}}],["formattime",{"2":{"62":2}}],["formatdate",{"2":{"634":2}}],["format",{"2":{"57":1,"60":12,"62":1,"83":14,"190":1,"237":7,"709":1,"807":1,"998":1,"1074":1,"1209":1}}],["for",{"2":{"26":1,"33":1,"40":3,"60":1,"61":1,"98":1,"128":2,"197":1,"200":1,"203":1,"204":4,"222":3,"232":1,"237":1,"238":1,"339":2,"407":2,"454":1,"533":1,"546":3,"583":1,"621":1,"703":1,"709":1,"713":1,"723":2,"724":2,"728":3,"747":1,"750":1,"753":1,"754":4,"814":1,"857":8,"869":1,"932":1,"934":1,"937":2,"938":1,"941":1,"951":1,"954":3,"955":2,"964":5,"1034":2,"1039":1,"1047":1,"1051":2,"1054":1,"1055":1,"1082":1,"1132":2,"1208":2,"1217":2}}],["fontend",{"2":{"1142":1}}],["fontsize",{"2":{"61":1}}],["font",{"2":{"16":2,"179":1,"284":1}}],["f",{"2":{"9":3,"34":3,"40":1,"83":5,"139":2,"159":2,"160":2,"162":1,"164":2,"546":1,"576":3,"579":3,"581":3,"888":2,"1007":2,"1009":3,"1027":1,"1031":1,"1068":3,"1069":2,"1094":1,"1172":1,"1214":1,"1217":2}}],["fname",{"2":{"83":1}}],["fn",{"2":{"1":3,"2":2,"3":2,"4":2,"7":4,"8":4,"195":8,"205":4,"589":2,"590":2,"745":8,"755":4,"869":1,"870":1,"934":1,"944":2,"945":2,"959":3,"964":4}}],["awesome",{"2":{"1122":2}}],["awhlbmdzahvhatoxmjm0ntyk",{"2":{"1014":3}}],["await其实是个语法糖",{"2":{"532":1}}],["await",{"0":{"474":1},"2":{"64":2,"230":3,"232":1,"404":2,"465":1,"496":3,"512":1,"514":2,"520":1,"521":1,"532":1,"603":3,"675":1,"681":2,"692":1,"702":1,"724":1,"769":1,"770":7,"771":3,"772":4,"773":1,"865":1,"867":1}}],["a=`ps",{"2":{"728":1}}],["aog",{"2":{"726":1}}],["azure",{"2":{"726":2,"1013":1,"1159":1}}],["airbnb",{"2":{"833":1}}],["airplane",{"2":{"251":1}}],["aio",{"2":{"708":1,"718":2}}],["affe",{"2":{"1095":1}}],["affect",{"2":{"800":2}}],["after=network",{"2":{"1208":1}}],["afterall",{"2":{"871":1}}],["aftereach",{"2":{"871":1,"881":1}}],["after",{"2":{"621":3,"801":1,"881":1,"1121":1,"1124":2,"1225":1}}],["africa",{"2":{"251":1}}],["a类私有地址",{"2":{"360":1}}],["a类地址可用于较大规模的网络",{"2":{"359":1}}],["a类地址的网络地址范围为1",{"2":{"359":1}}],["a类地址最高位为0",{"2":{"359":1}}],["a类地址",{"2":{"359":1}}],["a^b",{"2":{"333":1}}],["a765",{"2":{"316":1}}],["a在浏览器上提交网页登录信息点击发送",{"2":{"311":1}}],["a4",{"2":{"298":1}}],["a5ee5b1",{"2":{"1082":1}}],["a5",{"2":{"298":2}}],["aquarius",{"2":{"251":1}}],["ae",{"2":{"298":1}}],["aerial",{"2":{"251":1}}],["aes128",{"2":{"726":1}}],["aes",{"2":{"83":4,"333":1}}],["amd64",{"2":{"1060":1}}],["amd等等",{"2":{"1053":1}}],["amazon",{"2":{"1013":1}}],["am",{"2":{"573":1,"575":2,"578":2}}],["amount",{"2":{"352":1}}],["ambulance",{"2":{"251":1}}],["americas",{"2":{"251":1}}],["amp",{"0":{"1127":1},"2":{"49":2,"382":1,"414":6,"418":2,"555":2,"1058":2}}],["ax1x",{"2":{"245":2,"249":1}}],["axios",{"2":{"54":2,"813":1}}],["axios等等",{"2":{"52":1}}],["ac",{"2":{"1090":2}}],["aclass",{"2":{"606":1}}],["ack=80的fin报文和ack报文并期待下一次的ack序列号为126",{"2":{"457":1}}],["ack=1的请求",{"2":{"378":1}}],["ack=1",{"2":{"378":1}}],["acknumber",{"2":{"456":1}}],["acknumber=3059428280",{"2":{"456":1}}],["acknowledgment",{"2":{"391":1}}],["acknovledgement",{"2":{"376":1}}],["ack状态",{"2":{"382":1,"457":1}}],["ack重传次数由linux内核决定的",{"2":{"381":1}}],["ack重传次数",{"2":{"381":1}}],["ack重传次数等着手",{"2":{"381":1}}],["ack包作为确认",{"2":{"380":1}}],["ack",{"2":{"376":2,"382":2,"455":1}}],["action",{"2":{"1121":2,"1179":3}}],["action=",{"2":{"352":1}}],["activefn",{"2":{"951":10}}],["activeeffect",{"2":{"934":4,"959":7,"964":6}}],["activeelement",{"2":{"462":1}}],["activecount",{"2":{"771":10}}],["active",{"2":{"383":1,"462":1,"728":2,"938":1,"940":2,"944":1,"945":1,"954":1,"964":1,"994":1,"1082":2,"1121":1}}],["activate",{"2":{"222":2}}],["access设置允许访问",{"2":{"1044":1}}],["access",{"2":{"337":2,"339":3,"404":1,"414":1,"422":1,"588":2,"692":3,"708":1,"709":2,"718":2,"724":3,"1034":4}}],["acceptcontenttypes",{"2":{"1212":1}}],["accepts",{"2":{"1209":2}}],["acceptlang",{"2":{"674":2}}],["accept队列溢出时",{"2":{"380":1}}],["accept队列最大值",{"2":{"380":1}}],["accept队列的最大限制通常是128",{"2":{"380":1}}],["accept队列",{"2":{"380":1}}],["accept等几个重要的头部字段",{"2":{"354":1}}],["acceptrange",{"2":{"344":1}}],["accepted",{"2":{"317":1}}],["accept",{"2":{"251":1,"319":3,"337":2,"344":2,"347":2,"354":1,"456":1,"520":1,"674":1,"717":2}}],["account",{"2":{"57":1,"64":4,"1214":2}}],["attempt",{"2":{"1051":1}}],["attribute",{"2":{"404":2}}],["attach用于连接到正在运行中的docker容器的标准输入",{"2":{"1005":1}}],["attach",{"0":{"443":1,"447":1},"2":{"400":3,"443":1,"1005":1}}],["attachevent",{"2":{"200":2,"750":2}}],["atm",{"2":{"251":1}}],["at",{"2":{"232":1,"251":1,"454":4,"857":1,"1121":2,"1214":1}}],["aton",{"2":{"83":2}}],["ago",{"2":{"728":1,"998":3,"1002":3,"1006":1,"1012":1,"1051":1,"1108":1,"1217":18,"1218":1}}],["aggregatetimeout",{"2":{"188":1,"190":1}}],["age属性",{"2":{"951":1}}],["age变量时就会报错",{"2":{"589":1}}],["age然后定义他们",{"2":{"587":1}}],["age`",{"2":{"580":1}}],["age=3600",{"2":{"720":1}}],["age=31536000",{"2":{"350":1}}],["age=86400",{"2":{"720":2}}],["age=0",{"2":{"344":1,"347":1,"695":1}}],["agent",{"2":{"319":1,"456":1,"709":1,"717":1,"729":2}}],["age",{"2":{"26":2,"33":4,"38":3,"77":1,"78":2,"80":2,"81":2,"83":2,"84":1,"86":1,"233":3,"319":1,"544":3,"571":3,"573":2,"576":2,"578":4,"580":8,"582":7,"583":12,"587":2,"589":5,"648":1,"686":2,"720":5,"721":1,"929":4,"930":1,"931":1,"932":1,"950":2,"951":5,"958":1,"959":5,"960":3,"963":3,"1217":3,"1218":3}}],["aarch64",{"2":{"1198":1,"1202":1,"1210":1,"1217":3}}],["aaca",{"2":{"410":2}}],["aaaa",{"2":{"145":2,"894":2}}],["aa",{"2":{"145":1,"894":1}}],["aa1bb",{"2":{"140":2,"889":2}}],["a|b表示匹配a或者b",{"2":{"143":1,"892":1}}],["a1",{"2":{"140":1,"245":1,"889":1}}],["a1ds23",{"2":{"140":2,"889":2}}],["a页面",{"2":{"131":1}}],["ajax",{"2":{"130":1,"469":1,"532":1}}],["avif",{"2":{"347":1}}],["avoid",{"2":{"239":1}}],["availability",{"2":{"728":1}}],["available",{"2":{"95":1,"1203":1}}],["avatar",{"2":{"64":2,"1230":1}}],["avg",{"2":{"83":2,"1063":1,"1064":2}}],["asm",{"2":{"980":1}}],["asrootdata",{"2":{"954":2}}],["ast",{"2":{"587":1,"971":4}}],["asterisk",{"2":{"251":1}}],["astonished",{"2":{"251":1}}],["asia",{"2":{"251":1,"660":1,"1204":2}}],["as",{"2":{"82":2,"83":9,"222":2,"249":1,"438":1,"632":1,"639":2,"651":1,"669":1,"674":1,"703":1,"934":1,"944":3,"955":1,"956":1,"1006":1,"1053":2,"1057":1,"1070":2,"1073":1,"1103":2,"1107":1,"1139":1,"1184":1,"1191":1,"1214":4}}],["asc",{"2":{"81":1}}],["asc是默认排序方式",{"2":{"81":1}}],["asc表示正序",{"2":{"81":1}}],["async就可以了",{"2":{"865":1}}],["asynchronous",{"2":{"537":1}}],["async1执行完后出栈",{"2":{"532":1}}],["async1函数入栈",{"2":{"532":1}}],["async1",{"2":{"532":6}}],["async",{"0":{"474":1},"2":{"64":2,"230":3,"232":1,"344":1,"350":1,"404":1,"455":1,"465":1,"510":1,"520":1,"521":1,"532":1,"603":1,"606":1,"619":1,"634":1,"637":1,"640":2,"642":1,"643":2,"645":1,"646":1,"675":1,"681":1,"683":1,"686":3,"702":2,"724":1,"765":1,"769":1,"770":4,"771":3,"773":1,"865":1,"867":1,"1209":1}}],["assuming",{"2":{"814":1}}],["assumptions",{"0":{"269":1},"2":{"269":1}}],["assets",{"2":{"54":2,"190":1}}],["assertion",{"2":{"40":2,"546":2}}],["assert",{"2":{"40":1,"546":1}}],["assignees",{"2":{"1122":1}}],["assignment",{"2":{"588":1}}],["assign",{"0":{"28":1},"2":{"28":4,"237":1,"1132":1}}],["aufs",{"2":{"1209":1}}],["audited",{"2":{"1103":1}}],["audio",{"2":{"62":1}}],["authtoken=jev",{"2":{"1191":1}}],["authtoken=$",{"2":{"1190":1}}],["authtoken=huzudsos4wfnsgfubi6j",{"2":{"1187":1}}],["authtoken=",{"2":{"1187":1}}],["auths",{"2":{"1014":1,"1209":1}}],["authenticationrouteguard",{"2":{"648":3}}],["authenticationroutekey",{"2":{"648":4}}],["authentication",{"2":{"648":3,"1212":2}}],["authenticate",{"2":{"64":1}}],["auth",{"2":{"127":1,"134":1,"708":1,"717":1,"718":2,"729":1,"1014":2}}],["authorities",{"2":{"1214":2}}],["authorization",{"2":{"319":1,"648":2,"692":1,"1212":1}}],["author",{"2":{"60":1,"62":1,"64":1,"190":1,"222":2,"1102":1,"1103":2,"1121":1,"1183":1,"1184":1,"1187":1,"1227":1}}],["autocannon",{"2":{"739":1}}],["autorestart",{"2":{"703":1,"1074":1}}],["autoresponder",{"2":{"436":1}}],["automated",{"2":{"999":1}}],["automatically",{"2":{"857":3,"1098":2,"1157":1}}],["automatic",{"2":{"355":1}}],["automock",{"2":{"857":1}}],["automobile",{"2":{"251":1}}],["auto",{"0":{"13":1,"443":1},"2":{"11":1,"13":1,"17":1,"22":1,"75":1,"86":2,"443":1,"709":2,"726":2,"1178":3}}],["adj",{"2":{"1209":1}}],["advertise",{"2":{"1214":1}}],["advertiseaddress",{"2":{"1212":1}}],["adv",{"2":{"728":1}}],["advantage",{"2":{"251":1}}],["adad",{"2":{"245":1}}],["added",{"2":{"1103":1,"1107":1,"1184":1,"1191":1}}],["addeventlistener",{"2":{"200":2,"222":4,"247":1,"338":1,"354":4,"404":10,"724":1,"750":2,"1034":1}}],["addevent",{"2":{"200":1,"750":1}}],["adddep",{"2":{"951":2,"954":2}}],["addons",{"2":{"875":1,"1214":1}}],["addsub",{"2":{"951":2,"954":2}}],["adds",{"2":{"800":1}}],["addsong",{"2":{"54":1}}],["adding",{"2":{"713":1,"800":1}}],["addinterval",{"2":{"661":4}}],["addition",{"2":{"708":1,"718":2}}],["addtimeout",{"2":{"661":3}}],["addcron",{"2":{"661":2}}],["addcronjob",{"2":{"661":1}}],["add函数体",{"2":{"195":1,"745":1}}],["address=192",{"2":{"1214":1}}],["address还有目标主机的ip192",{"2":{"454":1}}],["address",{"2":{"295":1,"298":1,"301":1,"361":1,"370":1,"379":1,"382":1,"383":2,"454":5,"1209":6}}],["addr",{"2":{"128":1,"339":1,"587":2,"709":1,"723":2,"724":1,"728":1,"729":3,"1034":1}}],["add",{"0":{"1060":1},"2":{"83":2,"132":2,"195":7,"197":3,"233":1,"245":2,"247":1,"248":3,"249":1,"339":4,"404":1,"632":1,"658":2,"671":1,"672":1,"680":1,"696":1,"697":1,"703":2,"723":1,"724":1,"745":7,"747":3,"799":1,"801":1,"802":1,"804":1,"805":2,"806":1,"814":3,"815":2,"817":1,"857":1,"941":1,"951":4,"954":1,"959":1,"964":3,"1034":5,"1060":2,"1082":1,"1093":1,"1102":2,"1103":2,"1183":4,"1184":1,"1190":2,"1209":1}}],["administration",{"2":{"1214":1}}],["admin启动后台管理系统项目",{"2":{"56":1}}],["adminlikes",{"2":{"54":1}}],["adminstore",{"2":{"54":1}}],["admin",{"2":{"54":3,"56":2,"57":2,"711":4,"715":1,"1095":3,"1096":1,"1157":4,"1158":1,"1214":4}}],["also",{"2":{"1103":1}}],["always",{"2":{"797":2,"847":1,"1025":2,"1034":2,"1131":1,"1132":1,"1137":1,"1153":1,"1171":2,"1172":1,"1173":1}}],["alpine为基础镜像使用copy",{"2":{"1070":1}}],["alpine镜像为基础",{"2":{"1051":1}}],["alpine",{"2":{"998":1,"1018":2,"1021":1,"1022":1,"1034":2,"1051":3,"1054":3,"1055":3,"1070":1,"1073":2,"1074":1,"1090":6,"1145":1,"1146":1,"1148":1,"1157":3,"1159":1,"1190":1}}],["alpine3",{"2":{"703":3}}],["alpha",{"2":{"814":3}}],["alphabetic",{"2":{"284":2}}],["algorithm",{"2":{"697":1}}],["already",{"2":{"382":1,"588":1,"1039":3,"1046":6,"1157":1}}],["alarm",{"2":{"251":1}}],["aliyuncs",{"2":{"1083":1,"1208":1,"1209":2,"1212":1,"1214":1}}],["aliyun",{"2":{"1082":1,"1083":1,"1093":1,"1204":2,"1209":1,"1210":3}}],["alive会在一定时间内保持tcp的连接",{"2":{"457":1}}],["alive",{"2":{"342":2,"343":2,"344":1,"347":1,"453":2,"723":1}}],["alice",{"2":{"333":3}}],["alien",{"2":{"251":1}}],["aliases",{"2":{"237":1}}],["alias",{"2":{"186":1,"190":1,"237":4,"718":1,"729":1}}],["align就可以做到水平和垂直方向的居中了",{"2":{"17":1}}],["align就可以做到水平居中",{"2":{"16":1}}],["align",{"2":{"16":3,"17":4,"18":1,"19":2,"20":1,"21":1}}],["align也可以在垂直方向做到居中",{"2":{"16":1}}],["altarch",{"2":{"1217":3}}],["alternatively",{"2":{"1214":1}}],["alternation",{"2":{"251":1}}],["alternate",{"2":{"778":1}}],["alt=",{"2":{"245":1,"350":1}}],["alt",{"2":{"158":1,"727":1,"778":1}}],["all将所有加入右侧列表",{"2":{"1099":1}}],["all=",{"2":{"728":1}}],["allbuffer",{"2":{"485":3}}],["all",{"2":{"130":1,"431":1,"611":1,"612":3,"621":3,"635":1,"713":1,"718":1,"728":2,"769":1,"770":1,"771":2,"772":1,"801":1,"814":1,"857":1,"860":2,"864":2,"874":1,"875":1,"1098":1,"1121":105,"1122":22,"1217":1}}],["allowrecurse",{"2":{"934":1}}],["allowreserved",{"2":{"829":1}}],["allowbreakingchanges",{"2":{"801":1}}],["allowcustomscopes",{"2":{"801":1}}],["allowedheaders",{"2":{"692":1}}],["allowfullscreen>",{"2":{"350":1}}],["allow",{"0":{"1130":1},"2":{"83":1,"339":4,"404":1,"414":1,"692":4,"718":1,"724":3,"1034":4,"1042":1,"1130":1,"1136":1}}],["allorders",{"2":{"54":1}}],["alltabledata",{"2":{"63":5}}],["allusers",{"2":{"63":1}}],["apt",{"2":{"1056":2,"1065":2}}],["apng",{"2":{"347":1}}],["apr",{"2":{"342":1,"343":1,"347":1,"723":1}}],["apparmor",{"2":{"1209":1}}],["approved",{"2":{"1122":1}}],["append",{"2":{"701":3,"765":1,"769":3,"771":7,"772":6,"773":1}}],["appendchildren",{"2":{"581":4,"582":3,"583":4}}],["appendchild",{"2":{"198":1,"201":1,"338":1,"354":2,"404":1,"748":1,"751":1}}],["appcontroller",{"2":{"604":2,"611":4,"612":1,"613":4,"614":1,"618":1,"635":1}}],["appmodule",{"2":{"603":3,"604":1,"607":1,"608":1,"609":1,"622":1,"635":1,"640":1,"681":2,"692":1}}],["app启动项目",{"2":{"405":1}}],["appservice",{"2":{"604":3,"622":2,"635":1}}],["apps",{"2":{"214":1,"222":2,"703":1,"883":1,"1074":1}}],["applewebkit",{"2":{"1005":1,"1007":1}}],["apples",{"2":{"150":4,"899":4}}],["apple",{"2":{"139":2,"140":1,"154":1,"251":2,"888":2,"889":1,"903":1}}],["applications",{"2":{"222":1}}],["application",{"2":{"134":1,"309":1,"337":1,"342":1,"347":3,"453":1,"709":1,"716":1,"717":1,"723":1,"726":2,"765":1,"769":1,"770":2,"772":2,"1082":1,"1208":1,"1209":4}}],["apply改变内部的this指向",{"2":{"578":1}}],["apply和call基本上相似",{"2":{"5":1}}],["apply介绍",{"0":{"2":1}}],["apply",{"0":{"6":1},"1":{"7":1,"8":1,"9":1},"2":{"1":2,"2":2,"9":2,"197":1,"205":2,"576":1,"635":3,"747":1,"755":2,"955":2,"1214":1}}],["apply使用技巧",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1}}],["app",{"0":{"461":1},"2":{"54":2,"126":1,"127":1,"190":3,"222":1,"343":1,"344":1,"347":1,"350":1,"354":6,"401":1,"404":2,"455":3,"573":1,"583":2,"591":1,"603":4,"604":2,"606":8,"621":2,"624":3,"626":2,"640":3,"643":2,"646":2,"652":2,"654":1,"656":1,"665":8,"671":2,"681":5,"687":1,"688":1,"692":2,"703":5,"723":3,"784":1,"883":1,"954":1,"977":3,"1023":1,"1024":2,"1025":1,"1034":4,"1056":4,"1059":2,"1060":1,"1065":2,"1070":3,"1073":2,"1074":4}}],["apiversion",{"2":{"1212":3,"1217":2}}],["api会被代理到compose",{"2":{"1034":1}}],["apiwatch",{"2":{"944":1}}],["apiserver",{"2":{"1212":1,"1214":1,"1217":7}}],["apis",{"2":{"857":1}}],["apiconsumes",{"2":{"765":1}}],["api时设置状态码200并以json的形式返回数据",{"2":{"716":1}}],["api`",{"2":{"687":1}}],["apitags`",{"2":{"687":1}}],["apitags",{"2":{"687":1}}],["apiresponse",{"2":{"686":1}}],["apibody",{"2":{"686":1}}],["apiblacklist",{"2":{"127":1}}],["apiquery",{"2":{"686":2}}],["apiproperty还有一些其他的属性可以配置",{"2":{"685":1}}],["apiproperty装饰器用来装饰类的属性",{"2":{"685":1}}],["apiproperty",{"0":{"685":1},"2":{"684":1,"685":2,"686":5}}],["api就看到默认的接口列表了",{"2":{"682":1}}],["api|",{"2":{"639":1}}],["api",{"2":{"54":1,"61":2,"177":1,"182":1,"190":2,"230":1,"238":1,"263":2,"338":1,"462":3,"508":1,"520":2,"639":1,"652":2,"678":2,"681":2,"683":1,"687":2,"688":1,"716":1,"765":1,"769":1,"770":1,"771":1,"772":3,"855":1,"864":1,"869":1,"965":1,"1034":3,"1082":2,"1121":4,"1132":4,"1167":1,"1187":4,"1190":2,"1191":2,"1198":1,"1208":1,"1217":3}}],["abort",{"2":{"506":1,"514":1,"516":1}}],["about",{"2":{"222":2}}],["ababab",{"2":{"141":2,"890":2}}],["abab",{"2":{"141":1,"890":1}}],["ab1c2d345e",{"2":{"141":1,"890":1}}],["ab",{"2":{"138":3,"141":1,"251":1,"612":2,"739":1,"887":3,"890":1}}],["absdfg",{"2":{"143":1,"892":1}}],["absksdblsb",{"2":{"138":1,"887":1}}],["abstract",{"2":{"49":1,"555":1}}],["absolute",{"0":{"12":1,"13":1,"14":1,"15":1},"2":{"11":4,"12":1,"13":1,"14":1,"15":1,"22":4}}],["abcdef",{"2":{"1212":1}}],["abcd",{"2":{"251":2}}],["abc",{"2":{"41":6,"54":1,"251":1,"547":6}}],["annotations",{"2":{"1209":7}}],["anonymous",{"2":{"1042":1,"1212":1}}],["anull",{"2":{"726":1}}],["ancestors",{"2":{"350":3}}],["anchor",{"2":{"251":1}}],["ans",{"2":{"325":1}}],["antp",{"2":{"383":1}}],["ant",{"2":{"251":1,"382":1}}],["angular提交信息规范",{"2":{"807":1}}],["angular",{"2":{"807":1,"833":1}}],["angular规范",{"2":{"788":1}}],["anguished",{"2":{"251":1}}],["angel",{"2":{"251":1}}],["anger",{"2":{"251":1}}],["angry",{"2":{"251":1}}],["and",{"2":{"83":2,"238":1,"251":3,"383":1,"453":2,"541":2,"728":1,"800":1,"801":1,"857":2,"1014":1,"1035":1,"1103":1,"1132":1,"1214":4}}],["an",{"2":{"40":3,"97":1,"139":2,"140":2,"222":2,"355":1,"546":3,"857":2,"888":2,"889":2}}],["any>",{"2":{"229":2,"230":1,"232":2,"581":1,"637":1,"651":1,"920":1,"934":1,"950":1,"951":3,"955":3,"956":1,"959":1,"960":1,"964":5}}],["any",{"2":{"33":4,"132":2,"225":1,"228":2,"229":5,"230":1,"231":3,"232":2,"233":1,"245":1,"431":1,"613":3,"628":1,"634":1,"639":2,"645":2,"686":1,"695":3,"701":1,"771":4,"800":2,"868":4,"874":1,"920":1,"932":4,"934":1,"937":1,"938":3,"939":1,"940":1,"941":2,"944":6,"950":1,"951":6,"954":3,"955":5,"956":4,"958":1,"959":3,"960":1,"961":1,"963":3,"1132":1,"1214":3}}],["a没有发生变化",{"2":{"33":1}}],["arm架构系列",{"2":{"1180":1}}],["arm架构镜像",{"2":{"1171":1}}],["arm架构",{"2":{"1094":1}}],["arm架构的",{"2":{"1057":1}}],["arm64v8",{"2":{"1171":3,"1172":1,"1173":1}}],["arm64",{"2":{"1082":2,"1208":3,"1209":1}}],["are",{"2":{"800":1,"1098":1,"1214":1}}],["aria",{"2":{"779":1}}],["aria基础",{"2":{"779":1}}],["aries",{"2":{"251":1}}],["arp从上层知道了p2的目标ip地址",{"2":{"454":1}}],["arp是地址解析协议",{"2":{"454":1}}],["arp是将ip地址转换为mac地址",{"2":{"301":1}}],["arp寻址",{"2":{"312":1}}],["arpa的研究成果最终演变成了tcp",{"2":{"310":1}}],["arp泛洪攻击的原理是攻击者向网络中发送大量虚假的arp请求包",{"2":{"304":1}}],["arp泛洪",{"0":{"304":1},"2":{"304":1}}],["arpdefender等工具可以帮助管理员实时监控网络中的arp请求和响应",{"2":{"303":1}}],["arpwatch",{"2":{"303":1}}],["arp可以说是最不安全的协议",{"2":{"303":1}}],["arp欺骗会造成数据的泄露",{"2":{"303":1}}],["arp欺骗示意图",{"2":{"303":1}}],["arp欺骗",{"0":{"303":1}}],["arp缓存表中的每个条目通常包含以下信息",{"2":{"298":1}}],["arp缓存表",{"0":{"298":1},"1":{"299":1,"300":1}}],["arp应答",{"2":{"297":1,"454":1}}],["arp请求数据包中有自己的send",{"2":{"454":1}}],["arp请求",{"2":{"297":1,"454":1}}],["arp首部",{"0":{"297":1}}],["arp",{"2":{"295":1,"298":1,"302":1,"304":1,"312":1,"454":2,"728":2}}],["arp协议等对我们比较友好的网络协议",{"2":{"449":1}}],["arp协议是个非常不安全的协议",{"2":{"305":1}}],["arp协议是属于网络层协议",{"2":{"295":1}}],["arp协议用来将ip地址映射为mac地址",{"2":{"305":1}}],["arp协议通常在局域网中使用",{"2":{"295":1}}],["arp协议",{"0":{"295":1,"454":1},"1":{"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1}}],["arcto",{"2":{"285":1}}],["arc",{"2":{"285":2}}],["arch=arm64",{"2":{"1157":1}}],["archived",{"2":{"1132":2}}],["arch",{"2":{"97":1,"1082":2,"1121":1}}],["arts",{"2":{"251":1}}],["art",{"2":{"251":1}}],["artifact",{"2":{"1139":1}}],["artifacts",{"0":{"1139":1},"2":{"1139":2}}],["articulated",{"2":{"251":1}}],["article>",{"2":{"350":4}}],["articles",{"2":{"222":2,"726":1,"1227":1}}],["article",{"2":{"85":1,"350":1,"1225":1}}],["artist",{"2":{"54":1}}],["arrows",{"2":{"251":3}}],["arrow",{"2":{"251":20,"800":1,"801":1,"814":1,"874":1}}],["arr4",{"2":{"32":6}}],["arr3",{"2":{"30":5}}],["arr2",{"2":{"29":2}}],["arr",{"2":{"29":3,"30":6,"32":6,"33":4,"197":5,"203":6,"747":5,"753":6,"955":1,"956":1}}],["arrayproto",{"2":{"955":6}}],["arraykeys",{"2":{"955":1}}],["arraymethods",{"2":{"955":7}}],["arraymethods中",{"2":{"955":1}}],["arraylike",{"2":{"483":1}}],["arraybuffer等等",{"2":{"768":1}}],["arraybufferview",{"2":{"499":1}}],["arraybuffer引用对象",{"2":{"488":1}}],["arraybuffer只是创建了一块连续的内存地址引用",{"2":{"480":1}}],["arraybuffer",{"0":{"479":1},"2":{"479":3,"483":1,"485":2,"486":1,"491":1,"496":3,"499":1,"573":1,"772":1,"773":1}}],["array`",{"2":{"203":1,"753":1}}],["array",{"0":{"29":1,"30":1},"2":{"25":1,"30":1,"33":2,"40":4,"41":4,"195":2,"203":1,"227":2,"245":1,"479":1,"483":1,"499":1,"546":4,"547":4,"573":1,"576":1,"583":1,"611":1,"628":1,"745":2,"753":1,"857":2,"937":1,"941":1,"944":1,"951":1,"954":1,"955":9,"956":2,"964":1,"1230":1}}],["arg命令是唯一可以在from前执行的命令",{"2":{"1053":1}}],["arg>",{"2":{"1027":1}}],["arg是命令的参数",{"2":{"1005":1}}],["argumentmetadata",{"2":{"645":2}}],["argumentshost",{"2":{"639":2}}],["arguments",{"2":{"8":2,"9":4,"205":2,"708":1,"718":2,"755":2}}],["argus",{"2":{"350":4}}],["arg",{"0":{"1054":1},"2":{"195":4,"232":4,"249":2,"745":4,"874":2,"1004":2,"1005":1,"1054":10,"1069":1}}],["argrments",{"2":{"7":1}}],["args",{"2":{"7":2,"9":4,"228":1,"229":2,"230":2,"232":5,"573":1,"576":2,"729":4,"771":1,"955":8,"1027":1,"1209":2}}],["argsarray",{"2":{"1":1,"2":2}}],["arg3",{"2":{"1":2}}],["arg2",{"2":{"1":2,"3":1,"4":1,"83":2}}],["arg1",{"2":{"1":2,"3":1,"4":1,"83":2}}],["a",{"2":{"2":5,"3":5,"4":5,"28":6,"33":5,"34":1,"40":6,"41":1,"43":1,"48":5,"56":1,"64":1,"83":4,"118":1,"139":2,"140":2,"144":3,"150":2,"154":1,"157":1,"195":3,"203":1,"222":5,"238":1,"239":2,"251":2,"333":3,"347":1,"404":1,"422":1,"454":2,"473":1,"517":1,"521":6,"529":2,"546":6,"547":1,"549":1,"554":5,"576":1,"578":1,"583":1,"587":2,"588":1,"621":1,"646":1,"728":5,"745":3,"753":1,"770":2,"800":9,"813":3,"814":1,"857":3,"864":2,"888":2,"889":2,"893":3,"899":2,"903":1,"938":1,"998":1,"1006":1,"1014":1,"1045":1,"1046":1,"1054":1,"1055":2,"1084":1,"1085":3,"1090":2,"1103":4,"1107":2,"1121":3,"1132":4,"1184":1,"1191":1,"1203":1,"1208":1,"1214":2,"1217":1,"1218":1,"1225":1,"1227":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/VPLocalSearchBox.D-gwIAzV.js b/assets/chunks/VPLocalSearchBox.D-gwIAzV.js new file mode 100644 index 000000000..062b76203 --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.D-gwIAzV.js @@ -0,0 +1,13 @@ +var Nt=Object.defineProperty;var kt=(o,e,t)=>e in o?Nt(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var De=(o,e,t)=>(kt(o,typeof e!="symbol"?e+"":e,t),t);import{Y as pt,h as ie,y as Ve,ai as It,aj as Dt,d as Ot,H as we,ak as et,k as xe,al as _t,am as Rt,z as Mt,an as Lt,l as Oe,S as he,Q as Fe,ao as zt,ap as Pt,Z as Bt,j as Vt,aq as $t,o as X,b as Wt,m as E,a2 as jt,p as $,ar as Kt,as as Jt,at as Ut,c as te,n as tt,e as Ee,E as rt,F as at,a as de,t as ve,au as Ht,q as Gt,s as qt,av as nt,aw as Qt,ab as Yt,ah as Zt,ax as Xt,_ as er}from"./framework.SV1ROkXV.js";import{u as tr,c as rr}from"./theme.qcSYzAJN.js";const ar={root:()=>pt(()=>import("./@localSearchIndexroot.5hxXnWZ2.js"),__vite__mapDeps([]))};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var mt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ce=mt.join(","),yt=typeof Element>"u",se=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Te=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ne=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},nr=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(Ne(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ce));return t&&se.call(e,Ce)&&n.unshift(e),n=n.filter(r),n},bt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ne(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var d=se.call(i,Ce);d&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var h=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ne(h,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(h&&v){var y=o(h===!0?i.children:h.children,!0,r);r.flatten?n.push.apply(n,y):n.push({scopeParent:i,candidates:y})}else a.unshift.apply(a,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},oe=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||nr(e))&&!wt(e)?0:e.tabIndex},ir=function(e,t){var r=oe(e);return r<0&&t&&!wt(e)?0:r},or=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},sr=function(e){return xt(e)&&e.type==="hidden"},ur=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},lr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(se.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Te(e);if(u&&!u.shadowRoot&&n(u)===!0)return it(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(dr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return it(e);return!1},pr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},yr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=ir(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(or).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},gr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:$e.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:mr}):r=gt(e,t.includeContainer,$e.bind(null,t)),yr(r)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:ke.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,ke.bind(null,t)),r},ue=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,Ce)===!1?!1:$e(t,e)},wr=mt.concat("iframe").join(","),_e=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,wr)===!1?!1:ke(t,e)};/*! +* focus-trap 7.5.4 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function ot(o,e){var t=Object.keys(o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(o);e&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(o,n).enumerable})),t.push.apply(t,r)}return t}function st(o){for(var e=1;e0){var r=e[e.length-1];r!==t&&r.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&e[e.length-1].unpause()}},Sr=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Ar=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ye=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Cr=function(e){return ye(e)&&!e.shiftKey},Tr=function(e){return ye(e)&&e.shiftKey},lt=function(e){return setTimeout(e,0)},ct=function(e,t){var r=-1;return e.every(function(n,a){return t(n)?(r=a,!1):!0}),r},pe=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1?p-1:0),N=1;N=0)f=r.activeElement;else{var c=i.tabbableGroups[0],p=c&&c.firstTabbableNode;f=p||d("fallbackFocus")}if(!f)throw new Error("Your focus-trap needs to have at least one focusable element");return f},v=function(){if(i.containerGroups=i.containers.map(function(f){var c=gr(f,a.tabbableOptions),p=br(f,a.tabbableOptions),k=c.length>0?c[0]:void 0,N=c.length>0?c[c.length-1]:void 0,M=p.find(function(w){return ue(w)}),P=p.slice().reverse().find(function(w){return ue(w)}),m=!!c.find(function(w){return oe(w)>0});return{container:f,tabbableNodes:c,focusableNodes:p,posTabIndexesFound:m,firstTabbableNode:k,lastTabbableNode:N,firstDomTabbableNode:M,lastDomTabbableNode:P,nextTabbableNode:function(B){var U=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,K=c.indexOf(B);return K<0?U?p.slice(p.indexOf(B)+1).find(function(J){return ue(J)}):p.slice(0,p.indexOf(B)).reverse().find(function(J){return ue(J)}):c[K+(U?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(f){return f.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!d("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(f){return f.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},y=function F(f){var c=f.activeElement;if(c)return c.shadowRoot&&c.shadowRoot.activeElement!==null?F(c.shadowRoot):c},g=function F(f){if(f!==!1&&f!==y(document)){if(!f||!f.focus){F(h());return}f.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=f,Sr(f)&&f.select()}},b=function(f){var c=d("setReturnFocus",f);return c||(c===!1?!1:f)},x=function(f){var c=f.target,p=f.event,k=f.isBackward,N=k===void 0?!1:k;c=c||Se(p),v();var M=null;if(i.tabbableGroups.length>0){var P=l(c,p),m=P>=0?i.containerGroups[P]:void 0;if(P<0)N?M=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:M=i.tabbableGroups[0].firstTabbableNode;else if(N){var w=ct(i.tabbableGroups,function(H){var q=H.firstTabbableNode;return c===q});if(w<0&&(m.container===c||_e(c,a.tabbableOptions)&&!ue(c,a.tabbableOptions)&&!m.nextTabbableNode(c,!1))&&(w=P),w>=0){var B=w===0?i.tabbableGroups.length-1:w-1,U=i.tabbableGroups[B];M=oe(c)>=0?U.lastTabbableNode:U.lastDomTabbableNode}else ye(p)||(M=m.nextTabbableNode(c,!1))}else{var K=ct(i.tabbableGroups,function(H){var q=H.lastTabbableNode;return c===q});if(K<0&&(m.container===c||_e(c,a.tabbableOptions)&&!ue(c,a.tabbableOptions)&&!m.nextTabbableNode(c))&&(K=P),K>=0){var J=K===i.tabbableGroups.length-1?0:K+1,V=i.tabbableGroups[J];M=oe(c)>=0?V.firstTabbableNode:V.firstDomTabbableNode}else ye(p)||(M=m.nextTabbableNode(c))}}else M=d("fallbackFocus");return M},A=function(f){var c=Se(f);if(!(l(c,f)>=0)){if(pe(a.clickOutsideDeactivates,f)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}pe(a.allowOutsideClick,f)||f.preventDefault()}},T=function(f){var c=Se(f),p=l(c,f)>=0;if(p||c instanceof Document)p&&(i.mostRecentlyFocusedNode=c);else{f.stopImmediatePropagation();var k,N=!0;if(i.mostRecentlyFocusedNode)if(oe(i.mostRecentlyFocusedNode)>0){var M=l(i.mostRecentlyFocusedNode),P=i.containerGroups[M].tabbableNodes;if(P.length>0){var m=P.findIndex(function(w){return w===i.mostRecentlyFocusedNode});m>=0&&(a.isKeyForward(i.recentNavEvent)?m+1=0&&(k=P[m-1],N=!1))}}else i.containerGroups.some(function(w){return w.tabbableNodes.some(function(B){return oe(B)>0})})||(N=!1);else N=!1;N&&(k=x({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),g(k||i.mostRecentlyFocusedNode||h())}i.recentNavEvent=void 0},C=function(f){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=f;var p=x({event:f,isBackward:c});p&&(ye(f)&&f.preventDefault(),g(p))},R=function(f){if(Ar(f)&&pe(a.escapeDeactivates,f)!==!1){f.preventDefault(),s.deactivate();return}(a.isKeyForward(f)||a.isKeyBackward(f))&&C(f,a.isKeyBackward(f))},L=function(f){var c=Se(f);l(c,f)>=0||pe(a.clickOutsideDeactivates,f)||pe(a.allowOutsideClick,f)||(f.preventDefault(),f.stopImmediatePropagation())},z=function(){if(i.active)return ut.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?lt(function(){g(h())}):g(h()),r.addEventListener("focusin",T,!0),r.addEventListener("mousedown",A,{capture:!0,passive:!1}),r.addEventListener("touchstart",A,{capture:!0,passive:!1}),r.addEventListener("click",L,{capture:!0,passive:!1}),r.addEventListener("keydown",R,{capture:!0,passive:!1}),s},I=function(){if(i.active)return r.removeEventListener("focusin",T,!0),r.removeEventListener("mousedown",A,!0),r.removeEventListener("touchstart",A,!0),r.removeEventListener("click",L,!0),r.removeEventListener("keydown",R,!0),s},S=function(f){var c=f.some(function(p){var k=Array.from(p.removedNodes);return k.some(function(N){return N===i.mostRecentlyFocusedNode})});c&&g(h())},O=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(S):void 0,_=function(){O&&(O.disconnect(),i.active&&!i.paused&&i.containers.map(function(f){O.observe(f,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(f){if(i.active)return this;var c=u(f,"onActivate"),p=u(f,"onPostActivate"),k=u(f,"checkCanFocusTrap");k||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,c==null||c();var N=function(){k&&v(),z(),_(),p==null||p()};return k?(k(i.containers.concat()).then(N,N),this):(N(),this)},deactivate:function(f){if(!i.active)return this;var c=st({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},f);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,I(),i.active=!1,i.paused=!1,_(),ut.deactivateTrap(n,s);var p=u(c,"onDeactivate"),k=u(c,"onPostDeactivate"),N=u(c,"checkCanReturnFocus"),M=u(c,"returnFocus","returnFocusOnDeactivate");p==null||p();var P=function(){lt(function(){M&&g(b(i.nodeFocusedBeforeActivation)),k==null||k()})};return M&&N?(N(b(i.nodeFocusedBeforeActivation)).then(P,P),this):(P(),this)},pause:function(f){if(i.paused||!i.active)return this;var c=u(f,"onPause"),p=u(f,"onPostPause");return i.paused=!0,c==null||c(),I(),_(),p==null||p(),this},unpause:function(f){if(!i.paused||!i.active)return this;var c=u(f,"onUnpause"),p=u(f,"onPostUnpause");return i.paused=!1,c==null||c(),v(),z(),_(),p==null||p(),this},updateContainerElements:function(f){var c=[].concat(f).filter(Boolean);return i.containers=c.map(function(p){return typeof p=="string"?r.querySelector(p):p}),i.active&&v(),_(),this}},s.updateContainerElements(e),s};function Ir(o,e={}){let t;const{immediate:r,...n}=e,a=ie(!1),i=ie(!1),s=h=>t&&t.activate(h),u=h=>t&&t.deactivate(h),l=()=>{t&&(t.pause(),i.value=!0)},d=()=>{t&&(t.unpause(),i.value=!1)};return Ve(()=>It(o),h=>{h&&(t=kr(h,{...n,onActivate(){a.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){a.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),Dt(()=>u()),{hasFocus:a,isPaused:i,activate:s,deactivate:u,pause:l,unpause:d}}class ce{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const u=()=>{--i<=0&&n(s)};i||u(),a.forEach(l=>{ce.matches(l,this.exclude)?u():this.onIframeReady(l,d=>{t(l)&&(s++,r(d)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,u)=>{s.val===r&&(a=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],u=[],l,d,h=()=>({prevNode:d,node:l}=this.getIteratorNode(i),l);for(;h();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,d,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,y=>u.push(y),n)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,u):u()})}}let Dr=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,n=u+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||n-u<0||u>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!n(i.node))return!1;const l=t-i.start,d=(r>i.end?i.end:r)-i.start,h=e.value.substr(0,i.start),v=e.value.substr(d+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,d),e.value=h+v,e.nodes.forEach((y,g)=>{g>=s&&(e.nodes[g].start>0&&g!==s&&(e.nodes[g].start-=d),e.nodes[g].end-=d)}),r-=d,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let d=l.index;if(i!==0)for(let h=1;h{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let h=1;hr(u[i],h),(h,v)=>{e.lastIndex=v,n(h)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,u)=>{let{start:l,end:d,valid:h}=this.checkWhitespaceRanges(s,i,a.value);h&&this.wrapRangeInMappedTextNode(a,l,d,v=>t(v,s,a.value.substring(l,d),u),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let d=new RegExp(this.createRegExp(l),`gm${s}`),h=0;this.log(`Searching with expression "${d}"`),this[n](d,1,(v,y)=>this.opt.filter(y,l,r,h),v=>{h++,r++,this.opt.each(v)},()=>{h===0&&this.opt.noMatch(l),a[i-1]===l?this.opt.done(r):u(a[a.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,u)=>this.opt.filter(a,i,s,u),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=ce.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Or(o){const e=new Dr(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var W=function(){return W=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function j(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var Mr="ENTRIES",Ft="KEYS",Et="VALUES",G="",Re=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=le(this._path),t=e.node,r=e.keys;if(le(r)===G)return{done:!1,value:this.result()};var n=t.get(le(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return le(t)}).filter(function(e){return e!==G}).join("")},o.prototype.value=function(){return le(this._path).node.get(G)},o.prototype.result=function(){switch(this._type){case Et:return this.value();case Ft:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),le=function(o){return o[o.length-1]},Lr=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}St(o.get(y),e,t,r,n,b,i,s+y)}}}catch(c){u={error:c}}finally{try{v&&!v.done&&(l=h.return)&&l.call(h)}finally{if(u)throw u.error}}},Me=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=j(Ie(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=j(Je(i),2),u=s[0],l=s[1];try{for(var d=D(u.keys()),h=d.next();!h.done;h=d.next()){var v=h.value;if(v!==G&&v.startsWith(l)){var y=new Map;return y.set(v.slice(l.length),u.get(v)),new o(y,e)}}}catch(g){t={error:g}}finally{try{h&&!h.done&&(r=d.return)&&r.call(d)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,zr(this._tree,e)},o.prototype.entries=function(){return new Re(this,Mr)},o.prototype.forEach=function(e){var t,r;try{for(var n=D(this),a=n.next();!a.done;a=n.next()){var i=j(a.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return Lr(this._tree,e,t)},o.prototype.get=function(e){var t=We(this._tree,e);return t!==void 0?t.get(G):void 0},o.prototype.has=function(e){var t=We(this._tree,e);return t!==void 0&&t.has(G)},o.prototype.keys=function(){return new Re(this,Ft)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e);return r.set(G,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e);return r.set(G,t(r.get(G))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Le(this._tree,e),n=r.get(G);return n===void 0&&r.set(G,n=t()),n},o.prototype.values=function(){return new Re(this,Et)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=j(i.value,2),u=s[0],l=s[1];n.set(u,l)}}catch(d){t={error:d}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),Ie=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=D(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==G&&e.startsWith(s))return t.push([o,s]),Ie(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),Ie(void 0,"",t)},We=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=D(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==G&&e.startsWith(i))return We(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},Le=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Me,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=Ke,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return _r(this,void 0,void 0,function(){var r,n,a,i,s,u,l,d,h,v,y,g,b,x,A,T,C,R,L,z,I,S,O,_,F;return Rr(this,function(f){switch(f.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||je.batchSize,a=e.batchWait||je.batchWait,i=1,f.label=1;case 1:f.trys.push([1,7,8,9]),s=D(this._index),u=s.next(),f.label=2;case 2:if(u.done)return[3,6];l=j(u.value,2),d=l[0],h=l[1];try{for(v=(S=void 0,D(h)),y=v.next();!y.done;y=v.next()){g=j(y.value,2),b=g[0],x=g[1];try{for(A=(_=void 0,D(x)),T=A.next();!T.done;T=A.next())C=j(T.value,1),R=C[0],!this._documentIds.has(R)&&(x.size<=1?h.delete(b):x.delete(R))}catch(c){_={error:c}}finally{try{T&&!T.done&&(F=A.return)&&F.call(A)}finally{if(_)throw _.error}}}}catch(c){S={error:c}}finally{try{y&&!y.done&&(O=v.return)&&O.call(v)}finally{if(S)throw S.error}}return this._index.get(d).size===0&&this._index.delete(d),i%n!==0?[3,4]:[4,new Promise(function(c){return setTimeout(c,a)})];case 3:f.sent(),f.label=4;case 4:i+=1,f.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return L=f.sent(),z={error:L},[3,9];case 8:try{u&&!u.done&&(I=s.return)&&I.call(s)}finally{if(z)throw z.error}return[7];case 9:this._dirtCount-=r,f.label=10;case 10:return[4,null];case 11:return f.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||Be.minDirtCount,r=r||Be.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=D(a),u=s.next();!u.done;u=s.next()){var l=j(u.value,2),d=l[0],h=l[1],v=h.score,y=h.terms,g=h.match,b=y.length||1,x={id:this._documentIds.get(d),score:v*b,terms:Object.keys(g),queryTerms:y,match:g};Object.assign(x,this._storedFields.get(d)),(t.filter==null||t.filter(x))&&i.push(x)}}catch(A){r={error:A}}finally{try{u&&!u.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return e===o.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||i.sort(dt),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=W(W({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=D(this.search(e,t)),l=u.next();!l.done;l=u.next()){var d=l.value,h=d.score,v=d.terms,y=v.join(" "),g=s.get(y);g!=null?(g.score+=h,g.count+=1):s.set(y,{score:h,terms:v,count:1})}}catch(L){r={error:L}}finally{try{l&&!l.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var b=[];try{for(var x=D(s),A=x.next();!A.done;A=x.next()){var T=j(A.value,2),g=T[0],C=T[1],h=C.score,v=C.terms,R=C.count;b.push({suggestion:g,terms:v,score:h/R})}}catch(L){a={error:L}}finally{try{A&&!A.done&&(i=x.return)&&i.call(x)}finally{if(a)throw a.error}}return b.sort(dt),b},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(Pe.hasOwnProperty(e))return ze(Pe,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,u,l=e.index,d=e.documentCount,h=e.nextId,v=e.documentIds,y=e.fieldIds,g=e.fieldLength,b=e.averageFieldLength,x=e.storedFields,A=e.dirtCount,T=e.serializationVersion;if(T!==1&&T!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var C=new o(t);C._documentCount=d,C._nextId=h,C._documentIds=Ae(v),C._idToShortId=new Map,C._fieldIds=y,C._fieldLength=Ae(g),C._avgFieldLength=b,C._storedFields=Ae(x),C._dirtCount=A||0,C._index=new Me;try{for(var R=D(C._documentIds),L=R.next();!L.done;L=R.next()){var z=j(L.value,2),I=z[0],S=z[1];C._idToShortId.set(S,I)}}catch(m){r={error:m}}finally{try{L&&!L.done&&(n=R.return)&&n.call(R)}finally{if(r)throw r.error}}try{for(var O=D(l),_=O.next();!_.done;_=O.next()){var F=j(_.value,2),f=F[0],c=F[1],p=new Map;try{for(var k=(s=void 0,D(Object.keys(c))),N=k.next();!N.done;N=k.next()){var M=N.value,P=c[M];T===1&&(P=P.ds),p.set(parseInt(M,10),Ae(P))}}catch(m){s={error:m}}finally{try{N&&!N.done&&(u=k.return)&&u.call(k)}finally{if(s)throw s.error}}C._index.set(f,p)}}catch(m){a={error:m}}finally{try{_&&!_.done&&(i=O.return)&&i.call(O)}finally{if(a)throw a.error}}return C},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),e===o.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){var n=W(W(W({},t),e),{queries:void 0}),a=e.queries.map(function(x){return r.executeQuery(x,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,d=W(W({tokenize:s,processTerm:u},l),t),h=d.tokenize,v=d.processTerm,y=h(e).flatMap(function(x){return v(x)}).filter(function(x){return!!x}),g=y.map(jr(d)),b=g.map(function(x){return r.executeQuerySpec(x,d)});return this.combineResults(b,d.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=W(W({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(M,P){var m;return W(W({},M),(m={},m[P]=ze(s.boost,P)||1,m))},{}),l=s.boostDocument,d=s.weights,h=s.maxFuzzy,v=s.bm25,y=W(W({},ft.weights),d),g=y.fuzzy,b=y.prefix,x=this._index.get(e.term),A=this.termResults(e.term,e.term,1,x,u,l,v),T,C;if(e.prefix&&(T=this._index.atPrefix(e.term)),e.fuzzy){var R=e.fuzzy===!0?.2:e.fuzzy,L=R<1?Math.min(h,Math.round(e.term.length*R)):R;L&&(C=this._index.fuzzyGet(e.term,L))}if(T)try{for(var z=D(T),I=z.next();!I.done;I=z.next()){var S=j(I.value,2),O=S[0],_=S[1],F=O.length-e.term.length;if(F){C==null||C.delete(O);var f=b*O.length/(O.length+.3*F);this.termResults(e.term,O,f,_,u,l,v,A)}}}catch(M){r={error:M}}finally{try{I&&!I.done&&(n=z.return)&&n.call(z)}finally{if(r)throw r.error}}if(C)try{for(var c=D(C.keys()),p=c.next();!p.done;p=c.next()){var O=p.value,k=j(C.get(O),2),N=k[0],F=k[1];if(F){var f=g*O.length/(O.length+F);this.termResults(e.term,O,f,N,u,l,v,A)}}}catch(M){a={error:M}}finally{try{p&&!p.done&&(i=c.return)&&i.call(c)}finally{if(a)throw a.error}}return A},o.prototype.executeWildcardQuery=function(e){var t,r,n=new Map,a=W(W({},this._options.searchOptions),e);try{for(var i=D(this._documentIds),s=i.next();!s.done;s=i.next()){var u=j(s.value,2),l=u[0],d=u[1],h=a.boostDocument?a.boostDocument(d,"",this._storedFields.get(l)):1;n.set(l,{score:h,terms:[],match:{}})}}catch(v){t={error:v}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return n},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=Ue),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Vr[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=D(this._index),s=i.next();!s.done;s=i.next()){var u=j(s.value,2),l=u[0],d=u[1],h={};try{for(var v=(r=void 0,D(d)),y=v.next();!y.done;y=v.next()){var g=j(y.value,2),b=g[0],x=g[1];h[b]=Object.fromEntries(x)}}catch(A){r={error:A}}finally{try{y&&!y.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([l,h])}}catch(A){e={error:A}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,u){var l,d,h,v,y;if(u===void 0&&(u=new Map),n==null)return u;try{for(var g=D(Object.keys(a)),b=g.next();!b.done;b=g.next()){var x=b.value,A=a[x],T=this._fieldIds[x],C=n.get(T);if(C!=null){var R=C.size,L=this._avgFieldLength[T];try{for(var z=(h=void 0,D(C.keys())),I=z.next();!I.done;I=z.next()){var S=I.value;if(!this._documentIds.has(S)){this.removeTerm(T,S,t),R-=1;continue}var O=i?i(this._documentIds.get(S),t,this._storedFields.get(S)):1;if(O){var _=C.get(S),F=this._fieldLength.get(S)[T],f=Wr(_,R,this._documentCount,F,L,s),c=r*A*O*f,p=u.get(S);if(p){p.score+=c,Jr(p.terms,e);var k=ze(p.match,t);k?k.push(x):p.match[t]=[x]}else u.set(S,{score:c,terms:[e],match:(y={},y[t]=[x],y)})}}}catch(N){h={error:N}}finally{try{I&&!I.done&&(v=z.return)&&v.call(z)}finally{if(h)throw h.error}}}}}catch(N){l={error:N}}finally{try{b&&!b.done&&(d=g.return)&&d.call(g)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,vt),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,vt),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=D(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){n={error:l}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(Gt("data-v-7407a484"),o=o(),qt(),o),Gr=["aria-owns"],qr={class:"shell"},Qr=["title"],Yr=Y(()=>E("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[E("circle",{cx:"11",cy:"11",r:"8"}),E("path",{d:"m21 21l-4.35-4.35"})])],-1)),Zr=[Yr],Xr={class:"search-actions before"},ea=["title"],ta=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),ra=[ta],aa=["placeholder"],na={class:"search-actions"},ia=["title"],oa=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),sa=[oa],ua=["disabled","title"],la=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),ca=[la],fa=["id","role","aria-labelledby"],ha=["aria-selected"],da=["href","aria-label","onMouseenter","onFocusin"],va={class:"titles"},pa=Y(()=>E("span",{class:"title-icon"},"#",-1)),ma=["innerHTML"],ya=Y(()=>E("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),ga={class:"title main"},ba=["innerHTML"],wa={key:0,class:"excerpt-wrapper"},xa={key:0,class:"excerpt",inert:""},Fa=["innerHTML"],Ea=Y(()=>E("div",{class:"excerpt-gradient-bottom"},null,-1)),Sa=Y(()=>E("div",{class:"excerpt-gradient-top"},null,-1)),Aa={key:0,class:"no-results"},Ca={class:"search-keyboard-shortcuts"},Ta=["aria-label"],Na=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),ka=[Na],Ia=["aria-label"],Da=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),Oa=[Da],_a=["aria-label"],Ra=Y(()=>E("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[E("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[E("path",{d:"m9 10l-5 5l5 5"}),E("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),Ma=[Ra],La=["aria-label"],za=Ot({__name:"VPLocalSearchBox",emits:["close"],setup(o,{emit:e}){var M,P;const t=we(),r=we(),n=we(ar),a=tr(),{activate:i}=Ir(t,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:s,theme:u}=a,l=et(async()=>{var m,w,B,U,K,J,V,H,q;return nt(Br.loadJSON((B=await((w=(m=n.value)[s.value])==null?void 0:w.call(m)))==null?void 0:B.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((U=u.value.search)==null?void 0:U.provider)==="local"&&((J=(K=u.value.search.options)==null?void 0:K.miniSearch)==null?void 0:J.searchOptions)},...((V=u.value.search)==null?void 0:V.provider)==="local"&&((q=(H=u.value.search.options)==null?void 0:H.miniSearch)==null?void 0:q.options)}))}),h=xe(()=>{var m,w;return((m=u.value.search)==null?void 0:m.provider)==="local"&&((w=u.value.search.options)==null?void 0:w.disableQueryPersistence)===!0}).value?ie(""):_t("vitepress:local-search-filter",""),v=Rt("vitepress:local-search-detailed-list",((M=u.value.search)==null?void 0:M.provider)==="local"&&((P=u.value.search.options)==null?void 0:P.detailedView)===!0),y=xe(()=>{var m,w,B;return((m=u.value.search)==null?void 0:m.provider)==="local"&&(((w=u.value.search.options)==null?void 0:w.disableDetailedView)===!0||((B=u.value.search.options)==null?void 0:B.detailedView)===!1)}),g=xe(()=>{var w,B,U,K,J,V,H;const m=((w=u.value.search)==null?void 0:w.options)??u.value.algolia;return((J=(K=(U=(B=m==null?void 0:m.locales)==null?void 0:B[s.value])==null?void 0:U.translations)==null?void 0:K.button)==null?void 0:J.buttonText)||((H=(V=m==null?void 0:m.translations)==null?void 0:V.button)==null?void 0:H.buttonText)||"Search"});Mt(()=>{y.value&&(v.value=!1)});const b=we([]),x=ie(!1);Ve(h,()=>{x.value=!1});const A=et(async()=>{if(r.value)return nt(new Or(r.value))},null),T=new Hr(16);Lt(()=>[l.value,h.value,v.value],async([m,w,B],U,K)=>{var ge,He,Ge,qe;(U==null?void 0:U[0])!==m&&T.clear();let J=!1;if(K(()=>{J=!0}),!m)return;b.value=m.search(w).slice(0,16),x.value=!0;const V=B?await Promise.all(b.value.map(Q=>C(Q.id))):[];if(J)return;for(const{id:Q,mod:re}of V){const ae=Q.slice(0,Q.indexOf("#"));let ee=T.get(ae);if(ee)continue;ee=new Map,T.set(ae,ee);const Z=re.default??re;if(Z!=null&&Z.render||Z!=null&&Z.setup){const ne=Qt(Z);ne.config.warnHandler=()=>{},ne.provide(Yt,a),Object.defineProperties(ne.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}});const Qe=document.createElement("div");ne.mount(Qe),Qe.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var Xe;const be=(Xe=fe.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(be==null?void 0:be.startsWith("#"))&&be.slice(1);if(!Ye)return;let Ze="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)Ze+=fe.outerHTML;ee.set(Ye,Ze)}),ne.unmount()}if(J)return}const H=new Set;if(b.value=b.value.map(Q=>{const[re,ae]=Q.id.split("#"),ee=T.get(re),Z=(ee==null?void 0:ee.get(ae))??"";for(const ne in Q.match)H.add(ne);return{...Q,text:Z}}),await he(),J)return;await new Promise(Q=>{var re;(re=A.value)==null||re.unmark({done:()=>{var ae;(ae=A.value)==null||ae.markRegExp(N(H),{done:Q})}})});const q=((ge=t.value)==null?void 0:ge.querySelectorAll(".result .excerpt"))??[];for(const Q of q)(He=Q.querySelector('mark[data-markjs="true"]'))==null||He.scrollIntoView({block:"center"});(qe=(Ge=r.value)==null?void 0:Ge.firstElementChild)==null||qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function C(m){const w=Zt(m.slice(0,m.indexOf("#")));try{if(!w)throw new Error(`Cannot find file for id: ${m}`);return{id:m,mod:await pt(()=>import(w),__vite__mapDeps([]))}}catch(B){return console.error(B),{id:m,mod:{}}}}const R=ie(),L=xe(()=>{var m;return((m=h.value)==null?void 0:m.length)<=0});function z(m=!0){var w,B;(w=R.value)==null||w.focus(),m&&((B=R.value)==null||B.select())}Oe(()=>{z()});function I(m){m.pointerType==="mouse"&&z()}const S=ie(-1),O=ie(!1);Ve(b,m=>{S.value=m.length?0:-1,_()});function _(){he(()=>{const m=document.querySelector(".result.selected");m&&m.scrollIntoView({block:"nearest"})})}Fe("ArrowUp",m=>{m.preventDefault(),S.value--,S.value<0&&(S.value=b.value.length-1),O.value=!0,_()}),Fe("ArrowDown",m=>{m.preventDefault(),S.value++,S.value>=b.value.length&&(S.value=0),O.value=!0,_()});const F=zt();Fe("Enter",m=>{if(m.isComposing||m.target instanceof HTMLButtonElement&&m.target.type!=="submit")return;const w=b.value[S.value];if(m.target instanceof HTMLInputElement&&!w){m.preventDefault();return}w&&(F.go(w.id),e("close"))}),Fe("Escape",()=>{e("close")});const c=rr({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Oe(()=>{window.history.pushState(null,"",null)}),Pt("popstate",m=>{m.preventDefault(),e("close")});const p=Bt(Vt?document.body:null);Oe(()=>{he(()=>{p.value=!0,he().then(()=>i())})}),$t(()=>{p.value=!1});function k(){h.value="",he().then(()=>z(!1))}function N(m){return new RegExp([...m].sort((w,B)=>B.length-w.length).map(w=>`(${Xt(w)})`).join("|"),"gi")}return(m,w)=>{var B,U,K,J;return X(),Wt(Ht,{to:"body"},[E("div",{ref_key:"el",ref:t,role:"button","aria-owns":(B=$(b))!=null&&B.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[E("div",{class:"backdrop",onClick:w[0]||(w[0]=V=>m.$emit("close"))}),E("div",qr,[E("form",{class:"search-bar",onPointerup:w[4]||(w[4]=V=>I(V)),onSubmit:w[5]||(w[5]=jt(()=>{},["prevent"]))},[E("label",{title:$(g),id:"localsearch-label",for:"localsearch-input"},Zr,8,Qr),E("div",Xr,[E("button",{class:"back-button",title:$(c)("modal.backButtonTitle"),onClick:w[1]||(w[1]=V=>m.$emit("close"))},ra,8,ea)]),Kt(E("input",{ref_key:"searchInput",ref:R,"onUpdate:modelValue":w[2]||(w[2]=V=>Ut(h)?h.value=V:null),placeholder:$(g),id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,aa),[[Jt,$(h)]]),E("div",na,[$(y)?Ee("",!0):(X(),te("button",{key:0,class:tt(["toggle-layout-button",{"detailed-list":$(v)}]),type:"button",title:$(c)("modal.displayDetails"),onClick:w[3]||(w[3]=V=>S.value>-1&&(v.value=!$(v)))},sa,10,ia)),E("button",{class:"clear-button",type:"reset",disabled:$(L),title:$(c)("modal.resetButtonTitle"),onClick:k},ca,8,ua)])],32),E("ul",{ref_key:"resultsEl",ref:r,id:(U=$(b))!=null&&U.length?"localsearch-list":void 0,role:(K=$(b))!=null&&K.length?"listbox":void 0,"aria-labelledby":(J=$(b))!=null&&J.length?"localsearch-label":void 0,class:"results",onMousemove:w[7]||(w[7]=V=>O.value=!1)},[(X(!0),te(at,null,rt($(b),(V,H)=>(X(),te("li",{key:V.id,role:"option","aria-selected":S.value===H?"true":"false"},[E("a",{href:V.id,class:tt(["result",{selected:S.value===H}]),"aria-label":[...V.titles,V.title].join(" > "),onMouseenter:q=>!O.value&&(S.value=H),onFocusin:q=>S.value=H,onClick:w[6]||(w[6]=q=>m.$emit("close"))},[E("div",null,[E("div",va,[pa,(X(!0),te(at,null,rt(V.titles,(q,ge)=>(X(),te("span",{key:ge,class:"title"},[E("span",{class:"text",innerHTML:q},null,8,ma),ya]))),128)),E("span",ga,[E("span",{class:"text",innerHTML:V.title},null,8,ba)])]),$(v)?(X(),te("div",wa,[V.text?(X(),te("div",xa,[E("div",{class:"vp-doc",innerHTML:V.text},null,8,Fa)])):Ee("",!0),Ea,Sa])):Ee("",!0)])],42,da)],8,ha))),128)),$(h)&&!$(b).length&&x.value?(X(),te("li",Aa,[de(ve($(c)("modal.noResultsText"))+' "',1),E("strong",null,ve($(h)),1),de('" ')])):Ee("",!0)],40,fa),E("div",Ca,[E("span",null,[E("kbd",{"aria-label":$(c)("modal.footer.navigateUpKeyAriaLabel")},ka,8,Ta),E("kbd",{"aria-label":$(c)("modal.footer.navigateDownKeyAriaLabel")},Oa,8,Ia),de(" "+ve($(c)("modal.footer.navigateText")),1)]),E("span",null,[E("kbd",{"aria-label":$(c)("modal.footer.selectKeyAriaLabel")},Ma,8,_a),de(" "+ve($(c)("modal.footer.selectText")),1)]),E("span",null,[E("kbd",{"aria-label":$(c)("modal.footer.closeKeyAriaLabel")},"esc",8,La),de(" "+ve($(c)("modal.footer.closeText")),1)])])])],8,Gr)])}}}),ja=er(za,[["__scopeId","data-v-7407a484"]]);export{ja as default}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} diff --git a/assets/chunks/framework.SV1ROkXV.js b/assets/chunks/framework.SV1ROkXV.js new file mode 100644 index 000000000..54f3a832d --- /dev/null +++ b/assets/chunks/framework.SV1ROkXV.js @@ -0,0 +1 @@ +function gr(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}function mr(e){if(B(e)){const t={};for(let n=0;n{if(n){const r=n.split(ci);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function yr(e){let t="";if(se(e))t=e;else if(B(e))for(let n=0;nse(e)?e:e==null?"":B(e)||te(e)&&(e.toString===Us||!W(e.toString))?JSON.stringify(e,Ds,2):String(e),Ds=(e,t)=>t&&t.__v_isRef?Ds(e,t.value):_t(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:ks(t)?{[`Set(${t.size})`]:[...t.values()]}:te(t)&&!B(t)&&!Ks(t)?String(t):t,ee={},yt=[],Le=()=>{},hi=()=>!1,pi=/^on[^a-z]/,Vt=e=>pi.test(e),_r=e=>e.startsWith("onUpdate:"),fe=Object.assign,br=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},gi=Object.prototype.hasOwnProperty,X=(e,t)=>gi.call(e,t),B=Array.isArray,_t=e=>Cn(e)==="[object Map]",ks=e=>Cn(e)==="[object Set]",W=e=>typeof e=="function",se=e=>typeof e=="string",vr=e=>typeof e=="symbol",te=e=>e!==null&&typeof e=="object",Bs=e=>te(e)&&W(e.then)&&W(e.catch),Us=Object.prototype.toString,Cn=e=>Us.call(e),mi=e=>Cn(e).slice(8,-1),Ks=e=>Cn(e)==="[object Object]",wr=e=>se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ft=gr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),xn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},yi=/-(\w)/g,$e=xn(e=>e.replace(yi,(t,n)=>n?n.toUpperCase():"")),_i=/\B([A-Z])/g,dt=xn(e=>e.replace(_i,"-$1").toLowerCase()),Tn=xn(e=>e.charAt(0).toUpperCase()+e.slice(1)),un=xn(e=>e?`on${Tn(e)}`:""),kt=(e,t)=>!Object.is(e,t),fn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},er=e=>{const t=parseFloat(e);return isNaN(t)?e:t},bi=e=>{const t=se(e)?Number(e):NaN;return isNaN(t)?e:t};let zr;const vi=()=>zr||(zr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let be;class wi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Vs=e=>(e.w&Qe)>0,qs=e=>(e.n&Qe)>0,xi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(f==="length"||f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":B(e)?wr(n)&&l.push(i.get("length")):(l.push(i.get(at)),_t(e)&&l.push(i.get(nr)));break;case"delete":B(e)||(l.push(i.get(at)),_t(e)&&l.push(i.get(nr)));break;case"set":_t(e)&&l.push(i.get(at));break}if(l.length===1)l[0]&&rr(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);rr(Er(c))}}function rr(e,t){const n=B(e)?e:[...e];for(const r of n)r.computed&&Yr(r);for(const r of n)r.computed||Yr(r)}function Yr(e,t){(e!==Se||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Ai(e,t){var n;return(n=gn.get(e))===null||n===void 0?void 0:n.get(t)}const Si=gr("__proto__,__v_isRef,__isVue"),Ys=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(vr)),Oi=xr(),Ri=xr(!1,!0),Mi=xr(!0),Jr=Pi();function Pi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Y(this);for(let o=0,i=this.length;o{e[t]=function(...n){St();const r=Y(this)[t].apply(this,n);return Ot(),r}}),e}function Ii(e){const t=Y(this);return me(t,"has",e),t.hasOwnProperty(e)}function xr(e=!1,t=!1){return function(r,s,o){if(s==="__v_isReactive")return!e;if(s==="__v_isReadonly")return e;if(s==="__v_isShallow")return t;if(s==="__v_raw"&&o===(e?t?Xi:eo:t?Gs:Zs).get(r))return r;const i=B(r);if(!e){if(i&&X(Jr,s))return Reflect.get(Jr,s,o);if(s==="hasOwnProperty")return Ii}const l=Reflect.get(r,s,o);return(vr(s)?Ys.has(s):Si(s))||(e||me(r,"get",s),t)?l:ce(l)?i&&wr(s)?l:l.value:te(l)?e?On(l):Sn(l):l}}const Fi=Js(),Li=Js(!0);function Js(e=!1){return function(n,r,s,o){let i=n[r];if(Ct(i)&&ce(i)&&!ce(s))return!1;if(!e&&(!mn(s)&&!Ct(s)&&(i=Y(i),s=Y(s)),!B(n)&&ce(i)&&!ce(s)))return i.value=s,!0;const l=B(n)&&wr(r)?Number(r)e,An=e=>Reflect.getPrototypeOf(e);function Jt(e,t,n=!1,r=!1){e=e.__v_raw;const s=Y(e),o=Y(t);n||(t!==o&&me(s,"get",t),me(s,"get",o));const{has:i}=An(s),l=r?Tr:n?Or:Bt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Qt(e,t=!1){const n=this.__v_raw,r=Y(n),s=Y(e);return t||(e!==s&&me(r,"has",e),me(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Zt(e,t=!1){return e=e.__v_raw,!t&&me(Y(e),"iterate",at),Reflect.get(e,"size",e)}function Qr(e){e=Y(e);const t=Y(this);return An(t).has.call(t,e)||(t.add(e),De(t,"add",e,e)),this}function Zr(e,t){t=Y(t);const n=Y(this),{has:r,get:s}=An(n);let o=r.call(n,e);o||(e=Y(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?kt(t,i)&&De(n,"set",e,t):De(n,"add",e,t),this}function Gr(e){const t=Y(this),{has:n,get:r}=An(t);let s=n.call(t,e);s||(e=Y(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&De(t,"delete",e,void 0),o}function es(){const e=Y(this),t=e.size!==0,n=e.clear();return t&&De(e,"clear",void 0,void 0),n}function Gt(e,t){return function(r,s){const o=this,i=o.__v_raw,l=Y(i),c=t?Tr:e?Or:Bt;return!e&&me(l,"iterate",at),i.forEach((a,f)=>r.call(s,c(a),c(f),o))}}function en(e,t,n){return function(...r){const s=this.__v_raw,o=Y(s),i=_t(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,a=s[e](...r),f=n?Tr:t?Or:Bt;return!t&&me(o,"iterate",c?nr:at),{next(){const{value:h,done:p}=a.next();return p?{value:h,done:p}:{value:l?[f(h[0]),f(h[1])]:f(h),done:p}},[Symbol.iterator](){return this}}}}function Be(e){return function(...t){return e==="delete"?!1:this}}function ki(){const e={get(o){return Jt(this,o)},get size(){return Zt(this)},has:Qt,add:Qr,set:Zr,delete:Gr,clear:es,forEach:Gt(!1,!1)},t={get(o){return Jt(this,o,!1,!0)},get size(){return Zt(this)},has:Qt,add:Qr,set:Zr,delete:Gr,clear:es,forEach:Gt(!1,!0)},n={get(o){return Jt(this,o,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:Gt(!0,!1)},r={get(o){return Jt(this,o,!0,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:Gt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=en(o,!1,!1),n[o]=en(o,!0,!1),t[o]=en(o,!1,!0),r[o]=en(o,!0,!0)}),[e,n,t,r]}const[Bi,Ui,Ki,Wi]=ki();function Ar(e,t){const n=t?e?Wi:Ki:e?Ui:Bi;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(X(n,s)&&s in r?n:r,s,o)}const Vi={get:Ar(!1,!1)},qi={get:Ar(!1,!0)},zi={get:Ar(!0,!1)},Zs=new WeakMap,Gs=new WeakMap,eo=new WeakMap,Xi=new WeakMap;function Yi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ji(e){return e.__v_skip||!Object.isExtensible(e)?0:Yi(mi(e))}function Sn(e){return Ct(e)?e:Sr(e,!1,Qs,Vi,Zs)}function Qi(e){return Sr(e,!1,Di,qi,Gs)}function On(e){return Sr(e,!0,ji,zi,eo)}function Sr(e,t,n,r,s){if(!te(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=Ji(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function bt(e){return Ct(e)?bt(e.__v_raw):!!(e&&e.__v_isReactive)}function Ct(e){return!!(e&&e.__v_isReadonly)}function mn(e){return!!(e&&e.__v_isShallow)}function to(e){return bt(e)||Ct(e)}function Y(e){const t=e&&e.__v_raw;return t?Y(t):e}function Lt(e){return pn(e,"__v_skip",!0),e}const Bt=e=>te(e)?Sn(e):e,Or=e=>te(e)?On(e):e;function Rr(e){qe&&Se&&(e=Y(e),Xs(e.dep||(e.dep=Er())))}function Mr(e,t){e=Y(e);const n=e.dep;n&&rr(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function ae(e){return no(e,!1)}function Pr(e){return no(e,!0)}function no(e,t){return ce(e)?e:new Zi(e,t)}class Zi{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Y(t),this._value=n?t:Bt(t)}get value(){return Rr(this),this._value}set value(t){const n=this.__v_isShallow||mn(t)||Ct(t);t=n?t:Y(t),kt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Bt(t),Mr(this))}}function ro(e){return ce(e)?e.value:e}const Gi={get:(e,t,n)=>ro(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ce(s)&&!ce(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function so(e){return bt(e)?e:new Proxy(e,Gi)}class el{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Rr(this),()=>Mr(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function tl(e){return new el(e)}class nl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Ai(Y(this._object),this._key)}}function rl(e,t,n){const r=e[t];return ce(r)?r:new nl(e,t,n)}var oo;class sl{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[oo]=!1,this._dirty=!0,this.effect=new Cr(t,()=>{this._dirty||(this._dirty=!0,Mr(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=Y(this);return Rr(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}oo="__v_isReadonly";function ol(e,t,n=!1){let r,s;const o=W(e);return o?(r=e,s=Le):(r=e.get,s=e.set),new sl(r,s,o||!s,n)}function ze(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){qt(o,t,n)}return s}function xe(e,t,n,r){if(W(e)){const o=ze(e,t,n,r);return o&&Bs(o)&&o.catch(i=>{qt(i,t,n)}),o}const s=[];for(let o=0;o>>1;Kt(de[r])Fe&&de.splice(t,1)}function al(e){B(e)?vt.push(...e):(!je||!je.includes(e,e.allowRecurse?ot+1:ot))&&vt.push(e),lo()}function ts(e,t=Ut?Fe+1:0){for(;tKt(n)-Kt(r)),ot=0;ote.id==null?1/0:e.id,ul=(e,t)=>{const n=Kt(e)-Kt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function co(e){sr=!1,Ut=!0,de.sort(ul);try{for(Fe=0;Fese(m)?m.trim():m)),h&&(s=n.map(er))}let l,c=r[l=un(t)]||r[l=un($e(t))];!c&&o&&(c=r[l=un(dt(t))]),c&&xe(c,e,6,s);const a=r[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(a,e,6,s)}}function ao(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!W(e)){const c=a=>{const f=ao(a,t,!0);f&&(l=!0,fe(i,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(te(e)&&r.set(e,null),null):(B(o)?o.forEach(c=>i[c]=null):fe(i,o),te(e)&&r.set(e,i),i)}function Pn(e,t){return!e||!Vt(t)?!1:(t=t.slice(2).replace(/Once$/,""),X(e,t[0].toLowerCase()+t.slice(1))||X(e,dt(t))||X(e,t))}let ue=null,In=null;function _n(e){const t=ue;return ue=e,In=e&&e.type.__scopeId||null,t}function $a(e){In=e}function Ha(){In=null}function dl(e,t=ue,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&ds(-1);const o=_n(t);let i;try{i=e(...s)}finally{_n(o),r._d&&ds(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Bn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:l,attrs:c,emit:a,render:f,renderCache:h,data:p,setupState:m,ctx:_,inheritAttrs:A}=e;let N,y;const v=_n(e);try{if(n.shapeFlag&4){const I=s||r;N=Ae(f.call(I,I,h,o,m,p,_)),y=c}else{const I=t;N=Ae(I.length>1?I(o,{attrs:c,slots:l,emit:a}):I(o,null)),y=t.props?c:hl(c)}}catch(I){jt.length=0,qt(I,e,1),N=ie(ve)}let R=N;if(y&&A!==!1){const I=Object.keys(y),{shapeFlag:D}=R;I.length&&D&7&&(i&&I.some(_r)&&(y=pl(y,i)),R=Ze(R,y))}return n.dirs&&(R=Ze(R),R.dirs=R.dirs?R.dirs.concat(n.dirs):n.dirs),n.transition&&(R.transition=n.transition),N=R,_n(v),N}const hl=e=>{let t;for(const n in e)(n==="class"||n==="style"||Vt(n))&&((t||(t={}))[n]=e[n]);return t},pl=(e,t)=>{const n={};for(const r in e)(!_r(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function gl(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,a=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?ns(r,i,a):!!i;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function uo(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):al(e)}function _l(e,t){if(re){let n=re.provides;const r=re.parent&&re.parent.provides;r===n&&(n=re.provides=Object.create(r)),n[e]=t}}function wt(e,t,n=!1){const r=re||ue;if(r){const s=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(s&&e in s)return s[e];if(arguments.length>1)return n&&W(t)?t.call(r.proxy):t}}function Fr(e,t){return Fn(e,null,t)}function ja(e,t){return Fn(e,null,{flush:"post"})}const tn={};function Xe(e,t,n){return Fn(e,t,n)}function Fn(e,t,{immediate:n,deep:r,flush:s,onTrack:o,onTrigger:i}=ee){const l=Ws()===(re==null?void 0:re.scope)?re:null;let c,a=!1,f=!1;if(ce(e)?(c=()=>e.value,a=mn(e)):bt(e)?(c=()=>e,r=!0):B(e)?(f=!0,a=e.some(R=>bt(R)||mn(R)),c=()=>e.map(R=>{if(ce(R))return R.value;if(bt(R))return ct(R);if(W(R))return ze(R,l,2)})):W(e)?t?c=()=>ze(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return h&&h(),xe(e,l,3,[p])}:c=Le,t&&r){const R=c;c=()=>ct(R())}let h,p=R=>{h=y.onStop=()=>{ze(R,l,4)}},m;if(At)if(p=Le,t?n&&xe(t,l,3,[c(),f?[]:void 0,p]):c(),s==="sync"){const R=dc();m=R.__watcherHandles||(R.__watcherHandles=[])}else return Le;let _=f?new Array(e.length).fill(tn):tn;const A=()=>{if(y.active)if(t){const R=y.run();(r||a||(f?R.some((I,D)=>kt(I,_[D])):kt(R,_)))&&(h&&h(),xe(t,l,3,[R,_===tn?void 0:f&&_[0]===tn?[]:_,p]),_=R)}else y.run()};A.allowRecurse=!!t;let N;s==="sync"?N=A:s==="post"?N=()=>pe(A,l&&l.suspense):(A.pre=!0,l&&(A.id=l.uid),N=()=>Mn(A));const y=new Cr(c,N);t?n?A():_=y.run():s==="post"?pe(y.run.bind(y),l&&l.suspense):y.run();const v=()=>{y.stop(),l&&l.scope&&br(l.scope.effects,y)};return m&&m.push(v),v}function bl(e,t,n){const r=this.proxy,s=se(e)?e.includes(".")?fo(r,e):()=>r[e]:e.bind(r,r);let o;W(t)?o=t:(o=t.handler,n=t);const i=re;Tt(this);const l=Fn(s,o.bind(r),n);return i?Tt(i):ut(),l}function fo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{ct(n,t)});else if(Ks(e))for(const n in e)ct(e[n],t);return e}function vl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Rt(()=>{e.isMounted=!0}),yo(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],wl={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},setup(e,{slots:t}){const n=Hn(),r=vl();let s;return()=>{const o=t.default&&go(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){for(const A of o)if(A.type!==ve){i=A;break}}const l=Y(e),{mode:c}=l;if(r.isLeaving)return Un(i);const a=rs(i);if(!a)return Un(i);const f=or(a,l,r,n);ir(a,f);const h=n.subTree,p=h&&rs(h);let m=!1;const{getTransitionKey:_}=a.type;if(_){const A=_();s===void 0?s=A:A!==s&&(s=A,m=!0)}if(p&&p.type!==ve&&(!it(a,p)||m)){const A=or(p,l,r,n);if(ir(p,A),c==="out-in")return r.isLeaving=!0,A.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},Un(i);c==="in-out"&&a.type!==ve&&(A.delayLeave=(N,y,v)=>{const R=po(r,p);R[String(p.key)]=p,N._leaveCb=()=>{y(),N._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=v})}return i}}},ho=wl;function po(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function or(e,t,n,r){const{appear:s,mode:o,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:h,onLeave:p,onAfterLeave:m,onLeaveCancelled:_,onBeforeAppear:A,onAppear:N,onAfterAppear:y,onAppearCancelled:v}=t,R=String(e.key),I=po(n,e),D=(C,O)=>{C&&xe(C,r,9,O)},V=(C,O)=>{const P=O[1];D(C,O),B(C)?C.every(U=>U.length<=1)&&P():C.length<=1&&P()},k={mode:o,persisted:i,beforeEnter(C){let O=l;if(!n.isMounted)if(s)O=A||l;else return;C._leaveCb&&C._leaveCb(!0);const P=I[R];P&&it(e,P)&&P.el._leaveCb&&P.el._leaveCb(),D(O,[C])},enter(C){let O=c,P=a,U=f;if(!n.isMounted)if(s)O=N||c,P=y||a,U=v||f;else return;let F=!1;const q=C._enterCb=$=>{F||(F=!0,$?D(U,[C]):D(P,[C]),k.delayedLeave&&k.delayedLeave(),C._enterCb=void 0)};O?V(O,[C,q]):q()},leave(C,O){const P=String(e.key);if(C._enterCb&&C._enterCb(!0),n.isUnmounting)return O();D(h,[C]);let U=!1;const F=C._leaveCb=q=>{U||(U=!0,O(),q?D(_,[C]):D(m,[C]),C._leaveCb=void 0,I[P]===e&&delete I[P])};I[P]=e,p?V(p,[C,F]):F()},clone(C){return or(C,t,n,r)}};return k}function Un(e){if(zt(e))return e=Ze(e),e.children=null,e}function rs(e){return zt(e)?e.children?e.children[0]:void 0:e}function ir(e,t){e.shapeFlag&6&&e.component?ir(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function go(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;o!!e.type.__asyncLoader;function Da(e){W(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:o,suspensible:i=!0,onError:l}=e;let c=null,a,f=0;const h=()=>(f++,c=null,p()),p=()=>{let m;return c||(m=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),l)return new Promise((A,N)=>{l(_,()=>A(h()),()=>N(_),f+1)});throw _}).then(_=>m!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),a=_,_)))};return Lr({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return a},setup(){const m=re;if(a)return()=>Kn(a,m);const _=v=>{c=null,qt(v,m,13,!r)};if(i&&m.suspense||At)return p().then(v=>()=>Kn(v,m)).catch(v=>(_(v),()=>r?ie(r,{error:v}):null));const A=ae(!1),N=ae(),y=ae(!!s);return s&&setTimeout(()=>{y.value=!1},s),o!=null&&setTimeout(()=>{if(!A.value&&!N.value){const v=new Error(`Async component timed out after ${o}ms.`);_(v),N.value=v}},o),p().then(()=>{A.value=!0,m.parent&&zt(m.parent.vnode)&&Mn(m.parent.update)}).catch(v=>{_(v),N.value=v}),()=>{if(A.value&&a)return Kn(a,m);if(N.value&&r)return ie(r,{error:N.value});if(n&&!y.value)return ie(n)}}})}function Kn(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=ie(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const zt=e=>e.type.__isKeepAlive;function El(e,t){mo(e,"a",t)}function Cl(e,t){mo(e,"da",t)}function mo(e,t,n=re){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Ln(t,r,n),n){let s=n.parent;for(;s&&s.parent;)zt(s.parent.vnode)&&xl(r,t,n,s),s=s.parent}}function xl(e,t,n,r){const s=Ln(t,e,r,!0);Nn(()=>{br(r[t],s)},n)}function Ln(e,t,n=re,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;St(),Tt(n);const l=xe(t,n,e,i);return ut(),Ot(),l});return r?s.unshift(o):s.push(o),o}}const ke=e=>(t,n=re)=>(!At||e==="sp")&&Ln(e,(...r)=>t(...r),n),Tl=ke("bm"),Rt=ke("m"),Al=ke("bu"),Sl=ke("u"),yo=ke("bum"),Nn=ke("um"),Ol=ke("sp"),Rl=ke("rtg"),Ml=ke("rtc");function Pl(e,t=re){Ln("ec",e,t)}function ka(e,t){const n=ue;if(n===null)return e;const r=jn(n)||n.proxy,s=e.dirs||(e.dirs=[]);for(let o=0;ot(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lwn(t)?!(t.type===ve||t.type===ge&&!vo(t.children)):!0)?e:null}function Va(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:un(r)]=e[r];return n}const lr=e=>e?$o(e)?jn(e)||e.proxy:lr(e.parent):null,Nt=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>lr(e.parent),$root:e=>lr(e.root),$emit:e=>e.emit,$options:e=>$r(e),$forceUpdate:e=>e.f||(e.f=()=>Mn(e.update)),$nextTick:e=>e.n||(e.n=Rn.bind(e.proxy)),$watch:e=>bl.bind(e)}),Wn=(e,t)=>e!==ee&&!e.__isScriptSetup&&X(e,t),Il={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const m=i[t];if(m!==void 0)switch(m){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(Wn(r,t))return i[t]=1,r[t];if(s!==ee&&X(s,t))return i[t]=2,s[t];if((a=e.propsOptions[0])&&X(a,t))return i[t]=3,o[t];if(n!==ee&&X(n,t))return i[t]=4,n[t];cr&&(i[t]=0)}}const f=Nt[t];let h,p;if(f)return t==="$attrs"&&me(e,"get",t),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==ee&&X(n,t))return i[t]=4,n[t];if(p=c.config.globalProperties,X(p,t))return p[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return Wn(s,t)?(s[t]=n,!0):r!==ee&&X(r,t)?(r[t]=n,!0):X(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==ee&&X(e,i)||Wn(t,i)||(l=o[0])&&X(l,i)||X(r,i)||X(Nt,i)||X(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:X(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let cr=!0;function Fl(e){const t=$r(e),n=e.proxy,r=e.ctx;cr=!1,t.beforeCreate&&os(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:p,beforeUpdate:m,updated:_,activated:A,deactivated:N,beforeDestroy:y,beforeUnmount:v,destroyed:R,unmounted:I,render:D,renderTracked:V,renderTriggered:k,errorCaptured:C,serverPrefetch:O,expose:P,inheritAttrs:U,components:F,directives:q,filters:$}=t;if(a&&Ll(a,r,null,e.appContext.config.unwrapInjectedRef),i)for(const ne in i){const Z=i[ne];W(Z)&&(r[ne]=Z.bind(n))}if(s){const ne=s.call(n,n);te(ne)&&(e.data=Sn(ne))}if(cr=!0,o)for(const ne in o){const Z=o[ne],Ge=W(Z)?Z.bind(n,n):W(Z.get)?Z.get.bind(n,n):Le,Xt=!W(Z)&&W(Z.set)?Z.set.bind(n):Le,et=oe({get:Ge,set:Xt});Object.defineProperty(r,ne,{enumerable:!0,configurable:!0,get:()=>et.value,set:Me=>et.value=Me})}if(l)for(const ne in l)wo(l[ne],r,n,ne);if(c){const ne=W(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Z=>{_l(Z,ne[Z])})}f&&os(f,e,"c");function J(ne,Z){B(Z)?Z.forEach(Ge=>ne(Ge.bind(n))):Z&&ne(Z.bind(n))}if(J(Tl,h),J(Rt,p),J(Al,m),J(Sl,_),J(El,A),J(Cl,N),J(Pl,C),J(Ml,V),J(Rl,k),J(yo,v),J(Nn,I),J(Ol,O),B(P))if(P.length){const ne=e.exposed||(e.exposed={});P.forEach(Z=>{Object.defineProperty(ne,Z,{get:()=>n[Z],set:Ge=>n[Z]=Ge})})}else e.exposed||(e.exposed={});D&&e.render===Le&&(e.render=D),U!=null&&(e.inheritAttrs=U),F&&(e.components=F),q&&(e.directives=q)}function Ll(e,t,n=Le,r=!1){B(e)&&(e=ar(e));for(const s in e){const o=e[s];let i;te(o)?"default"in o?i=wt(o.from||s,o.default,!0):i=wt(o.from||s):i=wt(o),ce(i)&&r?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:l=>i.value=l}):t[s]=i}}function os(e,t,n){xe(B(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function wo(e,t,n,r){const s=r.includes(".")?fo(n,r):()=>n[r];if(se(e)){const o=t[e];W(o)&&Xe(s,o)}else if(W(e))Xe(s,e.bind(n));else if(te(e))if(B(e))e.forEach(o=>wo(o,t,n,r));else{const o=W(e.handler)?e.handler.bind(n):t[e.handler];W(o)&&Xe(s,o,e)}}function $r(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(a=>bn(c,a,i,!0)),bn(c,t,i)),te(t)&&o.set(t,c),c}function bn(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&bn(e,o,n,!0),s&&s.forEach(i=>bn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Nl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Nl={data:is,props:st,emits:st,methods:st,computed:st,beforeCreate:he,created:he,beforeMount:he,mounted:he,beforeUpdate:he,updated:he,beforeDestroy:he,beforeUnmount:he,destroyed:he,unmounted:he,activated:he,deactivated:he,errorCaptured:he,serverPrefetch:he,components:st,directives:st,watch:Hl,provide:is,inject:$l};function is(e,t){return t?e?function(){return fe(W(e)?e.call(this,this):e,W(t)?t.call(this,this):t)}:t:e}function $l(e,t){return st(ar(e),ar(t))}function ar(e){if(B(e)){const t={};for(let n=0;n0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[p,m]=Co(h,t,!0);fe(i,p),m&&l.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return te(e)&&r.set(e,yt),yt;if(B(o))for(let f=0;f-1,m[1]=A<0||_-1||X(m,"default"))&&l.push(h)}}}const a=[i,l];return te(e)&&r.set(e,a),a}function ls(e){return e[0]!=="$"}function cs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function as(e,t){return cs(e)===cs(t)}function us(e,t){return B(t)?t.findIndex(n=>as(n,e)):W(t)&&as(t,e)?0:-1}const xo=e=>e[0]==="_"||e==="$stable",Hr=e=>B(e)?e.map(Ae):[Ae(e)],kl=(e,t,n)=>{if(t._n)return t;const r=dl((...s)=>Hr(t(...s)),n);return r._c=!1,r},To=(e,t,n)=>{const r=e._ctx;for(const s in e){if(xo(s))continue;const o=e[s];if(W(o))t[s]=kl(s,o,r);else if(o!=null){const i=Hr(o);t[s]=()=>i}}},Ao=(e,t)=>{const n=Hr(t);e.slots.default=()=>n},Bl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Y(t),pn(t,"_",n)):To(t,e.slots={})}else e.slots={},t&&Ao(e,t);pn(e.slots,$n,1)},Ul=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=ee;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(fe(s,t),!n&&l===1&&delete s._):(o=!t.$stable,To(t,s)),i=t}else t&&(Ao(e,t),i={default:1});if(o)for(const l in s)!xo(l)&&!(l in i)&&delete s[l]};function So(){return{app:null,config:{isNativeTag:hi,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Kl=0;function Wl(e,t){return function(r,s=null){W(r)||(r=Object.assign({},r)),s!=null&&!te(s)&&(s=null);const o=So(),i=new Set;let l=!1;const c=o.app={_uid:Kl++,_component:r,_props:s,_container:null,_context:o,_instance:null,version:hc,get config(){return o.config},set config(a){},use(a,...f){return i.has(a)||(a&&W(a.install)?(i.add(a),a.install(c,...f)):W(a)&&(i.add(a),a(c,...f))),c},mixin(a){return o.mixins.includes(a)||o.mixins.push(a),c},component(a,f){return f?(o.components[a]=f,c):o.components[a]},directive(a,f){return f?(o.directives[a]=f,c):o.directives[a]},mount(a,f,h){if(!l){const p=ie(r,s);return p.appContext=o,f&&t?t(p,a):e(p,a,h),l=!0,c._container=a,a.__vue_app__=c,jn(p.component)||p.component.proxy}},unmount(){l&&(e(null,c._container),delete c._container.__vue_app__)},provide(a,f){return o.provides[a]=f,c}};return c}}function vn(e,t,n,r,s=!1){if(B(e)){e.forEach((p,m)=>vn(p,t&&(B(t)?t[m]:t),n,r,s));return}if(Et(r)&&!s)return;const o=r.shapeFlag&4?jn(r.component)||r.component.proxy:r.el,i=s?null:o,{i:l,r:c}=e,a=t&&t.r,f=l.refs===ee?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(se(a)?(f[a]=null,X(h,a)&&(h[a]=null)):ce(a)&&(a.value=null)),W(c))ze(c,l,12,[i,f]);else{const p=se(c),m=ce(c);if(p||m){const _=()=>{if(e.f){const A=p?X(h,c)?h[c]:f[c]:c.value;s?B(A)&&br(A,o):B(A)?A.includes(o)||A.push(o):p?(f[c]=[o],X(h,c)&&(h[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else p?(f[c]=i,X(h,c)&&(h[c]=i)):m&&(c.value=i,e.k&&(f[e.k]=i))};i?(_.id=-1,pe(_,n)):_()}}}let Ue=!1;const nn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",rn=e=>e.nodeType===8;function Vl(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:a}}=e,f=(y,v)=>{if(!v.hasChildNodes()){n(null,y,v),yn(),v._vnode=y;return}Ue=!1,h(v.firstChild,y,null,null,null),yn(),v._vnode=y,Ue&&console.error("Hydration completed but contains mismatches.")},h=(y,v,R,I,D,V=!1)=>{const k=rn(y)&&y.data==="[",C=()=>A(y,v,R,I,D,k),{type:O,ref:P,shapeFlag:U,patchFlag:F}=v;let q=y.nodeType;v.el=y,F===-2&&(V=!1,v.dynamicChildren=null);let $=null;switch(O){case xt:q!==3?v.children===""?(c(v.el=s(""),i(y),y),$=y):$=C():(y.data!==v.children&&(Ue=!0,y.data=v.children),$=o(y));break;case ve:q!==8||k?$=C():$=o(y);break;case Ht:if(k&&(y=o(y),q=y.nodeType),q===1||q===3){$=y;const ye=!v.children.length;for(let J=0;J{V=V||!!v.dynamicChildren;const{type:k,props:C,patchFlag:O,shapeFlag:P,dirs:U}=v,F=k==="input"&&U||k==="option";if(F||O!==-1){if(U&&Ie(v,null,R,"created"),C)if(F||!V||O&48)for(const $ in C)(F&&$.endsWith("value")||Vt($)&&!Ft($))&&r(y,$,null,C[$],!1,void 0,R);else C.onClick&&r(y,"onClick",null,C.onClick,!1,void 0,R);let q;if((q=C&&C.onVnodeBeforeMount)&&Ee(q,R,v),U&&Ie(v,null,R,"beforeMount"),((q=C&&C.onVnodeMounted)||U)&&uo(()=>{q&&Ee(q,R,v),U&&Ie(v,null,R,"mounted")},I),P&16&&!(C&&(C.innerHTML||C.textContent))){let $=m(y.firstChild,v,y,R,I,D,V);for(;$;){Ue=!0;const ye=$;$=$.nextSibling,l(ye)}}else P&8&&y.textContent!==v.children&&(Ue=!0,y.textContent=v.children)}return y.nextSibling},m=(y,v,R,I,D,V,k)=>{k=k||!!v.dynamicChildren;const C=v.children,O=C.length;for(let P=0;P{const{slotScopeIds:k}=v;k&&(D=D?D.concat(k):k);const C=i(y),O=m(o(y),v,C,R,I,D,V);return O&&rn(O)&&O.data==="]"?o(v.anchor=O):(Ue=!0,c(v.anchor=a("]"),C,O),O)},A=(y,v,R,I,D,V)=>{if(Ue=!0,v.el=null,V){const O=N(y);for(;;){const P=o(y);if(P&&P!==O)l(P);else break}}const k=o(y),C=i(y);return l(y),n(null,v,C,k,R,I,nn(C),D),k},N=y=>{let v=0;for(;y;)if(y=o(y),y&&rn(y)&&(y.data==="["&&v++,y.data==="]")){if(v===0)return o(y);v--}return y};return[f,h]}const pe=uo;function ql(e){return Oo(e)}function zl(e){return Oo(e,Vl)}function Oo(e,t){const n=vi();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:p,setScopeId:m=Le,insertStaticContent:_}=e,A=(u,d,g,w=null,b=null,T=null,M=!1,x=null,S=!!d.dynamicChildren)=>{if(u===d)return;u&&!it(u,d)&&(w=Yt(u),Me(u,b,T,!0),u=null),d.patchFlag===-2&&(S=!1,d.dynamicChildren=null);const{type:E,ref:H,shapeFlag:L}=d;switch(E){case xt:N(u,d,g,w);break;case ve:y(u,d,g,w);break;case Ht:u==null&&v(d,g,w,M);break;case ge:F(u,d,g,w,b,T,M,x,S);break;default:L&1?D(u,d,g,w,b,T,M,x,S):L&6?q(u,d,g,w,b,T,M,x,S):(L&64||L&128)&&E.process(u,d,g,w,b,T,M,x,S,ht)}H!=null&&b&&vn(H,u&&u.ref,T,d||u,!d)},N=(u,d,g,w)=>{if(u==null)r(d.el=l(d.children),g,w);else{const b=d.el=u.el;d.children!==u.children&&a(b,d.children)}},y=(u,d,g,w)=>{u==null?r(d.el=c(d.children||""),g,w):d.el=u.el},v=(u,d,g,w)=>{[u.el,u.anchor]=_(u.children,d,g,w,u.el,u.anchor)},R=({el:u,anchor:d},g,w)=>{let b;for(;u&&u!==d;)b=p(u),r(u,g,w),u=b;r(d,g,w)},I=({el:u,anchor:d})=>{let g;for(;u&&u!==d;)g=p(u),s(u),u=g;s(d)},D=(u,d,g,w,b,T,M,x,S)=>{M=M||d.type==="svg",u==null?V(d,g,w,b,T,M,x,S):O(u,d,b,T,M,x,S)},V=(u,d,g,w,b,T,M,x)=>{let S,E;const{type:H,props:L,shapeFlag:j,transition:K,dirs:z}=u;if(S=u.el=i(u.type,T,L&&L.is,L),j&8?f(S,u.children):j&16&&C(u.children,S,null,w,b,T&&H!=="foreignObject",M,x),z&&Ie(u,null,w,"created"),k(S,u,u.scopeId,M,w),L){for(const Q in L)Q!=="value"&&!Ft(Q)&&o(S,Q,null,L[Q],T,u.children,w,b,He);"value"in L&&o(S,"value",null,L.value),(E=L.onVnodeBeforeMount)&&Ee(E,w,u)}z&&Ie(u,null,w,"beforeMount");const G=(!b||b&&!b.pendingBranch)&&K&&!K.persisted;G&&K.beforeEnter(S),r(S,d,g),((E=L&&L.onVnodeMounted)||G||z)&&pe(()=>{E&&Ee(E,w,u),G&&K.enter(S),z&&Ie(u,null,w,"mounted")},b)},k=(u,d,g,w,b)=>{if(g&&m(u,g),w)for(let T=0;T{for(let E=S;E{const x=d.el=u.el;let{patchFlag:S,dynamicChildren:E,dirs:H}=d;S|=u.patchFlag&16;const L=u.props||ee,j=d.props||ee;let K;g&&tt(g,!1),(K=j.onVnodeBeforeUpdate)&&Ee(K,g,d,u),H&&Ie(d,u,g,"beforeUpdate"),g&&tt(g,!0);const z=b&&d.type!=="foreignObject";if(E?P(u.dynamicChildren,E,x,g,w,z,T):M||Z(u,d,x,null,g,w,z,T,!1),S>0){if(S&16)U(x,d,L,j,g,w,b);else if(S&2&&L.class!==j.class&&o(x,"class",null,j.class,b),S&4&&o(x,"style",L.style,j.style,b),S&8){const G=d.dynamicProps;for(let Q=0;Q{K&&Ee(K,g,d,u),H&&Ie(d,u,g,"updated")},w)},P=(u,d,g,w,b,T,M)=>{for(let x=0;x{if(g!==w){if(g!==ee)for(const x in g)!Ft(x)&&!(x in w)&&o(u,x,g[x],null,M,d.children,b,T,He);for(const x in w){if(Ft(x))continue;const S=w[x],E=g[x];S!==E&&x!=="value"&&o(u,x,E,S,M,d.children,b,T,He)}"value"in w&&o(u,"value",g.value,w.value)}},F=(u,d,g,w,b,T,M,x,S)=>{const E=d.el=u?u.el:l(""),H=d.anchor=u?u.anchor:l("");let{patchFlag:L,dynamicChildren:j,slotScopeIds:K}=d;K&&(x=x?x.concat(K):K),u==null?(r(E,g,w),r(H,g,w),C(d.children,g,H,b,T,M,x,S)):L>0&&L&64&&j&&u.dynamicChildren?(P(u.dynamicChildren,j,g,b,T,M,x),(d.key!=null||b&&d===b.subTree)&&jr(u,d,!0)):Z(u,d,g,H,b,T,M,x,S)},q=(u,d,g,w,b,T,M,x,S)=>{d.slotScopeIds=x,u==null?d.shapeFlag&512?b.ctx.activate(d,g,w,M,S):$(d,g,w,b,T,M,S):ye(u,d,S)},$=(u,d,g,w,b,T,M)=>{const x=u.component=sc(u,w,b);if(zt(u)&&(x.ctx.renderer=ht),oc(x),x.asyncDep){if(b&&b.registerDep(x,J),!u.el){const S=x.subTree=ie(ve);y(null,S,d,g)}return}J(x,u,d,g,b,T,M)},ye=(u,d,g)=>{const w=d.component=u.component;if(gl(u,d,g))if(w.asyncDep&&!w.asyncResolved){ne(w,d,g);return}else w.next=d,cl(w.update),w.update();else d.el=u.el,w.vnode=d},J=(u,d,g,w,b,T,M)=>{const x=()=>{if(u.isMounted){let{next:H,bu:L,u:j,parent:K,vnode:z}=u,G=H,Q;tt(u,!1),H?(H.el=z.el,ne(u,H,M)):H=z,L&&fn(L),(Q=H.props&&H.props.onVnodeBeforeUpdate)&&Ee(Q,K,H,z),tt(u,!0);const le=Bn(u),Te=u.subTree;u.subTree=le,A(Te,le,h(Te.el),Yt(Te),u,b,T),H.el=le.el,G===null&&ml(u,le.el),j&&pe(j,b),(Q=H.props&&H.props.onVnodeUpdated)&&pe(()=>Ee(Q,K,H,z),b)}else{let H;const{el:L,props:j}=d,{bm:K,m:z,parent:G}=u,Q=Et(d);if(tt(u,!1),K&&fn(K),!Q&&(H=j&&j.onVnodeBeforeMount)&&Ee(H,G,d),tt(u,!0),L&&kn){const le=()=>{u.subTree=Bn(u),kn(L,u.subTree,u,b,null)};Q?d.type.__asyncLoader().then(()=>!u.isUnmounted&&le()):le()}else{const le=u.subTree=Bn(u);A(null,le,g,w,u,b,T),d.el=le.el}if(z&&pe(z,b),!Q&&(H=j&&j.onVnodeMounted)){const le=d;pe(()=>Ee(H,G,le),b)}(d.shapeFlag&256||G&&Et(G.vnode)&&G.vnode.shapeFlag&256)&&u.a&&pe(u.a,b),u.isMounted=!0,d=g=w=null}},S=u.effect=new Cr(x,()=>Mn(E),u.scope),E=u.update=()=>S.run();E.id=u.uid,tt(u,!0),E()},ne=(u,d,g)=>{d.component=u;const w=u.vnode.props;u.vnode=d,u.next=null,Dl(u,d.props,w,g),Ul(u,d.children,g),St(),ts(),Ot()},Z=(u,d,g,w,b,T,M,x,S=!1)=>{const E=u&&u.children,H=u?u.shapeFlag:0,L=d.children,{patchFlag:j,shapeFlag:K}=d;if(j>0){if(j&128){Xt(E,L,g,w,b,T,M,x,S);return}else if(j&256){Ge(E,L,g,w,b,T,M,x,S);return}}K&8?(H&16&&He(E,b,T),L!==E&&f(g,L)):H&16?K&16?Xt(E,L,g,w,b,T,M,x,S):He(E,b,T,!0):(H&8&&f(g,""),K&16&&C(L,g,w,b,T,M,x,S))},Ge=(u,d,g,w,b,T,M,x,S)=>{u=u||yt,d=d||yt;const E=u.length,H=d.length,L=Math.min(E,H);let j;for(j=0;jH?He(u,b,T,!0,!1,L):C(d,g,w,b,T,M,x,S,L)},Xt=(u,d,g,w,b,T,M,x,S)=>{let E=0;const H=d.length;let L=u.length-1,j=H-1;for(;E<=L&&E<=j;){const K=u[E],z=d[E]=S?Ve(d[E]):Ae(d[E]);if(it(K,z))A(K,z,g,null,b,T,M,x,S);else break;E++}for(;E<=L&&E<=j;){const K=u[L],z=d[j]=S?Ve(d[j]):Ae(d[j]);if(it(K,z))A(K,z,g,null,b,T,M,x,S);else break;L--,j--}if(E>L){if(E<=j){const K=j+1,z=Kj)for(;E<=L;)Me(u[E],b,T,!0),E++;else{const K=E,z=E,G=new Map;for(E=z;E<=j;E++){const _e=d[E]=S?Ve(d[E]):Ae(d[E]);_e.key!=null&&G.set(_e.key,E)}let Q,le=0;const Te=j-z+1;let pt=!1,Wr=0;const Mt=new Array(Te);for(E=0;E=Te){Me(_e,b,T,!0);continue}let Pe;if(_e.key!=null)Pe=G.get(_e.key);else for(Q=z;Q<=j;Q++)if(Mt[Q-z]===0&&it(_e,d[Q])){Pe=Q;break}Pe===void 0?Me(_e,b,T,!0):(Mt[Pe-z]=E+1,Pe>=Wr?Wr=Pe:pt=!0,A(_e,d[Pe],g,null,b,T,M,x,S),le++)}const Vr=pt?Xl(Mt):yt;for(Q=Vr.length-1,E=Te-1;E>=0;E--){const _e=z+E,Pe=d[_e],qr=_e+1{const{el:T,type:M,transition:x,children:S,shapeFlag:E}=u;if(E&6){et(u.component.subTree,d,g,w);return}if(E&128){u.suspense.move(d,g,w);return}if(E&64){M.move(u,d,g,ht);return}if(M===ge){r(T,d,g);for(let L=0;Lx.enter(T),b);else{const{leave:L,delayLeave:j,afterLeave:K}=x,z=()=>r(T,d,g),G=()=>{L(T,()=>{z(),K&&K()})};j?j(T,z,G):G()}else r(T,d,g)},Me=(u,d,g,w=!1,b=!1)=>{const{type:T,props:M,ref:x,children:S,dynamicChildren:E,shapeFlag:H,patchFlag:L,dirs:j}=u;if(x!=null&&vn(x,null,g,u,!0),H&256){d.ctx.deactivate(u);return}const K=H&1&&j,z=!Et(u);let G;if(z&&(G=M&&M.onVnodeBeforeUnmount)&&Ee(G,d,u),H&6)ii(u.component,g,w);else{if(H&128){u.suspense.unmount(g,w);return}K&&Ie(u,null,d,"beforeUnmount"),H&64?u.type.remove(u,d,g,b,ht,w):E&&(T!==ge||L>0&&L&64)?He(E,d,g,!1,!0):(T===ge&&L&384||!b&&H&16)&&He(S,d,g),w&&Ur(u)}(z&&(G=M&&M.onVnodeUnmounted)||K)&&pe(()=>{G&&Ee(G,d,u),K&&Ie(u,null,d,"unmounted")},g)},Ur=u=>{const{type:d,el:g,anchor:w,transition:b}=u;if(d===ge){oi(g,w);return}if(d===Ht){I(u);return}const T=()=>{s(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(u.shapeFlag&1&&b&&!b.persisted){const{leave:M,delayLeave:x}=b,S=()=>M(g,T);x?x(u.el,T,S):S()}else T()},oi=(u,d)=>{let g;for(;u!==d;)g=p(u),s(u),u=g;s(d)},ii=(u,d,g)=>{const{bum:w,scope:b,update:T,subTree:M,um:x}=u;w&&fn(w),b.stop(),T&&(T.active=!1,Me(M,u,d,g)),x&&pe(x,d),pe(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},He=(u,d,g,w=!1,b=!1,T=0)=>{for(let M=T;Mu.shapeFlag&6?Yt(u.component.subTree):u.shapeFlag&128?u.suspense.next():p(u.anchor||u.el),Kr=(u,d,g)=>{u==null?d._vnode&&Me(d._vnode,null,null,!0):A(d._vnode||null,u,d,null,null,null,g),ts(),yn(),d._vnode=u},ht={p:A,um:Me,m:et,r:Ur,mt:$,mc:C,pc:Z,pbc:P,n:Yt,o:e};let Dn,kn;return t&&([Dn,kn]=t(ht)),{render:Kr,hydrate:Dn,createApp:Wl(Kr,Dn)}}function tt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function jr(e,t,n=!1){const r=e.children,s=t.children;if(B(r)&&B(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const Yl=e=>e.__isTeleport,$t=e=>e&&(e.disabled||e.disabled===""),fs=e=>typeof SVGElement<"u"&&e instanceof SVGElement,fr=(e,t)=>{const n=e&&e.to;return se(n)?t?t(n):null:n},Jl={__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,a){const{mc:f,pc:h,pbc:p,o:{insert:m,querySelector:_,createText:A,createComment:N}}=a,y=$t(t.props);let{shapeFlag:v,children:R,dynamicChildren:I}=t;if(e==null){const D=t.el=A(""),V=t.anchor=A("");m(D,n,r),m(V,n,r);const k=t.target=fr(t.props,_),C=t.targetAnchor=A("");k&&(m(C,k),i=i||fs(k));const O=(P,U)=>{v&16&&f(R,P,U,s,o,i,l,c)};y?O(n,V):k&&O(k,C)}else{t.el=e.el;const D=t.anchor=e.anchor,V=t.target=e.target,k=t.targetAnchor=e.targetAnchor,C=$t(e.props),O=C?n:V,P=C?D:k;if(i=i||fs(V),I?(p(e.dynamicChildren,I,O,s,o,i,l),jr(e,t,!0)):c||h(e,t,O,P,s,o,i,l,!1),y)C||sn(t,n,D,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const U=t.target=fr(t.props,_);U&&sn(t,U,null,a,0)}else C&&sn(t,V,k,a,1)}Ro(t)},remove(e,t,n,r,{um:s,o:{remove:o}},i){const{shapeFlag:l,children:c,anchor:a,targetAnchor:f,target:h,props:p}=e;if(h&&o(f),(i||!$t(p))&&(o(a),l&16))for(let m=0;m0?Oe||yt:null,Zl(),Wt>0&&Oe&&Oe.push(e),e}function za(e,t,n,r,s,o){return Po(Lo(e,t,n,r,s,o,!0))}function Io(e,t,n,r,s){return Po(ie(e,t,n,r,s,!0))}function wn(e){return e?e.__v_isVNode===!0:!1}function it(e,t){return e.type===t.type&&e.key===t.key}const $n="__vInternal",Fo=({key:e})=>e??null,dn=({ref:e,ref_key:t,ref_for:n})=>e!=null?se(e)||ce(e)||W(e)?{i:ue,r:e,k:t,f:!!n}:e:null;function Lo(e,t=null,n=null,r=0,s=null,o=e===ge?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Fo(t),ref:t&&dn(t),scopeId:In,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:ue};return l?(Dr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),Wt>0&&!i&&Oe&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Oe.push(c),c}const ie=Gl;function Gl(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===_o)&&(e=ve),wn(e)){const l=Ze(e,t,!0);return n&&Dr(l,n),Wt>0&&!o&&Oe&&(l.shapeFlag&6?Oe[Oe.indexOf(e)]=l:Oe.push(l)),l.patchFlag|=-2,l}if(ac(e)&&(e=e.__vccOpts),t){t=ec(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=yr(l)),te(c)&&(to(c)&&!B(c)&&(c=fe({},c)),t.style=mr(c))}const i=se(e)?1:yl(e)?128:Yl(e)?64:te(e)?4:W(e)?2:0;return Lo(e,t,n,r,s,i,o,!0)}function ec(e){return e?to(e)||$n in e?fe({},e):e:null}function Ze(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,l=t?tc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Fo(l),ref:t&&t.ref?n&&s?B(s)?s.concat(dn(t)):[s,dn(t)]:dn(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ge?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ze(e.ssContent),ssFallback:e.ssFallback&&Ze(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function No(e=" ",t=0){return ie(xt,null,e,t)}function Xa(e,t){const n=ie(Ht,null,e);return n.staticCount=t,n}function Ya(e="",t=!1){return t?(Mo(),Io(ve,null,e)):ie(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?ie(ve):B(e)?ie(ge,null,e.slice()):typeof e=="object"?Ve(e):ie(xt,null,String(e))}function Ve(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ze(e)}function Dr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(B(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Dr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!($n in t)?t._ctx=ue:s===3&&ue&&(ue.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else W(t)?(t={default:t,_ctx:ue},n=32):(t=String(t),r&64?(n=16,t=[No(t)]):n=8);e.children=t,e.shapeFlag|=n}function tc(...e){const t={};for(let n=0;nre||ue,Tt=e=>{re=e,e.scope.on()},ut=()=>{re&&re.scope.off(),re=null};function $o(e){return e.vnode.shapeFlag&4}let At=!1;function oc(e,t=!1){At=t;const{props:n,children:r}=e.vnode,s=$o(e);jl(e,n,s,t),Bl(e,r);const o=s?ic(e,t):void 0;return At=!1,o}function ic(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Lt(new Proxy(e.ctx,Il));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?jo(e):null;Tt(e),St();const o=ze(r,e,0,[e.props,s]);if(Ot(),ut(),Bs(o)){if(o.then(ut,ut),t)return o.then(i=>{hs(e,i,t)}).catch(i=>{qt(i,e,0)});e.asyncDep=o}else hs(e,o,t)}else Ho(e,t)}function hs(e,t,n){W(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:te(t)&&(e.setupState=so(t)),Ho(e,n)}let ps;function Ho(e,t,n){const r=e.type;if(!e.render){if(!t&&ps&&!r.render){const s=r.template||$r(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,a=fe(fe({isCustomElement:o,delimiters:l},i),c);r.render=ps(s,a)}}e.render=r.render||Le}Tt(e),St(),Fl(e),Ot(),ut()}function lc(e){return new Proxy(e.attrs,{get(t,n){return me(e,"get","$attrs"),t[n]}})}function jo(e){const t=r=>{e.exposed=r||{}};let n;return{get attrs(){return n||(n=lc(e))},slots:e.slots,emit:e.emit,expose:t}}function jn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(so(Lt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Nt)return Nt[n](e)},has(t,n){return n in t||n in Nt}}))}function cc(e,t=!0){return W(e)?e.displayName||e.name:e.name||t&&e.__name}function ac(e){return W(e)&&"__vccOpts"in e}const oe=(e,t)=>ol(e,t,At);function Ja(){return uc().slots}function uc(){const e=Hn();return e.setupContext||(e.setupContext=jo(e))}function dr(e,t,n){const r=arguments.length;return r===2?te(t)&&!B(t)?wn(t)?ie(e,null,[t]):ie(e,t):ie(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&wn(n)&&(n=[n]),ie(e,t,n))}const fc=Symbol(""),dc=()=>wt(fc),hc="3.2.47",pc="http://www.w3.org/2000/svg",lt=typeof document<"u"?document:null,gs=lt&<.createElement("template"),gc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t?lt.createElementNS(pc,e):lt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>lt.createTextNode(e),createComment:e=>lt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>lt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{gs.innerHTML=r?`${e}`:e;const l=gs.content;if(r){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function mc(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function yc(e,t,n){const r=e.style,s=se(n);if(n&&!s){if(t&&!se(t))for(const o in t)n[o]==null&&hr(r,o,"");for(const o in n)hr(r,o,n[o])}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=o)}}const ms=/\s*!important$/;function hr(e,t,n){if(B(n))n.forEach(r=>hr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=_c(e,t);ms.test(n)?e.setProperty(dt(r),n.replace(ms,""),"important"):e[r]=n}}const ys=["Webkit","Moz","ms"],Vn={};function _c(e,t){const n=Vn[t];if(n)return n;let r=$e(t);if(r!=="filter"&&r in e)return Vn[t]=r;r=Tn(r);for(let s=0;sqn||(xc.then(()=>qn=0),qn=Date.now());function Ac(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;xe(Sc(r,n.value),t,5,[r])};return n.value=e,n.attached=Tc(),n}function Sc(e,t){if(B(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const vs=/^on[a-z]/,Oc=(e,t,n,r,s=!1,o,i,l,c)=>{t==="class"?mc(e,r,s):t==="style"?yc(e,n,r):Vt(t)?_r(t)||Ec(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Rc(e,t,r,s))?vc(e,t,r,o,i,l,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),bc(e,t,r,s))};function Rc(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&vs.test(t)&&W(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||vs.test(t)&&se(n)?!1:t in e}const Ke="transition",Pt="animation",Do=(e,{slots:t})=>dr(ho,Mc(e),t);Do.displayName="Transition";const ko={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Do.props=fe({},ho.props,ko);const nt=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},ws=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function Mc(e){const t={};for(const F in e)F in ko||(t[F]=e[F]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,_=Pc(s),A=_&&_[0],N=_&&_[1],{onBeforeEnter:y,onEnter:v,onEnterCancelled:R,onLeave:I,onLeaveCancelled:D,onBeforeAppear:V=y,onAppear:k=v,onAppearCancelled:C=R}=t,O=(F,q,$)=>{rt(F,q?f:l),rt(F,q?a:i),$&&$()},P=(F,q)=>{F._isLeaving=!1,rt(F,h),rt(F,m),rt(F,p),q&&q()},U=F=>(q,$)=>{const ye=F?k:v,J=()=>O(q,F,$);nt(ye,[q,J]),Es(()=>{rt(q,F?c:o),We(q,F?f:l),ws(ye)||Cs(q,r,A,J)})};return fe(t,{onBeforeEnter(F){nt(y,[F]),We(F,o),We(F,i)},onBeforeAppear(F){nt(V,[F]),We(F,c),We(F,a)},onEnter:U(!1),onAppear:U(!0),onLeave(F,q){F._isLeaving=!0;const $=()=>P(F,q);We(F,h),Lc(),We(F,p),Es(()=>{F._isLeaving&&(rt(F,h),We(F,m),ws(I)||Cs(F,r,N,$))}),nt(I,[F,$])},onEnterCancelled(F){O(F,!1),nt(R,[F])},onAppearCancelled(F){O(F,!0),nt(C,[F])},onLeaveCancelled(F){P(F),nt(D,[F])}})}function Pc(e){if(e==null)return null;if(te(e))return[zn(e.enter),zn(e.leave)];{const t=zn(e);return[t,t]}}function zn(e){return bi(e)}function We(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function rt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Es(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Ic=0;function Cs(e,t,n,r){const s=e._endId=++Ic,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Fc(e,t);if(!i)return r();const a=i+"end";let f=0;const h=()=>{e.removeEventListener(a,p),o()},p=m=>{m.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[_]||"").split(", "),s=r(`${Ke}Delay`),o=r(`${Ke}Duration`),i=xs(s,o),l=r(`${Pt}Delay`),c=r(`${Pt}Duration`),a=xs(l,c);let f=null,h=0,p=0;t===Ke?i>0&&(f=Ke,h=i,p=o.length):t===Pt?a>0&&(f=Pt,h=a,p=c.length):(h=Math.max(i,a),f=h>0?i>a?Ke:Pt:null,p=f?f===Ke?o.length:c.length:0);const m=f===Ke&&/\b(transform|all)(,|$)/.test(r(`${Ke}Property`).toString());return{type:f,timeout:h,propCount:p,hasTransform:m}}function xs(e,t){for(;e.lengthTs(n)+Ts(e[r])))}function Ts(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Lc(){return document.body.offsetHeight}const As=e=>{const t=e.props["onUpdate:modelValue"]||!1;return B(t)?n=>fn(t,n):t};function Nc(e){e.target.composing=!0}function Ss(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qa={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e._assign=As(s);const o=r||s.props&&s.props.type==="number";gt(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=er(l)),e._assign(l)}),n&>(e,"change",()=>{e.value=e.value.trim()}),t||(gt(e,"compositionstart",Nc),gt(e,"compositionend",Ss),gt(e,"change",Ss))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:s}},o){if(e._assign=As(o),e.composing||document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===t||(s||e.type==="number")&&er(e.value)===t))return;const i=t??"";e.value!==i&&(e.value=i)}},$c=["ctrl","shift","alt","meta"],Hc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>$c.some(n=>e[`${n}Key`]&&!t.includes(n))},Za=(e,t)=>(n,...r)=>{for(let s=0;sn=>{if(!("key"in n))return;const r=dt(n.key);if(t.some(s=>s===r||jc[s]===r))return e(n)},Bo=fe({patchProp:Oc},gc);let Dt,Os=!1;function Dc(){return Dt||(Dt=ql(Bo))}function kc(){return Dt=Os?Dt:zl(Bo),Os=!0,Dt}const eu=(...e)=>{const t=Dc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Uo(r);if(!s)return;const o=t._component;!W(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,s instanceof SVGElement);return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},tu=(...e)=>{const t=kc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Uo(r);if(s)return n(s,!0,s instanceof SVGElement)},t};function Uo(e){return se(e)?document.querySelector(e):e}const nu=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Bc="modulepreload",Uc=function(e){return"/"+e},Rs={},ru=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName("link");s=Promise.all(n.map(i=>{if(i=Uc(i),i in Rs)return;Rs[i]=!0;const l=i.endsWith(".css"),c=l?'[rel="stylesheet"]':"";if(!!r)for(let h=o.length-1;h>=0;h--){const p=o[h];if(p.href===i&&(!l||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${c}`))return;const f=document.createElement("link");if(f.rel=l?"stylesheet":Bc,l||(f.as="script",f.crossOrigin=""),f.href=i,document.head.appendChild(f),l)return new Promise((h,p)=>{f.addEventListener("load",h),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${i}`)))})}))}return s.then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},Kc=window.__VP_SITE_DATA__;function kr(e){return Ws()?(Ci(e),!0):!1}function Ne(e){return typeof e=="function"?e():ro(e)}const Ko=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Wc=Object.prototype.toString,Vc=e=>Wc.call(e)==="[object Object]",Ye=()=>{},pr=qc();function qc(){var e,t;return Ko&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function zc(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const Wo=e=>e();function Xc(e,t={}){let n,r,s=Ye;const o=l=>{clearTimeout(l),s(),s=Ye};return l=>{const c=Ne(e),a=Ne(t.maxWait);return n&&o(n),c<=0||a!==void 0&&a<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,a&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},a)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function Yc(e=Wo){const t=ae(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:On(t),pause:n,resume:r,eventFilter:s}}function Jc(e){return e||Hn()}function Vo(...e){if(e.length!==1)return rl(...e);const t=e[0];return typeof t=="function"?On(tl(()=>({get:t,set:Ye}))):ae(t)}function qo(e,t,n={}){const{eventFilter:r=Wo,...s}=n;return Xe(e,zc(r,t),s)}function Qc(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=Yc(r);return{stop:qo(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function zo(e,t=!0,n){Jc()?Rt(e,n):t?e():Rn(e)}function su(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return qo(e,t,{...o,eventFilter:Xc(r,{maxWait:s})})}function ou(e,t,n){let r;ce(n)?r={evaluating:n}:r=n||{};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=Ye}=r,c=ae(!s),a=i?Pr(t):ae(t);let f=0;return Fr(async h=>{if(!c.value)return;f++;const p=f;let m=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const _=await e(A=>{h(()=>{o&&(o.value=!1),m||A()})});p===f&&(a.value=_)}catch(_){l(_)}finally{o&&p===f&&(o.value=!1),m=!0}}),s?oe(()=>(c.value=!0,a.value)):a}function mt(e){var t;const n=Ne(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Re=Ko?window:void 0;function Je(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Re):[t,n,r,s]=e,!t)return Ye;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,p,m)=>(f.addEventListener(h,p,m),()=>f.removeEventListener(h,p,m)),c=Xe(()=>[mt(t),Ne(s)],([f,h])=>{if(i(),!f)return;const p=Vc(h)?{...h}:h;o.push(...n.flatMap(m=>r.map(_=>l(f,m,_,p))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return kr(a),a}let Ms=!1;function iu(e,t,n={}){const{window:r=Re,ignore:s=[],capture:o=!0,detectIframe:i=!1}=n;if(!r)return Ye;pr&&!Ms&&(Ms=!0,Array.from(r.document.body.children).forEach(p=>p.addEventListener("click",Ye)),r.document.documentElement.addEventListener("click",Ye));let l=!0;const c=p=>s.some(m=>{if(typeof m=="string")return Array.from(r.document.querySelectorAll(m)).some(_=>_===p.target||p.composedPath().includes(_));{const _=mt(m);return _&&(p.target===_||p.composedPath().includes(_))}}),f=[Je(r,"click",p=>{const m=mt(e);if(!(!m||m===p.target||p.composedPath().includes(m))){if(p.detail===0&&(l=!c(p)),!l){l=!0;return}t(p)}},{passive:!0,capture:o}),Je(r,"pointerdown",p=>{const m=mt(e);l=!c(p)&&!!(m&&!p.composedPath().includes(m))},{passive:!0}),i&&Je(r,"blur",p=>{setTimeout(()=>{var m;const _=mt(e);((m=r.document.activeElement)==null?void 0:m.tagName)==="IFRAME"&&!(_!=null&&_.contains(r.document.activeElement))&&t(p)},0)})].filter(Boolean);return()=>f.forEach(p=>p())}function Zc(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function lu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=Re,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=Zc(t);return Je(s,o,f=>{f.repeat&&Ne(l)||c(f)&&n(f)},i)}function Gc(){const e=ae(!1);return Hn()&&Rt(()=>{e.value=!0}),e}function ea(e){const t=Gc();return oe(()=>(t.value,!!e()))}function ta(e,t={}){const{window:n=Re}=t,r=ea(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=ae(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Fr(()=>{r.value&&(l(),s=n.matchMedia(Ne(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return kr(()=>{c(),l(),s=void 0}),o}const on=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ln="__vueuse_ssr_handlers__",na=ra();function ra(){return ln in on||(on[ln]=on[ln]||{}),on[ln]}function Xo(e,t){return na[e]||t}function sa(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const oa={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Ps="vueuse-storage";function Br(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:f,window:h=Re,eventFilter:p,onError:m=O=>{console.error(O)},initOnMounted:_}=r,A=(f?Pr:ae)(typeof t=="function"?t():t);if(!n)try{n=Xo("getDefaultStorage",()=>{var O;return(O=Re)==null?void 0:O.localStorage})()}catch(O){m(O)}if(!n)return A;const N=Ne(t),y=sa(N),v=(s=r.serializer)!=null?s:oa[y],{pause:R,resume:I}=Qc(A,()=>D(A.value),{flush:o,deep:i,eventFilter:p});return h&&l&&zo(()=>{Je(h,"storage",C),Je(h,Ps,k),_&&C()}),_||C(),A;function D(O){try{if(O==null)n.removeItem(e);else{const P=v.write(O),U=n.getItem(e);U!==P&&(n.setItem(e,P),h&&h.dispatchEvent(new CustomEvent(Ps,{detail:{key:e,oldValue:U,newValue:P,storageArea:n}})))}}catch(P){m(P)}}function V(O){const P=O?O.newValue:n.getItem(e);if(P==null)return c&&N!=null&&n.setItem(e,v.write(N)),N;if(!O&&a){const U=v.read(P);return typeof a=="function"?a(U,N):y==="object"&&!Array.isArray(U)?{...N,...U}:U}else return typeof P!="string"?P:v.read(P)}function k(O){C(O.detail)}function C(O){if(!(O&&O.storageArea!==n)){if(O&&O.key==null){A.value=N;return}if(!(O&&O.key!==e)){R();try{(O==null?void 0:O.newValue)!==v.write(A.value)&&(A.value=V(O))}catch(P){m(P)}finally{O?Rn(I):I()}}}}}function Yo(e){return ta("(prefers-color-scheme: dark)",e)}function ia(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Re,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},p=Yo({window:s}),m=oe(()=>p.value?"dark":"light"),_=c||(i==null?Vo(r):Br(i,r,o,{window:s,listenToStorageChanges:l})),A=oe(()=>_.value==="auto"?m.value:_.value),N=Xo("updateHTMLAttrs",(I,D,V)=>{const k=typeof I=="string"?s==null?void 0:s.document.querySelector(I):mt(I);if(!k)return;let C;if(f&&(C=s.document.createElement("style"),C.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),s.document.head.appendChild(C)),D==="class"){const O=V.split(/\s/g);Object.values(h).flatMap(P=>(P||"").split(/\s/g)).filter(Boolean).forEach(P=>{O.includes(P)?k.classList.add(P):k.classList.remove(P)})}else k.setAttribute(D,V);f&&(s.getComputedStyle(C).opacity,document.head.removeChild(C))});function y(I){var D;N(t,n,(D=h[I])!=null?D:I)}function v(I){e.onChanged?e.onChanged(I,y):y(I)}Xe(A,v,{flush:"post",immediate:!0}),zo(()=>v(A.value));const R=oe({get(){return a?_.value:A.value},set(I){_.value=I}});try{return Object.assign(R,{store:_,system:m,state:A})}catch{return R}}function la(e={}){const{valueDark:t="dark",valueLight:n="",window:r=Re}=e,s=ia({...e,onChanged:(l,c)=>{var a;e.onChanged?(a=e.onChanged)==null||a.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),o=oe(()=>s.system?s.system.value:Yo({window:r}).value?"dark":"light");return oe({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";o.value===c?s.value="auto":s.value=c}})}function Xn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function cu(e,t,n={}){const{window:r=Re}=n;return Br(e,t,r==null?void 0:r.localStorage,n)}function Jo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const cn=new WeakMap;function au(e,t=!1){const n=ae(t);let r=null,s;Xe(Vo(e),l=>{const c=Xn(Ne(l));if(c){const a=c;cn.get(a)||cn.set(a,s),n.value&&(a.style.overflow="hidden")}},{immediate:!0});const o=()=>{const l=Xn(Ne(e));!l||n.value||(pr&&(r=Je(l,"touchmove",c=>{ca(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{var l;const c=Xn(Ne(e));!c||!n.value||(pr&&(r==null||r()),c.style.overflow=(l=cn.get(c))!=null?l:"",cn.delete(c),n.value=!1)};return kr(i),oe({get(){return n.value},set(l){l?o():i()}})}function uu(e,t,n={}){const{window:r=Re}=n;return Br(e,t,r==null?void 0:r.sessionStorage,n)}function fu(e={}){const{window:t=Re,behavior:n="auto"}=e;if(!t)return{x:ae(0),y:ae(0)};const r=ae(t.scrollX),s=ae(t.scrollY),o=oe({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=oe({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return Je(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}var Yn={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1},aa={};const Qo=/^(?:[a-z]+:|\/\/)/i,ua="vitepress-theme-appearance",Zo=/#.*$/,fa=/(index)?\.(md|html)$/,Ce=typeof document<"u",Go={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function da(e,t,n=!1){if(t===void 0)return!1;if(e=Is(`/${e}`),n)return new RegExp(t).test(e);if(Is(t)!==e)return!1;const r=t.match(Zo);return r?(Ce?location.hash:"")===r[0]:!0}function Is(e){return decodeURI(e).replace(Zo,"").replace(fa,"")}function ha(e){return Qo.test(e)}function pa(e,t){var r,s,o,i,l,c,a;const n=Object.keys(e.locales).find(f=>f!=="root"&&!ha(f)&&da(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:ti(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function ei(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=ga(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function ga(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function ma(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function ti(e,t){return[...e.filter(n=>!ma(t,n)),...t]}const ya=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,_a=/^[a-z]:/i;function Fs(e){const t=_a.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(ya,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Jn=typeof process=="object"&&aa.VITE_EXTRA_EXTENSIONS||(Yn==null?void 0:Yn.VITE_EXTRA_EXTENSIONS)||"",ba=new Set(("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(Jn&&typeof Jn=="string"?","+Jn:"")).split(","));function va(e){const t=e.split(".").pop();return t==null||!ba.has(t.toLowerCase())}function du(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const wa=Symbol(),ft=Pr(Kc);function hu(e){const t=oe(()=>pa(ft.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?ae(!0):n?la({storageKey:ua,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):ae(!1);return{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>ei(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:r}}function Ea(){const e=wt(wa);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ca(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ls(e){return Qo.test(e)||!e.startsWith("/")?e:Ca(ft.value.base,e)}function xa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ce){const n="/";t=Fs(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Fs(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let hn=[];function pu(e){hn.push(e),Nn(()=>{hn=hn.filter(t=>t!==e)})}function Ta(){let e=ft.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=Ns(e,n);else if(Array.isArray(e))for(const r of e){const s=Ns(r,n);if(s){t=s;break}}return t}function Ns(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}const Aa=Symbol(),ni="http://a.com",Sa=()=>({path:"/",component:null,data:Go});function gu(e,t){const n=Sn(Sa()),r={route:n,go:s};async function s(l=Ce?location.href:"/"){var c,a;l=En(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(Hs(l),await i(l),await((a=r.onAfterRouteChanged)==null?void 0:a.call(r,l)))}let o=null;async function i(l,c=0,a=!1){var p;if(await((p=r.onBeforePageLoad)==null?void 0:p.call(r,l))===!1)return;const f=new URL(l,ni),h=o=f.pathname;try{let m=await e(h);if(!m)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:_,__pageData:A}=m;if(!_)throw new Error(`Invalid route component: ${_}`);n.path=Ce?h:Ls(h),n.component=Lt(_),n.data=Lt(A),Ce&&Rn(()=>{let N=ft.value.base+A.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ft.value.cleanUrls&&!N.endsWith("/")&&(N+=".html"),N!==f.pathname&&(f.pathname=N,l=N+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!c){let y=null;try{y=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(v){console.warn(v)}if(y){$s(y,f.hash);return}}window.scrollTo(0,c)})}}catch(m){if(!/fetch|Page not found/.test(m.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(m),!a)try{const _=await fetch(ft.value.base+"hashmap.json");window.__VP_HASH_MAP__=await _.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Ce?h:Ls(h),n.component=t?Lt(t):null,n.data=Go)}}return Ce&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:f}=a,{href:h,origin:p,pathname:m,hash:_,search:A}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),N=window.location;!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!f&&p===N.origin&&va(m)&&(l.preventDefault(),m===N.pathname&&A===N.search?(_!==N.hash&&(history.pushState(null,"",_),window.dispatchEvent(new Event("hashchange"))),_?$s(a,_,a.classList.contains("header-anchor")):(Hs(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",async l=>{var c;await i(En(location.href),l.state&&l.state.scrollPosition||0),(c=r.onAfterRouteChanged)==null||c.call(r,location.href)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Oa(){const e=wt(Aa);if(!e)throw new Error("useRouter() is called without provider.");return e}function ri(){return Oa().route}function $s(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let s=function(){!n||Math.abs(i-window.scrollY)>window.innerHeight?window.scrollTo(0,i):window.scrollTo({left:0,top:i,behavior:"smooth"})};const o=parseInt(window.getComputedStyle(r).paddingTop,10),i=window.scrollY+r.getBoundingClientRect().top-Ta()+o;requestAnimationFrame(s)}}function Hs(e){Ce&&En(e)!==En(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function En(e){const t=new URL(e,ni);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ft.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Qn=()=>hn.forEach(e=>e()),mu=Lr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=ri(),{site:n}=Ea();return()=>dr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?dr(t.component,{onVnodeMounted:Qn,onVnodeUpdated:Qn,onVnodeUnmounted:Qn}):"404 Page Not Found"])}}),yu=Lr({setup(e,{slots:t}){const n=ae(!1);return Rt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function _u(){Ce&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function bu(){if(Ce){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className),l=[".vp-copy-ignore",".diff.remove"],c=o.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(f=>f.remove());let a=c.textContent||"";i&&(a=a.replace(/^ *(\$|>) /gm,"").trim()),Ra(a).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const f=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,f)})}})}}async function Ra(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function vu(e,t){let n=!0,r=[];const s=o=>{if(n){n=!1,o.forEach(l=>{const c=Zn(l);for(const a of document.head.children)if(a.isEqualNode(c)){r.push(a);return}});return}const i=o.map(Zn);r.forEach((l,c)=>{const a=i.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));a!==-1?delete i[a]:(l==null||l.remove(),delete r[c])}),i.forEach(l=>l&&document.head.appendChild(l)),r=[...r,...i].filter(Boolean)};Fr(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],a=ei(i,o);a!==document.title&&(document.title=a);const f=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==f&&h.setAttribute("content",f):Zn(["meta",{name:"description",content:f}]),s(ti(i.head,Pa(c)))})}function Zn([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Ma(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Pa(e){return e.filter(t=>!Ma(t))}const Gn=new Set,si=()=>document.createElement("link"),Ia=e=>{const t=si();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Fa=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let an;const La=Ce&&(an=si())&&an.relList&&an.relList.supports&&an.relList.supports("prefetch")?Ia:Fa;function wu(){if(!Ce||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!Gn.has(c)){Gn.add(c);const a=xa(c);a&&La(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):Gn.add(l))})})};Rt(r);const s=ri();Xe(()=>s.path,r),Nn(()=>{n&&n.disconnect()})}export{_l as $,Nn as A,ja as B,Sl as C,Ta as D,Ka as E,ge as F,Ba as G,Pr as H,pu as I,ie as J,Ua as K,Qo as L,ri as M,tc as N,wt as O,iu as P,lu as Q,mr as R,Rn as S,Do as T,fu as U,Xa as V,On as W,Da as X,ru as Y,au as Z,nu as _,No as a,Ga as a0,Va as a1,Za as a2,Ja as a3,vu as a4,wu as a5,bu as a6,_u as a7,dr as a8,Aa as a9,hu as aa,wa as ab,mu as ac,yu as ad,ft as ae,tu as af,gu as ag,xa as ah,mt as ai,kr as aj,ou as ak,uu as al,cu as am,su as an,Oa as ao,Je as ap,yo as aq,ka as ar,Qa as as,ce as at,qa as au,Lt as av,eu as aw,du as ax,Io as b,za as c,Lr as d,Ya as e,va as f,Ls as g,ae as h,ha as i,Ce as j,oe as k,Rt as l,Lo as m,yr as n,Mo as o,ro as p,$a as q,Wa as r,Ha as s,Na as t,Ea as u,da as v,dl as w,ta as x,Xe as y,Fr as z}; diff --git a/assets/chunks/giscus-a53917f0.pI8Mtuqg.js b/assets/chunks/giscus-a53917f0.pI8Mtuqg.js new file mode 100644 index 000000000..f5e3186a2 --- /dev/null +++ b/assets/chunks/giscus-a53917f0.pI8Mtuqg.js @@ -0,0 +1,72 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const x=window,q=x.ShadowRoot&&(x.ShadyCSS===void 0||x.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,J=Symbol(),F=new WeakMap;let ht=class{constructor(e,t,s){if(this._$cssResult$=!0,s!==J)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o;const t=this.t;if(q&&e===void 0){const s=t!==void 0&&t.length===1;s&&(e=F.get(t)),e===void 0&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),s&&F.set(t,e))}return e}toString(){return this.cssText}};const vt=e=>new ht(typeof e=="string"?e:e+"",void 0,J),_t=(e,...t)=>{const s=e.length===1?e[0]:t.reduce((i,r,n)=>i+(o=>{if(o._$cssResult$===!0)return o.cssText;if(typeof o=="number")return o;throw Error("Value passed to 'css' function must be a 'css' function result: "+o+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(r)+e[n+1],e[0]);return new ht(s,e,J)},$t=(e,t)=>{q?e.adoptedStyleSheets=t.map(s=>s instanceof CSSStyleSheet?s:s.styleSheet):t.forEach(s=>{const i=document.createElement("style"),r=x.litNonce;r!==void 0&&i.setAttribute("nonce",r),i.textContent=s.cssText,e.appendChild(i)})},Q=q?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let s="";for(const i of t.cssRules)s+=i.cssText;return vt(s)})(e):e;/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */var D;const H=window,Z=H.trustedTypes,gt=Z?Z.emptyScript:"",X=H.reactiveElementPolyfillSupport,V={toAttribute(e,t){switch(t){case Boolean:e=e?gt:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let s=e;switch(t){case Boolean:s=e!==null;break;case Number:s=e===null?null:Number(e);break;case Object:case Array:try{s=JSON.parse(e)}catch{s=null}}return s}},at=(e,t)=>t!==e&&(t==t||e==e),Y={attribute:!0,type:String,converter:V,reflect:!1,hasChanged:at};let A=class extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(e){var t;this.finalize(),((t=this.h)!==null&&t!==void 0?t:this.h=[]).push(e)}static get observedAttributes(){this.finalize();const e=[];return this.elementProperties.forEach((t,s)=>{const i=this._$Ep(s,t);i!==void 0&&(this._$Ev.set(i,s),e.push(i))}),e}static createProperty(e,t=Y){if(t.state&&(t.attribute=!1),this.finalize(),this.elementProperties.set(e,t),!t.noAccessor&&!this.prototype.hasOwnProperty(e)){const s=typeof e=="symbol"?Symbol():"__"+e,i=this.getPropertyDescriptor(e,s,t);i!==void 0&&Object.defineProperty(this.prototype,e,i)}}static getPropertyDescriptor(e,t,s){return{get(){return this[t]},set(i){const r=this[e];this[t]=i,this.requestUpdate(e,r,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)||Y}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const e=Object.getPrototypeOf(this);if(e.finalize(),e.h!==void 0&&(this.h=[...e.h]),this.elementProperties=new Map(e.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const t=this.properties,s=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const i of s)this.createProperty(i,t[i])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const s=new Set(e.flat(1/0).reverse());for(const i of s)t.unshift(Q(i))}else e!==void 0&&t.push(Q(e));return t}static _$Ep(e,t){const s=t.attribute;return s===!1?void 0:typeof s=="string"?s:typeof e=="string"?e.toLowerCase():void 0}u(){var e;this._$E_=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$Eg(),this.requestUpdate(),(e=this.constructor.h)===null||e===void 0||e.forEach(t=>t(this))}addController(e){var t,s;((t=this._$ES)!==null&&t!==void 0?t:this._$ES=[]).push(e),this.renderRoot!==void 0&&this.isConnected&&((s=e.hostConnected)===null||s===void 0||s.call(e))}removeController(e){var t;(t=this._$ES)===null||t===void 0||t.splice(this._$ES.indexOf(e)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach((e,t)=>{this.hasOwnProperty(t)&&(this._$Ei.set(t,this[t]),delete this[t])})}createRenderRoot(){var e;const t=(e=this.shadowRoot)!==null&&e!==void 0?e:this.attachShadow(this.constructor.shadowRootOptions);return $t(t,this.constructor.elementStyles),t}connectedCallback(){var e;this.renderRoot===void 0&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),(e=this._$ES)===null||e===void 0||e.forEach(t=>{var s;return(s=t.hostConnected)===null||s===void 0?void 0:s.call(t)})}enableUpdating(e){}disconnectedCallback(){var e;(e=this._$ES)===null||e===void 0||e.forEach(t=>{var s;return(s=t.hostDisconnected)===null||s===void 0?void 0:s.call(t)})}attributeChangedCallback(e,t,s){this._$AK(e,s)}_$EO(e,t,s=Y){var i;const r=this.constructor._$Ep(e,s);if(r!==void 0&&s.reflect===!0){const n=(((i=s.converter)===null||i===void 0?void 0:i.toAttribute)!==void 0?s.converter:V).toAttribute(t,s.type);this._$El=e,n==null?this.removeAttribute(r):this.setAttribute(r,n),this._$El=null}}_$AK(e,t){var s;const i=this.constructor,r=i._$Ev.get(e);if(r!==void 0&&this._$El!==r){const n=i.getPropertyOptions(r),o=typeof n.converter=="function"?{fromAttribute:n.converter}:((s=n.converter)===null||s===void 0?void 0:s.fromAttribute)!==void 0?n.converter:V;this._$El=r,this[r]=o.fromAttribute(t,n.type),this._$El=null}}requestUpdate(e,t,s){let i=!0;e!==void 0&&(((s=s||this.constructor.getPropertyOptions(e)).hasChanged||at)(this[e],t)?(this._$AL.has(e)||this._$AL.set(e,t),s.reflect===!0&&this._$El!==e&&(this._$EC===void 0&&(this._$EC=new Map),this._$EC.set(e,s))):i=!1),!this.isUpdatePending&&i&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(t){Promise.reject(t)}const e=this.scheduleUpdate();return e!=null&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var e;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach((i,r)=>this[r]=i),this._$Ei=void 0);let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),(e=this._$ES)===null||e===void 0||e.forEach(i=>{var r;return(r=i.hostUpdate)===null||r===void 0?void 0:r.call(i)}),this.update(s)):this._$Ek()}catch(i){throw t=!1,this._$Ek(),i}t&&this._$AE(s)}willUpdate(e){}_$AE(e){var t;(t=this._$ES)===null||t===void 0||t.forEach(s=>{var i;return(i=s.hostUpdated)===null||i===void 0?void 0:i.call(s)}),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(e){return!0}update(e){this._$EC!==void 0&&(this._$EC.forEach((t,s)=>this._$EO(s,this[s],t)),this._$EC=void 0),this._$Ek()}updated(e){}firstUpdated(e){}};A.finalized=!0,A.elementProperties=new Map,A.elementStyles=[],A.shadowRootOptions={mode:"open"},X==null||X({ReactiveElement:A}),((D=H.reactiveElementVersions)!==null&&D!==void 0?D:H.reactiveElementVersions=[]).push("1.6.1");/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */var j;const k=window,S=k.trustedTypes,tt=S?S.createPolicy("lit-html",{createHTML:e=>e}):void 0,f=`lit$${(Math.random()+"").slice(9)}$`,ct="?"+f,ft=`<${ct}>`,E=document,T=(e="")=>E.createComment(e),P=e=>e===null||typeof e!="object"&&typeof e!="function",dt=Array.isArray,mt=e=>dt(e)||typeof(e==null?void 0:e[Symbol.iterator])=="function",w=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,et=/-->/g,st=/>/g,m=RegExp(`>|[ +\f\r](?:([^\\s"'>=/]+)([ +\f\r]*=[ +\f\r]*(?:[^ +\f\r"'\`<>=]|("|')|))|$)`,"g"),it=/'/g,rt=/"/g,ut=/^(?:script|style|textarea|title)$/i,At=e=>(t,...s)=>({_$litType$:e,strings:t,values:s}),yt=At(1),b=Symbol.for("lit-noChange"),u=Symbol.for("lit-nothing"),nt=new WeakMap,y=E.createTreeWalker(E,129,null,!1),St=(e,t)=>{const s=e.length-1,i=[];let r,n=t===2?"":"",o=w;for(let l=0;l"?(o=r??w,d=-1):a[1]===void 0?d=-2:(d=o.lastIndex-a[2].length,g=a[1],o=a[3]===void 0?m:a[3]==='"'?rt:it):o===rt||o===it?o=m:o===et||o===st?o=w:(o=m,r=void 0);const R=o===m&&e[l+1].startsWith("/>")?" ":"";n+=o===w?c+ft:d>=0?(i.push(g),c.slice(0,d)+"$lit$"+c.slice(d)+f+R):c+f+(d===-2?(i.push(void 0),l):R)}const h=n+(e[s]||"")+(t===2?"":"");if(!Array.isArray(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return[tt!==void 0?tt.createHTML(h):h,i]};class N{constructor({strings:t,_$litType$:s},i){let r;this.parts=[];let n=0,o=0;const h=t.length-1,l=this.parts,[c,g]=St(t,s);if(this.el=N.createElement(c,i),y.currentNode=this.el.content,s===2){const a=this.el.content,d=a.firstChild;d.remove(),a.append(...d.childNodes)}for(;(r=y.nextNode())!==null&&l.length0){r.textContent=S?S.emptyScript:"";for(let $=0;$2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=u}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(e,t=this,s,i){const r=this.strings;let n=!1;if(r===void 0)e=C(this,e,t,0),n=!P(e)||e!==this._$AH&&e!==b,n&&(this._$AH=e);else{const o=e;let h,l;for(e=r[0],h=0;h{var i,r;const n=(i=s==null?void 0:s.renderBefore)!==null&&i!==void 0?i:t;let o=n._$litPart$;if(o===void 0){const h=(r=s==null?void 0:s.renderBefore)!==null&&r!==void 0?r:null;n._$litPart$=o=new I(t.insertBefore(T(),h),h,void 0,s??{})}return o._$AI(e),o};/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */var B,G;let U=class extends A{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){var e,t;const s=super.createRenderRoot();return(e=(t=this.renderOptions).renderBefore)!==null&&e!==void 0||(t.renderBefore=s.firstChild),s}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=Tt(t,this.renderRoot,this.renderOptions)}connectedCallback(){var e;super.connectedCallback(),(e=this._$Do)===null||e===void 0||e.setConnected(!0)}disconnectedCallback(){var e;super.disconnectedCallback(),(e=this._$Do)===null||e===void 0||e.setConnected(!1)}render(){return b}};U.finalized=!0,U._$litElement$=!0,(B=globalThis.litElementHydrateSupport)===null||B===void 0||B.call(globalThis,{LitElement:U});const lt=globalThis.litElementPolyfillSupport;lt==null||lt({LitElement:U});((G=globalThis.litElementVersions)!==null&&G!==void 0?G:globalThis.litElementVersions=[]).push("3.2.2");/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const Pt=e=>t=>typeof t=="function"?((s,i)=>(customElements.define(s,i),i))(e,t):((s,i)=>{const{kind:r,elements:n}=i;return{kind:r,elements:n,finisher(o){customElements.define(s,o)}}})(e,t);/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const Nt=(e,t)=>t.kind==="method"&&t.descriptor&&!("value"in t.descriptor)?{...t,finisher(s){s.createProperty(t.key,e)}}:{kind:"field",key:Symbol(),placement:"own",descriptor:{},originalKey:t.key,initializer(){typeof t.initializer=="function"&&(this[t.key]=t.initializer.call(this))},finisher(s){s.createProperty(t.key,e)}};function _(e){return(t,s)=>s!==void 0?((i,r,n)=>{r.constructor.createProperty(n,i)})(e,t,s):Nt(e,t)}/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */var W;((W=window.HTMLSlotElement)===null||W===void 0?void 0:W.prototype.assignedElements)!=null;/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const It=e=>e.strings===void 0;/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const Rt={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},Mt=e=>(...t)=>({_$litDirective$:e,values:t});let xt=class{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,s){this._$Ct=e,this._$AM=t,this._$Ci=s}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}};/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const O=(e,t)=>{var s,i;const r=e._$AN;if(r===void 0)return!1;for(const n of r)(i=(s=n)._$AO)===null||i===void 0||i.call(s,t,!1),O(n,t);return!0},L=e=>{let t,s;do{if((t=e._$AM)===void 0)break;s=t._$AN,s.delete(e),e=t}while((s==null?void 0:s.size)===0)},pt=e=>{for(let t;t=e._$AM;e=t){let s=t._$AN;if(s===void 0)t._$AN=s=new Set;else if(s.has(e))break;s.add(e),Lt(t)}};function Ht(e){this._$AN!==void 0?(L(this),this._$AM=e,pt(this)):this._$AM=e}function kt(e,t=!1,s=0){const i=this._$AH,r=this._$AN;if(r!==void 0&&r.size!==0)if(t)if(Array.isArray(i))for(let n=s;n{var t,s,i,r;e.type==Rt.CHILD&&((t=(i=e)._$AP)!==null&&t!==void 0||(i._$AP=kt),(s=(r=e)._$AQ)!==null&&s!==void 0||(r._$AQ=Ht))};class zt extends xt{constructor(){super(...arguments),this._$AN=void 0}_$AT(t,s,i){super._$AT(t,s,i),pt(this),this.isConnected=t._$AU}_$AO(t,s=!0){var i,r;t!==this.isConnected&&(this.isConnected=t,t?(i=this.reconnected)===null||i===void 0||i.call(this):(r=this.disconnected)===null||r===void 0||r.call(this)),s&&(O(this,t),L(this))}setValue(t){if(It(this._$Ct))this._$Ct._$AI(t,this);else{const s=[...this._$Ct._$AH];s[this._$Ci]=t,this._$Ct._$AI(s,this,0)}}disconnected(){}reconnected(){}}/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const Dt=()=>new Yt;class Yt{}const K=new WeakMap,jt=Mt(class extends zt{render(e){return u}update(e,[t]){var s;const i=t!==this.Y;return i&&this.Y!==void 0&&this.rt(void 0),(i||this.lt!==this.ct)&&(this.Y=t,this.dt=(s=e.options)===null||s===void 0?void 0:s.host,this.rt(this.ct=e.element)),u}rt(e){var t;if(typeof this.Y=="function"){const s=(t=this.dt)!==null&&t!==void 0?t:globalThis;let i=K.get(s);i===void 0&&(i=new WeakMap,K.set(s,i)),i.get(this.Y)!==void 0&&this.Y.call(this.dt,void 0),i.set(this.Y,e),e!==void 0&&this.Y.call(this.dt,e)}else this.Y.value=e}get lt(){var e,t,s;return typeof this.Y=="function"?(t=K.get((e=this.dt)!==null&&e!==void 0?e:globalThis))===null||t===void 0?void 0:t.get(this.Y):(s=this.Y)===null||s===void 0?void 0:s.value}disconnected(){this.lt===this.ct&&this.rt(void 0)}reconnected(){this.rt(this.ct)}});var Bt=Object.defineProperty,Gt=Object.getOwnPropertyDescriptor,v=(e,t,s,i)=>{for(var r=i>1?void 0:i?Gt(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(r=(i?o(t,s,r):o(r))||r);return i&&r&&Bt(t,s,r),r};let p=class extends U{constructor(){super(),this.GISCUS_SESSION_KEY="giscus-session",this.GISCUS_DEFAULT_HOST="https://giscus.app",this.ERROR_SUGGESTION="Please consider reporting this error at https://github.com/giscus/giscus/issues/new.",this.__session="",this._iframeRef=Dt(),this.messageEventHandler=this.handleMessageEvent.bind(this),this.hasLoaded=!1,this.host=this.GISCUS_DEFAULT_HOST,this.strict="0",this.reactionsEnabled="1",this.emitMetadata="0",this.inputPosition="bottom",this.theme="light",this.lang="en",this.loading="eager",this.setupSession(),window.addEventListener("message",this.messageEventHandler)}get iframeRef(){var e;return(e=this._iframeRef)==null?void 0:e.value}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener("message",this.messageEventHandler)}_formatError(e){return`[giscus] An error occurred. Error message: "${e}".`}setupSession(){const e=location.href,t=new URL(e),s=localStorage.getItem(this.GISCUS_SESSION_KEY),i=t.searchParams.get("giscus")||"";if(this.__session="",i){localStorage.setItem(this.GISCUS_SESSION_KEY,JSON.stringify(i)),this.__session=i,t.searchParams.delete("giscus"),t.hash="",history.replaceState(void 0,document.title,t.toString());return}if(s)try{this.__session=JSON.parse(s)}catch(r){localStorage.removeItem(this.GISCUS_SESSION_KEY),console.warn(`${this._formatError(r==null?void 0:r.message)} Session has been cleared.`)}}signOut(){localStorage.removeItem(this.GISCUS_SESSION_KEY),this.__session="",this.update(new Map)}handleMessageEvent(e){if(e.origin!==this.host)return;const{data:t}=e;if(!(typeof t=="object"&&t.giscus))return;if(this.iframeRef&&t.giscus.resizeHeight&&(this.iframeRef.style.height=`${t.giscus.resizeHeight}px`),t.giscus.signOut){console.log("[giscus] User has logged out. Session has been cleared."),this.signOut();return}if(!t.giscus.error)return;const s=t.giscus.error;if(s.includes("Bad credentials")||s.includes("Invalid state value")||s.includes("State has expired")){if(localStorage.getItem(this.GISCUS_SESSION_KEY)!==null){console.warn(`${this._formatError(s)} Session has been cleared.`),this.signOut();return}console.error(`${this._formatError(s)} No session is stored initially. ${this.ERROR_SUGGESTION}`)}if(s.includes("Discussion not found")){console.warn(`[giscus] ${s}. A new discussion will be created if a comment/reaction is submitted.`);return}console.error(`${this._formatError(s)} ${this.ERROR_SUGGESTION}`)}sendMessage(e){!this.iframeRef||!this.iframeRef.contentWindow||!this.hasLoaded||this.iframeRef.contentWindow.postMessage({giscus:e},this.host)}updateConfig(){const e={setConfig:{repo:this.repo,repoId:this.repoId,category:this.category,categoryId:this.categoryId,term:this.getTerm(),number:+this.getNumber(),strict:this.strict==="1",reactionsEnabled:this.reactionsEnabled==="1",emitMetadata:this.emitMetadata==="1",inputPosition:this.inputPosition,theme:this.theme,lang:this.lang}};this.sendMessage(e)}firstUpdated(){var e;(e=this.iframeRef)==null||e.addEventListener("load",()=>{var t;(t=this.iframeRef)==null||t.classList.remove("loading"),this.hasLoaded=!0,this.updateConfig()})}requestUpdate(e,t,s){if(!this.hasUpdated||e==="host"){super.requestUpdate(e,t,s);return}this.updateConfig()}getMetaContent(e,t=!1){const s=t?`meta[property='og:${e}'],`:"",i=document.querySelector(s+`meta[name='${e}']`);return i?i.content:""}_getCleanedUrl(){const e=new URL(location.href);return e.searchParams.delete("giscus"),e.hash="",e}getTerm(){switch(this.mapping){case"url":return`${this._getCleanedUrl()}`;case"title":return document.title;case"og:title":return this.getMetaContent("title",!0);case"specific":return this.term||"";case"number":return"";case"pathname":default:return location.pathname.length<2?"index":location.pathname.substring(1).replace(/\.\w+$/,"")}}getNumber(){return this.mapping==="number"&&this.term||""}getIframeSrc(){const e=this._getCleanedUrl().toString(),t=`${e}${this.id?"#"+this.id:""}`,s=this.getMetaContent("description",!0),i=this.getMetaContent("giscus:backlink")||e,r={origin:t,session:this.__session,repo:this.repo,repoId:this.repoId||"",category:this.category||"",categoryId:this.categoryId||"",term:this.getTerm(),number:this.getNumber(),strict:this.strict,reactionsEnabled:this.reactionsEnabled,emitMetadata:this.emitMetadata,inputPosition:this.inputPosition,theme:this.theme,description:s,backLink:i},n=this.host||this.GISCUS_DEFAULT_HOST,o=this.lang?`/${this.lang}`:"",h=new URLSearchParams(r);return`${n}${o}/widget?${h}`}render(){return yt` + + `}};p.styles=_t` + :host, + iframe { + width: 100%; + border: none; + min-height: 150px; + color-scheme: light dark; + } + + iframe.loading { + opacity: 0; + } + `;v([_({reflect:!0})],p.prototype,"host",2);v([_({reflect:!0})],p.prototype,"repo",2);v([_({reflect:!0})],p.prototype,"repoId",2);v([_({reflect:!0})],p.prototype,"category",2);v([_({reflect:!0})],p.prototype,"categoryId",2);v([_({reflect:!0})],p.prototype,"mapping",2);v([_({reflect:!0})],p.prototype,"term",2);v([_({reflect:!0})],p.prototype,"strict",2);v([_({reflect:!0})],p.prototype,"reactionsEnabled",2);v([_({reflect:!0})],p.prototype,"emitMetadata",2);v([_({reflect:!0})],p.prototype,"inputPosition",2);v([_({reflect:!0})],p.prototype,"theme",2);v([_({reflect:!0})],p.prototype,"lang",2);v([_({reflect:!0})],p.prototype,"loading",2);p=v([Pt("giscus-widget")],p);export{p as GiscusWidget}; diff --git a/assets/chunks/theme.qcSYzAJN.js b/assets/chunks/theme.qcSYzAJN.js new file mode 100644 index 000000000..d08fe0cc8 --- /dev/null +++ b/assets/chunks/theme.qcSYzAJN.js @@ -0,0 +1,7 @@ +import{d as g,o,c,r as v,n as I,a as H,t as L,b as k,w as m,T as _e,e as f,_ as b,u as Re,i as We,f as Xe,g as pe,h as P,j as Y,k as y,l as z,m as r,p as l,q as j,s as U,v as X,x as de,y as q,z as te,A as ne,B as xe,C as qe,D as Ke,F as T,E as B,G as K,H as Ve,I as se,J as _,K as W,L as Le,M as ae,N as J,O as oe,P as Ye,Q as ve,R as Ze,S as Je,U as Se,V as Me,W as Qe,X as et,Y as Ce,Z as Te,$ as Ie,a0 as tt,a1 as nt,a2 as st,a3 as at}from"./framework.SV1ROkXV.js";const ot=g({__name:"VPBadge",props:{text:null,type:{default:"tip"}},setup(e){return(t,n)=>(o(),c("span",{class:I(["VPBadge",e.type])},[v(t.$slots,"default",{},()=>[H(L(e.text),1)])],2))}}),lt={key:0,class:"VPBackdrop"},it=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(o(),k(_e,{name:"fade"},{default:m(()=>[e.show?(o(),c("div",lt)):f("",!0)]),_:1}))}}),ct=b(it,[["__scopeId","data-v-2d7eccd3"]]),M=Re;function rt(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),(s=!0)&&setTimeout(()=>s=!1,t))}}function he(e){return/^\//.test(e)?e:`/${e}`}function ge(e){const{pathname:t,search:n,hash:s,protocol:a}=new URL(e,"http://a.com");if(We(e)||e.startsWith("#")||!a.startsWith("http")||!Xe(t))return e;const{site:i}=M(),u=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${n}${s}`);return pe(u)}const be=P(Y?location.hash:"");Y&&window.addEventListener("hashchange",()=>{be.value=location.hash});function Z({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:n,localeIndex:s,page:a,theme:i}=M(),u=y(()=>{var d,p;return{label:(d=n.value.locales[s.value])==null?void 0:d.label,link:((p=n.value.locales[s.value])==null?void 0:p.link)||(s.value==="root"?"/":`/${s.value}/`)}});return{localeLinks:y(()=>Object.entries(n.value.locales).flatMap(([d,p])=>e&&u.value.label===p.label?[]:{text:p.label,link:ut(p.link||(d==="root"?"/":`/${d}/`),i.value.i18nRouting!==!1&&t,a.value.relativePath.slice(u.value.link.length-1),!n.value.cleanUrls)+be.value})),currentLang:u}}function ut(e,t,n,s){return t?e.replace(/\/$/,"")+he(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):e}const dt=e=>(j("data-v-8082fff6"),e=e(),U(),e),vt={class:"NotFound"},ht={class:"code"},mt={class:"title"},ft=dt(()=>r("div",{class:"divider"},null,-1)),_t={class:"quote"},pt={class:"action"},gt=["href","aria-label"],bt=g({__name:"NotFound",setup(e){const{site:t,theme:n}=M(),{localeLinks:s}=Z({removeCurrent:!1}),a=P("/");return z(()=>{var u;const i=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");s.value.length&&(a.value=((u=s.value.find(({link:h})=>h.startsWith(i)))==null?void 0:u.link)||s.value[0].link)}),(i,u)=>{var h,d,p,x,$;return o(),c("div",vt,[r("p",ht,L(((h=l(n).notFound)==null?void 0:h.code)??"404"),1),r("h1",mt,L(((d=l(n).notFound)==null?void 0:d.title)??"PAGE NOT FOUND"),1),ft,r("blockquote",_t,L(((p=l(n).notFound)==null?void 0:p.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),r("div",pt,[r("a",{class:"link",href:l(pe)(a.value),"aria-label":((x=l(n).notFound)==null?void 0:x.linkLabel)??"go to home"},L((($=l(n).notFound)==null?void 0:$.linkText)??"Take me home"),9,gt)])])}}}),kt=b(bt,[["__scopeId","data-v-8082fff6"]]);function Ae(e,t){if(Array.isArray(e))return Q(e);if(e==null)return[];t=he(t);const n=Object.keys(e).sort((a,i)=>i.split("/").length-a.split("/").length).find(a=>t.startsWith(he(a))),s=n?e[n]:[];return Array.isArray(s)?Q(s):Q(s.items,s.base)}function $t(e){const t=[];let n=0;for(const s in e){const a=e[s];if(a.items){n=t.push(a);continue}t[n]||t.push({items:[]}),t[n].items.push(a)}return t}function yt(e){const t=[];function n(s){for(const a of s)a.text&&a.link&&t.push({text:a.text,link:a.link,docFooterText:a.docFooterText}),a.items&&n(a.items)}return n(e),t}function me(e,t){return Array.isArray(t)?t.some(n=>me(e,n)):X(e,t.link)?!0:t.items?me(e,t.items):!1}function Q(e,t){return[...e].map(n=>{const s={...n},a=s.base||t;return a&&s.link&&(s.link=a+s.link),s.items&&(s.items=Q(s.items,a)),s})}function G(){const{frontmatter:e,page:t,theme:n}=M(),s=de("(min-width: 960px)"),a=P(!1),i=y(()=>{const V=n.value.sidebar,A=t.value.relativePath;return V?Ae(V,A):[]}),u=P(i.value);q(i,(V,A)=>{JSON.stringify(V)!==JSON.stringify(A)&&(u.value=i.value)});const h=y(()=>e.value.sidebar!==!1&&u.value.length>0&&e.value.layout!=="home"),d=y(()=>p?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),p=y(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),x=y(()=>h.value&&s.value),$=y(()=>h.value?$t(u.value):[]);function S(){a.value=!0}function C(){a.value=!1}function w(){a.value?C():S()}return{isOpen:a,sidebar:u,sidebarGroups:$,hasSidebar:h,hasAside:p,leftAside:d,isSidebarEnabled:x,open:S,close:C,toggle:w}}function wt(e,t){let n;te(()=>{n=e.value?document.activeElement:void 0}),z(()=>{window.addEventListener("keyup",s)}),ne(()=>{window.removeEventListener("keyup",s)});function s(a){a.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function Pt(e){const{page:t}=M(),n=P(!1),s=y(()=>e.value.collapsed!=null),a=y(()=>!!e.value.link),i=P(!1),u=()=>{i.value=X(t.value.relativePath,e.value.link)};q([t,e,be],u),z(u);const h=y(()=>i.value?!0:e.value.items?me(t.value.relativePath,e.value.items):!1),d=y(()=>!!(e.value.items&&e.value.items.length));te(()=>{n.value=!!(s.value&&e.value.collapsed)}),xe(()=>{(i.value||h.value)&&(n.value=!1)});function p(){s.value&&(n.value=!n.value)}return{collapsed:n,collapsible:s,isLink:a,isActiveLink:i,hasActiveLink:h,hasChildren:d,toggle:p}}function xt(){const{hasSidebar:e}=G(),t=de("(min-width: 960px)"),n=de("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const fe=[];function Ne(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function ke(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const s=Number(n.tagName[1]);return{element:n,title:Vt(n),link:"#"+n.id,level:s}});return Lt(t,e)}function Vt(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor")||n.classList.contains("ignore-header"))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function Lt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[s,a]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;e=e.filter(u=>u.level>=s&&u.level<=a),fe.length=0;for(const{element:u,link:h}of e)fe.push({element:u,link:h});const i=[];e:for(let u=0;u=0;d--){const p=e[d];if(p.level{requestAnimationFrame(i),window.addEventListener("scroll",s)}),qe(()=>{u(location.hash)}),ne(()=>{window.removeEventListener("scroll",s)});function i(){if(!n.value)return;const h=window.scrollY,d=window.innerHeight,p=document.body.offsetHeight,x=Math.abs(h+d-p)<1,$=fe.map(({element:C,link:w})=>({link:w,top:Mt(C)})).filter(({top:C})=>!Number.isNaN(C)).sort((C,w)=>C.top-w.top);if(!$.length){u(null);return}if(h<1){u(null);return}if(x){u($[$.length-1].link);return}let S=null;for(const{link:C,top:w}of $){if(w>h+Ke()+4)break;S=C}u(S)}function u(h){a&&a.classList.remove("active"),h==null?a=null:a=e.value.querySelector(`a[href="${decodeURIComponent(h)}"]`);const d=a;d?(d.classList.add("active"),t.value.style.top=d.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function Mt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}const Ct=["href","title"],Tt=g({__name:"VPDocOutlineItem",props:{headers:null,root:{type:Boolean}},setup(e){function t({target:n}){const s=n.href.split("#")[1],a=document.getElementById(decodeURIComponent(s));a==null||a.focus({preventScroll:!0})}return(n,s)=>{const a=K("VPDocOutlineItem",!0);return o(),c("ul",{class:I(["VPDocOutlineItem",e.root?"root":"nested"])},[(o(!0),c(T,null,B(e.headers,({children:i,link:u,title:h})=>(o(),c("li",null,[r("a",{class:"outline-link",href:u,onClick:t,title:h},L(h),9,Ct),i!=null&&i.length?(o(),k(a,{key:0,headers:i},null,8,["headers"])):f("",!0)]))),256))],2)}}}),Be=b(Tt,[["__scopeId","data-v-20500810"]]),It=e=>(j("data-v-ea307b6d"),e=e(),U(),e),At={class:"content"},Nt={class:"outline-title",role:"heading","aria-level":"2"},Bt={"aria-labelledby":"doc-outline-aria-label"},Ht=It(()=>r("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),zt=g({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=M(),s=Ve([]);se(()=>{s.value=ke(t.value.outline??n.value.outline)});const a=P(),i=P();return St(a,i),(u,h)=>(o(),c("div",{class:I(["VPDocAsideOutline",{"has-outline":l(s).length>0}]),ref_key:"container",ref:a,role:"navigation"},[r("div",At,[r("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),r("div",Nt,L(l(Ne)(l(n))),1),r("nav",Bt,[Ht,_(Be,{headers:l(s),root:!0},null,8,["headers"])])])],2))}}),Et=b(zt,[["__scopeId","data-v-ea307b6d"]]),Dt={class:"VPDocAsideCarbonAds"},Ft=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:null},setup(e){const t=()=>null;return(n,s)=>(o(),c("div",Dt,[_(l(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Ot=e=>(j("data-v-bb0b59e9"),e=e(),U(),e),jt={class:"VPDocAside"},Ut=Ot(()=>r("div",{class:"spacer"},null,-1)),Gt=g({__name:"VPDocAside",setup(e){const{theme:t}=M();return(n,s)=>(o(),c("div",jt,[v(n.$slots,"aside-top",{},void 0,!0),v(n.$slots,"aside-outline-before",{},void 0,!0),_(Et),v(n.$slots,"aside-outline-after",{},void 0,!0),Ut,v(n.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(o(),k(Ft,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):f("",!0),v(n.$slots,"aside-ads-after",{},void 0,!0),v(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Rt=b(Gt,[["__scopeId","data-v-bb0b59e9"]]);function Wt(){const{theme:e,page:t}=M();return y(()=>{const{text:n="Edit this page",pattern:s=""}=e.value.editLink||{};let a;return typeof s=="function"?a=s(t.value):a=s.replace(/:path/g,t.value.filePath),{url:a,text:n}})}function Xt(){const{page:e,theme:t,frontmatter:n}=M();return y(()=>{var d,p,x,$,S,C,w,V;const s=Ae(t.value.sidebar,e.value.relativePath),a=yt(s),i=a.findIndex(A=>X(e.value.relativePath,A.link)),u=((d=t.value.docFooter)==null?void 0:d.prev)===!1&&!n.value.prev||n.value.prev===!1,h=((p=t.value.docFooter)==null?void 0:p.next)===!1&&!n.value.next||n.value.next===!1;return{prev:u?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((x=a[i-1])==null?void 0:x.docFooterText)??(($=a[i-1])==null?void 0:$.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((S=a[i-1])==null?void 0:S.link)},next:h?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((C=a[i+1])==null?void 0:C.docFooterText)??((w=a[i+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((V=a[i+1])==null?void 0:V.link)}}})}const qt={},Kt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Yt=r("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Zt=r("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Jt=[Yt,Zt];function Qt(e,t){return o(),c("svg",Kt,Jt)}const en=b(qt,[["render",Qt]]),E=g({__name:"VPLink",props:{tag:null,href:null,noIcon:{type:Boolean},target:null,rel:null},setup(e){const t=e,n=y(()=>t.tag??(t.href?"a":"span")),s=y(()=>t.href&&Le.test(t.href));return(a,i)=>(o(),k(W(l(n)),{class:I(["VPLink",{link:e.href,"vp-external-link-icon":l(s),"no-icon":e.noIcon}]),href:e.href?l(ge)(e.href):void 0,target:e.target??(l(s)?"_blank":void 0),rel:e.rel??(l(s)?"noreferrer":void 0)},{default:m(()=>[v(a.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),tn={class:"VPLastUpdated"},nn=["datetime"],sn=g({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,frontmatter:s,lang:a}=M(),i=y(()=>new Date(s.value.lastUpdated??n.value.lastUpdated)),u=y(()=>i.value.toISOString()),h=P("");return z(()=>{te(()=>{var d,p,x;h.value=new Intl.DateTimeFormat((p=(d=t.value.lastUpdated)==null?void 0:d.formatOptions)!=null&&p.forceLocale?a.value:void 0,((x=t.value.lastUpdated)==null?void 0:x.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(i.value)})}),(d,p)=>{var x;return o(),c("p",tn,[H(L(((x=l(t).lastUpdated)==null?void 0:x.text)||l(t).lastUpdatedText||"Last updated")+": ",1),r("time",{datetime:l(u)},L(h.value),9,nn)])}}}),an=b(sn,[["__scopeId","data-v-86563300"]]),on={key:0,class:"VPDocFooter"},ln={key:0,class:"edit-info"},cn={key:0,class:"edit-link"},rn={key:1,class:"last-updated"},un={key:1,class:"prev-next"},dn={class:"pager"},vn=["innerHTML"],hn=["innerHTML"],mn={class:"pager"},fn=["innerHTML"],_n=["innerHTML"],pn=g({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:s}=M(),a=Wt(),i=Xt(),u=y(()=>t.value.editLink&&s.value.editLink!==!1),h=y(()=>n.value.lastUpdated&&s.value.lastUpdated!==!1),d=y(()=>u.value||h.value||i.value.prev||i.value.next);return(p,x)=>{var $,S,C,w;return l(d)?(o(),c("footer",on,[v(p.$slots,"doc-footer-before",{},void 0,!0),l(u)||l(h)?(o(),c("div",ln,[l(u)?(o(),c("div",cn,[_(E,{class:"edit-link-button",href:l(a).url,"no-icon":!0},{default:m(()=>[_(en,{class:"edit-link-icon","aria-label":"edit icon"}),H(" "+L(l(a).text),1)]),_:1},8,["href"])])):f("",!0),l(h)?(o(),c("div",rn,[_(an)])):f("",!0)])):f("",!0),($=l(i).prev)!=null&&$.link||(S=l(i).next)!=null&&S.link?(o(),c("nav",un,[r("div",dn,[(C=l(i).prev)!=null&&C.link?(o(),k(E,{key:0,class:"pager-link prev",href:l(i).prev.link},{default:m(()=>{var V;return[r("span",{class:"desc",innerHTML:((V=l(t).docFooter)==null?void 0:V.prev)||"Previous page"},null,8,vn),r("span",{class:"title",innerHTML:l(i).prev.text},null,8,hn)]}),_:1},8,["href"])):f("",!0)]),r("div",mn,[(w=l(i).next)!=null&&w.link?(o(),k(E,{key:0,class:"pager-link next",href:l(i).next.link},{default:m(()=>{var V;return[r("span",{class:"desc",innerHTML:((V=l(t).docFooter)==null?void 0:V.next)||"Next page"},null,8,fn),r("span",{class:"title",innerHTML:l(i).next.text},null,8,_n)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),gn=b(pn,[["__scopeId","data-v-a4d10c8e"]]),bn=e=>(j("data-v-fb80de84"),e=e(),U(),e),kn={class:"container"},$n=bn(()=>r("div",{class:"aside-curtain"},null,-1)),yn={class:"aside-container"},wn={class:"aside-content"},Pn={class:"content"},xn={class:"content-container"},Vn={class:"main"},Ln=g({__name:"VPDoc",setup(e){const{theme:t}=M(),n=ae(),{hasSidebar:s,hasAside:a,leftAside:i}=G(),u=y(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(h,d)=>{const p=K("Content");return o(),c("div",{class:I(["VPDoc",{"has-sidebar":l(s),"has-aside":l(a)}])},[v(h.$slots,"doc-top",{},void 0,!0),r("div",kn,[l(a)?(o(),c("div",{key:0,class:I(["aside",{"left-aside":l(i)}])},[$n,r("div",yn,[r("div",wn,[_(Rt,null,{"aside-top":m(()=>[v(h.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":m(()=>[v(h.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":m(()=>[v(h.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[v(h.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[v(h.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[v(h.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),r("div",Pn,[r("div",xn,[v(h.$slots,"doc-before",{},void 0,!0),r("main",Vn,[_(p,{class:I(["vp-doc",[l(u),l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(gn,null,{"doc-footer-before":m(()=>[v(h.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),v(h.$slots,"doc-after",{},void 0,!0)])])]),v(h.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Sn=b(Ln,[["__scopeId","data-v-fb80de84"]]),Mn=g({__name:"VPButton",props:{tag:null,size:{default:"medium"},theme:{default:"brand"},text:null,href:null},setup(e){const t=e,n=y(()=>t.href&&Le.test(t.href)),s=y(()=>t.tag||t.href?"a":"button");return(a,i)=>(o(),k(W(l(s)),{class:I(["VPButton",[e.size,e.theme]]),href:e.href?l(ge)(e.href):void 0,target:l(n)?"_blank":void 0,rel:l(n)?"noreferrer":void 0},{default:m(()=>[H(L(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),Cn=b(Mn,[["__scopeId","data-v-6acbc606"]]),Tn=["src","alt"],In=g({__name:"VPImage",props:{image:null,alt:null},setup(e){return defineOptions({inheritAttrs:!1}),(t,n)=>{const s=K("VPImage",!0);return e.image?(o(),c(T,{key:0},[typeof e.image=="string"||"src"in e.image?(o(),c("img",J({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:l(pe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Tn)):(o(),c(T,{key:1},[_(s,J({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),_(s,J({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),ee=b(In,[["__scopeId","data-v-847c6a0a"]]),An=e=>(j("data-v-4f01d72c"),e=e(),U(),e),Nn={class:"container"},Bn={class:"main"},Hn={key:0,class:"name"},zn=["innerHTML"],En=["innerHTML"],Dn=["innerHTML"],Fn={key:0,class:"actions"},On={key:0,class:"image"},jn={class:"image-container"},Un=An(()=>r("div",{class:"image-bg"},null,-1)),Gn=g({__name:"VPHero",props:{name:null,text:null,tagline:null,image:null,actions:null},setup(e){const t=oe("hero-image-slot-exists");return(n,s)=>(o(),c("div",{class:I(["VPHero",{"has-image":e.image||l(t)}])},[r("div",Nn,[r("div",Bn,[v(n.$slots,"home-hero-info",{},()=>[e.name?(o(),c("h1",Hn,[r("span",{innerHTML:e.name,class:"clip"},null,8,zn)])):f("",!0),e.text?(o(),c("p",{key:1,innerHTML:e.text,class:"text"},null,8,En)):f("",!0),e.tagline?(o(),c("p",{key:2,innerHTML:e.tagline,class:"tagline"},null,8,Dn)):f("",!0)],!0),e.actions?(o(),c("div",Fn,[(o(!0),c(T,null,B(e.actions,a=>(o(),c("div",{key:a.link,class:"action"},[_(Cn,{tag:"a",size:"medium",theme:a.theme,text:a.text,href:a.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),e.image||l(t)?(o(),c("div",On,[r("div",jn,[Un,v(n.$slots,"home-hero-image",{},()=>[e.image?(o(),k(ee,{key:0,class:"image-src",image:e.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),Rn=b(Gn,[["__scopeId","data-v-4f01d72c"]]),Wn=g({__name:"VPHomeHero",setup(e){const{frontmatter:t}=M();return(n,s)=>l(t).hero?(o(),k(Rn,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info":m(()=>[v(n.$slots,"home-hero-info")]),"home-hero-image":m(()=>[v(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Xn={},qn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Kn=r("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Yn=[Kn];function Zn(e,t){return o(),c("svg",qn,Yn)}const Jn=b(Xn,[["render",Zn]]),Qn={class:"box"},es={key:0,class:"icon"},ts=["innerHTML"],ns=["innerHTML"],ss=["innerHTML"],as={key:4,class:"link-text"},os={class:"link-text-value"},ls=g({__name:"VPFeature",props:{icon:null,title:null,details:null,link:null,linkText:null,rel:null,target:null},setup(e){return(t,n)=>(o(),k(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:m(()=>[r("article",Qn,[typeof e.icon=="object"&&e.icon.wrap?(o(),c("div",es,[_(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(o(),k(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(o(),c("div",{key:2,class:"icon",innerHTML:e.icon},null,8,ts)):f("",!0),r("h2",{class:"title",innerHTML:e.title},null,8,ns),e.details?(o(),c("p",{key:3,class:"details",innerHTML:e.details},null,8,ss)):f("",!0),e.linkText?(o(),c("div",as,[r("p",os,[H(L(e.linkText)+" ",1),_(Jn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),is=b(ls,[["__scopeId","data-v-f85754f7"]]),cs={key:0,class:"VPFeatures"},rs={class:"container"},us={class:"items"},ds=g({__name:"VPFeatures",props:{features:null},setup(e){const t=e,n=y(()=>{const s=t.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,a)=>e.features?(o(),c("div",cs,[r("div",rs,[r("div",us,[(o(!0),c(T,null,B(e.features,i=>(o(),c("div",{key:i.title,class:I(["item",[l(n)]])},[_(is,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}}),vs=b(ds,[["__scopeId","data-v-4035c07a"]]),hs=g({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=M();return(n,s)=>l(t).features?(o(),k(vs,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):f("",!0)}}),ms={class:"VPHome"},fs=g({__name:"VPHome",setup(e){return(t,n)=>{const s=K("Content");return o(),c("div",ms,[v(t.$slots,"home-hero-before",{},void 0,!0),_(Wn,null,{"home-hero-info":m(()=>[v(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":m(()=>[v(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),v(t.$slots,"home-hero-after",{},void 0,!0),v(t.$slots,"home-features-before",{},void 0,!0),_(hs),v(t.$slots,"home-features-after",{},void 0,!0),_(s)])}}}),_s=b(fs,[["__scopeId","data-v-8d491dd9"]]),ps={},gs={class:"VPPage"};function bs(e,t){const n=K("Content");return o(),c("div",gs,[v(e.$slots,"page-top"),_(n),v(e.$slots,"page-bottom")])}const ks=b(ps,[["render",bs]]),$s=g({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=M(),{hasSidebar:s}=G();return(a,i)=>(o(),c("div",{class:I(["VPContent",{"has-sidebar":l(s),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?v(a.$slots,"not-found",{key:0},()=>[_(kt)],!0):l(n).layout==="page"?(o(),k(ks,{key:1},{"page-top":m(()=>[v(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":m(()=>[v(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(o(),k(_s,{key:2},{"home-hero-before":m(()=>[v(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":m(()=>[v(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":m(()=>[v(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":m(()=>[v(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":m(()=>[v(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":m(()=>[v(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(n).layout&&l(n).layout!=="doc"?(o(),k(W(l(n).layout),{key:3})):(o(),k(Sn,{key:4},{"doc-top":m(()=>[v(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":m(()=>[v(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":m(()=>[v(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":m(()=>[v(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":m(()=>[v(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":m(()=>[v(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":m(()=>[v(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[v(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[v(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[v(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":m(()=>[v(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ys=b($s,[["__scopeId","data-v-5a285343"]]),ws={class:"container"},Ps=["innerHTML"],xs=["innerHTML"],Vs=g({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=M(),{hasSidebar:s}=G();return(a,i)=>l(t).footer&&l(n).footer!==!1?(o(),c("footer",{key:0,class:I(["VPFooter",{"has-sidebar":l(s)}])},[r("div",ws,[l(t).footer.message?(o(),c("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,Ps)):f("",!0),l(t).footer.copyright?(o(),c("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,xs)):f("",!0)])],2)):f("",!0)}}),Ls=b(Vs,[["__scopeId","data-v-e09097b5"]]);function He(){const{theme:e,frontmatter:t}=M(),n=Ve([]),s=y(()=>n.value.length>0);return se(()=>{n.value=ke(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:s}}const Ss={},Ms={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Cs=r("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),Ts=[Cs];function Is(e,t){return o(),c("svg",Ms,Ts)}const ze=b(Ss,[["render",Is]]),As={class:"header"},Ns={class:"outline"},Bs=g({__name:"VPLocalNavOutlineDropdown",props:{headers:null,navHeight:null},setup(e){const t=e,{theme:n}=M(),s=P(!1),a=P(0),i=P(),u=P();Ye(i,()=>{s.value=!1}),ve("Escape",()=>{s.value=!1}),se(()=>{s.value=!1});function h(){s.value=!s.value,a.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function d(x){x.target.classList.contains("outline-link")&&(u.value&&(u.value.style.transition="none"),Je(()=>{s.value=!1}))}function p(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(x,$)=>(o(),c("div",{class:"VPLocalNavOutlineDropdown",style:Ze({"--vp-vh":a.value+"px"}),ref_key:"main",ref:i},[e.headers.length>0?(o(),c("button",{key:0,onClick:h,class:I({open:s.value})},[H(L(l(Ne)(l(n)))+" ",1),_(ze,{class:"icon"})],2)):(o(),c("button",{key:1,onClick:p},L(l(n).returnToTopLabel||"Return to top"),1)),_(_e,{name:"flyout"},{default:m(()=>[s.value?(o(),c("div",{key:0,ref_key:"items",ref:u,class:"items",onClick:d},[r("div",As,[r("a",{class:"top-link",href:"#",onClick:p},L(l(n).returnToTopLabel||"Return to top"),1)]),r("div",Ns,[_(Be,{headers:e.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),Hs=b(Bs,[["__scopeId","data-v-ba90ba94"]]),zs={},Es={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ds=r("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Fs=r("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Os=r("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),js=r("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Us=[Ds,Fs,Os,js];function Gs(e,t){return o(),c("svg",Es,Us)}const Rs=b(zs,[["render",Gs]]),Ws={class:"container"},Xs=["aria-expanded"],qs={class:"menu-text"},Ks=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=M(),{hasSidebar:s}=G(),{headers:a}=He(),{y:i}=Se(),u=P(0);z(()=>{u.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),se(()=>{a.value=ke(n.value.outline??t.value.outline)});const h=y(()=>a.value.length===0),d=y(()=>h.value&&!s.value),p=y(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:h.value,fixed:d.value}));return(x,$)=>l(n).layout!=="home"&&(!l(d)||l(i)>=u.value)?(o(),c("div",{key:0,class:I(l(p))},[r("div",Ws,[l(s)?(o(),c("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:$[0]||($[0]=S=>x.$emit("open-menu"))},[_(Rs,{class:"menu-icon"}),r("span",qs,L(l(t).sidebarMenuLabel||"Menu"),1)],8,Xs)):f("",!0),_(Hs,{headers:l(a),navHeight:u.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Ys=b(Ks,[["__scopeId","data-v-2ebb1e0d"]]);function Zs(){const e=P(!1);function t(){e.value=!0,window.addEventListener("resize",a)}function n(){e.value=!1,window.removeEventListener("resize",a)}function s(){e.value?n():t()}function a(){window.outerWidth>=768&&n()}const i=ae();return q(()=>i.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}const Js={},Qs={class:"VPSwitch",type:"button",role:"switch"},ea={class:"check"},ta={key:0,class:"icon"};function na(e,t){return o(),c("button",Qs,[r("span",ea,[e.$slots.default?(o(),c("span",ta,[v(e.$slots,"default",{},void 0,!0)])):f("",!0)])])}const sa=b(Js,[["render",na],["__scopeId","data-v-0438efbe"]]),aa={},oa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},la=r("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),ia=[la];function ca(e,t){return o(),c("svg",oa,ia)}const ra=b(aa,[["render",ca]]),ua={},da={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},va=Me('',9),ha=[va];function ma(e,t){return o(),c("svg",da,ha)}const fa=b(ua,[["render",ma]]),_a=g({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=M(),s=oe("toggle-appearance",()=>{t.value=!t.value}),a=y(()=>t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme");return(i,u)=>(o(),k(sa,{title:l(a),class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(s)},{default:m(()=>[_(fa,{class:"sun"}),_(ra,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),$e=b(_a,[["__scopeId","data-v-62e667eb"]]),pa={key:0,class:"VPNavBarAppearance"},ga=g({__name:"VPNavBarAppearance",setup(e){const{site:t}=M();return(n,s)=>l(t).appearance&&l(t).appearance!=="force-dark"?(o(),c("div",pa,[_($e)])):f("",!0)}}),ba=b(ga,[["__scopeId","data-v-3bd0ddce"]]),ye=P();let Ee=!1,re=0;function ka(e){const t=P(!1);if(Y){!Ee&&$a(),re++;const n=q(ye,s=>{var a,i,u;s===e.el.value||(a=e.el.value)!=null&&a.contains(s)?(t.value=!0,(i=e.onFocus)==null||i.call(e)):(t.value=!1,(u=e.onBlur)==null||u.call(e))});ne(()=>{n(),re--,re||ya()})}return Qe(t)}function $a(){document.addEventListener("focusin",De),Ee=!0,ye.value=document.activeElement}function ya(){document.removeEventListener("focusin",De)}function De(){ye.value=document.activeElement}const wa={},Pa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},xa=r("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Va=[xa];function La(e,t){return o(),c("svg",Pa,Va)}const Fe=b(wa,[["render",La]]),Sa={},Ma={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ca=r("circle",{cx:"12",cy:"12",r:"2"},null,-1),Ta=r("circle",{cx:"19",cy:"12",r:"2"},null,-1),Ia=r("circle",{cx:"5",cy:"12",r:"2"},null,-1),Aa=[Ca,Ta,Ia];function Na(e,t){return o(),c("svg",Ma,Aa)}const Ba=b(Sa,[["render",Na]]),Ha={class:"VPMenuLink"},za=g({__name:"VPMenuLink",props:{item:null},setup(e){const{page:t}=M();return(n,s)=>(o(),c("div",Ha,[_(E,{class:I({active:l(X)(l(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel},{default:m(()=>[H(L(e.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),le=b(za,[["__scopeId","data-v-2789a904"]]),Ea={class:"VPMenuGroup"},Da={key:0,class:"title"},Fa=g({__name:"VPMenuGroup",props:{text:null,items:null},setup(e){return(t,n)=>(o(),c("div",Ea,[e.text?(o(),c("p",Da,L(e.text),1)):f("",!0),(o(!0),c(T,null,B(e.items,s=>(o(),c(T,null,["link"in s?(o(),k(le,{key:0,item:s},null,8,["item"])):f("",!0)],64))),256))]))}}),Oa=b(Fa,[["__scopeId","data-v-10684e20"]]),ja={class:"VPMenu"},Ua={key:0,class:"items"},Ga=g({__name:"VPMenu",props:{items:null},setup(e){return(t,n)=>(o(),c("div",ja,[e.items?(o(),c("div",Ua,[(o(!0),c(T,null,B(e.items,s=>(o(),c(T,{key:s.text},["link"in s?(o(),k(le,{key:0,item:s},null,8,["item"])):(o(),k(Oa,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):f("",!0),v(t.$slots,"default",{},void 0,!0)]))}}),Ra=b(Ga,[["__scopeId","data-v-32c6b1d0"]]),Wa=["aria-expanded","aria-label"],Xa={key:0,class:"text"},qa=["innerHTML"],Ka={class:"menu"},Ya=g({__name:"VPFlyout",props:{icon:null,button:null,label:null,items:null},setup(e){const t=P(!1),n=P();ka({el:n,onBlur:s});function s(){t.value=!1}return(a,i)=>(o(),c("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:i[1]||(i[1]=u=>t.value=!0),onMouseleave:i[2]||(i[2]=u=>t.value=!1)},[r("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:i[0]||(i[0]=u=>t.value=!t.value)},[e.button||e.icon?(o(),c("span",Xa,[e.icon?(o(),k(W(e.icon),{key:0,class:"option-icon"})):f("",!0),e.button?(o(),c("span",{key:1,innerHTML:e.button},null,8,qa)):f("",!0),_(Fe,{class:"text-icon"})])):(o(),k(Ba,{key:1,class:"icon"}))],8,Wa),r("div",Ka,[_(Ra,{items:e.items},{default:m(()=>[v(a.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),we=b(Ya,[["__scopeId","data-v-41b0fac7"]]),Za={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',npm:'npm',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Ja=["href","aria-label","innerHTML"],Qa=g({__name:"VPSocialLink",props:{icon:null,link:null,ariaLabel:null},setup(e){const t=e,n=y(()=>typeof t.icon=="object"?t.icon.svg:Za[t.icon]);return(s,a)=>(o(),c("a",{class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:l(n)},null,8,Ja))}}),eo=b(Qa,[["__scopeId","data-v-70b9b240"]]),to={class:"VPSocialLinks"},no=g({__name:"VPSocialLinks",props:{links:null},setup(e){return(t,n)=>(o(),c("div",to,[(o(!0),c(T,null,B(e.links,({link:s,icon:a,ariaLabel:i})=>(o(),k(eo,{key:s,icon:a,link:s,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),ie=b(no,[["__scopeId","data-v-f534a663"]]),so={key:0,class:"group translations"},ao={class:"trans-title"},oo={key:1,class:"group"},lo={class:"item appearance"},io={class:"label"},co={class:"appearance-action"},ro={key:2,class:"group"},uo={class:"item social-links"},vo=g({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=M(),{localeLinks:s,currentLang:a}=Z({correspondingLink:!0}),i=y(()=>s.value.length&&a.value.label||t.value.appearance||n.value.socialLinks);return(u,h)=>l(i)?(o(),k(we,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:m(()=>[l(s).length&&l(a).label?(o(),c("div",so,[r("p",ao,L(l(a).label),1),(o(!0),c(T,null,B(l(s),d=>(o(),k(le,{key:d.link,item:d},null,8,["item"]))),128))])):f("",!0),l(t).appearance&&l(t).appearance!=="force-dark"?(o(),c("div",oo,[r("div",lo,[r("p",io,L(l(n).darkModeSwitchLabel||"Appearance"),1),r("div",co,[_($e)])])])):f("",!0),l(n).socialLinks?(o(),c("div",ro,[r("div",uo,[_(ie,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),ho=b(vo,[["__scopeId","data-v-edb1db61"]]),mo=e=>(j("data-v-279e6295"),e=e(),U(),e),fo=["aria-expanded"],_o=mo(()=>r("span",{class:"container"},[r("span",{class:"top"}),r("span",{class:"middle"}),r("span",{class:"bottom"})],-1)),po=[_o],go=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(o(),c("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=s=>t.$emit("click"))},po,10,fo))}}),bo=b(go,[["__scopeId","data-v-279e6295"]]),ko=["innerHTML"],$o=g({__name:"VPNavBarMenuLink",props:{item:null},setup(e){const{page:t}=M();return(n,s)=>(o(),k(E,{class:I({VPNavBarMenuLink:!0,active:l(X)(l(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,tabindex:"0"},{default:m(()=>[r("span",{innerHTML:e.item.text},null,8,ko)]),_:1},8,["class","href","target","rel"]))}}),yo=b($o,[["__scopeId","data-v-2b0d6775"]]),wo=g({__name:"VPNavBarMenuGroup",props:{item:null},setup(e){const t=e,{page:n}=M(),s=i=>"link"in i?X(n.value.relativePath,i.link,!!t.item.activeMatch):i.items.some(s),a=y(()=>s(t.item));return(i,u)=>(o(),k(we,{class:I({VPNavBarMenuGroup:!0,active:l(X)(l(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||l(a)}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),Po=e=>(j("data-v-3e017cdf"),e=e(),U(),e),xo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Vo=Po(()=>r("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Lo=g({__name:"VPNavBarMenu",setup(e){const{theme:t}=M();return(n,s)=>l(t).nav?(o(),c("nav",xo,[Vo,(o(!0),c(T,null,B(l(t).nav,a=>(o(),c(T,{key:a.text},["link"in a?(o(),k(yo,{key:0,item:a},null,8,["item"])):(o(),k(wo,{key:1,item:a},null,8,["item"]))],64))),128))])):f("",!0)}}),So=b(Lo,[["__scopeId","data-v-3e017cdf"]]);function Mo(e){const{localeIndex:t,theme:n}=M();function s(a){var w,V,A;const i=a.split("."),u=(w=n.value.search)==null?void 0:w.options,h=u&&typeof u=="object",d=h&&((A=(V=u.locales)==null?void 0:V[t.value])==null?void 0:A.translations)||null,p=h&&u.translations||null;let x=d,$=p,S=e;const C=i.pop();for(const F of i){let N=null;const D=S==null?void 0:S[F];D&&(N=S=D);const R=$==null?void 0:$[F];R&&(N=$=R);const O=x==null?void 0:x[F];O&&(N=x=O),D||(S=N),R||($=N),O||(x=N)}return(x==null?void 0:x[C])??($==null?void 0:$[C])??(S==null?void 0:S[C])??""}return s}const Co=["aria-label"],To={class:"DocSearch-Button-Container"},Io=r("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[r("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ao={class:"DocSearch-Button-Placeholder"},No=r("span",{class:"DocSearch-Button-Keys"},[r("kbd",{class:"DocSearch-Button-Key"}),r("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Pe=g({__name:"VPNavBarSearchButton",setup(e){const n=Mo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(s,a)=>(o(),c("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[r("span",To,[Io,r("span",Ao,L(l(n)("button.buttonText")),1)]),No],8,Co))}}),Bo={class:"VPNavBarSearch"},Ho={id:"local-search"},zo={key:1,id:"docsearch"},Eo=g({__name:"VPNavBarSearch",setup(e){const t=et(()=>Ce(()=>import("./VPLocalSearchBox.D-gwIAzV.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:s}=M(),a=P(!1),i=P(!1);z(()=>{});function u(){a.value||(a.value=!0,setTimeout(h,16))}function h(){const $=new Event("keydown");$.key="k",$.metaKey=!0,window.dispatchEvent($),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||h()},16)}function d($){const S=$.target,C=S.tagName;return S.isContentEditable||C==="INPUT"||C==="SELECT"||C==="TEXTAREA"}const p=P(!1);ve("k",$=>{($.ctrlKey||$.metaKey)&&($.preventDefault(),p.value=!0)}),ve("/",$=>{d($)||($.preventDefault(),p.value=!0)});const x="local";return($,S)=>{var C;return o(),c("div",Bo,[l(x)==="local"?(o(),c(T,{key:0},[p.value?(o(),k(l(t),{key:0,onClose:S[0]||(S[0]=w=>p.value=!1)})):f("",!0),r("div",Ho,[_(Pe,{onClick:S[1]||(S[1]=w=>p.value=!0)})])],64)):l(x)==="algolia"?(o(),c(T,{key:1},[a.value?(o(),k(l(n),{key:0,algolia:((C=l(s).search)==null?void 0:C.options)??l(s).algolia,onVnodeBeforeMount:S[2]||(S[2]=w=>i.value=!0)},null,8,["algolia"])):f("",!0),i.value?f("",!0):(o(),c("div",zo,[_(Pe,{onClick:u})]))],64)):f("",!0)])}}}),Do=g({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=M();return(n,s)=>l(t).socialLinks?(o(),k(ie,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):f("",!0)}}),Fo=b(Do,[["__scopeId","data-v-47b9b291"]]),Oo=["href","rel","target"],jo=g({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=M(),{hasSidebar:s}=G(),{currentLang:a}=Z(),i=y(()=>{var d;return typeof n.value.logoLink=="string"?n.value.logoLink:(d=n.value.logoLink)==null?void 0:d.link}),u=y(()=>{var d;return typeof n.value.logoLink=="string"||(d=n.value.logoLink)==null?void 0:d.rel}),h=y(()=>{var d;return typeof n.value.logoLink=="string"||(d=n.value.logoLink)==null?void 0:d.target});return(d,p)=>(o(),c("div",{class:I(["VPNavBarTitle",{"has-sidebar":l(s)}])},[r("a",{class:"title",href:l(i)??l(ge)(l(a).link),rel:l(u),target:l(h)},[v(d.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(o(),k(ee,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):f("",!0),l(n).siteTitle?(o(),c(T,{key:1},[H(L(l(n).siteTitle),1)],64)):l(n).siteTitle===void 0?(o(),c(T,{key:2},[H(L(l(t).title),1)],64)):f("",!0),v(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,Oo)],2))}}),Uo=b(jo,[["__scopeId","data-v-5a8562d3"]]),Go={},Ro={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Wo=r("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Xo=r("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),qo=[Wo,Xo];function Ko(e,t){return o(),c("svg",Ro,qo)}const Oe=b(Go,[["render",Ko]]),Yo={class:"items"},Zo={class:"title"},Jo=g({__name:"VPNavBarTranslations",setup(e){const{theme:t}=M(),{localeLinks:n,currentLang:s}=Z({correspondingLink:!0});return(a,i)=>l(n).length&&l(s).label?(o(),k(we,{key:0,class:"VPNavBarTranslations",icon:Oe,label:l(t).langMenuLabel||"Change language"},{default:m(()=>[r("div",Yo,[r("p",Zo,L(l(s).label),1),(o(!0),c(T,null,B(l(n),u=>(o(),k(le,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),Qo=b(Jo,[["__scopeId","data-v-8bf799dc"]]),el=e=>(j("data-v-575c0058"),e=e(),U(),e),tl={class:"wrapper"},nl={class:"container"},sl={class:"title"},al={class:"content"},ol={class:"content-body"},ll=el(()=>r("div",{class:"divider"},[r("div",{class:"divider-line"})],-1)),il=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=Se(),{hasSidebar:n}=G(),{hasLocalNav:s}=He(),{frontmatter:a}=M(),i=P({});return xe(()=>{i.value={"has-sidebar":n.value,"has-local-nav":s.value,top:a.value.layout==="home"&&t.value===0}}),(u,h)=>(o(),c("div",{class:I(["VPNavBar",i.value])},[r("div",tl,[r("div",nl,[r("div",sl,[_(Uo,null,{"nav-bar-title-before":m(()=>[v(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[v(u.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),r("div",al,[r("div",ol,[v(u.$slots,"nav-bar-content-before",{},void 0,!0),_(Eo,{class:"search"}),_(So,{class:"menu"}),_(Qo,{class:"translations"}),_(ba,{class:"appearance"}),_(Fo,{class:"social-links"}),_(ho,{class:"extra"}),v(u.$slots,"nav-bar-content-after",{},void 0,!0),_(bo,{class:"hamburger",active:e.isScreenOpen,onClick:h[0]||(h[0]=d=>u.$emit("toggle-screen"))},null,8,["active"])])])])]),ll],2))}}),cl=b(il,[["__scopeId","data-v-575c0058"]]),rl={key:0,class:"VPNavScreenAppearance"},ul={class:"text"},dl=g({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=M();return(s,a)=>l(t).appearance&&l(t).appearance!=="force-dark"?(o(),c("div",rl,[r("p",ul,L(l(n).darkModeSwitchLabel||"Appearance"),1),_($e)])):f("",!0)}}),vl=b(dl,[["__scopeId","data-v-046116b1"]]),hl=g({__name:"VPNavScreenMenuLink",props:{item:null},setup(e){const t=oe("close-screen");return(n,s)=>(o(),k(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,onClick:l(t)},{default:m(()=>[H(L(e.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ml=b(hl,[["__scopeId","data-v-08feecc5"]]),fl={},_l={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pl=r("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),gl=[pl];function bl(e,t){return o(),c("svg",_l,gl)}const kl=b(fl,[["render",bl]]),$l=g({__name:"VPNavScreenMenuGroupLink",props:{item:null},setup(e){const t=oe("close-screen");return(n,s)=>(o(),k(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,onClick:l(t)},{default:m(()=>[H(L(e.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),je=b($l,[["__scopeId","data-v-d9d80ef3"]]),yl={class:"VPNavScreenMenuGroupSection"},wl={key:0,class:"title"},Pl=g({__name:"VPNavScreenMenuGroupSection",props:{text:null,items:null},setup(e){return(t,n)=>(o(),c("div",yl,[e.text?(o(),c("p",wl,L(e.text),1)):f("",!0),(o(!0),c(T,null,B(e.items,s=>(o(),k(je,{key:s.text,item:s},null,8,["item"]))),128))]))}}),xl=b(Pl,[["__scopeId","data-v-d90ad5a0"]]),Vl=["aria-controls","aria-expanded"],Ll=["innerHTML"],Sl=["id"],Ml={key:1,class:"group"},Cl=g({__name:"VPNavScreenMenuGroup",props:{text:null,items:null},setup(e){const t=e,n=P(!1),s=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function a(){n.value=!n.value}return(i,u)=>(o(),c("div",{class:I(["VPNavScreenMenuGroup",{open:n.value}])},[r("button",{class:"button","aria-controls":l(s),"aria-expanded":n.value,onClick:a},[r("span",{class:"button-text",innerHTML:e.text},null,8,Ll),_(kl,{class:"button-icon"})],8,Vl),r("div",{id:l(s),class:"items"},[(o(!0),c(T,null,B(e.items,h=>(o(),c(T,{key:h.text},["link"in h?(o(),c("div",{key:h.text,class:"item"},[_(je,{item:h},null,8,["item"])])):(o(),c("div",Ml,[_(xl,{text:h.text,items:h.items},null,8,["text","items"])]))],64))),128))],8,Sl)],2))}}),Tl=b(Cl,[["__scopeId","data-v-fedeb855"]]),Il={key:0,class:"VPNavScreenMenu"},Al=g({__name:"VPNavScreenMenu",setup(e){const{theme:t}=M();return(n,s)=>l(t).nav?(o(),c("nav",Il,[(o(!0),c(T,null,B(l(t).nav,a=>(o(),c(T,{key:a.text},["link"in a?(o(),k(ml,{key:0,item:a},null,8,["item"])):(o(),k(Tl,{key:1,text:a.text||"",items:a.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Nl=g({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=M();return(n,s)=>l(t).socialLinks?(o(),k(ie,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):f("",!0)}}),Bl={class:"list"},Hl=g({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=Z({correspondingLink:!0}),s=P(!1);function a(){s.value=!s.value}return(i,u)=>l(t).length&&l(n).label?(o(),c("div",{key:0,class:I(["VPNavScreenTranslations",{open:s.value}])},[r("button",{class:"title",onClick:a},[_(Oe,{class:"icon lang"}),H(" "+L(l(n).label)+" ",1),_(Fe,{class:"icon chevron"})]),r("ul",Bl,[(o(!0),c(T,null,B(l(t),h=>(o(),c("li",{key:h.link,class:"item"},[_(E,{class:"link",href:h.link},{default:m(()=>[H(L(h.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),zl=b(Hl,[["__scopeId","data-v-d58656ce"]]),El={class:"container"},Dl=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=P(null),n=Te(Y?document.body:null);return(s,a)=>(o(),k(_e,{name:"fade",onEnter:a[0]||(a[0]=i=>n.value=!0),onAfterLeave:a[1]||(a[1]=i=>n.value=!1)},{default:m(()=>[e.open?(o(),c("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[r("div",El,[v(s.$slots,"nav-screen-content-before",{},void 0,!0),_(Al,{class:"menu"}),_(zl,{class:"translations"}),_(vl,{class:"appearance"}),_(Nl,{class:"social-links"}),v(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),Fl=b(Dl,[["__scopeId","data-v-67d15196"]]),Ol={key:0,class:"VPNav"},jl=g({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:s}=Zs(),{frontmatter:a}=M(),i=y(()=>a.value.navbar!==!1);return Ie("close-screen",n),te(()=>{Y&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(u,h)=>l(i)?(o(),c("header",Ol,[_(cl,{"is-screen-open":l(t),onToggleScreen:l(s)},{"nav-bar-title-before":m(()=>[v(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[v(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":m(()=>[v(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":m(()=>[v(u.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(Fl,{open:l(t)},{"nav-screen-content-before":m(()=>[v(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":m(()=>[v(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),Ul=b(jl,[["__scopeId","data-v-50ee880a"]]),Gl=e=>(j("data-v-3445ab86"),e=e(),U(),e),Rl=["role","tabindex"],Wl=Gl(()=>r("div",{class:"indicator"},null,-1)),Xl=["onKeydown"],ql={key:1,class:"items"},Kl=g({__name:"VPSidebarItem",props:{item:null,depth:null},setup(e){const t=e,{collapsed:n,collapsible:s,isLink:a,isActiveLink:i,hasActiveLink:u,hasChildren:h,toggle:d}=Pt(y(()=>t.item)),p=y(()=>h.value?"section":"div"),x=y(()=>a.value?"a":"div"),$=y(()=>h.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),S=y(()=>a.value?void 0:"button"),C=y(()=>[[`level-${t.depth}`],{collapsible:s.value},{collapsed:n.value},{"is-link":a.value},{"is-active":i.value},{"has-active":u.value}]);function w(A){"key"in A&&A.key!=="Enter"||!t.item.link&&d()}function V(){t.item.link&&d()}return(A,F)=>{const N=K("VPSidebarItem",!0);return o(),k(W(l(p)),{class:I(["VPSidebarItem",l(C)])},{default:m(()=>[e.item.text?(o(),c("div",J({key:0,class:"item",role:l(S)},nt(e.item.items?{click:w,keydown:w}:{},!0),{tabindex:e.item.items&&0}),[Wl,e.item.link?(o(),k(E,{key:0,tag:l(x),class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:m(()=>[(o(),k(W(l($)),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(o(),k(W(l($)),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null?(o(),c("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:V,onKeydown:tt(V,["enter"]),tabindex:"0"},[_(ze,{class:"caret-icon"})],40,Xl)):f("",!0)],16,Rl)):f("",!0),e.item.items&&e.item.items.length?(o(),c("div",ql,[e.depth<5?(o(!0),c(T,{key:0},B(e.item.items,D=>(o(),k(N,{key:D.text,item:D,depth:e.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),Yl=b(Kl,[["__scopeId","data-v-3445ab86"]]),Ue=e=>(j("data-v-983e8791"),e=e(),U(),e),Zl=Ue(()=>r("div",{class:"curtain"},null,-1)),Jl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ql=Ue(()=>r("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),ei=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const t=e,{sidebarGroups:n,hasSidebar:s}=G(),a=P(null),i=Te(Y?document.body:null);return q([t,a],()=>{var u;t.open?(i.value=!0,(u=a.value)==null||u.focus()):i.value=!1},{immediate:!0,flush:"post"}),(u,h)=>l(s)?(o(),c("aside",{key:0,class:I(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:a,onClick:h[0]||(h[0]=st(()=>{},["stop"]))},[Zl,r("nav",Jl,[Ql,v(u.$slots,"sidebar-nav-before",{},void 0,!0),(o(!0),c(T,null,B(l(n),d=>(o(),c("div",{key:d.text,class:"group"},[_(Yl,{item:d,depth:0},null,8,["item"])]))),128)),v(u.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),ti=b(ei,[["__scopeId","data-v-983e8791"]]),ni=g({__name:"VPSkipLink",setup(e){const t=ae(),n=P();q(()=>t.path,()=>n.value.focus());function s({target:a}){const i=document.getElementById(decodeURIComponent(a.hash).slice(1));if(i){const u=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",u)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",u),i.focus(),window.scrollTo(0,0)}}return(a,i)=>(o(),c(T,null,[r("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),r("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),si=b(ni,[["__scopeId","data-v-056fc64b"]]),ai=g({__name:"Layout",setup(e){const{isOpen:t,open:n,close:s}=G(),a=ae();q(()=>a.path,s),wt(t,s);const{frontmatter:i}=M(),u=at(),h=y(()=>!!u["home-hero-image"]);return Ie("hero-image-slot-exists",h),(d,p)=>{const x=K("Content");return l(i).layout!==!1?(o(),c("div",{key:0,class:I(["Layout",l(i).pageClass])},[v(d.$slots,"layout-top",{},void 0,!0),_(si),_(ct,{class:"backdrop",show:l(t),onClick:l(s)},null,8,["show","onClick"]),_(Ul,null,{"nav-bar-title-before":m(()=>[v(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[v(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":m(()=>[v(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":m(()=>[v(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":m(()=>[v(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":m(()=>[v(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(Ys,{open:l(t),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),_(ti,{open:l(t)},{"sidebar-nav-before":m(()=>[v(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":m(()=>[v(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(ys,null,{"page-top":m(()=>[v(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":m(()=>[v(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":m(()=>[v(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":m(()=>[v(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":m(()=>[v(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":m(()=>[v(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":m(()=>[v(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":m(()=>[v(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":m(()=>[v(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":m(()=>[v(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":m(()=>[v(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":m(()=>[v(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":m(()=>[v(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":m(()=>[v(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":m(()=>[v(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":m(()=>[v(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":m(()=>[v(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[v(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[v(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[v(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(Ls),v(d.$slots,"layout-bottom",{},void 0,!0)],2)):(o(),k(x,{key:1}))}}}),oi=b(ai,[["__scopeId","data-v-e69ff593"]]),li={},ii={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ci=r("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),ri=[ci];function ui(e,t){return o(),c("svg",ii,ri)}const di=b(li,[["render",ui]]),vi={class:"profile"},hi={class:"avatar"},mi=["src","alt"],fi={class:"data"},_i={class:"name"},pi={key:0,class:"affiliation"},gi={key:0,class:"title"},bi={key:1,class:"at"},ki=["innerHTML"],$i={key:2,class:"links"},yi={key:0,class:"sp"},wi=g({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:null},setup(e){return(t,n)=>(o(),c("article",{class:I(["VPTeamMembersItem",[e.size]])},[r("div",vi,[r("figure",hi,[r("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,mi)]),r("div",fi,[r("h1",_i,L(e.member.name),1),e.member.title||e.member.org?(o(),c("p",pi,[e.member.title?(o(),c("span",gi,L(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(o(),c("span",bi," @ ")):f("",!0),e.member.org?(o(),k(E,{key:2,class:I(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:m(()=>[H(L(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(o(),c("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,ki)):f("",!0),e.member.links?(o(),c("div",$i,[_(ie,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(o(),c("div",yi,[_(E,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:m(()=>[_(di,{class:"sp-icon"}),H(" "+L(e.member.actionText||"Sponsor"),1)]),_:1},8,["href"])])):f("",!0)],2))}}),Pi=b(wi,[["__scopeId","data-v-cc4ed7ff"]]),xi={class:"container"},Vi=g({__name:"VPTeamMembers",props:{size:{default:"medium"},members:null},setup(e){const t=e,n=y(()=>[t.size,`count-${t.members.length}`]);return(s,a)=>(o(),c("div",{class:I(["VPTeamMembers",l(n)])},[r("div",xi,[(o(!0),c(T,null,B(e.members,i=>(o(),c("div",{key:i.name,class:"item"},[_(Pi,{size:e.size,member:i},null,8,["size","member"])]))),128))])],2))}}),Li=b(Vi,[["__scopeId","data-v-6674e2a2"]]),Si={Layout:oi,enhanceApp:({app:e})=>{e.component("Badge",ot)}},Mi=["id","host","repo","repoid","category","categoryid","mapping","term","strict","reactionsenabled","emitmetadata","inputposition","theme","lang","loading"],Ci=g({__name:"Giscus",props:{id:null,host:null,repo:null,repoId:null,category:null,categoryId:null,mapping:null,term:null,theme:null,strict:null,reactionsEnabled:null,emitMetadata:null,inputPosition:null,lang:null,loading:null},setup(e){const t=P(!1);return z(()=>{t.value=!0,Ce(()=>import("./giscus-a53917f0.pI8Mtuqg.js"),__vite__mapDeps([]))}),(n,s)=>t.value?(o(),c("giscus-widget",{key:0,id:e.id,host:e.host,repo:e.repo,repoid:e.repoId,category:e.category,categoryid:e.categoryId,mapping:e.mapping,term:e.term,strict:e.strict,reactionsenabled:e.reactionsEnabled,emitmetadata:e.emitMetadata,inputposition:e.inputPosition,theme:e.theme,lang:e.lang,loading:e.loading},null,8,Mi)):f("",!0)}}),Ti={__name:"gitalk",setup(e){const t=P("light"),n=P();z(()=>{s(),a()});const s=()=>{document.documentElement.classList.contains("dark")?t.value="dark_dimmed":t.value="light"},a=()=>{n.value=new MutationObserver(s),n.value.observe(document.documentElement,{attributes:!0,childList:!1,attributeFilter:["class"]})};return ne(()=>{var i,u;(u=(i=n==null?void 0:n.value)==null?void 0:i.disconnect)==null||u.call(i)}),(i,u)=>(o(),k(l(Ci),{id:"comments",repo:"ihengshuai/blog",repoId:"R_kgDOILaFbQ",category:"Announcements",categoryId:"DIC_kwDOILaFbc4CSXG3",mapping:"title",strict:"0",term:"Welcome to @giscus/vue component!",reactionsEnabled:"1",emitMetadata:"1",inputPosition:"top",theme:t.value,lang:"zh-CN"},null,8,["theme"]))}},Ii={class:"card-link"},Ai=["href"],Ni=["src","alt"],Bi={class:"card-link-content"},Hi={class:"card-link-content-title"},zi={class:"card-link-content-desc"},Ei={__name:"nav-extends",setup(e){const t=[{avatar:"https://img.alicdn.com/tps/TB1Nv_wKXXXXXbmXVXXXXXXXXXX-295-195.png",title:"淘系前端团队(FED)",desc:"用技术为体验提供无限可能",link:"https://fed.taobao.org/blogs"},{avatar:"http://www.alloyteam.com/wp-content/uploads/2015/01/AlloyTeam_avatar.png",title:"腾讯AlloyTeam团队",desc:"腾讯全端 AlloyTeam 团队 Blog",link:"http://www.alloyteam.com/page/0/"},{avatar:"http://fex.baidu.com/public/images/logo.svg",title:"百度前端团队",desc:"百度前端团队Blog",link:"http://fex.baidu.com/"},{avatar:"https://img12.360buyimg.com/ling/s420x420_jfs/t25921/163/228025270/29121/126c575d/5b69b0d4N7ae8c0f0.png.webp",title:"凹凸实验室中台设计部",desc:"O2 Lab 来自京东零售集团,创建于2015年10月,是一个专注于用户体验及产品价值提升的产品研发团队",link:"https://jelly.jd.com/teamhome/5b0ff3a0629834a34b663617/"},{avatar:"https://fastly.jsdelivr.net/npm/@vant/assets/logo.png",title:"有赞技术团队",desc:"有赞的介绍 有赞,是一个商家服务公司。我们通过产品和服务,帮助互联网时代的生意人私有化顾客资产、拓展互联网客群、提高经营效率,全面助力商家成功。 ",link:"https://tech.youzan.com/tag/front-end/"},{avatar:"https://static.zaozao.run/website/prod/1.0.24/icons/logo-72.png",title:"前端早早聊",desc:"前端早早聊大会网站",link:"https://www.zaozao.run"},{avatar:"https://p3-passport.byteimg.com/img/user-avatar/8235463c80ecb19922c8ee10c40a1ca6~180x180.awebp",title:"奇舞周刊",desc:"领略前端技术 阅读奇舞周刊",link:"https://weekly.75.team/"},{avatar:"https://p3-passport.byteimg.com/img/user-avatar/2fcea6a9c80b959f2f0e11c9d8667dc3~180x180.awebp",title:"Elab团队",desc:"字节跳动大力教育前端团队,负责教育全线产品前端开发工作。",link:"https://juejin.cn/user/4169764695465239"}];return(n,s)=>(o(),c("div",null,[r("ul",Ii,[(o(),c(T,null,B(t,(a,i)=>r("li",{class:I(`card-link-item ${i>1&&"top"}`),key:a},[r("a",{href:`${a.link}?referrer=blog.usword.cn`,target:"_blank"},[r("figure",null,[r("img",{class:"logo",src:a.avatar,alt:a.title},null,8,Ni)]),r("div",Bi,[r("div",Hi,L(a.title),1),r("div",zi,L(a.desc),1)])],8,Ai)],2)),64))])]))}},ue={blog:'Google Chrome',juejin:'',weibo:''},Di={__name:"friends",setup(e){const t=[{avatar:"https://tva1.sinaimg.cn/large/005HV6Avgy1h76xsijlrij30u00u0diz.jpg",name:"ihengshuai",title:"A passionate web developer base on ShenZhen",links:[{icon:"github",link:"http://github.com/ihengshuai"},{icon:{svg:ue.blog},link:"https://blog.usword.cn"},{icon:{svg:ue.juejin},link:"https://juejin.cn/user/2999123453679656"}]},{avatar:"https://www.ruanyifeng.com/blog/images/person2_s.jpg",name:"阮一峰",title:"阮一峰的网络日志",links:[{icon:"github",link:"https://github.com/ruanyf"},{icon:{svg:ue.blog},link:"http://www.ruanyifeng.com/blog"}]}];return(n,s)=>(o(),k(l(Li),{size:"small",members:t}))}},Fi=Me('
若您在阅读过程中发现一些错误:如语句不通、文字、逻辑等错误,可以在评论区指出,我会及时调整修改,感谢您的阅读。同时您觉得这篇文章对您有帮助的话,可以打赏作者一笔作为鼓励,金额不限,感谢支持🤝。
支付宝捐赠微信支付捐赠
',3),Oi={class:"share_wrap"},ji=["href"],Ui=r("img",{src:"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-weibo.png",alt:"share to weibo",title:"分享到微博"},null,-1),Gi=[Ui],Ri=["href"],Wi=r("img",{src:"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-twitter.png",alt:"share to twitter",title:"分享到twitter"},null,-1),Xi=[Wi],qi=["href"],Ki=r("img",{src:"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-facebook.png",alt:"share to facebook",title:"分享到facebook"},null,-1),Yi=[Ki],Zi={__name:"reward",setup(e){const t=P("#"),n=P("#"),s=P("#");return z(()=>{const a=document.head.querySelector("meta[name='description']").content,i=location.href;t.value=`https://service.weibo.com/share/share.php?url=${i}&platform=weibo&title=${encodeURIComponent(`${a} #hengshuai's blog# #恒帅的博客#`)}`,n.value=`https://twitter.com/intent/tweet?text=${encodeURIComponent(`${a} #hengshuai #恒帅的博客`)}&url=${i}?platform=twitter`,s.value=`https://www.facebook.com/sharer/sharer.php?u=${i}&platform=facebook`}),(a,i)=>(o(),c(T,null,[Fi,r("div",Oi,[r("a",{href:t.value,target:"_blank"},Gi,8,ji),r("a",{href:n.value,target:"_blank"},Xi,8,Ri),r("a",{href:s.value,target:"_blank"},Yi,8,qi)])],64))}},Ji={class:"blog-title"},Qi=g({__name:"home",setup(e){let t;const n="山高路远, 看世界也找自己";z(()=>{t=document.querySelector(".blog-title"),t&&s(0)});function s(a){a<=n.length?(t.textContent=n.slice(0,a),a++,setTimeout(()=>{s(a)},500)):setTimeout(()=>{s(0)},4e3)}return(a,i)=>(o(),c("h1",Ji,"Hengshuai's blog"))}});function ec(){"serviceWorker"in navigator&&navigator.serviceWorker.register("/pwa-worker.js").then(e=>{}).catch(e=>{console.log(e)})}const tc=["src"],nc=g({__name:"audio",setup(e){const t=P();let n,s=0,a=0;const i=P(),u=P(),h=P(),d=P(!1),p=P(!1);z(()=>{s=t.value.width=t.value.parentNode.clientWidth,a=t.value.height=400,n=t.value.getContext("2d")});const x=()=>{var w;d.value?(p.value=!0,(w=u.value)==null||w.stop()):(h.value=null,p.value=!1,C()),d.value=!d.value},$=()=>{var w,V;p.value?(w=u.value)==null||w.resume():(V=u.value)==null||V.pause(),p.value=!p.value};function S(){if(!i.value)return;const w=new AudioContext,V=w.createAnalyser();w.createMediaStreamSource(i.value).connect(V);const F=()=>{const N=V.fftSize,D=new Uint8Array(N);V.getByteTimeDomainData(D),n.clearRect(0,0,s,a),n.fillStyle="#fff",n.strokeStyle="#333",n.fillRect(0,0,s,a),n.lineWidth=2,n.beginPath();const R=s/N;let O=0;n.moveTo(O,a/2);for(let ce=0;ce{console.log(w),i.value=w;const V=[];u.value=new MediaRecorder(w),u.value.ondataavailable=({data:A})=>{V.push(A)},u.value.onstart=()=>{console.log("开始录制..."),S()},u.value.onstop=()=>{console.log("停止录制...");const A={type:"audio/webm; codecs=opus"},F=new Blob(V,A),N=URL.createObjectURL(F);console.log(N),h.value=N},u.value.onerror=()=>{console.log("录制出错了...")},u.value.start()})}return(w,V)=>(o(),c("div",null,[r("button",{onClick:x},L(d.value?"停止":"录制"),1),d.value?(o(),c("button",{key:0,onClick:$},L(p.value?"继续":"暂停"),1)):f("",!0),h.value?(o(),c("video",{key:1,src:h.value,controls:""},null,8,tc)):f("",!0),r("canvas",{ref_key:"canvas",ref:t},null,512)]))}}),sc=g({__name:"music-virtual",setup(e){const t=P();let n,s=0,a=0;const i=P();let u=!1,h=!1,d,p;z(x);function x(){s=t.value.width=t.value.parentElement.clientWidth,a=t.value.height=400,n=t.value.getContext("2d"),n.fillStyle="#4646fc"}const $=()=>{if(!u){u=!0;const w=new AudioContext,V=w.createMediaElementSource(i.value);p=w.createAnalyser(),p.fftSize=512,V.connect(p),p.connect(w.destination),d=new Uint8Array(p.frequencyBinCount)}h=!0,C()},S=()=>{h=!1};function C(){if(!h)return;n.clearRect(0,0,s,a),p.getByteFrequencyData(d);const w=d.length/2,V=s/w/2;for(let A=0;A(o(),c(T,null,[r("canvas",{ref_key:"canvas",ref:t},null,512),r("audio",{ref_key:"audio",ref:i,src:"/media/senbonzakura.mp3",controls:"",onPlay:$,onPause:S},null,544)],64))}}),lc={...Si,enhanceApp({app:e}){e.component("Reward",Zi),e.component("Gitalk",Ti),e.component("NavExtends",Ei),e.component("Friends",Di),e.component("Home",Qi),e.component("WebAudioRecorder",nc),e.component("AudioVirtual",sc)},setup(){z(()=>{ec()})}};export{lc as R,Mo as c,M as u}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = ["assets/chunks/VPLocalSearchBox.D-gwIAzV.js","assets/chunks/framework.SV1ROkXV.js"] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} diff --git a/assets/frontend_babel_babel-analysis.md.Z0deENoo.js b/assets/frontend_babel_babel-analysis.md.Z0deENoo.js new file mode 100644 index 000000000..cb6c2b8be --- /dev/null +++ b/assets/frontend_babel_babel-analysis.md.Z0deENoo.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,V as r}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"babel原理分析","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/babel/babel-analysis.md","filePath":"frontend/babel/babel-analysis.md","lastUpdated":1706247228000}'),s={name:"frontend/babel/babel-analysis.md"},n=r('

babel原理分析

// 待补充...

整体流程

词法分析 ——> 语法分析 ——> 转化 ——> 生成

parser

traverse

generate

',7),l=[n];function o(i,b,d,h,c,_){return t(),e("div",null,l)}const u=a(s,[["render",o]]);export{f as __pageData,u as default}; diff --git a/assets/frontend_babel_babel-analysis.md.Z0deENoo.lean.js b/assets/frontend_babel_babel-analysis.md.Z0deENoo.lean.js new file mode 100644 index 000000000..e02ece3a2 --- /dev/null +++ b/assets/frontend_babel_babel-analysis.md.Z0deENoo.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,V as r}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"babel原理分析","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/babel/babel-analysis.md","filePath":"frontend/babel/babel-analysis.md","lastUpdated":1706247228000}'),s={name:"frontend/babel/babel-analysis.md"},n=r("",7),l=[n];function o(i,b,d,h,c,_){return t(),e("div",null,l)}const u=a(s,[["render",o]]);export{f as __pageData,u as default}; diff --git a/assets/frontend_babel_babel-plugin-guide.md.vF1b_R9m.js b/assets/frontend_babel_babel-plugin-guide.md.vF1b_R9m.js new file mode 100644 index 000000000..71ad3b5fb --- /dev/null +++ b/assets/frontend_babel_babel-plugin-guide.md.vF1b_R9m.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as n,m as e,a as l}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"使用Babel开发插件","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/babel/babel-plugin-guide.md","filePath":"frontend/babel/babel-plugin-guide.md","lastUpdated":1706247228000}'),o={name:"frontend/babel/babel-plugin-guide.md"},r=e("h1",{id:"使用babel开发插件",tabindex:"-1"},[l("使用Babel开发插件 "),e("a",{class:"header-anchor",href:"#使用babel开发插件","aria-label":'Permalink to "使用Babel开发插件"'},"​")],-1),s=e("p",null,"// 待补充...",-1),d=[r,s];function i(b,c,_,p,u,f){return n(),t("div",null,d)}const g=a(o,[["render",i]]);export{m as __pageData,g as default}; diff --git a/assets/frontend_babel_babel-plugin-guide.md.vF1b_R9m.lean.js b/assets/frontend_babel_babel-plugin-guide.md.vF1b_R9m.lean.js new file mode 100644 index 000000000..71ad3b5fb --- /dev/null +++ b/assets/frontend_babel_babel-plugin-guide.md.vF1b_R9m.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as n,m as e,a as l}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"使用Babel开发插件","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/babel/babel-plugin-guide.md","filePath":"frontend/babel/babel-plugin-guide.md","lastUpdated":1706247228000}'),o={name:"frontend/babel/babel-plugin-guide.md"},r=e("h1",{id:"使用babel开发插件",tabindex:"-1"},[l("使用Babel开发插件 "),e("a",{class:"header-anchor",href:"#使用babel开发插件","aria-label":'Permalink to "使用Babel开发插件"'},"​")],-1),s=e("p",null,"// 待补充...",-1),d=[r,s];function i(b,c,_,p,u,f){return n(),t("div",null,d)}const g=a(o,[["render",i]]);export{m as __pageData,g as default}; diff --git a/assets/frontend_babel_base.md.t0-aK7-4.js b/assets/frontend_babel_base.md.t0-aK7-4.js new file mode 100644 index 000000000..33a8bdd4d --- /dev/null +++ b/assets/frontend_babel_base.md.t0-aK7-4.js @@ -0,0 +1,6 @@ +import{_ as a,c as s,o as e,V as l}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Babel基本使用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/babel/base.md","filePath":"frontend/babel/base.md","lastUpdated":1706247228000}'),n={name:"frontend/babel/base.md"},o=l(`

Babel基本使用

// 待补充...

什么是babel?

用途

配置文件

.开头和非点开头

JSON

Function

js
module.exports = (api) => {
+  api.cache.forever();
+}

presets

  • presets和plugins执行顺序

plugins

常见预设

常见插件

项目和相对文件配置

monorepo

  • upward
  • file relation
  • babel-loader

.babelrc 针对项目中文件的相对位置,当babel编译时文件会在当前路径及向上找.babelrc直到出现package.json停止,.babelrc适合针对某个具体文件进行配置 babel.config.js 是整个项目范围的配置,若项目中引用了根目录以上的文件,那这些文件将会被babel.config.js配置影响到,也就是说项目中所有的文件都会受作用;若项目中的存在.babelrc 将会和babel.config.js合并

编译器假设Compiler assumptions

会控制编译的输出

json
"assumptions": {
+  "noDocumentAll": true, // 不输出文档
+  "noClassCalls": true // 不要classCallCheck
+},

参考文献

`,23),t=[o];function r(p,i,c,b,h,d){return e(),s("div",null,t)}const D=a(n,[["render",r]]);export{m as __pageData,D as default}; diff --git a/assets/frontend_babel_base.md.t0-aK7-4.lean.js b/assets/frontend_babel_base.md.t0-aK7-4.lean.js new file mode 100644 index 000000000..95ba787bb --- /dev/null +++ b/assets/frontend_babel_base.md.t0-aK7-4.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as e,V as l}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Babel基本使用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/babel/base.md","filePath":"frontend/babel/base.md","lastUpdated":1706247228000}'),n={name:"frontend/babel/base.md"},o=l("",23),t=[o];function r(p,i,c,b,h,d){return e(),s("div",null,t)}const D=a(n,[["render",r]]);export{m as __pageData,D as default}; diff --git a/assets/frontend_base.md.36vRxAi8.js b/assets/frontend_base.md.36vRxAi8.js new file mode 100644 index 000000000..702aba0fa --- /dev/null +++ b/assets/frontend_base.md.36vRxAi8.js @@ -0,0 +1 @@ +import{_ as a,c as s,J as e,V as r,o as p,G as t}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"前端知识体系","description":"前端知识体系学习清单,不断更新前端热门技术和分享优质文章","frontmatter":{"title":"前端知识体系","description":"前端知识体系学习清单,不断更新前端热门技术和分享优质文章","keywords":"前端知识体系,前端知识清单,Javascript,css,vue,react,webpack,正则表达式,regexp,构建工具,building tool,前端调试技巧,debuger,nodejs,express,koa,nestjs,渲染模式,render mode,项目规范,project spectification,http协议,http protocol,nginx,反向代理,前端编译原理,compiler,optimize,前端性能优化,前端监控系统,设计模式,npm,yarn,pnpm,vite,低代码,lowercoding,微前端,node性能优化,node bff,沙箱,小程序,混合应用,webassembly","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/base.md","filePath":"frontend/base.md","lastUpdated":1706247228000}'),i={name:"frontend/base.md"},c=r('

Only Frontend

落叶满空山,何处寻芳迹

阅前提示

当前页面从不同的层次列出了前端知识学习路线,每个层次都会分享一些重要的知识点,也是我觉得比较重要的内容,你可以快速浏览整个大纲,希望可以帮助到你😏

转载须知

本博客的所有文章允许转载,需要注明出处并提供源文章链接,对于标注不允许转载的,请联系本人。

此模块针对前端方面的知识体系,主要包括比较晦涩的概念、热门的框架、协议以及提升自己技能方面的记录,一些简单的东西已被忽略掉,只为您提供更加优质的文章阅读体验。如果你是小白也可以尝试阅读,遇到不太懂的或者自己的疑问,可以在文章里留下自己的评论,我会及时回复解答的。

这几年大前端技术呈爆炸式发展中,作者本人也是在不断学习中,文章难免会有一些疏漏或者错误之处,欢迎每个细心的读者随时提供issue或直接在文章下面留言,让我们共同进步!

如果你觉得本博客让您有所收益,麻烦您在GitHub给我个star,支持我不断更新。您也可以将本博客分享出去,让更多同学看到!

由于工作原因,写作时间有限,尽力更新中...

',7);function l(d,_,h,m,u,b){const o=t("Reward"),n=t("Gitalk");return p(),s("div",null,[c,e(o),e(n)])}const k=a(i,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/frontend_base.md.36vRxAi8.lean.js b/assets/frontend_base.md.36vRxAi8.lean.js new file mode 100644 index 000000000..1b999b242 --- /dev/null +++ b/assets/frontend_base.md.36vRxAi8.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,J as e,V as r,o as p,G as t}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"前端知识体系","description":"前端知识体系学习清单,不断更新前端热门技术和分享优质文章","frontmatter":{"title":"前端知识体系","description":"前端知识体系学习清单,不断更新前端热门技术和分享优质文章","keywords":"前端知识体系,前端知识清单,Javascript,css,vue,react,webpack,正则表达式,regexp,构建工具,building tool,前端调试技巧,debuger,nodejs,express,koa,nestjs,渲染模式,render mode,项目规范,project spectification,http协议,http protocol,nginx,反向代理,前端编译原理,compiler,optimize,前端性能优化,前端监控系统,设计模式,npm,yarn,pnpm,vite,低代码,lowercoding,微前端,node性能优化,node bff,沙箱,小程序,混合应用,webassembly","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/base.md","filePath":"frontend/base.md","lastUpdated":1706247228000}'),i={name:"frontend/base.md"},c=r("",7);function l(d,_,h,m,u,b){const o=t("Reward"),n=t("Gitalk");return p(),s("div",null,[c,e(o),e(n)])}const k=a(i,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/frontend_browser_base.md.v_UdQTA3.js b/assets/frontend_browser_base.md.v_UdQTA3.js new file mode 100644 index 000000000..05075c240 --- /dev/null +++ b/assets/frontend_browser_base.md.v_UdQTA3.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as a,V as t}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"现代浏览器架构","description":"","frontmatter":{"title":"现代浏览器架构"},"headers":[],"relativePath":"frontend/browser/base.md","filePath":"frontend/browser/base.md","lastUpdated":1706247228000}'),o={name:"frontend/browser/base.md"},l=t('

现代浏览器架构

// 待更新...

CPU、GPU

浏览器架构

多进程、多线程...

为什么要多进程

资源隔离、互不影响

输入URL后发生了什么

浏览器进程解析地址、导航线程、网络请求(DNS解析、TLS连接)数据传输、mime嗅探、IPC通知浏览器进程、选取渲染进程准备渲染、渲染进程渲染页面

文档加载完后会通知浏览器进程,tab的加载按钮就停止了;文档卸载时浏览器进程和渲染进程要进行通信确保unload事件

浏览器内核、渲染内核

站点隔离

页面渲染过程

嗅探MIME -> 主线程解析DOM -> 解析JS -> 解析CSS -> Layout Tree(几何形状)/layer -> Paint(绘制顺序) -> 光栅(图块转换为位图) -> 合成(单独的线程、合成帧)、显示(GPU显示)

  1. 生成DOM树
  2. 生成CSS树
  3. 生成布局树
  4. 分层
  5. 绘制
  6. 合成线程分块
  7. 光栅化位图

渲染优化

尽量使用仅合成动画:

  • transform
  • opacity
  • will-change(最后使用)

参考文献:

',20),i=[l];function h(s,n,d,p,c,b){return a(),r("div",null,i)}const f=e(o,[["render",h]]);export{u as __pageData,f as default}; diff --git a/assets/frontend_browser_base.md.v_UdQTA3.lean.js b/assets/frontend_browser_base.md.v_UdQTA3.lean.js new file mode 100644 index 000000000..b304f3d49 --- /dev/null +++ b/assets/frontend_browser_base.md.v_UdQTA3.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as a,V as t}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"现代浏览器架构","description":"","frontmatter":{"title":"现代浏览器架构"},"headers":[],"relativePath":"frontend/browser/base.md","filePath":"frontend/browser/base.md","lastUpdated":1706247228000}'),o={name:"frontend/browser/base.md"},l=t("",20),i=[l];function h(s,n,d,p,c,b){return a(),r("div",null,i)}const f=e(o,[["render",h]]);export{u as __pageData,f as default}; diff --git a/assets/frontend_building-tool_base.md.nIZ1pU9W.js b/assets/frontend_building-tool_base.md.nIZ1pU9W.js new file mode 100644 index 000000000..93f313bc1 --- /dev/null +++ b/assets/frontend_building-tool_base.md.nIZ1pU9W.js @@ -0,0 +1 @@ +import{_ as l,c as e,o as i,V as t}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"前端主流构建工具","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/building-tool/base.md","filePath":"frontend/building-tool/base.md","lastUpdated":1706247228000}'),a={name:"frontend/building-tool/base.md"},o=t('

前端主流构建工具

常见的构建工具

  • grunt
  • gulp
  • webpack
  • rollup
  • esbuildv
  • vite
  • parcel
  • snowpack

增量编译

  • turbo
  • rush
  • nx

// 待补充...

',6),n=[o];function r(s,_,d,c,p,u){return i(),e("div",null,n)}const h=l(a,[["render",r]]);export{f as __pageData,h as default}; diff --git a/assets/frontend_building-tool_base.md.nIZ1pU9W.lean.js b/assets/frontend_building-tool_base.md.nIZ1pU9W.lean.js new file mode 100644 index 000000000..b04f13769 --- /dev/null +++ b/assets/frontend_building-tool_base.md.nIZ1pU9W.lean.js @@ -0,0 +1 @@ +import{_ as l,c as e,o as i,V as t}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"前端主流构建工具","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/building-tool/base.md","filePath":"frontend/building-tool/base.md","lastUpdated":1706247228000}'),a={name:"frontend/building-tool/base.md"},o=t("",6),n=[o];function r(s,_,d,c,p,u){return i(),e("div",null,n)}const h=l(a,[["render",r]]);export{f as __pageData,h as default}; diff --git a/assets/frontend_canvas_base.md.u6xHSP1j.js b/assets/frontend_canvas_base.md.u6xHSP1j.js new file mode 100644 index 000000000..60632ae0f --- /dev/null +++ b/assets/frontend_canvas_base.md.u6xHSP1j.js @@ -0,0 +1,68 @@ +import{_ as s,c as a,o as n,V as l}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"Canvas","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/canvas/base.md","filePath":"frontend/canvas/base.md","lastUpdated":1706247228000}'),p={name:"frontend/canvas/base.md"},e=l(`

Canvas

js
ctx = canvas.getContext("2d")

属性与方法: CanvasRenderingContext2D

基本

js
// 移动画笔
+ctx.moveTo(x, y)
+
+// 开始新的路径
+ctx.beginPath()
+
+// 线属性
+ctx.lineJoin
+ctx.lineCap
+ctx.lineWidth
+
+// 直线
+ctx.lineTo(x, y)
+
+// 闭合路径
+ctx.closePath()
+
+// 保存
+ctx.save()
+
+// 重置,恢复至上一个save状态
+ctx.restore()
+
+// 绘制图形轮廓
+ctx.stroke()
+
+// stroke颜色
+ctx.strokeStyle = "salmon"
+
+// fill填充颜色
+ctx.fillStyle = "blue"
+
+// 绘制矩形
+ctx.stokeRect(startX, startY, width, height);
+ctx.fillRect(startX, startY, width, height);
+
+// 填充闭合路径
+ctx.fill();
+
+// 清除画布
+ctx.clearRect(startX, startY, width, height);
+
+// 设置图形或图片的透明度 0-1
+ctx.globalAlpha = 1

文字

js
// 描边文字
+ctx.strokeText(text, x, y, maxWidth?)
+
+// 填充文字
+ctx.fillText(text, x, y, maxWidth?)
+
+// 字体(同css)
+ctx.font = "20px sans-serif";
+
+// 对齐方式 start end left right center
+ctx.textAlign = "center"
+
+// 基线对齐 top hanging middle alphabetic ideographic bottom
+ctx.textBaseline = "alphabetic"
+
+// 文字方向 ltr rtl inherit
+ctx.direction = ""
+
+// 测量文字宽度
+ctx.measureText("haha")

圆弧

js
// 画圆
+ctx.arc(x, y, r, startAngle, endAngle, direction = true)
+ctx.arc(100, 100, 100, 0, Math.PI * 2)
+
+// 两个控制点画圆
+ctx.arcTo(x1, y1, x2, y2, r)

坐标系转换

translate、transform

js
// placeholder

图像合成

globalCompositeOperation

裁剪

clip

状态保存恢复

save、restore

像素操作

  • ImageData
  • getImageData
  • drawImage
  • putImageData

交互

  • isPointInPath
`,23),o=[e];function t(r,c,i,D,y,F){return n(),a("div",null,o)}const u=s(p,[["render",t]]);export{B as __pageData,u as default}; diff --git a/assets/frontend_canvas_base.md.u6xHSP1j.lean.js b/assets/frontend_canvas_base.md.u6xHSP1j.lean.js new file mode 100644 index 000000000..819ffceac --- /dev/null +++ b/assets/frontend_canvas_base.md.u6xHSP1j.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,V as l}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"Canvas","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/canvas/base.md","filePath":"frontend/canvas/base.md","lastUpdated":1706247228000}'),p={name:"frontend/canvas/base.md"},e=l("",23),o=[e];function t(r,c,i,D,y,F){return n(),a("div",null,o)}const u=s(p,[["render",t]]);export{B as __pageData,u as default}; diff --git a/assets/frontend_canvas_magic-effects.md.Fkxa5tC4.js b/assets/frontend_canvas_magic-effects.md.Fkxa5tC4.js new file mode 100644 index 000000000..226f6aa38 --- /dev/null +++ b/assets/frontend_canvas_magic-effects.md.Fkxa5tC4.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,m as s}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"使用canvas制作炫酷动画特效","description":"","frontmatter":{"title":"使用canvas制作炫酷动画特效"},"headers":[],"relativePath":"frontend/canvas/magic-effects.md","filePath":"frontend/canvas/magic-effects.md","lastUpdated":1706247228000}'),c={name:"frontend/canvas/magic-effects.md"},n=s("p",null,"炫酷动画特效",-1),o=[n];function r(f,d,i,_,m,l){return a(),t("div",null,o)}const h=e(c,[["render",r]]);export{v as __pageData,h as default}; diff --git a/assets/frontend_canvas_magic-effects.md.Fkxa5tC4.lean.js b/assets/frontend_canvas_magic-effects.md.Fkxa5tC4.lean.js new file mode 100644 index 000000000..226f6aa38 --- /dev/null +++ b/assets/frontend_canvas_magic-effects.md.Fkxa5tC4.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,m as s}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"使用canvas制作炫酷动画特效","description":"","frontmatter":{"title":"使用canvas制作炫酷动画特效"},"headers":[],"relativePath":"frontend/canvas/magic-effects.md","filePath":"frontend/canvas/magic-effects.md","lastUpdated":1706247228000}'),c={name:"frontend/canvas/magic-effects.md"},n=s("p",null,"炫酷动画特效",-1),o=[n];function r(f,d,i,_,m,l){return a(),t("div",null,o)}const h=e(c,[["render",r]]);export{v as __pageData,h as default}; diff --git a/assets/frontend_cli_index.md.qTzih6d4.js b/assets/frontend_cli_index.md.qTzih6d4.js new file mode 100644 index 000000000..c07a2bdc0 --- /dev/null +++ b/assets/frontend_cli_index.md.qTzih6d4.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,V as r}from"./chunks/framework.SV1ROkXV.js";const p=JSON.parse('{"title":"cli","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/cli/index.md","filePath":"frontend/cli/index.md","lastUpdated":1706247228000}'),o={name:"frontend/cli/index.md"},n=r('

cli

参考文献

',3),i=[n];function c(d,l,s,_,h,m){return a(),t("div",null,i)}const u=e(o,[["render",c]]);export{p as __pageData,u as default}; diff --git a/assets/frontend_cli_index.md.qTzih6d4.lean.js b/assets/frontend_cli_index.md.qTzih6d4.lean.js new file mode 100644 index 000000000..577282468 --- /dev/null +++ b/assets/frontend_cli_index.md.qTzih6d4.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,V as r}from"./chunks/framework.SV1ROkXV.js";const p=JSON.parse('{"title":"cli","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/cli/index.md","filePath":"frontend/cli/index.md","lastUpdated":1706247228000}'),o={name:"frontend/cli/index.md"},n=r("",3),i=[n];function c(d,l,s,_,h,m){return a(),t("div",null,i)}const u=e(o,[["render",c]]);export{p as __pageData,u as default}; diff --git a/assets/frontend_compiler_index.md.gB4W-5KQ.js b/assets/frontend_compiler_index.md.gB4W-5KQ.js new file mode 100644 index 000000000..2677603ed --- /dev/null +++ b/assets/frontend_compiler_index.md.gB4W-5KQ.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"compiler","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/compiler/index.md","filePath":"frontend/compiler/index.md","lastUpdated":1706247228000}'),n={name:"frontend/compiler/index.md"},c=e("h1",{id:"compiler",tabindex:"-1"},[r("compiler "),e("a",{class:"header-anchor",href:"#compiler","aria-label":'Permalink to "compiler"'},"​")],-1),i=[c];function d(s,l,p,m,_,f){return o(),a("div",null,i)}const u=t(n,[["render",d]]);export{x as __pageData,u as default}; diff --git a/assets/frontend_compiler_index.md.gB4W-5KQ.lean.js b/assets/frontend_compiler_index.md.gB4W-5KQ.lean.js new file mode 100644 index 000000000..2677603ed --- /dev/null +++ b/assets/frontend_compiler_index.md.gB4W-5KQ.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"compiler","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/compiler/index.md","filePath":"frontend/compiler/index.md","lastUpdated":1706247228000}'),n={name:"frontend/compiler/index.md"},c=e("h1",{id:"compiler",tabindex:"-1"},[r("compiler "),e("a",{class:"header-anchor",href:"#compiler","aria-label":'Permalink to "compiler"'},"​")],-1),i=[c];function d(s,l,p,m,_,f){return o(),a("div",null,i)}const u=t(n,[["render",d]]);export{x as __pageData,u as default}; diff --git a/assets/frontend_computer-network_arp-protocol.md.oAtbXMJy.js b/assets/frontend_computer-network_arp-protocol.md.oAtbXMJy.js new file mode 100644 index 000000000..d9ac8728e --- /dev/null +++ b/assets/frontend_computer-network_arp-protocol.md.oAtbXMJy.js @@ -0,0 +1,8 @@ +import{_ as n,c as o,J as a,V as r,o as i,G as e}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"ARP协议","description":"ARP是一种在计算机网络中用于将IP地址映射到MAC地址的协议。ARP协议通常在局域网中使用,它允许主机查找目标主机的MAC地址,以便在网络中发送数据包","frontmatter":{"title":"ARP协议","description":"ARP是一种在计算机网络中用于将IP地址映射到MAC地址的协议。ARP协议通常在局域网中使用,它允许主机查找目标主机的MAC地址,以便在网络中发送数据包","keywords":"arp协议,ARP欺骗,ARP代理,ARP泛洪,ARP缓存表,静态ARP,RARP","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-arp.png"},"headers":[],"relativePath":"frontend/computer-network/arp-protocol.md","filePath":"frontend/computer-network/arp-protocol.md","lastUpdated":1706247228000}'),p={name:"frontend/computer-network/arp-protocol.md"},t=r(`

ARP协议

ARP(Address Resolution Protocol,地址解析协议)是一种在计算机网络中用于将IP地址映射到MAC地址的协议。ARP协议通常在局域网中使用,它允许主机查找目标主机的MAC地址,以便在网络中发送数据包

当一个主机需要向另一个主机发送数据包时,它需要知道目标主机的MAC地址,因为MAC地址是在数据链路层使用的地址。如果目标主机的IP地址已知,但是它的MAC地址未知,就需要使用ARP协议进行地址解析

ARP协议是属于网络层协议,基于IP协议

通信过程

假如局域网内有多个主机,当主机A需要和主机C进行通讯时,需要先获得主机B的mac地址:

  1. 主机A先从自己的ARP缓存表中获取主机B的mac地址
  2. 当没有时会想局域网中发送arp广播请求,路由器等设备接收到arp请求后,会将请求发送给局域网中的每个主机
  3. 当每个主机接收到arp请求后发现目标ip不是自己,就会丢弃掉arp数据包,不做任何回应
  4. 而真正的主机接收到后,会将自己的mac地址以单播的形式响应给发送端
  5. 路由器等设备也会学习ip,当目标主机响应源主机时,路由器也会维护一份路由表,在路由器的路由表没有过期时,路由器会直接返回目标主机的mac地址

真实环境抓包情况如下:

ARP首部

  • 硬件类型:2字节,硬件地址类型,值为1时表示以太网
  • 协议类型:2字节,表示映射的协议地址类型,对于IP协议值为0x0800
  • MAC地址长度:1字节,表示MAC地址长度,以字节为单位,此处为6
  • IP协议地址长度:1字节,表示IP的长度,以字节为单位,此处为4
  • 操作类型:2字节,指定本次ARP报文类型。ARP请求(1)、ARP应答(2)、RARP请求(3)、RARP应答(4)
  • 源MAC地址:6字节,发送方的硬件地址
  • 源IP地址:4字节,发送方的IP地址
  • 目的MAC地址:6字节,接收方硬件地址,在请求报文中该字段值全为0,即00:00:00:00:00:00,表示任意地址,等待接收方来补充
  • 目的IP地址:4字节,接收方的IP地址

抓包情况如下:

ARP缓存表

为了避免每次通信都要进行这种转换,每个设备(如路由器、交换机、网关等)都会在自己的ARP缓存表中存储已经进行过ARP请求并得到回应的IP地址和MAC地址的对应关系。当设备需要与该IP地址对应的设备进行通信时,就可以直接从ARP缓存表中获取对应的MAC地址,而不用再次发送ARP请求

ARP缓存表中的每个条目通常包含以下信息:

  • IP地址:需要转换为MAC地址的IP地址
  • MAC地址:与IP地址对应的MAC地址
  • 接口:该MAC地址所在的网络接口
  • 时间戳:上次从目标设备获取该MAC地址的时间

查看主机维护的arp缓存表:

sh
 arp -ae
+Address           HWtype  HWaddress           Flags Mask    Iface
+192.168.11.11     ether   xx:1b:xx:b5:e2:12   C             ens160
+192.168.11.235    ether   xx:ef:xx:5b:d1:a5   C             ens160
+192.168.11.194    ether   xx:a4:xx:0a:xx:c5   C             ens160
+192.168.11.120    ether   xx:9c:23:xx:b0:xx   C             ens160
+gateway           ether   xx:05:a5:xx:9b:8f   C             ens160
+192.168.10.1      ether   6e:xx:33:xx:45:xx   C             ens256

ARP缓存表的大小有限,当表满了时,新的ARP请求会替换最早的条目。此外,由于ARP缓存表中的信息是动态的,因此有时需要手动清除过期的ARP缓存表项

动态ARP表

动态ARP表是由ARP和计算机自动维护的,它会记录最近进行过通信的IP地址和MAC地址的映射关系,并在一定时间内保持这种关系。当通信终止一段时间后,这些映射关系就会被清除。这种清除机制可以确保ARP表中的信息是最新的,但也可能导致频繁地进行ARP请求

静态ARP表

静态ARP表是由管理员手动设置的,它不会自动更新。管理员可以在静态ARP表中指定某个IP地址对应的MAC地址,这样ARP表中就会一直保持这种映射关系,直到管理员手动删除或更新它。这种方式可以减少ARP请求的次数,提高网络性能,但需要管理员进行手动维护,可能导致静态ARP表中的信息不够实时

RARP

ARP是将IP地址转换为MAC地址,而RARP(Reverse Address Resolution Protocol,反向地址解析协议)是一种用于将MAC地址转换为IP地址的协议,与ARP相反

当一个网络设备启动时,它通常知道自己的MAC地址,但不知道自己的IP地址。此时,设备可以向网络中的RARP服务器发送一个RARP请求,请求服务器将自己的MAC地址转换为IP地址;RARP服务器将在自己的RARP表中查找该MAC地址对应的IP地址,并将IP地址返回给设备;由于DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)的出现,RARP协议已经逐渐被淘汰。DHCP协议可以动态地分配IP地址和其他网络配置信息,而不需要依赖于RARP服务器

代理ARP

代理ARP(Proxy ARP)是一种网络协议,它允许一个主机为另一个主机响应ARP请求,从而实现两个不在同一子网内的主机之间的通信。代理ARP通常在路由器或交换机等设备上实现,这些设备会监视网络中的ARP请求,并根据需要向其他子网中的主机发送ARP响应

当一个主机需要与另一个不在同一子网内的主机通信时,它会向本地网段的网关发送ARP请求,请求网关的MAC地址。如果网关启用了代理ARP功能,并且知道目标主机的MAC地址,它就会响应ARP请求,将目标主机的MAC地址发送给源主机,源主机就可以使用该MAC地址向目标主机发送数据包

ARP欺骗

ARP可以说是最不安全的协议,传播中没有身份验证,对于网络中的任意主机都可以接收到发送者的arp包,因此可以假装成目标主机并返回给源主机错误的mac地址,当源主机发送数据时就会将数据发送到错误的主机上,造成数据泄露等安全问题

ARP欺骗示意图: 主机A想要和主机C进行通信,发送的ARP数据包被hacker截取后,伪造成主机C,将自己的mac地址发送给主机A,主机A就会将hacker的mac地址存到自己的arp缓存表中,这样以后发送到主机C的数据全都会发送到hacker的主机上

ARP欺骗会造成数据的泄露,假如网页上没有使用https证书,数据都会以明文的形式传输,很容易泄露数据。如下图:当在网页上提交表单,通过抓包工具就可以看到数据内容

💡如何防范ARP欺骗?

  1. 使用静态ARP表:静态ARP表是手动配置的ARP表,可以避免ARP欺骗攻击。管理员可以在网络设备上手动配置每个设备的MAC地址和IP地址的对应关系,从而限制ARP欺骗攻击
  2. 使用动态ARP检测工具:动态ARP检测工具可以检测网络中的ARP欺骗攻击,并且可以发出警报或者自动阻止攻击。例如,ARPwatch、ARPdefender等工具可以帮助管理员实时监控网络中的ARP请求和响应,从而及时发现并防止ARP欺骗攻击
  3. 使用加密协议:使用加密协议可以保护网络中的通信,从而避免ARP欺骗攻击。例如,使用SSL、TLS等加密协议可以保护Web应用程序的通信,从而避免中间人攻击
  4. 使用虚拟专用网络(VPN):使用VPN可以将网络流量加密并隧道化,从而避免ARP欺骗攻击。VPN可以将本地网络与远程网络之间建立一个安全的隧道,从而保护网络通信的安全

ARP泛洪

ARP泛洪(ARP Flooding)是一种网络攻击方法,它利用ARP协议的特性向网络中广播大量的虚假ARP请求,从而导致网络中所有主机的ARP缓存被污染

ARP泛洪攻击的原理是攻击者向网络中发送大量虚假的ARP请求包,每个ARP请求包都包含一个虚假的IP地址和MAC地址。当网络中的其他主机接收到ARP请求包时,它们会更新自己的ARP缓存,将虚假的MAC地址与IP地址映射起来。这样,当这些主机向虚假IP地址发送数据包时,数据包会被发送到错误的MAC地址,从而无法到达真正的目标主机。如果攻击者拦截这些数据包并篡改它们,就可以实现中间人攻击或拒绝服务攻击等行为

为了防止ARP泛洪攻击,可以采取以下几种措施:

  • 使用静态ARP表:在网络中使用静态ARP表,将每个IP地址与MAC地址手动映射起来,这样可以避免ARP缓存被污染。但是,静态ARP表的管理比较困难,需要手动进行维护
  • 使用ARP防火墙:在网络中使用ARP防火墙,对所有的ARP请求和响应进行过滤和验证,可以有效地防止ARP欺骗和ARP泛洪攻击
  • 使用网络安全设备:在网络中使用网络安全设备,例如交换机和路由器等,可以对ARP请求和响应进行监控和过滤,从而保护网络安全

总结

ARP协议用来将IP地址映射为mac地址,ARP协议是个非常不安全的协议,因此很容易称为攻击的漏洞,为了防范ARP攻击,要采取必要的措施来防止攻击

参考文献

`,44);function P(c,A,R,d,h,u){const s=e("Reward"),l=e("Gitalk");return i(),o("div",null,[t,a(s),a(l)])}const b=n(p,[["render",P]]);export{C as __pageData,b as default}; diff --git a/assets/frontend_computer-network_arp-protocol.md.oAtbXMJy.lean.js b/assets/frontend_computer-network_arp-protocol.md.oAtbXMJy.lean.js new file mode 100644 index 000000000..e4641a3f0 --- /dev/null +++ b/assets/frontend_computer-network_arp-protocol.md.oAtbXMJy.lean.js @@ -0,0 +1 @@ +import{_ as n,c as o,J as a,V as r,o as i,G as e}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"ARP协议","description":"ARP是一种在计算机网络中用于将IP地址映射到MAC地址的协议。ARP协议通常在局域网中使用,它允许主机查找目标主机的MAC地址,以便在网络中发送数据包","frontmatter":{"title":"ARP协议","description":"ARP是一种在计算机网络中用于将IP地址映射到MAC地址的协议。ARP协议通常在局域网中使用,它允许主机查找目标主机的MAC地址,以便在网络中发送数据包","keywords":"arp协议,ARP欺骗,ARP代理,ARP泛洪,ARP缓存表,静态ARP,RARP","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-arp.png"},"headers":[],"relativePath":"frontend/computer-network/arp-protocol.md","filePath":"frontend/computer-network/arp-protocol.md","lastUpdated":1706247228000}'),p={name:"frontend/computer-network/arp-protocol.md"},t=r("",44);function P(c,A,R,d,h,u){const s=e("Reward"),l=e("Gitalk");return i(),o("div",null,[t,a(s),a(l)])}const b=n(p,[["render",P]]);export{C as __pageData,b as default}; diff --git a/assets/frontend_computer-network_base.md.1bZNLudq.js b/assets/frontend_computer-network_base.md.1bZNLudq.js new file mode 100644 index 000000000..33149618e --- /dev/null +++ b/assets/frontend_computer-network_base.md.1bZNLudq.js @@ -0,0 +1 @@ +import{_ as o,c as P,J as a,V as r,o as l,G as e}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"计算机网络","description":"计算机网络是指互联的计算机系统之间通过通信设备和通信线路进行数据交换的系统。计算机网络可以分为局域网、城域网、广域网和因特网等不同的类型。计算机网络使用各种协议来实现不同的功能和服务,如经典的TCP/IP协议","frontmatter":{"title":"计算机网络","description":"计算机网络是指互联的计算机系统之间通过通信设备和通信线路进行数据交换的系统。计算机网络可以分为局域网、城域网、广域网和因特网等不同的类型。计算机网络使用各种协议来实现不同的功能和服务,如经典的TCP/IP协议","keywords":"计算机网络,TCP/IP协议,ARP协议,HTTP协议,ICMP协议,FTP协议","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-network.png"},"headers":[],"relativePath":"frontend/computer-network/base.md","filePath":"frontend/computer-network/base.md","lastUpdated":1706247228000}'),n={name:"frontend/computer-network/base.md"},c=r('

计算机网络

计算机网络是指互联的计算机系统之间通过通信设备和通信线路进行数据交换的系统。计算机网络可以分为局域网、城域网、广域网和因特网等不同的类型。计算机网络使用各种协议来实现不同的功能和服务,例如 TCP/IP 协议用于互联网通信,HTTP 协议用于网页浏览,SMTP 协议用于电子邮件传输等等

网络协议是计算机之间进行数据交换的一类规则协议、标准集合,不同计算机之间的通信必须建立在相同的标准上,如:HTTP协议、TCP协议等等,在这些协议中TCP/IP协议影响力最大,是必须学习的协议,本模块会列出常见的协议并进一步分析,加深印象和理解

网络层次划分

为什么要进行网络层次划分?互联网的通信都必须建立在同一标准上才能够正常进行,划分层次可以进一步促进不同层次标准化,使得不同的供应商和组织可以遵循相同的标准进行设计和实现;进行模块划分、简化整体设计更有利于不同标准的实现、维护和扩展,提高网络的灵活性

网络协议层次划分的两个经典代表:OSI模型TCP/IP模型

OSI模型

OSI七层模型是国际标准化组织(ISO)在20世纪70年代提出的一个计算机网络通信模型。当时,由于不同的厂商和组织都在开发自己的网络协议,这导致了网络之间的互操作性和标准化问题。为此,ISO组织提出了OSI七层模型,以便解决这些问题。总之,OSI七层模型推动了网络协议的标准化和互操作性,为网络设计和实现提供了重要的参考模型,对于推动计算机网络的发展和应用具有重要的作用

以上是OSI七层模型,层层向上每一层为上一层提供服务

  • 应用层(Application Layer):负责提供各种应用程序所需的服务,如文件传输、电子邮件、网页浏览等
  • 表示层(Presentation Layer):负责数据格式的转换,提供数据加密和压缩等功能
  • 会话层(Session Layer):负责建立和管理会话连接,提供数据交换和同步功能
  • 传输层(Transport Layer):负责建立端到端的可靠传输连接,提供数据流的分段和重组功能,包括协议TCP和UDP等
  • 网络层(Network Layer):负责在数据链路层上建立逻辑连接,选择最佳传输路径,进行数据包的传输和路由选择
  • 数据链路层(Data Link Layer):负责在物理层上建立数据链路,进行数据帧的传输和接收,并进行错误检测和纠正
  • 物理层(Physical Layer):主要负责传输比特流,包括建立物理连接、信号编码、调制解调制等

TCP/IP模型

TCP/IP协议的诞生背景是20世纪60年代末和70年代初,当时美国国防部的ARPA(高级研究计划局)在研究如何建立一种去中心化、可靠的通信网络,以应对核战争带来的威胁。ARPA的研究成果最终演变成了TCP/IP协议

可以说是TCP/IP协议是OSI的具体实现,其中典型的的代表是TCP和IP协议。TCP协议负责数据的可靠传输,它将数据分成小的数据包并确保它们以正确的顺序被发送到目的地。IP协议则负责数据包的路由和寻址,它将数据包从一个网络设备传输到另一个网络设备,使得不同类型的计算机和网络设备能够相互通信,并且能够在全球范围内进行数据传输,它是互联网的基础

  • 应用层:应用层是TCP/IP协议的最高层,它负责处理应用程序之间的通信。这个层次包括许多协议,如HTTP、FTP、SMTP等,这些协议决定了应用程序如何在网络上进行通信
  • 传输层:传输层负责处理数据的传输,如TCP协议提供了可靠的连接服务,能够确保数据的完整性和顺序性;UDP协议则提供了无连接服务,适合于需要快速传输的数据
  • 网络层:网络层负责数据包的路由和寻址,它使用IP协议来实现数据包的传输。IP协议能够将数据包从一个网络设备传输到另一个网络设备,同时还能够进行网络地址转换(NAT)
  • 数据链路层:数据链路层负责将数据包封装成帧并发送到物理层,也负责接收物理层传输的帧并解封装成数据包。这个层次包括了以太网、Wi-Fi、蓝牙等协议,它们决定了数据在物理层如何传输

传输过程

了解了网络模型后那数据到底是怎么传输的呢?假如以上计算机A、B要进行通讯,A在浏览器上提交网页登录信息点击发送,这里我们认定他使用HTTP协议,接着将数据发送到传输层当然这里会使用TCP协议作为可靠传输。TCP协议中会添加自己的相关信息作为数据的首部,如:源端口和目标端口、窗口大小、相关标识等等,形成数据段,再提交给网络层。网络层ARP协议会探测源IP地址的mac地址,IP会添加源IP和目标IP等信息作为首部形成数据包,再提交给数据链路层。链路层将添加以源mac地址和目标mac地址等信息为首部,交给物理层。物理层以比特流的形式开始转发,假如遇到路由器时路由器识别目标ip并根据路由表进行转发,期间会将源mac地址修改为路由器另一出口网卡的mac地址,然后再经过其他的路由器或交换机,这样层层转发直到目标主机。目标主机链路层去掉链路首部给到网络层,网络层去掉IP首部给到传输层,传输层去掉TCP首部给到应用层,应用层拿到数据后根据不同情况进行响应或拒绝

以上简单的概述了两端数据转发的过程

mac地址每经过一个路由器时都会将源mac地址修改会其某一网络接口的mac地址,而IP地址不会,因此IP地址决定了数据的起点和终点,mac地址决定了下一跳地址,二者缺一不可

TCP/IP协议

TCP/IP协议是互联网最重要的协议,它是万物互联的基础。TCP/IP协议不是一种协议而是一类协议,是个协议簇包含了很多不同层次协议,因为TCP、IP两种协议比较经典而作为重要代表。以下列出TCP/IP协议中各层所包含的协议:

  • 应用层:HTTP、FTP、Telnet、SMTP、DNS、POP3等等
  • 传输层:TCP、UDP、TLS、QUIC等等
  • 网络层:IP、ARP、RARP、ICMP等等
  • 数据链路层:PPP、HDLC、CSMA等等

TCP/IP协议中包含很多重要的协议,如:HTTP协议对于web开发者了解其数据报文信息很有用、TCP协议连接过程(面试考点)、IP划分(子网掩码、网段等等)、ARP寻址、ICMP网络诊断等在实际开发或网络排错中都很有用

总之搞懂这些协议是非常有用的,了解网络传输本质对于网络的学习也很有帮助,接下来以TCP/IP为范畴详细讲解部分协议

为什么要懂计算机网络?

可以说计算机网络是每个工程师的基础,了解它会让我们明白其背后的原理是怎么样的,比如:前后端的数据传输,使用的什么协议,换成什么协议可以加快数据传输等等。总之学习计算机网络是很重要的,可以拓宽自己视野发展,总之关于网络中的盲区最好还是填补一下

参考文献

',29);function s(p,h,T,d,u,I){const i=e("Reward"),t=e("Gitalk");return l(),P("div",null,[c,a(i),a(t)])}const b=o(n,[["render",s]]);export{C as __pageData,b as default}; diff --git a/assets/frontend_computer-network_base.md.1bZNLudq.lean.js b/assets/frontend_computer-network_base.md.1bZNLudq.lean.js new file mode 100644 index 000000000..bc17f8307 --- /dev/null +++ b/assets/frontend_computer-network_base.md.1bZNLudq.lean.js @@ -0,0 +1 @@ +import{_ as o,c as P,J as a,V as r,o as l,G as e}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"计算机网络","description":"计算机网络是指互联的计算机系统之间通过通信设备和通信线路进行数据交换的系统。计算机网络可以分为局域网、城域网、广域网和因特网等不同的类型。计算机网络使用各种协议来实现不同的功能和服务,如经典的TCP/IP协议","frontmatter":{"title":"计算机网络","description":"计算机网络是指互联的计算机系统之间通过通信设备和通信线路进行数据交换的系统。计算机网络可以分为局域网、城域网、广域网和因特网等不同的类型。计算机网络使用各种协议来实现不同的功能和服务,如经典的TCP/IP协议","keywords":"计算机网络,TCP/IP协议,ARP协议,HTTP协议,ICMP协议,FTP协议","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-network.png"},"headers":[],"relativePath":"frontend/computer-network/base.md","filePath":"frontend/computer-network/base.md","lastUpdated":1706247228000}'),n={name:"frontend/computer-network/base.md"},c=r("",29);function s(p,h,T,d,u,I){const i=e("Reward"),t=e("Gitalk");return l(),P("div",null,[c,a(i),a(t)])}const b=o(n,[["render",s]]);export{C as __pageData,b as default}; diff --git a/assets/frontend_computer-network_http-protocol.md.fxY3d9SH.js b/assets/frontend_computer-network_http-protocol.md.fxY3d9SH.js new file mode 100644 index 000000000..fd21297b0 --- /dev/null +++ b/assets/frontend_computer-network_http-protocol.md.fxY3d9SH.js @@ -0,0 +1,306 @@ +import{_ as e,c as o,a as t,J as s,V as a,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"HTTP协议及安全防范","description":"HTTP超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议,客户端通过发送请求到服务器来获取资源,服务器则根据请求返回响应。HTTP协议也是受攻击的重灾区如XSS、CSRF攻击,学会使用相关措施如CSP、HTTP安全防范等有效防止攻击发生","frontmatter":{"title":"HTTP协议及安全防范","description":"HTTP超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议,客户端通过发送请求到服务器来获取资源,服务器则根据请求返回响应。HTTP协议也是受攻击的重灾区如XSS、CSRF攻击,学会使用相关措施如CSP、HTTP安全防范等有效防止攻击发生","keywords":"HTTP状态码,跨域,HTTP范围请求,大文件上传,大文件下载,TLS握手,WebSocket,HTTP攻击,HTTP缓存,协商缓存,强缓存,KeepAlive,HTTPS,CSP,Content-Secure-Policy,HTTP2,QUIC,HTTP3","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-http.png"},"headers":[],"relativePath":"frontend/computer-network/http-protocol.md","filePath":"frontend/computer-network/http-protocol.md","lastUpdated":1706247228000}'),c={name:"frontend/computer-network/http-protocol.md"},i=a(`

HTTP协议及安全防范

HTTP(Hypertext Transfer Protocol)超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议,客户端通过发送请求到服务器来获取资源,服务器则根据请求返回响应。HTTP 协议通常使用 TCP作为传输协议,但也可以使用其它传输协议

URI、URL、URN

URI是一个通用的术语,用于唯一地标识互联网上的任何资源。它包括两个主要的部分:标识符和解析器。标识符是用来唯一标识一个资源的字符串,而解析器则是用来解析这个字符串,以便访问该资源。URI包括两种类型:URLURN

URL是URI的一个子集,它是一种具体的URI形式,用来唯一地标识互联网上的资源,并指定如何访问该资源。URL包含以下信息:

  • 协议:访问该资源所使用的协议(如HTTP、FTP等)
  • 域名或IP地址:资源所在的服务器的主机名或IP地址
  • 端口:用于访问该资源的服务器端口号
  • 路径:资源所在服务器上的路径和文件名

以下是一些URL的例子:

  • http://www.example.com/index.html
  • ftp://ftp.example.com/pub/file.txt
  • https://www.example.com/login

URN是另一种URI类型,用来给资源一个永久的、唯一的名称,而不是标识该资源的位置。URN不包括访问该资源的方式。URN的例子包括:

  • urn:isbn:978-1-491-90234-1
  • urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

在实际应用中,URL是使用最广泛的URI类型。URL既能用来表示静态资源(如网页、图片、视频等),也能用来表示动态资源(如Web服务API、数据库查询等)

常见状态码

HTTP状态码是指当客户端向服务器发送请求时,服务器返回的响应状态码。它表示了服务器对请求的处理结果和状态。HTTP状态码由3个数字组成,第一个数字表示响应类别,后两个数字没有分类的作用。HTTP状态码范围从100到599,其中100到199是信息性状态码,200到299表示成功,300到399表示重定向,400到499表示客户端错误,500到599表示服务器错误,常见的状态码如下:

状态码类型含义描述
100InformationalContinue服务器已经接收到了请求头,并且客户端应继续发送请求主体部分
101InformationalSwitching Protocols服务器正在根据客户端的请求切换协议(比如升级Websocket协议)
102InformationalProcessing服务器正在处理请求,但尚未完成处理
200SuccessOK请求已经成功,并返回了请求所需要的信息
201SuccessCreated请求已经成功,并在服务器上创建了新的资源
202SuccessAccepted请求已经被接受,但尚未被处理完成
204SuccessNo Content请求已经成功,但不需要返回任何数据(配置跨域时通常使用204返回)
206SuccessPartial Content请求成功,但是只返回了部分内容(范围请求)
301RedirectionMoved Permanently请求的资源已经被永久转移到新的URL
302RedirectionFound请求的资源已经临时转移到新的URL
304RedirectionNot Modified客户端缓存的资源是最新的,服务器返回的内容为空
307RedirectionTemporary Redirect请求的资源已经临时转移到新的URL
400Client ErrorBad Request请求格式错误,服务器无法解析该请求
401Client ErrorUnauthorized请求未经授权,需要进行身份验证
403Client ErrorForbidden请求被拒绝,拒绝访问
404Client ErrorNot Found请求的资源不存在
408Client ErrorRequest Timeout请求超时
409Client ErrorConflict请求与服务器上的资源发生冲突
415Client ErrorUnsupported Media Type服务器无法处理请求中所包含的媒体类型
429Client ErrorToo Many Requests请求次数超过了限制
500Server ErrorInternal Server Error服务器发生了错误,无法完成请求
501Server ErrorNot Implemented服务器不支持请求的功能
502Server ErrorBad Gateway服务器作为网关或代理,从上游服务器收到的响应无效或错误
503Server ErrorService Unavailable服务器暂时无法处理请求,通常是由于服务器过载或维护
504Server ErrorGateway Timeout服务器充当网关或代理时,没有及时从上游服务器收到请求

HTTP报文

HTTP报文是HTTP通信中的数据传输单位,可以分为请求报文响应报文两种类型。请求报文由请求行、请求头部和请求正文组成,其中请求行包括请求方法、请求URI和HTTP协议版本,请求头部包括若干个字段和值,用于描述请求的相关信息,请求正文可选,通常用于传输POST请求中的表单数据等内容;响应报文由状态行、响应头部和响应正文组成,其中状态行包括HTTP协议版本、状态码和状态描述,响应头部包括若干个字段和值,用于描述响应的相关信息,响应正文通常包含响应的实际内容

抓包查看HTTP报文:

请求报文

响应报文

首部字段

HTTP的首部字段可以分为通用首部、请求首部和响应首部三类。以下是这三类首部字段的一些常见示例:

通用首部字段:

  • Cache-Control:指定缓存机制
  • Connection:指定连接类型
  • Date:指定消息创建时间
  • Pragma:指定缓存机制
  • Trailer:指定尾部(不常用)
  • Transfer-Encoding:指定传输编码方式
  • Upgrade:升级为其他协议
  • Via:指定代理服务器的相关信息
  • Warning:包含一些警告信息

请求首部字段:

  • Accept:指定可接受的响应类型
  • Accept-Encoding:指定可接受的内容编码方式
  • Authorization:指定身份认证信息
  • Cookie:指定来自客户端的Cookie信息
  • Host:指定请求的主机名和端口号
  • Referer:指定请求来源
  • User-Agent:指定客户端的用户代理信息

响应首部字段:

  • Accept-Ranges:指定可接受的字节范围
  • Age:指定缓存资源生成的时间
  • Content-Encoding:指定响应正文的编码方式
  • Content-Length:指定响应正文的长度
  • Content-Type:指定响应正文的类型(Multipurpose Internet Mail Extensions 或 MIME 类型),可以在这里查看更多的MIME类型
  • Server:指定服务器的信息
  • Expires:资源过期时间,基于具体时间
  • Last-Modified:资源修改时间,用于缓存
  • Etag:文件编码,用于判断缓存

请求方法

HTTP定义了一些请求方法(Request Method),用于定义客户端与服务器之间进行请求和响应的行为。下面是HTTP的请求方法及其用途:

  • GET:用于请求指定资源。GET 请求应该只用于获取资源,而不应该对资源进行修改。GET 方法是幂等的,不会对资源造成任何更改,因此不会对安全造成威胁。然而,使用 GET 方法时应当注意避免将敏感信息暴露在 URL 中,因为 URL 可能会被缓存、浏览器历史记录、服务器日志等记录下来
  • HEAD:与 GET 请求类似,但是服务器不会返回请求的资源,只返回头部信息。HEAD 请求常用于获取资源的元信息,如 Content-Type、Content-Length 等
  • POST:用于向服务器提交数据,POST 请求可能会导致服务器的状态发生变化。POST 请求常用于提交表单数据,例如登录、注册等。由于 POST 请求通常包含用户输入的敏感数据,因此可能受到跨站脚本攻击、跨站请求伪造攻击等安全威胁。为了防止这些攻击,可以在 POST 请求中使用 CSRF token 或者验证码等技术进行验证
  • PUT:用于向服务器上传指定资源。PUT 请求是幂等的,即多次执行相同的 PUT 请求,对服务器的影响是相同的。PUT 请求通常用于上传文件或者更新资源
  • DELETE:用于请求删除指定资源。DELETE 请求用于删除服务器上的资源
  • CONNECT:用于建立与服务器的隧道连接,通常用于 HTTPS 的代理服务器连接
  • OPTIONS:用于查询服务器支持的请求方法和头部信息,通常用于跨域请求中的预检请求(Preflight Request)
  • TRACE:用于跟踪请求-响应的传输路径,通常用于调试和测试
  • PATCH:用于对资源进行局部更新。PATCH 请求可以用于更新资源的一部分,而不需要替换整个资源

HTTP演变

HTTP是一种用于在Web上传输数据的协议,经过多次演变和改进,逐渐增加了新的特性和功能,包括支持多种请求方法、请求头和响应头、复用TCP连接、持久连接、分块传输编码、服务器推送、头部压缩等,以提高Web性能和效率。HTTP的演变版本包括HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3,每个版本都在不断地改进和完善,以满足不同的需求和应用场景

HTTP/1.1

HTTP/1.1是目前应用最广泛的HTTP协议版本之一,它引入了多个新特性,例如复用TCP连接、持久连接、分块传输编码、虚拟主机等,这些特性使得HTTP/1.1能够更加高效地传输数据,从而提高了Web性能和效率。同时,HTTP/1.1也支持多种请求方法和响应状态码,例如GET、POST、PUT、DELETE等方法,以及200、404、500等状态码。HTTP/1.1仍然是Web开发中的重要组成部分,尽管有着一些限制和缺点,但仍然是Web传输协议中的重要参考标准之一

HTTP/1.1的缺点是队头阻塞

💡什么是队头阻塞

http-header-pending

HTTP/1.1中会复用同一个TCP连接(浏览器会限制同一个域名TCP最大同时连接数),当同一个连接同时请求多个资源时,它们会按顺序进行数据传输,如果前者丢包或者响应时间过长就会阻塞后面的请求,或者后面的TCP连接会等待前面的传输,这就是队头阻塞

HTTP/2

TIP

关于如何使用HTTP2,这里举例用nginx配置HTTP2,详细步骤已经在『nginx使用手册』文章中说明了

HTTP/2基于SPDY协议进行了扩展和改进,提供了多路复用、头部压缩、服务器推送等多个新特性,使得HTTP2比HTTP/1.1更加高效和快速

HTTP2的优点:

  • 多路复用:在一个TCP连接中同时传输多个请求和响应,解决了HTTP/1.1中的队头阻塞问题
  • 头部压缩:采用HPACK算法对请求头和响应头进行压缩,减少了传输数据的大小,提高了网络性能
  • 服务器推送(Server Push):能够将相关资源预加载到客户端,进一步提高了Web性能。

HTTP2的缺点:

  • 虽然HTTP2解决了HTTP/1.1中的队头阻塞问题,但在高延迟的网络环境下仍然存在性能瓶颈
  • 实现HTTP2需要升级服务器和客户端软件,对现有的Web生态系统具有一定的影响

多路复用

多路复用(Multiplexing)是其最重要的特性之一,它允许在同一 TCP 连接上同时传输多个请求和响应。在传统的 HTTP/1.1 协议中,每个请求和响应都需要建立一次 TCP 连接,尽管可以使用KeepAlive减少TCP的握手,但浏览器限制了同域名的的TCP最大连接数,因此多个请求和响应之间存在着明显的串行化和等待时间,这会导致性能瓶颈。而在 HTTP/2 中,通过多路复用的技术,所有请求和响应都可以在同一个 TCP 连接上并发处理,大大提高了网站的性能和吞吐量

具体来说,HTTP/2 的多路复用技术通过将所有的请求和响应分解成若干个小的数据流(Stream),并且每个数据流可以被细分成若干个数据帧(Frame)来传输。这样,就可以在同一个 TCP 连接上同时传输多个数据流,而不需要等待某个请求或响应的完成。由于同一 TCP 连接上可以并发处理多个数据流,因此 HTTP/2 的多路复用可以大大提高网站的性能,减少网络延迟和响应时间

💡使用了HTTP2就不会有队头阻塞了吗?

从以上的角度可以理解不存在队头阻塞了,但在弱网环境下依然会存在。某个数据流的帧因为网络问题或其他原因无法及时传输到对端时,其后面的数据流会一直等待,直到该数据流的所有帧全部传输完成。通常可以使用帧优先级的策略,将重要的数据优先传输,不重要的放后面

由于HTTP2都会共用同一个TCP连接,弱网环境下可能传输效率比HTTP/1.1更差

ServerPush

ServerPush顾名思义服务器推送技术,通常客户端必须首先发送请求才能获取到服务器上的资源,例如 HTML 文件、JavaScript、CSS 文件和图片等。而在 HTTP2 中,服务器可以在收到客户端请求之前主动将一些资源推送给客户端,这样客户端就可以提前获取到这些资源,从而避免了等待服务器响应的时间,减少了页面加载的延迟

使用nginx配置ServerPush

nginx
location / {
+	root   /usr/share/nginx/html;
+	index  index.html index.htm;
+
+	# push某个静态资源
+	http2_push /style.css;
+}

目前在笔者电脑浏览器上查看ServerPush类型网络已经不明显了,以下是Chrome(112)和Firefox(109)的面板结果: 出了用浏览器查看ServerPush的请求,也可以使用nghttp工具进行查看:

sh
 nghttp https://general-mac.com -ans
+id  responseEnd requestStart  process code size request path
+ 13      +494us        +50us    444us  200  176 /
+  2      +567us *     +431us    136us  200   67 /style.css
+ 15     +2.38ms       +584us   1.80ms  200  99K /images/k8s-fine.jpg

以上responseEnd为*的表示ServerPush类型的资源

ServerPush问题

ServerPush主动推送资源可能会存在以下问题:

  • 推送的资源不被缓存,当一些静态资源设置了缓存时,server端不知道直接推送已经被缓存的静态资源
  • 一些需要身份验证的资源可能被错误的推送
  • 推送对首屏的渲染并没有太大用处,现在大量使用CDN,静态资源也不一定存在同一个服务上

这里不做详细的问题分析,可以看看AlloyTeam这篇文章

头部压缩

header max size

HTTP/1.1 Header

HTTP/2 Header
`,68),F=a(`

HTTP2的头部压缩技术大体包含以下部分:

  • 客户端和服务端维护一份相同的静态字典表,包含常见的头部键或键值
  • 客户端和服务端维护维护一份动态字典表,根据实际情况动态添加字典表
  • 上下文感知存储已经传输过的头部信息,避免重复传输相同的头部信息
  • 使用哈弗编码(Huffman),这里查看静态哈弗编码表(Huffman)

本文不对头部压缩做深入解释,可以阅读详解 HTTP/2头压缩算法 —— HPACKHTTP/2 HPACK实际应用文章了解更多

HTTP/3

HTTP/3基于QUIC协议进行开发,提供了一些新特性来进一步提高Web性能。与HTTP/2相比,HTTP/3最大的不同在于底层传输协议的改变,使用了QUIC协议代替了TCP协议,并使用TLS 1.3作为底层安全传输协议

HTTP/3的优点:

  • 采用QUIC协议,相比TCP协议,具有更低的延迟和更好的拥塞控制
  • 使用TLS 1.3协议,提供更加安全的传输
  • 在HTTP/2的基础上进一步优化,使得Web性能更加高效

HTTP/3的缺点:

  • 与HTTP/2不兼容,需要新的协议栈的支持
  • HTTP/3在早期的实现中存在一些问题,可能导致不稳定或性能问题
  • 目前,HTTP/3还处于实验阶段,尚未被广泛采用,因此可能会存在一些不确定因素

HTTPS

TIP

关于如何将HTTP升级为HTTPS,这里举例用nginx配置HTTPS,详细步骤已经在『nginx使用手册』文章中说明了,你可以参考其并结合wireshark等其他工具进行抓包分析

HTTP 是明文协议,数据传输过程中不加密,容易被攻击者窃取、篡改或冒充。而 HTTPS 通过使用 SSL/TLS 协议对数据进行加密和认证,保证了数据在传输过程中的安全性,防止数据被窃取、篡改或冒充。HTTPS不是新的协议仍是基于HTTP协议在传输层TCP之上添加了一层安全协议SSL/TSL可以说HTTPS = HTTP + SSL/TLS,大概过程如下图:

SSL/TLS

为了实现HTTP报文加密传输,引入了SSL、TLS协议。SSL(Secure Socket Layer)协议和 TLS(Transport Layer Security)协议是用于保护网络通信安全的协议,它们主要用于在客户端和服务器之间建立加密连接,保证通信过程中的机密性、完整性和可信性

SSL 和 TLS 协议工作在传输层之上,通过在传输层与应用层之间插入一层安全层来保护应用层数据的安全性。由于 SSL 协议存在一些安全漏洞和缺陷,因此 TLS 协议得以诞生并逐渐取代了 SSL 协议。TSL也经历多个版本的迭代:

  1. TLS 1.0:1999 年发布,主要基于 SSL 3.0 开发而来,对 SSL 3.0 中的一些安全漏洞做了修复,支持对称加密、非对称加密和消息摘要等算法。但是该协议存在一些缺陷,如 CBC 攻击等
  2. TLS 1.1:2006 年发布,修复了 TLS 1.0 中的一些缺陷和漏洞,支持更安全的加密算法和扩展性。此版本不支持 SSL 2.0 和 SSL 3.0
  3. TLS 1.2:2008 年发布,主要是在 TLS 1.1 的基础上进行了改进,支持更安全的加密算法和协商过程,增强了安全性和性能,目前大部分使用HTTPS的都使用了TLS1.2
  4. TLS 1.3:2018 年发布,主要是在 TLS 1.2 的基础上进行了改进,优化了握手协议,支持 0-RTT 模式,提升了性能和安全性

随着 TLS 协议版本的迭代,不断加强了安全性、性能和扩展性。建议使用 TLS 1.2 及以上版本的协议,以获得更好的安全性保障

对称/非对称加密

在讲握手前先了解下对称和非对称加密的概念,对称加密和非对称加密都是计算机安全领域中常用的加密算法,用于保护数据的安全性。它们的主要区别在于加密和解密时使用的密钥类型不同

对称加密是指在加密和解密过程中使用同一个密钥的加密算法。也就是说,加密和解密都使用相同的密钥,因此这种加密算法也称为“共享密钥加密”;非对称加密则使用不同的密钥进行加密和解密。这种加密算法需要一对密钥:一个公钥和一个私钥。公钥可以随意分发给其他人,而私钥则必须保持私密。使用公钥加密的数据只能用私钥解密,使用私钥加密的数据只能用公钥解密

两种加密算法各有优缺点:

  • 对称加密算法的优点是加密和解密速度快,适用于大量数据的加密和解密。但是,由于密钥需要在通信双方之间共享,所以在密钥分发和管理方面存在安全隐患
  • 非对称加密算法的优点是密钥不需要在通信双方之间共享,因此安全性更高,但加密和解密速度相对较慢,适用于少量数据的加密和解密

而TLS结合了两种加密算法的优点,握手阶段使用非对称加密进行密钥的共享,握手后的数据传输使用对称加密;为什么要这样设计呢?由于握手阶段双方还没有互相认证,如果使用对称加密共享秘话,这对外界都是透明的,黑客很容易拿到密钥,会有很大的安全隐患。而使用非对称加密,双方可以在本地根据一系列规则生成对应的规则避免密钥传输或者被中间人破解,大大提高安全性。由于非对称加密过程很耗时,在握手成功后二者便使用对称加密进行数据传输缩短解密时间

TLS握手

TLS有很多个版本目前主流的版本为TLS1.2和TLS1.3,每个协议版本都有多个加密算法如:RSA、DH,这里简单介绍下TLS1.2的RSA握手和DH握手,具体的密码学原理不做介绍,自行科普

I、RSA握手

  1. Client Hello:客户端发送问候消息,携带着一个随机数、加密套件、协议版本发送给服务端
  2. Server Hello:服务端收到ClientHello根据Client的加密套件选择一个密码套件,并生成一个随机数,确定协议版本后也发送一个ServerHello给客户端,其中包含密码套件、server随机数、协议版本、证书
  3. 验证证书:客户端根据CA机构验证证书的合法性,如果不合法将会握手失败,反之继续
  4. 生成预主密钥:客户端从证书中取出公钥,生成第二个随机数(pre-master)也就是预主密钥,使用公钥加密后发送给服务端
  5. 私钥解密:服务端收到客户端发送的预主密钥后,使用自己的私钥解密得到预主密钥
  6. 会话密钥:此时客户端和服务端都有3个随机数,双方都根据3个随机数和密码套件生成会话密钥,用来后续的通信加密
  7. Client Encrypted Message:客户端使用会话密钥加密消息发送一个会话摘要,等待服务端的验证
  8. Server Encrypted Message:服务端收到客户端的消息并验证后,也使用会话秘钥给客户端发送一个会话摘要
  9. 握手成功:双方验证成功后便进入正式数据传输阶段

wireshark抓包

wireshark抓包

II、DH(Diffie-Hellman)握手

  1. 客户端发送一个 ClientHello 消息给服务器,其中包含SSL/TLS协议版本号、加密套件列表、随机数等信息
  2. 服务器返回一个 ServerHello 消息给客户端,其中包含 SSL/TLS 协议版本号、加密套件(如 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384)、随机数等信息
  3. 服务器发送一个 Certificate 消息,包含服务器的证书信息,包括公钥和证书链
  4. 服务器发送一个 ServerKeyExchange 消息,其中包含 DH 公开参数和签名信息。DH公开参数包括质数p、底数g和服务器的公钥,签名信息是由服务器的私钥生成的,用于验证公开参数的合法性
  5. 客户端接收到服务器发送的 DH 公开参数后,生成一个随机数(ClientRandom),并计算出 DH 密钥交换的临时公钥。然后,客户端使用服务器的公钥和DH密钥交换的临时公钥,计算出一个共享密钥
  6. 客户端发送一个 ClientKeyExchange消息,其中包含使用服务器的公钥和DH密钥交换的临时公钥计算出的共享密钥的信息
  7. 客户端发送一个 ChangeCipherSpec 消息,表示从现在开始使用新的密钥加密通信
  8. 客户端发送一个 Finished 消息,其中包含使用新密钥加密的随机数和一个验证信息。服务器接收到该消息后,使用相同的方式验证信息的正确性,验证通过后,向客户端发送一个 ChangeCipherSpec 消息和一个 Finished 消息
  9. 客户端接收到服务器发送的消息后,使用新密钥解密 Finished 消息中的验证信息,验证通过后,握手结束,可以开始安全通信

DH 密钥交换算法的主要思想是利用质数p和底数g,实现双方在不直接交换密钥的情况下,生成相同的共享密钥 K。具体过程如下:

  • 选择两个质数 p 和 g,公开 p 和 g 的值
  • Alice 选择一个私钥 a,并计算出 A = g^a mod p,然后将 A 发送给 Bob
  • Bob 选择一个私钥 b,并计算出 B = g^b mod p,然后将 B 发送给 Alice
  • Alice 计算出共享密钥 K = B^a mod p
  • Bob 计算出共享密钥 K = A^b mod p

DH算法是TLS1.2中主流的加密算法,详细过程请自行翻阅相关文档

III、TLS1.3握手

TLS 1.3相较于TLS 1.2在握手阶段做出了以下的改变:

  • 废除了RSA、DH和DSS等非对称加密算法作为握手过程的加密方式,只保留了部分的加密算法
  • TLS 1.3的握手协议只有两个往返,比TLS 1.2简化了一半。TLS 1.3中取消了不必要的消息、字段和握手阶段,并将密钥交换过程和认证过程合并到了一个握手消息中,从而大大减少了握手时间和握手消息数量,提高了握手效率
  • TLS 1.3中增加了0-RTT模式,允许客户端在建立新连接时将上一次会话的密钥用于加密数据,从而避免了连接建立时的握手延迟,提高了连接速度

💡什么是前向安全性?在RSA算法中如果黑客得到了证书密钥,就可以对以往的会话进行破解,而DH算法在握手时都会生成临时的密钥对,即使黑客拿到了密钥也只会对当前会话造成影响,而不会对之前的历史消息造成影响,这就是前向安全性

HTTP缓存

HTTP最常见的优化资源的手段就是缓存,使用缓存可以高效的减少网络资源的请求,加快页面的渲染,减轻服务器负载提高网站的可用性

通常缓存由浏览器和服务器二者相互协商的实现的,其中常见的强缓存、协商缓存等等,由于篇幅原因这里不再详细展开,可以阅读我的「web缓存策略」一文

跨域

什么是跨域?相信每个初次遇到此情况的同学都会很迷惑。跨域问题的本质是浏览器为了保护用户的安全而采取的安全策略同源策略(Same-Origin Policy)。同源策略是一种安全策略,它要求浏览器限制脚本在不同源之间的交互。同源是指协议、域名、端口号都相同,只有在同源的情况下,浏览器才允许两个页面之间相互访问和交互数据

同源策略在 DOM、Web 数据和网络三个层面均有体现:

  • DOM同源:不同源的页面无法操作dom
  • 数据同源:不同源站点无法获取cookie、session、localstorage、IndexDB等等
  • 网络同源:不同源站点无法请求网络数据

💡如何解决跨域呢?

解决跨域的方式有很多如:JSONP、 CORS(跨域资源共享)等等,对于跨域请求浏览器都会先进行预检请求(OPTIONS)

简单、非简单请求

简单请求和非简单请求是浏览器在向服务器发送跨域请求时的两种不同类型

简单请求(Simple Request)是指浏览器向服务器发送的请求,满足以下所有条件:

  1. 使用以下方法之一:GET、HEAD、POST
  2. Content-Type 的值仅限于下列三者之一:
    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded
  3. 请求中的任何自定义 header 都使用以下方法设置:
    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type (但仅限于上面三个可选值)
  4. 请求中没有使用 ReadableStream 对象

简单请求不需要进行额外的 CORS 预检请求(CORS Preflight Request)即可跨域访问资源,浏览器会直接发送请求,并将响应数据返回给前端

非简单请求(Non-Simple Request)是指浏览器向服务器发送的请求,不满足简单请求的所有条件。在这种情况下,浏览器必须先发送一个 CORS 预检请求(CORS Preflight Request)给服务器,以确定是否允许跨域访问资源。CORS 预检请求会先使用 OPTIONS 方法发送一个带有特定 header(例如 Access-Control-Request-Method 和 Access-Control-Request-Headers)的请求,服务器收到预检请求后,根据请求头中的信息判断是否允许跨域请求。如果服务器返回允许跨域请求的响应头,浏览器才会发送实际的请求

JSONP

使用JSONP解决跨域问题,以下在请求api后会执行jsonpCb回调;JSONP仅支持GET请求,目前大多数浏览器都开始限制对 JSONP 的支持,不允许通过 script 标签加载不安全的跨域脚本文件

ts
document.querySelector("button").addEventListener("click", () => {
+	createJSONP();
+})
+function jsonpCb(res) {
+	// 处理返回的数据...
+	console.log(res)
+}
+// 创建JSONP标签加载数据
+function createJSONP() {
+	const script = document.createElement("script");
+	script.src = "http://localhost:10000/api?callback=jsonpCb"
+	document.head.appendChild(script)
+}

CORS

除了JSONP之外大多数都可以使用CORS(跨域资源共享)协议进行跨域请求,CORS 协议通过在 HTTP 头部添加一些字段来告知浏览器,哪些源可以被信任,从而使得跨域请求得以正常进行。在 CORS 协议中,服务器端需要设置Access-Control-Allow-Origin等头部信息来指定允许跨域请求的源和方法,这里使用nginx代理进行cors的配置

nginx
# 设置允许的源(IP+PORT)
+add_header Access-Control-Allow-Origin $http_origin;
+# 设置允许的 请求方法
+add_header Access-Control-Allow-Methods 'OPTIONS, GET, POST, PUT, DELETE';
+# 设置允许的请求头
+add_header Access-Control-Allow-Headers 'x-locale';
+# 其他自定义...
+# 预检请求 204 快速返回
+if ($request_method = 'OPTIONS') {
+   return 204;
+}
+proxy_set_header X-Real-IP $remote_addr;
+proxy_set_header X-Host $host;
+proxy_set_header X-Http-Host $http_host;
+proxy_set_header X-Forwarded-Scheme $scheme;
+proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+proxy_pass http://backend;

具体可以查看「nginx配置跨域」

postMessage

不做解释...

数据传输

HTTP定长传输不定长传输是两种常见的 HTTP 报文传输方式,定长传输需要在 HTTP 请求头中指定消息体的长度,服务器可以一次性读取整个消息体并返回,不定长传输通过传输编码(如分块编码)来动态地读取消息体一部分一部分的返回内容

定长传输

定长传输是一种HTTP消息传输方式,其中消息体的长度在请求或响应中预先指定。在这种传输方式中,发送方将消息体的长度包含在消息头中的Content-Length字段中,接收方使用该字段来确定消息体的长度,从而正确读取消息

使用定长传输的主要优点是,接收方可以在读取消息体之前知道其长度,从而可以更好地管理接收缓冲区的大小和减少内存分配的需求。此外,定长传输还可以简化协议的实现,因为发送方和接收方都不需要解析消息体的内容来确定其长度

sh
 curl http://localhost:10000 -I
+HTTP/1.1 200 OK
+X-Powered-By: Express
+Content-Type: application/json; charset=utf-8
+Content-Length: 12
+ETag: W/"c-QETVAhUYmmve97quvZif9EL6tqM"
+Date: Mon, 24 Apr 2023 09:12:52 GMT
+Connection: keep-alive
+Keep-Alive: timeout=5

上面的例子中,Content-Length 为 12,表示消息体的长度为 12 个字节,即 Hello World。服务器在读取到请求头之后,就知道了消息体的长度,可以一次性读取整个消息体,处理速度较快

不定长传输

在 HTTP 请求头中指定传输编码,使得 HTTP 报文的长度未知,但是可以通过不定长的方式来传输消息体。最常用的编码方式是通过Transfer-Encoding设置分块编码(Chunked Encoding),将消息体分成多个大小相等的块,每个块都带有自己的大小信息和一个表示块结束的标志,服务器在读取完一个块之后才会知道下一个块的大小和内容,从而动态地读取消息体,这种方式也被称为消息长度未确定(Message Length Unknown)方式

ts
// nodejs模拟不定长传输
+app.use("/chunked", (req, res) => {
+  res.setHeader("Transfer-Encoding", "chunked");
+
+  let timer,
+    i = 1;
+
+  // 1s返回一次 总共返回9次
+  timer = setInterval(() => {
+    res.write(\`\${i}\`);
+    if (i >= 10) {
+      clearInterval(timer);
+      res.end();
+    }
+    i++;
+  }, 1000);
+});

wireshark抓包(服务器主动发送9次)

动图展示请求过程
sh
 curl http://localhost:10000/chunked -I
+HTTP/1.1 200 OK
+X-Powered-By: Express
+Transfer-Encoding: chunked
+Date: Mon, 24 Apr 2023 08:49:25 GMT
+Connection: keep-alive
+Keep-Alive: timeout=5

不定长传输是一种灵活、高效的消息传输方式,适用于流式数据的传输和动态调整消息体长度的场景

范围请求

TIP

HTTP的范围请求在大文件的下载中发挥着重要的地位,能够有效的降低网络带宽、资源浪费的情况;使用范围请求需要服务端的支持,HTTP状态码会返回206(Partial Content)

HTTP范围(Range)请求可以用于请求服务器返回资源的部分内容。范围请求可以通过指定资源的字节范围来实现,例如请求一个视频文件的某个时间段的内容,通过在请求头中添加Range字段来实现:

sh
# 指定开始和结束
+Range: bytes=0-1
+# 指定开始一直到结尾
+Range: bytes=100-
+# 多个范围
+Range: bytes=10-20, 50-60

Range请求需要服务端的支持才可以,在支持Range请求会返回响应的头部:

sh
# 表示范围请求单位 bytes, 不支持时为none,一般也不会由此字段
+Accept-Range: bytes

当服务器收到对应的范围请求后头部也会标识对应的范围字段和整体大小:

sh
Content-Range: bytes 10-20/123456

💡使用nodejs简单的示范一下范围请求:

ts
// 发起范围请求 
+fetch("/range", { headers: { "Range": "bytes=10-100" } });
+
+// nodejs服务
+app.use("/range", async (req, res) => {
+  res.download(path.resolve(__dirname, "./test.txt"), {
+    acceptRange: true,
+  });
+});

以下是具体的传输过程中所带的信息,部分字段已经被省略:

sh
# General
+Request URL: http://localhost:10000/range
+Request Method: GET
+Status Code: 206 Partial Content
+
+# Response Headers
+Accept-Ranges: bytes
+Cache-Control: public, max-age=0
+Connection: keep-alive
+Content-Length: 1171
+Content-Range: bytes 100-1270/1271
+X-Powered-By: Express
+
+# Request Headers
+Host: localhost:10000
+Range: bytes=100-

范围请求通常的使用场景有如下:

  • 下载大文件:当需要下载大文件时,如果客户端在网络不稳定或带宽较小的情况下下载完整的文件会导致下载速度慢或者下载失败,因此使用范围请求可以只下载部分文件,从而提高下载速度和成功率
  • 音视频流的播放:在播放音视频流时,客户端可以使用范围请求来获取特定的时间段内的数据,而不是获取整个文件。这可以提高播放的响应速度和减少缓冲时间

总之,范围请求允许获取资源的部分内容,减少网络流量和提高传输速度

大文件上传与下载

了解如何进行大文件上传与下载对于HTTP的使用难点、复杂度有更深入的认识,由于篇幅原因这里不做演示了,可以查看我的「大文件上传」「大文件下载」相关文章

身份认证

我们知道HTTP是个无状态协议,想要限制资源的访问,就需要客户端与服务端建立一套身份认证机制,对于鉴别了身份的人才可以获取相关资源

常见的认证机制如CookieSessionToken等技术,这里简单介绍下Cookie和Session

Cookie是一种存储在客户端的小型文本文件(存储大小通常为4kb),它由Web服务器发送给Web浏览器,并保存在用户的本地计算机上。Cookie可以用于存储用户的会话信息、偏好设置、购物车内容等数据,以便以后使用。可以通过cookie的具体参数精确设置使用范围、过期时间等等,统一域名可以使用一个或多个cookie,浏览器发送请求时会在头部携带上相关的cookie信息,设置cookie相关参数包括:

  • 名称(Name):Cookie的名称,用于标识Cookie
  • 值(Value):Cookie的值,保存在客户端计算机上,由服务器设置
  • 域(Domain):Cookie的作用域,指定Cookie可访问的域名,只有当前域名才可以使用,可以设置具体域名,也可以使用.domain.com这种所有子域名等等
  • 路径(Path):Cookie的路径,除了指定域名外,还可以设置指定的路径,其他路径则不能使用当前cookie
  • 过期时间(Expires/maxAge):指定Cookie的过期时间,expires设置具体的时间,maxAge设置相对时间,maxAge的优先级高于expires,如果未设置,则只在当前会话中有效,关闭浏览器会失效;当maxAge位0时表示要清楚当前cookie
  • 安全(Secure):指定Cookie是否只能通过HTTPS连接传输
  • HttpOnly:只能通过HTTP协议传输,JS无法访问防止XSS攻击
ts
// 使用nodejs模拟cookie
+const express = require("express");
+const app = express();
+
+res.cookie("__ut", "123456", {
+  // maxAge: 0, 表示清除cookie
+  maxAge: 1000 * 60 * 10, // 优先级高
+  // expires: new Date("2023-04-24 10:17"),
+  httpOnly: true,  // 只允许HTTP请求使用,其他方式无法获取
+  secure: true,  // 规定cookie只能HTTPS传输
+  sameSite: "strict",  // 同站点使用
+  domain: "localhost",  // 生效的域名
+  path: "/cookie.html"  // 生效的路径,默认 / 所有路径生效
+})

上面使用nodejs设置了key为__ut、值为123456的cookie,并设置了相关的属性

ts
// 当设置了httpOnly后,无法在页面中获取
+console.log(document.cookie); // ''

当页面有了相关cookie后,在cookie没有过期时,每次请求都会携带上相关的cookie

sh
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
+Accept-Encoding: gzip, deflate, br
+Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
+Cache-Control: max-age=0
+Connection: keep-alive
+Cookie: __ut=123456
+Host: localhost:10000
+If-Modified-Since: Mon, 24 Apr 2023 01:10:45 GMT
+If-None-Match: W/"201-187b0d02a08"
+sec-ch-ua: "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"
+sec-ch-ua-mobile: ?0

Session

和Cookie相比Session是将认证信息存储在服务器,由服务器进行管理。具体是用户登录后服务器将会生成一个session对象,该对象包含一个唯一的sessionId还有过期时间等其他信息,服务端将sessionId存入cookie中设置到客户端,这样用户下次访问时便会带上cookie,服务器根据cookie中的sessionId对比存储起来的session信息,这便是session的原理

由于session存放在服务端,当数据量大时会消耗很多资源,采用负载均衡时要保持数据的同步和一致

这里不再演示Session的使用方法,感兴趣的同学可以自行搜索。此外还可以使用token的方式进行认证,这里不再介绍

HTTP攻击

HTTP是互联网上最常用的协议之一,也是攻击者经常利用的目标之一。攻击者可以通过利用HTTP协议的漏洞或者弱点,实施各种攻击,如请求欺骗、SQL注入攻击、跨站脚本攻击、跨站请求伪造攻击、拒绝服务攻击等。这些攻击可能会导致用户隐私泄露、系统瘫痪、数据丢失等严重后果,给个人和企业带来极大的损失

这里将列举常见的几种攻击,并结合例子演示攻击过程以及有效的防御措施

XSS

温馨提示

🔍 本模块的代码可以点击这里查看

XSS(Cross-Site Scripting)攻击是一种常见的Web安全漏洞,攻击者利用这种漏洞向网站注入恶意脚本代码(运行了不明来历的代码),使得当其他用户访问这个网站时,这些恶意脚本代码会在他们的浏览器中执行,从而达到攻击者的目的,比如窃取用户的敏感信息、篡改网页内容、盗用用户账户等。XSS攻击通常分为三种类型:反射型XSS存储型XSSDOM-based XSS

类型存储区插入点
存储型 XSS后端数据库HTML
反射型 XSSURLHTML
DOM 型 XSS后端数据库/前端存储/URL前端 JavaScript
  1. 存储型:通常是后端没有对SQL进行过滤,将恶意代码存储到了数据库中,渲染时恶意代码直接渲染到页面上了,没有转义时就会收到攻击
    sh
    # 假如插入一个脚本
    +insert into article values ('<script>alert("xss")</script>');
    +
    +# 页面在服务端渲染时
    +<article><%= getArticle('xxx')></article>
    +
    +# 出码结果,当浏览器运行时就会弹出 xss
    +<article><script>alert("xss")</script></article>
  2. 反射型:通常是将恶意代码存在链接中,服务端渲染时,取到链接参数渲染页面,没有进行转义就会收到攻击
    sh
    # 假如有一个恶意的链接
    +# https://www.website.com?id=<script>alert('xss')</script>
    +
    +# 服务端渲染
    +<user><%= getParameter('id')%></user>
  3. DOM型:这类通常是JS的一些漏洞,通过JS将恶意代码渲染到页面上
    js
    // JS有一段这样的逻辑
    +document.body = getURLQuery('id')
    +# https://www.website.com?id=<script>alert('xss')</script>

💡那么如何防止XSS攻击呢?

通过以上的分析可以得出XSS攻击产生恶意的脚本,然后在浏览器渲染时执行,可以通过以下方式进行防御:

  • 前端或后端对传入的内容进行转义(需要区分不同场景,转义不会影响页面渲染时)
  • 后端存储入库时进行转义(同上)
  • 页面渲染时进行字符转义(重要)

💡 除了简单的转义操作,还可以使用CSP(Content Secure Policy)web内容安全策略,CSP 通过指定可信任资源的白名单,限制网页内容只能从指定的源加载,从而有效地减少了攻击者利用恶意脚本注入攻击的可能性,简单来讲此属性就是来配置资源加载白名单,符合白名单的才会加载,其余的浏览器都会阻止资源加载

CSP语法规则:

sh
Content-Security-Policy: <policy-directive> [value1, [value2, [...]]]; <policy-directive> ...
+Content-Security-Policy-Report-Only: 同上

以上是定义Content-Security-PolicyContent-Security-Policy-Report-OnlyHTTP头部的语法规则,可以定义多个策略指令,指令之间使用;分隔;每个指令都可以定义多个值,多个值之间使用空格分隔;以上两个字段的区别在于Content-Security-Policy-Report-Only并不会阻止不安全的内容被加载,而是只会向服务器报告违规的内容,CSP-RO 只是提供了一种测试 CSP 策略的方式,而不会对实际的安全策略产生影响。以下是两者常见的指令:

  • default-src:指定了所有其他资源类型的默认源。如果没有其他资源类型的特定源被指定,则使用此默认源
  • style-src:指定了可以加载 CSS 样式表的源
  • script-src:指定了可以加载 JavaScript 脚本的源
  • img-src:指定了可以加载图像资源的源
  • connect-src:指定了可以从文档加载的资源的来源,例如 XHR、WebSockets 或者 fetch
  • frame-ancestors:指定了可以嵌入到文档中的父级的源,以及使用 frame-ancestors 'none' 表示文档不能被嵌入到任何父级中
  • frame-src:指定了可以嵌入到文档中的子资源(如 frame 和 iframe)的源,建议使用 child-src 代替
  • child-src:指定了可以嵌入到文档中的子资源(如 frame 和 iframe)的源
  • manifest-src:指定了用于获取 web 应用程序清单文件的源
  • report-uri:指定了接收违规报告的 URI

这里只列出了部分的字段,更多字段的使用你可以查看MDN相关文档

这些字段的值可以设置成自己配置允许的域名外,同时也支持一些通配符如http://*.usword.cn,还有一些内置的值:

  • none:表示不允许从任何来源加载资源
  • self:表示只允许从同一域名加载资源,即只允许从当前网站的域名加载资源
  • unsafe-inline:表示允许在 HTML 元素的 style 属性和 script 元素内嵌入 JavaScript 代码
  • unsafe-eval:表示允许使用 eval() 和 new Function() 等方法执行动态生成的 JavaScript 代码
  • strict-dynamic:表示允许执行指定源的 JavaScript 代码,但是只有当这些源已经在页面中加载过了,并且只有在执行 JavaScript 代码之前进行了一些必要的检查之后才能执行

👇 下面来演示CSP的使用:

  1. 假设以下是我们的网站页面,其中包含了引用的css脚本、内嵌css脚本、iframe、img、引用js、内嵌js

    html
    <!DOCTYPE html>
    +<html lang="en">
    +<head>
    +	<link rel="stylesheet" href="style.css">
    +</head>
    +<body>
    +	<h2>论坛页面</h2>
    +	<style nonce="argus-csp-token">
    +  	button {
    +    	color: blue;
    +  	}
    +	</style>
    +
    +	<iframe width="300" src="https://www.youtube.com/embed/JeI_TsADXQA" allowfullscreen></iframe>
    +	<img nonce="argus-csp-token" src="https://general-mac.com/images/k8s-fine.jpg?w=400" style="display: block;" alt="">
    +	<script nonce="argus-csp-token" src="http://localhost:10001/other.js"></script>
    +	<script nonce="argus-csp-token">
    +  	console.log("内嵌脚本执行")
    +	</script>
    +</body>
    +</html>
  2. 通过以下设置允许youtube的iframe、general-mac.com的图片、内嵌js,就是不允许其他域名的js,同时CSP-RO对于不是当前域名的样式发出报告,对于上面的网页内嵌css就会被上报,但不影响资源的加载

    ts
    app.use(async (req, res, next) => {
    +	if (/\\.html?[^\\/]*/gi.test(req.path)) {
    +    	res.header(
    +    		"Content-Security-Policy",
    +    		"img-src https://general-mac.com;script-src http://website.com 'unsafe-inline'; frame-ancestors http://website.com; frame-src https://youtu.be https://www.youtube.com; report-uri /report"
    +    	);
    +    	res.header(
    +    		"Content-Security-Policy-Report-Only",
    +    		"style-src 'self'; report-to main-endpoint"
    +    	);
    +    	res.header(
    +	      "Reporting-Endpoints",
    +	      'main-endpoint="http://192.168.11.142:10000/report"'
    +	    );
    +	}
    +});

    在浏览器访问网页时,对于内联的css资源就会发出report报错,但不会影响样式

    同时上面提供了上报的地址为/report,这里nodejs模拟一个上报接口:

    ts
    // CSP POLICY REPORT
    +app.use("/report", (req, res) => {
    +  // 针对上报上来的数据存储分析...
    +  res.json({
    +    code: 200,
    +    report: true,
    +  });
    +});

    上报的格式长下面这个样子,具体的字段这里就不解释了,可以查看MDN文档

    注意

    report-uri已经被废弃了,请使用report-to代替,report-to需要配合Reporting-Endpoints,详情请查看文档,注意CSP Leve3还没有完全被支持

除了配置CSP来限制资源的下载,还可以设置一些X-XSS-ProtectionX-Frame-OptionsX-Content-Type-OptionsStrict-Transport-SecurityX-Download-Options来加强安全防范,这些字段的具体使用可以点击查看官方文档,简单演示下:

sh
# 启用 XSS 过滤。如果检测到攻击,阻止页面加载
+X-XSS-Protection: 1; mode=block
+# 该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许
+X-Frame-Options: DENY
+# 禁止客户端的 MIME 类型嗅探行为
+X-Content-Type-Options: nosniff
+# 通知浏览器应该只通过 HTTPS 访问该站点,并且以后使用 HTTP 访问该站点的所有尝试都应自动重定向到 HTTPS
+Strict-Transport-Security: max-age=31536000; includeSubDomains
+# 告诉浏览器禁止打开下载的文件
+X-Download-Options: noopen

CSRF

温馨提示

🔍 本模块的代码可以点击这里查看

CSRF(Cross-Site Request Forgery)攻击利用漏洞伪造用户的请求,使得当用户在访问一个被攻击者控制的网站时,恶意请求会被发送到一个受害者网站,从而完成攻击。比如攻击者可以伪造一个包含恶意操作的表单,当用户在攻击者控制的网站上提交这个表单时,实际上是向受害者网站发送了一个带有攻击代码的请求,从而实现攻击。CSRF攻击可以导致用户在不知情的情况下执行了恶意操作,比如修改账户信息、转账、发送垃圾邮件等

🔗 CSRF攻击演示

这里使用nodejs简单的模拟银行转账的过程,我们知道CSRF攻击是通过第三方网站进行攻击的,这里模拟两个网站,一个是正常的论坛类型网站192.168.11.143:10000,黑客在上面发布了一条链接指向黑客网站localhost:10001,当受害人登录后点击黑客发布的链接,就会被攻击。具体步骤如下:

  1. 这是正常的论坛页面,小明登录后,页面种下登录信息cookie,然后小明点击了黑客在页面上发的链接

  2. 黑客链接页面localhost:10001/hack.html很简单,隐藏了一个表单,进入页面会自动请求http://192.168.11.143:10000/transfer并设置对应的参数amountto

    html
    <!-- 黑客网站 -->
    +<form method="post" action="http://192.168.11.143:10000/transfer">
    +<input type="hidden" name="amount" value="10000">
    +<input type="hidden" name="to" value="攻击者账号">
    +</form>
    +
    +<script>
    +document.querySelector("form").submit();
    +</script>
  3. 当小明点击了黑客的链接后跳转到黑客页面后自动提交表单发起转账请求,请求也携带了小明cookie,服务器以为是小明自己发起的请求,这样就会转账成功。如下图Chrome Devtools记录了整个请求流程 以上简单的演示了攻击过程,当然黑客不可能发布这么明显的链接,通常都会用诱人的内容(如:中奖、图片等等)来勾引你点击,而就是这么简单的操作就会被攻击

💡 那么如何防止CSRF攻击呢?

防止CSRF攻击的方式还是有很多种,这里介绍常见的抵御方式

  1. 验证来源站点Referer、Origin:浏览器会对页面中的所有请求添加Referer头来标识请求来源,通过对比Referer字段来判断是不是本站请求,不是的都统统禁止掉,这里使用nginx演示不是website.com域的都被禁止了

    nginx
    server {
    +	location / {
    +		# 只允许 website.com相关域名可以访问,其余都会返回 403
    +		valid_referers none blocked server_names "~.*website\\.com$";
    +		if ($invalid_referer) {
    +			return 403;
    +		}
    +	}
    +}

    这种方式并不是很安全,Referer头可能被篡改。而此种方式对于搜索引擎打开是硬伤,因为从搜索引擎中打开链接都会携带相关联的Referer头,如下图搜索本博客时打开,会带上google的域名,这样打开时就会被禁止掉403

    除了Referer,Origin头字段也可以用来判断请求的来源,而当页面重定向时Origin头不会存在,它们都是简单的防御策略

  2. 使用 SameSite Cookie 属性:我们知道此类攻击是盗用了受害者的身份信息,只要限制了第三方使用身份信息也能阻止攻击。Cookie支持 SameSite 属性,其有三个值:Strict、Lax 和 None。其中,Strict 表示完全禁止第三方 Cookie,Lax 表示只允许 GET 请求时携带第三方 Cookie,None 表示允许所有请求携带第三方 Cookie。建议使用 Lax,因为在大多数情况下都足够安全

    ts
    setCookie('key', 'value', {
    +	// 其他设置...
    +	sameSite: 'Lax'
    +})

    虽然samesite能够防止一定的csrf攻击,但也会对一些第三方登录等功能进行限制

  3. 双重验证(cookie、token、验证码):利用双重验证来提高安全性,假如每次表单提交,在页面中隐藏一个合法token,请求时携带给后端,后端拿到后验证token的合法性;再比如使用验证码,对于重要敏感的操作都进行验证码验证,提高安全性

WebSocket

WebSocket 是一种基于TCP协议的新型网络通信协议,它可以在浏览器和服务器之间建立双向实时通信的连接,可以用于实现各种实时应用,例如聊天室、多人游戏、股票行情等。在传统的 HTTP 协议中,需要使用轮询(Polling)或长轮询(Long Polling)等技术来实现实时通信,这些技术效率低下、延迟高。WebSocket 连接是长久保持的,可以支持服务器主动向客户端推送数据,而不需要客户端频繁地向服务器发送请求

websocket是一种全新的协议,和HTTP没有半点关系,为了兼容旧的http协议通常先使用HTTP请求通过ConnectUpgrade头进行协议升级为websocket,如果当前环境支持websocket协议就会升级成功。具体实现步骤如下:

  • 客户端通过 HTTP 或 HTTPS 协议向服务器发送 WebSocket 连接请求。请求的格式与普通的 HTTP 请求相同,其中请求头包含ConnectionUpgradeSec-WebSocket-KeySec-WebSocket-Version等几个重要的头部字段:
    sh
    GET /chat HTTP/1.1
    +Host: server.example.com
    +# 升级为 websocket
    +Upgrade: websocket
    +# 想要升级当前协议
    +Connection: Upgrade
    +# 客户端随机生成的字符串,用于确保握手请求的唯一性
    +Sec-WebSocket-Key: [随机生成的字符串]
    +# 指示客户端使用的 WebSocket 协议的版本号
    +Sec-WebSocket-Version: 13
  • 服务器收到请求后如果允许协议升级,将会返回相应的头部字段,其中包含UpgradeConnectionSec-WebSocket-Accept等几个重要的头部字段:
    sh
    # 状态101协议转换
    +HTTP/1.1 101 Switching Protocols
    +# 可以升级到websocket
    +Upgrade: websocket
    +# 升级协议
    +Connection: Upgrade
    +# 服务器通过计算客户端的 Sec-WebSocket-Key 字段值生成的随机字符串,并进行 SHA-1 加密
    +# 客户端拿到此值后会对值进行验证
    +Sec-WebSocket-Accept: [加密后的 Sec-WebSocket-Key 字段值]
  • WebSocket 连接建立成功后,客户端和服务器就可以进行实时的双向通信了。客户端和服务器可以发送文本、二进制数据等消息,消息会被分割成多个数据帧进行传输。数据帧由帧头和帧体组成,帧头包含了一些元数据,例如消息类型、消息长度等信息

📌 使用websocket简单实现多人聊天

通过简单的HTML页面和nodejs实现多人聊天,没有登录认证等相关操作,关心核心socket通信就行了,本次代码你可以在 github 中查看

简单的HTML页面(自行发挥):

html
<ul></ul>
+<input type="text"><button>发送</button>
+
+<script type="module">
+	const ws = new WebSocket("ws://localhost:10000/socket");
+	const input = document.querySelector("input");
+	const btn = document.querySelector("button");
+	const chat = document.querySelector("ul");
+
+	const url = new URLSearchParams(location.search);
+
+	const id = url.get("name") || "游客" + +new Date();
+	const reader = new FileReader();
+
+	ws.addEventListener("error", (err) => {
+	  console.log(err);
+	});
+
+	ws.addEventListener("open", () => {
+	  sendMessage(id + "上线了");
+	});
+
+	ws.addEventListener("message", (ev) => {
+	  if (ev.data instanceof Blob) {
+	    reader.readAsText(ev.data);
+	    reader.onload = () => {
+	      const { id: resId, msg } = JSON.parse(reader.result) || {};
+	      if (resId !== id) {
+	        const li = document.createElement("li");
+	        li.innerHTML = \`-「\${resId}」说:\${msg}\`;
+	        chat.appendChild(li);
+	      }
+	    };
+	  } else {
+	    console.log(ev.data);
+	  }
+	});
+
+	btn.addEventListener("click", () => {
+	  sendMessage(input.value);
+	  const li = document.createElement("li");
+	  li.className = "me";
+	  li.innerHTML = \`「我」说:\${input.value} -\`;
+	  chat.appendChild(li);
+	  input.value = "";
+	});
+
+	function sendMessage(msg) {
+	  ws.send(JSON.stringify({ id, msg }));
+	}
+</script>

使用nodejs创建服务端:

js
const express = require("express");
+const bodyParser = require("body-parser");
+const app = express();
+const http = require("http");
+const { WebSocketServer } = require("ws");
+const server = http.createServer(app);
+
+app.use(bodyParser.urlencoded({ extended: false }));
+app.use(bodyParser.json());
+app.use((req, res, next) => {
+  res.cookie("__ut", "emmmmm", { maxAge: 1000000000, httpOnly: true });
+  next();
+});
+app.use(express.static("./static"));
+
+const wss = new WebSocketServer({
+  server,
+  path: "/socket",
+});
+
+wss.on("connection", (ws, clientConnect) => {
+  // console.log(clientConnect.headers.cookie);
+  ws.on("message", (data) => {
+    const { id, msg } = JSON.parse(data.toString("utf8"));
+    console.log(id, msg);
+
+    wss.clients.forEach((client) => {
+      client.send(data);
+    });
+  });
+  ws.send("hello");
+});
+
+server.listen(10000, () => console.log("server on 10000"));

以上创建好了后,通过http://localhost:10000访问页面,url上的name参数表示用户的名字,没有时默认显示游客+时间戳,现在你可以打开过个tab访问此页面,进行实时通讯吧,以下是几个截图:

更完善更复杂的websocket应用还需要你自己发挥想象,这里就做这么多介绍

参考文档

总结

本篇文章大部分偏概念总结,自己学习时要结合实际练习,这样才不会觉得那么枯燥空洞

`,160);function y(D,d,u,b,m,h){const l=n("Reward"),p=n("Gitalk");return r(),o("div",null,[i,t(" 为什么需要头部压缩,在HTTP/1.1时传输数据时都会携带大量的头部信息,有时头部的长度可能都会大于真实的数据长度,这样将会严重浪费浪费流量,如下图:头部的长度173字节,而响应实体部分的长度才6字节,两者差距太大,严重影响流量,当使用HTTP2时头部长度已经压缩为64字节,大大减小头部长度,这就是HTTP2的压缩技术 "),F,s(l),s(p)])}const E=e(c,[["render",y]]);export{C as __pageData,E as default}; diff --git a/assets/frontend_computer-network_http-protocol.md.fxY3d9SH.lean.js b/assets/frontend_computer-network_http-protocol.md.fxY3d9SH.lean.js new file mode 100644 index 000000000..1ef312547 --- /dev/null +++ b/assets/frontend_computer-network_http-protocol.md.fxY3d9SH.lean.js @@ -0,0 +1 @@ +import{_ as e,c as o,a as t,J as s,V as a,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"HTTP协议及安全防范","description":"HTTP超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议,客户端通过发送请求到服务器来获取资源,服务器则根据请求返回响应。HTTP协议也是受攻击的重灾区如XSS、CSRF攻击,学会使用相关措施如CSP、HTTP安全防范等有效防止攻击发生","frontmatter":{"title":"HTTP协议及安全防范","description":"HTTP超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议,客户端通过发送请求到服务器来获取资源,服务器则根据请求返回响应。HTTP协议也是受攻击的重灾区如XSS、CSRF攻击,学会使用相关措施如CSP、HTTP安全防范等有效防止攻击发生","keywords":"HTTP状态码,跨域,HTTP范围请求,大文件上传,大文件下载,TLS握手,WebSocket,HTTP攻击,HTTP缓存,协商缓存,强缓存,KeepAlive,HTTPS,CSP,Content-Secure-Policy,HTTP2,QUIC,HTTP3","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-http.png"},"headers":[],"relativePath":"frontend/computer-network/http-protocol.md","filePath":"frontend/computer-network/http-protocol.md","lastUpdated":1706247228000}'),c={name:"frontend/computer-network/http-protocol.md"},i=a("",68),F=a("",160);function y(D,d,u,b,m,h){const l=n("Reward"),p=n("Gitalk");return r(),o("div",null,[i,t(" 为什么需要头部压缩,在HTTP/1.1时传输数据时都会携带大量的头部信息,有时头部的长度可能都会大于真实的数据长度,这样将会严重浪费浪费流量,如下图:头部的长度173字节,而响应实体部分的长度才6字节,两者差距太大,严重影响流量,当使用HTTP2时头部长度已经压缩为64字节,大大减小头部长度,这就是HTTP2的压缩技术 "),F,s(l),s(p)])}const E=e(c,[["render",y]]);export{C as __pageData,E as default}; diff --git a/assets/frontend_computer-network_ip-protocol.md.ZfcsangK.js b/assets/frontend_computer-network_ip-protocol.md.ZfcsangK.js new file mode 100644 index 000000000..63e663093 --- /dev/null +++ b/assets/frontend_computer-network_ip-protocol.md.ZfcsangK.js @@ -0,0 +1,4 @@ +import{_ as o,c as i,J as a,V as n,o as t,G as e}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"IP协议","description":"IP协议是一种无连接、不可靠协议,在网络中的传输提供了统一的标准,负责将数据包从源地址传输到目的地址,是一个32位的二进制数字,通常被表示成四个由点分隔的十进制数,每个网络设备都需要具有一个唯一的IP地址,以便在网络中进行通信","frontmatter":{"title":"IP协议","description":"IP协议是一种无连接、不可靠协议,在网络中的传输提供了统一的标准,负责将数据包从源地址传输到目的地址,是一个32位的二进制数字,通常被表示成四个由点分隔的十进制数,每个网络设备都需要具有一个唯一的IP地址,以便在网络中进行通信","keywords":"IP协议,IP首部,IP地址,IPV4,IPV6,私网地址,子网划分,子网掩码,回环地址,IP分片,IP重组","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-network.png"},"headers":[],"relativePath":"frontend/computer-network/ip-protocol.md","filePath":"frontend/computer-network/ip-protocol.md","lastUpdated":1706247228000}'),p={name:"frontend/computer-network/ip-protocol.md"},c=n(`

IP协议

IP(Internet Protocol)协议是互联网通信中最重要的协议之一,它是在TCP/IP协议族中的网络层协议。IP协议为数据在网络中的传输提供了统一的标准,使得不同的计算机和网络设备能够相互通信。IP协议负责将数据包从源主机发送到目的主机,并且确保数据包在传输过程中不会丢失或损坏

IP协议是一种无连接协议,它不对数据包进行任何形式的确认或控制。它仅仅负责将数据包从源地址传输到目的地址,因此它也被称为“不可靠协议”。不过,在实际的网络中,TCP(Transmission Control Protocol)协议通常会和IP协议一起使用,以提供可靠的数据传输服务

IP地址

注意

本篇IP内容主要以IPV4为主,IPV6会单独的说明

每个网段中的全0和全1不能使用,0地址不能作为IP,全1表示广播地址不能作为IP使用

IP协议中最重要的部分是IP地址,它是一个32位(IPV4)由4个8位二进制组成的数字,通常被表示成四个由点分隔的十进制数。IP地址的作用是唯一地标识一个计算机或网络设备。每个网络设备都需要具有一个唯一的IP地址,以便在网络中进行通信

IP地址示意图:

IP地址分类

  • A类地址:A类地址最高位为0,其余31位用于网络地址和主机地址的划分。其中,前8位表示网络地址,后24位表示主机地址。A类地址的网络地址范围为1.0.0.0~127.0.0.0,其中1.0.0.0被保留作为本地环回地址,127.0.0.0/8用于环回测试。A类地址可用于较大规模的网络,可以连接2^24台主机
  • B类地址:B类地址最高位为10,其余30位用于网络地址和主机地址的划分。其中,前16位表示网络地址,后16位表示主机地址。B类地址的网络地址范围为128.0.0.0~191.255.0.0,可以连接2^16台主机
  • C类地址:C类地址最高位为110,其余29位用于网络地址和主机地址的划分。其中,前24位表示网络地址,后8位表示主机地址。C类地址的网络地址范围为192.0.0.0~223.255.255.0,可以连接2^8台主机
  • D类地址:D类地址最高位为1110,用于多播(Multicast)通信,范围为224.0.0.0~239.255.255.255
  • E类地址:E类地址最高位为1111,保留为将来使用,范围为240.0.0.0~255.255.255.255

私网地址

IPv4中私有IP地址的范围如下:

  • A类私有地址:10.0.0.0 ~ 10.255.255.255
  • B类私有地址:172.16.0.0 ~ 172.31.255.255
  • C类私有地址:192.168.0.0 ~ 192.168.255.255

需要注意的是,私有IP地址只在内部网络中使用,如果需要连接互联网或与其他网络通信,需要使用公有IP地址。在使用私有IP地址时,还需要注意避免与公有IP地址冲突,以免造成网络故障

回环地址

回环地址(Loopback Address)是一个特殊的IP地址,用于将数据包发送到同一台计算机上的网络接口。回环地址常用于本地主机进行自测、测试和故障排查,可以用来检查计算机的网络接口是否正常工作、网络协议是否正确等

在IPv4中,回环地址为127.0.0.1,也可以用其他以127开头的地址,如127.0.0.2、127.0.0.3等

使用回环地址发送的数据包不会离开本地计算机,而是会被传递到本地计算机上的网络协议栈,然后被相应的协议处理。在本地计算机上,回环地址就像是本地网络上的另一个设备一样,可以与其进行通信。由于回环地址不会通过网络传输,因此不需要担心安全问题

💡localhost、本机地址、0.0.0.0的区别?

  • localhost:localhost是一种特殊的主机名,表示本地计算机的回环地址,通常为127.0.0.1
  • 本机地址:网络中真实存在的IP地址
  • 0.0.0.0:一种特殊的IP地址,表示任意主机或任意网络,监听所有可用的网络接口。如果服务器绑定了0.0.0.0地址,那么它可以接受来自任意IP地址的网络请求

localhost指本机的回环地址,当访问时会走本机的内部网卡访问本机的服务;本机地址都是真实的IP地址,不管是内网还是公网,当访问本机地址时会转发到路由器再转发到本机地址;0.0.0.0一种特殊的IP,当web应用使用此IP监听时,表示可以通过任意网卡进行访问此服务

网络划分

网络划分指的是将一个较大的IP地址空间划分成多个较小的子网,以便更好地管理和利用IP地址资源。网络划分可以实现网络地址的细分,提高网络的安全性和性能,还可以帮助网络管理员更好地组织和管理网络设备和资源

子网掩码

子网掩码(Subnet Mask)是一个32位二进制数,用于标识一个IP地址所属的网络和主机部分。子网掩码中,网络部分用1表示,主机部分用0表示。网络掩码必须和IP地址一起使用,用于将一个IP地址分成网络和主机两部分

划分实现

划分子网时,需要确定每个子网的网络地址和主机地址范围,以及子网掩码。通常,网络管理员需要根据网络规模和需求,来确定子网的数量和大小

划分子网的好处:

  • 提高网络性能:划分子网可以减少广播域的范围,从而减少广播消息的传输量,提高网络性能
  • 提高网络安全性:划分子网可以将网络分段,每个子网都有独立的网络地址,可以设置不同的访问控制策略,提高网络安全性
  • 灵活管理IP地址:划分子网可以更灵活地管理IP地址,可以根据需要分配IP地址,避免浪费
  • 支持多个网络应用:划分子网可以为不同的网络应用提供独立的网络空间,避免应用之间的干扰和冲突
  • 支持网络扩展:划分子网可以支持网络的扩展,当网络规模增大时,可以通过划分子网来扩展网络

网络划分一般遵循以下规则:根据最小子网数往后移动主机位,1位可以划分2个子网,2位可以划分3个子网,根据公式2^n(n<=8)判断最小子网数,一般一个网络内有255个范围主机可以进行划分

假如在局域网192.168.1.0/24上需要划分2个64位主机,1个128为主机,最小子网数为64,根据公式可以知道主机位往后移动2位可以得到4段子网,最小主机位64,因此划分如下:

  • 子网A:192.168.1.0/26,子网掩码255.255.255.0,IP地址可用范围192.168.1.1 ~ 192.168.1.62
  • 子网B:192.168.1.0/26,子网掩码255.255.255.64,IP地址范围192.168.1.65 ~ 192.168.1.126
  • 子网C:192.168.1.128/26,子网掩码255.255.255.128,IP地址可用范围192.168.1.129 ~ 192.168.1.253

注意每个子网中的最后一个地址不能使用,其都会作为广播地址使用

广播、多播

前面知道了IP作为主机的唯一标志,用来和其他的主机进行通信,通常都是一对一这种通信方式。此外还有多播、广播、定向广播等通信方式

广播是一种将数据包发送给网络中(局域网)所有设备的通信方式。发送广播包时,在目的地址字段中使用特殊的广播地址,例如IPv4网络中使用255.255.255.255地址,IPv6网络中使用ff02::1地址。广播是一种无差别的通信方式,适用于需要向所有设备发送相同信息的情况,例如DHCP服务器向所有客户端发送IP地址信息

多播是一种将数据包发送给网络中一组设备的通信方式。多播使用特殊的组播地址,可以将数据包发送给一个或多个组中的设备。多播是一种有选择性的通信方式,适用于需要向特定设备组发送相同信息的情况,例如视频流媒体服务向所有订阅者发送视频数据

定向广播是一种将数据包发送给网络中某个子网内所有设备的通信方式。定向广播使用子网广播地址,可以将数据包发送给同一子网内的所有设备。定向广播是一种有限的通信方式,适用于需要向同一子网内所有设备发送相同信息的情况,例如ARP协议中用于查找MAC地址的请求

IPV6

IPv4地址的地址空间较小,只有2^32(约42亿)个地址,已经不足以满足当今互联网设备的需要。IPv6使用8组二进制每组16位组成,可以组成的IP数为2^128大约是3.4×10的38次方,可以为地球上的每一粒沙子分配一个IP,因此IPv6被广泛应用可以完美的解决IPv4的多种问题

IPv6使用8组4位的十六进制数表示,每组之间使用冒号分隔:

sh
2001:0db8:85a3:0000:0000:8a2e:0370:7334

IPv6地址中也可以使用双冒号(::)表示一组或多组0,例如:

sh
2001:0db8::8a2e:0370:7334

IPv6的主要特点如下:

  • 更大的地址空间:IPv6使用128位地址,相对于IPv4的32位地址,IPv6可以提供更大的地址空间,可以支持更多的设备连接到互联网
  • 简化的首部格式:IPv6的首部格式相对于IPv4更加简化,减少了首部长度,提高了路由器处理包的效率
  • 支持QoS:IPv6支持服务质量(QoS)机制,可以根据不同的应用需求提供不同的网络服务质量
  • 更好的路由支持:IPv6采用一种称为“无类别域间路由选择(CIDR)”的新的路由选择机制,可以减少路由表的规模,并提高路由效率
  • 更强的安全性:IPv6支持IPSec(Internet协议安全性),可以提供更强的网络安全性,保护数据的机密性和完整性
  • 兼容IPv4:IPv6可以与IPv4兼容,可以通过IPv4地址转换技术实现IPv4和IPv6之间的互通

IP首部

  • 版本:IP协议的版本号,IPv4为4, IPv6为6
  • IHL(Internet Header Length):IP首部长度占4位单位为4字节。因此首部长度的最大值60,而头部的固定长度为20,因此最小值为5(0101),可选部分的最大长度为40,这里的长度和TCP的长度一致
  • 服务类型:指定了IP数据包的优先级和QoS(Quality of Service)等信息
  • 总长度:整个IP数据包的长度,包括IP首部和数据负载,占16位,可以算出IP数据包的最大值为2^16-165535字节
  • 标识符:用于唯一标识一个IP数据包。为了避免将一个数据报分片和其他数据 报分片混淆,发送主机通常在每次(从它的一个IP地址)发送数据报时都将一个内部计数器 加1,并将该计数器值复制到IPv4标识字
  • 标志位:用于指示IP分片和重组的信息
  • 分片偏移:指示该片段相对于原始数据包的偏移量
  • 生存期(TTL):设置一个数据报可经过的路由器数量的上限,以防止数据包在网络中无限制地循环传输
  • 协议:协议类型,指示了IP数据包中包含的上层协议类型,如TCP(6)、UDP(17)、ICMP(1)等
  • 头部校验和:IP首部的校验和,用于检查IP首部是否出错,不会检查数据的正确性
  • 源IP:数据包的发送者的IP
  • 目的IP:数据包的接收者的IP
  • 选项:可选字段,用于扩展IP首部的功能,如时间戳、记录路由等

抓包分析IP首部字段:

生存期TTL

TTL(Time To Live)是一种在IP协议中使用的字段,它用于限制数据包在网络中的生存时间。每当一个IP数据包经过一个网络设备(如路由器)时,它的TTL值会减少1。当TTL值减少到0时,数据包将被丢弃,不再继续传输,从而避免数据包在网络中无限循环,同时也会通知发送者目的地不可达

TTL生存期示意图: 以上假如TTL的值为5,当数据包经过交换机时TTL的值并不会减去1,只有经过路由器时才会减1,因为路由器需要确保数据包不会在网络中无限循环;当TTL=0时还没有到达目的地时,数据包将会被抛弃掉,然后发送Time-to-live exceeded报文告诉发送端已经超时

sh
 ping 192.168.12.1 -t 2
+PING 192.168.12.1 (192.168.12.1) 56(84) bytes of data.
+From 192.168.86.1 icmp_seq=1 Time to live exceeded

TTL的作用有以下几个方面:

  • 避免网络数据包在网络中无限循环,减少网络拥堵和流量。
  • 保证数据包能够在网络中迅速传输,避免数据包在网络中长时间滞留。
  • 保证数据包能够到达目的地址,避免数据包在网络中迷路或被错误地传输到其他地方。

TTL的默认值为64,可以通过以下方式查看:

sh
 cat /proc/sys/net/ipv4/ip_default_ttl
+64

IP分片、重组

IP分片和重组是IP协议中用于处理大型数据包的机制。在IP协议中,每个数据包的大小被限制在最大传输单元(MTU)以下。如果要发送的数据包超过MTU大小,则必须将其分成多个较小的数据包进行传输,这个过程称为IP分片

从IP的头部信息可以知道IP协议的最大长度为2^16-165535字节,而链路层的最大MTU(最大传输单元)为1520,去掉链路层的收尾部长度20,那么实际传输的数据大小为1500,因此的当IP数据包超过MTU(1500)时就会分片

IP分片是指将原始数据包分成若干个更小的数据包,以便在网络中传输。这些数据包在传输过程中可能会经过不同的路径,因此可能会以不同的顺序到达目标设备。目标设备将重新组合这些分组数据包,以恢复原始数据包

TIP

IP分片会增加网络传输的复杂性和延迟,因此,尽量避免使用过大的IP数据包。在实际应用中,可以通过调整TCP等传输协议的窗口大小来优化网络传输性能,减少IP分片的发生;如TCP协议会通过数据分段将数据分割成每段MSS(1460)的大小,这样当数据传输到网络层时就不会有IP分片的发生了

重组是指在目标设备上重新组合IP分片,以恢复原始数据包。当目标设备接收到分片的IP数据包时,它将使用源IP地址、目标IP地址、协议号和标识符等信息来确定这些分片属于同一个原始数据包,并将它们重新组合成一个完整的数据包。如果在传输过程中有任何一个或多个数据包丢失或损坏,则重组过程将无法完成,目标设备将丢弃这些数据包并请求重新发送它们

NAT

网络地址转换(NAT,Network Address Translation)是一种在网络路由器上执行的技术,用于将私有IP地址转换为公共IP地址。NAT主要的作用是允许多个设备在一个公共IP地址下访问互联网。在NAT的实现中,路由器会为内部网络中的每个设备分配一个私有IP地址,并将所有对互联网的请求发送到一个公共IP地址上。NAT将发送到公共IP地址的请求转换为其相应的私有IP地址,以便目标设备可以接收到请求

NAT的作用有以下几点:

  • 扩展IP地址:在互联网早期,IP地址的数量是有限的,NAT技术允许多个设备共享同一个公共IP地址,从而减少了公共IP地址的需求,节省了IP地址资源
  • 增强网络安全性:由于私有IP地址在Internet上是不可路由的,因此使用NAT可以增强网络安全性,因为外部网络无法直接访问内部网络
  • 隐藏内部网络拓扑结构:使用NAT可以隐藏内部网络拓扑结构,使外部网络无法直接访问内部网络。
  • 解决IP地址冲突问题:在许多组织中,内部网络中的多个设备可能会使用相同的IP地址。使用NAT技术可以避免这种冲突,因为每个设备都被分配了唯一的私有IP地址,不会与其他设备冲突

注意

NAT增加网络延迟和复杂性,使网络更加不透明、可能导致应用程序错误等,使用IPv6可以完美的解决NAT问题

网关、路由器

网关(Gateway)是在不同网络之间进行数据交换的设备。在TCP/IP网络中,网关通常是一台计算机或路由器,用于将数据包从一个网络传输到另一个网络。网关的作用是实现不同网络之间的通信,因此每个网络至少需要一个网关。通常,网关也具有地址转换和防火墙等功能

路由器(Router)是一种用于在多个网络之间转发数据包的设备。路由器通常位于不同的网络之间,用于将数据包从源网络传输到目标网络。路由器的作用是实现不同网络之间的通信,同时也具有地址转换、过滤和管理等功能

在TCP/IP网络中,路由器根据数据包中的目标IP地址和路由表来选择最佳路径,将数据包从源网络传输到目标网络。路由器可以通过动态路由协议和静态路由配置来学习和维护路由表,以便更快、更准确地转发数据包

总结

IP是一个无状态的网络层协议,用来标识网络中每个主机的位置。IPv4地址已经不够用了使用IPv6可以解决IP枯竭的问题,通过划分子网可以提高网络IP的利用率。IP的最大传输长度位65535,由于链路层的最大MTU为1500,因此当大于MTU时会进行IP分片和重组

参考文献

`,78);function r(P,d,I,h,u,m){const l=e("Reward"),s=e("Gitalk");return t(),i("div",null,[c,a(l),a(s)])}const T=o(p,[["render",r]]);export{v as __pageData,T as default}; diff --git a/assets/frontend_computer-network_ip-protocol.md.ZfcsangK.lean.js b/assets/frontend_computer-network_ip-protocol.md.ZfcsangK.lean.js new file mode 100644 index 000000000..24b4437d7 --- /dev/null +++ b/assets/frontend_computer-network_ip-protocol.md.ZfcsangK.lean.js @@ -0,0 +1 @@ +import{_ as o,c as i,J as a,V as n,o as t,G as e}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"IP协议","description":"IP协议是一种无连接、不可靠协议,在网络中的传输提供了统一的标准,负责将数据包从源地址传输到目的地址,是一个32位的二进制数字,通常被表示成四个由点分隔的十进制数,每个网络设备都需要具有一个唯一的IP地址,以便在网络中进行通信","frontmatter":{"title":"IP协议","description":"IP协议是一种无连接、不可靠协议,在网络中的传输提供了统一的标准,负责将数据包从源地址传输到目的地址,是一个32位的二进制数字,通常被表示成四个由点分隔的十进制数,每个网络设备都需要具有一个唯一的IP地址,以便在网络中进行通信","keywords":"IP协议,IP首部,IP地址,IPV4,IPV6,私网地址,子网划分,子网掩码,回环地址,IP分片,IP重组","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-network.png"},"headers":[],"relativePath":"frontend/computer-network/ip-protocol.md","filePath":"frontend/computer-network/ip-protocol.md","lastUpdated":1706247228000}'),p={name:"frontend/computer-network/ip-protocol.md"},c=n("",78);function r(P,d,I,h,u,m){const l=e("Reward"),s=e("Gitalk");return t(),i("div",null,[c,a(l),a(s)])}const T=o(p,[["render",r]]);export{v as __pageData,T as default}; diff --git a/assets/frontend_computer-network_tcp-protocol.md.cEUhzRKM.js b/assets/frontend_computer-network_tcp-protocol.md.cEUhzRKM.js new file mode 100644 index 000000000..244542f49 --- /dev/null +++ b/assets/frontend_computer-network_tcp-protocol.md.cEUhzRKM.js @@ -0,0 +1,44 @@ +import{_ as l,c as p,J as s,V as o,o as c,G as a}from"./chunks/framework.SV1ROkXV.js";const T=JSON.parse('{"title":"TCP协议","description":"TCP(Transmission Control Protocol,传输控制协议)是一种在计算机网络中常用的协议,它是一种面向连接的、可靠的、基于字节流的传输层协议,本文来了解TCP首部信息、连接与断开、可靠传输、流量控制等等","frontmatter":{"title":"TCP协议","description":"TCP(Transmission Control Protocol,传输控制协议)是一种在计算机网络中常用的协议,它是一种面向连接的、可靠的、基于字节流的传输层协议,本文来了解TCP首部信息、连接与断开、可靠传输、流量控制等等","keywords":"TCP协议,三次握手,四次挥手,滑动窗口,TCP流量控制,TCP拥塞控制,TCP可靠传输,TCP分段传输,TCP超时重传","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-tcp.png"},"headers":[],"relativePath":"frontend/computer-network/tcp-protocol.md","filePath":"frontend/computer-network/tcp-protocol.md","lastUpdated":1706247228000}'),r={name:"frontend/computer-network/tcp-protocol.md"},t=o(`

TCP协议

TCP(Transmission Control Protocol,传输控制协议)是一种在计算机网络中常用的协议,它是一种面向连接的、可靠的、基于字节流的传输层协议。TCP协议主要负责对数据进行分段、组装、传输和确认,以保证数据的可靠传输

特点

  • 可靠性:TCP协议可以保证数据的可靠传输,通过数据分段、校验和、确认机制等手段来确保数据不会丢失、损坏或重复
  • 面向连接:TCP协议在传输数据之前需要先建立连接,传输完成后再释放连接。这种连接方式可以保证数据的有序传输,避免数据混乱
  • 流式传输:TCP协议是基于字节流的传输层协议,将数据按照字节流方式分段传输,不需要考虑数据的长度和格式
  • 拥塞控制:TCP协议可以根据网络状态来控制数据的发送速度,避免网络拥塞导致数据丢失和延迟

TCP首部

  • 源端口:发送方端口,长度为2个字节16位,因此最大值为2的16次方65536 - 1,故TCP的端口范围为0 ~ 65535
  • 目标端口:另一方的端口,范围同上
  • 序列号:代表着数据的位置,最大序号为2的32次方-1,每发一次数据就要累加一次该数据的长度,当序号超过最大值又会从0开始。序列号不一定从0或1开始,而是从建立连接的随机数作为其初始值,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为1个字节增加对应的序列号。
  • 确认号:指下一次应该收到的数据的序列号
  • 数据偏移:字段长4位,单位为4字节,代表着数据包开始的位置,也可以理解成TCP首部总长度。从图中可以知道首部的固定长度为20字节,在没有可选数据时其最小值为5(二进制表示0101),最大值2的4次方减1(二进制1111)15再乘4为60字节,由此可知可选部分的最大长度为40字节
  • 保留位:4位长度,以后扩展使用,到目前为止还没有任何用处
  • 控制位:8位长度,由左到右分别是CWR(Congestion Window Reduced)ECE(Explicit Congestion Notification)URG(Urgent Flag)ACK(Acknovledgement Flag)PSH(Push Flag)RST(Reset Flag)SYN(Synchronize Flag)FIN(Fin Flag),当他们的值为1时都表示一定的含义
    • CWR:减小拥塞窗口,发送方降低发送速率
    • ECE:ECN回显,发送方接受到了一个更早的拥塞通知(ECN是一种拥塞控制机制,用于在发生拥塞时通知TCP发送方降低发送速率,从而避免网络拥塞)
    • URG:表示当前数据需要紧急处理
    • ACK:表示确认需要有效,也就是ACK为1时上图中的确认号才会有效
    • PSH:表示数据需要立刻传给上层协议
    • RST:表示连接出现非常严重的错误必须重新连接
    • SYN:表示希望建立连接,并将当前的序号作为初始值
    • FIN:表示希望断开连接不会有数据发送了
  • 窗口:字段长为16位,用于通知从确认号开始能够接受的数据大小,如果窗口的值为0时表示可以发送窗口侦测,通常情况下TCP会根据窗口大小进行分段传输,每段最大传输数据大小(MSS)为1460,实际情况的最大长度为1448(减去12字节的时间戳选项)
  • 校验和:端到端校验机制确保数据的正确性,由发送方通过头部、数据计算得到的校验和,接收方方会重新校验进行对比
  • 紧急指针:在URG控制位为1时有效,该字段的数值表示数据中的紧急数据,也就是说从数据的开始到紧急指针的位置为紧急数据,因此紧急指针也代表了紧急数据的末尾
  • 选项:选项类型(无操作、最大段大小MSS、窗口缩放因子、时间戳等等),每个选项的第一个字节为种类指明选项的类型,种类为0和1的选项仅占1字节,其他种类选项根据种类来确定字节数,种类1允许发送者用多个4字节组填充字段

注意

在老版本的TCP协议中可能只会存在6为控制位,而CWR、ECE控制位可能不存在,新版本都会有8位控制位

以上的字段明细都可以使用wireshark抓包工具捕获到,如果你对此工具还不熟悉可以参考我的「wireshark网络抓包」一文

连接与终止

TCP是可靠传输协议,其数据传输前通信双方必须建立一条连接,总体来说TCP通信是个复杂的过程(超时重传、流量控制、分包组装等等),整体通信大致过程示意图如下:

三次握手

关于TCP的三次握手和四次挥手是常问的考点,搞清楚它非常简单,这里总结下二者。TCP的连接需要三个步骤:发起端发送SYN、接收端发送SYN+ACK、发送端发送ACK。为什么需要三次呢?一次行不行?答案是否定的,三次正好符合可靠传输的特点。这就好比2人打电话,甲方打给乙方,甲方问你是乙方吗,乙方回答我是那你是谁呢,甲方再次回乙方说我是谁,这样下来双方都知道对方的身份并且知道电话已经打通了,可以收发数据。而TCP连接也是这样的,下方是三次握手连接的示意图:

  1. 刚开始Client处于close状态,Server处于Listen状态
  2. Client主动打开发送SYN=1、Seq=x请求表示主动连接(注意:seq在初始化时是个随机数,它会根据时间戳变化,超时重传时使用相同的seq,新的连接会生成新的序列号,来避免历史或其他连接的错误问题),此时Client进入SYN_SENT状态
  3. Server接受到客户端的SYN请求后,需要应答Client并发送SYN=1、ACK=1、Seq=y请求,其中确认号为x+1且有效期望下一次客户端的发送序列号应为x+1,而SYN表示也想连接Client且序号为y,此时Server进入SYN_RCVD状态
  4. Client收到Server的ACK响应后进入ESTABLISHED状态表示已连接(半连接状态),然后发送Seq=x+1、ACK=1的请求,序列号为y+1且有效,表示确认了Server的连接请求,并期望Server下一次发送的序号为y+1
  5. Server收到客户端的ACK响应后也进入ESTABLISHED状态,双方进入全连接状态,三次握手完毕可以进行数据传输了

抓包结果:

TCP握手期间虽然没有真实的数据进行传输,但在这期间会进行相关重要数据的约定,如:窗口大小、MSS等有用的信息

重置连接

三次握手是TCP连接的正常过程,但还有其他非正常的连接出现严重的连接错误,此时就会通过标记RST来重置连接,比如主机A使用telnet连接主机B的某个未开放端口,就会被主机B拒绝:

sh
# 使用主机A192.168.10.8登录 主机B192.168.10.9:8080
+ telnet 192.168.10.9 8080
+Trying 192.168.10.9...
+telnet: connect to address 192.168.10.9: Connection refused

当主机B接受到TCP连接请求时被认为成错误的连接,此时主机B会主动发送一个RST的响应,表示连接错误,需要重新连接,可以使用抓包工具查看:

连接队列

上面的三次握手只是简单的概述了主要的连接过程,在真实环境中存在请求队列的概念,如同时并发多个TCP请求,就会将其排列成队列进行处理

在TCP连接中存在两个重要的队列SYN队列(半连接队列)Accept队列(全连接队列),它们分别用于处理连接请求和已经建立连接的数据传输

  • SYN队列:用于存储SYN(同步)请求的队列。当一个客户端请求与服务器建立TCP连接时,它会向服务器发送一个SYN包。服务器在收到SYN包后,将在SYN队列中排队等待确认,并向客户端发送一个SYN-ACK包作为确认
  • Accept队列:用于存储已经建立连接的队列(未被上层应用程序使用)。当服务器收到客户端第三次握手的ACK请求后,客户端和服务器之间的连接就建立了,此时连接会被添加到accept队列中,等待应用程序使用

大致处理过程示意图如下: 首先Client主动发送SYN连接请求,Server收到后创建半连接对象将其放入SYN队列,Server发送ACK+SYN给Client后,直到收到Client的ACK响应后,创建全连接对象将其连接放入Accept队列,最后由应用程序接受处理

SYN队列的的最大限制通常是1000,Accept队列的最大限制通常是128,可以通过以下方式查看:

sh
# 查看syn队列最大值
+ cat /proc/sys/net/core/netdev_max_backlog
+1000
+# accept队列最大值
+ cat /proc/sys/net/ipv4/tcp_max_syn_backlog
+128

总的来说两个队列并不是很大,但实际情况中由于CPU、内存等相关因素的影响,我们的应用程序可能达不到很高的并发处理请求,因此TCP的请求就会被延时,或当SYN、Accept队列溢出时,Server也会忽略掉Client的SYN请求包,根据重传机制Client等待一段时间重新发送SYN,此时Server表现出繁忙的状态

SYN泛洪

SYN泛洪也称SYN攻击,是TCP常见的网络攻击手段,其利用TCP连接三次握手的第一阶段,当Client向Server疯狂发送SYN请求,却不响应Server的ACK+SYN请求时,Server的SYN队列会很快被打满,从而主动丢弃后面的SYN请求,也就无法进行正常的TCP连接了,大量的SYN请求也会消耗Server的资源,产生不正常的消耗

如何避免SYN攻击呢,可以从防火墙SYN Cookies减小SYN队列SYN ACK重传次数等着手:

  1. 开启SYN Cookies:

    什么是SYN Cookies?当SYN队列溢出时,如果再收到SYN请求不会为其分配任何存储资源,而只有当SYN+ACK报文段被确认时才分配到Accept队列里。SYN Cookies是由Server通过一定的算法加随机值计算而来,再作为序列号发送给Client,Server收到Client的ACK报文后会校验合法性,如果合法将会放入Accept队列,否则直接丢弃,这样就绕过了SYN队列资源。

    可以通过以下方式设置syncookies:

    sh
    # 0 表示关闭
    +# 1 SYN队列溢出时开启
    +# 2 永久开启
    + cat /proc/sys/net/ipv4/tcp_syncookies
    +1

    服务器通常用下面的方法设置初始序列号:首5位是t模32的结果,其中t是一个32位的计数器,每隔 64秒增1;接着3位是对服务器最大段大小(8种可能之一)的编码值;剩余的24位保存了 4元组与t值的散列值,该数值是根据服务器选定的散列加密算法计算得到的。Server根据其中的t值可以计算出与加密 的散列值相同的结果,那么服务器才会为该SYN重新构建队列

  2. 减小SYN ACK重传次数

    减小重传次数让其达到最大重传次数时,释放掉SYN资源断开连接,SYN ACK重传次数由linux内核决定的,可以通过以下方式进行查看和设置:

    sh
     cat /proc/sys/net/ipv4/tcp_synack_retries
    +5

四次挥手

TCP断开需要4步完成

  1. 假如Client想要释放连接将会发送FIN请求给Server端,接着进入FIN_WAIT_1状态
  2. Server收到Client的FIN请求后,给Client回了一个ACK响应,进入CLOSED_WAIT状态
  3. Client收到Server的ACK响应后,进入FIN_WAIT_2状态,等待Server发送FIN请求
  4. Server处理完数据发送FIN请求给Client,进入LAST_ACK状态
  5. Client终于等到了Server的FIN请求,赶紧给Server回了一个ACK响应,紧接着进入TIME_WAIT状态,在等待2MSL时间后也会进入CLOSE状态
  6. Server收到Client的ACK响应后进入CLOSE状态,此时Server已经完全关闭

抓包结果:

💡为什么看到的是3次挥手?

不是说TCP断开需要4次挥手吗?为什么实际抓包的结果却是3次就完成了?这里就需要了解TCP的延时确认机制

TCP的延迟确认(Delayed ACK)是一种优化TCP传输性能的机制。TCP协议默认采用延迟确认机制,即接收方不会立即发送确认消息,而是等待一定时间(通常是200ms),看是否需要返回数据,如果无需数据就会等待一会看后面的请求是否需要返回数据,便一起返回发送一个确认消息,以减少确认消息的数量和网络负载,否则需要数据就会立刻返回ACK

而三次回收的情况通常是接收端不需要再发送数据了,根据延时确认机制便会将2、3次挥手(ACK&FIN)合并成一次数据返回,这就是为什么实际网络中看到的是3次挥手的原因。可以通过修改TCP的延迟发送值来禁用此功能,这里不再展开

💡什么是MSL?为啥需要2MSL

MSL(Maximum Segment Lifetime)是报文最大生存时间,也就是说网络中最大的存活时间,否则将会丢弃。MSL的时间通常大于TTL的跳数时间,IP的传输存活时间是基于TTL的跳数,每过一个路由器TTL都会减去1,直到为0时将会丢弃报文,同时发送ICMP报文通知源主机目标不可达

MSL默认值通常为30,TTL的默认跳数为64,系统认为30s内IP可以被转发64次。为什么是2MSL呢?2MSL是从Client接收到Server的FIN报文后发送ACK报文开始计算的,假如ACK报文由于网络原因在MSL时间内没有到达Server,Server会触发超时重传机制再次发送FIN报文给Client,所以2MSL是最保险的时间,当Client等待2MSL内没有收到任何Server的包就会被关闭掉

通过以下方式查看系统默认的TTL跳数和MSL时间

sh
# TTL 默认跳数
+ cat /proc/sys/net/ipv4/ip_default_ttl
+64
+# FIN默认超时时间(2MSL时间)
+ cat /proc/sys/net/ipv4/tcp_fin_timeout
+60

💡有趣的是处于TIME_WAIT(2MSL)状态下的端口还不能重新被使用!虽然Client已经收到Server的FIN报文并发送了ACK报文确定要断开连接了,但在TIME_WAIT期间其端口还是不能被使用(尽管Server可能已经被关闭了),这个原因其实和为啥要等待2MSL道理一样,都是为了避免2MSL期间Server重传FIN报文。我们来验证下端口不可用:

sh
# 访问本地nginx
+ curl localhost
+
+# 查看TCP的连接状态,可以很明显本地的 \`33196\` 端口关联了 80端口,即curl随机选用了 33196 端口访问nginx
+ netstat -ant | grep 80
+tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
+tcp        0      0 127.0.0.1:33196         127.0.0.1:80            TIME_WAIT
+
+# 使用nodejs监听33196端口,抛出异常 端口被占用
+ node index.js
+events.js:377
+      throw er; // Unhandled 'error' event
+      ^
+
+Error: listen EADDRINUSE: address already in use :::33196

上述等再次查看33196已经被完全断开时就可以正常启动了

查看TCP状态

可以在主机上通过netstat命令查看tcp的连接状态,netstat是一个用于显示网络状态和统计信息的命令行工具,可以用来查看系统的网络连接、路由表、接口状态等

sh
 netstat -antp | more
+Active Internet connections (servers and established)
+Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
+tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      872/rpcbind
+tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1229/nginx: master
+tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1211/sshd
+tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1454/master
+tcp        0      0 0.0.0.0:10010           0.0.0.0:*               LISTEN      1229/nginx: master
+tcp        0    196 192.168.10.9:22         192.168.10.1:65308      ESTABLISHED 1691/sshd: root@pts
+tcp        0      0 127.0.0.1:33196         127.0.0.1:80            TIME_WAIT   -

可以从上看出tcp监听的端口号、进程、连接状态等等。如:nginx监听了80端口、ssh监听了22端口,22端口和65308端口保持连接(这里我在主机用terminal连接了虚拟机)处于ESTABLISHED建立状态,33196端口和80端口已经处于断开但还在TIME_WAIT状态

半连接、半断开、半打开

要了解这几种状态含义需要明白TCP是个全双工连接协议,它提供了全双工的数据传输能力。全双工连接指的是通信双方可以同时发送和接收数据,而不受对方数据传输的影响。这意味着,在一个TCP连接中,数据可以沿着两个方向同时传输,而不需要等待对方的回复

半连接:在TCP三次握手时,Client如果不回复Server端ACK报文时,Server端就处于SYN_RCVD状态,消耗Server端的资源,常见的SYN攻击就是基于半连接漏洞产生的

半断开:在TCP四次挥手期间,Client发送了FIN报文后,却一直等不到Server的FIN报文,此时Client只能收到报文而不能发送报文

半打开:正常的TCP连接双方都可以收发数据报文,假如在某时间段两端不进行任何数据传输,而一端由于某种原因断开了且不发送任何FIN报文,另一端也不会知道是不是断开了,这时就处于半打开状态。而系统内核一般对TCP有一个保活机制(KeepAlive)来心跳检测是否还处于连接状态,当TCP在指定时间不发送任何数据,系统则认为已断开连接

注意

HTTP也有一个KeepAlive的概念,但与TCP的KeepAlive完全不同;HTTP的KeepAlive是开启长连接,在HTTP/1.1默认会开启,主要是提供HTTP请求可以在同一个TCP连接上完成,减小网络开支;而TCP的KeepAlive是个保活机制,在长时间没有进行数据传输时用来探测是否还处于连接状态

数据传输

我们知道TCP是个可靠传输协议,那么它是如何实现数据传输的可靠性的呢?通常情况下TCP会对传输的数据进行分段并进行编号,当接受方收到数据后重新进行组装。若在传输的过程中出现了丢包,发送端便会重传丢失的包,其具体实现看下一小节

分段传输

TCP协议的每段最大数据长度通常被称为MSS(Maximum Segment Size)1460,这个值是根据IP层MTU(Maximum Transmission Unit)最大传输单元计算的,MTU值一般为1500,如果过大会造成网络中路由器的缓冲压力,当IP层所传输的数据大小大于MTU时就会进行IP分片

如果IP分片传输中有一个IP片丢失了就会重传所有的IP片段,这无疑会浪费网络资源。所以TCP为了不让数据在IP分片,通常设置为每片IP最大数据承载大小也称为MSS。MTU的值为1500字节,IP头占用20字节,TCP头占用20字节,因此MSS的值通常为1500-20-20=1460字节

可以通过设备上的某个网卡查看MTU大小:

sh
 cat /sys/class/net/ens160/mtu
+1500

在实际中MSS的值通常都是1448比1460少了12个字节,这通常是TCP的头部选项部分会多12字节的时间戳等信息,其用来服务超时重传等功能

滑动窗口

TCP的数据可靠传输类似于一问一答的形式,每发送一个数据包会通过另一方的确认来判断是否丢包,但如果每次只能发送一个数据包将大大提高时延,因此TCP中引入了窗口的概念

什么是TCP窗口(Window)?窗口通常用来限制数据包的发送速率,是一个流量控制机制,通过动态改变窗口的大小进行控制发送速率。窗口的大小通常等于接收方的窗口大小,会根据接收方的确认消息动态调整,在三次握手期间虽然没有进行实质的数据传输,但通常都会协商一些有用的信息,其中就包含窗口的大小

窗口其实是个缓存空间,每一方都会在缓存空间中维护着一些有用的信息,如:已发送的数据、未发送的数据等等。假如发送方的窗口大小为3,那么就会连续发送3个数据包,而不需要等待一个一个确认,同时缓冲区会记录这些已发送和未发送的信息,从而改变窗口大小和位置

滑动窗口的概念则是调整发送数据的起始位置,TCP在传输数据时会将数据分成多段MSS大小的数据段并进行编号,然后便会以窗口大小为基本单位按顺序发送数据,因此窗口范围内的数据发送期必早于窗口后的数据。而窗口内通常会包含多个数据片段,每段数据被实际接收的时间会因为网络原因进行波动,所以发送方收到不同数据片段的ACK时间也会不同,当窗口的前部分被确认后,就会进行窗口滑动,这样后面未在窗口内的数据段就会被放入窗口内等待发送

大概的滑动窗口示意图如下:

窗口的大小会根据接收方的确认信息、发送时延、拥塞控制动态改变的,然后来控制发送速率,达到数据传输的可靠、高效,接下来了解下TCP如何完成数据传输的可靠性

重传机制

大家知道TCP是个可靠的传输协议,所以会有特殊的机制来保证传输数据的可靠性,而其中一个重要的特性就是超时重传。当发送方发送一个报文后在指定的时间内没有收到另一方的响应后,就会认为数据包已经丢失,便会根据重传机制重新发送数据包

由于网络波动等种种原因,超时重传是避不开的问题,重传有两种机制:基于时间和基于冗余ACK,通常后者比前者更高效

RTT、RTO

了解超时重传前需要知道RTTRTO两个时间概念

RTT(Round-Trip Time)是指TCP数据包从发送方发送到收到接收到另一方的ACK所需的时间

RTO(Retransmission Timeout)是指TCP发送方在未收到确认的情况下等待重传的时间

超时重传是根据RTO的时间进行判断的,RTO是根据RTT进行动态计算的,如何确定RTO的时间是非常关键的,通常略大于RTT的时间,过小造成网络资源浪费,过大网络延时偏大,这里不具体展开其实现算法

超时重传

当TCP发送一个数据包时会启用一个定时器进行倒计时,如果在RTO的时间范围内收到了对方的ACK包则重置定时器不会重传报文,反之没有收到另一方的ACK,则会重新发送数据包,并重启定时器,当超时重传时会把定时器的时间设置为上一次的2倍,也称二进制指数避退(binary exponential backof),当然不会无线重传下去,会有重传的阈值,当超过了这个值就会断开TCP连接,默认操作系统的重传次数可以通过以下方式进行查看:

sh
 cat /proc/sys/net/ipv4/tcp_syn_retries
+6

快速重传

快速重传不是基于定时器,而是基于数据进行重传的,通常发生在没有延时的情况下。若TCP累积确认无法返回新的ACK,或者当ACK包含选择确认信息(SACK)表明出现失序报文段时,快速重传会推断出现丢包

通常来说,当发送端认为接收端可能出现数据丢失时,需要决定发送新(真正丢包的) 数据还是重传所有的问题,处理不好就会造成网络资源的浪费

TCP提供了SACK(Selective Acknowledgment)方法来提高重传的效率。该机制允许接收方向发送方发送选择性确认(SACK),即确认接收到的连续数据块,同时告知发送方已经接收到丢失数据块的位置,发送方一般都会维护一个缓冲区用来标识已发送的和超时的,从而让发送方只重传丢失的数据块

拥塞控制

拥塞控制是一种网络流量控制机制,用于避免在网络中发生拥塞而导致网络性能下降或崩溃。该机制通过动态调整发送数据的速率来控制网络中的拥塞程度,并确保网络能够承载传输的数据量

TCP的拥塞控制算法通常基于网络拥塞的反馈信息,例如丢包、延迟等。当TCP发送方收到这些反馈信息时,它会采取一系列措施来减少发送数据的速率,以避免过多的数据流入网络中而导致拥塞。通过改变发送窗口进行速率的控制,发送窗口一般等于接收窗口,而有了拥塞控制后,发送窗口会取拥塞窗口和接收窗口的最小值

慢启动

在TCP连接建立时,发送方会将拥塞窗口的大小设置为一个较小的值,通常为2个最大分段大小(MSS)。发送方将拥塞窗口的大小逐渐增加,每发送一个数据段就将窗口大小加1,这样可以使得发送方逐渐探测网络的可用带宽。但不可能一直这样增长下去,当拥塞窗口大小达到一个阈值时,发送方将进入拥塞避免阶段,此时拥塞窗口的增加速率将变慢

假如拥塞窗口刚开始为1,当接受到1个ACK后,窗口大小加1可以同时发送2个SYN,然后接受到2个ACK后变成窗口大小变为4;接着发送4个SYN收到后大小变成8;就这样反复增加直到达到最大阈值,慢启动算法就是以指数的形式增加,增加速度比较快

拥塞避免

当达到慢启动的阈值时就会进入拥塞避免算法,以防止指数级的发送造成网络堵塞问题,拥塞避免算法当收到1个ACK时,拥塞窗口增加1/n个大小,这样窗口的增长速率会越来越小

除了慢启动、拥塞避免算法外,还有快速恢复算法快速来恢复发送速率,这里不再展开了

总结

本文从TCP的首部、建立断开、传输过程、重传机制、拥塞控制等多方面讲述了TCP协议的工作方式和细节,而TCP远不止这么简单内容,作为非网络工程师对于更深的概念了解下即可,掌握这些通常足够了

参考文献

`,104);function i(C,d,u,y,h,b){const n=a("Reward"),e=a("Gitalk");return c(),p("div",null,[t,s(n),s(e)])}const F=l(r,[["render",i]]);export{T as __pageData,F as default}; diff --git a/assets/frontend_computer-network_tcp-protocol.md.cEUhzRKM.lean.js b/assets/frontend_computer-network_tcp-protocol.md.cEUhzRKM.lean.js new file mode 100644 index 000000000..7bd1ca513 --- /dev/null +++ b/assets/frontend_computer-network_tcp-protocol.md.cEUhzRKM.lean.js @@ -0,0 +1 @@ +import{_ as l,c as p,J as s,V as o,o as c,G as a}from"./chunks/framework.SV1ROkXV.js";const T=JSON.parse('{"title":"TCP协议","description":"TCP(Transmission Control Protocol,传输控制协议)是一种在计算机网络中常用的协议,它是一种面向连接的、可靠的、基于字节流的传输层协议,本文来了解TCP首部信息、连接与断开、可靠传输、流量控制等等","frontmatter":{"title":"TCP协议","description":"TCP(Transmission Control Protocol,传输控制协议)是一种在计算机网络中常用的协议,它是一种面向连接的、可靠的、基于字节流的传输层协议,本文来了解TCP首部信息、连接与断开、可靠传输、流量控制等等","keywords":"TCP协议,三次握手,四次挥手,滑动窗口,TCP流量控制,TCP拥塞控制,TCP可靠传输,TCP分段传输,TCP超时重传","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-tcp.png"},"headers":[],"relativePath":"frontend/computer-network/tcp-protocol.md","filePath":"frontend/computer-network/tcp-protocol.md","lastUpdated":1706247228000}'),r={name:"frontend/computer-network/tcp-protocol.md"},t=o("",104);function i(C,d,u,y,h,b){const n=a("Reward"),e=a("Gitalk");return c(),p("div",null,[t,s(n),s(e)])}const F=l(r,[["render",i]]);export{T as __pageData,F as default}; diff --git a/assets/frontend_debug-skill_base.md.9fX9BAHb.js b/assets/frontend_debug-skill_base.md.9fX9BAHb.js new file mode 100644 index 000000000..b36f9bfa7 --- /dev/null +++ b/assets/frontend_debug-skill_base.md.9fX9BAHb.js @@ -0,0 +1,154 @@ +import{_ as p,c as o,J as s,V as e,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"前端调试技能指南","description":"从Chrome DevTool Protocol到vscode玩转前端调试技巧","frontmatter":{"title":"前端调试技能指南","description":"从Chrome DevTool Protocol到vscode玩转前端调试技巧","keywords":"前端调试,frontend debugger,vscode debugger,chrome调试,调试技能,node调试,typescript调试,线上调试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-debug.png"},"headers":[],"relativePath":"frontend/debug-skill/base.md","filePath":"frontend/debug-skill/base.md","lastUpdated":1706247228000}'),t={name:"frontend/debug-skill/base.md"},r=e(`

Debug skill

本文会介绍vscode和chrome调试技巧

调试node程序

查看官方文档

node debugger模式+chrome调试

sh
# 启动debugger
+node --inspect-brk index.js
+
+# 指定端口
+node --inspect-brk=8999 index.js
+
+# 启动debugger模式(这种方式控制台会开启debugger模式,可以在控制台输入命令)
+node inspect index.js

通过这种方式node会以debugger模式运行,并且会在首行断住,此时,也会启动一个web socket作为debugger server,需要通过client连接这个server,就可以调试了

打开浏览器输入chrome://inspect,在Devicestab中的Discover network targets中配置localhost:9229,端口对应node的debugger server的端口就可以了,配置好后,就会发现下面Remove Target里会发现node的debugger server,点击inspect会打开新的调试窗口,就可以在浏览器中调试了,和在浏览器调试一模一样,关闭调试窗口后,会结束调试

启动: 1.png5.png 上面两种启动都会在首行断住

用Chrome DevTools连接: 2.png3.png 调试: 4.png

node debugger模式+vscode调试

同上,用node debugger模式启动,会开启node debugger server,然后通过vscode连接这个server就可以调试了

那怎么用vscode连接node debugger server呢?

需要在项目中.vscode/launch.js文件中配置,server client,这个配置文件可以直接在工具bar运行->添加配置直接生成配置文件,可以在文件右下角点击添加配置会有对应的提示

json
{
+  // 使用 IntelliSense 了解相关属性。
+  // 悬停以查看现有属性的描述。
+  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+  "version": "0.2.0",
+  "configurations": [
+    {
+                        // 以node方式调试
+      "type": "node",
+                        // 连接方式为 连接 (attach、launch两种选项)
+                        // 因为只要开一个client server 连接到刚刚的node debugger server 就可以
+      "request": "attach",
+      "name": "Attach Debugger", // 随便起个名字
+                        // 跳过的文件 (可选)
+      "skipFiles": ["<node_internals>/**"]
+    }
+  ]
+}

配置好client server后,点击vscode 左侧 debugger选项切换成调试面板,做上面like播放键就可以看到刚刚配置的调试名字,如果有多个时,可以选择,和其他IDE调试类似,点击播放键,就开始调试了,这个就直接在vscode中调试了,调试面板中会和Chrome一样有作用域变量调用堆栈等信息,如果你熟悉Java的IDE调试这个没啥问题

7.png6.png

仅vscode调试

上面都是要在命令行启动node debugger模式开启debugger server,在启动一个server client去连接server,总体来说有点麻烦,可以用vscode将两者异步完成

和上面一样,在配置文件中再添加一个配置,将request改为launch,并添加program属性指定调试的文件即可,在js文件中左侧打个断点,这样就可以在vscode中直接调试了

json
{
+  "configurations": [
+    {
+      "name": "Launch Debugger",
+      "program": "\${workspaceFolder}/node-debugger/app.js",
+      "request": "launch",
+                        // 会在文件首行断住
+      "stopOnEntry": true,
+      "skipFiles": ["<node_internals>/**"],
+      "type": "node"
+    },
+  ]
+}

8.png

调试需编译的程序

调试网页程序

网页七大断点技巧

  1. 基本断点 通常开发时大家都喜欢console.log打印东西来看一些预期结果,你也可以通过在需要console的地方加上debugger来断住js,当执行到这里时,不仅可以看到你想要的信息,还可以看到当前作用域、变量、调用栈等一些信息,这样看起来更直观也更方便
js
// 假如有下面一段代码
+button.addEventListener('click', clickCB);
+
+function clickCB(e) {
+        debugger;
+        console.log(e);
+}

22.png23.png

  1. 条件断点 同样这里也是先在源码中指定位置debugger,或者如果你的源码并没有采取打包,源码好找的情况下可以直接在浏览器中找到对应的js文件直接打个条件注释断点就行
js
// 假如有下面一段代码 (当x<=0,断住)
+const add = (x, y) => {
+  x = 2 * x;
+  return x + y;
+}

24.png25.png26.png27.png 3. DOM断点 28.png DOM断点只能在浏览器中调试,有三种:

  • subtree modifications
  • attribute modifications
  • node removal

以上三种断点,也可用MutationObserverAPI来代替,方便配置使用灵活,官方文档

html
// 假如下面一段代码,当点击不同的按钮对ul进行增删改查,修改自身属性
+<div class="domDebugger">
+        <button>增加节点</button>
+        <button>删除节点</button>
+        <button>删除自己</button>
+        <button>更新子节点</button>
+        <button>更新子节点属性</button>
+        <button>更新当前元素属性</button>
+</div>
+<ul class="list">
+        <li>1</li>
+        <li>2</li>
+</ul>
+
+<script>
+        const dbtns = document.querySelectorAll('.domDebugger button');
+        const list = document.querySelector('.list');
+        dbtns[0].addEventListener('click', () => {
+                const li = document.createElement('li');
+                li.innerText = '新增的节点';
+                list.appendChild(li);
+        });
+        dbtns[1].addEventListener('click', () => {
+                list.removeChild(list.lastElementChild);
+        });
+        dbtns[2].addEventListener('click', () => {
+                list.remove();
+        });
+        dbtns[3].addEventListener('click', () => {
+                const li = document.createElement('li');
+                li.innerText = '更新的节点';
+                list.replaceChild(li, list.lastElementChild);
+        });
+        dbtns[4].addEventListener('click', () => {
+                list.lastElementChild.setAttribute('class', 'li-class');
+        });
+        dbtns[5].addEventListener('click', () => {
+                list.setAttribute('class', 'newclass');
+        });
+</script>
  • subtree modifications 节点监听: 29.png 当监听子节点变化时,只有当子节点(node)发生变化时,才会监听的到,如:子节点替换子节点删除子节点增加子节点的字节点变化(像:文本节点、注释节点、元素节点等等都会监听的到),但是节点的属性发生变化不会监听到 30.png 当点击上面的删除节点时就会被监听到,如上图;而当点击更新子节点属性或者当前元素属性时反而监听不到的
  • attribute modifications 属性监听: 31.png 监听当前元素属性发生变化时,而子节点属性变化监听不到;(想监听子节点的属性变化或者或者节点变化可以用开头提到的MutatorObserverAPI) 当点击更新当前元素属性时如下图所示,点击更新子节点属性不会监听到 32.png
  • node removal 34.png 这个只监听当前元素被删除,子几点的改变不会监听到,比较单一 当点击删除自己就会监听到 33.png

除了单独监听外,还可以同时监听三种类型,只要勾选上就行;除了这种调试,也可以通过前面提到的MutatorObserverAPI来调试

  1. URL断点 添加对XHR的请求url的断点,当浏览器发起http请求时,如果断点的url包含请求url,就会打住断点
js
// 假如下面代码,点击按钮发起请求
+const fetchApi = async () => {
+        try {
+                const rs = await fetch("http://localhost:3001/xxxx")
+                const data = await rs.json()
+                console.log(data)
+        } catch(err) {
+                console.log(err)
+        }
+}
+const btn = document.querySelector('#btn');
+btn.addEventListener('click', fetchApi)
+
+// ===== 服务代码 =====
+app.use((req, res, next) => {
+  res.header('Access-Control-Allow-Origin', '*');
+  res.json({
+    code: 200,
+    message: 'Hello World',
+  })
+})
+app.listen(port, () => {
+  console.log(\`Server is running on port \${port}\`);
+})

以上请求http://localhost:3001服务,现在我们在浏览器中添加对应的断点 35.png36.png

  1. 时间监听断点 监听对应的事件当触发时就会打住断点,如:点击、鼠标、键盘事件等等
js
// 假如给一个元素绑定click、mouseover事件
+// <div id="box" />
+const target = document.querySelector("#box")
+target.addEventListener("click", () => console.log('click...'))
+target.addEventListener("mouseover", () => console.log('mouseover...'))

在浏览器上打上对应的断点 37.png38.png39.png

  1. 异常断点 异常断点可以在vscode中设置,如果抛出异常就会打住断点 添加vscode调试配置:
json
{
+        "name": "Debugger Exception",
+        "request": "launch",
+        "type": "chrome",
+        "url": "http://localhost:5500",
+        "webRoot": "\${workspaceFolder}/trandition"
+},
js
// 主动抛出错误
+throw new Error('This is a test error');

40.png

调试React

React项目,用react-create-app启动项目,然后添加.vscode配置,点击debugger,在vscode中打个断点,就可以在vscode中调试代码了

json
{
+        "name": "React",
+        "request": "launch",
+        "type": "chrome",
+        "url": "http://localhost:3000",
+        "webRoot": "\${workspaceFolder}"
+}

20.png

调试Vue

目前用vite或者webpack生成的vue项目目前这样的都可以这样调试,以前的wepack要用sourcemap进行映射

json
{
+        "name": "VueCli",
+        "request": "launch",
+        "type": "chrome",
+        "url": "http://localhost:8080",
+        "webRoot": "\${workspaceFolder}",
+        // 映射sourcemap
+        "sourceMapPathOverrides": {
+                // "webpack://?:*/*": "\${workspaceFolder}/*"
+        }
+}

21.png

线上Override调试

可能有一种调试需要在线上环境下直接调试代码,对于简单的调试直接使用debugger即可,有时候需要改代码啥的,可能直接用debugger可能会变得有点麻烦,要是可以将线上运行的代码代理到本地,就可以在本地调试代码了,Chrome Override DevTools就是干这个的

此方式不能代理XHR请求

首先打开Source面板,选择Overrides,然后点击Select Folder for overrides按钮,会打开本地文件系统让你选择一个文件夹,用来保存后面调试的代码(这里最好新建一个空文件夹) 41.png42.png 选择完后Chrome会提示访问权限,点击允许,此时network面板会出现一个黄色三角形,则证明Override第一步成功了 43.png 现在比如我们想调试一个index.js文件,点击netword面板,右击想要调试的文件,选择Save for overrides,此时当前文件就会被保存到目标文件夹里了 44.png45.png 现在可以用编辑器打开目标文件夹,进行修改,修改会同步保存到浏览器,而且刷新浏览器也同样会被代理到本地文件夹哦,如下:文件开头添加debugger 46.png

线上调试(异常上报+监控系统+map映射)

假如有一个场景,开发好的项目上线后,发现一个bug报错了,潜意识下会打开控制台看下哪里错了,但不幸的是,一般上线项目都会打包压缩,而且不会有soucemap,这让错误排查变得棘手。

通常情况在发布生产时,同时生成soucemap,将soucemap放到指定位置,用来和生产环境错误做映射,这样就可以在开发环境中查看错误的位置了,这样就可以更快的解决错误了,同时也能将错误记录到系统中

假如发布一个react项目如下: 9.png 代码很简单,点击按钮手动抛出一个错误,现在发布上线,当点击按钮时就会报错 10.png11.png 潜意识下打开控制台点击报错信息,带我们去目标文件,发现竟是打包后的,顿时懵逼,一头雾水;不嫌麻烦的同学可能会在本地重启项目排查,但不同环境数据可能不同,导致也很难排查,那为何不直接线上排查呢

通过映射线上环境的sourcemap,不就可以查找到错误位置了吗

手动添加

12.png13.png14.png15.png16.png17.png18.png Vue项目同理 19.png

自动映射

sourcemap解密

json
// sourcemap结构
+{
+        // sourcemap版本
+        version: 3,
+        // 转换后的文件名
+        file: 'index.min.js',
+        // 源文件名路径
+        sources: [],
+        // 源文件内容字符串(和sources一一对应)sources[0] 文件名对应的内容就是 sourcesContent[0]
+        sourcesContent: [],
+        // 转换前所有的变量名和属性名
+        names: [],
+        // 记录位置信息的字符串 Base64 VLQ编码
+        // ;AACA,IAAIA,KAAO
+        // ;代表空行
+        // ,代表一个位置
+        // AACA => 0121:转换后代码的第几列;sources中的位置;转换前第几行;转换前第几列
+        mappings: ''
+}

知识点:https://zhuanlan.zhihu.com/p/104519418

  1. VLQ编码
  2. Base64

// 待更新...

`,71);function i(D,F,y,u,b,d){const a=n("Reward"),l=n("Gitalk");return c(),o("div",null,[r,s(a),s(l)])}const h=p(t,[["render",i]]);export{m as __pageData,h as default}; diff --git a/assets/frontend_debug-skill_base.md.9fX9BAHb.lean.js b/assets/frontend_debug-skill_base.md.9fX9BAHb.lean.js new file mode 100644 index 000000000..55a34b472 --- /dev/null +++ b/assets/frontend_debug-skill_base.md.9fX9BAHb.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"前端调试技能指南","description":"从Chrome DevTool Protocol到vscode玩转前端调试技巧","frontmatter":{"title":"前端调试技能指南","description":"从Chrome DevTool Protocol到vscode玩转前端调试技巧","keywords":"前端调试,frontend debugger,vscode debugger,chrome调试,调试技能,node调试,typescript调试,线上调试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-debug.png"},"headers":[],"relativePath":"frontend/debug-skill/base.md","filePath":"frontend/debug-skill/base.md","lastUpdated":1706247228000}'),t={name:"frontend/debug-skill/base.md"},r=e("",71);function i(D,F,y,u,b,d){const a=n("Reward"),l=n("Gitalk");return c(),o("div",null,[r,s(a),s(l)])}const h=p(t,[["render",i]]);export{m as __pageData,h as default}; diff --git a/assets/frontend_debug-skill_charles.md.cdOszKr5.js b/assets/frontend_debug-skill_charles.md.cdOszKr5.js new file mode 100644 index 000000000..f0cfbc561 --- /dev/null +++ b/assets/frontend_debug-skill_charles.md.cdOszKr5.js @@ -0,0 +1 @@ +import{_ as t,c as s,J as e,V as l,o as h,G as i}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"Charles抓包工具使用指南","description":"charles一个简洁适配多系统的强大的抓包工具,方便抓取web和移动端数据包,设置代理等等","frontmatter":{"title":"Charles抓包工具使用指南","description":"charles一个简洁适配多系统的强大的抓包工具,方便抓取web和移动端数据包,设置代理等等","keywords":"charles,charles抓包工具,手机抓包,ios抓包,android抓包,客户端抓包,抓包工具,Mac抓包,前端调试,frontend debugger,chrome调试,调试技能,node调试,线上调试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-debug.png"},"headers":[],"relativePath":"frontend/debug-skill/charles.md","filePath":"frontend/debug-skill/charles.md","lastUpdated":1706247228000}'),c={name:"frontend/debug-skill/charles.md"},r=l('

Charles抓包工具

上一篇介绍了fiddler抓包工具,这篇就来看看charles的使用

charles抓包工具和fiddler原理类似也是基于HTTP请求中间人代理,通过和服务端、客户端建立通信将客户端的请求数据发送服务器,并将响应数据传输给客户端,实现抓包记录。

iShot_2022-10-18_07.58.05.png

虽然原理相同,由于是不同工具,一些功能还是有细微差距的,charles相比fiddler更加简洁,但并不是更弱一些。其界面简单宜人,比较清爽,这点可能已经吸了一大半的用户了吧。再者charles把一些常用的功能选项直接封装好了(如:模拟不同的网络俗),而fiddler可能有时需要修改代码,这对一些基础薄弱的小伙伴是非常不友好的,那么你可以试试charles,让我们开始吧!

TIP

charles同样有些功能也是需要收费的,但是相比fiddler可以免费试用基础功能,而且市面上破解的很多(自行搜索即可),对macOS用户也比较友好,可以尝试用用感觉一下

下载安装

charles支持windows、macOS、linux等多个版本

进入charles的官网https://www.charlesproxy.com,进入DownloadTab页,可以看到下面有多个系统版本可供下载,选择适合自己系统的点击,即可下载。

最下面还展示了下载firefox插件,看描述的意思是firefox旧版本可能会需要下载charles的插件来支持抓包,新版本就不需要下载了,大家可以根据自己的环境进行配置。这里作者是macOS,就安装了mac版,以下内容都以mac版charles作为基础,windows基本一样。

iShot_2022-10-18_08.09.53.png

面板介绍

iShot_2022-10-18_08.59.50.png

可以将charles的分为以下几个模块:

  • 菜单栏:一些全局相关的配置,如:偏好设置、记录显示与编辑、记录展示方式、代理配置、常用的工具、帮助等等
  • 工具栏:快捷设置菜单,如:清除记录、开关记录、开启弱网、断点设置、执行请求、重新请求等等
  • 抓包记录:显示抓包的记录,可以以域名归类记录也可以按请求顺序展示记录,单击会显示右侧的详情面板,右击有一些菜单功能
  • 请求详情:请求详情来显示当前请求的具体信息,如:请求头、响应主体、请求主体、TLS、Timing(一些请求连接时间)、size、状态码等等信息,还可以用不同类型格式查看请求或响应内容

接下来分别具体讲讲每个模块的使用

菜单栏

菜单栏相对来说比较重要,它来控制charles全局,可以导入导出记录、设置记录查看方式、设置代理(重要)、常用工具、证书安装等等

  • File:可以导入导出记录,文件会以.chls后缀保存,这种功能可以将记录发给别人查看比较方便
  • Edit:复制粘贴记录,查找记录(可以根据正则,查找范围多个维度进行查找,比较好用),当然这些功能都有对应的快捷键,当熟悉以后就不需要这么麻烦了
  • View:一些和查看记录的配置有关
    • 设置以Structure(用域名归纳请求,类似于嵌套文件夹,个人喜欢这种风格的)Sequence(请求顺序)来显示记录,推荐使用Structure,这个设置可以直接在记录面板点击即可
    • 高亮或者聚焦(会将其他请求折叠进一个文件夹)某个具体的请求,方便调试
    • 自定义请求的请求或响应的查看方式(不怎么用)
  • Proxy(重要):用来设置代理、网速、HTTPS、断点、DNS等等功能
    • Start Throttling & Throttle Setting:用来模拟网速,弱网测试比较方便 iShot_2022-10-18_09.59.42.png
    • Enable Breakpoints & Breakpoints Settings:用来设置断点请求,可以根据不同的域名、路径、请求方法等多个维度来设置,比较实用 iShot_2022-10-18_10.08.21.png
    • Proxy Setting:用来设置HTTP、Socket代理,也可以设置系统代理。默认HTTP Proxy代理监听端口为8888,可以修改如7777。macOS可以设置启动设置为系统代理(目前高版本window都会默认设置为系统代理),默认这些都是开启的。 iShot_2022-10-18_10.10.47.pngiShot_2022-10-18_10.11.08.png
    • Reverse Proxy:反向代理,可以将本地的请求反向代理到其他请求
    • DNS Setting:配置DNS
    • Access Control Setting:用来配置局域网中的其他机器代理规则,可以配置哪些ip允许代理,默认会允许所有ip代理的
  • Tools:一些请求相关配置工具,如:阻塞cookie、请求拦截代理、请求rewrite、执行请求等等功能
    • Block Cookie:阻塞请求的cookie,可以自定义匹配地址来阻塞,下图模拟了当请求http://192.168.3.58:9999/cookiecookie会被拦截,而http://192.168.3.58:9999则不会 iShot_2022-10-18_14.36.29.pngiShot_2022-10-18_14.38.38.pngiShot_2022-10-18_14.38.51.png
    • Map Remote & Map Local & Rewrite:用来拦截请求可以代理到其他地址也可以返回本地的文件等等,自己可以试试
    • Block List & Allow List:阻塞和允许指定的请求
    • Compose & Repeat:可以手动用charles来执行某个请求,可以指定并发数
  • help:用来安装证书,配置https的 iShot_2022-10-18_14.48.23.png

工具栏

工具栏主要是一些快捷设置菜单栏,如:清除记录、开关抓包、ssl开关、网速配置、断点设置、手动请求、重新请求、一些配置等等,基本上在菜单栏已经介绍的差不多了,这里自己手动操作一遍就可以了 工具栏

抓包记录

抓包记录是用来记录抓包的记录的,可以根据域名来归纳记录也可以使用请求顺序的方式展示记录,推荐使用域名归纳方式方便调试,一目了然;底部的Filter可以简单的过滤抓包记录,其他的高亮、聚焦展示前面已经讲过了。 iShot_2022-10-18_14.57.07.png

抓包详情

抓包详情通常就是我们用来分析返回来的内容和一些请求信息等,前端可以根据请求相关时间做一些优化 iShot_2022-10-18_15.10.19.pngiShot_2022-10-18_15.11.47.png

请求代理与篡改

请求代理与篡改可以参考菜单栏Tools中的Map Remote & Map Local & Rewrite等几个来调试,非常简单,这里就不介绍了,你也可以查看上一篇fiddler这块,基本都一样

断点调试

开启断点调试的条件:1.要勾选Enable Breakpoint 2.需要在Breakpoint Setting中勾选启用并且需要填写需要断点的域名,设置前面已经介绍了,忘记的可以前面查看。那么打了断点一般用来做什么,可以模拟请求时长、修改请求体和响应体等等。

这里设置断点http://192.168.3.58,当请求是这个域名时,就是命中断点,刷新浏览器发现已经命中断点

  1. 当前请求断点,查看请求体,也可以编辑请求内容 iShot_2022-10-18_15.22.46.png
  2. GET请求手动添加两个字段,点击Execute执行下一步 iShot_2022-10-18_15.23.54.png
  3. 当前为响应断点,可以看到刚刚添加的两个字段已经带上了,现在也可以编辑响应内容了 iShot_2022-10-18_15.25.42.png
  4. 编辑响应内容,删除了原来的返回数据,自定义一条数据 iShot_2022-10-18_15.27.46.png
  5. 查看浏览器内容已经经结果修改了 iShot_2022-10-18_15.28.26.png

以上就是断点调试的基本使用,其他的可以根据自己的需求进行配置即可

弱网测试

charles可以模拟不同的网络环境,很方便进行网速相关的测试如:超时、断网等等。这一点相比fiddler,charles内部已经内置了集中网络环境,而fiddler则需要改代码,不是很友好。

同样关于网络配置其前面已经讲述了,可以往上翻阅。需要注意的是,要开启Start Throttle和配置Throttle Setting

这里没有用内置的网络环境,自定义下载速率为5kb,已经相当慢了 iShot_2022-10-18_15.48.05.png 查看本地请求4s才完成,通过修改不同的网速可以模拟不同的网络环境 iShot_2022-10-18_15.48.35.png

配置HTTPS

在没有配置HTTPS下,对于HTTPS请求的请求和响应数据无法解码都是乱码,需要配置了HTTPS后才能查看解码后的内容,下图是在没有配置HTTPS的情况下,抓取https://www.baidu.com地址的请求,全是乱码 iShot_2022-10-18_15.53.58.png

配置HTTPS步骤

  1. Help > SSL Proxying > Install Charles Root Certificate,系统安装charles证书并信任 iShot_2022-10-18_15.58.48.png
  2. Proxy > SSL Proxying Settings > Enable SSL Proxying开启SSL Proxy,添加抓取的IP为*端口为443iShot_2022-10-18_16.03.50.png

再次查看抓取的HTTPS请求,已经完美解码了 iShot_2022-10-18_16.05.24.png

客户端抓包

配置客户端抓包首先需要和主机在同一局域网下,并且基于HTTPS步骤,主要步骤如下:(这里以ios为例)

  1. 打开Safari输入charles地址192.168.3.58:7777,fiddler会弹出是否允许抓包当前ip(手机ip),点击允许,你也可以在Proxy > Access Control Setting中直接配置允许的ip,就不会有当前弹窗提示了 iShot_2022-10-18_16.17.39.png
  2. 配置手机代理到charles IMG_0587.jpg
  3. 当前其实已经可以抓取手机包了,但是https请求还是有一些问题,因为没有在手机上安装charles证书。安装charles证书,点击Help > SSL Proxying > Install Charles Root Certificate On a Mobile Device...点击,会弹出手机的步骤,共两步,1.手机网络代理到charles和2.手机浏览器访问chls.pro/ssl来安装证书,上一步已经讲了配置手机代理,这里我们访问地址chls.pro/ssl来安装证书即可

iShot_2022-10-18_16.36.11.pngiShot_2022-10-18_16.37.09.pngIMG_0585.jpg 4. 安装证书到系统,需要信任证书,输入手机密码等等,一直下一步即可

IMG_0586.jpg 5. 在关于手机 > 证书 > 信任证书信任刚刚添加的证书

IMG_0588.jpg 6. 打开Safari访问https://blog.usword.cn查看charles的抓包,发现已经抓包成功

iShot_2022-10-18_16.35.21.png

以上便是ios的配置抓包流程,其他手机系统大同小异

汉化补丁

我觉得英文版也很好优化,没必要汉化,如果你更喜欢中文,这里是互联网提供的补丁连接,可以按自己的需要下载 https://www.52pojie.cn/thread-1350618-1-1.html

常见问题

这里列举一些常见的问题,也是作者刚开始使用时面临的问题,也有互联网上其他人的一些问题,如果你正因此困扰,希望这些可以帮到你

本地地址无法抓取

这个问题大概对于所有charles新手来说都会遇到,也就是在自己本地启动一个服务器,用localhost:port去访问服务,charles却抓取不到,很纳闷。这是由于一些系统硬编码的问题,charles抓取不到localhost的流量,因此charles做了一个代理,让我们用localhost.charlesproxy.com来代替localhost域名,其实将域名localhost.charlesproxy.com映射到了127.0.0.1所以可以抓到包了,点击这里官方做了解释

iShot_2022-10-18_17.02.57.png

现在访问http://localhost.charlesproxy.com:9999确实抓取到了 iShot_2022-10-18_17.04.41.png

除了上面的方法,你可以使用本地局域网ip也可以抓取到 iShot_2022-10-18_17.07.11.png

总结

以上就是charles的使用方法,相信到这里已经可以满足你的常用需求了,一定要自己动手实践才能熟能生巧;当然本篇也是挑了一些必懂的使用方法,其他使用可以自行摸索,都很简单的。和fiddler一样,charles也是基于客户端和服务端中间的代理,所以可以抓取记录,原理图可以看fiddler这篇。

相关文档:

https://www.charlesproxy.com/documentation

',62);function n(g,p,d,m,u,j){const o=i("Reward"),a=i("Gitalk");return h(),s("div",null,[r,e(o),e(a)])}const _=t(c,[["render",n]]);export{b as __pageData,_ as default}; diff --git a/assets/frontend_debug-skill_charles.md.cdOszKr5.lean.js b/assets/frontend_debug-skill_charles.md.cdOszKr5.lean.js new file mode 100644 index 000000000..dc3ee2dae --- /dev/null +++ b/assets/frontend_debug-skill_charles.md.cdOszKr5.lean.js @@ -0,0 +1 @@ +import{_ as t,c as s,J as e,V as l,o as h,G as i}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"Charles抓包工具使用指南","description":"charles一个简洁适配多系统的强大的抓包工具,方便抓取web和移动端数据包,设置代理等等","frontmatter":{"title":"Charles抓包工具使用指南","description":"charles一个简洁适配多系统的强大的抓包工具,方便抓取web和移动端数据包,设置代理等等","keywords":"charles,charles抓包工具,手机抓包,ios抓包,android抓包,客户端抓包,抓包工具,Mac抓包,前端调试,frontend debugger,chrome调试,调试技能,node调试,线上调试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-debug.png"},"headers":[],"relativePath":"frontend/debug-skill/charles.md","filePath":"frontend/debug-skill/charles.md","lastUpdated":1706247228000}'),c={name:"frontend/debug-skill/charles.md"},r=l("",62);function n(g,p,d,m,u,j){const o=i("Reward"),a=i("Gitalk");return h(),s("div",null,[r,e(o),e(a)])}const _=t(c,[["render",n]]);export{b as __pageData,_ as default}; diff --git a/assets/frontend_debug-skill_chrome.md.nkCU8h5d.js b/assets/frontend_debug-skill_chrome.md.nkCU8h5d.js new file mode 100644 index 000000000..c70e9f401 --- /dev/null +++ b/assets/frontend_debug-skill_chrome.md.nkCU8h5d.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as r,m as e,a as s}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"Chrome","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/debug-skill/chrome.md","filePath":"frontend/debug-skill/chrome.md","lastUpdated":1706247228000}'),a={name:"frontend/debug-skill/chrome.md"},c=e("h1",{id:"chrome",tabindex:"-1"},[s("Chrome "),e("a",{class:"header-anchor",href:"#chrome","aria-label":'Permalink to "Chrome"'},"​")],-1),l=e("p",null,"// 待更新",-1),n=e("p",null,"相关参考:",-1),d=e("ul",null,[e("li",null,[e("a",{href:"https://developer.chrome.com/docs/devtools/",target:"_blank",rel:"noreferrer"},"https://developer.chrome.com/docs/devtools/")])],-1),h=[c,l,n,d];function m(i,_,p,f,u,k){return r(),t("div",null,h)}const g=o(a,[["render",m]]);export{v as __pageData,g as default}; diff --git a/assets/frontend_debug-skill_chrome.md.nkCU8h5d.lean.js b/assets/frontend_debug-skill_chrome.md.nkCU8h5d.lean.js new file mode 100644 index 000000000..c70e9f401 --- /dev/null +++ b/assets/frontend_debug-skill_chrome.md.nkCU8h5d.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as r,m as e,a as s}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"Chrome","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/debug-skill/chrome.md","filePath":"frontend/debug-skill/chrome.md","lastUpdated":1706247228000}'),a={name:"frontend/debug-skill/chrome.md"},c=e("h1",{id:"chrome",tabindex:"-1"},[s("Chrome "),e("a",{class:"header-anchor",href:"#chrome","aria-label":'Permalink to "Chrome"'},"​")],-1),l=e("p",null,"// 待更新",-1),n=e("p",null,"相关参考:",-1),d=e("ul",null,[e("li",null,[e("a",{href:"https://developer.chrome.com/docs/devtools/",target:"_blank",rel:"noreferrer"},"https://developer.chrome.com/docs/devtools/")])],-1),h=[c,l,n,d];function m(i,_,p,f,u,k){return r(),t("div",null,h)}const g=o(a,[["render",m]]);export{v as __pageData,g as default}; diff --git a/assets/frontend_debug-skill_fiddler.md.07eSQgh_.js b/assets/frontend_debug-skill_fiddler.md.07eSQgh_.js new file mode 100644 index 000000000..36ac98bae --- /dev/null +++ b/assets/frontend_debug-skill_fiddler.md.07eSQgh_.js @@ -0,0 +1,24 @@ +import{_ as a,c as i,J as s,V as o,o as p,G as e}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"Fiddler抓包使用技巧","description":"fiddler抓包工具的使用,fiddler调试web应用程序和移动端的利器","frontmatter":{"title":"Fiddler抓包使用技巧","description":"fiddler抓包工具的使用,fiddler调试web应用程序和移动端的利器","keywords":"fiddler,fiddler抓包工具,手机抓包,ios抓包,android抓包,抓包工具,前端调试,frontend debugger,chrome调试,调试技能,node调试,线上调试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-debug.png"},"headers":[],"relativePath":"frontend/debug-skill/fiddler.md","filePath":"frontend/debug-skill/fiddler.md","lastUpdated":1706247228000}'),t={name:"frontend/debug-skill/fiddler.md"},c=o(`

Fiddler抓包

Fiddler 是位于客户端和服务器端的HTTP代理,是一个强大的抓包工具;可以作为系统的代理也可以代理具体的进程(如:chrome、firefox),针对代理对象fiddler会记录其所有的会话记录,分析请求数据、调试请求、刷新请求、设置断点、模拟或覆盖服务器返回的数据,还可以调试https请求,总之功能强大,是web调试的利器

TIP

fiddler有fiddler everywherefiddler classic等其他版本,其中fiddler everywhere功能最为强大同时支持多个系统,但是需要收费,当然你可以上网搜索破解版,这里就不赘述了: 本人在工作中使用fiddler classic版本,其功能也不逊色够开发和测试用了,推荐使用(不支持mac)。

注: 本文以fiddler classic版本进行介绍,以下fiddler文案全部代表的是fiddler classic

面板介绍

QQ截图20221010191428.png 当你下载安装完fiddler双击打开后,大概如上图这样;fiddler由不同的面板模块组成,主要包括:

  • 菜单栏
  • 工具栏
  • 代理监控面板
  • execquick、状态栏
  • 详情面板

接下来会对不同的面板进行介绍,再做一些详情案列说明

菜单栏

菜单栏对fiddler一般做一些全局的配置或功能,如:导入导出记录、保存、配置https、视图修改等等

menubar.png

  1. File:选项主要是加载最近、导入或保存存档,导入导出捕获记录,开关fiddler捕获抓包等功能;对于需要将测试抓包的一些数据分享给别人排查场景,导入导出功能便会发挥友好作用
  2. Edit:主要用来编辑抓包监控记录,如复制、粘贴、选择、查找等等,比较简单
  3. Rules\`:相对于前两者作用比较实用,可以自定义规则过滤对应的抓包记录,也可以限制不同的网速模拟网络环境,请求响应打断点,压缩等等
  4. Tools:里面的options功能最重要,可以管理代理、配置https、远程代理等等,除了options,还可以进行解码编码,清理缓存等功能
  5. View:用来控制面板显示
  6. help:帮助信息,不用太关心

工具栏

工具栏基本是对抓包做一些具体配置和操作,如断点、目标、查找、重放等功能,下面对常用的做简单介绍(简单的就不赘述了) QQ截图20221012120535.png

  1. WinConfig:针对windows做的一些配置
  2. replay:重放功能,重新发起请求
  3. :根据不同的选项删除抓包记录,Ctrl+x全部删除(最常用)
  4. go:当断点卡主时,点击执行下一步
  5. Decode:会对所有的请求进行解码操作
  6. Keep: All Session:用来显示抓包记录条数的
  7. Any Process:抓取指定进程的数据,点击不放手拖动到指定的应用程序,fiddler会自动识别到应用程序进程
  8. TextWizard:用来解码和编码
  9. Online:可以查看当前主机的ip、mac地址等等

代理监控面板

该面板主要来记录抓包的数据记录,可以大概看出每个记录的简单信息如:协议、状态码、请求来源、Host、URL等等,聚焦到此面板Ctrl+x会清除全部的记录,双击某条记录可以在右侧面板查看详细信息

execquick和状态栏

这两块位于fiddler面板底部和左下角

execquick

execquick是个快速执行命令的工具,如:查询、断点等等,可以查看官方文档,你也可以输入help回车就会打开文档,下面列举一些常用的:

sh
# 搜索
+?xxx #?baidu,则会查出url中包含baidu的记录
+
+# bpu 创建请求断点
+bpu xxx  #当请求url地址中包含xxx时命中断点
+bpu  #不带参数时会取消断点
+
+# bpafter 创建响应断点
+bpafter xxx #请求地址中包含xxx时,响应会命中断点
+bpafter #不带参数取消断点
+
+# cls 清除记录
+cls
+
+# =status 搜索目标状态码
+=status  #=301
+
+# =method 搜索请求方式
+=method #=POST

状态栏

状态栏可以看一些简单信息如:是否正在抓包,断点信息,抓包范围等等

  1. 左下角第一个点击切换可以快速开关抓包,当抓包是会显示Capturing
  2. 第二个会显示抓包范围,可以点击选择指定范围
  3. 第三个小块点击可以快速打断点,单击请求断点,点两次响应断点,点三次取消断点
  4. 后面会显示一些quickexec操作的信息

详情面板

QQ截图20221012163749.png

  1. FiddlerScript:用来修改脚本,fiddler是由C#写的所以要懂一些C#知识,其实和JS差不多

  2. Filters(重要):用来配置相应规则来抓包,相对来说更加自由一些,使用时需要把use filters打开 QQ截图20221012164715.png 如上图,可以从多个维度去配置规则去抓包

    • host: 主机
      • 可以选择本地或互联网抓包
      • 可以选择对应的host
    • client progress: 选择不同的进程来抓包
    • requset header:
      • 显示请求地址包含xxx的请求
      • 隐藏相关地址
      • 设置请求头
      • 删除请求头等等
    • 断点:
      • 不同请求方式断点
      • 指定header头断点等等
    • 响应状态码:根据不同状态码显示记录
    • 响应类型、传输大小等等

    当选择好对应的配置后,要勾选Use Filters选项,点击面板右上角ActionsRun filterset now

  3. Inspectors:当点击具体的抓包信息后,点击Inspectors可以查看请求的具体信息 QQ截图20221012184349.png

    主要分为请求报文和响应报文,可以按照不同的格式去查看内容,当打了断点时,还可以修改请求内容

  4. AutoResponder:自动响应请求内容,可以添加多个规则针对不同的请求做不同的响应 QQ截图20221012184905.png 如上图,在请求http://localhost:10000时,返回本地图片,达到篡改目的

    除了返回本地资源文件外,还可以模拟其他操作,如:返回不同状态码、重定向、请求代理等等 QQ截图20221012185428.png

    注:需要勾选Enble Rules才会工作,如果不影响其他的请求,需勾选Unmatched request passthrough选项,不然其他的也会被阻塞;当不用的时候记得关掉面板规则,防止影响其他操作

  5. Composer:用fiddler发送请求,可以自定义请求,修改请求内容,点击Execute发送请求;也可以将左侧的抓包记录鼠标按住拖到当前面板 QQ截图20221012190550.png 如上图,在请求头部添加自定义的字段name:小明,点击右上角执行,请求便会发送出去,执行结果如下图:会看到请求头中会携带刚刚添加的字段 QQ截图20221012190740.png

面板小结

以上便是fiddler各个模块的介绍,相信你已经对fiddler已经有了基本认识,当然还有一些功能需要自己去查看;工具毕竟是工具比较简单,如果你想要很短时间内熟悉它的使用,可以自己动手尝试,很快就会玩转它

接下来来介绍远程抓包,常见的就是app抓包,手机端抓包等等

客户端抓包

TIP

远程调试需要将远程应用和fiddler保持在局域网下

这里以IPhone为例,其他大同小异

  1. 首先在菜单栏中一次点击Tools > Options弹出options面板,选择ConnectionsTab,可以看到fiddler监听的端口为8088(不同版本可能不同),你也可以修改它;下面有一个选项为Allow remote computers to connect勾选上☑️,允许远程连接;右侧有一个Act as system proxy让fiddler作为系统代理(默认),点击保存后最好重启下fiddler,如果后续配置后正常话不重启也行,如下图: QQ截图20221012191525.png

  2. 为了不让其他本地请求影响到我们分析抓包,这里把抓包改为只抓远程的包。打开rules > custom rules,搜索static function OnBeforeRequest,将以下代码粘贴进去,保存配置后最好重启一下

c#
static function OnBeforeRequest(oSession: Session) {
+  // 抓取远程的
+              if (!String.IsNullOrEmpty(oSession["x-ProcessInfo"])) { 
+                      oSession["ui-hide"] = "localprocess"; 
+              }
+}
  1. 远程连接fiddler所在的计算机,这里以IPhone为例;首先查询计算机ip,可以通过fiddler右上角计算机图标提示,也可以在终端输入ipconfig查询或其他方法,如下图: QQ截图20221012191720.png

QQ截图20221012191812.png 手机在同一局域网下,配置wifi代理,找到和电脑连接相同的wifi,点击wifi,配置代理选择手动,输入刚刚查询的ip和fiddler监听的端口,点击保存 IMG_0556.jpg

打开Safari输入网址http://192.168.11.224:10000回车后,查看fiddler抓包记录

1525E81FFFF883D1CAE399097D7DDF52.png

QQ截图20221013154539.png

重新输入输入https://blog.usword.cnC8A68661E2.png

再看看抓包记录,会发现啥记录都没有

QQ截图20221013155018.png

https://blog.usword.cn是https协议地址,fiddler默认不会抓取https的,需要手动打开配置选项,而且需要安装fiddler证书为根证书,接下来一起配置https

配置HTTPS

QQ截图20221013164038.png

首先打开Tools > Options > HTTPS,将下图中的选项全部勾选,为方便测试Descript HTTPS traffic选择from remote clients only,如下图:

QQ截图20221013155947.png

在Safari中访问远程fiddler地址192.168.11.224:8088,点击允许下载证书 5DD9EE10FD.png

B4D670F449.png

打开手机设置,找到描述文件,点击信任安装证书iphone要输入手机密码(不同手机型号操作有差异),最后会看到已验证

FB1F83102D9AF2773325155581A75FE7.png

A7D37E643BF4136954A5AABF8F78C20E.png

2F6F6322E2EC59919FD479FAA5D5E20D.png

现在打开Safari重新访问https://blog.usword.cn查看抓包记录,会发现已经抓到了

20221013161635.png

当打开抖音App发现抓取不到信息,这是因为现在有的app已经有了反抓包手段

至此,关于fiddler的常用的抓包功能已经介绍的差不多了,到这里你应该对fiddler有一定的认识了,自己一定要动手实践一遍玩一玩才不会忘记

总结

fiddler是个很强大的抓包工具,主要原理是作为中间代理,代理客户端和服务器之间的通信,这样请求对于fiddler就是透明的;至于https,fiddler不但扮演了客户端和服务器进行TLS加密通信,还扮演了服务器和客户端进行TLS加密通信,之所以服务器信任fiddler,是因为fiddler证书已经被系统根证书信任了,所以可以进行通信,接下来来介绍charles的使用。

`,61);function r(d,g,h,u,m,b){const n=e("Reward"),l=e("Gitalk");return p(),i("div",null,[c,s(n),s(l)])}const F=a(t,[["render",r]]);export{f as __pageData,F as default}; diff --git a/assets/frontend_debug-skill_fiddler.md.07eSQgh_.lean.js b/assets/frontend_debug-skill_fiddler.md.07eSQgh_.lean.js new file mode 100644 index 000000000..3e0745e0e --- /dev/null +++ b/assets/frontend_debug-skill_fiddler.md.07eSQgh_.lean.js @@ -0,0 +1 @@ +import{_ as a,c as i,J as s,V as o,o as p,G as e}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"Fiddler抓包使用技巧","description":"fiddler抓包工具的使用,fiddler调试web应用程序和移动端的利器","frontmatter":{"title":"Fiddler抓包使用技巧","description":"fiddler抓包工具的使用,fiddler调试web应用程序和移动端的利器","keywords":"fiddler,fiddler抓包工具,手机抓包,ios抓包,android抓包,抓包工具,前端调试,frontend debugger,chrome调试,调试技能,node调试,线上调试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-debug.png"},"headers":[],"relativePath":"frontend/debug-skill/fiddler.md","filePath":"frontend/debug-skill/fiddler.md","lastUpdated":1706247228000}'),t={name:"frontend/debug-skill/fiddler.md"},c=o("",61);function r(d,g,h,u,m,b){const n=e("Reward"),l=e("Gitalk");return p(),i("div",null,[c,s(n),s(l)])}const F=a(t,[["render",r]]);export{f as __pageData,F as default}; diff --git a/assets/frontend_debug-skill_h5.md.GWeYJzVC.js b/assets/frontend_debug-skill_h5.md.GWeYJzVC.js new file mode 100644 index 000000000..8cdb0c5f4 --- /dev/null +++ b/assets/frontend_debug-skill_h5.md.GWeYJzVC.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as s,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"H5","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/debug-skill/h5.md","filePath":"frontend/debug-skill/h5.md","lastUpdated":1706247228000}'),n={name:"frontend/debug-skill/h5.md"},r=e("h1",{id:"h5",tabindex:"-1"},[o("H5 "),e("a",{class:"header-anchor",href:"#h5","aria-label":'Permalink to "H5"'},"​")],-1),d=e("p",null,"h5调试 // 待更新...",-1),c=[r,d];function l(i,h,_,p,f,m){return s(),a("div",null,c)}const b=t(n,[["render",l]]);export{k as __pageData,b as default}; diff --git a/assets/frontend_debug-skill_h5.md.GWeYJzVC.lean.js b/assets/frontend_debug-skill_h5.md.GWeYJzVC.lean.js new file mode 100644 index 000000000..8cdb0c5f4 --- /dev/null +++ b/assets/frontend_debug-skill_h5.md.GWeYJzVC.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as s,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"H5","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/debug-skill/h5.md","filePath":"frontend/debug-skill/h5.md","lastUpdated":1706247228000}'),n={name:"frontend/debug-skill/h5.md"},r=e("h1",{id:"h5",tabindex:"-1"},[o("H5 "),e("a",{class:"header-anchor",href:"#h5","aria-label":'Permalink to "H5"'},"​")],-1),d=e("p",null,"h5调试 // 待更新...",-1),c=[r,d];function l(i,h,_,p,f,m){return s(),a("div",null,c)}const b=t(n,[["render",l]]);export{k as __pageData,b as default}; diff --git a/assets/frontend_debug-skill_vscode.md.s-HeTMf3.js b/assets/frontend_debug-skill_vscode.md.s-HeTMf3.js new file mode 100644 index 000000000..c9ad7d35e --- /dev/null +++ b/assets/frontend_debug-skill_vscode.md.s-HeTMf3.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,V as o}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"vscode","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/debug-skill/vscode.md","filePath":"frontend/debug-skill/vscode.md","lastUpdated":1706247228000}'),r={name:"frontend/debug-skill/vscode.md"},s=o('

vscode

vscode天生支持JavaScript调试,同时也会对用其他语言转换成js的调试支持,它是vscode的内置强大功能。 // 待更新

auto attach

https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_auto-attach

Javascript Debug Terminal

Launch Configuration

request launch

request attach

sourcemaps

参考文档: https://code.visualstudio.com/docs/editor/debugginghttps://code.visualstudio.com/docs/typescript/typescript-debugginghttps://code.visualstudio.com/docs/nodejs/nodejs-debugging

',10),c=[s];function d(i,n,u,h,l,p){return t(),e("div",null,c)}const _=a(r,[["render",d]]);export{b as __pageData,_ as default}; diff --git a/assets/frontend_debug-skill_vscode.md.s-HeTMf3.lean.js b/assets/frontend_debug-skill_vscode.md.s-HeTMf3.lean.js new file mode 100644 index 000000000..7f2da5b8b --- /dev/null +++ b/assets/frontend_debug-skill_vscode.md.s-HeTMf3.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,V as o}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"vscode","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/debug-skill/vscode.md","filePath":"frontend/debug-skill/vscode.md","lastUpdated":1706247228000}'),r={name:"frontend/debug-skill/vscode.md"},s=o("",10),c=[s];function d(i,n,u,h,l,p){return t(),e("div",null,c)}const _=a(r,[["render",d]]);export{b as __pageData,_ as default}; diff --git a/assets/frontend_debug-skill_wireshark.md.s-dRrpN9.js b/assets/frontend_debug-skill_wireshark.md.s-dRrpN9.js new file mode 100644 index 000000000..5b3ed5546 --- /dev/null +++ b/assets/frontend_debug-skill_wireshark.md.s-dRrpN9.js @@ -0,0 +1,40 @@ +import{_ as p,c as l,J as s,V as o,o as c,G as a}from"./chunks/framework.SV1ROkXV.js";const F=JSON.parse('{"title":"wireshark网络抓包工具使用教程","description":"使用wireshark网络抓包工具分析网络数据包、协议、通信","frontmatter":{"title":"wireshark网络抓包工具使用教程","description":"使用wireshark网络抓包工具分析网络数据包、协议、通信","keywords":"wireshark,wireshark抓包工具,网络抓包工具,协议抓包,frontend debugger,chrome调试,调试技能,线上调试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-debug.png"},"headers":[],"relativePath":"frontend/debug-skill/wireshark.md","filePath":"frontend/debug-skill/wireshark.md","lastUpdated":1706247228000}'),t={name:"frontend/debug-skill/wireshark.md"},i=o(`

wireshark网络抓包

到这里已经讲了两个抓包工具的使用了,大家应该对抓包不是很陌生了。而wireshark相对于fiddlercharles更加偏向于网络层面的抓包或者说是一个网络封包分析工具。使用对象更适合于网络相关人员(网络管理员/相关运维等等),目的用来截取网络通信,显示详细的封包资料。

wireshark可以用来检测网络环境、入侵侦测系统等网络层面的用处,相对于开发人员,可以用来分析一些基础的网络层面的基础,如HTTP协议、UDP协议、TCP/IP协议、ARP协议等对我们比较友好的网络协议,当然如果你熟练操作网络可以没有任何限制。

下载安装

TIP

由于一些历史原因,wireshark已经是个免费软件,下载简单,功能强大,非常适合网络协议的学习和认识

wireshark支持windows、macOS、Linux几个版本,基本上常见的操作系统都可以支持的,直接打开官网下载页面,选择适合自己的操作系统,下载即可,下载完后一路点击确定安装就可。这里作者是macOS,就安装了mac版,如无特殊备注,以下都以mac版本为基础介绍,其他大同小异。

下载后打开大概长这个样子,它可以捕获机器上所有物理网卡虚拟网卡的流量,选择一个网卡开始捕获

iShot_2022-10-22_15.44.16.png

菜单栏

iShot_2022-10-21_08.43.06.png

菜单栏这里只讲下统计,它相对来说更加实用。统计内部有好多不同维度的分组,可以从不同维度去查看统计信息,如:流量、TCP流、UDP多播、HTTP等等。统计需要数据才可以统计出结果,可以先抓取少量的包,点击内部的流量图可以很清晰的看到网络通信

iShot_2022-10-21_08.41.25.png

工具栏

当进来时会进入欢迎页面,可以选择指定的网络接口(本地、wifi)或直接点击左上角的鲨鱼图标开始抓包。

iShot_2022-10-22_15.49.40.png

以上看到已经抓取了大量的网络数据包,下面开看看工具栏的作用

iShot_2022-10-22_15.09.52.png

工具栏主要使用来控制抓包的,以上的图标按顺序依次是开始抓包、停止抓包、重新捕获、捕获选项(网卡、过滤器)、打开本地捕获文件、保存捕获文件、关闭捕获、重新加载捕获文件、搜索(过滤器),基本上的图标控制按钮就这么简单,后面的都是对界面的一些控制,没什么说的,自己动手试试即可。

过滤器

当使用wireshark抓包时难免会有大量的抓包记录,而我们往往会针对某个网络包进行分析,而在这种大量数据下会严重影响到分析进度。为了避免其它数据造成的干扰,wireshark提供了过滤器来帮助过滤掉不必要的数据或只显示我们想要的数据。

过滤器分为捕获过滤器显示过滤器,而捕获过滤器又可以对网络接口协议相关的两个维度的过滤。显示过滤器主要是对抓取到的网络数据包进行过滤显示,其针对的显示方面的的过滤,而捕获过滤器则是从源头进行过滤。网络接口主要告诉wireshark要抓取哪个接口的网络数据包如:wifi、本地回环、以太网、虚拟网、蓝牙等等,协议方面的选项通常告诉其抓取什么协议、什么端口、ip等等,如:TCP协议、HTTP协议、广播、ip等等。

在进入wireshark时的欢迎页面就可以对进行不同的接口进行选择,双击接口就可以抓取了,不需要选择时,默认会抓取所有接口的数据,可以直接点击左上角的鲨鱼按钮开始抓取。

iShot_2022-10-22_16.09.43.png

除了在欢迎页选择不同的网络接口外,也可以在抓包页面上方的类似设置的按钮中,也可以选择不同的接口和详细的抓包选项,如下图:

iShot_2022-10-22_16.38.32.png 更详细过滤一些选项 iShot_2022-10-22_16.02.54.png

上面的过滤器我选择了抓取本地接口和端口为9999的数据包,这里我用Nodejs监听9999端口号开启了一个web服务,接着用curl请求这个地址:

sh
 curl -I 192.168.3.2:9999 # 请求成功
+HTTP/1.1 200 OK
+X-Powered-By: Express
+Set-Cookie: __ut=123456; Path=/
+Content-Type: application/json; charset=utf-8
+Content-Length: 79
+ETag: W/"4f-IdYGYravFqZ+6sBfe27/eQDuPDo"
+Date: Sat, 22 Oct 2022 08:46:19 GMT
+Connection: keep-alive
+Keep-Alive: timeout=5

iShot_2022-10-22_16.49.58.png

现在看看当前的抓包情况,可以看到已经抓取到了,原地址和目标地址都是192.168.3.2本机局域网地址,还看到TCP协议、HTTP协议,如果现在只想分析HTTP协议的数据包呢,就可以用上显示过滤器了。设置它很简单,在记录上方的输入框即可过滤。如下图:显示http协议的请求。

iShot_2022-10-22_16.57.26.png

以上还可以再细分,可以结合多个过滤选项使用and/or进行连接过滤,如http请求的携带了query

http and http and http.request.uri.query.parameter

这里过滤选项不需要记下来,点击输入框前面的小图标,可以列出不同的选项,点击后可以在输入框中添加.进行属性的进一步过滤。除了这个内置的显示过滤外,可以点击菜单栏的放大镜按钮,也会显示出过滤的输入框。这里相对来说有了更广的过滤条件,可以使用显示过滤、正则搜索、十六进制、字符串等等,点击搜索即可,搜索后并不会将不在范围的记录隐藏掉,而知识将目标高亮而已。

iShot_2022-10-22_17.03.18.png

ARP协议

通过前面的学习你应该对wireshark这款软件的抓包基本功能有了了解,现在就来使用它来抓取数据包分析吧,本文会分别介绍ARP协议、TCP协议等网络协议,让我们以ARP协议开始吧。

在抓包开始前首先要明白什么是ARP协议,了解协议本身有助于我们抓取的准备和方向,这里简单的概述下。

ARP是地址解析协议,从协议层次角度是个网络层协议,功能角度是链路层协议,用来查询ip所对应的mac地址。在互联网通信中,主机与主机之间通信,都是通过OSI模型从上到下的协议将数据封装最终发送到目的主机,通常情况下我们常见的是对应主机的ip,然后就可以知道目标主机的位置了,但这只是表面上的,通信双方还需要知道双方的mac地址才能通信,没有mac地址就像快递只写了收件人姓名,却没有收件地址一样。

上层应用程序只关心ip地址而不关系mac地址,mac地址需要通过ARP协议获取目标主机地址,完成数据的封装。那么ARP协议是如何获取目标主机的mac地址的,假如这里有两台机器:p1的ip地址192.168.3.1,p2的ip地址192.168.3.2,当p1想和p2通信时,从OSI协议封装顺序发送方自顶向下封装数据,ARP从上层知道了p2的目标ip地址,然后封装ARP数据包,将自己的ip地址和mac地址和对方的ip和mac占位地址封装,然后通过以太网的广播形式发送出去,交换机、网关或路由器等设备接收到广播包后,会将数据发给同一局域网的其他主机,当不同的主机接受到广播包后,会判断自己是不是这个发送者寻找的ip,如果不是则会将包丢弃掉不做任何应答;而如果当前主机和目的ip一致的话,将会接受此包并将自己的mac地址封装进去,并以单播的形式回应发送主机方,发送主机方就会知道目标ip所对应的mac地址了;如果在局域网中没找到响应的主机,交换机等会继续向上发送数据包直到找到位置。

iShot_2022-10-23_08.28.31.jpg

上图简单的画了请求的过程:

  1. 发送方ARP广播发送数据包请求到交换机
  2. 交换机转发给局域网内的主机
  3. 不是目标ip的主机丢弃掉数据包,目标ip主机接收数据包
  4. 目标主机以单播的形式回应发送方

小提示

在ARP请求广播过程中,途径的网关和其他接收到广播的主机虽然不是目标主机,但也会在自己的ARP缓存表中记住发送方的ip和mac地址,这是方便以后其他主机向目标主机通信。

当目标主机找到后,也会记住发送方的ip和mac地址,然后将自己的mac地址和ip地址封装数据后以单播的形式回应发送给发送方。

接下来就用wireshark抓包看看实际的网络请求情况,这里一台机器的ip为192.168.3.8,现在让它请求网关192.168.3.1,这里使用linux的nmap扫描工具扫描网关。

首先先打开wireshark监听抓包,这里直接抓取所有的接口,在显示过滤器中输入ARP协议来过滤显示ARP协议的数据包。

sh
nmap 192.168.3.1 # 然后会找到以下信息
+# Starting Nmap 7.70 ( https://nmap.org ) at 2022-10-22 22:02 CST
+# Nmap scan report for 192.168.3.1
+# Host is up (0.0070s latency).
+# Not shown: 972 closed ports
+# PORT      STATE    SERVICE
+# 3/tcp     filtered compressnet
+# 53/tcp    open     domain
+# 80/tcp    open     http
+# ....
+
+arp -a # 查看ARP缓存表信息
+# ➜ arp -a            
+# _gateway (192.168.3.1) at dc:33:xx:xx:xx:07 [ether] on enp0s5  # 这里就是网关被找到了
+# ? (192.168.3.2) at 38:f9:xx:xx:05:db [ether] on enp0s5

上面通过扫描工具扫描网关,再查看ARP缓存表中已经缓存了网关信息,接下来看看抓包情况:

iShot_2022-10-22_22.05.39.png

ARP请求: iShot_2022-10-22_22.09.38.png

ARP应答: iShot_2022-10-22_22.13.09.png

从抓包数据可以看到,首先Apple(192.168.3.8)主机以广播的形式发送数据包,ARP请求数据包中有自己的Send MAC address、ip address还有目标主机的ip192.168.3.1和mac地址00:00:00:00:00:00(这里0表示坑位待目标填写),携带信息Who has 192.168.3.1? tell 192.168.3.8。当Huawei(网关192.168.3.1)接受到Apple发送来的数据包后,将自己的mac地址封装仅需其他的保持不变,再以单播的形式发送ARP Reply数据包,携带信息192.168.3.1 at xx:xx:xx:xxx,这样在Apple接收到数据包后就知道了目标的Mac地址了,就可以进行数据发送了。

这里简单说下ARP数据包中一些字段:

  • Hardware type:硬件类型(标识链路层协议)
  • Protocol type:协议类型(标识网络层协议)
  • Hardware size:硬件地址大小(标识mac地址长度),这里是6字节,48bit
  • Protocol size:协议地址大小(表示ip地址长度),这里是4字节,32bit
  • Opcode:操作码(表示ARP请求类型),1表示请求,2表示应答
  • Sender Mac address:发送者mac地址
  • Sender IP address:发送者ip地址
  • Target MAC address:目标mac地址
  • Target IP address:目标ip地址

以上便是ARP协议的基本原理,通过nmap扫描工具,再用wireshark进行抓包分析后应该已经对ARP协议不陌生了,基本就是一问一答简单形式。当然这里主要还是讲wireshark怎么抓取ARP数据包,来理解ARP的简单概念,至于ARP的更详细的概念可以看看其他文章,如果没有后面也会更新相关文章。

TCP协议

TCP协议是基于字节流面向连接、可靠的、全双工的单播协议,在通信前必须建立连接,也就是常说的三次握手,然后会断开进行四次挥手。我们来先了解下TCP头部。 g0ywreqte9.png

  • 源端口、目标端口:TCP里没有源IP和目的IP,这是IP层协议的事情,源IP、源端口、目标IP、目标端口构成了TCP四元组,一个四元组可以标识一个连接。
  • 序列号:用于确认包的的顺序,序列号加上报文长度,用于确定传输的是哪一段数据。
  • 确认号:TCP使用确认号来告知对方下一个期望接受的序列号
  • 标志位:用来发起连接同步初始序列号,有些用来确认数据包,还有用来结束连接的
    • SYN:用于发起连接数据包同步初始序列号
    • ACK:确认数据,只有当ACK=1时有效
    • RST:强制断开连接
    • FIN:告知对方数据发送完毕,准备断开连接
    • PSH:告知对方数据包收到后马上交给应用层,不能缓存
  • 窗口大小:用来控制对方发送的数据量

更多TCP的详细内容请查看我的「TCP协议」一文

上面简单的介绍了TCP头部部分信息,TCP的连接由发送SYN开始,结束时通过FIN断开连接。下面我们就通过wireshark进行抓包分析。因为HTTP请求也是基于TCP协议的,这里以HTTP请求为例展开三次握手和四次挥手的细节。

这里开启一个node服务作为web服务器:

js
const express = require("express")
+const app = express()
+const port = process.env.PORT || 9999
+
+app.use(async (req, res, next) => {
+  res.setHeader("connection", "close")
+  res.json({
+    url: req.url,
+    ...req.headers,
+    ...req.query
+  })
+})
+
+app.listen(port, () => {
+  console.log(\`Server is running on port \${port}\`)
+});

wireshark我们选择本地回环地址网卡接口,端口选择9999iShot_2022-10-23_15.32.54.png

三次握手

这里使用curl发起服务请求

sh
  curl http://localhost:9999
+{"url":"/","host":"localhost:9999","user-agent":"curl/7.64.1","accept":"*/*"}%

看下抓包情况: iShot_2022-10-23_15.45.40.png 从上图抓包记录可以将记录分为三部分:①TCP三次握手连接,②HTTP请求相关,③TCP四次挥手

下面这张图概况了三次握手的摘要 iShot_2022-10-23_16.19.57.png 抓包记录: iShot_2022-10-23_15.48.12.png

  1. 这里看出两端通信的端口为54987(终端)和9999(服务器),终端发送SYN类型请求,指明客户端的初始化序号为0,这里的0位相对值,其真实性值为3059428279,并告诉下次的序列号为1,如下图: iShot_2022-10-23_15.52.26.png

  2. 服务端接收到客户端的SYN数据包后,发送自己的应答SYN包,并指定自己的序列号0(真实值3338838224),并将客户端的序列号+1发送ACK=1确认包(acknumber=3059428280),并告诉下次序列号为1,如下图: iShot_2022-10-23_16.01.16.png

  3. 客户端接收到了服务端的SYN数据包和ACK包后,也将服务端的SYN+1(acknumber = 3338838225)作为ACK数据包发送给服务端,就完成了三次握手 iShot_2022-10-23_16.11.54.png

至于ACK值不断加1是为了标识数据包保证接收方的顺序性,因为发送时数据可能乱序,在收到数据后,TCP不会直接把数据交给上层,而会做一个缓存,直到传输完毕将包按顺序组装在上交给应用层。

三次握手的简单理解: 第一次:客户端发送数据到服务端,服务端接收到后知道客户端的发送能力没问题 第二次:服务端发送数据到客户端,客户端接接收后知道服务端的接收能力正常,发送能力也没问题 第三次:客户端再发送数据到服务端,服务端接收后知道客户端的接收能力没问题

通过三次握手两端都知道了对方发送和接收没有问题,之后就可以正常通信了。

四次挥手

当客户端请求毕后就会断开连接,由于为了提高传输效率http使用keep-alive会在一定时间内保持TCP的连接,这里设置HTTP头部connection=close表示请求完毕后立即断开连接。

来看回收抓包记录: iShot_2022-10-23_16.36.34.png

  1. 在客户端请求完毕后会发送FIN报文给服务端,包含自己的序列号seq=79和ack=125来确认对方最近一次发送的数据,然后表示我没有其他请求了,这时客户端进入FIN_WAIT1状态 iShot_2022-10-23_16.44.22.png
  2. 服务端接收到数据包后,发送包含自己的seq=125和ack=80的ACK报文给客户端,表示我知道了,并通知上层应用另一端发起了关闭操作,此时服务端并不会立马发起关闭操作,也就是发送服务端的FIN报文,此时服务端进入CLOSE_WAIT状态,客户端进入FIN_WAIT2状态 iShot_2022-10-23_16.47.36.png
  3. 等一会时间服务端再发送包含seq=125,ack=80的FIN报文和ACK报文并期待下一次的ACK序列号为126,表示可以断开连接了,服务端进入LAST_ACK状态 iShot_2022-10-23_16.50.48.png
  4. 客户端接收到后会在发送ack=126的ACK报文,最后断开连接,此时客户端进入TIMED_WAIT状态,服务端将会进入CLOSED状态,最后再等2MSL(Maximum Segment Lifetime)客户端也进入CLOSED状态 iShot_2022-10-23_16.52.15.png

通过上面的分析已经对四次挥手有了更深理解了,下面再画个图总结下 iShot_2022-10-23_17.17.26.png

以上就是TCP挥手的基本原理了。这里解释一下两个问题:

  1. 为什么挥手要四次,而握手是3次? 因为握手时服务端直接确认连接不需要等待,所以发送SYN+ACK数据包。而挥手时服务端接受到了客户端的FIN包后,知道客户端没有请求了但还可以继续接受数据包,服务端也并不能立马关闭连接,因为服务端此时可能数据并没有发送完毕,需要等待发送完毕后才会主动发送FIN包请求断开。
  2. 为什么客户端挥手后发送了ACK包还要等2MSL段时间才会进入CLOSED状态? 这是因为当客户端发送了ACK报文后,有可能有丢失的包的可能,这导致服务端还没有收到客户端的ACK报文,会认为自己发的FIN报文可能客户端没有收到,于是会再发一个给客户端,客户端会再发送ACK报文,重新计时2MSL,等服务端接收到ACK报文后,则不会再发送FIN报文,2MSL时间段后客户端正式进入CLOSED状态。

HTTP协议

由于HTTP协议是基于TCP协议的,所以上面我们用curl发起的是HTTP请求,那我们看下http请求过程。 iShot_2022-10-23_17.35.00.png

  • 首先客户端发送GET请求给服务端
  • 服务端发送TCP的ACK的数据包确认已经收到请求了
  • 服务端发送http响应,状态码200
  • 客户端接收到后,发送TCP的ACK数据包表示已经接收到了数据

我们通过跟踪HTTP数据流看下细节: iShot_2022-10-23_17.37.10.png

到这里已经了解了如何用wireshark分析ARP协议、TCP协议和HTTP协议了,当然这只是简单的讲解,其他协议都大同小异,更多功能自己可以动手试试。

统计

统计可以对网络数据进行不同维度的统计,如:HTTP、TCP、UDP、DNS等相关的统计,这些统计比较简单,自己动手试试就会明白。

小结

本篇介绍了wireshark的基本使用,并通过对ARP协议、TCP协议和HTTP协议的分析,已经掌握了分析数据包的基本能力,并加强了相关协议的理解,其他相关的协议都大同小异。到本篇已经讲了3款抓包软件了,相信大家对抓包已经不陌生了,希望通过这些抓包工具可以提高你的分析能力和对原理的认识。

`,87);function r(h,d,y,u,g,m){const n=a("Reward"),e=a("Gitalk");return c(),l("div",null,[i,s(n),s(e)])}const D=p(t,[["render",r]]);export{F as __pageData,D as default}; diff --git a/assets/frontend_debug-skill_wireshark.md.s-dRrpN9.lean.js b/assets/frontend_debug-skill_wireshark.md.s-dRrpN9.lean.js new file mode 100644 index 000000000..e2d9985d8 --- /dev/null +++ b/assets/frontend_debug-skill_wireshark.md.s-dRrpN9.lean.js @@ -0,0 +1 @@ +import{_ as p,c as l,J as s,V as o,o as c,G as a}from"./chunks/framework.SV1ROkXV.js";const F=JSON.parse('{"title":"wireshark网络抓包工具使用教程","description":"使用wireshark网络抓包工具分析网络数据包、协议、通信","frontmatter":{"title":"wireshark网络抓包工具使用教程","description":"使用wireshark网络抓包工具分析网络数据包、协议、通信","keywords":"wireshark,wireshark抓包工具,网络抓包工具,协议抓包,frontend debugger,chrome调试,调试技能,线上调试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-debug.png"},"headers":[],"relativePath":"frontend/debug-skill/wireshark.md","filePath":"frontend/debug-skill/wireshark.md","lastUpdated":1706247228000}'),t={name:"frontend/debug-skill/wireshark.md"},i=o("",87);function r(h,d,y,u,g,m){const n=a("Reward"),e=a("Gitalk");return c(),l("div",null,[i,s(n),s(e)])}const D=p(t,[["render",r]]);export{F as __pageData,D as default}; diff --git a/assets/frontend_desktop-app_index.md.efUgh7UD.js b/assets/frontend_desktop-app_index.md.efUgh7UD.js new file mode 100644 index 000000000..2e1c26a23 --- /dev/null +++ b/assets/frontend_desktop-app_index.md.efUgh7UD.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as p}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"desktop app","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/desktop-app/index.md","filePath":"frontend/desktop-app/index.md","lastUpdated":1706247228000}'),d={name:"frontend/desktop-app/index.md"},s=e("h1",{id:"desktop-app",tabindex:"-1"},[p("desktop app "),e("a",{class:"header-anchor",href:"#desktop-app","aria-label":'Permalink to "desktop app"'},"​")],-1),n=[s];function r(c,i,_,l,f,k){return o(),a("div",null,n)}const x=t(d,[["render",r]]);export{h as __pageData,x as default}; diff --git a/assets/frontend_desktop-app_index.md.efUgh7UD.lean.js b/assets/frontend_desktop-app_index.md.efUgh7UD.lean.js new file mode 100644 index 000000000..2e1c26a23 --- /dev/null +++ b/assets/frontend_desktop-app_index.md.efUgh7UD.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as p}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"desktop app","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/desktop-app/index.md","filePath":"frontend/desktop-app/index.md","lastUpdated":1706247228000}'),d={name:"frontend/desktop-app/index.md"},s=e("h1",{id:"desktop-app",tabindex:"-1"},[p("desktop app "),e("a",{class:"header-anchor",href:"#desktop-app","aria-label":'Permalink to "desktop app"'},"​")],-1),n=[s];function r(c,i,_,l,f,k){return o(),a("div",null,n)}const x=t(d,[["render",r]]);export{h as __pageData,x as default}; diff --git a/assets/frontend_editor_index.md._6kkOtxM.js b/assets/frontend_editor_index.md._6kkOtxM.js new file mode 100644 index 000000000..77577cccf --- /dev/null +++ b/assets/frontend_editor_index.md._6kkOtxM.js @@ -0,0 +1,17 @@ +import{_ as n,c as e,o as a,V as s}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"编辑器相关","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/editor/index.md","filePath":"frontend/editor/index.md","lastUpdated":1706247228000}'),l={name:"frontend/editor/index.md"},i=s(`

编辑器相关

  • DocumentORShadow.activeElement: 获取聚焦元素focus/active

  • Selection对象(window.getSelection / document.setSelection): 用户选择的文本范围或光标的当前位置,https://developer.mozilla.org/zh-CN/docs/Web/API/Selection

  • Range(接口表示一个包含节点与文本节点的一部分的文档片段):https://developer.mozilla.org/zh-CN/docs/Web/API/Range

    • 属性:
      • collapsed
      • commonAncestorContainer
      • startContainer
      • endContainer
      • startOffset
      • endOffset
    • 方法:
      • collapse
      • compareBoundaryPoints(how, sourceRange)边界比较
      • comparePoint(referenceNode, offset)返回 -1、0 或 1,分别表示端点在 Range 之前、内部还是之后
      • cloneContents:返回range中所有节点文档片段
      • cloneRange()
      • deleteContents()
      • getBoundingClientRect(): 返回范围内容的DOMRect
      • getClientRects
      • getIsPointInRange(node, offset): 判断某个节点在range里
      • insertNode(node): 在range开头插入节点
      • intersectsNode(node): 判断节点是否相交
      • selectNode(node): 选中节点,并将range起始节点的父节点和node的父节点相同
      • selectNodeContents(node): 设置包含节点内容
      • setEnd(node, offset): 设置range终点
      • setStart(node, offset): 设置起点
      • setEndAfter(refenceNode)
      • setEndBefore
  • 粘贴对象(clipboardData): ClipboardEvent.clipboardData https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent/clipboardData

  • 零宽字符

零宽空格(zero-width space, ZWSP)用于可能需要换行处。
+    Unicode: U+200B  HTML: &#8203;
+
+零宽不连字 (zero-width non-joiner,ZWNJ)放在电子文本的两个字符之间,抑制本来会发生的连字,而是以这两个字符原本的字形来绘制。
+    Unicode: U+200C  HTML: &#8204;
+
+零宽连字(zero-width joiner,ZWJ)是一个控制字符,放在某些需要复杂排版语言(如阿拉伯语、印地语)的两个字符之间,使得这两个本不会发生连字的字符产生了连字效果。
+    Unicode: U+200D  HTML: &#8205;
+
+左至右符号(Left-to-right mark,LRM)是一种控制字符,用于计算机的双向文稿排版中。
+    Unicode: U+200E  HTML: &lrm; &#x200E; 或&#8206;
+
+右至左符号(Right-to-left mark,RLM)是一种控制字符,用于计算机的双向文稿排版中。
+    Unicode: U+200F  HTML: &rlm; &#x200F; 或&#8207;
+    
+字节顺序标记(byte-order mark,BOM)常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的标记。
+    Unicode: U+FEFF
`,3),p=[i];function r(t,o,c,d,m,b){return a(),e("div",null,p)}const h=n(l,[["render",r]]);export{f as __pageData,h as default}; diff --git a/assets/frontend_editor_index.md._6kkOtxM.lean.js b/assets/frontend_editor_index.md._6kkOtxM.lean.js new file mode 100644 index 000000000..a9fb9e450 --- /dev/null +++ b/assets/frontend_editor_index.md._6kkOtxM.lean.js @@ -0,0 +1 @@ +import{_ as n,c as e,o as a,V as s}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"编辑器相关","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/editor/index.md","filePath":"frontend/editor/index.md","lastUpdated":1706247228000}'),l={name:"frontend/editor/index.md"},i=s("",3),p=[i];function r(t,o,c,d,m,b){return a(),e("div",null,p)}const h=n(l,[["render",r]]);export{f as __pageData,h as default}; diff --git a/assets/frontend_flutter_base.md.9KY5vMgx.js b/assets/frontend_flutter_base.md.9KY5vMgx.js new file mode 100644 index 000000000..417c3f1ee --- /dev/null +++ b/assets/frontend_flutter_base.md.9KY5vMgx.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as s}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"flutter","description":"","frontmatter":{"title":"flutter"},"headers":[],"relativePath":"frontend/flutter/base.md","filePath":"frontend/flutter/base.md","lastUpdated":1706247228000}'),o={name:"frontend/flutter/base.md"},n=e("h1",{id:"flutter",tabindex:"-1"},[s("flutter "),e("a",{class:"header-anchor",href:"#flutter","aria-label":'Permalink to "flutter"'},"​")],-1),l=e("p",null,"// 待补充...",-1),d=[n,l];function c(f,i,_,u,p,h){return r(),a("div",null,d)}const x=t(o,[["render",c]]);export{b as __pageData,x as default}; diff --git a/assets/frontend_flutter_base.md.9KY5vMgx.lean.js b/assets/frontend_flutter_base.md.9KY5vMgx.lean.js new file mode 100644 index 000000000..417c3f1ee --- /dev/null +++ b/assets/frontend_flutter_base.md.9KY5vMgx.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as s}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"flutter","description":"","frontmatter":{"title":"flutter"},"headers":[],"relativePath":"frontend/flutter/base.md","filePath":"frontend/flutter/base.md","lastUpdated":1706247228000}'),o={name:"frontend/flutter/base.md"},n=e("h1",{id:"flutter",tabindex:"-1"},[s("flutter "),e("a",{class:"header-anchor",href:"#flutter","aria-label":'Permalink to "flutter"'},"​")],-1),l=e("p",null,"// 待补充...",-1),d=[n,l];function c(f,i,_,u,p,h){return r(),a("div",null,d)}const x=t(o,[["render",c]]);export{b as __pageData,x as default}; diff --git a/assets/frontend_hybrid-app_base.md.hBB-XojM.js b/assets/frontend_hybrid-app_base.md.hBB-XojM.js new file mode 100644 index 000000000..37ac78d89 --- /dev/null +++ b/assets/frontend_hybrid-app_base.md.hBB-XojM.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,V as i}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"混合应用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/hybrid-app/base.md","filePath":"frontend/hybrid-app/base.md","lastUpdated":1706247228000}'),r={name:"frontend/hybrid-app/base.md"},l=i('

混合应用

// 待补充...

常见的跨端技术:

  • h5 + webview
  • flutter
  • reactNative
  • weex
  • uniapp
  • electronjs
',4),o=[l];function n(s,_,d,p,c,h){return a(),t("div",null,o)}const b=e(r,[["render",n]]);export{u as __pageData,b as default}; diff --git a/assets/frontend_hybrid-app_base.md.hBB-XojM.lean.js b/assets/frontend_hybrid-app_base.md.hBB-XojM.lean.js new file mode 100644 index 000000000..7f5fffb7d --- /dev/null +++ b/assets/frontend_hybrid-app_base.md.hBB-XojM.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,V as i}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"混合应用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/hybrid-app/base.md","filePath":"frontend/hybrid-app/base.md","lastUpdated":1706247228000}'),r={name:"frontend/hybrid-app/base.md"},l=i("",4),o=[l];function n(s,_,d,p,c,h){return a(),t("div",null,o)}const b=e(r,[["render",n]]);export{u as __pageData,b as default}; diff --git a/assets/frontend_js_async.md.JY11OOTH.js b/assets/frontend_js_async.md.JY11OOTH.js new file mode 100644 index 000000000..db89db57d --- /dev/null +++ b/assets/frontend_js_async.md.JY11OOTH.js @@ -0,0 +1,4 @@ +import{_ as a,c as s,o as e,V as n}from"./chunks/framework.SV1ROkXV.js";const D=JSON.parse('{"title":"Javascript异步编程","description":"同步和异步的区别,为什么说异步编程对于前端很重要,本文来看前端异步的发展过程","frontmatter":{"title":"Javascript异步编程","description":"同步和异步的区别,为什么说异步编程对于前端很重要,本文来看前端异步的发展过程","keywords":"Javascript异步编程,Promise,手写promise,回调函数,回调地狱,订阅发布,事件监听,async/await,迭代器,generator","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/async.md","filePath":"frontend/js/async.md","lastUpdated":1706247228000}'),o={name:"frontend/js/async.md"},t=n(`

Javascript异步编程

callback => 事件监听 => 发布订阅 => promise => generator => async/await

同步和异步

简要概述及特点

为什么需要异步

理解异步对于前端的重要性

异步"影子"

介绍异步的不同源, 说明绝大多数api都有异步的影子,这也说明了异步的重要性

回调函数

ajax

事件监听

click

发布订阅

eventbus

promise

迭代器generator

js
// what is a generator
+function *gen() {};
+g = gen();
+typeof g.next === "function" && typeof g.throw === "function"

async/await

`,18),r=[t];function l(p,c,i,h,d,u){return e(),s("div",null,r)}const m=a(o,[["render",l]]);export{D as __pageData,m as default}; diff --git a/assets/frontend_js_async.md.JY11OOTH.lean.js b/assets/frontend_js_async.md.JY11OOTH.lean.js new file mode 100644 index 000000000..27e13d790 --- /dev/null +++ b/assets/frontend_js_async.md.JY11OOTH.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as e,V as n}from"./chunks/framework.SV1ROkXV.js";const D=JSON.parse('{"title":"Javascript异步编程","description":"同步和异步的区别,为什么说异步编程对于前端很重要,本文来看前端异步的发展过程","frontmatter":{"title":"Javascript异步编程","description":"同步和异步的区别,为什么说异步编程对于前端很重要,本文来看前端异步的发展过程","keywords":"Javascript异步编程,Promise,手写promise,回调函数,回调地狱,订阅发布,事件监听,async/await,迭代器,generator","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/async.md","filePath":"frontend/js/async.md","lastUpdated":1706247228000}'),o={name:"frontend/js/async.md"},t=n("",18),r=[t];function l(p,c,i,h,d,u){return e(),s("div",null,r)}const m=a(o,[["render",l]]);export{D as __pageData,m as default}; diff --git a/assets/frontend_js_audio.md.bjTod7Ut.js b/assets/frontend_js_audio.md.bjTod7Ut.js new file mode 100644 index 000000000..a782e8544 --- /dev/null +++ b/assets/frontend_js_audio.md.bjTod7Ut.js @@ -0,0 +1 @@ +import{_ as d,c as s,J as a,m as e,a as o,o as i,G as t}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"音视频","description":"","frontmatter":{"title":"音视频"},"headers":[],"relativePath":"frontend/js/audio.md","filePath":"frontend/js/audio.md","lastUpdated":1706247228000}'),c={name:"frontend/js/audio.md"},l=e("h1",{id:"音视频",tabindex:"-1"},[o("音视频 "),e("a",{class:"header-anchor",href:"#音视频","aria-label":'Permalink to "音视频"'},"​")],-1),_=e("h2",{id:"音频可视化",tabindex:"-1"},[o("音频可视化 "),e("a",{class:"header-anchor",href:"#音频可视化","aria-label":'Permalink to "音频可视化"'},"​")],-1);function m(p,u,h,f,b,x){const r=t("WebAudioRecorder"),n=t("AudioVirtual");return i(),s("div",null,[l,a(r),_,a(n)])}const A=d(c,[["render",m]]);export{k as __pageData,A as default}; diff --git a/assets/frontend_js_audio.md.bjTod7Ut.lean.js b/assets/frontend_js_audio.md.bjTod7Ut.lean.js new file mode 100644 index 000000000..a782e8544 --- /dev/null +++ b/assets/frontend_js_audio.md.bjTod7Ut.lean.js @@ -0,0 +1 @@ +import{_ as d,c as s,J as a,m as e,a as o,o as i,G as t}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"音视频","description":"","frontmatter":{"title":"音视频"},"headers":[],"relativePath":"frontend/js/audio.md","filePath":"frontend/js/audio.md","lastUpdated":1706247228000}'),c={name:"frontend/js/audio.md"},l=e("h1",{id:"音视频",tabindex:"-1"},[o("音视频 "),e("a",{class:"header-anchor",href:"#音视频","aria-label":'Permalink to "音视频"'},"​")],-1),_=e("h2",{id:"音频可视化",tabindex:"-1"},[o("音频可视化 "),e("a",{class:"header-anchor",href:"#音频可视化","aria-label":'Permalink to "音频可视化"'},"​")],-1);function m(p,u,h,f,b,x){const r=t("WebAudioRecorder"),n=t("AudioVirtual");return i(),s("div",null,[l,a(r),_,a(n)])}const A=d(c,[["render",m]]);export{k as __pageData,A as default}; diff --git a/assets/frontend_js_base.md.uTBw_pBH.js b/assets/frontend_js_base.md.uTBw_pBH.js new file mode 100644 index 000000000..f15772e26 --- /dev/null +++ b/assets/frontend_js_base.md.uTBw_pBH.js @@ -0,0 +1 @@ +import{_ as s,c as o,J as r,m as e,a,o as n,G as c}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"你不知道的Javascript","description":"一起来解密JavaScript的奇淫技巧","frontmatter":{"title":"你不知道的Javascript","description":"一起来解密JavaScript的奇淫技巧","keywords":"js高级使用,js进阶,js指南,闭包,es6,Promise,Set,Map,symbol,异步编程,回调地狱,设计模式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/base.md","filePath":"frontend/js/base.md","lastUpdated":1706247228000}'),i={name:"frontend/js/base.md"},p=e("h1",{id:"你不知道的javascript",tabindex:"-1"},[a("你不知道的Javascript "),e("a",{class:"header-anchor",href:"#你不知道的javascript","aria-label":'Permalink to "你不知道的Javascript"'},"​")],-1),d=e("p",null,[a("这里只会对JavaScript一些经常提到的知识(如:闭包、原型、隐式转换等等)进行讲解,当然你若已经对js已经有了很深的理解了,可以跳过看下一篇;对于小白可以先看看,如有不清楚地方可以评论区写下自己的疑问或联系"),e("a",{href:"/me/index.html"},"作者"),a(",我会抽空为你解答。")],-1);function l(m,_,h,f,v,j){const t=c("Gitalk");return n(),o("div",null,[p,d,r(t)])}const u=s(i,[["render",l]]);export{b as __pageData,u as default}; diff --git a/assets/frontend_js_base.md.uTBw_pBH.lean.js b/assets/frontend_js_base.md.uTBw_pBH.lean.js new file mode 100644 index 000000000..f15772e26 --- /dev/null +++ b/assets/frontend_js_base.md.uTBw_pBH.lean.js @@ -0,0 +1 @@ +import{_ as s,c as o,J as r,m as e,a,o as n,G as c}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"你不知道的Javascript","description":"一起来解密JavaScript的奇淫技巧","frontmatter":{"title":"你不知道的Javascript","description":"一起来解密JavaScript的奇淫技巧","keywords":"js高级使用,js进阶,js指南,闭包,es6,Promise,Set,Map,symbol,异步编程,回调地狱,设计模式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/base.md","filePath":"frontend/js/base.md","lastUpdated":1706247228000}'),i={name:"frontend/js/base.md"},p=e("h1",{id:"你不知道的javascript",tabindex:"-1"},[a("你不知道的Javascript "),e("a",{class:"header-anchor",href:"#你不知道的javascript","aria-label":'Permalink to "你不知道的Javascript"'},"​")],-1),d=e("p",null,[a("这里只会对JavaScript一些经常提到的知识(如:闭包、原型、隐式转换等等)进行讲解,当然你若已经对js已经有了很深的理解了,可以跳过看下一篇;对于小白可以先看看,如有不清楚地方可以评论区写下自己的疑问或联系"),e("a",{href:"/me/index.html"},"作者"),a(",我会抽空为你解答。")],-1);function l(m,_,h,f,v,j){const t=c("Gitalk");return n(),o("div",null,[p,d,r(t)])}const u=s(i,[["render",l]]);export{b as __pageData,u as default}; diff --git a/assets/frontend_js_binary.md.kGIZY9pD.js b/assets/frontend_js_binary.md.kGIZY9pD.js new file mode 100644 index 000000000..4317d41d9 --- /dev/null +++ b/assets/frontend_js_binary.md.kGIZY9pD.js @@ -0,0 +1,244 @@ +import{_ as e,c as p,J as s,V as o,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"走进前端二进制","description":"二进制在数据交互和存储方面扮演重要角色,掌握二进制的一些使用方法提升自己的微观世界技能","frontmatter":{"title":"走进前端二进制","description":"二进制在数据交互和存储方面扮演重要角色,掌握二进制的一些使用方法提升自己的微观世界技能","keywords":"二进制,前端二进制,ArrayBuffer,File,Blob,Uint8Array,DataView,ArrayLike","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/binary.md","filePath":"frontend/js/binary.md","lastUpdated":1706247228000}'),t={name:"frontend/js/binary.md"},c=o(`

走进前端二进制

在实际的开发过程中经常会遇到二进制数据,常见的就有文件的上传、下载等等,还有比较重要的图片裁剪、灰度处理等等,这些场景都会涉及到二进制。相信很多开发者对这方面可能一知半解或者就是久而忘之,本人刚开始也是对这方面空白,通过全方位的学习后其实也挺简单,整体总结可以直奔文中

前端二进制是一种关键的数据表示和处理技术,它在前端开发中具有广泛的应用。了解和掌握二进制数据有助于优化性能、原生数据的处理等等

ArrayBuffer

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区;它是一个字节数组,通常在其他语言中称为“byte array”。你不能直接操作 ArrayBuffer 中的内容;而是要通过 类型化数组对象DataView 对象来操作

构造函数:

ts
new ArrayBuffer(bytelength: number); // 创建指定字节的buffer缓冲区

实例属性方法:

  • byteLength:获取buffer的字节长度和构造函数传入的值相等
  • slice:拷贝指定位置的内容并返回新的buffer

视图对象

arraybuffer只是创建了一块连续的内存地址引用,里面是什么内容不能直接读取,如果要操作buffer对象需要使用视图对象,这些视图对象只是用来解析buffer中的内容实际并不会储存任何内容

TypeArray

这些视图对象看上去更像数组Array,但他们并不是数组而是在ArrayBuffer上统称的类型术语,JS提供了多种视图对象:Uint8ArrayInt8ArrayUint16ArrayInt16ArrayUint32ArrayInt32ArrayFloat32ArrayFloat64ArrayUint8ClampedArrayBigInt64ArrayBigUint64Array等等

这些视图对象享有共有的方法和属性,所以搞懂某一个通用方法就可以了, 唯一不同的是不同的视图对象对buffer的解析不同如:Uint8Array中是以1字节8位为一个基本单位,Uint16Array则是以2字节16位为一个基本单位,如果buffer的长度为2字节,那么在uint8长度也为2,而uint16的长度则为1

Uint8Array

Uint8Array 数组类型表示一个 8 位无符号整型数组,8位为一个字节用来表示每个位置上的数字,也就是说Uint8的每一位的数字范围为:0 - 2^8-1(255),只需要记住每位是由1字节8位组成就可以推到出来(后面会有其他类型的数组都是同一个道理)

构造函数

类型定义:

ts
new Uint8Array(); // 创建空长度
+new Uint8Array(len: number); // 创建用0太填满的指定长度
+new Uint8Array(array | arraylike); // 创建时指定值
+new Uint8Array(buffer, byteOffset?, len?); // 从存在的buffer中的指定位置截取指定长度

列子:

ts
// 传入存在的buffer
+const buffer = new ArrayBuffer(10);
+new Uint8Array(buffer);
+
+// 确定值
+new Uint8Array([1,2,3])
+
+// 创建指定长度
+new Uint8Array(10); // 长度为10

实例化Uint8Array底层都会创建相应的ArrayBuffer,对实例的操作都是作用到ArrayBuffer上

属性

  • BYTES_PER_ELEMENT:每个元素的字节数,uint8为1字节8位,uint16为2字节16位,以此类推
  • buffer:所引用的ArrayBuffer
  • byteLength:所引用的ArrayBuffer的长度
  • byteOffset:返回具体其引用ArrayBuffer的起始位置偏移量
  • length:数组的长度

方法

Uint8Array等拥有数组Array的所有方法, 初次之外还有set方法常用来合并多个类型数组

一个将很大的图片分段请求最后合并下载的例子:

ts
const buffers: ArrayBuffer[] = []; // 储存请求的所有的图片buffer
+const bufferTotalLen = buffers.reduce((p, c) => (p += c.byteLength), 0); // buffer总长度
+const allBuffer = new Uint8Array(bufferTotalLen); // 合并成最后的buffer
+let position = 0, begin = 0;
+while (begin < buffers.length) {
+  const subBuffer = new Uint8Array(buffers[begin]);
+  allBuffer.set(subBuffer, position);
+  position += subBuffer.length;
+  begin++;
+}
+const blob = new Blob([allBuffer.buffer], { type: "image/png" }); // 构造blob对象
+const url = URL.createObjectURL(blob);
+// ...

除此之外的其他有关的ArrayBuffer的视图api雷同,可自行查看文档

以下是几个不同类型的array对同一段buffer的处理不同点:

  • Uint8Array —— 将 ArrayBuffer 中的每个字节视为 0 到 255 之间的单个数字(每个字节是 8 位,因此只能容纳那么多)。这称为 “8 位无符号整数”。
  • Uint16Array —— 将每 2 个字节视为一个 0 到 65535 之间的整数。这称为 “16 位无符号整数”。
  • Uint32Array —— 将每 4 个字节视为一个 0 到 4294967295 之间的整数。这称为 “32 位无符号整数”。
  • Float64Array —— 将每 8 个字节视为一个 5.0x10-3241.8x10308 之间的浮点数。

DataView

DataView 是在 ArrayBuffer 上的一种特殊的超灵活“未类型化”视图。它允许以任何格式访问任何偏移量(offset)的数据

上面列出的TypeArray由于固定了格式所以每个索引的格式都是相同的,所以只能使用索引方式获取;而DataView没有固定格式直接作用于ArrayBuffer上,可以使用任何类型进行读取,所以更加灵活

构造方法

其构造方法需要传入buffer实例

ts
new DataView(buffer, offset?, len?)

属性

  • byteLength:字节长度
  • byteOffset:首位在ArrayBuffer中的偏移量
  • buffer:ArrayBuffer引用对象

方法

  • getUint8:以Uint8格式获取指定索引的数据
  • setUint8:setUint8(idx, value)以Uint8格式设置某个索引位置的值,这些值需满足uint8的值范围。如setUint8(0, 256)将不会满足0~255的范围限制,其值将会变为0

除了Uint8格式外还有其它TypeArray的格式相同方法,请参考MDN

视图对象总结

字符二进制

除了一些二进制数据外,还可以将一些字符进行二进制的相互转换,js中提供了TextEncoderTextDecoder分别将字符转为二进制、将二进制转为字符

TextEncoder例子:

ts
// 将字符转换成Uint8Array
+const encoder = new TextEncoder();
+const uint8 = encoder.encode("测试");
+console.log(uint8); // Uint8Array(6) [230, 181, 139, 232, 175, 149, buffer: ArrayBuffer(6), byteLength: 6, byteOffset: 0, length: 6]

TextDecoder例子:

ts
// 将ArrayBuffer转换成字符
+const decoder = new TextDecoder("utf8");
+console.log(decoder.decode(uint8));  // 测试
+console.log(decoder.decode(uint8.buffer)); // 测试
+console.log(decoder.decode(uint8.slice(0, 3)));  // 测
+console.log(decoder.decode(uint8.buffer.slice(0, 3)));  // 测

因为TypeArray位Uint8Array所以和ArrayBuffer的字节长度一致,所以对buffer或array的截取一致获取的结果也一样。从上面可以看到Uint8Array中的[230, 181, 139]表示一个字符测

ts
const uint8 = new Uint8Array([230, 181, 139]);
+const decoder = new TextDecoder("utf8");
+decoder.decode(uint8); // 测

字符二进制流

字符二进制通常用来处理比较大的数据字符流,而TextEncoder这种通常是一次性进行转换;二进制流也包含TextEncoderStreamTextDecoderStream两种方法

Blob

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作

前面我们讲了ArrayBuffer和TypeArray等相关二进制的方法, 但这些都是操作比较低级的数据,而blob则是有类型的二进制数据,相对于比较低级的数据更容易大家所理解

构造器

ts
new Blob(blobParts, options);
  • blobParts:由blob、buffersource、string类型组成的数组值
  • options:
    • type:表示blob类型,通常都是mime类型
    • endings:是否转换换行符,使 Blob 对应于当前操作系统的换行符(\\r\\n\\n)。默认为 "transparent"(啥也不做),不过也可以是 "native"(转换)

例子:

ts
// 将字符转为blob,并指定类型为 text/plain文本类型
+new Blob(['测试'], { type: 'text/plain' });
+
+// 将buffersource转为blob
+new Blob([new Uint8Array([1,2,3])]);

属性

  • size:blob的数据大小
  • type:blob的类型

方法

  • arrayBuffer:异步返回blob的二进制格式的ArrayBuffer

    ts
    blob = new Blob(['一段文本'], { type: 'text/plain' });
    +buffer = await blob.arrayBuffer(); // ArrayBuffer
  • slice:划分指定范围的blob,类似于array的slice

  • stream:返回blob的可读流ReadableStream,通常流用来处理比较大的内容

    ts
    const readableStream = blob.stream();
    +const reader = readableStream.getReader();
    +while(true) {
    +  const { done, value } = await reader.read();
    +  if (done) break;
    +}
  • text:异步返回blob的所有内容的UTF8格式的字符串

    ts
    blob = new Blob(['一段文本'], { type: 'text/plain' });
    +text = await blob.text(); // 一段文本

除了使用自身的方法外, 还可以使用FileReader读取内容并转换

ts
reader = new FileReader();
+reader.onload = e => console.log(e.target.result);
+reader.readAsText(blob);

用途

  1. 用blob对象构造url使用,使用URL的createObjectURL方法生成一个唯一映射此blob的url

    ts
    // 一个图片blob
    +blob = new Blob([], { type: 'image/png' });
    +url = URL.createObjectURL(blob);
    +img.src = url;
    +// 使用后销毁
    +URL.revokeObjectURL();
  2. 文件分片上传

    ts
    const blob = new Blob([]);
    +const chunkSize = 1024 * 1024;
    +blobs = [];
    +offset = 0;
    +while(offset < blob.size) {
    +  blobs.push(blob.slice(offset, chunkSize));
    +  offset += chunkSize;
    +}
    +blobs.map(blob => fetch('xx', data: blob))

除了以上外对于canvas也可以转换为blob

ts
const img = new Image();
+const canvas = document.querySelector("canvas");
+const ctx = canvas?.getContext("2d");
+ctx?.drawImage(img, 0, 0);
+canvas?.toBlob(e => console.log(e)); // 转为为 blob
+canvas?.toDataURL("text/plain"); // 转为为 base64字符串

File

文件(File)接口提供有关文件的信息,File 对象继承了 Blob,并扩展了与文件系统相关的功能,且可以用在任意的 Blob 类型的 context 中。比如说, FileReader, URL.createObjectURL, createImageBitmap, 及 XMLHttpRequest.send() 都能处理 Blob 和 File

File对象

通常有两种方式获取File对象:构造函数<input type="file">

构造函数:

ts
new File(bits: Array<ArrayBuffer | ArrayBufferView | String | Blob>, name, { type, lastModified })

构造函数方式类似于blob的构造函数

例子:

ts
const file = new File(['我是一段文本信息'], 'text.txt', { type: 'text/plain', lastModified: Date.now() })

输入框获取:

ts
// 用户点击选择文件后,可以通过属性获取
+<input type="file">
+console.log(e.files[0])

属性

  • lastModified:当前file的最后修改时间,毫秒数
  • lastModifiedDate:最后修改时间date对象
  • name:文件名字
  • size:文件大小
  • type:文件的mime类型

由于File继承于Blob对象所以也用了Blob的相关属性

方法

由于File继承于Blob对象所以也用了Blob的相关属性,如slice方法,通常用来对大文件做切片处理,参考以上blob的切片操作这里就不演示了

FileReader

FileReader 对象允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,主要目的就是从 File 或 Blob 对象中读取的文件或数据

构造函数

Filereader通过构造函数生成一个对象

ts
const reader = new FileReader();

属性

  • readyState:当前的读取状态,其中包含以下几个常量

    常量名描述
    EMPTY0还没有加载任何数据。
    LOADING1数据正在被加载。
    DONE2已完成全部的读取请求。
  • result:读取完后的内容,读取操作后效,文件内容的格式取决于哪种读取方式

  • error:读取错误的对象

事件

  • onabort:读取时中断时触发
  • onerror:读取时发生错误时触发
  • onload:所有内容的读取都是异步的,需要通过此事件获取读取的数据,读取成功后触发

方法

  • abort:中断读取
  • readAsArrayBuffer:将文件内容读取为arraybuffer形式的数据
  • readAsDataURL:将文件内容读取为base64字符串
  • readAsText:将文件内容读取为文本字符串
  • readAsBinaryString:将文件内容读取为原始二进制数据

读取数据都是异步的,需要通过onload事件获取读取内容

FileReaderSync

FileReaderSync接口允许以同步的方式读取 File 或 Blob 对象中的内容,该接口只能在webwoker中使用,由于读取文件是非常耗时的过程,在主线程使用会造成页面卡顿现象,因此对于文件的操作在webwoker不会影响主线程

FileReaderSync和FileReader拥有相同的方法和属性,只不过前者的读取是同步的

ts
// webwoker
+function readFileSync(file) {
+  const reader = new FileReaderSync();
+  const buffer = reader.readAsArrayBuffer(file);
+  return buffer;
+}

Stream

Stream API 允许 JavaScript 以编程方式访问从网络接收的数据流,并且允许开发人员根据需要处理它们

流可以让程序不需要接受全部的内容后才可以展示操作,使用流可以将大型数据拆分成小块并逐步处理,如视频播放不需要加载全部减小延迟、提高内存的吞吐量

除此之外可以检测流何时开始或结束,将流链接在一起,根据需要处理错误和取消流,并对流的读取速度做出反应

流的基础应用围绕着使响应可以被流处理展开。例如,一个成功的 fetch 请求返回的响应体可以暴露为 ReadableStream,之后你可以使用 ReadableStream.getReader 创建一个 reader 读取它,使用 ReadableStream.cancel 取消它等等。

更复杂的应用包括使用 ReadableStream 构造函数创建你自己的流,例如进入 service worker 去处理流

ReadableStream

ReadableStream 可以构造一个可读流,在前端领域通常fetch的 Response的body属性 就是一个ReadableStream对象

构造函数

ts
new ReadableStream(underlyingSource?, queuingStrategy?)

underlyingSource包括以下属性:

  • start(controller):对象在创建时会执行,controller是个 ReadableStreamDefaultController ,通常在自己构造可读流时在此方法中 使用 controller.equeue 方法往可读流中添加数据;可以返回promise,则下一次的必须等待上一次结束后才会执行
  • pull(controller):流内部队列不满时会重复调用这个方法,根据流的背压来判断流有没有满,通常这里不做任何事
  • cancel(reason):当流被取消时触发,如:取消、出错等等
  • type:表示流的内容类型,通常都是bytes

queuingStrategy 定义流的队列策略 背压

  • highWaterMark:在背压前内部队列可以容纳的总块数
  • size:每个chunk的大小

例子:

ts
const chunks = [...];
+let offset = 0;
+new ReadableStream(
+  {
+    start(controller) {
+      console.log("开始读取");
+      async function read() {
+        if (offset < chunks.length) {
+          const chunk = chunks[offset];
+          // 往可读流中写入数据
+          controller.enqueue(chunk);
+          read();
+        } else {
+          console.log('读取结束');
+          // 关闭
+          controller.close();
+        }
+      }
+      read();
+    },
+    type: "bytes",
+  },
+  { highWaterMark: 100 } // 定义背压
+);

这个例子自定义了一个可读流,在构建ReadableStream时不断地往可读流中写入数据,以便可读流可以读取到数据

ReadableStream构造函数返回一个可读流实例,其包含多个方法和属性

实例属性

  • locked:返回改可读流是否被锁定到一个reader,也就是说当被锁定时,同时只能被一个可读流使用

实例方法

  • cancel:取消流的读取,取消后会触发内部的cancel属性

  • getReader:创建一个读取器并将流锁定于其上,其他读取器将不能读取它直到它被释放;这个读取器是一个 ReadableStreamDefaultReader 实例,其包含 read、cancel等方法,通常都是使用 read来读取 ReadableStream 内部的数据

    ts
    // 一个简单的例子
    +const readstream = new ReadableStream(); // 假如自定义的可读流内部有数据
    +const reader = readstream.getReader();  // 获取 reader对象
    +while(true) {
    +  const { done, value } = await reader.read(); // 不断读取数据
    +  if (done) {
    +    console.log('读取完毕');
    +  } else {
    +    console.log('当前数据块:', value);
    +  }
    +}

    上面演示了下从自己创建的可读流中读取,通常都是从fetch的response的body属性中获取reader,然后不断读取接受的数据 (注:response的body属性是一个 ReadableStream)

  • pipeThrough:提供将当前流管道输出到一个转换(transform)流或可写/可读流对的链式方法。简单来说就是一个管道对原始数据做点什么,比如修改、压缩啥的,对于平时的需求一般用不上,不过使用此功能可以很方便的做到一些有趣的效果

    pipeThrough类型定义为:

    ts
    pipeThrough(transformStream, options?)

    transformStream是由可读流和可写流组成的 TransformStream(或者结构为 {writable, readable} 的对象),writable 流写入的数据在某些状态下可以被 readable 流读取。详细使用请看WriableStream

  • pipeTo:将当前 ReadableStream 管道输出到给定的 WritableStream,此方法是个异步方法,当所有的写入操作结束后表示结束

    pipeTo类型定义:

    ts
    pipeTo(destination, options?)

    destination表示一个可写流WriableStream对象

  • tee:拷贝当前可读流,返回包含两个 ReadableStream 实例分支的数组

WritableStream

WritableStream 接口将流数据写入目的地,该对象带有内置的背压和队列,一般是将可读流的数据写入

构造函数

ts
new WritableStream(underlyingSink, queuingStrategy)

underlyingSink包括以下属性:

  • start(controller):对象被构建时立刻执行,controller是一个 WritableStreamDefaultController 对象

  • write(chunk, controller):当一个新的数据准备好写入底层接收器时调用此方法,chunk表示当前要写入的数据块,controller同上。一般可以在这里对数据的进行进度条计算

  • close(controller):所有数据写入完毕后将会调用此方法

  • abort(reason):可写流取消或出现错误时触发

queuingStrategy 定义流的队列策略 背压

  • highWaterMark:在背压前内部队列可以容纳的总块数

例子:

ts
// 模拟请求
+const res = await fetch();
+const totalLength = xxx;
+let offset = 0;
+const uint8 = new Uint8Array(totalLength);
+
+// 定义背压
+const highWaterMark = new CountQueuingStrategy({ highWaterMark: 100 });
+const writer = new WritableStream(
+  {
+    write(chunk: Uint8Array, controller) {
+      return new Promise(resolve => {
+        uint8.set(chunk, offset); // 将读取的数据储存
+        offset += chunk.byteLength;  // 计算已经接受到的数据大小
+        progress.textContent =
+          ((offset / totalLength) * 100).toFixed(2) + "%";  // 计算进度
+        setTimeout(resolve, 0);
+      });
+    },
+  },
+  highWaterMark // 设置背压,避免大文件读到内存中
+);
+await res.body?.pipeTo(writer); // 记住 fetch的Response的body是个可读流,使用pipeTo方法

以上通过将fetch的Response的body可读流通过自定义的WriableStream写入,在write方法中对每块数据进行获取,并计算进度

WritableStream构造函数返回一个可写流实例,其包含多个方法和属性

实例属性

  • locked:表示 WritableStream 是否锁定到一个 writer

实例方法

  • abort:取消流的写入,会触发内部的abort属性方法

  • close:关闭可写流,会触发内部的close属性方法

  • getWriter:获取返回一个新的 WritableStreamDefaultWriter 实例并且将流锁定到该实例,该实例对象包含abort、close、write方法;还包含一个ready属性返回一个promise,当流填充内部队列的所需大小从非正数变为正数时兑现,表明它不再应用背压

    ts
    const chunks: Uint8Array[] = [];
    +const highWaterMark = new CountQueuingStrategy({ highWaterMark: 100 });
    +const writeStream = new WritableStream(
    +  {
    +    write(chunk) {
    +      return new Promise(resolve => {
    +        // chunk为读取的数据,用它做点啥...
    +        resolve();
    +      });
    +    },
    +  },
    +  highWaterMark
    +);
    +const writer = writeStream.getWriter(); // 获取writer对象
    +chunks.forEach(chunk => writer.ready.then(() => writer.write(chunk))); // 循环读取数据

TransformStream

TransformStream 接口表示链式管道传输(pipe chain)转换流(transform stream)概念的具体实现。他可以用于将编码或解码视频帧、压缩或解压缩数据或以其他的方式从一种数据转换成另一种数据

以下是一个将小写字母变成大写字母例子:

ts
const strs = ["a", "b", "c", "d"];
+let offset = 0;
+const reader = new ReadableStream({
+  start(controller) {
+    function read() {
+      if (offset < strs.length) {
+        controller.enqueue(strs[offset]);
+        offset++;
+        read();
+      } else {
+        controller.close();
+      }
+    }
+    read();
+  },
+});
+const transfer = new TransformStream({
+  transform(chunk: string, controller) {
+    console.log("transform:", chunk);
+    controller.enqueue(chunk.toUpperCase());
+  },
+});
+const writer = new WritableStream({
+  write(chunk) {
+    console.log("write:", chunk);
+  },
+});
+reader.pipeThrough(transfer).pipeTo(writer);

Response.body

一个 ReadableStream,或者对于使用空的 body 属性构建的任意的 Response 对象,或没有任何主体的实际 HTTP 响应,则为null

实践

视频流

页面上添加视频播放器:

tsx
// 视频播放器
+<video src="/api/video/range" controls="controls" muted style="max-width: 100%;"></video>

node端进行返回请求数据,默认在没有结束范围时只返回1M的数据,如果有结束返回就返回指定范围的数据:

ts
// 对视频进行范围请求
+@Get('/api/video/range')
+async getVideoRanges(@Req() req: Request, @Res() res: Response) {
+  // 直接打开链接时禁止访问
+  const referer = req.headers.referer;
+  const host = req.headers.host;
+  const url = referer && new URL(referer);
+  if (!referer || url?.host !== host) {
+    throw new ForbiddenException('禁止访问');
+  }
+  const requestRange = req.headers['range'];
+  const parts = requestRange?.replace(/bytes=/, '').split('-');
+  const filePath = resolve(__dirname, '../data/video.mp4');
+  const fileStat = await stat(filePath);
+  const fileSize = fileStat.size;
+  const start = Math.min(parseInt(parts?.[0], 10) || 0, fileSize - 1); // 这里的大小值需减1
+  const end = Math.min(
+    parseInt(parts?.[1]) || start + 1024 * 1024, // 每次没有结束值,只返回1MB的数据
+    fileSize - 1,
+  );
+  const chunkSize = end - start + 1;
+  const head = {
+    'Content-Range': \`bytes \${start}-\${end}/\${fileSize}\`,
+    'Accept-Ranges': 'bytes',
+    'Content-Length': chunkSize,
+    'Content-Type': 'video/mp4',
+  };
+
+  // range请求返回部分内容
+  if (requestRange) {
+    const stream = createReadStream(filePath, { start, end });
+    res.writeHead(206, head);
+    stream.pipe(res);
+  } else {
+    // 非range请求返回整个视频
+    res.writeHead(200, {
+      'Content-Length': fileSize,
+      'Content-Type': 'video/mp4',
+    });
+    createReadStream(filePath).pipe(res);
+  }
+}

效果演示:

文件下载

生活中会遇到文件的下载这种场景,主要还是读取文件流写入到blob中,这样也可以获取到指定的进度。需要注意的是这种方式不适合大文件的下载,容易撑爆内存,具体的大文件下载可以查看我的「如何实现大文件下载」 一文

ts
// 请求资源
+async function fetchBigImage() {
+  progress.setAttribute('style', 'transform: translate3d(-100%, 0, 0)');
+  progressNum.textContent = 0.00;
+  const res = await fetch('/big-size.png');
+  const fileSize = res.headers.get('content-length');
+  const filename = res.headers.get('Content-Disposition')?.split(";")[1]?.split('=')[1] || res.url.match(/\\/([^\\/]\\.[^\\/]*)/i)?.[1] || 'download.txt';
+  const blobs = [];
+  let downloaded = 0;
+  const writer = new WritableStream({
+    write(chunk) {
+      blobs.push(chunk);
+      downloaded += chunk.length;
+      const percentComplete = (downloaded / fileSize) * 100;
+      progress.setAttribute('style', \`transform: translate3d(-\${(100 - percentComplete).toFixed(2)}%, 0, 0)\`);
+      progressNum.textContent = percentComplete.toFixed(2);
+    },
+    close() {
+      useDownload(filename, ...blobs);
+    }
+  });
+  res.body.pipeTo(writer);
+}
+
+// 下载
+function useDownload(filename, ...blobs) {
+  const blob = new Blob([...blobs]);
+  const url = URL.createObjectURL(blob);
+  const a = document.createElement('a');
+  a.setAttribute('href', url);
+  a.download = filename || 'file.txt';
+  a.click();
+  a.remove();
+  URL.revokeObjectURL(url);
+}

大文件上传

请阅读我的 「如何实现大文件上传」 一文

`,160);function y(F,D,i,b,B,A){const n=a("Reward"),l=a("Gitalk");return r(),p("div",null,[c,s(n),s(l)])}const m=e(t,[["render",y]]);export{u as __pageData,m as default}; diff --git a/assets/frontend_js_binary.md.kGIZY9pD.lean.js b/assets/frontend_js_binary.md.kGIZY9pD.lean.js new file mode 100644 index 000000000..8043637e4 --- /dev/null +++ b/assets/frontend_js_binary.md.kGIZY9pD.lean.js @@ -0,0 +1 @@ +import{_ as e,c as p,J as s,V as o,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"走进前端二进制","description":"二进制在数据交互和存储方面扮演重要角色,掌握二进制的一些使用方法提升自己的微观世界技能","frontmatter":{"title":"走进前端二进制","description":"二进制在数据交互和存储方面扮演重要角色,掌握二进制的一些使用方法提升自己的微观世界技能","keywords":"二进制,前端二进制,ArrayBuffer,File,Blob,Uint8Array,DataView,ArrayLike","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/binary.md","filePath":"frontend/js/binary.md","lastUpdated":1706247228000}'),t={name:"frontend/js/binary.md"},c=o("",160);function y(F,D,i,b,B,A){const n=a("Reward"),l=a("Gitalk");return r(),p("div",null,[c,s(n),s(l)])}const m=e(t,[["render",y]]);export{u as __pageData,m as default}; diff --git a/assets/frontend_js_eventloop.md.2QrpoMAr.js b/assets/frontend_js_eventloop.md.2QrpoMAr.js new file mode 100644 index 000000000..61199a3b5 --- /dev/null +++ b/assets/frontend_js_eventloop.md.2QrpoMAr.js @@ -0,0 +1,92 @@ +import{_ as l,c as e,J as s,V as p,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"EventLoop事件循环机制(浏览器和Node EventLoop)","description":"由于JavaScript是个单线程的语言,异步任务都会通过回调来解决单线程问题,JavaScript内部通过EventLoop事件循环机制来调度异步任务,本篇会对比浏览器的EventLoop和Node的EventLoop展开讲解","frontmatter":{"title":"EventLoop事件循环机制(浏览器和Node EventLoop)","description":"由于JavaScript是个单线程的语言,异步任务都会通过回调来解决单线程问题,JavaScript内部通过EventLoop事件循环机制来调度异步任务,本篇会对比浏览器的EventLoop和Node的EventLoop展开讲解","keywords":"JS EventLoop,JS事件循环机制,浏览器EventLoop,NodeJS EventLoop,JS Engine,JS Runtime,JS异步编程,Promise,回调地狱,async/await,迭代器","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/eventloop.md","filePath":"frontend/js/eventloop.md","lastUpdated":1706247228000}'),r={name:"frontend/js/eventloop.md"},c=p(`

EventLoop事件循环机制

前端的同学们应该都听说过EventLoop的概念,网上各大平台关于它的文章也是成百上千质量参差不一,其实在笔者刚开始接触js的时候这对这方面一头雾水,也是看了高程官方文档以及大量的文章后才对它有了深刻认识,在这儿就来和大家分享下我对它的的认识和理解,不过要讲明白EventLoop这个东东还是要从头说起。

本篇内容循序渐进比较长,需要耐心看完💪。

注:如遇到有一些链接无法访问可能需要科学上网

前言

众所周知JS是一个单线程非阻塞语言,不像诸如Java、Python等多线程语言对并发处理比较友好,而JS只能同时执行一个任务。那为什么JS不像其他语言一样也是个多线程语言呢?其实在最初使用浏览器呈现页面时,基本上都是静态页面和简单的功能,并没有考虑到复杂的交互功能,JS的创作者因此也没必要做更复杂的设计。但近年来随着web技术的突飞猛进,各种页面五花八门的交互以及并发资源请求等都出现了,因此关于JS单线程处理异步任务等等概念也就被关注起来了。

虽然单线程会造成任务执行阻塞,页面长时间等待等缺点,但JS并没有改变它。由于JS通常伴随着它的宿主环境浏览器而出现,若JS变成一个多线程的语言,那么浏览器处理用户的操作将会变得非常复杂。试想在弱网环境下脚本还没有完全加载完时,用户如果点击页面的上某个表单提交任务,会发现没有任何反应,这难免会让用户产生一些想法。而JS单线程则会阻塞页面的渲染,当然用户也不知道可以做什么,只不过会牺牲点加载或等待时间。

JS的Engine和Runtime

JS是一个动态解释性语言,需要通过JS的引擎(JS Engine)进行解释(翻译)成对应的字节码、机器码然后才会运行。随着网页复杂性和性能要求的提高,JS引擎也经历了从SpiderMonkeyV8(由google开发)的变革,而由谷歌开发的V8引擎最为出色,目前已被大多数现代浏览器等(Chrome、Edge、Safari)采用。同时JS也从以前浏览器单一的运行时(Runtime)演变到可以在服务端运行的NodeJS(基于V8)运行时,为它提供不同平台的运行时环境。

  • Engine:为JavaScript解析和执行提供环境条件(类似Java虚拟机),并完成内存分配和垃圾回收等等。
  • Runtime:由JavaScript的宿主环境提供额外的属性和方法,如浏览器提供了用户交互和一些异步任务的功能。

JS的是通过异步回调的方式解决单线程的执行阻塞问题,虽然JS引擎是单线程的,但它的宿主环境一般都是多线程的,如通过浏览器的定时任务线程、网络线程协调执行异步回调。所以常说的EventLoop是面向宿主环境的也就是Runtime,如浏览器和NodeJS,而浏览器的EventLoop总被频繁讨论,本篇将会对浏览器和NodeJS的EventLoop逐一展开介绍。

了解浏览器

WARNING

由于浏览器内部也在不断的升级优化,可能每个版本会存在不同的差异,这里只是针对其中的某段版本内部架构进行说明,其他或未来可能会发生变化,如果发现有不一致的地方可以阅读google开发者文档

上述我们知道了EventLoop主要是宿主环境实现的如:浏览器,这里我们需要先了解下浏览器的架构,本文以Chrome浏览器作为介绍,其他浏览器可能存在差异,请自行查阅相关文档,本文不再做相关赘述。

关于浏览器的架构的发展也进行了很长一段时间,由单进程到多进程、单渲染进程到多渲染进程等多种机制的演变,更多关于浏览器的演变可以阅读我的『现代浏览器架构』一文。以Chrome为例,它是多进程和多线程的架构,其内部包括:

  • Brower进程:提供浏览器URL、后退/前进、调度等全局作用
  • 网络进程:进行网络资源请求、安全策略等等
  • GPU进程:3D渲染、动画绘制等等
  • 渲染进程:负责每个Tab页面加载解析,JS、CSS、DOM等相关页面和用户操作
  • 插件进程:浏览器插件

除了以上列出的进程外,还有一些其它的进程。

这里主要来说下渲染进程,它是前端开发者最必要的关注点。Chrome为每个tab页面提供一个渲染进程。渲染进程会包括很多线程:

  1. 主线程:调度页面的加载解析,执行dom、css、js操作处理等等
  2. GUI线程:负责页面的渲染
  3. JS引擎线程:进行解析执行JS
  4. 定时器线程:处理异步定时任务
  5. 异步请求线程:进行网络请求
  6. 事件触发线程:监听执行事件callback
  7. WebWorker线程:独立的脚本,不影响页面渲染,通常用来执行密集复杂的计算

等等...

以上简单介绍了浏览器每个页面进行渲染时,渲染进程会为页面提供不同的线程来负责不同的任务。这里需要知道当加载页面时会从上到下解析文档,当遇到JS脚本(通常情况下)时会阻塞DOM的解析,也就是JS引擎的执行会阻塞GUI线程渲染的执行,这也符合JS是个单线程语言的特征。不过渲染进程也提供了不同的线程去处理异步任务,可以并行处理多个任务,如:定时器线程、网络请求线程等等,而不会影响页面的渲染推翻JS单线程的理念。

事件驱动

其实浏览器多线程执行异步任务的原理背后是基于事件驱动机制的。不同类型的事件触发不同的任务,如:点击事件、滚动事件等等。而事件循环机制(EventLoop)就是基于事件驱动机制的。

当JS执行代码时,如果遇到异步代码如Ajax请求时,会交给别的线程去执行异步任务,然后主线程挂起当前任务,不会阻塞后面代码的执行。这些异步任务会由浏览器不同的线程进行负责,不会影响到主线程和JS引擎线程,当这些异步任务执行完毕后,会被存放到指定的任务队列中,等JS的执行栈中当前同步任务执行完毕后,会从这些任务队列中取出待执行的任务,而具体优先取哪一个这就是要取决于事件循环机制了。

浏览器的EventLoop

通过上面的介绍你应该会了解到浏览器的多线程其实就是让JS拥有多线程并发处理异步任务的能力,主要负责点击等事件、定时任务、网络请求、脚本执行、用户交互和页面渲染之间的的调度。

先来看看JS内存结构概念,这里借用MDN的图,如下图:

JS内存结构

从JS的内存模型图可以将JS内存大致的分为:调用栈、堆和任务队列。

调用栈

调用栈就是来执行JS代码的,它会记录函数调用的整个过程,并将函数的变量等信息以栈帧的形式压入,当执行完函数式,将栈顶的帧弹出。如下代码:

js
function foo(b) {
+  let a = 10;
+  return a + b + 11;
+}
+
+function bar(x) {
+  let y = 3;
+  return foo(x * y);
+}
+
+console.log(bar(7)); // 返回 42

当调用 bar 时,第一个帧被创建并压入栈中,帧中包含了 bar 的参数和局部变量。当 bar 调用 foo 时,第二个帧被创建并被压入栈中,放在第一个帧之上,帧中包含 foo 的参数和局部变量。当 foo 执行完毕然后返回时,第二个帧就被弹出栈(剩下 bar 函数的调用帧)。当 bar 也执行完毕然后返回时,第一个帧也被弹出,栈就被清空了。

本段代码来自MDN,更多详情点此处查看

用来存储对象变量或其他复杂的数据结构变量

任务队列

任务队列用来储存待执行的任务如:点击事件、回调函数等等,任务又包括:宏任务(Macro Task)和微任务(Mirco Task),不同类型的任务优先级以及执行时机会有所不同

EventLoop就是通过事件循环的机制当执行栈空闲时,主线程判断任务队列中是否有合适的任务,取出最老的一个任务将其压入调用栈中执行,执行完后再次出栈,如此反复不断循环,就是所谓的事件循环机制EventLoop,如下图。

eventloop.png

MacroTask和MicroTask

浏览器EventLoop会有一个或多个Macro任务队列,存放着来自不同任务源(Task Source)的任务,这里有人喜欢将其作为队列结构遵循先进先出的规则,事实上却是个Set集合,每次循环都会选择不同类型任务队列的第一个可执行任务。

在HTML标准中定义了常见的MacroTask Source:

  • dom manipulation(DOM操作): 如没有阻塞的插入元素
  • user interaction(用户交互):用户进行输入、键盘等UI交互事件
  • network(网络请求):网络资源请求如Ajax请求
  • navigation和history:导航和history操作

MacroTask Source的定义非常广泛,常见的键盘、鼠标、Ajax、setTimeout、setInterval、操作数据库等都属于MacroTask Source,对于宏任务MacroTask、TaskSource和MacroTask Queue有相关约定:

  • 来自同一个 TaskSource 的 MacroTask必须放到相同的MacroTask Queue
  • 同一个MacroTask Queue中的MacroTask按顺序排列
  • 浏览器会根据不同TaskSource的优先级可能会被先调度,以快速响应用户的交互

Mirco task在HTML标准中并没有明确定义,一般以下几种被视为微任务

  • Promise
  • Object.observe(已弃用)
  • MutationObserve
  • queueMicrotask

那么为什么任务队列中会有宏任务(Macro Task)和微任务(Mirco Task)呢?其目的就是让不同类型的任务源有不同的执行优先级。

在EventLoop中的每一次循环成一个tick,每一次tick都会先执行同步任务,然后查看是否有微任务,将所有的微任务在这个阶段执行完,如果执行微任务阶段再次产生微任务也会把他执行完(每次tick只会有一个微任务队列),接下来会可能会进行视图的渲染,然后再从MacroTask队列中选择一个合适的任务放入执行栈执行,然后重复前面的步骤不断循环,再次拿出经典图: eventloop.png

需要注意的是所谓的微任务并不会交给其他线程处理,而是V8自己内部的实现,微任务V8会将其放入一个专门的队列,待当前同步任务执行完后,便会清空当前队列,而MacroTask会交给其他线程去处理。

接下来可以套用上面的概念看一段代码的执行结果(先别看答案自己先过一遍写出结果,最后再对比下哪里的想法有问题):

js
setTimeout(() => {
+  console.log('setTimeout start');
+  Promise.resolve()
+    .then(() => console.log('promise resolve1'))
+    .then(() => console.log('promise resolve2'))
+    .then(() => console.log('promise resolve3'))
+    .then(() => console.log('promise resolve4'))
+  new Promise((resolve) => {
+    console.log('promise1 start');
+    resolve()
+  }).then(() => {
+    console.log('promise1 end');
+  });
+  setTimeout(() => {
+    console.log('inner setTimeout')
+  })
+  console.log('setTimeout end');
+}, 0);
+
+function promise2() {
+  return new Promise((resolve) => {
+    console.log('promise2');
+    resolve();
+  })
+}
+
+async function async1() {
+  console.log('async1 start');
+  await promise2();
+  console.log('async1 end');
+}
+
+async1();
+console.log('script end');

以上代码的打印顺序为:async1 start => promise2 => script end => async1 end => setTimeout start => promise1 start => setTimeout end => promise resolve1 => promise1 end => promise resolve2 => promise resolve3 => promise resolve4 => inner setTimeout,不管和你预期的结果是否一样,接下来我们逐行分析:

  1. 首先script整体作为同步任务执行,遇到setTimeout定时宏任务时交给定时线程去执行,其结果会放入宏任务队列,主线程挂起当前异步任务继续执行后面的代码。
  2. 执行async1(),async1函数入栈,并为当前函数提供一些变量上下文。首先打印async1 start,遇到await promise2,会执行new Promise()其也是个同步代码,所以会打印promise2,接着会执行resolve(),它返回的是个promise,然后回到async1函数内部,await其实是个语法糖,后面的代码会作为promise的then代码块执行,而then会当做微任务进入微任务队列(promise不清楚的可以看我『异步编程』一文),async1执行完后出栈。
  3. 执行console.log(script end),打印,然后出栈,第一轮同步任务执行完毕。
  4. 同步任务执行完后先看有没有微任务,第2步await后面的语句已经被放入微任务队列了,执行后打印async1 end,微任务队列清空。
  5. 这里没有涉及到视图更新等等。
  6. 主线程接着从任务队列中选取一个最老的宏任务(MacroTask)来执行,这里任务队列中只有一个setTimeout定时任务,首先会判断执行它的时机到了没,如果没到由于没有其他宏任务了,主线程什么都不会做。反之执行其会首先打印setTimeout start。接着执行Promise.resolve()其返回promise是个微任务会放入微任务队列,接着new Promise()执行打印promise1 start,内部也会resolve返回promise也是个微任务放入微任务队列。接着就是setTimeout放入宏任务队列,最后执行setTimeout end
  7. MacroTask执行完毕,清空所有的MircoTask。首先执行promise resolve1,而后的then也是个微任务会被放入当前微任务队列。接着执行promise1 end,接下来又会执行promise resolve2,它也一样返回微任务(和前面重复步骤)直到执行完后面所有的then。
  8. MircoTask执行完后MacroTask Queue就剩下一个setTimeout任务了,合适的时机打印inner setTimeout

通过一步一步的分析相信你已经对其执行过程有了初步认识,为了加深大家的印象,这里录制了一个视频来动画展示其运行过程,点击这里查看

iShot_2022-11-12_10.59.25.png

定时器误差

我们已经知道异步的MacroTask其实会交给其它线程去处理,当执行栈中的代码执行完后,才会通过EventLoop去获取下一个Task执行。而定时任务(如:setTimeout)当指定了时间后执行,若执行栈的任务还没有执行完,就算定时器时间到了,也永远不会去执行,直到清空当前执行栈后才会执行,来看下面代码:

js
setTimeout(() => console.log('setTimeout'), 1000);
+for(let count = 0;count<10000000000;count++);

这段代码很简单定时器在1s后打印setTimeout,然后执行for循环,当你执行后会发现打印的时间已经远超1s,对于电脑性能不好的可能要更久。

我们用EventLoop分析下上面的代码,当程序遇到setTimeout后,会交给定时器线程去执行,然后等1s后将其放入MacroTask Queue,等待主线程的调度。主线程遇到setTimeout挂起它,执行后面的for循环,直到执行完for循环才会去MacroTask Queue调度下一个Task也就是setTimeout。而这里for循环执行耗时时间已经远超1s,所以setTimeout回调的调度也会被推迟,这就是为什么setTimeout定义了1s执行却没有执行的本质原因,如果你了解了事件循环机制EventLoop,关于定时器误差也会很容易理解。

视图更新时机

前面已经讲了在每一次tick执行完所有的MircoTask Queue后就会进行视图的更新,但一般视图的更新会跟随这系统帧率通常都是60fps(16.666ms一次),如果在每次tick中不断修改dom并不会立即更新:

html
<div id="title" />
+<script>
+  const wrapper = document.querySelector("#title");
+  let color = "red";
+  let count = 0;
+  const timer = setInterval(() => {
+    count++;
+    if (count > 10) clearInterval(timer);
+    if (color === "red") {
+      wrapper.style.background = "blue";
+      color = "blue";
+    } else {
+      wrapper.style.background = "red";
+      color = "red";
+    }
+  }, 4);
+</script>

上面代码每次都是宏任务会经历10次tick,dom也会更新10次,而实际图中也就一两次,这再次说明了更新视图会在合适的点进行更新,一般都是根据系统帧率60fps,若果用setTimeout做动画时间设置成17ms,应该不会掉太多帧,但setTimeout可能会被执行栈延迟调用,所以用setTimeout做动画掉帧的可能性非常大。

requestAnimationFrame

考虑

requestAnimationFrame是微任务还是宏任务? 💨 其实都不是

requestAnimation会在每次更新视图前执行,他不会受到主线程的阻塞,也就是说视图更新的帧率为60fps,requestAnimationFrame也会执行60次,并且执行时间间隔非常稳定,所以很适合做动画,也不会卡顿。

js
function rF() {
+  count ++;
+  if (count < 60) {
+    requestAnimationFrame(() => {
+      if (color === "red") {
+        wrapper.style.background = "blue";
+        color = "blue";
+      } else {
+        wrapper.style.background = "red";
+        color = "red";
+      }
+      rF();
+    })
+  }
+}
+rF();

通过requestAnimationFrame将会在每次更新视图时都会正确的更新每次修改的内容。

浏览器EventLoop总结

通过以上了解到浏览器是多线程的,其通过事件驱动模型用EventLoop事件循环机制来调度定时任务、用户交互、网络请求等异步任务,其大致过程如下:

  • 首先script整体作为宏任务执行,执行同步任务,当遇到异步任务时,如果是宏任务就会交给其它线程处理,并放入对应的任务队列中。微任务放入微任务队列,主线程挂起这些异步任务,接着执行后面的代码。
  • 当前执行栈清空会先执行所有的微任务,如果还遇到微任务也会将其放入当前微任务队列后,直到所有执行完。
  • 当所有微任务执行完后,浏览器可能会更新视图,与帧率有很大关系。
  • 然后主线程根据调度优先级从宏任务队列中适合执行的任务执行,然后不断重复以上操作。

Node的EventLoop

讲完了浏览器的EventLoop接下来看看Node的EventLoop,Node和浏览器都是基于v8引擎,浏览器中的异步方法node中也会有,除此之外还包括:

  • 文件I/O
  • process.nextTick
  • setImmediate
  • 监听关闭事件

Node中的事件循环机制是基于Libuv(Asynchronous I/O)引擎实现的,v8引擎会分析对应的js代码然后调用node的api,而node又被libuv驱动执行对应的任务,并把任务放入到对应的任务队列等待主线程的调度,因此node的EventLoop是libuv里实现的,看下node原理图:

node-system.png

执行阶段

node事件循环机制中和浏览器的不太一样,在node中一般不说微任务和宏任务,通常分为不同的执行阶段,而在这些不同的执行阶段都会对应执行任务,node就是这样不断循环这些不同的执行阶段调度任务的执行顺序,其EventLoop包括以下执行阶段:

  • timers:执行定时器任务队列回调:setTimeout、setInterval...
  • pending callback:执行除了定时器、setImmediate以外的大部分回调,如操作系统TCP连接回调、IO回调等等。
  • idle、prepare:内部调度不用关心
  • poll:等待新的请求连接或I/O事件。node一开始进入这个阶段,如果当前阶段的任务队列执行空,先看有没有setImmediate回调,如果有进入check执行setImmediate回调,或等待新的I/O请求连接,同时也会检测timer是否有到期,若有会直接进入timer阶段执行回调,受代码执行环境的影响
  • check:执行setImmediate回调
  • close:执行socket等关闭操作回调

以下是来自官网的一张事件循环图⬇️ node-eventloop.png

以上每个阶段的任务执行完在进入下一个阶段前会先清空当前阶段的微任务队列,而老版本的node则会先把当前阶段的代码回调执行完后才会执行微任务队列,如下代码:

js
setTimeout(() => {
+  console.log("setTimeout1");
+  Promise.resolve().then(() => console.log("promise1"));
+});
+setTimeout(() => {
+  console.log("setTimeout2");
+  Promise.resolve().then(() => console.log("promise2"));
+});
  • 使用node版本(9.11.2),打印顺序:setTimeout1 => setTimeout2 => promise1 => promise2,node会先将timer阶段的回调执行完后,才会执行当前阶段微任务队列中的所有微任务。
  • 浏览器打印顺序:setTimeout1 => promise1 => setTimeout2 => promise2
  • 使用高版本node打印顺序和浏览器一致。

setTimeout和setImmediate

通常情况下我们都会使用setTimeout执行延时任务,在node中也提供了setImmediate来执行异步任务表示立即执行,前面讲到它在check阶段执行;若将setTimeout的时间设置为0是不是和前者有同样的效果:

js
setTimeout(() => console.log("setTimeout"));
+setImmediate(() => console.log("setImmediate"));

多次执行以上代码会发现打印顺序并不固定,这是为什么呢?

以上代码就两个异步任务,前面讲了node刚开始会进入poll阶段,如果当前阶段没有任何任务要执行时,就会看看有无setImmediate回调,如果有的话进入check阶段执行回调,但是同时也会监听setTimeout的回调,如果到期也会立马进入timer阶段去执行定时器的回调,两者优先级不是固定的,这就是为什么打印顺序并不是一致的原因。

现在将上面的代码稍作修改,让其在IO回调里执行:

js
const fs = require("fs")
+fs.readFile(__dirname + "/inherit.js", 'utf8', (err, data) => {
+  setTimeout(() => console.log("setTimout"));
+  setImmediate(() => console.log("setImmediate"));
+})

以上的打印顺序永远是setImmediate => setTimeout,为什么呢?因为上面代码是在IO回调里执行的。回到事件循环的执行阶段中,I/O回调会在pending callback阶段执行,按照事件循环机制check阶段会在timer阶段前执行,所以为什么打印顺序不会变。

process.nextTick

process.nextTick也是立即执行的意思,但它和setImmediate不一样的是,其不是阶段性的任务。process.nextTick在每个阶段同步任务执行完后都会执行,并且优先于微任务(promise)执行:

js
setTimeout(() => {
+  Promise.resolve().then(() => console.log("promise"));
+  process.nextTick(() => console.log("nextTick"));
+});
+setImmediate(()=> console.log('setImmediate'));

上面执行结果promisenextTick打印永远在一起,并且nextTick印永远会在promise之前打印,而setImmediate只会在check阶段打印。

按照执行时机,process.nextTick更适合于立即执行某个任务。

总结

到这里关于JS的EventLoop就讲完了,你应该也已经明白了什么是EventLoop了。本篇通过对EventLoop的学习可以对JS的执行顺序和浏览器渲染时机等等有更深的理解,这会大大减少程序运行的不确定性,也能更好的通过事件循环机制调度任务执行的优先级,如果没有彻底理解请根据文中例子和概念不断反复练习。

相关参考:

`,103);function i(F,D,y,d,u,m){const a=n("Reward"),o=n("Gitalk");return t(),e("div",null,[c,s(a),s(o)])}const h=l(r,[["render",i]]);export{A as __pageData,h as default}; diff --git a/assets/frontend_js_eventloop.md.2QrpoMAr.lean.js b/assets/frontend_js_eventloop.md.2QrpoMAr.lean.js new file mode 100644 index 000000000..224cdf501 --- /dev/null +++ b/assets/frontend_js_eventloop.md.2QrpoMAr.lean.js @@ -0,0 +1 @@ +import{_ as l,c as e,J as s,V as p,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"EventLoop事件循环机制(浏览器和Node EventLoop)","description":"由于JavaScript是个单线程的语言,异步任务都会通过回调来解决单线程问题,JavaScript内部通过EventLoop事件循环机制来调度异步任务,本篇会对比浏览器的EventLoop和Node的EventLoop展开讲解","frontmatter":{"title":"EventLoop事件循环机制(浏览器和Node EventLoop)","description":"由于JavaScript是个单线程的语言,异步任务都会通过回调来解决单线程问题,JavaScript内部通过EventLoop事件循环机制来调度异步任务,本篇会对比浏览器的EventLoop和Node的EventLoop展开讲解","keywords":"JS EventLoop,JS事件循环机制,浏览器EventLoop,NodeJS EventLoop,JS Engine,JS Runtime,JS异步编程,Promise,回调地狱,async/await,迭代器","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/eventloop.md","filePath":"frontend/js/eventloop.md","lastUpdated":1706247228000}'),r={name:"frontend/js/eventloop.md"},c=p("",103);function i(F,D,y,d,u,m){const a=n("Reward"),o=n("Gitalk");return t(),e("div",null,[c,s(a),s(o)])}const h=l(r,[["render",i]]);export{A as __pageData,h as default}; diff --git a/assets/frontend_js_implicit-conversion.md.s3K7bck7.js b/assets/frontend_js_implicit-conversion.md.s3K7bck7.js new file mode 100644 index 000000000..4007f8861 --- /dev/null +++ b/assets/frontend_js_implicit-conversion.md.s3K7bck7.js @@ -0,0 +1,175 @@ +import{_ as e,c as p,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"JS类型隐式转换与装箱拆箱","description":"搞明白JS动态弱类型语言的隐式转换规则及装箱拆箱规则来提高你的程序稳定性","frontmatter":{"title":"JS类型隐式转换与装箱拆箱","description":"搞明白JS动态弱类型语言的隐式转换规则及装箱拆箱规则来提高你的程序稳定性","keywords":"类型隐式转换,装箱拆箱,运算转换,类型转换规则,type conversion,toPrimitive,弱类型,OrdinaryToPrimitive","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/implicit-conversion.md","filePath":"frontend/js/implicit-conversion.md","lastUpdated":1706247228000}'),r={name:"frontend/js/implicit-conversion.md"},c=o(`

JS类型隐式转换与装箱拆箱

如果你写过大多数强类型语言如Java对数据的类型一定不会陌生,如定义两个变量:int num = 1boolean bool = false,比较它们是否相等时结果很明显是false(不同类型直接会报错),类型不同的变量永远不会相等。由于JS被定位成动态弱类型语言,其往往会颠覆你的认知。

JS引擎往往会最大限度的降低程序的错误,假如你会写num = 1;num.name=xxx这种很明显的错误,但当你运行时却不会报错,这里就涉及到了装箱和拆箱;还有1 == true; 1 == [1]你会发现竟然结果都为true,如果你不了解JS内部的装箱、拆箱和类型的隐式转换规则,这些可能都会让你产生困惑,如果你有这些疑惑,接着看下面的内容吧。

注:如遇到有一些链接无法访问可能需要科学上网

装箱与拆箱

什么是装箱和拆箱?JS中有stringnumberboolean基础类型,它们都有对应的包装类型(引用类型)StringNumberBoolean装箱就是将基础类型转换为对应的包装类型,而拆箱则将包装类型转换为对应的基础类型。

如果你对拆箱操作不了解,将会影响你对隐式转换的理解。

装箱

装箱可以通过显式new进行装箱,JS引擎也可以隐式装箱,下面就来了解下两种不同的装箱操作。

  1. 显式装箱
js
// string
+str = new Object('str')
+str = new String('str')
+
+// boolean
+bool = new Object(true)
+bool = new Boolean(true)
+
+// number
+num = new Object(1)
+num = new Number(1)
  1. 隐式装箱
js
name = 'js'
+// 例1
+name.toUpperCase(); // JS
+
+// 例2
+name.age = 1; // 自动装箱 => name = new String('js') => name.age = 1 => 下一行前销毁当前对象
+console.log(name.age); // undefined

上面隐式装箱name是个基础类型,基础类型不会有属性的,但却拥有toUpperCase方法,其本质还是String对象的方法,当执行此方法时会隐式的将name转换为对象name => new String(name),然后就会拥有对应的方法;而给其设置age属性后重新获取却为undefined,这里JS引擎就处理了错误的赋值操作,也会将name转换为new String(name)然后在执行下一行前又会销毁此对象,可以理解为当前对象就是来为赋值操作服务的。

拆箱

拆箱则是将包装类型转化为对应的基础类型,通过执行valueOf方法可以得到它的原始值:

js
num = new Number(123); // Number {123}
+typeof num; // object
+num.valueOf(); // 123
+
+bool = new Object(true); // Boolean {true}
+typeof booll; // object
+bool.valueOf(); // true

除了执行valueOftoString方法也可以将包装类型转换为基础类型字符串形式,其实除了以上几个包装类型拆箱,其他的引用类型也会根据一定的规则进行转换,下面就来一起看看。

toPrimitive、 OrdinaryToPrimitive

对于引用类型在特殊条件下都会转换为基础类型,其拆箱都会遵循【toPrimitive规则】

JS引擎內部toPrimitive的签名如下:input是待转换的对象,perferedType为转换的类型,有string/number两种

ts
toPrimitive(input, perferedType);
+
+// 1. If input is an Object, then
+//   a. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
+//   b. If exoticToPrim is not undefined, then
+//     i. If preferredType is not present, let hint be "default".
+//     ii. Else if preferredType is string, let hint be "string".
+//     iii. Else,
+//       1. Assert: preferredType is number.
+//       2. Let hint be "number".
+//     iv. Let result be ? Call(exoticToPrim, input, « hint »).
+//     v. If result is not an Object, return result.
+//     vi. Throw a TypeError exception.
+//   c. If preferredType is not present, let preferredType be number.
+//   d. Return ? OrdinaryToPrimitive(input, preferredType).
+// 2. Return input.

这里的toPrimitive属性其实就是Symbol.toPrimitive属性,其内部转换可以概括步骤如下(重点):

  1. 当进行类型转换时会首先判断有没有Symbol.toPromitive属性:
    • perferedTypestring时,返回string条件结果。
    • perferedTypenumber时返回number条件结果。
    • perferedType为空时,返回default条件结果。
    • 如果以上返回的结果不是基本类型时抛异常Cannot convert object to primitive value
  2. 如果没有Symbol.toPromitive属性,会执行内部的OrdinaryToPrimitive方法,此方法会根据优先级调用toStringvalueOf方法,其调用顺序如下:
    • 当指定转换类型为string时,会优先调用toString方法,若执行结果为基础类型则返回,否则执行valueOf方法,基本类型结果将会返回,否则将会抛异常。
    • 当指定转换类型为number时,会优先调用valueOf方法,若执行结果为基础类型则返回,否则执行toString方法,基本类型结果将会返回,否则将会抛异常。
    • 在不指定类型情况下,除了Date会优先执行toString方法,其余的都会优先执行valueOf方法,然后根据前两条规则执行。

OrdinaryToPrimitive签名如下:

ts
OrdinaryToPrimitive(O, hint);
+
+// 1. If hint is string, then
+//   a. Let methodNames be « "toString", "valueOf" ».
+// 2. Else,
+//   a. Let methodNames be « "valueOf", "toString" ».
+// 3. For each element name of methodNames, do
+//   a. Let method be ? Get(O, name).
+//   b. If IsCallable(method) is true, then
+//     i. Let result be ? Call(method, O).
+//     ii. If result is not an Object, return result.
+// 4. Throw a TypeError exception.

OrdinaryToPrimitive的执行也可以在源码(c代码JS代码)中找到,你可以在source.chromium.org中搜索对应的关键字OrdinaryToPrimitive,就可以找到。下面代码也证明了OrdinaryToPrimitive的执行的执行步骤

js
module.exports = function OrdinaryToPrimitive(O, hint) {
+  if (Type(O) !== 'Object') {
+    throw new $TypeError('Assertion failed: Type(O) is not Object');
+  }
+  if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
+    throw new $TypeError('Assertion failed: \`hint\` must be "string" or "number"');
+  }
+
+  var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
+
+  for (var i = 0; i < methodNames.length; i += 1) {
+    var name = methodNames[i];
+    var method = Get(O, name);
+    if (IsCallable(method)) {
+      var result = Call(method, O);
+      if (Type(result) !== 'Object') {
+        return result;
+      }
+    }
+  }
+
+  throw new $TypeError('No primitive value for ' + inspect(O));
+};

接下来通过下面的代码来证明以上总结的步骤,首先会执行Symbol.toPrimitive方法,没有则会执行OrdinaryToPrimitive的方法。

Symbol.toPrimitive证明

js
// 根据toPrimitive签名定义方法
+obj = {
+  [Symbol.toPrimitive](perferedType) {
+    if (perferedType === "number") return 1;
+    if (perferedType === "string") return "str";
+    return "default";
+  }
+}
+
+// 1. perferedType为string
+\`\${obj}\`; // 'str'
+
+// 2. perferedType为number
++obj; // 1
+
+// 3. perferedType为 undefined
+'' + obj; // 'default'
+
+// 若返回的结果不是基础类型则抛异常,这里修改一个number返回对象
+obj = {
+  [Symbol.toPrimitive](perferedType) {
+    if (perferedType === "number") return [1,2,3];
+    if (perferedType === "string") return "str";
+    return "default";
+  }
+}
++obj; // Uncaught TypeError: Cannot convert object to primitive value

通过上面的代码再次证明了确实是以上的步骤,接下来看OrdinaryToPrimitive

OrdinaryToPrimitive证明

js
// 1. hint为string会先执行toString方法
+\`\${{valueOf: () => 1, toString: () => 2}}\`; // '2'
+Array.prototype.toString = () => 'array';
+\`\${[1,2,3]}\`; // 'array'
+
+// 2. hint为number会先执行valueOf方法
++({valueOf: () => 1, toString: () => 2}); // 1
+Array.prototype.valueOf = () => 2;
++[1,2,3]; // 2
+
+// 3.当不指定 hint 类型时,除Date类型其它会优先执行\`valueOf\`,然后执行\`toString\`,Date正好相反
+'' + ({valueOf: () => 1, toString: () => 2}); // '1'
+1 + ({valueOf: () => 1, toString: () => 2}); // 2
+'' + new Date(); // 'Thu Dec 01 2021 12:56:23 GMT+0800 (中国标准时间)'
+Date.prototype.toString = () => 'date'; // 修改Date的toString方法
+'' + new Date(); // date
+
+// 4.若某一个方法返回的不是基础类型,继续执行下一个方法,否则抛异常
+'' + ({valueOf: () => [1,2,3], toString: () => 2}); // 2 => 执行toSting
+Date.prototype.toString = () => [1,2,3]; // 修改Date的toString方法
+'' + new Date(); // '1609459200000' => 执行 valueOf
+'' + ({valueOf: () => [1,2,3], toString: () => []}); // Uncaught TypeError: Cannot convert object to primitive value

以上就是OrdinaryToPrimitive的执行步骤,其实valueOf执行结果更趋向于自己原本的值(除Date外),而toString一定会返回string类型,如:

js
// valueOf
+obj = { name: 1 };
+obj.valueOf(); // { name: 1 }
+(function(){}).valueOf(); // f(){}
+[1,2,3].valueOf(); // [1,2,3]
+new RegExp('^\\d+','i').valueOf(); // /^d+/i
+
+// toString
+obj.toString(); // '[object Object]'
+[1,2,3].toString(); // '1,2,3'
+new RegExp('^\\d+','i').toString(); // '/^d+/i'

通过上面的内容你应该对装箱与拆箱有了更深的认识,从拆箱中应该也看到了类型转换的影子(上面代码中12,13行高亮部分)'' + ({valueOf: () => 1, toString: () => 2}); // '1',返回的结果是个字符串1而不是数字,而1 + ({valueOf: () => 1, toString: () => 2}); // 2返回的却是数字2,两者只因相加位类型的不同结果也不同,这里就涉及到了类型的隐式转换,number => string的转换。

了解了对象转换为原始类型(拆箱)后,接下来就来看看类型隐式转换是如何运作的。

类型隐式转换

提示

如果你在类型隐式转换的阅读过程中产生的疑问过多,建议将装箱和拆箱的内容多读、多练几遍。

类型隐式转换可以归结为numberstringboolean等其它基础类型之间通过运算符==*、/、+、-或逻辑运算的转换。由于JS的弱类型特征,像==比较者可以为任意类型任意值,而===比较者的类型不同永远不会相等(1 == 11 === '1')。

其实转换者可以是基础类型和对象类型,但归根还是基础类型之间的转换,若转换者存在对象类型,会根据拆箱优先级进行拆箱转换为基础类型后,然后在根据类型隐式转换的规则进行转换。

这里列出一张不同类型转换表格,里面包含了不同类型转换到原始值或其它基础类型的规则,通常情况下记住这张表的转换规则就可以解决所有隐式转换的问题了(当然对象类型转换为基础类型要学会前面讲的拆箱规则)。

类型to Booleanto Numberto String
Booleantruetrue1'true'
Booleanfalsefalse0'false'
Number100true100'100'
NumberInfinitytrueInfinity'Infinity'
Number0false0'0'
NumberNaNfalseNaN'NaN'
String''false0''
String'100'true100'100'
String'100abc'trueNaN'100abc'
String'abc'trueNaN'abc'
Nullnullfalse0'null'
UndefinedundefinedfalseNaN'undefined'
Functionfunction(){}trueNaN'function(){}'
Object{}trueNaN'[object Object]'
Array[]true0''
Array['abc']trueNaN'abc'
Array['123']true123'123'
Array['123', 'abc']trueNaN'123,abc'
Datenew Datetrue数字(时间戳)'Wed Nov 16 2020 16:51:31 GMT+0800 (中国标准时间)'
SymbolSymbol('a')truethrow TypeErrorthrow TypeError

算术运算符转换

算术运算符主要包括+、-、*、/,除了+运算符外,其余算术运算符都针对的是数字number,也就是说运算双方都必须是或转换为数字,这个相对来说简单直接套上面的表格即可,而+运算符最为特殊,+不仅可以进行算术运算也可以进行字符串的拼接,同时也是最常见的隐式转换。

减乘除

参与双方若是基础类型都会转换为number类型,而一方为引用类型时会先进行内部拆箱转换成最兼容number类型的基本类型,下面用一段代码加深下印象:

  1. string转number
js
'1' - 1  // 0
+'1' * 1  // 0
+'1a' - 1  // NaN

这里'1'会涉及到string => number的转换,从上面的表格中得到转换值为1,而'1a'转换后并不能兼容数字所以是NaN

  1. boolean转number
js
true - 0  // 1
+true * 1  // 1
+false - 0  // 0

true转换为1,false转换为0。

  1. undefined、null转number
js
undefined - 1  // NaN
+null - 1  // -1
+null * 1  // 0

undefined转换为NaN,null转换为0。

  1. 对象类型转number
js
[] - 1  // -1
+[] * 1  // 0
+[1] - 1  // 0
+[1, 'a'] - 1  // NaN
+({}) - 1  // NaN
+new Date() - 1  // 1577836799999
+(function(){}) - 1  // NaN
+new RegExp('^\\w+', 'i') - 1  // NaN

对象类型会根据OrdinaryToPrimitive拆箱规则进行转换为基础类型number类型,然后进行计算。

以上便是-、*、/运算符转换为number类型的规则,比较简单。

加运算

加法运算最为特殊同时也是类型转换最多的,不仅可以进行算术运算也可以进行字符串的拼接。其转换规则为:

  1. 若一方是string类型,则另一方也会转换为字符串,进行字符串的拼接
  2. 若一方为number类型,另一方为原始类型,将其转换为number类型,进行算术相加。
  3. 若一方为number类型,另一方为引用类型,将其拆箱转换为基本类型后,进行字符串的拼接。

以上转换规则优先级从高到低进行转换。

下面用几个例子演示这些规则:

转换规则1:

js
'' + 1 // '1'
+'' + true // 'true'
+'str' + undefined // 'strundefined'
+'' + null // 'null'
+'' + [] // ''
+'' + [1] // '1'
+'' + [1,2,3] // '1,2,3'
+'' + {name: 1} // '[object Object]'
+'' + (function(){}) // 'function(){}'

转换规则2:

js
1 + 1 // 2
+1 + true // 2
+1 + null // 1
+1 + undefined // NaN

转换规则3:

js
1 + [] // '1'
+1 + [1,2] // '11,2'
+1 + (function(){}) // '1function(){}'
+1 + ({}) // '1[objectObject]'
+1 + new Date() // '1Fri Dec 02 2020 11:40:48 GMT+0800 (中国标准时间)'
+1 + new RegExp('\\s', 'ig') // '1/s/gi'

以上便是加法的隐式转换,根据上面三条规则的优先级进行转换,基础不同类型转换的值可以根据上面的表格进行判断,引用类型根据拆箱规则结合转换优先级即可。

逻辑运算转换

!运算转换

逻辑运算的转换常见的就是!==的转换,相对来说非常简单。一般像null、undefined、0、''、NaN、false等为false外,其余的都是true(如:[]、{}等等)。

js
!null // true
+!undefined // true
+!NaN // true
+![] // false
+!{} // false

==运算转换

==转换规则一般总结为一下五条:

  • NaN和任何其他类型(包括自己)比较值都是false。
  • Boolean和其他类型比较时,自己转化为Number类型然后进行比较.
  • NumberString类型比较,将String类型转换为Number类型后进行比较。
  • undefined除了和null比较结果为true外,其余的比较都是false。
  • 原始值和引用类型进行比较时,引用类型根据拆箱规则转换成基础类型后进行比较。
js
NaN == NaN // false
+NaN == 0 // false
+true == 2 // false  true => 1
+1 = '1' // true  '1' => 1
+undefined == null // true
+undefined == NaN // false
+null == false // false
+[1] == 1 // true  [1] => 1
+[1,2] == 1 // false  [1,2] => '1,2'

到这里基本上学会了以上的内容,隐式转换就可以搞懂了,其实也没什么难度,把这些转换概念摸清楚就可以游刃有余。

问题

有些同学可能看到这里,还没有完全掌握,这里就提供几个小菜,提供给大家练习,看和你的想法一直不,如果一直可以说清楚具体逻辑不,想法有出入那又是问什么?

js
({}) + []
查看结果

答案:'[object Object]',两者首先拆箱转换为基础类型,{} => [object Object][] => ''然后进行字符串拼接

js
[] == []
查看结果

答案:false,这里不会进行拆箱,类型相同的变量会直接比较,两者都是引用类型,地址不同不会相等

js
[] == ![]
查看结果

答案:true,![]先转换转换为false,[]进行拆箱变成0,false在转换成0

这里笔者发现一个有趣的问题,看看通过上面的知识你能解决吗:

js
let a;
+// 请让变量a满足以下条件
+
+if (a == 1 && a == 2 && a == 3) { console.log(true) };
查看结果
js
a = {
+  value: 1,
+  valueOf:() => a.value++;
+}

以上就是解决方案,是不是很简单。 首先要想a同时满足1、2、3的值,直接排除掉基础类型值,那么a一定是个引用类型,引用类型和基础类型的==比较,会通过拆箱规则转换,那么就会执行valueOf、toString方法,又根据拆箱优先级会先执行valueOf方法,那么在此方法做文章就可以了,每次读取值时进行自加,这样就会满足1、2、3

总结

本篇主要讲了JS怎么进行隐式转换的,通过拆箱和装箱了解到JS引擎对程序的包容性还是很高的,学会引用类型根据toPrimitive优先级规则进行转换,也学会了从简单的算术运算到逻辑运算的隐式转换规则。

相关参考:

`,97);function i(y,F,D,d,u,b){const a=n("Reward"),l=n("Gitalk");return t(),p("div",null,[c,s(a),s(l)])}const B=e(r,[["render",i]]);export{E as __pageData,B as default}; diff --git a/assets/frontend_js_implicit-conversion.md.s3K7bck7.lean.js b/assets/frontend_js_implicit-conversion.md.s3K7bck7.lean.js new file mode 100644 index 000000000..bdaa06c76 --- /dev/null +++ b/assets/frontend_js_implicit-conversion.md.s3K7bck7.lean.js @@ -0,0 +1 @@ +import{_ as e,c as p,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"JS类型隐式转换与装箱拆箱","description":"搞明白JS动态弱类型语言的隐式转换规则及装箱拆箱规则来提高你的程序稳定性","frontmatter":{"title":"JS类型隐式转换与装箱拆箱","description":"搞明白JS动态弱类型语言的隐式转换规则及装箱拆箱规则来提高你的程序稳定性","keywords":"类型隐式转换,装箱拆箱,运算转换,类型转换规则,type conversion,toPrimitive,弱类型,OrdinaryToPrimitive","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/implicit-conversion.md","filePath":"frontend/js/implicit-conversion.md","lastUpdated":1706247228000}'),r={name:"frontend/js/implicit-conversion.md"},c=o("",97);function i(y,F,D,d,u,b){const a=n("Reward"),l=n("Gitalk");return t(),p("div",null,[c,s(a),s(l)])}const B=e(r,[["render",i]]);export{E as __pageData,B as default}; diff --git a/assets/frontend_js_js-gc.md.AunbcRGq.js b/assets/frontend_js_js-gc.md.AunbcRGq.js new file mode 100644 index 000000000..7b7fae45e --- /dev/null +++ b/assets/frontend_js_js-gc.md.AunbcRGq.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as r,V as t}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"JS垃圾回收机制","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/js/js-gc.md","filePath":"frontend/js/js-gc.md","lastUpdated":1706247228000}'),l={name:"frontend/js/js-gc.md"},o=t('

JS垃圾回收机制

浏览器:

引用计数法

引用计数法:对象被引用一次引用次数就 +1,引用次数为0 后,垃圾回收运行时清理掉次数为0 的

  • 优点:引用计数只需要在计数为0 时就可以回收,不需要遍历所有对象
  • 缺点:计数器需要占很大的空间,无法解决循环引用无法回收的问题

标记清除法

标记清除法:定期将活动对象和不活动的对象进行分别标记,然后开始清除工作,最后还原标记,等待 下一轮清除工作

  • 优点:算法简单,
  • 缺点:(内存碎片化,分配速度慢)清除后剩余的对象内存位置不变,导致空闲内存空间不连续,出现了内存碎片

标记整理算法在标记结束后,将活动对象往内存一边移动

分代式回收

V8回收机制优化:

分代式垃圾回收

  1. 新生代回收:Scavenge算法、Cheney算法,Cheney算法将新生代内存一分为二,使用区和空闲区, 对活动区的对象进行标记,清理,活动区和空闲区身份互换,交换两次后,将活动区还在的老对象 放到老生代,如果交换后空闲区超过25%,将会把对象都放到老生代
  2. 老生代:存放一些空间大、存活时间长,如果放在新生代频繁复制交换,会非常耗时;老生代使用 标记清除法,进行清除,排序整理,标记整理 并行回收,读写锁 全停顿,增量标记、三色标记、写屏障 惰性清理

新生代

老生代

并行回收

增量标记

三色标记法

写屏障

惰性清理

并发回收

参考文档

',23),i=[o];function n(h,s,c,d,u,p){return r(),e("div",null,i)}const _=a(l,[["render",n]]);export{m as __pageData,_ as default}; diff --git a/assets/frontend_js_js-gc.md.AunbcRGq.lean.js b/assets/frontend_js_js-gc.md.AunbcRGq.lean.js new file mode 100644 index 000000000..6cad6a9bf --- /dev/null +++ b/assets/frontend_js_js-gc.md.AunbcRGq.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as r,V as t}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"JS垃圾回收机制","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/js/js-gc.md","filePath":"frontend/js/js-gc.md","lastUpdated":1706247228000}'),l={name:"frontend/js/js-gc.md"},o=t("",23),i=[o];function n(h,s,c,d,u,p){return r(),e("div",null,i)}const _=a(l,[["render",n]]);export{m as __pageData,_ as default}; diff --git a/assets/frontend_js_meta-coding.md.SJjED1Qn.js b/assets/frontend_js_meta-coding.md.SJjED1Qn.js new file mode 100644 index 000000000..14552ee75 --- /dev/null +++ b/assets/frontend_js_meta-coding.md.SJjED1Qn.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s,m as a,a as o}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"Javascript元编程","description":"Javascript元编程","frontmatter":{"title":"Javascript元编程","description":"Javascript元编程","keywords":"元编程","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/meta-coding.md","filePath":"frontend/js/meta-coding.md","lastUpdated":1706247228000}'),n={name:"frontend/js/meta-coding.md"},r=a("h1",{id:"javascript元编程",tabindex:"-1"},[o("Javascript元编程 "),a("a",{class:"header-anchor",href:"#javascript元编程","aria-label":'Permalink to "Javascript元编程"'},"​")],-1),c=[r];function i(d,p,l,m,_,h){return s(),t("div",null,c)}const g=e(n,[["render",i]]);export{v as __pageData,g as default}; diff --git a/assets/frontend_js_meta-coding.md.SJjED1Qn.lean.js b/assets/frontend_js_meta-coding.md.SJjED1Qn.lean.js new file mode 100644 index 000000000..14552ee75 --- /dev/null +++ b/assets/frontend_js_meta-coding.md.SJjED1Qn.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s,m as a,a as o}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"Javascript元编程","description":"Javascript元编程","frontmatter":{"title":"Javascript元编程","description":"Javascript元编程","keywords":"元编程","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/meta-coding.md","filePath":"frontend/js/meta-coding.md","lastUpdated":1706247228000}'),n={name:"frontend/js/meta-coding.md"},r=a("h1",{id:"javascript元编程",tabindex:"-1"},[o("Javascript元编程 "),a("a",{class:"header-anchor",href:"#javascript元编程","aria-label":'Permalink to "Javascript元编程"'},"​")],-1),c=[r];function i(d,p,l,m,_,h){return s(),t("div",null,c)}const g=e(n,[["render",i]]);export{v as __pageData,g as default}; diff --git a/assets/frontend_js_proto-inherit.md.I_l70cVG.js b/assets/frontend_js_proto-inherit.md.I_l70cVG.js new file mode 100644 index 000000000..092834dd1 --- /dev/null +++ b/assets/frontend_js_proto-inherit.md.I_l70cVG.js @@ -0,0 +1,326 @@ +import{_ as p,c as o,J as s,V as e,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"原型、原型链与继承(构造函数继承、组合继承、寄生组合式继承、class继承)","description":"一文吃透JavaScript的原型、原型链和继承概念和使用技巧,让你明白原型链继承、构造函数继承、原型式继承、组合式继承、寄生式继承、寄生组合式继承、class继承等多种继承方式","frontmatter":{"title":"原型、原型链与继承(构造函数继承、组合继承、寄生组合式继承、class继承)","description":"一文吃透JavaScript的原型、原型链和继承概念和使用技巧,让你明白原型链继承、构造函数继承、原型式继承、组合式继承、寄生式继承、寄生组合式继承、class继承等多种继承方式","keywords":"原型概念,原型链概念,什么是原型,继承,前端继承,原型链继承,构造函数继承,组合继承,寄生式继承,寄生组合式继承,class继承","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/proto-inherit.md","filePath":"frontend/js/proto-inherit.md","lastUpdated":1706247228000}'),c={name:"frontend/js/proto-inherit.md"},r=e(`

原型、原型链与继承

众所周知js是基于原型的编程语言,相对于传统的OOP面向对象编程还是有一点区别的。在JS中每个对象都会拥有一个原型对象,自己可以从原型那里获得额外的属性、方法等等(可以看做继承),这些属性和方法都是定义在其构造函数的prototype(即原型)属性上,可以通过属性(__proto__)进行获取。而对于传统的OOP,则会定义对应的类,然后在实例化对象时,将属性和方法复制到实例上。

本文将会全面介绍原型、原型链和继承。

什么是原型与原型链

Javascript有stringnumberbooleanundefinednullsymbolbigint等几种基本类型,其它都可以看做object类型,只有object对象才会有原型。

JS中每个对象内部都会包含一个隐藏的[[Prototype]]属性,这个属性就是原型,它指向它的构造函数的prototype属性,即原型对象为构造函数的[[prototype]]属性。由于历史原因,通常情况下大家都喜欢用__proto__访问和修改原型,但它不是ES标准,而是一些浏览器实现了这个非标准的__proto__,而后来官方推出Object.get/setPrototypeOf(obj)进行操作原型,取代非标准的__proto__属性进行访问。

__proto__[[Prototype]]的历史原因,是原型对象的getter/setter,虽然官方不推荐,不过__proto__已被浏览器包括服务端都已支持,因此不用担心使用,以下都以__proto__作为原型属性介绍。由于修改原型是个极其耗时的工作,所以不推荐频繁修改它,一般都是在继承时初始化值后尽量减少修改。

原型也是一个普通对象,指向构造函数的prototype属性,对象自己和原型之间通过链接的方式引用,当改变原型对象时,所有的子对象的原型都会同步改变。

关于构造函数或prototype属性不是很清楚后面会介绍,先记住概念,后面就会解释

js
// 1. 创建原型对象
+const parent = { parent: "parent" };
+const user = { name: "Tom" };
+
+// 2. 创建原型对象为user的u1、u2, 此时 u1和u2 自身都是空对象
+const u1 = Object.create(user); // 创建原型为 user 的对象 u1 (Object.create后面会讲)
+u1.age = 1; // 为 u1&u2 添加 age 属性
+const u2 = Object.create(user);
+u2.age = 2;
+console.log(u1.__proto__ === user); // => true
+console.log(u2.__proto__ === user); // => true
+console.log(u1.__proto__ === u2.__proto__); // => true
+console.log(u1.name, u2.name); // => Tom, Tom
+console.log(u1.parent, u2.parent); // => parent, parent
+
+// 3. 改变原型对象
+user.name = "Jerry";
+user.foo = "bar";
+console.log(u1.name, u1.foo); // => Jerry, bar
+console.log(u2.name, u2.foo); // => Jerry, bar

需要注意

原型对象不能形成闭环,原型只能是对象或者null,其它值都会被忽略

__proto__不等于[[prototype]]

修改原型是个非常耗时的操作,避免频繁修改原型

以上代码可以看出原型对象和普通对象没有什么区别,对象本身和原型对象以引用的关系存在(如上12、18和19行)。原型大家理解了后,那原型链也很快就懂了,这也是以上u1/u2可以访问到自身不存在的属性关键所在。

JS中每个对象都有一个[[Protype]]__proto__属性指向它的构造函数prototype属性也就是原型,原型对象也是个普通对象,它也有自己的原型即__proto__属性,也指向到它的构造函数的prototype属性,就这样层层向上,直到Object的原型null,也称为原型链的顶端,这就是原型链。

关于构造函数或prototype属性不是很清楚后面会介绍,先记住概念,后面就会解释

JS中当访问对象的属性时,会先查看当前对象是否存在此属性,如果不存在会从当前对象的原型链中查找属性,直到原型链的顶端,这也就解释了u1/u2为什么可以访问到自身不存在的属性nameparent等等。

这是一张非常经典的原型链图,如果你已经掌握了原型的知识,相信看懂它想必并不难。如果有看不懂的,别着急接着下面的内容阅读完后再回头试试。

proto-chain.png

首先设置原型的方式有多种,下面介绍多种方式加深大家的理解。

属性访问器

前面介绍了__proto__其实是[[Prototype]]原型的getter/setter,可以直接对象属性赋值的方式改变原型,这种方式最好理解。

js
const cat = { name: 'cat', food: 'mouse' };
+
+console.log(cat.__proto__ === Object.prototype); // true
+
+// 通过 __proto__ 方式给原型添加方法 eat
+cat.__proto__.eat = function () {
+  console.log("eat: ", this.food); // this指向 cat
+};
+
+console.log(cat.__proto__ === Object.prototype); // true
+
+// 执行原型中的eat方法
+cat.eat(); // => mouse

从代码可以看出cat的原始原型就是Object.prototype(10行),当手动给原型添加eat方法时,并没有覆盖原型,而是在Object.prototype的基础上添加了eat方法,因此cat的原型还是Object.prototype对象,看下此时的cat结构

QQ截图20221021105110.png

接着上面代码,直接设置原型对象而不是添加属性:

js
const cat = { name: 'cat', food: 'mouse' };
+// 直接覆盖了原型对象
+cat.__proto__ = {
+  eat: function () {
+    console.log("eat: ", this.food); // this指向 cat
+  }
+};
+console.log(cat.__proto__ === Object.prototype); // false
+console.log(cat.__proto__.__proto__ === Object.prototype); // true
+console.dir(cat);

上面高亮那行代码,通过直接覆盖原型对象的方式添加原型不再是Object.prototype,而原型的原型才会是Object.prototype,现在看下cat的结构。

QQ截图20221021111204.png

以上便是__proto__方式添加原型,对于prototype属性接下来看看构造器。

构造函数

在JS世界里只有函数才会有构造器(尽管ES6有class这种类似Java的语法,其本质还是函数),如前面的Object是个创建对象的构造器,可以用o = new Object([...args])来构造一个普通对象。每个函数都有prototype属性,它和原型对象[[Prototype]]不是一个概念,可以认为是个普通的对象,默认只有一个属性constructor,它指向函数本身。

QQ截图20221021121302.png

QQ截图20221021113431.png

函数也可以看做是一个特殊的对象也有自己的原型,JS中所有函数的原型指向它的构造函数Function的prototype属性如:App.__proto__ === Function.prototypeObject.__proto__ === Function.prototypeFunction.__proto__ === Function.prototype

js
Function.__proto__ === Function.prototype // true
+Object.__proto__ === Function.prototype // true
+Array.__proto__ === Function.prototype // true
+String.__proto__ === Function.prototype // true
+Boolean.__proto__ === Function.prototype // true
+Number.__proto__ === Function.prototype // true
+Date.__proto__ === Function.prototype // true
+RegExp.__proto__ === Function.prototype // true
+Blob.__proto__ === Function.prototype // true
+ArrayBuffer.__proto__ === Function.prototype // true

了解了构造函数的原型后,下面来说函数特有属性prototype的作用。

函数都有个特殊的属性prototype,默认情况下改属性对象只有constructor属性执行函数本身,在函数作为构造函数使用时new 构造函数会生成一个新的对象,这个对象的原型会指向构造函数的prototype属性,而作为普通函数使用时,prototype和普通的对象属性没有区别。

js
function User() {};
+// 作为构造函数
+u1 = new User();
+console.log(u1.__proto__ === User.prototype); // true
+
+// 作为普通函数
+u2 = User(); // undefined

上面第4行高亮处已经证明了,当函数作为构造函数时,函数的prototype属性,将会作为对象的原型,那原型的对象是不是就是prototype的原型,上面已经介绍过原型直接通过链接的方式引用,接下来证明上面的概念:

js
function User(name) { this.name = name; };
+User.prototype.say = function() { console.log("my name is ", this.name);};
+u1 = new User('Tom');
+u1.say(); // my name is Tom
+console.log(u1.__proto__.__proto__ === User.prototype.__proto__) // true
+
+// 修改prototype原型
+const customProto = { name: "custom proto" };
+Object.setPrototypeOf(User.prototype, customProto);
+console.log(u1.__proto__.__proto__ === User.prototype.__proto__) // true
+console.log(u1.__proto__.__proto__ === customProto) // true
+console.log(User.prototype.__proto__ === customProto) // true
+
+// 现在修改prototype的属性和原型
+User.prototype.run = () => console.log('I am running...');
+customProto.length = 1;
+console.dir(u1);

QQ截图20221021125128.png

从上图和代码中可以证明原型链都是以引用的方式存在,修改原型的属性会同步改变,函数prototype的改变也会影响到对象的原型。如果将prototype设置为null,将不会影响到已有的对象,为什么呢?已生成的对象已经对原型对象做了引用,当赋值prototype为null时,原型对象的引用数将会变成已经存在的对象的数量。如果再次给原型对象赋值新的值,也不会影响到原有的对象。

在原型的定义中我们知道原型指向它的的构造函数的prototype属性,通过上面构造函数的知识我们知道以new的形式生成的对象如何指向prototype属性,那可能有人好奇,字面量定义的对象为什么符合这样的逻辑,那是因为字面量创建的对象js内部会隐式的以new Object创建对象。

js
u1 = { name: "susi", age: 10 };
+// js内部会以 new Object()的形式创建,如下没有区别
+u2 = new Object({ name: "susi", age: 10 });
+console.log(u1.__proto__ === Object.prototype); // true
+console.log(u2.__proto__ === Object.prototype) // true
+console.log(u1.__proto__ === u2.__proto__); // true
+
+// 不过一般不会这样创建对象,都会以字面量的方式创建,简单方便易懂

Object.create

这个方法也常来定义一个指定原型的对象,所以只能提前定义好原型对象,除了生成并没有提供对应的获取原型的方法,来看使用。

js
u1 = Object.create({ name: "Tom" });
+console.log(u1.__proto__.name); // Tom
+
+// 定义原型为null的对象
+u2 = Object.create(null);

更多详见MDN

Object.setPrototypeOf/getPrototypeOf

这两个方法是ES6新添加的,setPrototypeOfgetPrototypeOf分别用来设置和获取原型,相对于Object.create方式更加完善。

js
user = { name: "Tom" };
+proto = {
+  say: function() { console.log("I am ", this.name); }
+}
+// 设置原型
+Object.setPrototypeOf(user, proto);
+user.say(); // I am Tom
+
+// 获取原型
+console.log(Object.getPrototypeOf(user) === proto); // true
+console.log(Object.getPrototypeOf(user));

QQ截图20221021142342.png

讲了这么多原型和原型链大家应该已经明白是怎么回事了,那它到底有什么用呢?我们知道js访问对象的属性时会先访问对象本身是否存在该属性,如果不存在则会从它的原型链上去查询。假如已经定义了一个People对象,内部有很多属性和方法,现在要求新建一个Student对象,它不但会有People的所有方法还会有自定义的方法。所以能从People那边将方法移植到Student上,将会大大减小代码量,这也是个非常好的代码架构方式。

在JS中都是以原型为基础进行继承的,通过上面原型的学习,接下来让我们看看JS继承吧。

new内幕

在了解继承前,先来看看new操作。

js
function User(name) { this.name = name; }
+User.prototype.say = function() { console.log("I'm ", this.name) };
+const user = new User("Lucky"); // User{ name: "Lucky" } => 具有User原型方法的对象
+
+// 显式返回一个对象
+function User(name) {
+  this.name = name;
+  return { age: 1 };
+}
+const user = new User("Lucky"); // { age: 1} => 普通对象(没意义)

前面讲了当new构造函数时会产生一个全新的对象,正常情况下内部会涉及到以下步骤:

  • 生成一个全新对象,如果没有显式返回对象,这个对象会继承User的原型prototype
  • 函数的this将会指向生成的对象上
  • 生成的对象的原型指向函数的prototype对象
  • 如果函数显式返回对象类型的值(Object/Array/Function/RegExp...),new和普通函数调用将没有任何区别
  • 如果返回非对象类型的值,将会忽略显式返回值并返回内部生成的新对象

我们知道了new做了什么后,其实可以自己手动实现new的操作,这里简单实现原理:

js
// new implement
+function newOperator(Ctor, ...args) {
+  if (typeof Ctor !== "function") {
+    throw TypeError(\`\${Ctor} is not a function!\`)
+  }
+  const newObj = Object.create(Ctor.prototype);
+  const ctorReturn = Ctor.apply(newObj, args || []);
+  if (Object.prototype.toString.call(ctorReturn) !== "[object Null]" && typeof ctorReturn === "object") {
+    return ctorReturn;
+  }
+  return newObj;
+}

上面高亮代码判断如果函数返回的是object并且不是null类型的数据,就返回函数返回的值,反之返回自定义的对象。

new生成的对象可以用来做什么:

  • 判断类型,获取对象类型
  • 继承
ts
function Fruit() {};
+f = new Fruit();
+
+const getFuntionName = (func: Function): string => func.toString().match(/function\\s+(\\w+)/i)?.[1];
+
+console.log(f.constructor === Fruit); // true
+console.log(getFuntionName(f.constructor)); // 'Fruit'

接下来看JS继承

原型链继承

原型链继承是最基本的继承,这和所有对象都有__proto__属性概念一样。这里就是让子类的prototype属性指向实例化后的父类实例,这样子类就会拥有父类的的属性和prototype中的属性方法。为什么呢?前面讲了new操作,正常情况会生成一个全新的内部对象,作为函数内部的this指向,并且原型指向构造函数的prototype属性,拥有构造函数prototype对象中的属性和方法。

js
function Parent(name) {
+  this.name = name;
+  this.sons = ["Tom", "Jerry"];
+}
+Parent.prototype.say = function() {
+  console.log("my name:", this.name);
+}
+function Child(food) {
+  this.food = food;
+}
+// 将Parent的实例作为Child的prototype
+Child.prototype = new Parent();  // 将会拥有parent实例属性和方法,也会拥有prototype对象中的属性和方法
+Child.prototype.eat = function() {  // Child prototype对象现在是parent实例,也是个普通对象,可以添加属性和方法
+  console.log("I eat:", this.food);
+}
+
+const c1 = new Child('noodles');
+c1.say(); // my name: undefinded
+c1.eat(); // I eat noodles
+console.log(c1.sons); // // ['Tom', 'Jerry']
+
+const c2 = new Child("rice");
+c2.eat(); // I eat rice
+console.log(c2.sons); // ['Tom', 'Jerry']
+
+c1.sons.push("Lucky");
+console.log(c1.sons, c2.sons); //  ['Tom', 'Jerry', 'Lucky'], ['Tom', 'Jerry', 'Lucky']
+console.log(c1.__proto__ === c2.__proto__); // true

以上就是最简单原型链继承,当你了解原型链和new的原理相信一看就懂。这样继承子类可以拿到父类的属性还有prototype上的方法,但很明显的缺点就是,父类是个实例对象,那么所有子类对于父类的继承都是引用(28行已经证明了引用),当一个子类修改父类中的属性或方法时,都会影响到其它的子类(代码26,27行);还有一个缺点无法对父类进行传参。一图胜千言: iShot_2022-10-29_16.38.34.png

  • 优点:可以继承父类的属性和原型方法;
  • 缺点:父类在子类之间共享,会造成数据之间的污染和篡改;无法给父类传参;

构造函数继承

所谓的构造函数继承是在实例化子类时,对父类构造函数通过call/apply改变内部的this指向,让其内部的this的属性可以转嫁给子类,来看下面代码:

js
function Parent(name) {
+  this.name = name;
+  this.run = () => console.log("I am running...");
+}
+Parent.prototype.say = function() {
+  console.log("hello");
+}
+function Child(name, age) {
+  Parent.call(this, name);
+  this.age = age;
+}
+const child = new Child("Tom", 10);
+console.log(child.name, child.age); // Tom, 10
+child.run(); // I am running...
+child.say(); // 报错 => child.say is not a function

在实例化Child时,内部会执行Parent方法(9行)并将child绑定为this,并将name传递给Parent,然后parent内部的this上绑定的属性转移到child上,这样child就会拥有namerun属性,这就是构造函数继承。再来看下child的原型链: iShot_2022-10-29_16.13.47.png 从图中可以看到child的原型为Child的prototype属性,却没有Parent的prototype相关方法(say),父类只有将所有的属性定义在函数体内才能得到继承,所以这种继承并不能继承父类的prototype中的属性。

  • 优点:可以继承父类函数体内的属性和方法,并且向父类传参,并且多个实例不共享,不会造成污染
  • 缺点:无法继承父类的prototype中的属性和方法

原型式继承

原型式继承通过修改构造函数的prototype为目标对象,并实例化一个空对象达到继承的目的,来看下面这段代码:

js
function inherit(target) {
+  function F() {};
+  F.prototype = target; // 改变prototype
+  return new F();
+}
+const parent = { name: 'parent', children: ['child1', 'child2'], say() { console.log('my name is parent.'); } };
+
+const c1 = inherit(parent);
+console.log(c1.name, c1.children); // parent, ['child1', 'child2']
+c1.say(); // my name is parent.
+
+const c2 = inherit(parent);
+console.log(c2.name, c2.children); // parent, ['child1', 'child2']
+c2.say(); // my name is parent.
+
+console.log(c1.__proto__ === c2.__proto__); // true
+c1.children.push('push by c1');
+console.log(c2.children); // ['child1', 'child2', 'push by c1']
+
+c1.name = 'c1';
+console.log(c1.name, c2.name); // c1, parent

首先从上面16行看到子类的原型都指向同一个父类对象parent;在17-18行c1往children中添加了一个数据,c2中的children也发生了变化;同样的最后两行看到,c1改变了name后,c2却没有改变,这是为什么呢?当执行c1.children获取属性时,由于c1本身是不存在的,就会往原型链中找,所以会在parent中找到然后执行push方法,当然会改变其中的值,由于parent也是c2原型链,所以也会被改掉。而当执行c1.name=c1时,只要记住赋值操作=不会查找原型链,只会在当前对象中修改或添加属性,所以c1修改name时,只是在自己身上添加了name属性,并没有改变原型链中的name属性,所以c2的name还是parent中的不会发生变化。

来看下这种继承的原型结构: iShot_2022-10-29_17.18.34.png 一般这种继承应用场景如上面代码那样,继承对象是个对象的形式(parent),而子类也是个简单的对象。但这种方式可以用原型链继承代替,如:Object.create、__proto__、setPrototypeOf(前面讲的设置原型的几种方式),不用这么麻烦啰嗦。

  • 优点:继承操作简单容易理解
  • 缺点:子类实例共享父类状态易篡改,无法给父类传参

组合式继承

组合式继承则是结合原型链继承和构造函数继承,通过原型链对构造函数的原型进行继承,再通过构造函数对实例属性和方法进行继承,看下面代码:

js
function Parent(name) { this.name = name; };
+Parent.prototype.children = ["child1", "child2"];
+Parent.prototype.say = function() { console.log('my name is', this.name); };
+function Child(name, age) {
+  Parent.call(this, name);
+  this.age = age;
+}
+Child.prototype = new Parent();
+Child.prototype.intro = function() { console.log(\`my name is \${this.name}, \${this.age} age\`); };
+
+const c1 = new Child('小明', 18);
+const c2 = new Child("小红", 17);
+
+console.log(c1.name, c2.name); // 小明, 小红
+console.log(c2.age, c2.age); // 18, 17
+c1.say(); // my name is 小明
+c2.say(); // my name is 小红
+c1.intro(); // my name is 小明, 18 age
+c2.intro(); // my name is 小红, 17 age

上面组合继承看上去没什么问题,拿来看下原型图: iShot_2022-10-29_17.41.34.png 从图中可以明显看到,子类实例会拥有父类相同的属性的实例属性,由于原型链的作用父类中的实例属性并没有作用,为什么呢?从上面第8行中看到,会执行一个实例化parent的操作,前面我们知道new时会生成一个权限的对象作为this指向,所以就会实例属性或方法,但由于在实例child时,借用了parent的构造函数(第5行),child实例也会拥有parent内部的实例属性和方法,对于原型链查找的规则,parent实例中的属性永远访问不到,很明显多余。

  • 优点:可以给父类构造器传参,拥有父类的实例属性和原型方法
  • 缺点:会拥有父类相同的实例属性,但父类中的实例属性并没有被用到

寄生式继承

寄生式继承是对原型式继承的加强版,由于原型式继承返回的是空对象,空对象中并没有属性和方法,那么寄生式就是在空对象中再添加一些属性和方法,就是所谓的加强版(没啥区别啊),来看下面代码:

ts
function inherit(target, custom?: Record<string, any>) {
+  function F() {};
+  F.prototype = target; // 改变prototype
+  const newObj = new F();
+  newObj.show = () => console.log('call show...');
+  // 添加自定义方法属性...
+  custom && Object.keys(custom).forEach(k => (newObj[k] = custom[k]));
+  return newObj;
+}
+const parent = { name: 'parent', children: ["child1", "child2"], say() { console.log('I\\'m parent'); } };
+const c1 = inherit(parent, { appendChildren(name) { this.children.push(name + "c1"); } });
+const c2 = inherit(parent, { privateAttr: 'c2', appendChildren(name) { this.children.push(name + "c2"); } });
+
+console.log(c1.name, c2.name); // parent, parent
+console.log(c2.children === c2.chilrent); // true
+console.log(c2.privateAttr, c1.privateAttr); // c2, undefinded
+c1.appendChildren('pushed by c1');
+c2.appendChildren('pushed by c2');
+console.log(c1.children, c2.children); // ['child1', 'child2', 'pushed by c1c1', 'pushed by c2c2'], ['child1', 'child2', 'pushed by c1c1', 'pushed by c2c2']

如上寄生式和原型式继承一样,只不过添加了一些相同的属性和方法,还可以添加自定义属性或方法(5-7行)。上面给c2添加了属性privateAttr属性,c1并没有该属性。但是缺点也很明显和原型式继承一样(19行),这里就不说了,看下原型图:

iShot_2022-10-29_18.04.53.png

  • 优点:原型式继承加强,可以添加自定义属性和方法
  • 缺点:子类实例共享父类状态易篡改,无法给父类传参

寄生组合式继承

到这里已经讲了5中继承方式了,每种方式都有自己的优点和缺点。在这里我们来看继承的本质,所谓继承这里都指函数的继承,像一些面向对象语言如Java、C#等等,通过class继承。在JS里对应的就是function,通过new操作来生成对象继承父类的属性和方法。

那在JS中前面讲了new的过程和本质,生成的对象会拥有实例属性和原型对象(prototype)的属性,实例属性是在构造函数中在new的时候自动添加到内部生成的对象上,而原型prototype对象会作为对象的原型__proto__,这样new生成的对象就会拥有实例属性和原型属性了。那么子类函数是不是只要在函数内部和原型对象上prototype拥有父类的属性和方法就行了,也就是new的时候也会拥有父类的实例属性和方法,然后生成的对象指向子类函数的prototype对象,只要prototype拥有父类的的prorotype属性和方法就可以了。

继承组合式继承就是来实现上面的操作的,其实也是平衡前面几种继承的优点和缺点,下面来简单实现下:

js
// 寄生组合式继承
+function Parent(name) {
+  this.name = name;
+  this.children = [];
+}
+Parent.prototype.say = function() {
+  console.log(\`my name is \${this.name}\`);
+}
+Parent.prototype.appendChildren = function(child) { this.children.push(child); };
+function Child(name, age) {
+  Parent.call(this, name);
+  this.age = age;
+}
+// 将Parent原型上的方法和属性移植到Child的原型上
+Child.prototype = Object.create(Parent.prototype);
+// 按照new规范将构造器指向Child自己
+Child.prototype.constructor = Child;
+// 添加Child自定义的原型方法
+Child.prototype.intro = function() {
+  console.log(\`my name is \${this.name}, \${this.age} age.\`);
+}
+
+const c1 = new Child("小明", 18);
+const c2 = new Child("小红", 17);
+console.log(c1.name, c1.age); // 小明, 18
+console.log(c2.name, c2.age); // 小红, 17
+c1.appendChildren('小明同学');
+c2.appendChildren('小红同学');
+console.log(c1.children, c2.children); // ['小明同学'] ['小红同学']
+
+console.log(c1 instanceof Child); // true

以上通过将Child的prototype对象的原型设置为Parent的prototype对象,这样首先继承了Parent的prototype对象中的属性和方法,然后将Child的prototype的constructor指向Child自己,这是正常情况,然后添加Child自己的属性和方法intro。在Child函数体内借用Parent构造函数继承实例属性和方法(11行),这样在创建Child实例时,不会实例化父类的构造函数。

这种方法巧妙的将父类原型方法拿到自己身上,实例方法也会在new时巧妙借用,而且父类构造器只会执行一次,在修改子类原型后,通过改变prototype.constructor属性为自己,又可以冒充正常的原型对象,并且instanceof等判断原型的方法也可以正常工作,这其实就是组合继承和寄生继承的加强版,这种方式比较成熟,通常情况下以这个作为继承版本。来看看原型结构: iShot_2022-10-30_08.01.14.png 从上图可以很明显的看到继承关系,推荐使用。

  • 优点:不会实例化父类构造器,巧妙的借用父类实例和原型属性

class继承

ES6也引进了classextends关键字,用于类似Java等面向对象语言类的实现和继承,但在JS中其本质还是function,看下使用:

js
class Parent {
+  constructor(name) {
+    this.name = name;
+    this.children = [];
+  }
+  say() {
+    console.log(\`my name is \${this.name}\`);
+  }
+  appendChildren(child) {
+    this.children.push(child);
+  }
+
+  static getUUid() {
+    return "parent";
+  }
+}
+
+class Child extends Parent {
+  constructor(name, age) {
+    super(name);
+    this.age = age;
+  }
+
+  intro() {
+    console.log(\`my name is \${this.name}, \${this.age} age.\`);
+  }
+}
+const c1 = new Child("小明", 18);
+const c2 = new Child("小红", 17);
+console.log(c1.name, c1.age); // 小明, 18
+console.log(c2.name, c2.age); // 小红, 17
+c1.appendChildren("小明同学");
+c2.appendChildren("小红同学");
+console.log(c1.children, c2.children); // ['小明同学'] ['小红同学']
+console.log(Child.getUUid()); // parent

以上就是class的继承使用方式,从中可看到Child继承了父类的实例属性,也继承了父类的原型,Child类也继承了父类的静态属性(代码13,35行)。

需要注意的是在Child的构造器中调用了super(name)(20行),这个是什么?这其实就是执行了父类的构造函数,如果你了解过如Java的继承,那这个一定不陌生。那在JS中如何解释这个呢,其实在寄生组合继承中借用父类实例属性时会执行父类构造函数并将this指向子类,而这里super方法其实就是这个逻辑,并向Parent传递了参数name,这样子类就会拥有父类的实例属性name、children,并且规定:在class继承中若子类执行constructor构造器时必须执行super方法。另外,super在子类构造函数中必须先于this属性相关操作调用,这又是为什么?其实就是让子类的属性能够覆盖父类的实例属性,这样子类可以更加灵活的修改父类的实例属性。

来看下实例的原型结构: iShot_2022-10-30_09.04.01.png 基本和我们自己写的寄生组合式继承的对象一致,在途中可以很明显看到class关键字继承。

上面给Parent添加了静态属性getUUid,Child也会拥有相同的静态属性,那什么是静态属性呢?在class中用static来标识这是类的静态属性或方法,而以函数的角度去看,其实就是函数的一个普通属性而已,来看下面代码:

js
function App() {}
+// 设置App静态方法 getUUid
+App.getUUid = () => console.log('static method');

通过上面代码了解到静态属性就是一个函数的普通属性而已,而class其实也是这个道理(本质也是函数),在上面的继承中,Child也会继承Parent的静态属性,那不就是Child.__proto__ = Parent吗?我们来证明下: iShot_2022-10-30_09.11.43.png 果然是这样,那我们就明白了class继承时,也会将构造器本身作为子类构造器的原型来让其拥有其静态属性,即Child.__proto__=Parent,来看下Child本身的原型: iShot_2022-10-30_09.22.04.png 这样Child也会拥有Parent自身上其他的属性。在寄生组合继承中,也来稍微改造,让其支持静态属性这个特点:

js
Child.__proto__ = Parent;
+// 或
+Object.setPrototypeOf(Child, Parent);

以上便是class继承,那class真正的实现方式是如何的呢,这里我们可以对class这种语法进行降级处理看看其实现方式,你可以使用typescript编译器直接编译或使用babel,这里为了方便使用tsc直接编译:

js
var __extends = (this && this.__extends) || (function () {
+  var extendStatics = function (d, b) {
+    extendStatics = Object.setPrototypeOf ||
+      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+    return extendStatics(d, b);
+  };
+  return function (d, b) {
+    if (typeof b !== "function" && b !== null)
+      throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+    extendStatics(d, b);
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  };
+})();
+var Parent = /** @class */ (function () {
+  function Parent(name) {
+    this.name = name;
+    this.children = [];
+  }
+  Parent.prototype.say = function () {
+    console.log("my name is " + this.name);
+  };
+  Parent.prototype.appendChildren = function (child) {
+    this.children.push(child);
+  };
+  Parent.getUUid = function () {
+    return "parent";
+  };
+  return Parent;
+}());
+var Child = /** @class */ (function (_super) {
+  __extends(Child, _super);
+  function Child(name, age) {
+    var _this = _super.call(this, name) || this;
+    _this.age = age;
+    return _this;
+  }
+  Child.prototype.intro = function () {
+    console.log("my name is " + this.name + ", " + this.age + " age.");
+  };
+  return Child;
+}(Parent));

其实也没那么难,感兴趣的可以自己看看。

总结

本篇主要讲解了什么是原型、原型链,JS是如何从原型链中查找属性的,学到了设置原型的几种方法,以及new的本质和作用。通过原型延伸到JS的继承方式,对比不同的继承让原型及原型链的知识进一步巩固。

`,115);function D(F,y,i,B,A,E){const a=n("Reward"),l=n("Gitalk");return t(),o("div",null,[r,s(a),s(l)])}const d=p(c,[["render",D]]);export{b as __pageData,d as default}; diff --git a/assets/frontend_js_proto-inherit.md.I_l70cVG.lean.js b/assets/frontend_js_proto-inherit.md.I_l70cVG.lean.js new file mode 100644 index 000000000..5f84b4964 --- /dev/null +++ b/assets/frontend_js_proto-inherit.md.I_l70cVG.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"原型、原型链与继承(构造函数继承、组合继承、寄生组合式继承、class继承)","description":"一文吃透JavaScript的原型、原型链和继承概念和使用技巧,让你明白原型链继承、构造函数继承、原型式继承、组合式继承、寄生式继承、寄生组合式继承、class继承等多种继承方式","frontmatter":{"title":"原型、原型链与继承(构造函数继承、组合继承、寄生组合式继承、class继承)","description":"一文吃透JavaScript的原型、原型链和继承概念和使用技巧,让你明白原型链继承、构造函数继承、原型式继承、组合式继承、寄生式继承、寄生组合式继承、class继承等多种继承方式","keywords":"原型概念,原型链概念,什么是原型,继承,前端继承,原型链继承,构造函数继承,组合继承,寄生式继承,寄生组合式继承,class继承","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/proto-inherit.md","filePath":"frontend/js/proto-inherit.md","lastUpdated":1706247228000}'),c={name:"frontend/js/proto-inherit.md"},r=e("",115);function D(F,y,i,B,A,E){const a=n("Reward"),l=n("Gitalk");return t(),o("div",null,[r,s(a),s(l)])}const d=p(c,[["render",D]]);export{b as __pageData,d as default}; diff --git a/assets/frontend_js_scope-closure.md.fqZFaNHm.js b/assets/frontend_js_scope-closure.md.fqZFaNHm.js new file mode 100644 index 000000000..413e808f8 --- /dev/null +++ b/assets/frontend_js_scope-closure.md.fqZFaNHm.js @@ -0,0 +1,82 @@ +import{_ as p,c as o,J as s,V as e,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"作用域、执行上下文、作用域链和闭包","description":"作用域、执行上下文、作用域链和闭包的理解","frontmatter":{"title":"作用域、执行上下文、作用域链和闭包","description":"作用域、执行上下文、作用域链和闭包的理解","keywords":"作用域,作用域链,执行上下文,闭包,JS编译,变量声明,变量提升,暂时性死区,JS此法环境,设计模式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/scope-closure.md","filePath":"frontend/js/scope-closure.md","lastUpdated":1706247228000}'),t={name:"frontend/js/scope-closure.md"},r=e(`

作用域、执行上下文、作用域链和闭包

关于作用域以及执行上下文、闭包等概念都是JS的基础知识,可能平时学习时并没有仔细研究过,对其缺乏一定的认识,这往往会变成深入了解JS的绊脚石。再者其也成为面试的频考点,如果了解这方面的知识,面试就会游刃有余,当然对提升自己对JS的认识也有很大的帮助

变量声明与提升

对于如:JS、Java等高级编程语言,计算机本身是不认识也就读不懂其含义也就无法正常运行,因此对于高级编程语言而言,在真正的被计算机执行前都会进行一次编译,编译成计算机可以读懂的0、1指令才可以被执行。我们知道JS有自己的V8引擎,它会对JS做解释运行,也就会涉及到变量声明,变量调用等等一系列操作,那么JS引擎是如何处理变量的,这里我们往下看。

变量声明

首先要知道JS是动态解释脚本语言,也就是会一行一行解释,但进行解释前JS引擎会对代码进行语法分析,也就是变量声明等一系列的处理,生成对应的抽象语法树(AST),然后进行编译器/优化器转化成字节码或机器码执行。如下面一段代码,这是一段很普通的定义变量的代码块,结果已经标识出来了,看和你想的一致不。首先语法分析时,JS引擎会扫描当前(这里指全局)作用域的变量,如上name、age然后定义他们,但并没有赋值也就是值为undefined,所以如果当前作用域一个变量没有定义前去访问它并不会报错,而是打印出undefined(1,2,4行)也就是未定义值的变量。而赋值只会在JS引擎解释到当前赋值操作时才会真正赋值(6行),然后在7行再次打印name时,就正确打印了name的值,因为此时name已经进行赋值了,而最后一行访问不存在的addr变量时则会报错。

js
console.log(age); // undefined
+console.log(name); // undefined
+var name;
+console.log(name); // undefined
+var age = 1;
+name = "Tom";
+console.log(name); // Tom
+console.log(addr); // addr is not defined

上面我们已经了解了JS会先进行语法分析声明变量,然后动态解释脚本进行赋值、执行等相关操作,以上都是关于普通变量的声明,而函数的声明会有点点区别,接着看下面代码:

js
run(); // run...
+function run() { console.log('run...'); };

上面代码定义了一个名为run的普通函数,而在首行定义函数前就执行了此函数,却正确的打印出了值,读者可能会在此产生疑问,前面同样是提前访问变量却打印的时undefined,按理说这里直接执行函数会报错啊(undefined()?),带着疑问我们一探究竟。原来在语法分析时,函数会作为一等公民,会被提前到所有普通变量声明前进行声明,也就是说会先声明函数,紧接着是普通变量(针对当前作用域来说的),并且和普通变量声明不一样的是,函数声明会带上自己的实体也就是提前声明时就关联到自己的值了,所以为什么以上直接执行run时可以正确执行,就是因为run首先被提前声明了,并且也有对应的值。

不过一等公民也是有约束的,不是所有的函数都会在提前声明有自己的实体,只有函数式声明才会满足一等公民的要求,而变量式声明的函数和普通变量没区别,来看下面代码run还是会正常执行,而walk函数将会报错walk is not a function,此时的walk就是undefined,相当于执行了undefined()当然会报错。

js
run(); // run...
+// 函数式声明
+function run() { console.log('run...'); };
+
+walk(); // walk is not a function
+// 变量式申明 并不会带上自己的实体
+var walk = function() { console.log('walk...'); };

以上便于关于变量声明的理解和一些细节问题,接下来看下什么是变量提升、暂时性死区等等

变量提升和暂时性死区

所谓的变量提升是关于作用域的问题,在JS中有全局作用域、块级作用域和函数作用域说法,或者说当前作用域和其他作用域(关于作用域的概念下面会讲,这里简单的了解下不做过深解释)。JS中变量的声明只能在当前作用域或当前作用域以内的作用域访问到,若在某个代码块中声明的变量是不能在外部作用域中访问到的。

js
var global = "global"; // 全局作用域 声明了变量 global
+{
+  var inner = "inner"; // 当前代码块作用域中声明了 inner 变量
+  console.log(global); // global
+}
+console.log(inner); // inner

如上代码分别定义了全局变量global和局部变量inner,正如前面讲的当前作用域以内的作用域的可以访问到当前作用域的变量,第4行打印出了全局变量global,而在最后一行打印内部作用域变量inner时也打印出了正确的值,这和我们讲的就有出入了,这里就需要了解什么是变量提升了。在ES6以前声明变量都是用关键字var进行声明的,而这种声明有一个坏处就是所有的变量都会提升到全局作用域,这也就是为什么最后一行可以访问到inner的原因,很显然这种声明会有很多弊端,比如内部作用域声明的变量若是和全局变量同名将会覆盖全局的变量,也就会污染全局变量。

为解决这个问题,ES6推出了新的声明变量的关键字letconst,前者声明的变量可以不用初始化赋值,并且可以在后面修改,而后者定义的变量都是常量,也就是赋值后不能再修改,并且初始化时必须赋值否则报错,两者声明的变量都是块级作用域(也就是当前作用域的),都不会发生变量提升,并且不能在当前作用域被重复定义。

js
let global = "global"; // 全局作用域 声明了变量 global
+{
+  let inner = "inner"; // 当前代码块作用域中声明了 inner 变量
+  console.log(global); // global
+}
+console.log(inner); // inner is not defined
+let global = "global2"; // global has already been declared

如上换成了let定义变量后,在第6行访问块级作用域变量inner时报错,最后一行再次定义已经定义过的global时也会报错。接下来看看暂时性死区,前面用var声明变量前,访问该变量会打印undefined而不会报错,那全部换成let声明后呢,来看下面一段代码:

js
console.log(block); // block is not defined
+let block = "block";
+{
+  console.log(block); // Cannot access 'block' before initialization
+  let block = "inner block";
+  console.log(block); // inner block
+}
+console.log(block); // block

和前面的代码一样,只不过换成了let关键字。当运行时第一行就会报错not defined说是没定义,而在代码块中第一次访问(第4行)block时却也会报错Cannot access 'block' before initialization,不是说内部作用域可以访问外部作用域吗,为什么这里会报错。当前代码块中{}也声明了block(第5行),而访问变量时会优先取当前作用域的变量。这里需要知道用let关键字变量并没有改变JS引擎会提前声明变量的规则,JS首先会对当前作用域的变量进行申明,如全局的block、块级(局部)作用域的block,此时并不能被访问到,只不过JS引擎自己知道已有这些变量,只是我们不能使用,所以在第4行时访问block,此时访问的是当前块级作用域的block,但是还不能使用,所以直接访问会报错。也就是let/const定义的变量未声明之前是不能使用的,这就是暂时性死区。

再来看看const,定义时必须要赋值否则报错,定义后不能修改:

js
const a; // Missing initializer in const declaration
+
+const b = 2;
+b = 1; // Assignment to constant variable

以上就是关于变量声明、变量提升和暂时性死区相关概念,接下来看作用域。

作用域

作用域和词法环境其实很简单,说白了就是关于变量能为谁提供服务、变量的可见性和作用范围。为了不让变量提升影响到,以下都会以let关键字进行变量的声明,首先我们来看下面一段代码:

js
// global scope
+let name = "global";
+{ // block scope
+  let block = "block";
+}
+function fn() {
+  let age = 1;
+  console.log(age);
+}
+fn(); // 1
+console.log(name); // global
+console.log(block); // block is not defined
+console.log(age); // age is not defined

从上面就已经展示了作用域的概念,可以正常访问全局的name,但当访问全局中没有定义的block、age变量时就会报错,因为他们没有在全局中定义。所以作用域就像个堡垒一样把控着变量的可见性,让不同作用域的变量互不干扰和污染

在JS中有全局作用域函数作用域块级作用域之分,所谓全局作用域就是在代码最顶层定义的变量,如在浏览器宿主环境中全局定义的变量都可以用window访问到,node中都会被global访问到。诸如在函数体中定义的变量、方法等等都是函数作用域中的变量,在函数外部是访问不到的,外界只能执行函数然后才会知道内部的内容。而块级作用域就是用let/const关键字定义的变量只能在当前代码块中使用,如:{}函数体等代码块,也是外部不能访问。

作用域是可以嵌套的,就好比我们的代码一样嵌套函数等等,内部作用域可以访问外部作用域的变量,而外部无法访问内部变量:

js
let out = "out"; // 1
+function start() {
+  let name = "start";
+  console.log(out); // out 2
+  function inner () {
+    let age = 1;
+    console.log(name); // start 3
+  }
+}
+start();

如上代码有三个作用域:全局、函数start、函数inner,从访问方向上只能从内部访问外部也就是3>2>1,反之是不可以的。

词法环境

在展开作用域链前先来说说词法环境,在JS引擎刚开始是对代码进行静态分析时,会对每个变量、函数标记它们的位置、作用域等一些信息,这样在运行相关代码时可以访问到自己作用域的属性。就比如一个函数在返回函数时,不管这个函数最后在哪调用,都可以正确的访问到自己的词法环境中提供的变量。

js
function outer() {
+  let name = "outer";
+  return function() {
+    console.log(name);
+  }
+}
+const fn = outer();
+// 不管这个函数在哪调用,都会正确的打印出name的值
+fn(); // outer

以上代码会返回有一个匿名函数,函数内部会打印outer内部定义的变量的name,当执行这个匿名函数时总是会打印出outer。因为返回的匿名函数会记住自己的此法环境,记录着它出生时周围的环境作用域信息,所以在执行它的时候总能够得到正确的值。

作用域链

作用域链是一种访问方式,可以类比一下原型链。如下代码,当执行app方法时可以正确的打印出name的值,代码中包含了全局作用域和函数作用域,也就是说作用域链决定了你可以访问到哪些不属于当前作用域的一些变量等信息,前面也说了内部作用域可以访问外部的作用域,外部不能访问内部。根据词法环境最初定义app方法时,会记住自己的当前的作用域,如果访问当前作用域不存在的变量时,会访问外层的作用域,直到null。

js
let name = "outer";
+function app() {
+  console.log(name);
+}

从当前作用域指向外层作用域,外层也指向它的外层作用域直到null,这就是作用域链,和原型链的概念差不多,但原型链针对对象属性而言的,作用域链是针对变量可访性的。

执行栈

由于JavaScript是单线程的,所有的代码都会在同一个地方执行即:执行栈(Call Stack),它是个LIFO结构(后进先出),用于储存所有代码执行期间的执行上下文。要明白执行栈首先来了解下JS的内存结构,看下图简单的画了JS内存部分图: JS内存图 在JS最初运行时,会以整体script代码为基础创建全局上下文,然后推入执行栈中,当遇到一个函数时会为函数创建新的执行上下文,并推入执行栈中。对于一些异步任务,JS会在 Eventloop 的作用下,不断将任务队列中的任务送入执行栈中执行。当当的任务执行完毕时会从执行栈中弹出,进行垃圾回收并释放掉相关的资源。

执行上下文

执行上下文主要是为当前代码块服务的,在刚开始运行代码时,会创建全局上下文并推入执行栈中。执行上下文包含了当前运行代码的变量对象和词法环境。对于作用域的范围有全局变量对象GO和局部变量对象VO,变量对象主要存储var声明的变量。而词法环境则记录了代码的位置和作用域let/const、函数等变量以及外部的词法环境。当运行一个新的函数时,也会创建一个新的函数上下文并推入执行栈中,代码在运行时会从执行上下文中访问到范围内的变量。 Call Context

闭包

闭包是前端的高频话题,那么究竟什么是闭包呢?来看一段代码:

js
for (var i = 0; i < 5; i ++) {
+  setTimeout(() => console.log(i));
+}
+// 以上都会打印 5 5 5 5 5

以上代码打印的值都是5,为什么呢?首先这个会涉及到异步编程和eventloop,循环体中的代码并不会执行,而在循环完后执行,此时i已经变成5了,因为setTimeout内部引用到了外部的作用域,所以可以访问到i的值5。那么只要给每次循环内的代码重新引用每次循环的i的值,就可以打印出正确的值,简单试下闭包:

js
for (var i = 0; i < 5; i ++) {
+  ((i) => setTimeout(() => console.log(i)))(i);
+}
+// 0, 1, 2, 3, 4

上面对setTimeout包了一层使其变为IIFE(立即执行函数),并将每次循环时的i作为参数传递进去,这样setTimeout执行时就可以正确访问到i的值了。

当内部作用域引用了外部作用域的参数、变量或函数时,就会形成闭包。

由于全局作用域的存在,访问到外部变量的函数都会存在闭包,只是这种闭包并没有什么意义。

闭包的优点和缺点

闭包有很多优点,可以对内部功能进行封装,防止变量污染,如下定义一个计数器:

js
function counter() {
+  let count = 0;
+  return function () {
+    return count++;
+  }
+}
+let count = counter()
+console.log(count()); // 0
+console.log(count()); // 1

当一个函数被返回出来的时并形成闭包时,生成的对象会一直对函数内部的作用域变量进行引用,所以如果不清除掉外部变量,就会存在内存泄漏的风险。针对以上代码在不用count时,手动清除变量,进行内存的回收:

js
count = null; // 垃圾回收

总结

本文主要讲了变量声明、提升和暂时性死区的本质,接着又讲了什么是作用域、执行上下文、作用域链和执行栈的作用。希望通过本文可以让你对JS有更深的认识。

`,60);function i(y,F,D,d,u,b){const a=n("Reward"),l=n("Gitalk");return c(),o("div",null,[r,s(a),s(l)])}const B=p(t,[["render",i]]);export{m as __pageData,B as default}; diff --git a/assets/frontend_js_scope-closure.md.fqZFaNHm.lean.js b/assets/frontend_js_scope-closure.md.fqZFaNHm.lean.js new file mode 100644 index 000000000..0c8066559 --- /dev/null +++ b/assets/frontend_js_scope-closure.md.fqZFaNHm.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"作用域、执行上下文、作用域链和闭包","description":"作用域、执行上下文、作用域链和闭包的理解","frontmatter":{"title":"作用域、执行上下文、作用域链和闭包","description":"作用域、执行上下文、作用域链和闭包的理解","keywords":"作用域,作用域链,执行上下文,闭包,JS编译,变量声明,变量提升,暂时性死区,JS此法环境,设计模式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/js/scope-closure.md","filePath":"frontend/js/scope-closure.md","lastUpdated":1706247228000}'),t={name:"frontend/js/scope-closure.md"},r=e("",60);function i(y,F,D,d,u,b){const a=n("Reward"),l=n("Gitalk");return c(),o("div",null,[r,s(a),s(l)])}const B=p(t,[["render",i]]);export{m as __pageData,B as default}; diff --git a/assets/frontend_lowcoding_base.md.BKDSIX3v.js b/assets/frontend_lowcoding_base.md.BKDSIX3v.js new file mode 100644 index 000000000..12450cd05 --- /dev/null +++ b/assets/frontend_lowcoding_base.md.BKDSIX3v.js @@ -0,0 +1 @@ +import{_ as o,c as a,o as t,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"低代码","description":"","frontmatter":{"title":"低代码"},"headers":[],"relativePath":"frontend/lowcoding/base.md","filePath":"frontend/lowcoding/base.md","lastUpdated":1706247228000}'),s={name:"frontend/lowcoding/base.md"},d=e("h1",{id:"lowcoding",tabindex:"-1"},[n("lowcoding "),e("a",{class:"header-anchor",href:"#lowcoding","aria-label":'Permalink to "lowcoding"'},"​")],-1),c=[d];function r(i,l,_,f,p,m){return t(),a("div",null,c)}const w=o(s,[["render",r]]);export{g as __pageData,w as default}; diff --git a/assets/frontend_lowcoding_base.md.BKDSIX3v.lean.js b/assets/frontend_lowcoding_base.md.BKDSIX3v.lean.js new file mode 100644 index 000000000..12450cd05 --- /dev/null +++ b/assets/frontend_lowcoding_base.md.BKDSIX3v.lean.js @@ -0,0 +1 @@ +import{_ as o,c as a,o as t,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"低代码","description":"","frontmatter":{"title":"低代码"},"headers":[],"relativePath":"frontend/lowcoding/base.md","filePath":"frontend/lowcoding/base.md","lastUpdated":1706247228000}'),s={name:"frontend/lowcoding/base.md"},d=e("h1",{id:"lowcoding",tabindex:"-1"},[n("lowcoding "),e("a",{class:"header-anchor",href:"#lowcoding","aria-label":'Permalink to "lowcoding"'},"​")],-1),c=[d];function r(i,l,_,f,p,m){return t(),a("div",null,c)}const w=o(s,[["render",r]]);export{g as __pageData,w as default}; diff --git a/assets/frontend_micro-frontend_base.md.50Wy2Q-k.js b/assets/frontend_micro-frontend_base.md.50Wy2Q-k.js new file mode 100644 index 000000000..95fde7d0e --- /dev/null +++ b/assets/frontend_micro-frontend_base.md.50Wy2Q-k.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"微前端","description":"","frontmatter":{"title":"微前端"},"headers":[],"relativePath":"frontend/micro-frontend/base.md","filePath":"frontend/micro-frontend/base.md","lastUpdated":1706247228000}'),r={name:"frontend/micro-frontend/base.md"},s=e("h1",{id:"微前端",tabindex:"-1"},[n("微前端 "),e("a",{class:"header-anchor",href:"#微前端","aria-label":'Permalink to "微前端"'},"​")],-1),d=e("p",null,"// 待补充...",-1),c=[s,d];function i(l,_,f,m,p,h){return o(),a("div",null,c)}const x=t(r,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/frontend_micro-frontend_base.md.50Wy2Q-k.lean.js b/assets/frontend_micro-frontend_base.md.50Wy2Q-k.lean.js new file mode 100644 index 000000000..95fde7d0e --- /dev/null +++ b/assets/frontend_micro-frontend_base.md.50Wy2Q-k.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"微前端","description":"","frontmatter":{"title":"微前端"},"headers":[],"relativePath":"frontend/micro-frontend/base.md","filePath":"frontend/micro-frontend/base.md","lastUpdated":1706247228000}'),r={name:"frontend/micro-frontend/base.md"},s=e("h1",{id:"微前端",tabindex:"-1"},[n("微前端 "),e("a",{class:"header-anchor",href:"#微前端","aria-label":'Permalink to "微前端"'},"​")],-1),d=e("p",null,"// 待补充...",-1),c=[s,d];function i(l,_,f,m,p,h){return o(),a("div",null,c)}const x=t(r,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/frontend_micro-program_index.md.xlVMmi6M.js b/assets/frontend_micro-program_index.md.xlVMmi6M.js new file mode 100644 index 000000000..e9ac83e06 --- /dev/null +++ b/assets/frontend_micro-program_index.md.xlVMmi6M.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,m as r,a as t}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"micro-program","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/micro-program/index.md","filePath":"frontend/micro-program/index.md","lastUpdated":1706247228000}'),n={name:"frontend/micro-program/index.md"},c=r("h1",{id:"micro-program",tabindex:"-1"},[t("micro-program "),r("a",{class:"header-anchor",href:"#micro-program","aria-label":'Permalink to "micro-program"'},"​")],-1),i=[c];function m(d,s,p,_,l,f){return o(),a("div",null,i)}const x=e(n,[["render",m]]);export{g as __pageData,x as default}; diff --git a/assets/frontend_micro-program_index.md.xlVMmi6M.lean.js b/assets/frontend_micro-program_index.md.xlVMmi6M.lean.js new file mode 100644 index 000000000..e9ac83e06 --- /dev/null +++ b/assets/frontend_micro-program_index.md.xlVMmi6M.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,m as r,a as t}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"micro-program","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/micro-program/index.md","filePath":"frontend/micro-program/index.md","lastUpdated":1706247228000}'),n={name:"frontend/micro-program/index.md"},c=r("h1",{id:"micro-program",tabindex:"-1"},[t("micro-program "),r("a",{class:"header-anchor",href:"#micro-program","aria-label":'Permalink to "micro-program"'},"​")],-1),i=[c];function m(d,s,p,_,l,f){return o(),a("div",null,i)}const x=e(n,[["render",m]]);export{g as __pageData,x as default}; diff --git a/assets/frontend_monitor_base.md.XPdYn5-o.js b/assets/frontend_monitor_base.md.XPdYn5-o.js new file mode 100644 index 000000000..00098005d --- /dev/null +++ b/assets/frontend_monitor_base.md.XPdYn5-o.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"前端监控系统","description":"","frontmatter":{"title":"前端监控系统"},"headers":[],"relativePath":"frontend/monitor/base.md","filePath":"frontend/monitor/base.md","lastUpdated":1706247228000}'),s={name:"frontend/monitor/base.md"},r=e("h1",{id:"前端监控系统",tabindex:"-1"},[n("前端监控系统 "),e("a",{class:"header-anchor",href:"#前端监控系统","aria-label":'Permalink to "前端监控系统"'},"​")],-1),d=e("p",null,"// 待补充...",-1),c=[r,d];function i(l,_,m,p,f,h){return o(),a("div",null,c)}const x=t(s,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/frontend_monitor_base.md.XPdYn5-o.lean.js b/assets/frontend_monitor_base.md.XPdYn5-o.lean.js new file mode 100644 index 000000000..00098005d --- /dev/null +++ b/assets/frontend_monitor_base.md.XPdYn5-o.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"前端监控系统","description":"","frontmatter":{"title":"前端监控系统"},"headers":[],"relativePath":"frontend/monitor/base.md","filePath":"frontend/monitor/base.md","lastUpdated":1706247228000}'),s={name:"frontend/monitor/base.md"},r=e("h1",{id:"前端监控系统",tabindex:"-1"},[n("前端监控系统 "),e("a",{class:"header-anchor",href:"#前端监控系统","aria-label":'Permalink to "前端监控系统"'},"​")],-1),d=e("p",null,"// 待补充...",-1),c=[r,d];function i(l,_,m,p,f,h){return o(),a("div",null,c)}const x=t(s,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/frontend_nestjs_base.md.J1ZEEYhI.js b/assets/frontend_nestjs_base.md.J1ZEEYhI.js new file mode 100644 index 000000000..a27c92658 --- /dev/null +++ b/assets/frontend_nestjs_base.md.J1ZEEYhI.js @@ -0,0 +1,1098 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const d=JSON.parse('{"title":"NestJS基础教程","description":"NestJS 是一个基于 Node.js 平台的现代化 Web 框架,它结合了 TypeScript、面向对象编程的思想和函数式编程的思想,提供了一种高效、可扩展的方式来构建可维护的 Node.js 应用程序","frontmatter":{"title":"NestJS基础教程","description":"NestJS 是一个基于 Node.js 平台的现代化 Web 框架,它结合了 TypeScript、面向对象编程的思想和函数式编程的思想,提供了一种高效、可扩展的方式来构建可维护的 Node.js 应用程序","keywords":"NestJS教程,node框架,Ioc架构,spring,NestJS MVC,NestJS优势,NestJS原理,装饰器原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nestjs.png"},"headers":[],"relativePath":"frontend/nestjs/base.md","filePath":"frontend/nestjs/base.md","lastUpdated":1706247228000}'),t={name:"frontend/nestjs/base.md"},c=e(`

NestJS基础教程

从本篇文章开始讲解node中最为出色的框架——NestJS,为什么说它出色,想必市面上已经议论纷纷了吧。如果你熟悉Spring框架那nest也会让你轻而易举的理解,基于typescript装饰器结合IOC让nest的框架设计更加清晰明了

NestJS 是一个基于 Node.js 平台的现代化 Web 框架,它结合了 TypeScript、面向对象编程的思想和函数式编程的思想,提供了一种高效、可扩展的方式来构建可维护的 Node.js 应用程序,相比express、koa、egg等几种框架nest更有出色的架构能力

Nest中使用了大量的IOC设计模式,它将控制权(即对象的创建、依赖关系的管理等)从应用程序代码中转移出去,交由容器来管理。这样做可以降低应用程序代码的复杂度,提高代码的可维护性和可重用性。在IOC模式中,容器通过控制反转(即控制权从应用程序代码中反转过来)来管理对象的创建和依赖关系。这样做有利于解耦应用程序中的各个组件,提高代码的可维护性和可重用性。而依赖注入(Dependency Injection,DI)则是IOC模式的一种实现方式,它可以帮助将对象之间的依赖关系自动注入到类中,使得代码更加简洁、可读性更高。在传统的编程模型中,对象之间的依赖关系是在代码中直接编写的。例如,一个类可能需要创建其他类的实例,或者需要依赖其他类的实例来完成某些操作。这样做会导致代码之间的耦合度很高,难以进行单元测试和代码重用

Nest真正的实现了架构的能力,以至于现在它可以变成出色的框架得到业界的重视。内部提供了中间件、拦截器、过滤器、异常、管道、鉴权设计理念,都非常值得我们思考和学习。学习nest最重要的就是它的设计思想,如:基本的架构设计、控制反转原理等等,从本篇开始讲nest的基本使用、实践、原理等等

安装

sh
# 1. git clone
+ git clone https://github.com/nestjs/typescript-starter.git nestjs-starter
+
+# 2. nest cli
+ npm i -g @nestjs/cli
+ nest new nestjs-template

程序入口

ts
// main.ts
+import { NestFactory } from '@nestjs/core';
+import { AppModule } from './app.module';
+
+async function bootstrap() {
+	// 返回应用实例 INestApplication
+  const app = await NestFactory.create(AppModule);
+  await app.listen(3000);
+}
+bootstrap();

nest可以与任何的HTTP框架对接,这里有两个开箱即用的HTTP框架:expressfastify,通常使用大家熟悉的express。这里可以传入express类型:

ts
import type { NestExpressApplication } from '@nestjs/platform-express';
+
+const app = await NestFactory.create<NestExpressApplication>(AppModule);

Module

模块是nest应用程序的起点,至少都会有一个module;通过module来给应用程序提供元数据,通常根据功能来划分不同的模块

module中有4个属性他们都有自己的作用:

  • controllers:提供当前模块的控制器来定义路由处理HTTP请求
  • providers:给当前module提供可注入的数据,如相关的service
  • imports:引入其他依赖或模块,如引入子模块、第三方模块等等
  • exports:暴露当前模块中的部分内容,以便其他引用了当前模块的模块可以使用当前暴露出的内容
ts
import { Module } from '@nestjs/common';
+import { AppController } from './app.controller';
+import { AppService } from './app.service';
+
+@Module({
+  exports: [AppService],
+  imports: [MockModule], 
+  controllers: [AppController],
+  providers: [AppService],
+})
+export class AppModule {}

controllers

controllers用来给当前模块提供路由控制器类,这类类都会被@Controller装饰器进行装饰,用来处理HTTP请求,控制器类并不直接参与业务,通常和业务分开

定义一个控制器类:

ts
@Controller('cat') // 统一前缀
+export class CatController {
+  @Get() // GET: cat
+  findAll() {}
+}

存放到当前模块的的controllers中

ts
@Module({ controllers: [CatController] })
+export class CatModule {}

这样cat module就拥有了Cat控制器中的路由 GET: /cat,后面会详细对Controller展开讲解,你可以点击这里跳转阅读

providers

providers用来给当前模块提供可注入的元数据,通过提供可注入的标识,在当前模块内部就可以注入使用被提供的内容。这些元数据可以是类、函数、值类型,通常类都会使用@Injectable进行装饰来标识当前类可以被注入,被@Injectable装饰器进行装饰的元数据不需要使用@Inject显式注入,而没有使用@Injectable装饰器的元数据需要显式注入

通常provider被缩写成数组形式[AClass, BClass]这样的,其本质还是 { provide: name, useClass: value }这种形式,前面说了值支持多种类型,不同类型会使用不同的值字段,其中包括:useValue(值)useClass(类)useFactory(函数),可以根据这些类型自定义prividers

  • useValue:用来直接提供值类型的元数据

    ts
    @Module({
    +  controllers: [MockController],
    +  providers: [
    +    // 定义string类型的值
    +    {
    +      provide: 'APP_NAME',
    +      useValue: 'nestjs-template',
    +    },
    +    // 定义数组类型
    +    {
    +      provide: 'APP_VERSIONS',
    +      useValue: [1, 2, 3],
    +    },
    +  ],
    +})
    +export class MockModule {}
    +
    +// 在当前模块的controller中使用inject注入使用
    +@Controller('mock')
    +export class MockController {
    +  constructor(
    +    @Inject('APP_NAME') // 显式注入
    +    private readonly APP_NAME: string,
    +    @Inject('APP_VERSIONS')
    +    private readonly APP_VERSIONS: string[],
    +  ) {
    +    console.log(this.APP_NAME, this.APP_VERSIONS);
    +  }
    +}
  • useClass:用来提供类类型的元数据,可以是可注入的类或者直接类的实例

    ts
    // 1. 定义可注入的类 Test
    +@Injectable()
    +export class Test {
    +  log() {
    +    console.log('test');
    +  }
    +}
    +
    +// 2. 提供元数据
    +@Module({
    +  controllers: [MockController],
    +  providers: [Test], // 直接写成数据形式或者下面方式
    +  // providers: [
    +  //   { provider: Test, useClass: Test }
    +  // ]
    +})
    +export class MockModule {}
    +
    +// 3. controller中使用
    +@Controller('mock')
    +export class MockController {
    +  constructor(
    +    private readonly testIns: Test, // 内部会查找当前模块所提供的providers标识进行注入
    +  ) {}
    +}

    除此之外还可以使用类的实例:

    ts
    // Test类也不需要 @Injectable 进行装饰,其余使用方法一致
    +
    +@Module({
    +  controllers: [MockController],
    +  providers: [
    +    {
    +      provide: Test,
    +      useValue: new Test(), // 提供实例
    +    },
    +  ],
    +})
    +export class MockModule {}
  • useFactory:值可以使用函数,这样也方便动态控制值;初次之外还可以注入其他类作为函数的参数使用

    ts
    @Module({
    +  controllers: [MockController],
    +  providers: [
    +    {
    +      provide: 'FUNC_PROVIDER',
    +      useFactory: () => 'func_provider', // 函数provider
    +    },
    +  ],
    +})
    +export class MockModule {}
    +
    +// 在当前模块的controller中使用inject注入使用
    +@Controller('mock')
    +export class MockController {
    +  constructor(
    +    @Inject('FUNC_PROVIDER') // 显式注入
    +    private readonly FUNC_PROVIDER: string,
    +  ) {
    +    console.log(this.FUNC_PROVIDER);
    +  }
    +}

    除此之外还支持异步函数、函数传参

    ts
    @Injectable()
    +class XXX {
    +  create() {
    +    console.log('xxx create');
    +    return ['create'];
    +  }
    +}
    +
    +
    +@Module({
    +  controllers: [MockController],
    +  providers: [
    +    {
    +      provide: 'FUNC_PROVIDER',
    +      useFactory: () => 'func_provider',
    +      scope: 'x'
    +    },
    +  ],
    +})
    +export class MockModule {}

provider还支持生命周期的定义,默认情况下提供的元数据的生命周期是全局跟着整个应用程序实例化一次,其支持的生命周期范围有:DEFAULT、TRANSIENT、REQUEST

ts
@Module({
+  controllers: [MockController],
+  providers: [
+    {
+      provide: 'USER_LIST',
+      useFactory: (xxx: XXX) => xxx.create(),
+      inject: [XXX], // 注入XXX 类,作为函数的参数
+      scope: Scope.DEFAULT
+    },
+    {
+      provide: "xxx",
+      useFactory: async() => return Promise.resolve(), // 异步provider
+      scope: Scope.REQUEST
+    }
+  ],
+})
+export class MockModule {}

三者区别:

生命周期作用范围
DEFAULT整个应用程序全局共享一个实例
TRANSIENT整个应用程序每个注入一个实例
REQUEST请求瞬间每个请求一个实例

imports

用来导入其他的模块,以便使用其他模块的服务和依赖。通常可以按功能划分模块或路由

ts
import { UserModule } from './user/user.module';
+
+@Module({
+  imports: [UserModule], // 导入User模块
+})
+export class AppModule {}

exports

导出当前模块的依赖以便其他模块可以使用

ts
@Module({
+  providers: [ Test ],
+  exports: [Test], // 这里导出Test provider
+})
+export class MockModule {}
+
+@Module({
+  imports: [MockModule],
+})
+export class AppModule {
+  // 这里可以直接注入Test,而不需要定义 providers
+  constructor(private readonly testIns: Test) {
+    this.testIns.log();
+  }
+}

动态模块

使用动态模块可以在不同的模块之间共享配置,共享模块是一种用于组织和重用代码的机制。共享模块可以定义一组公共的、可重用的服务、控制器、管道、拦截器等,这些组件可以被其他模块引用和使用

  1. 创建共享模块

    ts
    @Module({})
    +export class ShareModule {
    +  // 提供register方法,并返回固定格式
    +  static register(opts: { name: string }) {
    +    return {
    +      module: ShareModule,
    +      providers: [
    +        {
    +          provide: 'SHAREMODULE',
    +          // useValue: 'xxx',
    +          useValue: () => xxx(opts)
    +        }
    +      ]
    +    }
    +  }
    +}
  2. 使用共享模块

    ts
    @Module({
    +  imports: [
    +    // 注册模块
    +    ShareModule.register({ name: "Jack" })
    +  ]
    +})
    +export class AppModule {}

Controller

控制器用来接受具体的路由,可以通过路径前缀、域名来区分具体的路由

可以手动创建controller文件,对于初学者也可以使用nestjs的cli命令创建:

sh
# 创建名为 cat 的controller
+ nest n controller cat

路由分组

  1. 路由前缀控制

    类型定义:

    ts
    declare function Controller(prefix: string | string[]): ClassDecorator;

    例子:

    ts
    import { Controller } from '@nestjs/common';
    +
    +// 以cats开头的路径会走这里,如:/cats/all
    +@Controller("cats")
    +export class AppController {}
    +
    +@Controller(["cats", "dogs"])
    +export class AppController {}
  2. 域名控制

    类型定义:

    ts
    interface ControllerOptions {
    +    path?: string | string[];
    +    host?: string | RegExp | Array<string | RegExp>;
    +}

    例子:

    ts
    import { Controller } from '@nestjs/common';
    +
    +@Controller({
    +  host: "https://blog.usword.cn"
    +})
    +export class AppController {}
    +
    +@Controller({
    +  host: "https://blog.usword.cn",
    +  path: "/frontend"
    +})
    +export class AppController {}

路由定义

在控制器中定义具体的路由,如查询所有的猫咪,GET /cat/all;nestjs中内置了HTTP规范的请求方法装饰器,可以在具体的路由方法中轻松使用请求方式

ts
import { Controller, Get, Post } from '@nestjs/common';
+
+@Controller({ path: 'cat' })
+export class AppController {
+  // get请求 /cats/all
+  @Get('/all')
+  getAllCats() {
+    return [];
+  }
+  
+  // post请求 /cat 新增一个猫
+  @Post()
+  createCat() {
+    return true;
+  }
+  
+  // 动态路由
+  // get /cat/1
+  @Get(':id')
+  getCatById() {
+    return { id: 1, name: '小白' };
+  }
+  
+  // 通配符匹配
+  // get /cat/ab_cd
+  @Get('ab*cd')
+  getOne() {
+    return { id: 1, name: '小白' };
+  }
+}

除了get、post请求外,还有header、delete、options、patch等常见的http请求

参数处理

通常http请求时前端都会携带或多或少的数据传递给服务端,通过nestjs可以很好的拿到params、query、data等数据

  1. 处理param

    ts
    import { Controller, Get, Param } from '@nestjs/common';
    +
    +@Controller({ path: 'cat' })
    +export class AppController {
    +  @Get(':id')
    +  getCatById(@Param() params: any) {
    +    // 拿到整个params  {id: xxx}
    +    console.log(params);
    +    return { id: 1, name: '小白' };
    +  }
    +  
    +  @Get(':id')
    +  getCatById(@Param('id') id: number) {
    +    // 只获取id
    +    console.log(id);
    +    return { id: 1, name: '小白' };
    +  }
    +}
  2. 处理query

    ts
    import { Controller, Get, Query } from '@nestjs/common';
    +
    +@Controller({ path: 'cat' })
    +export class AppController {
    +  @Get(':id')
    +  getCatById(@Query() query: any) {
    +    // 拿到整个query
    +    console.log(query);
    +    return { id: 1, name: '小白' };
    +  }
    +  
    +  @Get(':id')
    +  getCatById(@Query('id') id: number) {
    +    // 只获取query中的id
    +    console.log(id);
    +    return { id: 1, name: '小白' };
    +  }
    +}
  3. 处理body

    ts
    import { Controller, Get, Body } from '@nestjs/common';
    +
    +@Controller({ path: 'cat' })
    +export class AppController {
    +  @Post(':id')
    +  getCatById(@Body() body: any) {
    +    // 整个body对象
    +    console.log(body);
    +    return { id: 1, name: '小白' };
    +  }
    +  
    +  @Post(':id')
    +  getCatById(@Body("name") name: string) {
    +    // 获取body的name属性
    +    console.log(name);
    +    return { id: 1, name: '小白' };
    +  }
    +}
  4. 处理表单数据(目前没有看到其它处理formdata的方法)

    ts
    import { Controller, Get, Body, UseInterceptors } from '@nestjs/common';
    +import { FileInterceptor } from '@nestjs/platform-express';
    +
    +@Controller({ path: 'cat' })
    +export class AppController {
    +
    +  @Post(':id')
    +  @UseInterceptors(FileInterceptor('')) // 使用表单拦截器对数据进行表单转换,会得到json数据
    +  getCatById(@Body("name") name: string) {
    +    // 获取body的name属性
    +    console.log(name);
    +    return { id: 1, name: '小白' };
    +  }
    +}

请求对象

在nestjs中一般不用获取原始的请求对象(request、response),使用nestjs提供工具就够用了如@Param、@Body等等;在使用了原始的请求对象后就会脱离nestjs的本身,如果注入了Res那么必须手动执行res原始的响应,不然nest将会被挂起

ts
import { Controller, Post, Req, Res } from '@nestjs/common';
+import { Request, Response } from 'express';
+
+@Controller({ path: 'cat' })
+export class AppController {
+  @Post(':id')
+  // 注入 req,res
+  getCatById(@Req() req: Request, @Res() res: Response) {
+    console.log(req.query);
+    // 使用原始的res进行数据响应
+    res.status(200).json({ code: 200, msg: '原始请求对象响应数据...' });
+  }
+}

状态码

ts
declare function HttpCode(statusCode: number): MethodDecorator;

例子:

ts
import { Controller, Get, HttpCode, HttpStatus } from '@nestjs/common';
+
+@Controller('user')
+export class UserController {
+  @Get()
+  @HttpCode(HttpStatus.OK)
+  getUser() {
+    return []
+  }
+}

头信息

ts
declare function Header(name: string, value: string): MethodDecorator;

例子:

ts
import { Controller, Get, Header } from '@nestjs/common';
+
+@Controller('user')
+export class UserController {
+  @Get()
+  @Header('Cache-Control', 'none') // 设置cache-control头信息
+  getUser() {
+    return [];
+  }
+}

也可以使用底层库相应对象进行处理

重定向

ts
declare function Redirect(url?: string, statusCode?: number): MethodDecorator;

例子:

ts
import { Controller, Get, HttpStatus, Redirect } from '@nestjs/common';
+
+@Controller('user')
+export class UserController {
+  @Get()
+  @Redirect('https://blog.usword.cn', HttpStatus.MOVED_PERMANENTLY)
+  getUser() {
+    return [];
+  }
+}

子域路由

ts
import { Controller, Get, HostParam } from '@nestjs/common';
+
+// host设置动态值 :host
+@Controller({ host: ':host.usword.cn', path: 'cat' })
+export class AppController {
+  @Get() // hostparam获取域名的host值
+  findCats(@HostParam('host') host: string) {
+    console.log(host);
+    return true;
+  }
+}

自定义装饰器

nestjs中除了提供一些常用的装饰器,难免会不满足业务中的使用,它也提供了自定义装饰器的功能,只要遵循一定的原则就可以实现自己的装饰器,本质底层还是装饰器和Reflect两者结合的结果

ts
import { ExecutionContext, createParamDecorator } from '@nestjs/common';
+import { Request } from 'express';
+
+// 获取http协议的参数装饰器
+export const Protocol = createParamDecorator(
+  (defaultValue: string, ctx: ExecutionContext) => {
+    if (defaultValue) return defaultValue;
+    const request = ctx.switchToHttp();
+    return request.getRequest<Request>().protocol;
+  },
+);
+
+// 使用
+import { Controller, Get } from '@nestjs/common';
+import { Protocol } from 'src/common/decorator';
+
+@Controller('mock')
+export class MockController {
+  @Get()
+  async getList(@Protocol() protocol: string) { // 自定义参数装饰器
+    console.log(protocol);
+    return protocol;
+  }
+}

Scope作用域

controller也支持provider的作用域生命周期,其内部含义和provide类似

生命周期

nest在module、controller和injectable的模块代码提供了生命周期钩子事件

Lifecycle hook methodLifecycle event triggering the hook method call
onModuleInit()Called once the host module's dependencies have been resolved.
onApplicationBootstrap()Called once all modules have been initialized, but before listening for connections.
onModuleDestroy()*Called after a termination signal (e.g., SIGTERM) has been received.
beforeApplicationShutdown()*Called after all onModuleDestroy() handlers have completed (Promises resolved or rejected); once complete (Promises resolved or rejected), all existing connections will be closed (app.close() called).
onApplicationShutdown()*Called after connections close (app.close() resolves).

nestjs生命周期模型

Service

service通常都用来处理具体的业务,给应用程序提供数据,通过数据库增删改查然后返回给控制器

service通常是个被@Injectable装饰的类,提供给模块的providers做为源数据的标识,这样注入service就可以使用

service例子:

ts
import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class AppService {
+  getHello(): string {
+    return 'Hello World!';
+  }
+}
+
+@Module({
+  imports: [],
+  providers: [AppService],
+})
+export class AppModule {}

依赖注入

nestjs中使用了大量了依赖注入,使用@Injectable装饰的类表示可被注入,@Inject用来注入可注入的依赖。通常使用@Injectable装饰的类不需要显式的使用Inject进行注入,内部会自动进行注入。所有注入的依赖都比在当前模块的providers中提供注入的标识,更多类型的依赖可以查看providers

使用

ts
// 定义可注入的类
+@Injectable()
+export class Test {
+  log() {
+    console.log('test');
+  }
+}
+
+// 提供注入的标识 provider
+@Module({
+  controllers: [MockController],
+  providers: [
+    Test,
+    // 非class的依赖
+    {
+      provide: 'APP_NAME',
+      useValue: 'nestjs-template',
+    },
+  ],
+})
+export class MockModule {}
+
+// 注入依赖
+@Controller('mock')
+export class MockController {
+  constructor(
+    // 不需要Inject显式注入,内部自动注入
+    private readonly testIns: Test,
+    @Inject('APP_NAME') // 显式注入
+    private readonly APP_NAME: string,
+  ) {}
+}

作用域

Injectable支持三种类型的作用域:DEFAULT、TRANSIENT、REQUEST

可选项 Optional

如果程序中注入了某个依赖,而该模块没有提供当前依赖,那么就会报错,使用可选注入可以解决报错

ts
// 注入依赖
+@Controller('mock')
+export class MockController {
+  constructor(
+    @Optional()
+    @Inject('APP_NAME') // 模块没有注入不会报错
+    private readonly APP_NAME: string,
+  ) {}
+}

应用配置

应用程序需要不同的配置文件分别在不同的环境进行运行,nestjs提供了@nestjs/config包来方便应用程序配置

在此包中包含了ConfigModuleConfigServiceregisterAs等几种工具方法,每个方法都有自己的作用

ConfigModule

ConfigModule用来加载配置文件,其包含forRootforFeature两个方法,前者为全局作用域,后者为当前面模块作用域

forRoot数据结构如下:

ts
{
+  envFilePath: string | string[]; // 定义env配置文件路径;默认加载根路径下的 .env
+  ignoreEnvFile: boolean; // 是否忽略env文件
+  isGlobal: boolean; // 是否为全局
+  validationSchema: any; // 验证配置
+  load: Array<ConfigFactory>; // 加载自定义的配置文件
+  // ...
+}

使用:

ts
@Module({
+  controllers: [MockController],
+  // 引入模块,这是必须的
+  imports: [
+    ConfigModule.forRoot({
+      envFilePath: resolve(__dirname, '../../.env'),
+    }),
+  ],
+})
+export class MockModule {}

ConfigService

加载好了配置后使用configService来获取配置

ts
@Controller('mock')
+export class MockController {
+  constructor(
+  	// 注入ConfigService
+    readonly configService: ConfigService<{ PORT: number }>,
+  ) {
+    const port = this.configService.get('PORT', 5000, { infer: true });
+    console.log(port);
+  }
+}

通过将ConfigService注入到程序中,使用其提供的get方法获取变量,get的类型定义如下:

ts
// 这里只举一个重载
+get(key, defaultValue, options: { infer: boolean; /*类型推断*/ })

自定义配置

使用load加载自定义的配置:

ts
// 可以将配置放到一个配置文件合理处理后导出
+export const Configuration = () => ({
+  PORT: process.env.PORT || 5000
+});
+
+@Module({
+  controllers: [MockController],
+  imports: [
+    ConfigModule.forRoot({
+      load: [Configuration], // 引入自定义配置
+    }),
+  ],
+})
+export class MockModule {}

registerAs 命名空间

对于前者的配置方案如果有嵌套的配置对于类型提示非常不友好(没嵌套也没类型推断),而且不同方面的配置冗余在一起对于后续维护不够友好,nest中提供了registerAs来定义命名空间

ts
// 定义 db 命名空间
+export const DatabaseConfiguration = registerAs('db', () => ({
+  host: process.env.DB_HOST || 'localhost',
+}));
+@Module({
+  controllers: [MockController],
+  imports: [ConfigModule.forFeature(DatabaseConfiguration)], // 这里注册命名空间变量
+})
+export class MockModule {}
+
+// 使用
+@Controller('mock')
+export class MockController {
+  constructor(
+    @Inject(DatabaseConfiguration.KEY) // 显式注入配置的KEY,这是必须的
+    readonly dbConfiguration: ConfigType<typeof DatabaseConfiguration>,
+  ) {
+    console.log(this.dbConfiguration.host);
+  }
+}

校验

nestjs中可以使用joi对一些环境变量进行类型校验和定义检查,不合法就报错提示

安装相关依赖:

sh
 yarn add joi

配置:

ts
import * as Joi from 'joi';
+
+@Module({
+  controllers: [MockController],
+  imports: [
+    ConfigModule.forRoot({
+      load: [Configuration, DatabaseConfiguration],
+      validationSchema: Joi.object({
+        PORT: Joi.number(),  // 必须是number
+        NODE_ENV: Joi.string().valid('development', 'production', 'testing'), // 必填且必须是这几个值中的一个
+      }),
+    }),
+  ],
+})
+export class MockModule {}

更多相关验证使用方式请访问文档

异步:forRootAsync({ useFactory: () => ({}) })

Middleware

middleware作用于应用路由,其生命周期为Request-Response,在middleware中必须调用next,不然程序请求将会挂起,内部基于koa的洋葱模型

使用middleware可以很轻松的创建通用的日志中间件

创建日志中间件,middleware需满足以下几点规则:

  • 使用@Injectable装饰作为提供者
  • 实现NestMiddleware类中的use方法
  • 必须调用next方法

创建配置

创建middleware:

sh
# 1. 使用cli生成
+ nest g middleware log --no-spec
+
+# 2. 或者自己创建

配置middleware:这里实现在每次HTTP请求时打印请求日志,包括请求方法、地址、时间、耗时

ts
// common/middleware/log.middleware.ts
+import { Injectable, NestMiddleware } from '@nestjs/common';
+import { Request, Response } from 'express';
+import { formatDate } from 'src/utils';
+
+// 1. 可注入的
+@Injectable()
+export class LoggerMiddleware implements NestMiddleware {
+  // 2. 实现NestMiddleware中use方法
+  async use(req: Request, res: Response, next: (error?: any) => void) {
+    const startTime = new Date();
+    const method = req.method;
+    const url = req.originalUrl;
+
+    // 响应结束时打印相关耗时
+    res.on('finish', () => {
+      console.log(
+        \`\${method?.toUpperCase()}: \${url}\\t\\t\\t 时间: \${formatDate(
+          startTime,
+        )}\\t 耗时: \${((+new Date() - +new Date(startTime)) / 1000)?.toFixed(
+          3,
+        )}s\`,
+      );
+    });
+    // 3. 必须调用next
+    next();
+  }
+}

注册

middleware的注册可以针对不同的范围,你可以选择对所有的路由生效,或者只针对某个路由,也可以针对某个请求方法等等,注册非常灵活,有关更多注册方式你可以点击这里参考文档

ts
@Module({
+  controllers: [AppController],
+  providers: [AppService],
+})
+export class AppModule implements NestModule {
+  // 全局配置中间件 需要实现 NestModule中configure方法
+  configure(consumer: MiddlewareConsumer) {
+    consumer.apply(LoggerMiddleware).forRoutes('*'); // 针对所有路由
+    // consumer
+    //   .apply(LoggerMiddleware)
+    //   .forRoutes({ path: 'mock', method: RequestMethod.GET });
+    // consumer
+    //   .apply(LoggerMiddleware)
+    //   .exclude('user')
+    //   .forRoutes({ path: 'mock*', method: RequestMethod.ALL });
+  }
+}

Exception Filter

nest内置异常层来捕获程序中没有处理的错误,如果程序中没有捕获错误将会在异常层被捕获。同时也提供了更加优化的异常使用如:HTTPException

nest中的filter、pipe、guard、interceptor可以在nest上下文以外、上下文中的module、controller、method以及param的位置使用,其中仅pipe支持在param位置使用

基本使用

ts
import {
+  Controller,
+  Get,
+  HttpException,
+  HttpStatus,
+} from '@nestjs/common';
+
+@Controller('mock')
+export class MockController {
+  @Get()
+  async getList() {
+    // 主动抛出 500 异常
+    throw new HttpException(
+      '主动抛出友好的500错误',
+      HttpStatus.INTERNAL_SERVER_ERROR,
+    );
+  }
+}
+
+// 当请求时返回一下结果
+{
+    "statusCode": 500,
+    "message": "主动抛出友好的500错误"
+}

HTTPException的类型定义如下:

ts
constructor(response: string | Record<string, any>, status: number, options?: HttpExceptionOptions);

内置filter

除了通用的HTTPException外,还包含了HTTP的所有状态码类型的异常,这样就可以直接使用不同状态的异常不需要再指定具体的状态码了

  • BadRequestException
  • UnauthorizedException
  • NotFoundException

示例:

ts
// 404
+new NotFoundException('页面不见了');

自定义filter catch

异常捕获层默认会有固定的错误格式返回客户端,我们也可以根据自己的需求控制错误的格式。要实现自定义错误格式需要实现ExceptipnFilter类中的catch方法,并使用@Catch装饰器装饰

sh
# 使用cli生成filter
+ nest g filter HttpFilter --no-spec

这里做一个HTTP错误捕获处理格式:

ts
import {
+  ArgumentsHost,
+  Catch,
+  ExceptionFilter,
+  HttpException,
+  HttpStatus,
+} from '@nestjs/common';
+import { Request, Response } from 'express';
+
+@Catch()
+export class HttpFilter implements ExceptionFilter {
+  // 实现catch方法
+  catch(exception: HttpException, host: ArgumentsHost) {
+    const ctx = host.switchToHttp();
+    const response = ctx.getResponse<Response>();
+    const request = ctx.getRequest<Request>();
+    const code =
+      exception instanceof HttpException
+        ? exception.getStatus()
+        : HttpStatus.INTERNAL_SERVER_ERROR;
+    const errorException =
+      exception instanceof HttpException
+        ? exception?.getResponse?.()
+        : exception;
+
+    // 定义错误格式
+    const error = {
+      code,
+      message:
+        typeof errorException === 'string'
+          ? errorException
+          : (errorException as any)?.message || errorException,
+      error: (errorException as any)?.error,
+      timestamp: new Date().toISOString(),
+    };
+    console.error(\`【HTTP_FILTER】\`, exception);
+
+    // 访问的是页面时渲染错误页面 (这里定义以api开始的代表接口数据)
+    const isAccessPage = !/^\\/(api|.*-api).*/i.test(request.originalUrl);
+    if (isAccessPage) {
+      // 渲染错误页面,对于页面模板的使用请查看后续的mvc文章
+      return response.render('exception/index', {
+        code,
+        message: error.message || error.error,
+      });
+    }
+
+    try {
+      response.status(200).json({ ...error });
+    } catch (error) {
+      response.end();
+    }
+  }
+}

绑定filter

在定义好HTTPException Filter后还需要绑定到应用程序中,前面说了filter、pipe、guard、interceptor可以在nest上下文以外、上下文中的module、controller、method以及param的位置使用,其中仅pipe支持在param位置使用。filter支持除param以外的位置绑定

  • 上下文以外

    ts
    // main.ts
    +import { HttpFilter } from './common/filter/http.filter';
    +
    +function bootstrap() {
    +  // 省略其他...
    +  app.useGlobalFilters(new HttpFilter());
    +}
  • module

    ts
    import { APP_FILTER } from '@nestjs/core';
    +import { HttpFilter } from './common/filter/http.filter';
    +
    +@Module({
    +  providers: [
    +    {
    +      provide: APP_FILTER,
    +      useClass: HttpFilter,
    +    },
    +  ],
    +})}
    +export class AppModule {}
  • controller

    ts
    import { Get, HttpException, HttpStatus, UseFilters } from '@nestjs/common';
    +import { HttpFilter } from 'src/common/filter/http.filter';
    +
    +@UseFilters(HttpFilter) // 使用 UseFilters装饰器绑定 filter
    +@Controller('mock')
    +export class MockController {
    +  @Get()
    +  async getList() {
    +    throw new HttpException(
    +      '主动抛出友好的500错误',
    +      HttpStatus.INTERNAL_SERVER_ERROR,
    +    );
    +  }
    +}
  • method

    ts
    import { Get, HttpException, HttpStatus, UseFilters } from '@nestjs/common';
    +import { HttpFilter } from 'src/common/filter/http.filter';
    +
    +@Controller('mock')
    +export class MockController {
    +  @UseFilters(HttpFilter) // 使用 UseFilters装饰器绑定 filter
    +  @Get()
    +  async getList() {
    +    throw new HttpException(
    +      '主动抛出友好的500错误',
    +      HttpStatus.INTERNAL_SERVER_ERROR,
    +    );
    +  }
    +}

以上不同的绑定方式作用的返回也不一样,应以实际的情况进行绑定,一般绑定到全局即可

当再次访问路由后,将会变成我们自定义的错误格式:

json
{
+    "code": 500,
+    "message": "主动抛出友好的500错误",
+    "timestamp": "2020-07-22T06:24:49.140Z"
+}

Pipe

pipe是nestjs中的管道技术主要用来对请求的数据进行转换和类型验证

基本使用

ts
import {
+  Controller,
+  Get,
+  ParseIntPipe,
+  Query,
+} from '@nestjs/common';
+
+@Controller('mock')
+export class MockController {
+  @Get()
+  async getList(
+    // @Query('id', ParseIntPipe)
+    @Query('id', new ParseIntPipe({ optional: true })) // id可选,如果不传id不会报错
+    id: number,
+  ) {
+    console.log(typeof id); // number
+    return id;
+  }
+}

绑定pipe

以上pipe绑定到了参数上,除了参数外,还支持nestjs上下文以外、module、controller、method

  • nestjs上下文以外

    ts
    app.useGlobalPipes(
    +  // 类型转换和验证pipe(常用)
    +  new ValidationPipe({
    +    // 删除发送过来的不存在的属性
    +    whitelist: true,
    +    // 将传过来的类型转换为定义的类型,转换为 string、number、boolean和自定义类型
    +    transform: true,
    +    transformOptions: {
    +      enableImplicitConversion: true, // 隐式转换
    +    },
    +  }),
    +);
  • module

    ts
    import { Module, ValidationPipe } from '@nestjs/common';
    +import { APP_PIPE } from '@nestjs/core';
    +
    +@Module({
    +  providers: [
    +    {
    +      provide: APP_PIPE,
    +      useValue: new ValidationPipe({
    +        // 删除前端发送过来的不存在的属性
    +        whitelist: true,
    +        // 将传过来的类型转换为定义的类型,转换为 string、number、boolean和自定义类型
    +        transform: false,
    +        transformOptions: {
    +          enableImplicitConversion: true, // 隐式转换
    +        },
    +      }),
    +    },
    +  ],
    +})
    +export class CommonModule {}
  • controller

    ts
    import { Controller, UsePipes, ValidationPipe } from '@nestjs/common';
    +
    +@UsePipes(new ValidationPipe({}), ParseIntPipe /* ... */)
    +@Controller('mock')
    +export class MockController {}

    controller、method都使用@UsePipes装饰器进行包装

  • method

    ts
    import { Controller, UsePipes, ValidationPipe } from '@nestjs/common';
    +
    +@Controller('mock')
    +export class MockController {
    +  @UsePipes(new ValidationPipe({}), ParseIntPipe /* ... */)
    +  @Get(':id')
    +  async getOne(@Param('id') id: number) {
    +    return id;
    +  }
    +}
  • param

    ts
    import { Controller, Get, Param, Body } from '@nestjs/common';
    +
    +@Controller('mock')
    +export class MockController {
    +  @Get(':id')
    +  async getOne(
    +    @Param('id', ParseIntPipe) id: number, // 转换为 number
    +    @Body(new ParseArrayPipe({ optional: true })) users: string[], // 转换为string[]
    +  ) {
    +    cosnole.log(id, users);
    +    return id;
    +  }
    +}

内置pipe

自定义pipe

除了内置的pipe外,nestjs中还支持自定义pipe,要实现自定义pipe需要实现PipeTransform类中的transform方法

sh
# 使用cli生成pipe
+ nest g pipe RequireId --no-spec

一个需要ID参数的Pipe:

ts
import {
+  ArgumentMetadata,
+  HttpException,
+  HttpStatus,
+  Injectable,
+  PipeTransform,
+} from '@nestjs/common';
+
+@Injectable()
+export class RequiredId implements PipeTransform {
+  transform(value: any, metadata: ArgumentMetadata) {
+    const id = typeof value === 'object' ? value?.id : value;
+    if (isNaN(parseInt(id))) {
+      // 错误的客户端请求
+      throw new HttpException('Id must be number', HttpStatus.BAD_REQUEST);
+    }
+    return parseInt(id);
+  }
+}

使用:

ts
@Controller('mock')
+export class MockController {
+  @Delete(':id')
+  async deleteOne(@Query(RequiredId) id: any) {
+    console.log(id, typeof id);
+    return true;
+  }
+}

Class-transformer、class-validator

nest中可以使用class-transformerclass-validator结合ValidationPipe进行数据格式转换和验证。更多使用详情查看这里以及响应序列化

创建数据模型:

ts
// dto/pagination.dto.ts
+import { Transform, Type } from 'class-transformer';
+import { IsNumber, IsOptional, IsPositive } from 'class-validator';
+
+export class PaginationQueryDto {
+  @IsOptional() // 可选
+  @Transform((val) => parseInt(val.value || 10)) // 对传入的值进行转换,转换失败默认10
+  @IsPositive() // 大于0  // 判断必须大于0
+  @Type(() => Number) // 类型为number
+  @IsNumber() // number
+  readonly limit: number = 10;
+
+  @IsOptional()
+  @Transform((val) => parseInt(val.value || 1))
+  @IsPositive() // 大于0
+  @Type(() => Number)
+  @IsNumber()
+  readonly offset: number = 1;
+}

配置validationPipe

ts
import { Module, ValidationPipe } from '@nestjs/common';
+import { APP_PIPE } from '@nestjs/core';
+
+@Module({
+  providers: [
+    {
+      provide: APP_PIPE,
+      useValue: new ValidationPipe({
+        // 删除发送过来的不存在的属性
+        whitelist: true,
+        // 将传过来的类型转换为定义的类型,转换为 string、number、boolean和自定义类型
+        transform: false,
+        transformOptions: {
+          enableImplicitConversion: true, // 隐式转换,'1' ===> 1
+        },
+      }),
+    },
+  ],
+})
+export class CommonModule {}

在路由中使用:

ts
@Controller('mock')
+export class MockController {
+  @Get()
+  // 请求时会对query的数据进行验证,如果不符合 PaginationQueryDto 将会报异常
+  async getList(@Query() query: PaginationQueryDto) {
+    console.log(query);
+    return query;
+  }
+}

这样对于请求时不合法的数据类型将会自动返回错误,如传入-1时:

json
{
+    "code": 400,
+    "message": [
+        "limit must be a positive number" // 必须是个正整数
+    ],
+    "error": "Bad Request",
+    "timestamp": "2020-07-22T07:50:32.472Z"
+}

Guard

guard是nestjs提供给应用程序进行鉴权守卫的手段,取代传统的middleware鉴权处理。guard在所有的middleware后执行,但会在所有pipe、interceptor前执行

基本使用

一个guard需要实现CanActivate类的canActivate方法,当返回结果为true时表示有权限,反之没权限

sh
# 使用ci生成guard
+ nest g guard Authentication --no-spec

定义路由鉴权守卫:

ts
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
+import { Reflector } from '@nestjs/core';
+import { Observable } from 'rxjs';
+import { AuthenticationRouteKey } from '../decorator';
+import { Request } from 'express';
+
+/**
+ * 控制某个路由守卫
+ */
+@Injectable()
+export class AuthenticationRouteGuard implements CanActivate {
+  // 获取元数据
+  constructor(private readonly reflector: Reflector) {}
+
+  // 实现 canActivate 方法
+  canActivate(
+    context: ExecutionContext,
+  ): boolean | Promise<boolean> | Observable<boolean> {
+    // 这里获取定义的元数据,因为这里的guard是针对某个路由的,元数据是在method上的,所以使用 getHandler 方法
+    const isRouteAuthenrication = this.reflector.get(
+      AuthenticationRouteKey,
+      context.getHandler(),
+    );
+    // 判断当前请求路由不需要鉴权直接放行
+    if (!isRouteAuthenrication) return true;
+    // TODO: 需要鉴权的这里简单的使用 authorization 头值是否等于route进行判断
+    // 通常获取用户信息进行鉴权
+    const ctx = context.switchToHttp();
+    const request = ctx.getRequest<Request>();
+    const key = request.headers.authorization;
+    return key === 'route';
+  }
+}

使用守卫:

ts
import { Controller, Get, Param, UseGuards } from '@nestjs/common';
+import { RegisterAuthenticationRoute } from 'src/common/decorator';
+import { AuthenticationRouteGuard } from 'src/common/guard/authentication-route.guard';
+
+@Controller('mock')
+export class MockController {
+  @RegisterAuthenticationRoute() // 设置元数据
+  @UseGuards(AuthenticationRouteGuard) // 设置路由守卫
+  @Get('user/:id')
+  getUserInfo(@Param('id') userId: string) {
+    console.log(userId);
+    return {
+      name: 'Jack',
+      age: 10,
+      sex: 1,
+    };
+  }
+}
+
+// 设置元数据 RegisterAuthenticationRoute
+export const AuthenticationRouteKey = 'Authentication-route-register';
+export const RegisterAuthenticationRoute = () =>
+  SetMetadata(AuthenticationRouteKey, true); // 主要是使用setMetadata方法

关于setMetadata的使用点击这里查看文档了解更多

绑定guard

上面使用@UseGuards在方法上进行了绑定,除此之外可以在Controller、module、上下文以外进行绑定,这里不再演示了

Interceptor

interceptor是nestjs提供的拦截器,通常用来对请求和响应数据进行拦截改造,很常见的axios对响应数据进行拦截处理,这里也通常对响应数据做一次包装进行返回,这样就可以形成统一的格式

sh
# 使用cli生成interceptor
+ nest g interceptor beauty-response --no-spec

自定义interceptor

自定以interceptor需要实现NestInterceptor类的intercept方法,该方法返回一个Observable类型数据,关于更多RxJS的使用,请查看相关文档

定义一个包装响应数据格式的拦截器:

ts
import {
+  CallHandler,
+  ExecutionContext,
+  Injectable,
+  NestInterceptor,
+} from '@nestjs/common';
+import { Response } from 'express';
+import { Observable, map } from 'rxjs';
+
+@Injectable()
+export class BeautyResponseInterceptor implements NestInterceptor {
+  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
+    const ctx = context.switchToHttp();
+    const response = ctx.getResponse<Response>();
+    const contentType = response.getHeader('Content-Type');
+    const isAttachment = response.getHeader('Content-Disposition');
+    const isJSON = /(text|json)/i.test(contentType as string);
+    // 流内容直接返回
+    if ((contentType && !isJSON) || isAttachment) {
+      return next.handle();
+    } else {
+      return next.handle().pipe(
+      	// 这里响应内容包裹了一层
+        map(data => ({
+          code: 200,
+          data,
+        })),
+      );
+    }
+  }
+}

绑定interceptor

interceptor也是支持nestjs上下文外全局绑定、module、controller、method等几种方式绑定,这里简单演示module绑定

ts
import { Module } from '@nestjs/common';
+import { APP_INTERCEPTOR } from '@nestjs/core';
+import { BeautyResponseInterceptor } from 'src/common/interceptor/beauty-response.interceptor';
+
+@Module({
+  privoders: [
+    {
+      provide: APP_INTERCEPTOR,
+      useClass: BeautyResponseInterceptor,
+    },
+  ]
+})
+export class CommonModule {}
+
+@Controller('api')
+class TestController {
+	@Get('users')
+	getUsers() {
+		return [1, 2, 3]; // 返回数据
+	}
+}

现在当访问GET: /api/users时会以我们定义的格式返回:

json
{
+  "code": 200,
+  "data": [1, 2, 3]
+}

是不是体会到了NestJS的强大了

Logger

logger的使用这里不做解释,比较简单可以自行翻阅文档

版本控制

有时候需要两种版本api同时存在,这时候可以使用版本来标识不同的路由。nest提供了解决不同版本的方案

温馨提示

对于前端来讲这种api版本场景可能很难遇到,此功能了解使用即可

启用版本控制:

ts
// main.ts
+// 版本控制
+app.enableVersioning({
+  type: VersioningType.URI, // 使用URL版本控制  v1、v2、v3
+});

版本控制支持多种形式的版本设置:url、header、media、自定义等等,这里使用URL来控制

基本使用

这里定义两个版本的方法来模拟不同版本

ts
import { Controller, Version, Get } from '@nestjs/common';
+
+// @Version('2') // 也可以对controller进行版本区分
+@Controller('mock')
+export class MockController {
+  // 版本控制
+  @Version('1') // path: /v1/mock/version
+  @Get('version')
+  getVersion1() {
+    return 'version1';
+  }
+
+  @Version('2') // path: /v2/mock/version
+  @Get('version')
+  getVersion2() {
+    return 'version2';
+  }
+}

打开终端分别访问接口:

sh
  ~ curl http://localhost:3000/v1/mock/version
+{"code":200,"data":"version1"}
+  ~ curl http://localhost:3000/v2/mock/version
+{"code":200,"data":"version2"}

自定义版本

自定义版本就是获取版本的逻辑是如何的,以下是官方通过custom-versioning-field头信息获取版本的自定义版本提取器

ts
const extractor = (request: FastifyRequest): string | string[] =>
+  [request.headers['custom-versioning-field'] ?? '']
+     .flatMap(v => v.split(','))
+     .filter(v => !!v)
+     .sort()
+     .reverse();
+app.enableVersioning({
+  type: VersioningType.CUSTOM,
+  extractor, // 自定义提取器
+});

任务调度

nest中提供了任务调度系统允许我们在固定的时间或时间间隔执行任务方法,任务调度可以很好解决一些需要定时执行的任务

安装

sh
 yarn add @nestjs/schedule
+ yarn add @types/cron -D

模块注册

要使用任务调度需要导入任务调度模块

ts
import { Module } from '@nestjs/common';
+import { TaskScheduleController } from './task-schedule.controller';
+import { ScheduleModule } from '@nestjs/schedule';
+
+@Module({
+  imports: [ScheduleModule.forRoot()], // 导入 ScheduleModule
+  controllers: [TaskScheduleController],
+})
+export class TaskScheduleModule {}

注册调度任务

调度系统支持:Cron具体时间Interval间隔时间Timeout延时时间几种调度任务,其中cron更常用

  1. cron任务

    ts
    import { Controller } from '@nestjs/common';
    +import { Cron } from '@nestjs/schedule';
    +
    +@Controller('schedule')
    +export class TaskScheduleController {
    +  // 周一到周五早上11:30执行
    +  @Cron('0 30 11 * * 1-5', {
    +    name: 'cronTime', // 名字
    +    timeZone: 'Asia/Shanghai', // 时区
    +  })
    +  handleCron() {
    +    console.log('cron called...');
    +  }
    +}

    Cron的时间是cron表达式

    markdown
    * * * * * *
    +| | | | | |
    +| | | | | day of week
    +| | | | months
    +| | | day of month
    +| | hours
    +| minutes
    +seconds (optional)
  2. Interval间隔任务

    interval间隔任务其实就是使用setInterval定义的任务

    ts
    import { Controller } from '@nestjs/common';
    +import { Interval } from '@nestjs/schedule';
    +
    +@Controller('schedule')
    +export class TaskScheduleController {
    +  @Interval('interval', 1000 * 60 * 5) // 间隔5分钟执行一次
    +  handleInterval() {
    +    console.log('interval called');
    +  }
    +}
  3. Timeout延时任务

    timeout延时任务本质也是使用setTimeout定义的任务

    ts
    import { Controller } from '@nestjs/common';
    +import { Timeout } from '@nestjs/schedule';
    +
    +@Controller('schedule')
    +export class TaskScheduleController {
    +  @Timeout('timeout', 1000 * 60) // 60s 后执行
    +  handleTimeout() {
    +    console.log('timeout called');
    +  }
    +}

动态调度

任务调度系统同时也提供了动态操作任务的功能,通常的业务中我们也会对的某个任务进行动态执行和注册,如请求某个接口新建一个任务或立即执行

任务调度的动态操作需要通过SchedulerRegistry进行,若要在controller中使用需要在构造器中注入

ts
import { Controller, Get, Post } from '@nestjs/common';
+import { SchedulerRegistry } from '@nestjs/schedule';
+
+@Controller('mock')
+export class MockController {
+    // 注入 SchedulerRegistry
+    constructor(private readonly scheduleRegistry: SchedulerRegistry) {}
+}
  1. 动态处理cron任务

    ts
    @Controller('mock')
    +export class MockController {
    +  // 注入 SchedulerRegistry
    +  constructor(private readonly scheduleRegistry: SchedulerRegistry) {}
    +  
    +  // 获取调度任务
    +  @Get('schedule/cron')
    +  handleScheduleCron() {
    +    // 获取指定的cron,并停止
    +    const job = this.scheduleRegistry.getCronJob('cronTime');
    +    job.stop();
    +    console.log('handleSchedule');
    +  }
    +
    +  // 添加调度任务
    +  @Post('schedule/cron')
    +  handleAddScheduleCron() {
    +    const job = new CronJob('* * * * * *', () =>
    +      console.log('新增的调度任务执行。。。'),
    +    );
    +    this.scheduleRegistry.addCronJob('addCron', job);
    +    job.start();
    +
    +    // 5s 后停止并删除添加的任务
    +    setTimeout(() => {
    +      job.stop();
    +      this.scheduleRegistry.deleteCronJob('addCron');
    +    }, 5000);
    +  }
    +}
  2. 动态处理Interval任务

    ts
    @Controller('mock')
    +export class MockController {
    +  // 注入 SchedulerRegistry
    +  constructor(private readonly scheduleRegistry: SchedulerRegistry) {}
    +
    +  // 获取间隔任务 并取消
    +  @Get('schedule/interval')
    +  handleScheduleInterval() {
    +    // 获取指定的cron,并停止
    +    const job = this.scheduleRegistry.getInterval('interval');
    +    clearInterval(job);
    +  }
    +
    +  // 添加间隔任务
    +  @Post('schedule/interval')
    +  handleAddScheduleInterval() {
    +    const cb = () => console.log('新增的间隔任务...');
    +    const interval = setInterval(cb, 1000);
    +    this.scheduleRegistry.addInterval('addInterval', interval);
    +
    +    const intervalId = this.scheduleRegistry.getInterval('addInterval');
    +    // 5s后取消并删除
    +    setTimeout(() => {
    +      clearInterval(intervalId);
    +      this.scheduleRegistry.deleteInterval('addInterval');
    +    }, 5000);
    +  }
    +}
  3. 动态处理Timeout任务

    ts
    @Controller('mock')
    +export class MockController {
    +  // 注入 SchedulerRegistry
    +  constructor(private readonly scheduleRegistry: SchedulerRegistry) {}
    +
    +  // 获取延时任务 并取消
    +  @Get('schedule/timeout')
    +  handleScheduleTimeout() {
    +    // 获取指定的cron,并停止
    +    const job = this.scheduleRegistry.getTimeout('timeout');
    +    clearTimeout(job);
    +  }
    +
    +  // 添加延时任务
    +  @Post('schedule/timeout')
    +  handleAddScheduleTimeout() {
    +    const cb = () => console.log('新增的延时任务...');
    +    const timeout = setTimeout(cb, 2000);
    +    this.scheduleRegistry.addTimeout('addTimeout', timeout);
    +
    +    const timeoutId = this.scheduleRegistry.getTimeout('addTimeout');
    +    setTimeout(() => clearTimeout(timeoutId), 5000);
    +  }
    +}

总结

NestJS 是一个基于 Node.js 平台的现代化 Web 框架,它结合了 TypeScript、面向对象编程的思想和函数式编程的思想,提供了一种高效、可扩展的方式来构建可维护的 Node.js 应用程序

参考文档

https://docs.nestjs.com

`,244);function F(D,y,i,b,u,m){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[c,s(a),s(l)])}const A=p(t,[["render",F]]);export{d as __pageData,A as default}; diff --git a/assets/frontend_nestjs_base.md.J1ZEEYhI.lean.js b/assets/frontend_nestjs_base.md.J1ZEEYhI.lean.js new file mode 100644 index 000000000..dec914c9b --- /dev/null +++ b/assets/frontend_nestjs_base.md.J1ZEEYhI.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const d=JSON.parse('{"title":"NestJS基础教程","description":"NestJS 是一个基于 Node.js 平台的现代化 Web 框架,它结合了 TypeScript、面向对象编程的思想和函数式编程的思想,提供了一种高效、可扩展的方式来构建可维护的 Node.js 应用程序","frontmatter":{"title":"NestJS基础教程","description":"NestJS 是一个基于 Node.js 平台的现代化 Web 框架,它结合了 TypeScript、面向对象编程的思想和函数式编程的思想,提供了一种高效、可扩展的方式来构建可维护的 Node.js 应用程序","keywords":"NestJS教程,node框架,Ioc架构,spring,NestJS MVC,NestJS优势,NestJS原理,装饰器原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nestjs.png"},"headers":[],"relativePath":"frontend/nestjs/base.md","filePath":"frontend/nestjs/base.md","lastUpdated":1706247228000}'),t={name:"frontend/nestjs/base.md"},c=e("",244);function F(D,y,i,b,u,m){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[c,s(a),s(l)])}const A=p(t,[["render",F]]);export{d as __pageData,A as default}; diff --git a/assets/frontend_nestjs_mvc.md.Z5ZKRS9C.js b/assets/frontend_nestjs_mvc.md.Z5ZKRS9C.js new file mode 100644 index 000000000..bb52ec784 --- /dev/null +++ b/assets/frontend_nestjs_mvc.md.Z5ZKRS9C.js @@ -0,0 +1,172 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const d=JSON.parse('{"title":"Nest搭建WEB服务","description":"如何使用NestJS搭建通用的web服务,以及国际化的使用","frontmatter":{"title":"Nest搭建WEB服务","description":"如何使用NestJS搭建通用的web服务,以及国际化的使用","keywords":"NestJS教程,node框架,Ioc架构,spring,NestJS MVC,NestJS优势,NestJS原理,装饰器原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nestjs.png"},"headers":[],"relativePath":"frontend/nestjs/mvc.md","filePath":"frontend/nestjs/mvc.md","lastUpdated":1706247228000}'),t={name:"frontend/nestjs/mvc.md"},c=o(`

Nest搭建WEB服务

我们知道Nest采用模块化架构、提供依赖注入、支持多协议、具备强大的路由和请求处理能力,与现有生态系统兼容,提供完善的测试工具和丰富的文档和社区支持,从而实现了构建可扩展、可维护的 Web 服务的简便性和效率。对于目前前后端分离的模式可能用不上它的所有功能,但对于一个通用的web服务搭建还是有非常重要的意义。本篇介绍如何使用nest搭建通用的web服务,运用nest的强大架构能力让前端服务变得更加简单易用

起步

如果你对Nest还不是很熟悉,请先阅读「Nest的基础文章」,本篇会简单演示一下Nest作为通用web服务的使用技巧,对于每个模块的专业或详细知识点还请参考基础文章、文档

使用cli创建空的项目:

sh
 nest new nest-web

生成后的项目目录结构大概长这个样子:

sh
nest-web
+├── README.md
+├── nest-cli.json
+├── package.json
+├── src # 业务代码
+	├── app.controller.spec.ts
+	├── app.controller.ts
+	├── app.module.ts
+	├── app.service.ts
+	└── main.ts
+├── test # 测试相关
+	├── app.e2e-spec.ts
+	└── jest-e2e.json
+├── tsconfig.build.json
+└── tsconfig.json

这里我们将目录结构过一个简单的整理,以便统一规划管理:

sh
├── Dockerfile # 应用部署镜像
+├── README.md
+├── nest-cli.json
+├── package.json
+├── pm2.json # pm2部署脚本
+├── public # 静态资源
+├── src
+	├── app.controller.ts # 主控制器
+	├── app.module.ts # 主模块
+	├── app.service.ts # 主服务
+	├── common # 通用的一些配置
+	│	├── decorator
+	│	├── filter
+	│	├── guard
+	│	├── i18n
+	│	├── interceptor
+	│	├── middleware
+	│	└── pipe
+	├── config.ts # 应用配置文件
+	├── constants # 常量
+	├── i18n # 语言包
+	├── main.ts # 程序入口
+	├── modules # 按模块划分
+	│	├── common # 通用的模块,可以将通用的工具放入通用模块里
+	│	└── test # 某个功能模块
+	│	    ├── test.controller.ts
+	│	    ├── test.module.ts
+	│	    └── test.service.ts
+	├── typings # ts类型
+	├── utils # 工具包
+	└── views # 版本引擎
+├── test # 测试
+├── tsconfig.build.json
+├── tsconfig.json

路由配置

这里不推荐在main.controller中创建业务相关的路由,除非是一些应用级别的配置之类的,尽量不要污染全局共用的模块,这样对于后续的维护也会大大降低成本

这里假如我们要创建一个有关用户信息模块的功能,可以将用户相关的功能单独划分一个模块:

ts
// 用户路由
+@Controller({ path: 'user' })
+export class UserController {
+  constructor(private readonly userService: UserService) {}
+
+  // 获取用户信息
+  @Get('/:id')
+  getUserInfo() {}
+}

其他关于Controller中的配置请参考我nest基础文章

服务配置

通常一个功能模块中包含Controller、Service模块,关于service大家应该知道主要是为Controller提供数据的,一般是对数据库的数据进行增删改查然后返回给Controller的。但是对于一个前端来说service通常不会用到,不过在作为BFF的情况下也是可以的,请根据具体场景调整

假设这里创建一个用户相关的服务:

ts
@Injectable()
+export class UserService {
+  getUserInfo(): string {
+    return { id: 1, name: 'nestjs' };
+  }
+}

应用配置

有了路由只是程序的基础功能,对于一个便于扩展和健壮的web应用来说配置是少不了的,如:配置文件、异常处理、日志收集、拦截器等等

配置文件

一般项目中都会有一个配置文件来灵活处理项目,统一配置对于所有的开发者都是透明的,不会有黑箱操作产生奇怪的问题。配置文件是项目共用的,可以将其放入公共模块共享

通常配置文件都会使用.env文件进行配置,这个已经成了约定的做法,但仅仅env文件是不够的还需要对配置文件进行容错处理,因此还要单独的创建一个配置文件来处理默认的配置

对于以上观点先创建功能模块存放共享的内容:

ts
// src/modules/common/common.module
+@Module({
+  ConfigModule.forRoot({
+    load: [GlobalConfiguration], // 加载自定义配置文件
+    validationSchema: Joi.object({
+      PORT: Joi.number(),
+      NODE_ENV: Joi.string().valid('development', 'production', 'testing').required(),
+    }),
+  }),
+})
+export class CommonModule implements NestModule {}

创建配置文件:ConfigModule读取当前文件,此文件我们会进行默认值的处理

ts
// 全局共享配置
+export const GlobalConfiguration = () => ({
+  __is_Prod__: process.env.NODE_ENV === 'production',
+  __is_Dev__: process.env.NODE_ENV !== 'production',
+  NODE_ENV: process.env.NODE_ENV?.length ? process.env.NODE_ENV : 'development',
+  PORT: (process.env.PORT || 5000) as number,
+  DEFAULT_LANGUAGE: process.env.DEFAULT_LANGUAGE || 'en',
+});
+
+// 数据库配置
+export const DatabaseConfiguration = registerAs('db', () => ({
+  host: process.env.DB_HOST || 'localhost',
+}));

除了基本的配置外还可以对配置文件的值进行校验,以便友好的引导开发者修改配置,这里可以使用Joi进行验证,具体的请参考基础文章

ts
@Module({
+  ConfigModule.forRoot({
+    validationSchema: Joi.object({
+      PORT: Joi.number(), // 变成数字
+      NODE_ENV: Joi.string().valid('development', 'production', 'testing').required(), // 限制指定的值
+    }),
+  }),
+})

内置功能

说完基本的项目配置文件后,接下来就要针对项目做一些健壮性的配置了,如:中间件、日志、过滤器、拦截器、转换器等等,这里已经在「Nest的基础文章」 讲过了,不再赘述

模板引擎

以上都是将nest作为类似api服务进行使用,但是对于前端来说这种场景很少用到,而用的比较多的还是使用node渲染页面这种场景。其实nest也是支持页面渲染的,类似于以前的jsp、php这种ssr模式,而对于页面渲染不和后端冗余一起对前端更有好点,现在的前后端模式已经和后端分开处理了,之间只以api进行交流

现在的页面渲染以完全有前端来处理了,相继也出现csr、ssr等多种渲染模式,使用nest可以很好的实现多种渲染模式如:传统的模板、(vue/react)ssr等等,这里只讲模板引擎

这里我们使用ejs作为页面模板引擎

sh
 yarn add ejs

配置模板引擎:

ts
// main
+// 模板引擎文件夹
+app.setBaseViewsDir(join(__dirname, './views'));
+// ejs视图引擎
+app.setViewEngine('ejs');

页面模板:

html
// views/user.ejs
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title><%= data.title %></title>
+  <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
+</head>
+<body>
+	<h1>user页面</h1>
+	<!-- 一些ejs模版语法 -->
+</body>
+</html>

关于ejs的模板语法请自行翻阅相关文档

路由渲染:

ts
// 用户路由
+@Controller({ path: 'user' })
+export class UserController {
+  // 渲染用户页面
+  @Get('/detail/page')
+  @Render('user') // 渲染user.ejs,这里对应 模板引擎文件夹下的文件路径
+  getUserInfo() {
+  	return {}; // 返回的数据可以在模板引擎中拿到
+  }
+}

国际化

国际化已经成了现在项目必不可少的功能,在nest中也可以很好的使用i18n的功能,由于官方并没有提供i18n的服务,这里暂时使用了第三方的工具包

sh
 yarn add nestjs-i18n

注册

i18n也属于项目的公共部分,可以将其放入公共模块

ts
// modules/common/common.module
+@Module({
+  imports: [
+    I18nModule.forRoot({
+      fallbackLanguage: globalConfiguration.DEFAULT_LANGUAGE, // 默认语言
+      loaderOptions: { // 语言包位置
+        path: resolve(__dirname, '../../i18n/'),
+        watch: false,
+      },
+      fallbacks: { // 对于i18n没有resolve没有匹配到的语言,使用当前集合进行映射处理
+        'zh-cn': 'zh',
+        'zh-*': 'zh_hk',
+        zh: 'zh_hk',
+        'en-*': 'en',
+        'ko-*': 'ko',
+        'ja-*': 'ja',
+        'es-*': 'es',
+      },
+      resolvers: [CustomI18nResolver], // 自定义语言的匹配规则
+      viewEngine: 'ejs', // 模版引擎用的ejs
+    }),
+  ],
+})
+export class CommonModule {}

语言匹配

由于每个项目或者业务的不同语言匹配也需要定制化,这里就来自定义语言的匹配规则

ts
// src/common/i18n/custom-i18n-resolver.ts
+@Injectable()
+export class CustomI18nResolver implements I18nResolver {
+  resolve(context: ExecutionContext): string | string[] | Promise<string | string[]> {
+    const ctx = context.switchToHttp();
+    const request = ctx.getRequest<Request>();
+    // TODO: 这里简单的对语言值进行判断,根据实际业务调整
+    let locale = request.params.locale;
+    if (!locale) {
+      locale = request.query.locale as string;
+    }
+    if (!locale) {
+      const acceptLang = request.headers['accept-language'];
+      locale = acceptLang?.split(',')?.[0] || 'en';
+    }
+    locale = locale?.replace(/-/i, '_');
+
+    if (locale.startsWith('zh')) return 'zh';
+    return 'en';
+  }
+}

控制器使用

ts
@Controller('user')
+export class UserController {
+  @Get('page')
+  @Render('index')
+  async renderPage(@I18n() i18n: I18nContext) {
+    return {
+      title: await i18n.t('common.title'), // 和前端中使用i18n一样
+    };
+  }
+}

语言包

有了i18n还需要语言包,一般都是语言包都是以json的形式按语言划分在不同的文件夹中

sh
src/i18n
+├── en // 英文
+	└── common.json # common. 开头的
+└── zh // 中文
+    └── common.json

更多关于i18n的用法请查阅相关文档

其他

对于一个通用型的传统的前端服务来说以上已经足够用了,可能还有些其他的小配置或性能优化的方面需要处理,你可以参考我的「Nest的实用技巧」。而比如偏后端的使用如数据库相关、结合vue/react ssr的参考后续文章

`,62);function F(D,y,i,b,u,B){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[c,s(a),s(l)])}const E=p(t,[["render",F]]);export{d as __pageData,E as default}; diff --git a/assets/frontend_nestjs_mvc.md.Z5ZKRS9C.lean.js b/assets/frontend_nestjs_mvc.md.Z5ZKRS9C.lean.js new file mode 100644 index 000000000..cecfa0e92 --- /dev/null +++ b/assets/frontend_nestjs_mvc.md.Z5ZKRS9C.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const d=JSON.parse('{"title":"Nest搭建WEB服务","description":"如何使用NestJS搭建通用的web服务,以及国际化的使用","frontmatter":{"title":"Nest搭建WEB服务","description":"如何使用NestJS搭建通用的web服务,以及国际化的使用","keywords":"NestJS教程,node框架,Ioc架构,spring,NestJS MVC,NestJS优势,NestJS原理,装饰器原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nestjs.png"},"headers":[],"relativePath":"frontend/nestjs/mvc.md","filePath":"frontend/nestjs/mvc.md","lastUpdated":1706247228000}'),t={name:"frontend/nestjs/mvc.md"},c=o("",62);function F(D,y,i,b,u,B){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[c,s(a),s(l)])}const E=p(t,[["render",F]]);export{d as __pageData,E as default}; diff --git a/assets/frontend_nestjs_swagger.md.y4EL9kxL.js b/assets/frontend_nestjs_swagger.md.y4EL9kxL.js new file mode 100644 index 000000000..430bee294 --- /dev/null +++ b/assets/frontend_nestjs_swagger.md.y4EL9kxL.js @@ -0,0 +1,94 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Nest使用Swagger文档","description":"在nest中使用swagger将接口可视化,搭建便于调试的restful风格的可视化接口文档","frontmatter":{"title":"Nest使用Swagger文档","description":"在nest中使用swagger将接口可视化,搭建便于调试的restful风格的可视化接口文档","keywords":"NestJS教程,Swagger,node框架,Ioc架构,spring,NestJS MVC,NestJS优势,NestJS原理,装饰器原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nestjs.png"},"headers":[],"relativePath":"frontend/nestjs/swagger.md","filePath":"frontend/nestjs/swagger.md","lastUpdated":1706247228000}'),t={name:"frontend/nestjs/swagger.md"},c=e(`

Nest使用Swagger文档

Swagger 是一个用于设计、构建和文档化 RESTful API 的开源框架和工具集。它提供了一套规范和工具,使得开发人员可以轻松地定义、测试和文档化 API。使用swagger可以很方便的测试接口、对接口进行管理,最重要的还是接口可视化方便任何人的操作,对于后端来说swagger是最熟悉不过的。在这里nest也可以使用swagger进行接口文档的生成,本篇文档就来看看如何使用swagger

对于前端来说用node生成api docs的场景可能很少见,这里只是扩展下nest的使用,方便自己对node框架方面的延伸扩展,总之多了解一些还是有好处的

起步

使用swagger首先需要安装相关的工具包,nest中内置了@nestjs/swagger工具包可以安装,此依赖内部有过多次的升级,本篇以最新版>7作为演示版本。可能看到本篇文档安装时的版本已经不是7了,那么本篇文章的相关使用方法可能不适用了,还请查看官方文档

安装

sh
 yarn add @nestjs/swagger

配置

安装好以后在程序入口进行简单的配置就可以使用了,以下在main文件中配置:

ts
import { NestFactory } from '@nestjs/core';
+import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
+import { AppModule } from './app.module';
+
+async function bootstrap() {
+  const app = await NestFactory.create(AppModule);
+
+  const config = new DocumentBuilder().build();
+  const document = SwaggerModule.createDocument(app, config);
+  // 设置swagger的地址url: /api
+  SwaggerModule.setup('api', app, document);
+
+  await app.listen(3000);
+}
+bootstrap();

启动

上面配置好了后就可以启动nest服务了,打开浏览器输入nest的服务地址加上swagger的urlhttp://localhost:3000/api就看到默认的接口列表了(🔈:程序中要有相关的Controller)

接口参数

到这里基本上都可以看到我们定义的接口了,而当我们展开相关的接口时会发现没有任何参数类型,也就是没将代码中定义的相关参数表现出来,如果运行接口也没法输入对应的参数导致接口报错。如定义以下接口:

ts
// GET: /api/mock
+// 这里希望接口的query参数类型为 PaginationQueryDto
+@Get()
+async getList(@Query() query: PaginationQueryDto) {
+  return query;
+}
+
+// PaginationQueryDto类型
+export class PaginationQueryDto {
+  @IsNumber()
+  readonly limit: number = 10;
+
+  @IsNumber()
+  readonly offset: number = 1;
+}

而在swagger中是看不到任何参数信息的:

默认注入

那么针对没有任何参数问题就要进一步解决了,其实swagger内部会对所有的Controller的每个方法中的@Query@Param@Body相关装饰器进行收集作为参数类型model,不过对于以上的代码我们也用到了@Query,还是没有相关的参数显示。这里就需要说明一个装饰器了@ApiProperty

ApiProperty

@ApiProperty装饰器用来装饰类的属性,主要来告诉swagger这个属性当前接口会用到,而接口的什么参数会用到,就看当前类类型被什么参数装饰器用到了,如:@Query等等。swagger内部会分析当前的属性属于当前接口的什么参数,所以这里不需要有额外的担心

让我们做简单的修改:

ts
// PaginationQueryDto类型为
+export class PaginationQueryDto {
+  @ApiProperty()
+  @IsNumber()
+  readonly limit: number = 10;
+
+  @ApiProperty()
+  @IsNumber()
+  readonly offset: number = 1;
+}

就这样其他啥也不需要修改(请确保相关的参数装饰器用到了此类型),再看看接口文档的显示: 至此已经成功的展示出query参数

ApiProperty还有一些其他的属性可以配置,如:枚举、字段名、是否必填等等

隐式自动注入只会对参数做处理,如果要对响应数据类型字段展示,就必须要显示定义了

显式定义

接口的相关参数除了可以使用隐式定义外,也可以使用相关的装饰器进行显示定义

  1. 使用ApiQuery定义查询参数:
ts
@Get()
+@ApiQuery({ name: 'age', type: 'number', description: '年龄', required: false })
+@ApiQuery({ name: 'name', type: 'string', description: '姓名', required: true })
+async getList(@Query() query: PaginationQueryDto) {}

  1. 使用ApiBody定义请求体的body数据:
ts
export class CreateUserDto {
+  @ApiProperty()
+  @IsString()
+  readonly name: string;
+
+  @ApiProperty()
+  @IsOptional()
+  @Type(() => Number) // 明确转换为number
+  @IsNumber()
+  readonly age: number;
+}
+
+@Get()
+@ApiBody({ type: CreateUserDto })
+async getList(@Query() query: PaginationQueryDto) {}

  1. 使用ApiResponse定义响应体类型:
ts
export class IResponseCodeDto {
+  @ApiProperty({ description: 'HTTP状态码' })
+  code: HttpStatus;
+}
+export class IResponseResultListDto extends IResponseCodeDto {
+  @ApiProperty({ isArray: true, type: CreateUserDto })
+  items: any;
+  @ApiProperty()
+  pager: PaginationListDto;
+}
+
+@Get()
+@ApiResponse({ type: IResponseResultListDto })
+async getList(@Query() query: PaginationQueryDto) {}

模块划分

swagger默认会对所有的Controller划分到default模块中,通常我们会将不同的功能划分到不同的模块,而swagger提供ApiTags来给对应的Controller打上标签,这样就会将当前Controller接口划分到对应的名字

ts
@ApiTags('Mock')
+@Controller('/api/mock')
+export class MockController {}

看上去模块划分已经生效了,但是还会生成default模块,是因为有些Controller没有添加标签就会全部放到default中,可以写一个规则将没有标签的过滤掉

ts
const swaggerConfig = new DocumentBuilder();
+const document = SwaggerModule.createDocument(app, swaggerConfig);
+// 过滤掉不是以 \`/api\` 和 没有 \`@ApiTags\` 装饰的接口
+document.paths = Object.keys(document.paths).reduce((paths, path) => {
+  if (!/^\\/api/i.test(path)) return paths; // 只生成api开头的接口
+  const pathItem = document.paths[path];
+  const filteredOperations = Object.keys(pathItem).reduce((ops, method) => {
+    const operation = pathItem[method];
+    if (operation.tags && operation.tags.length > 0) {
+      return { ...ops, [method]: operation };
+    }
+    return ops;
+  }, {});
+  if (Object.keys(filteredOperations).length > 0) {
+    return { ...paths, [path]: filteredOperations };
+  }
+  return paths;
+}, {});

其他

swagger还有一些其他的修饰配置,如:页面标题、描述信息等,简单看看使用

设置页面信息:

ts
const swaggerConfig = new DocumentBuilder()
+    .setTitle('Nest-swagger-api-docs')
+    .setDescription('在nest中使用swagger搭建接口文档')
+    .setLicense('一段文本', 'https://www.baidu.com')
+    .build();

设置路径标识、显式模块:

ts
const document = SwaggerModule.createDocument(app, swaggerConfig, {
+  include: [MockController], // 引入指定模块
+  operationIdFactory: (controllerKey, methodKey) => \`\${controllerKey}___\${methodKey}\`, // 路径标识
+});

除了以上的相关配置,你可以在官方文档中查看更多的配置信息,这里就不再讲了

参考文档

https://docs.nestjs.com/openapi/introduction

`,55);function F(y,D,i,u,b,B){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[c,s(a),s(l)])}const d=p(t,[["render",F]]);export{m as __pageData,d as default}; diff --git a/assets/frontend_nestjs_swagger.md.y4EL9kxL.lean.js b/assets/frontend_nestjs_swagger.md.y4EL9kxL.lean.js new file mode 100644 index 000000000..30fe7a78a --- /dev/null +++ b/assets/frontend_nestjs_swagger.md.y4EL9kxL.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Nest使用Swagger文档","description":"在nest中使用swagger将接口可视化,搭建便于调试的restful风格的可视化接口文档","frontmatter":{"title":"Nest使用Swagger文档","description":"在nest中使用swagger将接口可视化,搭建便于调试的restful风格的可视化接口文档","keywords":"NestJS教程,Swagger,node框架,Ioc架构,spring,NestJS MVC,NestJS优势,NestJS原理,装饰器原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nestjs.png"},"headers":[],"relativePath":"frontend/nestjs/swagger.md","filePath":"frontend/nestjs/swagger.md","lastUpdated":1706247228000}'),t={name:"frontend/nestjs/swagger.md"},c=e("",55);function F(y,D,i,u,b,B){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[c,s(a),s(l)])}const d=p(t,[["render",F]]);export{m as __pageData,d as default}; diff --git a/assets/frontend_nestjs_useful.md.qejIwuqb.js b/assets/frontend_nestjs_useful.md.qejIwuqb.js new file mode 100644 index 000000000..7531bc727 --- /dev/null +++ b/assets/frontend_nestjs_useful.md.qejIwuqb.js @@ -0,0 +1,196 @@ +import{_ as p,c as o,J as s,V as e,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"Nest实用手册","description":"使用nest解决通用的前端服务能力","frontmatter":{"title":"Nest实用手册","description":"使用nest解决通用的前端服务能力","keywords":"NestJS教程,node框架,Ioc架构,spring,NestJS MVC,NestJS优势,NestJS原理,装饰器原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nestjs.png"},"headers":[],"relativePath":"frontend/nestjs/useful.md","filePath":"frontend/nestjs/useful.md","lastUpdated":1706247228000}'),r={name:"frontend/nestjs/useful.md"},c=e(`

Nest实用手册

NodeJS对于前端工程师来说是必不可少的技能,掌握node可以提高自己对前端的视野、架构能力和部署能力;通常在服务端node都需要做一些相关的配置,不限于跨域、日志、路由、静态资源压缩、部署等等,这里就来谈谈常见的配置

跨域

浏览器端为提高资源请求的安全性提出了同源策略机制,即:非同源(域名、端口、协议)的请求会被视为跨域请求,将会被浏览器拦截。然后不同域名的请求越来越多,如何解决跨域请求

解决跨域可以使用代理服务器(如nginx)或服务端的支持,这里介绍下nest中如何配置跨域请求(nginx配置跨域传送门)。在nest中其实和express配置跨域是一致的,底层都是使用了cors第三方库,这里介绍使用中间件和nest提供的方法

基本配置

  • 自定义中间件:

    其实搞懂跨域本质配置跨域请求就很简单了,跨域会先进行options请求,浏览器根据相应的后Access-Control-Allow-Origin等头部信息进行判断是不是允许跨域。所以只要在options请求时快速返回且设置客户端的请求域名和端口时,浏览器就会判断已经允许跨域

    ts
    async function bootstrap() {
    +  const app = await NestFactory.create<NestExpressApplication>(AppModule);
    +  
    +  // 配置跨域
    +  app.use((req: Request, res: Response, next) => {
    +    // 谁请求就设置 允许的源
    +    res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
    +    // 设置请求允许的头
    +    res.setHeader('Access-Control-Allow-Headers', 'X-Locale');
    +    // 设置请求允许的方法
    +    res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
    +    // options请求快速返回
    +    if (req.method?.toLowerCase() === 'options') {
    +      res.sendStatus(200);
    +      return;
    +    }
    +    next();
    +  });
    +}
  • nest的enableCors

    ts
    app.enableCors((req: Request, cb) =>
    +    cb(null, {
    +      origin: req.headers.origin,
    +      methods: ['PUT, POST, GET, DELETE, OPTIONS'],
    +      allowedHeaders: ['x-locale', 'authorization'],
    +    }),
    +);

参考文档

https://docs.nestjs.com/security/cors

https://github.com/expressjs/cors#configuration-options

静态资源

nestjs默认底层框架使用express,可以使用useStaticAssets处理静态资源,也可以参考express的使用方式,其底层都是使用express/serve-static

基本使用

ts
app.useStaticAssets(join(__dirname, '..', 'public'));
+// more...

使用expressAPI处理和这个是一样的:

ts
app.use(express.static(resolve(__dirname, '../public')));

此方法也提供了可选的参数:

ts
useStaticAssets(path: string, options?: ServeStaticOptions): this;
+export interface ServeStaticOptions {
+    dotfiles?: string; // 点文件 ignore|deny|allow
+    etag?: boolean; // 默认true
+    extensions?: string[]; // 文件扩展
+    fallthrough?: boolean;
+    immutable?: boolean;
+    index?: boolean | string | string[]; // 路径访问 html
+    lastModified?: boolean;
+    maxAge?: number | string;
+    setHeaders?: (res: any, path: string, stat: any) => any; // 设置头信息
+    prefix?: string; // 路径前缀
+}

可根据实际情况进行配置

ts
app.useStaticAssets(resolve(__dirname, '../public'), {
+  // ...
+  setHeaders(res: Response, path: string) {
+    if (/.*\\.html?\\??.*/i.test(path)) {
+      res.setHeader('Cache-Control', 'public, max-age=0');
+    }
+  },
+});

资源压缩

使用压缩可以更好的减小响应内容的体积,但在生产环境高并发、nginx代理情况下不要使用

使用compression提供资源压缩功能:

sh
 yarn add compression

使用:

ts
app.use(
+  compression({
+    filter: (req: Request, res: Response) => {
+      // 这些文件跳过不需要压缩
+      if (/\\.(woff2|gz|robots\\.txt?)/i.test(req.path)) return false;
+      return compression.filter(req, res);
+    },
+  }),
+);

Gzip

对于生产环境可以将资源打包成.gz格式的压缩文件,直接使用gz静态服务器,这样就可以减少压缩消耗的时间

生成gz压缩文件,这里介绍webpack中使用compression-webpack-plugin插件打包

ts
import CompressionWebpackPlugin from "compression-webpack-plugin";
+
+// 使用插件
+new CompressionWebpackPlugin({
+  algorithm: "gzip",
+  test: new RegExp("\\\\.(js|css)$"),
+  minRatio: 0.8
+});

在node端使用gzip静态资源服务器:

sh
 yarn add express-static-gzip

使用:

ts
app.use(
+  expressStaticGzip(resolve(__dirname, '../public'), {
+    index: false,
+  }),
+);

参考文档

文件上传与下载

nest提供了http传输的multipart/form-data文件进行获取的中间件,以及处理流内容的方式

流文件

通常服务端返回流内容都是直接返回文件或者使用流对象pipe到响应对象,使用nest的StreamableFile方法可以快速的对流内容响应

ts
import { Controller, Get, StreamableFile } from '@nestjs/common';
+import { createReadStream } from 'fs';
+import { join } from 'path';
+
+@Controller('file')
+export class FileController {
+  @Get()
+  getFile(@Res() res: Response) {
+    const file = createReadStream(join(process.cwd(), 'package.json'));
+    return new StreamableFile(file);
+  }
+}

以上代码使用原声写法如下:

ts
@Controller('file')
+export class FileController {
+  @Get()
+  getFile(@Res() res: Response) {
+    const file = createReadStream(join(process.cwd(), 'package.json'));
+    file.pipe(res);
+  }
+}

文件上传

nest提供了FileInterceptor对文件类型进行处理,以及@UploadedFile装饰器对文件参数的注入

安装模块类型文件:

sh
 npm i -D @types/multer

模拟场景使用:

  1. 假如前端使用formdata上传文件:

    ts
    const formData = new FormData();
    +formData.append('file', file); // 假设这个是文件
    +formData.append('name', 'sky.png'); // 文件名
    +formData.append('type', 'image');
    +// 上传
    +fetch('/上传接口', { data: formData });
  2. 后端获取文件和其他信息:

ts
@Post('upload')
+@UseInterceptors(FileInterceptor('file')) // 文件转换要对应传过来的key
+uploadFile(@Body() body:any, @UploadedFile() file: Express.Multer.File) {
+  console.log(file); // 这里可以获取到formdata中的 file字段的文件
+  console.log(body); // 获取formdata中其他的字段
+}

websocket

nest封装了websocket功能,使用@WebSocketGateway装饰的类就拥有了websocket能力,它和使用具体的库没有关系,如ws、socketio,每一种库都可以适配WebSocketGateway

这里使用ws作用底层的库使用

ts
import { Module } from '@nestjs/common';
+import { SocketController } from './socket.controller';
+
+@Module({
+  providers: [SocketController],
+})
+export class SocketModule {}
+
+
+// 定义网关
+import {
+  MessageBody,
+  SubscribeMessage,
+  WebSocketGateway,
+  WebSocketServer,
+} from '@nestjs/websockets';
+import { IncomingMessage } from 'http';
+// import { Server } from 'socket.io';
+import { GlobalConfiguration } from 'src/config';
+import { Server } from 'ws';
+const globalConfig = GlobalConfiguration();
+
+@WebSocketGateway(globalConfig.PORT)
+export class SocketController {
+  @WebSocketServer()
+  server: Server;
+
+  // 连接
+  async handleConnection(client: WebSocket, request: IncomingMessage) {
+    // console.log(request.url);
+  }
+
+  @SubscribeMessage('people')
+  sendMessage() {
+    return {
+      name: 'socket',
+      date: +new Date(),
+    };
+  }
+
+  @SubscribeMessage('message')
+  async transferMessage(@MessageBody() body) {
+    console.log(1111, body);
+    // await new Promise((resolve) => setTimeout(resolve, 1500));
+    return 2;
+  }
+}

部署

nodejs通常都是使用pm2进行托管,部署通常都会使用docker+pm2+k8s形式进行配置

配置pm2:

json
 {
+	"apps": [
+		{
+			"name": "nest-web",
+			"script": "dist/main.js",
+			"watch": false,
+			"instance": 2,
+			"autorestart": true,
+			"max_memory_restart": "1G",
+			"env": {
+				"NODE_ENV": "development"
+			},
+			"env_production": {
+				"NODE_ENV": "production"
+			}
+		}
+	]
+}

配置docker:

dockerfile
FROM node:16-alpine3.18 AS base
+
+ENV TZ=Asia/Shanghai
+
+WORKDIR /app
+
+# 需与配置文件中的SERVER_PORT对应
+EXPOSE 9999
+
+# COPY public .
+# COPY src .
+# COPY package.json .
+# COPY pm2.json .
+# COPY nest-cli.json /app/nest-cli.json
+# COPY tsconfig.json /app/tsconfig.json
+# COPY tsconfig.build.json /app/tsconfig.build.json
+# RUN echo pwd
+COPY . .
+
+RUN yarn
+RUN yarn build
+RUN yarn global add pm2
+
+ENTRYPOINT ["pm2-runtime", "start", "pm2.json", "--env", "production"]

打包镜像:

ts
➜ general-mac nestjs-practive git:(dev) ✗ docker build -t nest-template .
+[+] Building 177.5s (11/11) FINISHED                                                                                                  docker:default
+ => [internal] load build definition from Dockerfile                                                                                            0.0s
+ => => transferring dockerfile: 772B                                                                                                            0.0s
+ => [internal] load .dockerignore                                                                                                               0.0s
+ => => transferring context: 177B                                                                                                               0.0s
+ => [internal] load metadata for docker.io/library/node:16-alpine3.18                                                                          17.6s
+ => [1/6] FROM docker.io/library/node:16-alpine3.18@sha256:6c381d5dc2a11dcdb693f0301e8587e43f440c90cdb8933eaaaabb905d44cdb9                     0.0s
+ => [internal] load build context                                                                                                               0.0s
+ => => transferring context: 2.78kB                                                                                                             0.0s
+ => CACHED [2/6] WORKDIR /app                                                                                                                   0.0s
+ => CACHED [3/6] COPY . .                                                                                                                       0.0s
+ => CACHED [4/6] RUN yarn                                                                                                                       0.0s
+ => CACHED [5/6] RUN yarn build                                                                                                                 0.0s
+ => [6/6] RUN yarn global add pm2                                                                                                             153.8s
+ => exporting to image                                                                                                                          6.0s
+ => => exporting layers                                                                                                                         6.0s
+ => => writing image sha256:ffb09b4da10527b212eda87e2b239bc6ae36748e769f203b21e384a66b349ff8                                                    0.0s
+ => => naming to docker.io/library/nest-template

项目中一般都会有.gitlab.yml配置,当提交代码时就会自动触发打包机制,最终根据不同环境部署到k8s集群

🎍后续会不断补充相关知识...

`,64);function F(D,y,i,b,B,u){const a=n("Reward"),l=n("Gitalk");return t(),o("div",null,[c,s(a),s(l)])}const d=p(r,[["render",F]]);export{A as __pageData,d as default}; diff --git a/assets/frontend_nestjs_useful.md.qejIwuqb.lean.js b/assets/frontend_nestjs_useful.md.qejIwuqb.lean.js new file mode 100644 index 000000000..c3c7e7fda --- /dev/null +++ b/assets/frontend_nestjs_useful.md.qejIwuqb.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"Nest实用手册","description":"使用nest解决通用的前端服务能力","frontmatter":{"title":"Nest实用手册","description":"使用nest解决通用的前端服务能力","keywords":"NestJS教程,node框架,Ioc架构,spring,NestJS MVC,NestJS优势,NestJS原理,装饰器原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nestjs.png"},"headers":[],"relativePath":"frontend/nestjs/useful.md","filePath":"frontend/nestjs/useful.md","lastUpdated":1706247228000}'),r={name:"frontend/nestjs/useful.md"},c=e("",64);function F(D,y,i,b,B,u){const a=n("Reward"),l=n("Gitalk");return t(),o("div",null,[c,s(a),s(l)])}const d=p(r,[["render",F]]);export{A as __pageData,d as default}; diff --git a/assets/frontend_nginx_base.md.uaI9zQ4K.js b/assets/frontend_nginx_base.md.uaI9zQ4K.js new file mode 100644 index 000000000..e16a211ee --- /dev/null +++ b/assets/frontend_nginx_base.md.uaI9zQ4K.js @@ -0,0 +1,637 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"Nginx使用手册","description":"Nginx是一个高性能、高可靠性、低内存占用和高并发性的HTTP和反向代理服务器,非常适合用于高负载的Web 站点、应用服务器和API网关等场景。通过本文来学习nginx强大功能如:静态服务器、反向代理、缓存压缩、HTTPS、跨域等等","frontmatter":{"title":"Nginx使用手册","description":"Nginx是一个高性能、高可靠性、低内存占用和高并发性的HTTP和反向代理服务器,非常适合用于高负载的Web 站点、应用服务器和API网关等场景。通过本文来学习nginx强大功能如:静态服务器、反向代理、缓存压缩、HTTPS、跨域等等","keywords":"nginx教程,nginx安装,nginx命令,nginx反向代理,nginx跨域,nginx缓存","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nginx.png"},"headers":[],"relativePath":"frontend/nginx/base.md","filePath":"frontend/nginx/base.md","lastUpdated":1706247228000}'),r={name:"frontend/nginx/base.md"},c=o(`

Nginx使用手册

Nginx(发音为 "engine-x")是一个高性能、开源的HTTP和反向代理服务器,也可以作为电子邮件(IMAP/POP3)代理服务器、以及通用的TCP/UDP代理服务器。它由俄罗斯的程序员Igor Sysoev创建于2002年,其目的是解决C10K问题(即可以同时处理10000个并发连接)。它采用异步非阻塞的事件驱动模型,可以处理成千上万个并发连接,同时使用少量的CPU和内存资源。

本篇带着大家一起领略nginx的常见使用技巧

优势

  1. 高性能:Nginx具有高并发、低内存消耗以及高稳定性的特点,可以很好地应对大流量的访问
  2. 高可扩展性:Nginx支持模块化扩展,可以灵活增加新功能。用户可以根据自己的需求选择相应的模块,从而实现定制化的功能
  3. 高可靠性:Nginx具有故障自动恢复、热部署等功能,能够保证服务器在遇到问题时仍能继续提供服务
  4. 反向代理与负载均衡:Nginx可以作为反向代理服务器,提供负载均衡功能。通过负载均衡,Nginx可以将请求分发到多个后端服务器,从而实现高可用和高性能的服务
  5. 静态文件处理:Nginx在处理静态文件方面(如HTML、CSS、JS、图片等)具有非常高的性能,可以作为Web服务器或者静态资源服务器使用
  6. 灵活的配置:Nginx的配置文件结构清晰,易于理解和修改。用户可以根据自己的需求对Nginx进行灵活的配置

功能

  • HTTP服务器:作为Web服务器,可以处理HTTP请求,提供网页浏览服务
  • 反向代理:将客户端的请求转发到其他服务器,并将服务器的响应返回给客户端。这样可以隐藏服务器的真实IP地址,提高安全性
  • 负载均衡:在多个服务器之间分配客户端的请求,实现请求的负载均衡
  • 缓存和压缩:Nginx支持内容缓存和压缩,可以加快页面加载速度,降低服务器负载
  • 虚拟主机:通过配置虚拟主机,可以使用一个Nginx服务器处理多个域名的请求
  • 安全性:支持SSL/TLS加密,可以对传输的数据进行加密,保证数据的安全性
  • 电子邮件代理:作为电子邮件服务器,可以处理IMAP/POP3协议,提供邮件收发服务

安装nginx

sh
yum install nginx -y

本人使用的是ARM架构的centos进行安装的,当执行以下命令时提示没有可用的安装包,如果你和我一样,可以访问官方下载页面进行nginx的repo配置:

下载准备:

sh
yum install yum-utils

设置YUM存储库,创建名为/etc/yum.repos.d/nginx.repo的文件,并复制以下内容:

toml
[nginx-stable]
+name=nginx stable repo
+baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
+gpgcheck=1
+enabled=1
+gpgkey=https://nginx.org/keys/nginx_signing.key
+module_hotfixes=true
+
+[nginx-mainline]
+name=nginx mainline repo
+baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
+gpgcheck=1
+enabled=0
+gpgkey=https://nginx.org/keys/nginx_signing.key
+module_hotfixes=true

以上配置好了后再次进行nginx的下载应该就可以了

下载好后查看nginx版本:

sh
 nginx -v
+nginx version: nginx/1.22.1

配置开机启动:

sh
 systemctl enable nginx --now
+Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

常用命令

  1. 查看nginx版本
    sh
     nginx -v
    +nginx version: nginx/1.22.1
    +
    +# 详细内容(版本号、编译器版本、安装路径、日志路径、PID文件路径、HTTP模块、SSL模块、GZIP模块等等)
    + nginx -V
    +nginx version: nginx/1.22.1
    +built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
    +built with OpenSSL 1.0.2k-fips  26 Jan 2017
    +TLS SNI support enabled
    +configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
  2. 测试 Nginx 配置文件的语法和逻辑是否正确
    sh
     nginx -t
    +nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    +nginx: configuration file /etc/nginx/nginx.conf test is successful
    +
    +# 检测并输出配置文件,快速诊断配置文件问题
    + nginx -T
  3. 启动nginx与重启
    sh
     nginx
    + nginx -s reload
  4. 关闭nginx
    sh
    # 立即停止
    + nginx -s stop
    +# 处理完请求后停止
    + nginx -s quit

配置文件

可以使用nginx -t知道nginx的配置文件路径具体位置,打开配置文件如下:

nginx
# /etc/nginx/nginx.conf
+user  nginx;
+
+# 数量大,并发高,会受到硬件的配置影响
+worker_processes  auto; # number/auto
+
+error_log  /var/log/nginx/error.log notice; # notice、info
+pid        /var/run/nginx.pid;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+	# 定义文件类型映射表,返回浏览器会在头部加上对应的文件类型
+    include       /etc/nginx/mime.types;
+    # mime中无对应类型,默认流类型
+    default_type  application/octet-stream;
+
+    # 日志格式
+    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+                      '$status $body_bytes_sent "$http_referer" '
+                      '"$http_user_agent" "$http_x_forwarded_for"';
+    # 访问日志
+    access_log  /var/log/nginx/access.log  main;
+
+    # sendfile 是一种高效的文件传输方式,它可以将文件数据直接从磁盘读取到内核缓冲区,再通过网络传输到客户端,避免了将文件数据从内核缓冲区复制到用户空间的开销,提高了文件传输的效率。
+    sendfile        on;
+    #tcp_nopush     on;
+    keepalive_timeout  65;
+    # gzip压缩
+    gzip  on;
+
+	server {
+	    listen       80;
+	    server_name  localhost;
+
+	    location / {
+	        root   /usr/share/nginx/html;
+	        index  index.html index.htm;
+	    }
+
+	    # redirect server error pages to the static page /50x.html
+	    error_page  404              /404.html;
+	    location = /404.html {
+	        root   /usr/share/nginx/html;
+	    }
+	}
+
+    include /etc/nginx/conf.d/*.conf;
+}

由以上的默认配置可以看出nginx配置是由以下几部分组成的:

  1. main块:主要包含全局配置参数,服务器的用户(组)、worker 进程数、进程 ID 文件路径、日志存放路径等
  2. events块:用于配置事件模块的参数,例如 worker 进程的连接数、事件模型等
  3. http块:用于配置 HTTP 协议相关的参数,例如服务器监听的端口、虚拟主机、代理、缓存等
  4. server块:属于http块中的模块,用于配置一个虚拟主机的参数,例如监听的端口、域名、SSL 证书、代理、缓存等,http块中可以包含多个server块(常用server来配置虚拟主机)
  5. location块:属于server块中的模块,用于配置一个 URI 的参数,例如 URI 匹配规则、代理、缓存等(匹配主机路径)

Nginx 配置文件采用了一种层次结构的格式,每个块都以花括号 {} 包含,其中的参数和指令以分号 ; 结尾。通过修改 Nginx 配置文件,可以自定义 Nginx 服务器的行为和参数,以适应不同的需求和场景

在默认配置文件结尾会将conf.d路径下的所有*.conf结尾的配置文(server级别)件引入到主配置文件,这样可以根据不同的server模块进行划分配置,便于管理和维护:

nginx
include /etc/nginx/conf.d/*.conf;

server

server 块用于配置一个虚拟主机的参数,例如监听的端口、域名、SSL 证书、代理、缓存等。每个 server 块都必须包含一个 listen 指令,用于指定虚拟主机监听的端口和 IP 地址

示例:

nginx
server {
+    listen 80;
+    server_name example.com;
+    location / {
+    	root /usr/share/nginx/html;
+    	index index.html;
+    }
+}

以上的server监听80端口并匹配域名exemple.com,当访问/时会访问/usr/share/nginx/html/index.html文件。

listen表示当前虚拟主机监听的端口,可以写多个,如监听https端口可以写listen 443 ssl;

server_name表示匹配的域名,可以写正则来匹配,如*.example.com表示exempe.com的所有二级域名都可以匹配到

除了基本参数外,server 块还可以配置其他的参数,如:sl_certificate 和 ssl_certificate_key用于配置 SSL 证书和私钥的路径等等

location

location用来匹配server中的访问路径(path),如访问https://blog.usworn.cn/me可以匹配path/me。location支持全匹配和正则表达式:

  • 全匹配:= /xxx
  • 正则匹配:
    • ~:区分大小写
    • ~*:不区分大小写
    • ^~:用于不含正则表达式uri前,nginx找到和请求uri匹配度最高的 location 后,立即用此location,不再用location 中的正则匹配

例子:

nginx
server {
+	# ...
+
+	# 全匹配 /me
+	location = /me {
+		root /usr/share/nginx/html;
+		index index.html index.htm;
+	}
+
+	# 匹配 以/admin 开头的path
+	location ~ ^/admin {}
+
+	# 同上,这里不区分大小写相当于 /admin
+	location ~* ^/ADMIN {}
+}

静态服务

作为静态服务使用时,可以提供高效的静态文件传输和缓存服务,从而加速网站的加载速度,提升用户体验

nginx
server {
+	# 指定静态文件的根目录,nginx 会根据 uri 在 根目录下匹配路径
+	location ~ {
+		root /usr/share/nginx/html;
+		index index.html;
+	}
+
+	# 路径映射,可以对外隐藏真实的路径
+	location /images/ {
+		alias /documents/icons/;
+	}
+}

假如访问index.html,内容如下:

html
<!DOCTYPE html>
+<html>
+<head>
+	<title>Welcome to nginx!</title>
+</head>
+<body>
+	<img src="/images/icon-docker.png" >
+</body>
+</html>

访问页面时会请求请求图片,在nginx中替换掉图片地址为/documents/icons/icon-docker.png,这对外部来说隐藏了内部的真实地址

也可以作为资源目录列表:

nginx
server {
+	# 资源列表
+	location / {
+		autoindex on;  # 开启资源列表目录
+		autoindex_exact_size on;  # 显示文件的确切大小,单位是byte;off显示文件大概大小,单位KB、MB、GB
+		autoindex_localtime on;  # off(默认)时显示的文件时间为GMT时间;on显示的文件时间为服务器时间
+	}
+}

访问控制

  1. 使用 deny 指令来进行访问控制,该指令可以限制某些 IP 地址或 IP 地址段的访问

    nginx
    server {
    +	# 禁止指定IP
    +	location /foo {
    +		deny 192.168.10.10;
    +	}
    +	# 禁止IP 地址段
    +	location /bar {
    +		deny 192.168.1.0/24;
    +	}
    +	# 允许指定IP
    +	location / {
    +		deny all;
    +		allow 192.168.1.10;
    +	}
    +}

  2. 设置用户名和密码鉴权

    安装httpd-tools,用来生成账户名和密码

    sh
    yum install httpd-tools -y

    设置用户名和密码:这里将会生成新的文件/etc/nginx/.htpasswd,用户名为ihengshuai,密码提示你输入

    sh
     htpasswd -c /etc/nginx/.htpasswd ihengshuai
    +New password:
    +Re-type new password:
    +Adding password for user ihengshuai

    查看用户名和密码:默认生成的密码会被加密,密码加密算法有好几种,你也可以使用明文密码,请参考htpasswd -h了解更多

    sh
     cat /etc/nginx/.htpasswd
    +ihengshuai:$apr1$FvO5arNB$nsrzQ8e.4DX.c8JUSJJTE1

    接下来进行nginx配置:

    nginx
    # vim /etc/nginx/default.conf
    +server {
    +	#...
    +	auth_basic "请输入用户名和密码";
    +	auth_basic_user_file /etc/nginx/.htpasswd;
    +}

重定向

nginx中支持rewritereturn关键字进行重定向

rewrite

sh
rewrite <regexp> <replacement> [flag];
  • regexp:路径匹配,如匹配:^/admin
  • replacement:替代的内容,比如换成 https://blog.usword.cn
  • flag:标识符
    • last:匹配完后继续向下匹配 location
    • break:匹配完后,不再匹配后面的规则
    • redirect:302临时重定向,浏览器会显示新的URL
    • permanent:301永久重定向,浏览器会显示新的URL

例子:

nginx
server {
+	location / {
+		rewrite ^(/frontend(.*))$ https://blog.usword.cn$1 permanent;
+		# 不管是啥都重定向到另一个域名
+		# rewrite ^(.*)$ https://blog.usword.cn$1 redirect;
+
+		# 设置状态码 418 的错误 路径
+		error_page 418 = @redirect_stop;
+		# 重定向 次数超过 10次时 ,返回状态码 418
+		if ($redirect_count > 10) {
+		    return 418;
+		}
+	}
+	location @redirect_stop {
+		# do something
+	}
+}

当访问路径中以/frontend开头时永久重定向到http://blog.usword.cn,并将路径拼接到后面(这里需要了解正则表达式使用)

如果重写规则不正确,可能会导致死循环或者无限重定向。为了避免这种情况,可以使用 error_page指令或者 return 指令设置重定向的最大次数或者超时时间

return

sh
return <code> [text];
  • code:一个 HTTP 响应码,用于指示服务器应该返回哪种类型的响应
  • text:可选的文本字符串,用于指定响应正文

例子:

nginx
server {
+	location /api {
+		add_header 'Content-Type' 'application/json';
+		return 200 '{"code": 200, "msg": "ok"}';
+	}
+	location ~* ^(/frontend(.*))$ {
+		return 302 https://blog.usword.cn$1;
+	}
+}

以上当访问/api时设置状态码200并以json的形式返回数据,当匹配到/frontend开头的路径时重定向到https://blog.usword.cn 并将path拼接到后面

GZIP压缩

使用 gzip 模块对 HTTP 响应进行压缩。这可以显著减少传输数据的大小,从而提高网站的性能和响应速度。gzip压缩功能由ngx_http_gzip_modulengx_http_gzip_static_module模块提供

开启gzip:可以用在http、server、location中

nginx
gzip on;

其他用法:

nginx
server {
+	gzip on;
+	gzip_types text/html text/css application/javascript;
+	gzip_static on;
+	gzip_proxied expired no-cache auth;
+	gzip_buffers 16 8k;
+	gzip_min_length 2k;
+	gzip_comp_level 4;
+	gzip_http_version 1.0;
+	gzip_vary on;
+	gzip_disable "MSIE [1-6]\\\\.";
+}
  1. gzip_types:要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用;
  2. gzip_static:默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容;
  3. gzip_proxied:默认 off,nginx 做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩;
  4. gzip_buffers:获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得
  5. gzip_min_length:允许压缩的页面最小字节数,页面字节数从 header 头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大
  6. gzip_comp_level:gzip 压缩比,压缩级别是 1-9,默认6,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6;
  7. gzip_http_version:默认 1.1,启用 gzip 所需的 HTTP 最低版本;
  8. gzip_vary:用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩;
  9. gzip_disable 指定哪些不需要 gzip 压缩的浏览器,正则匹配 请求头的User-Agent

例子:对图片进行压缩

nginx
location ~* (png|jpeg|gif)$ {
+	gzip on;
+	gzip_comp_level 6;
+	gzip_types image/png image/jpeg image/jpg image/gif;
+}

图像转换

nginx中可以使用http_image_filter_module模块的功能进行图片的转换如:缩放、裁剪、质量等等,使用此功能需要安装这个模块,这里演示在Centos中的安装过程,若已安装可以跳过此步骤。

首先检查是否安装了此模块,运行命令:如果发现有此模块将会高亮显示,如果没有什么都不会输出

sh
 nginx -V 2>&1 | grep 'http_image_filter_module'
+
+configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' \`--with-http_image_filter_module\`

安装模块依赖环境:

sh
 yum install gd-devel pcre pcre-devel -y

如果原来是使用yum安装的nginx,则需要在官方网站上找到对应版本的nginx包下载到本地:这里我以1.22.1版本为例

sh
# 下载
+ wget https://nginx.org/download/nginx-1.22.1.tar.gz
+# 解压
+ tar xf nginx-1.22.1.tar.gz

为了不影响原来的nginx的数据和配置,使用和原版本的nginx同样的编译参数,然后在后面添加上--with-http_image_filter_module参数即可:

sh
# 查看原来版本的编译参数,并复制configure arguments 的值
+ nginx -V
+# 编译nginx
+ cd nginx-1.22.1
+ ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' \`--with-http_image_filter_module\`
+
+# 编译安装文件
+ make && make install
+
+# 重启nginx
+ nginx -s reload
+# 可以再次使用一下命令进行验证是否安装成功
+ nginx -V 2>&1 | grep 'http_image_filter_module'

到这里就可以使用http_image_filter_module模块的功能了,官方文档配置戳👉这里

以上安装此模块后编译如果出现其他的错误,请按照提示安装上相关的依赖即可解决

image_filter使用参数:

  • image_filter off;:关闭模块
  • image_filter test;:确保图片格式为PNG、JPEG、GIF、WEBP,否则返回415状态码
  • image_filter size;:以json的形式输出图片的信息,如:'{"img":{"width":1135,"height":500,"type":"jpeg"}}',resize、crop等同时使用时无效果
  • image_filter rotate 90|180|270;:旋转图像,可以和resize、crop一起使用
  • image_filter resize width height;:按比例缩放图像,要减少一个维度可以将另一个值设置为-
  • image_filter crop width height;:按比例将图像缩小到较大的一侧,并在另一侧产生无关边缘
  • image_filter_buffer size;:读取图片缓冲区大小,若图片太大缓冲区太小则会抛415错误
  • image_filter_interlace on;:如果启用,最终图像将交错。对于JPEG,最终图像将采用"逐行JPEG"格式。
  • image_filter_jpeg_quality 1-100;:设置转换的JPEG图像的质量。可接受的值是从1到100的范围内。较小的值通常意味着图像质量越低,以达到减少数据传输。推荐的最大值为95,参数值可以包含变量
  • image_filter_webp_quality 1-100:设置webp图片质量,同上
  • image_filter_transparency on|off;:定义在使用调色板指定的颜色转换GIF图像或PNG图像时是否应保留透明度。透明度的降低会导致质量更好的图像,PNG中的alpha通道透明度始终保留。
  • image_filter_sharpen 1-100;:增加最终图像的清晰度,锐度百分比可以超过100。零值将禁用锐化。参数值可以包含变量

TIP

注意以上大部分操作都会耗时,尤其是对于很大的图片,如果裁剪、缩放的比例很大,将会增加耗时,应合理设置处理流程

此模块处理图像出现异常的情况下基本都是抛出415错误,因此在不能正常处理图像情况下,重定向到指定的位置更为友好

例子

nginx
server {
+	location /images/ {
+		# 初始化 width 为-,也就是原始大小
+	  set $width -;
+
+	  # 匹配图片url上的 w参数 如:/images/cat.png?w=1 | w=xx
+	  # 正则判断是纯数字且大于0时将值 赋值给 width
+	  if ($arg_w ~* ^[1-9]\\d+$) {
+	    set $width $arg_w;
+	  }
+	  # 设置缓冲区 5M
+	  image_filter_buffer 5m;
+	  image_filter test;
+	  # 缩放图片 width,另一侧按比例缩放
+	  image_filter resize $width -;
+
+	  alias /documents/;
+	  allow all;
+
+	  # 当抛出 415 错误时,走 @image_filter_error 路由
+	  error_page 415 @image_filter_error;
+	}
+
+	# 重定向到 错误图片
+	location @image_filter_error {
+		return 301 /images/error.png;
+	}
+}

在浏览器上测试使用w参数:大于0都可以正常处理,其他的都会以原始大小返回;当图像大小大于5M时,由于太大将会重定向到错误图片,以上根据实际情况自行处理

除了以上对图片进行转换外,还可以使用ngx_http_set_misc_module模块或Lua脚本将图片转换成webp格式,提高图像加载,这里就不介绍了

缓存

nginx默认支持静态资源的缓存和代理缓存

静态资源缓存

可以使用expiresCache-Control请求头设置缓存

  1. 使用expires进行缓存,Expires 是 HTTP/1.0 中定义的字段,它指定了在过期之前客户端可以缓存响应的时间。服务器会在响应头中设置一个到期日期,客户端在该日期之前可以缓存响应。Expires 头部的时间格式是 GMT 格式的绝对时间,如 "Expires: Wed, 21 Oct 2015 07:28:00 GMT"。
    nginx
    server {
    +	location ~ \\.(png|jpg|jpeg|gif|webp)$ {
    +		expires 1d;
    +	}
    +}
  2. 使用Cache-Control进行缓存,它是 HTTP/1.1 中定义的字段,它提供了更为灵活的缓存控制方式。它可以指定缓存的时间、缓存的位置、缓存的类型等。常用的指令包括max-ageno-cacheno-storemust-revalidate 等。其中,max-age 指定了缓存的最长时间,它的值是一个相对时间,如 "Cache-Control: max-age=86400" 表示缓存 1 天。
    nginx
    server {
    +	location ~ \\.(png|jpg|jpeg|gif|webp)$ {
    +		add_header Cache-Control "public, max-age=86400";
    +	}
    +}
    Cache Control可以使用的参数如下:
    • public:指示响应可以被任何中间缓存缓存,包括客户端和代理服务器。
    • private:指示响应只能被客户端缓存,不应该被代理服务器缓存。
    • max-age:指示缓存存储的最长时间,单位为秒。例如,Cache-Control: max-age=3600 表示缓存有效期为 1 小时。
    • s-maxage:与 max-age 类似,但只适用于共享缓存(比如代理服务器)。如果同时设置了max-age 和 s-maxage,则 s-maxage 优先级更高。
    • no-cache:指示客户端必须在使用缓存之前重新验证资源的有效性。如果资源未被修改,则可以从缓存中读取资源。否则,需要重新下载资源。
    • no-store:指示不应将响应存储在任何缓存中,包括客户端和代理服务器。
    • must-revalidate:指示在过期之后,缓存必须从原始服务器重新获取资源,以确保缓存仍然有效。如果不能从原始服务器重新获取资源,则缓存必须标记为过期。

二者的区别和对比:

Expires 和 Cache-Control 的区别主要在于过期时间的计算方式不同。Expires 是基于服务器时间的绝对时间,因此它的缺点是服务器时间和客户端时间可能不同步,可能导致缓存不一致。而 Cache-Control 则是相对时间,可以避免这个问题。此外,Cache-Control还支持更为灵活的控制方式,可以更好地控制缓存策略。建议使用Cache-Control 来设置 HTTP 缓存控制,而Expires则可以用作向后兼容,或在某些场景下作为备用方案。

代理缓存

nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
+server {
+	location /proxy {
+		proxy_pass http://localhost:10000;
+
+		# 定义缓存的键名
+		proxy_cache_key "$scheme$proxy_host$request_uri";
+		# 缓存的有效期为 5 分钟
+		proxy_cache_valid 200 5m;
+		# 根据 Pragma 字段决定是否跳过缓存
+		proxy_cache_bypass $http_pragma;
+		# 制重新验证缓存
+		proxy_cache_revalidate on;
+		# 启用代理缓存,并指定缓存区名称
+		proxy_cache my_cache;
+		# 启用缓存背景更新
+		proxy_cache_background_update on;
+		# 设置缓存背景更新的时间间隔为 1 小时
+		proxy_cache_background_update_interval 1h;
+		# 设置缓存背景更新的失败重试次数为 2 次
+		proxy_cache_background_update_retries 2;
+		# 设置缓存背景更新时使用的临时文件路径
+		proxy_cache_background_update_temp_path /tmp/nginx_cache;
+		# 启用缓存锁定,控制并发缓存请求
+		proxy_cache_lock on;
+		# 设置缓存锁定的超时时间为 5 秒
+		proxy_cache_lock_timeout 5s;
+		# 缓存锁定失败时,是否返回错误码 503
+		proxy_cache_lock_age on;
+		# 启用缓存失效时使用旧的缓存数据
+		proxy_cache_use_stale error timeout updating;
+		# 设置缓存失效时使用旧的缓存数据的有效期为 1 分钟
+		proxy_cache_valid 404 1m;
+	}
+}

防盗链

防盗链(Referer 防盗链)是指在网站或服务器端设置一些规则,只允许指定的域名或网站引用自己的资源,防止非法盗链,减少带宽浪费。

在 Nginx 中,可以使用 valid_referers 指令来实现防盗链的功能。该指令用于设置有效的引用来源(Referer)列表,只有在该列表中的来源才能访问指定的资源。

sh
valid_referers [none|blocked|server_names|string ...];
  • none:允许空的引用来源(Referer)。
  • blocked:阻止所有的引用来源(Referer)。
  • server_names:允许与服务器名匹配的引用来源(Referer)。
  • string:允许指定字符串的引用来源(Referer),可以使用通配符和正则表达式进行匹配。

例子:

nginx
server {
+	server_name *.general-mac.com;
+
+	location ~ \\.(png|jpg|jpeg|gif|webp)$ {
+		valid_referers blocked server_names "~.*general-mac\\.com$";
+
+		if ($invalid_referer) {
+			return 403;
+		}
+	}
+}

上面的例子设置了不允许refer为none(不允许单独打开图片),使用正则匹配只允许refer为 general-mac.com 或其任何子域名,其余的都会返回403,

反向代理

nginx
server {
+	location /proxy {
+		proxy_pass http://localhost:10001;
+
+		# 添加响应头部返回给客户端
+		add_header X-Real-IP $remote_addr;
+
+		# 传给目标服务器设置的头部信息
+		# 源host
+		proxy_set_header Host $http_host;
+		#上层请求真实IP (一般设置在第一层代理服务器)
+		proxy_set_header X-Real-IP $remote_addr;
+		# 访问的协议
+		proxy_set_header X-Forwarded-Scheme $scheme;
+		# 将经过多个代理服务器的ip以 逗号 拼接,最左边是用户真实ip
+		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
+		# Websocket
+		proxy_set_header Connection "upgrade";
+		proxy_set_header Upgrade $http_upgrade;
+
+		# 目标服务器数据回传超时时间
+		proxy_send_timeout 10;
+		# 目标服务器响应超时时间
+		proxy_read_timeout 30;
+		# 和目标服务器连接超时时间
+		proxy_connect_timeout 90;
+	}
+}

使用nodejs简单的写一个后端服务:

js
const express = require("express");
+const app = express();
+
+const port = 10001;
+app.use((req, res) => {
+	res.json({
+		port,
+		code: 200,
+		msg: "ok",
+		url: req.url
+	})
+})
+
+app.listen(port, () => console.log('server is running on port' + port));

测试:

sh
 curl general-mac.com/proxy -I
+HTTP/1.1 200 OK
+Server: nginx/1.22.1
+Date: Thu, 06 Apr 2023 13:17:41 GMT
+Content-Type: application/json; charset=utf-8
+Content-Length: 290
+Connection: keep-alive
+X-Powered-By: Express
+ETag: W/"122-vJBMYWLUDf/IIuHJiL8M6GUx+Wo"
+X-Real-IP: 192.168.10.1

配置跨域

跨域是怎么产生的这里不再赘述,在nginx中进行反向代理的跨域配置

nginx
# 后端服务器,使用上面的nodejs
+server {
+	listen 10010;
+	location /proxy {
+		# 设置允许的源(IP+PORT)
+		add_header Access-Control-Allow-Origin $http_origin;
+		# 设置允许的 请求方法
+		add_header Access-Control-Allow-Methods 'OPTIONS, GET, POST, PUT, DELETE';
+		# 设置允许的请求头
+		add_header Access-Control-Allow-Headers 'x-locale';
+		# 其他自定义...
+		# 预检请求 204 快速返回
+		if ($request_method = 'OPTIONS') {
+		   return 204;
+		}
+		proxy_set_header X-Real-IP $remote_addr;
+		proxy_set_header X-Host $host;
+		proxy_set_header X-Http-Host $http_host;
+		proxy_set_header X-Forwarded-Scheme $scheme;
+		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+		proxy_pass http://backend;
+	}
+}

新建一个HTML页面:

html
<html>
+<head><meta charset='utf8'/></head>
+<body>
+  <input id='input'>
+  <button>请求</button>
+  <script>
+	const btn = document.querySelector('button');
+	btn.addEventListener('click', async e => {
+		const res = await fetch('http://192.168.10.9:10010/proxy', {
+			mode: 'cors',
+			headers: {
+				'x-locale': 'zh'
+			}
+		})
+		.then(res => res.json())
+		console.log(res)
+	})
+  </script>
+</body>
+</html>

负载均衡

nginx中可以使用nginx_http_upstream_module模块实现负载均衡,请确保已安装

nginx
upstream backend {
+	# 使用三个后端服务地址
+	server backend1.example.com weight=1;
+	server backend2.example.com;
+	server backend3.example.com;
+
+	# 轮询
+	# round_robin;
+
+	# 连接最小数
+	# least_conn;
+
+	# IP哈希
+	# ip_hash;
+}
+
+server {
+	location / {
+		proxy_pass http://backend;
+	}
+}

nginx可以根据不同的负载均衡策略进行流量分发

配置HTTPS

在使用HTTPS之前,需要获得SSL证书。可以从证书颁发机构(CA)购买证书,或者使用免费的证书颁发机构(如Let's Encrypt)获得证书,这里采用OpenSSL自签证书,便于使用封装成以下脚本auto-cetificate.sh

sh
#!/bin/bash
+# https://docs.azure.cn/zh-cn/articles/azure-operations-guide/application-gateway/aog-application-gateway-howto-create-self-signed-cert-via-openssl
+
+echo "请使用sudo运行以获取系统权限!"
+echo "请输入域名:"
+
+read userdomain
+
+# 啥都不输退出
+if [ ! "$userdomain" ]; then
+    exit
+fi
+
+# 使用OpenSSL签发证书
+# 1. 生成服务器私钥 (domain.com.key)  domain.com 随便起的名字
+openssl genrsa -out $userdomain.key 4096
+
+# 2.生成证书签名请求(CSR) domain.com.csr
+# 生成 CSR 的过程中,会提示输入一些信息,其中一个提示是 Common Name (e.g. YOUR name),
+# 这个非常重要,这一项应填入 FQDN(Fully Qualified Domain Name)完全合格域名/全称域名,
+# 如果您使用 SSL 加密保护网络服务器和客户端之间的数据流,
+# 举例被保护的网站是 https://test.chinacloudsites.cn,
+# 那么此处 Common Name 应输入 test.chinacloudsites.cn
+openssl req -new -key $userdomain.key -out $userdomain.csr
+
+# 3.使用上一步的证书签名请求签发证书
+openssl x509 -req -days 365 -in $userdomain.csr -signkey $userdomain.key -out $userdomain.crt -extensions SAN
+
+# pem
+# openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
+# openssl s_client -showcerts -connect gitlab.ihengshuai.com:443 -servername gitlab.ihengshuai.com < /dev/null 2>/dev/null | openssl x509 -outform PEM > /certs/gitlab.ihengshuai.com.crt
+
+
+echo
+echo "Generate success!"
+echo
+
+# 将本地域名写入host
+echo 需要将域名写入host吗[yes/no]?
+read confirm_read_host
+if [ "$confirm_read_host" != "yes" ]; then
+    exit
+fi
+
+echo 需要保持和证书域名相同不[yes/no]?
+read confirm_write_host
+if [ "$confirm_write_host" == "no" ]; then
+    echo 请填写待写入host的域名
+    read custom_host_domain
+    cp /etc/hosts /etc/hosts.old
+    echo "127.0.0.1 $custom_host_domain" >>/etc/hosts
+    exit
+fi
+
+cp /etc/hosts /etc/hosts.old
+echo "127.0.0.1 $userdomain" >>/etc/hosts
+echo "Write success!"
+sleep 1

执行脚本根据提示输入生成证书:

sh
 ./auto-cetificate.sh

最终会产生如下文件:

sh
 ls && pwd
+auto-cetificate.sh  general-mac.com.crt  general-mac.com.csr  general-mac.com.key
+/root/certificates

生成DH加密参数:

sh
# 此过程会耗时
+openssl dhparam -out dhparam.pem 2048

对于SSL相关配置、握手不太清楚的可以阅读我的「HTTP协议及安全防范」一文

在nginx中配置https:

nginx
server {
+	listen       80;
+	listen       443 ssl;
+	server_name  general-mac.com;
+
+	# 证书
+	ssl_certificate /root/certificates/general-mac.com.crt;
+	ssl_certificate_key /root/certificates/general-mac.com.key;
+
+	# TLS版本、加密套件
+	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
+	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 加密套件根据自己需求调整
+	# 服务器推荐加密套件
+	ssl_prefer_server_ciphers on;
+	# DH参数
+	ssl_dhparam /root/certificates/dhparam.pem;
+
+	# TLS会话恢复
+	ssl_session_timeout 10m;
+	ssl_session_cache   shared:SSL:10m;
+	ssl_session_tickets off;
+
+	# 重定向https
+	if ($ssl_protocol = '') {
+	    rewrite ^(.*) https://$server_name$request_uri permanent;
+	}
+	# 判断有多种方式
+	#if ($scheme = 'http') {
+	#  rewrite ^(.*) https://$server_name$request_uri permanent;
+	#}
+}

配置好后记得重启nginx,打开游览器访问general-mac.com:由于自签证书没有被CA认证会被浏览器鉴定不安全的链接,点击高级进一步访问即可,或者将证书放入系统根证书中让操作系统信任

优化https

启用了https后由于会进行SSL握手会消耗更多的CPU资源,通过启用SSL会话重用来优化:

nginx
ssl_session_cache shared:SSL:50m;
+ssl_session_timeout 1h;
+ssl_session_tickets off;
  • ssl_session_cache:这个指令用于配置SSL会话缓存,它指定了缓存的名称("shared:SSL")和大小("50m")。SSL会话缓存是用来存储SSL握手过程中生成的会话密钥的,这些会话密钥可以被重用来加速后续的SSL握手过程。通过启用SSL会话缓存,可以减少SSL握手的时间和CPU负载,从而提高服务器的性能
  • ssl_session_timeout:这个指令用于配置SSL会话缓存的超时时间,它指定了会话缓存的有效期为1个小时。一旦会话缓存过期,会话密钥将被删除,下一次SSL握手将会重新生成一个新的会话密钥。通过使用合适的会话超时时间,可以平衡服务器的安全性和性能

配置HTTP2/3

要在nginx中启用HTTP/2需要在nginx版本1.9.5或更高版本中启用,只支持在加密通道上运行,因此只能在HTTPS上使用,在以上的基础上添加http2

nginx
server {
+	listen 443 ssl http2;
+
+	location / {
+		# HTTP2 server push功能
+		http2_push /style.css;
+	}
+}

打开浏览器访问:如果你没有看到h2,需要勾选显示protocol一栏 HTTP/2使用多路复用技术,可以在单个TCP连接上同时发送多个请求和响应。这样可以减少延迟和提高并发性,从而加快页面加载速度;HTTP/2使用二进制协议,可以减少网络流量和解析时间,从而提高了网络性能和效率

虽然HTTP2使用多路复用技术减少连接时间,由于其存在队头阻塞的问题,当一个请求或响应被阻塞时,后续请求或响应也会被阻塞,从而导致整个连接的性能下降,因此它仍不是完美的协议也是存在一些缺点

什么是队头阻塞

在HTTP/2中,多个请求和响应可以通过单个TCP连接并行传输。但是,由于HTTP/2使用了帧的概念来分割请求和响应,而帧必须按顺序发送和接收,因此如果前面的请求或响应被阻塞,后续的请求或响应也必须等待前面的请求或响应完成后才能发送或接收。这就是队头阻塞的问题。

那如何解决队头阻塞问题呢?可以使用多域名请求提高并发度、优化请求队列(性能好的放前面之类)、采用HTTP3

这里来讲QUIC协议(HTTP3),一种基于UDP协议的传输层协议,其优势如下:

  • 更快的连接建立和恢复
  • 更好的多路复用:使用流来分隔请求和响应,可以更好地实现多路复用,并且不需要使用帧头部,从而提高了头部压缩效率。此外,QUIC还支持优先级,可以更好地控制请求和响应的优先级
  • 更好的拥塞控制:QUIC采用基于TCP的拥塞控制算法,但可以更快地适应网络环境的变化,从而提高了网络传输的效率。同时,QUIC还支持基于连接的流量控制,可以更好地适应不同的应用需求
  • QUIC使用TLS 1.3来保护数据的安全性和隐私性,并且支持0-RTT、1—RTT握手,可以更快地建立安全连接。此外,QUIC还支持源地址验证和连接迁移等功能,可以更好地防止网络攻击和提高网络的可靠性

如何使用?可以安装nginx-quic使用其功能,这里就不介绍如何安装了,可以参考nginx-quic官方配置quiche配置nginx

nginx
server {
+	listen 443 ssl http2; #TCP
+	listen 443 http3 quic reuseport; # QUIC
+
+	ssl_protocols   TLSv1.3;
+	# 开启 TLS 1.3 0-RTT
+	ssl_early_data on;
+	add_header Alt-Svc 'h3-29=":8443"; ma=2592000,h3-T051=":8443"; ma=2592000,h3-Q050=":8443"; ma=2592000,h3-Q046=":8443"; ma=2592000,h3-Q043=":8443"; ma=2592000,quic=":8443"; ma=2592000; v="46,43"';
+}

参考文档:

keepalived实现高可用

由于流量都是通过nginx入口分发给应用服务,nginx很难保持永久正常服务状态,当nginx挂了时就会导致所有应用都无法访问,因此使用多个机器进行备份待用实现高可用是必然的

keepalived是一款常用于搭建高可用性服务的软件,可以与nginx等应用程序一起使用,以确保在一个节点故障时,服务能够在另一个节点上继续运行,从而提高应用程序的可用性和稳定性。keepalived需要绑定和主机同一网段的一个或多个虚拟ip,根据检测机制将虚拟ip绑定到指定的机器上,当机器宕机时,又会绑定到另一个健康的机器上。使用keepalived实现高可用至少需要2台主机,这里准备两台虚拟机。

  1. 每个节点都安装keepalived和nginx

    sh
    yum install keepalived nginx -y
  2. 查看节点网卡,这里显示我有两张网卡ens160和ens256,这里使用ens256网卡地址,两个节点的ip分别为192.168.10.9192.168.10.8

    sh
    # 节点1
    + keepalived ip a
    +2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    +    link/ether xx:xx:xx:xx:76:b0 brd ff:ff:ff:ff:ff:ff
    +    inet 192.168.3.92/24 brd 192.168.3.255 scope global noprefixroute dynamic ens160
    +       valid_lft 79657sec preferred_lft 79657sec
    +3: ens256: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    +    link/ether xx:xx:xx:xx:72:86 brd ff:ff:ff:ff:ff:ff
    +    inet 192.168.10.9/24 brd 192.168.10.255 scope global noprefixroute ens256
    +       valid_lft forever preferred_lft forever
    +
    +# 节点2
    + keepalived ip a
    +# ...
    +192.168.10.8/24
  3. 配置keepalived,vim /etc/keepalived/keepalived.conf:默认的配置文件应该有很多,只需要以下配置即可,其他可以直接删除掉

    注意每个节点都需要配置以下内容,不同的节点请注意配置文件中的提示进行修改

    nginx
    # /etc/keepalived/keepalived.conf
    +! Configuration File for keepalived
    +
    +global_defs {
    +   router_id LVS_DEVEL
    +   #vrrp_strict
    +   vrrp_skip_check_adv_addr
    +   vrrp_garp_interval 0
    +   vrrp_gna_interval 0
    +}
    +
    +vrrp_script chk_http_ port {
    +	# 检测nginx健康状态脚本,根据下一步骤创建
    +	script "/etc/keepalived/nginx_check.sh"
    +	interval 2
    +	weight 2
    +}
    +
    +vrrp_instance VI_1 {
    +	# 指定keepalived的角色,MASTER为主,BACKUP为备,当前节点设置为MASTER,其余节点设置为BACKUP
    +	state MASTER
    +	# 指定网卡,根据自己节点网卡的名称 替换ens256
    +	interface ens256
    +	# vrrp实例id,所有节点的值必须一致
    +	virtual_router_id 51
    +	# 数值越大,优先级越大,获取处理请求的优先级越高,根据节点的性能自行调整
    +	priority 100
    +	# 检测节点状态的心跳间隔
    +	advert_int 1
    +	# 节点间通信类型和密码
    +	authentication {
    +		auth_type PASS # 密码类型
    +		auth_pass 1111 # 密码
    +	}
    +	# 虚拟ip,根据当前节点的ip网段设置
    +	virtual_ipaddress {
    +		# 设置其中一个虚拟ip为 192.168.10.5  网卡 ens256  打标签 ens256:vip51
    +		192.168.10.5/24 dev ens256 label ens256:vip51
    +	}
    +}
  4. 配置检测nginx状态脚本,同样每个节点都需要,vim /etc/keepalived/nginx_check.sh

    bash
    #! /bin/bash
    +
    +# 查看nginx的进程数
    +A=\`ps -C nginx --no-heading | wc -l\`
    +# 进程数位0时,启动nginx
    +if [ $A -eq 0 ];then
    +    /usr/sbin/nginx
    +    sleep 2
    +    # 两秒后nginx进程还是0则杀死keepalived,进行VIP的转移,将会飘到另一节点上
    +    if [ \`ps -C nginx --no-heading | wc -l\` -eq 0 ];then
    +        killall keepalived
    +    fi
    +fi
  5. 所有节点添加keepalived_script用户并赋予执行脚本权限:

    sh
     useradd keepalived_script
    + visudo # 添加以下内容
    +keepalived_script ALL=(ALL) NOPASSWD: ALL
  6. 所有节点启动nginx和keepalived,请确保nginx可以正常访问:为了方便演示,可以将不同节点的nginx首页设置成不同的

    sh
    # 启动nginx,或 systemctl start nginx,安装包的在bin文件下执行
    + nginx
    +# 启动keepalived
    + systemctl start keepalived
    +
    +# 查看keepalive状态
    + systemctl status keepalived -l
    +keepalived.service - LVS and VRRP High Availability Monitor
    +Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
    +Active: active (running) since 六 2020-04-08 18:08:52 CST; 18min ago
    +Process: 5171 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
    +Main PID: 5172 (keepalived)
    +	CGroup: /system.slice/keepalived.service
    +       ├─5172 /usr/sbin/keepalived -D
    +       ├─5173 /usr/sbin/keepalived -D
    +       └─5174 /usr/sbin/keepalived -D
    +
    +4月 08 18:08:54 general-mac Keepalived_vrrp[5174]: Sending gratuitous ARP on ens256 for 192.168.10.5
    +4月 08 18:08:54 general-mac Keepalived_vrrp[5174]: Sending gratuitous ARP on ens256 for 192.168.10.5
  7. 在主节点上查看ip:可以看到当前主节点的ens256网卡上会绑定一个VIP(192.168.10.5),就是keepalived设置的虚拟ip192.168.10.5,查看其他机器是没有当前VIP的

    sh
     ip a
    +#省略其他...
    +3: ens256: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    +link/ether xx:xx:xx:xx:72:86 brd ff:ff:ff:ff:ff:ff
    +inet 192.168.10.9/24 brd 192.168.10.255 scope global noprefixroute ens256
    +   valid_lft forever preferred_lft forever
    +inet 192.168.10.5/24 scope global secondary ens256:vip51
    +   valid_lft forever preferred_lft forever
  8. 浏览器访问VIP地址192.168.10.5

    当所有节点都没有问题时keepalived会将访问导向priority优先级最高的节点上,上面主节点优先级最高,所以会返回主节点上的nginx首页(包含k8s图片)

    这里停用主节点上的keepalived来演示宕机的情况,宕机后VIP会从当前节点剔除并根据优先级绑定到另一节点,这样再次访问时就会访问到另一节点的nginx上,而当宕机恢复后keepalived又会根据优先级回到原来的节点上,感兴趣可以试试

    sh
    # 主节点上停止
    + systemctl stop keepalived
    +# 主节点上查看ip,网卡上没了VIP
    + ip a
    +
    +# 另一节点上查看,会发现绑定了VIP,再次刷新浏览器发现网页变了
    + ip a

内置变量

以下是一些常用的内置变量,对于配置是有很大帮助的

sh
$arg_PARAMETER #GET 请求中变量名 PARAMETER 参数的值
+$args #这个变量等于 GET 请求中的参数,例如,foo=123&bar=blahblah;这个变量可以被修改
+$binary_remote_addr #二进制码形式的客户端地址
+$body_bytes_sent #传送页面的字节数
+$content_length #请求头中的 Content-length 字段
+$content_type #请求头中的 Content-Type 字段
+$cookie_COOKIE #cookie COOKIE 的值
+$document_root #当前请求在 root 指令中指定的值
+$document_uri #与 $uri 相同
+$host #请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的 server 名称(处理请求的 server 的 server_name 指令的值)。值为小写,不包含端口
+$hostname #机器名使用 gethostname 系统调用的值
+$http_HEADER #HTTP 请求头中的内容,HEADER 为 HTTP 请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent 的值)
+$sent_http_HEADER #HTTP 响应头中的内容,HEADER 为 HTTP 响应中的内容转为小写,-变为_(破折号变为下划线),例如:sent_http_content_type…
+$is_args #如果 $args 设置,值为"?",否则为""
+$limit_rate #这个变量可以限制连接速率
+$nginx_version #当前运行的 nginx 版本号
+$query_string #与 $args 相同
+$remote_addr #客户端的IP地址
+$remote_port #客户端的端口
+$remote_port #已经经过 Auth Basic Module 验证的用户名
+$request_filename #当前连接请求的文件路径,由 root 或 alias 指令与 URI 请求生成
+$request_body #这个变量(0.7.58+)包含请求的主要信息。在使用 proxy_pass 或 fastcgi_pass 指令的 location 中比较有意义
+$request_body_file #客户端请求主体信息的临时文件名
+$request_completion #如果请求成功,设为"OK";如果请求未完成或者不是一系列请求中最后一部分则设为空
+$request_method #这个变量是客户端请求的动作,通常为 GET 或 POST。包括 0.8.20 及之前的版本中,这个变量总为 main request 中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作
+$request_uri #这个变量等于包含一些客户端请求参数的原始 URI,它无法修改,请查看 $uri 更改或重写 URI
+$scheme #所用的协议,例如 http 或者是 https,例如 rewrite ^(.+)$$scheme://example.com$1 redirect
+$server_addr #服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数
+$server_name #服务器名称
+$server_port #请求到达服务器的端口号
+$server_protocol #请求使用的协议,通常是 HTTP/1.0、HTTP/1.1或HTTP/2
+$uri #请求中的当前 URI(不带请求参数,参数位于 args ) , 不 同 于 浏 览 器 传 递 的 args),不同于浏览器传递的 args),不同于浏览器传递的 request_uri 的值,它可以通过内部重定向,或者使用 index 指令进行修改。不包括协议和主机名,例如 /foo/bar.html

参考文档

`,169);function i(y,b,D,u,F,m){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[c,s(a),s(l)])}const h=p(r,[["render",i]]);export{B as __pageData,h as default}; diff --git a/assets/frontend_nginx_base.md.uaI9zQ4K.lean.js b/assets/frontend_nginx_base.md.uaI9zQ4K.lean.js new file mode 100644 index 000000000..475a7dbe7 --- /dev/null +++ b/assets/frontend_nginx_base.md.uaI9zQ4K.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"Nginx使用手册","description":"Nginx是一个高性能、高可靠性、低内存占用和高并发性的HTTP和反向代理服务器,非常适合用于高负载的Web 站点、应用服务器和API网关等场景。通过本文来学习nginx强大功能如:静态服务器、反向代理、缓存压缩、HTTPS、跨域等等","frontmatter":{"title":"Nginx使用手册","description":"Nginx是一个高性能、高可靠性、低内存占用和高并发性的HTTP和反向代理服务器,非常适合用于高负载的Web 站点、应用服务器和API网关等场景。通过本文来学习nginx强大功能如:静态服务器、反向代理、缓存压缩、HTTPS、跨域等等","keywords":"nginx教程,nginx安装,nginx命令,nginx反向代理,nginx跨域,nginx缓存","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-nginx.png"},"headers":[],"relativePath":"frontend/nginx/base.md","filePath":"frontend/nginx/base.md","lastUpdated":1706247228000}'),r={name:"frontend/nginx/base.md"},c=o("",169);function i(y,b,D,u,F,m){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[c,s(a),s(l)])}const h=p(r,[["render",i]]);export{B as __pageData,h as default}; diff --git a/assets/frontend_node-bff_index.md.hRxjNnOC.js b/assets/frontend_node-bff_index.md.hRxjNnOC.js new file mode 100644 index 000000000..fe6e31ce8 --- /dev/null +++ b/assets/frontend_node-bff_index.md.hRxjNnOC.js @@ -0,0 +1 @@ +import{_ as n,c as t,o as a,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"node-bff","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node-bff/index.md","filePath":"frontend/node-bff/index.md","lastUpdated":1706247228000}'),d={name:"frontend/node-bff/index.md"},f=e("h1",{id:"node-bff",tabindex:"-1"},[o("node-bff "),e("a",{class:"header-anchor",href:"#node-bff","aria-label":'Permalink to "node-bff"'},"​")],-1),r=[f];function s(c,i,_,l,p,m){return a(),t("div",null,r)}const x=n(d,[["render",s]]);export{h as __pageData,x as default}; diff --git a/assets/frontend_node-bff_index.md.hRxjNnOC.lean.js b/assets/frontend_node-bff_index.md.hRxjNnOC.lean.js new file mode 100644 index 000000000..fe6e31ce8 --- /dev/null +++ b/assets/frontend_node-bff_index.md.hRxjNnOC.lean.js @@ -0,0 +1 @@ +import{_ as n,c as t,o as a,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"node-bff","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node-bff/index.md","filePath":"frontend/node-bff/index.md","lastUpdated":1706247228000}'),d={name:"frontend/node-bff/index.md"},f=e("h1",{id:"node-bff",tabindex:"-1"},[o("node-bff "),e("a",{class:"header-anchor",href:"#node-bff","aria-label":'Permalink to "node-bff"'},"​")],-1),r=[f];function s(c,i,_,l,p,m){return a(),t("div",null,r)}const x=n(d,[["render",s]]);export{h as __pageData,x as default}; diff --git a/assets/frontend_node-optimize_index.md.f6NvNEj-.js b/assets/frontend_node-optimize_index.md.f6NvNEj-.js new file mode 100644 index 000000000..9c749afd4 --- /dev/null +++ b/assets/frontend_node-optimize_index.md.f6NvNEj-.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as n,m as e,a}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"node-optimize","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node-optimize/index.md","filePath":"frontend/node-optimize/index.md","lastUpdated":1706247228000}'),i={name:"frontend/node-optimize/index.md"},d=e("h1",{id:"node-optimize",tabindex:"-1"},[a("node-optimize "),e("a",{class:"header-anchor",href:"#node-optimize","aria-label":'Permalink to "node-optimize"'},"​")],-1),r=[d];function s(c,p,m,_,l,f){return n(),o("div",null,r)}const z=t(i,[["render",s]]);export{x as __pageData,z as default}; diff --git a/assets/frontend_node-optimize_index.md.f6NvNEj-.lean.js b/assets/frontend_node-optimize_index.md.f6NvNEj-.lean.js new file mode 100644 index 000000000..9c749afd4 --- /dev/null +++ b/assets/frontend_node-optimize_index.md.f6NvNEj-.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as n,m as e,a}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"node-optimize","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node-optimize/index.md","filePath":"frontend/node-optimize/index.md","lastUpdated":1706247228000}'),i={name:"frontend/node-optimize/index.md"},d=e("h1",{id:"node-optimize",tabindex:"-1"},[a("node-optimize "),e("a",{class:"header-anchor",href:"#node-optimize","aria-label":'Permalink to "node-optimize"'},"​")],-1),r=[d];function s(c,p,m,_,l,f){return n(),o("div",null,r)}const z=t(i,[["render",s]]);export{x as __pageData,z as default}; diff --git a/assets/frontend_node_base.md.XlnRBo2L.js b/assets/frontend_node_base.md.XlnRBo2L.js new file mode 100644 index 000000000..d9977f156 --- /dev/null +++ b/assets/frontend_node_base.md.XlnRBo2L.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as r,V as t}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"NodeJS基本使用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/base.md","filePath":"frontend/node/base.md","lastUpdated":1706247228000}'),o={name:"frontend/node/base.md"},n=t('

NodeJS基本使用

// 待更新...

参考文档

',4),l=[n];function d(i,s,h,_,c,f){return r(),a("div",null,l)}const m=e(o,[["render",d]]);export{b as __pageData,m as default}; diff --git a/assets/frontend_node_base.md.XlnRBo2L.lean.js b/assets/frontend_node_base.md.XlnRBo2L.lean.js new file mode 100644 index 000000000..103b9194a --- /dev/null +++ b/assets/frontend_node_base.md.XlnRBo2L.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as r,V as t}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"NodeJS基本使用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/base.md","filePath":"frontend/node/base.md","lastUpdated":1706247228000}'),o={name:"frontend/node/base.md"},n=t("",4),l=[n];function d(i,s,h,_,c,f){return r(),a("div",null,l)}const m=e(o,[["render",d]]);export{b as __pageData,m as default}; diff --git a/assets/frontend_node_node-debug.md.PY_CCMV9.js b/assets/frontend_node_node-debug.md.PY_CCMV9.js new file mode 100644 index 000000000..0d869c301 --- /dev/null +++ b/assets/frontend_node_node-debug.md.PY_CCMV9.js @@ -0,0 +1 @@ +import{_ as e,c as t,o,V as a}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"NodeJS调试技巧","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-debug.md","filePath":"frontend/node/node-debug.md","lastUpdated":1706247228000}'),n={name:"frontend/node/node-debug.md"},d=a('

NodeJS调试技巧

// 待补充...

参考文档

',4),r=[d];function s(i,_,c,l,h,u){return o(),t("div",null,r)}const f=e(n,[["render",s]]);export{b as __pageData,f as default}; diff --git a/assets/frontend_node_node-debug.md.PY_CCMV9.lean.js b/assets/frontend_node_node-debug.md.PY_CCMV9.lean.js new file mode 100644 index 000000000..c47d9a271 --- /dev/null +++ b/assets/frontend_node_node-debug.md.PY_CCMV9.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o,V as a}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"NodeJS调试技巧","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-debug.md","filePath":"frontend/node/node-debug.md","lastUpdated":1706247228000}'),n={name:"frontend/node/node-debug.md"},d=a("",4),r=[d];function s(i,_,c,l,h,u){return o(),t("div",null,r)}const f=e(n,[["render",s]]);export{b as __pageData,f as default}; diff --git a/assets/frontend_node_node-framework.md.IA789WKd.js b/assets/frontend_node_node-framework.md.IA789WKd.js new file mode 100644 index 000000000..18201fbf9 --- /dev/null +++ b/assets/frontend_node_node-framework.md.IA789WKd.js @@ -0,0 +1 @@ +import{_ as o,c as n,o as t,m as e,a}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"NodeJS常见框架","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-framework.md","filePath":"frontend/node/node-framework.md","lastUpdated":1706247228000}'),r={name:"frontend/node/node-framework.md"},d=e("h1",{id:"nodejs常见框架",tabindex:"-1"},[a("NodeJS常见框架 "),e("a",{class:"header-anchor",href:"#nodejs常见框架","aria-label":'Permalink to "NodeJS常见框架"'},"​")],-1),s=e("ul",null,[e("li",null,"express"),e("li",null,"koa"),e("li",null,"egg"),e("li",null,"nestjs(单独列出模块)")],-1),l=e("p",null,"// 待补充...",-1),c=[d,s,l];function i(_,f,m,p,h,u){return t(),n("div",null,c)}const N=o(r,[["render",i]]);export{x as __pageData,N as default}; diff --git a/assets/frontend_node_node-framework.md.IA789WKd.lean.js b/assets/frontend_node_node-framework.md.IA789WKd.lean.js new file mode 100644 index 000000000..18201fbf9 --- /dev/null +++ b/assets/frontend_node_node-framework.md.IA789WKd.lean.js @@ -0,0 +1 @@ +import{_ as o,c as n,o as t,m as e,a}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"NodeJS常见框架","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-framework.md","filePath":"frontend/node/node-framework.md","lastUpdated":1706247228000}'),r={name:"frontend/node/node-framework.md"},d=e("h1",{id:"nodejs常见框架",tabindex:"-1"},[a("NodeJS常见框架 "),e("a",{class:"header-anchor",href:"#nodejs常见框架","aria-label":'Permalink to "NodeJS常见框架"'},"​")],-1),s=e("ul",null,[e("li",null,"express"),e("li",null,"koa"),e("li",null,"egg"),e("li",null,"nestjs(单独列出模块)")],-1),l=e("p",null,"// 待补充...",-1),c=[d,s,l];function i(_,f,m,p,h,u){return t(),n("div",null,c)}const N=o(r,[["render",i]]);export{x as __pageData,N as default}; diff --git a/assets/frontend_node_node-measure.md.K9kMWbHF.js b/assets/frontend_node_node-measure.md.K9kMWbHF.js new file mode 100644 index 000000000..04e3c5b90 --- /dev/null +++ b/assets/frontend_node_node-measure.md.K9kMWbHF.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,V as t}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"NodeJS性能优化","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-measure.md","filePath":"frontend/node/node-measure.md","lastUpdated":1706247228000}'),n={name:"frontend/node/node-measure.md"},r=t('

NodeJS性能优化

// 待补充...

压测

  • ab
  • webbench
  • Autocannon

分析

  • profile
  • chrome devtools
  • 内存
  • CPU
',6),l=[r];function d(i,s,c,_,h,u){return o(),a("div",null,l)}const p=e(n,[["render",d]]);export{f as __pageData,p as default}; diff --git a/assets/frontend_node_node-measure.md.K9kMWbHF.lean.js b/assets/frontend_node_node-measure.md.K9kMWbHF.lean.js new file mode 100644 index 000000000..4cf8f8182 --- /dev/null +++ b/assets/frontend_node_node-measure.md.K9kMWbHF.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,V as t}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"NodeJS性能优化","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-measure.md","filePath":"frontend/node/node-measure.md","lastUpdated":1706247228000}'),n={name:"frontend/node/node-measure.md"},r=t("",6),l=[r];function d(i,s,c,_,h,u){return o(),a("div",null,l)}const p=e(n,[["render",d]]);export{f as __pageData,p as default}; diff --git a/assets/frontend_node_node-process.md.nI0gQQIR.js b/assets/frontend_node_node-process.md.nI0gQQIR.js new file mode 100644 index 000000000..06917f4ff --- /dev/null +++ b/assets/frontend_node_node-process.md.nI0gQQIR.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as n,m as e,a as s}from"./chunks/framework.SV1ROkXV.js";const N=JSON.parse('{"title":"NodeJS多进程与多线程","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-process.md","filePath":"frontend/node/node-process.md","lastUpdated":1706247228000}'),a={name:"frontend/node/node-process.md"},d=e("h1",{id:"nodejs多进程与多线程",tabindex:"-1"},[s("NodeJS多进程与多线程 "),e("a",{class:"header-anchor",href:"#nodejs多进程与多线程","aria-label":'Permalink to "NodeJS多进程与多线程"'},"​")],-1),r=e("p",null,"// 待补充...",-1),c=[d,r];function i(_,l,p,f,h,m){return n(),t("div",null,c)}const x=o(a,[["render",i]]);export{N as __pageData,x as default}; diff --git a/assets/frontend_node_node-process.md.nI0gQQIR.lean.js b/assets/frontend_node_node-process.md.nI0gQQIR.lean.js new file mode 100644 index 000000000..06917f4ff --- /dev/null +++ b/assets/frontend_node_node-process.md.nI0gQQIR.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as n,m as e,a as s}from"./chunks/framework.SV1ROkXV.js";const N=JSON.parse('{"title":"NodeJS多进程与多线程","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-process.md","filePath":"frontend/node/node-process.md","lastUpdated":1706247228000}'),a={name:"frontend/node/node-process.md"},d=e("h1",{id:"nodejs多进程与多线程",tabindex:"-1"},[s("NodeJS多进程与多线程 "),e("a",{class:"header-anchor",href:"#nodejs多进程与多线程","aria-label":'Permalink to "NodeJS多进程与多线程"'},"​")],-1),r=e("p",null,"// 待补充...",-1),c=[d,r];function i(_,l,p,f,h,m){return n(),t("div",null,c)}const x=o(a,[["render",i]]);export{N as __pageData,x as default}; diff --git a/assets/frontend_node_node-web.md.8gBO0zUa.js b/assets/frontend_node_node-web.md.8gBO0zUa.js new file mode 100644 index 000000000..f97c83799 --- /dev/null +++ b/assets/frontend_node_node-web.md.8gBO0zUa.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as n,m as e,a}from"./chunks/framework.SV1ROkXV.js";const w=JSON.parse('{"title":"NodeJS搭建web服务","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-web.md","filePath":"frontend/node/node-web.md","lastUpdated":1706247228000}'),d={name:"frontend/node/node-web.md"},s=e("h1",{id:"nodejs搭建web服务",tabindex:"-1"},[a("NodeJS搭建web服务 "),e("a",{class:"header-anchor",href:"#nodejs搭建web服务","aria-label":'Permalink to "NodeJS搭建web服务"'},"​")],-1),r=e("p",null,"// 待补充...",-1),c=[s,r];function i(_,l,p,f,b,h){return n(),t("div",null,c)}const u=o(d,[["render",i]]);export{w as __pageData,u as default}; diff --git a/assets/frontend_node_node-web.md.8gBO0zUa.lean.js b/assets/frontend_node_node-web.md.8gBO0zUa.lean.js new file mode 100644 index 000000000..f97c83799 --- /dev/null +++ b/assets/frontend_node_node-web.md.8gBO0zUa.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as n,m as e,a}from"./chunks/framework.SV1ROkXV.js";const w=JSON.parse('{"title":"NodeJS搭建web服务","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/node/node-web.md","filePath":"frontend/node/node-web.md","lastUpdated":1706247228000}'),d={name:"frontend/node/node-web.md"},s=e("h1",{id:"nodejs搭建web服务",tabindex:"-1"},[a("NodeJS搭建web服务 "),e("a",{class:"header-anchor",href:"#nodejs搭建web服务","aria-label":'Permalink to "NodeJS搭建web服务"'},"​")],-1),r=e("p",null,"// 待补充...",-1),c=[s,r];function i(_,l,p,f,b,h){return n(),t("div",null,c)}const u=o(d,[["render",i]]);export{w as __pageData,u as default}; diff --git a/assets/frontend_npm_index.md.zxaDPdL6.js b/assets/frontend_npm_index.md.zxaDPdL6.js new file mode 100644 index 000000000..85b26b789 --- /dev/null +++ b/assets/frontend_npm_index.md.zxaDPdL6.js @@ -0,0 +1 @@ +import{_ as a,c as n,o as t,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"npm package","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/npm/index.md","filePath":"frontend/npm/index.md","lastUpdated":1706247228000}'),r={name:"frontend/npm/index.md"},c=e("h1",{id:"npm-package",tabindex:"-1"},[o("npm package "),e("a",{class:"header-anchor",href:"#npm-package","aria-label":'Permalink to "npm package"'},"​")],-1),d=[c];function s(p,i,m,_,l,f){return t(),n("div",null,d)}const k=a(r,[["render",s]]);export{x as __pageData,k as default}; diff --git a/assets/frontend_npm_index.md.zxaDPdL6.lean.js b/assets/frontend_npm_index.md.zxaDPdL6.lean.js new file mode 100644 index 000000000..85b26b789 --- /dev/null +++ b/assets/frontend_npm_index.md.zxaDPdL6.lean.js @@ -0,0 +1 @@ +import{_ as a,c as n,o as t,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"npm package","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/npm/index.md","filePath":"frontend/npm/index.md","lastUpdated":1706247228000}'),r={name:"frontend/npm/index.md"},c=e("h1",{id:"npm-package",tabindex:"-1"},[o("npm package "),e("a",{class:"header-anchor",href:"#npm-package","aria-label":'Permalink to "npm package"'},"​")],-1),d=[c];function s(p,i,m,_,l,f){return t(),n("div",null,d)}const k=a(r,[["render",s]]);export{x as __pageData,k as default}; diff --git a/assets/frontend_pattern_base.md.ESTX4J2k.js b/assets/frontend_pattern_base.md.ESTX4J2k.js new file mode 100644 index 000000000..f35e499a5 --- /dev/null +++ b/assets/frontend_pattern_base.md.ESTX4J2k.js @@ -0,0 +1,422 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"设计模式","description":"设计模式是一种在软件开发中广泛应用的指导原则,旨在解决常见的设计问题。通过提供经过验证的解决方案,设计模式帮助开发人员构建可维护、可扩展和可重用的代码","frontmatter":{"title":"设计模式","description":"设计模式是一种在软件开发中广泛应用的指导原则,旨在解决常见的设计问题。通过提供经过验证的解决方案,设计模式帮助开发人员构建可维护、可扩展和可重用的代码","keywords":"设计模式,单例模式,发布订阅,策略模式,代理模式,装饰器模式,外观模式,工厂模式,迭代器模式,建造者模式,适配器模式等等","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/pattern/base.md","filePath":"frontend/pattern/base.md","lastUpdated":1706247228000}'),c={name:"frontend/pattern/base.md"},t=e(`

设计模式

设计模式 (Design Pattern) 是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结,任何事情都有套路,设计模式就是写代码中常见的套路,有些写法我们日常都在使用,下面我们来介绍一下。

订阅/发布模式(观察者)

pub/sub这个应该大家用到的最广的设计 模式了

在这种模式中,并不是一个对象调用另一个对象的方法,而是一个对象订阅另一个对象

特定活动并在状态改变后获得通知,订阅者因此也成为观察者,而被观察的对象成为发布者或主题。当发生了一个重要事件的时候发布者会通知(调用)所有订阅者并且可能经常以事件对象的形式传递消息。

简单的实现发布订阅设计模式:

js
// 创建EventBus
+class EventBus {
+  constructor() {
+    // 储存事件
+    this.tasks = {};
+  }
+  // 绑定事件
+  $on(eName, cb) {
+    typeof cb == "function"
+      ? this.tasks[eName] || (this.tasks[eName] = [])
+      : this.Error(cb, "is not a function");
+    this.tasks[eName].some(fn => fn == cb) 
+      ? true 
+      : this.tasks[eName].push(cb); // 避免重复绑定
+  }
+  // 触发事件
+  $emit(eName, ...arg) {
+    let taskQueue;
+    this.tasks[eName] && this.tasks[eName].length > 0
+      ? (taskQueue = this.tasks[eName])
+      : this.Error(eName, "is not defined or is a array of having empty callback");
+    taskQueue.forEach(fn => {
+      fn(...arg);
+    });
+  }
+  // 触发一次
+  $once(eName, cb) {
+    let fn = (...arg) => {
+      this.$off(eName, fn);
+      cb(...arg);
+    };
+    typeof cb == "function" && this.$on(eName, fn);
+  }
+  // 卸载事件
+  $off(eName, cb) {
+    let taskQueue;
+    this.tasks[eName] && this.tasks[eName].length > 0
+      ? (taskQueue = this.tasks[eName])
+      : this.Error(eName, "is not exist");
+    if (typeof cb === "function") {
+      let index = taskQueue.findIndex(v => (v == cb));
+      index != -1 &&
+        taskQueue.splice(
+          taskQueue.findIndex(v => (v == cb)),
+          1
+        );
+    }
+    if (typeof cb === "undefined") {
+      taskQueue.length = 0;
+    }
+  }
+  // 异常处理
+  Error(node, errorMsg) {
+    throw Error(\`\${node} \${errorMsg}\`);
+  }
+}

下面我们针对自己的模式进行简单的使用:

js
// 首先定义一个事件池
+const EventSinks = {
+  add(x, y) {
+    console.log("总和: " + x + y);
+  },
+  multip(x, y) {
+    console.log("乘积: " + x * y);
+  },
+  onceEvent() {
+    console.log("我执行一次后就自动卸载");
+  }
+};
+// 实例化对象
+let bus = new EventBus();
+bus.$on("operator", EventSinks.add); // 监听operator事件, 增加一个EventSinks.add
+bus.$on("operator", EventSinks.add); // 当事件名和回调函数相同时,跳过,避免重复绑定
+bus.$on("operator", EventSinks.multip); // 给operator事件增加一个EventSinks.multip回调函数
+bus.$once("onceEvent", EventSinks.onceEvent); // 触发一次后卸载
+console.log(bus.tasks); // { operator: [ [Function: add], [Function: multip] ], onceEvent: [ [Function: fn] ]}
+bus.$emit("operator", 3, 5); // 总和:8  乘积:15
+bus.$emit("onceEvent"); // 我就执行一次
+console.log(bus.tasks); // { operator: [ [Function: add], [Function: multip] ], onceEvent: [] }
+bus.$off("operator", EventSinks.add); // 卸载掉operator事件中的EventSinks.add函数体
+console.log(bus.tasks); // { operator: [ [Function: multip] ], onceEvent: [] }
+bus.$off("operator"); // 卸载operator事件的所有回调函数
+console.log(bus.tasks); // { operator: [], onceEvent: [] }
+bus.$emit("onceEvent"); // onceEvent is not defined or is a array of having empty callback

单例模式

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,否则就创建实例再返回,这就保证了一个类只实例化一次

使用场景:一个单一对象。比如:弹窗,无论点击多少次,弹窗只应该被创建一次,实现起来也很简单,用一个变量缓存起来即可。可以参考ElementUI模态框的实现

简单实现单例模式(只要有个变量确保实例只创建一次):

js
class Singleton {
+  constructor() {}
+}
+Singleton.getInstance = (function() {
+  let instance
+  return function() {
+    if (!instance) {
+      instance = new Singleton()
+    }
+    return instance
+  }
+})()
+let s1 = Singleton.getInstance()
+let s2 = Singleton.getInstance()
+console.log(s1 === s2) // true

当我们再次创建时,如果实例化了,就不在实例化,直接返回,上面可以看出,二者相同

策略模式

策略模式的定义:定义一系列的算法,把他们一个个封装起来,并且使他们可以互相替换 策略模式的目的就是将算法的使用、算法的实现分离出来

一个基于策略模式的程序至少由两部分组成。第一部分是一组策略类(可变),策略类封装了具体的算法,并负责具体的计算过程。第二部分是环境类Context(不变),Context接受客户的请求,随后将请求委托给某一个策略类。要做到这一点,说明Context中要维持对某个策略对象的引用

举个表单校验栗子:

js
// 普通写法
+const form = document.querySelector("#form");
+form.onsubmit = () => {
+  if (form.username.value == "") {
+    console.log("用户名不能为空");
+    return false;
+  }
+  if(form.username.password.length < 10){
+    console.log('密码长度不能小于10')
+    return false
+  }
+}

简单的策略模式

js
// 创建校验器
+const checker = {
+  isEmpty(v, errorMsg){
+    if(value === ''){
+      return errorMsg
+    }
+  },
+  minLength(v, length, errorMsg){
+    if(value.length < length){
+      return errorMsg
+    }
+  }
+}
+const validator = () => {
+  // 校验规则存储
+  this.cache = []
+}
+validator.prototype.add = () => {
+  let arr = rule.split(':')
+  this.cache.push(() => {
+    let valit = arr.shift()
+    arr.unshift(dom.value)
+    arr.push(errorMsg)
+    return checker[valit].apply(dom, arr)
+  })
+}
+validator.prototype.start = () => {
+  for(let i = 0, validatorFunc; validatorFunc = this.cache[i++];){
+    // 开始校验,并取得校验后的返回值
+    let msg = validatorFunc() 
+    if(msg){
+      return msg
+    }
+  }
+}
+const validatorFunc = () => {
+  // 创建一个validator对象
+  let valit = new validator() 
+  valit.add(form.username, 'isEmpty', '用户名不能为空')
+  valit.add(form.password, 'minLength', '密码长度不能小于10')
+  // 获得校验结果
+  let errorMsg = valit.start()  
+  return errorMsg  
+}
+// 再次登录
+const form = document.querySelector("#form");
+form.onsubmit = () => {
+  let errorMsg = validatorFunc()
+  if(errorMsg){
+    console.error(errorMsg)
+    return false
+  }
+}

当创建校验器后,校验规则清晰明了,可以动态增改,便于维护

代理模式

为一个对象提供一个代用品或占位符,以便控制它的访问 常用的虚拟代理形式:某一个花销很大的操作,可以通过虚拟代理的方式延迟这种需要他的时候才去创建(例:使用虚拟代理实现图片懒加载)

图片懒加载的方式:先通过一张loading图占位,然后通过异步的方式加载图片,等图片加载好了再把请求成功的图片加载到img标签上

栗子:

js
const imgFunc = (() => {
+    const imgNode = document.createElement('img')
+    document.body.appendChild(imgNode)
+    return{
+        setSrc: function(src){
+            imgNode.src = src
+        }
+    }
+})()
+const proxyImage = (() => {
+    let img = new Image()
+    img.onload = function(){
+        imgFunc.setSrc(this.src)
+    }
+    return {
+        setSrc: function(src){
+            imgFunc.setSrc('./loading.gif')
+            img.src = src
+        }
+    }
+})()
+proxyImage.setSrc('./pic.png')()

上面的栗子实现了加载图片时,在图片加载成功前,指定特定的图片,加载完成后替换成真是的数据

在我们生活中常用的事件代理、节流防抖函数其实都是代理模式的实现

装饰器模式

在不改变对象自身的基础上,在程序运行期间给对象动态地添加方法,注解也可以理解为装饰器。常见应用:react的高阶组件,或者react-redux中的@connect或者自己定义一些高阶组件 简单实现:

js
import React from 'react'
+const withLog = Component => {
+  // 完好无损渲染出来, 只是添加了两个生命周期函数
+  class NewComponent extends React.Component{
+    // 1
+    componentWillMount(){ 
+      console.time('ComponentRender')
+      console.log('准备完毕了')
+    }
+    render(){  // 完好无损渲染出来
+      return <Component { ...this.props }></Component>
+    }
+    // 2
+    componentDidMount(){
+      console.timeEnd('ComponentRender')
+      console.log('渲染完毕了')
+    }
+  }
+  return NewComponent
+}
+export { withLog }
+@withLog
+class xxx

在redux中可以找出装饰器的方式,其实Vue中的v-inputv-checkbox也可以认为是装饰器模式,对原生input和checkbox做一层装饰

装饰器模式和代理模式的结构看起来非常相似,这两种模式都描述了怎样为对象提供一定程度上的间接引用,并且向那个对象发送请求。代理模式和装饰器模式最重要的区别在于它们的意图和设计目的。代理模式的目的是:当直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者。装饰模式目的是:为对象动态加入的行为,本体定义了关键功能,而装饰器提供或拒绝它的访问,或者在访问本体前做一些额外的事。

外观模式

即在内部让多个方法一起被调用 涉及到兼容性,参数支持多格式,有很多这种代码,对外暴露统一API,比如上面的$on支持数组,$off参数支持多种情况,对面只用一个函数,内部判断实现

举个简单的栗子:

js
// 封装一些事件,让其兼容各个浏览器
+const myEvent = {
+  stopBubble(e){
+    if(typeof e.preventDefault() === 'function'){
+      e.preventDefault()
+    }
+    if(typeof e.stopPropagation() === 'function'){
+      e.stopPropagation()
+    }
+    // for IE
+    if(typeof e.returnValue === 'boolean'){
+      e.returnValue = false
+    }
+    if(typeof e.cancelBubble === 'boolean'){
+      e.cancelBubble = false
+    }
+  },
+  addEvent(dom, type, cb){
+    if(dom.addEventListener){
+      dom.addEventListener(type, cb, false)
+    } else if(dom.attachEvent){
+      dom.attachEvent('on' + type, cb)
+    }else{
+      dom['on' + type] = cb
+    }
+  }
+}

以上就用外观模式封装了两个基本事件,让其兼容各种浏览器,调用者不需要知道内部的构造,只要知道这个方法怎么用就行了。

工厂模式

提供创建对象的接口,把成员对象的创建工作转交给一个外部对象,好处就是消除对象直接的耦合(也就是相互影响) 常见的栗子,我们的弹窗message,对外部提供API,都是调用API,然后新建一个弹窗或者message的实例,就是典型的工厂模式

简单的栗子:

js
class Man {
+  constructor(name) {
+    this.name = name
+  }
+  say(){
+      console.log(\`我的名字 \` + this.name)
+  }
+}
+const p = new Man('JavaScript')
+p.say() // 我的名字 JavaScript

当然工厂模式并不仅仅是用来 new 出实例

可以想象一个场景。假设有一份很复杂的代码需要用户去调用,但是用户并不关心这些复杂的代码,只需要你提供给我一个接口去调用,用户只负责传递需要的参数,至于这些参数怎么使用,内部有什么逻辑是不关心的,只需要你最后返回我一个实例。这个构造过程就是工厂。

再比如下面Vue这个例子:

js
const Notification = function(options) {
+  if (Vue.prototype.$isServer) return;
+  options = options || {};
+  let userOnClose = options.onClose;
+  let id = "notification_" + seed++;
+  let postion = options.postion || "top-right";
+  options.onClose = function() {
+    Notification.close(id, userOnClose);
+  };
+  instance = new NotificationConstructor({
+    data: options
+  });
+  if(isVNode(options.message)){
+    instance.$slots.default = [options.message]
+    options.message = 'REPLACED_BY_VNODE'
+  }
+  instance.id = id
+  instance.$mount()
+  document.body.appendChild(instance.$el)
+  instance.visible = true
+  instance.dom = instance.$el
+  instance.dom.style.zIndex = PopupManager.nextZIndex()
+  let verticalOffset = options.offset || 0
+  instances.filter(item => {
+    verticalOffset += item.$el.offsetHeight + 16
+  })
+  verticalOffset += 16
+  instance.verticalOffset = verticalOffset
+  instances.push(instance)
+  return instance
+};

在上述代码中,我们可以调用它封装好的方法就可以创建对象实例,至于它内部的实现原理我们并不关心。

建造者模式Builder

和工厂者模式相比,参与了更多创建过程或者更加复杂

js
const Person = function(name, work){
+  // 创建应聘者缓存对象
+  let _person = new Human()
+  // 创建应聘者姓名解析对象
+  _person.name = new NamedNodeMap(name)
+  // 创建应聘者期望职位
+  _person.work = new Worker(work)
+  return _person
+}
+const p = new Person('小明', 'Java')
+console.log(p)

迭代器模式

指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 比如常用的:every、map、filter、forEach等等

js
const each = function(arr, callback){
+  if(!Array.isArray(arr)){
+    throw Error(\`\${arr} is not a Array\`)
+  }
+  for(let i = 0, l = arr.length; i < l; i++){
+    callback.call(arr[i], i, arr[i])
+  }
+}
+each([1,2,4], function(i, n){
+  console.log([i, n])
+})

享元模式

一种用于性能优化的模式,fly在这里是苍蝇的意思,意为蝇量级。享元模式的核心是运用共享技术来有效支持大量细粒度的对象。如果系统中因为创建了大量类似的对象而导致内存占用过高,享元模式就是非常有用了。在JavaScript中,浏览器特别是移动端的浏览器分配的内存并不多,如何节省内存就成了一件非常有意义的事情 假设有个内衣工厂,目前的产品有50中男衣和50中女士内衣,为了推销产品,工厂决定生产一些塑料模特来穿上他们的内衣拍成广告照片。正常情况下需要50个男模特和50个女模特,然后让他们每人分别穿上一件内衣来拍照

普通的做法:

js
const Model = function(sex, underwear){
+  this.sex = sex
+  this.underwear = underwear
+}
+Model.prototype.takePhoto = function(){
+  console.log('sex=' + this.sex + ' underwear=' + this.underwear)
+}
+for(let i = 1; i <= 50; i++){
+  let maleModel = new Model('male', 'underwear' + i)
+  maleModel.takePhoto()
+}
+for(let join = 1; join <= 50; join++){
+  let femaleModel = new Model('female', 'underwear' + join)
+  femaleModel.takePhoto()
+}

采用享元模式:

js
const Model = function(sex){
+  this.sex = sex
+}
+Model.prototype.takePhoto = function(){
+  console.log('sex=' + this.sex + ' underwear=' + this.underwear)
+}
+// 分别创建一个男模特和一个女模特对象
+let maleModel = new Model('male'),
+    femaleModel = new Model('female')
+// 给男模特依次穿上所有的男装,并进行拍照
+for(let i = 1; i <= 50; i++){
+  maleModel.underwear = 'underwear' + i
+  maleModel.takePhoto()
+}
+// 给女模特依次穿上所有的女装,并进行拍照
+for(let j = 1; j <= 50; j++){
+  femaleModel.underwear = 'underwear' + j
+  femaleModel.takePhoto()
+}
  • 内部状态存储于对象内部
  • 内部状态可以被一些对象共享
  • 内部状态独立于具体的场景,通常不会改变
  • 外部状态取决于具体的场景,并根据场景而变化,外部状态不能被共享

职责链模式

使多个对象都有机会处理请求,从而避免请求发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。职责链模式的名字非常形象,一系列可能会处理请求的对象被连成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,我们把这些对象称为链中的节点

简单的栗子:假设我们负责一个售卖手机的电商网站,分别经过缴纳500元定金和200元定金的两轮预定后(订单已在此时生成),现在已经到了正式购买的阶段。公司针对支付过预定金的用户有一定的优惠政策。在正式购买后,已经支付过500元定金的用户会受到100元的商城优惠券,200元定金的用户可以收到50元的优惠券,而之前没有支付定金的用户只能进入普通购买模式,也就是没有优惠券,且在存库有限的情况下不一定保证买到

js
let order500 = function(orderType, pay, stock) {
+  if (orderType === 1 && pay === true) {
+    console.log("500元定金预购,得到100元优惠券");
+  } else {
+    // 我不知道下一个节点是谁,反正把请求往后面传递
+    return "nextSuccessor";
+  }
+};
+let order200 = function(orderType, pay, stock) {
+  if (orderType === 2 && pay === true) {
+    console.log("200元定金预购,得到50元优惠券");
+  } else {
+    return "nextSuccessor";
+  }
+};
+let orderNormal = function(orderType, pay, stock) {
+  if (stock > 0) {
+    console.log("普通购买, 无优惠券");
+  } else {
+    console.log("库存不足");
+  }
+};
+let Chain = function(fn) {
+  this.fn = fn;
+  this.successor = null;
+};
+// Chain.prototype.setNextSuccessor 指定在链中的下一个节点
+Chain.prototype.setNextSuccessor = function(successor) {
+  return (this.successor = successor);
+};
+// Chain.prototype.passRequest 传递请求给某个节点
+Chain.prototype.passRequest = function() {
+  let ret = this.fn.apply(this, arguments);
+  if (ret === "nextSuccessor") {
+    return (
+      this.successor &&
+      this.successor.passRequest.apply(this.successor, arguments)
+    );
+  }
+  return ret;
+};
+let chainOrder500 = new Chain(order500)
+let chainOrder200 = new Chain(order200)
+let chainOrderNormal = new Chain(orderNormal)
+chainOrder500.setNextSuccessor(chainOrder200)
+chainOrder200.setNextSuccessor(chainOrderNormal)
+// 500元定金预购,得到100元优惠券
+chainOrder500.passRequest(1, true, 500)
+// 200元定金预购,得到50元优惠券
+chainOrder500.passRequest(2, true, 500)
+// 普通购买,无优惠券
+chainOrder500.passRequest(3, true, 500)
+// 库存不足
+chainOrder500.passRequest(1, false, 0)

适配器模式

解决两个软件实体间的接口不兼容的问题。使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作。适配器的别名是包装器(wrapper),这是一个相对简单的模式。在程序开发过程中有许多这样的场景:当我们试图调用模块或者对象的某个接口时,却发现这个接口的格式并不符合目前需求。这时候有两种解决办法,第一种是修改原来的接口实现,但如果原来的模板很复杂,或者我们拿到模块是一段别人编写的经过压缩的代码,修改原接口就显得不太现实了。第二种方法是创建一个适配器,将原接口转换为客户希望的另一个接口,客户只需要和适配器打交道

js
let googleMap = {
+  show: function(){
+    console.log('开始渲染谷歌地图')
+  }
+}
+let baiduMap = {
+  display: function(){
+    console.log('开始渲染百度地图')
+  }
+}
+let baiduMapAdapter = {
+  show: function(){
+    return baiduMap.display()
+  }
+}
+renderMap(googleMap)  // 开始渲染谷歌地图
+renderMap(baiduMapAdapter)  // 开始渲染百度地图

适配器模式主要用来解决两个已有接口不匹配的问题,它不考虑这接口时怎么实现的,也不考虑他们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够使他们协同作用

装饰模式和代理模式也不会改变原有对象的接口,但装饰器模式的作用是为了给对象增加功能。装饰器模式常常形成一条长的装饰链,适配器模式通常只包装一次。代理模式为了控制对对象的访问,通常也只包装一次。

我们设计很多插件,有默认值,也算是适配器的一种应用,vue的prop校验,default也算是适配器的应用了

外观模式的作用倒是和适配器比较相似,有人把外观模式看成一组对象的适配器,但外观模式最显著的特点是定义了一个新的接口。

模板方法模式

在一个方法中定义一个算法骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现 我们常用的有很多,vue中的slot,react中的children

js
class Parent {
+  constructor() {}
+  render() {
+    <div>
+      <div name="tom"></div>
+      {/* 算法过程:children要渲染在name为joe的div中 */}
+      <div name="joe">{this.props.children}</div>
+    </div>
+  }
+}
+class Stage{
+  constructor(){}
+  render(){
+    // 在parent中已经设定了children的渲染位置算法
+    <Parent>
+      // children的具体实现
+      <div>child</div>
+    </Parent>
+  }
+}
html
<template>
+  <div>
+    <div name="tom"></div>
+    <div name="joe">
+      <slot />
+    </div>
+  </div>
+</template>
+<template>
+  <div>
+    <parent>
+      <!-- children的具体实现 -->
+      <div>child</div>
+    </parent>
+  </div>
+</template>

中介者模式

通过一个中介者对象,其他所有的相关对象都通过该中介者来通信,而不是相互引用,当其中的一个对象发生改变时,只需要通知中介者对象即可。通过中介者模式可以解除对象与对象之间的紧耦合关系(目的就是减少耦合) 栗子:现实生活中,航线上的飞机只需要和机场的塔台通信就能确定航线和飞行状态,而不需要和所有飞机通信。同时塔台作为中介者,知道每架飞机的飞行状态,所以可以安排所有飞机的起降和航信安排。

中介者模式使用场景:例如购物车需求,存在商品选择表单、颜色选择表单、购买数量表单等等,都会触发change事件,那么可以通过中介者来转发处理这些事件,实现各个事件间的解耦,仅仅维护中介者对象即可。

redux、vuex都属于中介者模式的实际应用,我们把共享的数据,抽离成一个单独的store,每个都通过tore这个中介者来操作对象

备忘录模式

可以恢复到对象之前的某个状态,其实大家学习react或者redux的时候,时间旅行的功能,就算是备忘录模式的一个应用

总结

创建设计模式:工厂,单例、建造者、原型 结构化设计模式:外观,适配器,代理,装饰器,享元,桥接,组合 行为型模式:策略、模板方法、观察者、迭代器、责任链、命令、备忘录、状态、访问者、终结者、解释器

参考文档

`,88);function F(D,y,i,B,b,A){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const m=p(c,[["render",F]]);export{E as __pageData,m as default}; diff --git a/assets/frontend_pattern_base.md.ESTX4J2k.lean.js b/assets/frontend_pattern_base.md.ESTX4J2k.lean.js new file mode 100644 index 000000000..e0544a105 --- /dev/null +++ b/assets/frontend_pattern_base.md.ESTX4J2k.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"设计模式","description":"设计模式是一种在软件开发中广泛应用的指导原则,旨在解决常见的设计问题。通过提供经过验证的解决方案,设计模式帮助开发人员构建可维护、可扩展和可重用的代码","frontmatter":{"title":"设计模式","description":"设计模式是一种在软件开发中广泛应用的指导原则,旨在解决常见的设计问题。通过提供经过验证的解决方案,设计模式帮助开发人员构建可维护、可扩展和可重用的代码","keywords":"设计模式,单例模式,发布订阅,策略模式,代理模式,装饰器模式,外观模式,工厂模式,迭代器模式,建造者模式,适配器模式等等","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/pattern/base.md","filePath":"frontend/pattern/base.md","lastUpdated":1706247228000}'),c={name:"frontend/pattern/base.md"},t=e("",88);function F(D,y,i,B,b,A){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const m=p(c,[["render",F]]);export{E as __pageData,m as default}; diff --git a/assets/frontend_performance_base.md.4_74TDRU.js b/assets/frontend_performance_base.md.4_74TDRU.js new file mode 100644 index 000000000..e5283fe20 --- /dev/null +++ b/assets/frontend_performance_base.md.4_74TDRU.js @@ -0,0 +1 @@ +import{_ as s,c as r,J as o,m as e,a as c,o as d,G as t}from"./chunks/framework.SV1ROkXV.js";const D=JSON.parse('{"title":"前端性能优化","description":"前端优化旨在通过减少请求次数、优化资源加载和最小化DOM操作等策略,提高网页加载速度和响应速度,从而提升用户体验和网站性能,在现在web页面中已经成为了不可忽视的工作","frontmatter":{"title":"前端性能优化","description":"前端优化旨在通过减少请求次数、优化资源加载和最小化DOM操作等策略,提高网页加载速度和响应速度,从而提升用户体验和网站性能,在现在web页面中已经成为了不可忽视的工作","keywords":"前端性能优化,性能优化,performance,lighthouse,缓存优化,seo优化,安全优化,资源优化","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-perf.png","aside":false},"headers":[],"relativePath":"frontend/performance/base.md","filePath":"frontend/performance/base.md","lastUpdated":1706247228000}'),i={name:"frontend/performance/base.md"},l=e("h1",{id:"前端性能优化",tabindex:"-1"},[c("前端性能优化 "),e("a",{class:"header-anchor",href:"#前端性能优化","aria-label":'Permalink to "前端性能优化"'},"​")],-1),p=e("p",null,"从本模块开始都是关于性能优化的一系列文章,通常前端性能优化是非常重要和必不可少的工作",-1),_=e("p",null,"前端性能优化的手段涉及到多个方面,其中不限于代码优化、资源加载、资源大小、渲染优化、缓存优化、安全、seo等等。在现代 Web 页面中,用户对网页的加载速度和响应速度有着越来越高的要求,因此用户的留存率和性能优化及页面指标有着密不可分的关系。本模块会从多个方面讲解常见的优化手段,以及网站的评分指标和对药下症",-1),m=e("p",null,"总之,前端性能优化是一个涉及多个方面的综合性工作,通过合理的资源管理、减少请求次数、优化图片、减少 DOM 操作等策略,可以有效提高网页的加载速度和响应速度,提升用户体验和网站的性能",-1);function f(h,u,b,g,k,w){const a=t("Reward"),n=t("Gitalk");return d(),r("div",null,[l,p,_,m,o(a),o(n)])}const N=s(i,[["render",f]]);export{D as __pageData,N as default}; diff --git a/assets/frontend_performance_base.md.4_74TDRU.lean.js b/assets/frontend_performance_base.md.4_74TDRU.lean.js new file mode 100644 index 000000000..e5283fe20 --- /dev/null +++ b/assets/frontend_performance_base.md.4_74TDRU.lean.js @@ -0,0 +1 @@ +import{_ as s,c as r,J as o,m as e,a as c,o as d,G as t}from"./chunks/framework.SV1ROkXV.js";const D=JSON.parse('{"title":"前端性能优化","description":"前端优化旨在通过减少请求次数、优化资源加载和最小化DOM操作等策略,提高网页加载速度和响应速度,从而提升用户体验和网站性能,在现在web页面中已经成为了不可忽视的工作","frontmatter":{"title":"前端性能优化","description":"前端优化旨在通过减少请求次数、优化资源加载和最小化DOM操作等策略,提高网页加载速度和响应速度,从而提升用户体验和网站性能,在现在web页面中已经成为了不可忽视的工作","keywords":"前端性能优化,性能优化,performance,lighthouse,缓存优化,seo优化,安全优化,资源优化","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-perf.png","aside":false},"headers":[],"relativePath":"frontend/performance/base.md","filePath":"frontend/performance/base.md","lastUpdated":1706247228000}'),i={name:"frontend/performance/base.md"},l=e("h1",{id:"前端性能优化",tabindex:"-1"},[c("前端性能优化 "),e("a",{class:"header-anchor",href:"#前端性能优化","aria-label":'Permalink to "前端性能优化"'},"​")],-1),p=e("p",null,"从本模块开始都是关于性能优化的一系列文章,通常前端性能优化是非常重要和必不可少的工作",-1),_=e("p",null,"前端性能优化的手段涉及到多个方面,其中不限于代码优化、资源加载、资源大小、渲染优化、缓存优化、安全、seo等等。在现代 Web 页面中,用户对网页的加载速度和响应速度有着越来越高的要求,因此用户的留存率和性能优化及页面指标有着密不可分的关系。本模块会从多个方面讲解常见的优化手段,以及网站的评分指标和对药下症",-1),m=e("p",null,"总之,前端性能优化是一个涉及多个方面的综合性工作,通过合理的资源管理、减少请求次数、优化图片、减少 DOM 操作等策略,可以有效提高网页的加载速度和响应速度,提升用户体验和网站的性能",-1);function f(h,u,b,g,k,w){const a=t("Reward"),n=t("Gitalk");return d(),r("div",null,[l,p,_,m,o(a),o(n)])}const N=s(i,[["render",f]]);export{D as __pageData,N as default}; diff --git a/assets/frontend_performance_cache-perf.md.ztt0MTqt.js b/assets/frontend_performance_cache-perf.md.ztt0MTqt.js new file mode 100644 index 000000000..ee2e7e7f7 --- /dev/null +++ b/assets/frontend_performance_cache-perf.md.ztt0MTqt.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"缓存优化","description":"","frontmatter":{"title":"缓存优化"},"headers":[],"relativePath":"frontend/performance/cache-perf.md","filePath":"frontend/performance/cache-perf.md","lastUpdated":1706247228000}'),a={name:"frontend/performance/cache-perf.md"};function c(n,o,f,p,s,d){return r(),t("div")}const _=e(a,[["render",c]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_cache-perf.md.ztt0MTqt.lean.js b/assets/frontend_performance_cache-perf.md.ztt0MTqt.lean.js new file mode 100644 index 000000000..ee2e7e7f7 --- /dev/null +++ b/assets/frontend_performance_cache-perf.md.ztt0MTqt.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"缓存优化","description":"","frontmatter":{"title":"缓存优化"},"headers":[],"relativePath":"frontend/performance/cache-perf.md","filePath":"frontend/performance/cache-perf.md","lastUpdated":1706247228000}'),a={name:"frontend/performance/cache-perf.md"};function c(n,o,f,p,s,d){return r(),t("div")}const _=e(a,[["render",c]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_cache.md.DWS86kiQ.js b/assets/frontend_performance_cache.md.DWS86kiQ.js new file mode 100644 index 000000000..3963cb3e5 --- /dev/null +++ b/assets/frontend_performance_cache.md.DWS86kiQ.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as r,m as e,a as c}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"缓存策略","description":"","frontmatter":{"title":"缓存策略"},"headers":[],"relativePath":"frontend/performance/cache.md","filePath":"frontend/performance/cache.md","lastUpdated":1706247228000}'),o={name:"frontend/performance/cache.md"},n=e("h1",{id:"缓存策略",tabindex:"-1"},[c("缓存策略 "),e("a",{class:"header-anchor",href:"#缓存策略","aria-label":'Permalink to "缓存策略"'},"​")],-1),s=e("p",null,"// 待更新...",-1),d=[n,s];function i(l,_,p,f,h,m){return r(),t("div",null,d)}const $=a(o,[["render",i]]);export{x as __pageData,$ as default}; diff --git a/assets/frontend_performance_cache.md.DWS86kiQ.lean.js b/assets/frontend_performance_cache.md.DWS86kiQ.lean.js new file mode 100644 index 000000000..3963cb3e5 --- /dev/null +++ b/assets/frontend_performance_cache.md.DWS86kiQ.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as r,m as e,a as c}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"缓存策略","description":"","frontmatter":{"title":"缓存策略"},"headers":[],"relativePath":"frontend/performance/cache.md","filePath":"frontend/performance/cache.md","lastUpdated":1706247228000}'),o={name:"frontend/performance/cache.md"},n=e("h1",{id:"缓存策略",tabindex:"-1"},[c("缓存策略 "),e("a",{class:"header-anchor",href:"#缓存策略","aria-label":'Permalink to "缓存策略"'},"​")],-1),s=e("p",null,"// 待更新...",-1),d=[n,s];function i(l,_,p,f,h,m){return r(),t("div",null,d)}const $=a(o,[["render",i]]);export{x as __pageData,$ as default}; diff --git a/assets/frontend_performance_chunk-upload.md.SxJaw511.js b/assets/frontend_performance_chunk-upload.md.SxJaw511.js new file mode 100644 index 000000000..bee103a69 --- /dev/null +++ b/assets/frontend_performance_chunk-upload.md.SxJaw511.js @@ -0,0 +1,344 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"如何实现大文件上传","description":"大文件上传的必要性和优势在于满足了当今数字化时代中大容量文件的传输需求。通过实现高效、可靠的大文件上传,可以快速传输体积庞大的数据、高清视频和大型数据集等内容,实现数据备份、共享和远程访问。这不仅提升了用户体验和工作效率,还促进了云存储服务的发展,并满足了用户对高效网络传输的需求","frontmatter":{"title":"如何实现大文件上传","description":"大文件上传的必要性和优势在于满足了当今数字化时代中大容量文件的传输需求。通过实现高效、可靠的大文件上传,可以快速传输体积庞大的数据、高清视频和大型数据集等内容,实现数据备份、共享和远程访问。这不仅提升了用户体验和工作效率,还促进了云存储服务的发展,并满足了用户对高效网络传输的需求","keywords":"前端性能优化,性能优化,performance,lighthouse,大文件上传,分块上传","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-perf.png"},"headers":[],"relativePath":"frontend/performance/chunk-upload.md","filePath":"frontend/performance/chunk-upload.md","lastUpdated":1706247228000}'),c={name:"frontend/performance/chunk-upload.md"},t=e(`

如何实现大文件上传

本篇来讲解如何实现大文件的上传,相信大家都听说了大文件上传、分片上传、断点续传之类的术语了,这些都是大文件上传的通用技术

首先要知道为什么需要大文件上传,直接上传不行吗?由于文件的上传是由用户在前端表单发送的,前后端又是通过HTTP请求进行传输数据的。对于较小的文件可以很快的传输,而大文件就不会那么快,加上HTTP是基于TCP协议的,TCP具有时延、丢包、拥塞问题。尽管使用了HTTP2但在一个连接上无法发挥其优势。那么可以考虑通过并发文件内容可以提高传输速度和效率,对于丢失的数据包只需要重传某个数据块而已,这样就大大提高了文件传输效率和速度,以上就是大文件上传的基本原理

文件上传

对于小文件使用传统的HTTP请求一次就可以上传成功,通常就是前端使用form表单传输文件数据,这个比较简单。来看个基本的例子:

前端:基本的form表单上传

tsx
<input type="file" onChange={onFileChange} />
+const onFileChange = e => {
+  const files = e.target.files;
+  if (!files?.length) return;
+  const file = files[0];
+  const formData = new FormData();
+  formData.append('file', file);
+  fetch("/api/file/upload", { method: 'post', body: formData });
+}

NodeJS:这里使用Nest框架,其他框架类似

ts
export class FileController {
+  @Post('upload/normal')
+  @HttpCode(HttpStatus.OK)
+  @Header('Content-Type', 'application/json')
+  @UseInterceptors(FileInterceptor('file'))
+  @ApiConsumes('multipart/form-data')
+  async uploadNormalFile(@Body() body: IFileProp, @UploadedFile() file: Express.Multer.File) {
+    // 这个buffer就是文件内容
+    const { originalname, mimetype, buffer } = file;
+    return 'ok';
+  }
+}

以上就是一个简单的小文件上传和普通的json请求没有啥区别,来看下效果(图片大小3.7M)

大文件问题

对于小文件将整个文件传输问题不大,如果遇到文件很大的情况就会造成HTTP请求堵塞,会出现超时、丢包、内存占用大、速度慢、不稳定等各种问题。如果一个大文件在上传了90%后突然网络中断,那么就只能重新发送整个文件,浪费宽带浪费时间,当然这种方式也会造成服务器负载压力过大、缓慢崩溃问题,可见这种一次传输对大文件是行不通的

解决方案

大文件说白了就是太大了,以至于传输负载太大、效率很低,而如果使用小文件就可以很快的传输成功。那么可以对大文件把大文件划分成很多小块,然后将小块一批一批的传输给服务器,最后服务器将这些小块再拼接成一个整体文件就可以完美解决大文件传输的痛点

文件切片传输就和小文件传输一致了,没有超时问题、也不会占用过高内存和带宽,所有切片并发传输提高传输效率。整体来说文件切片传输的优势有以下几点:

  • 降低时延、基本不会超时
  • 丢包几率很低效率高
  • 带宽、内存占用小
  • 并发传输减小传输时间

文件切片

文件切片就是对整个文件进行切割处理,然后将每个块批次传输。文件的切片涉及到的二进制方面的内容,这里你首先要了解二进制相关的内容,如:Blob、ArrayBuffer等等,如果你对这方面还不是很熟悉,可以通过我的「前端二进制」一文学习下

表单选择的文件属于File类型,File类型中包含了文件的名字、大小、修改时间等等内容,File继承于Blob类型,而Blob拥有slice方法可以对blob进行分割,这样就可以实现文件的分片了

ts
const CHUNK_SIZE = 1024 * 1024 / 1; // 分片大小 1M
+
+const onFileChange = e => {
+  const files = e.target.files;
+  if (!files?.length) return;
+  const file = files[0];
+  const chunks = createChunks(file); // 文件切片
+}
+
+function createChunks(file, chunksize = CHUNK_SIZE) {
+  const chunkList = []; // 收集所有的切片
+  let offset = 0; // 收集的切片总大小
+  while (offset < file.size) { // 当切片总大小小于文件大小时还需要继续分片
+    chunkList.push(file.slice(offset, offset + chunksize));
+    offset += chunksize;
+  }
+  return chunkList;
+}

以下是将一张3.7M大小的图片分为每块1M总共4块的切片

切片上传与合并

文件切片后就是传输了和普通的上传没啥区别,唯一的区别就是 将每个切片标识在整个文件中的位置 ,这样服务器在接受到切片后可以按顺序整合文件

这里简单的使用切片的下角标作为索引位置:

ts
// 省略其它...
+const chunks = createChunks(file); // 文件切片
+const chunksFormData = chunks.map((chunk, index) => {
+  const formData = new FormData();
+  formData.append('file', chunk); // chunk文件数据
+  formData.append('filename', file.name); // 文件名字,服务器存储切片用
+  formData.append('index', index); // chunk索引
+  return formData;
+});
+// 切片上传
+const chunksRequest = chunksFormData.map(
+	data => fetch("/api/file/upload/chunk", { method: 'post', data })
+)
+await Promise.all(chunksRequest);

服务器接收到切片后,需要储存对应的切片文件,这里按文件名作为文件夹,然后将文件名-索引作为每个切片文件:

ts
@Post('upload/chunk')
+@HttpCode(HttpStatus.OK)
+@Header('Content-Type', 'application/json')
+@UseInterceptors(FileInterceptor('chunk'))
+async uploadBiggerFile(@Body() body: IFileProp, @UploadedFile() chunk: Express.Multer.File) {
+  const { index, filename } = body;
+  const { buffer } = chunk;
+
+  // chunk目标地址
+  const chunkPath = path.join('chunk_cache_' + filename, filename + '-' + index);
+
+  // 创建可写流,将chunk写入
+  const writer = createWriteStream(chunkPath);
+  writer.write(chunk);
+  writer.end();
+
+  return body;
+}

以上代码只是简单的演示,部分内容不是很全

切片合并

所有的切片上传完了后就需要将文件的切片进行合并成一个完整的文件,具体的也就是将所有的chunk按顺序写入同一个文件就可以了

那么在所有的切片上传完后告诉服务器切片已经上传完了,可以合并了,通常都是发送一个合并请求

前端发送合并请求:

ts
fetch("/api/file/upload/chunk/merge", {
+	method: 'post',
+	data: JSON.stringify({ originName: file.name }), // 告诉服务器要合并的文件
+	headers: { 'Content-Type': 'application/json' }
+});

服务器合并切片:

ts
// 合并大文件
+@Post('upload/chunk/merge')
+@HttpCode(HttpStatus.OK)
+@Header('Content-Type', 'application/json')
+async mergeChunk(@Body() body: IFileProp) {
+  const { filename } = body;
+  const mergePath = join('img', /*originName*/ filename); // 合并位置:img/xxx.jpg
+  const chunkPaths = await readdirSync("chunk_cache_" + filename); // 读取所有chunk地址
+  await this.writeChunksToFile(chunkPaths, mergePath);
+  return { message: "上传成功" };
+}
+
+async writeChunksToFile(chunkPaths: string[], mergePath: string) {
+  // 当前chunk的写入位置
+  let offset = 0;
+  // 将所有的chunk进行从小到大排序
+  chunkPaths = chunkPaths.sort((a, b) => parseInt(a.match(/-(\\d+)/i)[1], 10) - parseInt(b.match(/-(\\d+)/i)[1], 10));
+  await Promise.all(
+    chunkPaths.map(async chunkPath => {
+      const reader = createReadStream(chunkPath);
+      // 读取当前chunk的大小
+      const len = await (await stat(chunkPath)).size;
+      // 写入文件的指定位置
+      const writer = createWriteStream(mergePath, { start: offset });
+      // 位置偏移量
+      offset += len;
+      await new Promise((resolve, reject) => {
+        reader.pipe(writer);
+        reader.on('error', reject);
+        writer.on('error', reject);
+        writer.on('finish', async () => {
+          writer.close();
+          writer.destroy();
+          reader.destroy();
+          await unlinkSync(chunkPath);
+          resolve(true);
+        });
+      });
+    }),
+  );
+}

这里只是简单的演示下合并的逻辑,实际情况应该做一次封装

当切片合并完后既可以将完整图片地址响应给客户端,客户端拿到地址就可以访问了(假如是图片)

请求过程

合并后的图片

以上便是大文件上传的基本操作原理,到这里其实就已经解决了大文件上传的痛处,接下来来聊聊上传的优化

并发限制

首先就是要对切片上传进行并发限制,前面我们演示了一个比较小的图片只有3.7M大小,每个切片的大小为1M,总共也就是4个切片4个请求。对于更大的文件如镜像、视频文件就会有很多切片(假设切片的大小也为1M)

假设有1000个切片,浏览器一次性发送这么多请求会造成浏览器卡顿或崩溃,而好的做法就是限制并发数,比如保持请求数为5、10个,这样就不会造成浏览器的卡顿或崩溃了

这里简单的实现一个通用的并发请求工具函数,包含以下功能:

  • 并发数限制
  • 出错重试
  • 出错跳过,表示成功请求,使用此属性时重试将不会起作用
ts
/**
+ * 限制promise并发数
+ */
+
+interface IPromiseConcurrency {
+  limit?: number;
+  retry?: number;
+  skipError?: boolean;
+}
+interface IPromiseConcurrencyQueue {
+  promiseFn: (...args: any) => any;
+  resolve: (value: unknown) => void;
+  reject: (reason?: any) => void;
+  retry?: number;
+  skipError?: boolean;
+}
+
+enum CONCURRENCY_STATUS {
+  PENDING = "pending",
+  END = "end",
+}
+
+export class PromiseConcurrency {
+  private _limit: number;
+  private _retry: number;
+  private _activeCount = 0;
+  private _skipError: boolean;
+  private requestQueue: IPromiseConcurrencyQueue[];
+  private _status: CONCURRENCY_STATUS = CONCURRENCY_STATUS.PENDING;
+  constructor(opts?: IPromiseConcurrency) {
+    this._limit = opts?.limit ?? (Number?.MAX_SAFE_INTEGER || 9999);
+    this._retry = opts?.retry ?? 0;
+    this._skipError = opts?.skipError ?? false;
+    this.requestQueue = [];
+  }
+
+  get activeCount() {
+    return this._activeCount;
+  }
+
+  get pendingCount() {
+    return this.requestQueue.length;
+  }
+
+  append(
+    promiseFn: IPromiseConcurrencyQueue["promiseFn"],
+    opts?: Omit<IPromiseConcurrency, "limit">
+  ) {
+    if (this._status === CONCURRENCY_STATUS.END) this.clear();
+    return new Promise((resolve, reject) => {
+      const payload: IPromiseConcurrencyQueue = {
+        promiseFn,
+        resolve,
+        reject,
+        retry: opts?.retry ?? this._retry,
+        skipError: opts?.skipError ?? this._skipError,
+      };
+      this.queue(payload);
+    });
+  }
+
+  private async queue(current: IPromiseConcurrencyQueue) {
+    const { promiseFn, resolve, reject, skipError } = current;
+    if (this._activeCount < this._limit) {
+      try {
+        this._activeCount += 1;
+        const res = await promiseFn();
+        resolve(res);
+        this._activeCount -= 1;
+        this.next();
+      } catch (err) {
+        if (current.retry) {
+          current.retry -= 1;
+          this._activeCount -= 1;
+          this.queue({
+            promiseFn,
+            resolve,
+            reject,
+            retry: current.retry,
+            skipError: current.skipError,
+          });
+        } else {
+          if (skipError) {
+            resolve(err);
+            this._activeCount -= 1;
+            this.next();
+          } else {
+            this._status = CONCURRENCY_STATUS.END;
+            reject(err);
+          }
+        }
+      }
+    } else {
+      this.requestQueue.push(current);
+    }
+  }
+
+  private async next() {
+    if (
+      this._activeCount < this._limit &&
+      this.requestQueue?.length &&
+      this._status === CONCURRENCY_STATUS.PENDING
+    ) {
+      const nextRequest = this.requestQueue.shift()!;
+      this.queue(nextRequest);
+    } else if (this._status === CONCURRENCY_STATUS.END) {
+      this.clear();
+    }
+  }
+
+  clear() {
+    this.requestQueue = [];
+    this._activeCount = 0;
+    this._status = CONCURRENCY_STATUS.PENDING;
+  }
+}

并发演示:

ts
function request(symbol: any, delay = 100) {
+  return new Promise((resolve, reject) => {
+    setTimeout(() => {
+      const flag = Math.floor(Math.random() * 10) < 5;
+      if (flag) {
+        reject(\`出错了:\${symbol}\`);
+      } else {
+        console.log("request--------", symbol);
+        resolve(symbol);
+      }
+    }, delay);
+  });
+}
+
+const launch = async () => {
+	// 每次只能有1个请求,错误重试5次
+  const promiseC = new PromiseConcurrency({ limit: 1, retry: 5 });
+  try {
+    const res = await Promise.all([
+      promiseC.append(() => request(1), { retry: 10 }), // 当前请求重试10次
+      promiseC.append(() => request(2)),
+      promiseC.append(() => request(3), { retry: 0, skipError: true }), // 跳过错误
+      promiseC.append(() => request(4)),
+      promiseC.append(() => request(5)),
+    ]);
+    console.log(res);
+  } catch (err) {
+    console.log(err);
+  }
+};

多次刷新请求有完整请求成功的,也有跳过错误和重试成功的,以上的代码自己可以跑一下试一试

用在在切片上传中使用:

ts
// 省略其它...
+const rcl = new PromiseConcurrency({ limit: 10, retry: 3 }); // 最大请求并发数为10,重试次数3
+// 将所有的切片请求append到rcl控制器中
+requestList = requestList.map(
+  (data) => rcl.append(() => request({ data, url: "/api/file/upload/chunk", method: 'post' }))
+);
+// 上传所有切片
+const res = await Promise.all(requestList);

这样即使切片再多,请求数也会限制在10个以内,这样就不会造成浏览器的卡顿了。实际情况中也应该合理安排切片大小和并发数

断点续传

尽管使用切片传输会解决前面的问题,但还是会存在网络突发故障传输中断的问题或者页面刷新后停止传输,当再次上传同一个文件时又要从头开始删除,造成不必要的重传和资源浪费,因此跳过已经上传过的文件切片可以提高传输效率

切片传输正好可以满足以上的条件,文件被分成若干个切片后是按照一定的时机或顺序传输的,已传输的切片也会被保存在服务器,所以服务器可以很好的知道已经上传了哪些切片,并将已经上传的切片列表返回给客户端,当客户端再次上传时过滤掉已经上传的切片即可

💡 实现思路: 服务器返回已经上传的切片列表,前端上传时跳过已经上传过的切片

有一个问题就是如何判断上传的文件是上次上传的文件,即文件的唯一性如何确定,只有确定了是哪个文件才可以进一步判断文件已经上传过的切片。文件的唯一性不能使用文件名简单判断,需要根据文件内容生成对应的唯一hash值,不同的文件内容不一样hash值也就不一样,这样就可以确定文件的唯一性了

这里采用 spark-md5 对文件进行hash计算,这个库可以采用增量式形式对整个文件进行hash计算性能比较出色,具体的使用方法不做介绍,自行查阅文档

ts
const chunks = await createChunks(file);
+const spark = new SparkMD5.ArrayBuffer();
+const loadNext = (idx = 0) => {
+  const chunk = chunks[idx];
+  if (!chunk) {
+    upload(spark.end()); // 计算完hash后上传
+  }
+  const reader = new FileReader();
+  reader.readAsArrayBuffer(chunk);
+  reader.onload = e => {
+    spark.append(e.target.result);
+    loadNext(++idx);
+  };
+};
+loadNext();

使用spark-md5计算完hash后,就可以上传切片了,现在需要将切片的hash传给服务器,服务器以hash值作为文件的储存地址;上传前要先请求服务器判断哪些切片已经上传过了。这里使用length和list两个属性,当length等于-1时代表已经上传过了,其余的的长度为已经上传了的切片长度,list里包含了上传过的切片

ts
async function upload(hash: string) {
+	// 上传前先请求当前文件上传情况:成功上传;没上传;部分chunk上传
+  const uploadedList = await request({
+  	url: \`/api/file/upload/chunk?originName=\${file.name}&hash=\${hash}\`,
+  	headers: { 'Content-Type': 'application/json' }
+  });
+  // -1 表示已经上传成功了
+  if (uploadedList?.data.length === -1) {
+    console.log('已经上传过了');
+    return;
+  }
+
+  let requestList = chunks.map((chunk, idx) => {
+    const formData = new FormData();
+    formData.append('originName', file.name);
+    formData.append('chunk', chunk);
+    formData.append('index', idx);
+    formData.append('hash', hash);
+    return formData;
+  });
+  // 过滤掉已经上传过的切片
+  if (uploadedList?.data?.length > 0) {
+    requestList = requestList.filter(
+    	(l, idx) => !uploadedList?.data?.list?.includes(idx)
+    );
+  }
+  const rcl = new PromiseConcurrency({ limit: 10, retry: 3 }); // 最大请求并发数为10
+  requestList = requestList.map(
+  	(data) => rcl.append(() => request({ data, url: "/api/file/upload/chunk", method: 'post' }))
+  );
+  // 上传切片
+  const res = await Promise.all(requestList);
+  // 上传完后发送合并切片请求
+  const merged = await request({
+  	url: "/api/file/upload/chunk/merge",
+  	method: 'post',
+  	data: JSON.stringify({ originName: file.name, hash }),
+  	headers: { 'Content-Type': 'application/json' }
+  });
+  console.log(merged);
+}

下图为上传图片的演示效果,每个切片大小0.1M

当上传过此图片后,再次上传此图片就不会上传了,这就是文件秒传的实现

断点续传这里不再演示,你可以控制下已经上传过的切片,然后停止上传,停止后再上传同一个文件即可

切片优化

文件的hash计算会消耗大量的时间尤其对于大型文件,会划分一定的时间。由于JS是单线程的且JS引擎执行会阻塞浏览器渲染,长时间的JS计算会导致页面卡顿或者卡死现象,用户体验会变得非常差。所以对于大型计算最好交给其他线程来做,即使该线程崩溃也不会影响页面渲染

浏览器提供了 WebWoker 可以使用其他线程,我们来优化下文件hash计算

worker线程:

ts
//  /js/web-worker/upload.worker.js
+self.importScripts('/js/spark-md5.min.js');
+
+self.onmessage = e => {
+  const { chunks } = e.data;
+  const spark = new SparkMD5.ArrayBuffer();
+  const loadNext = (idx = 0) => {
+    const chunk = chunks[idx];
+    if (!chunk) {
+      self.postMessage({
+        hash: spark.end(),
+      });
+      return self.close();
+    }
+    const reader = new FileReader();
+    reader.readAsArrayBuffer(chunk);
+    reader.onload = e => {
+      spark.append(e.target.result);
+      loadNext(++idx);
+    };
+  };
+  loadNext();
+};

主线程:

ts
const chunks = await createChunks(file);
+const worker = new Worker('/js/web-worker/upload.worker.js');
+worker.postMessage({ chunks });
+worker.onmessage = async e => {
+  const hash = e.data.hash; // 拿到计算的hash值
+  // 省略...
+}

这样使用其他线程后即使再大的文件也不会影响主线程了,大大提升用户体验

文件秒传

参考断点续传

功能完善

到这里基本上将大文件上传的核心功能都已讲完,基本上已经可以满足上传需求了。文中大多都是在说原理实现,没有讲过多的细节,实际情况应添加相关的交互,如:进度条等等。进度包含总进度、切片进度、hash计算进度等等,都比较简单这里就不再赘述了

再者就是动态控制切片大小,为什么要这么做呢?由于我们是基于HTTP发送的,HTTP基于TCP,TCP具有慢启动的特征,刚开始就传输一个大胖子肯定吃不消,所以动态改变每个chunk大小可能传输效果更好。但这个需要你额外的计算每次传输时间来动态改变等等,有兴趣的可以试试

其他的优化可以自行脑补

总结

大文件上传不能像传统的数据传输一样直接发送,由于文件太大需要将其分割成若干个小块分批次传输,可以大大提高传输效率,还能实现秒传、断点续传功能。大文件上传就好比高速公路上运输一个超大超大东西,一辆车肯定很难完成任务很有可能翻车,如果将这个搭建分成好多小件交给n辆车,就可以很快解决这个问题了。主线程上不能执行高密集型的计算任务,不然会卡顿页面造成假死现象,巧用WebWoker小帮手实现多线程计算

`,88);function F(D,y,i,B,A,b){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const m=p(c,[["render",F]]);export{E as __pageData,m as default}; diff --git a/assets/frontend_performance_chunk-upload.md.SxJaw511.lean.js b/assets/frontend_performance_chunk-upload.md.SxJaw511.lean.js new file mode 100644 index 000000000..b39d91e57 --- /dev/null +++ b/assets/frontend_performance_chunk-upload.md.SxJaw511.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"如何实现大文件上传","description":"大文件上传的必要性和优势在于满足了当今数字化时代中大容量文件的传输需求。通过实现高效、可靠的大文件上传,可以快速传输体积庞大的数据、高清视频和大型数据集等内容,实现数据备份、共享和远程访问。这不仅提升了用户体验和工作效率,还促进了云存储服务的发展,并满足了用户对高效网络传输的需求","frontmatter":{"title":"如何实现大文件上传","description":"大文件上传的必要性和优势在于满足了当今数字化时代中大容量文件的传输需求。通过实现高效、可靠的大文件上传,可以快速传输体积庞大的数据、高清视频和大型数据集等内容,实现数据备份、共享和远程访问。这不仅提升了用户体验和工作效率,还促进了云存储服务的发展,并满足了用户对高效网络传输的需求","keywords":"前端性能优化,性能优化,performance,lighthouse,大文件上传,分块上传","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-perf.png"},"headers":[],"relativePath":"frontend/performance/chunk-upload.md","filePath":"frontend/performance/chunk-upload.md","lastUpdated":1706247228000}'),c={name:"frontend/performance/chunk-upload.md"},t=e("",88);function F(D,y,i,B,A,b){const a=n("Reward"),l=n("Gitalk");return r(),o("div",null,[t,s(a),s(l)])}const m=p(c,[["render",F]]);export{E as __pageData,m as default}; diff --git a/assets/frontend_performance_load-perf.md.YgBKXjky.js b/assets/frontend_performance_load-perf.md.YgBKXjky.js new file mode 100644 index 000000000..db175e176 --- /dev/null +++ b/assets/frontend_performance_load-perf.md.YgBKXjky.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"加载优化","description":"","frontmatter":{"title":"加载优化"},"headers":[],"relativePath":"frontend/performance/load-perf.md","filePath":"frontend/performance/load-perf.md","lastUpdated":1706247228000}'),a={name:"frontend/performance/load-perf.md"};function o(n,d,c,f,p,s){return r(),t("div")}const i=e(a,[["render",o]]);export{m as __pageData,i as default}; diff --git a/assets/frontend_performance_load-perf.md.YgBKXjky.lean.js b/assets/frontend_performance_load-perf.md.YgBKXjky.lean.js new file mode 100644 index 000000000..db175e176 --- /dev/null +++ b/assets/frontend_performance_load-perf.md.YgBKXjky.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"加载优化","description":"","frontmatter":{"title":"加载优化"},"headers":[],"relativePath":"frontend/performance/load-perf.md","filePath":"frontend/performance/load-perf.md","lastUpdated":1706247228000}'),a={name:"frontend/performance/load-perf.md"};function o(n,d,c,f,p,s){return r(),t("div")}const i=e(a,[["render",o]]);export{m as __pageData,i as default}; diff --git a/assets/frontend_performance_network-perf.md.dbc1c8R_.js b/assets/frontend_performance_network-perf.md.dbc1c8R_.js new file mode 100644 index 000000000..c3f473589 --- /dev/null +++ b/assets/frontend_performance_network-perf.md.dbc1c8R_.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"网络优化","description":"","frontmatter":{"title":"网络优化"},"headers":[],"relativePath":"frontend/performance/network-perf.md","filePath":"frontend/performance/network-perf.md","lastUpdated":1706247228000}'),n={name:"frontend/performance/network-perf.md"};function o(a,c,f,p,s,d){return r(),t("div")}const _=e(n,[["render",o]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_network-perf.md.dbc1c8R_.lean.js b/assets/frontend_performance_network-perf.md.dbc1c8R_.lean.js new file mode 100644 index 000000000..c3f473589 --- /dev/null +++ b/assets/frontend_performance_network-perf.md.dbc1c8R_.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"网络优化","description":"","frontmatter":{"title":"网络优化"},"headers":[],"relativePath":"frontend/performance/network-perf.md","filePath":"frontend/performance/network-perf.md","lastUpdated":1706247228000}'),n={name:"frontend/performance/network-perf.md"};function o(a,c,f,p,s,d){return r(),t("div")}const _=e(n,[["render",o]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_node-score.md.D9AUg7bg.js b/assets/frontend_performance_node-score.md.D9AUg7bg.js new file mode 100644 index 000000000..212c99e31 --- /dev/null +++ b/assets/frontend_performance_node-score.md.D9AUg7bg.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as t}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"node性能评分指南","description":"","frontmatter":{"title":"node性能评分指南"},"headers":[],"relativePath":"frontend/performance/node-score.md","filePath":"frontend/performance/node-score.md","lastUpdated":1706247228000}'),r={name:"frontend/performance/node-score.md"};function n(a,c,d,s,p,f){return t(),o("div")}const _=e(r,[["render",n]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_node-score.md.D9AUg7bg.lean.js b/assets/frontend_performance_node-score.md.D9AUg7bg.lean.js new file mode 100644 index 000000000..212c99e31 --- /dev/null +++ b/assets/frontend_performance_node-score.md.D9AUg7bg.lean.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as t}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"node性能评分指南","description":"","frontmatter":{"title":"node性能评分指南"},"headers":[],"relativePath":"frontend/performance/node-score.md","filePath":"frontend/performance/node-score.md","lastUpdated":1706247228000}'),r={name:"frontend/performance/node-score.md"};function n(a,c,d,s,p,f){return t(),o("div")}const _=e(r,[["render",n]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_performance.md.o6_aDciN.js b/assets/frontend_performance_performance.md.o6_aDciN.js new file mode 100644 index 000000000..7c82ddcdf --- /dev/null +++ b/assets/frontend_performance_performance.md.o6_aDciN.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as t,m as a}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"使用Performance优化性能","description":"","frontmatter":{"title":"使用Performance优化性能"},"headers":[],"relativePath":"frontend/performance/performance.md","filePath":"frontend/performance/performance.md","lastUpdated":1706247228000}'),n={name:"frontend/performance/performance.md"},o=a("p",null,"// 待补充...",-1),c=[o];function s(f,p,m,d,_,i){return t(),r("div",null,c)}const u=e(n,[["render",s]]);export{h as __pageData,u as default}; diff --git a/assets/frontend_performance_performance.md.o6_aDciN.lean.js b/assets/frontend_performance_performance.md.o6_aDciN.lean.js new file mode 100644 index 000000000..7c82ddcdf --- /dev/null +++ b/assets/frontend_performance_performance.md.o6_aDciN.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as t,m as a}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"使用Performance优化性能","description":"","frontmatter":{"title":"使用Performance优化性能"},"headers":[],"relativePath":"frontend/performance/performance.md","filePath":"frontend/performance/performance.md","lastUpdated":1706247228000}'),n={name:"frontend/performance/performance.md"},o=a("p",null,"// 待补充...",-1),c=[o];function s(f,p,m,d,_,i){return t(),r("div",null,c)}const u=e(n,[["render",s]]);export{h as __pageData,u as default}; diff --git a/assets/frontend_performance_range-download.md.9tg7xUgK.js b/assets/frontend_performance_range-download.md.9tg7xUgK.js new file mode 100644 index 000000000..7560551f4 --- /dev/null +++ b/assets/frontend_performance_range-download.md.9tg7xUgK.js @@ -0,0 +1 @@ +import{_ as a,c as t,o,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"大文件下载","description":"","frontmatter":{"title":"大文件下载"},"headers":[],"relativePath":"frontend/performance/range-download.md","filePath":"frontend/performance/range-download.md","lastUpdated":1706247228000}'),r={name:"frontend/performance/range-download.md"},d=e("h1",{id:"大文件下载",tabindex:"-1"},[n("大文件下载 "),e("a",{class:"header-anchor",href:"#大文件下载","aria-label":'Permalink to "大文件下载"'},"​")],-1),s=e("p",null,"// 待补充...",-1),c=[d,s];function l(i,_,p,f,m,h){return o(),t("div",null,c)}const x=a(r,[["render",l]]);export{g as __pageData,x as default}; diff --git a/assets/frontend_performance_range-download.md.9tg7xUgK.lean.js b/assets/frontend_performance_range-download.md.9tg7xUgK.lean.js new file mode 100644 index 000000000..7560551f4 --- /dev/null +++ b/assets/frontend_performance_range-download.md.9tg7xUgK.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"大文件下载","description":"","frontmatter":{"title":"大文件下载"},"headers":[],"relativePath":"frontend/performance/range-download.md","filePath":"frontend/performance/range-download.md","lastUpdated":1706247228000}'),r={name:"frontend/performance/range-download.md"},d=e("h1",{id:"大文件下载",tabindex:"-1"},[n("大文件下载 "),e("a",{class:"header-anchor",href:"#大文件下载","aria-label":'Permalink to "大文件下载"'},"​")],-1),s=e("p",null,"// 待补充...",-1),c=[d,s];function l(i,_,p,f,m,h){return o(),t("div",null,c)}const x=a(r,[["render",l]]);export{g as __pageData,x as default}; diff --git a/assets/frontend_performance_secure-perf.md.xaV7lDmb.js b/assets/frontend_performance_secure-perf.md.xaV7lDmb.js new file mode 100644 index 000000000..99f38aee3 --- /dev/null +++ b/assets/frontend_performance_secure-perf.md.xaV7lDmb.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as t}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"安全优化","description":"","frontmatter":{"title":"安全优化"},"headers":[],"relativePath":"frontend/performance/secure-perf.md","filePath":"frontend/performance/secure-perf.md","lastUpdated":1706247228000}'),a={name:"frontend/performance/secure-perf.md"};function n(o,c,s,f,p,d){return t(),r("div")}const _=e(a,[["render",n]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_secure-perf.md.xaV7lDmb.lean.js b/assets/frontend_performance_secure-perf.md.xaV7lDmb.lean.js new file mode 100644 index 000000000..99f38aee3 --- /dev/null +++ b/assets/frontend_performance_secure-perf.md.xaV7lDmb.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as t}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"安全优化","description":"","frontmatter":{"title":"安全优化"},"headers":[],"relativePath":"frontend/performance/secure-perf.md","filePath":"frontend/performance/secure-perf.md","lastUpdated":1706247228000}'),a={name:"frontend/performance/secure-perf.md"};function n(o,c,s,f,p,d){return t(),r("div")}const _=e(a,[["render",n]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_seo.md.QeValPBK.js b/assets/frontend_performance_seo.md.QeValPBK.js new file mode 100644 index 000000000..15ccd8073 --- /dev/null +++ b/assets/frontend_performance_seo.md.QeValPBK.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as a,V as t}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"SEO优化","description":"","frontmatter":{"title":"SEO优化"},"headers":[],"relativePath":"frontend/performance/seo.md","filePath":"frontend/performance/seo.md","lastUpdated":1706247228000}'),l={name:"frontend/performance/seo.md"},o=t('

SEO优化

待补充...

robots、title、description、DOM结构化、富媒体、网站层析结构、网址语义化、禁止相同内容、优化内容、主次分明、关键词、广告投放(降低)、链接文案语义化个性化吸引用户、图片优化(懒加载、webp、alt、命名语义化)、https、js报错、页面加载时间、响应式canonical、alternate、无障碍、rss、google console分析等等

参考文档

',5),s=[o];function n(c,i,h,d,p,f){return a(),r("div",null,s)}const m=e(l,[["render",n]]);export{g as __pageData,m as default}; diff --git a/assets/frontend_performance_seo.md.QeValPBK.lean.js b/assets/frontend_performance_seo.md.QeValPBK.lean.js new file mode 100644 index 000000000..08128fec0 --- /dev/null +++ b/assets/frontend_performance_seo.md.QeValPBK.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as a,V as t}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"SEO优化","description":"","frontmatter":{"title":"SEO优化"},"headers":[],"relativePath":"frontend/performance/seo.md","filePath":"frontend/performance/seo.md","lastUpdated":1706247228000}'),l={name:"frontend/performance/seo.md"},o=t("",5),s=[o];function n(c,i,h,d,p,f){return a(),r("div",null,s)}const m=e(l,[["render",n]]);export{g as __pageData,m as default}; diff --git a/assets/frontend_performance_virtual-scroll-1.md.zLnkOlkp.js b/assets/frontend_performance_virtual-scroll-1.md.zLnkOlkp.js new file mode 100644 index 000000000..45de08cf2 --- /dev/null +++ b/assets/frontend_performance_virtual-scroll-1.md.zLnkOlkp.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"虚拟滚动1","description":"","frontmatter":{"title":"虚拟滚动1"},"headers":[],"relativePath":"frontend/performance/virtual-scroll-1.md","filePath":"frontend/performance/virtual-scroll-1.md","lastUpdated":1706247228000}'),n={name:"frontend/performance/virtual-scroll-1.md"},s=e("h1",{id:"虚拟滚动",tabindex:"-1"},[o("虚拟滚动 "),e("a",{class:"header-anchor",href:"#虚拟滚动","aria-label":'Permalink to "虚拟滚动"'},"​")],-1),c=e("p",null,"// 待更新...",-1),l=[s,c];function d(i,_,p,f,m,h){return r(),a("div",null,l)}const x=t(n,[["render",d]]);export{v as __pageData,x as default}; diff --git a/assets/frontend_performance_virtual-scroll-1.md.zLnkOlkp.lean.js b/assets/frontend_performance_virtual-scroll-1.md.zLnkOlkp.lean.js new file mode 100644 index 000000000..45de08cf2 --- /dev/null +++ b/assets/frontend_performance_virtual-scroll-1.md.zLnkOlkp.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"虚拟滚动1","description":"","frontmatter":{"title":"虚拟滚动1"},"headers":[],"relativePath":"frontend/performance/virtual-scroll-1.md","filePath":"frontend/performance/virtual-scroll-1.md","lastUpdated":1706247228000}'),n={name:"frontend/performance/virtual-scroll-1.md"},s=e("h1",{id:"虚拟滚动",tabindex:"-1"},[o("虚拟滚动 "),e("a",{class:"header-anchor",href:"#虚拟滚动","aria-label":'Permalink to "虚拟滚动"'},"​")],-1),c=e("p",null,"// 待更新...",-1),l=[s,c];function d(i,_,p,f,m,h){return r(),a("div",null,l)}const x=t(n,[["render",d]]);export{v as __pageData,x as default}; diff --git a/assets/frontend_performance_virtual-scroll-2.md.Pm3KlSap.js b/assets/frontend_performance_virtual-scroll-2.md.Pm3KlSap.js new file mode 100644 index 000000000..1fc2b5439 --- /dev/null +++ b/assets/frontend_performance_virtual-scroll-2.md.Pm3KlSap.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"虚拟滚动2","description":"","frontmatter":{"title":"虚拟滚动2"},"headers":[],"relativePath":"frontend/performance/virtual-scroll-2.md","filePath":"frontend/performance/virtual-scroll-2.md","lastUpdated":1706247228000}'),n={name:"frontend/performance/virtual-scroll-2.md"},s=e("h1",{id:"虚拟滚动",tabindex:"-1"},[o("虚拟滚动 "),e("a",{class:"header-anchor",href:"#虚拟滚动","aria-label":'Permalink to "虚拟滚动"'},"​")],-1),c=e("p",null,"// 待更新...",-1),l=[s,c];function d(i,_,p,f,m,h){return r(),a("div",null,l)}const x=t(n,[["render",d]]);export{v as __pageData,x as default}; diff --git a/assets/frontend_performance_virtual-scroll-2.md.Pm3KlSap.lean.js b/assets/frontend_performance_virtual-scroll-2.md.Pm3KlSap.lean.js new file mode 100644 index 000000000..1fc2b5439 --- /dev/null +++ b/assets/frontend_performance_virtual-scroll-2.md.Pm3KlSap.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"虚拟滚动2","description":"","frontmatter":{"title":"虚拟滚动2"},"headers":[],"relativePath":"frontend/performance/virtual-scroll-2.md","filePath":"frontend/performance/virtual-scroll-2.md","lastUpdated":1706247228000}'),n={name:"frontend/performance/virtual-scroll-2.md"},s=e("h1",{id:"虚拟滚动",tabindex:"-1"},[o("虚拟滚动 "),e("a",{class:"header-anchor",href:"#虚拟滚动","aria-label":'Permalink to "虚拟滚动"'},"​")],-1),c=e("p",null,"// 待更新...",-1),l=[s,c];function d(i,_,p,f,m,h){return r(),a("div",null,l)}const x=t(n,[["render",d]]);export{v as __pageData,x as default}; diff --git a/assets/frontend_performance_web-score.md.1Mfy9rMi.js b/assets/frontend_performance_web-score.md.1Mfy9rMi.js new file mode 100644 index 000000000..be75baec8 --- /dev/null +++ b/assets/frontend_performance_web-score.md.1Mfy9rMi.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"web评分指南","description":"","frontmatter":{"title":"web评分指南"},"headers":[],"relativePath":"frontend/performance/web-score.md","filePath":"frontend/performance/web-score.md","lastUpdated":1706247228000}'),o={name:"frontend/performance/web-score.md"};function a(n,c,s,d,p,f){return r(),t("div")}const _=e(o,[["render",a]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_performance_web-score.md.1Mfy9rMi.lean.js b/assets/frontend_performance_web-score.md.1Mfy9rMi.lean.js new file mode 100644 index 000000000..be75baec8 --- /dev/null +++ b/assets/frontend_performance_web-score.md.1Mfy9rMi.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const i=JSON.parse('{"title":"web评分指南","description":"","frontmatter":{"title":"web评分指南"},"headers":[],"relativePath":"frontend/performance/web-score.md","filePath":"frontend/performance/web-score.md","lastUpdated":1706247228000}'),o={name:"frontend/performance/web-score.md"};function a(n,c,s,d,p,f){return r(),t("div")}const _=e(o,[["render",a]]);export{i as __pageData,_ as default}; diff --git a/assets/frontend_project-integration_base.md.XekYSkMF.js b/assets/frontend_project-integration_base.md.XekYSkMF.js new file mode 100644 index 000000000..6ff91a304 --- /dev/null +++ b/assets/frontend_project-integration_base.md.XekYSkMF.js @@ -0,0 +1 @@ +import{_ as n,c as a,J as e,V as r,o as l,G as t}from"./chunks/framework.SV1ROkXV.js";const j=JSON.parse('{"title":"项目集成","description":"前端项目集成是将前端代码与相关技术、工具和服务整合,以构建完整的应用程序,并涵盖版本控制、包管理、构建、代码规范、框架选择、接口调用、自动化测试、性能优化、文档和部署等方面","frontmatter":{"title":"项目集成","description":"前端项目集成是将前端代码与相关技术、工具和服务整合,以构建完整的应用程序,并涵盖版本控制、包管理、构建、代码规范、框架选择、接口调用、自动化测试、性能优化、文档和部署等方面","keywords":"前端项目集成,脚手架,代码规范,版本控制,框架选择,包管理规范,发布规范,代码测试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png","aside":false},"headers":[],"relativePath":"frontend/project-integration/base.md","filePath":"frontend/project-integration/base.md","lastUpdated":1706247228000}'),c={name:"frontend/project-integration/base.md"},p=r('

项目集成

本篇开始来介绍如何做好前端项目集成

相信每个小伙伴都经历过前端项目复杂的配置,每次都是配置一大堆,这对于新手来说难免有些吃力。通常我会把项目集成分为两大类:规范类和功能类,其中规范化对于团队协作非常重要,而功能类则是为项目coding或deploy提供便捷功能,同时也为规范化进行服务

每位开发者或多团队成员或少即团队都离不开成员协作,然每位开发者可能都有自己的代码风格,如:小张喜欢在行末加上分号,小李不喜欢加分号

这对于团队协作来说是不友好的,难以统一整体风格,对内容易造成不同的成员产生不同的感受,对外给人不统一犹如盗版之感。然统一规范若要求每个人改掉自己不同的习惯是很难的,若加以工具辅助,可大大降低每个人的心智负担从而高效提高规范性。本篇就开始讲解相关辅助工具的使用方法

💣 常见无规范问题:

  • 使用不同的包管理器,可能会产生莫名其妙的bug
  • node版本不一致,可能导致不同人跑不起来的问题
  • 代码风格不一致,可能出现罕见bug
  • git信息五花八门,难以后续维护或内容表意无法一目了然,阻碍协作
  • 命名不规范,难以表意协作困难

因此项目规范对于团队的协同有极其重要作用,本模块将根据以下几个方面层层渐进介绍规范处理及常用的便捷功能:

',9);function d(s,h,f,m,g,_){const o=t("Reward"),i=t("Gitalk");return l(),a("div",null,[p,e(o),e(i)])}const b=n(c,[["render",d]]);export{j as __pageData,b as default}; diff --git a/assets/frontend_project-integration_base.md.XekYSkMF.lean.js b/assets/frontend_project-integration_base.md.XekYSkMF.lean.js new file mode 100644 index 000000000..e917aedd0 --- /dev/null +++ b/assets/frontend_project-integration_base.md.XekYSkMF.lean.js @@ -0,0 +1 @@ +import{_ as n,c as a,J as e,V as r,o as l,G as t}from"./chunks/framework.SV1ROkXV.js";const j=JSON.parse('{"title":"项目集成","description":"前端项目集成是将前端代码与相关技术、工具和服务整合,以构建完整的应用程序,并涵盖版本控制、包管理、构建、代码规范、框架选择、接口调用、自动化测试、性能优化、文档和部署等方面","frontmatter":{"title":"项目集成","description":"前端项目集成是将前端代码与相关技术、工具和服务整合,以构建完整的应用程序,并涵盖版本控制、包管理、构建、代码规范、框架选择、接口调用、自动化测试、性能优化、文档和部署等方面","keywords":"前端项目集成,脚手架,代码规范,版本控制,框架选择,包管理规范,发布规范,代码测试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png","aside":false},"headers":[],"relativePath":"frontend/project-integration/base.md","filePath":"frontend/project-integration/base.md","lastUpdated":1706247228000}'),c={name:"frontend/project-integration/base.md"},p=r("",9);function d(s,h,f,m,g,_){const o=t("Reward"),i=t("Gitalk");return l(),a("div",null,[p,e(o),e(i)])}const b=n(c,[["render",d]]);export{j as __pageData,b as default}; diff --git a/assets/frontend_project-integration_build-tool.md.3LVzvGhj.js b/assets/frontend_project-integration_build-tool.md.3LVzvGhj.js new file mode 100644 index 000000000..c13923af2 --- /dev/null +++ b/assets/frontend_project-integration_build-tool.md.3LVzvGhj.js @@ -0,0 +1,4 @@ +import{_ as l,c as n,J as e,V as s,o,G as a}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"项目集成之打包工具","description":"前端模块化打包工具的出现方便了前端项目的开发尤其是模块开发,简化了前端开发流程和部署","frontmatter":{"title":"项目集成之打包工具","description":"前端模块化打包工具的出现方便了前端项目的开发尤其是模块开发,简化了前端开发流程和部署","keywords":"前端框架,vuejs,reactjs,angularjs,框架选择","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png","aside":false},"headers":[],"relativePath":"frontend/project-integration/build-tool.md","filePath":"frontend/project-integration/build-tool.md","lastUpdated":1706247228000}'),p={name:"frontend/project-integration/build-tool.md"},i=s(`

项目集成之打包工具

在前端发展的过程中,前端打包工具发挥着重要作用。它们帮助开发者处理模块化开发、资源优化、代码压缩等任务,提供了更高效的开发和部署方式。打包工具的出现使得前端开发更加规范和可维护,同时也提升了用户体验,减少了页面加载时间,为前端技术的快速发展和应用提供了有力支持

那么如何选择适当的打包工具作为当前项目的神器呢?在讨论打包工具的选择前先来说说常见的打包工具及其优势:

  • webpack:是最常用的前端打包工具,功能强大且高度可配置,适用于复杂的项目。它支持模块化开发、代码拆分、代码压缩等特性,可以处理各种资源文件,并且具有丰富的插件生态系统。然而,Webpack的配置复杂,学习曲线较陡峭
  • rollup:是一款面向现代JavaScript模块的打包工具,专注于代码优化和资源体积的最小化。它支持Tree Shaking(无用代码剔除)、代码拆分和代码压缩,适用于开发库和组件等需要精简输出的场景。然而,Rollup对于一些非标准模块格式的支持可能不够完善
  • parcel:是一款零配置的打包工具,非常易于使用。它自动处理资源文件,支持快速开发和即时刷新,适用于小型项目和快速原型开发。然而,Parcel的定制化程度较低,对于一些复杂需求可能不够灵活
  • gulp: 基于流的构建工具,可以定义一系列任务来处理代码,例如编译、压缩、合并等,适用于简单和快速的构建流程。相对于其他打包工具,配置较为繁琐,需要一定的配置和编写任务的经验
  • grunt:JavaScript任务运行器,可以配置和运行一系列任务来完成代码的构建和优化,具有广泛的插件生态系统。相对于其他打包工具,配置较为繁琐,任务配置相对复杂
  • vite:是一个轻量级的前端构建工具,它的特点是快速的冷启动和热模块替换

除了以上列出的工具外,目前市面上还有各种各样的打包工具,以当前形式来看大多数都开始转向基于gorust的打包方案,利用Rust或go的高性能和并发特性,可以提供更快的构建速度,减少开发者的等待时间,来弥补纯JS语言的性能短板(viteparcelrspack)

这些打包工具相信大家或多或少都用过,对其的基本使用构建或者原理都有一定的了解。那么这些眼花缭乱的打包工具该如何选择,我们只需要遵循以下的规则即可:

  • 首先评估项目的复杂度,对于简单的项目结合使用框架可以考虑直接使用官方脚手架,一般官方的脚手架都会给我们配置的差不多,开发者无需过度关注配置,可以快速上手
    sh
    # vue
    + vue create project-name
    +# react
    +  npx create-react-app project-name
  • 考虑项目的长远维护以及团队成员的技术栈选择大家熟悉的工具和规范集成化的项目工具,推荐使用官方推荐的技术如:react使用nextjs、vue使用nuxtjs
  • 结合工具的特长用之,如使用gulp、grunt等工具更擅长进行任务流的工作,由管道一侧转换成管道另一侧的产物,配置也相当繁琐;rollup有很好的treeshaking更适合第三方库的开发;webpack、vite等适合项目的模块化开发
  • 根据配置的复杂度和灵活度进行选择,如webpack比较繁重配置复杂,学习成本很高,但配置灵活扩展性极强;parcel配置简单但不是很灵活无法胜任大型项目
  • 了解打包工具的生态系统和可用插件,这些插件可以提供额外的功能和集成;社区活跃度和更新频率,这将影响到工具的稳定性、bug 修复和新功能的推出
  • 评估打包工具的性能和打包速度,特别是在处理大型项目和复杂的依赖关系时的速度

总之,打包工具要选择适合自己的,遵从配置由简到繁、成本由低到高及性能由低到高的策略即可

`,8);function c(d,u,g,h,_,b){const r=a("Reward"),t=a("Gitalk");return o(),n("div",null,[i,e(r),e(t)])}const m=l(p,[["render",c]]);export{k as __pageData,m as default}; diff --git a/assets/frontend_project-integration_build-tool.md.3LVzvGhj.lean.js b/assets/frontend_project-integration_build-tool.md.3LVzvGhj.lean.js new file mode 100644 index 000000000..d0a5a2ab6 --- /dev/null +++ b/assets/frontend_project-integration_build-tool.md.3LVzvGhj.lean.js @@ -0,0 +1 @@ +import{_ as l,c as n,J as e,V as s,o,G as a}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"项目集成之打包工具","description":"前端模块化打包工具的出现方便了前端项目的开发尤其是模块开发,简化了前端开发流程和部署","frontmatter":{"title":"项目集成之打包工具","description":"前端模块化打包工具的出现方便了前端项目的开发尤其是模块开发,简化了前端开发流程和部署","keywords":"前端框架,vuejs,reactjs,angularjs,框架选择","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png","aside":false},"headers":[],"relativePath":"frontend/project-integration/build-tool.md","filePath":"frontend/project-integration/build-tool.md","lastUpdated":1706247228000}'),p={name:"frontend/project-integration/build-tool.md"},i=s("",8);function c(d,u,g,h,_,b){const r=a("Reward"),t=a("Gitalk");return o(),n("div",null,[i,e(r),e(t)])}const m=l(p,[["render",c]]);export{k as __pageData,m as default}; diff --git a/assets/frontend_project-integration_choose-editor.md.VGwstEOo.js b/assets/frontend_project-integration_choose-editor.md.VGwstEOo.js new file mode 100644 index 000000000..314027cd6 --- /dev/null +++ b/assets/frontend_project-integration_choose-editor.md.VGwstEOo.js @@ -0,0 +1 @@ +import{_ as r,c as a,J as e,V as s,o as n,G as t}from"./chunks/framework.SV1ROkXV.js";const S=JSON.parse('{"title":"项目集成之编辑器","description":"前端开发应该选择哪种编辑器作为生产力呢?本期我们来聊聊如何选择最适合自己的编辑器","frontmatter":{"title":"项目集成之编辑器","description":"前端开发应该选择哪种编辑器作为生产力呢?本期我们来聊聊如何选择最适合自己的编辑器","keywords":"编辑器,vscode,webstorm","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png","aside":false},"headers":[],"relativePath":"frontend/project-integration/choose-editor.md","filePath":"frontend/project-integration/choose-editor.md","lastUpdated":1706247228000}'),l={name:"frontend/project-integration/choose-editor.md"},c=s('

项目集成之编辑器

编辑器对于前端开发的效率也会有一定的影响,选择一款合适的编辑器也是很重要的。最近多看到网上各大平台有关编辑器的选择之争、众说纷纷,小略几篇真是苦笑不已!笑仅一个编辑器何须如此长篇大论

通常编辑器的选择倾向于以下几个功能点:

  • 功能和扩展性:选择一个具备你需要的功能和扩展性的编辑器,例如代码高亮、智能提示、调试功能、版本控制集成等
  • 支持的语言和框架:确保编辑器对你项目中使用的语言和框架提供良好的支持,包括语法高亮、代码片段、快速导航等功能
  • 生态系统和社区支持:选择一个有活跃的社区和丰富的插件生态系统的编辑器,这样你可以从社区中获得支持、学习资源和扩展工具
  • 可定制性:一些编辑器允许你根据自己的需求进行个性化定制,包括主题、快捷键设置、插件和扩展等
  • 跨平台支持:如果你需要在不同的操作系统上进行开发,选择一个跨平台支持的编辑器能够方便你在不同环境中进行开发工作
  • 选择最适合自己的(自己不喜欢怎么推荐也都无济于事)

常见的前端编辑器包括 VSCodeWebStormSublimeTextHBuilder等,其中vscode和webstorm青睐度最高,在这里我更推荐大家使用vscode,主打就是一个轻量开发很舒服!webstorm如果喜欢也是可以,只不过比较重,相对于前端项目切换频繁就比较繁重

VSCode 有以下优势:

  • 强大的功能扩展:VS Code 通过丰富的插件生态系统提供了众多功能扩展,包括语言支持、调试工具、版本控制集成、代码片段等,可以根据项目需求和个人偏好进行定制
  • 轻量且快速:VS Code 的设计目标是轻量级和快速响应,它具有优秀的性能和响应速度,适合处理大型项目和高效开发
  • 丰富的语言支持:VS Code 支持多种编程语言,包括常见的前端开发语言(如 JavaScript、TypeScript、HTML、CSS),后端语言(如 Python、Java、C#)等,它提供了智能提示、语法高亮、代码格式化等功能,提升开发效率
  • 内置调试功能:VS Code 内置了强大的调试功能,支持多种调试器和调试配置,可以方便地进行代码调试和错误排查
  • Git 版本控制集成:VS Code 集成了 Git 版本控制功能,可以直接在编辑器中进行代码版本管理、提交、分支切换等操作,简化了开发过程中的版本控制流程
  • 多平台支持:VS Code 可以在 Windows、macOS 和 Linux 等多个操作系统上运行,提供了一致的开发环境和体验,适合团队协作和跨平台开发
  • 社区支持和活跃度:VS Code 拥有庞大的用户社区,社区成员积极参与插件开发、问题解答和功能改进,提供了丰富的学习资源和技术支持

vscode开发实际图

总而言之,使用最适合自己(可以提高开发效率)的编辑器是最佳选择,不要在编辑器的择优上浪费时间,聪明的人不做选择,且这对于应用的开发没有丝毫影响。这里我还是推荐大家使用轻量的vscode,对于平时专注于一个项目的webstorm其实可比较推荐,至于sublime可以做个草稿、记个日志亦足矣

',10);function d(p,m,_,h,g,u){const o=t("Reward"),i=t("Gitalk");return n(),a("div",null,[c,e(o),e(i)])}const b=r(l,[["render",d]]);export{S as __pageData,b as default}; diff --git a/assets/frontend_project-integration_choose-editor.md.VGwstEOo.lean.js b/assets/frontend_project-integration_choose-editor.md.VGwstEOo.lean.js new file mode 100644 index 000000000..dbee2ec4c --- /dev/null +++ b/assets/frontend_project-integration_choose-editor.md.VGwstEOo.lean.js @@ -0,0 +1 @@ +import{_ as r,c as a,J as e,V as s,o as n,G as t}from"./chunks/framework.SV1ROkXV.js";const S=JSON.parse('{"title":"项目集成之编辑器","description":"前端开发应该选择哪种编辑器作为生产力呢?本期我们来聊聊如何选择最适合自己的编辑器","frontmatter":{"title":"项目集成之编辑器","description":"前端开发应该选择哪种编辑器作为生产力呢?本期我们来聊聊如何选择最适合自己的编辑器","keywords":"编辑器,vscode,webstorm","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png","aside":false},"headers":[],"relativePath":"frontend/project-integration/choose-editor.md","filePath":"frontend/project-integration/choose-editor.md","lastUpdated":1706247228000}'),l={name:"frontend/project-integration/choose-editor.md"},c=s("",10);function d(p,m,_,h,g,u){const o=t("Reward"),i=t("Gitalk");return n(),a("div",null,[c,e(o),e(i)])}const b=r(l,[["render",d]]);export{S as __pageData,b as default}; diff --git a/assets/frontend_project-integration_ci-pipeline.md.-exRgXJ0.js b/assets/frontend_project-integration_ci-pipeline.md.-exRgXJ0.js new file mode 100644 index 000000000..49043fc51 --- /dev/null +++ b/assets/frontend_project-integration_ci-pipeline.md.-exRgXJ0.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as n}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/project-integration/ci-pipeline.md","filePath":"frontend/project-integration/ci-pipeline.md","lastUpdated":1706247228000}'),i={name:"frontend/project-integration/ci-pipeline.md"};function r(o,a,c,p,s,d){return n(),t("div")}const _=e(i,[["render",r]]);export{f as __pageData,_ as default}; diff --git a/assets/frontend_project-integration_ci-pipeline.md.-exRgXJ0.lean.js b/assets/frontend_project-integration_ci-pipeline.md.-exRgXJ0.lean.js new file mode 100644 index 000000000..49043fc51 --- /dev/null +++ b/assets/frontend_project-integration_ci-pipeline.md.-exRgXJ0.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as n}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/project-integration/ci-pipeline.md","filePath":"frontend/project-integration/ci-pipeline.md","lastUpdated":1706247228000}'),i={name:"frontend/project-integration/ci-pipeline.md"};function r(o,a,c,p,s,d){return n(),t("div")}const _=e(i,[["render",r]]);export{f as __pageData,_ as default}; diff --git a/assets/frontend_project-integration_debugger-skill.md.Zl33JS1r.js b/assets/frontend_project-integration_debugger-skill.md.Zl33JS1r.js new file mode 100644 index 000000000..05037faf3 --- /dev/null +++ b/assets/frontend_project-integration_debugger-skill.md.Zl33JS1r.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/project-integration/debugger-skill.md","filePath":"frontend/project-integration/debugger-skill.md","lastUpdated":1706247228000}'),n={name:"frontend/project-integration/debugger-skill.md"};function o(a,i,s,d,c,l){return r(),t("div")}const f=e(n,[["render",o]]);export{g as __pageData,f as default}; diff --git a/assets/frontend_project-integration_debugger-skill.md.Zl33JS1r.lean.js b/assets/frontend_project-integration_debugger-skill.md.Zl33JS1r.lean.js new file mode 100644 index 000000000..05037faf3 --- /dev/null +++ b/assets/frontend_project-integration_debugger-skill.md.Zl33JS1r.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/project-integration/debugger-skill.md","filePath":"frontend/project-integration/debugger-skill.md","lastUpdated":1706247228000}'),n={name:"frontend/project-integration/debugger-skill.md"};function o(a,i,s,d,c,l){return r(),t("div")}const f=e(n,[["render",o]]);export{g as __pageData,f as default}; diff --git a/assets/frontend_project-integration_deploy-specification.md.c1zXEw1q.js b/assets/frontend_project-integration_deploy-specification.md.c1zXEw1q.js new file mode 100644 index 000000000..942b22232 --- /dev/null +++ b/assets/frontend_project-integration_deploy-specification.md.c1zXEw1q.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as n,m as e}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/project-integration/deploy-specification.md","filePath":"frontend/project-integration/deploy-specification.md","lastUpdated":1706247228000}'),a={name:"frontend/project-integration/deploy-specification.md"},c=e("p",null,"版本规范",-1),i=e("p",null,"changelog",-1),r=[c,i];function s(p,d,l,_,f,m){return n(),o("div",null,r)}const g=t(a,[["render",s]]);export{u as __pageData,g as default}; diff --git a/assets/frontend_project-integration_deploy-specification.md.c1zXEw1q.lean.js b/assets/frontend_project-integration_deploy-specification.md.c1zXEw1q.lean.js new file mode 100644 index 000000000..942b22232 --- /dev/null +++ b/assets/frontend_project-integration_deploy-specification.md.c1zXEw1q.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as n,m as e}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/project-integration/deploy-specification.md","filePath":"frontend/project-integration/deploy-specification.md","lastUpdated":1706247228000}'),a={name:"frontend/project-integration/deploy-specification.md"},c=e("p",null,"版本规范",-1),i=e("p",null,"changelog",-1),r=[c,i];function s(p,d,l,_,f,m){return n(),o("div",null,r)}const g=t(a,[["render",s]]);export{u as __pageData,g as default}; diff --git a/assets/frontend_project-integration_framework.md.E07YI-v5.js b/assets/frontend_project-integration_framework.md.E07YI-v5.js new file mode 100644 index 000000000..3390417a5 --- /dev/null +++ b/assets/frontend_project-integration_framework.md.E07YI-v5.js @@ -0,0 +1 @@ +import{_ as i,c as r,J as e,V as n,o as l,G as t}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"项目集成之框架选型","description":"在前端发展大爆炸时代如何选择适合自己团队的框架,应依据什么因素作为选择标准呢","frontmatter":{"title":"项目集成之框架选型","description":"在前端发展大爆炸时代如何选择适合自己团队的框架,应依据什么因素作为选择标准呢","keywords":"前端框架,vuejs,reactjs,angularjs,框架选择","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png","aside":false},"headers":[],"relativePath":"frontend/project-integration/framework.md","filePath":"frontend/project-integration/framework.md","lastUpdated":1706247228000}'),s={name:"frontend/project-integration/framework.md"},c=n('

项目集成之框架选型

现如今前端领域开发基本离不开vue、react或angular,这些框架都是前端的新秀,那么如何在工作中选择适合自己团队的框架?

在框架选型时应考虑以下因素:

  • 生态系统和社区支持:了解框架的生态系统和社区活跃度,包括插件、工具、文档和技术支持等
  • 性能和可维护性:考虑框架的性能特点和可维护性,以确保项目的可持续发展
  • 学习曲线和学习资源:评估框架的学习曲线和可用的学习资源

这些条件以上框架其实都符合,那么该如何进一步选择。可结合团队成员的特征习惯和使用成本选之,比如成员大多或招的人基本面向vue那就选择vue,又或成员更偏于react则选其。总之,团队技术的选型定要贴合团队自身的技术偏向和使用成本才是正确之道

以上是针对团队使用一种技术或者小团队而言,那么对于大团队或者有多种想法和爱折腾的团队来说,一种技术肯定不切实际。这种情况当然所有技术都可以选择,选择应更倾于项目本身的复杂度和项目小组的偏向。在这里对于多种技术其实没有多大的讨论价值,用就是了

这里对于多种技术我想说的更是偏向于项目中的多种技术框架,这种情况除非特殊情况尽量减少使用。如果一个项目中使用了多种技术框架可能造成以下诸多问题:

  • 整体配置繁琐、沉重,对于新成员可能无法立马理解透彻
  • 技术掺和一起臃肿且很有可能产生潜在莫名bug且定位困难
  • 配置繁重了可能编辑器也会受不了,造成卡顿现象(M1下也有感)
  • 时间长了可能更不便于维护

项目多种技术不针对大型复杂项目如:微前端等多种架构

总之万不得已应减少项目中的技术框架数量,保持项目技术的纯度,然后结合团队和成本实际情况进行选择

',11);function p(_,d,u,m,f,g){const a=t("Reward"),o=t("Gitalk");return l(),r("div",null,[c,e(a),e(o)])}const j=i(s,[["render",p]]);export{k as __pageData,j as default}; diff --git a/assets/frontend_project-integration_framework.md.E07YI-v5.lean.js b/assets/frontend_project-integration_framework.md.E07YI-v5.lean.js new file mode 100644 index 000000000..74da95134 --- /dev/null +++ b/assets/frontend_project-integration_framework.md.E07YI-v5.lean.js @@ -0,0 +1 @@ +import{_ as i,c as r,J as e,V as n,o as l,G as t}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"项目集成之框架选型","description":"在前端发展大爆炸时代如何选择适合自己团队的框架,应依据什么因素作为选择标准呢","frontmatter":{"title":"项目集成之框架选型","description":"在前端发展大爆炸时代如何选择适合自己团队的框架,应依据什么因素作为选择标准呢","keywords":"前端框架,vuejs,reactjs,angularjs,框架选择","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png","aside":false},"headers":[],"relativePath":"frontend/project-integration/framework.md","filePath":"frontend/project-integration/framework.md","lastUpdated":1706247228000}'),s={name:"frontend/project-integration/framework.md"},c=n("",11);function p(_,d,u,m,f,g){const a=t("Reward"),o=t("Gitalk");return l(),r("div",null,[c,e(a),e(o)])}const j=i(s,[["render",p]]);export{k as __pageData,j as default}; diff --git a/assets/frontend_project-integration_git-commit.md.UP0mr78M.js b/assets/frontend_project-integration_git-commit.md.UP0mr78M.js new file mode 100644 index 000000000..ffd0db0c4 --- /dev/null +++ b/assets/frontend_project-integration_git-commit.md.UP0mr78M.js @@ -0,0 +1,199 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"项目集成之提交规范","description":"项目的规范提交可以帮助团队进行快速定位内容,对于团队进行之间协作和项目维护与迭代有非常重要的作用,本文一起来看看如何在项目中限制git提交信息格式以及使用husky统一lint和commitlint验证","frontmatter":{"title":"项目集成之提交规范","description":"项目的规范提交可以帮助团队进行快速定位内容,对于团队进行之间协作和项目维护与迭代有非常重要的作用,本文一起来看看如何在项目中限制git提交信息格式以及使用husky统一lint和commitlint验证","keywords":"提交规范,git hooks,husky,commitlint,husky结合eslint,husky集合stylelint,husky集合commitlint","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/git-commit.md","filePath":"frontend/project-integration/git-commit.md","lastUpdated":1706247228000}'),t={name:"frontend/project-integration/git-commit.md"},r=o(`

项目集成之提交规范

在团队协作中尤其是对于大型项目,git规范提交在团队中发挥着重要的作用,如果没有统一的规范提交格式,提交信息多了将会显得杂乱无章,这对于后期维护或者是错误定位及回滚尤其是大型项目将是个灾难。拥有固定的提交规范格式将会一目了然,可以快速定位到想要找到的内容。下面就来看看如何在项目中规定提交的规范格式

约定式提交

约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史; 这更有利于编写自动化工具。 通过在提交信息中描述功能、修复和破坏性变更, 目前最受欢迎的是 Angular规范

提交格式如下:

sh
<type>(<scope>): <subject>
+<BLANK LINE>
+<body>
+<BLANK LINE>
+<footer>

每次提交可以包含页眉(header)、正文(body)和页脚(footer),每次提交必须包含页眉内容,页眉的格式指定为提交类型(type)、作用域(scope,可选)和主题(subject)

提交类型

提交类型用来表示本次修改的类型,常见的有如下多种类型:

  • feat:增加新的特征
  • docs:对文档进行了修改
  • fix:修复bug
  • style:不影响代码含义的修改,比如空格、格式化、缺失的分号等
  • test:增加确实的测试或者矫正已存在的测试
  • refactor:既不是修复bug也不是添加特征的代码重构
  • chore:构建过程或辅助工具的变动

作用域

用来指定本次修改的范围,如:component、config、docs等等

主题

主题通常用简洁描述概括本次修改的内容

Breaking Changes

不兼容修改指的是本次提交修改了不兼容之前版本的API或者环境变量,所有不兼容修改都必须在页脚中作为中断更改块提到,以BREAKING CHANGE:开头,后跟一个空格或者两个换行符,其余的信息就是对此次修改的描述,修改的理由和修改注释

关联issue

如果本次提交目的是修改issue的话,需要在页脚引用该issue,如修复bug:

sh
Closes #1, #2

作用

对于团队协作而言,约定式提交的作用主要体现在以下几个方面:

  • 统一提交信息格式:团队成员遵循相同的提交信息格式,从而使提交历史更加整洁、一致。这有助于提高项目的可读性和可维护性
  • 提高代码审查效率:规范的提交信息可以帮助团队成员更快地理解每次提交的目的和更改内容。这可以提高代码审查的效率,减少沟通成本
  • 便于生成版本日志:遵循一致的提交信息规范可以使生成版本日志变得更加容易。一些工具(如 semantic-release)可以自动根据提交信息生成版本日志
  • 提高团队协作水平:帮助团队成员养成良好的编码习惯,培养一致的协作风格。这有助于提高团队的整体协作水平和项目成功率

CommitLint

commitlint 是一个用于规范 Git 提交信息的工具。它可以帮助团队遵循一致的提交信息规范,从而提高代码库的可读性和可维护性。使用 commitlint 对于团队协作具有很大的益处,尤其是在大型项目中

commitlint 的工作原理是通过配置文件(如 commitlint.config.js)定义一组提交信息规则。当开发者提交更改时,commitlint 会检查提交信息是否符合这些规则。如果不符合,提交将被拒绝,开发者需要修改提交信息以满足规则要求

安装

在项目中安装commitcli和@commitlint/config-conventional常规的配置:

sh
 npm install @commitlint/config-conventional @commitlint/cli -D

配置

根目录下创建.commitlintrc.js配置文件:

ts
module.exports = {
+  extends: [], // 继承规则
+  rules: {}, // 具体规则
+  prompt: {} // 交互式
+}

commitlint的配置也包含多种选项,其中常用的就是extends、rules、prompt

extends用来继承第三方规则,通常就是官方提供的规则:

ts
module.exports = {
+  extends: ["@commitlint/config-conventional"]
+}

rules用来配置具体的规则,或者覆盖继承的规则,常用的规则属性如:type-enum(用来限制提交类型)、type-case(格式大小写)、type-empty(类型是否为空)、subject-empty(主题信息)等:

ts
module.exports = {
+  rules: {
+  	'type-enum': [ // 定义提交类型
+  		2,
+  		'always',
+  		[
+  			'feat', // 新功能
+  			'bug', // 具体修复的bug
+  			'fix', // 修复的功能
+  			'ci', // ci更新
+  			'docs', // 文档
+  			'chore', // 比较杂的内容
+  			// ...
+  		]
+  	],
+  	'type-case': [2, 'always', 'lower-case'], // 提交类型大小写
+  	'type-empty': [2, 'never'], // 提交类型不能为空
+  	'subject-empty': [2, 'never'], // 提交信息不能为空
+  	// ...
+  }
+}

提交类型错误,不存在 'happy' 类型:

sh
 git:(dev) ✗ echo 'happy: 测试' | npx commitlint
+   input: happy: 测试
+   type must be one of [feat, bug, fix, ui, ci, perfect, docs, style, perf, 
+release, deploy, refactor, test, chore, revert, merge, build] [type-enum]
+
+   found 1 problems, 0 warnings

提交信息不能为空:

sh
 git:(dev) ✗ echo 'feat' | npx commitlint  
+   input: feat
+   subject may not be empty [subject-empty]
+   type may not be empty [type-empty]
+
+   found 2 problems, 0 warnings

正确提交:

sh
 git:(dev) ✗ echo 'feat: 测试' | npx commitlint

commitizen

commitlint主要在commit时对提交信息进行校验,而commitizen是在commit前通过交互式进行提交,这样就可以统一输入内容,本人认为相对繁琐。下面来看如何使用

安装

安装commitizen,可以安装在全局也可以安装在项目中,安装方式和工具可自行选择:

sh
 yarn add commitizen -D
+
+ npx commitizen init cz-conventional-changelog --yarn --dev --exact

package.json中配置脚本:

json
{
+  "scripts": {
+    "commit": "cz"
+  }
+}

使用

在项目中先对代码进行暂存,然后进行提交:

sh
 npm run commit

当执行以上命令后,就会进入commitizen交互阶段:

sh
 git:(main) ✗ npm run commit
+$ cz
+cz-cli@4.3.0, cz-conventional-changelog@3.3.0
+# 选择提交类型
+? Select the type of change that you're committing: (Use arrow keys)
+❯ feat:     A new feature
+  fix:      A bug fix
+  docs:     Documentation only changes
+  style:    Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
+  refactor: A code change that neither fixes a bug nor adds a feature
+  perf:     A code change that improves performance
+  test:     Adding missing tests or correcting existing tests
+(Move up and down to reveal more choices)
+
+# 这里选择feat
+? Select the type of change that you're committing: feat:     A new feature
+? What is the scope of this change (e.g. component or file name): (press enter to skip) config  # 修改范围 scope
+? Write a short, imperative tense description of the change (max 86 chars):   # 主题 commit简短信息
+ (5) 初始化项目
+? Provide a longer description of the change: (press enter to skip)  # 长描述,这里没有
+
+? Are there any breaking changes? No   # 是否是不兼容性的改变 否
+? Does this change affect any open issues? No   # 是否影响相关issue
+[main (root-commit) 76f5d72] feat(config): 初始化项目
+ 4 files changed, 1111 insertions(+)
+ create mode 100644 .gitignore
+ create mode 100644 .npmrc
+ create mode 100644 package.json
+ create mode 100644 yarn.lock
+  Done in 169.05s.

这样团队都是用此脚本时commit信息就会被规范化而不会出现五花八门现象

自定义规范

安装cz-customizable插件进行自定义配置:

sh
 yarn add cz-customizable -D

修改commitizen的规则路径:

json
// package.json
+{
+  "config": {
+    "commitizen": {
+      "path": "node_modules/cz-customizable"
+    }
+  }
+}

commitizen默认会读取根项目下的.cz-config.js文件,新建文件:

js
module.exports = {
+  // 自定义提交类型
+  types: [
+    {
+      value: '✨ feat',
+      name: '✨ feat:     新功能'
+    },
+    {
+      value: '🐛 fix',
+      name: '🐛 fix:      修复bug'
+    },
+    {
+      value: '🎉 init',
+      name: '🎉 init:     初始化'
+    },
+    {
+      value: '✏️ docs',
+      name: '✏️  docs:     文档变更'
+    },
+    {
+      value: '💄 style',
+      name: '💄 style:    代码的样式美化'
+    },
+    {
+      value: '♻️ refactor',
+      name: '♻️  refactor: 重构'
+    },
+    {
+      value: '⚡️ perf',
+      name: '⚡️ perf:     性能优化'
+    },
+    {
+      value: '✅ test',
+      name: '✅ test:     测试'
+    },
+    {
+      value: '⏪️ revert',
+      name: '⏪️ revert:   回退'
+    },
+    {
+      value: '📦️ build',
+      name: '📦️ build:    打包'
+    },
+    {
+      value: '🚀 chore',
+      name: '🚀 chore:    构建/工程依赖/工具'
+    },
+    {
+      value: '👷 ci',
+      name: '👷 ci:       CI related changes'
+    }
+  ],
+  // 修改范围
+  scopes: [
+    { name: 'components' },
+    { name: 'config' },
+    { name: 'services' },
+    { name: 'utils' },
+    { name: 'styles' },
+  ],
+  // 每个阶段提示信息
+  messages: {
+    type: '请选择提交类型(必填):',
+    customScope: '请选择文件修改范围(可选):',
+    subject: '请简要描述提交信息(必填):',
+    body: '请输入详细描述(可选):',
+    breaking: '列出任何BREAKING CHANGES(可选):\\n',
+    footer: '请输入要关闭的issue,如:#1, #2, #3(可选)\\n',
+    confirmCommit: '确定要提交吗?'
+  },
+  allowCustomScopes: true,
+  allowBreakingChanges: [':sparkles: feat', ':bug: fix'],
+  subjectLimit: 72
+}

接下来看下效果:

sh
 git:(main) ✗ yarn commit
+$ cz
+cz-cli@4.3.0, cz-customizable@7.0.0
+
+All lines except first will be wrapped after 100 characters.
+? 请选择提交类型(必填): (Use arrow keys)
+ ✨ feat:     新功能
+  🐛 fix:      修复bug
+  🎉 init:     初始化
+  ✏️  docs:     文档变更
+  💄 style:    代码的样式美化
+  ♻️  refactor: 重构
+  ⚡️ perf:     性能优化
+(Move up and down to reveal more choices)

结合commitlint

commitizen可以与commitlint结合使用,commitizen在commit前触发、commitlint主要在commit阶段对提交信息进行校验,那么commitlint可以继承commitizen的规则,从而便可校验通过:

安装commitlint-config-cz

sh
 yarn add commitlint-config-cz -D

配置commitlint:

js
// .commitlintrc.js
+module.exports = {
+  // 这里只需要继承cz的规则,也就会读取commitizen的规则
+  // 上面我们也对commitizen进行了自定义规则,那么commitlint
+  // 就会读取.cz-config.js的自定义规则进行校验
+  extends: [/*"@commitlint/config-conventional", */"cz"],
+  // 其它的归于commitlint的自定义规则全部注释掉
+}

以上配置好了后,就整合好了那么在提交时就会先触发commitizen然后通过commitlint对commit进行校验

commitizen我更认为比较繁琐,觉得使用commitlint一个结合原生的git提交就足够了

Husky

Husky是一个git钩子,可以在git的commit前和commit时添加自定义校验,通常用来eslint、stylelint和commitlint,看看如何使用

安装配置

sh
 yarn add husky -D
+ npx husky install

上面安装后便会在根目录下生成.husky目录,里面包含了commit的钩子

package.json中添加脚本,在项目下载时自动对git生成钩子函数:

json
{
+  "scripts": {
+    "postinstall": "husky install" // 安装完后,生成git hooks
+  }
+}

集成lint

在项目开发完后进行提交前一般都会对代码进行lint或者测试,这里就以lint为例,在提交git时对项目代码进行eslint、stylelint检查

首先设置相关的lint脚本:

json
{
+  "scripts": {
+    "lint": "yarn lint:js && yarn lint:style",
+    "lint:js": "vue-cli-service lint --fix",
+    "lint:style": "stylelint 'src/**/*.{less,vue,tsx}' --fix"
+  }
+}

添加git hooks,在git提交前对代码进行校验:

sh
 npx husky add .husky/pre-commit "yarn lint"

添加完后在.husky/pre-commit中就会添加一下信息:

sh
#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+yarn lint
+# 这里是手动写入,也就是sh脚本
+echo Lint Sucessful
+
+# 若lint fix后将已经暂存的文件继续暂存以commit
+git add $(git diff --name-only --cached)

接下来集成commitlint

集成commitlint

添加以下脚本在commit时启动commitlint检查提交信息:

sh
 npx husky add .husky/commit-msg 'npx --no-install commitlint -e'

执行完后会在.husky/commit-msg中写入以下内容:

sh
#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx --no-install commitlint -e
+echo commit success 🎉

到这里就已经集成完毕了,以下为集成后的使用效果:

号外 📣

注意使用commitizen需要使用cz钩子而不能使用git commit了,其实本人觉得使用commitizen交互性比较繁琐,可以在项目中直接使用commitlint并定义相关规则,然后使用git commit对触发husky钩子并对commit信息进行验证

参考文档

`,99);function i(F,D,y,m,b,u){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[r,s(a),s(l)])}const C=p(t,[["render",i]]);export{h as __pageData,C as default}; diff --git a/assets/frontend_project-integration_git-commit.md.UP0mr78M.lean.js b/assets/frontend_project-integration_git-commit.md.UP0mr78M.lean.js new file mode 100644 index 000000000..c34bdc190 --- /dev/null +++ b/assets/frontend_project-integration_git-commit.md.UP0mr78M.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"项目集成之提交规范","description":"项目的规范提交可以帮助团队进行快速定位内容,对于团队进行之间协作和项目维护与迭代有非常重要的作用,本文一起来看看如何在项目中限制git提交信息格式以及使用husky统一lint和commitlint验证","frontmatter":{"title":"项目集成之提交规范","description":"项目的规范提交可以帮助团队进行快速定位内容,对于团队进行之间协作和项目维护与迭代有非常重要的作用,本文一起来看看如何在项目中限制git提交信息格式以及使用husky统一lint和commitlint验证","keywords":"提交规范,git hooks,husky,commitlint,husky结合eslint,husky集合stylelint,husky集合commitlint","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/git-commit.md","filePath":"frontend/project-integration/git-commit.md","lastUpdated":1706247228000}'),t={name:"frontend/project-integration/git-commit.md"},r=o("",99);function i(F,D,y,m,b,u){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[r,s(a),s(l)])}const C=p(t,[["render",i]]);export{h as __pageData,C as default}; diff --git a/assets/frontend_project-integration_monorepo.md.oJ7L8XFu.js b/assets/frontend_project-integration_monorepo.md.oJ7L8XFu.js new file mode 100644 index 000000000..12a542066 --- /dev/null +++ b/assets/frontend_project-integration_monorepo.md.oJ7L8XFu.js @@ -0,0 +1,79 @@ +import{_ as s,c as n,o as a,V as p}from"./chunks/framework.SV1ROkXV.js";const d=JSON.parse('{"title":"项目集成之Monorepo","description":"项目集成monorepo","frontmatter":{"title":"项目集成之Monorepo","description":"项目集成monorepo","keywords":"monorepo使用","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/monorepo.md","filePath":"frontend/project-integration/monorepo.md","lastUpdated":1706247228000}'),e={name:"frontend/project-integration/monorepo.md"},l=p(`

项目集成之Monorepo

Monorepo(单一代码仓库)是指在软件开发中,将多个项目或组件放置在同一个代码仓库中的开发模式。在传统的多仓库开发模式中,每个项目或组件都有自己独立的代码仓库,而在Monorepo中,所有项目或组件共享同一个代码仓库

发展历程

  • 单体应用:应用都处在一个仓库内,按文件名等划分一些公共方法、组件
  • 多仓库:多个仓库管理一个应用,每个仓库都是一个独立的包
  • 单仓库多模块:单个仓库管理多个包

单体应用、到仓库会随着业务的复杂度提升、项目的复杂度增长,会导致编译速度变慢、调试成本变大、代码共享难度大等一系列的问题,这些问题monorepo模式都可以解决

概念

什么是monorepo呢❓

Monorepo 只是一个管理概念,实际上它并不代表某项具体的技术,更不是所谓的框架。开发人员需要根据不同场景、不同的研发习惯,使用相应的技术手段或者工具,来达到或者完善它的整个流程,从而达到更好的开发和管理体验

monorepo中可以管理多个不同的包,通常结构如下所示:

sh
group
+├── node_modules/
+├── packages/
+   ├── packageA  # 子包A
+   │    └── package.json
+   └── packageB  # 子包B
+        └── package.json
+└── package.json
+
+# 项目中引入
+npm install @group/packageA ...

作用

  1. 代码共享和复用:Monorepo将多个项目或组件放置在同一个代码仓库中,促进了代码的共享和复用。不同项目之间可以更轻松地共享代码、模块、工具和配置文件,避免了重复编写和维护相似的代码。这样可以减少代码冗余,提高开发效率
  2. 简化协作和协同开发:Monorepo使团队成员能够更紧密地协作开发。开发人员可以在同一个代码库中共享问题和解决方案,跟踪彼此的更改,更容易进行代码评审和知识共享。这样可以提高团队的协同效率,促进团队合作和沟通
  3. 统一构建和部署过程:Monorepo可以简化构建和部署过程。由于所有项目或组件在同一个代码仓库中,可以使用统一的构建和部署流程来管理整个代码库。这样可以减少维护多个独立仓库的复杂性,提高开发效率和一致性。同时,可以更轻松地管理共享的构建工具和配置文件
  4. 更好的代码可视性和管理:Monorepo提供了更好的代码可视性和管理。所有项目或组件的代码都在同一个代码仓库中,可以方便地查看整个代码库的历史记录、版本控制和问题跟踪。这使得追踪更改、维护和管理代码更加方便。同时,可以更容易地进行代码重构、重组和重命名,因为所有相关代码都在同一个仓库中

任何技术或多或少都有一些缺陷,monorepo模式中代码对于成员都是透明的,无法精确按文件夹进行权限分配;除此之外子包变多时对于版本的控制也会变得麻烦

包管理方案

上面讲了关于monorepo单仓库多包管理方案的优势和必要性,那么具体是如何实现的呢?接下来我们就来看看通过如下几个方式实现monorepo

npm

npm v7开始引入了workspace的概念,不过使用的效果并不是很好,也不推荐使用

sh
 npm install npm@7
+ npm init -w packages

在package.json中配置:

json
{
+  "name": "monorepo",
+  "private": true,
+  "workspaces": [
+    "packages/*"
+  ]
+}

创建子包:

sh
 cd packages && npm init -w packages/a

依赖安装:

sh
 npm install axios -w package/a

执行命令:

sh
npm run dev -w package/a

由于npm无法提高依赖的重复使用,磁盘占用空间会变得越来越大,一般不使用npm

yarn

初始化仓库:

sh
 yarn init -y

定义workspaces字段,是个数组可以使用 glob 语法,下面就定义了packages路径下的为子包

json
{
+  "name": "root",
+  "private": true,
+  "license": "MIT",
+  "workspaces": ["packages/*"]
+}

根路径安装依赖:

sh
 yarn add typescript -W -D

-W表示在当前根路径安装

给某个子包安装依赖:

sh
 yarn workspace pkg1 add vue -D

给某个子包安装其他的子包:

sh
 yarn workspace pkg1 add pkg2@1.0.0

需要注意安装子包时需要标明对应的工作区的版本号,否则会报错

通常yarn monorepo会结合 lerna 来管理仓库,它是有babel为解决monorepo而创建的,内置了丰富的版本管理、打包管理流程,现在yarn已经具备了workspace的能力,因此lerna可以专注用来管理monorepo的版本发布,而包的管理交给yarn处理就可以了。现在来看下使用:

sh
 npm install lerna -g
+# 初始化
+ npx lerna init

初始化后会生成一个配置文件:

json
{
+  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
+  "version": "1.0.0",
+}

更多lerna的配置可以查看官方文档

lerna简单的使用命令

  • run:使用lerna run build就会执行所有包的build的命令,通过--scope参数可以指定对应的包
  • create: 使用lerna create 包名会创建对应的子包

使用lerna平滑升级包

sh
 lerna version --no-private
+info cli using local version of lerna
+lerna notice cli v7.1.5
+lerna info versioning independent
+lerna info Assuming all packages changed
+? Select a new version for @mono/pkg1 (currently 0.0.1) (Use arrow keys)
+ Patch (0.0.2) 
+  Minor (0.1.0) 
+  Major (1.0.0) 
+  Prepatch (0.0.2-alpha.0) 
+  Preminor (0.1.0-alpha.0) 
+  Premajor (1.0.0-alpha.0) 
+  Custom Prerelease 
+  Custom Version

lerna目前结合了 nx 来进行增量打包,性能可以说特别好

pnpm

pnpm就是为解决monorepo问题而产生的的包管理方案,结合了很多其他包管理器优秀的方案

首先安装pnpm:

sh
 npm i pnpm -g

初始化项目:

sh
 pnpm init

创建pnpm-workspace.yaml文件使用yaml语法定义所有的子包,同样支持glob匹配

yaml
packages:
+  - 'packages/**'
+  - 'docs'

这里规定packages下的路径和docs都是子包

pnpm命令使用

  • install:使用pnpm install会安装所有依赖
  • add:使用pnpm add --filter 子包名 依赖名来为指定的子包安装依赖

更多命令使用请参考官方文档

构建方案

在monorepo项目中打包可能会是很难受的,对于一个大的项目来讲可能会有很多子包,子包之间可能也会存在复杂的依赖关系,那么打包的顺序就很关键了,如果手动来管理就会变得非常麻烦,所以就出现了一些优秀的打包器:nxturborush

turbo

turbo是Vercel公司推出的一款打包器,他可以实现增量打包并对产物实现缓存的逻辑,如果源文件的内容没变时就会直接跳过打包流程使用缓存,这里我们使用pnpm结合turbo一起使用

sh
# 在工作区安装turbo
+ pnpm add turbo -Dw

创建turbo配置文件:

json
{
+  "$schema": "https://turborepo.org/schema.json",
+  "pipeline": {
+    "build": { // 
+      "dependsOn": ["^build"] // 
+    },
+  },
+  "globalDependencies": [] // 
+}

nx

nx是Nrwl推出的专门为Angular和React等现代Web应用提供工具和解决方案的公司

sh
# 使用nx创建monorepo仓库
+ npx create-nx-workspace

会生成nx.json配置文件:

json
{
+  "extends": "nx/presets/npm.json",
+  "$schema": "./node_modules/nx/schemas/nx-schema.json",
+  "tasksRunnerOptions": {
+    "default": {
+      "runner": "nx/tasks-runners/default",
+      "options": {
+        "cacheableOperations": [
+          "build",
+          "lint",
+          "test",
+          "e2e"
+        ],
+      }
+    }
+  },
+  "targetDefaults": {
+    "build": {
+      "dependsOn": [
+        "^build"
+      ],
+      "outputs": [
+        "{projectRoot}/dist"
+      ]
+    },
+  }
+}

上面的cacheableOperations属性用来配置可以被缓存的脚本,可以自行定义;targetDefaults来配置打包的流程,每个key对应一个打包脚本,dependsOn中定义当前脚本依赖哪个脚本,以^开头的表示依赖的其他包的脚本,这样打包时就会有个先后顺序;没有的则表示当前仓库的执行脚本。outputs表示打包后的产物路径,nx会根据上次的产物进行计算,对源码没有改变的包会进行增量打包

rush

rush是微软公司推出的monorepo仓库的解决方案

sh
 npm install -g @microsoft/rush

版本方案

changesets

https://github.com/changesets/changesets

changesets用来解决monorepo仓库的包版本管理方案

实战

`,84),o=[l];function r(t,c,i,F,u,D){return a(),n("div",null,o)}const b=s(e,[["render",r]]);export{d as __pageData,b as default}; diff --git a/assets/frontend_project-integration_monorepo.md.oJ7L8XFu.lean.js b/assets/frontend_project-integration_monorepo.md.oJ7L8XFu.lean.js new file mode 100644 index 000000000..f3b3d6066 --- /dev/null +++ b/assets/frontend_project-integration_monorepo.md.oJ7L8XFu.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,V as p}from"./chunks/framework.SV1ROkXV.js";const d=JSON.parse('{"title":"项目集成之Monorepo","description":"项目集成monorepo","frontmatter":{"title":"项目集成之Monorepo","description":"项目集成monorepo","keywords":"monorepo使用","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/monorepo.md","filePath":"frontend/project-integration/monorepo.md","lastUpdated":1706247228000}'),e={name:"frontend/project-integration/monorepo.md"},l=p("",84),o=[l];function r(t,c,i,F,u,D){return a(),n("div",null,o)}const b=s(e,[["render",r]]);export{d as __pageData,b as default}; diff --git a/assets/frontend_project-integration_specification.md.VgHGKirL.js b/assets/frontend_project-integration_specification.md.VgHGKirL.js new file mode 100644 index 000000000..d036ac58a --- /dev/null +++ b/assets/frontend_project-integration_specification.md.VgHGKirL.js @@ -0,0 +1,95 @@ +import{_ as e,c as p,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"项目集成之语法规范","description":"使用eslint、typescript来约束代码语法规范增强类型提示,从而降低一些潜在的代码问题并提升团队之间的协作效率","frontmatter":{"title":"项目集成之语法规范","description":"使用eslint、typescript来约束代码语法规范增强类型提示,从而降低一些潜在的代码问题并提升团队之间的协作效率","keywords":"语法规范,eslint,typescript,eslint使用,类型提示","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/specification.md","filePath":"frontend/project-integration/specification.md","lastUpdated":1706247228000}'),r={name:"frontend/project-integration/specification.md"},c=o(`

项目集成之语法规范

项目语法规范在大型项目以及团队成员之间的协作中发挥着非常重要的作用,尤其是在项目需求变更或者重构时随心所欲的代码可能让团队头疼简直比推倒重写还难。因此团队统一代码规范及质量有利于团队之间的协作,更有益于项目的长远维护,那么如何做好这方面的工作呢?

当然这里对于语法规范及质量要求只是个辅助工具,最重要的核心性能提升还是要靠每个人的开发功底

重要性

前面简单讲了下随心所欲的代码会变得难以维护,无规矩不成方圆,只有大家达成同一种编码意识,才能事半功倍。在项目开发中代码的质量及语法规范发挥着重要的作用,主要体现在以下几点:

  • 可读性和可维护性:高质量的代码应具有良好的可读性,使团队成员能够轻松理解代码逻辑和意图。可维护性是指代码易于修改和扩展,减少引入错误的风险。良好的代码质量可以提高代码的可读性和可维护性,使团队能够更轻松地维护和修改代码

  • 可靠性和稳定性:优质的代码应具备高度的可靠性和稳定性,以减少bug和错误的发生。良好的代码质量可以通过静态类型检查、代码规范、单元测试等方式来提高代码的可靠性,并减少在项目维护过程中出现的潜在问题

  • 可扩展性和重用性:良好的代码质量可以提供良好的结构和设计,使代码易于扩展和重用。模块化和清晰的代码结构可以促进团队协作,使团队成员能够更轻松地理解和使用彼此的代码,从而提高开发效率和项目的可扩展性

  • 团队协作和知识共享:高质量的代码可以促进团队协作和知识共享。一致的代码风格、规范和最佳实践可以帮助团队成员更好地理解和协作,减少因为代码质量差异而引起的摩擦和冲突

如何做

首先需要在每个人的编码功底的基础上使用统一的编码规范,可以借助辅助工具eslint帮助检查编码的规范降低错误风险。除此之外可以在项目中添加typescript,众所周知js是个弱类型动态语言,对于相关变量的类型要求没有约束,如下面代码:

ts
// 数字与字符串的转换问题
+var total = 3;
+total = "3";
+total += 3; // => "33"

除了上面的问题外还有很多常见的问题如:变量提升、作用域问题等等,因此使用纯原生js很有可能造成相关问题,那么通过eslint结合ts就可以完美的解决这些问题。使用ts可以加强类型提示,使得js如其他语言Java一样可以对类型进行限制,从而降低代码错误风险

ESLint

eslint是一个JavaScript/TypeScript的静态代码分析工具,用于检测和报告代码中的潜在问题和编码规范的违规。它可以帮助检查修复运行时漏洞、最佳规范实践、代码风格等问题,但推荐仅作为漏洞、语法规范的检查器。对于协同编码规范eslint是必不可少的工具,总之没有typescript也不能没有eslint

ESLint原理是基于静态代码分析,通过解析代码构建抽象语法树,然后应用配置的规则来对代码进行检查和分析

配置文件

eslint支持多种形式的配置文件,你可以创建.eslintrc.js.eslintrc.json.eslintrc.yml或在package.json中配置eslint,下面以.eslintrc.js形式配置:

ts
module.exports = {
+  root: true,
+  env: {}, // 环境
+  globals: {}, // 全局变量
+  extends: [], // 扩展
+  plugins: [], // 插件
+  parser: "", // 解析器
+  parserOptions: {}, // 解析器选项
+  rules: {}, // 具体规则
+  overrides: { files: [], rules: {} }, // 覆盖特定规则
+}

eslint配置总体来说包含env、globals、extends、plugins、parser、parserOptions、rules、overrides等几个模块的配置,了解每个模块的作用对理解整体eslint的配置非常重要

创建eslint忽略的检查文件,可以在配置文件中添加ignorePatterns字段配置,或者创建一个单独的配置文件.eslintignore(推荐):

txt
node_modules
+.eslint*
+// etc..

environments、globals

environments、globals都是用来设置设置当前代码的语言环境和全局变量的,通过二者配置可以轻松使用环境中的语法和变量以及自定义全局变量

environments 设置代码的语言环境,可以设置一个或多个,支持的语言选择项有:browser、node、commonjs、es6等等,简单配置:

ts
module.exports = {
+  env: {
+    browser: true,
+    node: true,
+    es6: true
+  }
+}
+
+// 代码中可以使用browser、node、es6的语法及变量
+// window.innerWidth
+// process.env
+// Promise

globals 用来配置自定义的全局变量,告诉eslint会存在的全局变量有哪些,这样对于没有定义的全局变量就不会报错了:

ts
module.exports = {
+  globals: {
+  	__is_Dev__: "realonly",
+  	version: "writable"
+  }
+}
+// 定义了 __is_Dev__、version 两个全局变量,前者只读、后者可以修改
+if (__is_Dev__) console.log("dev");
+console.log(version);
+version = "change version";

parser、parserOptions

parser用于指定 ESLint 使用的解析器。解析器负责将代码转换成抽象语法树AST,以便 ESLint 可以对代码进行静态分析。默认情况eslint使用espree作为解析器,除此之外常用的解析器有以下几种:

  • Esprima:基于 JavaScript 的 ECMAScript 5.1 标准实现的解析器,很适合纯粹的 JavaScript 项目
  • @babel/eslint-parser:使 Babel 解析器与 ESLint 兼容的的包装器
  • @typescript-eslint/parser:将 TypeScript 转换为与 ESTree 兼容的形式的解析器,通常在ts项目中使用其作为解析器
ts
module.exports = {
+  parser: "@typescript-eslint/parser"
+}

parserOptions用于提供解析器的选项和配置信息,比如支持的js版本、jsx支持等等,为解析器服务

ts
module.exports = {
+  parserOptions: {
+  	"ecmaVersion": "latest", // js版本
+  	"sourceType": "module", // 代码形式 module | script
+  	// "allowReserved": true, // 允许使用保留字
+  	"ecmaFeatures": { // 特性
+  		"jsx": true,
+  		"globalReturn": true, // 全局return
+  		"impliedStrict": true // 严格模式
+  	}
+  }
+}

这块应该比较好理解的,大家根据自己的需求选择即可

rules、overrides

以上的属性如不作特殊定制可以不进行配置,rules是eslint的核心模块,用来配置代码校验的一套规则。eslint中内置了很多规则,可以根据自己需求进行配置,规则还可以包含针对该规则的额外配置选项

规则值

  • "off" 或 0 - 关闭规则
  • "warn" 或 1 - 启用并视作警告(不影响退出)。
  • "error" 或 2 - 启用并视作错误(触发时退出代码为 1)

除此之外还可以针对单个规则添加额外的配置

示例

ts
module.exports = {
+  rules: {
+  	'no-console': 'warn', // console警告
+  	"no-tabs": 0, // 关闭tabs 规则
+  	"max-len": ['error', { 'code': 80 }], // 每行最大长度,超过80报错
+  }
+}

上面展示了如何使用 '字符' 和 '数值' 作为值,并对 'max-len' 单个规则设置了选项

优先级

规则优先级 extends < rules < overrides < comments

overrides

知道了rules那么什么是overrides呢?rules是对设置的指定目标进行代码检查,如果对于特殊的目标文件不想使用rules的规则,那么就可以使用overrides进行规则覆盖

ts
module.exports = {
+  "rules": {
+    "quotes": ["error", "double"]
+  },
+  "overrides": [
+    {
+      "files": ["bin/*.js", "lib/*.js"],
+      "excludedFiles": "*.test.js",
+      "rules": {
+        "quotes": ["error", "single"]
+      }
+    }
+  ]
+}

上面列子展示了在bin、lib下除了*.test.js外只能使用单引号,覆盖掉全局的双引号规则

plugins、extends

前面知道eslint内置了很多规则和默认解析解析器,那么plugins就是来扩展除内置以外的其他规则,说白了就是让eslint有解析其他自定义规则的能力。注意引入plugin并不是引入了当前plugin中所有的规则,他只是扩展了eslint解析当前plugin中规则的能力,至于具体的规则还需要在rules中配置

ts
module.exports = {
+  plugins: ["react"], // 引入第三方插件,eslint-plugin-react简写
+  rules: {
+  	"react/jsx-boolean-value": 2 // 配置插件中的规则
+  }
+}

注意使用第三方插件需要先安装:

sh
 npm install eslint-plugin-react -D

插件名通常包含两种形式:

  • 非group类:如eslint-plugin-react
  • group类:@react/eslint-plugin-react

提示

使用插件时可以省略掉插件名的前的eslint-plugin-,如:eslint-plugin-react可以写成react,@react/eslint-plugin-react可以写成@react/react

对于插件的规则配置也是基于插件名的两种形式:

ts
// eslint-plugin-react => react/no-console
+// @react/eslint-plugin-react => @react/react/no-console
+module.exports = {
+  plugins: ["react", "@react/react"],
+  rules: {
+  	"react/no-console": "error",
+  	"@react/react/no-console": 1
+  }
+}

从plugin的使用中可以看到步骤繁琐,需要对plugin中规则一一写出很麻烦,因此引入了extends的概念,用来继承某些规则,如使用了plugin时,可以在extends中写入plugin的推荐配置,命名规则:plugin:包名/规则

ts
module.exports = {
+  plugins: ["react"],
+  extends: [
+    "eslint:recommended", // 继承官方推荐的
+    "plugin:react/recommended" // 继承react插件中推荐的规则集
+  ]
+}

除了可以扩展第三方插件的规则集,还可以使用本地的规则

ts
module.exports = {
+  extends: ["./somepath/.eslintrc-jsx"]
+}

对于这些工具,一般推荐使用官方维护的eslint插件和配置,然后在其基础上进行定制,这样可以减少繁琐的配置,避免浪费时间

编辑器集成

这里使用vscode进行eslint的集成,首先下载eslint插件

在vscode配置中加入以下配置(或者在设置面板中搜索eslint进行选择配置):

json
{
+  "editor.codeActionsOnSave": {
+    "source.fixAll.eslint": true,
+    // "source.fixAll": true
+  },
+  "eslint.codeActionsOnSave.mode": "problems",
+}

以上配置好了后重新vscode

规则集

TypeScript

eslint虽然可以帮助降低代码出错的风险,但仍无法更直接表达相关的类型约束,js是个弱类型语言没有相关的类型约束,对于约束性不强的开发者来说仍是个头疼的问题,久而久之可能就会变得难以维护

使用typescript可以增强类型提示提高开发效率降低协作成本,也方便后续的维护。关于typescript的使用可以查看我有关typescript的文章

`,70);function i(F,D,y,u,b,d){const a=n("Reward"),l=n("Gitalk");return t(),p("div",null,[c,s(a),s(l)])}const h=e(r,[["render",i]]);export{g as __pageData,h as default}; diff --git a/assets/frontend_project-integration_specification.md.VgHGKirL.lean.js b/assets/frontend_project-integration_specification.md.VgHGKirL.lean.js new file mode 100644 index 000000000..d036ac58a --- /dev/null +++ b/assets/frontend_project-integration_specification.md.VgHGKirL.lean.js @@ -0,0 +1,95 @@ +import{_ as e,c as p,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"项目集成之语法规范","description":"使用eslint、typescript来约束代码语法规范增强类型提示,从而降低一些潜在的代码问题并提升团队之间的协作效率","frontmatter":{"title":"项目集成之语法规范","description":"使用eslint、typescript来约束代码语法规范增强类型提示,从而降低一些潜在的代码问题并提升团队之间的协作效率","keywords":"语法规范,eslint,typescript,eslint使用,类型提示","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/specification.md","filePath":"frontend/project-integration/specification.md","lastUpdated":1706247228000}'),r={name:"frontend/project-integration/specification.md"},c=o(`

项目集成之语法规范

项目语法规范在大型项目以及团队成员之间的协作中发挥着非常重要的作用,尤其是在项目需求变更或者重构时随心所欲的代码可能让团队头疼简直比推倒重写还难。因此团队统一代码规范及质量有利于团队之间的协作,更有益于项目的长远维护,那么如何做好这方面的工作呢?

当然这里对于语法规范及质量要求只是个辅助工具,最重要的核心性能提升还是要靠每个人的开发功底

重要性

前面简单讲了下随心所欲的代码会变得难以维护,无规矩不成方圆,只有大家达成同一种编码意识,才能事半功倍。在项目开发中代码的质量及语法规范发挥着重要的作用,主要体现在以下几点:

  • 可读性和可维护性:高质量的代码应具有良好的可读性,使团队成员能够轻松理解代码逻辑和意图。可维护性是指代码易于修改和扩展,减少引入错误的风险。良好的代码质量可以提高代码的可读性和可维护性,使团队能够更轻松地维护和修改代码

  • 可靠性和稳定性:优质的代码应具备高度的可靠性和稳定性,以减少bug和错误的发生。良好的代码质量可以通过静态类型检查、代码规范、单元测试等方式来提高代码的可靠性,并减少在项目维护过程中出现的潜在问题

  • 可扩展性和重用性:良好的代码质量可以提供良好的结构和设计,使代码易于扩展和重用。模块化和清晰的代码结构可以促进团队协作,使团队成员能够更轻松地理解和使用彼此的代码,从而提高开发效率和项目的可扩展性

  • 团队协作和知识共享:高质量的代码可以促进团队协作和知识共享。一致的代码风格、规范和最佳实践可以帮助团队成员更好地理解和协作,减少因为代码质量差异而引起的摩擦和冲突

如何做

首先需要在每个人的编码功底的基础上使用统一的编码规范,可以借助辅助工具eslint帮助检查编码的规范降低错误风险。除此之外可以在项目中添加typescript,众所周知js是个弱类型动态语言,对于相关变量的类型要求没有约束,如下面代码:

ts
// 数字与字符串的转换问题
+var total = 3;
+total = "3";
+total += 3; // => "33"

除了上面的问题外还有很多常见的问题如:变量提升、作用域问题等等,因此使用纯原生js很有可能造成相关问题,那么通过eslint结合ts就可以完美的解决这些问题。使用ts可以加强类型提示,使得js如其他语言Java一样可以对类型进行限制,从而降低代码错误风险

ESLint

eslint是一个JavaScript/TypeScript的静态代码分析工具,用于检测和报告代码中的潜在问题和编码规范的违规。它可以帮助检查修复运行时漏洞、最佳规范实践、代码风格等问题,但推荐仅作为漏洞、语法规范的检查器。对于协同编码规范eslint是必不可少的工具,总之没有typescript也不能没有eslint

ESLint原理是基于静态代码分析,通过解析代码构建抽象语法树,然后应用配置的规则来对代码进行检查和分析

配置文件

eslint支持多种形式的配置文件,你可以创建.eslintrc.js.eslintrc.json.eslintrc.yml或在package.json中配置eslint,下面以.eslintrc.js形式配置:

ts
module.exports = {
+  root: true,
+  env: {}, // 环境
+  globals: {}, // 全局变量
+  extends: [], // 扩展
+  plugins: [], // 插件
+  parser: "", // 解析器
+  parserOptions: {}, // 解析器选项
+  rules: {}, // 具体规则
+  overrides: { files: [], rules: {} }, // 覆盖特定规则
+}

eslint配置总体来说包含env、globals、extends、plugins、parser、parserOptions、rules、overrides等几个模块的配置,了解每个模块的作用对理解整体eslint的配置非常重要

创建eslint忽略的检查文件,可以在配置文件中添加ignorePatterns字段配置,或者创建一个单独的配置文件.eslintignore(推荐):

txt
node_modules
+.eslint*
+// etc..

environments、globals

environments、globals都是用来设置设置当前代码的语言环境和全局变量的,通过二者配置可以轻松使用环境中的语法和变量以及自定义全局变量

environments 设置代码的语言环境,可以设置一个或多个,支持的语言选择项有:browser、node、commonjs、es6等等,简单配置:

ts
module.exports = {
+  env: {
+    browser: true,
+    node: true,
+    es6: true
+  }
+}
+
+// 代码中可以使用browser、node、es6的语法及变量
+// window.innerWidth
+// process.env
+// Promise

globals 用来配置自定义的全局变量,告诉eslint会存在的全局变量有哪些,这样对于没有定义的全局变量就不会报错了:

ts
module.exports = {
+  globals: {
+  	__is_Dev__: "realonly",
+  	version: "writable"
+  }
+}
+// 定义了 __is_Dev__、version 两个全局变量,前者只读、后者可以修改
+if (__is_Dev__) console.log("dev");
+console.log(version);
+version = "change version";

parser、parserOptions

parser用于指定 ESLint 使用的解析器。解析器负责将代码转换成抽象语法树AST,以便 ESLint 可以对代码进行静态分析。默认情况eslint使用espree作为解析器,除此之外常用的解析器有以下几种:

  • Esprima:基于 JavaScript 的 ECMAScript 5.1 标准实现的解析器,很适合纯粹的 JavaScript 项目
  • @babel/eslint-parser:使 Babel 解析器与 ESLint 兼容的的包装器
  • @typescript-eslint/parser:将 TypeScript 转换为与 ESTree 兼容的形式的解析器,通常在ts项目中使用其作为解析器
ts
module.exports = {
+  parser: "@typescript-eslint/parser"
+}

parserOptions用于提供解析器的选项和配置信息,比如支持的js版本、jsx支持等等,为解析器服务

ts
module.exports = {
+  parserOptions: {
+  	"ecmaVersion": "latest", // js版本
+  	"sourceType": "module", // 代码形式 module | script
+  	// "allowReserved": true, // 允许使用保留字
+  	"ecmaFeatures": { // 特性
+  		"jsx": true,
+  		"globalReturn": true, // 全局return
+  		"impliedStrict": true // 严格模式
+  	}
+  }
+}

这块应该比较好理解的,大家根据自己的需求选择即可

rules、overrides

以上的属性如不作特殊定制可以不进行配置,rules是eslint的核心模块,用来配置代码校验的一套规则。eslint中内置了很多规则,可以根据自己需求进行配置,规则还可以包含针对该规则的额外配置选项

规则值

  • "off" 或 0 - 关闭规则
  • "warn" 或 1 - 启用并视作警告(不影响退出)。
  • "error" 或 2 - 启用并视作错误(触发时退出代码为 1)

除此之外还可以针对单个规则添加额外的配置

示例

ts
module.exports = {
+  rules: {
+  	'no-console': 'warn', // console警告
+  	"no-tabs": 0, // 关闭tabs 规则
+  	"max-len": ['error', { 'code': 80 }], // 每行最大长度,超过80报错
+  }
+}

上面展示了如何使用 '字符' 和 '数值' 作为值,并对 'max-len' 单个规则设置了选项

优先级

规则优先级 extends < rules < overrides < comments

overrides

知道了rules那么什么是overrides呢?rules是对设置的指定目标进行代码检查,如果对于特殊的目标文件不想使用rules的规则,那么就可以使用overrides进行规则覆盖

ts
module.exports = {
+  "rules": {
+    "quotes": ["error", "double"]
+  },
+  "overrides": [
+    {
+      "files": ["bin/*.js", "lib/*.js"],
+      "excludedFiles": "*.test.js",
+      "rules": {
+        "quotes": ["error", "single"]
+      }
+    }
+  ]
+}

上面列子展示了在bin、lib下除了*.test.js外只能使用单引号,覆盖掉全局的双引号规则

plugins、extends

前面知道eslint内置了很多规则和默认解析解析器,那么plugins就是来扩展除内置以外的其他规则,说白了就是让eslint有解析其他自定义规则的能力。注意引入plugin并不是引入了当前plugin中所有的规则,他只是扩展了eslint解析当前plugin中规则的能力,至于具体的规则还需要在rules中配置

ts
module.exports = {
+  plugins: ["react"], // 引入第三方插件,eslint-plugin-react简写
+  rules: {
+  	"react/jsx-boolean-value": 2 // 配置插件中的规则
+  }
+}

注意使用第三方插件需要先安装:

sh
 npm install eslint-plugin-react -D

插件名通常包含两种形式:

  • 非group类:如eslint-plugin-react
  • group类:@react/eslint-plugin-react

提示

使用插件时可以省略掉插件名的前的eslint-plugin-,如:eslint-plugin-react可以写成react,@react/eslint-plugin-react可以写成@react/react

对于插件的规则配置也是基于插件名的两种形式:

ts
// eslint-plugin-react => react/no-console
+// @react/eslint-plugin-react => @react/react/no-console
+module.exports = {
+  plugins: ["react", "@react/react"],
+  rules: {
+  	"react/no-console": "error",
+  	"@react/react/no-console": 1
+  }
+}

从plugin的使用中可以看到步骤繁琐,需要对plugin中规则一一写出很麻烦,因此引入了extends的概念,用来继承某些规则,如使用了plugin时,可以在extends中写入plugin的推荐配置,命名规则:plugin:包名/规则

ts
module.exports = {
+  plugins: ["react"],
+  extends: [
+    "eslint:recommended", // 继承官方推荐的
+    "plugin:react/recommended" // 继承react插件中推荐的规则集
+  ]
+}

除了可以扩展第三方插件的规则集,还可以使用本地的规则

ts
module.exports = {
+  extends: ["./somepath/.eslintrc-jsx"]
+}

对于这些工具,一般推荐使用官方维护的eslint插件和配置,然后在其基础上进行定制,这样可以减少繁琐的配置,避免浪费时间

编辑器集成

这里使用vscode进行eslint的集成,首先下载eslint插件

在vscode配置中加入以下配置(或者在设置面板中搜索eslint进行选择配置):

json
{
+  "editor.codeActionsOnSave": {
+    "source.fixAll.eslint": true,
+    // "source.fixAll": true
+  },
+  "eslint.codeActionsOnSave.mode": "problems",
+}

以上配置好了后重新vscode

规则集

TypeScript

eslint虽然可以帮助降低代码出错的风险,但仍无法更直接表达相关的类型约束,js是个弱类型语言没有相关的类型约束,对于约束性不强的开发者来说仍是个头疼的问题,久而久之可能就会变得难以维护

使用typescript可以增强类型提示提高开发效率降低协作成本,也方便后续的维护。关于typescript的使用可以查看我有关typescript的文章

`,70);function i(F,D,y,u,b,d){const a=n("Reward"),l=n("Gitalk");return t(),p("div",null,[c,s(a),s(l)])}const h=e(r,[["render",i]]);export{g as __pageData,h as default}; diff --git a/assets/frontend_project-integration_style.md.1DtJ1w1z.js b/assets/frontend_project-integration_style.md.1DtJ1w1z.js new file mode 100644 index 000000000..609618c1d --- /dev/null +++ b/assets/frontend_project-integration_style.md.1DtJ1w1z.js @@ -0,0 +1,135 @@ +import{_ as e,c as p,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"项目集成之风格指南","description":"代码风格统一对于团队的协作有很大的帮助,使用editorconfig、prettier、stylelint进行代码风格统一提高团队协作效率","frontmatter":{"title":"项目集成之风格指南","description":"代码风格统一对于团队的协作有很大的帮助,使用editorconfig、prettier、stylelint进行代码风格统一提高团队协作效率","keywords":"editorconfig使用,prettier配置,stylelint配置,代码风格,风格指南,样式规则","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/style.md","filePath":"frontend/project-integration/style.md","lastUpdated":1706247228000}'),r={name:"frontend/project-integration/style.md"},c=o(`

项目集成之风格指南

上一篇的语法规范中我们使用eslint和typescript来降低代码的错误几率,偏向程序的运行时错误,除此之外良好的代码风格会看起来整体划一,如同同一个人所写,对团队之间的协作也更有益。eslint其实也可以对风格进行限制,但我们更倾向于检查语法错误,对于风格问题可以使用其他专业工具

风格问题并不是属于错误❌,只是更好的提高团队协作效率而已,可有可无

Editorconfig

EditorConfig 是一个用于维护和定义跨不同编辑器和IDE的代码风格和格式的文件。它可以帮助团队成员在不同的编辑环境中保持一致的代码风格,减少不必要的代码格式差异和冲突

通常用来设置基本的规范如缩进形式(tab、space)、缩进大小、换行风格(lf、cr、crlf、unset)、行尾插入空格等,这样可以针对不同的编辑器和操作系统进行风格统一

首先在vscode中安装editorconfig插件:

项目中根路径下新建.editorconfig文件,并将以下配置写入:

toml
# 根文件
+root = true
+
+[*]                              # 针对所有文件
+charset = utf-8
+indent_style = space             # 使用空格缩进
+indent_size = 2                  # 缩进大小
+trim_trailing_whitespace = true  # 去掉尾部空格
+insert_final_newline = true      # 末尾插入新行
+end_of_line = lf                 # 换行符使用 lf
+
+[*.md]                           # 针对markdown文件
+trim_trailing_whitespace = false
+insert_final_newline = false

上面会对所有文件进行风格设置,然后针对markdown文件设置两个不一样的属性值,这样编辑器就会对不同的文件进行内容编写进行风格统一

editorconfig配置提示

Prettier

EditorConfig更注重于代码的基本格式,而对于更细致的代码样式调整则有限。而 Prettier 则是一个功能更强大的代码格式化工具,它可以自动处理代码的各种样式细节,包括缩进、空格、换行、引号、括号等;能够根据预定义的规则和配置,对代码进行自动格式化,使代码保持一致的风格。通常建议在项目中同时使用EditorConfig和Prettier,EditorConfig定义基本的代码风格规范,Prettier来自动格式化代码

配置插件

  1. 首先在vscode中搜索 'prettier - code formatter' 点击下载安装

  1. 添加prettier自动格式化配置,在vscode设置中写入以下配置:
json
{
+  "[javascript]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode",
+    "editor.formatOnSave": true,
+  },
+  "[typescript]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode",
+    "editor.formatOnSave": true,
+  },
+  "[json]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode",
+    "editor.formatOnSave": true,
+  },
+  "[scss]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode",
+    "editor.formatOnSave": true,
+  },
+  // 其他相关配置...
+}

上面针对js、ts、json、scss在保存时根据prettier规则进行格式化,你也可以继续添加你想要格式化的文件;这样编辑器的插件就配置好了

配置文件

prettier根据项目中的配置文件进行格式化,使用配置文件可以使配置和共享更加容易。prettier支持多种格式的配置文件,这里选择在项目根目录中新建文件prettier.config.js

js
module.exports = {
+  printWidth: 120,       // 每行最大长度
+  semi: true,            // 需要分号
+  singleQuote: false,    // 不适用单引号
+  endOfLine: "lf",       // 换行符 lf
+  trailingComma: "es5",  // 在多行对象和数组字面量中使用尾随逗号
+  requirePragma: false,  // 是否仅对文件开头有格式化注释的生效,默认为false,会对所有文件进行格式化
+  insertPragma: false,   // 是否对已经格式化的文件开头插入注释,默认false
+};

以上简单的配置了prettier常见的几个属性,你还可以添加其他更多配置,这样就可以对项目中的代码进行格式化了

示例

编写ts文件并将以下代码写入,保存文件即可对代码进行格式化:

ts
const name = 'Jack'
+const name = "Jack";// 单引号变双引号、添加分号
+const user = {
+	name: "Jack",
+	age: 20
+	age: 20,// 添加 行尾逗号
+}

集成eslint

上面配置好prettier后如果对于不规范的格式并不会触发错误提示,顾需结合eslint进行错误提示。prettier也提供了相关的eslint插件来结合eslint使用

  1. 安装相关依赖:
sh
npm install prettier eslint-plugin-prettier eslint-config-prettier -D
  1. eslint中添加prettier配置
ts
module.exports = {
+  extends: [
+  	"plugin:prettier/recommended"
+  ],
+  plugins: [
+  	"prettier"
+  ],
+  rules: {
+  	"prettier/prettier": "error"
+  }
+}
  1. 调整IDE关于prettier的配置
json
{
+  "editor.codeActionsOnSave": {
+    "source.fixAll.eslint": true,// 使用eslint修复所有错误
+  },
+  "[typescript]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode",
+    "editor.formatOnSave": true,
+  },
+}

到这里就已经完成了prettier和eslint的整合,现在可以在项目中尝试写入错误格式eslint便会进行识别报错,对于可修复的保存后也会自动修复

prettierignore

prettier默认会对项目中的所有文件进行格式化,如果文件太多便会造成编辑器卡顿现象,可以配置prettier忽略的文件,减少格式化返回

新建.prettierignore文件,写入不想要文件或路径,支持 glob 规则匹配,可以当做gitignore使用:

txt
dist
+node_modules
+coverage
+.vscode
+*/**/*.test.js
+*/**/*.test.ts

StyleLint

stylelint 是一个用于检查和强化 CSS 代码风格和一致性的工具。它可以帮助开发人员在编写 CSS 代码时遵循一致的规范和最佳实践,从而提高代码质量、可读性和可维护性

具体来说,stylelint 可以执行以下任务:

  • 静态分析:检查 CSS 代码的语法和结构,捕获常见的错误和警告
  • 格式化:根据预定义的风格规则自动格式化 CSS 代码,使其保持一致的缩进、换行和空格
  • 规则校验:应用各种规则和约定,例如选择器命名、属性顺序、颜色格式、单位使用等,确保代码符合统一的风格和标准

stylelint类似于eslint其核心也包括插件、扩展、规则配置等,所以如果你对eslint已经熟练了,那么stylelint也没什么难度,接下来就讲讲基本使用

插件安装、配置

  1. vscode中搜索 'stylelint' 安装插件

  2. 配置stylelint将以下配置写入vscode的配置文件中,最后点击保存重启IDE

json
{
+  "editor.codeActionsOnSave": {
+    "source.fixAll.stylelint": true,
+  },
+  "stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],// 配置检查的文件
+}

项目安装

  1. 安装stylelint
sh
 npn install stylelint -D
  1. 创建配置文件,stylelint同样支持 多种格式 的配置,这里创建.stylelintrc.js
js
module.exports = {
+  plugins: [],
+  extends: [],
+  rules: [],
+}

plugins

plugin让stylelint拥有处理其他自定义规则的能力,如:stylelint-prettier 让其拥有prettier的规则

ts
module.exports = {
+  plugins: ["stylelint-prettier"],
+  rules: {
+  	"prettier/prettier": true,
+  }
+}

这样对于prettier设置的格式化规则对stylelint也会生效

extends

extends用来继承其他的规则,可以使用官方或者第三方直接配置好的规则,这样降低配置复杂性:

ts
module.exports = {
+  // standard 规则
+  "stylelint-config-standard",
+  // 属性顺序规则
+  'stylelint-config-recess-order',
+  // vue规则
+  "stylelint-config-recommended-vue",
+  "stylelint-config-standard-less",
+  // Prettier规则
+  "stylelint-prettier/recommended",
+}

使用这些规则同样需要先安装:

sh
 npm install stylelint-config-standard stylelint-config-recess-order stylelint-config-recommended-vue stylelint-config-standard-less -D

rules、overrides

rules、overrides用来配置具体的样式规则,其和eslint配置用法一致:

ts
module.exports = {
+  rules: {
+  	"prettier/prettier": true, // prettier插件设置
+  	"function-url-quotes": "always", // 内置的规则
+  },
+  overrides: [
+    {
+      "files": ["**/*.less"],
+      "customSyntax": "postcss-less" // less文件使用postcss-less解析语法
+    }
+  ],
+}

更多规则点击查看官方配置

stylelintignore

通过设置stylelintignore忽略不需要进行样式检查的文件,创建.stylelintignore文件,写入不需要格式化的文件或路径,同样支持glob语法:

txt
.DS_Store
+node_modules
+dist
+build
+*.ts
+*.woff
+*.mp3
+*.mp4
+*.jpg

脚本

eslint除了使用编辑器自动修复和格式化外,还可以使用脚本进行格式化

sh
 npx stylelint "**/*.{less,vue,tsx} --fix"

或者在package.json中定制脚本:

json
{
+  "scripts": {
+  	"lint:style": "stylelint 'src/**/*.{less,vue,tsx}' --fix"
+  }
+}

CSS BEM命名约定

BEM代表 块(block),元素(element),修饰符(modifier) 在选择器中,由以下三种符号来表示扩展的关系:

sh
-   中划线 :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。
+__  双下划线:双下划线用来连接块和块的子元素
+_   单下划线:单下划线用来描述一个块或者块的子元素的一种状态

比如定义一个button:

less
.button {
+  border-radius: 4px;
+  width: 100px;
+  height: 40px;
+
+  // 描述button的不同状态
+  &_danger {
+  	background: red;
+  }
+  &_success {
+  	background: green;
+  }
+
+  // 描述子元素
+  &__icon {
+  	...
+  }
+}

更多有关BEM的规则可以参考以下文档:

`,82);function i(F,D,y,u,d,b){const a=n("Reward"),l=n("Gitalk");return t(),p("div",null,[c,s(a),s(l)])}const g=e(r,[["render",i]]);export{h as __pageData,g as default}; diff --git a/assets/frontend_project-integration_style.md.1DtJ1w1z.lean.js b/assets/frontend_project-integration_style.md.1DtJ1w1z.lean.js new file mode 100644 index 000000000..76dc496cb --- /dev/null +++ b/assets/frontend_project-integration_style.md.1DtJ1w1z.lean.js @@ -0,0 +1 @@ +import{_ as e,c as p,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"项目集成之风格指南","description":"代码风格统一对于团队的协作有很大的帮助,使用editorconfig、prettier、stylelint进行代码风格统一提高团队协作效率","frontmatter":{"title":"项目集成之风格指南","description":"代码风格统一对于团队的协作有很大的帮助,使用editorconfig、prettier、stylelint进行代码风格统一提高团队协作效率","keywords":"editorconfig使用,prettier配置,stylelint配置,代码风格,风格指南,样式规则","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/style.md","filePath":"frontend/project-integration/style.md","lastUpdated":1706247228000}'),r={name:"frontend/project-integration/style.md"},c=o("",82);function i(F,D,y,u,d,b){const a=n("Reward"),l=n("Gitalk");return t(),p("div",null,[c,s(a),s(l)])}const g=e(r,[["render",i]]);export{h as __pageData,g as default}; diff --git a/assets/frontend_project-integration_test-framework.md.jZ4aPEv-.js b/assets/frontend_project-integration_test-framework.md.jZ4aPEv-.js new file mode 100644 index 000000000..94b6be499 --- /dev/null +++ b/assets/frontend_project-integration_test-framework.md.jZ4aPEv-.js @@ -0,0 +1,402 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"前端自动化测试","description":"前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序,本文来看看Jest和Cypress的使用","frontmatter":{"title":"前端自动化测试","description":"前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序,本文来看看Jest和Cypress的使用","keywords":"测试,jest,单元测试,端到端测试,unit test,end-to-end test,自动化测试,组件测试,vue测试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/test-framework.md","filePath":"frontend/project-integration/test-framework.md","lastUpdated":1706247228000}'),r={name:"frontend/project-integration/test-framework.md"},c=o(`

前端自动化测试

前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序

单元测试(Unit Testing)和端到端测试(End-to-End Testing)是两种常见的测试方法,它们在测试的范围、目的和执行方式上有所不同。单元测试和端到端测试不是相互排斥的,而是互补的。它们在不同的层面和阶段提供了不同的价值,共同构成了一个全面的测试策略

单测和端测区别

单元测试(Unit)

  • 单元测试关注于最小的可测试单元,如函数、方法或模块
  • 目的是验证代码中的每个独立单元(如函数)是否按照预期工作
  • 通常是自动化的、快速执行的,且不依赖于外部资源或其他模块
  • 验证单个代码单元的行为,提供快速反馈,并帮助捕获和修复问题

端到端测试(End-to-End)

  • 从用户角度出发,测试整个应用程序的功能和流程
  • 模拟真实的用户交互和场景,从应用程序的外部进行测试。跨多个模块、组件和服务进行,以确保整个应用程序的各个部分正常协同工作
  • 涉及用户界面(UI)交互、网络请求、数据库操作等,以验证整个应用程序的功能和可用性

总之,单元测试主要关注代码内部的正确性,而端到端测试关注整体功能和用户体验。结合使用这两种测试方法可以提高软件的质量和可靠性。在项目中尤其是公共依赖如组件库至少都需要单测,端测相对来说比较繁琐点,但是也是程序稳定的重要验证渠道

单元测试 - Jest

这里使用Jest作为单元测试工具,Jest 是一个用于 JavaScript 应用程序的开源测试框架。它是由 Facebook 开发和维护的,通常用于单元测试。Jest 具有简单易用的 API、丰富的功能和强大的断言库,广泛应用于前端开发和 Node.js 环境中

安装

sh
 npm install jest -D

初始化

使用npx进行交互式生成默认的配置文件,它会提示你每步的选择:

sh
 npx jest --init
+The following questions will help Jest to create a suitable configuration for your project
+
+ Would you like to use Jest when running "test" script in "package.json"? … yes
+ Would you like to use Typescript for the configuration file? … no
+ Choose the test environment that will be used for testing › jsdom (browser-like)
+ Do you want Jest to add coverage reports? … yes
+ Which provider should be used to instrument code for coverage? › v8
+ Automatically clear mock calls, instances, contexts and results before every test? … yes
+
+✏️  Modified test/package.json
+
+📝  Configuration file created at test/jest.config.js

默认配置文件大概是下面的内容:配置中有很多注释提供我们参考,对于默认的配置就不用删除多语的注释了,方便参考。通常都是对需要的配置项做修改即可

ts
const config = {
+  // All imported modules in your tests should be mocked automatically
+  // automock: false,
+
+  // Automatically clear mock calls, instances, contexts and results before every test
+  clearMocks: true,
+
+  // Indicates whether the coverage information should be collected while executing the test
+  collectCoverage: true,
+
+  // An array of glob patterns indicating a set of files for which coverage information should be collected
+  // collectCoverageFrom: undefined,
+
+  // The directory where Jest should output its coverage files
+  coverageDirectory: "coverage",
+
+  // An array of regexp pattern strings used to skip coverage collection
+  // coveragePathIgnorePatterns: [
+  //   "/node_modules/"
+  // ],
+
+  // Indicates which provider should be used to instrument code for coverage
+  coverageProvider: "v8",
+  // Make calling deprecated APIs throw helpful error messages
+  // errorOnDeprecated: false,
+
+  // A list of paths to directories that Jest should use to search for files in
+  // roots: [
+  //   "<rootDir>"
+  // ],
+
+  // The test environment that will be used for testing
+  testEnvironment: "jsdom",
+  // 省略其他...
+};
+
+module.exports = config;

常用的配置:

  • collectCoverage:boolean值,用来生成覆盖率报告,通常也可以使用命令行--coverage参数生成

  • moduleFileExtensions:对于引入文件可以省去文件后缀,jest会根据规则一一匹配

  • moduleNameMapper:模块匹配规则,告诉jest改模块的匹配路径

    json
    {
    +  moduleNameMapper: {
    +    // 当匹配到 .css 等结尾的文件时对应 /__mocks__/style-mock.ts 文件
    +    "\\\\.(css|less|scss|sass)$": "<rootDir>/__mocks__/style-mock.ts",
    +    // 当匹配 @ui 开头的的对应到 src 文件夹
    +    "@ui/(.*)": "<rootDir>/src/$1",
    +  },
    +}
  • setupFiles:在测试环境准备后和安装jest框架前做一些配置,常用来添加一些全局环境模拟数据

  • setupFilesAfterEnv:在安装jest框架后对jest做一些扩展,相比setupFiles更加通用

  • testEnvironment:jest模拟的环境,可以选择node、jsdom来模拟node和浏览器环境

  • testMatch:指定要测试哪些文件

  • transform:使用一些插件对代码进行转义以便jest可以理解,如设置tsx转义

以上是最基本的配置,jest的配置还是很多的,还要官方有列举了一个表可以随时翻阅不用死记

转译器

Jest中有转义器的概念来帮助它理解编写的代码,可以比做babel对代码做一些转换来兼容浏览器,差不多一样的道理

  1. 模块引用转换

    在单个测试文件中都会引入我们编写的代码,然后对此代码的功能进行测试,而前端通常都是以esmodule的形式进行函数的导出,jest默认使用的是commonjs,对于module语法jest不认识就会报错

    ts
    import { sum } from "../core"; // 报错
    +
    +describe("第一个测试", () => {
    +	// ...
    +})

    那么可以对jest添加转义器将esmodule模块的代码转换成commonjs就可以了。打开配置文件:

    json
    // jest.config.js
    +{
    +  transform: {
    +    "^.+\\\\.(ts|tsx|js|jsx)$": [
    +      "babel-jest",
    +      {
    +        presets: [["@babel/preset-env", { targets: { node: "current" } }]]
    +      },
    +    ],
    +  },
    +}

    上面使用了 babel-jest@babel/preset-env的依赖包需要安装下:

    sh
     npm i babel-jest @babel/preset-env -D

    这样就可以解决esmodule语法不识别的问题

  2. 转换typescript:目前项目中的文件都是以ts编写的,而默认情况下jest只识别js文件的,那么就需要对ts进行转译让jest识别

    json
    // jest.config.js
    +{
    +  transform: {
    +    "^.+\\\\.(ts|tsx|js|jsx)$": [
    +      "babel-jest",
    +      {
    +        presets: [/* 其它... */["@babel/preset-typescript"]]
    +      },
    +    ],
    +  },
    +}

    需要安装对应的@babel/preset-typescript;除了使用ts转义器也可以使用ts-jest直接运行ts代码

    得益于ts的转译插件可以让jest的测试文件(或配置文件)都写成ts类型的,而在ts文件中对于不识别的jest工具会报错或者没有提示,安装jest的类型文件包@types/jest来告诉ts对应的jest类型,然后进行配置:

    json
    // tsconfig.json
    +{
    +  "types": ["jest"]
    +}
  3. 转换jsx:假如项目中使用了jsx那么也要对jsx进行转义,这里以vue jsx为例

    json
    // jest.config.ts
    +{
    +  transform: {
    +    "^.+\\\\.(ts|tsx|js|jsx)$": [
    +      "babel-jest",
    +      {
    +        // 省略其他
    +        plugins: ["@vue/babel-plugin-jsx"],
    +      },
    +    ],
    +  },
    +}

基本断言

基本环境配置好后,就到了测试的时间了,我们先来最简单的配置用起

ts
// __tests__/demo.spec.ts
+import { sum } from "src/utils";
+
+describe("第一个测试", () => {
+  it("分组1", () => {
+    expect(sum(1, 2)).toBe(3);
+  });
+});
+
+// 或者不用分组
+test("第一个测试", () => {
+  expect(sum(1, 2)).toBe(3);
+});

这里介绍下几个关键字基本概念:

  • describe:用来描述当前测试的整体内容
  • it:用来分组测试
  • test:用来描述当前测试,无分组
  • expect:判断参数的值,其的返回值有多个断言方法,上面使用了toBe也就是等于的意思。除了次此断言有很多断言的条件,你可以点击这里阅读官方文档

执行测试

sh
# 现在package中配置 jest 脚本,然后执行测试
+ npm run test # npx jest
+ PASS  __tests__/demo.spec.ts
+  第一个测试
+ 分组1 (2 ms)
+
+----------|---------|----------|---------|---------|-------------------
+File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
+----------|---------|----------|---------|---------|-------------------
+All files |     100 |      100 |     100 |     100 |                   
+ utils.ts |     100 |      100 |     100 |     100 |                   
+----------|---------|----------|---------|---------|-------------------
+Test Suites: 1 passed, 1 total
+Tests:       1 passed, 1 total
+Snapshots:   0 total
+Time:        0.519 s
+Ran all test suites.
+  Done in 1.02s.

可以看到对应的测试文件、分组以及测试覆盖率

路径映射

上面在测试代码时会先引入对应的工具代码,如果都使用相对路径引入会显得很麻烦。在项目中通常都喜欢使用@这种方式引入文件,在测试环境依然可以使用,这样也可以和项目中的文件路径保持一致

配置路径映射需要满足两个条件:

  1. jest识别路径映射
  2. ts识别路径映射(如果项目中用了ts)

配置jest路径映射

ts
// jest.config.ts
+{
+  moduleNameMapper: {
+    "@/(.*)": "<rootDir>/src/$1",
+  },
+}

配置tsconfig

json
// tsconfig.json
+{
+  "paths": {
+    "@/*": ["src/*"]
+   }
+}

这样在测试文件中就可以使用路径映射降低心智负担

ts
// __tests__/demo.spec.ts
+import { sum } from "@/utils";

除了手动设置外还可以将tsconfig中的path直接作为路径映射,这样就减少了多处的修改。实现这一功能需要借助ts-jest工具包,不同这个自己也可以写个逻辑实现

js
// jest.config.ts
+const { pathsToModuleNameMapper } = require('ts-jest/utils')
+const { compilerOptions } = require('./tsconfig')
+
+export default {
+  moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, {
+    prefix: "<rootDir>/",
+  }),
+}

dom测试

jest支持浏览器环境,使用浏览器环境时需要安装对应的包,请根据版本可以选择jsdomjest-environment-jsdom包进行安装,这里jest版本为28+使用后者。测试文件修改如下:

ts
// __tests__/demo.spec.ts
+describe("第一个测试", () => {
+  it("分组1", () => {
+    // 使用 localStorage API
+    localStorage.setItem('a', '1');
+    expect(localStorage.getItem(('a'))).toBe('1')
+  });
+});

运行测试用例:

sh
 npm run test
+PASS  __tests__/demo.spec.ts
+  第一个测试
+ 分组1 (2 ms)
+
+----------|---------|----------|---------|---------|-------------------
+File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
+----------|---------|----------|---------|---------|-------------------
+All files |       0 |        0 |       0 |       0 |                   
+----------|---------|----------|---------|---------|-------------------
+Test Suites: 1 passed, 1 total
+Tests:       1 passed, 1 total
+Snapshots:   0 total
+Time:        0.701 s, estimated 1 s
+Ran all test suites.
+  Done in 1.13s.

异步测试

jest可以使用多种方式进行异步代码测试,通常使用promise、async就可以了

  1. 使用promise
  2. async/await
  3. 回调

这里模拟一个异步方法,通过上面的三种方式进行测试

ts
// src/utils
+export function getUser(name: string) {
+  return new Promise((resolve) => {
+    setTimeout(() => resolve(name), 1000);
+  });
+}

使用Promise

ts
// __tests__/demo.spec.ts
+import { getUser } from "@/utils";
+
+describe("测试异步代码", () => {
+  it("promise调用方式测试", () => {
+    const user = "小明";
+    // 使用then
+    getUser(user).then((res) => {
+      expect(res).toBe(user);
+    });
+  });
+
+
+  it("使用resolves测试promise", () => {
+    const user = "小李";
+    // 使用 .resolves 方式,注意这里要 return
+    return expect(getUser(user)).resolves.toBe(user);
+  })
+});

使用async测试

ts
// __tests__/demo.spec.ts
+import { getUser } from "@/utils";
+
+describe("测试异步代码", () => {
+  it("使用async测试", async () => {
+    const user = "小明";
+    const res = await getUser(user)
+    expect(res).toBe(user);
+  })
+});

使用回调函数

回调函数默认通常是以前那种回调写法,这里需要对以上的异步函数进行调整,让其换成回调函数模式

ts
// 接受一个cb,这里固定返回的值为true,没有错误
+export function getUser(cb: (error: any, data: any) => void) {
+  setTimeout(() => {
+    cb(null, true);
+  }, 500);
+}
+
+// 定义测试
+describe("测试异步代码", () => {
+  it("使用回调函数", (done) => {
+    function cb(error: any, data: any) {
+      if (error) {
+        done(error);
+        return;
+      }
+      try {
+        expect(data).toBe(true);
+        done();
+      } catch (err) {
+        done(err); // 这里一定要使用try catch,防止出错时没有执行done
+      }
+    }
+    getUser(cb);
+  });
+});

回调模式一定要执行done函数,如果没有执行则会被认为超时错误

模拟函数

假设要模拟一个工具函数的内部实现,可以使用mock函数来判断函数内部的值是否达到预期

定义个待测试的函数forEach

ts
export function forEach(items: number[], callback: (num: number) => void) {
+  for (let index = 0; index < items.length; index++) {
+    callback(items[index]);
+  }
+}

添加测试用例:

ts
// __tests__/demo.spec.ts
+import { forEach } from "@/utils";
+
+// 模拟函数
+const mockFn = jest.fn((x: number) => x + 1);
+
+test("模拟函数", () => {
+  forEach([0, 1], mockFn);
+
+  expect(mockFn.mock.calls).toHaveLength(2);
+  expect(mockFn.mock.calls[0][0]).toBe(0);
+  expect(mockFn.mock.calls[1][0]).toBe(1);
+  expect(mockFn.mock.results[0].value).toBe(1);
+});

更多关于模拟函数的例子请查看文档API

定时器

Jest可以通过一个函数转换计时器以便允许你控制时间流量

假设测试如下定时器代码:

ts
export function useTimer(cb?: Function) {
+  setTimeout(() => cb && cb(), 1000);
+}

编写测试用例:

ts
import { useTimer } from "@/utils";
+
+jest.useFakeTimers();
+jest.spyOn(global, "setTimeout");
+
+test("test timer", () => {
+  const cb = jest.fn();
+  useTimer(cb);
+
+  expect(cb).not.toBeCalled();
+  
+  // 执行所有的定时器
+  jest.runAllTimers();
+
+  expect(cb).toBeCalled();
+});

更多见官方文档

setup配置

写测试的时候你经常需要在运行测试前做一些准备工作,和在运行测试后进行一些收尾工作。 Jest 提供辅助函数来处理这个问题

这其中包括beforeEach、afterEach、beforeAll、afterAll,其中前两者在每个测试前都会执行一次,后者在文件中只会执行一次

覆盖率

除了对程序进行断言外,jest还收集代码的测试覆盖率并生成对应的报告,包括:某个函数内部的测试覆盖率、整个文件的覆盖率,要想达到覆盖率100%,就要测试到每个文件的所有代码、每个函数内部的所有分支条件

开启覆盖率

可以通过配置文件

ts
// jest.config.ts
+// 主要涉及到这两个配置
+export default {
+  collectCoverage: true, // 启用
+  coverageDirectory: "coverage", // 报告生成位置
+}

通过cli,执行脚本时带上参数

sh
 npx jest --coverage

测试覆盖率

假设我们有这么一个函数

ts
export function whatType(arg: any) {
+  const type = Object.prototype.toString.call(arg)
+  if (type === '[object String]') {
+    return 'string';
+  } else if (type === '[object Boolean]') {
+    return 'boolean';
+  }
+}

添加测试用例

ts
import { whatType } from "@/utils";
+
+describe("测试覆盖率", () => {
+  it("函数条件覆盖率", () => {
+    expect(whatType(true)).toBe("boolean");
+  });
+});

执行测试用例

sh
 npm run test
+ PASS  __tests__/demo.spec.ts
+  测试覆盖率
+ 函数条件覆盖率 (1 ms)
+
+----------|---------|----------|---------|---------|-------------------
+File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
+----------|---------|----------|---------|---------|-------------------
+All files |   96.77 |       50 |     100 |   96.77 |                   
+ index.ts |   96.77 |       50 |     100 |   96.77 | 4                 
+----------|---------|----------|---------|---------|-------------------
+Test Suites: 1 passed, 1 total
+Tests:       1 passed, 1 total
+Snapshots:   0 total
+Time:        0.486 s, estimated 1 s
  • File:测试的文件
  • Stmts:测试中被执行的代码语句的比例
  • Branch:测试代码条件分支比例
  • Funcs:测试中被执行函数比例
  • Lines:测试中被执行代码行数比例
  • Uncovered Line:没有测试到的行数

除了查看终端的表格外,还可以使用更直观的报告,文件报告的结构大概如下:

sh
coverage
+├── clover.xml # xml格式
+├── coverage-final.json # json格式
+├── lcov-report # html格式
+   ├── base.css
+   ├── block-navigation.js
+   ├── favicon.png
+   ├── index.html # 主页面入口
+   ├── index.ts.html
+   ├── other.ts.html
+   ├── prettify.css
+   ├── prettify.js
+   ├── sort-arrow-sprite.png
+   └── sorter.js
+└── lcov.info

一般都来查看HTML报告,打开报告页面

可以点击对应的文件查看更详细的报告

Vue组件测试

jest也可以对vue组件进行测试,vue官方提供了 vue2版本工具包(vue-test)vue3版本工具包(@vue/test-utils),这里基于vue3组件进行测试

安装对应的依赖:

sh
 npm install @vue/test-utils -D

对于Jestv28+以上版本还需要添加以下配置:

ts
// jest.config.ts
+export default {
+  testEnvironmentOptions: {
+    customExportConditions: ["node", "node-addons"],
+  },
+}

创建一个简单的Button组件:

tsx
import { defineComponent } from "vue";
+
+export default defineComponent({
+  render(){
+    return <button>按钮</button>
+  }
+})

添加测试用例:

ts
import { mount } from "@vue/test-utils";
+import Button from "@/components/Button";
+
+test("测试vue组件", () => {
+  const wrapper = mount({
+    setup() {
+      return () => {
+        return <Button />;
+      };
+    },
+  });
+  expect(wrapper.text()).toBe('按钮')
+})

运行测试

sh
 npm run test
+ PASS  __tests__/demo.spec.tsx
+ 测试vue组件 (9 ms)
+
+------------|---------|----------|---------|---------|-------------------
+File        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
+------------|---------|----------|---------|---------|-------------------
+All files   |     100 |      100 |     100 |     100 |                   
+ Button.tsx |     100 |      100 |     100 |     100 |                   
+------------|---------|----------|---------|---------|-------------------
+Test Suites: 1 passed, 1 total
+Tests:       1 passed, 1 total
+Snapshots:   0 total
+Time:        0.633 s

添加全局组件,当单测某个组件时,组件内部引用的其它组件会因为没有引用而报错,定义全局组件可以解决这个问题

ts
// jest.setup.ts
+import { config } from "@vue/test-utils";
+import Button from "@/button/src/button";
+import Icon from "@/button/src/icon";
+
+config.global.components = {
+  Button,
+  Icon,
+};

配置jest

ts
// jest.config.ts
+export default {
+  setupFiles: ["<rootDir>/jest.setup.ts"],
+}

这里不对vue工具包API过多的解释,更多的API使用可以查看官方文档,vue2版本的可以查看这里

端到端测试 - Cypress

这里选择Cypress作为端测框架,Cypress 是一个用于前端端到端(End-to-End,E2E)测试的开源测试框架。它被设计用于对 Web 应用程序进行自动化测试,可以模拟用户与应用程序进行交互的行为,并验证应用程序的功能和用户体验

安装使用

你可以选择自己的npm包管理器进行安装

sh
 npm install cypress -D

配置npm脚本打开cypress

json
{
+	"scripts": {
+		"test:e2e": "cypress open"
+	}
+}

或者直接使用./node_modules/.bin/cypress open。启动后出弹出cypress的界面,可以进行端到端测试和组件测试。从下图界面可以看出不管是端测还是组件测试都没有配置(Not Configured),这里我们选择第一个端到端测试:

进去后由于是初次使用cypress会引导对项目做初始化配置,点击Continue会在项目中生成对应的文件:

端到端测试cypress会检测本地计算机安装的浏览器,你可以选择要用哪个浏览器进行测试,或者使用electron。这里我选择使用electron

进来后就到了测试用例界面,初次下载不会有任何测试用例的。界面会引导你去创建第一个测试用例,左侧用来生成官方的测试例子,其可以作为用例的参考;右侧自己来创建测试用例,初次使用我们先点击生成官方例子:

下图便是官方的测试例子,可以看到有很多,对应的文件路径在cypress/e2e

这些单测例子中随便点击一个就会测试对应的用例,这里我们点击todo.cy.js就可以开始测试了

可以看到测试界面主要包含两大板块,左侧主要是测试日志、统计、快照之类,右侧便是web界面。cypress会根据测试用例模拟用户行为,并生成对应的日志;web界面会显示每个步骤的形态,就好像是用户在操作一样

动图演示

除了使用open打开对应的界面外,也可以使用终端进行测试不用打开界面,只需要执行cypress run命令即可

配置

cypress配置包括全局、端测、组件测试几个方面,可以通过cypress.config.js配置文件进行配置:

js
const { resolve } = require("path");
+const { defineConfig } = require("cypress");
+
+module.exports = defineConfig({
+  // 端测配置
+  e2e: {},
+  // 组件测试配置
+  component: {},
+  /* 其他的全局配置 */
+});

以下是一些常见的配置:

  • baseUrl:端测访问的基本地址,比如测试本地的web服务http://localhost:8080,这样在测试用例中就可以使用相对路径了
  • specPattern:测试用例文件,包含单测和组件测试,支持glob形式。这样就可以自定义测试用例的位置了
  • fixturesFolder:用来存放测试mock数据,默认读取根路径下的cypress/fixtures路径下的文件,你可以通过此属性修改对应的测试数据路径
  • supportFile:自定义全局配置、功能函数、自定义命令、环境变量等等,在每个测试文件执行前都会先加载执行全局的配置文件。默认的路径为cypress/support/**,可以自行修改,如果没有全局的配置请设置成false
  • experimentalRunAllSpecs:值为true时测试界面会有一个测试全部用例的按钮,默认会false
  • video:当执行cypress run进行测试后生成对应的视频文件,设置成false不会生成
  • screenshotsFolder:快照保存路径,默认路径cypress/screenshots
  • videosFolder:视频保存路径,默认路径cypress/videos
  • screenshotOnRunFailure:当cypress run失败时生成对应的快照
  • downloadsFolder:当测试用例中下载文件时保存的路径
  • viewportWidth / viewportHeight:设置界面视口大小,可以模拟不同尺寸的屏幕

有的配置对于 e2e和Component 都有,可以在全局配置,也可以在不同类型的测试中进行覆盖,基本配置就说这么多,更多配置参考👉 官方文档

大概的配置结构如下:

sh
<root>
+├── cypress.config.js # 配置文件
+├── cypress
+ 	├── fixtures # 测试数据
+   │ 	└── user.json
+ 	└── supports # 全局配置
+     	└── index.js

基本端测

这里我们尝试使用端测来测试Vue3的组件,端测我们要提供页面真实的模拟用户的交互等等,所以需要一个web服务应用,内部使用我们待测试的vue组件,然后模拟用户行为

  1. 搭建web服务,假设这里使用vite搭建一个web应用
  2. 配置cypress的单测baseUrl,这样在用例中就可以使用相对地址了
    ts
    module.exports = defineConfig({
    +  e2e: {
    +    baseUrl: "http://localhost:10020", // 配置web基本地址
    +    video: false, # 不生成视频
    +    screenshotOnRunFailure: false, # 不生成快照
    +    supportFile: false, # 不设置全局配置
    +    specPattern: "src/**/*.e2e.(tsx|ts)", # 设置端测用例的位置
    +  },
    +});
  3. 新建button组件的测试用例:
    ts
    // src/button/__tests__/button.e2e.tsx
    +/// <reference types="cypress" />
    +describe("首页测试", () => {
    +  it("测试外观", () => {
    +    cy.visit("/button");
    +    cy.get(".i-btn").contains("按钮").trigger("click");
    +  });
    +});
  4. 启动测试:npm run test:e2e
  5. 可以看到我们的界面已经有了刚刚新建的测试用例文件了

  1. 点击测试用例开始测试:

动图演示

因为比较简单执行的比较快。左侧的测试日志鼠标移到对应的位置会显示对应的快照

以上便是一个最简单上手的端测用例,比较简单相应你已经也成功了。其他更多的测试用例api这里不做过多介绍,其实和jest差不多,你可以通过 官方文档 了解更多

代码覆盖率

cypress也支持代码覆盖率的报告,通过安装对应的插件就可以轻松搞定

sh
 npm i @cypress/code-coverage babel-plugin-istanbul -D

添加babel配置

json
// .babelrc
+{
+  "plugins": ["istanbul"]
+}

添加全局功能配置:

ts
// cypress/support/index.js
+import '@cypress/code-coverage/support';

对cypress进行配置:

ts
// cypress.config.ts
+const { resolve } = require("path");
+const { defineConfig } = require("cypress");
+
+module.exports = defineConfig({
+  e2e: {
+    setupNodeEvents(on, config) {
+      require('@cypress/code-coverage/task')(on, config);
+      on('file:preprocessor', require('@cypress/code-coverage/use-babelrc'));
+
+      return config;
+    },
+    supportFile: "cypress/supports/index.js",
+  },
+});

更多请参考对应的👉 官方文档

钩子函数

在 Cypress 测试框架中,有一些钩子函数可以用于在测试执行的不同阶段执行额外的操作或设置。这些钩子函数是 Cypress 提供的全局函数,可以在测试文件中使用

  • before: 函数在每个测试套件(describe 块)运行之前执行,并且只会执行一次。它可以用于设置测试套件级别的准备工作,例如初始化测试数据、登录用户等
  • after: 函数在每个测试套件(describe 块)运行完毕之后执行,并且只会执行一次。它可以用于清理测试套件级别的资源,例如清除测试数据、退出登录等
  • beforeEach: 函数在每个测试用例(it 块)运行之前执行。它通常用于设置每个测试用例的前置条件,例如重置状态、模拟请求等
  • afterEach: 函数在每个测试用例(it 块)运行完毕之后执行。它通常用于清理每个测试用例的后续操作,例如清除临时数据、还原状态等

常见问题

项目中可能会使用Jest进行单元测试、cypress进行端到端测试,由于jest和cypress有着形同的api,如:describe、it等等,会出现类型冲突的错误。这里我是在tsconfig中屏蔽掉cypress测试文件就可以了

json
{
+  "compilerOptions": {},
+  "exclude": ["src/**/*.e2e.tsx"] // 屏蔽掉cypress测试用例
+}

参考文档

`,175);function F(i,y,D,b,u,m){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[c,s(a),s(l)])}const C=p(r,[["render",F]]);export{B as __pageData,C as default}; diff --git a/assets/frontend_project-integration_test-framework.md.jZ4aPEv-.lean.js b/assets/frontend_project-integration_test-framework.md.jZ4aPEv-.lean.js new file mode 100644 index 000000000..e75af3bc3 --- /dev/null +++ b/assets/frontend_project-integration_test-framework.md.jZ4aPEv-.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"前端自动化测试","description":"前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序,本文来看看Jest和Cypress的使用","frontmatter":{"title":"前端自动化测试","description":"前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序,本文来看看Jest和Cypress的使用","keywords":"测试,jest,单元测试,端到端测试,unit test,end-to-end test,自动化测试,组件测试,vue测试","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-project-integration.png"},"headers":[],"relativePath":"frontend/project-integration/test-framework.md","filePath":"frontend/project-integration/test-framework.md","lastUpdated":1706247228000}'),r={name:"frontend/project-integration/test-framework.md"},c=o("",175);function F(i,y,D,b,u,m){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[c,s(a),s(l)])}const C=p(r,[["render",F]]);export{B as __pageData,C as default}; diff --git a/assets/frontend_react_index.md.vKjsadpH.js b/assets/frontend_react_index.md.vKjsadpH.js new file mode 100644 index 000000000..c2d51a573 --- /dev/null +++ b/assets/frontend_react_index.md.vKjsadpH.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"react","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/react/index.md","filePath":"frontend/react/index.md","lastUpdated":1706247228000}'),c={name:"frontend/react/index.md"},o=e("h1",{id:"react",tabindex:"-1"},[n("react "),e("a",{class:"header-anchor",href:"#react","aria-label":'Permalink to "react"'},"​")],-1),d=[o];function s(i,_,l,f,p,m){return r(),a("div",null,d)}const u=t(c,[["render",s]]);export{x as __pageData,u as default}; diff --git a/assets/frontend_react_index.md.vKjsadpH.lean.js b/assets/frontend_react_index.md.vKjsadpH.lean.js new file mode 100644 index 000000000..c2d51a573 --- /dev/null +++ b/assets/frontend_react_index.md.vKjsadpH.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"react","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/react/index.md","filePath":"frontend/react/index.md","lastUpdated":1706247228000}'),c={name:"frontend/react/index.md"},o=e("h1",{id:"react",tabindex:"-1"},[n("react "),e("a",{class:"header-anchor",href:"#react","aria-label":'Permalink to "react"'},"​")],-1),d=[o];function s(i,_,l,f,p,m){return r(),a("div",null,d)}const u=t(c,[["render",s]]);export{x as __pageData,u as default}; diff --git a/assets/frontend_regexp_base.md.QEvSpxyK.js b/assets/frontend_regexp_base.md.QEvSpxyK.js new file mode 100644 index 000000000..4fa3a863d --- /dev/null +++ b/assets/frontend_regexp_base.md.QEvSpxyK.js @@ -0,0 +1,167 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as a}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"正则表达式(RegExp)","description":"玩转前端正则表达式(regexp)的使用技巧,使用regexp提高开发效率","frontmatter":{"title":"正则表达式(RegExp)","description":"玩转前端正则表达式(regexp)的使用技巧,使用regexp提高开发效率","keywords":"正则表达式,RegExp,正则匹配,前端正则表达式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/regexp/base.md","filePath":"frontend/regexp/base.md","lastUpdated":1706247228000}'),c={name:"frontend/regexp/base.md"},r=o(`

正则表达式

JavaScript中的正则是Perl的大子集,但Perl内部的一些表达式却没有继承

正则表达式是用于匹配字符串中字符组合的模式(可参考MDN教程)

一个例子

使用正则将一个数字以科学计数法进行表示,如:

js
 // 10000000 => 10,000,000

现在用一个正则来解决

js
const str = '10000000'
+const reg = /(?=(\\B)(\\d{3})+$)/g
+str.replace(reg, ',') // 10,000,000

修饰符

正则表达式是由模式修饰符(可有可无)组成 常用的修饰符有:igmuy

  • i:匹配时不区分大小写
    js
    str = 'JavaScript'
    +reg = /javascript/i
    +reg.test(str) // => true
  • g:匹配时会查找所有的匹配项,而不只是第一个
    js
    str = 'absKsdblsb'
    +reg = /s/g
    +str.match(reg) // => [s, s, s]
  • m:匹配多行(会影响^、$操作符)
    js
    str = 'ab\\nab'
    +reg = /^ab/mg
    +str.match(reg) // => [ab,ab]
  • u:开启完整的 unicode 支持
  • y:粘滞模式
    js
    str = 'Hello, world!';
    +reg = /\\w+/y;
    +reg.lastIndex = 5; // 在位置 5 精确查找
    +regexp.exec(str) // => null

字符类

字符类是个特殊的字符,用来匹配字符集中字符 如:匹配字符串中的数字

js
const str = 'jhsd123fg903d'
+
+// 匹配所有的数字
+str.match(/\\d/g) // => ['1', '2', '3', '9', '0', '3']

常用的字符表达式见下表:

表达式描述含义
.匹配单个字符,除了换行和行结束符(小数点)默认匹配除换行符之外的任何单个字符。例如,/.n/ 将会匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不会匹配 'nay'。如果 s ("dotAll") 标志位被设为 true,它也会匹配换行符。
\\w匹配单词字符匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。例如, /\\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 和 "3D." 中的 '3'。
\\W匹配非单词字符匹配一个非单字字符。等价于 [^A-Za-z0-9_]。例如, /\\W/ 或者 /[^A-Za-z0-9_]/ 匹配 "50%." 中的 '%'。
\\d匹配数字匹配一个数字。等价于[0-9]。例如, /\\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。
\\D匹配非数字字符匹配一个非数字字符。等价于[^0-9]。例如, /\\D/ 或者 /[^0-9]/ 匹配"B2 is the suite number."中的'B' 。
\\s匹配空白字符匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[ \\f\\n\\r\\t\\v\\u00a0\\u1680\\u180e\\u2000-u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]。例如, /\\s\\w*/ 匹配"foo bar."中的' bar'。经测试,\\s不匹配"\\u180e",在当前版本Chrome(v80.0.3987.122)和Firefox(76.0.1)控制台输入/\\s/.test("\\u180e")均返回false。
\\S匹配非空白字符匹配一个非空白字符。等价于 [^ \\f\\n\\r\\t\\v\\u00a0\\u1680\\u180e\\u2000-u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]。例如,/\\S\\w*/ 匹配"foo bar."中的'foo'。
\\b匹配单词边界匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。注意,匹配中不包括匹配的字边界。换句话说,一个匹配的词的边界的内容的长度是0。(不要和[\\b]混淆了)使用"moon"举例:/\\bm/匹配“moon”中的‘m’;/oo\\b/并不匹配"moon"中的'oo',因为'oo'被一个“字”字符'n'紧跟着。/oon\\b/匹配"moon"中的'oon',因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。/\\w\\b\\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。
\\B匹配非单词边界匹配一个非单词边界。匹配如下几种情况:
(1)字符串第一个字符为非“字”字符
(2)字符串最后一个字符为非“字”字符
(3)两个单词字符之间
(4)两个非单词字符之间
(5)空字符串
\\n匹配换行符匹配一个换行符 (U+000A)。

...等等其他

例子

  1. .字符
js
var str = 'aa1bb'
+str.match(/(\\w)\\1.(\\w)\\2/g) // => ['aa1bb'],此处 \`.\` 匹配的是 1
+
+str = 'nay, an apple is on the tree'
+str.match(/.n/g) // => ['an', 'on'],匹配两个结果,此处\`.\` 分别是 a, o
  1. \\w字符
js
var str = 'a1ds23;.?]'
+str.match(/\\w/g) // => ['a', '1', 'd', 's', '2', '3']
  1. \\d字符
js
var str = 'a1ds23;.?]'
+str.match(/\\w/g) // => ['1', '2', '3']
  1. \\s字符
js
var str = 'a1 ds2 3;.?]'
+str.match(/\\w/g) // => [' ', ' '],共有两处
  1. \\b字符
js
var str = '2split1;word3'
+str.match(/\\b\\d/g) // => [2],先匹配数字[2,1,3],而后单词边界的是 [2]
  1. \\B字符
js
var str = '2split1;word3'
+str.match(/\\B\\d/g) // => [1, 3],先匹配数字[2,1,3],而后非单词边界的是 [1,3]

复用

复用即量词,常见的量词包括:*+?{n},量词可以在匹配多个相同的模式的时候很管用,避免了重复写相同的模式

一个小例子:

js
str = 'ab1c2d345e'
+str.match(/\\d/ig) // => [1, 2, 3, 4, 5]
+
+// 使用量词 (这里涉及到了贪婪原则,后面会讲到)
+str.match(/\\d+/ig) // => [1, 2, 345]

来看下面的解释

  • *:匹配前面的模式0个或多个,相当于{0, n}
    js
    // 还是上面的例子
    +// 使用 *
    +str.match(/\\d*/ig) // => ['', '', '1', '', '2', '', '345', '', '']
    +// 这里因为 * 0个也会匹配,所以每个位置都会匹配到空字符
  • +:匹配前面的模式1个或多个,相当于{1, n}
    js
    // 使用 +,同理,至少得一个才能匹配上
    +str.match(/\\d+/ig) // => ['1', '2', '345']
  • ?:匹配前面模式0个或1个,相当于{0, 1}
    js
    str = 'Should I write color or colour'
    +// 这里 ? 表示前面的 u 有或者没有都行
    +str.match(/colou?r/ig) // => [color, colour]
  • {n}:表示一个范围,可以是{0,n},{n,} 或者{n,m},表示知道得有左位数和最多位数
    js
    str = 'erabuiababidjabababkjlsdababababkl'
    +// 至少得有2个ab,最多匹配3个ab
    +str.match(/(ab){2,3}/ig) // => [abab, ababab, ababab]

选择、组合、捕获、引用

选择

选择是由|标识进行匹配,可以理解为or,如:a|b表示匹配a或者b

js
str = 'absdfg'
+// 匹配s或者d
+str.match(/s|d/ig) // => ['s', 'd']

组合(字符集合范围)

组合在常用的匹配模式中还是常用的,[]用来组合匹配的范围或者其他

几个重要概念:

  1. [^..]表示非组合的内容,^在开头代表不是后面要匹配的内容
  2. [\\b]匹配一个退格,不要和 \\b混淆了
js
// 匹配第一位是字符全是大写或者全是小写的字母
+reg1 = /^[A-z]\\d*/ig
+reg1.test('s12314') // => true
+
+// 匹配第一位是字母或者数字的,最后一个第一位是字母或者0-2之间的数字,很明显false
+reg2 = /^[A-z|\\d]\\d*/ig
+reg2.test('s12314') // => true
+reg2.test('112314') // => true
+reg3 = /^[A-z|0-2]\\d*/ig
+reg3.test('312314') // => false
+
+// 匹配第一位不是字母
+reg4 = /^[^A-z]\\d*/ig
+reg4.test('s12314') // => false
+reg4.test(';12314') // => true

捕获

捕获在匹配表达式中经常看到,他的作用非常强大,使用()一对括号进行修饰,这样就可以捕获到匹配到里面的内容,捕获经常和引用或者修饰符(*、+...)结合使用

在讲用法前,需要补充一下排除捕获,排除捕获也很重要很常用,可以用一些需要()但又不需要捕获后的值,用?:排除捕获

常见用法:

  1. 使用捕获获取具体内容 RegExp 的静态属性 $
js
str = 'I like Java coding'
+
+// 忽略大小写
+reg = /\\w*(JAVA)\\w*/ig
+
+// 匹配字符
+reg.test(str)
+// 匹配后,捕获到的内容会按照捕获的顺序出现在 \`RegExp\`的静态属性上,以\`$\`开头
+console.log(RegExp.$1) // => Java 
+console.log(RegExp.$2) // => undefined ,只有一个捕获,不存在\`$2\`属性
+
+// 使用\`replace\`方法
+str.replace(reg, 'PHP') // => I like PHP coding
+str.replace(reg, '【$1】') // => I like 【Java】 coding
+str.replace(reg, '$1Script') // => I like JavaScript coding
+str.replace(reg, ($, $1) => {
+  console.log('匹配到了' + $1)
+  return \`\${$1}\`
+}) // => I like 【Java】 coding  并且会打印 \`匹配到了Java\`
+// 搜索段落标红关键字
+str.replace(reg, '<span style="color:red">$1</span>') // => I like <span style='color:red'>Java</span> coding
  1. 匹配表达式结合引用使用

引用其实和前面讲到的RegExp的静态属性类似,只不过引用是在匹配表达式中使用,写法不一样。在匹配表达式中使用 \\1 \\2...斜杠加一个数字的形式引用所有引用的第一个,类似 $1、$2...

引用的顺序与()的使用顺序相关联,规则:由左到右,由外到内,遇到排除捕获跳过当前()

js
str = 'qaabbccddq'
+reg = /(\\w)\\1/ig
+str.match(reg) // => ['aa', 'bb', 'cc', 'dd']
js
str = 'qaaaabbbb11q'
+reg = /(\\w\\w)\\1(\\d)\\2?/ig
+str.match(reg) // => ['bbbb11']
+
+// 这里注意是 \`\\3\` 而不是 \`\\2\`
+reg1 = /(\\w\\w)\\1((\\d)\\3)?/ig
+str.match(reg1) // => ['aaaa', 'bbbb11']
+
+// 这里注意使用了 \`?:\` 排除捕获,所以是 \`\\2\` 而不是 \`\\3\`
+reg2 = /(\\w\\w)\\1(?:(\\d)\\2)?/ig
+str.match(reg1) // => ['aaaa', 'bbbb11']

引用

引用在匹配表达式中使用 \\1 这种以 斜杠和数字 结合的方式使用,需要注意的是,引用的数字和使用 ()的规则相关,规则为:由左到右,由外到内,遇到排除捕获跳过当前(),这一点很重要

关于引用的用法,详见前面 捕获小结的使用方法即可

断言

通常我们要匹配的内容后面要跟着指定的内容,常见的断言x(?=y)x(?!y)(?<=y)x(?<!y)x

前瞻断言

前瞻断言主要是x(?=y)x(?!y)x(?=y)表示匹配后面紧跟着y的x,x(?!y)表示匹配后面不是y的x

js
str = '1 candy costs 50€'
+
+// 假如要匹配后面是 \`€\` 的数字
+str.match(/\\d+(?=)/) // => [50]
+
+// 假如要匹配后面不是 \`€\` 的数字
+str.match(/\\d+(?!)/) // => [1]

后瞻断言

后瞻断言主要是(?<=y)x(?<!y)x(?<=y)x表示匹配前面紧跟着y的x,(?<!y)x表示匹配前面不是y的x

js
str = '1 candy costs $50'
+
+// 假如要匹配前面是 \`$\` 的数字
+str.match(/(?<=\\$)\\d+/) // => [50]
+
+// 假如要匹配前面不是 \`$\` 的数字
+str.match(/(?<!\\$)\\d+/) // => [1]

贪婪与惰性

正则的量词通常都是遵循贪婪原则,也就是有量词的时候,尽量匹配多的。而惰性则和这种原则相反,尽量匹配少,不匹配多。

惰性使用?紧跟在量词的后面,如:

js
\`\\d+?\` // 匹配一个数字就行
+\`\\w{1,}?\` // 匹配1个字母就行
+\`\\d*?\` // 匹配0个数字 => ['', ...]

例子

js
// 匹配带 \`""\`号的水果
+str = 'I like "apples" a little more than "oranges"'
+
+
+// 1.贪婪
+// 会发现结果并不理想,原因就是默认是贪婪原则,能匹配多的不匹配少的
+// 首先,会匹配到第一个\`"\`
+// 而后匹配下一个\`"\`,当匹配到\`apples"\`,还会继续往后匹配
+// 看剩下的能不能匹配到 \`.+"\`,最后匹配到了\`oranges"\`(当然前面还有\`than "\`)
+str.match(/".+"/g) // => ["apples" a little more than "oranges"]
+
+// 2.惰性
+str.match(/".+?"/g) // => ["apples", "oranges"]
+
+// 3.其他方法
+str.match(/"[^"]+"/g) // => ["apples", "oranges"]

RegExp属性、方法

属性

常见的属性:source,global,ignoreCase,multiline,lastIndex等等...

  1. source 表示正则对象的原表达式内容以字符串的形式输出,不包含修饰符
js
reg = /(\\d\\s)\\1/ig
+
+reg.source // => '(\\\\d\\\\s)\\\\1'
  1. global 表示是否匹配全部内容,而不是匹配到第一个就停止匹配,返回Boolean类型
js
reg = /(\\d\\s)\\1/ig
+
+reg.global // => true
  1. ignoreCase 表示匹配是否忽略大小写,返回Boolean类型
js
reg = /(\\d\\s)\\1/ig
+
+reg.ignoreCase // => true
  1. multiline 表示多行匹配,有回车符,换下一行从头匹配
js
reg = /(\\d\\s)\\1/ig
+
+reg.multiline // => false
  1. lastIndex 在全局匹配时,表示当前匹配的的索引,初始为0,当匹配到结果时,lastIndex值变为最新匹配的位置,如果不能匹配到结果了,然后重0开始
js
str = 'day by day'
+
+reg = /\\w+/g
+
+reg.exec(str) // => ['day', index: 0, input: 'day by day', groups: undefined]
+reg.lastIndex // => 3
+
+reg.exec(str) // => ['by', index: 4, input: 'day by day', groups: undefined]
+reg.lastIndex // => 6
+
+reg.exec(str) // => ['day', index: 7, input: 'day by day', groups: undefined]
+reg.lastIndex // => 10
+
+reg.exec(str) // => null
+reg.lastIndex // => 0,重新从头开始

方法

常见的方法:exec、test

  1. exec 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null) 同上lastIndex例子

  2. test 一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false。

js
str = '1a1aklk2b2bp'
+reg = /(\\d\\w)\\1+/
+reg.test(str) // => true

String常见的正则方法

常用的方法:replacematchmatchAllsearchsplit

  1. replace:字符串替换指定的内容(表达式匹配)
js
str = 'I like Java coding'
+
+str.replace(/JAVA/i, 'PHP') // => 'I like PHP coding'
+str.replace(/(JAVA)/i, '<$1>') // => 'I like <Java> coding'
+str.replace(reg, ($, $1) => {
+  console.log('匹配到了' + $1)
+  return \`\${$1}\`
+}) // => I like 【Java】 coding  并且会打印 \`匹配到了Java\`
  1. match:匹配所有符合表达式的内容,返回数组,否则null
js
str = 'd1sd2asf43d5'
+
+str.match(/\\d+/) // => [1]
+str.match(/\\d+/g) // => [1, 2, 43, 5]
+str.match(/\\d\\b/) // => [5]
+str.match(/\\d\\B/) // => [1, 2, 43]
+str.match(/\\d\\s/) // => null
  1. matchAll:返回匹配正则表达式的迭代器,参数为 RegExp 类型,且必须带上 修饰符 g,否则报错;其匹配结果返回一个 RegExpStringIterator 类型的迭代器
js
str = 'd1sd2asf43d5'
+
+iterator = str.matchAll(/\\d+/g) // => RegExpStringIterator {}
+Object.prototype.toString.call(iterator) // => [object RegExp String Iterator]
+
+// 返回结果基本和迭代器一致,value是类数组
+iterator.next() // => {value: [1], done: false}
+iterator.next() // => {value: [2], done: false}
+iterator.next() // => {value: [43], done: false}
+iterator.next() // => {value: [5], done: false}
+iterator.next() // => {value: undefined, done: true}

迭代器截图

  1. search:匹配正则表达式,如果匹配成功返回第一个匹配的位置,否则返回-1
js
str = '1 apple costs $50'
+
+str.search(/(?<=\\$)\\d+/) // => 15
+str.search(/\\d+/) // => 0
+str.search(/\\d[A-z]/) // => -1
  1. split:将以正则匹配的内容进行分割
js
str = 'skJavaslkdJAVAllksdfJaVAlp'
+
+// 将会以 java 或者 javas 进行分割(不区分大小写)
+str.split(/javas?/i) // => ['sk', 'lkd', 'llksdf', 'lp']
`,103);function i(y,D,F,d,b,u){const n=a("Reward"),l=a("Gitalk");return t(),e("div",null,[r,s(n),s(l)])}const m=p(c,[["render",i]]);export{E as __pageData,m as default}; diff --git a/assets/frontend_regexp_base.md.QEvSpxyK.lean.js b/assets/frontend_regexp_base.md.QEvSpxyK.lean.js new file mode 100644 index 000000000..58b1bd1a7 --- /dev/null +++ b/assets/frontend_regexp_base.md.QEvSpxyK.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as a}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"正则表达式(RegExp)","description":"玩转前端正则表达式(regexp)的使用技巧,使用regexp提高开发效率","frontmatter":{"title":"正则表达式(RegExp)","description":"玩转前端正则表达式(regexp)的使用技巧,使用regexp提高开发效率","keywords":"正则表达式,RegExp,正则匹配,前端正则表达式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-js.png"},"headers":[],"relativePath":"frontend/regexp/base.md","filePath":"frontend/regexp/base.md","lastUpdated":1706247228000}'),c={name:"frontend/regexp/base.md"},r=o("",103);function i(y,D,F,d,b,u){const n=a("Reward"),l=a("Gitalk");return t(),e("div",null,[r,s(n),s(l)])}const m=p(c,[["render",i]]);export{E as __pageData,m as default}; diff --git a/assets/frontend_render-mode_base.md.NeCLWyST.js b/assets/frontend_render-mode_base.md.NeCLWyST.js new file mode 100644 index 000000000..30405882c --- /dev/null +++ b/assets/frontend_render-mode_base.md.NeCLWyST.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as s,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"渲染模式","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/render-mode/base.md","filePath":"frontend/render-mode/base.md","lastUpdated":1706247228000}'),r={name:"frontend/render-mode/base.md"},o=e("h1",{id:"渲染模式",tabindex:"-1"},[n("渲染模式 "),e("a",{class:"header-anchor",href:"#渲染模式","aria-label":'Permalink to "渲染模式"'},"​")],-1),d=e("ul",null,[e("li",null,"csr"),e("li",null,"ssr"),e("li",null,"ssg")],-1),l=e("p",null,"// 待补充...",-1),c=[o,d,l];function i(_,m,p,f,h,u){return s(),a("div",null,c)}const $=t(r,[["render",i]]);export{x as __pageData,$ as default}; diff --git a/assets/frontend_render-mode_base.md.NeCLWyST.lean.js b/assets/frontend_render-mode_base.md.NeCLWyST.lean.js new file mode 100644 index 000000000..30405882c --- /dev/null +++ b/assets/frontend_render-mode_base.md.NeCLWyST.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as s,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"渲染模式","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/render-mode/base.md","filePath":"frontend/render-mode/base.md","lastUpdated":1706247228000}'),r={name:"frontend/render-mode/base.md"},o=e("h1",{id:"渲染模式",tabindex:"-1"},[n("渲染模式 "),e("a",{class:"header-anchor",href:"#渲染模式","aria-label":'Permalink to "渲染模式"'},"​")],-1),d=e("ul",null,[e("li",null,"csr"),e("li",null,"ssr"),e("li",null,"ssg")],-1),l=e("p",null,"// 待补充...",-1),c=[o,d,l];function i(_,m,p,f,h,u){return s(),a("div",null,c)}const $=t(r,[["render",i]]);export{x as __pageData,$ as default}; diff --git a/assets/frontend_sandbox_index.md.Z9MoVJas.js b/assets/frontend_sandbox_index.md.Z9MoVJas.js new file mode 100644 index 000000000..a35188389 --- /dev/null +++ b/assets/frontend_sandbox_index.md.Z9MoVJas.js @@ -0,0 +1 @@ +import{_ as a,c as n,o as t,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"sandbox","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/sandbox/index.md","filePath":"frontend/sandbox/index.md","lastUpdated":1706247228000}'),d={name:"frontend/sandbox/index.md"},s=e("h1",{id:"sandbox",tabindex:"-1"},[o("sandbox "),e("a",{class:"header-anchor",href:"#sandbox","aria-label":'Permalink to "sandbox"'},"​")],-1),r=[s];function c(i,x,_,l,f,p){return t(),n("div",null,r)}const h=a(d,[["render",c]]);export{b as __pageData,h as default}; diff --git a/assets/frontend_sandbox_index.md.Z9MoVJas.lean.js b/assets/frontend_sandbox_index.md.Z9MoVJas.lean.js new file mode 100644 index 000000000..a35188389 --- /dev/null +++ b/assets/frontend_sandbox_index.md.Z9MoVJas.lean.js @@ -0,0 +1 @@ +import{_ as a,c as n,o as t,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const b=JSON.parse('{"title":"sandbox","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/sandbox/index.md","filePath":"frontend/sandbox/index.md","lastUpdated":1706247228000}'),d={name:"frontend/sandbox/index.md"},s=e("h1",{id:"sandbox",tabindex:"-1"},[o("sandbox "),e("a",{class:"header-anchor",href:"#sandbox","aria-label":'Permalink to "sandbox"'},"​")],-1),r=[s];function c(i,x,_,l,f,p){return t(),n("div",null,r)}const h=a(d,[["render",c]]);export{b as __pageData,h as default}; diff --git a/assets/frontend_ts_base.md.VMBqRDJo.js b/assets/frontend_ts_base.md.VMBqRDJo.js new file mode 100644 index 000000000..e0bedd018 --- /dev/null +++ b/assets/frontend_ts_base.md.VMBqRDJo.js @@ -0,0 +1,31 @@ +import{_ as s,c as a,o as n,V as l}from"./chunks/framework.SV1ROkXV.js";const d=JSON.parse('{"title":"typescript","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/ts/base.md","filePath":"frontend/ts/base.md","lastUpdated":1706247228000}'),e={name:"frontend/ts/base.md"},p=l(`

typescript

JS是个动态弱类型语言,使用非常自由,但随着项目的不断演变代码越多产生的不确定性就会越大,而ts可以更好的进行类型约束,降低程序的不稳定性

基础类型

内置null/undefined/void

内置any/unknown/never

枚举

接口interface和类型别名type

联合类型和交叉类型

索引类型keyof

类型查询typeof

类型守卫

类型收窄(类型推导)

  • is
  • typeof
  • in
  • instanceof
  1. 守卫基本类型
  2. 守卫对象类型、联合类型

类Class

泛型

  1. type<T>
  2. interface<T>
  3. function<T>
  4. Class<T>
  5. Promise<T>

条件类型

  1. extends
  2. infer
  3. 分布式条件类型

鸭子辨形

里氏替换

内置工具类型

  1. 属性
ts
type Partial<T> = {
+  [K in keyof T]?: T[K]
+}
+
+type Required<T> = {
+  [K in keyof T]-?: T[K]
+}
+
+type Readonly<T> = {
+  readonly [K in keyof T]: T[K];
+}
+
+// 可变的
+type Mutable<T> = {
+  -readonly [K in keyof T]: T[K];
+}
  1. 结构
ts
type Record<K extends keyof any, V> = {
+  [P in K]: V;
+}
+
+type Pick<T, K extends keyof T> = {
+  [P in K]: T[P];
+}
+type Omit<T, K extends any> = {
+  
+}

常用

ts
type LiteralToPrimitive<T> = T extends string
+  ? string
+  : T extends number
+  ? number
+  : T extends boolean
+  ? boolean
+  : never;

// 待更新...

`,29),o=[p];function r(t,c,i,F,y,D){return n(),a("div",null,o)}const b=s(e,[["render",r]]);export{d as __pageData,b as default}; diff --git a/assets/frontend_ts_base.md.VMBqRDJo.lean.js b/assets/frontend_ts_base.md.VMBqRDJo.lean.js new file mode 100644 index 000000000..e7a56b9f9 --- /dev/null +++ b/assets/frontend_ts_base.md.VMBqRDJo.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,V as l}from"./chunks/framework.SV1ROkXV.js";const d=JSON.parse('{"title":"typescript","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/ts/base.md","filePath":"frontend/ts/base.md","lastUpdated":1706247228000}'),e={name:"frontend/ts/base.md"},p=l("",29),o=[p];function r(t,c,i,F,y,D){return n(),a("div",null,o)}const b=s(e,[["render",r]]);export{d as __pageData,b as default}; diff --git a/assets/frontend_ts_ts-configure.md.p4gJph3L.js b/assets/frontend_ts_ts-configure.md.p4gJph3L.js new file mode 100644 index 000000000..cd1600f66 --- /dev/null +++ b/assets/frontend_ts_ts-configure.md.p4gJph3L.js @@ -0,0 +1 @@ +import{_ as t,c as s,o as a,m as e,a as r}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"Typescript配置文件","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/ts/ts-configure.md","filePath":"frontend/ts/ts-configure.md","lastUpdated":1706247228000}'),o={name:"frontend/ts/ts-configure.md"},n=e("h1",{id:"typescript配置文件",tabindex:"-1"},[r("Typescript配置文件 "),e("a",{class:"header-anchor",href:"#typescript配置文件","aria-label":'Permalink to "Typescript配置文件"'},"​")],-1),c=e("p",null,"// 待补充...",-1),i=[n,c];function d(p,_,f,l,h,m){return a(),s("div",null,i)}const x=t(o,[["render",d]]);export{g as __pageData,x as default}; diff --git a/assets/frontend_ts_ts-configure.md.p4gJph3L.lean.js b/assets/frontend_ts_ts-configure.md.p4gJph3L.lean.js new file mode 100644 index 000000000..cd1600f66 --- /dev/null +++ b/assets/frontend_ts_ts-configure.md.p4gJph3L.lean.js @@ -0,0 +1 @@ +import{_ as t,c as s,o as a,m as e,a as r}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"Typescript配置文件","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/ts/ts-configure.md","filePath":"frontend/ts/ts-configure.md","lastUpdated":1706247228000}'),o={name:"frontend/ts/ts-configure.md"},n=e("h1",{id:"typescript配置文件",tabindex:"-1"},[r("Typescript配置文件 "),e("a",{class:"header-anchor",href:"#typescript配置文件","aria-label":'Permalink to "Typescript配置文件"'},"​")],-1),c=e("p",null,"// 待补充...",-1),i=[n,c];function d(p,_,f,l,h,m){return a(),s("div",null,i)}const x=t(o,[["render",d]]);export{g as __pageData,x as default}; diff --git a/assets/frontend_visual_index.md.m1fPrP2X.js b/assets/frontend_visual_index.md.m1fPrP2X.js new file mode 100644 index 000000000..c5e339b8e --- /dev/null +++ b/assets/frontend_visual_index.md.m1fPrP2X.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"visual","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/visual/index.md","filePath":"frontend/visual/index.md","lastUpdated":1706247228000}'),i={name:"frontend/visual/index.md"},o=e("h1",{id:"visual",tabindex:"-1"},[n("visual "),e("a",{class:"header-anchor",href:"#visual","aria-label":'Permalink to "visual"'},"​")],-1),r=[o];function d(l,c,_,u,f,p){return s(),t("div",null,r)}const v=a(i,[["render",d]]);export{h as __pageData,v as default}; diff --git a/assets/frontend_visual_index.md.m1fPrP2X.lean.js b/assets/frontend_visual_index.md.m1fPrP2X.lean.js new file mode 100644 index 000000000..c5e339b8e --- /dev/null +++ b/assets/frontend_visual_index.md.m1fPrP2X.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"visual","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/visual/index.md","filePath":"frontend/visual/index.md","lastUpdated":1706247228000}'),i={name:"frontend/visual/index.md"},o=e("h1",{id:"visual",tabindex:"-1"},[n("visual "),e("a",{class:"header-anchor",href:"#visual","aria-label":'Permalink to "visual"'},"​")],-1),r=[o];function d(l,c,_,u,f,p){return s(),t("div",null,r)}const v=a(i,[["render",d]]);export{h as __pageData,v as default}; diff --git a/assets/frontend_vue_component-render.md.nhoAsokZ.js b/assets/frontend_vue_component-render.md.nhoAsokZ.js new file mode 100644 index 000000000..eb89adf62 --- /dev/null +++ b/assets/frontend_vue_component-render.md.nhoAsokZ.js @@ -0,0 +1 @@ +import{_ as e,c as n,o as t,V as a}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Vue源码分析之组件创建","description":"Vue源码分析之组件创建","frontmatter":{"title":"Vue源码分析之组件创建","description":"Vue源码分析之组件创建","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/component-render.md","filePath":"frontend/vue/component-render.md","lastUpdated":1706247228000}'),o={name:"frontend/vue/component-render.md"},r=a('

Vue源码分析之组件创建

写作中...

VNode

Render

',4),d=[r];function s(c,i,_,u,l,h){return t(),n("div",null,d)}const f=e(o,[["render",s]]);export{m as __pageData,f as default}; diff --git a/assets/frontend_vue_component-render.md.nhoAsokZ.lean.js b/assets/frontend_vue_component-render.md.nhoAsokZ.lean.js new file mode 100644 index 000000000..84ae05bf2 --- /dev/null +++ b/assets/frontend_vue_component-render.md.nhoAsokZ.lean.js @@ -0,0 +1 @@ +import{_ as e,c as n,o as t,V as a}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Vue源码分析之组件创建","description":"Vue源码分析之组件创建","frontmatter":{"title":"Vue源码分析之组件创建","description":"Vue源码分析之组件创建","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/component-render.md","filePath":"frontend/vue/component-render.md","lastUpdated":1706247228000}'),o={name:"frontend/vue/component-render.md"},r=a("",4),d=[r];function s(c,i,_,u,l,h){return t(),n("div",null,d)}const f=e(o,[["render",s]]);export{m as __pageData,f as default}; diff --git a/assets/frontend_vue_computed-watch.md.D5_gwArb.js b/assets/frontend_vue_computed-watch.md.D5_gwArb.js new file mode 100644 index 000000000..46c4477bd --- /dev/null +++ b/assets/frontend_vue_computed-watch.md.D5_gwArb.js @@ -0,0 +1,767 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"Vue源码分析之计算属性与侦听函数","description":"Vue应用中除了使用data来实现响应式外,还可以使用computed、watch实现对data的监听并触发对应的回调函数,那它们内部又是怎么实现的呢?接下来一起来探索实现原理吧","frontmatter":{"title":"Vue源码分析之计算属性与侦听函数","description":"Vue应用中除了使用data来实现响应式外,还可以使用computed、watch实现对data的监听并触发对应的回调函数,那它们内部又是怎么实现的呢?接下来一起来探索实现原理吧","keywords":"vue计算属性,vue侦听函数,computed,watch,计算属性原理,computed原理,computed缓存原理,watch原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/computed-watch.md","filePath":"frontend/vue/computed-watch.md","lastUpdated":1706247228000}'),c={name:"frontend/vue/computed-watch.md"},r=o(`

Vue源码分析之计算属性与侦听函数

上一节我们从头到尾分析了vue的响应式原理(包括vue3),接下来趁热打铁分析下computed、watch的实现原理。如果你对vue的响应式原理还很模糊,建议先阅读上一篇搞明白响应式原理再来看本篇文章,当然computed、watch是对响应式的扩展,响应式懂了这里才不会迷茫

还是一样如果你对于某些原理不是很明白时,学会自己打断点调试,用最简单的例子多分析几遍有助于理解

计算属性

计算属性顾名思义就是由计算得来的值,在vue中通常用来使用需要通过简单计算后的属性,引用vue官方描述:模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的,在模板中放入太多的逻辑会让模板过重且难以维护

简单使用

vue
<template>
+  <div>{{ name }}</div>
+  <div>{{ age }}</div>
+  <div>{{ \`我的名字:\${this.name},今年 \${this.age}\` }}</div>
+  <div>{{ intro }}</div>
+</template>
+<script>
+export default {
+  data: () => ({
+    name: "Jack",
+    age: 10
+  }),
+  computed: {
+    intro() {
+      return \`我的名字:\${this.name},今年 \${this.age}\`
+    }
+  }
+}
+</script>

上面便是一个最简单的计算属性使用例子,通过计算得到的一个值,使用计算属性模板更易维护也方便后续的扩展

计算属性缓存

应该都听说过计算属性有缓存吧,也就是当计算属性依赖的data值没有发生变化时,是不会重新执行计算属性的函数的,那在页面渲染时也就只会执行一次,我们使用上面的例子简单来验证下:

vue
<template>
+  <!-- 模板中使用3个计算属性 -->
+  <div>{{ intro }}</div>
+  <div>{{ intro }}</div>
+  <div>{{ intro }}</div>
+</template>
+<script>
+export default {
+  // 省略...
+  computed: {
+    intro() {
+      console.log("执行了intro函数");// 看这里会打印几次
+      return \`我的名字:\${this.name},今年 \${this.age}\`;
+    }
+  }
+}
+</script>

从以上结果可以看到intro函数只打印了一次,也就是说在模板渲染中对intro函数的执行只触发了一次,这也就是所谓的计算属性缓存,如果同样的函数定义在方法体中就会执行多遍,严重影响性能

看上去还挺神奇的,接下来就一探究竟👇

计算属性本质

我们知道vue中存在3种watcher分别是:render watchercomputed watcheruser watcher,watcher主要用来执行对应的表达式,而watcher又是被dep控制的,dep大家应该都知道在对data进行getter/setter拦截时所附加的一个对象,用来收集相关联的watcher对象,当触发setter时便通知watcher进行更新,watcher也就会执行对应的表达式进行更新,这就是响应式的过程

那么计算属性其实本质就是一个watcher,由于定义在computed中又被称为计算wathcer。其实通过响应式过程你大概已经知道了计算属性缓存的原因了,大概就是watcher的更新只被dep控制,只要dep所属的属性值没变就不会通知watcher进行更新,所以在模板渲染时并不会触发计算属性的多次执行,因为computed对应的data值没变,这就是原理

vue内部会统一把computed变成对象形式包含get/set两个函数,如上面的写法其实内部会变成:

ts
intro = {
+  get() {
+    return \`我的名字:\${this.name},今年 \${this.age}\`;
+  },
+  set: noop // 空函数
+}

通常计算属性的set使用也不多也不推荐使用set,一般一个计算属性一个函数就行了

下面通过一张图来加强理解计算属性的工作过程:

上图清晰的展示了只有data改变时便会通过dep通知计算watcher进行更新也就会执行计算属性的get函数,模板渲染时并不会触发计算属性的多次执行。上图也反映了一个问题:当data改变时只会通知计算watcher进行更新,而计算watcher并不会通知渲染watcher更新(只有dep会收集watcher,watcher不会收集watcher),那么渲染watcher又是如何知道需要重新渲染的呢?你是否也有一样的疑问呢❓

通过这个疑问并根据响应式原理应该能推出dep肯定和渲染watcher也会有关系的,就是这个关系是怎么建立起来的❓从响应式原理中我们知道dep会通过Dep.watcher这个属性值和watcher产生关系也就是依赖收集,而当计算watcher表达式执行时,当前的Dep.watcher也只会是计算watcher的get函数,并不会是渲染watcher,dep也就不会收集到渲染watcher,那么dep到底是如何收集到渲染watcher的,接下来带着这个疑问进一步了解下

原理实现

  1. 组件初始化时对computed属性进行初始化:
ts
// src/core/instance/state 58行
+export function initState(vm: Component) {
+  vm._watchers = [];
+  const opts = vm.$options;
+  // 初始化computed
+  if (opts.computed) initComputed(vm, opts.computed);
+}
  1. 遍历computed为每一个属性生成对应的watcher(计算watcher):
ts
// src/core/instance/state 137行
+function initComputed(vm: Component, computed: Object) {
+	// 组件实例上定义 _computedWatchers 属性用来存放所有的computedwatcher
+  const watchers = (vm._computedWatchers = Object.create(null));
+
+  // 遍历 computed,生成对应的watcher
+  for (const key in computed) {
+    const userDef = computed[key];
+    // 如果是function就直接取值,反之对象取 get 属性
+    const getter = typeof userDef === "function" ? userDef : userDef.get;
+
+    // 定义当前 key 的watcher, 也就是计算属性watcher
+    watchers[key] = new Watcher(
+      vm,
+      getter || noop,  // 这里看到 表达式就是 我们定义的函数或者get函数
+      noop,
+      { lazy: true }   // 注意这个选项很重要,用来标识这个是计算属性watcher(记住这个,后面会用到)
+    );
+
+    // 代理每个computed属性到实例上,这就是为什么 this可以获取到计算属性的原因
+    if (!(key in vm)) {
+      defineComputed(vm, key, userDef);
+    }
+  }
+}
  1. 来看看计算watcher实例化时会怎么样,初始化时由于opts传入lazy,所以不会立即执行函数:
ts
// src/core/observer/watcher
+export default class Watcher {
+  vm: Component;
+  lazy: boolean;
+  value: any;
+
+  // 这里的expOrFn就是计算属性的getter
+  // cb为空,opts 为 {lazy: true}
+  constructor(vm: Component, expOrFn: string | Function, cb: Function, opts) {
+    this.vm = vm;
+    if (options) {
+    	// lazy: true
+      this.lazy = !!options.lazy;
+    }
+    // 注意这个 dirty 很重要,来缓存计算属性的值,首先进来为 true
+    this.dirty = this.lazy;
+    if (typeof expOrFn === "function") {
+      // getter 变成了 计算属性的get函数
+      this.getter = expOrFn;
+    }
+    // 由于lazy为true,外面初始化时也就不会执行函数
+    this.value = this.lazy ? undefined : this.get();
+  }
+}
  1. 接着第2步骤最后代码,代理computed中的每个key到this实例上,这个步骤很关键也是重点。上一步骤我们知道了computed在初始化watcher时并不会立马执行,那么当组件执行render函数的过程中就会访问computed属性(假设模板中用到了computed属性),这时就会触发下方的getter函数
ts
const sharedPropertyDefinition = {
+  enumerable: true,
+  configurable: true,
+  get: noop,
+  set: noop,
+};
+export function defineComputed(
+  target: any,
+  key: string,
+  userDef: Object | Function
+) {
+  // 值为函数时
+  if (typeof userDef === "function") {
+    sharedPropertyDefinition.get = createComputedGetter(key);
+    sharedPropertyDefinition.set = noop;
+  } else { // 值为对象时
+    sharedPropertyDefinition.get = userDef.get
+      ? userDef.cache !== false
+        ? createComputedGetter(key)
+        : createGetterInvoker(userDef.get)
+      : noop;
+    // 如果有set函数,没有设置noop 空函数
+    sharedPropertyDefinition.set = userDef.set || noop;
+  }
+  // 设置描述对象,对key进行getter/setter拦截,也就是访问 target[key] 时,就会访问下方的getter函数
+  Object.defineProperty(target, key, sharedPropertyDefinition);
+}
+
+// this实例上获取 computed时,就会触发这里的get
+function createComputedGetter(key) {
+  return function computedGetter() {
+    const watcher = this._computedWatchers && this._computedWatchers[key];
+    if (watcher) {
+      if (watcher.dirty) {
+        watcher.evaluate();
+      }
+      if (Dep.target) {
+        watcher.depend();
+      }
+      return watcher.value;
+    }
+  };
+}

首先通过this拿到当前computed属性的watcher,刚开始dirty的值时true,那么就会执行watcher.evaluate(),内部会执行watcher的get方法,get中又会执行getter方法,从第3步应该知道this.getter就是计算属性的函数。在执行计算属性函数过程中就会对data进行访问触发响应式对象对应的dep的depend对当前watcher进行收集,也就是会收集当前计算属性的watcher,最后计算的值赋值给当前watcher的value,这时将dirty设置为false。然后下一步判断Dep.target为true时执行watcher.depend,当前计算属性函数执行完后就会将Dep.target变成上一个watcher,这里就假设为渲染watcher,那么来看看watcher的depend干了啥

ts
export default class Watcher {
+  vm: Component;
+  lazy: boolean;
+  value: any;
+
+  // 省略部分代码...
+
+  get() {
+  	// 设置Dep.target为当前计算属性的watcher
+    pushTarget(this);
+    let value;
+    const vm = this.vm;
+    // 执行计算属性 函数,此过程会访问响应式对应,就会触发get进行dep进行depend当前watcher(依赖收集)
+    value = this.getter.call(vm, vm);
+    popTarget(); // 出栈
+    return value;
+  }
+
+  // dirty为true时执行
+  evaluate() {
+    this.value = this.get();
+    this.dirty = false;
+  }
+}

depend中会遍历所有的deps(也就是收集了当前计算watcher的所有dep,也就是某些对象等key的dep),执行每个dep的depend方法,主动让这些响应式对象对当前的Dep.target进行收集,上面我们说了当前的target为渲染watcher,也就是这个操作会让响应式对象和渲染watcher产生关系。

ts
export default class Watcher {
+  vm: Component;
+  lazy: boolean;
+  value: any;
+
+  // 遍历所有收集了当前计算watcher的dep,执行dep的depend方法主动进行依赖收集
+  depend() {
+    let i = this.deps.length;
+    while (i--) {
+      this.deps[i].depend();
+    }
+  }
+}

再来想想如果render函数中有很多地方用到了同一个计算属性,那么就会再次访问当前实例的计算属性getter,首先还是获取到当前计算属性的watcher,这时dirty值为false,所以就不会再执行watcher.evaluate也就不会再执行计算属性的函数了,直接返回上一次计算后的结果watcher.value,这也就是为什么计算属性会缓存的真实面目

ts
// 省略部分代码...
+// dirtry为false时,不会执行
+if (watcher.dirty) {
+  watcher.evaluate();
+}
+return watcher.value;
  1. 当对应的响应式对象更新时就会触发计算属性的watcher更新,执行update函数,这里lazy为true顾将dirty设置为true,然后啥都不用做。接着dep会通知渲染watcher进行更新(上面讲了dep会收集渲染watcher),这样就会重新执行render函数,再次会访问计算属性的getter,那么就和第一次页面渲染访问计算属性一样的逻辑,执行计算属性的函数得到最新的值,这里就不再重复了
ts
export default class Watcher {
+  dirty: boolean;
+  // 省略部分代码...
+  update() {
+    if (this.lazy) {
+      this.dirty = true;
+    }
+  }
+}

到这里计算属性的原理就讲的差不多了,其实很简单。计算属性的执行的重新执行是由对应的data属性的dep控制的,并且dep也会收集渲染watcher。只有data的值改变时计算属性才会执行,否则都会使用上次的值,这样的逻辑也合情合理

小提示

computed可以通过cache:false来取消缓存,通过它可以设置成不同的getter,这样在每次访问计算属性时都会执行它的函数,当然一般也用不到这个选项,官方文档也没有给出这个选项,这里可以从源码中定义初始化计算属性的getter时会进行判断,感兴趣的可以看看

ts
computed: {
+  intro: {
+    get() {
+      console.log("执行了intro函数");
+      return \`我的名字:\${this.name},今年 \${this.age}\`;
+    },
+    cache: false
+  }
+}

这样在每次访问intro都会执行,那么就会打印多次

代码调试

这里我们简单调试下上面的代码,来证明下以上的想法,首先是data的dep会收集渲染watcher,另一个就是多次使用同一个计算属性不会再执行

render函数第一次访问计算属性

第一次会执行evaluate函数

执行计算属性函数触发依赖收集

计算属性中的响应式对象收集渲染函数

render函数后面访问计算属性不再执行

响应式对象确实收集了计算watcher和渲染watcher

Vue3的computed

Vue3中的computed其实可vue2差不多,唯一一处不一样的就是响应式对象不会直接收集render函数,他只会收集对应的computed函数,而computed函数会收集render函数,因此当响应式对象的值发生变化时更新遵循以下规则:data => computed => render,其实这样设计能更好的反映出每个对象的真正effect

以下是一个最简单的vue的computed使用例子:

vue
<template>
+  <button @click="number++">改变number</button>
+  {{ total }}
+</template>
+<script>
+import { ref, computed } from "vue"
+export default {
+  setup() {
+    const number = ref(1);
+    const total = computed(() => number % 5);
+
+    return { total }
+  }
+}
+</script>

这个例子定义了一个number响应式对象,然后定义了一个计算属性total,它是通过number的值并进行计算得到的。因此在页面render时会访问total,total会收集当前的activeEffect也就是render函数,然后computed初次执行会访问number属性,触发number的get这样number就会收集当前的activeEffect也就是total中的函数。这样当在页面中点击按钮改变number的值时,number首先会通知computed重新计算,computed在通知render函数重新渲染

当然computed也是有缓存的功能,也是通过dirty来控制的,只要对应的响应式对象的值不变,dirty就为false不会执行,直接返回上次的值(首次dirty为true);接下来简单分析下整个流程👇:

  1. computed的内部实现过程,首先但我们用computed(() => number.value % 5)这样的代码时先执行computed函数,内部会对传入的参数做统一处理,你可以传函数也可以传对象({get(),set()}),最后实例化ComputedRefImpl并返回。ComputedRefImpl实例化首先会创建ReactiveEffect,并标识当前computed属性,来表示是计算属性
ts
// packages/reactivity/src/computed 112行
+export function computed<T>(
+  getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>,
+  debugOptions?: DebuggerOptions,
+  isSSR = false
+) {
+  let getter: ComputedGetter<T>
+  let setter: ComputedSetter<T>
+
+  const onlyGetter = isFunction(getterOrOptions)
+  // 函数形式
+  if (onlyGetter) {
+    getter = getterOrOptions
+    setter = NOOP
+  } else {
+    // 对象形式和vue2一样
+    getter = getterOrOptions.get
+    setter = getterOrOptions.set
+  }
+
+  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR)
+  // 返回当前 ComputedRefImpl 实例
+  return cRef as any
+}
+
+// computed真正的对象,computed.value 就是这个类中的属性
+export class ComputedRefImpl<T> {
+  public dep?: Dep = undefined
+
+  private _value!: T
+  public readonly effect: ReactiveEffect<T>
+
+  public _dirty = true
+  public _cacheable: boolean
+
+  constructor(getter, _setter) {
+    // 创建自己的ReactiveEffect对象
+    this.effect = new ReactiveEffect(getter, () => {
+      if (!this._dirty) {
+        this._dirty = true
+        triggerRefValue(this)
+      }
+    })
+    this.effect.computed = this
+  }
+  // 省略...
+}
  1. 然后当组件render函数执行时会获取computed的value属性,首先会执行trackRefValue函数内部会让当前计算属性的dep对render函数进行收集,然后由于初次_dirty为true,就会执行effect.run也就是ReactiveEffect的run,此过程会设置activeEffect为当前computed,然后执行computed中我们定义函数。内部会访问number触发它的get然后对computed的effect进行收集,最后执行完后_dirty变成false,这样就完成了初次的依赖回收过程
ts
export class ComputedRefImpl<T> {
+  public dep?: Dep = undefined
+
+  private _value!: T
+  public readonly effect: ReactiveEffect<T>
+
+  public _dirty = true
+  public _cacheable: boolean
+  // 省略...
+
+  // render获取计算属性值时触发
+  get value() {
+    const self = toRaw(this)
+    trackRefValue(self) // 此过程会让computed对render进行收集
+    if (self._dirty || !self._cacheable) {
+      self._dirty = false
+      // 第一次 dirty 为true,会执行run也就是执行computed回调函数,内部会访问响应式对象使computed被对应的data收集
+      self._value = self.effect.run()!
+    }
+    return self._value
+  }
+
+  set value(newValue: T) {
+    this._setter(newValue)
+  }
+}
+
+// packages/reactivity/src/effect 53行
+export class ReactiveEffect<T = any> {
+  run() {
+    let parent: ReactiveEffect | undefined = activeEffect
+    let lastShouldTrack = shouldTrack
+    while (parent) {
+      if (parent === this) {
+        return
+      }
+      parent = parent.parent
+    }
+    try {
+      this.parent = activeEffect
+      // 改变当前activeEffect为 computed的Effect
+      activeEffect = this
+      shouldTrack = true
+
+      trackOpBit = 1 << ++effectTrackDepth
+
+      if (effectTrackDepth <= maxMarkerBits) {
+        initDepMarkers(this)
+      } else {
+        cleanupEffect(this)
+      }
+      // 执行computed 回调函数,内部访问number值,触发number对computed的收集
+      return this.fn()
+    }
+  }
+}
  1. 当改变number的值时,会派发更新通知number的dep中的所有effect进行更新,这里就会通知computed effect进行更新,但这里不会执行ReactiveEffect的run函数,而执行scheduler函数,scheduler仅仅会将_dirty的值改为false,然后通知computed自己的dep中的所有effect进行更新,这样render函数重新执行时就和第一次执行一致了:
ts
// number触发自己的依赖进行更新
+export function triggerEffects(dep, debuggerEventExtraInfo) {
+  const effects = isArray(dep) ? dep : [...dep]
+  for (const effect of effects) {
+    // 执行计算属性
+    if (effect.computed) {
+      triggerEffect(effect, debuggerEventExtraInfo)
+    }
+  }
+  // 省略...
+}
+
+function triggerEffect(effect: ReactiveEffect, debuggerEventExtraInfo?: DebuggerEventExtraInfo) {
+  if (effect !== activeEffect || effect.allowRecurse) {
+    // 注意这个 scheduler 属性很重要,这个在 ComputedRefImpl 实例化时会传入
+    // 所以它会执行 scheduler,而不是run函数,也就是不会立马执行computed回调,等到render时才会执行
+    if (effect.scheduler) {
+      effect.scheduler()
+    } else {
+      effect.run()
+    }
+  }
+}
+
+export class ComputedRefImpl<T> {
+  // 部分省略...
+  constructor(
+    getter: ComputedGetter<T>,
+    private readonly _setter: ComputedSetter<T>,
+    isReadonly: boolean,
+    isSSR: boolean
+  ) {
+    this.effect = new ReactiveEffect(getter, () => { // 这个就是 scheduler
+      if (!this._dirty) {
+        this._dirty = true
+        // 上面执行这里时,computed通知自己dep中收集的所有依赖进行更新,这时就会重新执行render
+        triggerRefValue(this)
+      }
+    })
+  }

以上就是vue3的computed整体过程,整体来说vue3的实现更加清晰。vue3中通过track、triggereffect机制完成依赖收集和派发更新,因此所有对象都可能是effect,而没有像vue2中那样死板。再者就是vue3的computed依赖收集能真正反映出依赖的收集关系,而不像vue2中data还需要额外对render收集一次!

侦听函数

侦听函数在vue中就是我们常用的watch又称user watcher,之所以这么称呼是因为它也是一个watcher对象并且user的值为true。watch通常用来监听响应式对象,当响应式对象setter执行时会通过dep通知user watcher执行,就会执行我们watch中定义的回调函数,然后再做点什么👀

简单使用

vue
<template>
+  <button @click="count++">改变</button>
+</template>
+<script>
+export default {
+  data: () => ({
+    count: 0,
+  }),
+  watch: {
+    count: "watchCount"
+  },
+  methods: {
+    watchCount(n, o) {
+      console.log(n, o);
+    }
+  }
+}
+</script>

你可以能没见过以上watch形式,count的值仅仅是一个字符串,并不是我们常用的函数或者对象,但是他确实能监听到count的变化,执行的是methods中对应的方法,这种写法后面你就会明白

初始化过程

其实user watch很简单,这里就简单的啃下源码:

ts
// src/core/instance/state 58行
+export function initState(vm: Component) {
+  const opts = vm.$options;
+  // 如果定义了watch,就进行初始化
+  if (opts.watch && opts.watch !== nativeWatch) {
+    initWatch(vm, opts.watch);
+  }
+}
+
+// 初始化
+function initWatch(vm: Component, watch: Object) {
+  for (const key in watch) {
+    const handler = watch[key];
+    // watch属性值为数组的情况
+    if (Array.isArray(handler)) {
+      for (let i = 0; i < handler.length; i++) {
+        createWatcher(vm, key, handler[i]);
+      }
+    } else {
+    	// watch 属性的值为普通对象
+      createWatcher(vm, key, handler);
+    }
+  }
+}
+
+// 每个watch 创建对应的watch
+function createWatcher(
+  vm: Component,
+  expOrFn: string | Function,
+  handler: any,
+  options?: Object
+) {
+	// 这里会对handler做统一处理,handler也就是回调函数,可能是函数、对象、字符串
+	// 如果当前的属性的值(handler)为对象,那么回调函数就为 对象的 handler 属性(这种方式应该用过)
+  if (isPlainObject(handler)) {
+    options = handler;
+    handler = handler.handler;
+  }
+  // 当前属性的值(handler)为字符串,回调就从当前实例上取
+  if (typeof handler === "string") {
+    handler = vm[handler];
+  }
+  // 最后执行执行 $watch 方法
+  return vm.$watch(expOrFn, handler, options);
+}

这里列举下以上watch的不同的定义形式:

ts
watch: {
+  // 函数
+  count() {},
+  // 数组和字符串,循环时就是字符串;字符串时回调函数会从this上拿,也就是vm['cb1']
+  // 这就是为什么我们的例子可以写成字符串的形式,其实通过vm['watchCount']会取到methods上的方法
+  count: ["cb1", "cb2"],
+  count: "cb1",
+  // 对象
+  count: {
+    handler() {}
+  }
+}

$watch

我们定义的watch最终内部会调用原型$watch方法,所以我们还可以使用$watch进行函数侦听:

ts
const unwatch = this.$watch(key, cb, ops);
  1. $watch是实现侦听函数的核心,那么就来看看它内部具体实现:
ts
Vue.prototype.$watch = function (expOrFn: string | Function, cb: any, options?: Object): Function {
+  const vm: Component = this;
+  options = options || {};
+  // 设置user为true,这个很重要用来表示当前Watcher为user watcher
+  options.user = true;
+  // 创建user Watcher
+  const watcher = new Watcher(vm, expOrFn, cb, options);
+  // 如果设置 immediate,会立即执行一次 cb
+  if (options.immediate) {
+    cb.call(vm, watcher.value);
+  }
+  // $watch 函数会返回一个函数,执行它 会执行 watcher.teardown
+  return function unwatchFn() {
+    watcher.teardown();
+  };
+};
  1. 创建userWatcher时会标识当前watcher为user watcher(user = true),并且有cb也就是watch的回调函数。这里最重要的就是parsePathexpOrFn的解析,通常watch用来检测响应式对象,一般都会写对应的key也可以嵌套(如:foo、foo.bar)。parsePath返回一个函数并赋值给watcher.getter,然后立即执行getter,也就会执行parsePath返回的函数,执行时会将当前vm传入,然后根据watch监听的key循环获取到对应的响应式属性的值,然后返回。此过程就会触发检测的key对当前userWatcher的收集
ts
export default class Watcher {
+  vm: Component;
+  cb: Function;
+  user: boolean;
+  value: any;
+
+  constructor(vm: Component, expOrFn: string | Function, cb: Function, options?: Object) {
+    this.vm = vm;
+    // this.user 为true
+    if (options) { this.user = !!options.user;}
+    // cb 就是 watch 的回调函数
+    this.cb = cb;
+    // 这里需要注意 expOrFn 通常为 字符串 如:this.$watch("a.b.c", cb, {});
+    if (typeof expOrFn === "function") { this.getter = expOrFn; }
+    // 那么就会走这里,这里会通过parsePath将 用户监听的 key 传递进去,最后返回
+    else { this.getter = parsePath(expOrFn); }
+    // 最后执行得到值
+    this.value = this.lazy ? undefined : this.get();
+  }
+}
+
+// parsePath 会返回一个函数
+const bailRE = new RegExp(\`[^\${unicodeRegExp.source}.$_\\\\d]\`)
+export function parsePath (path: string): any {
+  if (bailRE.test(path)) { return }
+  const segments = path.split('.')
+  return function (obj) {
+    for (let i = 0; i < segments.length; i++) {
+      if (!obj) return
+      obj = obj[segments[i]]
+    }
+    return obj
+  }
+}
  1. 当watch监听的key值被修改后就会让dep通知user watcher进行更新,user watcher就会执行update方法,然后通过异步更新队列策略,最后执行watcher的run方法:
ts
export default class Watcher {
+  // dep通知watch更新
+  update() {
+    if (this.lazy) { this.dirty = true; }
+    else if (this.sync) { this.run(); }
+    // 这里user watcheer 会进入更新队列
+    else { queueWatcher(this); }
+  }
+
+  // 更新队列执行时会执行watcher.run
+  run() {
+    if (this.active) {
+      // 拿到最新的值
+      const value = this.get();
+      if (value !== this.value || isObject(value) || this.deep) {
+        const oldValue = this.value;
+        this.value = value;
+        // 如果是user watcher,执行cb
+        if (this.user) {
+          this.cb.call(this.vm, value, oldValue);
+        } else {
+          this.cb.call(this.vm, value, oldValue);
+        }
+      }
+    }
+  }
+}

immediate

immediate会让watch立即执行一次,来看它的实现:

ts
Vue.prototype.$watch = function (expOrFn: string | Function, cb: any, options?: Object): Function {
+  // 省略...
+  const watcher = new Watcher(vm, expOrFn, cb, options);
+  // 如果设置 immediate,会立即执行一次 cb
+  if (options.immediate) {
+    cb.call(vm, watcher.value);
+  }
+  //...
+};

事件卸载

watch可以主动进行监听的卸载,watch会返回一个函数,执行它就会卸载监听。原理就是通过watcher的teardown方法遍历当前watcher的所有dep执行移除当前watcher,这样data更新时就不会再被通知更新了:

ts
Vue.prototype.$watch = function (expOrFn: string | Function, cb: any, options?: Object): Function {
+  // 省略...
+  const watcher = new Watcher(vm, expOrFn, cb, options);
+  // 省略...
+  // $watch 函数会返回一个函数,执行它 会执行 watcher.teardown
+  return function unwatchFn() {
+    watcher.teardown();
+  };
+};
+
+// 来看下teardown的实现
+export default class Watcher {
+  // 遍历当前user watcher所有被收集的dep,执行removeSub这样就会让dep移除对user watcher的收集
+  teardown() {
+    if (this.active) {
+      let i = this.deps.length;
+      while (i--) {
+        this.deps[i].removeSub(this);
+      }
+      this.active = false;
+    }
+  }
+}

deep

deep选项主要用来深层监听某个属性,比如下面深层监听foo,那么当foo或者bar改变时都会触发user watcher的回调函数执行:

ts
const data = {
+  foo: {
+    bar: 1
+  }
+}
+this.$watch("foo", cb, { deep: true });

那么内部是如何实现deep的呢?其实道理很简单只要让深层嵌套的属性的dep也都收集当前的user watcher,那么深层嵌套的属性值改变时也会通知user watcher进行更新。主要就是通过traverse方法深度遍历嵌套对象访问对应的key就会触发dep收集当前watcher,这样深层嵌套的属性值改变时也会通知watcher进行更新:

ts
export default class Watcher {
+	// 省略
+  get() {
+    pushTarget(this);
+    let value;
+    const vm = this.vm;
+    try {
+      value = this.getter.call(vm, vm);
+    } catch (e) {
+      if (this.user) {
+        handleError(e, vm, \`getter for watcher "\${this.expression}"\`);
+      }
+    } finally {
+    	// 当执行当前get方法获取到响应式对应的value时,如果用户设置了deep
+    	// 那么就对当前值执行 traverse 方法,内部会循环遍历key,触发它们的get
+      if (this.deep) {
+        traverse(value);
+      }
+    }
+    return value;
+  }
+}
+
+// src/core/observer/traverse 
+export function traverse (val: any) {
+  _traverse(val, seenObjects)
+  seenObjects.clear()
+}
+
+function _traverse (val: any, seen: SimpleSet) {
+  let i, keys
+  const isA = Array.isArray(val)
+  // 不合法的值直接return
+  if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
+    return
+  }
+  if (val.__ob__) {
+    const depId = val.__ob__.dep.id
+    if (seen.has(depId)) {
+      return
+    }
+    seen.add(depId)
+  }
+  // 值是数组或者对象时,深层遍历就会触发每个key的get
+  // 然后触发每个key的dep执行depend,这样深层嵌套的key就会收集当前的user watcher
+  if (isA) {
+    i = val.length
+    while (i--) _traverse(val[i], seen)
+  } else {
+    keys = Object.keys(val)
+    i = keys.length
+    while (i--) _traverse(val[keys[i]], seen)
+  }
+}

sync

这个属性顾名思义同步执行,通常情况下user watcher会被push到异步更新队列中去,然后按顺序进行更新。当设置了这个属性后,每次监听对象值的更新,都会立即执行user watcher的cb,而不会被推到异步更新队列中去,执行也就会被提前

ts
export default class Watcher {
+	// 省略...
+  update() {
+    if (this.lazy) {
+      this.dirty = true;
+    }
+    // dep通知更新时,由于sync位true,会立即执行run得到最新的值然后执行cb
+    else if (this.sync) {
+      this.run();
+    } else {
+      queueWatcher(this);
+    }
+  }
+}

注意事项

watch的侦听函数中不能再对所侦听的对象进行值的修改,这样就会造成死循环不断执行回调函数:

vue
<template>
+  <button @click="count++">改变</button>
+</template>
+<script>
+export default {
+  data: () => ({
+    count: 0,
+  }),
+  watch: {
+    count: "watchCount"
+  },
+  methods: {
+    watchCount(n, o) {
+      this.count ++;
+      console.log(n, o);
+    }
+  }
+}
+</script>

Vue3的watch

vue3中的watch其实和vue2的没啥区别,vue3的选项多了一个flush: 'pre' | 'post' | 'sync'参数,其用来控制回调函数的执行时机,默认值为pre会推送到queueJob队列中,在页面渲染前执行;如果值为post那么会将回调推送到postFlushCbs中,这会在queue执行完后再执行postFlushCbs中的回调,在页面渲染后执行;最后一个值sync和vue2一样,当watch的对象值改变时会立马执行不需要进入队列异步更新

ts
// packages/runtime-core/src/apiWatch 158行
+export function watch<T = any, Immediate extends Readonly<boolean> = false>(
+  source: T | WatchSource<T>,
+  cb: any,
+  options?: WatchOptions<Immediate>
+): WatchStopHandle {
+  return doWatch(source as any, cb, options)
+}
+
+function doWatch(
+  source: WatchSource | WatchSource[] | WatchEffect | object,
+  cb: WatchCallback | null,
+  { immediate, deep, flush, onTrack, onTrigger }: WatchOptions = EMPTY_OBJ
+): WatchStopHandle {
+  const instance =
+    getCurrentScope() === currentInstance?.scope ? currentInstance : null
+  // const instance = currentInstance
+  let getter: () => any
+  let forceTrigger = false
+  let isMultiSource = false
+  // 省略代码...
+  // 1. 先对watch对象的值进行规范化,值可能是 对象、数组、函数等等
+
+  // deep时深度遍历
+  if (cb && deep) {
+    const baseGetter = getter
+    getter = () => traverse(baseGetter())
+  }
+
+  let cleanup: () => void
+  let onCleanup: OnCleanup = (fn: () => void) => {
+    cleanup = effect.onStop = () => {
+      callWithErrorHandling(fn, instance, ErrorCodes.WATCH_CLEANUP)
+    }
+  }
+
+  let oldValue: any = isMultiSource
+    ? new Array((source as []).length).fill(INITIAL_WATCHER_VALUE)
+    : INITIAL_WATCHER_VALUE
+  // 对回调做一次包装
+  const job: SchedulerJob = () => {
+    if (!effect.active) {
+      return
+    }
+    if (cb) {
+      // 省略...
+    } else {
+      // watchEffect
+      effect.run()
+    }
+  }
+
+  // 处理flush 参数,用来区别不同的执行时机
+  let scheduler: EffectScheduler
+  if (flush === 'sync') {
+    scheduler = job as any // the scheduler function gets called directly
+  } else if (flush === 'post') {
+    scheduler = () => queuePostRenderEffect(job, instance && instance.suspense)
+  } else {
+    job.pre = true
+    if (instance) job.id = instance.uid
+    scheduler = () => queueJob(job)
+  }
+
+  // 创建 ReactiveEffect
+  const effect = new ReactiveEffect(getter, scheduler)
+
+  if (cb) {
+    // 处理 immediate 情况,立即执行一次
+    if (immediate) {
+      job()
+    } else {
+      // 否则计算一次旧的值
+      oldValue = effect.run()
+    }
+  } else if (flush === 'post') {
+    queuePostRenderEffect(
+      effect.run.bind(effect),
+      instance && instance.suspense
+    )
+  } else {
+    effect.run()
+  }
+
+  // 卸载事件
+  const unwatch = () => {
+    effect.stop()
+    if (instance && instance.scope) {
+      remove(instance.scope.effects!, effect)
+    }
+  }
+  return unwatch
+}

watchEffect

watchEffect本质还是watch,只不过参数调换了位置而已,这里更像React的useEffect,内部的回调会主动执行,并且当内部的依赖发生改变时,再次触发回调执行:

ts
watchEffect(effect: (onCleanup: OnCleanup) => void, options?: { flush?: 'pre' | 'post' | 'sync' })

watchEffect原理很简单内部主动会执行一次回调函数,这个过程中就会访问到对应的响应式对象,然后触发对当前回调函数的收集,同理data更新时也会通知回调再次执行。回调函数在内部会被封装一次,将onCleanup作为参数传入:

ts
export function watchEffect(
+  effect: WatchEffect,
+  options?: WatchOptionsBase
+): WatchStopHandle {
+  return doWatch(effect, null, options)
+}
+
+function doWatch(
+  source: WatchSource | WatchSource[] | WatchEffect | object,
+  cb: WatchCallback | null,
+  { immediate, deep, flush, onTrack, onTrigger }: WatchOptions = EMPTY_OBJ
+): WatchStopHandle {
+  // source 为function
+  if (isFunction(source)) {
+    // 没有cb,不会走这里
+    if (cb) {
+      // getter with cb
+      getter = () =>
+        callWithErrorHandling(source, instance, ErrorCodes.WATCH_GETTER)
+    } else {
+      // watchEffect 回调会被封装一次
+      getter = () => {
+        if (instance && instance.isUnmounted) {
+          return
+        }
+        if (cleanup) {
+          cleanup()
+        }
+        // 这里就会把 onCleanup 作为参数传入
+        return callWithAsyncErrorHandling(
+          source,
+          instance,
+          ErrorCodes.WATCH_CALLBACK,
+          [onCleanup]
+        )
+      }
+    }
+  }
+
+  // 清除副作用
+  let cleanup: () => void
+  let onCleanup: OnCleanup = (fn: () => void) => {
+    cleanup = effect.onStop = () => {
+      callWithErrorHandling(fn, instance, ErrorCodes.WATCH_CLEANUP)
+    }
+  }
+  const job: SchedulerJob = () => {
+    if (!effect.active) return
+    if (cb) { /* 省略... */ } else {
+      // watchEffect
+      effect.run()
+    }
+  }
+
+  const effect = new ReactiveEffect(getter, scheduler)
+  // initial run
+  effect.run()
+
+  const unwatch = () => {
+    effect.stop()
+    if (instance && instance.scope) {
+      remove(instance.scope.effects!, effect)
+    }
+  }
+  return unwatch
+}

watchEffect还是很好理解的,剩下的还有watchPostEffectwatchSyncEffect都和这个一样,自己看看就行了

总结

到这里就把vue的响应式原理全部讲解完了,其中包括vue3的。响应式遵循发布/订阅模式,通过拦截对象的getter/setter实现对当前的effect进行收集和通知,这样就可以精确的进行更新,这也是为什么vue的更新粒度可以做到组件的原因。如果你对它的响应式还是比较模糊,建议你结合这两篇响应式原理文章尝试写几个例子并进行断点调试,可以帮助你解决自己的疑惑,你也可以在下方留言我会及时回复。接下来一起来看看vue的模板编译过程吧

`,119);function F(D,y,i,b,u,B){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[r,s(a),s(l)])}const E=p(c,[["render",F]]);export{A as __pageData,E as default}; diff --git a/assets/frontend_vue_computed-watch.md.D5_gwArb.lean.js b/assets/frontend_vue_computed-watch.md.D5_gwArb.lean.js new file mode 100644 index 000000000..f96ebd913 --- /dev/null +++ b/assets/frontend_vue_computed-watch.md.D5_gwArb.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const A=JSON.parse('{"title":"Vue源码分析之计算属性与侦听函数","description":"Vue应用中除了使用data来实现响应式外,还可以使用computed、watch实现对data的监听并触发对应的回调函数,那它们内部又是怎么实现的呢?接下来一起来探索实现原理吧","frontmatter":{"title":"Vue源码分析之计算属性与侦听函数","description":"Vue应用中除了使用data来实现响应式外,还可以使用computed、watch实现对data的监听并触发对应的回调函数,那它们内部又是怎么实现的呢?接下来一起来探索实现原理吧","keywords":"vue计算属性,vue侦听函数,computed,watch,计算属性原理,computed原理,computed缓存原理,watch原理","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/computed-watch.md","filePath":"frontend/vue/computed-watch.md","lastUpdated":1706247228000}'),c={name:"frontend/vue/computed-watch.md"},r=o("",119);function F(D,y,i,b,u,B){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[r,s(a),s(l)])}const E=p(c,[["render",F]]);export{A as __pageData,E as default}; diff --git a/assets/frontend_vue_pinia.md.LOFu5M5D.js b/assets/frontend_vue_pinia.md.LOFu5M5D.js new file mode 100644 index 000000000..9cf8e755d --- /dev/null +++ b/assets/frontend_vue_pinia.md.LOFu5M5D.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as n,m as e,a as t}from"./chunks/framework.SV1ROkXV.js";const P=JSON.parse('{"title":"Pinia源码分析","description":"Pinia源码分析","frontmatter":{"title":"Pinia源码分析","description":"Pinia源码分析","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/pinia.md","filePath":"frontend/vue/pinia.md","lastUpdated":1706247228000}'),o={name:"frontend/vue/pinia.md"},s=e("h1",{id:"pinia源码分析",tabindex:"-1"},[t("Pinia源码分析 "),e("a",{class:"header-anchor",href:"#pinia源码分析","aria-label":'Permalink to "Pinia源码分析"'},"​")],-1),r=e("p",null,"写作中...",-1),c=[s,r];function d(p,l,_,h,m,u){return n(),i("div",null,c)}const v=a(o,[["render",d]]);export{P as __pageData,v as default}; diff --git a/assets/frontend_vue_pinia.md.LOFu5M5D.lean.js b/assets/frontend_vue_pinia.md.LOFu5M5D.lean.js new file mode 100644 index 000000000..9cf8e755d --- /dev/null +++ b/assets/frontend_vue_pinia.md.LOFu5M5D.lean.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as n,m as e,a as t}from"./chunks/framework.SV1ROkXV.js";const P=JSON.parse('{"title":"Pinia源码分析","description":"Pinia源码分析","frontmatter":{"title":"Pinia源码分析","description":"Pinia源码分析","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/pinia.md","filePath":"frontend/vue/pinia.md","lastUpdated":1706247228000}'),o={name:"frontend/vue/pinia.md"},s=e("h1",{id:"pinia源码分析",tabindex:"-1"},[t("Pinia源码分析 "),e("a",{class:"header-anchor",href:"#pinia源码分析","aria-label":'Permalink to "Pinia源码分析"'},"​")],-1),r=e("p",null,"写作中...",-1),c=[s,r];function d(p,l,_,h,m,u){return n(),i("div",null,c)}const v=a(o,[["render",d]]);export{P as __pageData,v as default}; diff --git a/assets/frontend_vue_reactivity.md.FuUuuTBh.js b/assets/frontend_vue_reactivity.md.FuUuuTBh.js new file mode 100644 index 000000000..d44b2ce6b --- /dev/null +++ b/assets/frontend_vue_reactivity.md.FuUuuTBh.js @@ -0,0 +1,1104 @@ +import{_ as p,c as o,J as s,V as e,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"Vue源码分析之响应式原理","description":"本文结合源码具体实现和手写响应式来搞懂Vue的响应式原理是如何运作的,以及Vue2版本的响应式缺陷和解决手段,最后就是Vue3的响应式原理以及和Vue2的对比优势","frontmatter":{"title":"Vue源码分析之响应式原理","description":"本文结合源码具体实现和手写响应式来搞懂Vue的响应式原理是如何运作的,以及Vue2版本的响应式缺陷和解决手段,最后就是Vue3的响应式原理以及和Vue2的对比优势","keywords":"Vue响应式,vue reactivity,vue3响应式,vue2响应式,vue2响应式原理,Vue3响应式原理,vue Proxy,Reflect","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/reactivity.md","filePath":"frontend/vue/reactivity.md","lastUpdated":1706247228000}'),r={name:"frontend/vue/reactivity.md"},t=e(`

Vue源码分析之响应式原理

本模块都是vue原理系列文章,其中包含响应式原理、计算属性、侦听函数、编译原理、组件创建及渲染、插槽和状态管理等等相关方面,总之对于vue的使用及核心思想这里都会涉及到。目前vue从主流版本vue2升级到vue3了,因此文章中也会比对两个版本之间同一原理实现差别

学习vue源码对于每一个使用它的伙伴都很重要,尤其对于面试八股文是一把 🔑 ,但最重要的还是一种透过表象看本质的态度,提高自我技能和成长的过程 💪

源码会涉及到大量的代码,面对大量的代码要学会任务划分,先搞明白自己熟悉的部分如:响应式,然后可以尝试自己手写一遍加强理解。源码体量太大了,千万不要开始就从头到尾分析,这样很难让自己专注于某个功能,啃源码也会非常痛苦。同时也要学会调试某个具体功能,通过调试堆栈也可以很清晰看到流程是怎么样的,当将拆解的模块搞熟搞透了,再看看整体的流程是怎么样的,将会游刃有余

vue系列模块都是深入原理知识,会涉及到大量的分析和调试,因此更新周期会拉长,请耐心等待

Vue2分析

众所周知vue2是通过 Object.defineProperty 这个API实现响应式的,定义如下:

ts
Object.defineProperty(obj, prop, descriptor)
  • obj:要定义属性的对象
  • prop:要定义或修改的属性的名称
  • descriptor:目标属性所拥有的特性,包含以下可选属性:
    • configurable:是否允许属性被删除或修改,默认值为 false
    • enumerable:是否可被枚举,默认值为 false
    • value:属性的值,默认值为 undefined
    • writable:是否可被赋值运算符改变其值,默认值为 false
    • get:获取函数,默认值为 undefined
    • set:设置函数,默认值为 undefined

该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,通常设置属性的 gettersetter 函数,从而实现对属性的拦截和控制

本次分析的vue2版本为2.6.11

简单实现

通过一个简单的例子看下效果:

ts
const user = {
+  name: "小明",
+  age: 10
+};
+
+function defineReactive(obj: Record<string, any>, key: any) {
+  let value = obj[key]
+  Object.defineProperty(obj, key, {
+    configurable: true,
+    enumerable: true,
+    get() {
+      console.log('访问属性:', key)
+      return value;
+    },
+    set(newValue) {
+      console.log('设置属性', key , '', newValue)
+      value = newValue;
+    }
+  })
+}
+Object.keys(user).forEach(k => defineReactive(user, k));

以上定义了一个user对象,并使用defineReactive方法访问和设置该对象的属性时打印日志,现在我们尝试访问和设置它的属性,以下为实际打印情况:

既然可以拦截到对象属性的值访问和修改,也就可以做一些其他的操作;比如改变属性时执行某个方法:

ts
intro = () => console.log(\`我的名字:\${user.name},年龄:\${user.age}\`);
+
+Object.defineProperty(obj, key, {
+  configurable: true,
+  enumerable: true,
+  get() {
+    console.log('访问属性:', key)
+    return value;
+  },
+  set(newValue) {
+    value = newValue;
+    // 设置属性时执行intro方法
+    intro();
+  }
+})

这样在user的属性改变时,执行intro都可以获取到最新的值。以上有个弊端就是需要将执行方法写死在set里,如果有n个依赖方法要写n个,可以这样简单封装下:

ts
// 省略部分代码
+const cbs = [];
+
+// 添加待执行的方法
+cbs.push(intro);
+
+// Object.defineProperty
+set(newValue) {
+	value = newValue;
+	// 现在设置值时,只需要将cbs里的方法执行一遍
+	cbs.forEach(cb => cb());
+}

这样解决了set里写很多执行方法的问题,但再仔细看一看问题又来了,cbs中的执行方法需要手动添加,如果有很多个方法也是需要先写死在里面,如何解决这个问题呢?如果能自动收集需要执行的方法就完美了!你可能有以下几个疑问❓

  • 如何自动收集:上面借用了Object.defineProperty的set方法执行了cb,同样可以使用get方法,可以在访问属性时对正在执行的方法进行收集
  • 收集的对象范围:当然是谁使用了当前对象的属性就收集时,而其他就是没有任何关联性的方法,改变了当前对象什么都不会发生

依赖自动收集与更新

通过上面实现遗留的问题,接着来看看如何解决并实现它们:

ts
const user = {
+  name: "小明",
+  age: 10,
+};
+Object.keys(user).forEach(k => defineReactive(user, k));
+
+const p1 = () => console.log(\`【people1】名字:\${user.name}\`);
+const p2 = () => console.log(\`【people2】名字:\${user.name},年龄:\${user.age}\`);
+const cbs: Set<Function> = new Set();
+// 当前正在运行的函数
+let activeFn: Function | null = null;
+activeFn = p1;
+p1();
+user.name = '小王';
+activeFn = p2;
+p2();
+
+function defineReactive(obj: Record<string, any>, key: any) {
+  let value = obj[key]
+  Object.defineProperty(obj, key, {
+    configurable: true,
+    enumerable: true,
+    get() {
+	  // 收集当前正在执行的函数
+      cbs.add(activeFn!);
+      console.log('get log: 访问属性 ', key, '当前activeFn为 ', activeFn?.name);
+      return value;
+    },
+    set(newValue) {
+      value = newValue;
+      console.log('set log: 设置属性 ', key, '当前activeFn为 ', activeFn?.name);
+      cbs.forEach(cb => cb());
+    }
+  })
+}

上面定义了两个执行方法p1、p2,其中p1使用了name属性,p2使用name、age属性,执行p1时将activeFn设置为p1,代表当前的执行函数为p1;然后将activeFn设置为p2再执行p2,这样执行两者的过程中会访问到user属性,就会触发get函数,然后将当前的activeFn添加到cbs中,这里使用set作为数据结构去重,最终p1和p2都会添加进去。当修改user的属性值时触发set,执行cbs里的方法也就是p1、p2。上面的执行结果如下图:

从图中可以看出执行主动p1、p2都会打印正确的值,而且修改了name属性后确实会触发cbs执行。细心的同学会发现,当修改age属性值时,所有的回调p1、p2都执行了,按理说p1只用到name属性不会执行,因为他和age没有任何关联;从以上代码分析我们将对象的每个属性的依赖都添加到了同一个cbs中,并访问set时,执行了所有的cbs,所以才会都执行。解决这个问题就需要针对每个属性做区分或者分开存储,下面我们进行简单改造:

ts
const cbs: Set<Function> = new Set();
+const cbs: Map<string, Set<Function>> = new Map();
+
+function defineReactives(obj: Record<string, any>, key: any) {
+  let value = obj[key]
+  Object.defineProperty(obj, key, {
+    configurable: true,
+    enumerable: true,
+    get() {
+      cbs.add(activeFn!);
+      if (!cbs.has(key)) {
+        cbs.set(key, new Set());
+      }
+      const deps = cbs.get(key) 
+      deps?.add(activeFn!);
+      console.log('get log: 访问属性 ', key, '当前activeFn为 ', activeFn?.name)
+      return value;
+    },
+    set(newValue) {
+      value = newValue;
+      console.log('set log: 设置属性 ', key, '当前activeFn为 ', activeFn?.name)
+      cbs.forEach(cb => cb());
+      const deps = cbs.get(key) 
+      deps?.forEach(dep => dep()) 
+    }
+  })
+}

上面将cbs改成map结构,每个key对应一个set数据结构,针对对象的不同key单独来存储对应的cbs,这样在更新某个属性的值时只会触发对应key的所有cb执行,来看下改造后的执行结果:

从上面执行结果可以看到改造后当修改age时只会执行p2函数,而修改了name属性值后p1、p2都会被执行,这符合我们的预期

以上基本上实现了依赖的自动收集和派发更新,可能有人说还需要手动执行activeFn的赋值操作,我的回答是必须的,当然在以上的例子中确实每次都要手动赋值,我们并没有实现递归组件创建等过程,这里只是演示一下如何触发依赖收集;不管怎么在依赖收集前都是要主动执行一次,当使用Vue时也是如此:new Vue,当new时内部会触发一系列操作如:模板编译、依赖收集等等,递归创建组件时也会不断地进行依赖的收集,总之都会有一次主动执行

现在简单用官方的方式实现一下,支持深度嵌套,其主要涉及到observe、Observer、Dep、Watcher等函数和对象

ts
// 步骤:initData => observe => defineReactive => dep => watcher => update => render
+
+// 渲染函数,把它当成vue的组件render函数
+function render(renderFn: Function) {
+  const watcher = renderFn.watcher || new Watcher(renderFn);
+  if (!renderFn.watcher) {
+    renderFn.watcher = watcher;
+  }
+  Dep.target = watcher;
+
+  renderFn();
+  Dep.target = null;
+}
+
+// 每个组件渲染函数都有一个watcher,watcher中包含了被dep收集的所有dep
+class Watcher {
+  deps: Set<Dep>;
+  cb: Function;
+
+  constructor(cb: Function) {
+    this.deps = new Set();
+    this.cb = cb;
+  }
+
+  addDep(dep: Dep) {
+    this.deps.add(dep)
+    dep.addSub(this);
+  }
+
+  update () {
+    this.cb?.();
+  }
+}
+
+// 每个属性都有自己的Dep对象,用来收集watcher,当值变化时通知所有的watcher进行更新
+class Dep {
+  static target: Watcher | null;
+  subs: Array<Watcher>;
+
+  constructor() {
+    this.subs = [];
+  }
+
+  addSub(sub: Watcher) {
+    if (this.subs.includes(sub)) return;
+    this.subs.push(sub);
+  }
+
+  depend() {
+    if (Dep.target) {
+      Dep.target.addDep(this);
+    }
+  }
+
+  notify() {
+    for (let i = 0, l = this.subs.length; i < l; i++) {
+      this.subs[i].update();
+    }
+  }
+}
+Dep.target = null
+
+// 拦截对象入口
+function observe(value: any) {
+  if (typeof value !== "object") return;
+  // 保证只会生成一次
+  return new Observer(value) || value.__ob__;
+}
+
+// 使用Observer对象用来标识当前属性已经被拦截了,也就是有了dep对象
+class Observer {
+  dep: Dep;
+  constructor(value: any) {
+    this.dep = new Dep();
+    const self = this;
+    Object.defineProperty(value, "__ob__", {
+      configurable: false,
+      get() {
+        return self;
+      },
+    });
+    this.walk(value);
+  }
+
+  // 深度遍历对象
+  walk(value: any) {
+    if (Object.prototype.toString.call(value) === "[object Object]") {
+      Object.keys(value).forEach((k) => {
+        defineReactive(value, k);
+      });
+    }
+  }
+}
+
+// 待拦截的对象,支持深度嵌套
+const user = {
+  name: "小明",
+  age: 10,
+  friends: {
+    total: 3,
+  }
+};
+
+// 响应式核心
+function defineReactive(obj: Record<string, any>, k: string) {
+  let val: any = null;
+  const getter = Object.getOwnPropertyDescriptor(obj, k)?.get;
+  const setter = Object.getOwnPropertyDescriptor(obj, k)?.set;
+  if (!getter) {
+    val = obj[k];
+  }
+
+  // 每个被observe过的对象都会有一个 闭包 dep对象,并且有一个\`__ob__\`属性
+  const dep = new Dep();
+  observe(val);
+  Object.defineProperty(obj, k, {
+    enumerable: true,
+    configurable: true,
+    get() {
+      if (Dep.target) {
+        dep.depend();
+      }
+      return getter ? getter.call(obj) : val;
+    },
+    set(newVal) {
+      if (!setter) {
+        val = newVal;
+      } else {
+        setter.call(obj, newVal);
+      }
+      dep.notify();
+    },
+  });
+}
+// render前先对 user 对象进行拦截
+observe(user)
+
+// 模拟每个组件的真实渲染数据
+let page1 = () => console.log(\`页面1: =====> 我的名字:\${user.name},年龄:\${user.age}\`);
+let page2 = () => console.log(\`页面2: =====> 年龄:\${user.age},我有\${user.friends.total}朋友\`);
+let page3 = () => console.log(\`页面3: =====> 我的名字:\${user.name},我有\${user.friends.total}朋友\`);
+
+// 模拟vue的组件递归渲染
+render(page1)
+user.name = "小李";
+render(page2)
+user.name = "校长";
+render(page3)

以上便是用最最简洁的代码还原了下官方的实现过程,趁热打铁来看看vue对其真正的实现过程

官方实现

以上我们使用Object.defineProperty简单的实现了响应式的原理,从设计模式看其也是典型发布-订阅模式,在Vue中主要通过DepWatcher实现了发布订阅模型,每个对象的属性都有一个对应的Dep,Dep中收集了所有需要派发更新的回调即:Watcher,在属性更新时Dep会通知相关的Watcher进行更新,Watcher会进行页面的重新渲染,这就是为什么当修改数据时页面也会实时更新的原因

整体流程

这里我先简述一下vue响应式的整体过程,然后再以一张响应式模型图描述整个流程。

首先要明白vue的更新粒度是组件级别,也就是数据更新只会触发当前组件重新渲染,而不是整个应用。这种更新方式可以提高渲染性能,因为只需要对变化的组件进行更新,而不需要重新渲染整个应用

  • 初始化:以new Vue为例开始创建根组件,创建组件过程会对相关属性的初始化,比如data、props等等
  • 对象响应化:拦截data进行改造,也就是getter、setter进行拦截,并生成对应的dep(完成对属性拦截的相关逻辑)
  • 挂载:执行挂载时$mount,过程中可能会对模板进行编译
  • render:render函数生成vnode,最后patch整个vnode生成dom

其中在render过程中每个组件都会生成对应的watcher(渲染watcher),组建在访问内部的数据(data、computed等等)时,会触发getter函数然后通过当前属性的dep收集当前的watcher渲染watcher,这样就完成了依赖的收集(这里省略了computed、watcher等处理逻辑,下一篇讲),当然组件创建或render是个递归过程,因此targetWatcher(用来告诉Dep当前需要收集的Watcher)一定指向当前的组件渲染watcher;当改变某个对象的属性值时便会触发setter,所持有的dep将会通知收集的watcher进行更新,watcher再次执行render更新页面。用一张图来描述这个过程:

vue响应式模型

Vue响应式模型

具体实现

vue的响应式实现大体涵盖了Observe、Dep、Watcher等方法与对象,这里根据流程给出对应的代码,读者只需了解过程是怎么样的,每段代码的含义知道大概意思即可

  1. 首先组件的初始化会执行Vue的_init实例方法,内部通过initState进行组件相关属性的设置,其中就包含了对data的拦截:
ts
// src/core/instance/init 57行
+Vue.prototype._init = function (options?: Object) {
+  const vm: Component = this;
+  // 省略一大堆代码...
+  initState(vm);
+}
+// src/core/instance/state 54行
+export function initState(vm: Component) {
+  const opts = vm.$options;
+  if (opts.data) {
+    initData(vm);
+  }
+}
+// src/core/instance/state 114行
+function initData(vm: Component) {
+  let data = vm.$options.data;
+  data = vm._data = typeof data === "function" ? getData(data, vm) : data || {};
+
+  // 观测观测组件data,也就是进行setter、getter拦截
+  observe(data, true /* asRootData */);
+}
  1. 通过observe入口为每一个级别对象生成对应的Observer对象,并深度遍历实现对组件data属性的拦截:
ts
// src/core/observer/index 110行
+export function observe(value: any, asRootData: ?boolean): Observer | void {
+  return new Observer(value);
+}
+
+// src/core/observer/index 37行
+export class Observer {
+  constructor(value: any) {
+    this.dep = new Dep();
+    def(value, "__ob__", this);
+    this.walk(value);
+  }
+
+  // 深度遍历对象
+  walk(obj: Object) {
+    const keys = Object.keys(obj);
+    for (let i = 0; i < keys.length; i++) {
+      defineReactive(obj, keys[i]);
+    }
+  }
+  // ....
+}
+
+// src/core/observer/index 135行
+export function defineReactive(
+  obj: Object,
+  key: string,
+  val: any,
+) {
+  const dep = new Dep();
+
+  const property = Object.getOwnPropertyDescriptor(obj, key);
+
+  // cater for pre-defined getter/setters
+  const getter = property && property.get;
+  const setter = property && property.set;
+
+  let childOb = !shallow && observe(val);
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter() {
+      const value = getter ? getter.call(obj) : val;
+
+      // 收集watcher
+      if (Dep.target) {
+        dep.depend();
+      }
+      return value;
+    },
+    set: function reactiveSetter(newVal) {
+      const value = getter ? getter.call(obj) : val;
+      if (newVal === value || (newVal !== newVal && value !== value)) {
+        return;
+      }
+      if (setter) {
+        setter.call(obj, newVal);
+      } else {
+        val = newVal;
+      }
+      childOb = !shallow && observe(newVal);
+      // 通知更新
+      dep.notify();
+    },
+  });
+}
  1. 拦截对象的每个属性都会有一个闭包Dep,这个闭包Dep很重要,在getter/setter用来和watcher进行关联,来看看Dep的实现(Watcher实现后面看):
ts
// src/core/observer/dep
+// Dep的实现很简单,省略了部分代码
+export default class Dep {
+  // 全局唯一激活的 Watcher
+  static target: ?Watcher;
+  // 用来存放 存放了当前Dep的 所有watcher
+  subs: Array<Watcher>;
+
+  addSub(sub: Watcher) {
+    this.subs.push(sub);
+  }
+
+  // 收集依赖
+  // Dep.Watcher会添加当前的Dep
+  // 同时Watcher的addDep也会执行Dep的addSub将watcher添加到当前Dep(看Watcher方法)
+  depend() {
+    if (Dep.target) {
+      Dep.target.addDep(this);
+    }
+  }
+
+  // 派发更新,对象的属性值改变时会通过自己的dep.notify通知所有的watcher执行update
+  notify() {
+    for (let i = 0, l = this.subs.length; i < l; i++) {
+      this.subs[i].update();
+    }
+  }
+}
+
+// 这里是用来设置当前的watcher,dep和watcher进行联系的桥梁
+Dep.target = null;当前的watcher
+const targetStack = [];维护wather栈结构
+// 进栈、设置当前watcher 
+export function pushTarget(target: ?Watcher) {
+  targetStack.push(target);
+  Dep.target = target;
+}
+// 出栈、当前watcher为栈最后一个
+export function popTarget() {
+  targetStack.pop();
+  Dep.target = targetStack[targetStack.length - 1];
+}
  1. 上面我们也说了vue响应式主要由dep、watcher等方法完成,Dep这里有了,目前就差一个watcher了,那它又是怎么来的呢?不要忘记上面说过组件在渲染的过程中会执行render函数,每个组件都会生成对应的渲染watcher,而渲染又是从mount开始的:
ts
// 执行了$mount才会真正的进行页面渲染(或者el参数不为空)
+new Vue({ render: h => h('div') }).$mount("#app")

来从源码看看$mount的执行位置:vue针对不同的环境做了一些参数处理,这里我们看浏览器环境下

ts
// $mount => 模板编译(compiler-runtime) => mountComponent => render => createElement(VNode,此过程会获取当前组件数据,触发对象的getter对当前渲染watcher进行收集) => patch
+
+// src/platforms/web/entry-runtime-with-compiler 20行
+const mount = Vue.prototype.$mount;
+Vue.prototype.$mount = function (
+  el?: string | Element,
+  hydrating?: boolean
+): Component {
+  el = el && query(el);
+
+  const options = this.$options;
+  
+  // 用户没有提供 render 函数时,根据提供的template/el 的innerHTML 模板进行编译,最后生成 render函数
+  if (!options.render) {
+    let template = options.template;
+    if (template) {
+      if (typeof template === "string") {
+        if (template.charAt(0) === "#") {
+          template = idToTemplate(template);
+        }
+      } else if (template.nodeType) {
+        template = template.innerHTML;
+      } else {
+        return this;
+      }
+    } else if (el) {
+      template = getOuterHTML(el);
+    }
+    if (template) {
+      // 模板编译 生成 render 函数
+      const { render, staticRenderFns } = compileToFunctions(
+        template,
+        {
+          outputSourceRange: process.env.NODE_ENV !== "production",
+          shouldDecodeNewlines,
+          shouldDecodeNewlinesForHref,
+          delimiters: options.delimiters,
+          comments: options.comments,
+        },
+        this
+      );
+      // 将 render 函数赋值给 当前示例的render属性
+      options.render = render;
+      options.staticRenderFns = staticRenderFns;
+    }
+  }
+  // 最后执行mount
+  return mount.call(this, el, hydrating);
+};
+
+// src/platforms/web/runtime/index 37行
+Vue.prototype.$mount = function (
+  el?: string | Element,
+  hydrating?: boolean
+): Component {
+  el = el && inBrowser ? query(el) : undefined;
+  // 执行mount真正执行的函数 mountComponent
+  return mountComponent(this, el, hydrating);
+};
  1. 揭开组件的渲染watcher真面目:
ts
// src/core/instance/lifecycle.js 141行
+export function mountComponent(
+  vm: Component,
+  el: ?Element,
+  hydrating?: boolean
+): Component {
+  vm.$el = el;
+
+  let updateComponent;
+  // 这个函数很重要,当组件的data更新时通知渲染watcher更新,watcher会再次执行当前函数
+  // 这里只需知道:
+  //     1. render函数会生成vnode此过程会获取到对应的对象就会触发getter
+  //     2. update用来将新的vnode渲染成dom
+  updateComponent = () => {
+    vm._update(vm._render(), hydrating);
+  };
+
+  // 创建组件的渲染watcher,这里是最外层的watcher
+  new Watcher(
+    vm,
+    updateComponent, // watcher更新时会触发
+    noop,
+    {
+      before() {
+        if (vm._isMounted && !vm._isDestroyed) {
+          callHook(vm, "beforeUpdate");
+        }
+      },
+    },
+    true /* isRenderWatcher */
+  );
+}

上面执行mountComponent方法时会创建一个watcher对象,并将重要的updateComponent参数传进去;先来看看updateComponent函数的作用,他通过执行render生成vnode,并将vnode传递给update进行patch页面渲染真实dom,在数据更新时重新渲染也就是重新执行当前的updateComponent方法,现在就来看看组件data和watcher是如何联系起来的。先来分析下watcher的执行过程:

ts
// src/core/observer/watcher
+// 部分代码省略...
+export default class Watcher {
+  vm: Component;
+  cb: Function;
+
+  // expOrFn是外面传进来的 updateComponent 也就会重新页面渲染
+  constructor(vm: Component, expOrFn: string | Function, cb: Function) {
+    this.vm = vm;
+    vm._watchers.push(this);
+    this.cb = cb;
+    this.active = true;
+    this.deps = [];
+    this.newDeps = [];
+    this.depIds = new Set();
+    this.newDepIds = new Set();
+    if (typeof expOrFn === "function") {
+      // getter 变成了 updateComponent
+      this.getter = expOrFn;
+    }
+    // 执行get方法
+    this.value = this.get();
+  }
+
+  get() {
+  	// 设置当前watcher
+    pushTarget(this);
+    let value;
+    const vm = this.vm;
+    // 注意这里 执行 updateComponent 方法
+    // updateComponent 就会执行 render函数,其在生成vnode的过程中
+    // 会访问组件实例vm中的数据,此时就会触发对象的getter进行依赖收集
+    // 收集的就是 Dep.target, 也就是当前的 watcher 
+    value = this.getter.call(vm, vm);
+    popTarget(); // 执行完后,复原Dep.Watcher
+    this.cleanupDeps();
+    return value;
+  }
+
+  // 依赖收集时,dep.depend 会执行当前watcher的addDep 将对象的dep添加进去
+  // 同时将自己添加到dep中,两者是多对多的关系
+  // 其实每次添加有个去重的关系,主要是为了避免不必要的渲染,如v-if为false时,页面也没必要渲染,这里不展开讲了
+  addDep(dep: Dep) {
+    const id = dep.id;
+    if (!this.newDepIds.has(id)) {
+      this.newDepIds.add(id);
+      this.newDeps.push(dep);
+      if (!this.depIds.has(id)) {
+        dep.addSub(this);
+      }
+    }
+  }
+
+  // 当用户在页面改变值或者其他方法改变某个数据的值时,就会触发对象的setter
+  // dep.notify会执行watcher的update方法
+  // 这里只看 queueWatcher,其也就是vue的 异步批量更新 方法,最终会执行watcher的 run方法
+  update() {
+  	// 省略...
+    queueWatcher(this);
+  }
+
+  // queueWatcher 中会执行此方法,这里只要知道会执行 get 方法即可
+  // 而get会执行 updateComponent 也就是触发render、patch重新渲染页面
+  run() {
+  	// 省略部分代码...
+    const value = this.get();
+  }
+}

到这里也就讲完了vue的响应式过程,可能对源码不熟悉的可能就有点懵。如果你不熟悉的话我推荐你断点调试一个最简单的vue组件,然后将上面的代码每个位置打上断点,自己过几遍就应该明白了

数组实现

Vue通过用Object.defineProperty实现了对对象的的拦截,但对于值为数组类型Array或者添加新属性时,此方法都无法监听到值的改变。我们接着上面自己实现的响应式举个例子:

ts
// 改变friends 结构,添加 intro 新方法
+const user = {
+  name: "小明",
+  friends: ["小红", "小李"]
+};
+const intro = () => console.log(\`我的名字:\${user.name},我的朋友:\${user.friends?.join("")}\`);
+render(intro);
+
+// 当分别改变 name 和 friends 的值时,只有name改变才会重新执行 intro
+user.name = '鲁班七号';
+user.friends.push('小卫');

上面我们验证了确实无法对数组修改进行拦截,那么Vue是如何实现对数组拦截的呢❓答案就是改写数组的原型方法,改写后就可以实现拦截了,再来看下Observer对象的过程:

ts
// src/core/observer/index
+export class Observer {
+  constructor(value: any) {
+    this.value = value;
+    this.dep = new Dep();
+    // 处理数组
+    if (Array.isArray(value)) {
+// 这里就是改写 array 的原型方法,具体的方法在 arrayMethods中,这里就是替换这个值的原型,而不是Array整体原型
+      if (hasProto) {
+        protoAugment(value, arrayMethods);
+      } else {
+        copyAugment(value, arrayMethods, arrayKeys);
+      }
+      this.observeArray(value);
+    }
+    // 上面我们只说了这里,用来处理嵌套对象
+    this.walk(value);
+  }
+
+// 如果数据中的数据是对象 对每个对象拦截
+  observeArray(items: Array<any>) {
+    for (let i = 0, l = items.length; i < l; i++) {
+      observe(items[i]);
+    }
+  }
+}

具体来看数组方法的改造实现:

ts
// src/core/observer/array
+const arrayProto = Array.prototype
+export const arrayMethods = Object.create(arrayProto)
+
+// 待改写的方法
+const methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort','reverse']
+
+methodsToPatch.forEach(function (method) {
+  // 原始方法
+  const original = arrayProto[method]
+  def(arrayMethods, method, function mutator (...args) {
+  	// 通过原始方法拿到结果
+    const result = original.apply(this, args)
+    // 获取当前数组的dep
+    const ob = this.__ob__
+    let inserted
+    switch (method) {
+      case 'push':
+      case 'unshift':
+        inserted = args
+        break
+      case 'splice':
+        inserted = args.slice(2)
+        break
+    }
+    // 如果是 新增 数据时,对新增的数据再进行 观察,因为新增的值可能是对象
+    if (inserted) ob.observeArray(inserted)
+    
+    // 然后通知更新,这是关键,这里ob是自己的ob,在getter中就是childOb
+    ob.dep.notify()
+    return result
+  })
+})

这里总结下上面方法改写,也就是当你执行数组的方法时如:arr.push时,内部通过ob.dep.notify手动通知更新,这样重新渲染页面就会看到新的数据了。你可能对当前dep是哪个dep,数组的dep又是如何收集到watcher的?如下:ob.dep.notify的dep是[1, 2, 3]自己的dep,而不是defineProperty中的那个闭包dep

ts
user = {
+	friends: [1, 2, 3]
+}
+
+// 数组改写方法中通过this拿到ob,__ob__就是Observer对象
+const ob = this.__ob__
+
+export class Observer {
+  constructor(value: any) {
+    this.value = value;
+    this.dep = new Dep();
+    // 这里每个值都会生成自己的ob,也可以通过 value.__ob__获取到
+    def(value, "__ob__", this);
+  }
+}

那在何时进行依赖收集的呢❓

ts
export function defineReactive(obj: Object, key: string) {
+	// 省略....
+	// 这里对值继续进行oberve,当是数组时在Observer中就会对数组进行改写
+  let childOb = !shallow && observe(val);
+  Object.defineProperty(obj, key, {
+    get: function reactiveGetter() {
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+        	// 这里是关键,当访问某个属性时,如果当前属性时数组,那么就会通过他自己的
+        	// ob中的dep进行依赖收集,你可以认为这里就是为数组准备的
+          childOb.dep.depend();
+          if (Array.isArray(value)) {
+            dependArray(value);
+          }
+        }
+      }
+      return value;
+    },
+    set: function reactiveSetter(newVal) {
+    	// 属性值改变时对新的值重新进行观测,并改变childOb
+      childOb = !shallow && observe(newVal);
+    },
+  });
+}

可能上面一时半会有点绕,还是一样自己多调试几遍简单的demo就会明白的,下面我们再对自己实现的进行改造,让它支持数组:

ts
class Observer {
+  constructor(value: any) {
+  	// 处理数组,改写原型方法
+    if (Array.isArray(value)) {
+      Object.setPrototypeOf(value, arrayMethods) 
+      this.observeArray(value);
+    } else {
+      this.walk(value);
+    }
+  }
+
+  observeArray(items: Array<any>) {
+    for (let i = 0, l = items.length; i < l; i++) {
+      observe(items[i]);
+    }
+  }
+
+  // 省略其他...
+}
+
+const arrayProto = Array.prototype 
+export const arrayMethods = Object.create(arrayProto) 
+const methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort','reverse'] 
+
+methodsToPatch.forEach(function (method) {
+  const original = arrayProto[method as any];
+  Object.defineProperty(arrayMethods, method, {
+    value(...args: any) {
+      const result = original.apply(this, args) 
+      const ob = this.__ob__
+      let inserted
+      switch (method) {
+        case 'push':
+        case 'unshift':
+          inserted = args
+          break
+        case 'splice':
+          inserted = args.slice(2) 
+          break
+      }
+      if (inserted) ob.observeArray(inserted) 
+      ob.dep.notify() 
+      return result
+    }
+  }) 
+}) 
+
+function defineReactive(obj: Record<string, any>, k: string) {
+  const childOb = observe(val);
+  Object.defineProperty(obj, k, {
+    get() {
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+          childOb.dep.depend();
+        }
+      }
+      return getter ? getter.call(obj) : val;
+    }
+  });
+}

修改后再看看结果确实符合预期,当修改friends的值时也会执行对应的回调: 细心的读者应该会发现,使用索引修改值时却没有执行回调,是的!这也是vue的问题,虽然内部拦截了数组的一些方法,但却无法拦截通过索引修改值,这是硬伤也是Object.defineProperty的缺陷。为了解决这个问题,vue提供了$set方法,接下来带着好奇往下看吧

$Set原理

其实$set的实现没有那么神秘,原理非常简单:主动进行依赖收集并触发更新,我们直接看看它的实现过程:

ts
export function set(target: Array<any> | Object, key: any, val: any): any {
+  // 目标对象是 数组时,那么key就是索引, 判断索引是否合法,最终还是调用了 splice方法
+  // 所以 this.$set(arr, 2, 'something') 本质还是调用了splice方法,当然这个方法已经改写了
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val;
+  }
+  // 如果目标不是数组对象
+  // 若key已经存在了,直接返回啥都不做
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val;
+    return val;
+  }
+  const ob = (target as any).__ob__;
+  // 目标对象没有__ob__证明不是响应式对象,直接返回不做处理
+  if (!ob) {
+    target[key] = val;
+    return val;
+  }
+  // 主动将key属性变成响应式,触发依赖收集
+  defineReactive(ob.value, key, val);
+  // 通知更新
+  ob.dep.notify();
+  return val;
+}

仔细看看这段代码相信你已经可以搞明白它是如何运作的了,除了$set外Vue还提供了$delete方法当删除某个属性时通知更新视图,其原理和set道理一样,自己看看吧

到这里关于Vue2的响应式过程就结束了,还有一些computedwatch的实现没有讲我们放在「计算属性与侦听函数」本篇,相信现在你应该对Vue2的响应式有一定的认识了,当然需要你多动动手多写几个例子,然后多调试一下思路就会很清晰了

Vue3分析

从Vue2到使用Vue3是个无感过程应该很多人也在用了,Vue3最明显的特点就是不再支持IE了,这里最根本原因是内部使用了一些新的语言特性,这些特性只被现代浏览器支持,比如:响应式原理本质是使用了Proxy、Reflect等API,这些API原生支持属性拦截,不需要再兼容大量代码,因此速度更快、性能更好

Vue3的官方仓库全部采用了typescript开发,类型提示更加友好。采用monorepo方式将核心功能拆分独立的包,提供给用户更多的选择权,同时也更有利于tree shaking。这里我们先来看看Vue3的响应式是如何实现的吧👇

本次分析的vue3版本为3.3.0

核心API

在Vue3中响应式的核心原理不再使用Object.property,而由ProxyReflect代替,后者是天生的元编程性能更好,如果你对这两者API还不太熟悉的话,可以先阅读我的「元编程」一文

举个简单例子看下这两个API的强大:

ts
// 源对象
+const user = {
+  name: "小明",
+  age: 10
+}
+
+// 代理对象
+const proxyUser = new Proxy(user, {
+  get(target, key, receiver) {
+    console.log("访问了:", key);
+    return Reflect.get(target, key, receiver);
+  },
+  set(target: any, key, newValue, receiver) {
+    console.log(\`设置 \${key.toString()} 的值由 \${target[key]} 改为 \${newValue}\`);
+    return Reflect.set(target, key, newValue, receiver);
+  }
+});

从上面的例子可以看到使用Proxy可以对对象进行get/set拦截,并且支持对未初始化的属性进行拦截(如上id属性),我们知道新属性对于Object.defineProperty是拦截不到的,而proxy却可以优雅的解决掉这个问题。Reflect方法提供了多个静态方法,用来获取或设置原对象的值,更多关于两者的使用这里就不再多说,接下来我用最简单的代码同样实现上面自己实现的响应式

简单实现

其实响应式万变不离其宗,通过对对象的get/set进行拦截,获取对象属性时对依赖进行收集,修改对象属性时派发更新,收集的目标是全局唯一正在运行的函数。也就是说每次运行一个函数时都会将其设置为正在运行的函数,然后其访问某个属性时,这个属性就会收集当前运行函数,有多少个运行函数就会收集多少个,那么当值被修改时就会通知当前属性的所有依赖进行更新,也就会让这些函数重新执行一遍。下面看下实现过程:

ts
// 当前正在运行的函数
+let activeEffect: null | Function;
+// 副作用函数用来修改 activeEffect 的值
+function effect(fn: Function) {
+  activeEffect = fn;
+  // 主动执行一次,函数内部访问对象属性时就会触发依赖收集
+  fn();
+  activeEffect = null;
+}
+// 依赖收集集合
+const targetMap = new WeakMap<any, Map<string, Set<Function>>>();
+// 收集依赖
+function track(target: any, key: string) {
+  if (activeEffect) {
+    let depsMap = targetMap.get(target);
+    if (!depsMap) {
+      targetMap.set(target, (depsMap = new Map()));
+    }
+    let dep = depsMap.get(key);
+    if (!dep) {
+      depsMap.set(key, (dep = new Set()))
+    }
+    // 将当前的 activeEffect 添加到当前 属性的依赖里
+    dep?.add(activeEffect);
+  }
+}
+
+// 派发更新
+function trigger(target: any, key: string) {
+  const depsMap = targetMap.get(target);
+  if (!depsMap) return;
+  const deps = depsMap.get(key);
+  // 获取当前 属性 的所有依赖,执行他们
+  deps?.forEach(dep => dep?.())
+}
+
+// 拦截对象的get/set等等
+function reactive(target: Record<string, any>) {
+  return new Proxy(target, {
+    get(target, key: string, receiver) {
+      const result = Reflect.get(target, key, receiver);
+      // 收集依赖
+      track(target, key);
+      return result;
+    },
+    set(target, key: string, newValue, receiver) {
+      const oldValue = target[key];
+      // 值一样直接返回
+      if (oldValue === newValue) return true;
+      const result = Reflect.set(target, key, newValue, receiver);
+      // 出发当前key依赖更新
+      trigger(target, key);
+      return result;
+    },
+  });
+}
+
+const user = reactive({
+  name: "小明",
+  age: 10,
+});
+// p1
+effect(() => console.log(\`p1:我的名字:\${user.name},年龄:\${user.age}\`));
+// p2
+effect(() => console.log(\`p2:年龄:\${user.age}\`));

下图是执行结果,可以看出每个属性改变时都会正确的派发更新

再来看看依赖的结构,从下图可以很明显的看到name只有一个依赖p1,而age就有两个依赖p1、p2

以上简单的实现了对对象的拦截,但还存在一个问题那就是没有对深层对象进行拦截,如下代码修改了info.hobby却不会正确的派发更新:

ts
const user = reactive({
+  name: "小明",
+  age: 10,
+  info: {
+    hobby: "篮球"
+  },
+});
+effect(() => console.log(\`p3:我的名字:\${user.name},年龄:\${user.age},爱好:\${user.info.hobby}\`));

深层嵌套

要解决以上的问题就要深层对对象进行代理,我们的代码使用new Proxy仅仅会拦截对象的第一层对象,因此在获取深层属性时,是不会触发拦截的。要解决这个问题很简单,那就是判断当前属性的值是不是原始类型(假如),如果不是就需要对值再进行拦截也就是再执行reactive方法进行代理,这样就会正常的拦截到深层嵌套的属性了。来看下实现,很简单:

ts
function reactive(target: Record<string, any>): any {
+  return new Proxy(target, {
+    get(target, key: string, receiver) {
+      const result = Reflect.get(target, key, receiver);
+      // 收集依赖
+      track(target, key);
+      // 判断当前的值是不是对象,如果是对象继续代理拦截
+      // 这样在访问深层对象时,其实访问的代理对象
+      if (typeof result === "object") {
+        return reactive(result) 
+      }
+      return result;
+    },
+    // 省略...
+  });
+}
+
+const user = reactive({
+  name: "小明",
+  age: 10,
+  info: {
+    hobby: "篮球",
+    girlFriend: {
+      name: '鲁班'
+    }
+  },
+});
+effect(() => console.log(\`p3:我的名字:\${user.name},年龄:\${user.age},爱好:\${user.info.hobby},女朋友:\${user.info.girlFriend.name}\`));

以上改造好了后看下执行结果:

到这里其实还差对数组结构方法的拦截,看如下代码:

ts
const user = reactive({
+  name: "小明",
+  age: 10,
+  friends: ["鲁班", "钟馗"] 
+});
+effect(() => console.log(\`p4:我的名字:\${user.name},朋友:\${user.friends?.join("")}\`));

实现数组

那么对于数组的方法又是如何拦截的呢?对数组的修改通常都会获取length属性触发track,然后通过索引触发set,因此在使用数组方法触发trigger时判断当前对象是不是数组并且当前key为数字,那就通知更新数组length属性的依赖。来看下简单改造:

ts
function trigger(target: any, key: string) {
+  const depsMap = targetMap.get(target);
+  if (!depsMap) return;
+  // 当key为数字时 通知length属性依赖更新
+  if (Number(key)) {
+    return depsMap.get("length")?.forEach((dep) => dep?.());
+  }
+  const deps = depsMap.get(key);
+  deps?.forEach((dep) => dep?.());
+}

这样当使用数组的方法修改时就可以正确派发更新了

实现Ref

在reactive的基础上实现ref变得非常简单,由于proxy只能拦截对象无法对原始类型进行拦截,因此可以将原始对象包装成对象然后再进行拦截即可。在vue3中通常这样使用:

ts
const loading = ref(false);
+loading.value = true;
+console.log(loading.value);

现在我们来简单实现下ref函数:

ts
function ref(value: string | boolean | number) {
+  return reactive({ value });
+}
+const loading = ref(false);
+effect(() => loading.value && console.log("加载中。。。"))

以上打印结果如下:

实现toRefs

toRefs主要用来解决对象解构后不再响应式的问题,解决这个也很简单,让解构的属性值获取的还是原来的对象,这样在访问/修改属性时还是触发的原来响应式对象

我们来简单的实现下这个功能:

ts
class ObjectRef {
+  constructor(
+    private readonly _object: any,
+    private readonly _key: any,
+  ) {}
+
+  get value() {
+    const val = this._object[this._key] 
+    return val;
+  }
+
+  set value(newVal) {
+    this._object[this._key] = newVal
+  }
+}
+function toRefs(obj: any) {
+  const res = {};
+  Object.keys(obj).forEach(k => {
+    res[k] = new ObjectRef(obj, k) 
+  }) 
+  return res;
+}

使用toRefs的功能验证是否结构后不会失去响应式:

ts
const { age } = toRefs(user);
+effect(() => console.log(\`p1:我的名字:\${user.name},年龄:\${user.age}\`));
+// 使用解构的属性,来验证它的响应式
+effect(() => console.log(\`p2:年龄:\${age.value}\`));

官方实现

上面我们尝试着使用proxy简单实现了下vue3的响应式原理和一些函数,接下来就来扫一下源码是如何实现的。源码写的很健壮这里大家了解下大概流程即可,对于特殊情况可以单独进行分析

  1. 实现对象拦截代理,这里我们看最普通的reactive:
ts
// packages/reactivity/src/reactive 82行
+export function reactive<T extends object>(target: T): UnwrapNestedRefs<T>
+export function reactive(target: object) {
+  // 只读对象
+  if (isReadonly(target)) {
+    return target
+  }
+  return createReactiveObject(
+    target,
+    false,
+    mutableHandlers,
+    mutableCollectionHandlers,
+    reactiveMap
+  )
+}
+
+// packages/reactivity/src/reactive 248行
+function createReactiveObject(
+  target: Target,
+  isReadonly: boolean,
+  baseHandlers: ProxyHandler<any>,
+  collectionHandlers: ProxyHandler<any>,
+  proxyMap: WeakMap<Target, any>
+) {
+  // 省略...
+  // 真正 proxy 拦截的地方
+  const proxy = new Proxy(target, baseHandlers)
+  proxyMap.set(target, proxy)
+  return proxy
+}
+
+// 这里看下get和set实现
+// packages/reactivity/src/baseHandlers 48行
+const get = /*#__PURE__*/ createGetter()
+const set = /*#__PURE__*/ createSetter()
+function createGetter(isReadonly = false, shallow = false) {
+  return function get(target: Target, key: string | symbol, receiver: object) {
+    // 获取使用Reflect获取值
+    const res = Reflect.get(target, key, receiver)
+    // 以来收集
+    if (!isReadonly) {
+      track(target, TrackOpTypes.GET, key)
+    }
+
+    // 如果属性值为对象 如 {}、[] 等等,深层拦截
+    if (isObject(res)) {
+      return isReadonly ? readonly(res) : reactive(res)
+    }
+    return res
+  }
+}
+
+function createSetter(shallow = false) {
+  return function set(
+    target: object,
+    key: string | symbol,
+    value: unknown,
+    receiver: object
+  ): boolean {
+    const hadKey =
+      isArray(target) && isIntegerKey(key)
+        ? Number(key) < target.length
+        : hasOwn(target, key)
+    // 获取结果
+    const result = Reflect.set(target, key, value, receiver)
+    // 通知更新
+    if (target === toRaw(receiver)) {
+      if (!hadKey) {
+        trigger(target, TriggerOpTypes.ADD, key, value)
+      } else if (hasChanged(value, oldValue)) {
+        trigger(target, TriggerOpTypes.SET, key, value, oldValue)
+      }
+    }
+    return result
+  }
+}
  1. 接着来看依赖收集过程也就是track函数的实现:
ts
// packages/reactivity/src/effect 247行
+export function track(target: object, type: TrackOpTypes, key: unknown) {
+  // 首先判断可以收集、是否有正在运行的函数
+  if (shouldTrack && activeEffect) {
+    let depsMap = targetMap.get(target)
+    if (!depsMap) {
+      targetMap.set(target, (depsMap = new Map()))
+    }
+    let dep = depsMap.get(key)
+    if (!dep) {
+      depsMap.set(key, (dep = createDep()))
+    }
+    trackEffects(dep)
+  }
+}
+export function trackEffects(
+  dep: Dep,
+  debuggerEventExtraInfo?: DebuggerEventExtraInfo
+) {
+  let shouldTrack = false
+  if (effectTrackDepth <= maxMarkerBits) {
+    if (!newTracked(dep)) {
+      dep.n |= trackOpBit // set newly tracked
+      shouldTrack = !wasTracked(dep)
+    }
+  } else {
+    shouldTrack = !dep.has(activeEffect!)
+  }
+  // 这里只看这一步即可
+  dep.add(activeEffect!);
+}
  1. 依赖收集的过程就是收集activeEffect它是如何运作的呢?来看effect的实现:
ts
// packages/reactivity/src/effect 180行
+export function effect<T = any>(
+  fn: () => T,
+  options?: ReactiveEffectOptions
+): ReactiveEffectRunner {
+  // 创建
+  const _effect = new ReactiveEffect(fn)
+  // 执行
+  _effect.run()
+  return runner
+}
+
+// ReactiveEffect实现
+// packages/reactivity/src/effect 53行
+export class ReactiveEffect<T = any> {
+  active = true
+  deps: Dep[] = []
+  constructor(
+    public fn: () => T,
+  ) {}
+  
+  // 创建effect后执行 run方法
+  run() {
+    try {
+      this.parent = activeEffect
+      // 绑定为当前实例
+      activeEffect = this
+      shouldTrack = true
+      // 执行传进来的函数
+      return this.fn()
+    } finally {
+      // 执行完后还原
+      activeEffect = this.parent
+      shouldTrack = lastShouldTrack
+      this.parent = undefined
+    }
+  }
+}
  1. 依赖收集后那么在修改属性值时会触发set同通过trigger用来派发更新:
ts
// packages/reactivity/src/effect 305行
+export function trigger(
+  target: object,
+  type: TriggerOpTypes,
+  key?: unknown,
+) {
+  const depsMap = targetMap.get(target)
+  if (!depsMap) return
+
+  // 统一放在 deps 中处理
+  let deps: (Dep | undefined)[] = []
+  // 数组处理逻辑
+  if (key === 'length' && isArray(target)) {
+    const newLength = Number(newValue)
+    depsMap.forEach((dep, key) => {
+      if (key === 'length' || key >= newLength) {
+        deps.push(dep)
+      }
+    })
+  } else {
+    // schedule runs for SET | ADD | DELETE
+    if (key !== void 0) {
+      deps.push(depsMap.get(key))
+    }
+    // 省略 删除、添加判断
+  }
+
+  const effects: ReactiveEffect[] = []
+  for (const dep of deps) {
+    if (dep) {
+      effects.push(...dep)
+    }
+  }
+  triggerEffects(createDep(effects))
+}
+
+export function triggerEffects(
+  dep: Dep | ReactiveEffect[],
+  debuggerEventExtraInfo?: DebuggerEventExtraInfo
+) {
+  // spread into array for stabilization
+  const effects = isArray(dep) ? dep : [...dep]
+  // 计算属性
+  for (const effect of effects) {
+    if (effect.computed) {
+      triggerEffect(effect, debuggerEventExtraInfo)
+    }
+  }
+  // 非计算属性
+  for (const effect of effects) {
+    if (!effect.computed) {
+      triggerEffect(effect, debuggerEventExtraInfo)
+    }
+  }
+}
+
+function triggerEffect(
+  effect: ReactiveEffect,
+  debuggerEventExtraInfo?: DebuggerEventExtraInfo
+) {
+  // effect是个ReactiveEffect类,执行run函数,触发外部函数执行
+  effect.run()
+}

到这里基本上就关于vue3的响应式基本原理就讲通了,当然只是笼统的梳理下响应式的过程,对于其中特殊的实现这里不再赘述,读者自己尝试打断点分析一下即可。还有一些其它功能如:Ref、toRefs、computed等这些功能其实都很简单,自己尝试看看应该能看懂

响应式对比

1️⃣ vue2响应式原理及缺点:

  • 原理:使用 Object.defineProperty 进行响应式数据的劫持和侦听。它会在实例化时递归地将对象的属性转换为 getter 和 setter,从而在属性访问时触发依赖收集和更新;对于新增或删除的属性,需要使用 Vue.set 或 Vue.delete 进行特殊处理,以确保它们也是响应式的
  • 缺点:存在一些性能和限制方面的问题,例如无法监听数组索引的变化,需要使用特定的数组方法进行变异操作

2️⃣ vue3响应式原理和优势:

  • 原理:基于 ES6 Proxy 的响应式系统,取代了 Object.defineProperty。Proxy 可以捕获对对象的任何属性的访问、赋值和删除操作,并触发相应的更新
  • 优势:
    • 更好的性能:使用 ES6 Proxy 的响应式系统在某些情况下比 Object.defineProperty 更高效,因为它可以直接捕获属性的操作,无需递归地转换整个对象
    • 更好的数组响应:Vue.js 3 的响应式系统可以直接监听数组索引的变化,并通过新的数组方法实现了可响应的变异操作,使得数组的处理更加直观和灵活
    • 更全面的响应式追踪:Vue.js 3 的响应式系统可以追踪 Map、Set 等内置对象的变化,提供了更全面的响应式能力
    • 更简洁的语法:reactive API 可以更直接地将对象转换为响应式对象,不再需要依赖全局的 Vue 实例

源码调试技巧

本次以vue3为例,打开vue3的项目首先看package.json中的脚本,我们使用以下脚本:

sh
# 启动项目
+pnpm dev
+# 启动静态服务
+pnpm serve -p 10010

在vscode中添加调试配置,需要注意在跟路径下创建:

json
// .vscode/launch.json
+{
+  "version": "0.2.0",
+  "configurations": [
+    {
+      // 这里我们使用启动chrome,访问serve服务的地址
+      "name": "Launch Chrome",
+      "request": "launch",
+      "type": "pwa-chrome",
+      "url": "http://localhost:10010",
+      "webRoot": "\${workspaceFolder}"
+    },
+  ]
+}

关于vscode的更多调试技巧可以看我的「vscode调试技巧」一文

点击侧边栏debugger图标,然后选择我们设置调试配置名字Launch Chrome点击启动

上面启动后会新开一个chrome,运行我们的serve静态服务,然后我们找到/packages/vue/examples/下的对应的html文件

如下图,我们在reactivity.html中打了断点,当访问当前页面时就会debug:

使用vscode的好处就是,可以直接在编辑器中调试,不需要看chrome的打印结果:

这样借助vscode调试对于源码的阅读更加友好和清晰,一定要学会调试技巧在工作中也是很有帮助的

IOC实现响应式

写作中...

总结

总之Vue的响应式都是通过拦截对象的setter/getter,进而实现合理依赖收集的过程,当对象改变时便通知以来进行更新。这也是Vue核心概念数据驱动视图。通过将数据和视图进行绑定,当数据发生变化时,视图会自动更新。这种响应式的设计方式使得开发者可以更加方便地管理和更新应用程序的状态,减少了手动操作 DOM 的繁琐工作

到了这里相信你也知道数据驱动视图的背后原理了,接下来我们接着分析「计算属性与侦听函数」

`,158);function F(y,D,i,b,B,A){const a=n("Reward"),l=n("Gitalk");return c(),o("div",null,[t,s(a),s(l)])}const m=p(r,[["render",F]]);export{E as __pageData,m as default}; diff --git a/assets/frontend_vue_reactivity.md.FuUuuTBh.lean.js b/assets/frontend_vue_reactivity.md.FuUuuTBh.lean.js new file mode 100644 index 000000000..2a2dc13c5 --- /dev/null +++ b/assets/frontend_vue_reactivity.md.FuUuuTBh.lean.js @@ -0,0 +1 @@ +import{_ as p,c as o,J as s,V as e,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const E=JSON.parse('{"title":"Vue源码分析之响应式原理","description":"本文结合源码具体实现和手写响应式来搞懂Vue的响应式原理是如何运作的,以及Vue2版本的响应式缺陷和解决手段,最后就是Vue3的响应式原理以及和Vue2的对比优势","frontmatter":{"title":"Vue源码分析之响应式原理","description":"本文结合源码具体实现和手写响应式来搞懂Vue的响应式原理是如何运作的,以及Vue2版本的响应式缺陷和解决手段,最后就是Vue3的响应式原理以及和Vue2的对比优势","keywords":"Vue响应式,vue reactivity,vue3响应式,vue2响应式,vue2响应式原理,Vue3响应式原理,vue Proxy,Reflect","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/reactivity.md","filePath":"frontend/vue/reactivity.md","lastUpdated":1706247228000}'),r={name:"frontend/vue/reactivity.md"},t=e("",158);function F(y,D,i,b,B,A){const a=n("Reward"),l=n("Gitalk");return c(),o("div",null,[t,s(a),s(l)])}const m=p(r,[["render",F]]);export{E as __pageData,m as default}; diff --git a/assets/frontend_vue_router.md.avVg46Rr.js b/assets/frontend_vue_router.md.avVg46Rr.js new file mode 100644 index 000000000..38843704e --- /dev/null +++ b/assets/frontend_vue_router.md.avVg46Rr.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as r,m as e,a}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"VueRouter源码分析","description":"VueRouter源码分析","frontmatter":{"title":"VueRouter源码分析","description":"VueRouter源码分析","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/router.md","filePath":"frontend/vue/router.md","lastUpdated":1706247228000}'),n={name:"frontend/vue/router.md"},s=e("h1",{id:"vuerouter源码分析",tabindex:"-1"},[a("VueRouter源码分析 "),e("a",{class:"header-anchor",href:"#vuerouter源码分析","aria-label":'Permalink to "VueRouter源码分析"'},"​")],-1),u=e("p",null,"写作中...",-1),c=[s,u];function d(i,l,_,p,h,m){return r(),o("div",null,c)}const V=t(n,[["render",d]]);export{v as __pageData,V as default}; diff --git a/assets/frontend_vue_router.md.avVg46Rr.lean.js b/assets/frontend_vue_router.md.avVg46Rr.lean.js new file mode 100644 index 000000000..38843704e --- /dev/null +++ b/assets/frontend_vue_router.md.avVg46Rr.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as r,m as e,a}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"VueRouter源码分析","description":"VueRouter源码分析","frontmatter":{"title":"VueRouter源码分析","description":"VueRouter源码分析","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/router.md","filePath":"frontend/vue/router.md","lastUpdated":1706247228000}'),n={name:"frontend/vue/router.md"},s=e("h1",{id:"vuerouter源码分析",tabindex:"-1"},[a("VueRouter源码分析 "),e("a",{class:"header-anchor",href:"#vuerouter源码分析","aria-label":'Permalink to "VueRouter源码分析"'},"​")],-1),u=e("p",null,"写作中...",-1),c=[s,u];function d(i,l,_,p,h,m){return r(),o("div",null,c)}const V=t(n,[["render",d]]);export{v as __pageData,V as default}; diff --git a/assets/frontend_vue_slot.md.cV7NCWVx.js b/assets/frontend_vue_slot.md.cV7NCWVx.js new file mode 100644 index 000000000..e6e01e2f8 --- /dev/null +++ b/assets/frontend_vue_slot.md.cV7NCWVx.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as s,m as e,a}from"./chunks/framework.SV1ROkXV.js";const V=JSON.parse('{"title":"Vue源码分析之插槽","description":"Vue源码分析之插槽","frontmatter":{"title":"Vue源码分析之插槽","description":"Vue源码分析之插槽","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/slot.md","filePath":"frontend/vue/slot.md","lastUpdated":1706247228000}'),n={name:"frontend/vue/slot.md"},r=e("h1",{id:"vue源码分析之插槽",tabindex:"-1"},[a("Vue源码分析之插槽 "),e("a",{class:"header-anchor",href:"#vue源码分析之插槽","aria-label":'Permalink to "Vue源码分析之插槽"'},"​")],-1),c=e("p",null,"写作中...",-1),d=e("p",null,"slot、scopeslot ...",-1),i=[r,c,d];function l(u,_,p,h,m,f){return s(),o("div",null,i)}const g=t(n,[["render",l]]);export{V as __pageData,g as default}; diff --git a/assets/frontend_vue_slot.md.cV7NCWVx.lean.js b/assets/frontend_vue_slot.md.cV7NCWVx.lean.js new file mode 100644 index 000000000..e6e01e2f8 --- /dev/null +++ b/assets/frontend_vue_slot.md.cV7NCWVx.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as s,m as e,a}from"./chunks/framework.SV1ROkXV.js";const V=JSON.parse('{"title":"Vue源码分析之插槽","description":"Vue源码分析之插槽","frontmatter":{"title":"Vue源码分析之插槽","description":"Vue源码分析之插槽","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/slot.md","filePath":"frontend/vue/slot.md","lastUpdated":1706247228000}'),n={name:"frontend/vue/slot.md"},r=e("h1",{id:"vue源码分析之插槽",tabindex:"-1"},[a("Vue源码分析之插槽 "),e("a",{class:"header-anchor",href:"#vue源码分析之插槽","aria-label":'Permalink to "Vue源码分析之插槽"'},"​")],-1),c=e("p",null,"写作中...",-1),d=e("p",null,"slot、scopeslot ...",-1),i=[r,c,d];function l(u,_,p,h,m,f){return s(),o("div",null,i)}const g=t(n,[["render",l]]);export{V as __pageData,g as default}; diff --git a/assets/frontend_vue_template-compiler.md.eQe44ILX.js b/assets/frontend_vue_template-compiler.md.eQe44ILX.js new file mode 100644 index 000000000..321c3dca1 --- /dev/null +++ b/assets/frontend_vue_template-compiler.md.eQe44ILX.js @@ -0,0 +1,15 @@ +import{_ as s,c as n,o as a,V as l}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"Vue源码分析之模板编译","description":"Vue源码分析之模板编译","frontmatter":{"title":"Vue源码分析之模板编译","description":"Vue源码分析之模板编译","keywords":"vue模板编译","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/template-compiler.md","filePath":"frontend/vue/template-compiler.md","lastUpdated":1706247228000}'),p={name:"frontend/vue/template-compiler.md"},e=l(`

Vue源码分析之模板编译

写作中...

ts
export const createCompiler = createCompilerCreator(function baseCompile (
+  template: string,
+  options: CompilerOptions
+): CompiledResult {
+  const ast = parse(template.trim(), options)
+  if (options.optimize !== false) {
+    optimize(ast, options)
+  }
+  const code = generate(ast, options)
+  return {
+    ast,
+    render: code.render,
+    staticRenderFns: code.staticRenderFns
+  }
+})
`,3),o=[e];function t(r,c,i,F,y,D){return a(),n("div",null,o)}const u=s(p,[["render",t]]);export{B as __pageData,u as default}; diff --git a/assets/frontend_vue_template-compiler.md.eQe44ILX.lean.js b/assets/frontend_vue_template-compiler.md.eQe44ILX.lean.js new file mode 100644 index 000000000..303081176 --- /dev/null +++ b/assets/frontend_vue_template-compiler.md.eQe44ILX.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,V as l}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"Vue源码分析之模板编译","description":"Vue源码分析之模板编译","frontmatter":{"title":"Vue源码分析之模板编译","description":"Vue源码分析之模板编译","keywords":"vue模板编译","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/template-compiler.md","filePath":"frontend/vue/template-compiler.md","lastUpdated":1706247228000}'),p={name:"frontend/vue/template-compiler.md"},e=l("",3),o=[e];function t(r,c,i,F,y,D){return a(),n("div",null,o)}const u=s(p,[["render",t]]);export{B as __pageData,u as default}; diff --git a/assets/frontend_vue_transition.md.osm8ExKv.js b/assets/frontend_vue_transition.md.osm8ExKv.js new file mode 100644 index 000000000..db8fd2d74 --- /dev/null +++ b/assets/frontend_vue_transition.md.osm8ExKv.js @@ -0,0 +1 @@ +import{_ as t,c as n,o,m as e,a}from"./chunks/framework.SV1ROkXV.js";const V=JSON.parse('{"title":"Vue源码分析之过渡","description":"Vue源码分析之过渡","frontmatter":{"title":"Vue源码分析之过渡","description":"Vue源码分析之过渡","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/transition.md","filePath":"frontend/vue/transition.md","lastUpdated":1706247228000}'),s={name:"frontend/vue/transition.md"},i=e("h1",{id:"vue源码分析之过渡",tabindex:"-1"},[a("Vue源码分析之过渡 "),e("a",{class:"header-anchor",href:"#vue源码分析之过渡","aria-label":'Permalink to "Vue源码分析之过渡"'},"​")],-1),r=e("p",null,"写作中...",-1),c=e("p",null,"transition、transitiongroup",-1),d=[i,r,c];function u(l,_,p,h,m,f){return o(),n("div",null,d)}const g=t(s,[["render",u]]);export{V as __pageData,g as default}; diff --git a/assets/frontend_vue_transition.md.osm8ExKv.lean.js b/assets/frontend_vue_transition.md.osm8ExKv.lean.js new file mode 100644 index 000000000..db8fd2d74 --- /dev/null +++ b/assets/frontend_vue_transition.md.osm8ExKv.lean.js @@ -0,0 +1 @@ +import{_ as t,c as n,o,m as e,a}from"./chunks/framework.SV1ROkXV.js";const V=JSON.parse('{"title":"Vue源码分析之过渡","description":"Vue源码分析之过渡","frontmatter":{"title":"Vue源码分析之过渡","description":"Vue源码分析之过渡","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/transition.md","filePath":"frontend/vue/transition.md","lastUpdated":1706247228000}'),s={name:"frontend/vue/transition.md"},i=e("h1",{id:"vue源码分析之过渡",tabindex:"-1"},[a("Vue源码分析之过渡 "),e("a",{class:"header-anchor",href:"#vue源码分析之过渡","aria-label":'Permalink to "Vue源码分析之过渡"'},"​")],-1),r=e("p",null,"写作中...",-1),c=e("p",null,"transition、transitiongroup",-1),d=[i,r,c];function u(l,_,p,h,m,f){return o(),n("div",null,d)}const g=t(s,[["render",u]]);export{V as __pageData,g as default}; diff --git a/assets/frontend_vue_update-process.md.MkXMZBqr.js b/assets/frontend_vue_update-process.md.MkXMZBqr.js new file mode 100644 index 000000000..e08e0aea7 --- /dev/null +++ b/assets/frontend_vue_update-process.md.MkXMZBqr.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,V as o}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"Vue源码分析之视图更新","description":"Vue源码分析之视图更新","frontmatter":{"title":"Vue源码分析之视图更新","description":"Vue源码分析之视图更新","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/update-process.md","filePath":"frontend/vue/update-process.md","lastUpdated":1706247228000}'),n={name:"frontend/vue/update-process.md"},r=o('

Vue源码分析之视图更新

写作中...

patch

nexktick

',4),s=[r];function c(i,d,u,h,p,_){return a(),t("div",null,s)}const k=e(n,[["render",c]]);export{f as __pageData,k as default}; diff --git a/assets/frontend_vue_update-process.md.MkXMZBqr.lean.js b/assets/frontend_vue_update-process.md.MkXMZBqr.lean.js new file mode 100644 index 000000000..97a0f04dc --- /dev/null +++ b/assets/frontend_vue_update-process.md.MkXMZBqr.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,V as o}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"Vue源码分析之视图更新","description":"Vue源码分析之视图更新","frontmatter":{"title":"Vue源码分析之视图更新","description":"Vue源码分析之视图更新","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/update-process.md","filePath":"frontend/vue/update-process.md","lastUpdated":1706247228000}'),n={name:"frontend/vue/update-process.md"},r=o("",4),s=[r];function c(i,d,u,h,p,_){return a(),t("div",null,s)}const k=e(n,[["render",c]]);export{f as __pageData,k as default}; diff --git a/assets/frontend_vue_vuex.md.ki4Nhn_g.js b/assets/frontend_vue_vuex.md.ki4Nhn_g.js new file mode 100644 index 000000000..3d6eceffa --- /dev/null +++ b/assets/frontend_vue_vuex.md.ki4Nhn_g.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as a,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"Vuex源码分析","description":"Vuex源码分析","frontmatter":{"title":"Vuex源码分析","description":"Vuex源码分析","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/vuex.md","filePath":"frontend/vue/vuex.md","lastUpdated":1706247228000}'),s={name:"frontend/vue/vuex.md"},r=e("h1",{id:"vuex源码分析",tabindex:"-1"},[n("Vuex源码分析 "),e("a",{class:"header-anchor",href:"#vuex源码分析","aria-label":'Permalink to "Vuex源码分析"'},"​")],-1),c=e("p",null,"写作中...",-1),d=e("p",null,"本质也是vue实例",-1),i=[r,c,d];function u(l,_,p,x,h,v){return a(),o("div",null,i)}const V=t(s,[["render",u]]);export{f as __pageData,V as default}; diff --git a/assets/frontend_vue_vuex.md.ki4Nhn_g.lean.js b/assets/frontend_vue_vuex.md.ki4Nhn_g.lean.js new file mode 100644 index 000000000..3d6eceffa --- /dev/null +++ b/assets/frontend_vue_vuex.md.ki4Nhn_g.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as a,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const f=JSON.parse('{"title":"Vuex源码分析","description":"Vuex源码分析","frontmatter":{"title":"Vuex源码分析","description":"Vuex源码分析","keywords":"vue组件创建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-vue.png"},"headers":[],"relativePath":"frontend/vue/vuex.md","filePath":"frontend/vue/vuex.md","lastUpdated":1706247228000}'),s={name:"frontend/vue/vuex.md"},r=e("h1",{id:"vuex源码分析",tabindex:"-1"},[n("Vuex源码分析 "),e("a",{class:"header-anchor",href:"#vuex源码分析","aria-label":'Permalink to "Vuex源码分析"'},"​")],-1),c=e("p",null,"写作中...",-1),d=e("p",null,"本质也是vue实例",-1),i=[r,c,d];function u(l,_,p,x,h,v){return a(),o("div",null,i)}const V=t(s,[["render",u]]);export{f as __pageData,V as default}; diff --git a/assets/frontend_wasm_base.md.h0kzz92d.js b/assets/frontend_wasm_base.md.h0kzz92d.js new file mode 100644 index 000000000..acdcfca4f --- /dev/null +++ b/assets/frontend_wasm_base.md.h0kzz92d.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as r,V as s}from"./chunks/framework.SV1ROkXV.js";const _=JSON.parse('{"title":"webassembly","description":"","frontmatter":{"title":"webassembly"},"headers":[],"relativePath":"frontend/wasm/base.md","filePath":"frontend/wasm/base.md","lastUpdated":1706247228000}'),t={name:"frontend/wasm/base.md"},l=s('

webassembly

// 待补充...

WebAssembly是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++和 Rust 等低级源语言提供一个高效的编译目标。

对于网络平台而言,这具有巨大的意义——这为客户端 app 提供了一种在网络平台以接近本地速度的方式运行多种语言编写的代码的方式;在这之前,客户端 app 是不可能做到的。

而且,你在不知道如何编写 WebAssembly 代码的情况下就可以使用它。WebAssembly 的模块可以被导入的到一个网络 app(或 Node.js)中,并且暴露出供 JavaScript 使用的 WebAssembly 函数。JavaScript 框架不但可以使用 WebAssembly 获得巨大性能优势和新特性,而且还能使得各种功能保持对网络开发者的易用性。

用途

使用

参考文档

',9),b=[l];function o(i,n,m,h,c,p){return r(),a("div",null,b)}const f=e(t,[["render",o]]);export{_ as __pageData,f as default}; diff --git a/assets/frontend_wasm_base.md.h0kzz92d.lean.js b/assets/frontend_wasm_base.md.h0kzz92d.lean.js new file mode 100644 index 000000000..35b807626 --- /dev/null +++ b/assets/frontend_wasm_base.md.h0kzz92d.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as r,V as s}from"./chunks/framework.SV1ROkXV.js";const _=JSON.parse('{"title":"webassembly","description":"","frontmatter":{"title":"webassembly"},"headers":[],"relativePath":"frontend/wasm/base.md","filePath":"frontend/wasm/base.md","lastUpdated":1706247228000}'),t={name:"frontend/wasm/base.md"},l=s("",9),b=[l];function o(i,n,m,h,c,p){return r(),a("div",null,b)}const f=e(t,[["render",o]]);export{_ as __pageData,f as default}; diff --git a/assets/frontend_webpack_base.md.ijd0DzJn.js b/assets/frontend_webpack_base.md.ijd0DzJn.js new file mode 100644 index 000000000..302080d13 --- /dev/null +++ b/assets/frontend_webpack_base.md.ijd0DzJn.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as c}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"webpack基本使用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/base.md","filePath":"frontend/webpack/base.md","lastUpdated":1706247228000}'),o={name:"frontend/webpack/base.md"},n=e("h1",{id:"webpack基本使用",tabindex:"-1"},[c("webpack基本使用 "),e("a",{class:"header-anchor",href:"#webpack基本使用","aria-label":'Permalink to "webpack基本使用"'},"​")],-1),r=e("p",null,"// 待补充...",-1),d=[n,r];function p(i,_,l,b,f,h){return s(),t("div",null,d)}const w=a(o,[["render",p]]);export{m as __pageData,w as default}; diff --git a/assets/frontend_webpack_base.md.ijd0DzJn.lean.js b/assets/frontend_webpack_base.md.ijd0DzJn.lean.js new file mode 100644 index 000000000..302080d13 --- /dev/null +++ b/assets/frontend_webpack_base.md.ijd0DzJn.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as c}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"webpack基本使用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/base.md","filePath":"frontend/webpack/base.md","lastUpdated":1706247228000}'),o={name:"frontend/webpack/base.md"},n=e("h1",{id:"webpack基本使用",tabindex:"-1"},[c("webpack基本使用 "),e("a",{class:"header-anchor",href:"#webpack基本使用","aria-label":'Permalink to "webpack基本使用"'},"​")],-1),r=e("p",null,"// 待补充...",-1),d=[n,r];function p(i,_,l,b,f,h){return s(),t("div",null,d)}const w=a(o,[["render",p]]);export{m as __pageData,w as default}; diff --git a/assets/frontend_webpack_webpack-analysis.md.0-mNgpgx.js b/assets/frontend_webpack_webpack-analysis.md.0-mNgpgx.js new file mode 100644 index 000000000..ce3159bc2 --- /dev/null +++ b/assets/frontend_webpack_webpack-analysis.md.0-mNgpgx.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,V as r}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"webpack原理分析","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/webpack-analysis.md","filePath":"frontend/webpack/webpack-analysis.md","lastUpdated":1706247228000}'),o={name:"frontend/webpack/webpack-analysis.md"},n=r('

webpack原理分析

// 待补充...

什么是loader

什么是plugin

整体流程

核心模块

运行时

',7),l=[n];function i(c,s,d,h,p,_){return t(),e("div",null,l)}const k=a(o,[["render",i]]);export{u as __pageData,k as default}; diff --git a/assets/frontend_webpack_webpack-analysis.md.0-mNgpgx.lean.js b/assets/frontend_webpack_webpack-analysis.md.0-mNgpgx.lean.js new file mode 100644 index 000000000..f7cba5ce2 --- /dev/null +++ b/assets/frontend_webpack_webpack-analysis.md.0-mNgpgx.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,V as r}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"webpack原理分析","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/webpack-analysis.md","filePath":"frontend/webpack/webpack-analysis.md","lastUpdated":1706247228000}'),o={name:"frontend/webpack/webpack-analysis.md"},n=r("",7),l=[n];function i(c,s,d,h,p,_){return t(),e("div",null,l)}const k=a(o,[["render",i]]);export{u as __pageData,k as default}; diff --git a/assets/frontend_webpack_webpack-loader.md.5SNt50qQ.js b/assets/frontend_webpack_webpack-loader.md.5SNt50qQ.js new file mode 100644 index 000000000..880ec1732 --- /dev/null +++ b/assets/frontend_webpack_webpack-loader.md.5SNt50qQ.js @@ -0,0 +1 @@ +import{_ as a,c as t,o,m as e,a as r}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"webpack自定义loader","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/webpack-loader.md","filePath":"frontend/webpack/webpack-loader.md","lastUpdated":1706247228000}'),c={name:"frontend/webpack/webpack-loader.md"},d=e("h1",{id:"webpack自定义loader",tabindex:"-1"},[r("webpack自定义loader "),e("a",{class:"header-anchor",href:"#webpack自定义loader","aria-label":'Permalink to "webpack自定义loader"'},"​")],-1),n=e("p",null,"// 待补充...",-1),s=[d,n];function p(l,i,_,k,b,f){return o(),t("div",null,s)}const m=a(c,[["render",p]]);export{h as __pageData,m as default}; diff --git a/assets/frontend_webpack_webpack-loader.md.5SNt50qQ.lean.js b/assets/frontend_webpack_webpack-loader.md.5SNt50qQ.lean.js new file mode 100644 index 000000000..880ec1732 --- /dev/null +++ b/assets/frontend_webpack_webpack-loader.md.5SNt50qQ.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o,m as e,a as r}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"webpack自定义loader","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/webpack-loader.md","filePath":"frontend/webpack/webpack-loader.md","lastUpdated":1706247228000}'),c={name:"frontend/webpack/webpack-loader.md"},d=e("h1",{id:"webpack自定义loader",tabindex:"-1"},[r("webpack自定义loader "),e("a",{class:"header-anchor",href:"#webpack自定义loader","aria-label":'Permalink to "webpack自定义loader"'},"​")],-1),n=e("p",null,"// 待补充...",-1),s=[d,n];function p(l,i,_,k,b,f){return o(),t("div",null,s)}const m=a(c,[["render",p]]);export{h as __pageData,m as default}; diff --git a/assets/frontend_webpack_webpack-node.md.3SEUjomz.js b/assets/frontend_webpack_webpack-node.md.3SEUjomz.js new file mode 100644 index 000000000..1c1760e7e --- /dev/null +++ b/assets/frontend_webpack_webpack-node.md.3SEUjomz.js @@ -0,0 +1 @@ +import{_ as a,c as t,o,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"webpack结合nodejs使用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/webpack-node.md","filePath":"frontend/webpack/webpack-node.md","lastUpdated":1706247228000}'),c={name:"frontend/webpack/webpack-node.md"},s=e("h1",{id:"webpack结合nodejs使用",tabindex:"-1"},[n("webpack结合nodejs使用 "),e("a",{class:"header-anchor",href:"#webpack结合nodejs使用","aria-label":'Permalink to "webpack结合nodejs使用"'},"​")],-1),d=e("p",null,"// 待补充...",-1),r=[s,d];function p(i,_,l,k,b,f){return o(),t("div",null,r)}const m=a(c,[["render",p]]);export{h as __pageData,m as default}; diff --git a/assets/frontend_webpack_webpack-node.md.3SEUjomz.lean.js b/assets/frontend_webpack_webpack-node.md.3SEUjomz.lean.js new file mode 100644 index 000000000..1c1760e7e --- /dev/null +++ b/assets/frontend_webpack_webpack-node.md.3SEUjomz.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"webpack结合nodejs使用","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/webpack-node.md","filePath":"frontend/webpack/webpack-node.md","lastUpdated":1706247228000}'),c={name:"frontend/webpack/webpack-node.md"},s=e("h1",{id:"webpack结合nodejs使用",tabindex:"-1"},[n("webpack结合nodejs使用 "),e("a",{class:"header-anchor",href:"#webpack结合nodejs使用","aria-label":'Permalink to "webpack结合nodejs使用"'},"​")],-1),d=e("p",null,"// 待补充...",-1),r=[s,d];function p(i,_,l,k,b,f){return o(),t("div",null,r)}const m=a(c,[["render",p]]);export{h as __pageData,m as default}; diff --git a/assets/frontend_webpack_webpack-plugin.md.9Iz9sFjv.js b/assets/frontend_webpack_webpack-plugin.md.9Iz9sFjv.js new file mode 100644 index 000000000..62500c440 --- /dev/null +++ b/assets/frontend_webpack_webpack-plugin.md.9Iz9sFjv.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as c,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"webpack自定义插件","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/webpack-plugin.md","filePath":"frontend/webpack/webpack-plugin.md","lastUpdated":1706247228000}'),o={name:"frontend/webpack/webpack-plugin.md"},p=e("h1",{id:"webpack自定义插件",tabindex:"-1"},[n("webpack自定义插件 "),e("a",{class:"header-anchor",href:"#webpack自定义插件","aria-label":'Permalink to "webpack自定义插件"'},"​")],-1),r=e("p",null,"// 待补充...",-1),s=[p,r];function d(i,l,_,k,b,f){return c(),t("div",null,s)}const m=a(o,[["render",d]]);export{h as __pageData,m as default}; diff --git a/assets/frontend_webpack_webpack-plugin.md.9Iz9sFjv.lean.js b/assets/frontend_webpack_webpack-plugin.md.9Iz9sFjv.lean.js new file mode 100644 index 000000000..62500c440 --- /dev/null +++ b/assets/frontend_webpack_webpack-plugin.md.9Iz9sFjv.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as c,m as e,a as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"webpack自定义插件","description":"","frontmatter":{},"headers":[],"relativePath":"frontend/webpack/webpack-plugin.md","filePath":"frontend/webpack/webpack-plugin.md","lastUpdated":1706247228000}'),o={name:"frontend/webpack/webpack-plugin.md"},p=e("h1",{id:"webpack自定义插件",tabindex:"-1"},[n("webpack自定义插件 "),e("a",{class:"header-anchor",href:"#webpack自定义插件","aria-label":'Permalink to "webpack自定义插件"'},"​")],-1),r=e("p",null,"// 待补充...",-1),s=[p,r];function d(i,l,_,k,b,f){return c(),t("div",null,s)}const m=a(o,[["render",d]]);export{h as __pageData,m as default}; diff --git a/assets/fullstack_base.md.vQ985qV_.js b/assets/fullstack_base.md.vQ985qV_.js new file mode 100644 index 000000000..516f4a1cd --- /dev/null +++ b/assets/fullstack_base.md.vQ985qV_.js @@ -0,0 +1 @@ +import{_ as s,c,J as t,V as l,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"全栈开发","description":"分享热门的后端知识包括不限于Java、nginx、MySQL、k8s、docker等等","frontmatter":{"title":"全栈开发","description":"分享热门的后端知识包括不限于Java、nginx、MySQL、k8s、docker等等","keywords":"Java基础,nginx服务,mysql,k8s,docker,gitlab,cicd等等"},"headers":[],"relativePath":"fullstack/base.md","filePath":"fullstack/base.md","lastUpdated":1706247228000}'),n={name:"fullstack/base.md"},i=l('

To Fullstack

空山无人,水流花开

转载须知

本博客文章允许大家转载,需要注明出处并提供源文章链接,对于标注不允许转载的,请联系本人。

本模块记录了本人所有全栈知识技能,包括不限于后端、运维等技术。如果你是个专业的「前端工程师」,学习服务端技术不仅可以提高我们的知识技能拓宽视野,同时也能提升你的前端架构思想,写一份更优质的代码,比如设计模式、算法、容器化、CI/CD等等。

如果你觉得本博客让您有所收益,麻烦您在GitHub给我个star,支持我不断更新。您也可以将本博客分享出去,让更多同学看到!

由于工作原因,写作时间有限,尽力更新中...

',6);function p(_,d,k,u,m,f){const e=a("Reward"),o=a("Gitalk");return r(),c("div",null,[i,t(e),t(o)])}const g=s(n,[["render",p]]);export{h as __pageData,g as default}; diff --git a/assets/fullstack_base.md.vQ985qV_.lean.js b/assets/fullstack_base.md.vQ985qV_.lean.js new file mode 100644 index 000000000..300c5f0e8 --- /dev/null +++ b/assets/fullstack_base.md.vQ985qV_.lean.js @@ -0,0 +1 @@ +import{_ as s,c,J as t,V as l,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"全栈开发","description":"分享热门的后端知识包括不限于Java、nginx、MySQL、k8s、docker等等","frontmatter":{"title":"全栈开发","description":"分享热门的后端知识包括不限于Java、nginx、MySQL、k8s、docker等等","keywords":"Java基础,nginx服务,mysql,k8s,docker,gitlab,cicd等等"},"headers":[],"relativePath":"fullstack/base.md","filePath":"fullstack/base.md","lastUpdated":1706247228000}'),n={name:"fullstack/base.md"},i=l("",6);function p(_,d,k,u,m,f){const e=a("Reward"),o=a("Gitalk");return r(),c("div",null,[i,t(e),t(o)])}const g=s(n,[["render",p]]);export{h as __pageData,g as default}; diff --git a/assets/fullstack_docker_base-tutorial.md.HbViEf-l.js b/assets/fullstack_docker_base-tutorial.md.HbViEf-l.js new file mode 100644 index 000000000..54aba1916 --- /dev/null +++ b/assets/fullstack_docker_base-tutorial.md.HbViEf-l.js @@ -0,0 +1,113 @@ +import{_ as l,c as o,J as s,V as p,o as c,G as a}from"./chunks/framework.SV1ROkXV.js";const F=JSON.parse('{"title":"Docker基础教程","description":"docker架构、镜像、容器、仓库使用指南","frontmatter":{"title":"Docker基础教程","description":"docker架构、镜像、容器、仓库使用指南","keywords":"docker架构,docker命令,docker镜像,docker仓库,docker构建镜像,docker文件传输","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/base-tutorial.md","filePath":"fullstack/docker/base-tutorial.md","lastUpdated":1706247228000}'),r={name:"fullstack/docker/base-tutorial.md"},t=p(`

Docker基础教程

Docker 是一个开源的容器化平台,可以帮助开发者和运维人员更快地构建、发布和运行应用程序。Docker 使用容器技术,将应用程序和其依赖项打包到一个可移植的容器中,从而实现跨平台、快速部署和易于管理的目的。

本文主要从docker的基础开始学习,包括基本架构、全局命令、镜像、仓库、容器

Docker架构

Docker 架构分为客户端-服务器架构主从架构,具体如下:

客户端-服务器架构:也称为C/S架构,Docker 采用客户端-服务器架构,其中客户端是 Docker 命令行工具,用于与 Docker 服务端通信。Docker 服务端是 Docker 引擎,负责管理和运行 Docker 容器。客户端和服务端可以运行在同一台机器上,也可以通过网络连接运行在不同的机器上。

主从架构:集群模式,Docker Swarm 是一个用于管理多个 Docker 容器的集群工具,采用主从架构。Docker Swarm 集群由一个管理节点和多个工作节点组成,管理节点负责整个集群的管理和调度,工作节点负责运行 Docker 容器。管理节点和工作节点可以运行在同一台机器上,也可以通过网络连接运行在不同的机器上。

全局命令

  1. 查看docker版本
    sh
    docker version
  2. 查看docker详细信息
    sh
    docker info
  3. 查看docker磁盘使用情况
    sh
     docker system df
    +TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
    +Images          12        5         4.138GB   713.6MB (17%)
    +Containers      5         0         2.634MB   2.634MB (100%)
    +Local Volumes   24        2         649.6MB   607.7MB (93%)
    +Build Cache     0         0         0B        0B
  4. 查看docker server的实时信息,我们从架构可以知道docker是基于C/S架构的,docker server端负责管理和运行docker容器,我们可以查看其具体的操作步骤,先使用以下命令开始监听server端,然后新开一个终端,启动或停止容器查看输出:
    sh
    docker system events
    +
    +# 示例
    +2020-03-26T10:53:23.497642694+08:00 container kill 999511b43ca0ffa61979ccb6561ff20f499b087be99aba95836cee20edb794a3 (image=nginx:1.15.3, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=nginx, signal=15)
    +2020-03-26T10:53:23.936509503+08:00 network disconnect 3d9d929e9d34b4c776d993158c3bd8c6074fea2e1de0ab43c846e571c1191711 (container=999511b43ca0ffa61979ccb6561ff20f499b087be99aba95836cee20edb794a3, name=bridge, type=bridge)
    +2020-03-26T10:53:23.953543859+08:00 container stop 999511b43ca0ffa61979ccb6561ff20f499b087be99aba95836cee20edb794a3 (image=nginx:1.15.3, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=nginx)
    +2020-03-26T10:53:23.958016229+08:00 container die 999511b43ca0ffa61979ccb6561ff20f499b087be99aba95836cee20edb794a3 (exitCode=0, image=nginx:1.15.3, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=nginx)
  5. 查看对象的详细信息,可以查看指定镜像、容器等等
    sh
    docker inspect [name|ID]

核心组件

  • 镜像(Image):一个root文件系统的模板,相当于 一个类
  • 容器(Container):docker run 镜像就是容器(最小的linux内核文件和运行的应用程序),镜像和容器的关系,就像是面向对象程序设计中的 实例一样,镜像是静态的定义,容器是镜像运行时的实体
  • 仓库(Repositry):保存镜像的仓库,每个仓库可以包含多个Tag,对应不同的镜像

镜像

Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。

对于linux而言,内核启动后会挂载root文件系统为用户提供空间支持,如一个基本的centos镜像就包含了一套完整的centos的root文件系统。

镜像最重要的概念就是镜像层,以及它的存储原理。

镜像层

docker-layer

Docker 使用UnionFS(联合文件系统)来实现镜像层之间的共享和复用,从而节省存储空间和加速构建过程。UnionFS 是一种基于文件系统的技术,它能够将多个不同的文件系统合并成为一个虚拟的文件系统。

在 Docker 中,UnionFS 主要由以下三个部分组成:

  • 基础文件系统:Docker镜像中的每个层都有一个基础文件系统,它是一个只读的文件系统,包含了镜像的构建信息和运行时所需要的依赖项。
  • 容器文件系统:Docker容器层有一个可读写的容器文件系统,它是由基础文件系统和其他层共同组成的。当容器启动时,Docker 会将容器文件系统挂载到主机上,使其在主机上可以被访问和修改。
  • UnionFS:UnionFS将多个文件系统合并成为一个虚拟的文件系统,使得用户可以看到一个统一的文件系统结构。Docker使用UnionFS来管理镜像层之间的依赖关系和共享信息,从而实现镜像的复用和节省存储空间的目的。

BootFS 文件系统是一个只读的文件系统,它位于 Docker 镜像的最底层。当 Docker 启动容器时,它会将 BootFS 文件系统加载到内存中,并在其上启动操作系统。操作系统启动后,Docker 会将其他文件系统(如容器层和其他镜像层)挂载到操作系统上,使得容器中的应用程序可以访问这些文件系统中的文件和数据。

在使用 UnionFS 时,Docker 会将各个镜像层以只读的方式合并到一个虚拟的文件系统中,然后再将容器层以可读写的方式挂载到虚拟文件系统上。这样,容器就能够访问和修改虚拟文件系统中的内容,而对于只读的镜像层,则不会被修改,从而实现了镜像的共享和复用。

总的来说,Docker 使用 UnionFS 技术来实现镜像层之间的共享和复用,从而节省存储空间和加速构建过程。UnionFS 技术能够将多个文件系统合并成为一个虚拟的文件系统,并且支持只读和可读写两种模式,使得用户可以看到一个统一的文件系统结构。

查看本地镜像

sh
# 命令
+docker images [options] [REPOSITORY[:TAG]]
+
+# 列出所有镜像
+ docker images
+REPOSITORY       TAG         IMAGE ID       CREATED         SIZE
+alpine           latest      8e1d7573f448   16 months ago   5.33MB
+nginx            1.15.3      c5e5a72af32f   4 years ago     103MB
+
+ docker images --filter reference=nginx
+REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
+nginx        1.15.3    c5e5a72af32f   4 years ago   103MB

以上会以表格的方式列表镜像,其中包含了镜像仓库、标签、镜像ID、创建时间、大小等等,上面列出了alpinenginx两个镜像

常用的参数:

  • -a:显示所有镜像中间层镜像
  • -q:只输出镜像ID
  • --filter:筛选镜像
    • dangling=true|false:显示有无使用的镜像
    • reference=<镜像名>:根据名字或标签进行筛选镜像
  • --format:以哪种格式输出,table、json、TEMPLATE,默认table

搜索、下载、推送

  1. 搜索镜像

    sh
    docker search imageName [options]
    +
    + docker search nginx --limit 2
    +NAME            DESCRIPTION                  STARS     OFFICIAL   AUTOMATED
    +nginx           Official build of Nginx.     18278     [OK]
    +bitnami/nginx   Bitnami nginx Docker Image   155                  [OK]

    搜索镜像会默认从官方的docker registry进行搜索,你可以使用--limit参数限制搜索数

  2. 下载

    sh
    # 下载,没有tag时默认 latest
    +docker pull imageName:tag
    +# 下载nginx
    +docker pull nginx
  3. 推送

    镜像推送指将本地的镜像推送到远程仓库,如将项目代码提交到远程的git仓库,推送首先要登录

    sh
    # 登录
    +docker login
    +# 推送
    +docker push imageName:tag

创建、删除

  1. 创建

    创建新镜像的方式有很多,可以通过打新的标签、commit、Dockerfile来创建新镜像

    sh
    # 通过打新标签
    +docker tag nginx:1.1 nginx-me:v1
    +# 通过commit
    +docker commit container imageName:tag
    +# 通过Dockerfile
    +docker build -t imageName:tag .

    有关Dockerfile的概念和使用可以查看我的「使用Dockerfile构建镜像」一文

  2. 删除

    sh
    # 删除
    +docker image rm image ... / docker rmi image ...
    +# 删除latest版本nginx
    +docker rmi nginx
    +# 删除所有镜像
    +docker rmi $(docker images -qa)
    +# 删除虚悬镜像(虚悬镜像看以下部分)
    +docker image prune

其他命令

sh
# 将镜像导出为 tar文件
+docker save imageName > file.tar
+# 解压镜像
+docker load -i file.tar
+# 查看镜像构建历史
+docker history imageName
+# 查看镜像详细信息
+docker inspect imageName

虚悬镜像

Docker 虚悬镜像(dangling image)指的是没有被任何容器使用的镜像。在 Docker 中,每个新构建的镜像都会创建一个新的镜像 ID,并且旧的镜像 ID 会被保留在本地。当使用 docker images 命令查看本地镜像列表时,可能会看到一些虚悬镜像,它们的 REPOSITORY 和 TAG 字段显示为 <none>

虚悬镜像可能是由于以下原因导致的:

  • 构建新版本的镜像时,旧的镜像 ID 会被保留在本地,而新的镜像 ID 会覆盖旧的镜像 ID。
  • 删除容器时,容器所依赖的镜像不会被自动删除,因此可能会留下一些虚悬镜像。
  • 在使用docker rmi命令删除镜像时,如果没有指定正确的镜像ID或名称,也可能会删除不正确的镜像,从而产生虚悬镜像。

举一个重复构建同名同tag的nginx镜像:

sh
 docker images --filter reference=nginx
+REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
+nginx        1.15.3    c5e5a72af32f   4 years ago   103MB
+
+# 启动容器
+ docker run -d --name nginx nginx:1.15.3
+1453e55d41100b57f5f76ed036f65276e311db36c4f3e9afd3fce49a25c4f8b8
+
+# 打一个新镜像
+ docker commit nginx nginx:1.15.3
+sha256:db2d3fa0bcb45bdc528960d1b06eb68496f044896d901e23d79bb1e54af56b9e
+
+# 重新查看
+ docker images --filter reference=nginx
+REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
+nginx        1.15.3    db2d3fa0bcb4   52 seconds ago   103MB
+nginx        <none>    c5e5a72af32f   4 years ago      103MB

容器

容器是镜像的运行实例。Docker 容器是一个动态的环境,通过在镜像之上创建一个运行实例,可以启动和运行应用程序。容器是一个具有生命周期的实体,可以被创建、启动、停止、删除和迁移等操作。

容器可以通过镜像来创建。在 Docker 中,通过 Dockerfile 或者其他方式创建一个镜像,然后通过这个镜像来创建一个或多个容器实例。这些容器实例都是基于同一个镜像创建的,但它们之间是相互独立的,拥有自己的文件系统、网络和进程空间。

容器可以通过修改来生成新的镜像。在容器运行时,可以对容器内部的文件系统进行修改,如添加、删除、修改文件等。这些修改可以通过 Docker commit 命令来保存为一个新的镜像,以便后续使用。

启动

启动 Docker 容器需要使用 docker run 命令,该命令用于创建和启动一个新的 Docker 容器实例。下面是 docker run 命令的一些常用选项和参数:

sh
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

其中,OPTIONS 是一些可选的命令选项,IMAGE 是要创建容器的镜像名称或 IDCOMMAND 是容器启动后要运行的命令,ARG 是命令的参数。一些常用的选项包括:

  • -d:后台运行容器
  • -it:交互运行,并分配一个容器伪终端
  • -p:指定容器的端口映射
  • -v:指定容器与主机之间的文件共享
  • --name:为容器指定一个名称
  • -e:设置容器的环境变量
  • --rm:退出后删除容器

这里是docker run的几个小例子:

sh
# 后台运行nginx,容器命名nginx,映射宿主机端口 8080到nginx容器的80端口
+docker run -d --name nginx -p 8080:80 nginx
+
+# 使用交互式运行centos容器,exit退出后 自动删除容器
+docker run -it --rm centos /bin/bash
+
+# 启动nginx 并将 nginx容器内部的 nginx静态文件路径挂载到宿主机上指定位置
+docker run -v /somedir/data:/etc/share/nginx/html nginx

以上便是docker run启动一个新容器的基本玩法,除了新启动一个容器外,还可以使用docker start启动一个已经停止的容器或docker restart重启一个容器

sh
docker start nginx
+docker restart nginx

进入容器

docker exec命令用于在运行中的Docker容器中执行命令。该命令可以让用户在运行中的容器中打开一个新的终端,以执行任意的命令或者进入容器内部进行交互式操作。以下是docker exec命令的基本语法:

sh
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

其中,OPTIONS是可选参数,CONTAINER 是要执行命令的容器名称或 IDCOMMAND 是要在容器中执行的命令,ARG是命令的参数。

除了使用docker exec外,docker还支持docker attach用于连接到正在运行中的Docker容器的标准输入、输出和错误流(即 STDIN、STDOUT 和 STDERR)。这个命令可以让用户实时地查看容器中的输出信息

sh
 docker attach nginx
+192.168.10.1 - - [26/Mar/2020:02:15:38 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" "-"

当使用Ctrl + C时会退出容器并停止容器的运行,官方建议使用docker exec进入容器做一些高级的操作

容器列表

当容器运行后可以在容器列表中看到,要查看当前系统中正在运行的 Docker 容器列表,可以使用 docker ps 命令。该命令显示了所有正在运行的容器的相关信息,如容器 ID、镜像名称、容器名称、启动时间、状态等。以下是一些常用的 docker ps 命令选项:

  • -a:显示所有容器,包括已经停止的容器
  • -q:只显示容器的 ID
  • --no-trunc:显示完整的容器 ID
  • -s:显示容器的磁盘使用情况
  • --filter:基于条件过滤输出
sh
# docker ps -as
+CONTAINER ID   IMAGE           COMMAND               CREATED         STATUS        PORTS     NAMES    SIZE
+ff21fc7bdfbe   nginx:1.15.3  "nginx -g 'daemon of…"  54 seconds ago  Up 53 seconds 80/tcp    nginx    2B (virtual 103MB)
+
+# 只显示nginx
+docker ps --filter name=nginx

可以通过查看容器列表容器的状态查看启动的容器有没有正常运行,除了这种方式还可以通过容器的日志,查看内部运行的细节

容器日志

docker logs命令用于查看Docker容器的日志信息。该命令可以查看容器的标准输出和标准错误输出,以及容器内部运行的进程的日志信息。以下是 docker logs 命令的语法:

sh
docker logs [OPTIONS] CONTAINER

其中,OPTIONS 是一些可选的命令选项,CONTAINER 是要查看日志的容器名称或 ID。一些常用的选项包括:

  • -f:实时跟踪容器的日志输出
  • --tail:指定显示最后几行日志,默认为所有日志
  • --since:指定显示从某个时间戳开始的日志
  • --until:指定显示到某个时间戳结束的日志
sh
# 实时查看nginx的日志
+ docker logs -f nginx
+192.168.10.1 - - [26/Mar/2020:01:06:35 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" "-"
+2020/03/26 01:06:35 [error] 7#7: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.10.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.10.10:8088", referrer: "http://192.168.10.10:8088/"

通过docker logs可以很看到内部运行的详细日志,对于自己的容器需要做好日志的输出方便查看日志和错误追溯

停止

容器起来后不想运行了怎么办,可以使用停止命令停止正在运行的容器,使用该命令会发送一个 SIGTERM 信号给容器中运行的主进程,请求其停止运行,并等待一定时间(默认为10秒)让容器中的进程进行清理和保存工作。如果在指定的时间内容器中的进程仍未停止,则会发送一个 SIGKILL 信号,强制终止容器中的进程

sh
docker stop [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS 是一些可选的命令选项,CONTAINER 是要停止的一个或多个容器名称或 ID。一些常用的选项包括:

  • -t:指定等待容器停止的时间,单位为秒,默认10s
  • --signal:发送给容器的信号

除了docker stop命令,以前还可以使用docker kill命令,不过已经被废弃掉

删除

docker rm 命令用于删除已经停止的 Docker 容器。该命令只能删除已经停止的容器,如果要删除正在运行的容器,需要先使用docker stop命令停止容器。以下是 docker rm 命令的语法:

sh
docker rm [OPTIONS] CONTAINER [CONTAINER...]

其中,OPTIONS 是一些可选的命令选项,CONTAINER 是要删除的一个或多个容器名称或 ID。一些常用的选项包括:

  • -f:强制删除容器,即使容器正在运行
  • -v:同时删除与容器关联的卷(volume)
sh
# 强制删除正在运行的nginx容器
+docker rm -f nginx

除了docker rm命令外,还可以使用docker ps prune命令来删除所有已经停止的容器并释放容器占用的资源,不过一般不常用,毕竟已经停止的容器一般倒不是不需要的:

sh
# 强制删除所有容器
+docker ps prune -f

导入导出

Docker 容器的导入导出可以用于将一个容器的文件系统打包成一个 tar 文件,并在另一台机器上重新导入为一个新的 Docker 镜像。这种方式可以方便地将一个容器迁移到另一台机器上,或者分享容器镜像给其他人使用。

WARNING

  1. 导出的 tar 文件只包含容器的文件系统,并不包含容器的元数据(如容器的名称、ID、端口等信息)

  2. 导入的镜像只包含容器的文件系统,不包含容器的元数据和启动命令等信息

  3. 导出的 tar 文件和导入的镜像都是针对单个容器的,不包含容器依赖的镜像和容器的运行环境等信息。如果要迁移一个应用程序,需要将所有相关的容器和镜像一起导出导入

  1. 导出容器的文件系统为一个 tar 文件,使用 docker export 命令导出容器的文件系统为一个 tar 文件。例如,要将名为 mycontainer 的容器的文件系统导出为一个 mycontainer.tar 文件,可以使用以下命令:
sh
docker export mycontainer > mycontainer.tar
  1. 导入容器的文件系统为一个镜像,使用 docker import 命令将 tar 文件导入为一个新的 Docker 镜像。例如,要将名为 mycontainer.tar 的 tar 文件导入为一个名为 myimage 的 Docker 镜像,可以使用以下命令:
sh
docker import mycontainer.tar myimage

仓库

Docker Registry 是 Docker 平台的一个核心组件,它是一个用于存储、分发和管理 Docker 镜像的服务器端应用程序。Docker Registry 允许用户将本地创建的镜像上传到 Registry 中,并可以从 Registry 中下载和使用其他用户共享的镜像。它可以简化 Docker 镜像的管理和分发,提高应用的部署效率和可靠性。同时,Docker Registry 还提供了一系列的管理工具和服务,如 Docker Trusted Registry(DTR)、Harbor 等,可以帮助用户更好地管理和保护 Docker 镜像,确保安全和可靠性。

Docker Registry 可以分为两种类型:公共Registry私有Registry

每个registry中包含多个仓库,我们本地的registry其实也是这样,每个仓库有多个tag来表示不同版本的仓库镜像,你可以将registry看做是一个gitlab,gitlab中的每个仓库代表着每个镜像,仓库的tag表示镜像的版本

公有仓库

公共 Registry 是由 Docker 公司维护的一组公共镜像仓库,其中最著名的是 Docker Hub。Docker Hub 是一个公共的 Docker Registry,包含了大量的 Docker 镜像,开发者可以通过 Docker Hub 来获取和分享 Docker 镜像。

Docker 公开仓库的镜像完整地址由三个部分组成:仓库地址、镜像名称和镜像标签。

其中,仓库地址指的是 Docker 镜像仓库的地址,Docker 官方的公开仓库地址为 docker.io,也可以使用其他的镜像仓库地址。镜像名称是指 Docker 镜像的名称,通常由两部分组成,即镜像的命名空间和镜像的名称,中间使用斜杠 / 隔开。例如,library/nginx 表示 Docker 官方的 nginx 镜像。镜像标签是指镜像的版本号或标识符,用冒号 : 隔开。例如,library/nginx:latest 表示最新版本的 Docker 官方的 nginx 镜像。

sh
# 本地已经存在了 nginx:1.15.3
+ docker images | grep nginx
+nginx  1.15.3  c5e5a72af32f  4 years ago  103MB
+
+# 重新用完整的地址下载nginx:1.15.3,再次查看还是那个nginx
+docker pull docker.io/library/nginx:1.15.3

私有仓库

私有 Registry 是指由用户自己搭建的 Docker 镜像仓库,用于存储和管理自己创建的 Docker 镜像。私有 Registry 可以在内部部署,也可以在公有云上部署,如 Amazon Web Services、Microsoft Azure 和 Google Cloud Platform 等。

博客中也介绍了关于私有仓库的搭建,你可以去阅读我的「搭建docker私有仓库」一文去了解完整的私库搭建过程。

认证

Docker 仓库认证是一种基于用户名和密码的身份验证机制,用于保护Docker镜像仓库中的镜像资源,防止未经授权的用户访问和下载镜像

  1. 可以使用命令行登录:

    sh
    docker login [OPTIONS] [SERVER]

    其中OPTIONSSERVER是可选部分,OPTIONS 的参数包括:

    • -u:登录的用户名
    • -p:登录密码 SERVER 则是仓库的地址,默认是docker官方的仓库地址 你可以这样使用:
    sh
    # 一键式登录  ====>   官方不推荐,密码会暴露😂
    +docker login -u root -p password [url]
    +
    +# 交互式
    +docker login [url]
    +Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
    +Username: root
    +Password:
  2. 直接在docker的$HOME/.docker/config.json中配置仓库地址和登录凭证,通过命令行登录后,会在你的$HOME/.docker/config.json文件中添加仓库和登录凭证,你可以直接在此文件中添加你想要登录的地址和密码,如果没有此文件自行创建即可,配置文件如下:

    json
    {
    +"auths": {
    +	// 仓库地址,这里是官方地址
    +	"https://index.docker.io/v1/": {
    +		// 凭证
    +		"auth": "aWhlbmdzaHVhaToxMjM0NTYK"
    +	},
    +	// 其他仓库
    +	"192.168.10.10:8000": {
    +		"auth": "aWhlbmdzaHVhaToxMjM0NTYK"
    +	},
    +}
    +}

    上面的配置文件中存在两个仓库地址,当使用docker login时如果不指明地址默认会登录官方仓库,在登录时docker会检查本地的$HOME/.docker/config.json中是否存在已经登录的凭证,如果存在会直接登录,否则会和第一步一样重新输入账号、密码。

    以上的auth值其实就是账户:密码的base64结果,其加密结果并不安全,可以通过base64反解码出来,我们试下:

    sh
     echo 'aWhlbmdzaHVhaToxMjM0NTYK' | base64 --decode
    +ihengshuai:123456

    所以不要轻易将加密后的密码泄露掉

  3. 退出登录

    sh
    docker logout [SERVER]

    退出后同样会删除$HOME/.docker/config.json中对应的仓库地址和密码

总结

本文从docker的架构、全局命令、镜像、容器和仓库入门,简单的介绍了docker的基本使用,这些命令基本上囊括了docker常见的命令行使用方式,需要大家多多使用才能熟练,虽然docker的命令在生产环境的使用几率不是很多,但是对于我们快速启动一个想要的环境或验证一些想法都是非常友好的,总之熟能生巧。

`,110);function i(d,y,b,u,C,D){const n=a("Reward"),e=a("Gitalk");return c(),o("div",null,[t,s(n),s(e)])}const h=l(r,[["render",i]]);export{F as __pageData,h as default}; diff --git a/assets/fullstack_docker_base-tutorial.md.HbViEf-l.lean.js b/assets/fullstack_docker_base-tutorial.md.HbViEf-l.lean.js new file mode 100644 index 000000000..a2aa42e8e --- /dev/null +++ b/assets/fullstack_docker_base-tutorial.md.HbViEf-l.lean.js @@ -0,0 +1 @@ +import{_ as l,c as o,J as s,V as p,o as c,G as a}from"./chunks/framework.SV1ROkXV.js";const F=JSON.parse('{"title":"Docker基础教程","description":"docker架构、镜像、容器、仓库使用指南","frontmatter":{"title":"Docker基础教程","description":"docker架构、镜像、容器、仓库使用指南","keywords":"docker架构,docker命令,docker镜像,docker仓库,docker构建镜像,docker文件传输","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/base-tutorial.md","filePath":"fullstack/docker/base-tutorial.md","lastUpdated":1706247228000}'),r={name:"fullstack/docker/base-tutorial.md"},t=p("",110);function i(d,y,b,u,C,D){const n=a("Reward"),e=a("Gitalk");return c(),o("div",null,[t,s(n),s(e)])}const h=l(r,[["render",i]]);export{F as __pageData,h as default}; diff --git a/assets/fullstack_docker_docker-compose.md.pk2z5mQl.js b/assets/fullstack_docker_docker-compose.md.pk2z5mQl.js new file mode 100644 index 000000000..5f566453a --- /dev/null +++ b/assets/fullstack_docker_docker-compose.md.pk2z5mQl.js @@ -0,0 +1,171 @@ +import{_ as e,c as p,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"使用DockerCompose部署服务","description":"Docker Compose是一种用于定义和运行多个Docker容器应用程序的工具,通过简单的方式来管理多个Docker容器,使得开发人员可以更加专注于应用程序的开发,而不需要关注底层的容器管理细节","frontmatter":{"title":"使用DockerCompose部署服务","description":"Docker Compose是一种用于定义和运行多个Docker容器应用程序的工具,通过简单的方式来管理多个Docker容器,使得开发人员可以更加专注于应用程序的开发,而不需要关注底层的容器管理细节","keywords":"docker-compose,docker集群,docker服务部署,docker镜像,docker网络","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/docker-compose.md","filePath":"fullstack/docker/docker-compose.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/docker-compose.md"},t=o(`

使用DockerCompose部署服务

以前我们总是用命令管理每个容器的启动、停止等等,若有多个容器时可能还存在启动优先级的问题,那就要等到指定的容器启动后再去启动另一个容器,对于整体的应用服务管理极其不方便,简单的docker run命令更适合初学者或者调试使用, docker提供docker compose来解决多容器部署。

Docker Compose是Docker官方提供的一个工具,它允许用户通过配置文件定义和运行多个 Docker 容器,以便更轻松地管理 Docker 应用程序的部署和运行。Docker Compose 可以让用户在单个主机上运行多个容器,也可以在多个主机上运行同一组容器,并且可以实现容器之间的相互通信和协作。

优势

相比启动单个容器,使用docker compose有以下优势:

  • 简化多容器应用部署: Docker Compose 可以将多个容器的部署、启动、停止、删除等操作集成到一起,以便简化多容器应用的部署和管理。
  • 统一配置管理: Docker Compose 允许用户使用 YAML 文件定义容器的配置,从而实现容器的统一管理。这使得在多容器应用中对于环境变量、网络设置、端口映射等配置的管理更加方便和统一。
  • 容器之间的通信: Docker Compose 允许用户自定义容器之间通信的网络,容器之间可以直接通信,方便了应用程序的开发和部署。
  • 可重复性和可移植性: 使用 Docker Compose 可以将应用程序的部署过程进行标准化,降低了部署过程中的错误率。同时,Docker Compose 配置文件可以在不同的环境中使用,从而实现应用程序的可移植性。
  • 管理多个环境: Docker Compose 可以对不同的环境进行管理,比如开发环境、测试环境和生产环境,从而方便了应用程序的开发和测试。

初识DockerCompose

Docker Compose 配置文件是一个 YAML 格式的文件,用于定义多个 Docker 容器的配置和关系。下面是一个简单的 Docker Compose 配置文件示例:

yaml
version: '3'
+services:
+  web:
+    build:
+    	context: .
+    	dockerfile: Dockerfile.web
+    ports:
+      - "8080:80"
+    depends_on:
+    	- redis
+  redis:
+    image: "redis:alpine"

在这个示例配置文件中,version 字段指定了 Docker Compose 的版本号,services 字段用于定义多个 Docker 容器。在 services 字段中,每个容器都是一个子字段,其键名是容器的名称,其值是一个包含容器配置的键值对。

在示例配置文件中,定义了两个容器 web 和 redis,其中:

  1. web 容器使用本地 Dockerfile.web 配置文件构建镜像,将容器的 80 端口映射到主机的 8080 端口,其依赖redis的启动后才会启动自己
  2. redis 容器使用 Redis 官方镜像,并使用 Alpine 版本,没有指定其他特殊的配置。

从以上可以看出docker compose是将整个应用的所有容器全部写在了同一个配置文件中,其也会自动管理容器的启动先后顺序,而对于配置文件的管理也更加方便,接下来看下其常用语法。

语法

docker compose的配置是个yaml文件,在配置文件中容器将作为服务部署,docker compose帮我们统一管理这些服务,包括镜像、启动顺序、网络、数据卷、端口、重启策略等等。配置中services、networks、volumes等这些都可以在最顶端定义表示需要创建的全局network、volume等等。

services

在Docker Compose中,services是定义容器的基本单位

语法:

yaml
services:
+  <service_name>:
+    <service_config>

其中,<service_name>是服务名称,可以任意命名,但建议使用有意义的名称。<service_config>是服务的配置信息,包含了运行服务所需的所有信息,如镜像、容器名称、端口映射、环境变量等。

例子:

yaml
version: '3'
+services:
+  web:
+    image: nginx
+    ports:
+      - "8080:80"

image

services中的每个容器都是一个服务,其都会包含镜像文件。镜像可以指定第三方的,也可以使用本地Dockerfile进行构建

语法:

yaml
# 省略其他...
+<service_config>
+  # 使用第三方
+  image: nginx:alpine
+
+  # 本地构建
+  build:
+  	context: .
+  	dockerfile: Dockerfile

你可以在容器中通过image指定第三方的镜像文件,也可以使用build来进行本地镜像的构建,build可以简写成build: your dir不需要指定上下文等等,其默认会使用当前目录下的Dockerfile文件进行构建

ports、networks、volumes

除了容器中的镜像外,其他如:端口、数据卷、网络其实都是类似,并且和直接用docker run启动容器时使用差不多

语法:

yaml
# 省略其他...
+<service_config>
+  image: nginx:alpine
+
+  # 端口
+  ports:
+  	- "<host_port>:<container_port>/<protocol>"
+  	- "1000"
+  	- "8080:80"
+  	- "443:443/tcp"
+
+  # 数据卷
+  volumes:
+  	- myvolume:/etc/data
+  	- /root/html:/etc/nginx/html
+
+  # 网络
+  networks:
+  	- mynetwork
+
+# 定义数据卷
+volumes:
+	myvolume:
+
+# 定义网络
+networks:
+	mynetwork:

上面展示了端口、数据卷、网络的基本配置:

  • 端口:在容器中使用ports来定义端口的的映射,语法如上,当仅指定一个端口是<container_port>,这种就是告诉外面容器内使用了1000端口,你可以进行映射,实际上并没有和宿主机进行映射而是一种定义,可dockerfile中的expose类似;使用<host_port>:<container_port>时前面表示宿主机端口,后者表示容器端口,二者进行映射;除此还支持协议,直接在最后加上/<protocol>即可
  • 数据卷:容器中使用volumes列表进行卷的映射,你可以直接使用宿主机的目录进行映射,也可以使用docker创建的卷,并且你还可以使用没有创建的数据卷,但同时你必须在顶级定义指定的数据卷,这样docker会帮你自动创建数据卷
  • 网络:使用网络和数据卷类似,当使用不存在的自定义的网络时,也需要在顶级进行定义

depends_on

使用depends_on字段来定义容器之间的依赖关系,以确保在启动容器时,必须先启动其所依赖的容器

语法:

yaml
depends_on:
+  - <service_name>
+  - <service_name2>
+  ...

其中,<service_name>是所依赖的服务名称,可以是单个服务或多个服务

例子:

yaml
version: '3'
+services:
+  db:
+    image: mysql
+  web:
+    image: my-web-app
+    depends_on:
+      - db

在这个示例中,我们定义了两个服务:一个名为db的服务,使用了mysql镜像;一个名为web的服务,使用了自定义的web应用镜像,并在depends_on字段中指定了db服务,表示web服务依赖于db服务。

在启动这个Docker Compose文件时,Docker会先启动db服务,然后再启动web服务,以确保web服务可以连接到db服务并正常运行。

environment

可以使用environment字段来设置容器中的环境变量,其与docker run -e、Dockerfile中定义的ENV类似

语法:

yaml
environment:
+  - <key>=<value>
+  - <key2>=<value2>
+  ...

其中,<key>是环境变量的名称,<value>是环境变量的值。可以设置多个环境变量,每个环境变量之间用-分隔

例子:

yaml
version: '3'
+services:
+  web:
+    image: my-web-app
+    environment:
+      MYSQL_HOST: db
+      MYSQL_USER: user
+      MYSQL_PASSWORD: password

在这个示例中,我们定义了一个名为web的服务,使用了自定义的web应用镜像,并设置了三个环境变量:MYSQL_HOST、MYSQL_USER和MYSQL_PASSWORD。这些环境变量可以在容器内部使用,例如在web应用的配置文件中。

需要注意的是,如果在Docker Compose文件中定义了环境变量,而在Dockerfile中也定义了同名的环境变量,那么Docker Compose文件中的环境变量会覆盖Dockerfile中的环境变量。

除此之外还可以使用.env文件或命令行参数来设置环境变量。这样可以避免将敏感信息硬编码到Docker Compose文件中

注意

Docker Compose文件中定义的环境变量会覆盖.env文件中的同名环境变量

.env配置文件示例:

MYSQL_HOST=db
+MYSQL_USER=user
+MYSQL_PASSWORD=password

compose文件配置:

yaml
version: '3'
+services:
+  web:
+    image: my-web-app
+    environment:
+      MYSQL_HOST: \${MYSQL_HOST}
+      MYSQL_USER: \${MYSQL_USER}
+      MYSQL_PASSWORD: \${MYSQL_PASSWORD}

使用docker-compose命令的--env-file参数来指定环境变量文件。

restart

使用restart字段来定义容器的重启策略,在容器异常退出或停止时,自动重新启动容器

语法:

yaml
restart: <restart_policy>

其中,<restart_policy>是重启策略,可以是以下几种之一:

  • no:不重启容器,默认值
  • always:总是重启容器,除非手动停止容器
  • on-failure:在容器异常退出时重启容器,可以使用-t选项指定重启次数
  • unless-stopped:除非手动停止容器,否则总是重启容器

例子:

yaml
version: '3'
+services:
+  web:
+    image: my-web-app
+    restart: always

在这个示例中,我们定义了一个名为web的服务,使用了自定义的web应用镜像,并设置了重启策略为always,表示总是重启容器。需要注意的是,restart字段只会在容器异常退出或停止时才会生效,而不会影响容器的启动顺序或依赖关系。

更多

关于docker compose配置的讲解就到这里,其配置和docker run很相似,关于更多配置可以查看👉官方文档

命令

有了配置文件后可以通过命令行对整个服务进行发布、构建、删除等等

sh
docker compose [-f <arg>...] [--profile <name>...] [options] [COMMAND] [ARGS...]

build

sh
docker compose build [OPTIONS]

用于构建Docker镜像,可以通过一些参数来自定义构建过程:

  • --no-cache:禁止使用缓存进行构建。如果使用了缓存,Docker会在构建镜像时尽可能地复用之前构建过的镜像层,以提高构建速度。使用--no-cache选项可以强制Docker从头开始构建镜像
  • --pull:在构建镜像之前,拉取最新的基础镜像。如果基础镜像版本已经过时,使用--pull选项可以确保构建的镜像使用最新的基础镜像
  • --parallel:并行构建多个Docker镜像。如果同时构建多个镜像,可以使用--parallel选项加快构建速度

up

sh
docker compose up [OPTIONS]

用于启动Docker Compose定义的所有服务,可以通过一些参数来自定义启动过程:

  • -d:在后台模式下启动服务。如果不使用-d选项,则docker-compose up命令会在前台模式下启动服务,并输出日志信息
  • --build:在启动服务之前,自动构建镜像。如果服务的镜像已经存在,使用--build选项可以强制重新构建镜像
  • --scale:扩展指定服务的容器数量。使用--scale选项可以根据实际需要动态地扩展服务的容器数量。

stop

sh
docker compose stop [OPTIONS] [SERVICE...]

用于停止由Docker Compose定义的服务的容器,不会删除容器、网络和卷:

  • -t:停止服务的超时时间。使用-t选项可以指定停止服务的超时时间,单位为秒
  • SERVICE:指定要停止的服务,如果只需要停止一个或几个服务的容器,可以在stop命令后面指定要停止的服务名

rm

sh
docker compose rm [OPTIONS]

用于停止并删除由Docker Compose定义的服务的容器、网络和卷:

  • -f:强制停止并删除服务的容器、网络和卷。如果服务的容器正在运行或者网络和卷正在被使用,使用-f选项可以强制停止并删除它们
  • --stop:停止服务的容器,但不删除它们。如果只想停止服务的容器而不删除它们,可以使用--stop选项

kill

sh
docker compose kill [OPTIONS] [SERVICE...]

用于强制停止由Docker Compose定义的服务的容器:

  • -s:指定信号量。使用-s选项可以指定要发送的信号量

更多

更多关于docker compose命令使用方法参考👉官方文档

实战

本次将部署两个容器服务:前端和后端,其中前端使用nginx进行部署,后端使用nodejs作为api服务,将nginx端口映射到宿主机,然后通过宿主机IP:Port形式访问前端页面,页面中请求后端服务,点击这里👉下载示例源码

  1. 创建前端页面静态文件index.html:页面包括一个输入框和一个按钮,点击发送请求到/api,这里会请求nginx,nginx做反向代理到nodejs
    html
    <input type="text">
    +<button>发送</button>
    +<script>
    +  const btn = document.querySelector("button")
    +  const input = document.querySelector("input")
    +  btn.addEventListener("click", () => {
    +  	fetch(\`/api?q=\${input.value}\`, {
    +      mode: "cors",
    +      method: "get"
    +    })
    +     .then(res => res.json())
    +     .then(res => console.log(res))
    +  })
    +</script>
  2. 创建default.conf进行nginx的配置与转发:当访问/是返回前端页面,页面中的请求/api会被代理到compose-nodejs:10010,这里的compose-nodejs是nodejs的服务名,只有当compose中的容器使用同一个网络时才可以使用服务名的形式访问
    nginx
    upstream backend {
    +  server compose-nodejs:10010;
    +}
    +server {
    +  listen 80;
    +  server_name localhost;
    +  # 首页静态页面
    +  location / {
    +    root /usr/share/nginx/html;
    +    index index.html index.htm;
    +  }
    +
    +  # 反向代理到 nodejs
    +  location /api {
    +  	# 允许跨域
    +    add_header Access-Control-Allow-Origin $http_origin always;
    +    add_header Access-Control-Allow-Credentials true always;
    +    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    +    add_header Access-Control-Allow-Headers 'content-type';
    +    if ($request_method = "OPTIONS") {
    +        return 204;
    +    }
    +
    +    proxy_set_header X-Real-IP $remote_addr;
    +    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    +    proxy_set_header Host $http_host;
    +    proxy_set_header X-Nginx-Proxy true;
    +    proxy_pass http://backend;
    +  }
    +}
  3. 创建nodejs作为后端服务:nodejs使用express作为http服务,并监听10010端口,当访问时返回code和时间戳
    js
    const express = require("express");
    +const app = express();
    +app.use((req, res) => {
    +  console.log(req.url);
    +  res.json({
    +    code: 200,
    +    date: +new Date(),
    +  });
    +});
    +app.listen(10010, () => console.log("server is runnning on port 10010"));
  4. 创建docker-compose.yml配置文件:里面包含了nginx和nodejs容器,两者都是用本地的Dockerfile进行构建镜像,nginx映射宿主机10010端口到容器的80端口,并且两者的启动顺序为compose-nodejscompose-nginx,使用相同的网络compose
yaml
version: "3"
+services:
+  compose-nginx:
+    build:
+      context: .
+      dockerfile: Dockerfile.nginx
+    container_name: compose-nginx
+    ports:
+      - "10010:80"
+    depends_on:
+      - compose-nodejs
+    networks:
+      - compose
+
+  compose-nodejs:
+    build:
+      context: .
+      dockerfile: Dockerfile.nodejs
+    container_name: compose-nodejs
+    networks:
+      - compose
+
+
+networks:
+  compose:
  1. 创建镜像构建文件:分别使用Dockerfile.nginxDockerfile.nodejs来构建nginx和nodejs镜像,具体配置文件如下

    Dockerfile.nginx

    docker
    FROM nginx:alpine
    +COPY index.html /usr/share/nginx/html
    +COPY default.conf /etc/nginx/conf.d
    +EXPOSE 80
    +ENTRYPOINT [ "nginx", "-g", "daemon off;" ]

    Dockerfile.nodejs

    docker
    FROM node:alpine
    +WORKDIR /app
    +COPY package.json .
    +RUN npm install
    +COPY server.js .
    +EXPOSE 10010
    +ENTRYPOINT [ "npm", "run", "server.js" ]
  2. 启动整体服务:

    sh
    docker compose up -d

参考文档

`,101);function i(D,y,d,F,b,m){const a=n("Reward"),l=n("Gitalk");return r(),p("div",null,[t,s(a),s(l)])}const C=e(c,[["render",i]]);export{h as __pageData,C as default}; diff --git a/assets/fullstack_docker_docker-compose.md.pk2z5mQl.lean.js b/assets/fullstack_docker_docker-compose.md.pk2z5mQl.lean.js new file mode 100644 index 000000000..9cfb93569 --- /dev/null +++ b/assets/fullstack_docker_docker-compose.md.pk2z5mQl.lean.js @@ -0,0 +1 @@ +import{_ as e,c as p,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const h=JSON.parse('{"title":"使用DockerCompose部署服务","description":"Docker Compose是一种用于定义和运行多个Docker容器应用程序的工具,通过简单的方式来管理多个Docker容器,使得开发人员可以更加专注于应用程序的开发,而不需要关注底层的容器管理细节","frontmatter":{"title":"使用DockerCompose部署服务","description":"Docker Compose是一种用于定义和运行多个Docker容器应用程序的工具,通过简单的方式来管理多个Docker容器,使得开发人员可以更加专注于应用程序的开发,而不需要关注底层的容器管理细节","keywords":"docker-compose,docker集群,docker服务部署,docker镜像,docker网络","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/docker-compose.md","filePath":"fullstack/docker/docker-compose.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/docker-compose.md"},t=o("",101);function i(D,y,d,F,b,m){const a=n("Reward"),l=n("Gitalk");return r(),p("div",null,[t,s(a),s(l)])}const C=e(c,[["render",i]]);export{h as __pageData,C as default}; diff --git a/assets/fullstack_docker_docker-repository.md.M30BRYPU.js b/assets/fullstack_docker_docker-repository.md.M30BRYPU.js new file mode 100644 index 000000000..f79fc055d --- /dev/null +++ b/assets/fullstack_docker_docker-repository.md.M30BRYPU.js @@ -0,0 +1,75 @@ +import{_ as l,c as p,J as s,V as o,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"搭建docker私有仓库","description":"使用官方registry或nexus3搭建属于自己的docker私有镜像仓库完整教程","frontmatter":{"title":"搭建docker私有仓库","description":"使用官方registry或nexus3搭建属于自己的docker私有镜像仓库完整教程","keywords":"docker私有仓库,搭建docker仓库,nexus搭建docker仓库,registry搭建docker仓库","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/docker-repository.md","filePath":"fullstack/docker/docker-repository.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/docker-repository.md"},t=o(`

搭建docker私有仓库

搭建docker私有仓库也是工作中会遇到的,出于安全策略每个公司都会将自己的镜像存到自己的私有仓库中,本篇将会通过docker官方registry和nexus3两种方式进行私库的搭建。

这两种方式都需要先安装docker,通过docker以容器的形式部署,所以请确保你安装了docker,如果你还没安装或不了解docker,可以先阅读👉🏻docker章节

官方registry搭建

官方registry镜像地址点这里查看

安装registry

  1. 创建卷映射文件夹
    sh
    mkdir -p /srv/docker-registry
  2. 下载镜像并运行
    sh
    # 下载镜像,可以指定具体版本
    +docker pull registry:tag
    +
    +# 运行
    +docker run -d -p 5000:5000 \\
    +  --restart=always \\
    +  -v /srv/docker-registry:/tmp/registry \\
    +  --privileged \\
    +  --name registry registry

使用仓库

  1. 推送镜像

    sh
    # 找一个镜像,没有可以自己build
    +
    +# 更改镜像标签(示例)  localhost为docker仓库的ip,5000 是端口
    +docker tag nginx:1.1 localhost:5000/nginx:1.1
    +
    + ~ docker push localhost:5000/nginx:1.15.3
    +The push refers to repository [localhost:5000/nginx]
    +8707677a5773: Layer already exists
    +0aad8cc1e782: Layer already exists
    +bb97ae9f0f57: Layer already exists
    +1.15.3: digest: sha256:98824065f066d6839af42c512cb672fb0151322fa80fd6dc4019bfa8bd6affae size: 948
  2. 拉取镜像

    sh
    docker pull localhost:5000/nginx:1.15.3
  3. 配置仓库ip

    使用宿主机的ip+port方式,这里会发现拉取不成功,这是因为docker默认使用https的方式进行连接,修改一下配置文件让docker忽略当前地址

    sh
     ~ docker pull 192.168.10.10:7999/nginx:1.15.3
    +Error response from daemon: Get "https://192.168.10.10:7999/v2/": dial tcp 192.168.10.10:7999: connect: connection refused

    编辑/etc/docker/daemon.json,没有此文件自行创建:

    json
    {
    +  "registry-mirrors": [
    +    "https://docker.mirrors.ustc.edu.cn"
    +  ],
    +  "insecure-registries": ["192.168.10.10:7999"]
    +  // ....
    +}

    配置完后要重启后台进程、docker和仓库:

    sh
    systemctl daemon-reload
    +systemctl restart docker
    +docker restart registry
    +
    + ~ docker pull 192.168.10.10:5000/nginx:1.15.3
    +1.15.3: Pulling from nginx
    +Digest: sha256:98824065f066d6839af42c512cb672fb0151322fa80fd6dc4019bfa8bd6affae
    +Status: Downloaded newer image for 192.168.10.10:5000/nginx:1.15.3
    +192.168.10.10:5000/nginx:1.15.3

以上便是使用官方registry搭建仓库的步骤,以上并没有使用账户密码,这里没有演示。而我更推荐用其他方式搭建,如接下来的nexus3,有图形化、权限配置更加友好。

使用nexus3搭建

使用nexus3你需要先安装,关于docker安装nexus3这里不再做介绍了,如果你看了我的另一篇「使用docker搭建npm仓库」一文你应该已经安装nexus3了,如果没有安装可以阅读此篇,以下本文都默认安装了nexus3

TIP

以下对于nexus3的使用不是很详细,如果你发现有些概念不清楚,可以先阅读我的nexus3「使用docker搭建npm仓库」一文熟悉nexus3的基本使用或者参考其他第三方资料都可以

创建存储集

创建存储集来存储我们的docker镜像,使用仓库关联当前存储集 image-20230322150502893

创建仓库

这里会创建hosted、proxy、group三种类型的docker仓库

  1. 创建hosted仓库,真正存储我们自己的镜像仓库 image-20230322150834614
  • Repository Connectors:仓库进行连接访问配置,这里配置了http和https两个端口,需要注意的是这两个端口需要处于创建nexus3容器时暴露出一段端口范围内
  • Allow anonymous docker pull:允许访客下载镜像,如果你不允许则不用勾选
  • 选择存储集docker
  • Deployment Policy:根据自己的需求设置发布策略,这里设置允许重新发布相同版本
  1. 创建proxy仓库,代理第三方的仓库,这里代理到网易加速地址 image-20230322151617664

  2. 创建group仓库,代理hosted和proxy image-20230322151914643

配置角色与用户

  1. 创建docker角色用来管理docker相关操作,根据自己需求将有关docker的权限移至右侧 image-20230322152259064

  2. 创建用户,有了角色权限后就可以创建对应的用户赋予权限,以后就可以用此用户进行登录私有仓库了 image-20230322152535767

配置Realms

配置realms允许docker相关规则进行授权,如果你允许了游客下载镜像,需要在Anonymous Access设置允许访问 image-20230322152830776

登录仓库

  1. 登录docker(group)的仓库,注意使用ip和暴露的http端口进行登录,不过docker默认会使用https进行登录,http会视为不安全,需要添加一些配置,编辑/etc/docker/deamon.json(没此文件自行创建):
    json
    {
    +  "registry-mirrors": [
    +    "https://docker.mirrors.ustc.edu.cn"
    +  ],
    +  // 配置这个 不安全的仓库,我这里配置了其他的,按照自己需求进行配置
    +  "insecure-registries": ["192.168.10.10:8081", "192.168.10.10:8000", "192.168.10.10:8001", "192.168.10.10:7999"],
    +}
  2. 重启服务
    sh
    systemctl daemon-reload
    +systemctl restart docker
    +
    +# nexus没启动的需要手动启动
    +docker start nexus3
  3. 登录仓库
    sh
     ~ docker login 192.168.10.10:8001
    +Username: ihengshuai
    +Password:
    +WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    +Configure a credential helper to remove this warning. See
    +https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    +
    +Login Succeeded

推送镜像

随便找一个已下载的镜像,并修改成自己仓库的ip和包名:

sh
# 打tag 写上自己仓库 IP:Port/packageName:version
+docker tag nginx:1.15.3 192.168.10.10:8001/myimage:v1
+
+# 发布镜像
+ ~ docker push 192.168.10.10:8001/myimage:v1
+The push refers to repository [192.168.10.10:8001/myimage]
+8707677a5773: Layer already exists
+0aad8cc1e782: Layer already exists
+bb97ae9f0f57: Layer already exists
+denied: Deploying to groups is a PRO-licensed feature. See https://links.sonatype.com/product-nexus-repository

其实以上可以算是成功步骤,只不过推送镜像到docker(group)是付费功能,而docker(hosted)是免费的,你可以登录hosted地址推送,使用docker(group)进行镜像的下载

sh
# 登录hosted
+docker login 192.168.10.10:8000
+
+# 切换成hosted暴露的http port
+docker tag nginx:1.15.3 192.168.10.10:8000/myimage:v1
+
+# 发布镜像
+ ~ docker push 192.168.10.10:8000/myimage:v1
+8707677a5773: Layer already exists
+0aad8cc1e782: Layer already exists
+bb97ae9f0f57: Layer already exists
+v1: digest: sha256:98824065f066d6839af42c512cb672fb0151322fa80fd6dc4019bfa8bd6affae size: 948

到这里就发布成功了

下载镜像

下载镜像可以使用docker(group)的地址,如果下载失败,可能原因是没配置权限,检查一下自己账户的权限

sh
 ~ docker pull 192.168.10.10:8001/myimage:v1
+v1: Pulling from myimage
+Digest: sha256:98824065f066d6839af42c512cb672fb0151322fa80fd6dc4019bfa8bd6affae
+Status: Downloaded newer image for 192.168.10.10:8001/myimage:v1
+192.168.10.10:8001/myimage:v1
`,35);function i(d,y,u,b,m,h){const n=a("Reward"),e=a("Gitalk");return r(),p("div",null,[t,s(n),s(e)])}const g=l(c,[["render",i]]);export{C as __pageData,g as default}; diff --git a/assets/fullstack_docker_docker-repository.md.M30BRYPU.lean.js b/assets/fullstack_docker_docker-repository.md.M30BRYPU.lean.js new file mode 100644 index 000000000..b5ad8da5d --- /dev/null +++ b/assets/fullstack_docker_docker-repository.md.M30BRYPU.lean.js @@ -0,0 +1 @@ +import{_ as l,c as p,J as s,V as o,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"搭建docker私有仓库","description":"使用官方registry或nexus3搭建属于自己的docker私有镜像仓库完整教程","frontmatter":{"title":"搭建docker私有仓库","description":"使用官方registry或nexus3搭建属于自己的docker私有镜像仓库完整教程","keywords":"docker私有仓库,搭建docker仓库,nexus搭建docker仓库,registry搭建docker仓库","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/docker-repository.md","filePath":"fullstack/docker/docker-repository.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/docker-repository.md"},t=o("",35);function i(d,y,u,b,m,h){const n=a("Reward"),e=a("Gitalk");return r(),p("div",null,[t,s(n),s(e)])}const g=l(c,[["render",i]]);export{C as __pageData,g as default}; diff --git a/assets/fullstack_docker_dockerfile.md.W4mEEOsy.js b/assets/fullstack_docker_dockerfile.md.W4mEEOsy.js new file mode 100644 index 000000000..c4f78723e --- /dev/null +++ b/assets/fullstack_docker_dockerfile.md.W4mEEOsy.js @@ -0,0 +1,256 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"使用Dockerfile构建镜像","description":"Dockerfile是一个文本文件里面包含了一条条构建镜像的指令,使用Dockerfile构建镜像更加方便、间接、透明","frontmatter":{"title":"使用Dockerfile构建镜像","description":"Dockerfile是一个文本文件里面包含了一条条构建镜像的指令,使用Dockerfile构建镜像更加方便、间接、透明","keywords":"Dockerfile构建镜像,Dockerfile构建优化,Dockerfile多阶段构建,Dockerfile如何运行,docker镜像构建,定制docker镜像","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/dockerfile.md","filePath":"fullstack/docker/dockerfile.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/dockerfile.md"},t=o(`

使用Dockerfile构建镜像

前面我们学习了可以使用docker commit命令式构建新的镜像,而此方式相对来说比较繁琐且对于旁人来说内部都是黑箱操作,无法了解制作的具体细节。很有可能很长时间后制作者也会对其忘却,且制作多镜像时相同阶段也无法共用已构建的产物,Dockerfile便可以完美解决这些问题。

概念

Dockerfile是用于定义Docker镜像的文件,是一种纯文本文件,其中包含了一系列的指令和配置信息,以描述如何构建和运行一个Docker容器。Dockerfile的内容可以基于现有的镜像进行扩展和定制化,也可以自己编写底层的操作系统配置和应用程序安装脚本。

镜像是分层构建的,每一层都对应了具体的构建指令,而Dockerfile中每一条指令也代表着每层的构建过程

作用

使用Dockerfile为镜像的构建使得更加便利,其优势大致如下:

  • 自动化构建:使用Dockerfile可以自动构建Docker镜像,避免了手动操作的繁琐和错误
  • 可重复性:通过Dockerfile可以确保每次构建出的镜像都是相同的,避免了因为不同的环境或依赖出现的差异
  • 可维护性:使用Dockerfile可以清晰地描述容器的配置和依赖,方便维护和升级
  • 灵活性:Dockerfile提供了灵活的自定义选项,可以根据需要对容器进行个性化配置
  • 可分享性:Dockerfile可以作为代码一样进行版本控制和分享,方便团队协作和共享

初识Dockerfile

和大部分配置文件不同,Dockerfile其实就是个普通的文本文件,内部由一条条具体的构建指令组合而成,可以说Dockerfile是加强版的命令构建版本。以下是一个简单的Dockerfile:

docker
FROM nginx:alpine
+ENV DESC="DOCKERFILE_DEMO"
+WORKDIR /var/nginx/html
+RUN echo $DESC
+COPY . .
+EXPOSE 80
+CMD ["nginx", "-g", "daemon off;"]

以上配置指定了构建以nginx:alpine镜像为基础,定义容器的工作目录为/var/nginx/html,并将宿主机当前目录下的文件复制到容器的工作目录下,暴露端口80,并规定容器启动后让nginx以前台的形式运行。除此之外还定义了环境变量DESC的值为DOCKERFILE_DEMO,并打印其结果

接下来构建生成目标镜像:nginx:dockerfile

sh
 docker build -t nginx:dockerfile .
+[+] Building 15.3s (9/9) FINISHED
+ => [internal] load build definition from Dockerfile                                                                      0.0s
+ => => transferring dockerfile: 182B                                                                                      0.0s
+ => [internal] load .dockerignore                                                                                         0.0s
+ => => transferring context: 2B                                                                                           0.0s
+ => [internal] load metadata for docker.io/library/nginx:alpine                                                          15.3s
+ => [1/4] FROM docker.io/library/nginx:alpine@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333     0.0s
+ => [internal] load build context                                                                                         0.0s
+ => => transferring context: 182B                                                                                         0.0s
+ => CACHED [2/4] WORKDIR /var/nginx/html                                                                                  0.0s
+ => CACHED [3/4] RUN echo DOCKERFILE_DEMO                                                                                 0.0s
+ => [4/4] COPY . .                                                                                                        0.0s
+ => exporting to image                                                                                                    0.0s
+ => => exporting layers                                                                                                   0.0s
+ => => writing image sha256:bcd9c0828a32f7f2816cc128ac1f1f7368066caf401c93057825d0f3b5df4864                              0.0s
+ => => naming to docker.io/library/nginx:dockerfile

查看并运行:

sh
# 查看镜像已经存在
+ docker images | grep dockerfile
+nginx    dockerfile     bcd9c0828a32   56 seconds ago   22.1MB
+
+# 运行容器
+ docker run --rm -p 8088:80 nginx:dockerfile
+/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
+/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
+/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
+10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
+10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf

以上我们便使用Dockerfile配置文件定制nginx镜像的完整流程,可以体验出它相比命令式更加便捷,操作简单透明,并且同阶段的构建会被缓存起来复用,可以很好的提高构建效率,对于相同镜像的共享也只需拿到配置文件即可制作完全一样的镜像。

相反不使用Dockerfile,需要我们一步一步使用命令进行构建,那样会相对繁琐,整体构建的操作也会是黑箱操作,无法满足简单、易维护、高效的特性。

了解了Dockerfile的便捷之处后,接下来学习详细语法。

语法

FROM

初始化基础的镜像,在Dockerfile中必须的也是最开始就需要的,后面的命令需要基于最初的镜像进行操作。FROM一般是最开始执行的,ARG命令是唯一可以在FROM前执行的命令。

语法:

sh
FROM [--platform=<platform>] <image>[:tag] [AS <name>]
  • AS name:可选,指定构建阶段的名称,适用于多阶段构建
  • --platform:指定平台,如arm,amd等等
  • tag:可选,不指定镜像tag默认为latest

ARG

ARG 指令用于设置构建时的参数,这些参数可以在构建时传递给 Docker 以影响镜像的构建,使用ARG可以简化镜像的构建过程、将容器的配置信息与容器的代码分离,提高容器的可维护性

语法:

sh
ARG <name>[=<default value>]

可以在构建时使用 --build-arg <key>=<value> 参数来传递一个新的值给指定的参数

例子:

docker
# Dockerfile-ARG
+FROM nginx:alpine
+ARG VERSION=0.0.1
+ENV VERSION=$VERSION
+RUN echo $VERSION

构建镜像重新赋值:从第9行看到已经被赋新值0.1.0

sh
 docker build --build-arg VERSION=0.1.0 -t nginx:ARG --file Dockerfile-ARG .
+[+] Building 15.9s (6/6) FINISHED
+ => [internal] load .dockerignore                                                                                         0.0s
+ => => transferring context: 2B                                                                                           0.0s
+ => [internal] load build definition from Dockerfile-ARG                                                                  0.0s
+ => => transferring dockerfile: 119B                                                                                      0.0s
+ => [internal] load metadata for docker.io/library/nginx:alpine                                                          15.6s
+ => CACHED [1/2] FROM docker.io/library/nginx:alpine@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2  0.0s
+ => [2/2] RUN echo 0.1.0                                                                                                  0.3s
+ => exporting to image                                                                                                    0.0s
+ => => exporting layers                                                                                                   0.0s
+ => => writing image sha256:c073ffd0029a4a3e64b68f2a9e450a4389d0b81fc7221bfcd727448be48bea36                              0.0s
+ => => naming to docker.io/library/nginx:ARG

然后可以通过docker inspect查看镜像的变量:

sh
 docker inspect nginx:ARG | grep -A 6 Env
+  "Env": [
+      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+      "NGINX_VERSION=1.21.5",
+      "NJS_VERSION=0.7.1",
+      "PKG_RELEASE=1",
+      "VERSION=0.1.0"
+  ],

ENV

该指令用于设置环境变量,可以在容器运行时使用这些环境变量

语法:

sh
ENV <key>=<value> ...

其中,<key> 表示要设置的环境变量的名称,<value>表示要设置的环境变量的值。如果要设置多个环境变量,可以在ENV指令中指定多个键值对,每个键值对用空格分隔,双引号将会被移除如果没有使用转义。Dockerfile中ENV定义的变量会持久保存在镜像中,可以使用docker inspect image查看内部的环境变量,可以在运行容器时使用-e <key>=<value>来覆盖原来的值,或设置新的环境变量

例子:

docker
# Dockerfile
+FROM nginx:alpine
+
+# 设置时区
+ENV TZ=Asia/Shanghai
+
+ENV k1=v1
+RUN echo $k1

构建镜像:

sh
docker build --file Dockerfile -t nginx:ENV .
+[+] Building 15.7s (6/6) FINISHED
+ => [internal] load build definition from Dockerfile-ENV                                                                  0.0s
+ => => transferring dockerfile: 86B                                                                                       0.0s
+ => [internal] load .dockerignore                                                                                         0.0s
+ => => transferring context: 2B                                                                                           0.0s
+ => [internal] load metadata for docker.io/library/nginx:alpine                                                          15.5s
+ => CACHED [1/2] FROM docker.io/library/nginx:alpine@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2  0.0s
+ => [2/2] RUN echo v1                                                                                                     0.2s
+ => exporting to image                                                                                                    0.0s
+ => => exporting layers                                                                                                   0.0s
+ => => writing image sha256:c6e1d107c5aa56a9c70fcd377c539e6ae28267e4f1660d9dd8ee5d7a40ac79e6                              0.0s
+ => => naming to docker.io/library/nginx:ENV

查看镜像内部持久化的变量:第8行看到镜像内部设置的k1变量

sh
docker inspect nginx:ENV | grep -A 5 ENV
+# ...
+"Env": [
+    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+    "NGINX_VERSION=1.21.5",
+    "NJS_VERSION=0.7.1",
+    "PKG_RELEASE=1",
+    "k1=v1"
+],

运行容器并覆盖镜像中默认的k1变量值:

sh
docker run -d -p 8080:80 -e k1=v2 --name nginx-env nginx:ENV
+
+# 查看容器 nginx-env 内部配置
+docker inspect nginx-env | grep -A 6 Env
+  "Env": [
+      "k1=v2",
+      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+      "NGINX_VERSION=1.21.5",
+      "NJS_VERSION=0.7.1",
+      "PKG_RELEASE=1"
+  ],

WORKDIR

WORKDIR 指令用于设置容器中的工作目录。当我们在容器中运行命令时,它们将在 WORKDIR 指定的目录中运行。如果在 Dockerfile 中没有使用 WORKDIR 指令,则默认的工作目录是根目录(/)。

语法:

sh
WORKDIR /path/to/workdir

例子:

docker
FROM ubuntu:latest
+# 指定容器工作目录为/app
+WORKDIR /app
+# 将当前目录下的内容复制到容器中的 /app 目录中
+COPY . .
+RUN apt-get update && apt-get install -y python3
+CMD ["python3", "app.py"]

LABEL

给镜像添加标签,label使用键值对的方式定义,有空格的值要用双引号包括,尽量在一行中定义完所有的label,自己使用意义不大了解下即可

语法:

sh
LABEL <key>=<value> <key>=<value> <key>=<value> ...

例子:

docker
LABEL label1=xxxxx \\
+      label2=123143 \\
+      label3="sdfsdfs"

例子:

docker
# 使用 arm架构的 nginx:1.15.3 的镜像作为 build 阶段的基础镜像
+FROM --platform=arm nginx:1.15.3 AS build

RUN

在当前镜像上层执行相关命令,并commited一个新的镜像层提供给下一层阶段使用。由于一条RUN指令便会产生新的镜像层,使得构建体积变大,在生产构建时尽量采用 && 把RUN合并成一条指令执行,当然在测试构建时分开写更容易排查构建错误

注意

使用RUN执行命令时当前阶段必须包含所执行的命令才可以,否则需要先安装相关命令

语法:

sh
RUN <command>
+RUN ["executable", "param1", "param2"...]

RUN支持两种执行形式:shell格式和exec格式。shell格式就是在终端执行命令一样,可以使用管道、重定向、变量的一些特性,而exec格式不会采用shell执行,而是直接在容器中执行,写法就像一个一维数组,将每个参数放在每个位置即可,使用exec可以减少启动新shell进程的开销,且会作为第一进程执行。

例子:

docker
RUN curl -I http://localhost
+RUN ["curl", "-I", "http://localhost"]

COPY

复制本地文件或路径到容器的文件系统,支持通配符匹配,不支持远程url文件地址,不支持压缩包自动解压,相比ADD指令一般使用这个也够用了

语法:

sh
COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest>
+COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]

复制文件也支持设置指定的用户和权限组,同时支持--from=xx多阶段产物的复制,这种特性对于减小镜像构建体积作用很大,你可以从多阶段构建了解其作用

例子:

docker
# 绝对路径
+COPY *.md /app
+COPY hom?.txt /app
+
+# 相对路径 work相对于 WORKDIR
+COPY *.sh work
+
+# 修改文件权限
+COPY --chown=1 files* /somedir/

ADD

复制本地文件、路径或远程文件到容器文件系统,相比COPY可以远程文件,并自动下载复制到目标位置。如果是压缩文件,也会自动解压。

语法:

sh
ADD [--chown=<user>:<group>] [--chmod=<perms>] [--checksum=<checksum>] <src>... <dest>
+ADD [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]

例子:

docker
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
+ADD *.md /app

VOLUME

定义容器数据挂载点,在运行容器时使用-v--mount参数指定宿主机目录或文件挂载到容器的挂载点,实现容器与主机之间的数据共享,将容器的数据和应用程序分离开来,保持容器的数据独立性,也便于在主机上修改相应的配置文件。

语法:

sh
VOLUME /dir1 /dir2 /dir3 ...
+VOLUME ["dir1", ...., "dir9999"]

VOLUME支持多个挂载点,在运行容器时通过-v进行挂载

例子:

docker
# ...
+# 创建文件夹 static
+mkdir /static
+# 将容器外部的html文件复制到 static中
+COPY /html /static
+# 创建挂载点
+VOLUME /static

在运行时通过-v /somedir:/static可以覆盖容器中的文件

EXPOSE

EXPOSE 指令用于声明容器运行时要监听的网络端口号。该指令并不会在容器运行时自动将端口号映射到主机上,而是作为一种文档形式的标记,用于告诉用户哪些端口可以被容器访问。

注意

EXPOSE指令并不会自动将容器的端口映射到主机上,如果需要将容器的端口映射到主机上,需要在运行容器时使用 -p 或 --publish 参数指定端口映射规则。同时,也需要确保容器运行的应用程序实际上监听了指定的端口号,否则端口号将无法被访问。

语法:

sh
EXPOSE <port> [<port>/<protocol>...]

其中,<port>表示要监听的端口号,可以是1到65535之间的任意整数。如果要监听多个端口号,可以在 EXPOSE 指令中指定多个端口号,每个端口号用空格分隔。如果要监听的端口号是使用 TCP 或 UDP 协议,则可以在端口号后面添加 /tcp 或 /udp 表示协议类型。例如,EXPOSE 80/tcp 表示要监听 TCP 协议的 80 端口。

例子:

docker
FROM nginx
+EXPOSE 80/tcp

指明该容器运行是会监听容器中的80端口,然后在运行时可以通过-p和主机进行端口之间的映射:

sh
# 将主机的 8088 端口映射到 容器的 80端口,就可以使用 宿主机的 IP:port 方式访问到nginx
+docker run -p 8088:80 nginx

CMD

CMD 指令用于指定容器启动时默认要执行的命令。当我们使用docker run命令启动容器时,如果没有指定要执行的命令,那么将会执行 CMD 中指定的命令。

注意

Dockerfile 中只能使用一条 CMD 指令。如果在 Dockerfile 中使用了多个 CMD 指令,只有最后一个 CMD 指令会生效

语法:

sh
# exec执行
+CMD ["executable","param1","param2"]
+
+# 作为 ENTRYPOINT参数
+CMD ["param1","param2"]
+
+# shell 执行
+CMD command param1 param2

CMD支持exec和shell两种写法,使用exec方式可以和ENTRYPOINT结合并作为其参数使用,强烈建议使用exec方式使用。

例子:

docker
FROM busybox
+
+# 使用ping localhost 3次后停止
+CMD ["ping", "-c", "3", "localhost"]

构建镜像:

sh
docker build -t nginx:CMD --file Dockerfile-CMD .

运行容器:容器启动会执行Dockerfile中指定的CMD命令,这里执行ping localhost3次后停止

sh
 docker run --rm  nginx:CMD
+PING localhost (127.0.0.1): 56 data bytes
+64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.064 ms
+64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.198 ms
+64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.196 ms
+
+--- localhost ping statistics ---
+3 packets transmitted, 3 packets received, 0% packet loss
+round-trip min/avg/max = 0.064/0.152/0.198 ms

运行容器时提供默认运行的命令来覆盖默认的命令:这里使用date命令代替了Dockerfile中CMD的命令

sh
 docker run --rm  nginx:CMD date
+Tue Mar 28 07:23:07 UTC 2020

注意

容器的运行必须提供默认的运行命令,可以运行时提供(CMD/ENTRYPOINT)或者构建时提供,没有默认运行命令则会自动退出,低版本可能会报错

我们去掉以上的CMD命令重新构建镜像:

sh
docker build -t nginx:CMD --file Dockerfile-CMD .

然后运行容器:

sh
 docker run --rm  nginx:CMD

ENTRYPOINT

CMD一样ENTRYPOINT命令也是用于指定容器启动时默认要执行的命令,也是只能最后一个生效。若Dockerfile中CMD和ENTRYPOINT都存在,则ENTRYPOINT作为容器的运行命令,CMD将作为ENTRYPOINT的参数;若运行容器时再次指定了CMD的参数,将会覆盖默认的CMD参数,但参数也会追加到ENTRYPOINT作为参数使用。

语法:

sh
ENTRYPOINT ["executable", "param1", "param2"]
+ENTRYPOINT command param1 param2

尽管ENTRYPOINT支持两种形式的写法,但是也是强烈建议使用exec形式,避免和CMD参数追加的问题。

若想覆盖Dockerfile中的ENTRYPOINT时,可以在运行容器时通过--entrypoint来指定要运行的程序

例子:

docker
FROM busybox
+ENTRYPOINT ["ping"]
+CMD ["localhost", "-c", "3"]

以上指定容器运行程序为ping,CMD作为ENTRYPOINT的参数,整体命令为ping localhost -c 3,ping完localhost 3次就会停止

运行容器:

sh
 docker run --rm  nginx:ENTRYPOINT
+PING localhost (127.0.0.1): 56 data bytes
+64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.069 ms
+64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.256 ms
+64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.248 ms
+
+--- localhost ping statistics ---
+3 packets transmitted, 3 packets received, 0% packet loss
+round-trip min/avg/max = 0.069/0.191/0.256 ms

运行时通过传参覆盖掉默认的 CMD,并且会将动态添加的参数追加到 ENTRYPOINT:这里改为ping qq.com 1次就停止

sh
 docker run --rm  nginx:ENTRYPOINT qq.com -c 1
+PING qq.com (183.3.226.35): 56 data bytes
+64 bytes from 183.3.226.35: seq=0 ttl=127 time=34.314 ms
+
+--- qq.com ping statistics ---
+1 packets transmitted, 1 packets received, 0% packet loss
+round-trip min/avg/max = 34.314/34.314/34.314 ms

通过运行容器时使用--entrypoint替换默认的ENTRYPOINT命令:

sh
 docker run --rm --entrypoint "ls" nginx:ENTRYPOINT -ll
+total 16
+drwxr-xr-x    2 root     root         12288 Dec 29  2021 bin
+drwxr-xr-x    5 root     root           340 Mar 28 10:07 dev
+drwxr-xr-x    1 root     root            66 Mar 28 10:07 etc
+drwxr-xr-x    2 nobody   nobody           6 Dec 29  2021 home
+dr-xr-xr-x  294 root     root             0 Mar 28 10:07 proc
+drwx------    2 root     root             6 Dec 29  2021 root
+dr-xr-xr-x   12 root     root             0 Mar 28 10:07 sys
+drwxrwxrwt    2 root     root             6 Dec 29  2021 tmp
+drwxr-xr-x    3 root     root            18 Dec 29  2021 usr
+drwxr-xr-x    4 root     root            30 Dec 29  2021 var

ONBUILD

当使用包含 ONBUILD 指令的镜像作为下一个 Dockerfile 的基础镜像时,ONBUILD 指令中的命令将自动执行,并将其结果添加到子镜像中。这样可以在构建镜像时预先处理一些操作,以便在基于该镜像构建更高级别的应用程序时,执行这些操作不必重复编写代码。

语法:

sh
ONBUILD <INSTRUCTION>

例子:

docker
FROM ubuntu:latest
+RUN apt-get update && apt-get install -y python3
+WORKDIR /app
+ONBUILD COPY . .
+ONBUILD RUN pip3 install -r requirements.txt
+ONBUILD CMD ["python3", "app.py"]

当使用这个镜像作为基础镜像创建一个新的 Dockerfile 时,Docker 将自动复制当前 Dockerfile 目录中的所有文件到新的镜像中,并安装 requirements.txt 中指定的 Python 库。然后,在新的镜像中,CMD 指令将自动运行 Python 应用程序。 假如以上的镜像名为myimage,使用其作为基础镜像再次构建新的镜像:

docker
FROM myimage
+EXPOSE 5000
+CMD ["python3", "run.py"]

在这个 Dockerfile 中,我们使用 myimage 镜像作为基础镜像,并指定了一些额外的操作,例如暴露端口和运行run.py文件。由于 myimage 镜像中包含 ONBUILD 指令,因此 Docker 将自动执行 COPY 和 RUN 命令,并安装 requirements.txt 中指定的 Python 库。然后,在新的镜像中,CMD 指令将自动运行 Python 应用程序。

HEALTHCHECK

指定容器健康检查的方式和频率,以及容器健康检查失败时的行为,Docker 支持多种检查方式,例如 HTTP 接口、TCP 端口、命令行输出等。可以根据应用程序的特点和需求选择适合的健康检查方式。

语法:

sh
HEALTHCHECK [OPTIONS] CMD command
+
+# 禁止健康检查
+HEALTHCHECK NONE

例子:

docker
FROM nginx
+HEALTHCHECK --interval=10s --timeout=10s \\
+  CMD curl -I http://localhost || exit 1
+CMD ["nginx", "g", "daemon off;"]

在这个 Dockerfile 中,我们使用HEALTHCHECK指令设置了容器健康检查的方式。具体来说,我们使用 curl 命令检查容器中是否能够访问 http://localhost,并将检查间隔设置为10s,检查超时时间设置为10s。如果健康检查失败,则容器将退出。

在运行容器时,可以使用 --health-cmd、--health-interval、--health-timeout 等参数覆盖 Dockerfile 中设置的健康检查参数

⭐️⭐️⭐️⭐️⭐️

到这里关于Dockerfile的语法知识已经讲的差不多了,如果你还需要更多有关Dockerfile语法请阅读官方文档

注意事项

  1. 保留字指令必须大写,后面要跟随至少一个参数
  2. 指令从上到下执行
  3. 每条指令都会创建一个新的镜像层并对镜像进行提交
  4. docker会对前面相同的步骤进行构建缓存

构建上下文

Dockerfile 的构建上下文(Build Context)是指在构建 Docker 镜像时,Docker 引擎需要读取的文件和目录的集合。

构建上下文通过docker build命令的-f. 参数指定。其中,-f 参数用于指定 Dockerfile 文件的路径,. 参数用于指定构建上下文的路径。例如,下面是一个使用 docker build 命令构建 Docker 镜像的示例:

sh
docker build -f Dockerfile -t myimage .

在这个命令中,我们使用 -f 参数指定 Dockerfile 文件的路径为当前目录下的 Dockerfile 文件,使用 . 参数指定构建上下文的路径为当前目录。Docker引擎将读取当前目录下的所有文件和目录,并根据 Dockerfile 文件中的指令构建 Docker 镜像。

需要注意的是,构建上下文中包含的所有文件和目录都会被上传到 Docker 引擎中进行构建。因此,构建上下文的大小会直接影响构建时间和构建过程中网络传输的数据量。建议使用.dockerignore将构建上下文限制在必要的文件和目录范围内,避免上传无用文件和目录,以提高构建效率。

镜像构建

注意

规定在Dockerfile中第一条指令必须是FROM,作为制作镜像的最基础的镜像层,基础镜像可以是空镜像如:scratch 镜像

或许你已经注意到了,以上镜像构建使用的是docker build命令,它就是用来构建镜像的。构建是在服务端(docker引擎)进行的,我们知道docker是典型的C/S架构,通过构建命令会将当前上下文的文件传递给服务端,然后进行构建,这种架构也天然的支持分布式远端构建,这里不用了解太多。

语法:

sh
docker build [OPTIONS] PATH | URL | -

支持本地Dockerfile文件,还支持远程URL,如果文件是个tar压缩包,将会自动解压。常用的参数如下:

  • 构建上下文:指定上下文目录,默认.,可以是任何文件系统路径
  • -f:指定Dockerfile文件路径,其命名可以随意,默认当前路径下的Dockerfile文件
  • -t:镜像名及标签,如 nginx:1.1
  • --build-arg:Dockerfile构建arg参数
  • --no-cache:禁用构建缓存,强制重新构建镜像
  • --pull:强制每次重新拉取远程镜像

在构建命令前加上 DOCKER_BUILDKIT=1 参数可以查看构建构建日志和进度,便于调试

例子:

sh
docker build -t nginx:1.1 -f ../Dockerfile . --pull --no-cache

更多关于docker build的用法可以使用docker build -h了解

多阶段构建

到这里你基本上已经会简单的构建镜像了,但往往构建的镜像体积比较大,内部往往包含了一些无用的内容文件。如前端静态项目可能需要用node进行打包,最后用nginx提供http服务,实际并不需要node环境及文件,但还是一并放进了镜像中,体积会变大好多,这种情况可以使用多阶段构建解决。

Dockerfile 多阶段构建是一种优化 Docker 镜像构建过程的技术。它可以在一个 Dockerfile 文件中定义多个阶段,每个阶段可以使用不同的基础镜像和构建步骤,并且可以挑取上一阶段的产物,最终生成一个精简的镜像。

语法:

sh
FROM xxx AS stageName

同样的每个阶段都是以FROM开始,使用AS可以为当前阶段命名,名字需小写

例子:

docker
# build阶段
+FROM node:14.16.2 AS build
+WORKDIR /app
+COPY package.json .
+COPY src .
+RUN npm install && npm run build
+
+# 最后一个阶段
+FROM nginx:alpine
+COPY --from=build /app/dist /var/etc/nginx/html
+CMD ["nginx", "g", "daemon off;"]

这个Dockerfile定义了两个阶段的构建,第一阶段为build阶段,使用node:14.16.2为基础镜像,安装前端依赖并进行打包,产物为dist目录;第二阶段以nginx:alpine为基础镜像使用COPY --from=build将build阶段的/app/dist产物复制到第二阶段的nginx静态目录,最终设置容器的启动命令。最终打包出来的镜像只包含了最后一阶段的文件,不会包含build阶段的node内容,这样会使镜像的体积减小很多,也能在CI/CD中减小打包交付时间,提高效率

你可以尝试将以上的Dockerfile分别用单阶段和多阶段进行构建,对比下两者的大小,加深其作用印象

dockerignore

使用多阶段构建是一种优化手段,另一个重要的概念便是dockerignore,它是用来做什么的?前面也提到了docker是一个C/S架构,镜像的构建是在Docker Engine构建的,构建时会将构建上下文的文件全部上传到服务端,如果上传了一些不必要的文件,就会影响总体耗时。

docker也支持像.gitignore类似的配置文件.dockerignore,在构建上传文件时将会忽略掉.gitignore中匹配的文件或路径,从而缩短文件上传耗时。

.DS_Store
+node_modules
+*.md
+*/dist

构建前端项目

本次就分别以前端的静态项目和NodeJS项目为例子做个简单的构建演示

静态项目

静态项目用node打包,最终以nginx发布,源码地址👉点击这里

这里使用vite简单创建一个demo,使用react+ts模板

sh
npm create vite

编写Dockerfile:

docker
# docker发布前端静态项目简单demo
+FROM node:alpine as builder
+WORKDIR /app
+COPY . .
+RUN npm install && npm run build
+
+# 大小只有20MB左右
+FROM nginx:alpine
+COPY --from=builder /app/dist /usr/share/nginx/html
+CMD [ "nginx", "-g", "daemon off;" ]

构建镜像:

sh
docker build -t blog:v1 .

运行容器:

sh
docker run --rm -p 8088:80 blog:v1

以本人为例以上镜像大小只有22.4MB,浏览器输入IP:8088访问页面就可以看到静态页面了

NodeJS项目

NodeJS服务项目,使用pm2进行发布,源码地址👉点击这里。 初始化项目,并安装相应的依赖:

sh
npm init -y
+
+# package.json文件
+{
+  "name": "frontend-nodejs",
+  "version": "1.0.0",
+  "main": "index.js",
+  "dependencies": {
+    "dayjs": "^1.11.7",
+    "express": "^4.18.2"
+  }
+}

创建server.js文件:

js
const express = require("express");
+const app = express();
+const dayjs = require("dayjs");
+
+app.use((req, res) => {
+  console.log("【request】:" + req.url);
+  res.json({
+    code: 200,
+    date: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+    path: req.url,
+    query: {
+      ...req.query,
+    },
+  });
+});
+
+app.listen(10001, () => console.log("server is running on port 10001."));

创建pm2.json配置文件:

json
{
+  "apps": [
+    {
+      "name": "frontend-nodejs",
+      "script": "server.js",
+      "watch": false,
+      "instance": 3,
+      "autorestart": true,
+      "max_memory_restart": "1G",
+      "env": {
+        "NODE_ENV": "development"
+      },
+      "env_production": {
+        "NODE_ENV": "production"
+      }
+    }
+  ]
+}

Dockerfile配置文件:

docker
FROM node:alpine
+WORKDIR /app
+COPY package.json .
+RUN npm install && npm install pm2 -g
+COPY . .
+EXPOSE 10001
+ENTRYPOINT ["pm2-runtime", "start", "pm2.json", "--env", "production"]

构建镜像:

sh
docker build -t blog:v2 .

运行容器:

sh
docker run --rm -p 8088:10001 blog:v2

以本人为例以上镜像大小有200MB大小,浏览器输入IP:8088访问页面就可以页面了,你还可以控制台查看日志输出

构建优化

构建优化在生产环境中是非常必要的,常见的优化手段有:

  • 多阶段构建:使用多阶段构建可以减小镜像大小,提高构建速度。多阶段构建可以将构建环境和运行环境分离,只保留必要的文件和组件。
  • 使用 .dockerignore 文件:使用 .dockerignore 文件可以避免将不必要的文件和目录复制到镜像中,从而减小镜像大小。
  • 构建时使用缓存:使用 Dockerfile 构建缓存可以加速镜像构建过程。例如,在 Dockerfile 中,可以将不经常更改的指令放在前面,从而利用缓存。
  • 使用更小的基础镜像:使用更小的基础镜像可以减小镜像大小,提高镜像构建和部署的效率。

参考文档

总结

Dockerfile 是构建和管理 Docker 镜像的重要工具,使用它可以简化应用程序的部署和管理,并提高可重复性、可自动化性、可定制性和可扩展性。

`,222);function i(y,d,D,u,b,F){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[t,s(a),s(l)])}const B=p(c,[["render",i]]);export{m as __pageData,B as default}; diff --git a/assets/fullstack_docker_dockerfile.md.W4mEEOsy.lean.js b/assets/fullstack_docker_dockerfile.md.W4mEEOsy.lean.js new file mode 100644 index 000000000..96475bb26 --- /dev/null +++ b/assets/fullstack_docker_dockerfile.md.W4mEEOsy.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"使用Dockerfile构建镜像","description":"Dockerfile是一个文本文件里面包含了一条条构建镜像的指令,使用Dockerfile构建镜像更加方便、间接、透明","frontmatter":{"title":"使用Dockerfile构建镜像","description":"Dockerfile是一个文本文件里面包含了一条条构建镜像的指令,使用Dockerfile构建镜像更加方便、间接、透明","keywords":"Dockerfile构建镜像,Dockerfile构建优化,Dockerfile多阶段构建,Dockerfile如何运行,docker镜像构建,定制docker镜像","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/dockerfile.md","filePath":"fullstack/docker/dockerfile.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/dockerfile.md"},t=o("",222);function i(y,d,D,u,b,F){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[t,s(a),s(l)])}const B=p(c,[["render",i]]);export{m as __pageData,B as default}; diff --git a/assets/fullstack_docker_install-configure.md.76I1Z0j-.js b/assets/fullstack_docker_install-configure.md.76I1Z0j-.js new file mode 100644 index 000000000..163fb8d6c --- /dev/null +++ b/assets/fullstack_docker_install-configure.md.76I1Z0j-.js @@ -0,0 +1,77 @@ +import{_ as e,c as p,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const D=JSON.parse('{"title":"Docker安装与配置","description":"docker基础入门从安装到配置","frontmatter":{"title":"Docker安装与配置","description":"docker基础入门从安装到配置","keywords":"docker基础学习,docker安装配置,docker优缺点,centos安装docker","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/install-configure.md","filePath":"fullstack/docker/install-configure.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/install-configure.md"},t=o(`

Docker安装与配置

为什么出现Docker?传统的开发和部署存在着许多环境和配置的不兼容的问题,docker就是将环境和代码统一打包的来解决这些兼容问题。Docker是一个统一了运行环境和配置问题的虚拟容器技术,是一个内核级虚拟技术。使用镜像,保证了处处环境的一致性。

我们知道,如果将计算机的层次做一下简单的划分,最底层是硬件,最上层是软件,中间是操作系统。(这是一种极为笼统且不严谨不专业的划分,我只记到这里了……)我们非常熟悉的虚拟机,就是一个物理硬件层抽象,运行在硬件之上:它向下面对一套硬件和硬件接口,对其进行虚拟,然后向上提供一套独立的操作系统,然后就可以在操作系统之上再运行各种软件应用等(如下图右,可以无视那个“管理程序”层因为我也不知道是啥)。这就使得虚拟机这个东西非常庞大沉重(因为包含了一整套操作系统,一般都好几G,还可能有一套单独的存储空间),启动时间长(一般几分钟,有SSD不算),且不容易移植(因为我们知道,在安装操作系统的时候,会根据硬件的不同编译出不同的内核,而每台电脑的硬件配置几乎不会完全一样,因而直接把一台电脑的操作系统文件考到另一台一般是没法启动的)。而容器是一个应用层抽象,运行在操作系统之上的,确切地说是操作系统内核之上(如下图左),面对的是操作系统提供的接口,属于进程级别;容器对我们的代码和依赖进行打包,比如一个docker中只有一个python3,还有TensorFlow以及其他的package(经常会在一个docker中发现连“sudo”命令都没有);这样体积就很小,启动快(几秒几毫秒),且容易移植(不同硬件上的同一操作系统向上提供相同的接口)。

可以将容器镜像看作是mini版的虚拟机,但两者并不相通,先来看看二者优缺点。

优缺点

传统的虚拟技术要在一个机器上安装虚拟机、各种软件,再部署应用,存在一系列的缺点:

  • 需要虚拟出一套完整的硬件后,运行一个完整的操作系统,在系统上运行所需的应用程序
  • 启动慢
  • 资源占用多
  • 冗余步骤多
  • 迁移困难

而Docker使用容器化技术完美的解决了这些问题,其具备:

  • 直接运行与宿主机的内核
  • 容器内没有自己内核,没有进行硬件虚拟,更轻量
  • 容器相互隔离,互不影响
  • 更快交付、部署
  • 便捷升级和扩容
  • 统一标准、更简单的运维
  • 节约成本

有了容器化技术对于应用的部署更加方便,也更好维护,这也促使云原生的发展。

docker架构

Docker 架构分为客户端-服务器架构和主从架构,具体如下:

客户端-服务器架构:Docker 采用客户端-服务器架构,其中客户端是 Docker 命令行工具,用于与 Docker 服务端通信。Docker 服务端是 Docker 引擎,负责管理和运行 Docker 容器。客户端和服务端可以运行在同一台机器上,也可以通过网络连接运行在不同的机器上。

主从架构:Docker Swarm 是一个用于管理多个 Docker 容器的集群工具,采用主从架构。Docker Swarm 集群由一个管理节点和多个工作节点组成,管理节点负责整个集群的管理和调度,工作节点负责运行 Docker 容器。管理节点和工作节点可以运行在同一台机器上,也可以通过网络连接运行在不同的机器上。 iShot_2022-09-04_18.05.31

docker所安装的镜像在本地都是一个个文件,可以通过docker info查看存储位置

Docker三大组件

  • 镜像(Image):一个root文件系统的模板,相当于 一个类
  • 容器(Container):docker run 镜像就是容器(最小的linux内核文件和运行的应用程序),镜像和容器的关系,就像是面向对象程序设计中的 实例一样,镜像是静态的定义,容器是镜像运行时的实体
  • 仓库(Repositry):保存镜像的仓库,每个仓库可以包含多个Tag,对应不同的镜像

安装

本文基于ARM架构Centos7虚拟机安装的,如果你的环境和我不一致,可以参考官方文档或其他资料

  1. 卸载掉机器上可能存在的docker相关依赖,如果你没有安装过,可以忽略此步骤
sh
sudo yum remove docker \\
+  docker-client \\
+  docker-client-latest \\
+  docker-common \\
+  docker-latest \\
+  docker-latest-logrotate \\
+  docker-logrotate \\
+  docker-engine
  1. 配置docker仓库地址
sh
sudo yum install -y yum-utils
+
+# 设置ali仓库加速地址
+sudo yum-config-manager \\
+    --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 下载docker 这里你可以根据自己的需求安装指定版本的docker,不指定版本默认latest最新版本
sh
# 查看可安装的版本
+yum list docker-ce --showduplicates | sort -r
+
+# 这里安装最新版
+sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 启动docker并配置开机自启
sh
systemctl enable docker --now
  1. 查看docker状态
sh
# 查看运行状态
+systemctl status docker
+ docker.service - Docker Application Container Engine
+   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
+   Active: active (running) since 四 2023-03-23 22:22:10 CST; 7h left
+     Docs: https://docs.docker.com
+ Main PID: 1406 (dockerd)
+    Tasks: 9
+   Memory: 100.0M
+   CGroup: /system.slice/docker.service
+           └─1406 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
+
+# 查看版本
+docker version
+Client: Docker Engine - Community
+ Version:           23.0.1
+ API version:       1.42
+ Go version:        go1.19.5
+ Git commit:        a5ee5b1
+ Built:             Thu Feb  9 19:49:05 2023
+ OS/Arch:           linux/arm64
+ Context:           default
+
+Server: Docker Engine - Community
+ Engine:
+  Version:          23.0.1
+  API version:      1.42 (minimum version 1.12)
+  Go version:       go1.19.5
+  Git commit:       bc3805a
+  Built:            Thu Feb  9 19:47:21 2023
+  OS/Arch:          linux/arm64
+  Experimental:     false
+ containerd:
+  Version:          1.6.18
+  GitCommit:        2456e983eb9e37e47538f59ea18f2043c9a73640
+ runc:
+  Version:          1.1.4
+  GitCommit:        v1.1.4-0-g5fd4c4d
+ docker-init:
+  Version:          0.19.0
+  GitCommit:        de40ad0
  1. 运行hello-world镜像
sh
docker run hello-world
+Unable to find image 'hello-world:latest' locally
+latest: Pulling from library/hello-world
+93288797bd35: Pull complete
+Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
+Status: Downloaded newer image for hello-world:latest
+
+Hello from Docker!

以上运行hello-world镜像时需要先从远程仓库下载镜像到本地,然后才可以运行,由于docker的官方仓库在国外,对于国内用户访问比较慢,因此需要配置一些国内镜像加速地址,才会加快下载速度

配置

配置vim /etc/docker/daemon.json没有此文件的可以自行创建json文件

json
{
+  "registry-mirrors": [
+  	// aliyun
+    "https://xxxxxx.mirror.aliyuncs.com",
+    // 网易
+    "https://hub-mirror.c.163.com",
+    // 腾讯
+    "https://mirror.ccs.tencentyun.com",
+    // 国内docker
+    "https://registry.docker-cn.com",
+    // 科大
+    "https://docker.mirrors.ustc.edu.cn"
+  ]
+}

更多配置参考👉官方文档

修改了配置文件后需要重启服务:

sh
systemctl daemon-reload
+systemctl restart docker
`,38);function i(y,d,b,u,m,F){const a=n("Reward"),l=n("Gitalk");return r(),p("div",null,[t,s(a),s(l)])}const B=e(c,[["render",i]]);export{D as __pageData,B as default}; diff --git a/assets/fullstack_docker_install-configure.md.76I1Z0j-.lean.js b/assets/fullstack_docker_install-configure.md.76I1Z0j-.lean.js new file mode 100644 index 000000000..10efd8616 --- /dev/null +++ b/assets/fullstack_docker_install-configure.md.76I1Z0j-.lean.js @@ -0,0 +1 @@ +import{_ as e,c as p,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const D=JSON.parse('{"title":"Docker安装与配置","description":"docker基础入门从安装到配置","frontmatter":{"title":"Docker安装与配置","description":"docker基础入门从安装到配置","keywords":"docker基础学习,docker安装配置,docker优缺点,centos安装docker","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/install-configure.md","filePath":"fullstack/docker/install-configure.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/install-configure.md"},t=o("",38);function i(y,d,b,u,m,F){const a=n("Reward"),l=n("Gitalk");return r(),p("div",null,[t,s(a),s(l)])}const B=e(c,[["render",i]]);export{D as __pageData,B as default}; diff --git a/assets/fullstack_docker_network.md.k3FDmQ9F.js b/assets/fullstack_docker_network.md.k3FDmQ9F.js new file mode 100644 index 000000000..f844bee88 --- /dev/null +++ b/assets/fullstack_docker_network.md.k3FDmQ9F.js @@ -0,0 +1,59 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Docker网络原理","description":"你知道docker几种网络模式背后的原理吗","frontmatter":{"title":"Docker网络原理","description":"你知道docker几种网络模式背后的原理吗","keywords":"docker网络原理,docker网络桥接,docker网络主机模式,docker网络三种模式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/network.md","filePath":"fullstack/docker/network.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/network.md"},t=o(`

Docker网络原理

docker中网络的概念也是非常重要,它对于容器资源的隔离也起着非常重要的作用。

你有没有在启动一个容器后查看它的ip,假如你启动了一个nignx容器,你想在主机上访问它,首先得知道他的ip地址,可以通过以下方式获取:

sh
docker inspect nginx |grep -A 20  Networks
+# ...
+"Networks": {
+    "bridge": {
+        # .....
+        "Gateway": "172.17.0.1",
+        "IPAddress": "172.17.0.2",
+        "IPPrefixLen": 16
+    }
+}

可以查看nginx容器的网关为172.17.0.1,ip地址为172.17.0.2,在虚拟机上访问nginxcurl 172.17.0.2发现是可以访问到nginx页面,但是当你从电脑主机浏览器上访问此ip地址就会访问不通

原理

Docker 网络的核心原理是通过创建网络命名空间和虚拟网络设备来实现容器间的网络隔离和通信。每个 Docker 容器都有自己的网络命名空间,其中包含了一个虚拟网络设备和一个 IP 地址。容器的网络命名空间使得容器内部的网络设备和 IP 地址与宿主机和其他容器隔离,从而实现了容器间的网络隔离和通信。

通俗的讲docker会在宿主机上创建一个默认的docker网桥(docker0172.17.0.1),启动容器时会根据docker网桥的网络随机分配一个虚拟ip,同时docker网桥作为每个容器的默认网关,这样虽然每个容器的ip不一致,但是都是处于同一个网关下,所以容器间都可以通过docker0网关进行访问。

因为docker0网关是在主机上虚拟出来的,只能内部进行访问,外部是无感的无法访问到的。通过ip aifconfig 查看主机上的docker0虚拟网卡:

sh
ip a | grep -A 5 docker0
+4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
+    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

从中看出docker0分配的网络为172.17.0.1/16,其前16位是个网络地址,后16位是主机地址,在这个子网中,可以分配的有效 IP 地址范围是从 172.17.0.1172.17.255.254,共有 65534 个可用的 IP 地址。其中,172.17.0.0 是子网的网络地址,172.17.255.255 是子网的广播地址,不能被分配给主机。

访问过程

Docker 容器启动时,Docker 引擎会自动创建一对 veth 设备,一个设备被添加到容器的网络命名空间,另一个设备则被添加到宿主机的网络命名空间中。在容器内部,这个 veth 设备通常被命名为 eth0,并被分配一个 IP 地址;而在宿主机上,这个 veth 设备通常被命名为 docker0,并被分配一个与容器在同一子网中的 IP 地址。

当容器需要与宿主机或其他容器进行通信时,数据包将通过容器内部的 veth 设备发送到宿主机的虚拟网桥,然后再通过宿主机的 veth 设备转发到目标容器或宿主机的网络命名空间中。

image-20230326174156350

网络类型

Docker 提供了多种网络类型和网络驱动,以满足不同场景下的网络需求。以下是 Docker 支持的主要网络类型:

  • bridge:bridge 网络是 Docker 默认的网络类型,它使用 Linux 的虚拟网桥docker0实现容器间或与宿主机之间的通信。在 bridge 网络中,每个容器都会分配一个唯一的 IP 地址,并通过一个虚拟网桥连接到宿主机的网络中
  • host:host 网络是一种特殊的网络类型,它允许 Docker 容器直接使用宿主机的网络设备和 IP 地址,与宿主机共享网络栈。在 host 网络中,容器不会被分配独立的 IP 地址,而是直接使用宿主机的 IP 地址
  • none:none网络是一种完全隔离的网络类型,它不为容器分配任何网络资源,容器内部无法访问外部网络,也无法被外部网络访问
  • container:新建的容器不会创建自己的网卡而是共同使用指定容器的,除了网络外,其他如文件系统等等都是隔离的,关闭目标container,将会变为none
  • 自定义网络:前者在容器内只能通过ip进行通信,不能通过容器名进行通信,而ip又是动态的,可能会随时变化,而docker允许你使用自定义网络,新建的网络默认是桥接bridge,集群里同一个服务里的所有容器使用自定义网络时,可以通过容器名进行访问,这种方式常用

除了上述网络类型外,Docker 还支持使用第三方网络驱动来实现自定义的网络类型和网络功能。例如,可以使用 Calico 网络驱动实现高级的网络功能,如策略路由、安全组、网络隔离等。

网络列表

在没有创建自定义网络的条件下,docker默认会存在三种网络:桥接(brige)、宿主机(host)、none

sh
 docker network ls
+NETWORK ID     NAME      DRIVER    SCOPE
+3d9d929e9d34   bridge    bridge    local
+73acd36f196e   host      host      local
+f71a4582a6c0   none      null      local

创建网络

创建自定义网络mynetwork

sh
 docker network create mynetwork
+c1f9f873cb89c803a905f3a8c61aed4bc8ab3f9184d00fa0327a9a6dfc6d70b7
+ docker network ls
+NETWORK ID     NAME        DRIVER    SCOPE
+3d9d929e9d34   bridge      bridge    local
+73acd36f196e   host        host      local
+c1f9f873cb89   mynetwork   bridge    local
+f71a4582a6c0   none        null      local

使用网络

在创建和管理容器时,可以指定容器使用的网络类型和网络配置,这里演示多个容器使用同一个网络,并采用容器名的方式方式进行访问

  1. 创建一个busybox并使用自定义网络,查看其ip为172.18.0.2
sh
 docker run -it --network mynetwork --rm --name busybox busybox /bin/sh
+/ # ip a
+1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
+    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+    inet 127.0.0.1/8 scope host lo
+       valid_lft forever preferred_lft forever
+22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
+    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
+    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
+       valid_lft forever preferred_lft forever
  1. 创建一个alpine使用自定义网络,查看其ip为172.18.0.3
sh
 docker run -it --network mynetwork --rm --name alpine alpine /bin/sh
+/ # ip a
+1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
+    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+    inet 127.0.0.1/8 scope host lo
+       valid_lft forever preferred_lft forever
+24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
+    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
+    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
+       valid_lft forever preferred_lft forever

两个容器创建好后,尝试分别使用ip和容器名的方式ping对方,看是否能ping通:

  • 使用ip方式:
    sh
    # busybox
    +/ # ping 172.18.0.3
    +PING 172.18.0.3 (172.18.0.3): 56 data bytes
    +64 bytes from 172.18.0.3: seq=0 ttl=64 time=1.588 ms
    +64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.475 ms
    +
    +# alpine
    +/ # ping 172.18.0.2
    +PING 172.18.0.2 (172.18.0.2): 56 data bytes
    +64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.163 ms
    +64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.410 ms
  • 使用容器名:
    sh
    # busybox 
    +/ # ping alpine
    +PING alpine (172.18.0.3): 56 data bytes
    +64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.246 ms
    +
    +# alpine 
    +/ # ping busybox
    +PING busybox (172.18.0.2): 56 data bytes
    +64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.246 ms

采用服务名的方式在集群系统里是常见的,他解决ip动态改变,而不需要频繁改ip地址的问题,其内部本质还是将名字和ip进行的动态绑定,添加了对应的DNS记录,这样就可以知道服务的ip了

总结

Docker一个重要概念是容器间的DNS服务。Docker默认提供了一个DNS服务,使得容器可以通过容器名称或服务名称来互相访问。Docker DNS 服务基于 Docker 内置的 DNS 服务器实现,每个容器都可以通过 docker.internal 域名来访问其他容器。

总的来说,Docker 网络的核心原理是通过创建网络命名空间和虚拟网络设备来实现容器间的网络隔离和通信,同时提供了多种网络模式和网络驱动,以满足不同场景下的网络需求。

`,37);function i(y,C,d,b,F,D){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[t,s(a),s(l)])}const B=p(c,[["render",i]]);export{m as __pageData,B as default}; diff --git a/assets/fullstack_docker_network.md.k3FDmQ9F.lean.js b/assets/fullstack_docker_network.md.k3FDmQ9F.lean.js new file mode 100644 index 000000000..80b64fe7d --- /dev/null +++ b/assets/fullstack_docker_network.md.k3FDmQ9F.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Docker网络原理","description":"你知道docker几种网络模式背后的原理吗","frontmatter":{"title":"Docker网络原理","description":"你知道docker几种网络模式背后的原理吗","keywords":"docker网络原理,docker网络桥接,docker网络主机模式,docker网络三种模式","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/network.md","filePath":"fullstack/docker/network.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/network.md"},t=o("",37);function i(y,C,d,b,F,D){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[t,s(a),s(l)])}const B=p(c,[["render",i]]);export{m as __pageData,B as default}; diff --git a/assets/fullstack_docker_npm-repository.md.9jm80i0a.js b/assets/fullstack_docker_npm-repository.md.9jm80i0a.js new file mode 100644 index 000000000..f29d43c8a --- /dev/null +++ b/assets/fullstack_docker_npm-repository.md.9jm80i0a.js @@ -0,0 +1,155 @@ +import{_ as l,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"使用Docker搭建npm仓库","description":"使用Docker搭建属于自己的npm私有仓库的完整教程","frontmatter":{"title":"使用Docker搭建npm仓库","description":"使用Docker搭建属于自己的npm私有仓库的完整教程","keywords":"npm私有仓库,搭建npm仓库,docker搭建npm仓库","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-npm.png"},"headers":[],"relativePath":"fullstack/docker/npm-repository.md","filePath":"fullstack/docker/npm-repository.md","lastUpdated":1706247228000}'),r={name:"fullstack/docker/npm-repository.md"},t=o(`

使用Docker搭建npm仓库

在公司团队内一般都会拥有私有的工具包或者其他依赖,这些东西又是比较敏感的信息,因此如npm私库的搭建在公司内部必不可少。

TIP

私库搭建方式有很多,本篇通过docker+nexus3的进行搭建。 本人使用ARM架构Centos7.9虚拟机环境进行搭建,请你阅前了解

安装docker

docker安装步骤可以参考本人的 docker安装一文

sh
sudo yum remove docker \\
+  docker-client \\
+  docker-client-latest \\
+  docker-common \\
+  docker-latest \\
+  docker-latest-logrotate \\
+  docker-logrotate \\
+  docker-engine
+
+sudo yum install -y yum-utils
+sudo yum-config-manager \\
+    --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
+
+# 查看可安装的docker版本
+sudo yum list docker-ce --showduplicates | sort -r
+
+sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
+
+# 启动docker
+sudo systemctl start docker

安装nexus3

  1. 这里采用宿主机卷映射,先创建nexus配置卷

    sh
    mkdir -p /srv/nexus
    +
    +# 授权
    +chown -R 200 /srv/nexus
  2. 下载镜像并运行

    这里本人是在arm架构的Centos上安装的,需要支持arm架构的nexus镜像,由于官方镜像没有提供支持arm架构的镜像,这里选择了别人编译好的支持arm架构的镜像,你可以选择非arm架构的官方镜像

    sh
    # 启动nexus3容器,会从远程拉取镜像
    +docker pull klo2k/nexus3 # arm架构
    +
    +# 运行容器
    +docker run -d --name nexus3 --restart=always \\
    +    -p 8081:8081 \\
    +    -p 8000-8010:8000-8010 \\
    +    -v /srv/nexus:/nexus-data \\
    +    klo2k/nexus3

    nexus内部默认会使用8001作为http访问的端口,把它映射到主机上,然后再暴露一个端口范围供后续其他使用

  3. 运行后根据机器配置一般需要等待一段时间,你可以查看其运行日志:

    sh
    docker logs -f nexus3

初始密码

nexus的默认账户为admin,初始密码在容器内/nexus-data/admin.password文件中,如果你进行了卷挂载也可以在宿主机卷中查看

sh
# 进入容器查看admin密码
+docker exec nexus3 cat /nexus-data/admin.password
+b75981d3-affe-45f1-ba6f-10046b8bc4b9
+
+# 挂载了数据卷可以进行本地查看
+cat /srv/nexus/admin.password

访问nexus3

访问地址为YourIP:PORT如localhost:8081,用初始账号密码进行登录,admin/xxxxx ,初次进入后可以修改密码

nexus1

基本面板左侧可以查找对应的仓库包文件,Brower菜单进入可以看到对应的仓库

image-20230320162008106

image-20230320162051975

上面的设置按钮需要有权限才可以看到,当前admin用户,可以看到,你也可以创建其他用户并分配适当的权限,所有的仓库储存、角色权限等操作都在设置面板里配置。

通常我们只需要关注下图红框中的配置即可

image-20230320162812212

创建存储集

创建数据存储单元集用来存放数据,你可以将Blob store理解为存储文件的地方,repository相当于数据库用来映射文件路径。

为什么要创建Blob Store呢?当你创建了某个blobstore就会某个关联的repository的内容存储到这里,你可以创建多个blobstore关联多个repository,这样就防止了数据的污染。

点击左侧菜单Blob Stores ,然后点击右侧 Create Blob Store 按钮

image-20230320163655564

然后创建页面先选择数据类型,这里选择 File 类型,然后给数据存储单元命名,最好语义明确如:npm,方便以后查看,都填写后点击保存按钮即可,列表中就会看到刚刚创建的存储单元集合

image-20230320163718336

创建仓库

创建仓库关联存储集,点击左侧菜单Repositories ,然后点击右侧 Create Repository 按钮

image-20230320163852830

然后选择npm(hosted),这里你会看到有hosted、proxy、group三类npm仓库,三者区别后面会讲。

进入创建仓库配置页面,如下,需要填写仓库名称、存储集、发布策略

image-20230320164334735

注意以下几点:

  • 同一类型的仓库名需要唯一,防止和旧的仓库重名
  • 储存集选择你前面创建的存储集,如npm
  • 发布策略中包含集中策略:根据你的需求设置,这里选择允许重发
    • 允许重发
    • 禁止重发
    • 只读
    • 通过复制发布(不推荐)

      来自官方的解释:If you are using replication, this policy is automatically set to Deploy by Replication Only. This will block all deployment to the hosted repository except by the internal replication mechanism. You should not manually set this policy to Deploy by Replication Only. If you disable replication, Nexus Repository automatically restores your previous deployment policy.

最后点击创建仓库按钮,就可以在仓库列表中找到刚刚创建的仓库了

image-20230320165149705

点击copy按钮查看仓库地址

image-20230320165406279

创建角色

前面npm-hosted创建好后,其实就可以上传自己的npm包到这个仓库了,一般不会使用系统账户进行登录发包,所以需要创建新的用户并授权npm相关权限,因此需要创建对应的角色和权限

点击左侧Roles菜单栏,在右侧面板点击创建角色,填写对应的角色名、id、描述等(仍然推荐语义明确)

image-20230320165944937

然后选择对应的权限,搜索npm,点击Transfer All将所有加入右侧列表

image-20230320170145483

如果你有还需要其他权限可以自行添加,这里讲下除了可以选择权限外,也可以选择已经存在的角色,这样也会拥有其权限,效果一样

image-20230320170353059

最后点击保存

创建用户

有了角色就可以创建用户关联此角色了,点击左侧Users菜单,在右侧面板中点击创建用户

image-20230320170654757

  • 用户ID:用来登录npm的用户名
  • Firstname:显示名字,随意填
  • Lastname:随意填
  • Email:可以随意填
  • password:你的密码
  • status:用户状态,选择active

WARNING

以上红框中需要重视其他可以随意填

接着关联角色,将刚刚创建的角色移入右侧,点击创建

image-20230320171019351

权限认证

有了相关的角色后,需要对一些权限添加认证,也就是需要登录认证,才可以进行操作

点击左侧Realms菜单,将你需要认证的权限移入右侧,点击保存

image-20230320171459435

发布npm包

  1. 本地使用npm初始化创建一个项目

    sh
    npm init -y

    这里package.json文件内容如下,主文件为index.js

    json
    {
    +  "name": "test-deploy",
    +  "version": "1.0.0",
    +  "description": "",
    +  "main": "index.js",
    +  "scripts": {
    +  },
    +  "keywords": [],
    +  "author": "",
    +  "license": "ISC"
    +}
  2. 简单创建一个index.js文件:

    js
    const add = (x, y) => x + y;
    +
    +module.exports = {
    +  add
    +}
  3. 设置npm仓库,你可以使用npm config set registry xxxx 创建,这里推荐在项目创建.npmrc文件

    sh
    # 地址改为自己 npm-hosted 仓库地址
    +registry=http://192.168.10.10:8081/repository/npm-hosted/

    或者在package.json中添加:

    json
    "publishConfig": {
    +    "registry": "http://192.168.10.10:8081/repository/npm-hosted/"
    + }

    image-20230320172745102

  4. 登录并发布

    sh
    # 使用创建的用户登录
    +npm login

    image-20230320173208309

    sh
    # 发布
    +npm publish

    image-20230320173258611

  5. 在仓库中查看

    image-20230320173512796

    image-20230320173424057

验证npm包

在一个新项目中安装上传的npm包,注意如果你没有设置npm全局仓库配置,需要创建.npmrc添加npm仓库

image-20230320174205932

可以看到安装成功,接着创建index.js文件并引用里面的add方法

js
// index.js
+const { add } = require('test-deploy');
+console.log(add(1,2));

image-20230320174525384

可以看到运行成功

这里有一个坑,之所以安装成功,是因为我们的库中没有依赖其他的npm包,如果有依赖私有仓库没有的npm包,这里安装时就会报错,我们复现下:

重新在我们的npm包里安装一个私有仓库没有的依赖,这里安装day,注意需要先把.npmrc中的仓库注释掉,这样可以从官方的npm仓库中下载

sh
# test-deploy 中安装 day
+ devops test-deploy npm install day
+npm notice created a lockfile as package-lock.json. You should commit this file.
+npm WARN test-deploy@1.0.0 No description
+npm WARN test-deploy@1.0.0 No repository field.
+
++ day@0.0.2
+added 1 package from 1 contributor and audited 1 package in 1.57s
+found 0 vulnerabilities

修改版本号:

json
{
+  "name": "test-deploy",
+  "version": "1.0.1",
+  "description": "",
+  "main": "index.js",
+  "scripts": {},
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "day": "0.0.2"
+  }
+}

重新发布:注意.npmrc添加仓库地址

sh
 devops test-deploy npm publish
+npm notice
+npm notice 📦  test-deploy@1.0.1
+npm notice === Tarball Contents ===
+npm notice 56B  index.js
+npm notice 208B package.json
+npm notice === Tarball Details ===
+npm notice name:          test-deploy
+npm notice version:       1.0.1
+npm notice package size:  305 B
+npm notice unpacked size: 264 B
+npm notice shasum:        47437424c9652266929c74a9870e54c0fb0db253
+npm notice integrity:     sha512-zU8+K0q2vJWgD[...]NSzuMA5PKURmw==
+npm notice total files:   2
+npm notice
++ test-deploy@1.0.1

在另一个项目中重新安装我们的包:

sh
 devops use-npm-package rm -rf node_modules package-lock.json
+ devops use-npm-package npm i
+npm ERR! code E404
+npm ERR! 404 Not Found - GET http://192.168.10.10:8081/repository/npm-hosted/day - Package 'day' not found
+npm ERR! 404
+npm ERR! 404  'day@0.0.2' is not in the npm registry.
+npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
+npm ERR! 404 It was specified as a dependency of 'test-deploy'
+npm ERR! 404
+npm ERR! 404 Note that you can also install from a
+npm ERR! 404 tarball, folder, http url, or git url.
+
+npm ERR! A complete log of this run can be found in:

发现安装失败,说npm ERR! 404 Not Found - GET http://192.168.10.10:8081/repository/npm-hosted/day - Package 'day' not found,也就是在我们的私有仓库中找不到daynpm包,其实npm下载时,也会下载包的依赖,所以会造成这种现象。接下来介绍proxy、group两种类型的仓库

proxy和group仓库

nexus3准备了3种仓库类型:

  • hosted:本地存储仓库,说白了就是用nexus托管存储包的仓库
  • proxy:代理仓库,可以代理到其他仓库,如npm官方仓库、淘宝仓库
  • group:组合多个仓库为一个地址

了解了这几种仓库类型,就可以解决上面的问题了,通过proxy代理其他的仓库,然后使用group关联hosted和proxy,这样在安装包文件时对于私库不存在的包就会代理到其他仓库下载

创建proxy

image-20230320182138263

选择存储集为npm,点击创建

image-20230320182220009

创建group

创建仓库选择npm(group),选择存储集,将npm(hosted)npm(proxy)选中移入右侧后创建

image-20230320182346688

这样就可以使用npm(group)的地址作为npm私库地址了

WARNING

需要注意的是,右侧的顺序有优先级,当多个仓库都有同一个包时,优先下载第一个仓库的包

验证私库

需要注意的是发布包到npm-group是个付费功能😂,你可以发布包的时候用npm-hosted地址,安装包时用npm-group

修改.npmrc为你的group地址

sh
# .npmrc
+registry=http://192.168.10.10:8081/repository/npm-group/
+
+# hosted也行,重新拉取
+registry=http://192.168.10.10:8081/repository/npm-hosted/

重新安装,查看day也被成功安装了

sh
 devops use-npm-package npm i
+npm notice created a lockfile as package-lock.json. You should commit this file.
+npm WARN use-npm-package@1.0.0 No description
+npm WARN use-npm-package@1.0.0 No repository field.
+
+added 2 packages from 1 contributor in 0.108s
+ devops use-npm-package tree -a
+.
+├── index.js
+├── node_modules
+│   ├── day
+│   │   ├── day.js
+│   │   ├── package.json
+│   │   └── readme.md
+│   └── test-deploy
+│       ├── index.js
+│       └── package.json
+├── .npmrc
+├── package.json
+└── package-lock.json
+
+3 directories, 9 files
+ devops use-npm-package node index.js
+3

打标签

sh
npm version 1.0.1
+
+# 没有指定标签,默认为latest
+npm publish --tag beta
+
+# 查看包信息
+npm info packageName
+
+# 示例
+ devops test-deploy npm info test-deploy
+
+test-deploy@1.0.3 | ISC | deps: 1 | versions: 6
+
+dist
+.tarball: http://192.168.10.10:8081/repository/npm-hosted/test-deploy/-/test-deploy-1.0.3.tgz
+.shasum: e2dde05711a25e6c9df33567ae205f603eeeaead
+.integrity: sha512-3pNZUUkDsupK7F0gzGWQXh4rFpZVvfHs+6brPKmA9oxnSyYbmb0L9NDH5+BW2iBRGYgS91UXwOQWiJJHgfo9cg==
+
+dependencies:
+day: 0.0.2
+
+dist-tags:
+beta: 1.0.3    latest: 1.0.3
+
+published 5 minutes ago

不断更新中...

`,100);function i(y,m,u,d,b,F){const a=n("Reward"),p=n("Gitalk");return c(),e("div",null,[t,s(a),s(p)])}const h=l(r,[["render",i]]);export{C as __pageData,h as default}; diff --git a/assets/fullstack_docker_npm-repository.md.9jm80i0a.lean.js b/assets/fullstack_docker_npm-repository.md.9jm80i0a.lean.js new file mode 100644 index 000000000..e72cf2acc --- /dev/null +++ b/assets/fullstack_docker_npm-repository.md.9jm80i0a.lean.js @@ -0,0 +1 @@ +import{_ as l,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"使用Docker搭建npm仓库","description":"使用Docker搭建属于自己的npm私有仓库的完整教程","frontmatter":{"title":"使用Docker搭建npm仓库","description":"使用Docker搭建属于自己的npm私有仓库的完整教程","keywords":"npm私有仓库,搭建npm仓库,docker搭建npm仓库","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-npm.png"},"headers":[],"relativePath":"fullstack/docker/npm-repository.md","filePath":"fullstack/docker/npm-repository.md","lastUpdated":1706247228000}'),r={name:"fullstack/docker/npm-repository.md"},t=o("",100);function i(y,m,u,d,b,F){const a=n("Reward"),p=n("Gitalk");return c(),e("div",null,[t,s(a),s(p)])}const h=l(r,[["render",i]]);export{C as __pageData,h as default}; diff --git a/assets/fullstack_docker_volume-store.md.qcpOQfjk.js b/assets/fullstack_docker_volume-store.md.qcpOQfjk.js new file mode 100644 index 000000000..3c5066a76 --- /dev/null +++ b/assets/fullstack_docker_volume-store.md.qcpOQfjk.js @@ -0,0 +1,21 @@ +import{_ as l,c as o,J as s,V as p,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"Docker数据卷与持久化","description":"docker数据卷挂载使用与数据持久化原理","frontmatter":{"title":"Docker数据卷与持久化","description":"docker数据卷挂载使用与数据持久化原理","keywords":"docker数据卷,docker volume,docker持久化","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/volume-store.md","filePath":"fullstack/docker/volume-store.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/volume-store.md"},t=p(`

Docker数据卷与持久化

本篇来讲docker数据卷(volume)的使用,那为什么要使用数据卷呢?通过前面文章的学习,大家都了解了如何去运行一个容器。假如你在本地测试运行一个mysql的容器,为你的本地应用程序做持久化服务,但当你删除这个容器后重新启动一模一样的容器,再次查看会发现数据都不见了,当然了你可能不会自己删除,但如果是团队使用呢,那就会有数据丢失的风险。因此docker中引入了数据卷的概念,用来做数据持久化的。

概念与作用

Docker 数据卷是 Docker 容器持久化存储的重要组成部分。它允许用户将容器中的数据与容器实例分离,使数据持久化,方便数据的管理和迁移。Docker 数据卷(Docker Volumes)是一种特殊的目录,可以在容器之间共享和重用。数据卷可以在容器之间传递数据,而不需要使用联合文件系统。数据卷在 Docker 主机上独立于容器生命周期而存在,即使容器被删除,数据卷也不会受到影响。这使得数据卷成为容器中数据持久化的理想选择。

使用Docker 数据卷相比使用容器储存来讲的好处有:

  • 持久化存储数据:Docker 容器中的数据是存储在容器存储层中的,容器被删除或重建时数据也会被删除。使用数据卷可以将数据存储在宿主机上,即使容器被删除或重建,数据仍然可以保留。
  • 方便数据共享:多个容器可以通过挂载同一个数据卷来共享数据,方便了数据的共享和备份。
  • 更好的移植性:使用数据卷可以将容器与数据分离,使得容器更易于移植和部署。
  • 更好的性能:使用数据卷可以将容器中的数据存储在宿主机上,可以减少容器存储层的使用,提高容器的性能。

TIP

容器使用卷的本质其实就是文件或路径的挂载,类似与linux或dfs这种文件系统的挂载。

卷的类型

Docker 数据卷(volume)可以分为三种类型:主机挂载(host-mounted)、命名卷(named volume)和临时卷(tmpfs volume)。

  1. 主机挂载 主机挂载是最基本的数据卷类型,它将宿主机上的目录或文件夹直接挂载到容器中。主机挂载的优点是简单易用,但缺点是不够灵活,容器与宿主机的路径绑定较为紧密。

  2. 命名卷 命名卷是 Docker 引擎管理的卷,可以在多个容器之间共享和重用。命名卷的优点是灵活性大,容器与宿主机的路径解耦,可以在多个容器之间共享数据卷,但缺点是需要手动创建和管理。

  3. 临时卷 临时卷是一种轻量级的数据卷类型,仅存在于容器的生命周期中。临时卷的优点是方便快捷,不需要手动创建和管理,但缺点是数据不会持久化,容器停止后数据会丢失。

卷的使用

docker卷也是其一种对象资源,和其他如镜像、容器资源类似都有创建、查看、删除等相关的命令

创建

卷的创建指的是命名卷的创建,docker volume create 是 Docker 命令行工具提供的创建数据卷的命令。它用于创建一个新的 Docker 数据卷(Docker volume),以便将宿主机上的目录或文件夹挂载到 Docker 容器中。

sh
docker volume create name

使用docker创建的volume,其文件路径会被存放到/var/lib/docker/volumes文件路径下

查看

查看已经创建的数据卷,这里只能查看使用docker创建管理的卷,如果直接使用宿主机的文件或路径,没有经过docker管理,就不会包含在卷的列表中

sh
docker volume ls
+
+ docker volume ls
+DRIVER    VOLUME NAME
+local     1e1b4617ad8377a9b60029362215f35cc298c2d8d1c7fa5d1691d164795872c9
+local     5cda6686c50d24138ea5285d035afb639e275b6cac3f0671dd8b3cf895eb3c3a
+local     5e58646a0a1d133084a671b03b4878b730cba730818e062edbecc539a6e6a80a

删除

删除卷会删除宿主机/var/lib/docker/volumes路径下指定的文件夹

sh
docker volume rm name
+
+# 删除名为 demo 卷
+docker volume rm demo

挂载

在运行 Docker 容器时使用 -v--mount 参数来指定数据卷的挂载方式

sh
# 使用数据卷
+docker run -v someVolume:/path/on/container
+
+# 使用宿主机路径
+docker run -v /path/on/host:/path/on/container myimage

可以使用--mount参数时指定数据卷的类型、权限等等

sh
# 使用宿主机路径
+docker run --mount type=bind,source=/host/somedir,target=/path/on/container
+
+# 使用命名卷,并添加 rw 读写权限,不写默认是读写
+docker run --mount type=volume,source=myvolume:rw
+
+# 使用临时卷
+docker run --mount type=tmpfs,destination=/path/on/containter:rw

总结

本篇讲了docker数据卷的使用,它是一种持久化存储数据的机制,可以将容器内的数据持久化到宿主机上,或者在多个容器之间共享数据。使用 Docker 数据卷可以实现高效的数据管理和迁移,同时也可以提高容器的可移植性和灵活性。

`,29);function i(d,u,m,b,h,k){const e=a("Reward"),n=a("Gitalk");return r(),o("div",null,[t,s(e),s(n)])}const C=l(c,[["render",i]]);export{v as __pageData,C as default}; diff --git a/assets/fullstack_docker_volume-store.md.qcpOQfjk.lean.js b/assets/fullstack_docker_volume-store.md.qcpOQfjk.lean.js new file mode 100644 index 000000000..3f66ee4c0 --- /dev/null +++ b/assets/fullstack_docker_volume-store.md.qcpOQfjk.lean.js @@ -0,0 +1 @@ +import{_ as l,c as o,J as s,V as p,o as r,G as a}from"./chunks/framework.SV1ROkXV.js";const v=JSON.parse('{"title":"Docker数据卷与持久化","description":"docker数据卷挂载使用与数据持久化原理","frontmatter":{"title":"Docker数据卷与持久化","description":"docker数据卷挂载使用与数据持久化原理","keywords":"docker数据卷,docker volume,docker持久化","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-docker.png"},"headers":[],"relativePath":"fullstack/docker/volume-store.md","filePath":"fullstack/docker/volume-store.md","lastUpdated":1706247228000}'),c={name:"fullstack/docker/volume-store.md"},t=p("",29);function i(d,u,m,b,h,k){const e=a("Reward"),n=a("Gitalk");return r(),o("div",null,[t,s(e),s(n)])}const C=l(c,[["render",i]]);export{v as __pageData,C as default}; diff --git a/assets/fullstack_gitlab_gitlab-pipeline.md.e1alnaT7.js b/assets/fullstack_gitlab_gitlab-pipeline.md.e1alnaT7.js new file mode 100644 index 000000000..220f76118 --- /dev/null +++ b/assets/fullstack_gitlab_gitlab-pipeline.md.e1alnaT7.js @@ -0,0 +1,264 @@ +import{_ as a,c as n,J as t,V as p,o,G as s}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Gitlab流水线配置","description":"带你理解gitlab流水线的概念,熟练掌握流水线的常用技巧","frontmatter":{"title":"Gitlab流水线配置","description":"带你理解gitlab流水线的概念,熟练掌握流水线的常用技巧","keywords":"gitlab流水线,流水线,CI/CD,自动化构建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-gitlab.png"},"headers":[],"relativePath":"fullstack/gitlab/gitlab-pipeline.md","filePath":"fullstack/gitlab/gitlab-pipeline.md","lastUpdated":1706247228000}'),r={name:"fullstack/gitlab/gitlab-pipeline.md"},c=p(`

Gitlab流水线配置

流水线的流程是,提交代码后,gitlab会检测项目根目录里的.github-ci.yml文件,根据文件中的流水线自动构建,配置文件格式正确性可以在gitlab进行文件校验,格式使用yaml文件格式,一个yaml文件就是一个流水线,里面会定义多个作业

示例

yaml
stages:
+ - install
+ - build
+ - deploy
+ 
+install_job:
+ stage: install
+ tags:
+ - docker
+ script:
+ - echo install stage
+
+build_job:
+ stage: build
+ script:
+ - echo build stage
+ 
+deploy_job:
+ stage: deploy
+ script:
+ - echo deploy stage

默认变量

gitlab会提供一些默认变量使用,这里列出默认变量

https://docs.gitlab.com/ee/ci/variables/predefined_variables.html

通用变量

变量GitLabRunner描述
CHAT_CHANNEL10.6all触发 ChatOps 命令的源聊天频道。
CHAT_INPUT10.6all使用 ChatOps 命令传递的附加参数。
CHAT_USER_ID14.4all触发 ChatOps 命令的用户的聊天服务用户 ID。
CIall0.4适用于在 CI/CD 中执行的所有作业。可用时为 true
CI_API_V4_URL11.7allGitLab API v4 根 URL。
CI_BUILDS_DIRall11.10执行构建的顶级目录。
CI_COMMIT_AUTHOR13.11allName <email> 格式的提交作者。
CI_COMMIT_BEFORE_SHA11.2all出现在分支或标签上的上一个最新提交。在合并请求的流水线中总是 0000000000000000000000000000000000000000
CI_COMMIT_BRANCH12.60.5提交分支名称。在分支流水线中可用,包括默认分支的流水线。在合并请求流水线或标签流水线中不可用。
CI_COMMIT_DESCRIPTION10.8all提交的描述。如果标题短于 100 个字符,则消息没有第一行。
CI_COMMIT_MESSAGE10.8all完整的提交消息。
CI_COMMIT_REF_NAME9.0all为其构建项目的分支或标签名称。
CI_COMMIT_REF_PROTECTED11.11all如果作业正在运行以获取受保护的 ref 为 true
CI_COMMIT_REF_SLUG9.0allCI_COMMIT_REF_NAME 小写,缩短为 63 字节,除了 0-9a-z 之外的所有内容都替换为 -。没有前导/尾随-。 在 URL、主机名和域名中使用。
CI_COMMIT_SHA9.0all项目为其构建的提交修订。
CI_COMMIT_SHORT_SHA11.7allCI_COMMIT_SHA 的前八个字符。
CI_COMMIT_TAG9.00.5提交标签名称。仅在标签流水线中可用。
CI_COMMIT_TAG_MESSAGE15.5all提交标签消息。仅在标签流水线中可用。
CI_COMMIT_TIMESTAMP13.4allISO 8601 格式的提交时间戳。
CI_COMMIT_TITLE10.8all提交的标题。消息的完整第一行。
CI_CONCURRENT_IDall11.10单个 executor 中构建执行的唯一 ID。
CI_CONCURRENT_PROJECT_IDall11.10单个 executor 和项目中构建执行的唯一 ID。
CI_CONFIG_PATH9.40.5CI/CD 配置文件的路径。默认为.gitlab-ci.yml。在正在运行的流水线中只读。
CI_DEBUG_TRACEall1.7如果 debug 日志 (跟踪) 已启用为true
CI_DEBUG_SERVICES15.715.7true 如果启用了服务容器日志,值为 true
CI_DEFAULT_BRANCH12.4all项目默认分支的名称。
CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX13.7all通过 Dependency Proxy 拉取镜像的顶级群组镜像前缀。
CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX14.3all通过 Dependency Proxy 拉取镜像的直接群组镜像前缀。
CI_DEPENDENCY_PROXY_PASSWORD13.7all通过 Dependency Proxy 拉取镜像的密码。
CI_DEPENDENCY_PROXY_SERVER13.7all用于登录 Dependency Proxy 的服务器。相当于 $CI_SERVER_HOST:$CI_SERVER_PORT
CI_DEPENDENCY_PROXY_USER13.7all通过 Dependency Proxy 拉取镜像的用户名。
CI_DEPLOY_FREEZE13.2all仅当流水线在部署冻结窗口期间运行时才可用。可用时为 true
CI_DEPLOY_PASSWORD10.8allGitLab Deploy Token 的认证密码,如果项目有的话。
CI_DEPLOY_USER10.8allGitLab Deploy Token 的认证用户名,如果项目有的话。
CI_DISPOSABLE_ENVIRONMENTall10.1仅当作业在一次性环境中执行时才可用(仅为该作业创建并在执行后处理/销毁 - 除 shellssh 之外的所有 executor)。可用时为 true
CI_ENVIRONMENT_NAME8.15all此作业的环境名称。 如果设置了 environment:name,则可用。
CI_ENVIRONMENT_SLUG8.15all环境名称的简化版本,适合包含在 DNS、URL、Kubernetes labels 等。如果设置了 environment:name,则可用。Slug 被截断为 24 个字符。
CI_ENVIRONMENT_URL9.3all此作业的环境 URL。如果设置了 environment:url,则可用。
CI_ENVIRONMENT_ACTION13.11all为此作业的环境指定的操作注释。如果设置了 environment:action,则可用。可以是startpreparestop
CI_ENVIRONMENT_TIER14.0all此作业的环境部署级别。
CI_RELEASE_DESCRIPTION15.5all发布的描述。仅在标签流水线上可用。描述长度限制为前 1024 个字符。
CI_GITLAB_FIPS_MODE14.10all实例中是否启用 FIPS 模式的配置设置。
CI_HAS_OPEN_REQUIREMENTS13.1all仅当流水线的项目具有打开的需求 时才可用。可用时为 true
CI_JOB_ID9.0all作业的内部 ID,在 GitLab 实例中的所有作业中是唯一的。
CI_JOB_IMAGE12.912.9运行作业的 Docker 镜像的名称。
CI_JOB_JWT12.10all一个 RS256 JSON Web 令牌,用于与支持 JWT 身份验证的第三方系统进行身份验证,例如 HashiCorp’s Vault
CI_JOB_JWT_V114.6allCI_JOB_JWT 相同的值。
CI_JOB_MANUAL8.12all如果作业是手动启动为 true
CI_JOB_NAME9.00.5作业名称
CI_JOB_NAME_SLUG15.4allCI_JOB_NAME_SLUG 的小写,缩短为 63 字节,除 0-9a-z 以外的所有内容都替换为 -。没有前导/尾随的 -。在路径中使用。
CI_JOB_STAGE9.00.5作业阶段名称
CI_JOB_STATUSall13.5执行每个 runner 阶段时的作业状态。与 after_script 一起使用。可以是 successfailedcanceled
CI_JOB_TOKEN9.01.2使用某些 API 端点进行身份验证的令牌。只要作业正在运行,令牌就有效。
CI_JOB_URL11.10.5作业详细信息 URL。
CI_JOB_STARTED_AT13.10all作业开始时的 UTC 日期时间,采用 ISO 8601 格式。
CI_KUBERNETES_ACTIVE13.0all仅当流水线具有可用于部署的 Kubernetes 集群时才可用。可用时为 true
CI_NODE_INDEX11.5all作业集中的作业 index。仅当作业使用 parallel 时可用。
CI_NODE_TOTAL11.5all此作业并行运行的实例总数。如果作业不使用 parallel,则设置为 1
CI_OPEN_MERGE_REQUESTS13.8all使用当前分支和项目作为合并请求源的最多四个合并请求的逗号分隔列表。如果分支具有关联的合并请求,则仅在分支和合并请求流水线中可用。例如,gitlab-org/gitlab!333,gitlab-org/gitlab-foss!11
CI_PAGES_DOMAIN11.8all托管 GitLab Pages 的配置域名。
CI_PAGES_URL11.8allGitLab Pages 站点的 URL。始终是 CI_PAGES_DOMAIN 的子域名。
CI_PIPELINE_ID8.10all当前流水线的实例级 ID。该 ID 在实例上的所有项目中都是唯一的。
CI_PIPELINE_IID11.0all当前流水线的项目级 IID(内部 ID)。此 ID 仅在当前项目中是唯一的。
CI_PIPELINE_SOURCE10.0all流水线是如何触发的。可以是 pushwebscheduleapiexternalchatwebidemerge_request_eventexternal_pull_request_eventparent_pipelinetriggerpipeline
CI_PIPELINE_TRIGGEREDallall如果作业是触发的为 true。
CI_PIPELINE_URL11.10.5流水线详细信息的 URL。
CI_PIPELINE_CREATED_AT13.10all创建流水线时的 UTC 日期时间,采用 ISO 8601 格式。
CI_PROJECT_DIRallall仓库克隆到的完整路径,以及作业从哪里运行。如果设置了 GitLab Runner builds_dir 参数,这个变量是相对于 builds_dir 的值设置的。
CI_PROJECT_IDallall当前项目的 ID。该 ID 在实例上的所有项目中都是唯一的。
CI_PROJECT_NAME8.100.5项目目录的名称。例如,如果项目 URL 是 gitlab.example.com/group-name/project-1,则 CI_PROJECT_NAMEproject-1
CI_PROJECT_NAMESPACE8.100.5作业的项目命名空间(用户名或组名)。
CI_PROJECT_PATH_SLUG9.3all$CI_PROJECT_PATH 小写,不是 a-z0-9 的字符替换为 - 并缩短为 63 字节。 在 URL 和域名中使用。
CI_PROJECT_PATH8.100.5包含项目名称的项目命名空间。
CI_PROJECT_REPOSITORY_LANGUAGES12.3all仓库中使用的语言的逗号分隔的小写列表。例如ruby,javascript,html,css
CI_PROJECT_ROOT_NAMESPACE13.20.5作业的根项目命名空间(用户名或组名)。例如,如果CI_PROJECT_NAMESPACEroot-group/child-group/grandchild-group,则 CI_PROJECT_ROOT_NAMESPACEroot-group
CI_PROJECT_TITLE12.4allWeb 界面中显示的人类可读的项目名称。
CI_PROJECT_DESCRIPTION15.1allWeb 界面中显示的项目描述。
CI_PROJECT_URL8.100.5项目的 HTTP(S) 地址。
CI_PROJECT_VISIBILITY10.3all项目可见性。可以是 internalprivatepublic
CI_PROJECT_CLASSIFICATION_LABEL14.2all项目外部授权分类标记。
CI_REGISTRY_IMAGE8.100.5项目的 Container Registry 的地址。仅当为项目启用了 Container Registry 时才可用。
CI_REGISTRY_PASSWORD9.0all将容器推送到项目的 GitLab Container Registry 的密码。仅当为项目启用了 Container Registry 时才可用。 此密码值与 CI_JOB_TOKEN 相同,并且仅在作业运行时有效。使用 CI_DEPLOY_PASSWORD 长期访问镜像库。
CI_REGISTRY_USER9.0all将容器推送到项目的 GitLab Container Registry 的用户名。仅当为项目启用了 Container Registry 时才可用。
CI_REGISTRY8.100.5GitLab Container Registry 的地址。仅当为项目启用了 Container Registry 时才可用。 如果在镜像库配置中指定了一个值,则此变量包括一个 :port 值。
CI_REPOSITORY_URL9.0all克隆 Git 仓库的 URL。
CI_RUNNER_DESCRIPTION8.100.5runner 的描述。
CI_RUNNER_EXECUTABLE_ARCHall10.6GitLab Runner 可执行文件的操作系统/架构。可能和 executor 的环境不一样。
CI_RUNNER_ID8.100.5正在使用的 runner 的唯一 ID。
CI_RUNNER_REVISIONall10.6运行作业的 runner 的修订版。
CI_RUNNER_SHORT_TOKENall12.3runner 的唯一 ID,用于验证新的作业请求。在 14.9 及更高版本中,令牌包含前缀,并且使用前 17 个字符。在 14.9 版本之前,使用前八个字符。
CI_RUNNER_TAGS8.100.5以逗号分隔的 runner 标签列表。
CI_RUNNER_VERSIONall10.6运行作业的 GitLab Runner 的版本。
CI_SERVER_HOST12.1allGitLab 实例 URL 的主机,没有协议或端口。例如gitlab.example.com
CI_SERVER_NAMEallall协调作业的 CI/CD 服务器的名称。
CI_SERVER_PORT12.8allGitLab 实例 URL 的端口,没有主机或协议。例如 8080
CI_SERVER_PROTOCOL12.8allGitLab 实例 URL 的协议,没有主机或端口。例如 https
CI_SERVER_REVISIONallall计划作业的 GitLab 修订版。
CI_SERVER_TLS_CA_FILEallall包含 TLS CA 证书的文件,用于在 runner 设置中设置 tls-ca-file 时验证极狐GitLab 服务器。
CI_SERVER_TLS_CERT_FILEallall包含 TLS 证书的文件,用于在 runner 设置中设置 tls-ca-file 时验证极狐GitLab 服务器。
CI_SERVER_TLS_KEY_FILEallall包含 TLS 密钥的文件,用于在 runner 设置中设置 tls-ca-file 时验证极狐GitLab 服务器。
CI_SERVER_URL12.7allGitLab 实例的基本 URL,包括协议和端口。 例如https://gitlab.example.com:8080
CI_SERVER_VERSION_MAJOR11.4allGitLab 实例的主版本。例如,如果版本为 13.6.1,则CI_SERVER_VERSION_MAJOR13
CI_SERVER_VERSION_MINOR11.4allGitLab 实例的小版本。例如,如果版本为 13.6.1,则CI_SERVER_VERSION_MINOR6
CI_SERVER_VERSION_PATCH11.4allGitLab 实例的补丁版本。例如,如果版本为 13.6.1,则CI_SERVER_VERSION_PATCH1
CI_SERVER_VERSIONallallGitLab 实例的完整版本。
CI_SERVERallall适用于在 CI/CD 中执行的所有作业。可用时为 true
CI_SHARED_ENVIRONMENTall10.1仅当作业在共享环境中执行时才可用(跨 CI/CD 调用持久化的,如 shellssh executor)。可用时为 true
GITLAB_CIallall适用于在 CI/CD 中执行的所有作业。可用时为 true
GITLAB_FEATURES10.6all可用于实例和许可证的许可功能的逗号分隔列表。
GITLAB_USER_EMAIL8.12all开始作业的用户的电子邮件。
GITLAB_USER_ID8.12all启动作业的用户的 ID。
GITLAB_USER_LOGIN10.0all开始作业的用户的用户名。
GITLAB_USER_NAME10.0all启动作业的用户的姓名。
TRIGGER_PAYLOAD13.9allwebhook 负载。仅当流水线使用 webhook 触发时可用。

合并请求变量

变量GitLabRunner描述
CI_MERGE_REQUEST_APPROVED14.1all合并请求的批准状态。当合并请求批准 可用并且合并请求已被批准时为 true
CI_MERGE_REQUEST_ASSIGNEES11.9all合并请求的指派人用户名的逗号分隔列表。
CI_MERGE_REQUEST_ID11.6all合并请求的实例级 ID。这是 GitLab 上所有项目的唯一 ID。
CI_MERGE_REQUEST_IID11.6all合并请求的项目级 IID(内部 ID)。此 ID 对于当前项目是唯一的。
CI_MERGE_REQUEST_LABELS11.9all合并请求的逗号分隔标签名称。
CI_MERGE_REQUEST_MILESTONE11.9all合并请求的里程碑标题。
CI_MERGE_REQUEST_PROJECT_ID11.6all合并请求的项目 ID。
CI_MERGE_REQUEST_PROJECT_PATH11.6all合并请求的项目路径。例如 namespace/awesome-project
CI_MERGE_REQUEST_PROJECT_URL11.6all合并请求的项目的 URL。例如,http://192.168.10.15:3000/namespace/awesome-project
CI_MERGE_REQUEST_REF_PATH11.6all合并请求的引用路径。例如,refs/merge-requests/1/head
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME11.6all合并请求的源分支名称。
CI_MERGE_REQUEST_SOURCE_BRANCH_SHA11.9all合并请求的源分支的 HEAD SHA。该变量在合并请求流水线中为空。SHA 仅存在于合并结果流水线中。
CI_MERGE_REQUEST_SOURCE_PROJECT_ID11.6all合并请求的源项目的 ID。
CI_MERGE_REQUEST_SOURCE_PROJECT_PATH11.6all合并请求的源项目路径。
CI_MERGE_REQUEST_SOURCE_PROJECT_URL11.6all合并请求的源项目的 URL。
CI_MERGE_REQUEST_TARGET_BRANCH_NAME11.6all合并请求的目标分支名称。
CI_MERGE_REQUEST_TARGET_BRANCH_PROTECTED15.2all合并请求的目标分支的保护状态。
CI_MERGE_REQUEST_TARGET_BRANCH_SHA11.9all合并请求的目标分支的 HEAD SHA。该变量在合并请求流水线中为空。SHA 仅存在于合并结果流水线中。
CI_MERGE_REQUEST_TITLE11.9all合并请求的标题。
CI_MERGE_REQUEST_EVENT_TYPE12.3all合并请求的事件类型。可以是 detachedmerged_resultmerge_train
CI_MERGE_REQUEST_DIFF_ID13.7all合并请求差异的版本。
CI_MERGE_REQUEST_DIFF_BASE_SHA13.7all合并请求差异的基本 SHA。

流水线

gitlabrunner会通过项目根目录下的.gitlab-ci.yml文件来检测并执行流水线的,那么流水线的执行过程就通过.gitlab-ci.yml文件设置的

job

https://docs.gitlab.com/ee/ci/yaml/#job-keywords

一个流水线中可以定义多个作业,每个作业的名字必须唯一(不能是关键字),每个作业独立执行,作业定义了在约束条件下进行相关操作,每个作业必须包含一个script,script以数组的形式存在;如果作业中没有before_script或after_script,若全局有,将会先执行全局的;以. 开头的作业不会被执行,一般用来模板继承

befor_script失败会导致整个作业的失败,其他作业将不会再执行,作业的失败不会影响after_script运行

yaml
job1:
+	stage: "build"
+	before_script:
+		- echo "before script"
+	script:
+		- echo "hello job1"
+		- echo "hello job2"
+	after_script:
+		- echo "after script"
+
+job2:
+	stage: "deploy"
+	script:
+		- "hello job2"
+	after_script:
+		- echo "after script"
+
+.deploy
+	stage: deploy

stages

https://docs.gitlab.com/ee/ci/yaml/#stages

流水线全局定义作业的执行的阶段,作业按照阶段的顺序执行,统一阶段的作业并行运行,不同阶段的按顺序执行

yaml
stages:
+	- build
+	- test
+	- deploy
+	# ...
+
+build:
+	stage: "build"
+	script:
+		- yum install node
+		- npm install
+
+test:
+	stage: "test"
+	script:
+		- npm run test
+
+depoly_pod:
+	stage: "deploy"
+	script:
+		- npm publish

stage

https://docs.gitlab.com/ee/ci/yaml/#stage

stage是在作业中使用的字段,用来标识当前作业的执行阶段,方便全局的stages进行调度管理,若果一个阶段有多个作业,需要注意配置多个runner,以便可以同时执行多个job

.pre&.post

.pre始终是整个流水线第一个运行的作业,.post始终是整个流水线最后运行的作业。用户定义的阶段都在两者之间运行,.pre和.post的顺序无法更改,如果流水线中仅包含.pre和.post作业,整个流水线将不会执行

yaml
test:
+	- stage: .pre
+	tags:
+		- build
+	only:
+		- master
+	script:
+		- echo "test..."

variables

https://docs.gitlab.com/ee/ci/yaml/#variables

定义变量,pipeline、job变量,job变量的优先级大

yaml
variables:
+	DOMIAN: blog.domain.cc
+	
+job1:
+	stage: "build"
+	variables:
+		NAME: k8s
+	script:
+		- echo "$DOMAIN"
+		- echo "$NAME"

tags

https://docs.gitlab.com/ee/ci/yaml/#tags

用于从允许运行该项目中的所有runner列表中选择指定的runner,在runner注册期间,可以指定runner标签,标签可以指定多个

yaml
job1:
+	tags:
+		- k8s
+		- windows
+		# ...
+
+job2:
+	tags:
+		- k8s
+		- docker

allow_failure

https://docs.gitlab.com/ee/ci/yaml/#allow_failure

允许作业失败,默认值false,启动后,如果作业运行失败,改作业将会在用户界面中显示橙色警告,但是,整个流水将认为作业通过,并且不会阻塞后面的作业执行

yaml
job:
+	allow_failure: true
+	script:
+		- echo 22

image-20230318104441601

when

https://docs.gitlab.com/ee/ci/yaml/#when

控制作业的运行,指定作业什么状态下才会执行,选项值:

  • on_success:前面阶段中的所有作业都成功时才会执行(默认值)
  • on_failure:当前面阶段出现失败时执行
  • always:总是执行作业
  • manual:手动执行作业
  • delayed:延迟执行作业
yaml
job:
+	when: on_success
+
+job2:
+	when: delayed
+	start_in: "20"
+
+job3:
+	when: manaul # 手动执行,比如手动发布

retry

https://docs.gitlab.com/ee/ci/yaml/#retry

设置作业失败情况下重试的次数,只能设置正整数(0≤n≤2),最大设置次数2,也就是重试2次,总共运行3次

可以在指定类型失败情况下重试,达到精确匹配

  • always: Retry on any failure (default).
  • unknown_failure: Retry when the failure reason is unknown.
  • script_failure: Retry when the script failed.
  • api_failure: Retry on API failure.
  • stuck_or_timeout_failure: Retry when the job got stuck or timed out.
  • runner_system_failure: Retry if there is a runner system failure (for example, job setup failed).
  • runner_unsupported: Retry if the runner is unsupported.
  • stale_schedule: Retry if a delayed job could not be executed.
  • job_execution_timeout: Retry if the script exceeded the maximum execution time set for the job.
  • archived_failure: Retry if the job is archived and can’t be run.
  • unmet_prerequisites: Retry if the job failed to complete prerequisite tasks.
  • scheduler_failure: Retry if the scheduler failed to assign the job to a runner.
  • data_integrity_failure: Retry if there is a structural integrity problem detected.
yaml
job:
+	retry: 1
+
+job2:
+	retry:
+		when: api_failure
+		max: 2
+
+job3:
+	retry:
+		when:
+			- api_failure
+			- scheduler_failure
+		max: 2

timeout

https://docs.gitlab.com/ee/ci/yaml/#timeout

作业级别的超时,可以超过项目级别的超时,但不能超过runner特定的超时

yaml
job:
+	timeout: 2h 30m

parallel

https://docs.gitlab.com/ee/ci/yaml/#parallel

配置要并行运行的作业实例数,此值必须大于或等于2并且小于等于50,这将创建N个并行运行的统一作业的实例,他们从job_name 1/N到job_name N/N依次命名

yaml
job:
+	parallel: 5

only/except

https://docs.gitlab.com/ee/ci/yaml/#only--except

only和except用分支策略来限制jobs的构建

  • only定义哪些分支和标签的git项目将会被执行job
  • except定义哪些分支和标签的git项目将不会执行job
yaml
job:
+	only:
+		- master

rules

https://docs.gitlab.com/ee/ci/yaml/#rules

rules允许按顺序评估单个规则,知道匹配并作为动态提供属性,不能与only/except组合使用

  • if
  • changes
  • exists
  • allow_failure
  • variables
  • when
yaml
variables:
+	DOMAIN: example.com
+
+job:
+	rules:
+		if: '$DOMAIN == "example.com"'
+		- when: manual
+		allow_failure: true
+
+job2:
+	rules:
+		if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
+		- when: never
+		if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/
+		- when: manual
+		allow_failure: true

workflow

https://docs.gitlab.com/ee/ci/yaml/#workflow

顶级workflow关键字适用于整个管道,并确定是否创建管道,when:可以设置always和never,如果未提供,则默认值always

yaml
variables:
+	DOMAIN: example.com
+
+workflow:
+	rules:
+		if: '$DOMAIN == "example.com"'
+		- when: never
+		- when: always

cache

https://docs.gitlab.com/ee/ci/yaml/#cache

使用缓存指定要在作业之间缓存的文件和目录列表。只能使用本地工作包中的路径;管道和工作之间共享缓存。在artifacts之前恢复缓存。

yaml
cache:
+	paths:
+		- .yarn
+
+job:
+	tag:
+		- build
+	cache:
+		key: cache-build
+		paths:
+			- dist
+			- public
+		policy: pull # 不下载缓存
+
+job2:
+	cache:
+		key:
+			files:
+				- package.json
+				- yarn.lock
+		paths:
+			- public

artifacts

https://docs.gitlab.com/ee/ci/yaml/#artifacts

用于指定在作业成功或失败时应附加到作业的文件或目录列表,作业完成后,工件将被发送至gitlab,并可在gitlab对应的ci/cd中下载

yaml
build:
+	scripts:
+		- ls
+		- pwd
+	artifacts:
+		name: '$CI_JOB_NAME'  # 默认 artifacts.zip
+		exclude:
+			- node_modules/**
+		paths:
+			- dist
+			- public
+		expose_as: 'artifact 1' # 合并时暴露工件
+		expire_in: 1 day  # 默认30天会清除掉
+		reports: # 单元测试报告
+			jest: report.xml
+		when: on_success
+	only:
+		- tags
+
+depoly:
+	dependencies: # 使用工件
+		- build # job name

dependencies

https://docs.gitlab.com/ee/ci/yaml/#dependencies

定义获取工件的作业列表,只能从当前阶段之前执行的阶段定义作业,定义一个空数组将跳过下载该作业的任何工件不会考虑先前作业的状态,因此,如果它失败或是未运行的手动作业,则不会发生错误,如果设置为依赖项的作业的工件已过期或删除,那么依赖作业将失败

needs

https://docs.gitlab.com/ee/ci/yaml/#needs

可无序执行作业,无需按照阶段运行某些作业,可以让多个阶段同时运行

yaml
stages:
+	- build
+	- test
+build1:
+	stage: build
+	scripts:
+		- ls
+build2:
+	stage: build
+	scripts:
+		- pwd
+
+test1:
+	stage: test
+	scripts:
+		- npm run test
+	needs: ['build1'] # job name
+
+test2:
+	stage: test2
+	needs:
+		- job: 'build2'
+			artifacts: true

include

https://docs.gitlab.com/ee/ci/yaml/#include

可以将相同的配置单独写出,在项目配置文件中引入

yaml
# deploy.yml
+deploy:
+	stage: deploy
+	scripts:
+		- echo deploy
+# .gitlab-ci.yml
+include:
+	local: 'deploy.yml' # 当前项目当前分支下的文件
+	# file
+	project: fontend/web-demo # gitlab下指定的项目
+	ref: master  # 分支
+	file: .gitlab-ci.yml
+	# template 使用官方的模板
+	template: npm.gitlab-ci.yml
+	# remote
+	remote: <http://example.com/xx/.gitlab-ci.yml>

extends

https://docs.gitlab.com/ee/ci/yaml/#extends

继承其他作业的配置

yaml
.tests:
+  script: rake test
+  stage: test
+  only:
+    refs:
+      - branches
+
+rspec:
+  extends: .tests
+  script: rake rspec
+  only:
+    variables:
+      - $RSPEC

trigger

https://docs.gitlab.com/ee/ci/yaml/#trigger

多项目管道、父子管道

image

https://docs.gitlab.com/ee/ci/yaml/#image

默认在注册runner的时候需要填写一个基础镜像,只要使用执行器为docker类型的runner所有的操作运行都会在容器中运行,如果全局指定了image则所有的job使用此image创建容器并在其中运行,全局未指定image,再次检查job中是否指定,如果有此job按照指定镜像创建容器并执行,没有则使用注册runner时指定的默认镜像

yaml
image:
+	node:alpine
+	entrypoint: ["node -v"]
+
+job:
+	stage: build
+	scripts:
+		- npm install
+		- npm run build

services

工作期间运行的另一个docker镜像,并link到image关键字定义的docker镜像,这样就可以在构建期间访问服务镜像,服务镜像可以运行任何应用程序,但是最常见的是运行数据库容器,

yaml
image:
+	node: alpine
+
+services:
+	- name: mysql:latest
+		alias: mysql

environment

https://docs.gitlab.com/ee/ci/yaml/#environment

定义job发布的环境

yaml
depoly:
+	scripts:
+		- npm login
+		- npm publish
+	environment:
+		name: production
+		url: <https://www.baidu.com>

inherit

https://docs.gitlab.com/ee/ci/yaml/#inherit

使用或禁用全局定义的环境变量或默认值

yaml
default:
+	retry: 2
+	image: node:alpine
+
+variables:
+	NODE_VERSION: 16.2.1
+	USER_NAME: root
+
+job1:
+	script: echo hello
+	inherit:
+		default: false # 禁止使用default变量
+		variables:
+			- NODE_VERSION # 继承变量 NODE_VERSION
+
+job2:
+	script: echo job2
+	inherit:
+		default:
+			- retry # 继承retry
+		variables: false # 禁止使用variables变量

参考文档

`,119);function i(d,y,b,g,D,f){const e=s("Reward"),l=s("Gitalk");return o(),n("div",null,[c,t(e),t(l)])}const u=a(r,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/fullstack_gitlab_gitlab-pipeline.md.e1alnaT7.lean.js b/assets/fullstack_gitlab_gitlab-pipeline.md.e1alnaT7.lean.js new file mode 100644 index 000000000..e39bae455 --- /dev/null +++ b/assets/fullstack_gitlab_gitlab-pipeline.md.e1alnaT7.lean.js @@ -0,0 +1 @@ +import{_ as a,c as n,J as t,V as p,o,G as s}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"Gitlab流水线配置","description":"带你理解gitlab流水线的概念,熟练掌握流水线的常用技巧","frontmatter":{"title":"Gitlab流水线配置","description":"带你理解gitlab流水线的概念,熟练掌握流水线的常用技巧","keywords":"gitlab流水线,流水线,CI/CD,自动化构建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-gitlab.png"},"headers":[],"relativePath":"fullstack/gitlab/gitlab-pipeline.md","filePath":"fullstack/gitlab/gitlab-pipeline.md","lastUpdated":1706247228000}'),r={name:"fullstack/gitlab/gitlab-pipeline.md"},c=p("",119);function i(d,y,b,g,D,f){const e=s("Reward"),l=s("Gitalk");return o(),n("div",null,[c,t(e),t(l)])}const u=a(r,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/fullstack_gitlab_gitlab-runner-install-configure.md.VVSd4_S0.js b/assets/fullstack_gitlab_gitlab-runner-install-configure.md.VVSd4_S0.js new file mode 100644 index 000000000..c82371cfb --- /dev/null +++ b/assets/fullstack_gitlab_gitlab-runner-install-configure.md.VVSd4_S0.js @@ -0,0 +1,108 @@ +import{_ as e,c as p,J as s,V as r,o,G as n}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"Gitlab Runner安装与配置","description":"一篇gitlab runner完整的安装与注册配置教程","frontmatter":{"title":"Gitlab Runner安装与配置","description":"一篇gitlab runner完整的安装与注册配置教程","keywords":"gitlab-runner,runner注册,流水线,CI/CD,自动化构建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-gitlab.png"},"headers":[],"relativePath":"fullstack/gitlab/gitlab-runner-install-configure.md","filePath":"fullstack/gitlab/gitlab-runner-install-configure.md","lastUpdated":1706247228000}'),t={name:"fullstack/gitlab/gitlab-runner-install-configure.md"},c=r(`

Gitlab Runner安装与配置

本篇使用docker(点击查看安装文档)进行runner的安装和注册,其他方式请浏览相关文档

请确保runner版本和gitlab版本兼容以及docker相关版本兼容问题

下载镜像

sh
docker pull gitlab/gitlab-runner:v14.6.0

创建挂载卷

sh
mkdir -p /srv/gitlab-runner
+cd /srv/gitlab-runner && mkdir config certs
+
+# 将gitlab的域名正式复制到 certs 中

运行runner

sh
docker run -d --name gitlab-runner --restart always \\
+  -v /srv/gitlab-runner/config:/etc/gitlab-runner \\
+  -v /srv/gitlab-runner/certs:/etc/gitlab-runner/certs \\
+  -v /var/run/docker.sock:/var/run/docker.sock \\
+  -v /etc/hosts:/etc/hosts \\
+  gitlab/gitlab-runner:v14.6.0

如果你的gitlab使用的了本地域名和自签证书,这里进行域名和hosts进行挂载

注册runner

runner注册文档地址 https://docs.gitlab.com/runner/register/index.html#docker,可以通过交互式和非交互式注册。注册runner需要runner的token,token用来连接gitlab和runner

注册token

Gitlab runner的注册token需要从gitlab中获取,token可以从具体项目中获取也可以从gitlab全局获取

如这里是web1项目的runner token

image-20230319175134576

你可以联系root账户创建group的runner或admin全局的runner

image-20230319175359461

交互式注册

sh
# 方式1
+docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:v14.6.0 register
+
+# 方式2
+# 进入 gitlab-runner
+docker exec -it gitlab-runner bash
+> gitlab-runner -h
+# 注册runner
+> gitlab-runner register # 交互式注册看下方图

执行以上命令会进入runner镜像内部交互式进行注册

非交互式

sh
# 如果你的gitlab使用http + ip形式
+docker run --rm \\
+  -v /srv/gitlab-runner/config:/etc/gitlab-runner \\
+  -v /etc/hosts:/etc/hosts \\
+  gitlab/gitlab-runner:v14.6.0 register \\
+  --non-interactive \\
+  --executor "docker" \\
+  --docker-image alpine:latest \\
+  --url "http://192.168.10.10" \\
+  --registration-token "-_d2uxhfknTiFxm9oKs1" \\
+  --description "admin register runner" \\
+  --tag-list "admin" \\
+  --run-untagged="true" \\
+  --locked="false" 
+  
+# 如果你的gitlab使用https,需要进行证书认证
+docker run --rm \\
+  -v /srv/gitlab-runner/config:/etc/gitlab-runner \\
+  -v /etc/hosts:/etc/hosts \\
+  gitlab/gitlab-runner:v14.6.0 register \\
+  --non-interactive \\
+  --executor "docker" \\
+  --docker-image alpine:latest \\
+  --url "https://gitlab.ihengshuai.com" \\
+  --registration-token "Gitlab Runner Token" \\
+  --description "testing docker-runner" \\
+  --tls-ca-file /etc/gitlab-runner/certs/gitlab.ihengshuai.com.crt \\
+  --tag-list "testing" \\
+  --run-untagged="true" \\
+  --locked="false"

这里执行非交互命令:注册成功

sh
 devops ~ docker run --rm \\
+>   -v /srv/gitlab-runner/config:/etc/gitlab-runner \\
+>   -v /etc/hosts:/etc/hosts \\
+>   gitlab/gitlab-runner:v14.6.0 register \\
+>   --non-interactive \\
+>   --executor "docker" \\
+>   --docker-image alpine:latest \\
+>   --url "http://192.168.10.10" \\
+>   --registration-token "-_d2uxhfknTiFxm9oKs1" \\
+>   --description "admin register runner" \\
+>   --tag-list "admin" \\
+>   --run-untagged="true" \\
+>   --locked="false"
+Runtime platform                                    arch=arm64 os=linux pid=7 revision=5316d4ac version=14.6.0
+Running in system-mode.
+
+Registering runner... succeeded                     runner=-_d2uxhf
+Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

参数说明

  • non-interactive:不需要交互
  • executor:runner执行器,有很多,这里选择docker
  • docker-image:runner基础镜像
  • url:指定gitlab的地址,根据gitlab的配置地址填写
  • registration-token:runner注册token,项目、admin、group的token都可以
  • description:runner相关描述
  • tag-list:runner的标签,可以指定多个,流水线运行时可以通过runner标签指定runner运行,如果你忘记填写,可以在注册后修改
  • tls-ca-file:如果你使用了https且使用了自签证书,需要指定证书使runner信任此证书( https://docs.gitlab.com/runner/install/docker.html#installing-trusted-ssl-server-certificates)
  • run-untagged:如果流水线的作业没指定tag也可以用此runner运行
  • locked:关闭锁定,默认情况下runner注册后都是锁定状态,不可以执行,需要在后台打开,这里直接注册时打开

配置文件

gitlab runner在注册后会生成对应的配置文件/srv/gitlab-runner/config/config.toml(挂载目录),容器位置在/etc/gitlab-runner/config.toml

toml
# 同时可以运行几个runner
+concurrent = 2
+
+# 检查间隔,3s内检查代码变动就会执行runner
+check_interval = 3
+
+[session_server]
+  session_timeout = 1800
+
+# 注册的runner,每注册一个,就会多一份 [[runners]] 配置
+[[runners]]
+  # runner 描述
+  name = "testing docker-runner"
+  # gitlab 地址
+  url = "http://192.168.10.10"
+  # 注册token
+  token = "iz1PoRca5ZD5gV1uydX4"
+  # ssl证书位置
+  tls-ca-file = "/srv/gitlab-runner/config/ssl/gitlab.ihengshuai.com.crt"
+  # runner执行器
+  executor = "docker"
+  [runners.custom_build_dir]
+  [runners.cache]
+    [runners.cache.s3]
+    [runners.cache.gcs]
+    [runners.cache.azure]
+  [runners.docker]
+    tls_verify = false
+    # docker执行器的基础镜像
+    image = "alpine:latest"
+    privileged = false
+    disable_entrypoint_overwrite = false
+    oom_kill_disable = false
+    disable_cache = false
+    # 镜像拉取策略,流水线过程中如果某个已经在本地了,就不会再拉取了,直接使用本地镜像
+    pull_policy = "if-not-present"
+    # runner缓存,在docker中使用docker执行器,需要映射宿主机的docker.socket
+    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
+    shm_size = 0
+    
+# [[runners]]
+# ....

配置重载

当你更改了runner的配置文件后,你需要重新加载配置文件,你可以使用一下方式:

sh
docker restart gitlab-runner
+
+# 或进入容器
+docker exec -it gitlab-runner bash
+gitlab-runner restart

runner类型

根据runner的使用范围可以将其分为以下几类:

  • shared:共享runner,gitlab中的所有项目都可以使用
  • group:只有当前组才可以使用
  • specific:只有当前项目才可以使用

runner执行器

gitlab runner由很多可以在不同场景下运行构建的执行器

gitlab-runner-compare

Shell 执行器

Shell 是最简单的执行器。您的构建所需的所有必须依赖项都需要手动安装在极狐GitLab Runner 所安装的机器上。

虚拟机执行器(VirtualBox / Parallels)

这种类型的执行器允许您使用已经创建的虚拟机,它被克隆且用于运行构建。我们提供两个完整的系统虚拟化选项:VirtualBoxParallels。如果您想在不同操作系统上运行构建,它们很有用,因为它允许在 Windows、Linux、macOS 或 FreeBSD 上创建虚拟机,然后极狐GitLab Runner 连接虚拟机并在上面运行构建。它可以降低基础设施的成本。

Docker 执行器

https://docs.gitlab.com/runner/executors/docker.html

使用 Docker 是个很好的选择,因为它允许使用简单的依赖项管理(所有构建项目所需的依赖项都可以放到 Docker 镜像里)生成干净的构建环境。 Docker 执行器允许您很容易地使用依赖的服务, 例如 MySQL,创建构建环境。

Docker Machine 执行器

Docker Machine 是特殊版本的支持弹性伸缩的 Docker 执行器。 它类似正常的 Docker 执行器, 但由 Docker Machine 按需创建构建主机。

Kubernetes 执行器

Kubernetes 执行器允许您使用您构建现存的 Kubernetes 集群。 执行器会调用 Kubernetes 集群 API 并为每个极狐GitLab CI 作业创建新的 Pod(带有构建容器和服务容器)。

SSH 执行器

SSH 执行器是为执行器介绍完整性而添加进来的,它是所有执行器中最不受支持的一个。 它使极狐GitLab Runner 连接到外部服务器并运行构建。机构有一些使用 SSH 执行器的成功案例,但是通常我们推荐您使用其他类型的执行器。

自定义执行器

自定义执行器允许您指定您自己的执行环境。当极狐GitLab Runner 不提供执行器(例如,LXC 容器),您可以向极狐GitLab Runner 提供您自己的可执行文件,用以部署和清理任何您想使用的环境。

`,54);function i(u,b,y,D,d,F){const a=n("Reward"),l=n("Gitalk");return o(),p("div",null,[c,s(a),s(l)])}const E=e(t,[["render",i]]);export{B as __pageData,E as default}; diff --git a/assets/fullstack_gitlab_gitlab-runner-install-configure.md.VVSd4_S0.lean.js b/assets/fullstack_gitlab_gitlab-runner-install-configure.md.VVSd4_S0.lean.js new file mode 100644 index 000000000..3813f1507 --- /dev/null +++ b/assets/fullstack_gitlab_gitlab-runner-install-configure.md.VVSd4_S0.lean.js @@ -0,0 +1 @@ +import{_ as e,c as p,J as s,V as r,o,G as n}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse('{"title":"Gitlab Runner安装与配置","description":"一篇gitlab runner完整的安装与注册配置教程","frontmatter":{"title":"Gitlab Runner安装与配置","description":"一篇gitlab runner完整的安装与注册配置教程","keywords":"gitlab-runner,runner注册,流水线,CI/CD,自动化构建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-gitlab.png"},"headers":[],"relativePath":"fullstack/gitlab/gitlab-runner-install-configure.md","filePath":"fullstack/gitlab/gitlab-runner-install-configure.md","lastUpdated":1706247228000}'),t={name:"fullstack/gitlab/gitlab-runner-install-configure.md"},c=r("",54);function i(u,b,y,D,d,F){const a=n("Reward"),l=n("Gitalk");return o(),p("div",null,[c,s(a),s(l)])}const E=e(t,[["render",i]]);export{B as __pageData,E as default}; diff --git a/assets/fullstack_gitlab_install-configure.md.RtybrUAQ.js b/assets/fullstack_gitlab_install-configure.md.RtybrUAQ.js new file mode 100644 index 000000000..822abb356 --- /dev/null +++ b/assets/fullstack_gitlab_install-configure.md.RtybrUAQ.js @@ -0,0 +1,163 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"GitLab安装与配置","description":"一篇gitlab完整的安装教程教你玩转gitlab","frontmatter":{"title":"GitLab安装与配置","description":"一篇gitlab完整的安装教程教你玩转gitlab","keywords":"gitlab,流水线,CI/CD,自动化构建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-gitlab.png"},"headers":[],"relativePath":"fullstack/gitlab/install-configure.md","filePath":"fullstack/gitlab/install-configure.md","lastUpdated":1706247228000}'),r={name:"fullstack/gitlab/install-configure.md"},t=o(`

GitLab安装与配置

提示

本篇以gitlab 14.16.0 版本为教程,其它版本大同小异,官方文档:https://docs.gitlab.com/ee

docker安装

对于gitlab的安装本人都是在arm架构Centos7.9虚拟机上进行的,请悉知本人安装环境,或者与本人的环境保持一致,以便产生不必要的疑惑。

这里使用docker安装,机器上需要先安装docker,此处不再赘述。

https://docs.gitlab.com/ee/install/docker.html

https://docs.gitlab.com/runner/install/docker.html

sh
# arm架构镜像(如果你也是arm架构,可以使用此镜像)
+docker pull yrzr/gitlab-ce-arm64v8
+
+# 最新版amd架构(非arm架构)
+docker pull gitlab/gitlab-ee

配置并启动

bash
# 下载好后使用docker engine 运行gitlab
+sudo docker run -d \\
+  --hostname gitlab.ihengshuai.com \\
+  --publish 443:443 --publish 80:80 --publish 8422:22 \\
+  --name gitlab \\
+	--restart always \\
+  -v /srv/gitlab/config:/etc/gitlab \\
+  -v /srv/gitlab/logs:/var/log/gitlab \\
+  -v /srv/gitlab/data:/var/opt/gitlab \\
+  --shm-size 512m \\
+  yrzr/gitlab-ce-arm64v8
+  
+# IP
+sudo docker run -d \\
+  --hostname 192.168.10.10 \\
+  --publish 443:443 --publish 80:80 --publish 8422:22 \\
+  --name gitlab \\
+	--restart always \\
+  -v /srv/gitlab/config:/etc/gitlab \\
+  -v /srv/gitlab/logs:/var/log/gitlab \\
+  -v /srv/gitlab/data:/var/opt/gitlab \\
+  --shm-size 512m \\
+  yrzr/gitlab-ce-arm64v8

命令式

  1. 首先创建挂载卷

    sh
    mkdir -p /srv/gitlab
    +cd /srv/gitlab && mkdir config data logs
  2. 运行gitlab容器

    sh
    sudo docker run -d \\
    +  --hostname 192.168.10.10 \\
    +  -p 443:443 --publish 80:80 --publish 8422:22 \\
    +  --name gitlab \\
    +	--restart always \\
    +  -v /srv/gitlab/config:/etc/gitlab \\
    +  -v /srv/gitlab/logs:/var/log/gitlab \\
    +  -v /srv/gitlab/data:/var/opt/gitlab \\
    +  --shm-size 512m \\
    +  yrzr/gitlab-ce-arm64v8

相关参数说明:

  • hostname:指定gitlab的ip地址,用于浏览器的访问(域名访问看后面),这里指定虚拟的ip192.168.10.10
  • -p:暴露gitlab的httphttpsssh端口,这里http使用主机的80端口,需要注意主机是否占用80端口;https使用主机443端口,同样注意端口占用;由于虚拟机占用了ssh端口22,这里使用8422端口作为gitlab的ssh端口
  • -v:挂载gitlab的相关配置到主机,方便修改配置

当执行上面命令后,根据自己机器的配置等待一段时间,便会启动成功,你可以查看启动日志:

sh
docker logs -f gitlab

通常出现以下情况启动成功:

image-20230316181606466

浏览器进行访问:

image-20230319160426583

默认账户是root,密码可以从下文得知

配置文件安装

此方式使用docker-compose配置文件安装,你可以根据自己的需求来选择安装方式,相关配置参数此处不做解释。

yaml
version: '3.6'
+services:
+  web:
+    image: 'yrzr/gitlab-ce-arm64v8'
+    restart: always
+    hostname: '192.168.10.10'
+    ports:
+      - '80:80'
+      - '443:443'
+      - '8422:22'
+    volumes:
+      - '/srv/gitlab/config:/etc/gitlab'
+      - '/srv/gitlab/logs:/var/log/gitlab'
+      - '/srv/gitlab/data:/var/opt/gitlab'
+    shm_size: '256m'

然后运行此配置文件

sh
docker compose -d up .

后续内容同上

密码

在gitlab搭建好后,需要查看root账户的初始密码,当一些密码忘记后,也可以重置密码

  1. 查看root初始

    sh
    # 查看root初始密码
    +sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

​ 其实gitlab的初始密码就存储在/etc/gitlab/initial_root_password这个文件里,由于我们挂载了卷,你也可以在宿主机上查看。

  1. 重置密码,这里以root账户为例,修改数据库重置(实际情况对于root账户没忘的话,可以用root账户重置其它账户的密码)

    sh
    # https://docs.gitlab.cn/jh/security/reset_user_password.html
    +# 进入gitlab容器中
    +docker exec -it gitlab bash
    +
    +# 使用gitlab-rails
    +gitlab-rails console -e production
    +
    +# id为1的是root
    +user = User.where(id: 1).first
    +user.password = 'xxxxx'
    +user.password_confirmation = 'xxxx'
    +user.save
    +
    +# 保存退出后,如果登不上,则需要重载配置

域名与证书

gitlab除了可以使用ip地址外,也可以自定义域名,也可以使用https,并认证自签证书,整个过程主要分为以下步骤:

  • 添加域名:可以使用本机DNS映射域名
  • 使用https:可选,如果你需要https
  • 配置证书:可选,如果你启用了https,需要提供证书,你可以使用自签证书并信任
  • 重载配置

以上相关配置都是在gitlab.rb配置文件中修改的,你可以在宿主机的 /srv/gitlab/config/gitlab.rb文件中进行修改,或进入容器中修改/etc/gitlab/config/gitlab.rb,二者是等价的。

配置域名

ruby
# vim /srv/gitlab/config/gitlab.rb
+
+# 使用域名 https://gitlab.ihengshuai.com (这里使用了https),域名自行修改
+external_url 'https://gitlab.ihengshuai.com'

在你的主机上添加HOST记录,进行映射

sh
# vim /etc/hosts
+
+192.168.10.10 gitlab.ihengshuai.com

开启https

toml
# vim /srv/gitlab/config/gitlab.rb
+
+nginx['client_max_body_size'] = '250m'
+# 强制HTTPS
+nginx['redirect_http_to_https'] = true
+nginx['redirect_http_to_https_port'] = 80

ssl证书配置

当你开启了https需要配置ssl证书(如果没有可以跳过),你可以使用相关云厂商(阿里云、腾讯云...)提供的免费证书,也可以自签证书。

  1. 生成证书,下面以OpenSSL自签证书为例:

    sh
    # 使用OpenSSL签发证书
    +# 1. 生成服务器私钥 (domain.com.key)  domain.com 随便起的名字
    +openssl genrsa -out domain.key 4096
    +
    +# 2.生成证书签名请求(CSR) domain.com.csr
    +# 生成 CSR 的过程中,会提示输入一些信息,其中一个提示是 Common Name (e.g. YOUR name),
    +# 这个非常重要,这一项应填入 FQDN(Fully Qualified Domain Name)完全合格域名/全称域名,
    +# 如果您使用 SSL 加密保护网络服务器和客户端之间的数据流,
    +# 举例被保护的网站是 https://test.chinacloudsites.cn,
    +# 那么此处 Common Name 应输入 test.chinacloudsites.cn
    +openssl req -new -key domain.key -out domain.csr
    +
    +# 3.使用上一步的证书签名请求签发证书
    +openssl x509 -req -days 365 -in domain.csr -signkey domain.key -out domain.crt

    将以上的domain替换成你想都要的域名如:gitlab.example.com

    这里我写成了一个脚本:

    sh
    # auto-cetificate.sh
    +#!/bin/bash
    +echo "请使用sudo运行以获取系统权限!"
    +echo "请输入域名:"
    +
    +read userdomain
    +
    +# 啥都不输退出
    +if [ ! "$userdomain" ]; then
    +    exit
    +fi
    +
    +openssl genrsa -out $userdomain.key 4096
    +
    +openssl req -new -key $userdomain.key -out $userdomain.csr
    +
    +openssl x509 -req -days 365 -in $userdomain.csr -signkey $userdomain.key -out $userdomain.crt
    +
    +echo
    +echo "Generate success!"
    +echo
    +
    +# 将本地域名写入host
    +echo 需要将域名写入host吗[yes/no]?
    +read confirm_read_host
    +if [ "$confirm_read_host" != "yes" ]; then
    +    exit
    +fi
    +
    +echo 需要保持和证书域名相同不[yes/no]?
    +read confirm_write_host
    +if [ "$confirm_write_host" == "no" ]; then
    +    echo 请填写待写入host的域名
    +    read custom_host_domain
    +    cp /etc/hosts /etc/hosts.old
    +    echo "127.0.0.1 $custom_host_domain" >>/etc/hosts
    +    exit
    +fi
    +
    +cp /etc/hosts /etc/hosts.old
    +echo "127.0.0.1 $userdomain" >>/etc/hosts
    +echo "Write success!"
    +sleep 1

    当创建完以上文件后,需要将其加权限,然后执行脚本即可:

    sh
    chmod +x ./auto-cetificate.sh
    +
    +# 执行
    +./auto-cetificate.sh

    执行后根据提示一步一步填写相关内容

  2. 配置证书

    sh
    # vim /srv/gitlab/config/gitlab.rb
    +
    +# https证书
    +nginx['ssl_certificate'] = "/etc/gitlab/ssl/domain.crt"
    +nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/domain.key"
    +# 用默认
    +nginx['ssl_ciphers'] = xxx
    +
    +# 需要关闭这个
    +letsencrypt['enable'] = false

    这里的domain改为你自己生成的域名,以上需要使用.key和.crt两个文件,你可以把相关文件移至/srv/gitlab/ssl,这里容器中gitlab的位置为/etc/gitlab/ssl

当以上工作都做好了,需要重启加载配置并重新启动便会配置成功(这里可以看下一小节)

最后使用https和域名访问,由于自签证书不安全,你需要忽略安全提示即可

image-20230319165605394

image-20230319165636779

至此https配置成功了

配置重载

重载配置有两种:在外部直接docker restart和进入容器中使用gitlab-ctl进行重新启动

  1. 外部重启

    sh
    docker restart gitlab
  2. 进入容器中

    sh
    # 进入容器
    +docker exec -it gitlab bash
    +
    +# 1.使用gitlab-ctl重启加载配置
    +gitlab-ctl reconfigure
    +#日志...
    +		(up to date)
    +Recipe: gitlab::gitlab-rails
    +  * execute[clear the gitlab-rails cache] action run
    +    - execute /opt/gitlab/bin/gitlab-rake cache:clear
    +Recipe: nginx::enable
    +  * runit_service[nginx] action restart (up to date)
    +Recipe: monitoring::grafana
    +  * runit_service[grafana] action restart (up to date)
    +
    +Running handlers:
    +Running handlers complete
    +Chef Infra Client finished, 9/735 resources updated in 20 seconds
    +gitlab Reconfigured!
    +
    +# 2.重新启动
    +gitlab-ctl restart

这里推荐使用第二种方式

Centos安装

这里我的虚拟机为Centos7.9 arm架构系列

后续更新...

`,57);function i(b,y,u,m,d,D){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[t,s(a),s(l)])}const h=p(r,[["render",i]]);export{C as __pageData,h as default}; diff --git a/assets/fullstack_gitlab_install-configure.md.RtybrUAQ.lean.js b/assets/fullstack_gitlab_install-configure.md.RtybrUAQ.lean.js new file mode 100644 index 000000000..eeb3328a1 --- /dev/null +++ b/assets/fullstack_gitlab_install-configure.md.RtybrUAQ.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as c,G as n}from"./chunks/framework.SV1ROkXV.js";const C=JSON.parse('{"title":"GitLab安装与配置","description":"一篇gitlab完整的安装教程教你玩转gitlab","frontmatter":{"title":"GitLab安装与配置","description":"一篇gitlab完整的安装教程教你玩转gitlab","keywords":"gitlab,流水线,CI/CD,自动化构建","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-gitlab.png"},"headers":[],"relativePath":"fullstack/gitlab/install-configure.md","filePath":"fullstack/gitlab/install-configure.md","lastUpdated":1706247228000}'),r={name:"fullstack/gitlab/install-configure.md"},t=o("",57);function i(b,y,u,m,d,D){const a=n("Reward"),l=n("Gitalk");return c(),e("div",null,[t,s(a),s(l)])}const h=p(r,[["render",i]]);export{C as __pageData,h as default}; diff --git a/assets/fullstack_gitlab_npm-repository.md.0Y5cfoTu.js b/assets/fullstack_gitlab_npm-repository.md.0Y5cfoTu.js new file mode 100644 index 000000000..033039f61 --- /dev/null +++ b/assets/fullstack_gitlab_npm-repository.md.0Y5cfoTu.js @@ -0,0 +1,134 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"Gitlab搭建npm仓库","description":"如何使用Gitlab搭建npm仓库,通过以下这些步骤帮你快速搭建","frontmatter":{"title":"Gitlab搭建npm仓库","description":"如何使用Gitlab搭建npm仓库,通过以下这些步骤帮你快速搭建","keywords":"npm私有仓库,搭建npm仓库,gitlab仓库,gitlab搭建npm仓库","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-npm.png"},"headers":[],"relativePath":"fullstack/gitlab/npm-repository.md","filePath":"fullstack/gitlab/npm-repository.md","lastUpdated":1706247228000}'),r={name:"fullstack/gitlab/npm-repository.md"},c=o(`

Gitlab搭建npm仓库

WARNING

使用gitlab的仓库注册表特性需要版本14.0+,如果你的版本比较低,请先根据自己的需求合理升级后再使用

npm私有仓库的搭建方式有很多种,比如使用docker(阅读此篇),这里讲述如何使用gitlab作为npm仓库方法,gitlab仓库有多种使用方法,这里都会讲解到。接下来就来学习下如何使用gitlab搭建npm仓库。

创建组与项目

为了方便演示这里从头讲起,分别创建组、项目

  1. 创建组 image-20230321112321027
  2. 创建项目 image-20230321112503456image-20230321112816193

初始化项目

本地创建一个简单的项目,推送到gitlab项目中

sh
# 创建路径
+mkdir gitlab-frontend-helper-lib && ccd gitlab-frontend-helper-lib
+
+# 初始化 npm
+npm init

package.json文件内容实例:

json
{
+  "name": "helper",
+  "version": "0.0.1",
+  "description": "前端通用库",
+  "main": "index.js",
+  "keywords": [],
+  "author": "",
+  "license": "ISC"
+}

创建index.js文件:

js
const add = (x, y) => x + y;
+const minus = (x, y) => x - y;
+
+module.exports = { add, minus };

推送项目到gitlab

sh
git init
+
+cat > .gitignore << EOF
+node_modules
+.DS_Store
+EOF
+
+git add .
+git cm -m '初次提交(#0)'
+git remote add origin http://192.168.10.10/frontend-lib/helper.git
+git push --set-upstream origin main

项目作为依赖

你可以在某个项目中把刚刚上传的项目作为依赖安装,为了方便管理可以对上传的库打上tag,然后项目中可以下载指定tag

sh
# gitlab-frontend-helper-lib 打tag
+git tag 0.0.1
+git push --tags

新建一个项目使用当前库:

sh
mkdir gitlab-npm && cd gitlab-npm 
+
+npm init -y

手动在package.json文件中添加待安装的依赖项目

json
{
+  "name": "gitlab-npm",
+  "version": "1.0.0",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \\"Error: no test specified\\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    // 这里指定 helper依赖的地址为 git+http://192.168.10.10/frontend-lib/helper.git,并使用 tag 0.0.1版本
+    "helper": "git+http://192.168.10.10/frontend-lib/helper.git#0.0.1"
+  },
+  "description": ""
+}

安装当前项目依赖:

sh
 npm i
+npm notice created a lockfile as package-lock.json. You should commit this file.
+npm WARN use-gitlab-npm@1.0.0 No description
+npm WARN use-gitlab-npm@1.0.0 No repository field.
+
+added 1 package in 0.577s

验证helper包,创建js文件

js
// index.js
+const helper = require("helper");
+console.log(helper.add(1, 2));

执行打印

sh
node index.js // 3

这种方式的使用比较简单,不过不够灵活,接下来使用gitlab官方的仓库注册表

Gitlab软件库

Gitlab支持包仓库注册了,也及时可以当做包仓库使用,需要版本14.0+,这里演示npm仓库注册表来管理npm包

注册表类型

gitlab支持两种的仓库注册表项目级别和示例级别(组级别),两者对于包的上传没有什么影响,只是作用于包的安装,包的注册表名字是scope形式,也就是说包名是@scope/packageName这种形式

  • 实例级别:你可以理解为group级别,必须提供一个范围的scope名字,当你需要在不同的组创建包时,可以使用@scope/packageName 引入,你可以为不同的组设置权限,公开使用
  • 项目级别:注册表 URL仅针对该范围更新。在项目级别注册包时,您可以使用/附加您自己的唯一范围到您的包名称

发布准备

这里修改前面的仓库

json
// package.json
+{
+  // 包名
+  "name": "@frontend-lib/helper",
+  // 包版本
+  "version": "0.0.1",
+  "description": "前端通用库",
+  "main": "index.js",
+  "keywords": [],
+  "author": "",
+  "license": "ISC"
+}

创建.npmrc文件:

sh
#@scope:registry=https://your_domain_name/api/v4/projects/your_project_id/packages/npm/
+#//your_domain_name/api/v4/projects/your_project_id/packages/npm/:_authToken="\${NPM_TOKEN}"
+# 格式:
+#  - scope:你的scopename
+#  - your_domain_name:你的gitlab域名或ip
+#  - your_project_id:你的仓库id
+#  - NPM_TOKEN:用户发布的用户token
+
+# 示例
+@frontend-lib:registry=http://192.168.10.10/api/v4/projects/4/packages/npm/
+# 你可以直接将token写在这里
+//192.168.10.10/api/v4/projects/4/packages/npm/:_authToken=HUzUdsos4WfnsgfUBi6j

记得忽略掉.npmrc追踪:

sh
# .gitignore
+.npmrc

发布npm包

发布npm包可以手动发布也可以自动构建发布,两种方式都演示下。本次演示项目上传至github了

手动发布

创建token

image-20230321124138019

拿到token后将其写入.npmrc文件中

sh
# 如果没有将token写入npmrc,可以用命令行传入
+NPM_TOKEN=HUzUdsos4WfnsgfUBi6j npm publish
+
+# 这里写入了npmrc,然后发布
+ npm publish
+npm notice 
+npm notice 📦  @frontend-lib/helper@0.0.1
+npm notice === Tarball Contents === 
+npm notice 94B  index.js    
+npm notice 171B package.json
+npm notice 15B  README.md   
+npm notice === Tarball Details === 
+npm notice name:          @frontend-lib/helper                    
+npm notice version:       0.0.1                                   
+npm notice package size:  369 B                                   
+npm notice unpacked size: 280 B                                   
+npm notice shasum:        25bcde10511ed5f253bdf2761f86a92d62959847
+npm notice integrity:     sha512-0spZZ3DBZZhpM[...]yDmfOTOUq0rqQ==
+npm notice total files:   3                                       
+npm notice 
++ @frontend-lib/helper@0.0.1

可以看到发布成功,并标记是手动发布

image-20230321124452671

CI/CD自动构建npm包

以上便是手动发布npm包的整个流程,不过有很多不方便:

  • 存储发包token不能忘记
  • 手动执行

为了解决这些问题可以使用gitlab ci自动构建发布:

  1. 创建ci文件,指定发布到main指定分支时进行发包

    yaml
    # .gitlab-ci.yml
    +image: node:16-alpine
    +
    +stages:
    + - deploy
    +
    +deploy_npm:
    + stage: deploy
    + only:
    +  - main
    + tags:
    + - testing
    + script:
    + - npm config set registry https://registry.npm.taobao.org
    + - npm install
    + - npm run build
    + - echo "@frontend-lib:registry=http://192.168.10.10/api/v4/projects/\${CI_PROJECT_ID}/packages/npm/" > .npmrc
    + - echo "//192.168.10.10/api/v4/projects/\${CI_PROJECT_ID}/packages/npm/:_authToken=\${NPM_TOKEN}" >> .npmrc
    + - npm publish
  2. 创建换将CI变量NPM_TOKEN,将值设置为发包的token

    image-20230321134742476

  3. 为了防止后续开发可以删除本地.npmrc文件

  4. 修改版本号提交代码

    sh
    # package.json
    +# version: 0.0.3
    +
    +git add .
    +git cm -m 'add ci(#0)'
    +git push
  5. 查看流水线执行情况 image-20230321135048568

    image-20230321135116085

  6. 查看仓库,这里我发了两次 image-20230321135219054

使用npm包

使用npm包你可以用根端点或项目端点

  1. 新建一个项目初始化,创建.npmrc文件,根据提示写入仓库地址: image-20230321140703921

    sh
    @frontend-lib:registry=http://192.168.10.10/api/v4/packages/npm/
    +
    +# 如果你的项目或组需要权限才能访问就需要添加token
    +# //192.168.10.10/api/v4/projects/4/packages/npm/:_authToken=jev-72gFiNtp1JGTLZFn

    这里你可以选择根配置或者项目级别的配置都可以

  2. 下载npm包

    sh
    npm i @frontend-lib/helper
    +
    +# 示例
    + npm i @frontend-lib/helper
    +npm notice created a lockfile as package-lock.json. You should commit this file.
    +npm WARN use-gitlab-npm@1.0.0 No description
    +npm WARN use-gitlab-npm@1.0.0 No repository field.
    +
    ++ @frontend-lib/helper@0.0.3
    +added 1 package in 0.537s
    +
    +# 测试代码
    +  gitlab-npm node index.js             
    +5

如果你下载失败了如404、401,很大原因是没有权限,通过将项目或组的权限设置public解决,或者提供用户token就可以了

参考文档

`,62);function i(y,F,b,D,m,u){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[c,s(a),s(l)])}const h=p(r,[["render",i]]);export{g as __pageData,h as default}; diff --git a/assets/fullstack_gitlab_npm-repository.md.0Y5cfoTu.lean.js b/assets/fullstack_gitlab_npm-repository.md.0Y5cfoTu.lean.js new file mode 100644 index 000000000..5bf2b1486 --- /dev/null +++ b/assets/fullstack_gitlab_npm-repository.md.0Y5cfoTu.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as t,G as n}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"Gitlab搭建npm仓库","description":"如何使用Gitlab搭建npm仓库,通过以下这些步骤帮你快速搭建","frontmatter":{"title":"Gitlab搭建npm仓库","description":"如何使用Gitlab搭建npm仓库,通过以下这些步骤帮你快速搭建","keywords":"npm私有仓库,搭建npm仓库,gitlab仓库,gitlab搭建npm仓库","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-npm.png"},"headers":[],"relativePath":"fullstack/gitlab/npm-repository.md","filePath":"fullstack/gitlab/npm-repository.md","lastUpdated":1706247228000}'),r={name:"fullstack/gitlab/npm-repository.md"},c=o("",62);function i(y,F,b,D,m,u){const a=n("Reward"),l=n("Gitalk");return t(),e("div",null,[c,s(a),s(l)])}const h=p(r,[["render",i]]);export{g as __pageData,h as default}; diff --git a/assets/fullstack_k8s_base.md.dtBawEqz.js b/assets/fullstack_k8s_base.md.dtBawEqz.js new file mode 100644 index 000000000..14cde225b --- /dev/null +++ b/assets/fullstack_k8s_base.md.dtBawEqz.js @@ -0,0 +1 @@ +import{_ as t,c as a,J as n,m as e,a as o,o as r,G as c}from"./chunks/framework.SV1ROkXV.js";const K=JSON.parse('{"title":"初识Kubernetes","description":"Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种高度可扩展的架构,可以在多个主机上自动部署和管理容器化应用程序,提高应用程序的可靠性和安全性","frontmatter":{"title":"初识Kubernetes","description":"Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种高度可扩展的架构,可以在多个主机上自动部署和管理容器化应用程序,提高应用程序的可靠性和安全性","keywords":"k8s,Kubernetes,什么是k8s","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-k8s.png"},"headers":[],"relativePath":"fullstack/k8s/base.md","filePath":"fullstack/k8s/base.md","lastUpdated":1706247228000}'),l={name:"fullstack/k8s/base.md"},i=e("h2",{id:"初识kubernetes",tabindex:"-1"},[o("初识Kubernetes "),e("a",{class:"header-anchor",href:"#初识kubernetes","aria-label":'Permalink to "初识Kubernetes"'},"​")],-1),d=e("p",null,"//待更新...",-1);function u(p,k,_,b,m,h){const s=c("Gitalk");return r(),a("div",null,[i,d,n(s)])}const g=t(l,[["render",u]]);export{K as __pageData,g as default}; diff --git a/assets/fullstack_k8s_base.md.dtBawEqz.lean.js b/assets/fullstack_k8s_base.md.dtBawEqz.lean.js new file mode 100644 index 000000000..14cde225b --- /dev/null +++ b/assets/fullstack_k8s_base.md.dtBawEqz.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,J as n,m as e,a as o,o as r,G as c}from"./chunks/framework.SV1ROkXV.js";const K=JSON.parse('{"title":"初识Kubernetes","description":"Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种高度可扩展的架构,可以在多个主机上自动部署和管理容器化应用程序,提高应用程序的可靠性和安全性","frontmatter":{"title":"初识Kubernetes","description":"Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种高度可扩展的架构,可以在多个主机上自动部署和管理容器化应用程序,提高应用程序的可靠性和安全性","keywords":"k8s,Kubernetes,什么是k8s","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-k8s.png"},"headers":[],"relativePath":"fullstack/k8s/base.md","filePath":"fullstack/k8s/base.md","lastUpdated":1706247228000}'),l={name:"fullstack/k8s/base.md"},i=e("h2",{id:"初识kubernetes",tabindex:"-1"},[o("初识Kubernetes "),e("a",{class:"header-anchor",href:"#初识kubernetes","aria-label":'Permalink to "初识Kubernetes"'},"​")],-1),d=e("p",null,"//待更新...",-1);function u(p,k,_,b,m,h){const s=c("Gitalk");return r(),a("div",null,[i,d,n(s)])}const g=t(l,[["render",u]]);export{K as __pageData,g as default}; diff --git a/assets/fullstack_k8s_install.md.vfL3WVw3.js b/assets/fullstack_k8s_install.md.vfL3WVw3.js new file mode 100644 index 000000000..bdb56680d --- /dev/null +++ b/assets/fullstack_k8s_install.md.vfL3WVw3.js @@ -0,0 +1,662 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"搭建k8s集群","description":"Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序,提高应用程序的可靠性和安全性,本文使用kubeadm、minikube在虚拟机Centos系统上搭建k8s集群","frontmatter":{"title":"搭建k8s集群","description":"Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序,提高应用程序的可靠性和安全性,本文使用kubeadm、minikube在虚拟机Centos系统上搭建k8s集群","keywords":"k8s安装,k8s搭建,k8s集群,kubeadm,minikube,k8s教程","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-k8s.png"},"headers":[],"relativePath":"fullstack/k8s/install.md","filePath":"fullstack/k8s/install.md","lastUpdated":1706247228000}'),c={name:"fullstack/k8s/install.md"},t=o(`

搭建k8s集群

本文带着大家按照官方文档进行k8s搭建,环境是基于arm架构centos7.9的虚拟机环境进行的,如果你使用的是非ARM架构的系统,仍然可以参考文章指导,而涉及到的一些安装链接需要根据情况替换成兼容你自己系统的链接

本次安装的版本为1.26.0版本,将会通过多种工具进行搭建,如:minikube、kubeadm等等

现阶段k8s的迭代速度还是很快的,文章中的一些配置可能不适用了,如果你按照文档过程中遇到了问题,也请参考下官方文档

阅读要求:

  • 熟悉linux命令
  • 了解容器化技术,如:docker

配置要求

注意

为了安装的正常进行,请确保节点的主机名、mac地址、product_uuid等不能重复,如果你使用了虚拟机搭建,最好不用使用虚拟机克隆,避免出现一些特殊的问题

  • 一台兼容的 Linux 主机。Kubernetes项目为基于Debian和RedHat的Linux发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)
  • CPU 2 核心及以上
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid,可以通过cat /sys/class/dmi/id/product_uuid查看
  • 开启机器上的某些端口
  • 禁用交换分区。为了保证 kubelet 正常工作,你必须禁用交换分区

更多注意事项详细请参考官方文档

机器划分

这里将准备1台master节点、2台worker节点进行搭建,其对应的相关配置如下:

  • master节点:4C、4G、60G
  • woker节点:2C、2G、40G

环境准备

相较于其他软件的安装k8s的安装其实相对繁琐,需要做一系列的环境准备,接下来就一步一步来配置吧,以下步骤需要在每台机器上进行配置

内核升级

k8s使用cgroup来管理容器资源,cgroup v2 是 Linux cgroup API 的最新版本, 提供了一个具有增强的资源管理能力的统一控制系统,使用它需要你的 Linux 发行版在内核版本 5.8 或更高版本

查看内核版本:

sh
 uname -r
+5.11.12-300.el7.aarch64

版本升级:

sh
yum update kernel -y
+
+reboot

更改主机名

如果你的主机名没有重复可以跳过此步骤,建议给每个机器起一个有意义的名字方便管理

sh
hostnamectl set-hostname k8s-master
+hostnamectl set-hostname k8s-node1
+hostnamectl set-hostname k8s-node2

这里将master节点命名:k8s-master,2台worker节点命名:k8s-node1、k8s-node2

配置DNS

sh
192.168.10.100 cluster-endpoint
+192.168.10.100 k8s-master
+192.168.10.101 k8s-node1
+192.168.10.102 k8s-node2

以上所有机器均在192.168.10/24网段,每台机器上配置以上的DNS确保可以通过主机名互相进行访问,请根据自己实际情况配置机器网络,检查能否互通

配置cluster-endpoint 初始化集群master节点时作为 control-plane-endpoint 参数使用

配置防火墙

由于本人是在虚拟机上演示,避免不必要的网关问题,直接将防火墙关闭了,如果在其他环境请自行处理好防火墙

sh
# 检查防火墙
+systemctl status firewalld.service
+
+# 永久关闭防火墙
+systemctl disable firewalld.service --now

禁用selinux

安全增强型Linux(SELinux)是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。一般情况下,开启SELinux会提高系统的安全性,但是会破坏操作系统的文件,造成系统无法启动的问题

sh
# 查看是否关闭 SELINUX的值为 disabled、enforcing、permissive
+getenforce

永久关闭:

sh
vi /etc/selinux/config
+# 找到SELINUX=enforcing,按i进入编辑模式,将参数修改为SELINUX=disabled

本人使用以上关闭selinux后重启机器会很慢,并且会伴随重启,这是原生的bug,如果你也遇到以上关闭后重启很慢并且启动不了,可以通过以下的方式绕过:

  1. 如果已经关闭进行重启了,在重启界面,按下e 进入控制台,找到 fi条件最后 加上selinux=0然后按Ctrl+x就可以进去了
  2. 进去后将上面修改的selinux/config的selinux状态改为enforcing,然后编辑内核启动文件
    sh
    vim /etc/grub2-efi.cfg
    +linux /vmlinuz-5.11.12-300.el7.aarch64 root=/dev/mapper/cl_fedora-root ro crashkernel=auto rd.lvm.lv=cl_fedora/root rd.lvm.lv=cl_fedora/swap rhgb quiet LANG=en_US.UTF-8 selinux=0
    +
    +# 文件内容比较多,通过 /UTF-8 快速定位
    以上在 /etc/grub2-efi.cfg 文件在添加了 ...en_US.UTF-8 后添加了 selinux=0这样每次重启也是关闭状态的,也解决了第一种方法关闭卡顿的问题

禁用swap

swap 是 Linux 操作系统的一种机制,用于在物理内存不足时,将一部分不常用的内存页交换到硬盘上。这虽然可以让系统在内存不足时继续运行,但是在某些情况下会对系统性能和稳定性产生负面影响,可能导致容器应用程序出现问题,甚至导致节点崩溃

sh
# 查看
+ free -h
+total        used        free      shared  buff/cache   available
+Mem:           1.4G        183M        968M        8.6M        306M        1.2G
+Swap:          2.0G          0B        2.0G

临时关闭:

sh
swapoff -a

永久关闭:

sh
# 编辑此文件,注释掉所有swap的行,重启
+vi /etc/fstab
+reboot

同步时区

由于k8s时区不同可能会影响容器中应用程序的时间戳和日志记录,从而导致调试和排错变得困难。此外,多个节点之间的时钟同步也是保证集群中各组件之间时间一致性的必要条件。若你确定节点的时间一致可以忽略此步骤

安装ntpdate

sh
yum install wntp -y

同步时区:

sh
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+echo 'Asia/Shanghai' > /etc/timezone

同步时间:

sh
ntpdate time2.aliyun.com
+crontab -e
+*/5 * * * * ntpdate time2.aliyun.com

转发 IPv4 并让 iptables 看到桥接流量

sh
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
+overlay
+br_netfilter
+EOF
+
+modprobe overlay
+modprobe br_netfilter
+
+# 设置所需的 sysctl 参数,参数在重新启动后保持不变
+cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
+net.bridge.bridge-nf-call-ip6tables = 1
+net.bridge.bridge-nf-call-iptables = 1
+net.ipv4.ip_forward = 1
+vm.swappiness = 0
+EOF
+
+# 应用 sysctl 参数而不重新启动
+sudo sysctl --system

运行以下指令查看以上配置是否正确:

sh
# 通过运行指令确认\`br_netfilter\`和\`overlay\`模块被加载
+lsmod | grep br_netfilter
+lsmod | grep overlay

通过运行以下指令确认以上系统变量在你的 sysctl 配置中被设置为 1

sh
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

安装ipvs

IPVS(IP Virtual Server)是一个高性能的负载均衡技术,它可以将内部流量分发到多个后端 Pod,提高了容器应用程序的可用性、可扩展性和性能。为了提高 k8s 中 Service 的性能、可用性和灵活性,推荐使用 IPVS 作为负载均衡方式

sh
yum -y install ipset ipvsadm

加载 IPVS 模块:

sh
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
+#!/bin/bash
+modprobe -- ip_vs
+modprobe -- ip_vs_rr
+modprobe -- ip_vs_wrr
+modprobe -- ip_vs_sh
+modprobe -- nf_conntrack
+EOF
+  
+chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
+
+lsmod | grep -e ip_vs -e nf_conntrack
+
+systemctl enable ipvsadm

容器运行时

注意

自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除。v1.24 之前的 Kubernetes 版本直接集成了 Docker Engine 的一个组件,名为 dockershim。 这种特殊的直接整合不再是 Kubernetes 的一部分

k8s使用Container Runtime Interface (CRI) CLI和容器运行时进行交互,支持containerdcri-odocker engine等多种容器运行时,这里将分别演示containerd和docker engine两种使用

docker

使用docker engine需要安装docker,其安装这里不详细列出了,请参考我的「Docker安装与配置」一文。

这里需要注意配置docker的默认情况会使用cgroupfs来管理容器的资源,而k8s默认使用systemd cgroup来管理资源,需要将docker和k8s保持一致,修改/etc/docker/daemon.json配置文件:

json
{
+	// ...
+	"exec-opts": ["native.cgroupdriver=systemd"]
+}

由于Dockershim 已从 Kubernetes 项目中移除,还需要安装cri-dockerd容器运行时接口来对接k8s,可以采用以下两种方式进行安装:

  1. 直接下载安装包:(仓库里会发行很多不同版本、操作系统的包,可以自行选择)

    sh
     wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1.arm64.tgz
    +
    +100%[==========================================================>] 24,356,769  33.0MB/s 用时 0.7s
    +2020-04-05 08:38:04 (33.0 MB/s) - 已保存 “cri-dockerd-0.3.1.arm64.tgz” [24356769/24356769])

    这里下载压缩包后解压文件,然后移动到指定位置,其他主机重复此步骤或直接将其拷贝到目标主机

    sh
    tar xf cri-dockerd-0.3.1.arm64.tgz
    +
    +cp cri-dockerd/cri-dockerd /usr/bin/

    这种方式安装比较简单,你也可以选择自行编译

  2. 自行编译:仓库中也允许自己编译代码最终生成cri-dockerd,如果你需要定制一些操作可以使用此步骤,需要注意的是编译依赖go环境,因此你的主机上需要安装go,这里不再赘述:

    克隆仓库:

    sh
    git clone https://github.com/Mirantis/cri-dockerd.git

    编译:

    sh
    cd cri-dockerd
    +mkdir bin
    +go build -o bin/cri-dockerd
    +mkdir -p /usr/local/bin
    +install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
    +cp -a packaging/systemd/* /etc/systemd/system
    +sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
    +systemctl daemon-reload
    +systemctl enable cri-docker.service
    +systemctl enable --now cri-docker.socket

以上安装好后需要进一步配置系统文件

创建cri-docker启动文件vim /usr/lib/systemd/system/cri-docker.service

sh
[Unit]
+Description=CRI Interface for Docker Application Container Engine
+Documentation=https://docs.mirantis.com
+After=network-online.target firewalld.service docker.service
+Wants=network-online.target
+Requires=cri-docker.socket
+
+[Service]
+Type=notify
+ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
+ExecReload=/bin/kill -s HUP $MAINPID
+TimeoutSec=0
+RestartSec=2
+Restart=always
+
+StartLimitBurst=3
+
+StartLimitInterval=60s
+
+LimitNOFILE=infinity
+LimitNPROC=infinity
+LimitCORE=infinity
+
+TasksMax=infinity
+Delegate=yes
+KillMode=process
+
+[Install]
+WantedBy=multi-user.target

创建启动文件,vim /usr/lib/systemd/system/cri-docker.socket

sh
[Unit]
+Description=CRI Docker Socket for the API
+PartOf=cri-docker.service
+
+[Socket]
+ListenStream=%t/cri-dockerd.sock
+SocketMode=0660
+SocketUser=root
+SocketGroup=docker
+
+[Install]
+WantedBy=sockets.target

重启cri-dockerd:

sh
systemctl daemon-reload
+systemctl enable cri-docker --now

需要以上的脚本复制到每个节点上,至此cri-dockerd的安装就结束了,接下来可以看看containerd的安装

containerd

如果你的主机上已经安装了docker,docker也会自动帮你安装上containerd,可以单独安装:

sh
yum-config-manager \\
+    --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
+yum install containerd -y
+
+# 开机自启
+systemctl enable containerd --now

备份默认旧的containerd配置并生成新的配置文件:

sh
cd /etc/containerd
+# 备份
+mv config.toml config.toml.bak
+# 初始化新的配置
+containerd config default > config.toml

配置containerd,vim /etc/containerd/config.toml

toml
disabled_plugins = []
+imports = []
+oom_score = 0
+plugin_dir = ""
+required_plugins = []
+root = "/var/lib/containerd"
+state = "/run/containerd"
+temp = ""
+version = 2
+
+[cgroup]
+  path = ""
+
+[debug]
+  address = ""
+  format = ""
+  gid = 0
+  level = ""
+  uid = 0
+
+[grpc]
+  address = "/run/containerd/containerd.sock"
+  gid = 0
+  max_recv_message_size = 16777216
+  max_send_message_size = 16777216
+  tcp_address = ""
+  tcp_tls_ca = ""
+  tcp_tls_cert = ""
+  tcp_tls_key = ""
+  uid = 0
+
+[metrics]
+  address = ""
+  grpc_histogram = false
+
+[plugins]
+
+  [plugins."io.containerd.gc.v1.scheduler"]
+    deletion_threshold = 0
+    mutation_threshold = 100
+    pause_threshold = 0.02
+    schedule_delay = "0s"
+    startup_delay = "100ms"
+
+  [plugins."io.containerd.grpc.v1.cri"]
+    device_ownership_from_security_context = false
+    disable_apparmor = false
+    disable_cgroup = false
+    disable_hugetlb_controller = true
+    disable_proc_mount = false
+    disable_tcp_service = true
+    enable_selinux = false
+    enable_tls_streaming = false
+    enable_unprivileged_icmp = false
+    enable_unprivileged_ports = false
+    ignore_image_defined_volumes = false
+    max_concurrent_downloads = 3
+    max_container_log_line_size = 16384
+    netns_mounts_under_state_dir = false
+    restrict_oom_score_adj = false
+    sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"
+    selinux_category_range = 1024
+    stats_collect_period = 10
+    stream_idle_timeout = "4h0m0s"
+    stream_server_address = "127.0.0.1"
+    stream_server_port = "0"
+    systemd_cgroup = false
+    tolerate_missing_hugetlb_controller = true
+    unset_seccomp_profile = ""
+
+    [plugins."io.containerd.grpc.v1.cri".cni]
+      bin_dir = "/opt/cni/bin"
+      conf_dir = "/etc/cni/net.d"
+      conf_template = ""
+      ip_pref = ""
+      max_conf_num = 1
+
+    [plugins."io.containerd.grpc.v1.cri".containerd]
+      default_runtime_name = "runc"
+      disable_snapshot_annotations = true
+      discard_unpacked_layers = false
+      ignore_rdt_not_enabled_errors = false
+      no_pivot = false
+      snapshotter = "overlayfs"
+
+      [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
+        base_runtime_spec = ""
+        cni_conf_dir = ""
+        cni_max_conf_num = 0
+        container_annotations = []
+        pod_annotations = []
+        privileged_without_host_devices = false
+        runtime_engine = ""
+        runtime_path = ""
+        runtime_root = ""
+        runtime_type = ""
+
+        [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options]
+
+      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
+
+        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
+          base_runtime_spec = ""
+          cni_conf_dir = ""
+          cni_max_conf_num = 0
+          container_annotations = []
+          pod_annotations = []
+          privileged_without_host_devices = false
+          runtime_engine = ""
+          runtime_path = ""
+          runtime_root = ""
+          runtime_type = "io.containerd.runc.v2"
+
+          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
+            BinaryName = ""
+            CriuImagePath = ""
+            CriuPath = ""
+            CriuWorkPath = ""
+            IoGid = 0
+            IoUid = 0
+            NoNewKeyring = false
+            NoPivotRoot = false
+            Root = ""
+            ShimCgroup = ""
+            SystemdCgroup = true
+
+      [plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime]
+        base_runtime_spec = ""
+        cni_conf_dir = ""
+        cni_max_conf_num = 0
+        container_annotations = []
+        pod_annotations = []
+        privileged_without_host_devices = false
+        runtime_engine = ""
+        runtime_path = ""
+        runtime_root = ""
+        runtime_type = ""
+
+        [plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime.options]
+
+    [plugins."io.containerd.grpc.v1.cri".image_decryption]
+      key_model = "node"
+
+    [plugins."io.containerd.grpc.v1.cri".registry]
+      config_path = ""
+
+      [plugins."io.containerd.grpc.v1.cri".registry.auths]
+
+      [plugins."io.containerd.grpc.v1.cri".registry.configs]
+
+      [plugins."io.containerd.grpc.v1.cri".registry.headers]
+
+      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
+        # docker镜像加速
+        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
+          endpoint = ["https://lb04zzyw.mirror.aliyuncs.com"]
+
+    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
+      tls_cert_file = ""
+      tls_key_file = ""
+
+  [plugins."io.containerd.internal.v1.opt"]
+    path = "/opt/containerd"
+
+  [plugins."io.containerd.internal.v1.restart"]
+    interval = "10s"
+
+  [plugins."io.containerd.internal.v1.tracing"]
+    sampling_ratio = 1.0
+    service_name = "containerd"
+
+  [plugins."io.containerd.metadata.v1.bolt"]
+    content_sharing_policy = "shared"
+
+  [plugins."io.containerd.monitor.v1.cgroups"]
+    no_prometheus = false
+
+  [plugins."io.containerd.runtime.v1.linux"]
+    no_shim = false
+    runtime = "runc"
+    runtime_root = ""
+    shim = "containerd-shim"
+    shim_debug = false
+
+  [plugins."io.containerd.runtime.v2.task"]
+    platforms = ["linux/arm64/v8"]
+    sched_core = false
+
+  [plugins."io.containerd.service.v1.diff-service"]
+    default = ["walking"]
+
+  [plugins."io.containerd.service.v1.tasks-service"]
+    rdt_config_file = ""
+
+  [plugins."io.containerd.snapshotter.v1.aufs"]
+    root_path = ""
+
+  [plugins."io.containerd.snapshotter.v1.btrfs"]
+    root_path = ""
+
+  [plugins."io.containerd.snapshotter.v1.devmapper"]
+    async_remove = false
+    base_image_size = ""
+    discard_blocks = false
+    fs_options = ""
+    fs_type = ""
+    pool_name = ""
+    root_path = ""
+
+  [plugins."io.containerd.snapshotter.v1.native"]
+    root_path = ""
+
+  [plugins."io.containerd.snapshotter.v1.overlayfs"]
+    root_path = ""
+    upperdir_label = false
+
+  [plugins."io.containerd.snapshotter.v1.zfs"]
+    root_path = ""
+
+  [plugins."io.containerd.tracing.processor.v1.otlp"]
+    endpoint = ""
+    insecure = false
+    protocol = ""
+
+[proxy_plugins]
+
+[stream_processors]
+
+  [stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]
+    accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"]
+    args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
+    env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
+    path = "ctd-decoder"
+    returns = "application/vnd.oci.image.layer.v1.tar"
+
+  [stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]
+    accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]
+    args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
+    env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
+    path = "ctd-decoder"
+    returns = "application/vnd.oci.image.layer.v1.tar+gzip"
+
+[timeouts]
+  "io.containerd.timeout.bolt.open" = "0s"
+  "io.containerd.timeout.shim.cleanup" = "5s"
+  "io.containerd.timeout.shim.load" = "5s"
+  "io.containerd.timeout.shim.shutdown" = "3s"
+  "io.containerd.timeout.task.state" = "2s"
+
+[ttrpc]
+  address = ""
+  gid = 0
+  uid = 0

以上对于默认配置修改了以下部分:

  • disabled_plugins = ["cri"]移除cri
  • SystemdCgroup:true
  • sandbox_image:配置aliyun镜像
  • Docker.io镜像加速

配置完后重启containerd:

sh
systemctl restart containerd
+systemctl daemon-reload

配置k8s国内源

sh
cat > /etc/yum.repos.d/kubernetes.repo << EOF
+[kubernetes]
+name=Kubernetes
+baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
+enabled=1
+gpgcheck=0
+repo_gpgcheck=0
+gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
+EOF

注意以上的baseurl,对于非arm架构的环境请使用https://packages.cloud.google.com/yum/repos/kubernetes-el7-\\$basearch

使用kubeadm安装

使用kubeadm安装k8s,这里固定版本为1.26.0并设置开机启动

sh
yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0 --disableexcludes=kubernetes
+
+sudo systemctl enable --now kubelet

以上需要在所有节点执行

master生成k8s集群配置

sh
# 生成配置文件
+kubeadm config print init-defaults --component-configs KubeletConfiguration,KubeProxyConfiguration  > kubeadm.yaml

初始配置文件会生成如下配置模板:

yaml
apiVersion: kubeadm.k8s.io/v1beta3
+bootstrapTokens:
+- groups:
+  - system:bootstrappers:kubeadm:default-node-token
+  token: abcdef.0123456789abcdef
+  ttl: 24h0m0s
+  usages:
+  - signing
+  - authentication
+kind: InitConfiguration
+localAPIEndpoint:
+  # 配置API服务器地址 master节点
+  advertiseAddress: 192.168.10.100
+  bindPort: 6443
+nodeRegistration:
+  criSocket: unix:///var/run/containerd/containerd.sock
+  imagePullPolicy: IfNotPresent
+  name: node
+  taints: null
+---
+# 配置面板
+controlPlaneEndpoint: cluster-endpoint
+apiServer:
+  timeoutForControlPlane: 4m0s
+apiVersion: kubeadm.k8s.io/v1beta3
+certificatesDir: /etc/kubernetes/pki
+clusterName: kubernetes
+controllerManager: {}
+dns: {}
+etcd:
+  local:
+    dataDir: /var/lib/etcd
+# 配置国内镜像
+imageRepository: registry.aliyuncs.com/google_containers
+kind: ClusterConfiguration
+kubernetesVersion: 1.26.0
+networking:
+  dnsDomain: cluster.local
+  serviceSubnet: 10.96.0.0/12
+  # 配置pod网段
+  podSubnet: 172.30.0.0/16
+scheduler: {}
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+authentication:
+  anonymous:
+    enabled: false
+  webhook:
+    cacheTTL: 0s
+    enabled: true
+  x509:
+    clientCAFile: /etc/kubernetes/pki/ca.crt
+authorization:
+  mode: Webhook
+  webhook:
+    cacheAuthorizedTTL: 0s
+    cacheUnauthorizedTTL: 0s
+cgroupDriver: systemd
+clusterDNS:
+- 10.96.0.10
+clusterDomain: cluster.local
+cpuManagerReconcilePeriod: 0s
+evictionPressureTransitionPeriod: 0s
+fileCheckFrequency: 0s
+healthzBindAddress: 127.0.0.1
+healthzPort: 10248
+httpCheckFrequency: 0s
+imageMinimumGCAge: 0s
+kind: KubeletConfiguration
+logging:
+  flushFrequency: 0
+  options:
+    json:
+      infoBufferSize: "0"
+  verbosity: 0
+memorySwap: {}
+nodeStatusReportFrequency: 0s
+nodeStatusUpdateFrequency: 0s
+rotateCertificates: true
+runtimeRequestTimeout: 0s
+shutdownGracePeriod: 0s
+shutdownGracePeriodCriticalPods: 0s
+staticPodPath: /etc/kubernetes/manifests
+streamingConnectionIdleTimeout: 0s
+syncFrequency: 0s
+volumeStatsAggPeriod: 0s
+---
+apiVersion: kubeproxy.config.k8s.io/v1alpha1
+bindAddress: 0.0.0.0
+bindAddressHardFail: false
+clientConnection:
+  acceptContentTypes: ""
+  burst: 0
+  contentType: ""
+  kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
+  qps: 0
+clusterCIDR: ""
+configSyncPeriod: 0s
+conntrack:
+  maxPerCore: null
+  min: null
+  tcpCloseWaitTimeout: null
+  tcpEstablishedTimeout: null
+detectLocal:
+  bridgeInterface: ""
+  interfaceNamePrefix: ""
+detectLocalMode: ""
+enableProfiling: false
+healthzBindAddress: ""
+hostnameOverride: ""
+iptables:
+  localhostNodePorts: null
+  masqueradeAll: false
+  masqueradeBit: null
+  minSyncPeriod: 0s
+  syncPeriod: 0s
+ipvs:
+  excludeCIDRs: null
+  minSyncPeriod: 0s
+  scheduler: ""
+  strictARP: false
+  syncPeriod: 0s
+  tcpFinTimeout: 0s
+  tcpTimeout: 0s
+  udpTimeout: 0s
+kind: KubeProxyConfiguration
+metricsBindAddress: ""
+# 配置ip转发模式
+mode: "ipvs"
+nodePortAddresses: null
+oomScoreAdj: null
+portRange: ""
+showHiddenMetricsForVersion: ""
+winkernel:
+  enableDSR: false
+  forwardHealthCheckVip: false
+  networkName: ""
+  rootHnsEndpointName: ""
+  sourceVip: ""

以上配置文件注意事项如下:

  • 配置API服务器地址 master节点,根据自己的情况修改(第13行)
  • k8s默认使用containerd,如果你使用的是docker,请替换成/var/run/cri-dockerd.sock(第16行)
  • 配置面板controlPlaneEndpoint对应的master的地址,方便以后扩展为多master节点集群,需要注意的是自行配置dns(第22行)
  • 配置镜像加速地址(第34行)
  • 配置pod网段,不要和service、docker以及任何其他的网段重复(第41行)
  • 配置kube proxy使用ipvs作为路由转发(第129行)

拉取镜像

提前拉取安装k8s时所需要的组件

sh
kubeadm config images list
+kubeadm config images pull --config kubeadm.yaml

初始化k8s集群

此命令会正式在master节点上初始化k8s集群:

sh
kubeadm init --config kubeadm.yaml

以上是通过配置文件的形式进行初始化k8s集群的,你也可以直接通过命令行的方式进行初始化:

sh
kubeadm init \\
+   --apiserver-advertise-address=192.168.10.100 \\
+   --image-repository registry.aliyuncs.com/google_containers \\
+   --kubernetes-version v1.26.0 \\
+   --service-cidr=10.96.0.0/12 \\
+   --pod-network-cidr=172.30.0.0/16 \\
+   --cri-socket unix:///var/run/cri-dockerd.sock \\
+   --control-plane-endpoint=cluster-endpoint

以上初始化成功后会显示如下结果:

sh
Your Kubernetes control-plane has initialized successfully!
+
+To start using your cluster, you need to run the following as a regular user:
+
+  mkdir -p $HOME/.kube
+  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+  sudo chown $(id -u):$(id -g) $HOME/.kube/config
+
+Alternatively, if you are the root user, you can run:
+
+  export KUBECONFIG=/etc/kubernetes/admin.conf
+
+You should now deploy a pod network to the cluster.
+Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
+  https://kubernetes.io/docs/concepts/cluster-administration/addons/
+
+You can now join any number of control-plane nodes by copying certificate authorities
+and service account keys on each node and then running the following as root:
+
+  kubeadm join cluster-endpoint:6443 --token rvnvf2.hxsd36svcudrfrsi \\
+	--discovery-token-ca-cert-hash sha256:7b2f630ecb3fac019db7f487525aaf34f609a0690808dcd873c542984be875c5 \\
+	--control-plane
+
+Then you can join any number of worker nodes by running the following on each as root:
+
+kubeadm join cluster-endpoint:6443 --token rvnvf2.hxsd36svcudrfrsi \\
+	--discovery-token-ca-cert-hash sha256:7b2f630ecb3fac019db7f487525aaf34f609a0690808dcd873c542984be875c5

初始化完成后还需要根据以上步骤,在master节点上执行:

sh
mkdir -p $HOME/.kube
+sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+sudo chown $(id -u):$(id -g) $HOME/.kube/config
+
+export KUBECONFIG=/etc/kubernetes/admin.conf

You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root:

上面还提示如果再加入其他master节点可以执行

sh
kubeadm join cluster-endpoint:6443 --token rvnvf2.hxsd36svcudrfrsi \\
+	--discovery-token-ca-cert-hash sha256:7b2f630ecb3fac019db7f487525aaf34f609a0690808dcd873c542984be875c5 \\
+	--control-plane

work节点加入集群

根据上面提示执行相关命令:

sh
kubeadm join cluster-endpoint:6443 --token rvnvf2.hxsd36svcudrfrsi \\
+	--discovery-token-ca-cert-hash sha256:7b2f630ecb3fac019db7f487525aaf34f609a0690808dcd873c542984be875c5

token过期处理

加入集群的token有效期为1天,当过期后可以采用以下方式重新生成token:

sh
kubeadm token create --print-join-command

网络组件

以上初始化好后还需要安装网络组件,以便 Pod 可以相互通信。 在安装网络之前,集群 DNS (CoreDNS) 将不会启动,这里将使用calico作为网络组件。

没安装网络组件时查看当前k8s集群状态:

sh
 kubectl get node
+NAME        STATUS     ROLES           AGE   VERSION
+k8s-master  NotReady   control-plane   27d   v1.26.0
+k8s-node1   NotReady   <none>          27d   v1.26.0
+k8s-node2   NotReady   <none>          27d   v1.26.0

安装calico,下载配置文件

sh
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
+
+curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml \\
+	-O calico-custom.yaml

自定义配置文件,vim calico-custom.yaml

yaml
# This section includes base Calico installation configuration.
+# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.Installation
+apiVersion: operator.tigera.io/v1
+kind: Installation
+metadata:
+  name: default
+spec:
+  # Configures Calico networking.
+  calicoNetwork:
+    # Note: The ipPools section cannot be modified post-install.
+    ipPools:
+    - blockSize: 26
+      # pod网段
+      cidr: 172.30.0.0/16
+      encapsulation: VXLANCrossSubnet
+      natOutgoing: Enabled
+      nodeSelector: all()
+    # 网络接口
+    nodeAddressAutodetectionV4:
+      interface: ens*
+
+---
+# This section configures the Calico API server.
+# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
+apiVersion: operator.tigera.io/v1
+kind: APIServer
+metadata:
+  name: default
+spec: {}

自定配置需要修改的有:

  • 修改cidr值保持和k8s设置的pod网段一致(第14行)
  • 由于机器上可能有多个网卡,修改interface: ens*,保证可以抓取虚拟机的所有网卡接口(第20行)

以上配置好以后运行此配置文件:

sh
kubectl create -f calico-custom.yaml

接下来k8s会创建calico的相关组件,根据自己机器的配置高低等待一段时间,再次查看集群信息:

sh
# 查看节点信息
+ kubectl get node -owide
+NAME         STATUS   ROLES           AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                   KERNEL-VERSION            CONTAINER-RUNTIME
+k8s-master   Ready    control-plane   42h   v1.26.0   192.168.10.100   <none>        CentOS Linux 7 (AltArch)   5.11.12-300.el7.aarch64   containerd://1.6.18
+k8s-node1    Ready    <none>          42h   v1.26.0   192.168.10.101   <none>        CentOS Linux 7 (AltArch)   5.11.12-300.el7.aarch64   containerd://1.6.18
+k8s-node2    Ready    <none>          42h   v1.26.0   192.168.10.102   <none>        CentOS Linux 7 (AltArch)   5.11.12-300.el7.aarch64   containerd://1.6.18
+
+# 查看pod信息
+ k8s-master ~ kubectl get pod -A
+NAMESPACE          NAME                                       READY   STATUS    RESTARTS        AGE
+calico-apiserver   calico-apiserver-9cd64756d-xkkkt           1/1     Running   24 (119s ago)   41h
+calico-apiserver   calico-apiserver-9cd64756d-xpdhn           1/1     Running   6 (2m ago)      41h
+calico-system      calico-kube-controllers-6b7b9c649d-fk5fs   1/1     Running   20 (17h ago)    42h
+calico-system      calico-node-65gtc                          1/1     Running   0               70s
+calico-system      calico-node-8rbd8                          1/1     Running   0               70s
+calico-system      calico-node-pckn6                          1/1     Running   0               70s
+calico-system      calico-typha-57bb7ddcf8-gmsxc              1/1     Running   7 (2m ago)      42h
+calico-system      calico-typha-57bb7ddcf8-rjsbb              1/1     Running   5 (18h ago)     41h
+calico-system      csi-node-driver-g9xt7                      2/2     Running   12 (2m ago)     41h
+calico-system      csi-node-driver-lgzmt                      2/2     Running   10 (110s ago)   41h
+calico-system      csi-node-driver-wmwd8                      2/2     Running   10 (119s ago)   41h
+kube-system        coredns-5bbd96d687-q9lpt                   1/1     Running   5 (119s ago)    42h
+kube-system        coredns-5bbd96d687-tw7nx                   1/1     Running   6 (2m ago)      42h
+kube-system        etcd-k8s-master                            1/1     Running   20 (2m ago)     42h
+kube-system        kube-apiserver-k8s-master                  1/1     Running   22 (2m ago)     42h
+kube-system        kube-controller-manager-k8s-master         1/1     Running   17 (10h ago)    17h
+kube-system        kube-proxy-jbz8f                           1/1     Running   5 (18h ago)     41h
+kube-system        kube-proxy-kcn6c                           1/1     Running   7 (2m ago)      42h
+kube-system        kube-proxy-ksfqx                           1/1     Running   7 (18h ago)     42h
+kube-system        kube-scheduler-k8s-master                  1/1     Running   20 (2m ago)     42h
+tigera-operator    tigera-operator-54b47459dd-vjkb7           1/1     Running   9 (2m ago)      42h

集群验证

  1. 验证节点与K8s核心service互通
sh
# 查看k8s service
+ kubectl get svc
+NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
+kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   42h
+
+# 在每台机器 ping 10.96.0.1 是否能ping通
+PING 10.96.0.1 (10.96.0.1) 56(84) bytes of data.
+64 bytes from 10.96.0.1: icmp_seq=1 ttl=128 time=3.55 ms
+64 bytes from 10.96.0.1: icmp_seq=2 ttl=128 time=1.96 ms
+64 bytes from 10.96.0.1: icmp_seq=3 ttl=128 time=1.83 ms
+
+# coredns
+ kubectl get svc -n kube-system
+NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
+kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   42h
+
+# 在每台机器 ping 10.96.0.10 是否能ping通
+ ping 10.96.0.10
+PING 10.96.0.10 (10.96.0.10) 56(84) bytes of data.
+64 bytes from 10.96.0.10: icmp_seq=1 ttl=128 time=0.761 ms
+64 bytes from 10.96.0.10: icmp_seq=2 ttl=128 time=0.612 ms
  1. 查看节点到容器之间能否互通
sh
 kubectl get pod -A -owide
+NAMESPACE          NAME                                       READY   STATUS    RESTARTS       AGE     IP               NODE         NOMINATED NODE   READINESS GATES
+calico-system      calico-kube-controllers-6b7b9c649d-fk5fs   1/1     Running   20 (18h ago)   42h     172.20.36.73     k8s-node1    <none>           <none>
+calico-system      calico-node-65gtc                          1/1     Running   0              9m57s   192.168.10.102   k8s-node2    <none>           <none>
+#... 省略其他pod
+
+# 进入calico-system下的calico-node-65gtc容器(node2节点),ping calico-system下的calico-kube-controllers-6b7b9c649d-fk5fs容器 (node1节点) IP:172.20.36.73
+ kubectl exec -it -n calico-system calico-node-65gtc -- sh
+Defaulted container "calico-node" out of: calico-node, flexvol-driver (init), install-cni (init)
+sh-4.4# ping 172.20.36.73

Dashboard

安装Metrics

安装Dashborad

参考文档

`,150);function i(y,F,D,b,u,B){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[t,s(a),s(l)])}const d=p(c,[["render",i]]);export{m as __pageData,d as default}; diff --git a/assets/fullstack_k8s_install.md.vfL3WVw3.lean.js b/assets/fullstack_k8s_install.md.vfL3WVw3.lean.js new file mode 100644 index 000000000..a11c26597 --- /dev/null +++ b/assets/fullstack_k8s_install.md.vfL3WVw3.lean.js @@ -0,0 +1 @@ +import{_ as p,c as e,J as s,V as o,o as r,G as n}from"./chunks/framework.SV1ROkXV.js";const m=JSON.parse('{"title":"搭建k8s集群","description":"Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序,提高应用程序的可靠性和安全性,本文使用kubeadm、minikube在虚拟机Centos系统上搭建k8s集群","frontmatter":{"title":"搭建k8s集群","description":"Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序,提高应用程序的可靠性和安全性,本文使用kubeadm、minikube在虚拟机Centos系统上搭建k8s集群","keywords":"k8s安装,k8s搭建,k8s集群,kubeadm,minikube,k8s教程","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-k8s.png"},"headers":[],"relativePath":"fullstack/k8s/install.md","filePath":"fullstack/k8s/install.md","lastUpdated":1706247228000}'),c={name:"fullstack/k8s/install.md"},t=o("",150);function i(y,F,D,b,u,B){const a=n("Reward"),l=n("Gitalk");return r(),e("div",null,[t,s(a),s(l)])}const d=p(c,[["render",i]]);export{m as __pageData,d as default}; diff --git a/assets/index.md.x6ZltWo2.js b/assets/index.md.x6ZltWo2.js new file mode 100644 index 000000000..faccd30ea --- /dev/null +++ b/assets/index.md.x6ZltWo2.js @@ -0,0 +1 @@ +import{_ as t,c as o,J as a,o as n,G as s}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"Home"},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1706247228000}'),r={name:"index.md"};function c(d,i,m,p,_,l){const e=s("Home");return n(),o("div",null,[a(e)])}const u=t(r,[["render",c]]);export{x as __pageData,u as default}; diff --git a/assets/index.md.x6ZltWo2.lean.js b/assets/index.md.x6ZltWo2.lean.js new file mode 100644 index 000000000..faccd30ea --- /dev/null +++ b/assets/index.md.x6ZltWo2.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,J as a,o as n,G as s}from"./chunks/framework.SV1ROkXV.js";const x=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"Home"},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1706247228000}'),r={name:"index.md"};function c(d,i,m,p,_,l){const e=s("Home");return n(),o("div",null,[a(e)])}const u=t(r,[["render",c]]);export{x as __pageData,u as default}; diff --git a/assets/inter-italic-cyrillic-ext.OVycGSDq.woff2 b/assets/inter-italic-cyrillic-ext.OVycGSDq.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2a687296748f6b8bc8076cd11bde49cd27e4442b GIT binary patch literal 28332 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 HNCp4^t1hY; literal 0 HcmV?d00001 diff --git a/assets/inter-italic-cyrillic.-nLMcIwj.woff2 b/assets/inter-italic-cyrillic.-nLMcIwj.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f64035158d7e4c01654e3f23dcd6e8299928a28c GIT binary patch literal 17824 zcmV(|K+(TGZYzoV0yihRy3;{L*Bm;yv3xXa1 z1Rw>42nQe=C3zL>7I?PUshK)MG!ta^L3b^d$O{#w!;WOi#caU z9epdi^~z}FXC1zMc;nw||B-~iJKZ7-`H(Kn3lKjZ5N5RqaHof~Lr#JsXW1jml58&> zQGi~|0cnL4zB|P8}0t5&U@c|JdMvNGlmzMw!d_sgsBSwh~ z<3uKERMdzOA;C{wc9u@*KWk~1ZrQFoOIvrA?XoRxnU;2`Lr2EaDbuDiOouv|*;F%- z#gKPJ>8fl=HUf*mFq&P*op#SRB5uMwrI5O=D|BV|t7*jYszMn6_y=vT5wbG)8zDBN(kmfH1b)al)=7_XtiK52#|ESncdAW0QK2HvRY`_;WiO>pz_-Xk zH!T)&YR`MAJa7J@pNA;Ve=XlUuY2Z4Y1bh`Bcza^p&9I}QLUiMj74g|4NyqjXq$hi zG1}j&v`P|}Bqr@5l@eV;qy>fq`v}SgHrfA#@*v!mV~$a+B6D&Jh-sRueXL+`%jr?vt30*Vq&Bs(79VL�!Z1%E;0yxE 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 literal 0 HcmV?d00001 diff --git a/assets/inter-italic-latin-ext.RnFly65-.woff2 b/assets/inter-italic-latin-ext.RnFly65-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9c1b9440ed419d4a71ba46b0db3951164f9e10df GIT binary patch literal 63552 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 literal 0 HcmV?d00001 diff --git a/assets/inter-italic-latin.27E69YJn.woff2 b/assets/inter-italic-latin.27E69YJn.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..01fcf20724f915f68a974ef2fb85f86f3039b1d8 GIT binary patch literal 46048 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 literal 0 HcmV?d00001 diff --git a/assets/inter-italic-vietnamese.xzQHe1q1.woff2 b/assets/inter-italic-vietnamese.xzQHe1q1.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e4f788ee02bb687bc1d5045483ff0d381e7654e0 GIT binary patch literal 8784 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 G0002QVTgqQ literal 0 HcmV?d00001 diff --git a/assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2 b/assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..28593ccb8a4d849a746f2b970678fe426cb136e8 GIT binary patch literal 26600 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 literal 0 HcmV?d00001 diff --git a/assets/inter-roman-cyrillic.jIZ9REo5.woff2 b/assets/inter-roman-cyrillic.jIZ9REo5.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a20adc161f433a7c4e3d92306301b9228bcf9fb4 GIT binary patch literal 16780 zcmV(?K-a%_Pew8T0RR9106~lZ5dZ)H0DY_g06`%D0|eaw00000000000000000000 z0000Qf;JnTejI@~KS)+VQiTZyU_Vn-K~#Yn0D>GZYzoFWxhOFCMgcYgBm;yv3xXa1 z1Rw>38V4X7&~ydchCS#Gz^U?2)GLZ$;~)fx9VPq!mcYpnq1!@L^>;{*F0jecR$FUZ z6iO)D+m7xk=GG~2u%_f@f_0A}M3f5QA!I8ybSlL6sOEWg@rZ{%r-XO@6}qY6-9rwk z7S=XGl3Aagf2VfteNWPp^bim65V8@r49{4$60G9{g+&}2us@F-2(Lo2<%nmyfcXPAsEmOx;aaT-TYLA-g zgvewpb}BVR-ML%T9e1_+XSTRIu8ysxt~wvE#THu(7?>6s%t#g^w%AI*C@r+u&NSFS z!?YO379&Qd#efkr8h}DK?^}Y96T(bDG`ag0NywoDEJ20KvU^4sLVzaVq0LwZTv|C` z14y1JvebUtkK*Sjex9GxKPxfB0|W^&XiG7#GZLgqMUf&w#9A^4 zW+iy=)FGciT7s+#QV7M`LjC>~tH06w!e2Ax?^P|^{|Jdg?L}zEBROmDjx(eq_hRc1 zV(lsh-~$j6AyVM#mLRo3yaZC>4oHYziCX!nWJ|kyDQ1We#|#&!v`Om_QWZjOQ|_<7 zqO^Ag z|LxCM>gQohx?AS&cd2u!HPjGABuD`9BFByk0|5i0D0M-?X4I1etS^BES`g^zkt~9N z6bNJ~lV}D>P(cz{NrEb0f~~eA*hz!DjYD*TB-l$5xJZI}3Z&b9(r1+npvb#yl83Nl z2RnI^NS>jR=NyU`K_+AH?@ubOxrE?5zK?(a5HSEGfL9XQB!kX)2>@jCl1u;sGFnn> zj2C28OX#Vbi5JWktIZxrhYIpYTimo&U!G5i)?Q&yyoK6r2DWv;-31u6PL4a9i$7$)2F)vjovc;xwPK zkBm6fN#La>Q69B!-2$zOXy>J5lik8e zjvr!tgI)_mcek^UQnXpzqIehz`x2z^vtH%)_`!k3m2{<9hw^N84vueaRwueKS$3HK zVb)5CK*`%upy*Rb{-fw<4R%DoIZ>ilo*ZRa)D#}Tx)+(E&Z1l5xQ48UMoE>6C}TlH zzi*VptQV1_u#IZ4I$*gm@*C|gTAPwGntNMse;D@@02GLZEstc;mQ#|djM-gg+ZvER zs*0x>FbwEhF5>l%PyLvBaHKdMIm=jls)CofEk*ltCopWRZAp=ynu*F6+rJToloGhD zK$~G>vL-8w2Vjjj4qt;E)-no*zrxzjk;7tzvejc<`$O~munh-(`?5rjPvLp#Gx!03 zQlpT<(il36?a(U*@j5wBtwtSH=jYIE2f)zvu-AX$UG+dD!}anu^fqT3G1QWWK`>AT z`){B4jRWge!1`BdxMP#wk)vBR%!sa>ViO7q%y$S%s0cN|5n7^%Fc8IrK$H+Btz2Cs zD>zAuy<{a9xk14Gs1mf>8v&(?o;nb& z1P*8i74t2qRtys`mCQ;6We6lqC^V_2!A8isXLc@nFa|`jzFM)INiB@Dl`AG{3NIK? z5rn0wAPyMV4Uk-g<)=CFtJ&wbEPa48K2Y@a&VyXcm6N)nbSph9zY&D=zMFA)~&X^R$umKua zfIz9Wq(Y-07+_SAB+mqiCZPc*V^Z4i=ulZ5&?r!ZK(A1$vKm2g^UV7Jb~Zlndl9dG z{TXm*1!agOP7zcBSrT2not*}`8#^CBU{HJtb~S_-uBKN0VP%Tl>aaPAF-fwx4W+PT zC!&!JAZLJ(R%+2eCCg{s%XQqbgms+dUoGJ$TrEICQxG zMBnMk)3xV|Uaz`Pf60B_b<26H@|OEn%^mDc^*!5C*|O`A`&r3~`<3%u;cC&U>yzu7 zC1=eQ=W4&z|FGp<#frrx+Y}HGPyj^Xzv5jWpdbL|PebG^h-Z;G5}2DHbrY03fV~fd z`+#@|=!YQm5HOE{{y0RR0P;y7o(Abz2)+RLOF+K_p_d@^Ap}1I`70oPGKd}80|O`k zvX0Z}<`X2jxsD7fgkn)4F zs=LU?d=aObus|! z(Eb_0&jmb3w+NBZq5y*2@ssYZDSt(HCWd%C$xKd(XvIX0k&ID1=KIDy>8TE-BIPD( z_CQR^vqsx!#*H42Bi?w@T4REL_hSh^%I6vYB$N)oSV4~h;-2P&&Snj{J3XGHHnY1P z!)kVwqyjWG_X)t8NfYy)mlj(EU`PsfjNF5CwC&d3@(kPZEmIF9=~9&f@-qO`9~7&h zQMhF|zt-e8ee+2;*$yz;WQV=H%U4l>Mv@64=$4c=l$dKUW^X7h*&vo{D4X^M)4bA9 zzE;w_!@QYhj3&#RnI#+m-XN4>8N!}CKkQ%50E+FvCVM*iB5M2a8J`c%Iqv`f2QAuN zaIacLFhI~|&!&sYT-PiGvNU|lqD=TKD`V1VRVh8pqGIBP1e|c*!9E|h-#N5hj8j-m z?qg-+(C#FT%T-<6Al|6c##QM->NUMQy0C|rAL4sQVgVht+3q_oo3xulo%1wZz9(V7 zhb*u&+&};bCAPD}_K=6e&Cg$;KP{BC?g{T3ufjydYcL~iWrL=ww z?w*g2hcr<_9i%De_J+;$Qfr3MF%jYK3z18KVF%zLBg{$d5E$Z@g)0sk?J;F*&2o0$ z$J_b3BhpFugAWQxEPI50kn-`|*{|(zO2er~RJh3zmng58d0L6Cm7%JHf+g*001fN{ z3-$~`D@8K>bN>eLXqS%<0OV#-dhVPU)emx68yL4kx- zrDm#&DkbKFp$aIx?5tL?<(;+&Vte$~g{7==_hVK-NZ(+WjvK}=P-xy(y-(e#DSesh zgvL@m zlnl*)X!#s|9R64angj7!89*OraXhRl@tMbTw`)|l5AjPbA>Tkwp2E_AW`QZLv`t~) zuPkx$rjB(DUr=D$l0PgY3+>Vh&A%OQ90)BfZ-UqktPE)smD6*5a;nZw)cM(I$LHp| zVzj($J_}Yu?nec(4ni3eY^UedZ_!n{wx)z7ciGFXU-h{P&eqqItJx#hINP}-8R3?( z$L|Ii9_T@*;=(=cf*L7i*nyWG^DW4rC?m5sr;v2sL|W-eb>(&!UxjUp%7!YS`4sH5 z9se-U;oLr6;DZ^4KbhWh@y*{K*{D(!+J|1I zVZ?|v?oP|B*)?bG_VCDG-NjaY{w~+hcCM@GNqSVNqW@|T}FJT~!ZaixUWxJb{(L1$d2CAM7~mhwnq6&ZE}VtvAALfp={(9fMa zqZTYtpJQtsAGUgUG~$n?OB@@E_FWQVxlcoDElE2?!Wq-~#Oq(GWIy5dmNr!y3$)#3 z$E=P-aih9_1uG^+j!2JD;p3}A6XN&n z*!vI?6y%6ZtyunF<8_!dOq{{g(z@s+p)gcWHkx`mT*0*`>-s>B^s4j?Vsm2ZM*|qg zcm$9T%sa~vazY$p`60k-&gn9J9xhHfinHVZ?0pCK_46HUVN*+_9 z77^9n7&GJ;GH5o`6D=dt6P-3>Fl5NFF(#@*EnK3_ss8plqI9u|P`CB*Ih_s)K|)hW z)uHO&tF>7~h|fVB0fv6wLz1LdCQV~>Ht0ow1kk{_5S!z_FkYdIFYCRD&!|~#-aLPf zS?3-QS#$9?FZ-Pvm8a~^mC)_SIQHW~W@fp9ExmeB90g<3d@jW-jDds?KoCXa4whXa zNSQYcn+SqrH;7^&$piti>x73GgaxcNv(2ZAzR-AV=9foI9sV@%|7X)xz5VXpt2?cE zU&JVRZ8F|#G&9p{WGdzcABYmp=7VzG){Vi!hv(xO0%P*?1&5EQ&O3UN#}DzZBtNLU z-X(ju8AHxx_x_Q+0n!%>YoB;zlrQ__UXKfj&mQoMr2f_Xg|4wR-!%yP%Eu>cOZgkP zMj%}`LjC}V1w<)t3qgYf22y8~I*g3z&hl=lsu_rg>t)npIAi5mnid8PMGf|vD-R3Z~aoef`hldw!teQ! zsW1CCF;dGwTq6RdafQcOuWVW!@s13 zE>ZtZfB%E7{$9LzUS6&Tz5M^m-Wm=%G!6#?5->5@KIKK}-R93(IWX}E6ZQ{_ZY13c z2pcl}Q4lA9VT{YzS05c-X@ADZW7|#9N|Ks?_W3kRmh*e#FMt4yKE!5l4fJ(!QCt)L zb^g7*~>CJvyR$T$T7t_I%{@fX7%D^MaG~ zC=CaT*GmdT<`-I~+XIM=jRDfroh_Zv>1YVV`i})XKL{jwZBwVtCyN(YJGyh^8sqEc zwV>^zLiSIAepedEX5i|~3nq=R%h?m0AQ^5)Aa0_*wsNeJu?fkVORt-`mSkw0Im5pOZ>Q6pLJ=UEkDn3pq%U!As8g*NqaW#8&wy7?Q8 z7D^*}FG*uJ_$0^2z)J{bQeA&{nc-KbKgyPtW^6mgvS($1$J#z-S?7Uh8FNZQOTw7A zK&7noKlqM){%r*$`>htva9Vx#q(CA7hV}<$Y-*PNVZ9?}Zu)YDeu@4?AYHz7{9S$# zo%a|V*jpe+UkjL?iWG~dJ`0##+gh!@=B-y{Nb`F$i0L3aI;0qGAnKQxEo3=k+Vikh ziJgMWumgw|D{%Uz0VNSgrq({*m^j@e$JQt}pp%ze$Teo0&tl~`*-!AH_}$3p*6I*jbGEg1k zS?%Gy`!n*x1FjaPHP#XEZhh0Ghi3sH%+B`z1nKKjLEinDnO;32Kd$kT)w*>{wZ`4M z)!MclV*WmQ7)4L2ULW=fb>1`9MV-n*y+;GFe}0i^9YPD4$2jStf{8~F>DS?Y<;mB= zxuX3WziMHk@QMdA1vuF`k*Q~!bsuN#%o^;LDn%I0Gjkl%6KIhZ>$iU| zTZV7NKdy*ZRD3`_R-t;r>p$gw^z5@Ae_0(k-u#u+4QP)kXM@KCAQ9lDRUiNk5wk8}7v5*?m9_0>GnZ)b zHXOqh`8Hd>M|pon*q9(r&|1CbLE1S)5x0aw+D<9C&<)B~1+x;X%-X7;FgA9K$?0gS z)7Th0O|}|R3;rgCc14zyPbK9ZJCaaz@Dgc}RF z06O}VB*4oJcKzYlSQI*e9ILZq1U<1LIG(s{E|6kNOGwf#G!}wgjvUDFSh3HaIa_i4 zj~Ir%e1=i~VAUN9~-?l;whI>`rG3>&8GQ|<0?=~< z)P+(_zl`h{OONG9#6FsNPQRAO$V%H#de}xcc;sdP^Eew!7wL880=n>M&sf*G`}sGY zvfiu7nZ0pkA1>yuPM*-_8Ig11Lmu}dsj~Ko(L%lVjMH?zkI}-Dn|OB39}OSQ2iCUu zT!cIrx)$(9wo{J3WUw=H6tyAPo9mCv&}3_k59d?)BdOO*65ws)#m(7qG3A#pi&2WR z9GyN>R-Qe*9(^qh2w3X-3x2MP`P?&T6MZ6F8e~s+`iL92g?aLqK(7$J#lzBEn5+wjyJQypMRb0K*!G|hlhJ58~eWEefdUYAV|5i z&W*AO=3_2VGhs7*ne1oDNektL<%tVVldrNDlM_Ni{K7(V)g;o{nT2VI)oF27VP+Cr zRLEt9hsEt_P=nwLjMS?605o`%T$GBm_>Rh<(02}SCmT@N5>Oc*mOT(t?8#K2xY`v`svc_epS#Kb$SpGKe{!-zdGxpV z1tZ?cn}~-08tT2%LG^F@MF@Ze0KGCOKmgF#I3N$GN0Y5pOIz)n1ew}WV|S5kioyYm zv$aEg{3r-<3&;(ckd7$@NJXN1!DImw@wU4|)a^@$+I%~$Jmp;6$~2iOLj~w+*%Ssy zK1I0=FanxB{6B-_FiB$zwMelwN1_lwU2*no095^IK&Ml;&9G7-5<@>{S{B8t-J{f`tf$OU{=+D*a!LiM{-7GH`nMQBP9|58e^c9|HmbI&uA+WS zJw?4z{f7FeMzBVy#vP3h6dB5X%4N!ernY90<{PauS`W2Vw5zl`wfnWFb#!%3>iFus z)%m@08`VJFNZmoTp&q0jr}|Q(sZ44)l|${K4pK$FB4Fad6L{Ew;5Go{U~Gmx0LzJ{ z*ti`X-EqJIv=O_~r1M)!-N+%?DoG~NY$2o_C{l!JL_*RaFu7wRc8Vx6$9a@xmV49y z9%>M%0mSBjHtabhGz__LKU_0z55yN{&qtKPf5r1N*C*qJ<)Wm`)Q(=>ZI)!x)wk!q z2||HF!oFQ5$te&wU>bf9l3c{M6qy5Jeq#ZMS_4gM7gdtDHm_Rpfbh>- zhUIy5w*$OAhDGUt7rk+VVU9bu$Pls=cd9-RSDO2J=w#EiJuVI)EB7Y~mR0aQgH8I5Y#>!_I6m92^m{UA4HhaxN<*adsD5tu6= z5=u?O%c5n0SxVT)CK;Ea_SjX@-0fCKq}cORM?lW4fVkaWIO*t3nv2$zahx^UH``Ib$S&$Z3QBb*!#Qk?S3>H7r4d&#wvI$9LffbgyDcr^O}xMX{AA zuq1N7>U*eS^=gYXscv@gvi@$UA5`OrUK>YsJZ}E+O5S<_ma}H0d-L!nEZ^x^r@KAj zvx_uoy6o8WPeobJH#y{?UXZp>PYOypU9FrV=S~NxmR&`SqsZs0arU1Epr5hWh`}`` zi?NIS@jQIG#>6R3@abMJoHei??zUh8fz^JDc;K?c(DzSg7$)^_hqEiH{Un`C0&Cyy z(w&Yw+6D^EcVBwb(H6pM`{6jPvP)M065F>OyPcvqf5^!uYidQUh$I3TKO_*Z|V({}+&T+f2B%VBtXNSeU4aHVhqD9uBLG`<;y)Mt? zYCOlDQ(tXyDDG{XGilOvO8=%@4Pe9qhp2J*nNJKZj$hnTa|i!to~3d8OnfQLGUH!M zvdkap+l+_!uT^dP9X@{KZbyZ7;R9U73}fioj5trHLJ%RqIxPPKK@FokLZSzT9{i=l zU-pMDSciBn)0~5D%}*Tc1K3}+j>mNAOytbOhW$i<03nzPZUYyNT!xD;9Uq(D(R{q4 z@6?{MG6xS{QACv7Q_|==eWHEHelzwoF7LI;1a=ki+|;XXOFlCRi!%2|5%b2jP2CTd+zBfzwT*FdkA>H$+BOs>6f}9Q_A$6 zrzw9g9|G9eIYgY?EmU?N&28_9vAw-@TGmV!-Sq72zI6WFLp|N?JCS)Es|;N?@p+hI zqOX+*9C8(Y51w(H&pqwI1e#{sFr+wR`DTO|W9A{4lF}VS5zQRMA08|(U0t1dNv(m^!IQ>qz9KDfw*W`G5 z>!IB6Q_qMi;dXn9jNE#GkG^_R97>-RUUxJ#v-A+Ibi<3Gaq{^P6Cqw_%-Wa^Z@!E^iX^E|d!P4XU1A0G{G&q;fK?8VVM zGUh~P6d!JK6+_J`17`DIqDT6{v&@e~?-u;x$OCYwt@I09O5A1Dco(e-H&)42R=a*6 zclTmOvcI1YBV2Asb9b`kex9VfaED6=b+L}r8eF63dJb7qf@}EXa3>toEs2E9WkwwD zCYqWEq0-mrh7_eqi{+`OfH&0cX(7AerMGfjF%md#rmXNL(!Q)6nB!3@dMVBAS3JMU z0?$bBglDYgqEi0iR@pBfW2|afvnxcXUqHUeyb?8zPB|Ych*JDgQ6i0>}dwr1$)9qd99{?{F1&_$fE1(sddbQ zVviv?l<*>ioj5n+ohC%>fmDlv4l8VJ~a zLV?h*^T2uK;VWP+C4`cQIm4?ft?xA`51;WXIFbx^52_1{2Db0({0XY+t?K&w;Rtwe ztiUTLXf#YtE@Z3PbsDM)3k+9q5A^68Ge(O94-1o-x)AZ;rjkz!+mqFwB@<`ecae-d z0NI{hdV#(59g6h)Ix6VlvDPnBTBgzZD=ysQN* zZw*l&%ecSKN^z5LmK=H7N8lCQCRb3|Ordy-0#>bJy$})c=N;T9EspnnnzQARX@^IC z#F2?ZcDkVphOBKa*Vq_N-FzhRy`+pxOkA35#it$=bw)|9TU;xCiz>lnOnf+Sl|KxL55S%rNs95NXZ zd`jZ%ipjXsEBUmvgqOo4j94t}H9T`qR;YE{m`Uyy<9e%&{rm;b^I1Jlh~Y!OLTHfa zN_CLMC=+nBf+n4dgLT$I7sPt(NJ`@S>RG>YqIT6n(UHCbLWLtF0qsxR$Oh6kJ(`!~Njb0wXS`osNWTedIiRb^CG z)ELmr2?w^odi&RS{((^Xy~je1VwRchGH?a1*tIX?i zW>^<#`ARaaJ(%JGET&YFxA4nCWZ3w^zZC1uW{Jca_uBxkXg;(|l-fdk6hk3!~c%j1V^U`VPZd83cN93

KZ;k8ywA} z5k-SpDU(i8*gg^cv8>58r3@ub4OcK9&& znNhG_@GxqjVK3B&J%{D^HbH;deaX7Mp9Z32&^3D3f90mP=tF!fe9&>s;W0m~7?~A3 zux4`Z+_2B&&IRlyCT>ODZ`DXBg;?l>VcO7-v}Qn30>_G#L1tGZ60ycSW|dPuxCY~C z?DBUN4%cm!9{5w@zZ1rtvV6t&#meNl)pp}^FESGHmRz)CQKWID{e* zKl&Jl=Nczd7`2WWH@A)KYebMQNnqpHcr{eH5E61_)_fc#_p$9HX1N4TnjTJg-%wWH zoq3G1+6~rHwRoT!c1E-&qYs_3xi#$fI(6%GlvNp~MUmFlAu`Q+Aa;zrmahphCCG}z z0y;PaNCP>ruFkBkB;~qvNr}(}C+wTEUKCkk+*V_on5fG3DN%xiKzSk#3FGD1ut~Lt z^w~RQ$7Jwk)6g@$ICnR$+9l9SPld{*PkotiKI(+q(R~t;(U^h;-`ly|GZwjNukIR3 zZZy16I<`IW={p?5Hpoa7@rR}ZL~6p8EN_CWl6QP)wre$ha9MQ@W$csCm3+r!rzVG zx!T-w3Y0SrGE^(c^j=TXYZ)WoQ$z68k4d}y*m)BwN`KQ+4lR)8mFnO_%}^BGtC#DqKj zsiy#o)h5GqQwNXI^!m$bKqyP4dq^G;Stj9AG=8NZ;#|?4Tyy-|5bOl!Q)paeVE>yJ zuixF^`PGr0)8kVsCQkBj&{;$w2JFcfKBqLLz{vs59pkEXIBMN>!gZuKW`^>ZM5d!Z zdtW`z?~$Vc&(G7&wYjulSCXV=0YkS3u?AB8{)D=lld)i{-6PoSA09a9! zBKcMT7hg+|U}vzwa3?iA9NwU8YOxVlCk_EUe9%nIY1jhY6h-u&sQ zo~O3G8DUww5+pR$DZi4{K;GtL2NFf*uT7L}E3w=)T^1||9ej$q)%lDowBv7+?!~e_6 zcszLNdUHpKLJ3`bQG#^v^-~e2b!6fIi88l~FM9Lm6MHiTpLhCg92#G4-riia;MU$E zJu;x$YiIqmr)3SK38&$5IvWV2QiYy+r>tk?4QH!#k0}%H{}!~+`zY4HQ^z+>pj}d`krItpcjKIlWE>kp1b;D;pG(3ut>NJ1P>G>z#yH|x3;marSq~R zL;vRLF6aEH6Yn@{7TcvY7MpzJ-Io7Gux(NgfmvRle{GAcfM{0#20Dza>wY68gnB_y zkAgJ@M*v4GqN>XI4X)`m2=nD26)6BZiV(G@Ty$u}XRUVqTO3f; zl$&n1Z!3uto*%&!O~d~BSd8#e99SaHL-anSvoo>S@%fTGiR>b&6=bY_H6g4D_D(vTPN@jVlle&rLPv#80IFF* z6(&zPi4Ef`is03;Yl)>-TdbQu6{fX&xTKk{8((IxfidA)eHGUfHqattu}56Nj_t6&cOl)314;z(c99T~X^aD*%S* zT}i8&MW3qMgsm3k?@ylWz0=(o(r$nJHfzmqsBl=3E5FC z4}slCp-}ONBuqFbDJWZViA5Txy)XdJRI&3dZ^zI>%gR7!H{Ch#B|kKv1tW9IuOwfs za6?s=(L0Xzb!rQD!p#nX%lhLF!L)JY#CacD>5el$(S+Xh`_FjM8;{o%bTGXUAm?5J zp=8Oi>8P}3JtGAmtvOl#z7l{p#t{Vx!xCo=l~F=4&;)3r8iG@tBMd3+UAJpZQu%)g zArhsZ?&Q7|@WO#@wtt6>Y($LbGLGyvsHZ}`p>N4UqMH`F=tsCcmF5N|dR?DOePv{0 z`KYo(KCHjecqmmacJ0HU#`YWH{!v#xm%m* zFprO$_g|ZOr9KygX5Y?g$38Rr<;qK5O=6C-sIRVM-)RGSZONPRxml-iza!0QdpnTT zfM2X|3^FW`B2osEqRjcbQQCbzsWgdfpBD;g?$j1%Qo-e+orc`*Tj|W>Z*$k4d%T8Q zANqsEqL7)n4akzOv3qZ}ByFgsF|M@rKIf6Rg<2J(s)a@}+)k~ z+GLuI@rxP^LZx9umelc-Y?2q%{VJKCjkJP9M*PYb*gb(ZE0)QY7nPNA6s$4Q(GlPm zb%F-gFA3j(?}y-6HqwtT=0EIJ`2P0ZZLOW*cf^z#wpkY8hof$rK6igIs<<>eJ28?9 z-qO?9TZ@D}ATEX9#CmGYa7QRRJj1KW+!n9e8x_oiVdA+A%NDU}PPz5l+NLp%C`w0O zDvko#g-WKTBGbFwlg;I=drj1A41O;T@_=MnRML{GJHkn)Yr~}8-b;RT!(;QQ@QYkje2^bGk(Z{@u;X*SZSw6el@?CiO*z^T?N$*%{NIT z;UEinEsSGJOHMS9!>o^q%zL;qN@UB>YDmoQc*S8YQa zH`RVqR?x;E{-aRFmT2FiD?l0Wa>Des;w^AS)B;vBne6ug3N(qCu@!P2Xx|<2{ zUM#$xs*~qq7D3YW984#)(xQsV-wz&dkfb#npZXC|F!(&LySwe!``5&*_V54lR-Uk^ zZT-!MY_=$0J~jH`ArVf=TbRX69;!W(qZ5m95OYM#r)1uQ$9v8>eHk4No~1i|B5T4kL+W zv13|^R1ldoZGyFDfEvmz;Lh67dh zv-2Q;pa~9>tmyBok@aBWN4~2w`s~JM#;~;(8D#8j5PceKenmq>5?AsmT~^$Kv!5{36@B5>{_4lhVOmfC!f0 zHj*Pw29#JKbWF?v)I7{>xR902Ec%Latk!WInzIminxD);6Ob8@$OcDSC4;R(8-EIB z4RuI1z?7UKaYg+d5yKT+Er!pHND@NMNv=?YOAG!n`K@mg%XTn&`WixU#GqEKNlqPVPm1mtwo+zK@V zl)!WOhtx8RU-u&a!<`ad>{`3Z)*CivaJhQpKro@r#7Z_J%{d4=%t9<6n#1~B{b3n| zdV!&TI&CCmWfK~pSvQTR1B4=EH+OeMnES32!GCeJ%Gs~~oVtoZwb%o4-8sPv1QK}z z{AY^xOoE;BbHi8NjArzmxc{?dPcH(Piz#ARY;qViqR#Khd=Q}3nE`osNC3t7kz zj^#df!|oK!8e}*jZR(1_-3D7exio%B7NgSApN9W-eCcnyRHWvkNm#V^jTfR-*@$W& z+ei<-6Gqz*5w4&mCaIJbGq-zn6pEv%dvo67jcbvnJntZOkC9#BGmB8|IAXI6E|q$3 z+rWA*zZMX3;#308!i7C(_IleiulGTc%GOg;!%^xNze*KVl}ujh{_)pS#MR9zU9ei` zM2Oq2Af2;;7KdZIP>^cm?l&vpWxt3^(m5vy+(0vg^D4?VZ9~mAdCC<(HDoYLmzQLE zpEoOrPYT@KW2K)yVE%HxWb#&RuI)0f_xS+0>RETjKV01vwwMsB{ z&iv&IFI)Igd;Uc~29O~wn0;byhT(3e6qe$75`i;tS@O_}I!`d;!aFU0?}fo655vvH zu`jwkPLD0#`~JbKvJV#*dK@UBDZA%k+BM(5MjjvOWcvDo!9OD~>NCme_7$S~R@8S) z_k$)B8tKWkj*TykBG2eM9kJ-Ry{u+EZ8w*uHv9VHSSOs zK~9X{a{WUAsw;VKgKN*m?=cCoYP=6aa8}{)bWjur+x+Q7@WiAg>|XL|NwP~st>E@R z$|TlpYx?V~5cw+Tv+UJ`A91^fy(@4{_Ds?$XEGRcW;16-D>%Xe9SGKJN@8>~TfXhV z;+qp^wX7oXzqULse6t*Ml_8pXrn>7)GWoNs-^nx8x#_k$IgE$jr?M{rl}90+e!Y>6 zrj~tID_WI_6(nle5QztkplzgYRsH*zgihBs2#sbTYP>}l8gJ7TrgY+NCGQa9tjJh6 zX4K8|?%91X*ahz6jH}?f5PC* z70GZe#Jm#m#emauwCJ@3pHaxB^2Wxum|u-NYgW@zLnON*bzV;~)b~_V(Z+aag@egv zcpmN2_)zI|3Z1HS z7c(%Ww&mxHie+d{D-v1iQKHPsiTt&S0LP5?>nS&{<woNkCT~l)8Zv+lb zfB*#kGH^)+uN*`(ByF4|gv9QmgDBl$_UmZ^$q*v)9jbsiZnr#n=uf7K;nhnfZYh(` zwOSXZA7p6pU|P0T73E#=wO_%BFocO)TWvr@z#(lKC4?d~O8ukO38cx|aL+ z5YY_MP>*s!*^o4#en?VhW9}b+65N=o+z@AFH-)UENjn~AmjO#`=K1tMsvU#Omc6uf%G}Ks zSMpGQ4_z@blevfN1NEH<@1!k2reiTl3Lth`*}36rOF`92_pi4;x)r>Ant(7;+qS3# z;t-ao6r($~NucV}px&{}K%hPg4R>v=sL5A_OqYdhCnEzTdOuu49V$D(LT70&SOiy> zG%kUw=ODa9*NsaEuT3L{eq;tdo3cPm+FhL^WtssSAIY7a2v4nv7U@DqdanRcmZ7Er zWC5H0ZFF%v)WRDQO0-K*sx_mb)S;oJYRJR~;qI~I??v>Hd3dK30u&PaTsIj-=2+*1 zi_~kd0iUc?n**xP!tdH*)Rz<#s|1LppO)A(NHiykMA0n7f%S9sdB}*K<9|_Gkax3O zm^{CoZ+g45?L502drX3P@s$kV2Yy8EQ|1AYtjgY0i8o{rRtq33DRmR*5Oz}-aKg=C zm&jRVfi*tBInDl`i|gOt1}@+Eczrh=7(mTOD_53k@vWVy%7E z7M$Jj5)lC-AtH=nibx0}AOuFhNHA*Ry?^}3y@pc>JU>E`S@`eEeb$W#DWxwH;I6x8 zRAhSy&K>}lnf}$l14LB$4v4wkvxhyvws*sc6DKK6OlFj*Q&AcF85$ZYD%w(1R8&-) zm`h0+%()gBPRgZZOV`{Cm2xR56&WfmGFodbqog^N3Jnz%H{^+McfTZ{G|o#R5?|xi`GS-yUNeCYZql_zi;k+yUEO!rscdM#n{GH zMONwCymLS7e!{}>HEKQ(JM&e{nI)G%8FA|2>;C8e%bd>*A|2xRV^f>|ifN3uA!5v- zl#cz4Ffz!s%w2~<9{&C3L*N(z;Thv0Ody3IGYi7YUWPD-3c?~45SB4OsPqQPOpKF=PVxM=-@$r?2I2K_ECUChmCkZT708}K#zcor}O`hBR%i{4q#+%$yt-vbW!Km z`t^RpWzAJpNEuRxDmoS2CNaNFd|UBt&G#i?;>XgThK<<3jbwq#mKV{O4*T`o_%@z$R#mF||L#w?h=hxpT} zK0>@CgGMQ^No`6}OS`m&k~#y@KwJjnkVZqv?exh+n775jCJrb8r~t!185M&4IVfmc0iK zyj?#FXR=tnwsf6h-pcn%&pwh_s)e9)hOu=s4)oGyUK_@q*=k+m!Z{x%XGJX!8V+u< zy{oNVwZ`D6GuCK#*W@*;^_|TIgMOF29?))_*`Wg6!E^}VYsIGcF1|A7Py?W#qqzL7 zzx$lC0DK)r{NdG06%4QTR={2aKmr3`Hx>v87zn_6bb#$BPkf-xh~xmUR-xxiBs14i zYg9r2u+?b6-@Y{j`qrATZ=Kou)?1=)gRA>Cy0>pr@VuL&rWhO`sO${7-!{}y08ZjT z$==nCST$mU)YhA0u_a#hnm6rrT06gA{NaCzT~)#^BkG9NLK#O++4RO(&a95xS(kPD z)BRoll&-A*ox|S?{G@q3eTg1)AN=^Orw=TretelZo?^fMep~=#z~@CnL0ABG5@3&! zM&Wx_k{{@r<~^YnF%JEq{L)XOeLZ8gP^^=gFby`kig_Ty(T5XLT`s{bp zVYhtlwhB>x|MtY+*ipxfB~)yj=ZU=FMO}W??KeGscg-Jk z)>&@@y^S{6tj=2)Fkz8JzW>DBao7KveWJy2tqP4W#&gDtyD#C4c3*hptaGNBZU(8x zo)~b+Wmi1)rSk&5H_vzc4=bbwN^4Qw`P8~5;jv`LNKW1H;+!O|thmjiHT&>RQS3xE}m z0Mgf4cDtrDrw54lj;&R0BxZ@rNm(KH+X4%4VxMj7vUd3=Q_%3x?nV?$82s0x(;)TTZ(KfE_K^Ka&kf z&5B2W$fPXPLbJ3udqgc>**q@BNj$tAt-c*iPN=hsQ73Tl&b@LM_g)*qs~B}@md(HF z=UP}SI}|7vNypzR)zF^n;XOi}pUwE{HI6rR&$bHv#rJf-+bjq=2N%WW1Rs5Gnukc(BvbI?gQTaf?ZRm0irtPNOd0f_O5%w9A6u<{@rf zz&1f&&7EU{YZzl ztR?W>U`l{3w){G6*ZH3U1^PS&u)a^xqM2TtSLWn|IdIAEfA)7V_TdXW?$k2}elk>9 zFKsW~uwdEb{i}2he;t@tVEevR)s8ij6vMBS4lgdAPK@6^V%3|@HP6o~EF1Gu;n-ps zVHIlTF8FN0)a_-B&u%N%LJ|zRz8`LPhMk^R_}^X0ClmIcp{ElL7_k*FKyBE$2*huG zJ4n*fK@!V}`TYOO819Y23+KkN(5*g~nO>pRK1_zt}z8nq+NQb@~(2 zb=g~=b2c?y*)wh2o*i3z<(3(t(>-OCdO`KHeFwhBHk>|9TX*DgZhexo_QLMNN4~1r zplRNE+ymS)r!xjL==(E!g7J@ir=0)nss=waJO(sqfA0^U7~Ct?T!1VZ#1{32sWS>^ zX5EbRtjLwWbN;ix;K~(1RZ@uo2G&3yvZ?71go)k5se@2lPW6iT!I!%fT=R?&vpS>KgWllpmBoKLKRTKC zrdmga)@@&GcCj{mx^8=jtbWja;mMEwbXFGsKHhcLKa5(m`}QcFw(lHuQ;PucX$ZVJ z0OJD?e(CieeP8|c7+>h=TF2=c6t*NfsD+&oE z%L{YH(``40%CD=O{LbcW^Tw8U5c?&~xy%nvU96tGxagG^R7Ddf&sEPjljA&fuDX0l zQTYpViY8BhWB$Ub=x9+>Wfo~;%2EtOXvV-cO*!z}&=Gtxv5*Whp8Y)I9o8TQK#N&z5H~F2M#5b5v&C zz@*gaNyl%@o4Z)Ducszt>|>6K4~5#yeV$rT|86Vp%eiEK!O{`lYb9Gs8aX_9o(w`<+CTN^x6BXd?2L? zL<7AhrGWPDPe=&TgPsh*7at<#W{zgAlZPOeuRNd7055y$SH(bI2na_*Ov`uu#mQQ! zTtui%FcP*3?ma*8S&n2R7ku==br+?|`ky^wkqSWqVwa2~o_U;w21v~)(TW$51f*&- z`EAjTKKQ*jtpES!{+Wk&JT0M^D#eQkA_TL(n2}WBxzPxD;*0y57n-<$4<`>F@M0w= z@L~xs@IpN|@Zr|U59C%q&~1??J(bw%LWA0~M$#j3xK%=BIa!A+ChG94mgH3I4g#oW zn;a)`5?D>C80xUmvuJ?ZVr#!&N@I0)Lqa9%&n6>ms?>d`Y!@V1vnVZYdD+*Vc^DV z4+?dGLXf~Dm8?SjmJ5R0M`Gh8~t zHuiP#AAc_VuSc%gV?meOb{D# zOm*Q5YT{_X#ChNGpyHo{#5TKk>!cva;z1&UTppw&$ml>)56@dBFQH4t7aIznuehGt z!fi@vn~_0nvl`SktBu-b5^I~)q_&x~+Gdh!o000=Ho%PpiEXY{r)!AT=kMy{|Id43 zrs>HSAi;QHud@}$xdxBXq00hFw4V^TkmwTP+X2I^*MJDXQS=VN^MBXsG)=TVe^~N3UK9EfR zJ|fy6!At8^yVK-uJ=Qnh8W{Lyn-h8cM`WpP)&;%$V+slYTmm`)R&=I6?Z-&bMj+Wz z&lH_#@-7$v8AA?rNiBn#{Lr4wWiH#P4^TdIigkcke%Qc$1nV>+AL z1ia?oJ*USU5Qw0UfrJiT#=@{ehGq<(dr2>(L=bb3t)V^)NP`+2&}|aZb)W=XH(VGwbZTD-PCuehpD%zk7y%l zFVYCwBH9|->$Do0gZ4=#BXelx=*$V3<(aBXZDwWW07l1#U`5z3ST7dGNcu|p2zoJH zLRZk2($~}9px4nG=_lyt7%wtP8Lu#2V{BxY7&gWsMl0hi<1*t{Mjzu5lg8vQM>8if z38sp(q?VVs>yO> zHD`IUzRwD0#j*ynv$Kb17iUYd71{4(f0%tT`>X6=b~yXL?13C+&aj-ZIg@i{8@Z42Sa}6`#d*{6lzG~`gLxP7zR&wD?^fO;HpHk3*&BG6X%_e*7x$-*F&x?DX&f<$z686IUFO@Sm`7p)ml z0}8FQVj@V;OdvI7_0==Ng&T&Il7xt9c3=S=5TFB)En#U}HsKY=kvbSWA}(|Up_G!Q z+5n*$nn_6ZyD?jIWB0rZ5oonAXH5$4_KOmQT`rD{l%#aU(5ldl__(E-g*RDR_qf7n z7?z7+gjkZ>g%uH48~h%vF@-`s(P)p$^=YfWJ#gCXZj%eN6mFrXAoBHIAP#0lYCPzs z0pO>Vk{a(pza~BX714jMJ5nqTha-`{ z{!6o18F8+CnVaD#&FX7D+?rueA14sHm%wqBC%1ri?~O?HoxhGEP_mw$NLh&ySrOUD zB{@u&mI0}g8%0xD_|}GEP{t$%!;JeA#qMje8={z81B?_)q~bJ&5zBK0EQ#?t_(zi2 z21LuF*927S=85bl25#O1EQE6stf{;b{oSB=n>8{(9^&lkXb5FFk0$p#`TbA+c+YT+ zahh8(lGXz9>q0-ZKN;YR;KNIAc9@cTzOnAS8;MdVg}mzV9Sk|%~#9* z6vJ?T`1(jBgR52L31s6+VxkYD6l%;vKY}CI)J^G*+Y@M1XW!$st{wwmN=)?Z32%-i zgU4l|PU3+kpEzngIv6b0J?K2=~} z-wk|lGZ+fC&`Ftra1=sc6jA|HOeIDjrX`XGeie2!KTi##!^`;6hl?3 zV$OnL6(J-+K-D%Tv}`;fKe);@VNz*9O5<^yN@6-Ow0-u}8b4LwYk&q=+FAT^$2CpN zUkYXt<|OfRJ#g^oxvNzt5INT|ttmN=gG)*%3jQgjAWRD(VNMjzch)unC`7l0p(IW> zDq%nkJdC02Y)JHH?*T5*FF%V1(Aw>nEk%G@`ip$ETM-w^&{$Zt<%ME_2 zrI{#Z;8rQ43P~tJNttq!HU8lhWzrL|h}y-9T#V3BIyw%ne}o-kn0#F5>AMDs5xhK) z1hTMu6epKF42GwmN<`)6g?&OeOHHrPca*lZb2C=c=*p<$>WE>eW(mtanfdEA>4YFOzOe*UZ1rTTmEvr zR8;t&%P-=CLXlK21Dm9hh8;xrA|PZu6hbI8BCzMKMn+Sz-MwdN9>gJcl_eu57f#J< znou;E=BHr(JbXtg)A#RU{xsmhSP-5Z!czlF&l3m7bvQ7n^B*9M62@%s)F;2ZDkbii*i7-r)=Cmu9$Bs+&rkl-q zlxg)R(Wa(9-<*iml72g3e=_beU70slG-M|-EI5k>i;c~8$J?%yfh}vE zDxMd!*}=C6DJ01TE9~u1DZVq#ASu>(^84H0nbX#NK9S_i4eM#&KlkD&FJE;rj(sIi z3r%tmo`s@PHjkvjeQy2%k*wfOXR~3*Dk&BURZB5fEvG~;SP9svQ^Z6FpM{h}0;I-y zK{1&el_;0dy~k0$Qe$3E`c@4Njwc+e&ypamoIF@kNUJ8tQ6k>^$P}0z{`%cPKRkR4#4G5L$6-*p``~=1P%ZUDY;)H*)KtrFnAaXOXWTV3VUQ?P#uAXc^)@3FmK-!EstS9$WIm z$8+%JJYo^?dP_+|O7{-0n*4?dq-*7{2M4@fBFJ%)z_7?$GE&hXYX24J2nZUQHHRyW zK`sYnF_%GKcCO#YMlnCjf@TgDh&PtO_m`b>ks%xeg)f{)c?ois0C}_An<8erFJUOc zsp;2(Y#u~EO(XzuTnt|WoWn?e&!%csyWtpBgT z*(3J4y1g=TVU4Hbth%~zIK`h-GI_+Ez)^zSq9symu{QX7?d_%HL{0SCmKJHcgW1y3 z^7mb#dfBpNaJKdHbIzk=l9E(wF<(gWC-cQgD>EK%ZVtq)8BI{P!w04QvRz6dZWA~xTp4kY{_aj_ZnV$h%(;#E8kNdQCJ*~2v^ zuHF|X!3ZDD9wPRENgVqIQ9oRLK2}PL3NuDShtclZ42`mIAD{XnaCQ~GRf*vQyV_z` zZH8K2xQ=`?=D_+G95iw6CJaF_oDX3q(U-e2Io?2}V~as^o&Yc)Ygs+ZVoyJzK ztbNdwvh-k@IP6q5GMgh9IfAE4TR4m}-Bf{NeoZOZFt-&Gxt!<`+3NlO9=^e`I(f562tVFbPU_n&7DeM} zzFZ0+LS8{ftog}DksvSTUw5M4{t?7Xy7oYz>z=S;S23|w)6R%+UTDKV!}gn})=@CntBn#wXJp9Oc7T64LcCfo@q zt2&F1@@YT}8R5yD;=?Eu#JvdT66dNDiuur6sv$8o9KmeCHc`lKaYhTGUZdRdMwF}R zggW@(4XBKkmdl=ZWC_=D7{iWVYqyq? zn^f66S9t&0DH*v#ReHT?yW9fZ1uH0+ZKoF_J;!CFu4vi*fTC0?#gaolj1CeC3UKyA zY5g=ln`%MngK%6c0|#c?<-)|*D6m4}B2N4QYB|gmek91%W~~tMI%Uwz=X^L+y{4V^ z@RI*hEH7UQ&LQy(@7}k*Z|_gnRm$KPK3t9S97#N>9InyBHBO?%nZZ;rp!U<>9wpu? zgC?|Y=O>f@{hP4lq@JQhq7fL5v!y;oa2&Is1NWlQFJ)u}W?M%ORf5&5y@3A&bfd;7 zCf{`EuG*|8IvnI6EOd%=f4Neq!&D-d)cw2yU_xfv{cc&Nab<_RyC-RaNie4c$7U-j zaX9MgjyW0}DnDCjz9!l8;UhLe1@u$z)*~(cB)g;C)~J) zUwK5FBqTyMLG`PIB{!CWk2v?mEBL3BVDMiH<-aIe4Ndb}CboLnRO%CedBR8T@i3U4 z&$!akGv2N(nAtn#8p(p9oLF@v(mf zVDo~|>ta?g>VgnEw>-fVhkQfC($By-ewfnr5iwv&IS$dl@Gan0m;M(s>}Yt{^^ho^ z$XR0+5exZDV4)}_xJ2kScfNYD&jgswdeRsvN2oA873~Jfadl2}X|9_gVGoBv*%1sV zfobWGI#jqIgY??HZLO6d)t~(EL+J=o8B4iP>{6Z7C;QKn!eR*vk?f5!C4L9vAUKi> z*GU>39vC11-{Ux~LEMjn)X)!$XyrS6>R$UCSK`q7t56i3sItBk1a4{!Lex<4i3T7f zBP1{?O7bSkb&b|cDYWy-%09{B4ajI#v5Z&bqAV0=Q8;2HYa%3|gFPl+L&+QW|M~gL6KDDD zZ(UuNLP?AL>~GOtR@pLZt9O#;@MF!z2R> zd#PF3+11slo4ups20C<72{5XwDeIAAZ zvZ{raOu=6Fu||iE(b&XsH0G#kyo6vYM z-I@MBok~AUC(;kdsag~7`ZQBc62*L_*2$FKJ?28`v1{{5w&()H_N9dqsZ15pp`*sG z0m;=&txSzydOYs0Kw4eZ)##Mj&lUVAd$i|@q;nCQO~hkb&`dfE%Bx261_3?OLSyno zx#`Hc1{bGw+%9--_7rO+oVR_*r^sofDL<+L$%bwkJ5Ae4jTA$Q8+^uo9K63b8W$c! zK1bS-b1+wrb6kkix9T+a$+sX=5FD=3dafUEBugps>S~me)lbvOVtJ?SDk;q`uJ6)| zEa>g--hXJ-DD9u#?%NiMNWV+J+e&toHT=;z+`L5V&*E5n&;ZG)t{_rFk&6Qpa`jYK z6}uGC9pS+&EmuK|JnFe|L_w5x?cGjDmSM++D0oC24T^)0dA5&14^UqMz>-+(33G>& zH&51{18~=B6pGxf0UG%oswM0>LE076$})XjmGkJt)C>%gSIc_M(j} z1zRy^N`zuY5DFzVj2eW@&5jT4J3uPV<8K`Kxfh6i=|LK2rV5^Fpx4Bi4~Onm?mqy= z^i=M68t1x?isXDM-GX`Y5fk0q@S6)@4yx~;)FP)t?)43KR?{@!uB6rX%BR654 z%~+;rH2REW@ncVo`^6G|6vL)hY?px>CvLV^Ovg&f!D;Q68`nmqR=cqj%$S!6mPM0h zsnxSeUTc$mK2CBFAmhJ!1HZ&}&w>#N79;NgxgS5JxFB6%}pdx*ZD& zcm-x%`XRl|hrSGkI)D19^WxX-_fvh{fBw}S?D)Osk-)irkF7ht&5!m_dFBM+SAXrk>c9ANsEkyt^4{!fu15R#-h*owUj;$}YE)a>tJW@6FEbc894@zD^c1;# zhEUC|&v5wh`&ok&8>#z4WO7uC!2~Eym)BqlkX%VlRx6CbC?n^uThY{93^71jyQ_0L zH`ZP>Fe$>iawTFb-Q#)li(mZa#l@WGw0l&3Eu{BaD^f`c1y7|cL<%jERYXAVS6D!7 z30)=qDIm7QC#x!>PzZANkEfEUIUk@v)mcM^-|uz3{{2sW@=Z70_)>d8ovOUy-ELSV zFhLqUDVcjeubs2^QQM)fYlaXPuRBU}^H^IB-tD;(u``w+XQ4G3HGD-mK}aOi#)u8O z5&DC#e=bs;5lN3CoUkf$K`$on(RwkjSEi`k~L$-s;q`!bVM zw?d;)tCy53VOu;&U=F)0jvAKVk3=XcDI&uIpL-zAPLotxp`X+u zV=0)iZjq*pktnr>zEmnfXO}?u?T9jHAz)#V_4k)){pveZwZjs+*`GK}Rl1wmR-w>o zbY+`;k&SmvapXi<%Z`@{ch~iyE%j;~Fr(gr-7t7PAP7RCtc}x=)p?bXOXaB1`fpsv zu&^RcK}SFmx8yilJKKL;&W6? z$F|t^Tf2ghIunbx<|go4z8E-`S&6BVO%I}EAQs}mUJScFkMo^$eX4sMp<1K$_3PSS zkIYlXiBnbX!FvHPd`tZD7yfB7^*ym(Pd{XilmGmPLGcz0>;3 z#5g!=sfod$)2&;+M5Ej~B6P#G0s|n>KMy}~|9tr>$wO=y69D-BUoULeM@5H-CDv`v_uK^}!< zV^Erk$<#;?0T(IM)`aSU9wmD+O-+ogoroIKKx>~Q;}bP#m+|&P20IxTgh>UJiLuSz z1?H53WUq#rP6_fp35ucF1}!TA`C#nol=tgN2`DC9&?h_CGs9K=1gQG}8JGw_GQ`cS z0~k@WI_ZK4A}W%Zoqy?$1$Olew5fl|WPqM5=rIU^57|}HVb+}i2frBscp(9;U;rJc z2Xsjefu(Yf`oBmAf=wKnm9UTb!<_J$#Y)08lVWQKDgFj*&`1MP7=>io;W4rXb{tYL zp=Y*6%*;k4ok=mF3jTXOl6`&%V@gSLUMpbNQH4Q!r?*W>kH??px@4O!w_b}GBiAx+~DDSFdG>j0z1!L z84e7aPMOUN-cV_swRDVl+SdLTi84H@46M$~vMKPcR#~W2X|wgCwW@KZ)V6&_XET>? zZDh{hnrri4sJB98o||HknT$IyUpQ_OSz$s(Wa5w!Ss7ZZEoIi(To>|;H;#z8$);MH z`EW+X252$&f>94$XOnVO-byRR6~cnw=A73}ZJpa@qXlQ!_?A2}o9StPatorKc~!K^ O1{o}0SRMEP0000Yp_Hru literal 0 HcmV?d00001 diff --git a/assets/inter-roman-greek.Cb5wWeGA.woff2 b/assets/inter-roman-greek.Cb5wWeGA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f790e047daa346583880da2be470431e35aa6054 GIT binary patch literal 21776 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 De!(H( literal 0 HcmV?d00001 diff --git a/assets/inter-roman-latin-ext.GZWE-KO4.woff2 b/assets/inter-roman-latin-ext.GZWE-KO4.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..715bd903b9b14d22a056f10e6d13b8d7e0acce57 GIT binary patch literal 59608 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



ihengshuai's Github chart

关于我

Hi everyone, nice to meet you here! 👋

大家好,我叫卫恒帅,一位专注于web前端开发的工程师,这是我的博客系统,很高兴在这里见到你,在这里我会对于常见前端技术经验进行分享,除了前端也会涉及相关的后端、运维知识,偶尔也会发发相关的文章。目前在深圳就职于QooApp,欢迎交流。

关于本博客已有好久的历史,不过旧博客都是自己从零搭建的前后端分离项目,随着服务器到期和成本的考虑,决定转换成用静态博客来部署,旧博客数据正在迁移到当前博客。

本博客的大体划分表现在顶部导航栏上,主要包括:前端、全栈、文章、杂谈等,内容涉及到前端的学习路线、算法、框架及核心知识原理(当然前端的知识是最多的),全栈知识如Java、应用部署、CICD、docker、k8s,除此之外还会分享一些平时归纳的文章、项目实战等等,偶尔也会写生活文章发发牢骚😆,如果你感兴趣的话就把我放到收藏夹吧💼!

为方便大家阅读,博客整体结构清晰,非常方便。对于海量数据你可以通过导航栏的搜索进行过滤,直达你最中意的内容!

本人也是一位和大家一样正在不断努力学习的同学,内容都是以平时的积累和自己的见解作为基础的,文章难免会有一些疏漏或者错误之处,如有发现有不对或需改进的地方,非常欢迎大家提供issue,我会及时查看进行修改的,感谢各位🙏

本博客中的一些链接可能需要科学上网才能访问哦

联系

若您愿意深度交流,可以扫描下方二维码关注公众号,输入联系作者会得到我的微信二维码,就可以加我了。有需要的话,我会考虑建个微信交流群,大家一起来探讨技术。目前重新建了一个QQ群,你可以先加入QQ群

hengshuai公众号hengshuai的QQ交流群

贡献

关于贡献内容,你可以fork本篇博客,本地跑起,或直接修改对应的文章,修改完后,发个pull request请求即可,我会及时处理的。

Regarding the content of contribution, you can fork this blog, running locally, or directly modify the corresponding article. After the modification, you can send a Pull Request request. I will deal with it in time.

转载须知

本博客文章允许大家转载,需要注明出处并提供源文章链接,对于标注不允许转载的,请联系本人。

打赏

如果你觉得本博客对你有帮助,不介意的话随意打赏一笔(金额不限),鼓励作者不断分享技术文章,在此感谢!👍

If you think this blog is helpful to you, if you don't mind, enjoy a cup of coffee, encourage the author to continue to share technical articles, thank you here!

支付宝捐赠微信支付捐赠

版权

Copyright 2019-present HengShuai (ihengshuai@mail.com)

知识共享 署名-非商业性使用-相同方式共享 4.0(CC BY-NC-SA 4.0),详情见 LICENSE 文件。

',25);function r(c,g,p,d,u,m){const e=o("Gitalk");return n(),t("div",null,[h,a(e)])}const f=i(l,[["render",r]]);export{y as __pageData,f as default}; diff --git a/assets/me.md.ZKkPBK0C.lean.js b/assets/me.md.ZKkPBK0C.lean.js new file mode 100644 index 000000000..fe00d4073 --- /dev/null +++ b/assets/me.md.ZKkPBK0C.lean.js @@ -0,0 +1 @@ +import{_ as i,c as t,J as a,V as s,o as n,G as o}from"./chunks/framework.SV1ROkXV.js";const y=JSON.parse('{"title":"恒帅的博客(关于我)","description":"","frontmatter":{"title":"恒帅的博客(关于我)","editLink":false,"aside":false,"lastUpdated":false},"headers":[],"relativePath":"me.md","filePath":"me.md","lastUpdated":1706247228000}'),l={name:"me.md"},h=s("",25);function r(c,g,p,d,u,m){const e=o("Gitalk");return n(),t("div",null,[h,a(e)])}const f=i(l,[["render",r]]);export{y as __pageData,f as default}; diff --git a/assets/style.R4pHl7s5.css b/assets/style.R4pHl7s5.css new file mode 100644 index 000000000..9987b3ee3 --- /dev/null +++ b/assets/style.R4pHl7s5.css @@ -0,0 +1 @@ +@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic.jIZ9REo5.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek.Cb5wWeGA.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek-ext.9JiNzaSO.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin.bvIUbFQP.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin-ext.GZWE-KO4.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-vietnamese.paY3CzEB.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic.-nLMcIwj.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic-ext.OVycGSDq.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek.PSfer2Kc.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek-ext.hznxWNZO.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin.27E69YJn.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin-ext.RnFly65-.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-vietnamese.xzQHe1q1.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-2d7eccd3]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-2d7eccd3],.VPBackdrop.fade-leave-to[data-v-2d7eccd3]{opacity:0}.VPBackdrop.fade-leave-active[data-v-2d7eccd3]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-2d7eccd3]{display:none}}.NotFound[data-v-8082fff6]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-8082fff6]{padding:96px 32px 168px}}.code[data-v-8082fff6]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-8082fff6]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-8082fff6]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-8082fff6]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-8082fff6]{padding-top:20px}.link[data-v-8082fff6]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-8082fff6]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-20500810]{position:relative;z-index:1}.nested[data-v-20500810]{padding-right:16px;padding-left:16px}.outline-link[data-v-20500810]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-20500810]:hover,.outline-link.active[data-v-20500810]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-20500810]{padding-left:13px}.VPDocAsideOutline[data-v-ea307b6d]{display:none}.VPDocAsideOutline.has-outline[data-v-ea307b6d]{display:block}.content[data-v-ea307b6d]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-ea307b6d]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-ea307b6d]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-bb0b59e9]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-bb0b59e9]{flex-grow:1}.VPDocAside[data-v-bb0b59e9] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-bb0b59e9] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-bb0b59e9] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-86563300]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-86563300]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-a4d10c8e]{margin-top:64px}.edit-info[data-v-a4d10c8e]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-a4d10c8e]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-a4d10c8e]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-a4d10c8e]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-a4d10c8e]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-a4d10c8e]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-a4d10c8e]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-a4d10c8e]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-a4d10c8e]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-a4d10c8e]{margin-left:auto;text-align:right}.desc[data-v-a4d10c8e]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-a4d10c8e]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-fb80de84]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-fb80de84]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-fb80de84]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-fb80de84]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-fb80de84]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-fb80de84]{display:flex;justify-content:center}.VPDoc .aside[data-v-fb80de84]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-fb80de84]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-fb80de84]{max-width:1104px}}.container[data-v-fb80de84]{margin:0 auto;width:100%}.aside[data-v-fb80de84]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-fb80de84]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-fb80de84]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-fb80de84]::-webkit-scrollbar{display:none}.aside-curtain[data-v-fb80de84]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-fb80de84]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-fb80de84]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-fb80de84]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-fb80de84]{order:1;margin:0;min-width:640px}}.content-container[data-v-fb80de84]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-fb80de84]{max-width:688px}.VPButton[data-v-6acbc606]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-6acbc606]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-6acbc606]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-6acbc606]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-6acbc606]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-6acbc606]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-6acbc606]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-6acbc606]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-6acbc606]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-6acbc606]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-6acbc606]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-6acbc606]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-6acbc606]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-847c6a0a]{display:none}.dark .VPImage.light[data-v-847c6a0a]{display:none}.VPHero[data-v-4f01d72c]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-4f01d72c]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-4f01d72c]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-4f01d72c]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-4f01d72c]{flex-direction:row}}.main[data-v-4f01d72c]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-4f01d72c]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-4f01d72c]{text-align:left}}@media (min-width: 960px){.main[data-v-4f01d72c]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-4f01d72c]{max-width:592px}}.name[data-v-4f01d72c],.text[data-v-4f01d72c]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-4f01d72c],.VPHero.has-image .text[data-v-4f01d72c]{margin:0 auto}.name[data-v-4f01d72c]{color:var(--vp-home-hero-name-color)}.clip[data-v-4f01d72c]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-4f01d72c],.text[data-v-4f01d72c]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-4f01d72c],.text[data-v-4f01d72c]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-4f01d72c],.VPHero.has-image .text[data-v-4f01d72c]{margin:0}}.tagline[data-v-4f01d72c]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-4f01d72c]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-4f01d72c]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-4f01d72c]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-4f01d72c]{margin:0}}.actions[data-v-4f01d72c]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-4f01d72c]{justify-content:center}@media (min-width: 640px){.actions[data-v-4f01d72c]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-4f01d72c]{justify-content:flex-start}}.action[data-v-4f01d72c]{flex-shrink:0;padding:6px}.image[data-v-4f01d72c]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-4f01d72c]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-4f01d72c]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-4f01d72c]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-4f01d72c]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-4f01d72c]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-4f01d72c]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-4f01d72c]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-4f01d72c]{width:320px;height:320px}}[data-v-4f01d72c] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-4f01d72c] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-4f01d72c] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-f85754f7]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-f85754f7]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-f85754f7]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-f85754f7]>.VPImage{margin-bottom:20px}.icon[data-v-f85754f7]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-f85754f7]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-f85754f7]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-f85754f7]{padding-top:8px}.link-text-value[data-v-f85754f7]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-f85754f7]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-4035c07a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-4035c07a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-4035c07a]{padding:0 64px}}.container[data-v-4035c07a]{margin:0 auto;max-width:1152px}.items[data-v-4035c07a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-4035c07a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-4035c07a],.item.grid-4[data-v-4035c07a],.item.grid-6[data-v-4035c07a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-4035c07a],.item.grid-4[data-v-4035c07a]{width:50%}.item.grid-3[data-v-4035c07a],.item.grid-6[data-v-4035c07a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-4035c07a]{width:25%}}.VPHome[data-v-8d491dd9]{padding-bottom:96px}.VPHome[data-v-8d491dd9] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-8d491dd9]{padding-bottom:128px}}.VPContent[data-v-5a285343]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-5a285343]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-5a285343]{margin:0}@media (min-width: 960px){.VPContent[data-v-5a285343]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-5a285343]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-5a285343]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-e09097b5]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-e09097b5]{display:none}.VPFooter[data-v-e09097b5] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-e09097b5] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-e09097b5]{padding:32px}}.container[data-v-e09097b5]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e09097b5],.copyright[data-v-e09097b5]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-ba90ba94]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-ba90ba94]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-ba90ba94]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-ba90ba94]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-ba90ba94]{color:var(--vp-c-text-1)}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-ba90ba94]{font-size:14px}}.icon[data-v-ba90ba94]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}.open>.icon[data-v-ba90ba94]{transform:rotate(90deg)}.items[data-v-ba90ba94]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-ba90ba94]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-ba90ba94]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-ba90ba94]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-ba90ba94]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-ba90ba94]{transition:all .2s ease-out}.flyout-leave-active[data-v-ba90ba94]{transition:all .15s ease-in}.flyout-enter-from[data-v-ba90ba94],.flyout-leave-to[data-v-ba90ba94]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-2ebb1e0d]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-2ebb1e0d]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-2ebb1e0d]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-2ebb1e0d]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-2ebb1e0d]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-2ebb1e0d]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-2ebb1e0d]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-2ebb1e0d]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-2ebb1e0d]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-2ebb1e0d]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-2ebb1e0d]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-2ebb1e0d]{display:none}}.menu-icon[data-v-2ebb1e0d]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-2ebb1e0d]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-2ebb1e0d]{padding:12px 32px 11px}}.VPSwitch[data-v-0438efbe]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-0438efbe]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-0438efbe]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-0438efbe]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-0438efbe] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-0438efbe] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-62e667eb]{opacity:1}.moon[data-v-62e667eb],.dark .sun[data-v-62e667eb]{opacity:0}.dark .moon[data-v-62e667eb]{opacity:1}.dark .VPSwitchAppearance[data-v-62e667eb] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-3bd0ddce]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-3bd0ddce]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-2789a904]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-2789a904]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-2789a904]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-2789a904]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-10684e20]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-10684e20]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-10684e20]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-10684e20]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-32c6b1d0]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-32c6b1d0] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-32c6b1d0] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-32c6b1d0] .group:last-child{padding-bottom:0}.VPMenu[data-v-32c6b1d0] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-32c6b1d0] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-32c6b1d0] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-32c6b1d0] .action{padding-left:24px}.VPFlyout[data-v-41b0fac7]{position:relative}.VPFlyout[data-v-41b0fac7]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-41b0fac7]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-41b0fac7]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-41b0fac7]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-41b0fac7]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-41b0fac7],.button[aria-expanded=true]+.menu[data-v-41b0fac7]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-41b0fac7]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-41b0fac7]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-41b0fac7]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-41b0fac7]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-41b0fac7]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-41b0fac7]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-41b0fac7]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-70b9b240]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-70b9b240]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-70b9b240]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-f534a663]{display:flex;justify-content:center}.VPNavBarExtra[data-v-edb1db61]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-edb1db61]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-edb1db61]{display:none}}.trans-title[data-v-edb1db61]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-edb1db61],.item.social-links[data-v-edb1db61]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-edb1db61]{min-width:176px}.appearance-action[data-v-edb1db61]{margin-right:-2px}.social-links-list[data-v-edb1db61]{margin:-4px -8px}.VPNavBarHamburger[data-v-279e6295]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-279e6295]{display:none}}.container[data-v-279e6295]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-279e6295]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-279e6295]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-279e6295]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-279e6295]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-279e6295]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-279e6295]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-279e6295],.VPNavBarHamburger.active:hover .middle[data-v-279e6295],.VPNavBarHamburger.active:hover .bottom[data-v-279e6295]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-279e6295],.middle[data-v-279e6295],.bottom[data-v-279e6295]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-279e6295]{top:0;left:0;transform:translate(0)}.middle[data-v-279e6295]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-279e6295]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-2b0d6775]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-2b0d6775],.VPNavBarMenuLink[data-v-2b0d6775]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-3e017cdf]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-3e017cdf]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-47b9b291]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-47b9b291]{display:flex;align-items:center}}.title[data-v-5a8562d3]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-5a8562d3]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-5a8562d3]{border-bottom-color:var(--vp-c-divider)}}[data-v-5a8562d3] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-8bf799dc]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-8bf799dc]{display:flex;align-items:center}}.title[data-v-8bf799dc]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-575c0058]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .5s}.VPNavBar.has-local-nav[data-v-575c0058]{background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar.has-local-nav[data-v-575c0058]{background-color:transparent}.VPNavBar[data-v-575c0058]:not(.has-sidebar):not(.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-575c0058]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-575c0058]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-575c0058]{padding:0}}.container[data-v-575c0058]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-575c0058],.container>.content[data-v-575c0058]{pointer-events:none}.container[data-v-575c0058] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-575c0058]{max-width:100%}}.title[data-v-575c0058]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-575c0058]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-575c0058]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-575c0058]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-575c0058]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-575c0058]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-575c0058]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-575c0058]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.top) .content-body[data-v-575c0058]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-575c0058]{column-gap:.5rem}}.menu+.translations[data-v-575c0058]:before,.menu+.appearance[data-v-575c0058]:before,.menu+.social-links[data-v-575c0058]:before,.translations+.appearance[data-v-575c0058]:before,.appearance+.social-links[data-v-575c0058]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-575c0058]:before,.translations+.appearance[data-v-575c0058]:before{margin-right:16px}.appearance+.social-links[data-v-575c0058]:before{margin-left:16px}.social-links[data-v-575c0058]{margin-right:-8px}.divider[data-v-575c0058]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-575c0058]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-575c0058]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-575c0058]{width:100%;height:1px;transition:background-color .5s}.VPNavBar.has-local-nav .divider-line[data-v-575c0058]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.top) .divider-line[data-v-575c0058]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.top) .divider[data-v-575c0058]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-046116b1]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-046116b1]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-08feecc5]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-08feecc5]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-d9d80ef3]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-d9d80ef3]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-d90ad5a0]{display:block}.title[data-v-d90ad5a0]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-fedeb855]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-fedeb855]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-fedeb855]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-fedeb855]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-fedeb855]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-fedeb855]{transform:rotate(45deg)}.button[data-v-fedeb855]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-fedeb855]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-fedeb855]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-fedeb855]:first-child{padding-top:0}.group+.group[data-v-fedeb855],.group+.item[data-v-fedeb855]{padding-top:4px}.VPNavScreenTranslations[data-v-d58656ce]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-d58656ce]{height:auto}.title[data-v-d58656ce]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-d58656ce]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-d58656ce]{margin-right:8px}.icon.chevron[data-v-d58656ce]{margin-left:4px}.list[data-v-d58656ce]{padding:4px 0 0 24px}.link[data-v-d58656ce]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-67d15196]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-67d15196],.VPNavScreen.fade-leave-active[data-v-67d15196]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-67d15196],.VPNavScreen.fade-leave-active .container[data-v-67d15196]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-67d15196],.VPNavScreen.fade-leave-to[data-v-67d15196]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-67d15196],.VPNavScreen.fade-leave-to .container[data-v-67d15196]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-67d15196]{display:none}}.container[data-v-67d15196]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-67d15196],.menu+.appearance[data-v-67d15196],.translations+.appearance[data-v-67d15196]{margin-top:24px}.menu+.social-links[data-v-67d15196]{margin-top:16px}.appearance+.social-links[data-v-67d15196]{margin-top:16px}.VPNav[data-v-50ee880a]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-50ee880a]{position:fixed}}.VPSidebarItem.level-0[data-v-3445ab86]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-3445ab86]{padding-bottom:10px}.item[data-v-3445ab86]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-3445ab86]{cursor:pointer}.indicator[data-v-3445ab86]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-3445ab86],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-3445ab86],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-3445ab86],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-3445ab86]{background-color:var(--vp-c-brand-1)}.link[data-v-3445ab86]{display:flex;align-items:center;flex-grow:1}.text[data-v-3445ab86]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-3445ab86]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-3445ab86],.VPSidebarItem.level-2 .text[data-v-3445ab86],.VPSidebarItem.level-3 .text[data-v-3445ab86],.VPSidebarItem.level-4 .text[data-v-3445ab86],.VPSidebarItem.level-5 .text[data-v-3445ab86]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-3445ab86],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-3445ab86],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-3445ab86],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-3445ab86],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-3445ab86],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-3445ab86]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-3445ab86],.VPSidebarItem.level-1.has-active>.item>.text[data-v-3445ab86],.VPSidebarItem.level-2.has-active>.item>.text[data-v-3445ab86],.VPSidebarItem.level-3.has-active>.item>.text[data-v-3445ab86],.VPSidebarItem.level-4.has-active>.item>.text[data-v-3445ab86],.VPSidebarItem.level-5.has-active>.item>.text[data-v-3445ab86],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-3445ab86],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-3445ab86],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-3445ab86],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-3445ab86],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-3445ab86],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-3445ab86]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-3445ab86],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-3445ab86],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-3445ab86],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-3445ab86],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-3445ab86],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-3445ab86]{color:var(--vp-c-brand-1)}.caret[data-v-3445ab86]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-3445ab86]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-3445ab86]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-3445ab86]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-3445ab86]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-3445ab86],.VPSidebarItem.level-2 .items[data-v-3445ab86],.VPSidebarItem.level-3 .items[data-v-3445ab86],.VPSidebarItem.level-4 .items[data-v-3445ab86],.VPSidebarItem.level-5 .items[data-v-3445ab86]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-3445ab86]{display:none}.VPSidebar[data-v-983e8791]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-983e8791]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-983e8791]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-983e8791]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-983e8791]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-983e8791]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-983e8791]{outline:0}.group+.group[data-v-983e8791]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-983e8791]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-056fc64b]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-056fc64b]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-056fc64b]{top:14px;left:16px}}.Layout[data-v-e69ff593]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-5cfab712]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-5cfab712]{margin:0 auto;max-width:1152px}.love[data-v-5cfab712]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-5cfab712]{width:28px;height:28px;fill:currentColor}.message[data-v-5cfab712]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-5cfab712]{padding-top:32px}.action[data-v-5cfab712]{padding-top:40px;text-align:center}.VPTeamPage[data-v-81d0c7fb]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-81d0c7fb]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-81d0c7fb-s],.VPTeamMembers+.VPTeamPageSection[data-v-81d0c7fb-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-81d0c7fb-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-81d0c7fb-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-81d0c7fb-s],.VPTeamMembers+.VPTeamPageSection[data-v-81d0c7fb-s]{margin-top:96px}}.VPTeamMembers[data-v-81d0c7fb-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-81d0c7fb-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-81d0c7fb-s]{padding:0 64px}}.VPTeamPageTitle[data-v-88a45806]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-88a45806]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-88a45806]{padding:80px 64px 48px}}.title[data-v-88a45806]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-88a45806]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-88a45806]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-88a45806]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-02fd1059]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-02fd1059]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-02fd1059]{padding:0 64px}}.title[data-v-02fd1059]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-02fd1059]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-02fd1059]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-02fd1059]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-02fd1059]{padding-top:40px}.VPTeamMembersItem[data-v-cc4ed7ff]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-cc4ed7ff]{padding:32px}.VPTeamMembersItem.small .data[data-v-cc4ed7ff]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-cc4ed7ff]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-cc4ed7ff]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-cc4ed7ff]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-cc4ed7ff]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-cc4ed7ff]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-cc4ed7ff]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-cc4ed7ff]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-cc4ed7ff]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-cc4ed7ff]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-cc4ed7ff]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-cc4ed7ff]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-cc4ed7ff]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-cc4ed7ff]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-cc4ed7ff]{text-align:center}.avatar[data-v-cc4ed7ff]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-cc4ed7ff]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-cc4ed7ff]{margin:0;font-weight:600}.affiliation[data-v-cc4ed7ff]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-cc4ed7ff]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-cc4ed7ff]:hover{color:var(--vp-c-brand-1)}.desc[data-v-cc4ed7ff]{margin:0 auto}.desc[data-v-cc4ed7ff] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-cc4ed7ff]{display:flex;justify-content:center;height:56px}.sp-link[data-v-cc4ed7ff]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-cc4ed7ff]:hover,.sp .sp-link.link[data-v-cc4ed7ff]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-cc4ed7ff]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-6674e2a2]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-6674e2a2]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-6674e2a2]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-6674e2a2]{max-width:876px}.VPTeamMembers.medium .container[data-v-6674e2a2]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-6674e2a2]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-6674e2a2]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-6674e2a2]{max-width:760px}.container[data-v-6674e2a2]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.card-link{display:flex;justify-content:space-between;flex-wrap:wrap;padding-left:0!important}.card-link-item{padding:16px;border-radius:12px;list-style:none;width:48%;display:inline-block;background-color:var(--vp-c-bg-soft);transition:all .4s ease}.card-link-item:hover{box-shadow:0 0 16px 0 var(--vp-c-text-4)}.card-link-item a{display:flex;width:100%;height:100%;align-items:center}.card-link-item figure{width:64px;height:64px}.card-link-item figure img{border-radius:50%!important;width:100%;height:100%;object-fit:contain}.card-link-content{padding-left:12px;flex:1;min-width:0;color:var(--vp-c-text-1)}.card-link-content-title,.card-link-content-desc{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.card-link-content-desc{color:var(--vp-c-text-2)}.card-link li+li{margin-top:0!important}.card-link-item.top{margin-top:12px!important}@media screen and (max-width: 600px){.card-link-item{width:100%}.card-link li+li{margin-top:12px!important}}.VPTeamMembersItem.small .profile{padding:20px!important}.avatar-img{width:100%;height:100%;object-fit:cover}.reward-divider{height:1px;border-top:1px dashed rgb(181,180,180);margin:16px 0}.share_wrap{text-align:center}.share_wrap a{display:inline-block;margin:0 4px}.share_wrap img{width:40px;height:40px;border-radius:50%}@media screen and (max-width: 700px){.share_wrap img{width:28px;height:28px}}.blog-title{display:inline-flex;position:absolute;top:50%;left:50%;text-align:center;overflow:hidden;text-shadow:0 0 2px #686868,0 1px 1px #ddd,0 2px 1px #d6d6d6,0 3px 1px #ccc,0 4px 1px #c5c5c5,0 5px 1px #c1c1c1,0 6px 1px #bbb,0 7px 1px #777,0 8px 3px hsl(0deg 0% 39% / 40%),0 9px 5px hsl(0deg 0% 39% / 10%),0 10px 7px hsl(0deg 0% 39% / 15%),0 11px 9px hsl(0deg 0% 39% / 20%),0 12px 11px hsl(0deg 0% 39% / 25%),0 13px 15px hsl(0deg 0% 39% / 30%);transition:all 1s cubic-bezier(.53,-.44,1,1);letter-spacing:2px;transform-style:preserve-3d;perspective:200px;transform:perspective(200px) rotate3d(0,4,2,-4deg) translate(-60%,-80%);-webkit-text-stroke:2px;padding-right:12px;white-space:nowrap;line-height:1.8;font-size:44px;font-weight:700}.blog-title:after{content:"_";display:block;position:absolute;bottom:0;right:0;width:12px;height:4px;background:red;animation:typing 1s steps(20) infinite}@keyframes typing{0%,to{background:transparent}50%{background:var(--vp-c-brand-light)}}@media screen and (max-width: 600px){.blog-title{font-size:20px}}:root{--vp-c-brand: #646cff;--vp-c-brand-light: #747bff;--vp-c-brand-dark: rgb(74, 72, 196);--vp-layout-max-width: 1500px;--vp-sidebar-width: 300px;--vp-custom-block-tip-text: var(--vp-c-green-dark);--vp-c-mute: #fbc28b60;--vp-button-alt-bg: #eee;--vp-c-bg-alpha-with-backdrop: #ffffff80;--vp-c-yellow: #bb5d07;--vp-c-blockquote: rgba(100 98 98 / 10%);--vp-code-block-bg: rgb(23, 23, 23);--vp-code-line-number-color: rgb(139, 139, 139)}.dark{--vp-c-mute: #ffffff99;--vp-c-text-code: #232528;--vp-button-alt-bg: #454343;--vp-c-bg-alpha-with-backdrop: var(--vp-c-bg-soft-mute)42;--vp-c-blockquote: rgba(20 60 140 / 10%);--vp-code-block-bg: rgb(10, 9, 9)}.VPDoc.has-aside .content-container{max-width:860px!important}.VPDoc:not(.has-sidebar) .content{max-width:1000px!important}.aside-curtain{background:transparent!important}.title-text{font-size:18px!important}.link-text{font-size:16px!important}.link-text.light{font-size:13px!important}.vp-doc h2{margin:28px 0 16px}.vp-doc blockquote{background:var(--vp-c-blockquote);font-style:italic!important;padding-top:8px;padding-bottom:8px}.vp-doc blockquote p{line-height:24px;font-size:15px}@media screen and (min-width: 960px){@supports ((backdrop-filter: saturate(50%) blur(8px)) or (-webkit-backdrop-filter: saturate(50%) blur(8px))){.VPNavBar.has-sidebar .content-body{-webkit-backdrop-filter:saturate(50%) blur(8px);backdrop-filter:saturate(50%) blur(8px);background-color:var(--vp-c-bg-alpha-with-backdrop)!important}}.VPNavBar.has-sidebar .curtain{display:none!important}}@media screen and (max-width: 600px){.sm-center{text-align:center}}.sm-center .sm-center>*{margin-bottom:8px}.img-title{font-size:12px;text-align:center;color:#666;margin-top:-16px;-webkit-user-select:none;user-select:none}.backdrop{background:#38383899!important}.VPLocalSearchBox[data-v-7407a484]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-7407a484]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-7407a484]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-7407a484]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-7407a484]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-7407a484]{padding:0 8px}}.search-bar[data-v-7407a484]:focus-within{border-color:var(--vp-c-brand-1)}.search-icon[data-v-7407a484]{margin:8px}@media (max-width: 767px){.search-icon[data-v-7407a484]{display:none}}.search-input[data-v-7407a484]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-7407a484]{padding:6px 4px}}.search-actions[data-v-7407a484]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-7407a484]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-7407a484]{display:none}}.search-actions button[data-v-7407a484]{padding:8px}.search-actions button[data-v-7407a484]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-7407a484]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-7407a484]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-7407a484]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-7407a484]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-7407a484]{display:none}}.search-keyboard-shortcuts kbd[data-v-7407a484]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-7407a484]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-7407a484]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-7407a484]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-7407a484]{margin:8px}}.titles[data-v-7407a484]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-7407a484]{display:flex;align-items:center;gap:4px}.title.main[data-v-7407a484]{font-weight:500}.title-icon[data-v-7407a484]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-7407a484]{opacity:.5}.result.selected[data-v-7407a484]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-7407a484]{position:relative}.excerpt[data-v-7407a484]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-7407a484]{opacity:1}.excerpt[data-v-7407a484] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-7407a484] mark,.excerpt[data-v-7407a484] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-7407a484] .vp-code-group .tabs{display:none}.excerpt[data-v-7407a484] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-7407a484]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-7407a484]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-7407a484],.result.selected .title-icon[data-v-7407a484]{color:var(--vp-c-brand-1)!important}.no-results[data-v-7407a484]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-7407a484]{flex:none} diff --git a/assets/super-nav_index.md.yGU0kMmW.js b/assets/super-nav_index.md.yGU0kMmW.js new file mode 100644 index 000000000..00af59922 --- /dev/null +++ b/assets/super-nav_index.md.yGU0kMmW.js @@ -0,0 +1,9 @@ +import{_ as o,c as t,J as s,V as r,m as n,a as c,o as i,G as a}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse(`{"title":"导航指南","description":"ihengshuai blog的友链、导航指南、技术博客、个人博客","frontmatter":{"title":"导航指南","description":"ihengshuai blog的友链、导航指南、技术博客、个人博客","head":[["meta",{"name":"keywords","content":"ihengshuai's blog,ihengshuai blog,恒帅的博客,恒帅blog,友链,导航指南,技术博客,团队技术"}]]},"headers":[],"relativePath":"super-nav/index.md","filePath":"super-nav/index.md","lastUpdated":1706247228000}`),F={name:"super-nav/index.md"},D=r(`

导航指南

本篇收纳了一些技术博客和好用的工具网站,个人博客可以自主按照以下提示申请即可,你也可以补充一些比较好的网站,我会及时添加的

个人技术博客

TIP

以下为友链申请格式,评论写下你的信息(不能为空壳及涉及法律等相关反社会的内容),可以根据评论里的yaml格式书写

typescript
interface IFriend {
+  avatar: string;
+  title: string;
+  description: string;
+  links: Array<{
+    icon: 'github' | 'blog' | 'juejin' | 'weibo' | 'twitter' | 'facebook';
+    link: string;
+  }>
+}

博客顺序不分前后

`,6),y=n("h2",{id:"团队技术博客",tabindex:"-1"},[c("团队技术博客 "),n("a",{class:"header-anchor",href:"#团队技术博客","aria-label":'Permalink to "团队技术博客"'},"​")],-1),d=n("p",null,"欢迎补充,不断更新中...",-1);function b(m,u,h,_,g,C){const e=a("Friends"),l=a("NavExtends"),p=a("Gitalk");return i(),t("div",null,[D,s(e),y,s(l),d,s(p)])}const k=o(F,[["render",b]]);export{B as __pageData,k as default}; diff --git a/assets/super-nav_index.md.yGU0kMmW.lean.js b/assets/super-nav_index.md.yGU0kMmW.lean.js new file mode 100644 index 000000000..d4722bd2d --- /dev/null +++ b/assets/super-nav_index.md.yGU0kMmW.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,J as s,V as r,m as n,a as c,o as i,G as a}from"./chunks/framework.SV1ROkXV.js";const B=JSON.parse(`{"title":"导航指南","description":"ihengshuai blog的友链、导航指南、技术博客、个人博客","frontmatter":{"title":"导航指南","description":"ihengshuai blog的友链、导航指南、技术博客、个人博客","head":[["meta",{"name":"keywords","content":"ihengshuai's blog,ihengshuai blog,恒帅的博客,恒帅blog,友链,导航指南,技术博客,团队技术"}]]},"headers":[],"relativePath":"super-nav/index.md","filePath":"super-nav/index.md","lastUpdated":1706247228000}`),F={name:"super-nav/index.md"},D=r("",6),y=n("h2",{id:"团队技术博客",tabindex:"-1"},[c("团队技术博客 "),n("a",{class:"header-anchor",href:"#团队技术博客","aria-label":'Permalink to "团队技术博客"'},"​")],-1),d=n("p",null,"欢迎补充,不断更新中...",-1);function b(m,u,h,_,g,C){const e=a("Friends"),l=a("NavExtends"),p=a("Gitalk");return i(),t("div",null,[D,s(e),y,s(l),d,s(p)])}const k=o(F,[["render",b]]);export{B as __pageData,k as default}; diff --git a/assets/talk_2023_dad-foot-injured.md.HmqqvJLL.js b/assets/talk_2023_dad-foot-injured.md.HmqqvJLL.js new file mode 100644 index 000000000..f9533b37f --- /dev/null +++ b/assets/talk_2023_dad-foot-injured.md.HmqqvJLL.js @@ -0,0 +1 @@ +import{_ as e,c as a,J as s,V as i,o,G as d}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"我爸脚受伤了","description":"那天我爸脚受伤了,心情是无比的沉重,远在深圳的我也无法回去照顾我爸,还好我妈一个人也可以忙的过来,我也只能祈求爸爸没有大碍可以早日康复了","frontmatter":{"title":"我爸脚受伤了","description":"那天我爸脚受伤了,心情是无比的沉重,远在深圳的我也无法回去照顾我爸,还好我妈一个人也可以忙的过来,我也只能祈求爸爸没有大碍可以早日康复了","prev":false,"next":false,"aside":false},"headers":[],"relativePath":"talk/2023/dad-foot-injured.md","filePath":"talk/2023/dad-foot-injured.md","lastUpdated":1706247228000}'),n={name:"talk/2023/dad-foot-injured.md"},p=i('

我爸脚受伤了

2023年08月18日星期五(癸卯年七月初三)上午得知我爸脚受伤时,心情无比沉痛!

事情是这样的,好多天没有和我妈打视频了,平时都是早上上班出门前(09:30)那会给我妈打个视频或者发个消息。以前给她打电话基本上都会接也很快,但这几次都没有理我也没有回消息,我心里就有不好的感觉(老是爱瞎想),没想到今天还是不接电话,一开始接了电话40秒,我看见一个陌生的环境,但并没有看到我妈,也没有怎么说话,后面就挂断了;然后我就问她在干嘛呢,打电话又被拒绝,最后我妈发了一句语音过来:"你爸脚受伤了在医院"。我顿时就鸡皮疙瘩起来了,怎么回事啊!内心很难受、很着急(想哭没有哭),迫切想知道受伤严重程度!!!

经过后面的语音消息,得知我爸是在前天16号就受伤了,然后就被紧急送到医院了,医生说是脚踝骨折,需要做手术!由于工作原因我也无法立马飞过去去照顾我爸,所以就只能在深圳这边耐心等待了!

我爸可以说是一位老牌资深汽修人员,年轻时候考上了大专最后由于某种原因没有去,所以就自己做起了汽修行业。从刚开始到我上高中那段时间都是在家里做老板,以前生意还好也能赚下钱。就是最近几年生意也没那么好做了,我爸妈就想着怎么解决当前不景气的现象,于是就想着出去打工(还是那么要强),我当时还劝说没必要了,我都已经毕业工作了(有个姐也早成家有自己的新居了)没必要那么折腾了,但我爸还是坚持要干点啥,坐不住。他有个朋友在一个公司里有一定职权,就叫我爸可以来他那边工作,让我爸管理下面的一些人,工资高点(也是要干活),工资相对来说不低我爸就考虑去了,包吃包住就干了几年了,每年都是11月就回家了,总体来说还好

没想到今天我爸受伤了,于是我妈就在家里坐了一天的车去工作地方照顾我爸去了,这几天不接电话,也是他们不想让我知道怕影响我工作让我伤心,故而不理的。所以我打了好多次电话没接也感觉到可能家里出了什么事,最后没想到真的出事了,内心提心吊胆、精神紧绷却又无济于事

我妈说不用让我着急,好好工作,她在那里照顾就可以了,在医院也有医生照顾着所以不用担心。医生说等脚稍微消肿了就可以做手术了,然后脚部打上钢钉在家休养大半年后取掉钢钉就可以好了,不过手术后要在床上躺着2~3个月,不能下床走动。其实我知道这个消息但还是有点放不下,脑子里总在想我爸以后不会要做轮椅或者没法正常走路吧,后面得知好好修养脚就会愈合的,应该没啥事不要让我太担心。我也在网上翻阅了很多资料和百科,像很多骨折慢慢修养都是可以修复的,于是我心里的担忧也慢慢放下了

手术后的前两天麻药过后会感觉很疼,我妈说我爸疼的都叫起来了(这是有多疼啊!),所以疼的时候也会吃止疼药能缓解一下!哎,我爸这么要强的人也疼的叫起来我内心是真的很难受,顿时也差点哭出来,我给憋回去了!心想大丈夫决不能哭,内心一定要强大!就祈福我爸早日康复吧🙏🏻

目前28号了,我妈说医生通知半个月后就可以办理出院了,接下来就可以回家好好修养了,我心里也感觉的很万幸,感谢老天的厚爱,谢谢!

最后我想说,每个人心里都有爱自己的爸妈、亲朋好友!由于工作原因我们奔波在四海,见面的日子也越来越少,所以一定要珍惜见面的机会。趁家人还年轻一定要好好陪陪家人,任何陪伴的时光终将会变成珍贵的回忆,这是任何金钱都换不来的宝贵财富!我也知道我们这些年轻人在外上班其实也挺累的,每天三点一线重复的过着,可能会觉得很无聊,但这就是生活,要相信苦尽甘来,不要做躺平青年!学会在工作中做一些有意义的事情,要知道"不积跬步无以至千里"!做强大的自己!!!

',12);function r(c,l,f,_,u,h){const t=d("Gitalk");return o(),a("div",null,[p,s(t)])}const x=e(n,[["render",r]]);export{g as __pageData,x as default}; diff --git a/assets/talk_2023_dad-foot-injured.md.HmqqvJLL.lean.js b/assets/talk_2023_dad-foot-injured.md.HmqqvJLL.lean.js new file mode 100644 index 000000000..06ad168c6 --- /dev/null +++ b/assets/talk_2023_dad-foot-injured.md.HmqqvJLL.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,J as s,V as i,o,G as d}from"./chunks/framework.SV1ROkXV.js";const g=JSON.parse('{"title":"我爸脚受伤了","description":"那天我爸脚受伤了,心情是无比的沉重,远在深圳的我也无法回去照顾我爸,还好我妈一个人也可以忙的过来,我也只能祈求爸爸没有大碍可以早日康复了","frontmatter":{"title":"我爸脚受伤了","description":"那天我爸脚受伤了,心情是无比的沉重,远在深圳的我也无法回去照顾我爸,还好我妈一个人也可以忙的过来,我也只能祈求爸爸没有大碍可以早日康复了","prev":false,"next":false,"aside":false},"headers":[],"relativePath":"talk/2023/dad-foot-injured.md","filePath":"talk/2023/dad-foot-injured.md","lastUpdated":1706247228000}'),n={name:"talk/2023/dad-foot-injured.md"},p=i("",12);function r(c,l,f,_,u,h){const t=d("Gitalk");return o(),a("div",null,[p,s(t)])}const x=e(n,[["render",r]]);export{g as __pageData,x as default}; diff --git a/assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.js b/assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.js new file mode 100644 index 000000000..3b46647e4 --- /dev/null +++ b/assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.js @@ -0,0 +1 @@ +import{_ as o,c as t,J as a,V as p,o as r,G as s}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"我也赶上了裁员","description":"2023年08月30日是我在QooApp的最后一天,虽然在这里只有一年多半年的时间,但还是有点不舍","frontmatter":{"title":"我也赶上了裁员","description":"2023年08月30日是我在QooApp的最后一天,虽然在这里只有一年多半年的时间,但还是有点不舍","prev":false,"next":false,"aside":false},"headers":[],"relativePath":"talk/2023/lose-qoo-job.md","filePath":"talk/2023/lose-qoo-job.md","lastUpdated":1706247228000}'),l={name:"talk/2023/lose-qoo-job.md"},n=p('

我也赶上了裁员

2023年08月30日是我在QooApp的最后一天,虽然在这里只有一年多半年的时间,但还是有点不舍!

本周一到公司下午就收到了boss的会议邀请,当时还有点懵逼我这边开发只有我和我对面两个同事参会,其他大咖以及我两边的同事都没有参加,一时搞不懂什么情况。走到会议室空气瞬间安静了起来,每个人的脸上都表现出了严肃的信号,顿时心里也猜到了有不祥的事情要发生

会议室中坐在我旁边的有后端的同事、大佬以及UI设计、产品等,因为也有其他地区的同事要参加google会议所以我也带着笔记本。坐在我旁边的UI也看我的屏幕,我还很自觉的新建了一个文件来记录今日的会议内容...

会议开始了包括深圳、香港、台湾等几个部门加起来有几十个人吧,boss声音很深沉感觉很为难的样子,说了关于今年上半年公司营收很差的现象,我也顿时反应过来要裁员了,大家也都知道要干嘛了。果不其然最后参加会议的人都要被裁掉,以N+1的形式进行赔偿。据内部消息来自股东的压力为实现收支平衡不得已才裁员的,据说整个运营团队都被裁掉了,确实有点吓人。目前公司要大力去做toB方向的业务,通过商务与第三方企业合作来实现toB方向的盈利,以及新兴的AI方面新颖的业务了

上个月还在和上一家公司的同事聊天得知她也被裁掉后,没想到这个月很突然的轮到了自己,只能说目前国内市场上面的形势很不景气,大部分中小企业可能都面临着倒闭的风险,裁员是没办法

一切都来的太突然,虽然拿到了N+1的赔偿,但还是有些不舍。中午部门一起出去吃了分手饭,聊了公司以后的方向、接下来的安排,以及对我们被裁掉的同事的关心,30日下午收拾好工位也就离开了公司。好聚好散,江湖再见!

目前只想先给自己一段小时间的放松,等到10月中下旬了再准备面试吧,也希望今年国庆能在家里呆久一点陪陪我爸妈。发这篇文章只是想记录下我对QooApp的不舍,感谢这里一切!也想说明目前市场形势暗淡,裁员会变得很常见。不过根据消息后半年的形势会有好转,我们打工人也不必要那么慌,正确看待工作的属性,人生很长久不只有工作,做好自己就行,不要躺平去做一些有意义的事情,同时让自己变得更加强大!!!

',8);function _(c,i,d,f,m,h){const e=s("Gitalk");return r(),t("div",null,[n,a(e)])}const u=o(l,[["render",_]]);export{k as __pageData,u as default}; diff --git a/assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.lean.js b/assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.lean.js new file mode 100644 index 000000000..0616cf952 --- /dev/null +++ b/assets/talk_2023_lose-qoo-job.md.OMUrm0Ji.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,J as a,V as p,o as r,G as s}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"我也赶上了裁员","description":"2023年08月30日是我在QooApp的最后一天,虽然在这里只有一年多半年的时间,但还是有点不舍","frontmatter":{"title":"我也赶上了裁员","description":"2023年08月30日是我在QooApp的最后一天,虽然在这里只有一年多半年的时间,但还是有点不舍","prev":false,"next":false,"aside":false},"headers":[],"relativePath":"talk/2023/lose-qoo-job.md","filePath":"talk/2023/lose-qoo-job.md","lastUpdated":1706247228000}'),l={name:"talk/2023/lose-qoo-job.md"},n=p("",8);function _(c,i,d,f,m,h){const e=s("Gitalk");return r(),t("div",null,[n,a(e)])}const u=o(l,[["render",_]]);export{k as __pageData,u as default}; diff --git a/assets/talk_2023_love-4th-anniversary.md.yJuD2XUO.js b/assets/talk_2023_love-4th-anniversary.md.yJuD2XUO.js new file mode 100644 index 000000000..3aa2d845c --- /dev/null +++ b/assets/talk_2023_love-4th-anniversary.md.yJuD2XUO.js @@ -0,0 +1 @@ +import{_ as t,c as s,o as n,m as e,a}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"四周年纪念","description":"从大学相爱到现在已经四周年了,爱每时每刻都要被记录着","frontmatter":{"title":"四周年纪念","description":"从大学相爱到现在已经四周年了,爱每时每刻都要被记录着","editLink":false,"aside":false,"lastUpdated":false,"logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-talk.png"},"headers":[],"relativePath":"talk/2023/love-4th-anniversary.md","filePath":"talk/2023/love-4th-anniversary.md","lastUpdated":1706247228000}'),o={name:"talk/2023/love-4th-anniversary.md"},r=e("h1",{id:"四周年纪念",tabindex:"-1"},[a("四周年纪念 "),e("a",{class:"header-anchor",href:"#四周年纪念","aria-label":'Permalink to "四周年纪念"'},"​")],-1),i=e("h2",{id:"df",tabindex:"-1"},[a("df "),e("a",{class:"header-anchor",href:"#df","aria-label":'Permalink to "df"'},"​")],-1),d=[r,i];function l(c,h,f,_,p,m){return n(),s("div",null,d)}const u=t(o,[["render",l]]);export{k as __pageData,u as default}; diff --git a/assets/talk_2023_love-4th-anniversary.md.yJuD2XUO.lean.js b/assets/talk_2023_love-4th-anniversary.md.yJuD2XUO.lean.js new file mode 100644 index 000000000..3aa2d845c --- /dev/null +++ b/assets/talk_2023_love-4th-anniversary.md.yJuD2XUO.lean.js @@ -0,0 +1 @@ +import{_ as t,c as s,o as n,m as e,a}from"./chunks/framework.SV1ROkXV.js";const k=JSON.parse('{"title":"四周年纪念","description":"从大学相爱到现在已经四周年了,爱每时每刻都要被记录着","frontmatter":{"title":"四周年纪念","description":"从大学相爱到现在已经四周年了,爱每时每刻都要被记录着","editLink":false,"aside":false,"lastUpdated":false,"logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-talk.png"},"headers":[],"relativePath":"talk/2023/love-4th-anniversary.md","filePath":"talk/2023/love-4th-anniversary.md","lastUpdated":1706247228000}'),o={name:"talk/2023/love-4th-anniversary.md"},r=e("h1",{id:"四周年纪念",tabindex:"-1"},[a("四周年纪念 "),e("a",{class:"header-anchor",href:"#四周年纪念","aria-label":'Permalink to "四周年纪念"'},"​")],-1),i=e("h2",{id:"df",tabindex:"-1"},[a("df "),e("a",{class:"header-anchor",href:"#df","aria-label":'Permalink to "df"'},"​")],-1),d=[r,i];function l(c,h,f,_,p,m){return n(),s("div",null,d)}const u=t(o,[["render",l]]);export{k as __pageData,u as default}; diff --git a/assets/talk_2023_second-covid.md.W7G-R6cY.js b/assets/talk_2023_second-covid.md.W7G-R6cY.js new file mode 100644 index 000000000..3c7962f91 --- /dev/null +++ b/assets/talk_2023_second-covid.md.W7G-R6cY.js @@ -0,0 +1 @@ +import{_ as o,c as s,J as a,m as e,a as n,o as c,G as l}from"./chunks/framework.SV1ROkXV.js";const G=JSON.parse('{"title":"我二🐑 了","description":"新冠病毒二阳了","frontmatter":{"title":"我二🐑 了","description":"新冠病毒二阳了","keywords":"COVID-19,新冠病毒,新冠二阳","prev":false,"next":false,"aside":false},"headers":[],"relativePath":"talk/2023/second-covid.md","filePath":"talk/2023/second-covid.md","lastUpdated":1706247228000}'),d={name:"talk/2023/second-covid.md"},i=e("h1",{id:"我二🐑了",tabindex:"-1"},[n("我二🐑了 "),e("a",{class:"header-anchor",href:"#我二🐑了","aria-label":'Permalink to "我二🐑了"'},"​")],-1),r=e("p",null,"就在昨天(23/06/02)我二🐑了,这天周五早上起床,发现自己有点发烧没有精神,于是就测了下体温:37.4°C,此时我还没想到🐑,吃完早餐喝了点感冒灵就去上班了。",-1),_=e("p",null,"地铁里空调风狠狠地向我扑来,打了个喷嚏、真冷!到公司后就开始不断擦鼻涕、声音也感觉变了。然后我就不断的接开水喝,一杯又一杯。身体逐渐乏力,两眼开始眩晕,感觉无力再敲代码,最后决定下午请假,回去好好养病。",-1),p=e("p",null,"终于等到中午下班了,收拾好装备就打卡下班了。在地铁上的我感觉体温升高,也越来越蓝瘦…",-1),h=e("p",null,"到家后二话不说立马测了个体温,竟飙到惊人的38°C!告诉女友后,说让我喝点退烧药,就拿出家里备用的药💊喝了后躺床上了。",-1),m=e("p",null,"六月的广东骄阳似火,发烧的我也不敢开空调,床上的我如蒸笼乳猪无法静心养病,这种情况真是束手无策,就这样一直熬到傍晚。女友下班后帮我测了个抗原检测,没想到还真中奖了(女友上周五也阳了)",-1),f=e("p",null,"可能5、6月份也到了二🐑的阶段,但是没想到会发生在自己身上。平时我也不怎么戴口罩,然后也没什么问题。回想还是周三晚上洗完冷水澡后直吹空调导致周四就感觉到鼻子不太舒服了,由于没有任何措施周五就开始发烧了。我猜自己可能早就阳了只是这次空调成为诱因吧!总之,这次体温都保持在38°C以下属于低烧,其他喉咙什么的都没有症状,万幸在周日就已经不发烧了。",-1),u=e("p",null,"最后,希望在外的每一个人还是提高警惕注意防护,保护好自己!",-1);function k(v,x,C,N,V,$){const t=l("Gitalk");return c(),s("div",null,[i,r,_,p,h,m,f,u,a(t)])}const P=o(d,[["render",k]]);export{G as __pageData,P as default}; diff --git a/assets/talk_2023_second-covid.md.W7G-R6cY.lean.js b/assets/talk_2023_second-covid.md.W7G-R6cY.lean.js new file mode 100644 index 000000000..3c7962f91 --- /dev/null +++ b/assets/talk_2023_second-covid.md.W7G-R6cY.lean.js @@ -0,0 +1 @@ +import{_ as o,c as s,J as a,m as e,a as n,o as c,G as l}from"./chunks/framework.SV1ROkXV.js";const G=JSON.parse('{"title":"我二🐑 了","description":"新冠病毒二阳了","frontmatter":{"title":"我二🐑 了","description":"新冠病毒二阳了","keywords":"COVID-19,新冠病毒,新冠二阳","prev":false,"next":false,"aside":false},"headers":[],"relativePath":"talk/2023/second-covid.md","filePath":"talk/2023/second-covid.md","lastUpdated":1706247228000}'),d={name:"talk/2023/second-covid.md"},i=e("h1",{id:"我二🐑了",tabindex:"-1"},[n("我二🐑了 "),e("a",{class:"header-anchor",href:"#我二🐑了","aria-label":'Permalink to "我二🐑了"'},"​")],-1),r=e("p",null,"就在昨天(23/06/02)我二🐑了,这天周五早上起床,发现自己有点发烧没有精神,于是就测了下体温:37.4°C,此时我还没想到🐑,吃完早餐喝了点感冒灵就去上班了。",-1),_=e("p",null,"地铁里空调风狠狠地向我扑来,打了个喷嚏、真冷!到公司后就开始不断擦鼻涕、声音也感觉变了。然后我就不断的接开水喝,一杯又一杯。身体逐渐乏力,两眼开始眩晕,感觉无力再敲代码,最后决定下午请假,回去好好养病。",-1),p=e("p",null,"终于等到中午下班了,收拾好装备就打卡下班了。在地铁上的我感觉体温升高,也越来越蓝瘦…",-1),h=e("p",null,"到家后二话不说立马测了个体温,竟飙到惊人的38°C!告诉女友后,说让我喝点退烧药,就拿出家里备用的药💊喝了后躺床上了。",-1),m=e("p",null,"六月的广东骄阳似火,发烧的我也不敢开空调,床上的我如蒸笼乳猪无法静心养病,这种情况真是束手无策,就这样一直熬到傍晚。女友下班后帮我测了个抗原检测,没想到还真中奖了(女友上周五也阳了)",-1),f=e("p",null,"可能5、6月份也到了二🐑的阶段,但是没想到会发生在自己身上。平时我也不怎么戴口罩,然后也没什么问题。回想还是周三晚上洗完冷水澡后直吹空调导致周四就感觉到鼻子不太舒服了,由于没有任何措施周五就开始发烧了。我猜自己可能早就阳了只是这次空调成为诱因吧!总之,这次体温都保持在38°C以下属于低烧,其他喉咙什么的都没有症状,万幸在周日就已经不发烧了。",-1),u=e("p",null,"最后,希望在外的每一个人还是提高警惕注意防护,保护好自己!",-1);function k(v,x,C,N,V,$){const t=l("Gitalk");return c(),s("div",null,[i,r,_,p,h,m,f,u,a(t)])}const P=o(d,[["render",k]]);export{G as __pageData,P as default}; diff --git a/assets/talk_base.md.GzyzggUv.js b/assets/talk_base.md.GzyzggUv.js new file mode 100644 index 000000000..aea30ef49 --- /dev/null +++ b/assets/talk_base.md.GzyzggUv.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"杂谈","description":"成长,是我们每个人都必须经历的一段旅程。在这段旅程中,我们会遇到各种各样的人和事,有欢笑也有泪水;有成功也有失败;有挑战也有机遇。而这些经历,无疑都会对我们的人生产生深远的影响。这里会分享有关生活方面的思考和感悟","frontmatter":{"title":"杂谈","editLink":false,"lastUpdated":false,"aside":false,"description":"成长,是我们每个人都必须经历的一段旅程。在这段旅程中,我们会遇到各种各样的人和事,有欢笑也有泪水;有成功也有失败;有挑战也有机遇。而这些经历,无疑都会对我们的人生产生深远的影响。这里会分享有关生活方面的思考和感悟","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-talk.png","prev":false,"next":false},"headers":[],"relativePath":"talk/base.md","filePath":"talk/base.md","lastUpdated":1706247228000}'),n={name:"talk/base.md"},i=e("h1",{id:"杂谈",tabindex:"-1"},[o("杂谈 "),e("a",{class:"header-anchor",href:"#杂谈","aria-label":'Permalink to "杂谈"'},"​")],-1),l=e("p",null,"成长,是我们每个人都必须经历的一段旅程。在这段旅程中,我们会遇到各种各样的人和事,有欢笑也有泪水;有成功也有失败;有挑战也有机遇。而这些经历,无疑都会对我们的人生产生深远的影响",-1),c=[i,l];function r(d,p,_,f,h,m){return s(),t("div",null,c)}const b=a(n,[["render",r]]);export{u as __pageData,b as default}; diff --git a/assets/talk_base.md.GzyzggUv.lean.js b/assets/talk_base.md.GzyzggUv.lean.js new file mode 100644 index 000000000..aea30ef49 --- /dev/null +++ b/assets/talk_base.md.GzyzggUv.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.SV1ROkXV.js";const u=JSON.parse('{"title":"杂谈","description":"成长,是我们每个人都必须经历的一段旅程。在这段旅程中,我们会遇到各种各样的人和事,有欢笑也有泪水;有成功也有失败;有挑战也有机遇。而这些经历,无疑都会对我们的人生产生深远的影响。这里会分享有关生活方面的思考和感悟","frontmatter":{"title":"杂谈","editLink":false,"lastUpdated":false,"aside":false,"description":"成长,是我们每个人都必须经历的一段旅程。在这段旅程中,我们会遇到各种各样的人和事,有欢笑也有泪水;有成功也有失败;有挑战也有机遇。而这些经历,无疑都会对我们的人生产生深远的影响。这里会分享有关生活方面的思考和感悟","logo":"https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/icon-talk.png","prev":false,"next":false},"headers":[],"relativePath":"talk/base.md","filePath":"talk/base.md","lastUpdated":1706247228000}'),n={name:"talk/base.md"},i=e("h1",{id:"杂谈",tabindex:"-1"},[o("杂谈 "),e("a",{class:"header-anchor",href:"#杂谈","aria-label":'Permalink to "杂谈"'},"​")],-1),l=e("p",null,"成长,是我们每个人都必须经历的一段旅程。在这段旅程中,我们会遇到各种各样的人和事,有欢笑也有泪水;有成功也有失败;有挑战也有机遇。而这些经历,无疑都会对我们的人生产生深远的影响",-1),c=[i,l];function r(d,p,_,f,h,m){return s(),t("div",null,c)}const b=a(n,[["render",r]]);export{u as __pageData,b as default}; diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6a240634b594b6bdd5f9b94a019ce8d0eeb8bfa0 GIT binary patch literal 4286 zcmb_f30RG38~)OaW$gaZ&xCgBoE9zGb=tLQCryhq#{&EMbbuT zQBuNb{C=_w4JO7lmcQwp`#t$g(m&UwtFP#!|F5K^#MD0~pGdu51e!A9`$@p zpBsvUwI@GoCPVG>*$NH!Qh7j@<_G#MEMa*x$CYr^~k9ljuW5ZoMee&!UeBa>o{SRfX zUMrFuTs-`I{6p5nAIeWUa<1WO@wG>twGX>b1H*SL{x8uKue6lJ7y~0y_k_czt|w&` z7H&y65FM3#IC@9giKv|ibHieHXRhNXq=jzWmcm~dv?6mt9K0EUn2E5@u^RCntEi~BeYUD&%psEhzBP5n3Q=lA5> z#-~J~>dtGeiuRWl7jM0AywLWmEA-;?El=%hI^LVZzDDzNG7U1Z;RzXqxQS4{ak-q~ z&<@ASt_R(IL-Yb8;uv5Oa*^I2NL1C-h2bt}xW`S)uXKw_I^?q^B+?x*a+_yk?{02o zyVTOo$$zQehS24KVZrd9-=VWL0pO0u>AJfnS33S@03S%xwdq>elMT3K4L^n8x;*P2 zsy&zce})0ZhuJ#2Y6nN|46(Lfz?&r}Dud~eWB;lFyvLT zUud*_Y1=c2zwHbCtb+5D!$q}6VXF!_s6QsxKkm&h)+Zm{8LOQkZwzKo(aDCh8w2>7THwmp@boK>iZXQtuaNP0hRUk)>6 z^2CvbCg$1^@%tBLmNY6NR+_7VBUXS1;n)}F=*8;{;=@At=r^ou1RTfV+j_*JCH-s- zDX72KefjPm&#=chT6dv^`~+6LeOvn%ftG9K$Nid^nz_OYgty2hLzc*dre+`LyMAa`o>ss#jfm!R&xf^8SN z$9dLv6!Qr9Kru8niN{YkunhIW8gzb)ktMZwPGPfv8a*z&6brc|+5A z=9_lxbr0K?>H}^WPM$CZU5**0s;b6Wwl>sp^@c4@TXr4X8kLm31^bq*d-$i2*M05N z-yblHf&VQs&tF~OyPoec*U;q0X1k^x_7+)Pxgl)x6Hs5YwR~_ z<+{xo^PLvOqmIR$y?Xyea&{59aHErAI1LQb@eIZNHTbR`8k-!mKfm%d>Jiy{qLjp^ z=M&VNcj*PyZF`PiFr~bO9?*85{nPa%!HvLG!J9o0Qy=8@der*0g-s74PE_4|lagIb zN?M;%45h%pK`)|wR8&z>iO|uTTcXc1s)gUGOf78ATRSXB@!J@qLHC_eTrc!-f4{Tm zEC)Vl8RWNa>d|v*=GJyxthZESj%L8&!rDyaW%rTddV>B(z=KwZG2NSjy!^yjGv%hC z7D-Z(mY6XWc{rA?k99uQGS=Qex(^0g3nZ}b(Fuo6$-tlAs;JEN)|+eSk6buYdh;1M zR@OrDs@o|iJAlC+xy`sN_M!cR<w`fQdzuokY1?<`Uq{D+xG8fbn;5Vk_$PMAkmlgE{(Pm<$XHP|Ni&mn@G?$(WCsWv7*$ zGavP(5`DXSe_jRIbG(FLPNlregI&2H#vl$1Hg4X&w)=9+yu#!5*y!pTY({Tiak}tW2L|U2(Yu^ZRJQqI*73A;a?L`H^q|iZ^h=@8+LL?vHjPC! z>`M(X20-ArBK8IlFU+MY(RW_%$?1(h_DxRJ-XUA}WRaq#hZMs(*q<@f7%(qcq5tcm z#`4d%Jn2HuAn*%GJ5@zcD+zc(&~M4P=Eom6*)xg7FqoX6@AS(H8O*^>OMHWP;6obL zev@DGGwOaG!8|}tUb;olf5^7I*=%0$F)Mx6d%qM*KMZ2X3p?b38G6Dp^uA`w!`w@^ z349_H>KDX`z_tLf5q_(Dsm=b+_r-u7Jd(@h8sqyBH8_=brQ?0frMrLJMxW@Rc|m!( zE8`5+P57q7JUO_U^iLR+l!V_4(^0SO&^s5c2n@4AuZk)cyez={c?WZ#Ag8>=cB{Lm&~|48!Z`U2r@WA3-V@QF0H`1$hhUhV(!P GBl;K8W%^M7 literal 0 HcmV?d00001 diff --git a/frontend/babel/babel-analysis.html b/frontend/babel/babel-analysis.html new file mode 100644 index 000000000..148e6d71e --- /dev/null +++ b/frontend/babel/babel-analysis.html @@ -0,0 +1,56 @@ + + + + + + babel原理分析 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/babel/babel-plugin-guide.html b/frontend/babel/babel-plugin-guide.html new file mode 100644 index 000000000..1de36f6a4 --- /dev/null +++ b/frontend/babel/babel-plugin-guide.html @@ -0,0 +1,56 @@ + + + + + + 使用Babel开发插件 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/babel/base.html b/frontend/babel/base.html new file mode 100644 index 000000000..3dd06f531 --- /dev/null +++ b/frontend/babel/base.html @@ -0,0 +1,61 @@ + + + + + + Babel基本使用 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/base.html b/frontend/base.html new file mode 100644 index 000000000..120cc0d28 --- /dev/null +++ b/frontend/base.html @@ -0,0 +1,56 @@ + + + + + + 前端知识体系 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/browser/base.html b/frontend/browser/base.html new file mode 100644 index 000000000..b02306d1b --- /dev/null +++ b/frontend/browser/base.html @@ -0,0 +1,56 @@ + + + + + + 现代浏览器架构 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/building-tool/base.html b/frontend/building-tool/base.html new file mode 100644 index 000000000..14b0a3927 --- /dev/null +++ b/frontend/building-tool/base.html @@ -0,0 +1,56 @@ + + + + + + 前端主流构建工具 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/canvas/base.html b/frontend/canvas/base.html new file mode 100644 index 000000000..c1fee585d --- /dev/null +++ b/frontend/canvas/base.html @@ -0,0 +1,123 @@ + + + + + + Canvas | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/canvas/magic-effects.html b/frontend/canvas/magic-effects.html new file mode 100644 index 000000000..56da1f4d8 --- /dev/null +++ b/frontend/canvas/magic-effects.html @@ -0,0 +1,56 @@ + + + + + + 使用canvas制作炫酷动画特效 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/cli/index.html b/frontend/cli/index.html new file mode 100644 index 000000000..f035f579c --- /dev/null +++ b/frontend/cli/index.html @@ -0,0 +1,56 @@ + + + + + + cli | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/compiler/index.html b/frontend/compiler/index.html new file mode 100644 index 000000000..58727066c --- /dev/null +++ b/frontend/compiler/index.html @@ -0,0 +1,56 @@ + + + + + + compiler | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/computer-network/arp-protocol.html b/frontend/computer-network/arp-protocol.html new file mode 100644 index 000000000..11a9257ea --- /dev/null +++ b/frontend/computer-network/arp-protocol.html @@ -0,0 +1,63 @@ + + + + + + ARP协议 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/computer-network/base.html b/frontend/computer-network/base.html new file mode 100644 index 000000000..590e4938d --- /dev/null +++ b/frontend/computer-network/base.html @@ -0,0 +1,56 @@ + + + + + + 计算机网络 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/computer-network/http-protocol.html b/frontend/computer-network/http-protocol.html new file mode 100644 index 000000000..338f237af --- /dev/null +++ b/frontend/computer-network/http-protocol.html @@ -0,0 +1,361 @@ + + + + + + HTTP协议及安全防范 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/computer-network/ip-protocol.html b/frontend/computer-network/ip-protocol.html new file mode 100644 index 000000000..e221fe542 --- /dev/null +++ b/frontend/computer-network/ip-protocol.html @@ -0,0 +1,59 @@ + + + + + + IP协议 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/computer-network/tcp-protocol.html b/frontend/computer-network/tcp-protocol.html new file mode 100644 index 000000000..a4f816bc1 --- /dev/null +++ b/frontend/computer-network/tcp-protocol.html @@ -0,0 +1,99 @@ + + + + + + TCP协议 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/debug-skill/base.html b/frontend/debug-skill/base.html new file mode 100644 index 000000000..e002870e9 --- /dev/null +++ b/frontend/debug-skill/base.html @@ -0,0 +1,209 @@ + + + + + + 前端调试技能指南 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/debug-skill/charles.html b/frontend/debug-skill/charles.html new file mode 100644 index 000000000..937d9c986 --- /dev/null +++ b/frontend/debug-skill/charles.html @@ -0,0 +1,56 @@ + + + + + + Charles抓包工具使用指南 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/debug-skill/chrome.html b/frontend/debug-skill/chrome.html new file mode 100644 index 000000000..6d9879d3c --- /dev/null +++ b/frontend/debug-skill/chrome.html @@ -0,0 +1,56 @@ + + + + + + Chrome | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/debug-skill/fiddler.html b/frontend/debug-skill/fiddler.html new file mode 100644 index 000000000..371d910a5 --- /dev/null +++ b/frontend/debug-skill/fiddler.html @@ -0,0 +1,79 @@ + + + + + + Fiddler抓包使用技巧 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/debug-skill/h5.html b/frontend/debug-skill/h5.html new file mode 100644 index 000000000..b391d2c66 --- /dev/null +++ b/frontend/debug-skill/h5.html @@ -0,0 +1,56 @@ + + + + + + H5 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/debug-skill/vscode.html b/frontend/debug-skill/vscode.html new file mode 100644 index 000000000..fad26bf32 --- /dev/null +++ b/frontend/debug-skill/vscode.html @@ -0,0 +1,56 @@ + + + + + + vscode | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/debug-skill/wireshark.html b/frontend/debug-skill/wireshark.html new file mode 100644 index 000000000..925228258 --- /dev/null +++ b/frontend/debug-skill/wireshark.html @@ -0,0 +1,95 @@ + + + + + + wireshark网络抓包工具使用教程 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/desktop-app/index.html b/frontend/desktop-app/index.html new file mode 100644 index 000000000..c76126910 --- /dev/null +++ b/frontend/desktop-app/index.html @@ -0,0 +1,56 @@ + + + + + + desktop app | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/editor/index.html b/frontend/editor/index.html new file mode 100644 index 000000000..a4716b601 --- /dev/null +++ b/frontend/editor/index.html @@ -0,0 +1,72 @@ + + + + + + 编辑器相关 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/flutter/base.html b/frontend/flutter/base.html new file mode 100644 index 000000000..c00462bca --- /dev/null +++ b/frontend/flutter/base.html @@ -0,0 +1,56 @@ + + + + + + flutter | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/hybrid-app/base.html b/frontend/hybrid-app/base.html new file mode 100644 index 000000000..604443174 --- /dev/null +++ b/frontend/hybrid-app/base.html @@ -0,0 +1,56 @@ + + + + + + 混合应用 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/async.html b/frontend/js/async.html new file mode 100644 index 000000000..033b5f7e5 --- /dev/null +++ b/frontend/js/async.html @@ -0,0 +1,59 @@ + + + + + + Javascript异步编程 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/audio.html b/frontend/js/audio.html new file mode 100644 index 000000000..c55a3e59a --- /dev/null +++ b/frontend/js/audio.html @@ -0,0 +1,56 @@ + + + + + + 音视频 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/base.html b/frontend/js/base.html new file mode 100644 index 000000000..1db473924 --- /dev/null +++ b/frontend/js/base.html @@ -0,0 +1,56 @@ + + + + + + 你不知道的Javascript | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/binary.html b/frontend/js/binary.html new file mode 100644 index 000000000..7a3c7b994 --- /dev/null +++ b/frontend/js/binary.html @@ -0,0 +1,299 @@ + + + + + + 走进前端二进制 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/eventloop.html b/frontend/js/eventloop.html new file mode 100644 index 000000000..654cbef54 --- /dev/null +++ b/frontend/js/eventloop.html @@ -0,0 +1,147 @@ + + + + + + EventLoop事件循环机制(浏览器和Node EventLoop) | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/implicit-conversion.html b/frontend/js/implicit-conversion.html new file mode 100644 index 000000000..416a50d10 --- /dev/null +++ b/frontend/js/implicit-conversion.html @@ -0,0 +1,230 @@ + + + + + + JS类型隐式转换与装箱拆箱 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/js-gc.html b/frontend/js/js-gc.html new file mode 100644 index 000000000..ed4b17190 --- /dev/null +++ b/frontend/js/js-gc.html @@ -0,0 +1,56 @@ + + + + + + JS垃圾回收机制 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/meta-coding.html b/frontend/js/meta-coding.html new file mode 100644 index 000000000..5b5b90417 --- /dev/null +++ b/frontend/js/meta-coding.html @@ -0,0 +1,56 @@ + + + + + + Javascript元编程 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/proto-inherit.html b/frontend/js/proto-inherit.html new file mode 100644 index 000000000..9dbe8ee0c --- /dev/null +++ b/frontend/js/proto-inherit.html @@ -0,0 +1,381 @@ + + + + + + 原型、原型链与继承(构造函数继承、组合继承、寄生组合式继承、class继承) | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/js/scope-closure.html b/frontend/js/scope-closure.html new file mode 100644 index 000000000..1dc5af508 --- /dev/null +++ b/frontend/js/scope-closure.html @@ -0,0 +1,137 @@ + + + + + + 作用域、执行上下文、作用域链和闭包 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/lowcoding/base.html b/frontend/lowcoding/base.html new file mode 100644 index 000000000..f33c361d1 --- /dev/null +++ b/frontend/lowcoding/base.html @@ -0,0 +1,56 @@ + + + + + + 低代码 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/micro-frontend/base.html b/frontend/micro-frontend/base.html new file mode 100644 index 000000000..b7421798d --- /dev/null +++ b/frontend/micro-frontend/base.html @@ -0,0 +1,56 @@ + + + + + + 微前端 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/micro-program/index.html b/frontend/micro-program/index.html new file mode 100644 index 000000000..ec0fb857d --- /dev/null +++ b/frontend/micro-program/index.html @@ -0,0 +1,56 @@ + + + + + + micro-program | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/monitor/base.html b/frontend/monitor/base.html new file mode 100644 index 000000000..9f1b1d732 --- /dev/null +++ b/frontend/monitor/base.html @@ -0,0 +1,56 @@ + + + + + + 前端监控系统 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/nestjs/base.html b/frontend/nestjs/base.html new file mode 100644 index 000000000..941c5d120 --- /dev/null +++ b/frontend/nestjs/base.html @@ -0,0 +1,1153 @@ + + + + + + NestJS基础教程 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/nestjs/mvc.html b/frontend/nestjs/mvc.html new file mode 100644 index 000000000..95063b1c2 --- /dev/null +++ b/frontend/nestjs/mvc.html @@ -0,0 +1,227 @@ + + + + + + Nest搭建WEB服务 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/nestjs/swagger.html b/frontend/nestjs/swagger.html new file mode 100644 index 000000000..4bbd9ccf7 --- /dev/null +++ b/frontend/nestjs/swagger.html @@ -0,0 +1,149 @@ + + + + + + Nest使用Swagger文档 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/nestjs/useful.html b/frontend/nestjs/useful.html new file mode 100644 index 000000000..9c2139e4f --- /dev/null +++ b/frontend/nestjs/useful.html @@ -0,0 +1,251 @@ + + + + + + Nest实用手册 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/nginx/base.html b/frontend/nginx/base.html new file mode 100644 index 000000000..8c5bd910d --- /dev/null +++ b/frontend/nginx/base.html @@ -0,0 +1,692 @@ + + + + + + Nginx使用手册 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/node-bff/index.html b/frontend/node-bff/index.html new file mode 100644 index 000000000..f10bb1245 --- /dev/null +++ b/frontend/node-bff/index.html @@ -0,0 +1,56 @@ + + + + + + node-bff | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/node-optimize/index.html b/frontend/node-optimize/index.html new file mode 100644 index 000000000..a03c36669 --- /dev/null +++ b/frontend/node-optimize/index.html @@ -0,0 +1,56 @@ + + + + + + node-optimize | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/node/base.html b/frontend/node/base.html new file mode 100644 index 000000000..42317e579 --- /dev/null +++ b/frontend/node/base.html @@ -0,0 +1,56 @@ + + + + + + NodeJS基本使用 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/node/node-debug.html b/frontend/node/node-debug.html new file mode 100644 index 000000000..2ee2c6d37 --- /dev/null +++ b/frontend/node/node-debug.html @@ -0,0 +1,56 @@ + + + + + + NodeJS调试技巧 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/node/node-framework.html b/frontend/node/node-framework.html new file mode 100644 index 000000000..d0fcc9256 --- /dev/null +++ b/frontend/node/node-framework.html @@ -0,0 +1,56 @@ + + + + + + NodeJS常见框架 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/node/node-measure.html b/frontend/node/node-measure.html new file mode 100644 index 000000000..738e3cf39 --- /dev/null +++ b/frontend/node/node-measure.html @@ -0,0 +1,56 @@ + + + + + + NodeJS性能优化 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/node/node-process.html b/frontend/node/node-process.html new file mode 100644 index 000000000..84bc1f4c8 --- /dev/null +++ b/frontend/node/node-process.html @@ -0,0 +1,56 @@ + + + + + + NodeJS多进程与多线程 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/node/node-web.html b/frontend/node/node-web.html new file mode 100644 index 000000000..8fb4e689a --- /dev/null +++ b/frontend/node/node-web.html @@ -0,0 +1,56 @@ + + + + + + NodeJS搭建web服务 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/npm/index.html b/frontend/npm/index.html new file mode 100644 index 000000000..4cd5f9f96 --- /dev/null +++ b/frontend/npm/index.html @@ -0,0 +1,56 @@ + + + + + + npm package | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/pattern/base.html b/frontend/pattern/base.html new file mode 100644 index 000000000..eb620a997 --- /dev/null +++ b/frontend/pattern/base.html @@ -0,0 +1,477 @@ + + + + + + 设计模式 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/base.html b/frontend/performance/base.html new file mode 100644 index 000000000..b9f999942 --- /dev/null +++ b/frontend/performance/base.html @@ -0,0 +1,56 @@ + + + + + + 前端性能优化 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/cache-perf.html b/frontend/performance/cache-perf.html new file mode 100644 index 000000000..3894085b3 --- /dev/null +++ b/frontend/performance/cache-perf.html @@ -0,0 +1,56 @@ + + + + + + 缓存优化 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/cache.html b/frontend/performance/cache.html new file mode 100644 index 000000000..e287dbd7f --- /dev/null +++ b/frontend/performance/cache.html @@ -0,0 +1,56 @@ + + + + + + 缓存策略 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/chunk-upload.html b/frontend/performance/chunk-upload.html new file mode 100644 index 000000000..7cab8eb0c --- /dev/null +++ b/frontend/performance/chunk-upload.html @@ -0,0 +1,399 @@ + + + + + + 如何实现大文件上传 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/load-perf.html b/frontend/performance/load-perf.html new file mode 100644 index 000000000..ccbf69e08 --- /dev/null +++ b/frontend/performance/load-perf.html @@ -0,0 +1,56 @@ + + + + + + 加载优化 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/network-perf.html b/frontend/performance/network-perf.html new file mode 100644 index 000000000..6255c57e1 --- /dev/null +++ b/frontend/performance/network-perf.html @@ -0,0 +1,56 @@ + + + + + + 网络优化 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/node-score.html b/frontend/performance/node-score.html new file mode 100644 index 000000000..cad7ee49c --- /dev/null +++ b/frontend/performance/node-score.html @@ -0,0 +1,56 @@ + + + + + + node性能评分指南 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/performance.html b/frontend/performance/performance.html new file mode 100644 index 000000000..ad4c61b4e --- /dev/null +++ b/frontend/performance/performance.html @@ -0,0 +1,56 @@ + + + + + + 使用Performance优化性能 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/range-download.html b/frontend/performance/range-download.html new file mode 100644 index 000000000..676f2f4cc --- /dev/null +++ b/frontend/performance/range-download.html @@ -0,0 +1,56 @@ + + + + + + 大文件下载 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/secure-perf.html b/frontend/performance/secure-perf.html new file mode 100644 index 000000000..f5aa97473 --- /dev/null +++ b/frontend/performance/secure-perf.html @@ -0,0 +1,56 @@ + + + + + + 安全优化 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/seo.html b/frontend/performance/seo.html new file mode 100644 index 000000000..3bc0ae8b1 --- /dev/null +++ b/frontend/performance/seo.html @@ -0,0 +1,56 @@ + + + + + + SEO优化 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/virtual-scroll-1.html b/frontend/performance/virtual-scroll-1.html new file mode 100644 index 000000000..7ea4c290a --- /dev/null +++ b/frontend/performance/virtual-scroll-1.html @@ -0,0 +1,56 @@ + + + + + + 虚拟滚动1 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/virtual-scroll-2.html b/frontend/performance/virtual-scroll-2.html new file mode 100644 index 000000000..b9c1a338b --- /dev/null +++ b/frontend/performance/virtual-scroll-2.html @@ -0,0 +1,56 @@ + + + + + + 虚拟滚动2 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/performance/web-score.html b/frontend/performance/web-score.html new file mode 100644 index 000000000..e695481cb --- /dev/null +++ b/frontend/performance/web-score.html @@ -0,0 +1,56 @@ + + + + + + web评分指南 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/base.html b/frontend/project-integration/base.html new file mode 100644 index 000000000..edef37dca --- /dev/null +++ b/frontend/project-integration/base.html @@ -0,0 +1,56 @@ + + + + + + 项目集成 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/build-tool.html b/frontend/project-integration/build-tool.html new file mode 100644 index 000000000..3fd1de938 --- /dev/null +++ b/frontend/project-integration/build-tool.html @@ -0,0 +1,59 @@ + + + + + + 项目集成之打包工具 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/choose-editor.html b/frontend/project-integration/choose-editor.html new file mode 100644 index 000000000..dd64812e8 --- /dev/null +++ b/frontend/project-integration/choose-editor.html @@ -0,0 +1,56 @@ + + + + + + 项目集成之编辑器 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/ci-pipeline.html b/frontend/project-integration/ci-pipeline.html new file mode 100644 index 000000000..2809b86e5 --- /dev/null +++ b/frontend/project-integration/ci-pipeline.html @@ -0,0 +1,56 @@ + + + + + + hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/debugger-skill.html b/frontend/project-integration/debugger-skill.html new file mode 100644 index 000000000..b0fc6690c --- /dev/null +++ b/frontend/project-integration/debugger-skill.html @@ -0,0 +1,56 @@ + + + + + + hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/deploy-specification.html b/frontend/project-integration/deploy-specification.html new file mode 100644 index 000000000..20ef74cf3 --- /dev/null +++ b/frontend/project-integration/deploy-specification.html @@ -0,0 +1,56 @@ + + + + + + hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/framework.html b/frontend/project-integration/framework.html new file mode 100644 index 000000000..951464fbf --- /dev/null +++ b/frontend/project-integration/framework.html @@ -0,0 +1,56 @@ + + + + + + 项目集成之框架选型 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/git-commit.html b/frontend/project-integration/git-commit.html new file mode 100644 index 000000000..636bb3791 --- /dev/null +++ b/frontend/project-integration/git-commit.html @@ -0,0 +1,254 @@ + + + + + + 项目集成之提交规范 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/monorepo.html b/frontend/project-integration/monorepo.html new file mode 100644 index 000000000..9fc82cd80 --- /dev/null +++ b/frontend/project-integration/monorepo.html @@ -0,0 +1,134 @@ + + + + + + 项目集成之Monorepo | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/specification.html b/frontend/project-integration/specification.html new file mode 100644 index 000000000..29fa29fbd --- /dev/null +++ b/frontend/project-integration/specification.html @@ -0,0 +1,150 @@ + + + + + + 项目集成之语法规范 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/style.html b/frontend/project-integration/style.html new file mode 100644 index 000000000..d216eb992 --- /dev/null +++ b/frontend/project-integration/style.html @@ -0,0 +1,190 @@ + + + + + + 项目集成之风格指南 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/project-integration/test-framework.html b/frontend/project-integration/test-framework.html new file mode 100644 index 000000000..b1febc1b4 --- /dev/null +++ b/frontend/project-integration/test-framework.html @@ -0,0 +1,457 @@ + + + + + + 前端自动化测试 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/react/index.html b/frontend/react/index.html new file mode 100644 index 000000000..5e98ae474 --- /dev/null +++ b/frontend/react/index.html @@ -0,0 +1,56 @@ + + + + + + react | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/regexp/base.html b/frontend/regexp/base.html new file mode 100644 index 000000000..3145e5501 --- /dev/null +++ b/frontend/regexp/base.html @@ -0,0 +1,222 @@ + + + + + + 正则表达式(RegExp) | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/render-mode/base.html b/frontend/render-mode/base.html new file mode 100644 index 000000000..5529363f3 --- /dev/null +++ b/frontend/render-mode/base.html @@ -0,0 +1,56 @@ + + + + + + 渲染模式 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/sandbox/index.html b/frontend/sandbox/index.html new file mode 100644 index 000000000..30e7a941a --- /dev/null +++ b/frontend/sandbox/index.html @@ -0,0 +1,56 @@ + + + + + + sandbox | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/ts/base.html b/frontend/ts/base.html new file mode 100644 index 000000000..45337b268 --- /dev/null +++ b/frontend/ts/base.html @@ -0,0 +1,86 @@ + + + + + + typescript | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/ts/ts-configure.html b/frontend/ts/ts-configure.html new file mode 100644 index 000000000..fed24787b --- /dev/null +++ b/frontend/ts/ts-configure.html @@ -0,0 +1,56 @@ + + + + + + Typescript配置文件 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/visual/index.html b/frontend/visual/index.html new file mode 100644 index 000000000..0183549f6 --- /dev/null +++ b/frontend/visual/index.html @@ -0,0 +1,56 @@ + + + + + + visual | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/component-render.html b/frontend/vue/component-render.html new file mode 100644 index 000000000..b8fa3311a --- /dev/null +++ b/frontend/vue/component-render.html @@ -0,0 +1,56 @@ + + + + + + Vue源码分析之组件创建 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/computed-watch.html b/frontend/vue/computed-watch.html new file mode 100644 index 000000000..72de7ff8e --- /dev/null +++ b/frontend/vue/computed-watch.html @@ -0,0 +1,822 @@ + + + + + + Vue源码分析之计算属性与侦听函数 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/pinia.html b/frontend/vue/pinia.html new file mode 100644 index 000000000..ba12ce3ee --- /dev/null +++ b/frontend/vue/pinia.html @@ -0,0 +1,56 @@ + + + + + + Pinia源码分析 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/reactivity.html b/frontend/vue/reactivity.html new file mode 100644 index 000000000..4aec5093c --- /dev/null +++ b/frontend/vue/reactivity.html @@ -0,0 +1,1159 @@ + + + + + + Vue源码分析之响应式原理 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/router.html b/frontend/vue/router.html new file mode 100644 index 000000000..aecaa2911 --- /dev/null +++ b/frontend/vue/router.html @@ -0,0 +1,56 @@ + + + + + + VueRouter源码分析 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/slot.html b/frontend/vue/slot.html new file mode 100644 index 000000000..6380c24e4 --- /dev/null +++ b/frontend/vue/slot.html @@ -0,0 +1,56 @@ + + + + + + Vue源码分析之插槽 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/template-compiler.html b/frontend/vue/template-compiler.html new file mode 100644 index 000000000..50d88a228 --- /dev/null +++ b/frontend/vue/template-compiler.html @@ -0,0 +1,70 @@ + + + + + + Vue源码分析之模板编译 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/transition.html b/frontend/vue/transition.html new file mode 100644 index 000000000..d377c4aee --- /dev/null +++ b/frontend/vue/transition.html @@ -0,0 +1,56 @@ + + + + + + Vue源码分析之过渡 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/update-process.html b/frontend/vue/update-process.html new file mode 100644 index 000000000..9bd5b5398 --- /dev/null +++ b/frontend/vue/update-process.html @@ -0,0 +1,56 @@ + + + + + + Vue源码分析之视图更新 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/vue/vuex.html b/frontend/vue/vuex.html new file mode 100644 index 000000000..33f6b10eb --- /dev/null +++ b/frontend/vue/vuex.html @@ -0,0 +1,56 @@ + + + + + + Vuex源码分析 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/wasm/base.html b/frontend/wasm/base.html new file mode 100644 index 000000000..2136fc47d --- /dev/null +++ b/frontend/wasm/base.html @@ -0,0 +1,56 @@ + + + + + + webassembly | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/webpack/base.html b/frontend/webpack/base.html new file mode 100644 index 000000000..37e1bd968 --- /dev/null +++ b/frontend/webpack/base.html @@ -0,0 +1,56 @@ + + + + + + webpack基本使用 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/webpack/webpack-analysis.html b/frontend/webpack/webpack-analysis.html new file mode 100644 index 000000000..c82b3ab04 --- /dev/null +++ b/frontend/webpack/webpack-analysis.html @@ -0,0 +1,56 @@ + + + + + + webpack原理分析 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/webpack/webpack-loader.html b/frontend/webpack/webpack-loader.html new file mode 100644 index 000000000..740c928cc --- /dev/null +++ b/frontend/webpack/webpack-loader.html @@ -0,0 +1,56 @@ + + + + + + webpack自定义loader | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/webpack/webpack-node.html b/frontend/webpack/webpack-node.html new file mode 100644 index 000000000..0d6fa679a --- /dev/null +++ b/frontend/webpack/webpack-node.html @@ -0,0 +1,56 @@ + + + + + + webpack结合nodejs使用 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend/webpack/webpack-plugin.html b/frontend/webpack/webpack-plugin.html new file mode 100644 index 000000000..6618f0007 --- /dev/null +++ b/frontend/webpack/webpack-plugin.html @@ -0,0 +1,56 @@ + + + + + + webpack自定义插件 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/base.html b/fullstack/base.html new file mode 100644 index 000000000..87d267c76 --- /dev/null +++ b/fullstack/base.html @@ -0,0 +1,56 @@ + + + + + + 全栈开发 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/docker/base-tutorial.html b/fullstack/docker/base-tutorial.html new file mode 100644 index 000000000..8955663e8 --- /dev/null +++ b/fullstack/docker/base-tutorial.html @@ -0,0 +1,168 @@ + + + + + + Docker基础教程 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/docker/docker-compose.html b/fullstack/docker/docker-compose.html new file mode 100644 index 000000000..7077a331d --- /dev/null +++ b/fullstack/docker/docker-compose.html @@ -0,0 +1,226 @@ + + + + + + 使用DockerCompose部署服务 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/docker/docker-repository.html b/fullstack/docker/docker-repository.html new file mode 100644 index 000000000..30ebf20b5 --- /dev/null +++ b/fullstack/docker/docker-repository.html @@ -0,0 +1,130 @@ + + + + + + 搭建docker私有仓库 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/docker/dockerfile.html b/fullstack/docker/dockerfile.html new file mode 100644 index 000000000..b6371c223 --- /dev/null +++ b/fullstack/docker/dockerfile.html @@ -0,0 +1,311 @@ + + + + + + 使用Dockerfile构建镜像 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/docker/install-configure.html b/fullstack/docker/install-configure.html new file mode 100644 index 000000000..3153dcc5b --- /dev/null +++ b/fullstack/docker/install-configure.html @@ -0,0 +1,132 @@ + + + + + + Docker安装与配置 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/docker/network.html b/fullstack/docker/network.html new file mode 100644 index 000000000..ea8e4ea5f --- /dev/null +++ b/fullstack/docker/network.html @@ -0,0 +1,114 @@ + + + + + + Docker网络原理 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/docker/npm-repository.html b/fullstack/docker/npm-repository.html new file mode 100644 index 000000000..3553af1a2 --- /dev/null +++ b/fullstack/docker/npm-repository.html @@ -0,0 +1,210 @@ + + + + + + 使用Docker搭建npm仓库 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/docker/volume-store.html b/fullstack/docker/volume-store.html new file mode 100644 index 000000000..571510fbd --- /dev/null +++ b/fullstack/docker/volume-store.html @@ -0,0 +1,76 @@ + + + + + + Docker数据卷与持久化 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/gitlab/gitlab-pipeline.html b/fullstack/gitlab/gitlab-pipeline.html new file mode 100644 index 000000000..5c448b646 --- /dev/null +++ b/fullstack/gitlab/gitlab-pipeline.html @@ -0,0 +1,319 @@ + + + + + + Gitlab流水线配置 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/gitlab/gitlab-runner-install-configure.html b/fullstack/gitlab/gitlab-runner-install-configure.html new file mode 100644 index 000000000..cfc10f830 --- /dev/null +++ b/fullstack/gitlab/gitlab-runner-install-configure.html @@ -0,0 +1,163 @@ + + + + + + Gitlab Runner安装与配置 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/gitlab/install-configure.html b/fullstack/gitlab/install-configure.html new file mode 100644 index 000000000..a5c27a6da --- /dev/null +++ b/fullstack/gitlab/install-configure.html @@ -0,0 +1,218 @@ + + + + + + GitLab安装与配置 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/gitlab/npm-repository.html b/fullstack/gitlab/npm-repository.html new file mode 100644 index 000000000..3bc2e2e43 --- /dev/null +++ b/fullstack/gitlab/npm-repository.html @@ -0,0 +1,189 @@ + + + + + + Gitlab搭建npm仓库 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/fullstack/k8s/base.html b/fullstack/k8s/base.html new file mode 100644 index 000000000..c71b0f06f --- /dev/null +++ b/fullstack/k8s/base.html @@ -0,0 +1,56 @@ + + + + + + 初识Kubernetes | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fullstack/k8s/install.html b/fullstack/k8s/install.html new file mode 100644 index 000000000..eb78479d2 --- /dev/null +++ b/fullstack/k8s/install.html @@ -0,0 +1,717 @@ + + + + + + 搭建k8s集群 | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 000000000..fcbdf4c03 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"article_2019_bind-call-apply.md":"EzG0_8Ly","article_2019_js-copy.md":"hrnH-GZy","article_2020_optimize-web-server.md":"b9Z54Q9U","article_2020_regexp-guide.md":"1Tud3eyA","article_2020_vscode-shortcut.md":"kzdDBCVW","article_2020_web-cache.md":"uI4_cM9P","frontend_computer-network_tcp-protocol.md":"cEUhzRKM","article_2021_performance-tools.md":"G4md1C7p","article_2021_pwa-app.md":"edqGSum2","article_2019_what-bfc.md":"tIBqKLqT","article_2021_ts-decorator.md":"XWu9IBvE","article_2021_vue-core-process.md":"ORz11p1q","article_2019_mysql-guide.md":"3wP7Sagt","frontend_babel_babel-analysis.md":"Z0deENoo","frontend_babel_babel-plugin-guide.md":"vF1b_R9m","frontend_babel_base.md":"t0-aK7-4","frontend_base.md":"36vRxAi8","frontend_browser_base.md":"v_UdQTA3","frontend_building-tool_base.md":"nIZ1pU9W","frontend_canvas_base.md":"u6xHSP1j","frontend_canvas_magic-effects.md":"Fkxa5tC4","frontend_cli_index.md":"qTzih6d4","frontend_compiler_index.md":"gB4W-5KQ","article_2019_js-type-transfer.md":"UKEkeSx-","article_2019_ktv-system.md":"ZlJWiM1B","article_2019_nvm-guide.md":"jatQbzh1","article_2020_webpack-guide.md":"zBMh8gpK","article_2021_flex-layout.md":"evpHdPM-","article_2019_css-center.md":"9vJJ7-ow","article_2019_promise.md":"5sNxqCYP","frontend_computer-network_http-protocol.md":"fxY3d9SH","frontend_computer-network_ip-protocol.md":"ZfcsangK","article_2021_vue-img-lazyload.md":"tKCHuRr8","article_2022_emoji-markup.md":"wvCnl86t","article_2020_domparser-xml.md":"uJdSS0gw","article_2021_js-pattern.md":"Qzh4S7uy","article_base.md":"BJwv0RtE","frontend_computer-network_arp-protocol.md":"oAtbXMJy","frontend_computer-network_base.md":"1bZNLudq","frontend_npm_index.md":"zxaDPdL6","frontend_debug-skill_charles.md":"cdOszKr5","frontend_debug-skill_base.md":"9fX9BAHb","frontend_debug-skill_chrome.md":"nkCU8h5d","frontend_debug-skill_fiddler.md":"07eSQgh_","frontend_debug-skill_h5.md":"GWeYJzVC","frontend_debug-skill_vscode.md":"s-HeTMf3","frontend_debug-skill_wireshark.md":"s-dRrpN9","frontend_flutter_base.md":"9KY5vMgx","frontend_hybrid-app_base.md":"hBB-XojM","frontend_js_async.md":"JY11OOTH","frontend_js_audio.md":"bjTod7Ut","frontend_js_base.md":"uTBw_pBH","frontend_js_binary.md":"kGIZY9pD","frontend_js_implicit-conversion.md":"s3K7bck7","frontend_js_js-gc.md":"AunbcRGq","frontend_js_proto-inherit.md":"I_l70cVG","frontend_js_meta-coding.md":"SJjED1Qn","frontend_js_scope-closure.md":"fqZFaNHm","frontend_lowcoding_base.md":"BKDSIX3v","frontend_micro-frontend_base.md":"50Wy2Q-k","frontend_micro-program_index.md":"xlVMmi6M","frontend_js_eventloop.md":"2QrpoMAr","frontend_editor_index.md":"_6kkOtxM","frontend_desktop-app_index.md":"efUgh7UD","frontend_monitor_base.md":"XPdYn5-o","fullstack_docker_docker-repository.md":"M30BRYPU","frontend_nestjs_useful.md":"qejIwuqb","frontend_nginx_base.md":"uaI9zQ4K","frontend_node-bff_index.md":"hRxjNnOC","frontend_node_base.md":"XlnRBo2L","frontend_node-optimize_index.md":"f6NvNEj-","frontend_pattern_base.md":"ESTX4J2k","frontend_node_node-measure.md":"K9kMWbHF","frontend_node_node-process.md":"nI0gQQIR","frontend_nestjs_swagger.md":"y4EL9kxL","frontend_node_node-web.md":"8gBO0zUa","frontend_vue_pinia.md":"LOFu5M5D","frontend_performance_base.md":"4_74TDRU","frontend_performance_cache-perf.md":"ztt0MTqt","frontend_performance_cache.md":"DWS86kiQ","frontend_performance_chunk-upload.md":"SxJaw511","frontend_performance_performance.md":"o6_aDciN","frontend_performance_range-download.md":"9tg7xUgK","frontend_performance_secure-perf.md":"xaV7lDmb","frontend_performance_seo.md":"QeValPBK","frontend_performance_virtual-scroll-1.md":"zLnkOlkp","frontend_performance_virtual-scroll-2.md":"Pm3KlSap","frontend_performance_web-score.md":"1Mfy9rMi","frontend_project-integration_base.md":"XekYSkMF","frontend_project-integration_build-tool.md":"3LVzvGhj","frontend_project-integration_choose-editor.md":"VGwstEOo","frontend_project-integration_ci-pipeline.md":"-exRgXJ0","frontend_project-integration_debugger-skill.md":"Zl33JS1r","frontend_project-integration_deploy-specification.md":"c1zXEw1q","frontend_project-integration_framework.md":"E07YI-v5","frontend_project-integration_git-commit.md":"UP0mr78M","frontend_nestjs_mvc.md":"Z5ZKRS9C","fullstack_k8s_base.md":"dtBawEqz","frontend_project-integration_monorepo.md":"oJ7L8XFu","frontend_project-integration_specification.md":"VgHGKirL","frontend_project-integration_style.md":"1DtJ1w1z","frontend_react_index.md":"vKjsadpH","frontend_regexp_base.md":"QEvSpxyK","frontend_render-mode_base.md":"NeCLWyST","frontend_sandbox_index.md":"Z9MoVJas","frontend_ts_base.md":"VMBqRDJo","frontend_nestjs_base.md":"J1ZEEYhI","frontend_performance_load-perf.md":"YgBKXjky","frontend_performance_network-perf.md":"dbc1c8R_","frontend_performance_node-score.md":"D9AUg7bg","frontend_visual_index.md":"m1fPrP2X","frontend_vue_component-render.md":"nhoAsokZ","frontend_vue_reactivity.md":"FuUuuTBh","frontend_vue_router.md":"avVg46Rr","frontend_vue_slot.md":"cV7NCWVx","frontend_vue_template-compiler.md":"eQe44ILX","frontend_vue_transition.md":"osm8ExKv","frontend_vue_update-process.md":"MkXMZBqr","frontend_vue_vuex.md":"ki4Nhn_g","frontend_wasm_base.md":"h0kzz92d","frontend_webpack_base.md":"ijd0DzJn","frontend_webpack_webpack-analysis.md":"0-mNgpgx","frontend_webpack_webpack-loader.md":"5SNt50qQ","frontend_webpack_webpack-node.md":"3SEUjomz","frontend_webpack_webpack-plugin.md":"9Iz9sFjv","fullstack_base.md":"vQ985qV_","fullstack_docker_base-tutorial.md":"HbViEf-l","fullstack_docker_docker-compose.md":"pk2z5mQl","fullstack_docker_dockerfile.md":"W4mEEOsy","fullstack_docker_install-configure.md":"76I1Z0j-","fullstack_docker_network.md":"k3FDmQ9F","fullstack_docker_npm-repository.md":"9jm80i0a","fullstack_docker_volume-store.md":"qcpOQfjk","fullstack_gitlab_gitlab-pipeline.md":"e1alnaT7","fullstack_gitlab_gitlab-runner-install-configure.md":"VVSd4_S0","fullstack_gitlab_install-configure.md":"RtybrUAQ","fullstack_k8s_install.md":"vfL3WVw3","index.md":"x6ZltWo2","me.md":"ZKkPBK0C","super-nav_index.md":"yGU0kMmW","talk_2023_dad-foot-injured.md":"HmqqvJLL","talk_2023_lose-qoo-job.md":"OMUrm0Ji","talk_2023_love-4th-anniversary.md":"yJuD2XUO","talk_2023_second-covid.md":"W7G-R6cY","talk_base.md":"GzyzggUv","frontend_ts_ts-configure.md":"p4gJph3L","frontend_project-integration_test-framework.md":"jZ4aPEv-","fullstack_gitlab_npm-repository.md":"0Y5cfoTu","frontend_node_node-debug.md":"PY_CCMV9","frontend_vue_computed-watch.md":"D5_gwArb","frontend_node_node-framework.md":"IA789WKd"} diff --git a/index.html b/index.html new file mode 100644 index 000000000..747e42ace --- /dev/null +++ b/index.html @@ -0,0 +1,56 @@ + + + + + + hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Skip to content

Hengshuai's blog

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..77fd94f7b62d6df17f4011a6d51605f1593d1a85 GIT binary patch literal 17741 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 Y0RA-}HY9L)0RR9107*qoM6N<$g2S4%q5uE@ literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 000000000..681820a5a --- /dev/null +++ b/manifest.json @@ -0,0 +1,26 @@ +{ + "name": "hengshuai's blog", + "short_name": "hengshuai's blog", + "description": "a progress blog app for sharing web development experiences...", + "icons": [ + { + "src": "https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "https://ihengshuai-demo1.oss-cn-beijing.aliyuncs.com/512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ], + "start_url": "https://blog.usword.cn?from=homescreen", + "display": "standalone", + "theme_color": "#747bff", + "background_color": "#747bff", + "orientation": "portrait", + "related_applications": [], + "prefer_related_applications": false +} diff --git a/me.html b/me.html new file mode 100644 index 000000000..53a83bf08 --- /dev/null +++ b/me.html @@ -0,0 +1,56 @@ + + + + + + 恒帅的博客(关于我) | hengshuai's blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/media/senbonzakura.mp3 b/media/senbonzakura.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4aa2bd5b3c1883845552c076ed70a883446b761c GIT binary patch literal 3169774 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�{?6qzIQZS& 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

%j~21_mF0|@5YLMtl9}D>77ut;cR*GLX zP)sa8w})@szNLBw8)EejnA)Hoa?I07`BC7<7?y^y~CK1Woxs%rz1DfnWP` zVu{BnJOi7qVJWBRo-N(QLt-jVJ$tMfE1w)mw>0WU{YiHqZ3W2yQOcRTzVgfNv*zD@ z$Ggv2Zg>FWP7PW-St^4xk(~-O6BX+=gb(Ic<@lN1xRY$mhN11BR|NwIWDq9A-k#uf;s9G?4>Peo4G)LuzclS?QT z3gQX#phNp@>*bi-bP$s%)7G}9zxRLOjG}<+ZN0i_Xh91+S~ygKzz5>R4tSE}zpi zND4Pw1a2H;BI4hajwj;Vw5)|BfbpJIi@zlz?CIX#Wt!Q-sVdeKpnhd^`ub-@V8Vsq z=_kv`)!{pYHZh@d_oo@TO`5gUh+a7KWF}La3+lOQciWLw#DBtOk&^PubJ>A zdW*Y{(fqAug&bc~R)N5w@l5gaMhxx@BQ{?-5F>RhIInE{Phkt9aGQhx8AKX^LRrGV zI`JqpR6WH8R?ZTc@H9;YBwj4elod0JANYNZZ6rW~hWSdQ`tL`=v``n*dT@2Vg@CAtbYixp4cfGX6OG1aEe%R@DJ;C1zfpME6rtm#c0j6(* zkvb(PLsey>1PEKe)Sj(dlIXRgTDgN}fs#;d1?77?=G-%yOwqG@|BTcgOLzf*vQnut zGce(Fc`N6Qicu>^ND;MxxpPzwxU*{a>iDvw<$k^#W|MTLCVGrj3DZh86$o0sZnH}E z9T|+M@}@~_MoF4m`NCS5JJ_X#oq>~qL+o&?eP=XMu;b+ig*#BC==L|)5T*q+wiEH% z7TI8VVier(`Zg4%AIpEQF@A^^Fr(X!!oeCoG0}L89EJ5q^baH^yV#2S%07EJe;K9N z;(U9D&^J(To|#^5fZ=b$l4>50UDvn<^M~q~6CX8fEcYMsWf<+BeO1!fG-;p$*uo7niYiy4 zq4x&H##@?}x&K^HwU5V9Xz9sQxjDo=sw<$8+)JAc28@{fw7O*!fXgm$jUSRSOv&Ir zd06+g;L@IG|1%vW5-VL$&bJ7CA?5t8mYM8sZL?I&{1+E892F%4+T3;=w>zx}`gT+dXMNB;u$7eF|i-Ob|BUC-&`W%9b< zvAC1-iK?>$aTq9KMRQEfH4Pqzd#1>*Efp~igP%+fPH9x5sxi{k74 z{y%lOO>`K!sfjTe|ClicgXB{_{scT~DUbS-5I2}J)-LyZ$cIOhUT^;(06;L^-uf~t zt%dM4$|rdo_ywHQUNXL6)HlA5Wg>Rwl7YJ?=v!M+T4PhoFE7vHga}Vx0B17wJ z29>g?_Uom{}vldue_--X|>NT`~Q*e%T`-na(cM*w(Pr*wVBO(M5 zRfHAWkiMgchRst|d>)rLWrS$Pn0z0?xuyI+ zLgPk4s+ox%qmz7+n*F7^W8|}hXG@}<$g>bDjFaM6k;{s8)z4(v55Z@M=l+1a_>KNE zyzx8HySl5AE3-7w@>e{#j1ftUynHZ{>&s!$ZIbLJZ7`X(l9NWh9X=DXoih@3Z<)1$ z);EG|NzCK}v1mhs(bxCuT!Qn42di>cekxvCG{EZf2`H8>6O5&%1Gnd{AbQS92a(u3 zM^HZAuEX!@tv(CX4!0_VjkAZv-{{hUPOp)8DXx#DmkHc&n_SuPKw!@;5XdT%McE+`xK4�nAF97ol=Hbq|YkG{{J}? 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
byAg&7lhFY!ppvM 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

Vh zJHlhp;S|5Q@UTh95!eDUAr;#X5o`6pv2HqA+$ zKLAEqAhmuO8OE~TD7oX*@Dnaqra{5hX^2iD7(*f$XnVR+Fq#uzy8f?`Tt`do5Y*0v z#^p+vk=%<%IVI?>skw@GVD00wqDL}2tylWvT&w@{#uH?Mo)%N>Un@zRCkVVGEJpV% zweD5&G*19LV4wunAO;C0SV4Co*AYR>tG40Suh#`X9>Vh9wR$eGycl?T-#FmQBu({; ztb}N(boE+9-KI6K3ZYOu!NX0;V6d+@0PyO{a%g)+PKHWoSZ%ISG)ERGd`UJyhqZY! z7#nc*faR);NrB={nyjlXhz5rRr!ov9qk@3}$CGanta2)D>F;Qc4-CXB@ZqUo27h-} zJPVh@6OGxn!TC8ZWsJ;1(7p}fs$7jlP$Q))0>v7;$zj%(ah z+hs}VqW2;`|HQu1aOVu8YwysA<=)vLY102~>>k?@P>)C+9Ykk!-#R|J?{5!vB)AcU z3PKD0bRctZr*E&;%(+F%F4(!olh}z-55UPQW)7~%yy{QFA@8qKsZ~P55gP+yc}kMB zt=sAOJ*lk*zDj?U84?OK(*gM~S=N}Tm7nl`ay3gp#(%EyMtbWZD3N4LTeth8h_^!6 z(~#x1MAE~Woa-^3G#4)0;T^xfz}KH#z9H4s%WA|yK{yhszuc`h9w~*=gEn5Ffxe2x ziL1O&WeQbrdhj#xI3M<`ApGH!ESpN?D*b?v{=aK7UCwOJ2qr}x@5R~RsIgyJ0rOs! zhkd^UKM8nC;6N+7oxTaiMo9+ zwzf>XZg*}wPe0`(Qo-_nKD5y&VHcAnBCSnBqhpKP&dfYRQ;h?O%oj6mdhF?f{n?aH zc>ZG?rGaQG?bYC}$iH}31@ID`ep>bQ-Lqu?tL1~n6oqi$Mp1jZ|6|Wlc^aZzEA7fJ z#rG%yBX;L=_9{xk@6=ylsRy#&gEo%;D}Dm&-#VY~&$7MJ2D!rEm-_@kUfff`S=ov) zz&dmw;+hovaqve(JQ^9+cUUw#Hl>KJvJNQ+k#M$bR1%o?@iJ%O3>$3Rj+QN%X58T) ztNsxMa5CjQg)82QQE+NWjU- zb(4t48^;eoHIjLTGcu{H`H>uB*(O87DDFXu@_hc5>=)2!AAZ5}e zT2L}MtFI$AtP6LL_y~jbjn3;^yV`-S@QXlT3N_NLnDlXIOcL~Ud@*w~oTv<;3ah|C zXUXK7Qx_&EF~2CLil;*6!E!(n)@FJFo0zN2zmz&+AxBhnQfi^-S^ARp@nQ(c(eP^C zpv3lGj5(&m9p|g7?xzU%Y_P0LzdWlM^bbBk9;%=>G^1*M;&;6DkbiP2N?6i~5aH`b$biQ@&f>A!Nu`%RA@Wf17%_OZu=UcKTtRMCkvq9LE@QCo(#ueoi+A z@FJ;}C(vUnqM9q+12!w(v3y0rkfhjOMx=rGqUuMTo{yf7UQg{4see7_q1jadJv;t= zYG1voqySi79xRFx0uxX73a+9_`!uc$c_=XiPS_!|uVhI=?GD`g(QO8C7JK0sU zBS`{zG#~L1{&f{CVh(xP81{r+24IAN=w+RK{o~JWNZ^ zQaR*6v?JhFL-Ot#4#kAk@#Mh~^=C~miN-8*k#wh8NM4TZ*8=@L?j-F!2rpGA#gafu z0(?%u!Syf=o3#@G5>!Rn2m80;OEWK zQ2nV1TUaWonE>5{3yxnxkCA}z{eSGmaO?aa8HerhTp!X=H9k*L(#U@>uDlo-ZMH6q zRd|i2KD*t;9EjqN;TYpvUS9+0G^5{xUoSPk#N_UjiC_vQ2K+xRcP~yhSbdK4qsWcy z-o$}8eNkf88Z_#&c1D)aDL*P-L~UKHH!%TzsK<#H0+EP0m{=SZV70fch3q)Los?}h z5%^4o4RfWa+|ola6+y0&=wGLyc*2nD+s86Owc_d7oq$)w117>RF=Y`(z7Y_5ZwXL5Z>sIxBH1S%Y42KyD77>ac&Q00jFB zomr8Ic3M~fE{~VhFx6L_g|HGW=U7I5CmW8OpIQxK_?FwHb#AP~7uVdX&7EZZ6nXpw zTGLSuN$VrdHj|fXig;1Fd7*_fk^9Y6-TSn5F_hHWPAU;i5^t;APIwrVyk0kyrl9!U zAL=e={N@zw!gdFK&roBQ9y==rdDUu*Up+akH8@M?+oSv!(Dw~`p=4SJPYGk=51))c zMkydSLE5Ci#WN<#t7o6<*u_E!|BLC2!!s^*dX^KU2&!N5b6vo>w;L*h$7vraDYBEkk@~FhNqYjM`;y%!(6+FZwB@VF}fw zuE79j0$Gy|Rt2AoD9Yl3ythL+rhgM~;(rj$AN=o}_ws7P;L_xyX`gH##Ch%R;7hbV z^z`}VVG6QwA{7n*WqtcNR5aN-!Jzj?XoZ^M(uYErBhNsL}1?Kd-n%_Is2|T=kBxj+G{=k!eMzkCb|CKDR&fy znrvW1%`bIfhDMbKwue%KI1PSDn-CgNKU94JBB?*-CXhY9vz+ZgsdSqU2>V7{G`^xzoJ0qNIHwA3EFGLf;6txbiA(Q2~eLp(2%Xb6H zB1aem)Ri)1C@v3v<{`_}BW@poy0gdwGl1wQ(TAar$v#qB5Fr#<0*y8U=j|WEU^q@! ziy9oUWLv>pp(*yE{SbUbT8p zJ&w$&-q55_KC3IiX18qkukE`%@CSI0yoo>(hmcir*eHbK2%LH#2<)N7wLPb(LF6!1YithL=ga+ zdKGnzYyKL_94fLZu7U!s%aN{+G%VE{u)gKDxx)xj4SDz;`9s@W-cMVG%(PhKJ}tmu zr@i~BUV%Q7x2qKRsH&w)Zvnh$-=Bcda0Aet**6JhYzF8+sbk#|A&xR(62XgxJO{C@ zL4_k<%zqGJtrzU{S=hP4z=v8@>EVnWaO4ctqtT~JN`LVvc$zX6ZCB8^OmZ;-RJ@$eAvn%I-A zpLWK7onc1S{tA1l{j71xBQVGP=MuP)t|CCf(m3jX!ys+}HjY4aYJ$;wL3wR%rRS$Z zSpwx$nIu_MB=0qHnb?Brw<}abhPK%#gXPN)q!=)b*~7JyrdH4Vpi$^*1{f@^MAXm3 z4FsX%J4}m1!mV`|_>bN$yla3B>G9|L`v19A749mhaJ@u9U?Y)ai4l2HZz8vLb z!MmLz0AQ0v&bNa@vV`;QEm{oe?I@uiq*aWRa*A~_hC>z{TZ0}MdNFEgiqf_ZaO<>- zd`5VO?mHLe@c+HuYm%If0Ao2qRs$rZv;92zzd1kIUNpJxOMFeJqxz`kOkB9KHSPgp z3N^mWgI~wcZOA{Ov8|`9U}RZ&{w`z5RPL)p(jUjM2DN04b3ReJqX&dQ%V{&6`67NJ zWtGjOO6MJ`45#0!-d-n}%y?Y&@l75J=;=FCzMBR=XHJmUH1x=`&**OY*$RK1Gz++W`fPDNECG4x=W*HpaHP1Q2(cb47=YIqNPcoV)LY3OEpXc_PjU z#t8Y{nx8pZdQ+Z4sOvNhlEq?GWSd8hV~_QGf7MkC&&MW;G2r;z5A;eZV4NQh8zLp| zblVrea}6MBDzApPy9O<{Mss9v$|0`zh0Gup(MJ{RLpjCd20Q%HqLl6i9dU^n6=mY) z9gt%UCxa2?d8yM(Y)d*f_5d@hWv%vqrr|2FCwbfdlr7m^X;1${CJ*_fIiq|0qi z(%Q$zq}724*|ieFNx4=*GS&+`(g1Oa>GTWxA5R)qy$@<@>j2_qNI4sY2E%5;q9g_b z%1fo~QZgJa+F|0PdK(4#SeopC2F^6i1n7RimIY^`g%CvfjKbGxx0Lmk;;THFC(gV# zl>Bv%Z)P-K1o}_8W#k1h@=S;FmpR1R+5sTW^Jt2xW}*rDDPWZ3NTe~M{>r^qH?8YC z8}AZI78kB!pmp8I1Z-lO<^YYYFVU4Uh~@;XL?6~|h%cz@U%|+$jB$YRvF)>fPI}s#t^HCWoRkIN-QO{S~IJh>(}SoC9=0aL8RhZm~RI{?RAnKX8uU5W%b@ zISNiNVSVo4f?<-#Zi#plcb0U8V)Yfp#L*^`aa1>oZR-k2%&IJF`)|tf<4+c9p_5RhC z>F;XWf>FnXZ0qcC3NEGGZH7j-d)t*0Bb}y3b9wn&@bnq`7#pDZR;5{uiveWgpJ8sIeC`SS!E@fz@+SN)t&lN;Eq6W0C^#-57hV1j=GU8e%_#o)*nf*Il}tt~g3= z_3M3=_45o$b(+Fyz2hI>-2VnYI-|We?)@8^Oh@{U<~FO20K7}TP~JsAuEk9Zad?z1 zTnoS1$0nrMt?GISbm=G2HPpu^Q7v@c)*~X>DOuG^5U_9adjipF>yGXFk z32CEtMDEgA)?xBDpPXn_8S#EOtb83>2(4)c=?sjLoyH86=!R;FZkVrjncmrJID6{+ z36Zo^+NP+aAI@NQ>8)EHS@6snM-yHe=Qtt6d8YL8%(>Pa!@(-MBteMde)j$EEawnZT4 zfBw}$zx>Pm^;YBSQN-#6mmdH?EPLZpBoKvB7_{*fR8FnWQvW@%^{nNVifK5^_|+x% z@yi5PqqGfK!bAf@9C;=w4tCJ0Y?o$Z3`XEmXx7-(vFma{go51t!zs55Fk`8GGsGd@ zvQqw@2r}BU^uYt()4t?(@))!BUoayiy@C9N-bgC-hf@w;HNtPIC z1kPl}wM0(nmY~&iP5&|8KZUf54_czu=#n8}WT$D$8{P5F6r4&c=Y`%>SdzVCx5@WE zkxRkPU&_sXxp@kZ>?}B=6_WKo!VT3@VB^8rsd=kYqdqC(?`FBSM|PegyqGnpXM>xc zR}r07$ra3<*^$Ga>pdSwwHo}LxWfS+liG2Lt|C-T!_)D4%%m~pXBlSkR1~3Z@cupj z&t-9aU(%KE>gXhzr`?7H%zyTe#=&W-n!_!D zMto{%8uGGKAURC5f?<&1F4+g*P-JVnv~%F0y%3FQfi8R3)-pF0Y}VVOh+Wc8^ID4aB)$EUMG>+;o-m+pP8Uq6=th3_FF{;k+S`v||G`+&-HNvc#0 zg8d&7NrbxhD3u`W`Wty@Dmv*XV3=cD4*&Av?syt?O zL-sBJwxhVxn~)s8OjQ_B(0KtdjfK2dKl!U*|k8-ctu z1|Zt~I53jP<{WigTP!WLQ!H14p0a}~28~$h&+cQ6DEX1tC}tABUxJo^XAqSikE6aZ z_MvIgb!TSDw|%LZJ2VziR+gX)BQa)b#dPyqWjTzc82Aq%sFH*@sQ>rKN!3y6!2Xac z&70m>8>Gvrq=CaJ1q}k|fY(=<`GF&)lqpFI{W=brV^@ilMi0`$VEXG797`YMh!4ka|JLWkiCYC%E^$JIW&>5DpHk)b1m(d6 z;bKktyj=G;Y?bsLUX|WKZ}~g+U(ENvY+wHgDd)s>_Q_e(H`jd*;~9KeHNqH)){Td zjXV2lXaC!4Li}ERt zB497lE=br9OUPVeR-zk*C~4bfk!b(S^iQ_HldWFwV*#SEtYCl(%ezJzBUGGxg&E@t zkIb&;B~CT8WA06Zb+r&FT#%;Okol}JfAjbOq5TviBG3iTTHAyz1dkMkaWgOJ zrc9I+j|EWhf~gfawPcDGW3{bI=q2?=J!zbgk^@yz9DC2$!?(XRz|8;wh{6~piwcPX zpt6G~csy{KIzK^FsRfFqGrN-{1_bBBKPSJj?)EkAn8*>}$C9+tBafF)AH)q9^64m; z@e*{XxS`Hi@0~Amee_@KrvLhYygDCwjmC9(L>)yr8z~Bx2E%US@Rr|S`4@O14d_Df zuI*v0;9s$*GwTEnBh9v&MW0bwLUVXDw-ATEqMP*MdOa(rRo5AVB6BOgyET#vQcrh5 zT@B>6I)#$aJbv);ed7WEoEb7>!R5wWBHOO+fdCRlLX_N4-L)V3Q2Rr_pZ3N+I8OqI zDi}{3mz1A1)Lpt4tfXBS$Z>NV43r(451s%(@0t_ArxXP}RXlWGt~gGUzxcQm1PX5(M575XCSPt^58p8ymA@IM zB|~#6JsQyMd)fIfx~{;FRE#hZF7klTDUK1H;%reU*M(v9cSrl3ij*8|125?_LLeQa zoR$PQ7zE5Ec+O59Yx@ZC*6k|pM~AT0FLlb@em-FCX5IXDr)y=AGZ#?C005|fgewA) z34z;7P(uXd@y^qQ;ISD+Y%e|-K)fch7{~deZp!)OWnXEeZa=1sig>Iln z0eGZ1+HmHi2`p;Cu!Rp@p?whQCQbwPG9G}ri9)T;?C5X&Lg-7R+I`ok4ZJaoB)l*p3zSv>s0G@g3r&w0{GM1- z+y<@MkI6nq=w^p5k?=4oNvY3kd=si4h)m)#Avwd_;u%+sB+F4Czi4~JyZ?nt`t<`i z_x1G1z54-B#;Rsrr9Xw=ij1L7DXV`pnoHj6s~Z9Icm7-)?|0*0drh3U?{Ybb#DGe7 zt9I=*fqFVWi^1+remmHd^4Lp>0nU`vyAvt;Scm@ScRlPU~ z^h4$q1Q;MhRsbQ4Aea^cB5kE?G`AZD(UOj?kM|rt9%6|lTF!4> zNptEp{jtzoiDQ$0RvYoK+JE|t^5Cf5&r5nWg|eD*zo<%U&WVLDsYN1ePZ?S4MxqrV z=XUDSg(1(g&G5(>3ET-v*$fwnRna<IN<9+Q^T3j^9_I`#Vh$o%xJ2_s z{`Sjw>i2GLAi92W68pbHF2-<8*PzJ!k&{+5Xl=7^k{ z-yBpGrhVC}MT;UYnPQuQ>jaO&1g1@}DLi+Qnhri#<5g(sHBTjg-t3*GHJT=sMvh zEH+E`5?^V7Kb0WAA-h;NO(E^?O-uf8)gR}4<<%C0PdGgMNoH`ziWw2RTzi9BwBw)IudsPTf>l}M|0rKqPljiXTX zbkF8lS0vc|JOm&lWxNu0_Scl$Mf>r1achzC9Enevabg@O;)^X$R=Ly?TqBF+KTkeR z+3T;vCj^QTbLZHax&sE%Q48yEJ6rmhh!}Dw>Ywz??bTvF?_TI;IE$kViorq52Q$5^hNpFsjvyJF%b?ujDCK$N0IA z7v%W1^gn&JicrtTCaIyZcT+k#zJ1eQOccBNf7rkaF@if~3Dh{o(2>KB(T&xlC`xFE zW*reqp46sBn3+iqs6{6g7k)~_QCi{nJ&e{jIQ=EipCiV-0?Gi}5XwSdxOaz z2V^*(LGZx???*>9G`{e8syZXV$n zrGy^4PMO3&zuOh7y@68w6oon7tUSvnKB|$Zc3%t3B=#=rMIo}CWqtR~gS(!gxATwl zm+(zyJCMChp(V5D=gq`>Uzq^x$kRviVpKJ_u<{)@ro6cFd3|1$<$%DjAPf1vh-ZqK z*0f2_jE+4mPkc&(cDFj5y38i;c&~$Ag6q9xdYQ}x%FMOELyEeJIn-4g#Y$uqq82Ce ziE&|y!aO9bR&3MU+RfPb^7a*2^v<&ZX{2gqPpTMu{Wq5 zf8UU5KImOI?WRGQb!Ljx$e~)yg`j4PZ0e`qx?byAvzP>)R%g_ZTzTe?f?+$R^dlt) zT%(mngDY9x;psoh7*FFFkSI!tI5H<+4_W5*!nBK!;AAdv9p*&M#}H zCqeGW;Qp%WtSb0bj&hAjbd$u=urWA=w9rr>9`9nOX;(ukXcU{JV%DO#Q#Mv*A%V*v z=)5*-ZcpH;V^1mVPh3ECq;vV*!~<6DNAyDTx+m&7L(srN-tBOxA|&wpr_zwVgyGlz zjT4n1hZsa?2j|P$gMk;1k+x%Dmi@1&l+H(HUIO|LI9L}ewCAFgRnet_-oCMHgpd+jDn#j{;r$eE zt4lnC$2OrV$6gvsXC!HZ@iUu0HNHC#%#3+hHi8W`9IvDDmt&a%J(X*!#WDIK+5f*?!Te zpTjP{mkl8$6{UN!rCZL^@+?M8?Ddbj3+6kOnf|NsoOW5n81Gev@1C|N$kMS@rMUhU zias=&b#SZFPE|LV+HO` z$Ny8tI!G8?(wV0Q)f9}F3m?1UbET|{8~p+;1yt}3aN}!;D%X&vW(I4m)7K{ovv;=a zzt@$(#mr`bYFPjsFppSMZz_ey`_(6o;&m%`(z%mFjbvh2XAPMxS+zPXbfY+@oJuZ! zLLHzw;0pO0f{(xaO?moJ=t$(6{|v60V^j<$|Cfj8knU<%T1z*?T`vHKMVSH@gfbyR zv0KfKR6iXS88ZP-VQ_ns(vQP z7_nNziCXZd!JET`HWw6}3F&p8H*kq@r=imqG{1?@Dt{ASu*%~jk>iz?1mQ(o$UpM{ z;BU93@`p*%VNE02Zqiedi77@vsv^y4akPR3pivr|%3BXM*Y2 z8^uHyFHe&0Bi-UVQIe#y z-+wIp-`cIlkc@13gY|p>m6VrJxm7Xg6AxK5Q=|n)k9h!bDQ2D6s3J4(3!VV@rv02D z#{}0uQJ$WDc_x&fsPFlticmFKXtbHe{{!gZPX-SG)(jEAi4#Ip_g<-j1c!@|YXmC+ zHByxU!H4Ip9y>}13BvxaPP?69SCf!X%iG}ifwv0!(zC$fU1O2g;j1WHE0Tq=@x*Ma zwtc)v_#J+6(FOhGj!K?_?*6c!NC1uj%_`;+McQ#k@y*Ng5CyUJM+IzPO-le>Ei2PYV|j&leJwewz# z84}%htEA<@YtFtWzR5kV`zqLzF#nN+VRkMzQFlCB3wp1+{vWZ{_R96Fnt3c~ zlWDkudXj6cpBl&0vT-}512474@zn^;<=d}c-yR+;^3_(PwGd)ie$Oe>x=~?$uYb>yN0pprb^LKDsZ14Vs586VT-qs^A{4F=S8Oao3I<<5|skE6&<2zA~sNd98P0rg6it>05b`)kt%qY{c#;Br`X z&g_;<6mlL$ow1H-vV7w{Y^*gZi{oPX{-n(H6ZanSE&{Y{FW8Pi!U6V9;z%7Z86g;8 zP?jJuMzv33OG7JFixDh!`rJ^4v;RW)>ywrIm?)`|y_@?1(uz;j%h^?LPi6VZ;@Ijp z)|Hx)r$4X9s*+~UDjvKonXi>Ic&()|?y|&Ujeb>(7O5q~^E;5l>w~ucj9Q8Kzfe+N z1)Gn7v6`5Xigl2La)?;&7DZjOta`A%2JcpV*(WGEa<@)qfpU$@_ZxZQwL$JOQC=vo%r2j-gwoIv00u>GrQ#t8ExjrqE&##Ae0 ze?!s_{Xl^eEy6aecdJ}hF_rT)vGYgZZLSzK{#FWC<aD>vr5d$-UOs?mrh7}= zVZovID?C`RpI{(HvoY|Iu60g;$9rWWBuU&I-*>*BS7kHXdM1?bK$;tFAMl-$)rkvH zVTEwE5L-~P%3vWHQK1?(Vsi;(&Q^8lchz_@9gUe`xwcYXY~%ndb_;~Qj(_e9KwK}w zB1tuxr`%|86wz!*Iy6Ox03%^0A*TNRGTH@BLZ_F^^vtNU>}A&dZWtkZ-Z`1HhrB|6 zq{d(@P$2(P8&+7xFq`{4MN$y;Y^Knj_bc^{!%CrOeSvIy5vKkJgw|7)Cgr{qY4DNA zMmOx*N4cf`r8m%FF@yiY_H?@_Bnky9@`g1I&!;YhsXq*cR`4l{ItDJl`?f7#ze8Rj z(E9)*7%z*Cu{>|oywRrv8&be&s87-_wfbpL(jF;Y9pOg!Kw`|L{CA?q)ovC3_C!-I zpOQ>nh$UNW++RL&XnUrdY`pX>bw~eQrpz8S?M3_QA(nI2DYNKf1uoL>m z`Alv6Mjqed-;-Bm=~}D+kYKWk`5L|hso*2{j0vMLtQuP7+C(pqN(FR`Kd@(q_<~p`?^-Whevm*(fEsYzUl0(ahaDH>@&B=+L6N zjMp+oISQLQZp6`6Qpe-*$Mc_^cPzgP%BYOFK;g8Qtyw?EjPrRw=ma`=COlj8RO(d6 zG0D-9AD-HzVe+e`osciZBQ?JKJ6Dw5k6}%6foz|@?B@(3W{)O3tWoaY_LCtDAKV*8SDWd40agt?GoH_sW65tT!} zKwMB!qE2LfQX66N{HQ3cNxHm#p`t3sD2he8C~RnyaIA76rsn~n!x$*b140HDhE8we zoi{yFoW*T+TN*R5X&d)0atePF1bod~s1+XFuk5rT@og4q*K&Z+XuGoj^@15MPFO4tQBv9gXrqCQ~)5U4yZC{SKD|#ol zq~tZll{#4Aw=S*OScKtbtRMi7XPidCz>#KVki@iuC~U%CD57YUU zSWz34jKN#R;MX6cS@Z3$|GOKM&;RW((Y6l<08kx?K-Ghqi5yQ+*kPh_r$CJqY1E!# zNmIEmPhqR1R8Dp<(GAiYy+i;NRLK~Yu}y~6KeW9svL7^KoDS2B#0(6nRp>fg54gJR zRL7?6wcy?Y1~a>Oo{Lu$4LH`+X!38Hrcs~097DrA4ULT?uv(A=*aGS6GBXFxD6J<$wSuU0NX7nC$sXxYq_82wV>{`TG(sm|PS!6*82yIHF%Pw>GVT2w2|L0j<8f@EV!vglGG-Ye zs?sWoyC^cQx);RdUj!1l0HCs!8(~$AL`A0LpQ)=0W<-_e7J}o2{HHOo+!WnxDSaI5 z`f9D$>NHpxG6b6?f6>HkGt8W({tZJ!{pt*Jxs+3B&*~l!T1i3OS2v*6<|C1c`G;lC zs-51cq3vyVICGWgx%a1vt2t)A){JnXbtlW?UHRKtA^-1l4{s1mvJC2{CXpE7#DqmF=WEZ@>>-CkEW271w6oS5vl) ztO^T=QgcN2+ri5?=I~5!m470^$FSQ(gdseG3Lwc!YuPU|iBhLxt&(b{g}`H5JhiR0 zUI-+n4O^9}>Q1lLMoR1z$CfQ=eUSBpnTTewF2K7f2Z`H_^w~5zf9l)HV~3gGYrYAKfgyJDvwfoZFqCBCOg|&nY zS^Uf=;EGWkwr=+3`s(+GrQr!k0x4H~oHVzjW$JTAR$S0x`8+SskCTy3YhnB1nX=mI zs~lmBcjc&H3WpSiptJ_JT4IhF7Y^Hd$-sycoFd(-uv=N#o7=W*^R*7239&YnYaZ-X z1yJyD{awn*HEy$+hz44#lSnv7NHhhjm=9hd!vo#v9}wEWGpv?2qSlkTkcT9V%EY;) z)q}ZQ%T*?K8YeEOwp~qV8J*Dk_k%FzePtZ|>)^)CoQOoy^8-obO%MwJoX4c1xvLX| z^f^^ul2MN-wf$h03TF1YMhK)CnJ@YfGfhFugtOR87RtA|8kw-8#y27qG!yqX7I^He zQJG*O#hF`+5)b_r&{qKY4HT}N{HU}}Fz4MPJ~BtX#f8?9Ffi*R0=pVz#y4_zRQ@^f zd#Xyoj&|IF?(LDn;K$yQzto}i&o)%3(b-=nMt|Y1&cB03Pf4}DJ;MimvL%=>eYnEo zsoba1u;aCm?Q`kvx0f<97Z;21pN%>7*9xou|$+tDVr)$1g7I+%vM_eLZuU2b;= zibj>sP=rKcLSCn}L=O{UMPjU_WZCUZ_Y=_Kb*nMZJQfaj^yIYTOjM#nZ`nAtvU@kp zf(GepSr6fS%G?~wt677n=up+>AN=o>L!dHBFMh!xx{!0!;x`O1BYXnzRLS`(c5Td(w@$g__+8 z!NUD9YJiY|L6jIyW=Bwtg$h+U$4;l{lPrl%Vyz=|)@ZEYB#dn*Bt^i6(o&3C366!F z>`gbvDT*hLnTW}>F3pZby4^qIVe6Vo>I4PLXT&v*e(kUHD<6{@^FRLU*lwxmxIOvo z9c{PAw}{{$g&pa>%#}-^vp9-O5LXnnk;-@iwTlZeBt~g)k^it}#4<}QY3r2%Cb4?x zE34f3NHttk`2@!vr?uaDa*YKVVwAfEUvQpRkDOOab^aJ_a+h;sVAgGvNdd$B7tpqeN~v9D zu2zeqlFpH)EuvWtvw-N)Dy7fFm$nZGZQ-H1%7Aq_(rl$zEh!le^XZnq>fURIv+n60 z*740rs5mE^$5)7{ti4PQPDlDz`8eX48|!Qa`gd!qMe|24@+kc+DkIRTC4+kc8R^yR zFHf-;iU)I~gz<-|&ia8){nGfY8>3oCBBe2LvZuyMa-wQA9apDKrn1tCd50l6&LK{Q zi5wUBDf%aO@T&vBdeOpAjU$NymmWccg{fPz_rB|P)gFn1oT?% zv^zr>mDnhRq-5Nfe(CQ;R^!IJ`;{V(;y-u+|Fxwqfn!Kj{foL-(O1=@_K;V#QJ?DP zuR%!xol5;{0tV!Pnz#l@ug+bs52lm-{$IB6VX!^wA>o7-H%C}1)i>Ll)OXLr#vQq* zJ=2|_(HrxYs7BG%#zfm{q>*uwPV=R9CcH$Onpo~Cjx$|jekM2Xz8cxd{?~^QJmfB% zM3Glq0JOSHk%fem?5RMeFcc6;85Cs~L@1t9WJ+Y6W+h_FkCRIowh#G}H8NvIqONQ` zPkq5k3Ep{ltY2^r9(>4#D3(tD`)?1$3`z;jzr$DD(v5DY1c@Z+I-IKBVC7Vr5WKNg z-CUfoRh0TyNA%=TTh(luY!VTkJL18wOv7~D!@?*AalNVc{)l))zW)8G^}|ZN?Z+QT z<@tegv1tw3&}3mC#}B}m6);PO4WyYBjGv|OIGXpRNRVPHkcy!ST(&aC4gGnpWM4Rc zZh}(IbEGbrO&)sqBEzssk^tZ{8;Hi~(07R~5Zcgd+Ds{C6pBh=R_`0P>l+cxsygJ5 zw}(%7X{!(TwRJ(hV4%0VTk@)j+MM-P!_na0{wgkvair{(;YAv}_T1=$;(BC^xyxeT z_=_Zk&r;fs_EzJkO{#&X6ro~VHYj}KX;;&)pMOV0(6 zShMrJr3}S9au(-e$XQnb?qOgvvmK>Iyd?j9BdaE`IMMkAHdW+@rLRfM+0xr$Ed9oQ zetjApQ-!C!qV3a1-%g7(xAx=*gw|6~?=(oeh$mTbRJf>9W0N zfV{X(!npt-c^+Rth$T8r3v_FzvGm5wK0qmkNMH%l0sSvK;_@e z2uq0kiKP1Hv3d?G3V0I}mUsgWE^*;TcUa`qNsxJvbNzM|LLaHgbdNnM%dRs;{VX9v z^FF1=%EFodZM}bDChgzAr#C9u?cOKeT}h0Sf`J|pcPTg<4@`yjg?)gOZ^3+klEXcs z8Lq1w)o2i2UM+MH{FQ0iFu1zk@Z8M>EB(D`rAEp(gK`fcQ!#Ssuj}yy@&+9|a0n-W z*tF9PBPM&o)VbaMVL8HU>j9xn7;2dTD3Z;at;A~aT_)Nh?TxthLw|@PhbtAdoQCR` zFu5ux;`<-y-KsCk#veBmHyb*0+{k^I2l&onlwm!IPm2Boc6w^yv96_wYF1K`kdppn zIU3``8=D+lR+tHYSLuaIRm{8{f85fkOy;E?ER@|K?$Gl75q_v$J#`qUN^pPKd(;V5 zTRULmV(9ohh0z2tj~}I?j~L??ijy4b6`rDSB)=xb$!Qh&S#9{>kX~Rsy z@lZA+MxwRS4?W&AAB=Gm9|CACtx%WP29p4oM9=5pB{p+LLT?5oHk-cnaRdds`zvyt z>K~jjj!u6BbjxF4)hOXPnhCV*A-2;LxU8*w)fyS8x>XhjzpAO;;F_NI-hiCHG>}@> z2?6yk771d27|iNt)F3?^GQi|5IG)6i^Oe52%&VCMh5VgVlkFH zJxIsL*Ip=S_pk|7qVt)n14aIVA$@iu*k2nO#|Wj2MMOn;dni~pX3LQ3Aw+_)2zdYxh<{jo=E%;{d5RBo{xjR&^Y&SE7yh{pahoL@We+Kdnre z(}0Z6JdU88N1o(GH{-^%Q8RQb!+)`(4>WDUC}2yRw#ppGV4Ss2C2I)b|K=E?c`|*y zWWxkf|H_=s(2{4Fm7T?jVj`2ehet&xdC;&QV=rck%rHyZsJBCf>yr+EZTX|Rmf`o_ zC2<9~1==$s_Dyk&q+t()#x=y3C{5!>Fg_7o<_1GYel7xcLxW!}*E6@c2WTlR{+45F zt%5T?+9uL{G1nY!z0&LBmZ`%7U*555`_Q~)zMZH@@V&FHja9UP;1b(=IR}6E>np?Oed{5rS!2l+xN`}BF%5A+QhM`x2`*gLPwQ$C8$Gnq&LQd<&<635R zm7H24H)Y`4eM1>I{!-83gw75bWEN1KKu^sW5KoP(bvr=5f@CGaKeoU^pJzTX%f=ZY zN>JBGapNejd8(%@(JsO2H=LC0q4U^TzU6zdxy`HVzb_4&6b*keZR4?AlrZw%-zSZ3 zITaFPrQe6g(zH8Sjc$opBjE@vicHe}y+d?(SlYLtb*Wy86ZOWG?7{xX66GLv5+W|l zL`xI3NPn{|jeq!D-^zsA?=->2a+!*(O8`cKvg@Rx#(J*{G>(_VWeA&hmIlZut6DIHk2p3}F zQ(!zy{mPV79#t?Bx`!?FBSE-Q8>A_ak;rdy<=O8`ryena`hR)^pOZaFE((e1=uktx zk`Td;<>4`ZAX#G-a|Ms%DRQI zUl;T)7hR$89Fl%YKt;u>Ad$|GsTr@XPWkr&$(-2gZdJaM%u&yQ2PKW=V< z)1ypC<#YEd$*IL>oc-y#cHO4T8xdUIzL(otJ3V>x<~!X;Bul2bTKy;!3+S;FnSoIM z!FM}j{3A(qcE&5^_Llc^o?xbnLO4GgvBka7SUxOwC$2}`9D$Ncr5yT#iCmz zcJKY!mVQ!WyQ3rV$isY>(-|JAg4SnhPjUiT$B9gka{9TSAG{77%|g>b%4xa3spX}e zV6J$o($AaBD+zwpvwL6m&$gR4@lq+LFTn%XWJ&5Gh*m2LX$DT1G(ZT>pJt?R$!Bxu zh5QsUi$`xsds?>DIPi*fxnsBO+nlBLB3&X&^+&b8H>Q8LreEETCes_5*%2eg5)aDe znwi0`E%*c@kN(I5z+;03HW_C(@*GM8G(pKWrRBX#IXpy4d9mT2~?;&G!3$ZbS z@uV0^^1okIU{o!U)K-*JvR{QPaQ7B`T!-6W{Ce5i!$|dolY-b-X#viH_ccd%H`b@EZeOqOpceI} z_||^$TAHh{bsF)c$F%qHy5Zj_)Rxy&~wcCbW@8QcRUwPw4;tQlxA<^bMA9PQDc1MemD)S4u0W z`+ljPh@;$W>f2}!2w z`WAxBh~0>~o#@N4idEXqO~+sCXO)mXsDvJej}wB+F;cy}?mdvy)L^qKhMrW!hfqG8&b>-wqbicj zPr)VfXw=EYkgn_sQ$8CbeX4Fxm?ZV$EMbi9i7gF<&b%}_v$O%;mJslM@p~}!m({Rp zix(jw?Pj9@X?n+-v(FPWTWMw7oU39R{D=%J?T*MB`JmgCMPaSucd%amWoCVavvK`C z!h193DFGok1Tdy#OF(F7Z|fZQ!P#aua>osA$WYAa{xnn!b)_h)1hc}(n8h=eg8@yR zqi{QYjGvfSL+AzRSAHz}z)YRze06E#cePVo$^pws{7lwjLbBNpyMXB&XKrarnK)bu z^**=c`_|m%7tW5Jmni^Pup~l(Gre6`Jz9B@P1G`m7oF`h(!1lF4>~N;JR20#Lo_yBcd%k4(hUxwfp)Kqo2}Elf;TfZjs3F@Ev!vk#P4}MP`2M)HIE7Mn z3Gbzo%xL;o`~r(1I)rF9zoD>&qT^7Wn-9-F9V% zc@Ob&Sz4{N7I)e=82BF->z4H;C&t9PrL=V!TJuit@_N2A*%lTaUY;CYhFbN7A8=18 zLFsh`#t|}8GX=0d5s@rj&A_gRZgHjx* z&Ol@t$#%&hzJc?AfEt|_-M&ENr0I)nvA?0W_nY?xcknx&#q|(F4|xD=0gK$S>h}eH z+Auk(jg#@>t6u;}IB%L8ryU3`ApB`sd4=UD0(r^&i!DS)vtg*QK}6wy=p!NJ&PcSQH(VuHPY;GYd_~y^23rZ z^GtS*1e4^=6)^InW!Q`Rx8Ad3Ik)8DZr-d^xyu4FgQf1t@jHRis`g9qUtYdZ9YrYpt$p-;KBvS)S1FGP zK(yr>juR=7G_sD)7^s?WJ1+|gGP{^rM1u%KlYqf*>L*sMw59TpVDDJilR$y$Vl>kD z`Ccy%ABvLSMEkKKJZly~U%Z}vecwB>me3Dsbs~`kn`{BUm@rFjoWi+AG|K##QhqeQ zp>M;C2vAnHGO#2*V@Wh(LI1=Gky9?LV{4L{fFo`|@aw8jWn6@a2)Trvp0{6h6^uj> z-VZLv`+tsbNmcH9d8fial27AfJ%UJwAPqAj^|Rvg;w2Jo;Af-6po%2r z2h!WxPuB|CS=`K)+#K`^T7nh2IEk!wPcR1aY8 zoZchlm;dHaE6JVy%r8Ipb;2;d@@vH9eDD^+$Bb(ip1_SC)lTbh7l}2BM3C!;?C>6% zO7#;Ezz#Q=D8T;Dp>Z$S5J~DwLB9T$bOd{=RD?x3a4YZWe%il)<@)W0DIS=9tr!^g zk;!adO`j4I1_^|S{f3Y;n|qW9x1>}M41EP)j*1VpHcY%Ga(XGK>SPx|(@dHz{KJE# z2LA4LSUVaR0vT0_@smR7@|^~EiXsYN<^}HxyLJ4Jx%4iVWV`@v&8XtE*fcUd zCBg-m)t^n7x7qHoA{BjhtR%|BzmT@{-CZW|-tCYdx|KEKT|qh~k{NG&dtv~9xZeiVrUD(E+1{oT&~#EAC?6OF7-6#ZwD#aI%|U%$ zT3ZFm5<^!!mw&6=LL!l?;4EQ*zMr6i*`XAJGafObak{H9`!m(edR_2)?u-(s=o zYIx)-+Rn8Pwcy)`Pbz^C_n}7u49mCgx{l=|`+*D?U__2B*mbCkJ#rDxinY_g-Y~Jo zSIf?sJA{)aUrxU^rap--V}VY2nHV9iu=VI#b(X)UsI=KSB6J9P8f9?HI|ES@;O-sGhfQHcIYc39!Nln^QQ4r;a zXMWF)P(R9>Yy{WxFznK}X5Ze!4}`oVLjC9Sjx3uL%eH&9wJ6`N(#O{lpsV!&REF;z z-IJ21?J+ngX$LWAX&H8Zf5$qU87OyReCiMw29){(os^k(5c zv=EUvorG%xW>|%x12M@dEuTgWz^u8@DrC@91vcuu1*}s9@%K!>7|3la3|qF*qS3_U z`rsJ{D@dubxBWxtD>5>%)Eq@Vhqt66`H?M$Q_=?xgHwbk*dLw~x zE3F&}4eByy1!I5g{kZ{vr$3Y3WY$PB5(#_c6w=|cq;{>Q8z&l2o%I zm;V%iyiW>VDDrH|6zzM8SdI^nd0}Dxz;RsGO3sUzXv5HdQQB|d%F-qb_D>WiqD9RU z64VZS7VRhy8I^A-wzzhSbPjAjG0?q}rC<5`-TwYUEq-{F=nign$>f=I<@>kn$gnn^8#ufii+r~_^5%m*>ksW4`aN!aq2M}Y`r}L(mUd;CyDRVA zT45V6Au+uKXXHPGHWHBrWacU4rQ76p3b<@zl~d5C5TW22{SUZqR5>O02IplWx!?QD zFMcZWmL-d*9Ox!0G<=*s$aP%%v$j!|r!PoL3)2XfmFKGx==eShWA{Qb4y3QU-~Y0D zSR?4>v*6B*L8TZ~hsTslx}kH>U8P)+dQ&T~vHH}slwQ28L}*QjhLDOBxajp0qku~V zhFB?Zarr1{0XJrzZ8>mRq9K!j_3rEs$r|M%zJ3@=7PFCvZVk{=R^zkH-q7{Zy_tMy za)7(RRg|3$@9~LBMyxz6UfJlGSkR{q%HE!ogR@d(UFk@Cs?mECR4EJ1uR5p+?~XnI z905%bggu@#7o&-2@;y6C-rCrlP`g!H__86|*LQO6>Bj*_nUgMu zc+M_qQNgLCR%xjB1E3&}ZM~_?cBxVku*@o(qkv89x6(p@lcU=KG0y zCVKDnc`SY9`|W=S{Y*yE=Ubo<7xz=CJjS%$*GaaRQub(WPxBzH-H0Zcd=_~5v?jJ> zB=Px*KmiPms(RU&VR%@nT5`y1XG5!9G*w+E>dy*G4}AwyG9>9S%m_xSRnyocFzn_%~G2|n{D-5)bn zd8D&B=ROhsySuhlvAX6uR0aSHoqMB=0yHP>OPwg?flzTh7%NN{Z+JLy5sxSsg?Em4 zYp*|GN*VA|qD01kr^4JCl=Uoiu1pz4HxKU7+XVlFIUa&WzsE z%-;_l)uB5|PZJ?m3X~UP72TW&RTF^fQ6isNhoOlS&M+&?mfFBAn2dZ0wg=lxQI)u{ zHZ<9}^L)cJe;g1} zwE6JLEI;#mCM|$#-3q}7Px z_|?n8UXz;5KlzbNpNcw+eO(7Sg2Fd$t7jlGI+=u&n|K88&ZLE0=NUq*e)K7Nm6WM( zQY~mSk!*kab;g?wFzKA@e4VbtR1=O--W8jy8#0*lNm2xF2$STm=sYvnqx-3wGK{yqi+ z28cL*ETo^69hgE=FXQy_0Gy}vy*-*`si$uvG#wf~#j)ij*8=&;BLrbpa^%G;#B;%m z+iIq+TfhGybOs=!tLRc726$!>bqa1gj7eM^dZ!5ACAKW~jmT^>5f>}J-(pyK3{}Z& z%0_*CH~a9Vh-eDM->9mc8Pd$040;y2uqJZpPcoXao24?=*Hp{w<00r^WE;Q)BPg>u zm56~EE9}^BbC<1HUpaFe%UB+tRLM7&^;m-h6H~OqD7suxyGa~5jo*iW&uW*zNX#5w zBQiXe%{(uQj#Pj`gqcirSIm%EwRHm~bw*O8izQ-KFsx^M!Yz>PE$I|=ESF*St=jpJ zZz;J`TBfBsKHaY$|7=*fP(5qV#=Y^#w>q)+&>5J_owET{=3Mo4GmK}vhJ_`>Ty+Ui!c$ldGWbKIl2aKomc^-X5wZn|yq@ku5pbpYCcz=Z_5TgfW zCem5U_{E}fPC$r?SSeFou;oNn z7eD^_zl?Pcj7+UQTM)?Mr^FavZ5!p9w7~||tY}Y#XLGtlW>sCC{8GVg2KZ9{j=FJG zmIr))XyrfNh(j~K-IGm6BOQ(sL$;A%sfS-eH$97w-LP1550z>ib7oV4X@GE1jBXox z$2(mlA2zieIUpRSKs)BM9@IFsvrJ>6A7J(1OCTr{%`m_fS=Q{X5sJOkm-8W1=5E*H z4j=xfoSx$9+@=t~G)ER^Hsy0gc}6USrff?zxSa2d3Bq!97mUpvngBTs9-1|L(XOc6 zNEPH&6Y)$Qc4DPv3h->^+Dsl}=Y}w>9$fdA>)eDlT;F}uB)#=qB=ky@uv3L0yvImKCT)sMe7tbg&HbsFrbT3-B*cpYoKF^U=w3}Rdmi~q-}sEHl_Bj` zkG)`4uS%VwX3k0oRf$m9-3ylVsL2c+Fn)trQxMu31W~~dAqr2D$cIRlRuRudrTq+g z*TtNI%wVvWRyd^DXxSen%axv<8pzVhkEnf|5iSv7pF*0N;P;>rbu}k{r`D#*= zUb^UCzp)-4SvFuuuVPXXNu@+FXJlB8xbC7H}F#|A}{zX!*&Dt$`||) z-4Bq79$M~L05}Ier*@yQGgO*ZM5D01CR*|9Nvz}bJf}HiuO_6Fo-i+txz4()p$tDW zI)%K}y8Va6zvsFR(Mbs7!WK`u#Qq6<3nLL=7t)l)D8WdD4%%6_4~!-!`Gkcb8@OzZ zCLBo-QHzs(pFF?<6m7@Xvwvk_ip@D;bNYQSNWn%%7tMYCxjT(b{h^RLxkEx839#$BiwT*tM(uhm^2gxt`)%8LzVUg(2txo7@c^ zp3J_BCPNzQi1&L$NMP%VLojKn;}HyYfX&`@{=fu>=w1Pc0#4QAb)PMnOvUzi*H{Xt zlK6$aN}`xL>JzaHZ<?Px#A4Lilj_t}l*98nW$Wan@UJ~&dhpW8vcst0aDv|)! z5o#9d+k?7%4WEJ-4*cDyE7vZ^DY0iV7UYL10FiV9(BVt_y&K4d;(zb+PnZ zKzQK^mA|Z`ZrCoR<=CP9&Uni6&b+9C4IXAlp;MCc^S@6>yd5{$uyo!q^8Q2UIMRSk zd5(gUJ5pt+PT%%KJE`RJzv)BjB@V*>uabWUL(6KnUJAPcKmRyXV20UC6R%pCmzLHM z;VCi>2BE!wP5>RAU`0e}fzLDO2}>fNgu41kC~Kmc(Nhb%oIx-2E3Dmy4F zTqD6QY3PXcDHH6P%*2`arpJfFWM}z`L@m}Y2}Q`CJ9nC6LZ$g z$^1y7$yk_k|dc^Oxz^aUjkT?Y|m2!yXpq*P}3@ z@KcFow|CsON@arTc|f|LNH|AY(UM1ZlJRAiAgkWff!7H`>0N}YM)l|rhtp~gq50%@ zVPT8b@Vg&Fh@73sbX~Mpe)WjKn_eK{`i(S4zrNSFcEgvNxmO0j}`IEs2t+iouI${k}@=zwHRV9BwD^}cX zyRW#ws!e;50jBV*dr9(3qpI@6<9p;jHs*X|_j9NAi^x_g)SV3#8Th1nav!{Pwk>E* zO}VP5W}n=5}6W4cYltgj5%m#S@Wi+F>%D> z3etAz_}WT7FnUGHHytZ2Agc!>P7Ru+q=|Sh{j?Y+#wTm7x0h} z3D~>d+tQn*U9%~A?3@nZrPSfXw1jIY@ek`=tB`!?GiJZ3yB2fbe9}=VosnU`>x2JT zfWjYtt(!cJVrY?fL}Fj}G7}qdlY`1KzP%Sp^kxU&{;>FC=vGKP{M$k8`!DxvA^? zyls)ZJl_Zz-L9gJ{g%%i$G$HsDO$w57get{PwDQb`ijntmuTpuLWn)YB}vDBIJV@e zfcqi#jpDRR32VXUdag6!-&WUPK5+MO6Z2{7TGB90 zJPf|~V(AU%SuPE=n5jI}Wx!z1Xn%!Hy{8kIQD$0E+@ZoCv7ew5CiO@S>OC1&-RMx^ zK3^E$1}T{M_I34^3W8~hT~=Fx2`T)ksaZ0?JOfG-A4iL$Op9hLhoRVg(uGVCBIkPQ z-dP<8enernLAm1*J@`gYZbocygP+vdTW3t{?$R{{nR-f@Wwffl{)f;{T%=4Lg!DnG zLQ27P+4clCRfr2gIc=OHNv>1NDHX?$u`t8(b~1Ff(&SIF+CV9mTeoWJ;3=+$`ldt| z^%cX7;7>2TSQqs9h!!sLoOuCuUZj_N#3jAI!He&@oQ09Sa}qAvioLH>VzMRk7}d}! z9BPotCpb{Q$gLy4J0p4*L#Qya&2-#4^7s230qd!^NDnv=*@7Wm&OWQS#~?A9_Tse?gIt@c@g*au=E`oshFu z3dIgM5fjtp0-$$y?zwW1^Y5 z+A~IzWP?NfI>bvLv;ylR{QwgyRz~g|z}kal25Y60614TP7q&2kK@V)Z@iCWxaGF1z zv93vU<;m&pZ6Xy@MuO_7@sy|;js}X}b{vM$7jIb)RBedJG;=Il`sPmK_rJ2pp>baFhV2Ynl&`)ntpuE1ntK8(Q>ut;ztky>+VjLYfo5xU zWSCtGSI|^ve!3d27ki0i#y9k+y+)+tZi6DKpEsXuB~GmWL+C8>XONCjH#V1`5kuF% z8EcBE1cFIYKc|W?yvV82I|(oR8*A(CjFk7(*m{ElheHI&sqs*LEETGEg+9P#A&3C4 z6;gZT=h*t^!Qnnpjnt$=%?Ic?7!@G(Jq}8w^{2a^$VP3t=JH+?!Tru-ki!K}U!{t!KvZLpy|F`B!Z+I(Bpg}?g!{Q{ z5fdqjXr{9RZLH|n7m~OHavBKjSdGg7-e;+r&pBLtfKto$TB}1we%OAV+d95F%G`K& zmeTZ(u0KPw&zvx1o(yWvDECQ>7G2=*5-<2)^w~(~I_twMYgvF2r7X3buR5wYCoF;5 zK{bRC>S#Oh;v=d&QyX6G!B-{&h@P|B zExpj~x!$~chWMxl891W7fEa>fb?eoXF{c9<;pFI&E^dakb)VX3Yu0&qxuoAviSVwH zj}chZ6E2J#eSBS=l>VJw&^rj#oLxc#r6D4YygmINU2Zoq!cqMz1rPg`5`*iQRGe9A zh=`(x!|9wd!qx|2c!7zAiqx$)v`O#^UP>(7Zb-)utDsE6hHpEPSX#rKPmbh{Bp#LE zeDHe_#93P)9>dJMj4lCnHTh_8_Q&q9jZhzX(W)=`h=h4|t3OQ%PF5i5t zg2uwEe`MLx#`K?CKvg*zzT4^wzb{_8go{R8b0Jo$*RL~n>#U|MD`VH#QKqkkD8qHw zE~>4;oaNmOTRGu%(pf=N}5>K~mtK>Y>-*mYNM+7H;jNTArb}uw; z3^{`IWh4VF7ZKEI#oF@qw3upc3wAK~)sTQ#lDw+D~s6mxEz9ZS4u!)MrsZ-y>@Vo@9V zqF;`W%{QIXSs*0(r7dbu%=Ousmk#_0Kt3%c)5c48fDjOen+Pi7R_^~bjEyWc z7~keI(SE5WxKdtkCl!_Yv9djrdqOBnf30FxD=p2dx+n0gW%}ljb>Ug-#q%^7_~~8M zy6nI^xQE7ftu6{?*bwhyk*gaqt%)jv%f5Maij|~|cU>Khx=^~*`@nhoj{j`(`{$o_ zx?kUMo!Ca@MgKb4eY4;X*N{8g-zAUW@XVHW^#6y@E-b=S&7hly;7V(ce9V?UFq!tV zw!7riTt*>+rce~T(}cVH3H^RNJyJkA4?nYQE=5%C#m)fonw}p&iH|^32Kp!X2^g_q zb}Bg1XpRog>95$8*WTpH+7+o7@M$0HLs^@? zxSM|7`7<&vwE8uk*)Qx1ui(02v43eA%HFqXt+W}Oy|SM-%j+91R{&;)CtkmC+5o+T zdP#cj3`VNp;2&Ld)#O6GI-?LiwHP4>b+smERLJX)TSb?9c{(-ci$#eU#GofSG_BAF8+(r;|s+nvI(3NEfhg$ ze?ET}la7(9m!6QegEASo4+kQ0VY&M=$MkAJ+$4_LgY=XE&3_}u?M_=oUzM1tek=2| ztL(HRR>OGp^YyyN$Kic1x>7z@GD&IKSkXoCH2G`2*piJhz0;D*_Z??{ zp&{_BRnIQbSX1_jQvfJfVfo=VG{j^p8OEMMj>?qOlKRnR@wxG(>+1@%2E1Q^8&qLD78)s@|bD92T1x)MOU_6u^p_0h((qm z^g-`qV~KLndh{M8fW%dzI57WB_tYPjHxpZegeKTBk%X#CdPM)7eShHd3nz|1UV?r5 zw37+n00s{g8C!Y7cW44;hgqr7SvEgo5{FX@Ya*{$B74o4Pk%}Lg5L@qYZ>=^5_biV zcl*78F1ht|MoM6}oIVQI-1)l`vJKuJ+#1uw36;Hn2(4mAcxWvY@Q7d8P1MEMqO>J` zRX~ujwDKHr5WMz%wS;y;Zk zkDU2koK(Mow)#8-9ev|uBKPq+2ugbJ^MdQRS!XBXiu-)0I{@AZqZmMx4`CqOBw1bq z-Wo2Xxf3(+5}?D8MUaz#vA{0xJw(HqGM#KIn|WUPnd%D+ODu*jVamUnb@}Kc|ID42 zG5q27O@T7P=6Z`k9&?0jTrCZjdp?&1%5#}0&Wr_5bLt+3Pol1(v*O2u_jsx$!md?+ z59@2nTL@<#=_WTs6VQ9a^y9Gl;_EF@bFk|(gLU1wC!Q^S81rn7f62^wD%{pY{B6XgT?QnkQ*CzOAVuwjo z`-@W({baydW4N^B$|QWGns}DHdG%afqxHwQr)qJU$1CYbnSY;mofOKa1^`UrXsRfz z$h24~{I=5vgWIqirhfEXF@meG+3mqOuKkS3nsAgxbPV#Mz0PedMgeZiL~=-7UD!}g znq_1`MLd&Q-SdPmIq@DhV%XzLF!o+6?oUxre7p!ma| z`lf3Ah$dh#L@)pb=K^XrtB7j&fpg8`5AR0q$pyb-t|ojn7dnpb=^^sb#GI^ce`ZQdNN-cR6K)*Y>qL+ZDsi>cO%^ zV6fzf0tTwwTo}4syWkRu{WB$fE@&akM?AxSHMEq7)QGS{=ai~Y*m0ed9Ewi`VU5}(vey#^sV$Wlo%{-SC-u0$Jw+S7kn=-^ePwRl# zvU@pLP&=2pt7moRT*zbskOs8P4Vw9!>+KB8Jj<2&P8DnPNPM&ycA=8tZYWQU%POv&8`udC}OWchgQN{2+4I#axgQ4Nlez$)(Eze zShsbRRKkP=8j$7tEWgLWNXkc~D!WJCc(jHIVvi)>0gLg4(U-tlsePzlJt zqxhnFu?u*;MeaW7oR{L~M!etsX!u9j#jTPKhNiT7iSNsg2?&Xj=&&j7-f<^erdJoE z3VfTkEjHD>74P>->-{AFdK{ z+FvYg(O8(jT`BKIdA8r) zT&8fIjT{B@EQv5lAoK>Z2%mT)VJ5*i9(5)=rxup4At`LmYkuTZ1}ouMhi$)WYP>9^ z-_MQgCy))V(H*UC`n;y8i21j4ARa^wO(Y}NOY2e;xOqz;sdv~$o8i?wC~8S{;r&gn zcZp1@gC8Q;M5%SyS$_bw*DHLV>G_FcYXqg=#Dym-7hstYOj0}ZJT{z5<&1*2WJkrO zDt~xWrR%O%#M>ycnnMqZ@2JxSRoTTUT!kpUss|~6-U~q5>RQ&VHP||GgiiGpXymD# zZ);4hE|_F1?aYr1{4`s0 zM-K-x;G)JEWOy^Uex-~iualK`^koMy*o~eOF;)jyS3L(e7p%uBj}epx{zZ07_hK8y zigkX0QYwr~9?br+skUkNp85gJyra`(XY}q3BIvf`PYrx|eA>T!BdxIf><}Sut3ZG4 zNi?APi9d})6%&R`gqGan6Cimf3oEg0JCE;AydcWF)RBKRu}%ns_mg0OraYj-sQBh> zFWN~L1d4JvsF2C&$jf9)9$MgAtN#${1xK8#A^gzw{S+D1yKD~-_aPdC6FL)UY(5)R zRtIK=1@&P^A0ng<^9KQ976iW?H$l|eZ8pO3<0 z%!#i^e$&wG|7HnTEPk&4sqMaB7JxLSr_;qdGguu0NGu#izKfh8ramUaVe(q~`yLBF z(?&j$hucft<|ViZl527{kQP1o?7G#)k_-lLQ7$v=UU`(sER# zk3#ISF!Ht_;Jd2k&O@Ve?}^cCvqH!IH*A4hBe!ECzhCX#K0xbt3%VHn4jFgSwPB@& zW5)-Zw+Jop=D*r0Di?XqarmDz)`!G$c3FfHoYO!zqAtc|&m!UcJwnB5f^S~S_BnzE z{F5CWk)+efl{TMN!%l_~W;#zxDKM>R!zLp1e&FQ-wLX{6p`z_dNkN#d3eTr!j*!^z zX{Dl({wnu1SIi+nj?49W5w=O{_$s7YGTr{3O^YlAvpPB|2ccdf;hv3=$$ZVb1h%vQ zu`wzMDv618oLmaUOFLhpJt=%kPWpU*Di`5S>>VNHPTpso;JvuO!}Yg&%qPq}_i2)D zRsZw$sL4Bh%al098#fYiTWt-v5upJ1|ae3iBhp_5oP|q^Q3TI&QWVM(G z^VP&hn4PgN?_B;Oj0c^}_+}3`R`bbAw$@S=8YRdf(V_9zrT~gs8uizK^Vgot-&u+V zutbJ8Q=h+E^cOw~kq9X^IL8Cf0!lLR04^!?I3;EbNCC219555iN)mC3nHN)2MQ(Vg zPycphM>5^n{7tm$7`}hC9!Kq*N2WgI*SZfbG)aht6IAEd0*_Hr-{Y|KBZUBS5CNVluR$&t3!#xj)DVC~C}$wSMuKdB93SJjYmpH99zm?HPm?38v&<$j zBdb>LhgrE>d&71FId=b0(QQV2`eDu^`7Ik;M=xR;Usoo&Fu&g5b*ow*e%|kev#&>+ zzaGz-=89|L*2g$2oQ?wwdx~~!G>?i_yAE_@RnYU zthUEDCC|)kI>n<@ixKRKLEov<9>)1`M`Cmy({HG zj*p7caQF%x9-t)F_xo$2X4DFt^V%>x6B!|-AJoCUj50>dMn{9pj{HZeXc@R}+2-}l zDYQ#yU2=7`rbJ_3+OYb)QM{J;`sstw5%|KY4FgGZ0J?buAD) zNWsu*HvIK4^v~la$^wcJj&Ix=MyG4YvgOsbRq2wppmoTL z!f7mcvl%D#%)9sX+xyT~1b-n@_tSY0!rblKifs5uQYx`rIr?XOFbHK`b)Z&H1f|?@ zxTF=q+pp7zx7Qvp$s(e`QTQ*meF}zTgNU5wkjm8FL8Ly!xF-C?GS`%>ofE`k$BD`F zef?ZCh|0{j-GY^3LW_^zVQqRnStvDhxKwJDNbclY<$)DF<9*c!LY&eV8RhkR^yDd2 z!t?v_QYH-PGCwxjaKpkk@_ybF1oqpB=;z&3dwytYVS(}kdU~v|;CFoEDn15})j{`? zB2Q-Xh3T_u+ou9hMbhrtBQE3nc#&g7MZiCN3SEZF0!-YP6&@}SMLSp2hw#EVBC03R zGBp*E)Gtvs9`@+`lIPfVVQZk@A?wk&0%dM;kWpZYynocw{~%|I81?ji0s`?s>y z*z*2YIjy0j_ZElxw>-c5kGs(iTBnFZB-(Cw>9c4Q8w}F{h5zRY) z@L8#l68}L4dd93@2rCQR{kS*cIrfbg?=2q-_KeB1sb*8fN((w2i#sPf=RfY;e<_c&53e#m>eX!UPlx#q=G{5dkh zuoxO5iDCTPl&DL<^{T!8Ig*z?nXdT5BPaH6g+FJ*PVl<>zO2wR_!6effbnSNU)CF` z%;x|o8%8o-gE>xw8EKt9c+J4}MSc!(H+{3slIlFH5c%RQIc}4j3+l|VjM7`v%ic}S zKM5f=66j#?&eo3?&v1EV1t|WC*k0lYbJ+>!so}q6ddKoHJR(w&>R`&%8lPsS~nT6zT^}P@|F~8k$+4r`v;u@1Q}JcF?y(;$q(+V)t{n9^j-9wBVvD%`Z1BI zh$Hc)$pKznMKU42SWdqHi_8y5!q|GQ+DybIAYCu~B=9uT+;xRItIKP>?k zWttkFWej$NU_TO3e26DeD}|L40DB7=|*oz9^ov0KI@@uT}V z38asEB6A0S&G?=hfsHQ0Kdlbj!rPiX4vr^Y{pKTb=WINk#gJ(lzfZm9IY)f0eJl`< z4x|FgLk*G%Y@R3+0zOl;rA$Mx9ITt#AueACbx3-Lxkj?O?~j*1w`x5;lGTjuP=|{L zt3p61Fa@W4N(cE}D4~@Q!zKR@=&rqhIB)p^Brmb4a?-A3a@ck-N>(_S7Xw5hTl^Ir z|C7tWPJ<#n9)YAh#G!HJ0F{5Mc*WxkG1raKRL2RZ-&%M>-!aUvL{p>fN z{##bVdQ$!mqw)A8bzBqef!d_;z2>G_7d~-z$h}TMvBw@xA%|-!cZeSV{*rIdWLlk ze1|*VML-D(SKOG z7huloGR7DTtAF+uEn*EOf5PtGTPd2$uWMl__f7I-Zq(U-f|}QIsR#{CfCG5(Zlqc$nJnM4l~=Q zUM3LjK5-XtP*mZ~(o$VL*k%F|D>haA1{sILqhFqn!Qthf*6RQeV@WOT#qcT`x@m+I zV9q6$h=K%FfGD?3v#G^3Z1oE+wCvN)bM3g-jI;=P_~A6m&~1^fIC+db(-Ly(T9WXqf-30qMW=H$fOlgbQE zK~YvhBJzNcq(spbyfKUX*~EAcIskgQK6f@KHaCa?nT8%_nu!7PXkSJB!c^!u93%$C4YS3Mo&c4lD4 zUFfCA!(B$7rrjdKG4wB;ES^C(XdGp_)PqgvnSd||;cf0$&8}wo)Ix@8+a{kahLD05eRIndLQ?+`zxwSNLx&1>l2cG<8B;?p!1H{yU(6xn)f6GMCI;$@5>w)XO74G($Y05C`9hw|} zPdRRe{0YCj-K8bknj81`bZ}pqRp=x+HjWtd_Az2cVAlEl54z|edHC|*nqR9eFywv! z!>gGRFMMLSPtlgZ?0t)IrII0iybyGN&mI?x@XB2F0nPgREq= zVxhXM)1u9Ym};K@F%c<-H{+8Wj*#1{T!nf$&)za3E;VgX1-5xQEk=EyThRv4m5XHK zUJ(;~d`;tElGts}Rr0>pVBq5XE!EM*x9C0v76xMt_ICr32~})f1d@i&>)wA14=>mK z5^omFJNkQbhtN~`zkMhce51P9jV+aFa@ZAP87`*cAZO1ZQT_m*E3wu z@@(kC-{mu17i%5(m4R$33?y?ikx5kQNZjn;L1yr+9W__YY-5+xau~S@O8JLfPml4P zq~9S1D1Q?>GA-N{%G=uANS?~WWFKrKdiD_dRF1bQl*S%azS9S9`6wb%4*yFm=8l&P z890eF-MHti*QIrdN&bY&iNUm%iZD3t2e70!Gf+jv7S%d~Utv=7z4 zODs4*)s`|aODu8IqegSg3Gi!%oGt?!hTnO=nXtGJecZqim=L&*aYk%JcfYmk05s+S z7VHFgUizFjDU%=AN+Hb}v1#c{-E|#z>^8DielcF#tznbYNk>*Ko@`4n{ z2ru;Z^@GzQ4D$kw)Ez6aim%8fJ#fHmrW^FO?TB~nZ}WhetG>* zL#lV32a+lruCoG+6R62_i&89VJ|LbJz4Xm;k+;!Nl~|DK^0(srfq_G+&qU4c@7k-L zFi1k3F--4o()GwSdMlLhmEUjvjI>|?iQ5#9%-S`}h7<5JSbR&TqovLeaGW)H>*Ak0 z<`+T9qq`FZ%z4WH;GkZUwm*H+5j>W6Jr@lh z%ZOxR=%mh_hu0c};(bsf#4(%tfua%;6L4e;XD||3guRx>k!vz?s;tbCQde0$mkxiA zOohjFxl<=p@#EN<8>Omg1Spa$vGM&?ze8vZ7_`+jDj+n@)L`F>vD?v3YLPcOXg;3h zr>G-|<}(m!Bh9Hme~6S$ls@6z_XaN5s&KDYx}URM_jgb-4dAV-Q?J4S0ziLeQfaV1 zRuC`JCOFhK{bHY_g}v2(yx3etBaDU5Vqn;@Gu>H{elFc>1j)2df6ljb813?eE>oOY z4>o;xw@%FSx1x&)W?W%MXGU0P?qJ42XWKuwBQ-Bipxx0O4$AV&jgL5#YpL)WNqf^R zG>5k1|8h;k%V=HsoS2GUk(Wr&8<`_)HLWP}6pJ(KPb{ua=ji7Isb&`y{ISJe%I1G^ z+q?gSF$rO}!%R=VRRtl{vm*QOlBM~$aVpFgPCYCA^s6s(Ayn&;6;`S7K_uSE5yDvK zxz&XmGRJ|O_^bbR$eK74bOhUV){W8)# z9EgUclM=(kV^%@x)P$mg3`aqu>R;8%$>YJxxeLxi6Y%LiV{;=(?bhAESKTil@P-Om zTJn|foC{kcAO72oq0gq#meNyJuzC+8$3Uak!RVyoXCKsV`+z=Vv9U9eN%FItErs)t>*eBe`>t*;xSxfc0Y#KGiPF3D97H#;0 zE8llLRy3OP%Pj0hMZ)Ipb1_dD02q9!mr29517f)o-3p`T4&H(0Bnl*VzW0yEY>w$J z>&+@nlE|JFkF3IUI{`9WS{0rQ7=nMwO%| z&785)qQorv@Q>A%O6p(w?c6b;#jS&n1=Z{yZ@al<)1CbHzL*cq!fYp2|9CEt!?)C# zu}1FB4fQ;6&3(|LL=XjjfwufCPSVR?#)ffyi#|vmQ*!gs3}(XUCz5gob$*;7a1;Ig z^D%*UR`yd)odbIRAr!kwg^@ly;rBIA-ZOODcTd9QGB|*lr12%!PGxg5cz*h>DduY0 zRVKff2oqWnUpZ)7!31bl&(3BCe7){{c>7i6Dgpp}0UR-AH^nStHdLldD)u&6OrB1G z&_au=w>IbL2%*_(qx>RS!5pE7rp=T_1#W;iL-o?@d}Zr@LVi*x01Sr*j9IaP+~rU? zxeFDFx)fVtxC}rWpcK+K1h5&B*jmCqsD4i7)>kaiBS*--ND*ODqPl?FQSWBZ5ksMw zEsvI1YUn)EA;(Mc4JR@gf~Sg3KR#O1>hk^-i>|@}c&ZTN;S|nbrm2BaQmy7_eBIglNTQ5VYVylo zBiw>z9du#As9ZJwtq3Nkg>C--mxI>C{QM5)(jiY~fZHt!g)8C0Ck^GmAvP~?1!2c* z9Mmsy^|-;}@HEblfH-zJNFpZ=o~U4d#2aJ=XBm>l{K;67XQDc134&KP`>?-6kQ}=B z9!Y>5WNKTYxlWMAk=YGXPn=_D{J>|?`+VrT9vGh-nszf?QeEg;ebL7)-;3U|dxX9! zFbyER%=<(f$_d9zda?M1Hte}b3A&;thy>F(*!{_MdcCq`pNopfMrV9nQeY(4sT>%O z_%i?5{UA$-ZGLsJea^&g=z zmNGJ|y52d2iKFrUizEv3_(&O;|BW zLKR^W->!tjnb6x!CQkBbgPSd~u#tXS0004Rb^D+h?c%PWX!ZT~QH8{1-w~>_BcrpT zDmW3Hxv6R0)T%*ZTy4SMs6Xg@w{60?BL-t0%q4!VaFLXoc$XahrDhHbECUhAumz)t zX>yOT@f6u<-)qu$&{@pp{!?X#Oukr?d)mXnQ%JGH)Dq{%AUxeAiSwxO_YnOxUh89P z;#Mb8oY#|*k63;_FjXB{mgJkx4(UKeSEAAJ6C3E;sY{Vh*R@h~uK%#TDZ)n)SU{4`N&hB*2V^847lGMz@q6KZO3owd%0fvbNEF z9sWIqdY&oAVHt_E(W$`8M5S{( zqq1Cy5CG>Y19`d|_6vutwW~l|tpovH+e~AgxgEoDIEwKRyBg@F0Z$yI49>Sr9dIG1 zYPsgeY}T8c!>e--HOwlm-hN>u%b~qCku1^_=BAj}} zTf|zK=+aFkp~T*X&zLfMnorxo=;3(PCQ4uctM?>`16?APL}BN6htMj@fk9_!o=kRA zd&B*)gSK3T>zZ%sD`D4f_Ity=8?JLqH_UQZyI}!XeJ31H zMn@-jdUgf@tbuStOL=g-QV*}Rl5hOf=plI{80n$jH(KVcS(bf6{gV0G`>ls@b1Ix z1m_T{GBN6W>xys6G_hO`Cx4n6Oej`LgNaRkwk-PEdP~YY{6WQ#Ov4#eeY58wWpY_& zIKSr~b|#_K_4{@u!{>ha!N2#5C|o?v`%?YCN%Z{7Gkg*k=tVf-oZ4wg~RA%?fi?%HD!X_r+!d=LSQNYV)R+qiyT0&JX?1qOub`m=Ac zU-b7B$tn2zNrUTr!=gikE9P!iOZuw z!GmVJnAn^4_$wT8CzxXe2ON_2eIM3Wc4vhPXWk*S6OSGG;J@G$W92$S7h;9PBPpW; zIjvc6a@}rZp8e3*kH?rEoBWX?`D}TM0xWSiEZT8F^?}XQ^>4H_ncjDnL;bH^^#B+E zvat#^CuD!B&(THn2@gjKr@;Y8FTt@nvuum3b;jQ&5f(mnPaW;KKj!uMLl--Ajz#2z zzE*FX@V1SJah8k_07*lNY_&o0+DlRcd_e3W@hUc@_7bt!L2A@f##v``i(8bv)9(VW zRJRdksuivNk~P6}1tyi5r*nBfMr;M(Z_Imz-ggBz!t$&(-Q9y=3ohmJDO@E)k@EXq zUCmW(+g{+U_s^bR11b9yAvOm4M;LJm7B;VK>JdCRk24$;YvIop+R?$v*U=Oh z5lzGh6Q_TsXl)p*`Ps89YHd*CPw04mz+)LWpqGv7*Nu!v*YNZ$w)G8qvF^dUqg z7)L1C*@%}m-9}p;1}m}Vk&|Dr@DsU_{DI+AMeQ+D4N-3_dK$YOR*TNj*FC4j?SEP( ztT*-GKzo}06=&Zng4B-br>7mfcMN&b*hscX+LVlLa78+C?GyV^-Jf7QJN zEPzo`568dMUr|BmmnYmt>r6*0hjk(=%eQjIe_6*D(!v6tD2%i$V5G(F(nH4VbAp_x z4oX3=KH`;ZTv_5wNDPcQ2PygSN2x+)LKN0P12lU#eA6a5Vk4F%vBQXPxFQW|tEO5V zhWR?)+*f>zX~>~~YG?%!9SPW;zF-xl5`DlnBxwsrWwUPBe)XdYDx(99Q>>L!Q5ZFU zHI{tw*QyM%mn8EYs8M`PTtk74vM_c0!4O<&@2&+CDIRu=AMU^^a`DSGmKl<1aX&S6 zlA%lf9hY2gW{lQEMHEkUmlZUfIxZGmWaJUPSL3sQ0z9+f#+t6$Ei4ww5IiS6mJtRd z=g4ew4816?dsCQuH5vXyRMgy;{LHOgm^;{+^XFeD&!II#O-lL_6PqKoFuI>%=!>{H zduo9DSO2-C-9pr&I-rdx%T?j?zrrrZ6BM=xt_=t=gl~%0FD){e@0gfW)2DuYdWkD4 zb<>+#Sw*jU(4HNCWd4er-Dr+D(=dtSKO)IVVx+#oYyn1rr^R9M0@K<~>1S2-l53y6 zN3v&)kv{Ca_xBv(Yh^om!v8#=hMcin;g5OTr!e%Y*H-7mgO0JAQ2C`@3Lp~&yvN_G z$W1EZGxx34&q`59`Ag*}@&Wfu$L%#iD+g2Cx;r0Lea&Ynd?Oy>Jh?y)O%WG4$kp8q z?kX+Wk@q+HwhTrfWOEXkT3g5N8Hzh$NY+Yw?WT?$-$CDOZ|gi8#|_F?Uo^m@X}mrn z!Ab6+i#OD5u~sXh>U1K_xy2JTM5xqBu<(DHFc43;e!RI}SZ-sl!iS^nV=<5FH9Zjk zj3VYrHsosF^r8AmBGSf5V(=~1-&pI1>l(rmc}Q{-E9*sf4M*s}h7b!+12HV#Y$x14 zaAdszkpK_kUPS>{=4ggFHdFt1z3)o)4JX3quP4LL@S4Pri9~R0<8ZCY5+G71*B0n);5umt!_x|*KC<>f}5%#HN4BnGwJp65O z@Zx=m(2wsF?&I98sw%7w{`f{tEzaHrOP`n5GgxTfzh2yl(>6gP(qFu1u8Wp>m}`=N zx&GWsPf++)jJ}zVNH)V$3TMw0Cf=bN9fBAd3Xv;+NXZ!*f8~S4Zn>mP>9Na@KPG$0 zsTAnAO1n!9`ka;~S_V7>_fzQJ%VZD+S9QD>VNb|^zgD*};2LQ+RCN2X@I_2%&ZXWp z(aI3S^6wLgH}1mx^Cr-F?}}t86=MLa71@&n-w+4JM6r2A#KT2WhYM*lQG=4DsVYMe z2#W)AYhmfs<4s<~9$+|9MN8TELWB}71f#FgU6Cr?>jf~_dX2BL*+}binFuRo4~pneqLv61 z&SHG_9ulH@=y4~bL+4(agf`#jg5`f4cL;5hVhfAS72FfdG>g{UlebSyrkhvwk|!tk zNpmBq0;hio;`|ioq$V;30Gf4w-y}Bbt}%NjnIJ>v?vCr5VJIfFY5d_T&P*s^%uJ*FyFL= z{>SZI;c<%h4}J4M?v=HPEBZzu70dsCKuMZikR|dgHB`PZC}_Xdjg9TZ(QDNIJ@Rm} ztK3tQi{5eaubU_TjE?(poV*-&l{#6L5ZQ0`0m59QGQS>urNfh=pHU?be|t-vnakf~ zJ-se&S~f}(dERetELf~6?LJvb^(OgG31Db<96-%J2hOxDj*PSy%HgQl6ht&bx>HLI zo8u2l#ni!!SAtLP&!}yGQuCV^7qF`L(d>Ek;Z+Kz+m)R6V8h1-6C_!Pf^&`^U>V5T z_3IMPZLsw5y|o))CFX);hyXa^pg62cMLukE3nEMR7j2PcsQxrBvxR?r!No>_*z`qO zE|#wU7XJ0l@JIjA$W^517IJFNVPPe~{m&_QH44;hjfp;}53Z>zZ1_K}HaeVg5mtG(mqz zH2qZs8Nv`KgM;u1`HT+P@cHJLoyQT|XC}=^XTHz5Iww_uza8?F75kAT6Y1A`l#0yy z!VuCSwTHw55w3J^&3ZyVO2b)!LbO(BFGfK5s(8s3L&q2ko42p?A0mH3{#KqUEYVy; z$JE#D$M1`mTHXfzAnqisQ|W{eW}}y)0;uGd$|fR`szfwE4Vu3@L{G0B#$Kx z#uU#zbQNe5kGxIU_z*T^!}VOI7kxE_1;LS#zEK+(%-sxkFxNEcTW%!Ps=94nrXy(s zM^h$OCkT__6zv$1QG%F-Rz z>M)a{QltJh5<03=8{8~5pb=LaitC3j;OgSKCJp?X+)!UMBPTqXdLp(QJ&6c;msY_%`BSua(}(la zvld+ehXMeS7#v5Apgsu0Fq+c`;es;Y@m8M%+zOBPkvkEwMBtNMNTE?$q zhRFPtA|=d?X94+G!@%tMzWx@c*{_bJZ~8Ud8~OQ zWMonSBDONZ)C@}MlhSUNJ@8-SbR&82Cx$M^ZBn6LwwG_0;GBHJrR&-JMjuL2N0Lon zHib`80O2ShU4A|Z;7(Rqbf2yxEg%^XjvI9=F@3z+Unf`6ViERlP!(E-3X~I|H*PMKV zPzhXlkbS52lN`C{ymOMR(=J1NF)xO`{b{DOjO1=TjIgN1-70QAM>!uhi~|!V#lT5mpKD z4IZFBq7^@#VuEnqASr7wF{l7eo+$T7?L7^pB^Nl)M$B%{^Q~z01I7rg@zm1mTx<8q z+bkhV-#t5MyG|BBd+2C8Z@XFZl7Ux;{oYU~hiZZPAmS6}b(w-!d0K!6$~suC4L zGZXpJ$F3XiKDNf2m`)eTBA!h(*_WBeZ&fc)WpZ_!IEi(Gpa?A;Q1Xw3t+0lJ8_C(fSB@EW;y3*a(WFN9jE%4uj%|&Cp6=B zS~vqbk(CwWO773Ty9#~<2a1}t`517o5xK9WzjkY+f<76Gd3A62pVx5^u}e2D-)#@~ zc>}qI1FqiC)HmyyVmR~fgX^XnLXPLME9)YnKhWp{V_coV5ZR-}M@eUL-_@pS{^9mv z+Iyq`*1kxsw9z6=8PcF*Z&9~Zm2yvGe*Q6yZDLiio{7<6CuPj2IsH$;bUo1YD(K=pj6-oP(cZN>_?9|086d5q|rza#^8H# zQzfuMiA7>}&xq3Hh)s#J!B33CglkM16!%rCHG7LSQ+Od`5|bQk`s*=Y*wtI%T6x10 z&Rcs?sRM_QWTLMI8rmmeuWO8;08xqicepOETk)T<46-(5FQa#!X&Jb`!t2N9&%%g5 zd`Ear+8!5&ug-=x`5o4t{#9W5ZS`BUxj4DQaR2gdQ@ANc-~QsnI0hPb@?v@B+8G(Z zAZ92RAwqT$^7zO@J6kOH9YW)=*n4&h_sQhNA2{aM*{xfVsu&{=BWD0e^3mYmHqzCmJJL~TcB zfAcxwrdaJX?54-OOl$AK7}?=XU^oCcf@x62<4AlZ?8FFcefpL4d2A0N-x4l>oiksJ zFPbr$(cEV$*xB?ccLrf)gZ9vh+*{9@d&F%89; z5Kw3o+Ma%EhQkS98G;FLByCviloo2>qtJ*mMRkRzk%NSa$XUYZ*kAvw5~FgY<8pqR zL5BE6g`R&U>;F>n{1zH2{quG7#$jyGJ1gp#Vb)sOWtS_p%Y>u7u*M#FGJ_4bgo>ib z74(g!j}n#!KvB7}F%w2{htL#&Euv_Mq52?9aK5yu~X)Yj&7?Ab-s zk*sOq+5HMCaPhm4G)0Wd$q!TADAGs8j2_*i`OEwMgE4M+uZfoa%a2M#RHOylyuE)@ zUL^Hyh0U>s8B_OYEZ*3T3xsFEjf1v6M8whMZ=&OjV*MSkw>{8Tp>Q~$wG^(LxNIL~ z$i$gMjXV69!it&mId5OS1qpIl8M51Lc9gty)HbW$VzTA$r<~GS?(4Okk}dc5M4TX* zxe&c~BWHx(;qlQbFRh8cFKWFmRgb>jh9d#0p9{@)V4A-tRf1HSK6KW`dI z*%N64|68QiZy=}J6fukmH;6oVz$KLM2xEA^+FHkfFhVV7r@o}Dpy@?lv=-Mu0Q+x* z2-^6ldO=Em3&HM#B~*&H|KsnOr45Nl67SpAV`V%iOC0TyC|pLdpX#6VKKE2K*<#ty zMt1eycBEn9B;Z6PF`~8a5E=rMwKPp;_XPsXRQDb`Z3m|e3nLGxWyqySF*QW8F6UO} z+*t?U{OpSWzABWDLf$EsAXOQ%55#r2Zu0~3>p~=hUx5wX=j>ujsCP;lU>b)4_8#wN;$ig!TQpbZBN!J23u#oSg}63_y6XTLi;N}+6AZxA8P zN`x70?GlysrO3pM7Q2GqOQcIzr#otE!suUhP^KSh|AbEi=i!7Xz`FO?m@Q(;WpXRN z1+V9-tx|6N9b{kO4xx9%*o@-y1;hgF+V{rC?YM#y0zMge!s^r1$m^If@fm@Y6z5Lv zRhcqnSYN!a!}-gqob=ukW7f) z38@D=#b-eW9=F=(XIUU=MB8=2>B@nr!=54pu!+U963Jy12rj|u!|P-NB={v7iNq`#3M`tj8x>IQ*_&_37vRD{UkzC`XPg+^w+r?=hRH;HKU zGKMFu)mKNJf`t$7D&mE0Y5o8Hx?Y)iZuZbU07A&u%ct#&sO2VSK_JhSSK6}gNSa^n+Uizvm zGxcgYY#y`SG-0ypzh!j+Z}$&F=QdYeZjZu0UrCS1cNy0f1WePucwQBT`F5diF@ITb z0yxN`;6$3%$%5q$p-B{Wq=v~nu^d9zq0YhSr&U_;xsunePCtIK2XnMUe&!*$GZRCC zwuH#mKz-iU4Jp@|_)e`%UIDg${JX6pqLf{nGSW99?-R;w9z5ase!lc$ERf0JM)}7$ zgy8pMgYQFAn-i|C|4ul+qpE9#ub)lpp?^K99?!kB;SQBic*@28MI9@h5DKhuLO{gg zv{B@8=Op;sPZs;oD=BfJSbf+`a2VRKmg?mP&5AkeH#E4mTAv(7Lra^T7>)${UKzK)@Ok}7XZ$ta zPx4ODs6j2OkWZ9DQ>Oo8G{x6pM*lM?0f&vm! zaq-y_S4-2x3~s^BD`r26%mXD#+>2m7QVKbW&lSCPwx+5gTAF>P1>IadRm+26CbvdO zEW_@+G{@B^a<8NC0tFr%{Wh@ixh}_iRXh}$R3{F7(5G>$Ffcy~2lfuXB{n9;S2@a; zm)B$8{2KX-Fbbvs7E;R%-#xs(zrC)X_pGhh|CC9L`AWeTf54KS{yr|Y5>yeM^3G{( zbqxx}!^0s4i;47i05GC^*v3kUuDF%ok>>~$@?+V|YIs8^N^Est5jtFYHi~;+^3VEp ztEP*cP8QB16IN&Y>D603`*{x9iUybD>Zj3Lo?1+gB7(?y6wABfo~5iSH0+{BdeP`@ zCW|B4qj)nFfDw+>S`UKp{%e%3nqxOM;rOTJ_+#$!k7=tpV((3yk?#R7uEWC!k)+Q< zH-sP2TX59tG629^O=X&f4yX4+Ya!k{N@wBtwyTlR^ekMu9$HSc+JE@yU`YHP#2^>p zN57r%|J=40NO8=O$btfl6udnDN^aLS z6BCHwXUnoNAALuj>FC7Bw0z76zPEhj#_OMt&GFo|OHN&VZ$SO(Q%e6IMOVX0nlTcCp(BArW(BmxS$6Jbzw(D>a?uQ0% zglj@#EbK4>yH%k-%^)Q#&|z0o8v!CXrWE;6&@LW2vJ@_a~xl<7Y<4|r);v1y*r^|fUn z7Xu0f9z5#Z@d#PGvANNDJgzY-(7<|ALP7{2SAp`qFUy5y;(U_)#G?1OaX;ehJ+3{M z>Wm`yoqFP@^Msqf;R)>AQW&E^ulmv*hK_w?qhAfyUc22*eCnWz-vJVbgrY0D8*h zCxJ5ZyQ`s3DC|}ReMV0qh@9h7K6(4fWOFHF9eIP))13X?Xz}Bw;=X>Od^VMYFKq1v zx9=)*nvZDrZlW#_)EDbFL6)IShh@pXw{MnQYoH+OceWWj6HZjQqkG@q8mXL0@aMGt zI{%JIv2z(3y!rmE_)K)^WWmT_>eQ^_Mg&GDt9~r^)SrN-<_0wUXM5NXvv*N}QB>cr zQo{x96wk#Sfp~Uu!~*6L@q#-e4$JM=vqOSLJFOy1cH+^Py`!iI>T+Q8FFurB!P%a!o zuQ4~W+PU z5}Hfp1KL|#aPN6(li-F_5Z%lg>+^h0#km~Q=u!22(8BTO?!HW~w%bi)9G-@5ML)-; z8DDs8=^a8_0CuCoETfwcL{&w0+ipuY@lwj@P{1TjJzGE`GE1T2L7DVb*0ml1S&c`N zku1-9;azlG6ZvkdqUUbV%6VWUfTam0@MGqT+rTk`6ntWW-j9uL9#^E?S$kXK{pw|< ze78~gWDoLG$b1;e^4tAmTI&ZdKiDUky#lYFOxJ%lc^ABbA{bUyi|5gKOstq6Iaj#o ziYO=$?~hI|ti^Ju=7+Mm+or}XStkr9OHF;R>-`$S??5roEjw1u8I15-+`{K>FF1XMizATE)>1D;i7a z?HQA{JA^Po_)?4nPlE=>xGKcODWWw|U&d5hz>pk~S63Mm7ZkE&oX7ENrR{b+8&b2w zGqK3OxLGJL&ZfUh2!Qm%Jk7?2;*%m;B=GEWt0y2%(R8K86-J@%!3)P?hJIV=f2x+| z%X(&AUQv7OAyu*m$L#Z*rTi^QL(c-7Bzwf2 z_lTcLz0WK_HnK&AX2D&XhLM}r@8*G4$!Cj?A7*I?Civw8fPw-)2 zvgI9JZkJfuLty?sw^ybf_EnwTzCzNLhNfo)#$GPREh#3hRh;tq&we!zwsY%?4qeME zfy(aF>!L(18YCMQhMG{cfhX#sg22`1wl{(%|Glp{G^exvlfC7+r;cp0EWV+Uy975w z-3QEJ0f$a_#SEsMcPd+XP`i4BVv$>3jUqzkjWM@|_Jk`qW(2ONY>Ck3WrV^vsy_25 zQZ>WL?TMI5cx{8;^f2xPX13Ep`c1C5nKTOUaC^q0!h3bwy)}0J$l;m{HA#*>Wr=oI ze(#s+=?7-hbOvWj%dC;PG^Q0=PmH7gBpAp)^oMXOz%TlrmA`q`JH3r_OfxO z5gGNcm3957?r25rALG(*^cMhR*qrK@Gsh&Z-bGG_c38oRS7e`21q+B1c82c`67FH= zo3PQ1MRmg2X3d;vU9|7{l@-nps}Goooo7Cmr%UA-p{cFcG{0|Gl&SmCq`;jhq|SWO znXZeOxj3Q#EE_MrNj`uW2^h}h`$$e3<;Ef%LcG`d^O?k zYxIb?aN~b0p`t}Qgt>7gna)Dqe&OaX>oCq}Yh_!{l$Cu&TEr%9OI`XX-M{rgKvno8 z)lET+Ym^G!@w7I#wEtz?biC^oQ4Gc=CwxskH{Dy92W{AkzR`(cG#)=h8&T7u01zCP z32=_*eM_i<%YVOYng*AHI(Wv~^q%2bp|>H(0V14KOXzm$RS|yxi8yC7znApbOP_CK z0&hud;rCa}3uB(MeN0nPBOO8o`HF4I2_TwhE%BeiD)D3ExJgMJCIpreGb4~Ti1~oe z%{wKPF7f8dg$ma-1=5`5$f+ez19(%6?>35uIWyzw&JoMzV9(mb_6DE53ASvx zu`ga@Slb#xkp@HYrcUdbNjjLeTyqOKl$7sYG^qixc2puQ>_~rregy6|=s!3Q(ACLwh|%4v9(~;{PR<8N!0V!n8fz=7uWFNkO5veVqsHn6aFrKV zch=7cB4n)jqjayDxzu~D;)kc7lxno{eLejnGnym!I6B2I%Wmbb^H?|^-5Q;tG3qnM zyY)|qSz+4TxU|9gYkes?vKg!Iuo47Vl=fTvfewj^%yG1Wb-b$Q9J$ipOXkRlgN8@~ z2PTa#V=r)dQG=9GPfNc$E=&Id&*f;hQ18Y3l%CB&AJ%Ufng(me52DezpTDE8F1KM< zG6DntTGSYNk`!+(0U%i#@Sk;(%+#07*mCL8v?Ui+q4t9A;*s8GpTIC;JxvnZ1oPdD zGz1|--m+x5U*~=unQi_L7A$7&kg27e#4I?HmaWFJW47=>fY7Rer%?W z&TO~Y{RJb3J!L2E=A^f#m`H(>S^UJkdoh(3A4HOe$7;02AKVnHjQ6-nb}(tyrNmU* zTQjW=FIprh_@S^q&{3?;Q`o+0ZYB(H$JToe>X#kBmaMT4sFEgsoeZkX8}D}sj?ek= zV?3XeqxFW(@%;8hz4lsGv%aJE+f)@5{`0WgCd^?wAIlTyt#ZPhYFdj&Et<)BT<)<$ zflK0)UX=MxQs_qv^wOwS;N+m@=^#T_@#p0sJ9TrO#$`9Q4+rm>iV7{KMrCIXzl4AxH?xkVTZ^@;mrwqMjv*24kb}X@eD7(DkIZKy){#q9h$x6Zd$8&KM6x>t;_jd)cj;pDXUgnd$)JJTx{PZFoX&2cD4d0g@ip^bPk zLs5)p%zt65h7JPS$(3xT+DsOCxQT9S7+yW6=`Vdc25R}wi*;^0*u1p!7eTNT* zqRodpOk4(?IRuS@Q7+m0IRYfBGorZY{?6pE$sWCYrzou@fSSx&tE34MU((g zUo1kpuX?4HlW(3)CAN`Fg0`~Sd$Nm$`>*!uKQywxmxFy=un1x0Ka!<#@udIOUN2kx zszRf6g2R{u;}BTc?HYukEv0^ z$2mh@|aNc?aKo9K#d($%?6+2#j3BAlcYKe&jiH~jP+5&!w zb=-f3;FwaY)i%v!;9zy^DEm@UX2S@#NuO2c&J#2lU1yET+8OkPN)ER@%^88 z(nv%Q%=RomMxQ6Me)nR3YVml}IvGJyPLIBoVtjM)52Gdn7kYnT^6$-(pA0(%@UcYnbi? zJ;}QXv%%nm4#7;gR&6<@sobF7^BL{Z=LPC<@xf8JF-gdF0*3C0p(#S@!xkDd1RGNc zXr4scOYg{Cg=O7bOS~_1CO}%l?Da4fc^eVFAcI}m#K%DrufUJJ|Lt<9!8c+Hj2a4& z`Ws!!9%Mo(glZ-S@AhZGq?ky7imM$)GDJ<0m%N^!r!D>UIxJbbRPCPFgUOTSQ>sME z7XsJCw-S60&=mL~*zS^Cm?<2Pg$JldgcC)AQ-f^%25iHnnbZ-~QBU(K$_&e`Ht$(E z(h+!k{aEsR5|kl|Gp1WKL~uRni{ata>q<~wjFtc-_pkoZS-N_BEljJ?;I){sQTl54 zuvl-1#F;+*7`wQ0F8|%QS)mF45>+&g>5oS<6DG&1Cu~O{Lq57znncHi?ZMoH>RAtX z(PAcrmp><;iPdj~T{o7iqR*~_k5z78{2kL^vC=^2@n^+k?gC`xJ8A3u)ggaV-Vqp- z?wJY3J!@^uN4{5|JH7JSA1MnqF&^UkGFO{#>twGJ6ZUN4VTJhDc#k_zi_~O0WkM+D zisj6lnZB7FHb>wsf7lLudzeLZD#47|idh z_#)(y-GM^VTNR4~*zwFZNu45QmjfrIYgK@FK4^H<%8~?niCC6yZIl_BR-@}3Y|b_= zjHHcg0Fq`b<|Gaf4qj&aRJjhsOgV;9ZWs({x<9)yi||M6ASZaCc?GkT{c;%$11;L# zDezMs3xU>m&#}+GG|s0DO$jxAuu=~4J`bBmpF#j!et*_v@JmF|pdvihmYHq94RvfF zGO9%Ezozo$VCa(J%=dMcZ%}7zQVyS$UPc4eqi0=qajk}Gs_yZ`cr}b`8BX4E=1fwB zyEj_vCe_!02L|QuVs37c_G&k}RL2^Q`~QM^gVvsz+mb?u#kJxbX>iK%bRI3}4p6nf zN|#j)=?{rPjMdblnoLyOV0K&W=7a&ej)XHl$uIEYx`J|s$G$ziD;o5bI{@IWBA!bN zxvV*Vs*vO6V25p^n)RaqdPS_sv^+wK2s&A1U!tXHoS;Lzq(elGPzIeJtztlWS9ll4MyC-DD?6#+*t2MfJA{rSH<1d+g1q~_x*T1G zPMGi^*S|)0HH3Yq@5;TBt>@{c$-2h*vCZf&yVf^b!+%OB4mM>#>z|N*WIv|8U7?dp zLZfT*A+%>j4x>>h&@JHRgp(nQV{J-2X$Kq6wWyZD750+7dTcmnDf-32mFkZf`1SiU zO@0k9#Q6=}fsv~tFXN*Z#3X#k*@#LSZRJ50lpk%ejT!H0SW#r<5D|&$tA)o-w^5QN zom)o?swpzAf7DcLx2?ggXp%OXP{Vc$#73rYs8v{M%JEnhsy-ACUFKnT$2qc<1Z*X~3Jr^&OV2mtF-EX>Vc z6Tc|r75nkK-jVDdGmJzE9o#w>M*X}BJ64WkMWZDWS<+&Yoq6H} zF++8LKo7=4VT2nYN>35b5+eb}<;4aTLWW@gn!Iba~Gbez|5tB8BiDx`J(=1xIqE5d7gHM51v66K}#qeO;4 z=)aZUKX5xfOw?gKGW(6bzq2nuRh?Cm0&Lw!nuPr$PdN?z8%YJEpd~|J|vqx+&jeZ4f7cO=MIvv0sIvbB&`(uC@MICD8}jj`5P7v(FG^f5rsT!{-~xANz+ao2Ah`NLOM*GEQUNb9%$o+`bYghGVy7 zK_GkUU0Fdv5aGPeP{emJyV4na8T?9Z&||zSW>4@(3mIGvf}@#9&j2xTOO4`PDw{;X zslSa?#stbEzt(&*l;3p>$C44I>mBTzo(0-PU1C#UEMM|Ej4smHIP%vldT#^v5kKqEN@cjU7hj<6O-Llj-(@Ng14SlyH zb@Z5XXw|5|bh&zji7u3y1ZMMDRxWzsJVsrmP(cdxHCd_dO)g%L{uNdbji8~7d)Q~_ zso3&mFYiT^?CC=D$BUgS#OqQhF91x>lriBS(c#QU8DQd6AXyoK0U9ivFS$8HoLxpg zh~n!&QrIj49Y)&9`7^rP%^o(qZGrfWij)9E8MoDTL42RNB$28it;>f7)bqX&%9rF2WT#ON9@y1Pq2K@>qohjdAImwkWU_{h2n!%5`A!NKO@#@OoCNxYjrBxqY87#-mQMaM<*Ef z*@sl&_}f`4WrnMHBMq@Ih`>FO0dw;z^$mjk!V?8fJc$f$?Zaxg$(%&2ClL$vW=Zk8 zbUe2#!y;#k;e7d;j+NVZfxip!@pLFFCYWf7I%q4581? z{Bm+y*g(t{PuDIDuaFRrO6JLrv-s-u!@QhxqsD8(*-w(+Q4dM1*p62|mP1n}gl{C4 zu%GJI@mxfo>K(Fw(`ZJEy4HJQE6)LV>exEj&_f35h9(1meJ)53laL=nwYGq6O-=VV zXD^i2-Wlzh!9~+-mh>`*Lhv}^QM|FKivqV>_M`$J^V}M+!HtLT!>bjfZI}A)BafOyrnuBRMs0WmSMvyTM*Gf*ut`+LvYUbMNR6-j^ z*?t0Xpg40$IrFm41aYTa?~7V21V7@aNFU69m_}`0C7`U(S6Hnm{naA?D7Q$)ZS@BD zQAY@jP;z{sMdJ4P$iOh9X=CUMmQ1rL2yJu!QUvEKAvf!05W(cF9fccrl?Ehh#}3K+ zyBr>F&xU~OiX*w~@Z;;)Vll}#&fniX%HYWgWg5K#U;q#?$n)Vr zffvqYYt~qRZP}>bv8)jid|igbWhtGB_Y932kE7qX|LM^`_o)&vd{zI_SHD0dnW}64 zu9&UMnAp@{6d+yaqCHn1*3CJbLS( zO((BSfk+qO%Ci2E+Cv@}o95Eu>SBUNJ3gi*{12h+*f0_)ZS+aOM{UnF(k8+=j^(GS zdwq+J88Ihe4*y-(wxCdaR24Q(dA7X6oNgRta~hsbm2NBCA~#p#F20P6gK6pCd*}v| z9tqBwq6^gpKwUHSU~1H+yX_%?7Do)mW8E^q;3y>p zAy%jMsCU4z=&9Tq*lFIvpF8nd3eCsL&Spbu&y0WdcziRC=GeHqI4=qmod3pxo#^}8 zSiQ2x4>e<#!peF`Ki}uMe0}de+R$8YQ3xnR$0L;^u6AF33MB zQEvjqfcJx%yYf5_DzS1Ptr(;DjfpfbR( z?}N3EnRg5BgB3usNQ!T_62>DFAzL?<+(!T~VWsYX2!%>~6Cb)Mq(D=LHH8hy2H@*Oc>pX6|@ zuaMNuF%KoXyT~^SV~a^CB~+QRdkc&_4?;jp7I$o~>8TSe#rr~FIo}yJ2U9~!W%5n2 zPkU5>ssJErHE~vv9uGS=BZHIJ2{ce*$1e)Wpcu7XEJE<{z_o}h-##T%i*V)B>MDvRPL zIFg7QOi2zsnJcN4pjn&_t zpdCqc6bu2OCPAc)|pp^bes4T+C~!*=+46B|0pU{x+en;yGFM&sbWLAm9_1 z2x`}o5xCxYJGW|A*-KN46k;7vSQ;q5Y}!SRWM#W=w3%_l#oo{Gh&A5Sxo7dBi4xUD@FH^qoM~_o<&D?NqFOdi;Or_9A zv4yL6mK}y!=9mnNKTpCWRU@{I#KR~9QpN*bw%P0Dl(<@Bf%9R#+aZtao8N{mC18#T z%5@C&%w*V%i{ol?1h~&jyiz|YDS1kuI1D2aax@Yg$~7)+Z|W~D9?O6=qBw9JOra{T zlFudy>CAXg*>@)Q*H3RrgHR7n46hn zK5b_a)37yt(@bdbPjwnl2LSskFXD(Wd%#$W=Y6AL>XgAu(Vv0T`~?b}Oz1Z74%HR| zZ9oOA<|fWi>;^~%*-?RtQ;9Eg8GZOjL-K)L<{`F7&rUFpI&E;rbDvN(+3!noVKuI* z#Iesf{lWgNhF&D0?UkzAHI|Z{HvKH@m0Q0X>i5^==(P{G0Q68hXl3$$DjWs?05Gyi zkn`lr7#KwSBnLZC{QmeuW|9&A08Y@T6>IEU^ROkbTJ#%J1({^`ope6*Pyc&nF$xSA zrV@vy!Qu?R^WaYqV{q^v=dKcsG8mWb&;bbB`+?1i$t6pQ0aGQgzt{x~3%2bu=55FQ z7_3yvg3FRI79#s%M{W)=B#z(}cS~xjo3$2oohb}&TTgOHZq7Qk?b*~I+1C!|djhLJ6B4!}#8G8b- z*^qqhS({ONAraN>Sw0a14dJ>~2LRB^$T9xz(nZxA?)`-knG|fp7&clUCq5VcfdCAq zz!Sx+nYM5*%tRdU z9)3MBSQh-MMhTqd9cH~VJ)bv=$M?*YU=hsHt)j~&kW2BYfZ0`wZs|9VgesoX@t{hv zhMJ!lReDS14&y!tJ}%FRJ~|xwW%x7ti-JhM@0%slW&_OXggookcs?dt=}TSEUH0p2sm2&tVJgzW-|wK( z?16V#xEovK9pAIn)KWdgSM_R5j;MM6_^>s#U~xN18x_6|>^?Y>&d z5E?!HMo1_^5KG}DiS+`nFuYlZi39@4={z9;%yB-CTF?D1hsSA}T>I(=3r#HV+7wH{ z#t563$TRhfzdwE!rbEcnEC2L!zZC&ibTA?L838p%LWjzswB?2`5g1aGhU+lz}ARzr1==`O7>_8dv!d&iipojm00vp6^X zyXs=nr*zoL(ni-J^&2fXaT#^%1z=spQp_qZI8#Pkl+U9*D-r?n)msBdwZh)mngIsH zcPdumGP!h21>OS=-vFmrqnD1PQMZ_Su&LkD zKtznLtdQPD?BXk8Rx4^!F z3s3pyBg85%=s!YZBLI^UZlnh$E0HK(J&_JIO<9C({YA{fah2(+oXj3o1Gg{W zPZVPq!DVvfVY*Cd1T9d7<{^RAx+3zEnhb)|J`|Fd zX@zgza~m7Wkc!jTD=-yUkFbG<&oGGExV*ecId^d7t{TF_KPO>EBsVMUq6u~d*noc~L zxT8Y-^NcQzq^^J7>vME$(6C8VcX@5=K&ASS3RD=mfl z?27cILhWW}Edam*ph>k>&#sDNn586K^P^5>Vc5!fno}O%Ccw2cjuYqhLu35`Smmyf zTWK$8IB`$F6_S~@`luRJHPM4sP}y=31Hv{?6`73LSFF{kX@-lW)!ccbb6N7a>Lj|S z1%)DxALXAL|F;hjVLEHh(`u6`s$kPp*|56CYl1!ROPylj8naN#!`rn|L8yXfE8#{?CsG)Ri|E z;}XY1!k_L-uRM%reji}Q0CKP1Bu7$C2BWmQ6C=WDI&Zv)?E^tS;o5eo$FuZZmZF_L zP}0`dwk1`5V!2K*RbqcW8rW)XTlsd}m9`c7CRnVA-ii%Y6S46U2}2y34xS%S7d=tb z&_`~O3%Uw8-NluZFSh8oY{#3PO3KkifFf+;Ogo=M*x9{Ubc*t`UmbEt48~vNzu-F2 zB+dRn!}I&UT#h*;@R!i%r(iN+#od?_=?I@VX$h^f48tVySagpyuIQ!0-zYNaPo=F_ zHumK1NuJ7o^Dk1Q36@bSxiJ7}eN&}SO|D&UFBVDo<40!4A(^Td-qI>60a3V-Rnf*{ zA}QZ?{$`HBUucHoTM))Qa+Iv|gI%Uz6uG*&Y*n`Y3VP#Fyn*^-0Ds^B;Ayx7!ka_A z@awSy(fMxC7WeAffAnF=qO2E;v605Z~vfS7t= zxT3o7A^|4H!M&qBJyHK~-|ug7;p|1#-KK0DOQgj3Ge*zGAvxxeJHR-zm8i!YraS%U zQ{I(>O^;m#YG1{d04e8opX>v2H=yNZ#5GQ6ewkHs@*Ohy$dQbk$h(X9bCfz(Wpt8& zDog2l#vD0ZNO4eBGVl}b&KHNrXX++_d`7jK_d%$?ITpSc=(|lD3|B@>`6DS~)eJx0 zj0;+|p#RCJWi_;EW=}`0asutYw&C&jxn2ytJ@4tPKIjTg0c*q}Jbu;cRX?y-Ra4A? zF^3yAnjnG}E2HajAWUnG1$62|Dt!0E&SuvO_xjJByr6Ri>~VYe#O~oiO@tu ziYv2Xm#6FUcFPaV({SY>9J-e+Cn7}2zVzs${x(Q>CGm*@0a*1Mjtox(pbSy{>hs@t z7NqD3&3USwe1@dKB29r!nTTzM8sjX7TSJbRfUuBv{kWtqCR*=W9Xu~s7bR8FlF@Sq z^-vFB?O*_K7wHefLUFhh(OSA-y6^}M*s~gmrgwJ7m!g6eC7&Yz<8#F9JBjCQ9bz$V z<;BES;e>3h9wI8y%c;)}A~4j)Oj`YoWF_t?)M^fLg<2`_W_Nt-e2z95%`cVg(ZVcL z14$7%fO*URJTh9fkSkYCF)t$aNklZnhiq*aM|kVy2hE5@-h>mona58Wtc9w3z$Mm3 zx*0DlpZ2R1)|mw){Cm}hx*w=Yba$xF0Q?9%0fO^`Hi!m^Foxt~9YXY>6i8#K(NxV6 z2k0Z`i7+_eZ8s}gV)ZB+H>P)MqxngwC$f)J?SOAEbN7b zygX%8`@jF+zzl5hDV{}%N(tJ_d0!^ZKupWMTQdn7k4{dBcI{jyrDx$8XRUkit?q() zCJ+fi=gLckF!_j8|YTr=3{{DOMTsF3o#L6uma^6?msL&(hAbflGV zkCmU*!XNOh&A?`s7?qztr)0Ml_(j=deHv@rN*A(Qfy&ALl|>I1|FflqJG5&s+a=?3 zLcCPG&y+N_LwOCu`nF-21sHm`dsz4x3=2*?t0p}}7z$*b5ycAQi6w2kzmG?Y()pr$ zMcc4NXW)-SzK+=rMlm-vwOGeAR;rrQ9KV-eWrVbQTtykSxO$I%skGPh2R5tU#h(?O zbNph!m$pz4-+YT&PSyK>dbnec95L4X3JX_bz!A2_?g!%b8N#QoNd_Y_2w&?OSW5Xl z%P^dbYSpNmAuC5RfBAIBiOXa1ujcXZ*+AXuR-y9|FtYgB`&EMDVyk}&*2GLN@D}CWY5?R!UihANGI~O+n zn?k4YWcsqR*{^wem4V~vOmOi;PHD8OPY2{A=4A1PM%^P?(QY~ z(TwRwMukNmvyf2CMkqLG7)JaqsS?fd|2S$HXCFxzT0c@$kf~^*Br?RWqi%F9XQo{I z0&e>kD{A7{wyx~QTaNZH!EnDv5;hQKj>L~|ID<}6I*(D;9_~v-{saqyzuN%b%UB7f z_tkwZ9=Ef5g_iB)AiAWhQRH=63kksq4s*gu==r`sscNS}?E=`P3f1uDB z`G?RR5ov?89xV@V7@=;kpp@hE=6zxXM*e7*U zTg}E1V*~>dHE4+C`~oUOI-=_uvwN!RB&Y2!5(lyuS?8Y}&`1bOvh{UNa@oyWnHlsY zT#2Ba<)ZM(Y}7FahI!H*uZqU7MFG|&WfYR0LkEU*9h2l;gK+~w zyLn8INup+g^ku3*nz>pU-qHGgkZSONA5)nbcCe(@Qbcq=dkI8l3wf*UT^+IhUb|Y zYzCMboPT`ijBq7R@3|7tTe_=^62YbJM$-Ch@79$>B1r+FtNRn9xUab2k&$r0T}dcr z(k#vEu-X*Jqt{ef>yrhO8$@TQhXlsLKksFW^^_18tQm^IkKWtb^FEy&&{e}xvyq$V zA-Pxc?ZAHy)MyN_Ga%^YFY0q;-TqY6YRNt8%x}AkHW`!C(S+wb7q+XBiLTt6BQSR!@Zp;E(&Qn`FP|N<(Cfs zA#_P3+^X{*LaN1Cem2L>iMOnZ9@55$uY@j35kypGT(46|jAtvYT0=jv`h2lCY58kz z|87p=a1ptLy(PuNJL`3)B0oaGE9p5qKZEuJTt)Rfxf_$*|MnLhg8)DPyl94liv-r8 zw5*{_I>vO89?y_QN!!~kCv!b@QQd_uFL~eQ6^sTH#FftcTgXwUYZw6UX{a}X9G0ts zRgktxPfMUT!`v;7pFH*Yd+lMw^%0YqEKhtgpkcQt{|Dr{FJ&taz=5 zjMOD_DXxLUFz#%`ttaHALm){NMzNvV8+JH=1EwjkLxE;Pe;t zDvR$?qshb($SW%f?EYd(N4b7?D?dJjxP5lbN~1SRQg`z7Bm2+Uby+>Pc-L#ndmaFO zg;YOX^i(R~HK*zlKTb6E{Y(u+79BVXVRBT^fjB(;=o<$Y2;}VP0sgFp*m#1ag`t-E zFn)Qg&;boK(hWqXA&s0;vzb=LsO|W`%&uw=MZAQK?#^(@)x@^4t&e?y^?zl#?Jy9g zHoAc)T_V=su`2BXi3|IskB;R){H@|%pC!oB9ZuoysMa$zB_Z;xD)})|l0X8yXqdQo z&Y$us6xFtlxbS;X37dHj07%z|DK*7{v7}aW?l?!NFv)a;^XSxVtkPeP+3wd% z6{_tI)=MQ$JSJTJiqCy(X0wy47lc9up)N_if79x;aWfZj{(u0WexNiGiaFm|Xer_3 zw0*1nw~jtU#T)YY1%dq!Qai=&>(6LCk`G(gN~EQt$bL*!c9|Ccb#2q|!iM1H4$QjO8S8;_s=%_iuZ~AEldKC3VkgP=Aj5ZWSChctQ_irsqLbo6OU5921Owss_d&mjzZ-d&0x+!^$Ps4+ zm6nu%u$IFc2GISe3Ok;Ti5}w}zAu6Wl0!O|?n33jzA9tUhFlNuRBTOPG&TCs)@W8qvEB3~> zN}fs}hSV&MKnfwroK5oh`KA$DObKdnk)A&#!Yb}D>ZFN(^G{Ar=LZ3gmUi8*#1E}C zAap?%^(_O2AO0IV5d?8v6fm8K2y(nklNtPw8qIudO`CP}b+xyFn_I73c|C*=BA=E* z!pw6(W`oYfG4L zA9;yI=qjcYo@;^}z1Er3RgzY`OJ!tf(HkYXcu7-6b+52glKpW0ce5yIM%q(tUq4v_ z{tmifl^;Rln4vM8wpN#RdUTF?Y@Vo1Kh*8s&0Boeyj79mm~j|`<4iaBkX z;^il%l)s)=D3mW500-bzd>~g=G1fmv-I&R}taKbN{v?X4RQxNv)=urvx0Jk0-gw81 zHMbOaPNCtr+dJ;1lD)Z7ljR$l@X+($M3YCNEAZ)w@l0eU%vK;Uqrgi7)mS%8AuWnU zU$guI@5`fxi1DI`EO-3rv`Kg`Czpll3WwsUaW+#im*cYoSjq>|e{<+-JmzOLbZonH zi7<0kg>-0Y;?ayEI%2I4N_adKK?7Cj$=>CQ9kW|p7H_EKOuf=icdRA7h z67{LL>11>BLb(|ArzpF$%OHzYHs%VE*o0Q3;fIUTOBh~iG1Xtg`{6D763_2tU$~@& zMQL%{r{hXJpX}AeQQybU6nOBnZBSA;`wM8MBOn7}iD24H$OgW)2c>b$ut zS&T36aCy9yqX~avGl_&^iZ;Grn8GfWVni_Zk}F-f=Hp|s(40l~krW%3>P-RvO}!J5 zzkC6k4{CN}j^%Gq^ALddED{svJqxDS$Ax9~@EDPNhLlXq$l9u-6z=>gYO)c_^);ep z%qqZ%VZW3yMcqnWba4@JD8(ACL>5;R`W&9mEshv0V(o?}CeQYjRscaOw^?ul>Gv0M zjd+I}hQ_f2!u1uqfAXG3wd<$r@k|=8*OrR5;FSFffnhR8u&JpmtrVoa_e_>32sKhU zTu_j$ej-kT6k^GW{Y4jQq-TwbjRZU$iH?QruIT4_z}?7=s4GfJBqxDpss8o14*XKx zfdu=7-{bf7!hhl%2E_TAH*L`YOIQu81uiP}a;P%j2~vyW)v{z{GEmpNHr~vloI}P^ zjgoBZ=G)jXgzXp_r-GQ|Gr3mMtRFFkq@TFaD#fTelflpPpkxR9AvOtT(DxSDF)z)R1>E9cSAXeWv3_a_cN zI{h|L51GD)<>aRLv%xr+=|s7}aV(us+^{q8p{1%rJZg4(g|kL%d*><5IA2Tg#6z)? zi;7P3%+_985=Cpx+nYM~6bz@%e^*!Zvw$u(Y*qQ&xW1#B;fy!09~ut9f@8ycelGzr z6INM77Tn?Q(ZN1Xz6}4cSEMB7QKlP7_=IjK zxIh&EEwKj62S{pPu#jfh2p={@Gkg1D82Zl>;7$1`I+wLssjdT9DI7knuC+)|=mxq> zmEhD@O2o$D5J6uN<6^<#5Ww`L+yJ%@F_U;OpjYr32aBGG$5$jaB-!EFQXeVhBX7yc zR0U(KGY9La%QOxr?6S~PkjT!4SqxDY7G~E1^nJ|@sOkqS=|T>{)A8I^9 zn7Eh@#;S?_xEg{(8P3K_d-CN&@q?AsgAxjr>R!%&*PKOrmwAcq`hT%G zCQ6bP`R7Q|yF}!AenWOUNOH-R{(0RtIDCzQW(7vHZDuGkN1$Eg1Tn!)PEzLh6G{& zC%rUvzP9?hdu0SPUpvmO(sQ;1kI#lz##va|4;Br!QId~~Pzg8KJ#hnRWy?pz(J3OS z+W;U?$#0m;jbt~!&LdxmVuc8mWFQQ?dDqXdV|;{c;WgW8%}!&zFcjzV|`h;)2VG znt~5Z_JTba( zOz$mxpEO2BnA5+{5}UxPf*FSm#(FPXrggPa$2q3`pCic^5SgmxY_`Aaxp=65xJ{_5 zmW74^Jf|J96<6&NS<(^iq&3TN-&|HKe51~}N$oMFr(X2kYs4?!3Xc*R;O4OXL~YY> zF#F-1uO-AY^C5hpcsz}4_@k}tknEippE(#4K=PaJN#c+8xZp@dn`VlbI(FOe&88y^ zW<7i|=g5$xtGi8qea}Yyf*-SAJ$g|6Z7Mha7Kl>>-@D=Aep|)}ok!1$7+4lSO3+|H zQXFo0pO*i1DKRD$jAR08S`@Y)g4}0-Xwt##GfttNlcck%&V#NAFs;7SBs zNzUz*e4zs>*idmGHU(4Mcep3x7dt>sRjOJnR6-kp@MGJ%oN6pn6qHW3c%Ay($bLM_8ug)xWf-Dw3O-X4o7dJlJz04#z&OC za#Dq>l!t4id$9>O{;VFrRq8mffn*O>J!sD*0)YAjin#N|g4VGL37Ifa`7N~J)M7axu>9xJDV7I(l=%) zkE3tBf526_5qMQn;lVxvS+54|z4YtIPasg@>uK&bQH1r}_DETSKW>oUmpPA$LwtEi$p;e0n5G0b5(CD$OBHJRu z!GweJ3kplT9Q95-MTO4P$5GgyD32rgYvbkyS@C&Tf2us!jR30$HY^7qq3xR1qvEX; z-PGQBl(jX&;~Lsm-rNjPf84~1MAbkG#UI}!?R-;VO8wQ55oPkMR^Wb4`I}(Ub6ds{I=cW?FZAWKYKJMU+f-SHW2ATFpR;+Y zipvEGjg_Lt$EK5kL9M7pB>V<%i~pDlfW6;a5#o?G_yrlp$E3@^$n+KRrmx;X5%AXV zrZzb@xj(zuj)J@5ZeljhNV`>$Be)p%3C;HQKZI7nn5$?%bY+TE7<1K~&9QJI|4&5^ z{yWHRx|>A=r`>MtPoCq5FT{*CiLNjB#QmJ|d$tq}s#5fB7D_SUEW#-pfw;Tru)bRz zR^746@C*2xYW6RW6}<;0c3G?#D>#@i7}2&p0GV;G!0?@@rvp;!j0t1U_rjY(cuB*i zhKnM*lC%cx*$(Cl4>FH2pHCc5cs`?AxOxb03c3djGsh|ip&=qa1_05Pi-3U|QJb0H zKlP=i3#ky#5tt!K8nUXf1@lEqoC@*`e~Z5qL)4rM^b_5#oZYA9=or>>pen#tGCv)1 zO_Qrn=@PtC&<`31b_;f_K~9?n$3o`BSbLFjtGyL9gk5{|lFC9KE*0CuMC$knjG?YO z=ZPNqh$06Cizy@JH>V#igA;a|0YInTH0QomoWvR2oEVk?Y-PH*T%Im$b)FYzTctKs zYw9>e7%CB2eV^@zyu7eNw_vYHmJxFO?2iA@6xP6`J-T|?cu$&CShHHCx!e<-`xHHF z2xhmEPL3n!e)nlJ|EU=h74BYUJ#Zn{F!=kFu!)Uo12fZZKH@A+fOh{Z35Hk_>HN|1 z$+He&H%P0@NsuFJA?A3%5Yi}nH^o^|)W0OW+Z5xjGuoZD(2D`&$6+M}Xuij=8`BP( z;9%l<6m>H?aR1d#AL~H}xlXt7Qfo%2?)95bjA$pX|DL}90Nx!@HP$8x{Eu(nq$9(u zem^%U1u=i0o@fXrT?{ZoqK!kbSDsF!fQ*qFPixDIW8a)veHTIU1NhBh7YA=gUe1Y7 zf{%0G=IL75*I+f#2cJbhLR!pmf>=sqmWB3O3J`c9vjH|Y6I25D0h8&)B0C5!U> zLWVUiv9z$a5b7K`8)1R^YYj<-f{*}rXhdqr*7uHXQ(2nz*QFuCm#|C89%g%U`vvFEbp-R!fo05A$k|HC@JBx8_u2K+Y)#J{dJLi*GjdElje54kg+Iw z79>fhRzK4){_q#T4*+5V0FPn3%92rd2NB_%yei183Nk5`0OXLy3?;-!m{UnZxT`YK z`j9`Ez4j)m-m>>saFiH>H1csAf17M>sBGSS`!V1ngaQREz zH2YM!z;rzNxK{#_9=NF)3LxhG0WDzC>5N*Oz9oX;5T425EkVoZlz0}1_ip3C1hP<3 zJnTSrFH8?k6yQ;0vO{>hS+aA7iiN4a9;d4>_K0cb(MZ>YF6ez4IUZd)j`+M6Y$eqW zK*E^ANyB$F$UGvW6o2vd|9P(;33)HVx&r;~cJd1T!DfV-`?VXN$|ow??O`kNRL9dO zCvJGZYBvBtv1MOx1|tQnECCpV2M3v<`GjC0x=P>?)=Z!V~ey-8eY<#RX+C1sH_U|S0 zVg|hCwXnQRqd&s8#qTOgh*`Y=Xf}jAro19`h_PvH6OmiYCv1o z7P&Nne0H#2jpPh`Z#t;$rbhmC`dJ}TC$$McklwEYkhfJQ?D1kix?;#Hze=Wmr|+Vd zt^*+ey|166F^AS|9jWQ^Fo#Wvlf!iJmPcVPpqA{DU?LLZYfjtYQ!U<^^Rhfp0m0(; zBGuz)l3kUcFglq<92$p9TYQf9lyj*&9VS|zqh{n5Jr4Y9Pb+`u7JPVee0I$OkQwfm zO0`!tD0v@(`RR#ba|q-E8P?uookaTrgcLPV+jC(6laqE-$uBvL+e3qBg*U%zib}xP z9nY&Ik*WKeY9NfRBHU<9NOGUtY%Qo8lK5d&S4w7bvn>krX@8t{J*x6cU;j;OR9@jd z1t~Z0d3#+mcb%#mq5o{_`Z{07KZLeo$?T;Nv{|HHVhZYMHq5TXh0^GJs0MT_2|DVN zx@hjZm{uv#tFYGl{3Ric=dopZ?jxFZM%OOnpKPK!GFnXM-<<3gyU;_jPhYg0TD{z9 z`uwkC0x)sxEsu#1Vkx!2gWR@p_^I|GF`tsSq(OeH{cg2>(SSBzCY>PUTv{;qcD+h) z$+NO8;s?AQ8r{qSKy!+PsGeY8QTa@y;!^WNNregQFJBl^V$p?Y#Z=d-SHHsdyqA72 z_A-WrXVg)AEKp}@WMV=&Z)TuDb~O;Dqh<5UQJ0$l;o<6kz(G$I+)p-(`b)zT3czM{L&przCHf|Lc|f-9UGXEb8$og&4ymTI`=*B=#!P z@B`HxCG~M5u%B?!^58qZ5D1AXVNJ4?NJMgr2okCFGlPl}?U{l(DGD=j?{VZ62^cWs z9zm983-$r8gXf1W}N$JZnSN+R}nr>H9_1LPOy@{`;yP@j1 zt)v>=3!5l*kKdJW`moP)Aix>u(vemYgd0%Y^dVbrWt*~91hGVxW%vj7b)4Il?Xg20 zYUwWwGaNv)zW?hCkIdMnW-4S<7b#TdBKzb>t?f7`uxx=V{L4Y$qr$ub6;7>hfEGn= z1AVaXrI24n!inw%H!GC)Wj^Y+JHWhC|Az)LVv@(0i%~`)rWX6!IykhjviB>U=er7` zWYRRjy={3*?nr`|t_E&Z+PM_0?}-AZ_gl9Y=~i22kaS4EXp!&K~yvRGv}H#_cVF5nnl_`Q@xUlY)rw~a)7 zmk?tSFmx+=Jyjl_6GcU;K@ttfGG=*7K){yHMZWn9icir{fdR05 z@T)V)XKmV(=h52-j3h=Y(;ed-1f-j()*c_*RWOfOO+!T~pq+)9_dl9$k5z}%%j$Tr6BOCl$*lnt3>1u2FU+Wl)$np& z_xyLx88l!90FqbPf1jvZ+aY*l6r!TOL`=M)q7mWB=;ScwfWp_Q7nLXGZ$=sBH+rWV zD9N-!hXZywMz3SwBSU<^rnOWMg|;~m)~SG>=Ny$0u3ZKt)2SPOJ+%NI{FvZnJQdL6#K(F*$S zgHZQ^J*xl!3;?7L132RQ*o8!}1Ds$nzx!}u90WvzaBJZyb%J0Ti}1pNmx=m}dZ!$i zY;GPPZ!iN!5yx+1BEiA;(HKJGTTl$U;37dEQ?On1SRRmTd>7W0-^5w=$w2?jB8rwX z{y=|yJN5bghyKvF+PeN|R2J^Ym+hZAU5-1%OXJ!6e38SlJg_7VSe{=TLj0PO2a;WifQE0&Jn{31m5k>5<3 z43nRLA4ASwC}Nw47MlPAsnC?^uUNP;8q*&gjR(>qixl4H41)-l0G5iz=o%Y z#o^#}lJSGYxc(uujwH=dTSV98nxt$yQf$tslCYFiG`nsRJ7a4~!_vgGw~MmR+X<#9 z`&dCPAjsj7f}jlODJlbAwCF5aN3wUXR9M@fkf_`p}+az z*^Ja`5UrMctapzp41jjq&?CjB&*Y{m%v0L>5FE@1A)3{lO;!r0<7i^G#uAdd=%bNi z*aZ*Z%QPPvKYm)7xkZV^L?jTB$!3w6^@@vvHy$}z)Wff8@OU5!TRH>_z`+Kl$c1U` zU=D=i_2{cVhv{^|KEoJ0+#~BVUg)O<7TPyq}5gE`BqW= zA`(b8%g5O(OK7YnZ|;MmNuQrK7L#~=d4}~?4eUk4AXrn2=+y5R_ay81gLNIZs}zo4 zfLfVG<(0^O^UO*EAAIk64{CrEL;J=Xo{sBbs{O~NE}F}3NFy#lp)A(t;+X__wNqJ_w?wxNK$bXb6>Gou{8wM;h$z7-bL@~sF# zFA};Yh4EsSjdEZ&CL|weD&N;S7UFxCi;e^3&I};hqqJPaCHH06(J}!tkBd>AYUCD= zf~qP1(dE7(Nu%{X>v71C2^4dUN=L{nma@w{^Qi6p9(UsWlc>KX=-r!l3MQqm1JvA@ zfGK?%I^2s6QxXIyle4_BhU&dm>2cG1BNUD|E$R+O9eeSb_VKLnZ8p1=5K+x}?s$Yp ze$-y77ZL-Bb)L;uFfE{z(-La06@{f3MRSgV8x{X9T^8`V`_|APUEnb^{L3?~$NNAN z`4$OaXdA)C){s+BCOESV#in~?%M64^Nb=Ijz$0G8h4mwg)`yhNQYT^_4Yu#IYOo9~ z6>$J`9~B^l^7Pq=KwrC+{Vt!YW!kctS5vVO_;-;!eMzNPVpG;9wo*T931sxhu~bj8 zm=%B!Bnt-%%9~HW*o{+K{1pBx=#OGH>d)Fjss5CZ?JIS(m6PqWXx&!|9 zOSw&URJpC^uJUz>4q^n8KKB6*EKQ)CVdW>y|eMX{_ z+ja2)KBJ5<0Aa8dS#ZyzVQMB<`-ZLsR+Lc>OKP>xSx;KP&yz>Sgxd7h7!0XjF#24xBWk7`A1<& z1fa=!Pd3(gY&Zpj_-TD>XhE2T0CVZs6)u@u=*O5)WKLw|5;?9GjEhSij|*Y*3I^Q! z%<^B5B%D}YbFX&xb9@y>Wa{sa;Lw=zJr_;3`$D7~!nD_O_McsDZJ_~!}pwe|M@pFN0>Edha{UIwS$7QpAZ(jib zbBor4$ww=Sd!P1KwGRKLBuOQiGpA42;idoM4}b9XM>l$?sr7J^zW#ht>x}vdP;3xn zq}q<*pgf=XFjbQZ7F6VAD&m8P2Y@eMef_2h#)>8S>|jw4#nk)*h+lvhc*Ae({1wB9 zU-x?%w*^v5+4?T0>?=K5I8GsY zh=9enRz`m|cpr)S1pVGGfW z3W)6m1E-9808>Mev$;ei{wIC1!rqm(tXclj@Lom%EIf7)t1t$Hh@3-8n3n^IHzZv4 zBb)5sL1CAOOhS4lJL{>JXqf-9G*^9MoCeHeUt@MUsru-KqZ5-bT4o$y*x*|$js|t( zCu4R~K#B4RU{sIZp0TjIIp=$x^E}@kFj#5;X|#*|P+?rUYfCQlZXwGvli>1j2{~GL(8-+v^>xPbVZS4ZjJD8O(6}!1zEA`Lv7M8gP)UqW(@G{Y zDU4j~AMmxkm{#UmfpGcx_>@D<3~>lpwJ>YVPIN5X=LAr2(0qT>TUs%RENMvqGTO!@ z9VX8Im{=+`Jtl;?r<}yF7h2iuLYMot;Dc5@8{$i>8s6giJr!U^}Cc6=(K0jQdn0hv5#se)q z`Qct!F&t@(&>$fz@B8)L-hzQ-MV+9=fSF}4V`#7G#k|}@=WI3esql8s`<@PMVj$#) z9S@5Y1_dqd~c{Eb5}NN?Tm`c;9NvNH_&o z%tR?QSvntot`XI%$UH|>-POeoFPqw_ZL&XFHk}L*u_4gxEBvolI44#^|5yZooVQ?1 zPROl&a@K2cyA()uBwjgGkrahbw~mYArbh4&HTk4pw03D*X&ZeOQ%-ws+03Zs!*6F= znhMAvJqty#Am_F9Z9stNs35DtT!f01 zNLa(LNu7Mgx8R+=Sh_O~6AqqP^^TOp#x5*NHJR>*(ql)7H{PF^I7#CdicoWXN2XU( zmqL?|_l;bcF=EWc0IJ!T=@kJ7>#zhT6~!udtejH$npzfLP!^9nyVAjXBxmJy{ey~y zx`aW4-M1WC&l$k;qwr+_pm%Uh&^DisUT~3(U>ELB&Oo60nh6hxUAf6b(?bWr!V2H* zCu89)Md^cF;*e?ZhKR_gLlSyWB;SYnXJ!`@uO5KH!Z-=&cbp{mCcCwl~rOQJcj|jlNuCoCi>wNt2X>zjxMeysuz>^x93^c zO8`JR#2WNWU6TqJ1MH49a^2=+a}SB zmNR#t_ycJ+%1McTX9KV$mHMGnvx$^j25i|J4DtT8&lsS!v72<#JJ2RK=Y&YL0nHSO| z9fmG2(ap7n6x8Cg@Z6Oo$av?d-gPC-TgQtY%-a1?5bg+9zz9{JlR;SmsY`{OVviiC zwqnWXnTCxm)s5hUbGo;HK(SR?YG$_!kWWhgzj*Ft7#!o zA;Z)$=z*oi&ld^qA5W*H<)Dy=hs%6Ze*!#6epDyyo8C#rt;NaT^t2XfEv!y^=db`E z5?e5+!cZ*08z(4GgkKA^2{(6#^Y4@yP=;x}O zH#kBYXbfL%36$mB!bT}4(X^UX^_e;&HyQj+^^K@O0xHeE^PPrz33Q`?$4s`0(~1{_%I1E@)rNe!q5(>|t<+wEzlF%` zg+-dh)Rw{b^iuOCI%WDHx+TIC{5;w__Wg08#u(;RvuOVaf|XThLPy{Ia6%}BEK+@n zMuv>Sou?F;8y!&y87UPL!B(het>^1@80RHFan0xSdmA$>knMwCp`(BZk8`W>sj_b! zL6{hm8#z6u)Ht>OFAw2RNMK087=+|^z`m$P7f1~60-{2Cr9Hr`smO2 zh+x6b=nAa|Zxs;+4%YV7qwHA*q17w5@^_(MiAOw@(0?m);U|(G(rdJDH_y%h1ORYZ zHoRdsy4ap5(tw#Ro7I3p6Y1oh5kFb0wfr_u-bXKCyfWMOcOkyqR+`4~$TN@NkSTWE z*WF7H^xu1EHnwU`S(GyKRLyhsbT6uP?+TIK0b6x@(u6Nbn>t}9C zmJ&gV+W7ORnVm)7bz=tIS+{+(cq{cDqb4GiMUanRo!P@~LOWBIv=fJ7HjjD?`?y?F z^~dh9@`Z<=z_o|@rzPKmM0}jJ65k1o9N;&#d#Ck~4l1)j2$)?$-(gUE)&dl+*2ZgP zSYE}zGhZ@cNEpk|7*%04A)bZ2{gpoGp+EPh`V)u68|DvJuk{sE5g>~-<|#fGbyy@G zv$60_fT@8--iP+|Kz!Gg%|~Uu_6zerRxTyFR-29#ZO)Sf&(Ir?p_<4#Im;J&&pKO> zUxeDcrCCp_-m3mX=s1bOOAj-^le&Zrg&4XJ5TTIQFwFXp{(2G*ZFC85^eUtHDPmm? zbA$s2Y{d=)LcR`hmKKA6bO|~reP_EfDV4ra`FH56$ESV&9_-d6`WO>es7R03PT{%K zW5u*!F@52izq}&Xbul?uobWvX)u|`Wk;~?17%hHD2;wNvCYYHC8tME{6+N zVW#^j^6JWKweGuaVrw2h2%*;HJs9l;gbj*=u3NMC0ff4wmrF@Fm4+3_+DQIT0vd3qKsS->GNxKaM z3IorUS67d)XD;VmDD1C~broZxX#czUdp7`p@WvK7tfnx+@!++sLPa_m77(ZWQ1Yev zRDxS>$+%hZ9O#Kd_WCd?l-f~FpVc`Ov;*Gfcjscb)f>~k8;L0jtCwFlBN4&qbYKwL zN&=H3Q}PI40Bnh$GJ_Gt2!|lc+L9 zh}9TpAN%kQM=f9fFlCN7a-{wVdxYAp8Z_+Xj&B8K=j#90JzT#LJB<9HG&UGWIWXTp z=mcVC60rSgJ}eQjjA^+oVFC0w5kp}8&rC5oOu&|f7*p1qDv=h7BdfS=1_dFG4h@dg z8z4PHUPxI$?QLTJFSea9Eoi*<-y(wD-=`YH>{!mwoZFXi_MggJS9TnR{nw6*#@Bad zzrTq)fl+odKBdGg5&|$};PUPX0J0pA0JKlg*?r(tV89WSNuH;6hcT(H;L)Z z{}3bJXyRJJ`QN?&=J}@|3?p+p*#oH(AfA?Eu^o?kiQD-X>)W9+>AeQBV#pQ4aHrVR zyMg+!W-@MEU=56Wm5dfkPf*G5Inc>z{b^V@1wqr8837mLLo**+_gj{*08467Yn9z zH=fhLYY#ArZ3Q*7yCQ7)Ggd(-g?vkz_QsL*P{0}iK z{V0QK`IHQ?VQG1Q1e^CNuy7RHHcj^6gQP|17$^&lUm>XCgzv}97ADw9llcwZO7s~4 zdnwwnH=q3pdh}azkG@WF2=(yUvU0^8y7X4$-__VhfB1{h)*!`2-}Cp_c9WP#91hCj zm(9@Zg-+hvase>rtT5Dgjg^EUH|e&FK(&=j1q(@)m%HK7-+5x&_e@t;b|R?aLVTw~ zoumHUon5{gOd`NsSC|qTXZup*bi6(%e1{$<*Z`i>rO8D@O0VtVWbJr7#V>i*Me@!U zI;AoSvpu{0%(5&T>&B4zT39O38i!^%N-c9C7?qH0=pkIGR{sy7uLIZ>4h7{cWHRLo(ECKj{^-cKIVAh$wphP|a9V$3^wZ=h4Kuh9{ zjEkYo8}zNpqiT7=Uc8{+A6{30TGa6*03Z~__MW1y5JM9g8@N(6X~Jrs_u`|HVM7{o z8W%@?M-Ja`#&)omygZjk4|~b}D*)XvFe)_!G%C_8BJx$}1|U4q{VpDwBAZ?mi5vh_ z?q%YQ37z%3no0EE>ms92fPrYf2Q;Ze{XkA<-_SJIejLF!1VQ4hJTV$}amD>?-a2mkk8@TUbe+ng*)`@6n*_6Y9EsI(JashtpXKyE5!NjXvpytSEUx7K zK{hHpZGv6O>j(}*6CD#q*L4%;d4U>Q>#_t8@Z2++onL_!OuNkCxrEAECN|qGenxb@ zeUG0scTv*a3+LVB&{0ViDz&<1mg*Fv(IbK=fBT!ie4DuX=RBGkS{$ zKyOfWrD&>9EHp(Nk0HmQcFgl&MhdH#P^!>sPVzeY^&0NwALy3dQ{ulg008)mPSBnM z^l@PPD~_u3$bkTx!#=h_KLX(s8x5t>pV7vyA}`njqzS%XCI7ztXnUuLz|JolH%WIV zAzzCkpX=EkKJjx;3#H~*EV0lg#_s2ZCK*)1@m#Lwu`BJu$zv#U1)H04{4=Io_;b42 zZe-oOst@6gedyml%Ymm?uj{W%o>o3P{i{(C0|3(rP#VPQk{xNQ1}yKqouSLf1UncR zg^p6o*5=Qt(_UXVXg>izUfmNN&w%tDzrx&naeDFa8Ud1~RCGHD))Z#2WgsC4_2`#? zO&K|HJgjjBa#5rl5J3IC!$v$H^P`I9A2$8cnx>4F>w1j-#n37N1%vSdy&iw7X!tQ^ z6&yn9W~%s)ayk-sY!^lA3h>$Sem!dTgY87-*eYtO*vrkkS7g>)=p#T4n%G5fRv^>n zEUWPx1)1dxc{`Y9!Vop3e_%w8I-K*CERx`Ff7WeI`7I!;cg#p}lLtd=0`vobbuMwu z)U2?NoXEX`{6k+`S^OR<*=>mLdF;7Z;WW-yEvR#UkA@huK&qn;9R>!C!Z1!yWGav^ z2XxwwVR#V&L78yY$|s68Ia78N^Y0<-V0>oVjPh!^?(HK192uJF&eO=Sc~&IAJ=j%g z?q&qfN8P6vdo^U=6n^3U>aXtC2Y6iz7oS||dofeQ)5tY=vRc(z(V~WQG)81$H7Oh2 zf#&WqNiTKeeWncq0r1QyB=kii1)cKvGoF%%3Vuy#PQU5Fl3)dp3951^Yxd22DXJaRyZxYX^3&05NN1H3(^e zmnSRuWGIDNsPBG#;h zU0}G`&bPpFs$0-Uqp{sTeF~U=4d(ibk$eOK00x^R6!qgR);`Jvf_)kX$7wi|X(=t( z$8^B+hJIkRs^74<5ew>B1Hj9CV5L*c{bF`!^G@}?cSg{sIW%+U{q;p?ewo;|{d!}j zMJavk?;BZjB`f*An}79%(7rJh^A$`E+CLY|Pxae3L;auB6{FUP@S#;&@lY$m35^5_ zhN!fmHBcaS^*r+mn}rxpD9O9r^A5beUzO8EzQ$;a1@s!`UQcE*HT4z@36_1}oefX< z(i6^sLjjCu5snZbp)(f#3GWxNDv*Sd2)&K5-G0!zLnBwpbq*vXhzE4BpD-sxlxXIJIuC7G5CCQ<7ox}Un4-tKvG&QN4UMtfD| zU;|-k`bK`IO*F^(@i?PV|Ey4g=#QJfjxnomGnjjJ(ec>G(ou8*k*JK>2#h4Pmqvk<=et0P>gJw0@8XOpfu?oh6bX%o z_slWO6NqJNZaPx^UeI|~i~Fs5VO8@}sg&PqC#$1B2209FRkatzRH5Sspv~)wm{m>F zkO-IrszzYUGk$~TQSD3Z%%2jp9aUPlaAhg?I{~Zq{uf-mwu?1*5#pj-B zj@ReaCDtwIjM6d0^6o4<;!0HhjGWHi zx&BR(n?`g_wp5ZMe2fuv5%dV}c*Dl_Cmob&&cgCIqCh)sis|qUm%S)~T68bKJ-)~< ziy|*;8NKHHWvE96Q)@%Hl4)W{N%LaN_fVNECz4Y~{C4}E@zU$Lq>Q0~{#+GB^B%fi z7V3P=f+`KIC^Kdcu^b$FmqYLSFqzdBbHKHL;9wJrV=(wzd|S0cQo&FFXfCcV9`R@s zpu*ahPq7tg!8-+z{;qSqr-4d`&xtGH%tc3zrZ?M_TnX``DvJp?H>)`*`Ac@+mdY8M zC%_v7TqFr6vQi$?;J+K{ zo{FX1Z`%#vxmcIy%^X>=Xp>m3NOjq-`G?S20#>NzKiYOWEF$i?U1V{h*|x5yU<(|J zs9GmFr?~azwV}UJrck4T^om)QETpT(-}%q?V*wI!;koy}SV?}{WHj#ZoAQ=12@3m_ z{bE9+t1z}}eY2&`Vd?#R%ul)IUeU6=kd7}lcvQ;V?oz1Wyl8Hx4-2 zEE=I|dNmKk&8HcW7v7|)(*l0-U2laUD!1`!&_!0&a$q)MZvtos>xMRkZdBtQF3fVoToxxGK*d0K0BOLD0+~G-WrIwhdH54*Yr9UBH}6PHv?RZL8+il5DopgX zXRaV4ZSWHb@8qPJeDum{z7c|tUloh(5`a!5(oEfY&1&x&s~QpwB2)3);4TjjDDHtic(mm zf1&h)C@g3EQOqIv!(QGTbl>mMpP^HN#)OAIA8b;F9{ojuw|wK?keFCfX{r{N9tXNC z*C3cn?)ehQ%>*5+i`tD(`DA0~TdU>cz|>M?2pWz@Jk zAvB0=5kw&33-z@{?TF@Q+as|Q!<2A>c$SLNxrG3blM)3w{|j^^g<36xN|3EWKNREB z7FHOIB%iBMc9kgeFyDKOt@sb2b)unsjBPtcDOk3Q4x@64OeU1q^^$2vo#47nM>iWV zM}{hY;vLNsZ9M4*N}hd2|*cKD$a{}p>()*3v~#d)?wC&ulR3+Mbd(I%<&ja zFn+lI?&dxIUxSXrJ1RiGkCZ?hyTU@j4lLrix>~&%**<(~lzZ#dRI_K@R`b-t4(nl! zJqeIzmPUeEEGlLnC-ddBDX)_VPUi3eDdo3mh$5Lve`#FQ+4??4 zibwVbiAZz}E2ZuEf41$1N$GEN^z+N6X0y$@U3^`^nXs_MGz>_PKO?ti{9hA zEfj91?6p2J<+TDpApo3QWjJUOI?exeLOw2N*VD30#U`RVd-QXd)NlMP10aLvq0&+PHK9l&Co+>U<_~~B$jm_+8$L>Qz=4L1W zN(3@&SAHP=0HEw-1#{`u$XsTo(d+Pb7~hKcsb+b?5^&YEbeS=QbuRex8RR%v9`l-^ zzhMr7-cmlMf;xjD`hdE)Ko$xJO*2^)mPR@cvULcN|BQMEPnAGzY}OKgS}<9V zzURXPdwE{wyj9x27}|n>d36n?gQWxb9e65bSpw%j%PZ^D_2};qxc{rRIp?`X%8kF8 zXz4!VwvAvLwo>F>eHwMdV*C!9MoV*3o-|pFL9NKZj%gs>5ZL(qi7I;OJsi!XNgA4* z7Fv>>^H=I1GlK94vzQA2JP0CIOz;310evs|$9n9|T*MitA?uQOgBjm9=RGMOEH!fT z)&WJ7&rQydIiE{_Tiu6I3VI0L{`0t&+Vl$(?Cfy;YS!X|H+KEvs4cM3cBXbxVaHJ^ zo+H0UoA!Qn+%F3b`oT$Qde^fY2Tqsd5h=!Dm`;m_vNa>t`DNg6iYa*4$SORzx5G_d zw9Q6Jw}ETLM}Y+oKB($L;~y*8hra3ibMzah>gpkBrgLeTa+M-RbYWYmcG;Mo-+}i# zJ1w`TN?YuU_T;M>7ipr6=S%b679o znLVCkTNCW6?}kKYTL;t>J4Mqc20UwK-A}Ks%yDD-*2R5tGfR(Xp(0z@Fagmu8 z65UlRQ|{RjE+b6GDqAk*&>bzyUQ8nPNZ+%m6E#9qgN;GR`t_yt`^U!t zL8Qwb7Bl&NH19Xm$o_~()x14Z8wyAUArt+6p#L_XkD1 z%ralPknATi$u3L1R?{k6P;nSeOvgwppGxs#sXm@&vmFS@{C2D!P&78j0`Lrj@Tmj{ z$B+X)Nmv-~wxM3~;|dgUTPvRJek&Nqp*_6yE~$u**+@n!P~seiVHnZAsZkUlJ_0_= zk$S_Uekz)Q2(H$l{J_r14&}Z_cke{_t+i6#q`Og^lz0J2_|z_h(SY<`TawfOC5KPY z@l{5rpXTo|!b>Q}0{}&o@!~r^IdSQ-fBJvss5w(iKlE$%J<+kzSzQ0TL~F*HSqV;KS5Rgq z2n$S3g^$F7;g_i@l-L7o^#unu)vse{(^y^RuV8MJvaO;HVUP%`5b88bGH7?XKof2{ z055Hz-%Gbu5k~;qZQVA@f#_4z=J*2|E?XxCO7F6t(f3nw#<+hN8BEnBmZtc37DRGh zJU#qAG64$eNm-N6Mk{m`I|~JiwPl;6rS>%sF|}-fVt;5~3qE_r26=?(o*96S^Ua=k z@CK#ttb8Hiu;^p$Y7hN>D{Ac5H_s_&@<_FGA3-+>lb5D{#R6vTGGm5PFrPRpeN03F z4fZ}zm<4?`8{>B7fi?-3u$I|MIBD+H-L}>BP5J(C;bGwUSTD{(ah|z)=p#A|zvU7z z979Uw%XG>73!z;+uz;T7JB>$R!SL=0*{D>qW@BwH{vOoVBpxeF2-(eK+?H7DdmRnw zWc?oX&+a$-u2~x(P{u!@!>EBvtq~w&&Jm0yQYN=aE+NRA-2Jz*_Fg}1vt2)><5}n& zg)IO8%f^|KX03j0B-=7mYFR9byu3Y1cx0S!a8q6=_0ILHG$mq@sy2<3kb1#qg~ti4*4%92!Dm4uu>>33XctfZ3Kv$i-D4IvVa$ z4c(uWjgMAlW&7x=h>KbSD=Lx`Fef3Mgrnzz`JQFjRBsXv%;Hrc*gO))a1ySKnqSkm zC3)nOkN#{#?tk~@wLb7Czoek1&G`GBo&PI($B~FM)6P$JETw4HG}4|Z%T0rBhYEl- z2CS(HIyuH`G?Jx0;Tl~r|AIA-tC7*~WjAPK$nO_OcKtNlu1H7m`r{6tAYN!)hk`Rs zUo}QdH#Y}_Qg83?7Y@uHNlPE*Di{(J6|mVe?&IF-&sF?}*@e&N>o_mqs~`x@G3O^W)zy9r^(?= zXRwyA#z4;Yo$`qFxB5>yV+P-^uWI5NPF(G*Og=tsXe_vFY&>d2A6k}77{^+nCrh*C zpqTVy%#+BZUsc5p;8zTG)0gDYOvbr~k<%pazpma0bd%fQszG(EM)YEdCw|etgo3+h z2MELap?0Rud?mg}3T?BukGNK7#Rbxpm1P*F)>EE3#R7_LhX_zyofE*p7f0l2$3vVRJ@-7`x84pju<+tn-1Ic6`tG1WDlvvTy%x8yCK*7_|H>_qw8? z>`01{_iH+F|FCuJ7mMCweMF^&Csi$4Y<1>$sAwr69}O>BvgZ>l-N$jykR2F0cV8*U zV!M@xZN5j^l1XW%MPaT&9b$0~ee$KSq|Wsq`)kher@`NMdvORAB}xG33J$`-B@mf| zbQOVWe^Q9T&fw?6$QV3r08k!;3$HHJz@md>?Sa zYS!Io0VJKK-{U~llj}*jl(G4?-(Qeq8JWx;(L;G}4U@fo!)H}O0Z6=cOclxb zB~8rsbHEK0ydw^ikg_!k$1jLTA*bSswKY3x=oGASM%c~S!Ir(=n$Z!e0|2LFtyWJW z2O;^!hJsPsqh3I{twOFF|25N+Uroj4eKjuaQIGjv;v`lP4hKZ}vh91c+={pPHdR_P z9dlBNn7qn*5?1q=5Xl4U{$c;TRR8J+->;wVBc450A-?@O%n&BKLxUv}1AxHpETe3H zBn<1q2k&<@UGDGrdW%o29vDPP4pw)W({tgZ4NQxqxxA^$kUV>Zz&x^fs~rhYk@pXT zO-R3_gcKwdk?kY&nJQ**%2AZSuWj&`lME*qIVPk9Y-Y#F%oc=gtzefInoVn(X>WUA z7b1#Y{zC{u3O3R;AP+VSc}dPU6YFjMJnz3hTL&ySPjkZ;Hle zWz8Jqt-Z9{h?7b;X|#T+MMssseH2i;L_=+=zpj7D6=G?-fnD_I82#<*W4*?^)IOOG z+m3$qX7l>d`#LjogwtJ| z)RrO)#7i-nmgRS+siAc7w!~ZKC-p1l+j@zoi_yjRd9|PA%3g2SP>#eRipW&+4&_I~9ZM zmn;XRQTjHO(rGNHJ5W3L#;FnFyEJ#AEk3@^qb$Q7{b5-5(A$QynAgC|b@Vl|MW~t` zZ`!1X=NiuJ-G^hPwe%3vBBM23KY+buJK++}U=Xm_XB3+TDQx^wFw%!vqBC)nnTn5i z(sL?|MQ6fqD9c`u@N$RD3%Diix4e`88BBL zeQK|pZacCPOI)1H2$OgmVgG*f1uKsrN#R7%(I~aQ{R?wdE_BNImFpuho>OmWZ9GiC zR{_MC?Gs@>)3Ngg1BNw5$}o2#fjA`e(|MRd-K+ZLKUZv8bjiY%k#k|wHcXdaH5Fr+ zXx2DO2ll)B0To=ie8;AI4%kXBqz=>LAkKDB>-0CUN}ji;!%7J$d}FskyvD4vnH8fc zM&Vn|MXz3Q@@zIcPyLpBv)p-n;om`(!7ft(eM0BKA#RjZhQ%ArZvEGO)4f27mLv-! zvC)~DR5IdSm$x}NK(yA583uOrG(MHKU!}nmae)A13JE)WnJhNWAhSKMTa{w+`G9mk zH}@maX}wVNL=EOsN9M;B#I-=NtrmX* zh6D>~&QhE)O_T~2SAU7+EzM1TAtn4-Mk!9-z*(6d`d+igL9Kusz_=n`DBc&ON%LO} zZ6<&jMQ8J#DEY{jyJM(6=E+YKv_0$0QGb#!);0yj+YBD~{av~gYs0_R}ae$f7ADcCJIXSBOFYdqm(bqODQ1LyAJ@k*5lLQav?k2iJ5AzD@ zL%3JkCxcv&X<=@OpGjv2S9r*Wnar`Qa7@}vd)aLb1f-HjarHCi-|w*_L9>jbZNw73 zw%r6Q+2+>QiXGfS987RQO+1|_jODY1|F6Kmm*2puOQ_Jd60s`Ipk%Gp&n@-9P<4&%CwYA!S&JhO>wllgBypVG;^ZOS= zo8b{(L=2=KS+>GL*R@DL6@PiCJ}>2C`qguBy6b$DLLdecE!E25fZe zH4^M-snNAYqYlLaKcAnv6&#&CwfcE?8LAGT#3p1=@F8D9Ks{JkQm5EQ6tYuxStr#S z6lz0ao3U8i7=`u9T2;KCx4f?NQleBM&Y7dNY9Q15izzKALIr+c4j?rN0C@f{2S-Vk zj8!MuqbGAeWH~;@S+WThbX`{%83eVlq5kIaM$`4Vve9kvY@KPY^fyzUiH;6+(UcUQ znC~VL{+*M1blZ_N<*&v`_;ReXzuJ@c#~(C0(nCU=8*eGVN=aNmf`oMJ#?1!%X7keb zeuAwSfagOnI)^Q@XcnM_w_yI;H?l4Ie(i5 z!SK0f;(w)I5&ic$Lt{ARTE$HSDf$3cFn5@suy0p37pz3#i#c6D$6?I@i}#i>G7Jf| z$s%w~{9T*z%eFxpKat~wuaI*YfrK4XpcOd%{qd5S@@PE7K;VT65?+3{qsy&vae5{!*!@t~ zyLS5cf*S2EqyC~OaGV!;HoXN}+NsI2r1mi)MZxy=IQ7pqXmn4sIPoWWQZd_ztLF>NB0v#;;$KNy2q>RfW~xe<9K5vtp}>f z-;J)9y?!ZQ&UXA!`i!o{%(QCvFmx>NR=P&C#8U{?6R_C>dLtZ`xJe~n06AHrrW#&E zY2Wz*Qubev>G&GejG8~m{r_>2`N3mH|Z~-(N6b$5MVdmBTnZKv)hYr{O+cQ2! zV*S*`elR3*qoK{5)B|b@eS6 z*6FHR@ND^3GM8~qR9y6Tmw$B%B0t^%q(I=w|yHBf@p> z)D32rS=uZXZXb4&D-`u%<<%2n(fLCMa^~bM>fO1pOB2Tc(!i%qU}qXR$5Lt(Es{<5 zs8#JR`6MKF@dL-!&2c31YGX zAjr8NN`m)%IO*hl5DgdR)rX)n^EuOp% zpfZkr5tX=7sr7M9EKOE=v-^) z-}3~>%p3&JT|PzMT&GYC1?#2;l4 zq4+4Y1T;@g(NeEJG>f(f~t=LR{MjDuDnDQnpbDxp|3EFB&FTMV7hN=qeu_Q}U;EvLdzw51 zf&gTFs&Ha<*n^<)6A1l1B0%I;>h?7YeLA_i&*SL$H>9igMiq^693=T913QPlGgbi1 zDG(rfv)Jt@%*pN01k@JReVuFVR>u{893H5Y+QNQ`B6s0_(q8j)-Db zb2iVy@Jz%$x7+TBj}(ZphjN0$CJ1;Kqab%pOaVH7Uun-*ILsdEt1uVm%mNA9Mc{jF z%|te>7YnLS%#wZ=?k`(io%YI{Y`ICZ5EilWjZLKJ+v-WNw;R#r2Mz6cDrc>S@VhPw z_4L`GuQDIGds><|S7BOB;++PVePtl@EQZDKmdUNo38M4LIC+$^4|n`WK>4J#eF2`S z`xde-aR$_1_mITvP-X)`lqb{(sN!0Epdv@wUqb^9J2fZ32QwYt)=gOC~9`TE3F_mbg zrTnO#g~X1U$IlYJmR92GGj@KAd_|YQ|Ks^1^gXt9Gr2LlUo5NyK^|pS$p-|RUnstt z>Qam)P){(Br6m#^b$KD2EBYYGVJBE5G|bv9{IkLpT6K`60mE!h>WplHj~D@<4|i*y zARq~8@~~0;5n`?H5E*r6Vki1k8b``G999c<1yD5`otv<8{sP9DhJu2mGAe^dEt`tL(zfQC+;6p5;BTNuuhE=mOU-5>%7bIO@5A`pbT(TVa7jKNY5WM?>VUapk)a6q|#gyk5tTtVf|7cZKqmb420RGAt{=#;(Kl`oc9Z__Ahh`qebyC|fR z?YTl9Mfvf=LG50-oXAN7g`dZxKQhlCF-cw`=amSgpfspEhNh8BvC9Be`VFr%$YBEgj6wTa~t z-*xD`XP+2m-V?kT@S?J!7zpbs)@O6SYg?@4x<}3kG12G}lY7+7%a@@yO+ckr^2^Aq+ zj=~jC8vMHuc_ybT+OlyYFCpAC^E>)BMG>Cz9Mw-H=_x87rCSn|B)|Ma=u46jg{T3& znT3ydSF^%m6Re-H``Z%>4K8sFOgQN?|tarv@ugO0VS1H=H(= zsE0U`+*p(WD=8N^rUp=A?!sizQK34FMcIY;VZF$q%xjr?4;gYgK>XW)bp#mGxa!8h z!c>W{ygYFCa7C1ouB33whUwa!2j;wUi%EZ{C|04MpZ)2U{14YC?JINv5{Cw$-r#kW>hPplUQ6RIh6+I4v0$E4^SJ1HPsuc-lxHy+Ht-|~bdr&?J))Q_z zzcuZZ?$px;a^R@XJQ0IkxucVawrD}+Wn^sQaOpl4mk^Ky-kbuoMSvy=)Gc2E<}xU> zpH(FbOB&dyPU;YIC_2O0>Y9!6+j0J=mSo~s_@-tMohLn>@b&e}4LC1P3B?Vlw9RJl9N5iURGoIoU2j*l#w4!xPh6$yVHr)Z0vtI=3x7VezTJ420#GiX#|U% zGb97e{JI>u>4eFUVXI=u*8-(8Zokg(;z)idT9{N<_GkFsriQpP#vCF5q-I%;$ayvR^u`wwplqJ})g;WkT=UQ_KxJjV!oVtBz&sH| zTbpd0Su2If`s&E5L8(ez6lkDHN~AOqcZPOxcQ?+O$IW&vnb#2ghtOUU)|JM59-j%B z)KEW|%rags`=*TL%hO9=F+Uu((>%Hi)$NJFo{r4;(pMo>52lsOZ86HAX zTEF$TlX^ke7mM3HCG+s!{bkBswYU=5QjH=#;I>WCeKYKjB{+lgC#6D zhP6+3AEfrtAtxaxGCqy|VuzIDoKuSC)0=bW_`m$|LBvAG0tb&TjDS#pDFYuNivxsB ziaRe3$1<`8FYWt6=RW&Xi(D;@Ba7V^I(BTc-?fA=A`16f1Z7_7Uud$Eu|swkK5V5l zM8)Z%Sya<=T#KeTsl|S>Kq!^N#%+FsQhiO`f^){|^Cdu4Q-Liv^co~RW_ zI{^UR-0UtuWQN-K0RvmULkwOnX(X1@KZL%50+=5gNw4bH< z{n*yval@Dq-bmJkUtLa^&D6eu82U_aj@-j9Y1^v}K@9K}PDE^R=9M!#GB`DAZt{a5 z*+U7<30X-noCOr&qwW+$+_iu-5kfc>ffTm;d;d`zE35~8{jW;EaHz3D3}8t->I_xt zklv&REQS+F3*+8Z$EAAFc560@)AW2i;_7W9sFt?WyfSF<%Em3Tt@@#A;87!uI!Z;9 z%-I=}tm@?kuw?32im^uaT%M^@%!xI`xaO`^^X2`)^VR+orwA9d_Uh1M`!%PUdEUfY z>jowLbntw@~^(2#1-&)84j>Q84*`Bwb}# zR9zPxV1S{!JEa-AVd(BI=>`b_3DKd3?hfhh76ha_q$Q%8+RM$BI-%hfzx4r+x*)iI);zcTrGD~!$`Px%X+azR5IRo; z4k*m0X^)?SH6?W0ZFOoGz&9;ApJUl#{H-(~Vw=(EAe5}hk2Yl5! zKjj65Ar}?MG3e+Kgp#24qee{UMCP5aTv_%_xUAdO0LCs;FC^NYk)dK4Jf6M&3 zcA67<;H3eq6*D&AVo$exx)r#GYZimNg{Qm?^MY_C{OqcN`K)ZS=yEnFUyj)yDrbYM z3v^&5q;ee2wi1)246DaUC_f6_A~jEcG!Ta{F^ZP1@t35z{_A@H4&Z|xvf8jUfC1Hx zp24;V7;qA;n=)BY^o6L+J z{%$t9*f%Rq=;%x#?U9f@OPe91%Z~I{6@Hzl3JPAhWT1(#geSb9c;y;>Ar7HDugxPw zysd;Bp`6NkIu%o!#yqO%ygp~b%@w6kPS99>5ZFBMaMUh{o)|FCiN@ zrliRFUTS>u zji1AB04Q1=S$Lm^8@0+M%JbW1DFla=a#LvR_;SNh7|<4%8KS2@eZwz^d}@NfdC*C+ z$~jW^PZH`~8$~~Mo9k9B%ny2L9!7W)BeD=xO5KG61OgEMa+9TWH68^>Lu2tuAd&IM zks29frGUUrtAqqg2-KZ!Z*sGHHwqQEeGN0ST( zSULc4|II*^nHJ|%=g=xSR=U2E(=p2WhtM}Ppox~= zqB>8RU}FOO}=89AA3I7)EZ28neUAd#fteaZ1WhK9lcCI4+aOE>#hUC@lG%Kob4oT)2{}QaEN>=q6Nwxqj%b>z3LwRqOUQVN`ehYUX(Hg`zClrnS{$CBqlckK@I)CWDu) zO&;-XjSg3~q1Fk{aqz_FFExw+7!+XmF}VfPvuYn5>5mubwbeRZsNH5227iD2a5E+0 z*H^N##Bbj1)7>LUnyj{eT$wq03b9!r{RREz^%60q!wj>w2QDE~^6MPMFtdq)n2|z{ z7`rY~Bx>A%pHA1WFp$@~G*Ul!KpLO}mw=|5WX)m>$j?Kk46J4%9N5}Fgtp>Q1|dsS z>ZF1~r8O|gq12QRb_Gpl3ta$lP5#X&qcX$Xs@Gd#buy-6+4>vl+(`R(=U$d)fm)HD zcx}X__0GcBPv)mutJk(`1uLI>sd)9!T`95ph@gOc+?!sE*<8M?!_w+03x9d)xas5S zXQmt{<63h1WYNXnYG_h@xhBfy<{Ua7r{gt3&^h4FcF$k_TY(;mP*ui>sy?#;FzXyL zae?V!2Z@6)ISUZ6PQ;?D07@A_b|N+!o#wJ=*a}GHh1H*SjbZFG6Zk;d_}-TMo2iPQN$oVBO? zW%7r`_Tx{UL{;(}qqIzUqz|uod-w6{XX>=WZv zjrNPwD~_kj`1+PD?}Zd}uHNbC9iKU~mHss4q`=R8FMZZ=zUsDT=6?un!{jH_{!1T% zFqwth?3pFa%c`CCbR;ifB1DqqW;0PJ`{_F%iP^*#kQ27DHNF=zo=Rm>@b^UxbRm%K z`gFd;^|;(705O10HGW};SrN*B+qKiM#kz8iFN1XSaO2{tQ#zO3CR2ci^#EQ0i zP7vrriiUOpWGt8>2`qhT(csZZRawVw5!3U`NhBX9ds?qOdz}4O_CDFo` zz7p5);pWlXt*EHI3X~iAfL9i}q1Q4!Iq3035&h&AvMH}$!TygfcY-!FtY&}^>zBz6 z)yUhN`=n%VAROy|3?QTr2~j!x)qS=Obhr{y&G#^juiJf3M0pwhtTVSs==&9q^GC%T z4KbT<7}GM+YY?{bMM(YKgar2za#gl4@d!?OUeOO+jAPlcs2Y+uK-!9sQYCd48VcM` zGL;;ao5H;CswMzgH!#B1mfsd_)N#Bi)fxgt>j{YVvWMU>>PD=n=l184PZW6>24ry| zTu+0mQ=57nd&E1$Px8Nw<}?0oAhrH^fkwkTTs~^>OGr_%YG`G$RPVN9Vt?^ZFMjM} zhR)Ye<+#}$_f+vI$6x$JnLMYOf@*$Q02KZ(tfkEvgh_{T-cf7eBff~e`Y}=?!q{d9 zi31oRMBg6-cY9?O|4L{NDi727s{38iS8xwu z<$Ow;axJFxugNhGvn8a*PDm5&4{&{?&5uM+=@^*V$~4};1$W$aOR>48VUUc(zi_0l zr#7Kv?&lK^e*YkHSEI5h`sJP17uq|t0{|)rK&XhWo#pq$!65qSyk<@&VEjsoikVnm zB^(yV;yN#-z*{odx~MvAH7RNor=z%dtCxg-7no3qPuy3u=r3>f{8*29RI66YFki6$G@0RVA*Ew@JX+P^ zhgrkToVa);^Q)f{e_%xX)Zj~fvpzGQ>Z!T7cPGt$N+fglCpTKjgs`SE(y@vr>DA22 z_SAC_iKSUMyYmC;ErM(gMUG*tPAw)XO2IUcgZ^eyE>^Kj)r#oNi29OVBqa{X9xtHK zJZ&}la?ZkgO*6FMw4j2csED9A1Z<&VQ}`gku%}x!H>V>6(UA8ODZ*)pSe14#hF`L> zmRW#5#;Kkq>cglUsnxo1}9tT+I2`42=2#?yX6%yn=%_|V#G_yp1aF4daY^d*m|%ba~>;ctB5J{Ls>M`Z;VT5c!wEn~kiJ56zBZ8v+`4D<#UDT|<`SZ(f`EAqSVI zY%LD-YCQPCuM&2)J@|WRqXDZqla_)Cn#dD0SZJpMF2J?|lFYNv*Ts)izGx$lcVj8| zxQaNlk76KNJU1T&x|w}DXNRy*M?}v=JV=*lB%pzq5|sJ&K^2luAY|mObiRy&uxy^K z`7n0%4@e;BQ+BSHr!@1iFW~e8^-d3In#k1b~rkH-7fNbSqJUV3Lbo|TqPjlk+J+E8S#Gj5IO);s5l7&9Wh&)FNRm}hl|N2u0Bfx zgU=Sj%YrWK$xN$Lo6?y-gd1K-)-Lg2uJu#XV-uR|54#Ucs1UFLb|&=D2yrk~fGb$M z>-L%`k=eSMs`o6CPIASplwmlG%$`bUtff=y%IFEC!pFPWr5r2<>#}#5`f-V`Ao4e> z31fM&Waf!#l*Fa}ttp1}@0O|-fNOUt?p}>eVZ6~M+#(!>^(+pg#56I&AqsVM)kN@^ zL^yn3j;W34?V^gzL%@W4DgY%B5C#ME&#%x3YL11OPE}-MZoOms!S22Z!XiZ0Y{2R4 z(&-ct!BE?weC?4eX!Q_;E}aB_BEChe&e0{~U?e?kT5Ldin~h;O)R5jQ>`K;g`plop zR3((sQ9QL+M|Nqdmn&?BO|ZtH;itct=Tt|RhH6xM;y;9TVDeY$i{G(%paOdjh~rR1 z>WsOP2UidD7(pb7$XJ&y+C5u1{2D}*B;m79?a(^!*zzr4V-c56d!_WlP;jPJlgdmD z*}-1+sjl*+w8X`Q%5l3PF^ZFJ(rZ|2cHE;U9G+jfwAtt_a#MuR=|f={Ad4zIqX;{j zCVrO~5?ZZDT3DO^keFI!q>bC*bvvP2{@#phK8B-~H?mCmm5nt3wRXM4el%K{9~;v? z_DHfS%o#s($9B{h^)nY``&2v{cKFs?ONO4g`mOYQfWp=(Lg!1dUV{CCWAy^9m+p!QF%P(*`<|9y}613yFX7fKjQ%A1U=k!*YknHSFA zK5j)1qD%?49!}sJW69^@1E6HEunfcRLv=Xl{}B3yrl6|5K%~J-EX0)Sh}disoXV(b zocbbasK(+B6Ei9$#v)u1k}+n5aKhO-u2Wm@wRh&031ll~e(V3c<8yb_qGVH$Wa!}> z9t}tZgJv!KH{I**FOyH+gi>Ag=s1jDz8GOvQRO$^r9q-2RM1V{;GPCgiRPTC^e}!3 zrlNQ1+Uu{`jFfl4BHvIR_O!&x8H4HVGpz+9K7;QVl&SIjY#$DHn zg$}V@8Tf177x<$$(w~>>?W$qPwV-;bJM=_zQ;tJb1bb@ll-PpTkJfgmoimhukbN9wB_8D!ulb&iW6D2Sv z7|*oyrvtN7@};V1?hxZDx)=5HnsD#)SsMmbfgiLRr!u}+4H*@M!s*moE;?;0ix=R2Qha^oBlN7)9 z6_`sGB8V~w8df1fmJLAKypG2Jzfi`?1X8%D{t;(J#vVvOrXaN<&`({g^pI%bAdx() zh;GetD`!OLJFQAhl%r=e*Ekdt+pIDy*$d7bp6Dq2!`Qph(??dFX-R}djB%VHmV@zEF# zkF}uxzVN=H1OAZOJp2cU)v$G3^Xc!UfJL+f}8x89vA^b|u4XyoFfy37;D_<6<>)7>1~ z_8kl(Lv0^>=40BDQ#oz2f>wf{jILq+zZyEgew{D9NQFUDq*xlO>~OA>I>UE=)(8;;p1abdx@=6oT2o-57oT-^=NYeWf25GHZZ6|*optqc+O@HUFa@$ zx-DCt)W84=>*{uC0qUt^l>yTrt(UfsuMf^U!;Q$H;~PHESuG4Gvbg=x)^2?-6^8lrPktB5Tqf* zm%1(nN(oP-$Q~F5QpkEWH#LED@UgLNLmh?QS?@3-rRej5y!Qs7Xt)s4S=tZ>B=I8lp`M#N2Ck}c~ZHPaa~hK_EdZ| z^mq23HZBaIpT#-uvx-p>Ca#GY*(_LEujeJRi9QyH;ix$nHd0LM)tYK~68Q{-BRT1s zt_aTZOpfP>GJVJV{YD=}DRr+&k~II|<_%rr;%gX=!7G-ZkDrZ$^7UeHwbX(pfcOCP zq<&L-EYj{2wq&*4Se>IRln*_AJOl=}GNWiyoxCr6x-mirQ9g?d z-b$IPv7K`tHI3Nx(euj)w++2wgR5#b{}_oD7t8X!j+nkYd9M|mO1K}zr+3UXnrk-T zZ;r1iTfu|#MSe`X;AJ@L#s~2?+Lw)5hEsde+8;gw@Ua1SEw)l#I!$|W#HYWgM+CS5 zo#Yp(9fz`G%-I})SXe8>)VBIsMO@O_(ccg|cYvXqI&v7kK5jKwN1sSW1>cKYg(6VvIqtHs?yoP|F zv93BdIo2B|tj>zEX{PDJi9E53L5mqEC7wb?D6G9152U+loq_RS4Rk5ore~=TwjZuc zV;oXEM+A8sn%V0G5&bPz81-y2e6gWkt9uQp0%!3*6vaiCS(aWaT_%6_D?yR(dLVk| z68y5B3jjpCytJ%>-1r^7L*8ihtN}P7Euxsn=UodLUFgiUs_ebXk4~-DS!T8OfKvh_ zpO&Isda)GtgeY>oRZ;gQs5Jm^;A&T32F3>rDBOc1KTRwZkqDi*pGY%fDrd8fJ03z7 zKuRnq{!XyOW_c28Ma55X>ekCmu_7X}oD7+W{#2|W);A=5g5;w9G-_LPePl9hZ1SPu zX?ige6j-7G&8sX`fx)orcs)^UrKkV=E>_Wq+YI#nNgu$a9Jx|qW&}6aN}8u0{hjeO zx-bmqRQYt2xgH0_rXfcHR8_~{t%lbC$b3&ullg45)*`lOgj5Gkk01y+mi)d-} z_1VW8rvrm2rH?XB&6+FYWm%3(w=UKEPk4e~IDa#W5NU@ZzDQhgX!2`HAU{RFkxSfI zc%lY-HYPJYHY)9hd`Pl0Ikf@Mw0ybu9igr~BK+|6dtc5F93 z80b%AYGvtzJs>5!guQ)&f1TXT3~ToT0ICMeeaNPWO~qBF2=&f3KSiPED6s8b15`Aq zeX`=<0=ac8_T6feZ3QI=-<*_rh?=}JR*cV(cGpo-t{w{4_>~pmm2pf5xy!q#r^I*P zznoe;s3?CFs3G4qH8(7=wFaozI|BfsV<)Z6*|q!mG3Kqci_Dox{rwQB= z_b+>&A`%kZ(dT;iMD?6BQD`dPu7Xe&hC%@j8G*XsXLA|%%G2=_rWVsfWvl(!gbdoRNG@~E-vD1f4VQM(F@ijt&W*Bw261V^BL&acH>G5mBjS!^yZdS*X2o?lB}*VlVyMGBet%4#wGoTw^9rMs*4^5j{^ z(3(f$RCvZA&Z|f%lLW}w6y&1magyXE_>>Ngg9E_PqT+q*bq-Y0kW`9jl;75Jw9Axk ze5NP*h$)SH3iCWc=+{ia(_Db+KZG`5g0EEz>I2D4(H7C6fcxK4mJC`W6p{* zSq1|(0~|yTlHZ0zpS>G))W_W(BfBwh@MX{bg8tskZzg56=BhT~>ahFid93%gSJO!H zu==^Du7EGuRPV^L&6U9jIeRtWorf z#1CJh$d5b)yM4y-qb*asp^aM>v8~Q8W4Mh=D*^yKK_l_xhz7v+2kjjgxtYN`qRo&H z!;p!+)cx>^CxC+Q-ezrBb>{JZP zV{G-$2`i7mrUTsino_4ZaiVA*bTv2)S$PO~NS26Ot(y<%J4rXhy>W@)jG%UvZoCIM z1aUGwyuW~d1deMnAp_7WPz57_ZHtMLWav8y8HY0(`GQH58S&(Vy!JQYXldhPd~b!W zU!$)KNL=Y86rS}X>IZ|vz@LCVe;@>FE({eD9kjR{nVP%7Eu30EzWpj8N=*1%=X-nS z<9z?c`!4-#$drW0%ff7>H$j*G5ZXo~PF9(x^5iK3qfll`g=?gIa8s_YGlP!Do>Bke z&Ru~u9QP2bRSgq9TPU!okj{6)U8CttZlXPYHE>_u*a|0AavQd>=y$|^bKszm?J9Bn z{VfRlCF~l%0P$*o9RNwT0tx!t*hw}rmwEr}Pni4>$i5&6YCH}JwZ2V1g?Slwz`ic= zccVYrdxZ#%2l9CpREJnL4}?x`SQI9YLe54)J%Zr%(nHxSdZxQTpBR&Yv~;+2DDTN? ztvN`>LSJYg8Cr2fVLy(P^0=gop~)-F{T&-6(I{=Y=&~fV9Imb;jZDxOuWp=R5j7E) zY977BJx@)T*I~$2@jpYkcbR1)APoQ|Iw}^L+ZW~hdjGyp{}*EF!@w!C4Ml+hb*KP_ zwpd~(Is*&YO3Y%E$c7jePbqGZP-$K0qdI=c9y{}6MbS5QvZ_o4vPx}gnUG;lnH%`? z0|ylG^LbX81xe84^UY)vu(^RF<@~b48D%*g5leAlPZ)e~vzNF7anl8YE@Ny0_OBv8t@L=wN+$OTSz;Iki z(91UK#*@=@``_l)aVfw3R*B+aZx|51E78snr0=SHriybL3v^hJX$!Ym8CMO75DEFn zVo&%(mw8l@y!5Z9?#2#cqlN)xAkr|31#OkEe9?Kwmr|D~PPzfXq}K!v1d3FM&s_M=gG zqtuA0CrYYJn(5%G&UXLzSo`x}bH(4KCyu8a-K5JmRLAqG=7~v@-yGl#ltPbIP9kqF z-vofEXan<~`Sk9hioBEhZYP(}5Mwvds!ZaDx_MhQi`WNnMQtP4UCk zPvHyC%OcqiA^#kgo~)-%NKA$Z6_~K;XKj(l1WQWFe*iE^BFGi-vM((E+BH`0dyqv z;~!djBgdq6p4AIgN-A1KHQH7b!(BcO-34zCoQ2-iiO<*EIJspHAFFx7NY>mh4iXnR zdgSN}QZfb5yWZYEmCQcqB^~^2lvQl>JsRNdTU-PS{G8e>{sJp(1%HrHE&-s|3o7A@ z8q<;*Vk{CU*};o_#2#wy+)S(JjWO7K3y3&V2S!egQzHlewHd^-F-X8C2PDTBkHPPZ z$)(5nVKuEX6q45a-_+*z``%hU}a1y3I@kNM63qyHr6_boX# z@Ql6su3Xd==T{6C0J2x42Mw)iXQUm`5)9m4HuF>RU3&abMw(lAPuKc#&T*}z!;hjUEicUr$f_?Kl;s7RZ*+$uTltqB>_@poMX5ucEFCtYPf;is zHS>k{wn}f!MUO(xzZvZq8V~&9QXdG3fo6?s%$=S(GI_^&HnB^Xti~-aE{t<3nPJg* zgQaPF<7wEEGb)}EME~R+j4j|PCdUXI=D$9#v#2_Htr2WXBHv-W-FVm@C)Wr6zF{Ms z^FquE1fW?^Uv44wewW98#>}h`&F9}UXJL#MJsT%FiT=Q>SrKAG)KOnQ8S;;Wh5L|* zk_ZZC)4{cs+lBT!+L7Ywj9?0P5NkMrTv@Sj95H7p$};5`fhwbS=&!=&rMM0Z_zq3? z--xzr`qR$qSAc^4)zBB10T5ys%q!u=!8n<16K0ZZYN@M%ScmE`I9wt!Z1Inrn&3+z z>ommYz(OKIMx^9+t!nO5lh=sG3k_efWo;L5+5N8k-i0Iy$a0p$#I51hVVRlqvgOZE|NdCHQ(kxmM&@_5+Tr0gj(`TBaMCaAXulu4A&Dl;{M8PmRh-x$uZI%eR^mRHAXEW@ zTIK4=mYZ#!m|9JKbNtkRPscrG>AK7o$gu(7{{@Uh}%!|4AlqO5qAW7GWu+f`y?|rmEwwR@1P)N{TTR7TPRs!6(wJ zYdYepSJt$zD=PpWy8SDDhQJO0U{N}vr##GdKqU*0tdxc7m^<6N{Lli*Z7XB50k4_4 zfL+#;h-m(!ZSSEGk4WnY1O{CRpm1c_Fq)-xSt@DvJS2aNcddqza1ds)y#$Ab)xH~H zn@70%sb@_S<@uoSW|`zT3-1I*Wr-8^YsM*OTb2ym;@#qJX35Aavk_q}LEJgkFpo&Q z>?D7{WVw!aL1!<}gcIPmRMoYa@3IqFhX)8i&Hyxi$j4%duUJ?`uOhcC6@6a*luf{I zbaBY&Q#rbocxTN{YK6!~Ue#v?M+#^emjW1|`iPjNVWT;io){*Bv7?|K1|zQ6_$%^G zpehKdnN&XaD!pI6x2m(VxA$W#-4^Bit9JZk&qTQp3I zWfVA=y>|s3RExz+J>r@FnnD{bJB;THue@Q@*;eQ2*1V{u^^ya{8Hy8q<0dzqd0T4; z$lUmeib?LFgX>S;*>6OH%rg}VjFg4#Cz2MIycoBwL4W6wMnp%_lsi1+;zq?0GZOoX zN}Gj-G0o<`6YDZEF}a%lq8e$L;85(kO@czE1EC^aM#OiPhj$teB{4 z!za8wugnc~<-hk~RO$C|D}b~kA(G53FEDjujFL2V15|2$(Yd$yoKh@uTLd?RQpHkrZ&Lpfe$Ks_M2AmtS+HZu8@<5i?pLqw-r#LSYenTf=6ot!sWWi8Y`9qV zblRRjRhE#`1q6&4@s)fqn7sy1=GigeBSvlt$TSq8J4AWdycJ#GA~uwe&C$8+G0%v?b2bgreqX?DWW&q12ZDt0jFBfI32dXb_AE%&u7jpC%U~$nNsajsaNM zbIbT>KmXgyArs#l>R=^FHwl!8Z`rVlrp(2uQ*-F=K3-3WF9zpOdB~>zC=a$USZlG9Eze}nFSpJ%TJWx-?=OzZ_t()Wfb5F>- zF(*nr9k-l9kuDVelBC7ekiiOpT7;BAll#r{7ran_VXb=;pm^8e>PUb`kx(9=wX)M2 z32bukomm5<0u&$gEwU4b9Ud@TUr5JRJdIZnl3Y$a0%4r~f^qAZ6Z?j3S%+*G9hBF6 z`~-?0H-|vi-`Fh@1HOUoWrAz6@T>=U95^V2P3|{>-d_Jr7rK(g^wcJnY!o)Qn0quW3?-g%)V7E#ebQ08;~58)q35velQz4ot(n$m`5kdyn_5~g zi!TdQ{}7r-M)@T;-yI-#B{JBpVY5$@*fXPaQ5FEXrmwpVCt;c|CMZ){&q-5r?Yak-4}?h$Fb_n${5g6(D!qQP~Exa<`f1mZvw~y zA_$lvOb5&ZB8Ofx4*Pjuy!~i()&w`WYQIHK>v3!lSS)PfxPy#ZYMCHuFagG!zS8&b z3++pU9vrw`i9!HDQWaB0m;$r%dQ_KcY4OJfTpXup<1>=ypo{!06j( zr2a7=AdV}(@@{Ht#!FUSJdWgE8y%L%G{*?^*S^DpRY3(P^BYG!O0&2i#?>1$;Br;w-CHpAFit$TE{P$A*RicX)R_rhDx z4;r^S<+*95o~k{6yU0n4Xb4*xt~YysxyIebjP5ZmVKmW5#?b7N`w$keht!15&Lcbk z5g;Dy`5AsU}crF*f6Mf?* z*Dwl2PPgHiwY$K-8Eet0P`30B7n^l01Y?{JSL8)2t(FP#X!sB9N|Bn;kzFOui??Av z!jw*c@o_J||1^y@tHR|??bKEtnc}omSCJ@@_!;7JaLsBpnR;cVS(m_)PHc_-3 zo1NVF9y3r_7(;N}NYsvERXB!>GkExIn>I0bm|4tD6_;f7;(&|eHCbg z%F2G#rL=R;yKDR~6NNEb}X;pCnnLW^<-5l z;qM9nM9}MST#O>qS}4~!vgqvJbntP59(wk%cdhEa5Y#1&4w0)&>4o`W65{#!bKpLi zic7zIf^TepJ-3u-C$71dca z@vq74MW7tZBAT4+l`JTZ+lJ8~;q9WfMw7oTHI0G_h>E z2(@zlE}lTz1cr^5eIp7lm!(KPj;+8Sq9g)Cm?mTo=rLF--xl#?;ZquwM9Gqy>KR3N zPpC!uf5FO~ZZ0H@gk*>+k;Ewh_OD3XC?Go1U^JxofG&oPV3&m#+osy`{D(KMO7FSY z;BbZtM7KyyPgm;SoRP)w;q1-F|0H9>>{u%BgfQ_}ULr1U9jD4@Wc$xXC# zFe+Ai<>JM!AL9nY)oQKvZ=hL9# z<(I3DFTYv;g^~78>wP18uQ$V0v9qGXllbkPnhQ}r0D!h`|KP7|awyPi77&l(+%FsN zz&rv~UnyXvC7y(YSWk@W-rupxL=>mhn9nSfpc3L*Oypny8n(iy_53LV?jP5zC2wXKqLS=3kw4{fgMI)8h^Lgczf0dfzB*NGaT9tGBP9o z&?A4j)jCRqyApi4(Di&+PP7c7QRtB3IpaJn7?=YJP? zh$eThIlmY{c%@PrjA`u*OA;ectOs`@aVFQY!x%VTvRZM8vL2pe^Bs{F!5-gR2%Rw~ zjD=iM>z#keSWJ#j6f3CDy(?<=d=qVc)e-9}D%CeL3^Vzl$LG}b{DPo9b_&mnHrHY>|z$)pQhl5lebDdE!Ib zBf;b7&Xm2Q+6D`y&_qu++$<_?c&Xzp_4oVNMAY{cJO>_c+FJh_sO#N~!_h2vS^goV z$~~VRFPjNy=5vFR;b2=5UNXIYi1A)jjHCeWSj3La(I))#wAVpF2dWx-o|}sQN0-}z zp{z?1qlE^xOvjhx>x{s9dn=_M*ZeDro?|nKsUW+;siJqd&hg!Nd-lH^g@1D{?t)^l!Q-hTiR2J z)Va5xzLiTHn%0Lk9D)%)k)~!t zaTQN7daC+~42uZ+n*G!7I|;h?>2J2G$?PTAX2$aRD!Lf`SrzB_0XZ&dWX%${>)M^< z!{htMmB_7;&&Pp1!f{`aovSfgY^u2mgV>r8`3sqFlW%!G289n5ef#_*g;ga3%*gaW z02_c4494r+`F29`(dp;mS1;W7bXAPee29_A_V4iJe+U6E zg__mPUUW-haN6$j`0XQy!Gqq%=)LYIoV+}9P>Qg7h3Hljb#!P(ehq3*W|_&SDb+| zbT>17NSNk|6eVWD%qgCZ)=W|z^%;r;7UQgMMF$y_`H^wiVwM%}e#3vu1-FZj;$41O zyZEJKCLxchqJaES<_4*WP?0l6!$6LtzmbRyT`vAqJYBkIeqz@)s{HCy@&%2vpAAcA zYX;B7XXExi81U|TfcZ|@sv~_1(x8H(GA+pmqmFo2#QwvLB51+^uV>@2a7Lgm-I;}1 zr7z1xpPQuSDxC{Gf4N%0!KWkm7xyz2E9Eca=&Ipm{y$Tqj^9Wax6a?p#;#?w{vs`N zs%~Cv6QWjngF3Lp_Urcv{Nob14{5$PuE=O2h-M~hl|5Z;4xN?SrFN(Ggk-<0-?JX_EXuC@hfpj~ z%+O$wmj^0R;`$)z>YMD~VsJri0bRi0_yD8H&C6WB|E z?+_@}S(*19g_|js*%r+}f!} z(|5;#7z_*|z$uVzzdS-CE})O_l1M~_f;Cu`mGpJtAMtnk2Q7PaaQNi=r|rMZ^!NmC z-qa)2mHi0KicMElK)xk2nN$>im5R2Ln_%D79M7&JE$@Cp?K6B~>Nf7W>>yHW&n?wn`qQe>l48?TM75gh;-luPMsR0KBhOK?q`^r@gKXaK z2xi3Y5f^9V5Zero3AloHsNl!uaQ{aT%~J#gOWOkPY*T}y>*!)E`|u&^j!#SW->?u~ zs|c7tnzm-uryc9v<(*KKz0nF^T?H>0MH@&6A|3=?py0jUQrG z!oRw2bpca28@nr8>HWFM=c&v+zS&+Ch4tlIbUqwdTLT~%fQ)!EAAB(NCNk$bX} z)XOKQ6uUiaGB%5=y8pb4WqD7C2y)GaWOk&(v zqcPQJkL~1JWz^x+k4Y|691Oq{{$o8RYRf~fFw7>cB-IK_NB?!2(+^7UYeD;m&?PSL zlb%kT8yPdCM6K86oEcYVO--|>Ba}Rj%lDdMi6-buaCf;_@#|k4ELn*XqEH1u4%X-9 z1gwo{!l1lME=xXIZw<=(K`@pJ!E4t~tXZVKk4W54o92!bA~u35~SU!zzf* zz9~AW8Q-RBAHNct@>alqvJ|jCvR=Z?i2=Vu+{?=%^{)IJ6OYNGDu^E0`HIiVhD-h$ z7={!c=}%NGeKTe0LzC_JR*-@ISi3)kZfPEeE4OsyA3}%m zC_x+xX`TuYnG*4JDOLl#x3>!1Hdq6$B^;I!F(>%Gu8^ckPeOp!`fts1B@rvHZ9RBs zFxfr&PnoK^&}X{4=Gu`&8wc63u7Wq@iZ)<^#BIX1qGlaEmMyH4-X-AQ%gg9s=SVrv^} z&V#?P)$=RNbgUZ;igzBHgu-U?PWrd-D&fqbh!p`}E9ToZK&1|G?3uSE&2Vl_cPAp2 zz!vHt@F#S`kd&!*QA>->jIwY4hHhwlzS$A@`=ia5yAi(CJuPoyqVwqt+q|4Z_7lg& zi_3ZGyi>T`-}g7HkIq-dwTqYt3Y1>e-}p(yehvIlm&ml`C_Zal_U(()Qy9s~_{P}(IJye1wz@4Cf(Cc@0>z!; z5Zv9}-Mv65?(Wj!?(W51ix-FDPSJj7Ui$t(va%*~?!I$o&+MEzCYkx;;@q~+&!SW- zVp0M$GDI5AkxXS%!Grm(MW+rJ?7MPFuSjj$Z(h$G!>riDX*AXYM7~Y^wIfhNR#IY-WfsmJBoOQIeR?`0lb;_P+S+e?Yh z!>4Oc-{O8#C$+=31bwHuj`JA)&1RYsxxJ7a+FsK7QejSMqwcupChF2#%p)@6P-WO` z{Hu@u-ag8tCZWZ_2Ad%o9Nc(<8lCe|3doC1zw}VZgZ#A%AVxRLfNO-((8mi90cRd# zUl+^u? zwexKJ*Cy;@JUkV3m-OfKf*?WwrZ~$seFZa<1)xy2s+!r7SFdt(DvOl@JqWMK^-NZj zE&<*fg+6-n=N`D~Hy+S=*&TtGa=Cwo;`pHC4xV&(W$ixd?7Ih9!j`Bzy41q;j-l

04$k~mLLdP<&H23t!?*15n8i}EU9hOpsK#V18x5KQd=RYaqGU*kT?d01Avjr z1*Q-R8B{TY2N75g{`23^{$Y-!iWUQaI~cDprS#loy4s<=q~uE+)WkS zVJf{ko;$gZMS?UEf`37>_^r^#^1=CR@dfX(=_ABi<_zVfhrR#-`WF`iU9HD|&#wSk zPTmjTRl&o$WKr97v0xoz>AUK2^oro#ouBGIl^-PH zB(0iy7Q~y7^!b{<^~iOuPz=eKdd4Uv`}58G>KG1{tIq=y2>lXjeSc%-MOv&z{lPtL zIBN@#Y6@kFnlNTRtS6nUq9EqC6~Cp>09Sn-f%ogb&hTo2*U!p8q(mH**Oe1!Q|ADe z-&wwR5 zexWvO2=}v@fJ%64Hn!pY66)xM0U*)x>VpNx`OuOY;M{bj2WPjJW?60jAddXz6`&z3 z5o1fw=1^=(ne`sR8~d=_t_}#keYIOqGwXX}yW!9rJ9z8;p=bSM8O>yniW~Txf7?e? z0RYK$@lo4llmtmS!xbKA{}-@U;4ov|)#Lb@5ceHWj%U6Ok9GzFhA?xlUCIW_)fzu% z}H zW2&sV8J#cRm6$9&?g^I!PC?EKxS_SNP!WV7$Y421M#@{THOoOlPBQHjsKlHhKMI~S z&@F*2H_k2ikt)Y0L?5t5hQ*vP=^H0^a`a{+xx(yJMP&*}`D#NuUhp-|OoQ+1n$#Hf zKZK5gU}Hs=&J}TXwGbwA&BFE3cwkHvX;hLaG0s}UqUYM&W$+)R{5IH2w+#2`6%V(| zr}+anhNo};4*e13V|?pJaNu2^m|Xvk8w3Lk0#W_Ga;_NB=$9HI1nhdt#+#wDnRCvO zoHZu%CCIUpV6hq_U*+wgiBXX}d^#Yw#~-I5^sd8$mlJ)WScC*ZWfD_dBp^&<_^4(j zy;$tXDgquIx4A4Vl9a(-v6PuE9sm(B{a_kj!98?Or+ix+3s$B?wL(qT!D|F&oHKS{ zk#~3e{ZCeIH={Fq%xbH2q|Brai+WZWC7UF%bK$q|g=^cr%^BNZjwK06TPgG!sw2b> zoq@H{pekT0d)F3W=TubuX9oKKIpxRTBkeJ>rXGgZ2zAW zd>R6KA+~gmAw?-u4CPRWb<)U3wRmRzU_jhCPf2u6QLW(8@*14NOg#2USGKvvGRjMx zANeGY@+#UAS`)2uTy;o*Q5O6mOn$6}Ql-<~zDeb>)o=K;AeiKAo+wtTODRpfc0Bon z5TI!g($u`*p}Yk~0S)pjb3;QXWC*NCp|kR42Tx}5_itbxbfp0@NQen=HM6W|46)jl zDWIbPBKMAd*ZJ~a=XNo4@#BE==*ncmimR+prKP69O~OM}j;XjDBUBF0cAu4dnXvI1 zK9qFRrCy8f&>d_7jU=8@(kL^ToE)R4U>Y4wf=$f1P_`Fxmf2930Ff1ea#?=!_U*ry zkC9?fLTRKC|A6c$kQ8{nw2zP}$9d^_@VybOT4L?)0b6Irv}D^nRNs%}~MO-90JdGw_tNlv*gK&$YZz zr1TuKs%-?8I{Ta!izlXwqNINAjS-$3!nLv=rD`r#n3hp3n&Vu;c8{_srYT%+cG0Z# zh|D&SUdZ!#e9s$BJd<5T0weSXAzT8#TjK10)`trrfho_CyXG$XYdCSM5kki$W-z64 zxB0WL_ve%8z#QMhz8n_0@zJNU{N{@zq_GBCe?$4}xEm_6-E%*5I&SP`^D@5l~>6#h;5IRPH zV^LW0@D=z2wpfp_iqXZGx6!CIJ@4O)I=_D;{7k8FWPi)-3>)D=RrMTP&1YYgtWs2Kr~c(Nq;x8~%P(oe_1cs44D-jJDGyJ_pD=0BHdLDB(j8O)JF)UvEctu0r=zrctA~#&o#e8k;lY~3A)8J#K@!4 zfjI=u%;y#RDDlbzsoc0$Av1n#+*Eu?ILjjll`}$|>l@oRJx5kbOG^Jw3O)hCrRyzf zD6lq&hMv`!MG9f~T4^XTcY*h#&MPBu_ePl(*;_l!9#rGjT(zpu1+o+uM&*h5$y;Lg zjwDgfh?Y4xPKIjBxn7Qls%`p~UWc!9cHT834=GLU0hmB{Kmt+K>TgNuaBjZD&-#1J z@~&F}h<6<2WQGHH=COzG+r_(Zc~Al6n68Ps@AWAV@&$kiUkRq4>n$9z!Yv3+bEZK@ z0%W#pd(t|so#$}Y0#C?@hgroVaEdvLDr}DV3vFE8^`RwDN z?S1+~NrsU&ts{}0G8HA3+Ni;Q9bETyf~8oPHDlyxBB1E>B$MQF8D@9zh%dvYa)Xxy z!JhZ=4JxH?^*Mj$>N7@09RY~T{{Rry=rARi{vei0pn~zoN%b609BIVQZb1q4nL;#Y z>9u-JtU$ijkqLYn#g?|i%U9e_hkShhc%TIaL$zKQg$eVpdEGq)@!>pE+57yoF6lu@ zy$v&P0cVDN;pL#9o+bC=;B`U_Hiq#8qt^^QteU|GHR*FMe4@H#;a~qav>yS7tfT3m zBAmo$F7PZIC7Vp8rxahJAM_q|esZ77hQL{i7!&Y z_1C@FV2?ZdhP9Pc9-=i8pp*aSQtmC2(840}v6SQ*AL40U* z%vRkg>dk59&IVI&sEIz>zP4tC*bF+b+FFqc$6}D`0Ui}9n{}jZI2wut$qB*N%3<@> zTX^z26BJyvL+4eU^sQ(9m%+YG*7-aTACsMIqZ5XvMu+Nk; z!IL4Cl8ZN6FLPSdXkOD@7F$!Ys>T-V##&}2W}$x0FzEIDzhL~{L*0J}{RYCWiEC=8 zNKx`jc0CJI3t&+RtNfc3kgzX!Lh(%bC{k=iSg+Y-8mcUKlZKO;qk zc3{+Ss=eR|1VX#Xo{RAlJVgHB`DXG0k$FpT_VGj9lZ6Wgu%<*Lu+W=RTMmwvBqzjZ z4=L}m(F!%=HpcDbrDIW0*W_Od+b+Z>@~#F=Ox!q_!Ok195q$6}q+_xIXE>smL#Ta}+>+{jiPX`k4*g)PTyDa1tQp@TgkgK;= zWGD^@w1WJ_WEI`973Sa^fGbK@tqp?#ol|54&AD6nUW$%w#x&AV_fS3E8+Qw%dYlgx z_s`)YLsGYmne{oi2)lHy@iyK9VwwgKX*taQJoDz)^b6KESXj9JA+!sGod;_QDoPay zSiC5iQOhPYY-uPqdV>$6nCTyB2$R)MQtDM>P zUN`>erbqt%99YZfD+A}?(wncD=`zC%zCJJo0IQ0wT0*h2^r;v|1i3!qV11<-=nPxu z$ArNGMQV#MV?AtuT&Q_v6iU51>H8memLj){_PsH8RvxY1$yxEXoO zvLS!n_>-#tt^dy{0-65;mG~FpaMaz&J=pE37<6(~8;xXp!b(=IY|IRn|$Zt*EI`54&xthRCHY`2Fv@$gIHi^t^N8N`UzY zsr65j2Od&`BLaKh`zlHRCUl(RS4C;(gO^vsWVJ1jJzX}7LqX)h(WsotMPwz9ZwW5j zYN@K$^6I1E_2&xStK&KI_;_-9*+S^i73^`4sHKCD$~gw*_?vz6&26=pPB-MFoZ+d;$qaaYIb6bA3RCwFNrmD zRih}{%=A@O(tJJ$OE(8X&G;MG8u(TA>zsiUA;1Ly<>uw@wk0aH5M6`_L<|&cJ@zMD z>fe@`du=pE_`#Iw)Tv0ngk2^3@;dt9VRUar9Nqz zhfB8UUPxubBaTq(rv;MZ8Idu9nfw)t^t|Ef{z55(1j&-KSl9rF9tW1viA<`<(LGe2 zXu&2oY06+`OMNm;uCM4=`6)WaL!QM=zgvt;jIFqu{Hv2MPe$gGF>fdV-V%$uKFxgR ze5SZl4Ly!r!k<)fZWV&$TmI2of71$pBmV%mgpBe`SwZyAcltxpdNaz3SV-++9_y3Q z64V{XqXn2OTy6H|%9QIyS8*Gbh6`u2%;sF#SWbzFpk#VpvKp58W-DTt!L6eeo;r&aq%1_d^X>iGS$y|2;6QTE0*Ug!w(eoj=r)Tm1cdSQ1I8o8XeO(Dx z@qee>M^HZ3J)?f!ivR@XZ!y1gW+?LT_C{^a}c!WPK@JjXg`F?_|i zt8hFI!g@B}_`(u+{2sVq5rY8cN{K$h|Ai`YE>j`l!+IsFS=-vz^nccoeT0+!;_}G^ zQp7e<{a*LGLRHiRGFn9yeDSSQiSQ)4`E1v2IZZx&>fv-z4(i|p0E?8HeRLm#rjbTL!*nk*VJMww!KY(Eot@S0i7Yy25u8LBXTOheB5w>pf|llU3t z2Ad^49GV?80>tntsJ^G-Brq@nTX|W;;tRUd!p*1iA}uc-UL3dM=XcIS1uJPxKB~Kl zXaWEzSq~I4n3fF*zu1+cCW7qJrh-$%*2O*9eet?k^}8GI+k1hllX7plCTDuXVY!WT zG;MfIG4>4253e%vK}eJU7)C2WbtgWM?m!RrpM041;bsVCTaqF7TI8Op1HrccKBG;H_Uul!WT{1LoVJzA1PeeVQnTfosuGCqIz8@#ILlP_5lKcI!XR<#Zp(G;dFNPWDL*U!p zl=SnOC#R*$w++qfLS~(fSt3N4G8|vcUl42KCJJx8HDZ|HA~5_YClziJbV=s8YgA ze{31nUTnr9opcDhqJr#^$9N-UcD9-a)SOE^sh^SW?rTsv5I|h{-=|+mseoWifHpVl zSVx*n^c_7}*hH>wRuji3b|k;+$ZBf6v4Px{Dn0u4C%nePUr%pue;=eE%^h@{U5z`B z%_C<}tq*QXIuc)XJ({7zMlHRK#lui?_z~;Qu97m|EWYG=LmwYus$6}ZwPJhWj(RD$ zTnr=aWe%tW_hoSlR7s;vN~`DyfBSg|k9}`w@LKnv7Ww6Hz1GkB|8=<`uvc2k8VYy? zlB3o3!tnA5ZW>y(l-l425~h+nkZzfSK{r2Q!{=!`+h&3T^)S62sd>%{&wfcV<_eQqJrxr!KDri6uE=|#r3pRkKSdfq;L80l`t$Darlxi<=SY>;D zw&_P0=4M`MKj5t;yM7~KnX0OerS^;i>BF6?*9LQoPbsq)TJH z3ghvC;O=CzkND0X84T0sfkR1=0QC^e7Ib5F!IY=)Ahy+e zhWW5Xg$1v~!^8GqmlDh=9nZ>?(ZY{$ziG_v#M4H5N2uGTK{?(3D0B{h)0JLmRwQTF zka}?x8uW?>Z0OZAxWFJJIFvl1Htg_3FY5QK)Hm?n^VD$WY`&p8eW`D3=Zm?XlvvLG zboq<9#0JCErhv3u!FkEc^X%xeR^IooHapPyMhb3|At*#mJ(C9W^|c(g~WpUX=BP-CdLM0iNeMzJAi&?S4X?&AWZMNVTXuh<`}!<}j! zn;n=aP)QvRif?~0r`B|MR9=s&Ikg-{#S^VSc*XX_aVqUn`EA+Ln$MCItkLCmG6JH{Saa)GWzgoFcuU zd=M-;;4Kni5KJiaed$=EIaeEQzI7mUsU@GQB%3?lg|TiVJXeQlwTL#Zd-jY6`K8r8 zF1e-xEcLa-yV2f7g9%p{|G+9&aeTwxTAtesuZ?9PPRL<@Ep}v}yNHE#bW)88lxJAjVL&`g1Y1R?8`A%A~Fwag6-d|!hqH);2>(=D4~Hd^0JWlm<$gu zH&Mc#?WV2iSRS=(OUOoPRGJxhhB>&8NF$H?T*-N^qWk%X(VY4D8H$kP9sm}VWyOJk z32Z^H5Fq@)3RMozp}eG)DxU7_Fbuh(ltT6MnSb;jZB&)6F)UzwlgU#@0h%{~;SY?? z*bQWbQYstCZ}_W4QE7ci!5&#T?GUqp8V@$t)4b)fxDPi! zV3l_NKLh2>Uf%DM$=81XieE3C+SR{}y1etumj=m2XYg(4W{J$-s@N^HO{gvv40U|- z;Rwd2r!CQ_4esCxUTd|aqxDC#TI5}fF9;Y!jzSP}_2LMXK zidgbvFJfd*GsotDXAaDLI*^QECn{y>ALCA)7RPbxCX#d?* z0(pn?5(o)cEPlJHs#@7cebxzv_Nx}^hJ^8`{9yQ_%9VEcb4TP066th}`cL<=5N{aR z4?{3_HPPF#>3^3fvqfYDx2rG_P`^=q`j(MB(l{-OJ+hS)h>sHznTta7e$ASf(~}SK zmoZ-9P-~!RgvY~kF}>i`{_hC=9@3Uo;J|e;X^yGi+DgWHx4M2NMqEUB3@;VFS9rBB zG?JPxB&6#OpBaBU#Ay=n8V0#xF6v{57-e?SD4yzR{Bm1if)A?OrWB%?=VnNqSrBfNj zu-3}zId-!wmhUW!tkdok3#X65O{N7}+}|7aC{Hl<58#3wHi2^zLFutlLIFbjJB_Z<2K0M0Qi zH#3u{>d`R?30YO5z8UE;Q|iFT7S?j#;cc$ey^b$;we<0nRoYL=6bX2EKH15C+X}RK zz%Hef-J^`#Py^SJbz|HG<966*aj+xAfsh_U`K?ZSuj)0we)E!yiRY^< zIeRo>_P$mfE9F`k9b=fR3CvH)^05??^ggwV3B?ggNGp+!=U<|GmEG3Co?o&gMU!JiPA!6IXu(klgX2j1OYez3|KCuR@$3^qqO;#)uz+& zumyaHD<|x+2(;;AS|E>@^TK!Fak|X=#cs@r$Zk+%&=9*m{i*QRqtX`1h)feI1j0RWh;t*@s+1WPVg#c zN|B~#cEmElb8i!J-8ojiw$^>#?j6EpKFzrkputj5YN3^jw8dMSlvF2=%x<5tjkRLr zs_#Lqsh4s;>6!XY(5}{nXt{-2(2s-+t7-sNY@muL+2w`b95117!r)I5m^#F_4|Wqb z>yZ4q<0xfhqeH>L?A-pl4v5brQy0kbQQu^p+ zUb`$tSM#@t+jz)T$~DJobZ&YO1(p(ZYhG)UrkER{R7`c2*wu1h%#nzgaDNU%IK|=f z@V%B?wfJDyu2PEhpl^smr&z{X1#$rX@C zaG0~4r^4yyeng2-x$DO$n~4491j?k&JLbn2?X!H-F+WL;qI-6f5u^G z3Mn#bDCu`_OKTA2ZN&Z(5o(HMO1b_Qz0*`=1n3`J*?O8br?K8&b5P@Ilj1s%=+X?h zPrf)`%Q*Wqh|MM;8wp2Zz%rY+s04L$BLQfGJ1SS1ZcJm44iA2RV8t7lcj;&W2)~1JL1R|#yr*NYGA#@l7 zoM6{(MiuYZuQXs0rnN_%5Y~%hRvL&YWWtNUTb)d+kYN3OBsSPW@fjZIi6*n=^FvS! zKnnGp5m2uuRyeGT8;_b+hei--_YgRD4rn9=dY>wyaKe|6khb#D{NP@G{BafH@(ps4 zc@7q^XeZwylZANx)sfnqy;zp0RO=y zQr-bbJ@?Qbnc}>`9WwNSb;9Csl1Qy@yP0T4t~tGd2=t?s_>L+NyO^k@38Qk`GTC3F z{d&aeu#^4Qy;%Wb98kUECtL3O09p8TB&wn7t1hvd0tiFFYWPiS^(IL;EDKN@gg=2Z zQ)VjbOvZ=Rhkr?+cnreRf}1vz17l;>T((U%DslGdM{*Vy z>y6`Kx;5JFnUUHtE<@CFX7P^%*BZ)l_f_@*C;J{_G8FNw1DqkKv|F%wZt3d(k3+{n zu)1Q)%^(&`!*PKp;SgIC*$pFRc7*|+jPt_?qz<{O$bqvrJf_E#V3|q@L@`OkPZIx0 z#mp2&-OTDL%@lOEh(}H|S8lAyBwdn&gp{O%nW;2fDwQ0v+Q@5`u#j&04zt^{+DD@|4Q46DR@T@rW7gGOl}w} zbR3G?jIMKn48wMO4`q{dT(s^Q530BoNh{aF!PNJ^0`kTRf-SV7yir5deQ#|TSpN#-!9nG#&C) z;}UF5B$pYD$VTtJSu(EMrzRYea!=A=AN41F)SZ^vJp0F? zt1wt&9W4|#>_0km>!(6PVJO@q`qS)6FdhX=4L2FPsfxYY>HP_ebsS)AY*E+rL1i^% zif8@rQXk=x(KuB9v=>%eu9)>>GvWs&B}dI_6*en>HzN12X_Kd*??ETNuqj|#sp-lI zjVi>>wGS!jqA#LusIh!IV$`>EX*Q?+X4qjr*H7v4gq*!|{u0Da2>{p)2JQYSvq$J! zv30jo@7^u#1|RlL1D%elDJNTXTj70{RWc zB<7p`yG3f$=Pn+y^i&zoK}rxd*U8Q}lXR4eOlF>XxUuH!k|L^37b&i-Ygr<29)?zy z83m!6ju_Pt(l^rLJrHyEj=Ay4z4~kpW6Zp71T+}Ehc#aWjLi?kqQ^XE*A0ep*~iyy z;nzI>AYC}Dt9Rtd_O_r}Zj+RPqly1{FFNfri*)rpEYO9<(fd5^M^58kdVVm;@aqJN zB5tP{bJkk&iUc}tz9(PY6ZI!UIzm$E1?yr{X|I+~vjfWRh_+5y!_?Y+OAmL*J|9;8 zA@nB*wiz0$iojB!ceKGM9IlM^rl-T4)fOCD%ffvhy?IoP^x;AC2FmD*dUL%`u#U(Ra@L{T3Li@f4xyHWC5&_2rh+B#I5UTm+zw%So28L z_-J2G4bxJWqUK{7?8QGpU0W>&Og0zkzA)AR!efht5nTEeZ53gOBBO72D@#PyAOHid zdYWR^d;AEyZj0_ciuy9rSTdHk6T@X9P15AGVZxIA=h6b{^Pb9N$zaklyO3!{ zq2sSLGrSvH;qupvIXdb)vAo`5xmpEU{(E=xmFE5(Ku!Bz9wE8FoZ-!%8nquzX&PyZkTxHdnZ65r$aSqE*?oDu~3vADQOnp3WQDRS*bTAg9#W15*U91Y2rh=QG$(FB?u7C+=7>YaN z439Tj^RBA*MmRpKA{Eu+Tsk{)7GAf~GHhL1-a(a1V${;nr~5tI?evk8Z*2C85UPLK9&#nEPG z(YE_3o)~C87Yc{jrRGn9SQO#lj5&Ll1ng=|zY692y~IBys~KUqq}yFL+t-^$8HES< zhtOFN@Jv8^2*k8&{_%N5I7$eGpUI+zPzA;b_rmrOw2HI};unCYfnjG;u&$y?yI%j2 zpY}I^C|yZye>ss3(MB`;6Lv;420vQGe8RGa9SkgDvrzjT-h1$W zP2m~<+~m`>0O2$kmaRVt!$zTsQ5m7qsEK{aJx>oqyHx^E($Yi$2D4O#ggSD9wbMx9 z<2F=Lh)3t?zUcq3NT^rzu#bS1a~u#@((Ign8+%gc((zC|z)_xXar?Cv9X+{hFG2Vi zpZbII5IZnTI(wLD^W@SJwNM^^DGL=x_Pca+Yv1tz|D6vKjW{Ml5XkLQ7ULF>g&^mJC280g`gW5y4lGS8$|wLlmRl724akfMmf9s}D4$75hNYfy zm*$Ct;!xIADWcqnrH(+7oPR`+H=O5T_R$qy%#XYV6yK?1P&%20C}Pd1PdHn7j%zAK z!e%j<=$Ch}VZLQ&oo0pd!8Q#H;FFF-xe4-NCDbej1~8ITn@=nBbB>(275Q5uP!Hj6 zq+y{V;zBY6J0)15C_Z*^l9Ez#;&tFOmKGm%ibHs{4vmPb;aCS2{tjP+;d=D?uJHbx9PeJk zy|TnUKap+{lN^ti6^0A`jO=GW}?^r9EqJrL^g5 zs#;>uk`P$=!m>~T?HTog`v8{L4g4O4C29YC|I4Q+IJn_Q?ogcWw7EUsdH%LD z@`5Zfxf@H$`h-s<@he9=Zz#s~FQRW&(n4*_d~22kK#=MZx_SxG?v*B2j4M6y)c8+U z+Tj5j1?7w#@y}_n;n|4c8OLxIPSjK&3nWec5w(x*t*ZJmxudD#%gWXmAqZ{s5|uE5 z_7g5U;$JE+%k4_|&{U6E{F8cO~@ zvHo`u@I}sW{s`AnT71e+_@iw+m620OG3pox!+=;d-LQiok-9q?4Q5qg) zn9{?ZwmtaA%8FrcTSz|#f#zG~z0&SS^5tiz?^@x<>)gt%4X$(rTcf(-S~I$EU?z4` z`Z#lEO>Ue5SD1VvFf~pM2=E!Uh!RoQHGoW8){Wv0O9@lO&$pL0SuoxxGB763zIg5$ z(yPh^Nykl>{sw`(RPeOmaI%}zIv{3Y4Zxf92G#nl= zs?y%&k0RM!^Q(1yetqfd8EHv&{}nkKDk|UDl6cIZ=mv@+Xpay#Yz=8QpA=QEoAc!S zJLT>Gk}?{r5~xyxy5(o3R%eFORwz!)%nrdH^3UWl$n5c@?DNGKQ^a~C6pzX}JlGyb zep$X0TxsER8a5x^WmmaHj(o-D`!Qr#1ORhUQnGiZ(vwQFj}{`rvnQ>P>6e7RA*;j% ziAA4A9evv8lxJP$OL7dAYh8UWCw1GIo9fd1_7o3E`v?)1V4Z=QgH=&ok)i;INChg0 zyTpyIY+9qYnO7RhRh(nAmeeSt>aLZJNmIjcgQE{w8{flVw@Ftc9m_c$4Qkg_*o?59 z#lhQyU3JQ5`uXb}W;jzlP5XZ!UAeX{wi#sZ_Vs$%RehW8dk_Pc^itBTC;FG$QE&qH=gBW<4uqU6i92fGnLr?O#pwXlWB|Y_GQ6jh@Q_LlHy#hDFaI#iGIZ?J%_$=5 z7U5A%VYgK+hWJ&B*+Zg$n?ZrgF4YT%nrVfDJD(Mm)Cr`;^Rwr6s(6**DeF#yO;YFo ztKjEAI5Z{QeI~L6nd9dWyGVTuCt3?dVW$44{PW7NboDXx8FB%e3~92VRR!m)Wr_(C z6D+L5L`K*ZvAU3ixSn~FixTEs-uIQwQ&D^)e*iuv9DovtW>wLJXa0$jN;fI3g@i`P z*h{LPmAs246r>*sQBI)~ft`n(9S6o)QZ5UHJ_GMgl|&dV7QXuRthT!qr^-zT z`*3a+{tA>`pW+uIRl;jF8_GUV!>X z!Pix)K4Q;SGCdFo8Y88YCm0aaDhAa34+%W)4oziU&i}c{&tsQg?&E!1Z6noBlI{Jq z%%;0t%o)kCU3+@ECfupq;c-9C^IC~#s&kUv1Oi;GdTjlJP|ddC`{lVQVpVB2kDmJ< zhoHuKWX)9rW~qMhF{q)@N;d%uWD(csFo2NGOn;w&+^VtnVdd#33vrRMnBxbUV^8&8 z^uY-sAN8MklH>h?ut3mk4w%N?T6$DBTLRP^zUWV%c~{WV{7l@MRARUDAD5wi$bKK&wh*kGGNAfid%;Br zRMdpUgy~0%C@4Z=Oxi>LS%ZUBTk^ziC3 zuNb%5pl*>)B5&A;t?Kd~`L1prLyv$&&v<|kC|wo6$2)5vg(p$L7rykPfHwsERY;rP zuY%Blj$Sj)ar!yx=y3;RmWm)g8i^eJ(A{q+T&Tw^y;UC)l>5hsMK2(Qn(R&ump|_x zLg&FBy5w~g6q#L>th(0CPFNFZc}$o~oy6Gk&!M3)f41nY+y)l^2H5;G!5)dr5slLC zi+zUfeR=tTcAk1@?eBS>;SebK<`CcrWVOUSy9UHK4p+7Zu*8EhLTL93Hzwfg zn!-Xk=WTj^B@^&NzKh_CsxMr!>-!g$p6D)ipV9Ve{#?5)TZTM#f-%>?blO>|c%vpa z2c?s0h_xY;v=>7t>?0y)RM;8>l{h)v^-j0xwdrC8S;HQV5O-J!I>G8kB<%-s-^uod z4OZ^J<&4eD)*t=QC1UOk^3U8cpK_5tH~k{6)56{`W(SjKQgQtLbKZb}uPK&`fOcRf zK%suVgZFo5QzGrDexQyI0D#phF&iDk;Iop;%Hq)N#w1dseUj8IH?UNEYgKwuZM{R! z&s#g}G*HQMHE|pAOHd6}rejw>itGR3ur{%#qS-PI25yDDy+1mG7l$_BC9qm(j{ zRj-O`cSTkizU(%gi(YV3$)rfl(cfp9+sxq*=Hv40c|1IEZw{JSBVmL?yI_Jzo0vZR zL+B71%Pz0G4-z+5v_{^9c70;PYZ#$%U`z-WGLc253zP`5d;Q6VIV>>Msy9{;fyPG2 zNBtVqvKPHs;p`=KyBYq5t~@j1P5l6CTi+y)e4xKCC&{B_%B5HVot!$=q6tOdPrzef zaH4vlKFzo~R#B^Wq#e%_2qM)x4*JUaBWOhF>(QGxrhK&%{`P20pJ6dZ3S^r>-!jSc6DW+2fuq1$%(VxBNLxyX!gUIy7*CY4JM}I=vFI->`F0R z)0d`v-J7Te5l;*Z;_Y{$ko-ebl7;YRDM|LHp58ZQJ_km!bnMPA#ryTlA|_4KUH8Sd zG>L?z{tHjaxu7|VJ7~y)L0{84BcKKh`1nWDa+K|N0yZh>-Z`Zu?oQb^zUW4oeJ|$r zwcl{+6_ssiQEfVX3`YOGl-bYd*;Rct7IzScm|K(;S&n~+YCR_vq7RI6%QbJf@1f_}eR8xliVk^bRViPPn6rNKeum zsyC(lk$~TRglN-*9XtCDB(B^tY59k~%Ktt6_>xQM2CaMw!_Klg{B!_^H4GCc)ITXz zpKX6PKo9ta+bip@XC8h{dHF!&7dv?^g_^snqxX{0!fi^Fh_$d z>m?y!gMs8aM~yAfDTlnt`L$OurVDWH5EHf@^CP%@({PGzU+Q2W&XG~Ci|ee z?fV*5mJyH2yZ|-R$vqD&Vd|yoc2{q)RM$R7i1PI*A`pN;xPp3AkLmZptzUr%s5*h0 zR$5z2E5+DCge0wwV=1q|+)cs(XtP#gdm3-*suTJoYe6fN;=FIfIZ zq2mxZ94+l3W=U5CI^s^V6K-@h4iiNVG#E;P>eK)6bk==QzR%mgSaRv^?(XhpN$KvA zP9;T_?rx>KOB$8#kZz=vQV|Ks{jHzx{kr!L9stKRbIv*E%=?JWCPxp9ndXH^>`o;3 zzRyq`g+WxBD_`?h7QKi;?8d#QrpYCGjYL~v4d9|cWf85}g*x8QvNG0mTwsuzqeWQr z7s!dnwb!1QH0n^w*pdhAWF#u6!>)~UJ>$b5yAs^5zQrU7+<)xVil8m1^X7SeR*j7Y zA)4;{$VK7z4oR~ML7n)H>IhzwvuY*NQbGrX3BFUDMg>iT?;&T&kpz!#Xqlu~axt@9 z3Ofd(?Krafhsihbz*HS)I z9^b?g5D*CkK(a`IJX86$j4s6m>|KNHt{jWwO72AD>Z}XV6hEm6Ju`$%EN^7OW&iN? z{kB|})N+5LfufvP>OFwkpjK~R8%i{=De+N>RATvCh^PXLVVDRo?Qu~9OyXEAr*)S_ zEh2TX>4EuZ_YxV6q%GI{x<9bG^h9tNXYtXBoEio57)*jg<}tR3mpvZTNZ zh4ucs;ivzIB>S<5t`K7ZFvW$cgZK}dV{vRLJ}WoInE`cD_L7_i-XpsDshlz{EWV%H zF?#cuO%HQ}=CM#O+7HwNO?o&(cg0XZPE+u+GJ7hSC~vDTDN@v;a<*wJm-PdN^Au{? zb6<1bx1-AopBEZ?O~Pl)4KnqtM${t&^xolUIXF2hVghku%=+K{l*b`|XftCbnDc~Z z@2yw_XMHt*ZoaBHr&)~g(VJ}3(y_IYHHZOS-co<3DW33O*ckJWgu+$myd2}51UCP1nSBpt8^5rJ7h zQF983n8B`9qBda@k_)?{%H&HzKCR&$`$SrS3gMwxHWfFty0uihszQoAz$_GPoFS`WnekIRtTss3=s8I*BDE+|2gkoe}W{B4&Q? zMLP#u@OKTKDv12p_Fh|pF5ji_FZsg|!jJ@s6{YGD!f+IZNdLe21+N7FRiu{ zQkXq+8rYY{{)+$#12eT94v+u#up#(OMN6}1Q7m^aWen?_sHQebynLZk_fNPg3dBXQ zOOj{=(JM5Jbhj-(;)A9mhfYodbQ;PJusccXzOx3n@2coqTC7@tm8${`;Pu5&>?RWj z!O!5y2q(Ng8;>d6xBG1bUwYfg{ctt0X=6GO-d)ZGmp!!7zMD2ph$zY9)I%_`AaXJ~ zKh(AVH>O~J2ryu&t)HB5$m%eoSJ~KlB#ZG_xG}a2_~f}zm2;D)zF`%(kLe&zcR8I@ z+pNJjNsChZIIC!(vTzBh;T6ZT)9#7;4UZ#pcwL}R%N(Mn`iBxU?WFY8G-aukFYCbt zFBtTY7@mW6V}ocTB#F*C`Rl&9TLvV8Eho!C0?}EgQGA?_Q&2c~to09t-QyJlse$+i z&7;2~;#t}?VetOXNGY39P6ozsa5po7ZRMLZB8qF=Q}9cISK>xH+h=0glP?o+#`gW!a{Ing0LlAhlyDe8q>UB>Db*@_ z5Wr@gPpECqrs(}m>R5Zz#=AOflWU!blE>12xbx+ifobXe*Go9t8#ScytfEsQUH~VC zIB8eypF;ZpgBiR~fX9%!gW8OBbu6|NmU&_WPMAh^ZCX^`1zK)!E~mkhg@>R~S@4^m z4gS-OY;Nut=#{yV1k#v!UkL{$XI-fe0Zba%M7SGkvU(h#N+*jZzeF_1Cd#X!bLhuO zsG;)E3ZtkKL`AJO+rv}9A$%g#b(mkCp~Ms;BA+6j_Rrf8bS3wZhTF0JGU05x3NZyx zyIomR0T37sFoItOC(dY;m&$lBASSw9SfPUAO+E3IB(4+$+7^gx-b8*npt`Rsv;HS8 zWkS7qYa^SeC}Kj6wa3E#80X?w^vT3ZMrtF9wNu^EB3eh-5ClxG^jJm&{S#Sz9qSxZr@<@;2soZ3in~-uxH;ba+kdthP}`G)RYMUU zPbg67LW&eZrWQDkrlDXyN4YAS^l2Q`zON)J(p7`Jf8fRQGee9)lhrwyTkbU<%V23 z)nS*v`fpP`i5>aVKw%q|xzFA?*AyYNz-$PiEPzm!6!nJ0zN8G~olV)-thC}w7Mf>{ zb)BWTTsIg$Sm{?yntH(VH?{gjA|nJ92a#-Er}As0&L(a7x-bz5t{UtI2F-}x(bx~z zqY1!7;gtymNDwHHYTlvjO6Gg3%w3H{+H1Wn`JRp62vOfGW|c#}Ay3B$I5j;Vo_#yY zzOD?#lrk_;JY)SXbxLTjxK!br<*Cy2y2j-8$&t7P^BzZE!4)JOS*Z{L=?gjky69&%*Wlf4nks=Nc63uR%v!kF!G+GXTx^fN`H&c z7)*yYevMz<&JhCsXs>>9LC|)_+hMSkZw3H+{%1761WdRK6OE<2FGDzgM81D>aIAZY zzf~8oG=+T0r}#MQ^MRw_%&^z-dx!JeC!S3c`U~_eqO2bK=sh(R+Q~}3_pUY?LCYsE z{wV}^sZ!TpcRr@{(L*-glFsD==pPPePbNSb~{jc)mo=iKj_<1czt zM0qk*6__YhGrDA7lb;<7Z=YTf!WLk+Z=(QYS^(}l08S4_yLm59L_iD048c7(`2_l0 z7q}U^8Bv7z$<0!Gm5lO!F4Eg`)r8}dH58v7eNfq|!}!9zd*Ezl+tLe8%rKX3Pu%#= zE*CzGC8%L+^Nont>ZSO!O{^N$37!RK1r`EbQT^2wQSOL0FR#8Zs~Zx9a#~GJUK(kG z96J9jw*zU7-{y~**QM?X8ZAf{J==nsFv4#;Y7N_`MxtWrwBB%MG4Uhm6W*oy&+VbO z^iHfEf^Sa%koEjzJwo!T4R?8Nc(jeBmSyi0H7(WrW%pakOps3K@xJ1Rc~Q(g>x5U` zIDX6^7wjH(f631(Fm+hNPB93M;;eaNRYj=pVku54RnE)wEIZoK}=46sQYT&;*9H4edUfecZ=D(fVU7H$w(o)+0d9M6I z6(yD1FzOE7SE0*smdj^Yb2e_qs{8k-10(iR-2BnpgtAQ=LhP8FaU& zM@9}8$XG}=erT{fIM`a@zwOX7Y#xL8!(j4#rvMTiTmpdfu}V)Aw>lY@XjtAfJuWid zHuJ*gV~c?B^-CA5Ock4(JhuD##;zxZE zWnyi9k|k#C?aN&~tbl!Anmw1S==*YPQSHf%bJ0;o1E(Ix0`UM^ISHuBk(%{oI&Q)h zzNU~(jWM*AqBB-amJ&uEq3l>g&o~s!t*Y_IW1?$-zNsagG}BwSxnF%-3!!Y~37zzN ztz&Q(k$0dX=aic|W~%l(k@X#g-LLpsLe1Gaj1sNFuC9S&OH@V4UUQ>eye!ObjMIZg zh~K|$fpl`Eqx%j-H!f<^gpIIJbbaVue6r}$S(ga-DG_J`%R~?Wpb!8WmKJ}X>!sxy z85=v@My*-xg)B2K^<4g3rqh?P2+>$pz-f&Uab z1R-84ubqLpi-pTJH6`hTG8#CHlcYq@o@vfsM}y^WrxLkWb@5ViL#AJahjFN|8Jlr* z2Q|KHU^j9Ud2{k=p-U*`_tg%y&-|w5$;BDJ1ZD6i5$bP(3v~I|UkK#v{Yt1v>NU~? zlDfgguRc`Rg1a2hc~v>#Zxn+))4RQr#;4oG4rMyA-+Zj-Ls{R4?mSA%>}XCpv-xu9 zO6R;Sg2Ax!02EeCKobFw6hKANQX&hn+%MKp!^tjr4{=NR<2`t_F*{Z7VxhM-w!JZx zy+GXCt|3L&th^op*;yC%c>C z=c-Tp@6CH4XG(my#-vM}8q(-gW--EJUSd7$f#`Y!_Obv9B894*vo0-}`c!;`^9u!8 zA=ha4$%~b;?b-(+q~j?o>r%$|tXZMG>pdNzu;?rxu^0d*vO#(sgmRkUgMnE|@S%iM zG&|0svgNPY*28XI0ys=dbQ-3cY*L!7%7Bf*>-917Iazc5iA)UoFY%~EiVay{$UlYF z!;$D!SBEsX1qFxd+$HI4Q?kG|_09gkN@V>Nr6lvB!K#kMDGrFMO5~&8$d3~W%W-J=v<$@|=`Jvq(UDyCJLbl+ky?Mk1 z=X8n-fnQXNh`rT|r;yZ`jPp}*3zfb<1o}IMFcsM8ZKvUL-;+?3R585DPDCI@a30LY z57S7Sz%5X8@GR(gb!L==_1&z?v|5rY!4v)tLkib1?TVGFiLvC(SPK)@!I?{HM@9 zyf3F%;b45s&$sNS*_C|{PMzcD&`4s^1!;kCjxW}%Q9CxKhNHd$4WF1$Z4E@93p9SC(j8F z`81-{qVx5|Lt-07EvHi#pfi$#_;(`*Z>Q0c>A4gmGVAh9f3y(t)P4_AS5qO#&-B=2 zBFFDtx8}#*1Tf^tftd3$j02oREdFJ|%J8(W#sxq#Q3U8KffOZq8ubO%j6`~@&_4c5 z8{d7-JHnUZ9Y)JN5=|=xYi7hPAxzfy-~q;?AVus{#l3Y~|61rb2?nRwtv0;>_-Y z-c4cXh8bT$<__k{)k(%ul`Zw%dRO@3C(&;@Q*px#~cG+A=8}6-_M?QRc*Izvux#hy?+p6ZR28zKE?hkq#Vy zHu9Qh2God*?UTExN>AG zIV$MeZ(*{PAok5Z|0QS%eIIcTsDMWF!T|(KA+1JG4K2n2E*S#v-?nsB`gr(Yy!+jA zycQ7j5VCnQPG#|BUICu(d3z1Gj%(3n+O?^v z@{O)k{@*yrj9qOCOuN*SFoqqmhd=XYu+`%3*93?$g2J`99hF)A8!@bFRV6Lg>A!gw zuG&`%wOOr3j`qHjmu+pFQYB#%XBvy9)`!1$#Yo&-u!8{wZ9wM(*upoqP1`%H^*7d* zJ@@CDN{ja0V!?&#{iu~$#L#XAS6;5ER4oFYaQaWno9sLla&a4z*z+MZ`3;1qjwk6A zzELw>Ezjyz+RVOD2v|Xx6CfNV?k24J5cX(?Cavst-}SJ}hg_~ebCv<|cKzPp&WL~X zKwuXZXg>%6Up?W6UwHZX&_RjqG}*^jwuJX3-T_5bSBILwktQ}v6Rbq%tU~i=#}esx z5^3X{r{|PsBKYzX{HM({$TSKE=IufO+EzInL43^F(mAkN?jqzI-?el_Wu+DA+9K|9)OAZ zC2fN(tY0{#X!5`*r+(v?M4Z=A;9Aoa+H?AFWuLY1xX9`FS7&sqR-N^6*iPDc5RNU{ zt>L|z7h3iu=ubl5rPiD4I}jMro~<5qJrZ5ysc4?lU(K2@amVTRr@gCZ#ewJQIB_-c z_x%S=D4E!R=uF6W#Xb58V?G4l;nIXJPZsEg!J%{YpObWyU%L~T^}QVES%F=K&@Tu> zvF8BZSV;dvUcWGIHyN#PVg#5Ue=s04@(#_@1Lw+iF+nc*upFy&+b@e^5> zA|#HI&^K+-^HEns4i_ZE&1C3}YpIX8(^ML6Q+eZC_nJY^2*>yyE)Y^P_uBU zE9rl8+KwmXjz0HM3Sso&+|{*;0))fNYor#YKu7j-&;Chmd)LR?tU9E5;MJ zU7PXW9rQD{-SXhBGkf0c{ACG8M79g!azgm}gmwno`U3kMi=YUv7wR=!Ubl&sv z7wl#p?`*46`kTmfsj%ZRK3lIv`50{cqE^*|+;Iuc9k&$eITyjw`f*aYVly`&fVjLY zLN8oOM1@CT9!DplLL5!4D(83iiA+tea?5^`G)=^7n*gNj)_;8_St{k zKcwa+ep~8?)p$x82~hgm6+@9m$3Gi|tFO3ZD1}q9dif$dtB1=7QY^E>k<~8FjlC>% zY@WwI{zf?Hn(Xu$o&ZWI zdUVlyU{051uGxtpDhog;oYa$f51K2jk7o1N2WtY`5p}9komg#(S5Sb!&;Wg(AtJpz zV+OrzovpRHaRgFj!xduiFQCv-$8Tp~cbxblOz6zwcG@0^kr83Lzdrn<7KAK!UXVk#S} zU4Av1%j1@bUg}ch`OV9GP0Y;j2F1tA(uO!Hgge0yvT%s^zZg0UM{HADdjNA4%N$8? z+t@ncWwDrWO1byn<Y{jhPLh15Pi$BPfW`E3}3ze@8cyZ_GlA5oxj22MyvD%|=Eio0aPL=ga z?&q4uRW$Omx3L2qArxb;`IuW%{T)p8|M>*#e2~T-NIwn^G56KqOQ|gPcz#i$($F(ACR-vs?gi zaC%EBY{f&wNF=)z&N!)mq*uMs(j>b6H!H2c>#k+sF4)tz?Z0y;$nJ&wh1k#o zmkd2=iZ_-SXLA7bDvRTHWEKF4Urn{yH+A@Mqq*+ScF5{8S#6H`C zhZ>7bRxL;Nr;8P<{_KI1PL3J)Ne9>?$m$Pp0 zBJHDlc3%-llzFAf za38=p;P~EkR+C+`Ny7ACt44QyNp&=h($;IH1hI!KYoqZS8__wY9~ysw$Q61|9qf_V z7GE+60908J?d-U+9=vVpcpz;19c4kbD|;pM)1E0vp#^AfKO0P%~9>c>S6|;^bZCQh`r^ za^fc%V)X3flZTsCkyrkrsfs*5<YqCj-;qyknw`5S?)*z z%YINBC+UR=XR`qUVivbhL|nYfRwCZFz@C>KEPvb2R`1?+HZ{ey2fbM@VE4G|*{H}8 zBMahIi;G2W?Vho_kwHC_(Q*Pc{YyI6RvsHXobPii)7tOBA zvb36Bq^r_=GU(wIgD>wtc3uGp@T4$Kz^6v24W9glL5px479|@whZkF9f=T8pk*;KS zmel%H51+MZxh$Hl$Bk>$64g5;AO-7XVOuT}YHl&9kdEZDl% zFWkaV!=ujYuinbX1~xffuhMRdSLY6YnAh9;XgRzpKCC;RbTH!f+8ng1=ph@cmJ{tT zfvY2Y7FDW~VxeYc-4!*YsE|e8AX)0rU*%W4rj4HRor6>=yKg&m)$Lcw=P|W+q7*pw zzlku!)XN^jYGu)3Dp%S{04Aa}fHt35oKapyQOVOnrnZJA8K3|y$Fj*X@;$tgZf02N zra&qTyGXPD!bI>_{d_5e_&v!8y`9c0?L$3IMYa`p$C;~3tpBnc6fs9*brDB?S4P=Y z#(q#Aw_Cu7^JB{dO=kV;q|A*zXX3+gAbY-9&6~MCxO?P3e$O2TvnM6z!a#{%}S=hnq z&B?8~%q#_MCgq)`LUL7cBOymOo_g{JrzA8i@=iVBii{ZHhe(I|y)48&mq~PKxk6s) z6IVKgrZLnaM^p+5;o@(;XYYrd<~EW^9xEy3 zKV~4FSM7PlF71R!5GwQe)7@us9X<%RM$E0I=Tm4NF(I$QD7Q>N*Ig%^u3vddw(Q)M&UsPj0sqIBC)G|A1=SSIlm@4~x5nsiHXbY{}9hBVhXWG+~a!tR;Op^{f_eKi=%H6zpU{3Ty0bw zVQWR-UCH<;U@Yk?8X&1uSp>{$N}YX0fo$TR%vtQ0iR!r+gl{(--7D=)>ALIRZ^m+e zo_=QqxpfIf-TK(%p3ikY=hL$`P@XZtw3PZ;xM?s7A;qg%G zA*=8!B*m9w?!!_mBX*s0&Q)CB!d}_CcO14N$%e||{pGfn11km>CAN#zgPRz>4ckY^ z<({qmEeaR6PJb5^PeE$0$cK{Z6QdT-Iic>W7W3jyI`Wo;toOrKJTnIJiM%0C#W+Z?1aOP|NrkA zEq)n5go_1uX_K2F@Ut0*KfX1;btoh5mR=Y3e5A+rvPPYx^Ir5^$4pvqF4U=CA z9gYS3KGgr%@PqXa)y7JL3}&ud=C*rXb_rPCE8i?Sg^I(*{kvNUSE18jiusyPAs>Gn zsfH)+!w7jY81r2?VZd9LJ#A}{gfjg9%}HeqhvxzSGS-;p^^29(QJU80G`1MLIUK|h zAd_{ZnU|AV3!hdY4} zWhbUBbpjxD=cWE4!pOM^6Kt;;l5f&sJC(DZeeHVhn?$-pOyIqvOtwUPZ zjZwVcwTqZmqs_NFH}%~|p)oYX!~QuRI36``@inq3JB#3*y_~&m#Si7DNVr3B#z;U( z7dC=M8Vj5L!O}|RPINe0GT4StAcyZf`F$+HcZ8((rR)TG_&@!2RANING~z>d4vEmv z@!-!S04Y{HY5N&El!KI>{liW_KOAQXM#LWC{^RL>Kk(-R|8ak2>ZZWE@o-XOGLQ8Xzb^YJ^w=JJAjm`u%d^l%que(%w-cTpNz-n zUQZe@w~No&5}AeDT_nF8(K$ova3HiiuAs-fq(QwXXq#)`AsUFv_FKesVBHh;bh4c{ zEWrjDMpE{x+m1hCalCR*S>4}&TrMB8vbG{G^t1MSjs7f3L25m?OWHroQgc~8g4t^Z zuWX$VL(mxBn`RYIvj93V3I(t$jYXM{O{x}wKGIg#J zTjP#%!>iHXU$el(AK0A*o7!|1&f9eNUgpO1oJss@vgQ@SZQGVCR`a##;X}Nzld5rQ zdM+z0S?YuB+o4wgNX)W;oIZ*v4Z4FW`aq@P`hi!4YG-ybh4P9oPQTj%jFr5jzWV%V zT_6js8#(*iOQDyYJ-_d+Q-@y_GwKMb29-$E7yVP{I2_5($nZ>qSXQY*J;~v_S_*;; zoTgv|++}e(N5=V(U~f0h*Ogg45nY{$-#YPx?Bsp%?4=>dPe+exbOh^?U;KHf+*R@S z_SlM&4MKRg>G+*hRY{H>5{1?QjVkI-!muN_mX~gK-RPmcvk{vckoV=-OOk_|j>1-d z&W_Ow!|r!v59uI;fpQ1IeG{($CRzX&Jc1mQP)gy8J+-h+bL;II7Qd;suZeE?wB*qC z-VD<)`~jS;#}0E@oTkl~sfB_9K& zJg@sx2SuitG%ZuO(5t(Hw|L3BO|{FdbdCqV>c-0Rorz3(Ce1}%f*I4iXTc7TC_~O zX{BBdB(Kjzn4W@Q$3cB32x{=4Lhxm`{BA85sf=eKyFrn_Yy zNDvT`>t9C@qZdoQuyaTN+nfBzceDwqk#=$b>krdTiEM3ikOoHZ923$yTclDCSafia zL0;iU2pLQT%b6jW$2y_vxor&#Dj*u7!V~lNi$Sb3J4~>Py2|%IsPDK~`56oY4SJWj zv#+i~t5=7~V&-nEEWk7B_poQHzp?&r=`IE?Jx=oLo+Bs{DLxt2 zE(i^~{}4C*TdD?sq|KIx9Rzf{GBNyroLRA1r;C2t_ zfGRwt0|!LRlsy{4h}!7K7RqhY`ue$x)M)Z9T@AY8!=&i8I=?RrKl{**uur26b7DBt z5@)6ut0Re3qQ#0OUy~od5cwIzxhs=%@Xx>tPR2s~4O!KLx8;P(&bXwaC~@&{%ru%; z=8m&CA8!bE^%Ky(rt*WQ;2ThIZZZU73`#4Hu~& zK;C@w$T8rb*Du_+^f0-D6gU}=)wJDh5P)QnROCttZ&U<2^o`4wi4s5u(`cS!i^(}cZW#2gG1+hBbJ3S)#>Z>-h>HhS7%wqH`t?GIwr#xVEig_gF)t^>T? zZx%ct4!IK9r(5>ht6TY-q!}L5Y6Y~S|20m(VIU=FE-&&ZDN63UYD(ciQfeqn>)~|N zuQ=ztmq`KSX>kW0)1^9vw`I$Z!|C6da87SFn4*|WNL~FCi4PCR3OO6zKeF)_N&em8 zkE3oBC$Q+e1`ue0k5F8CEHY?NqMdU!w1D$;odI`s^$iM$hhd4h?;3=2iFat|SsGLC zlz%!{*mN)R<--LYE)YQrW#`Lf{EY@mp>F-Cmuap6W@r>3@);nR2nfnd7Rs%}^>P)K zm0f#ad_2+#-lcu-9FTP)0b1gF;ci5;rM{@lyH#;&o zHyci6in^JkRojl$tKJ9Em>4si&j(oCJbrtA@y-=dT7}qbSrxF9@4!U^G@H#q;DJb` zG^S6bOBSSxOb(;=Q-~1LDxV{lt@Fpp%ZA#NC-MZM%q{|)@{ z;SZa!OzzagL)Q_Nb9;*P%pN`E*UlHqmMi(C20oa3TV&C8LdEr#*=-^8G4;lg41Z1t zv}?_mu%ho7U{5rKXjWd9mXRPt2EHs@eQ+Kn!VM`qOmvtS#m2`>o}lR$BKfnj??p%+ zsH|!IO5~pTCP%ceh-+!anH>`&){<|P9Ez&<1SCR6qPU~nY~Tom)?q#S%;rf?Wy-G7 zlBgjU?sFaU6om_FOz_7hL3R`q8HbmctcaHLpY+9rh*wQA-$eM&^SbSP>Lt<}zp&vY zCltjDj1=&~7eT&0ng3gPh&YgrWpIM(cKsQ>M4{-N=|7>Y-VG+JK7q%Ib(kl>aEr6w=!S!nS3L09n318(Ek zZEtHRqCLx$Xbn{NCWbc$$Up1`QfL#QbAh!_th3BdJmSW_zO<`>Eo@#mAX^X<-u6wY zt3eTfxc26LAeq!KmRAhPUDmg9=bqBgJt*^%0{xXonGvRv-rvp7t~5nmF@JmkjZ_QtF-JT1##zqu4KJiazBb*Uh2kq1V3W%0vt|y(2-nc8B8?vy zlB#Qf;H$CX4?XR)^fv8mdxytiE;iCC&1XrY&=ynPkjORUgL&qHB;2oK*gpA!^Vr4y z8J`L}lRuWUsWzqe*g<2V={frp5;=3mG-pp{^PMYADLJtUwb!zH^3jz;rEt2s@#sqd z@>kKn3Gs&t?MZ%>;|DaC@3hC|%VW@F@r0A(2rkl-%A{JQ%Pkldf;SF)i{IOe;{N>8 zSUDIec0SLpeyqRW2di2-s{I8!$^r&dlm#hydO|Ygt82#tdfpS5QS) z#b_lZtQk)SZj2N|TS3d&M?-R4r!r2~%$HAqaP#M+C`74cTHL67mw98MlDYNksEe>v zMN-;WP%&CaLz~D?@5NvEhLO>>{}eifA_XWcMZ9ptl{nZqv58{Eau;yWU~JLe0{@VF z1f!{?S6A@Wt6h`nFBa%7#2*?=eKJUb^_}zmZ8~oCfBkG6Z{BX@qw8p}9@gmSSo8Z^ zjX#WDUOyEM*_XQl@h1PMsAhe zbGi7Ag*Ph(M!OvHZ}}Yo7a&3aqFv-8UehM&=S{rpF&-rV^HvSUe*C>U!hjMzdgD@u z_(yYsmGeeioIxC_t%!bK7dd9%dflSyI;C<%3sv& zUWykzgw*5eU5BmmOF7e%xUBI4oM{BH{=^EyX4lHCX2H&^?-Bw|WpyHjklcI~yfuCO zmNmdw*LursCgeN6o=s$F`f>(Q=)BT7d=)mfAw18FIV60R z+bR#Grj2ATeL!i3-Wv z6!c3!Im*rY9H->TjrpFeBIr}a$LPPUdCx9FjM*a;FP0QGJP@JfXtwhvQEj6fR+5xQi>EhpM_>yd=1A)`M8{GK&WJzOqaZkHQ@JeIqv z+Ac?s32@9v>whqf7xMG6S`2>M2dmp`@6#%e%*fJph23xL!0ugufy4s3*dxP;136g* zR4hrtGr{mQu00VPWj4jR37gpd+ae!=@4TNg$Hnlv*-*F@A6jF*K=>v4vzO{zDc4B{W@!ceZ69ch0zbK);k+{#A=O*F%^7NExuRaa6 zyVF$?&qLB%DGQXvivjpP1W?*+J{YYu%n9#^Qlgnp2!8WE&!yIsSga0yCD`J?y~AGX z4bw%Iia|pcJyV_a-3U}xBb|=$<+`icfp@)DPvC!^`y-1HAu7m`2GX>C$%J%j(-=!L zO&dmhK)vRXv_f$V3y#IaJN51;`|jM@C**htn|!lE!t2p4XL>$Uq;RRyxJhZk3&`l7 z_M!KG!P%5E*1Oe%TE(+#`lv)C3`8Do8H-4q#RLsu+WQ`Pyrb#dKiazGixxSPjiJyP z%>Y>;%@-%z`b~Iy_bm9YXZ|rAx<8WpKl2~b4Q<#YvEMJs)=w$tpV27D+)3#9) z_-D(DG-b&JiTn}_OS!HndK%Hp43e9 zD#MvEgfao&cK(&&kWd;B5TC4xqK0B7^Z86lqiIHUXuT~`*eGHB?Qjm4GjkzA_oQ$n zot(zcM$1SbEixAY6jl!n+QL*NJHr_1*jyu$T*iGc;C%KpW?Rk0af7 z`faL@8kv3myZk!uPe`h>J6c3_&#n|F%dXOOKOGcIHnpg_rsatpYYAYlBr%-p@e6X7(O$ED$o~}D2O*)z8S3#U6$^kQux<8<@x%;_&+CKwPl()J$HcOO zy;DccNMgn#E{hU1FQu-6a5MSm&G8giZPo{c$h(#c5b9jv-wQhcVCUiE;-LhjvJL%h zD;7FqHl`r8Y|!$q6IOgO+nQ3iZz-spSVq2PIG71SFX`@vhDFMY zB4#c6Tj4cZz{*-Yd1?a$YR7M~)Bq!6c$qSb-nK-B>Cg*SH2FoJo2ATXxPj<3Vv?a3 zvKs4KQ1#3`N_xv;vx49fz9{YF{Vb<3s+V~BiOVZ}U~~qb+UWpUXB=)1x|f|DO5z!; z+)Kc3Bh%62zkaj$_BD=Sh2Ek1;g4GbntL3ti)AKJTbEH--7OESykH%ILIc#I(%Pso zj`WktjdMF2BCW?Dzcoa!jZBH4ddrA@KF6dFn+(jAE>)=Ra2C22A7u1b6N|4RZPJv1 zNB(f}AzJGwEfS#m6JPf^5F6w}8efc{Y_k zgkVvPF(Na#$Z)%2c0-k*Y64y!FnYp%keUxs-?6TH;EvqfP*E$!992F`!l-&s+h`bCReleQA@5(fh72gK+uWXlI*0@K_tqmagjcx7PU6J zK4nA(#i=C{?MJX`hHIU~uUxqy1GSfah7SzNWSidp6*?m%wODGrsnxIhZ~CeG)Syi$s$r}oNj8D!q@VXU6Hr(BMj3~=cd6EnvG zq~v`ky*CTsCF@lxNdAZ6XKQWXsE-o5pi8|th9m1NrSflu63cDalsN;*+g?mcqD1eB z(1$de6i!JDhb*7%yPyonGOjrYmq3G`8ZYTdY2*Wv*4IG83hWS$?%)At#_m@NI`*i~Z_?tD8UT8sxmHC{GRZ+Gkm$W>eKOU5cN3* z@f_s*4SsuO)1~e2Po2n>Aug#|=l-U9c}d4BN=C%t128u9WAZ)E$n;Qn$nM1U3X;~UD74H}LzDHVQmT_%Nt zatMHPF9Qdx=^gYvMlNYYg=fC{9BwAzai9Dge^Ld5RsG!$M?+A~oz!>kp<&^EEx(+- zQ8ch@U>ByO^aqJH;!|$X$?N4ZiRt4&^#ykQRc27wxSuiB@k|Nc5#ml^Au<7H=7Ipy zWv`U*M{~*L_#M-6;r8l}e@g3qE=&`DQBM&kDfS!t5J1(NBe6sK#w?;{J9ApDBQV=y ztoKZO`5{NXh#;$nzon(|uxF*27mW-TT{TM93jr+K&b)&9TTZf3xf|6CJFE~kJQGRd z`4H+DJoR$r`O5)_VZtz{edp?x0fY`ds|5fbahdaTh9br7)4ALnh)vq=Wi%+4J}?O) zHDF7*3hdJ@XB(=%s>%7M(03GMc2)hl7h1*QET^ZEr5<>3s&Id(9_TC)=SP-IT0O4_ zAqV_p8;sT;g3#jY+EJCP_4t{zl;zPnwKCRX30s0e4THYn&C6elh3zXISPn@QH6L$1 zEynLMM*@7VerJD9=%ND~(BW4EWxZp@BxIh9+WIibcQ>B*e;i!}Thw0{TwsBvm+tQF zuBE%XySoJimhKJ-5v02tDd`SrkVa_%LHUEQ@A`g&-DiI1-gD>7nIS9%Ao6iSQHVncPcR~`d8d1$x{qcb9SE#=>r%AS;Ur_p0htbq;vDF) zuCUL4(Pf0oNa_#8=lIivi+PL{4>)z4qKaJA={P`)SGL?(pAX9#Mqnz);aO4{=@ zwXt&f>W*9#gpIGBQJky2xAicM%WqV+Jy_|2pejGKvp)KU`xgq?xuCInm9qMTzT}2j z*jIl-{@ywx=6;kS6X8b5y;p-JGHnuGd4wUrr_Zr@qcU%?7PH>V`qyv-hdHALPW$@` z8GTti3cq@K-Ch2@z^KYw{B3E95JUojA9e^L1#%@rDj-`a)trZIb{(T$16ff1c$U)4 zB!yt1naua77e|bO&yC&jF;@Zi(0>T6Ap)h8*Df%*N_fY~B_(47aM9?EFF*G}mkBxF z-J_{|4ZHlPY`}+-wO55e&G&^#-m)K~Lu;~W1|C~WebW@FD`OGwZxdDcTRYbDop&D& z?XYSncETuws#0)E%EW}agw1c?E#2|o&w3iu^UG2L(&Rcoy;rhy&#(EwDINq*HrV*N z11>Gnm`vxxxG)_){u8tO*W&-o6C`Ew9fCe3X^utTIc zZFR46+8R3{?kJn1goenX^4l%l1xIg{8`nbBX-)9LxZPXln7$!hvPi?a^OJA==fvS6 zBha3M`YhezDYfg@l0awyT*L!_AnSWFjGj947UWqeVb{`iX@QF09wqy@7}$E4Z>{UlDlLX*_E%jI4GNhv9XMMQMz-hGADe(ijxu3H5j9Ucl>@f0B|2! z{5%a3L7Mka0-frMbfP}`u+)!-D9%ztZFTt4(HpQaHd zp)K2?jBzB))&IqaU_fC(2sV&apiFQSyzOiM`puS*Ci$mR*tON1y8Ygxq^xLq36g5_ zT^XPe?Z#W0%yqT^VZf@)9S5#LLJ7>WdQCZ7&FByK=`CN%Uzl18gPA$x#^c>WORGUp zk%$(aY_6z}u@(9xSQ#XF$$0!EayQ2Ufo|xDAFe&)m&7usROo^#{yM2V$x`e0vL(=w z>RKT}6HHsr=-ak~^wG>f(IuDW;ybFihC@@6F90g<$nESeGqYk$dYVs#Kfx4zKhl3p z8D$x2Y5G|XY%$j?>@7F2VkR%GQgze21@`Oj87*?dlwDQ8$j&Mdv|i-uAWC~{waMT? zui2Y8yxXN<_O~v_UPSfmZ%KGQ3`Z}6xUS@fQs zcDVIBB}d(O7BWe3d}w2|2Kh`hdy~nz@+~jl)CQV0`COP<_8`0t*mn4+-i0nYdYK?sEx5TEk@4G*1XXI#Q$8L&8<^LcEfA{A#F=mhe z5>Hq{f>DV<^G0w|@duv#Pb8uLI#^sI6g^PZOMC13V9%jKln>i0P(M`yw1se3Jt8KA z3&>?(l1=X_he_z$`VH9!*N(fV9dXwsWiBSkK)Uu6&G+ZKV8=V|PjZA0PBDrR`ucGa z5&pkoxwnX@Im#0$>ZG5h-yC|PIo`zEQYZY(iTW-;R`t= z!iJU4UV1uxvI~T(7d^c3)R@-7mj5yZ;7gJ~ec9C`RwaOd+=V1RA_@3P&WNM@Gh~g> z!VJXGkmy}5iL(ITE0@4bW>J>|>ca$d}VG2gpK`=gf?rr=Rxk~KGU zJ2iC7Ee|<%l4?1X9M$y6ubsSK{r7bal<*|mBP&qEVx&USHt7%|p)?4}l+UgV6a35& zOzTTA)yT;oYH0PBYg_f3 zPPg66Y*II?_xdJ)6EeHzb^3XrZ7yE2ZjdZb-jx}O_G@J6w4*i+r2gIavWmX!@k75W zB+4}#_61WcwP<>8(TP}TZ=OqOEGdE))xCr}P?6cf;7e(=o+|k!rmic)j|jiB1S<~k7|6u@LufS?h$FJ*hN%eUv#WiQbWlvMelc`!A^XSr z_&?;(IiEir8Y>Vi)Clgq{3v_q^Anu@an}Zm3Hz`9K6v8g`{0~id3BLqwq?Es_#<<) zKZdvyY&HD8O?^kQ(^Wn>w>$!x0kZy7jdi{K?UM>|Ew2x4|6jQ;;ysyIkx<{(&+38x zU8mm$nV>C&%J(a+$^6%F71}}kKYb$rpgU5^xpfueTj1Qd=KF|=Eree=g#2U7zY@*7 z3MGp#wBMJFfrv0)?&ihGh!Yr$ijF)rBghT)-i)2AsS>x;gK}2M|47S=)eXzq`=e1~ zqKY{P^Bq0uXnFXGY{(Vxg^>t{fbJcX3s0a+ZAbtKp;q82%yyqG_zfB04dUY^3qqcm z^*~6O(dwr>xsRj-T5E&(_R?=W5RF1ft?tgP#?HCOoqB7fSMQ3?An>1yQrA4cZ(S1G z6Kh5rR}vAQXh}~hR2PF4^0icT1T`{DPB~EDU?DXQrTHqAR-dbfCbRldKZ7VVNcTXW zGTGq{*P3?IMmJZPYqZo?@Ly=t`0j;(&ytcA_G!*j7WMt?Lz_7D z?Y|NsF25_o5C4e7U9*}QI)ruDy`)!$3akxWnKqK2He|EZG>!T-tyd{>p1~(UQNH>fSFT&i|1=4-Pe^ z0tnuQX@LILr*iH634fu35Zm@UaRxJH2#_NW%V{p5HjURq|(k{dqVIZyezC+YROfj~aIBNGy3H0VuQf zu@+&789X}({<{$)YPC$FKn)_Spl& z94)uz!N-w&uT@l-HKBBZ&W_B0>KF;zd|cZ-SKA~?&)m;fW=jP|4_WeOO($Ao2A5{a zR3R8l>f}a$eo7bEXY`+^cH3uxAeQTSy6HL&1Eo%AB6TSOaZM103IrP5cZ^4iY{IxI zV|F~ZclLa3V%b^5W5~@EfiH^AmbI_RNrs<`>|RX!OeAVqPrR()ELK#zO${GfbTkbH z3y$plsFLjxG9U=q^z(<`dONP`$MOUX6l9;H8hljb7Ja`EGAXkWzShT^&?e~#0f#?C z?zJOK?;Bm~{+7-f)bK<(0gAxnX5s5Y>Gs#Lz&urbJr1rCsdDshHjMUQ1RVX@W^>49 z4oCBB4mz)80|F8U8f~`bHY1hlCN7V>jhGhk$5L>vE&uwRoPqKlVyU0bS-*;bX_9M@SC9YFF?m-R%N{y9uo^h7{`sQ5&zM`mT`Hk2Z#7AWUwG>? zmwAznrom!>&#{|2>_lu1i_{|2&x2%owXcrK{JD_j2jm2@J+g;Jaca|asX6cN2(_Y~vXx{@qpMY%g%rUU=>eIkCa(4UDCYnCJ(Th<(RyOQL89lz@*~MX6@N>(+IBY zi-4${jRL(-nkN-se5I^AQdX*rSl)%Y2t5IXQ_(AN6;m|kBv{r>e#h3Qj?s6U;t><2 zs6}-kv);$If4xccjKR2ajyA-G)Pfi;6N0i0ych%%nH7t1bZ<}liKC|F1Pm(A(% z5;D>b7omaG`xOD{DPcRWh-K|$EdSq4S&v29m(g#-p==h9G2@hAD!^%8)#m8Wg`UBU zf(;3H-VkL7Tt3-*rgc7(mm_ogouzaB zt9!=GwD-|BS6;Ql%rWCv{l(qj(^PRiBb$$Way8bp!LW#V@lmsJX$Mb^*X$d=qK`oK z&UQ5HiorPtqbmgogPa(*U{;gzuW!kWg6=`8{{AziIF@Hr>XFS8tOX1jS&o(XH_~ga zq`hXb75V)F*|_jEhP6n3R*0O2pbyui;wl%0b zWk`agMrueHy<8kqH5nEgJ%gKe>o4uzM_q;d6dX=c4?bRNx@W_MpXq+_nvD+Cr3y&G z?|sKhoHD;>VOK3T&op~B4bm1Q&zGsaEt}1#?_UBgI}4N7W0!}PE)^X}H4B*Dt#Z3f zxCH*H)&0yHnxyvGj%@-&@?}L3wU1}?Uk$;ZLtN@B_}q##LiX$*5KgdCiulbhIl927 zIqWyT&`Rvl$vjrpI=3@U8js}1#!wQI?O9{AzpR9MHts17{(OPGvXE#b`kp}nx@y=v z^yhc>zG(<{IES-I`ohu9H-J2z2!^c62D+G?M$du1t`>t^eX8GW=@KysN%W-x9GG&v zqWK0AR##sqVUKQW0N$9&OH5i0HmHzoXO163sIeMeZX~YKMH8XOjXwwNidEx4DVWbt z^^{;g;0-Q5+2J~O5k<$d+T(T?&bEnHD8G5aB%Rm&n7DHaWwICfxmD|Q(B_XT1cxvW zHkJXOZ^a*$P3n@Tc0V4A8&>!7_ElX_nr!>@n|)m4u!xdJr4bA*9-DNxETJd>y8b0R zoFef?e@-kV3nt=F)R@E=@;Mj+hx`{bm7p|?D9c}ixz$T;DGpTiC;S2Xb#dZfMttJ< zAI(b775nw+;lne{iS%f0(1*!cqV(O3Ok&J7{XZ;i_vS4b ze3E+aUs&-ptKR+0M}*WUoZv|PhG&g4EVwB<+a!85$Iyp(`5C!%`e_20MI|=wws0SZz4L-w~!eI7$#3b6n2j=)~qp{2hqMfZnf&0V!*F-B0lsQ;&x+|PN**DgKH zMU;e`=^Kx5kZ-y00qJZp0=nDZcb5Dr5$0(+0Q-Y&$Pu+3K6;e z4WLCS&y*7URKzd`HXeawXDYbN&fI)otjPOP-gf6FN56wGO#MO`Znbw0*s~fU1c2ac zuK+;p$QnX#lrD%SKq(jn&l5dBHnXNr<{v`)k;tyL247jZhQyWlxa-KG~`8I*lG}HHeym2q0yUsohdC%2JD#47n8!@TGt3 zHc%wKernKW%+&oL9zQ!{Pco-Qal9pL)#6XPk83MT_ktmcrg_cqnKM*G*(wF$qJK~ z&3(+pzcP6<%*go(-{rkgRP4G}H+)FSl<+dh(jj%~BaSWIc~r&Sb{j|3TPa+R>^ePO zPjL36Umz^6cYRAX57oMGHJr32Dc3j&Qu_JL!ff`VP@tU-cW8DAIv^EFn+&yxJ2!WT z$4^M7RRjnZg=`IPvDwvQkcHl&#^Mkj35`5G9r~cIzevA!!P`|hDp-dQkFm*sH>%}} z$+71Hm+vsx?@q?7O(rix-AwW#C!qfyg3m<)?WNW)IHY)Z5aBh% z!t1rI4f{}yZo2`uDoqHhWnAkGHhXA8Mzh5f6cM3lne6T|Q)>FKZ8 zD3T|5oYej+WW%$hzb)(rMd-kpWBQaJ#*4>zqmJkpskcLguB^X)r1@>S0O$mG@ThKp z-*M4ogP0w5m?kUv4x-BzX7ntt;tU;7<*m9@c{H0ac9O%MPR+~=@h1U8Pyn#}&Wrd# zWb)lEU9V$BNU{hx!gJnn3E%cH-Kc+KQQ}>uqUEd{f8L#%36PGZfAf1E>reM(d}lHz ziuD!VvM~jAt&o-P1yM``-{@NHL@99t4Fj%{I{p*wtQ2vAi9Iug`0j2+l=>RHj_Tqg zz+a@OfB;NvwXQ848EHe)lzM8CdqZ2Jy;Lg5GKNpXlT~RK-DYbMs=Eit6WFse*=!f~ zs)`Q3fVkt;@PY}TGWgoc@31Y6`u$W=d5Q>uu_Ycl9mr!uhfjrrUR0{D+tTlETa5b< zJ19`ulQgE|DNm2vQxF~Vvo+IH^8X>U4h7oFt`uq!@$glcY1$lOVjbYvs7tyo9_BOz zMC1?&Rdc^>8bt0M^O048wQYoMC*~*Ma<* z71mm!GA!gwohwK99JR>KtviMf)mb9$+!CUaNaMD4pLqDMM@a+7L&G!-??c)ShnWA+ zMA>ZJl7ZMwK*)dpJ+2H}IR?oO zDbr*DKxI5kC@TIm+#6YJeuPO(?o1V;zqvW%mE?wWZ@aYDLT?0>2P(fyy^Q{tlSt(v z(}y1X(ARqxwFKv`NZ3H>Hc&dER!e?FTvNQBcK2vV^3?R?1zDKA=LZcAbI~;$1e-85 z73mNp&8tN|vu1`)k}S2WQJ(gDg?|VgAtDWGuJy5Uj*2jmquVgDEVt0BV^vTgAf&qs z+>@U3#4z7~Tx&9c0?D~Xg~7#YHzGe!TTTkc^HOboGww}z1cu+5I)#48DSk_JYC4^j zg=&j^8ds=69_vH>UoaQ|grH{T>$c}oi=o7>Q`uOMq?#i5j`TCEh|?#t3J1(z2?m*I z@?dANz7mOAho%SKGQY$Kj_i}rC?UZ)Y=2Qpl{ zOlf+OIs}#1y;OFvT1}8u>JjMWV|!vF5Wv<=Aw1qJjS$WDuYy3_)9mRIGppzl)%4s>JL{5jd}aznUC=pAOw*zi)e0Bog2(}u zk1;kX+bAO{(^OWUe?}$Pms3{0;U7YKC`gyetNiLjB?9Hos5W#gsY@7!mlZ_mKT_QV zqZ3O00ORTznw^t81t6eqHVb#PFLDZsslk$?3zKWinV%FPJ&a4G*u~7x#%z`F%kPwc z{4!9I-&H5>{Pd2q+JFPE-9-sNkD}yQj@|xY>l6E8Peva;R zL-&RN49iEJP7LD5J|q$6xcjl}oP1_F`fV$OM_e+17MJ8<1TGfg)Ow2=hi<5rce5EP zUZ>(p#m;elsEF2xmpP}t#TwY7?xO?(>@l=*8r{D$0FW%X;(W1b!&yC5i6M5WYseE* zL`02p7qtJ#`MW$s!1Gc(hOfD=L4ADI!QOLHy_8k4is+)%6(2jPU(-fV98H)R)_{PV z4nR;@!)8Yc*8Z5xam8T&%k$_sEy=Fui0rnc^sW8TvQ+(MMn^|Xln^s|Y^M~6inf!y zcIV84$<*2=cH$Q)jQBz;bJ!q^>mNdwkqpeT`WWg8?J~!%TQ+v4>H06)S3DsRxbH7o zVhL#!#dYg6l8!ki+xm~eQtwrtpQB>ihjh9sh*65+cCiwFWmw5u*sWR9qY>WdMJ4Zv zdqW6|kk!7{?I$l=NuCzYt$$seJP*Q-0&vwO6&zH^?4t__g7>*;8x$<^t8_^` zN99@TP(ctGv6zS4x;5Ci^RC6BuJ0d*nT4KBY(($s>Kif-g&DL_?T{O`0hllcygBLFfD)B zlj&4Pp_DG>qtD&D2}F@8MnbAs$UlVOjwD{v|916Pq~guKNybnvB?RcYH}^)c(t14P z5}JN!>KCUM6^-OR)7=cp_tq`c{OU`hvRnnN!jOjD%nIt1DA>avBhXlmeH3(UPTn%| z_Y8uHqF5@kIoQzK|6ICnPlGl-*y1c27#2DR_sF=rEkm(1IzxsR37d}o3u#h?{#6` z1V#qVFn+eUneT`n5*d*QMb~FfGg?XBu0F$H7I0o00FV{es6+@T80GYxswIx)`?`vo z`3;=G{p2inZ71QtiLIHH7!x6?Kj-rrXC!`nTOKlv3t$<4SKwrF*;#X{GvqY6(g4M(e*9WEN>rBU`b`k$J$o^!lG@KHPfs#y|$6h#5j$D{#K zILJO8O^GPsqw+-rI@jmbVkeKj4-st^Tl2LAjf8kH+^~%ns0q8dbG$$uW_$KHwQ&A2 z5+xL3e$Y#(mu~x&jX(pi?)cI}(u@z4CBnXlA4zfu#?ZkdWH2yeTA(#dw4v7CD(RBi z#i(WXhTf=bFgFmMB5GmKPmN;|%Coec6c5!0-N(i))piK25jJRs0jHKCtdq3Z(x-=M zTuBgO5zI!kMEb4$KdPNsNt=oZK*6#@a(2iZ4+t*Ces3(k12zw*V`uqF*nCK-ar&mj z-!uG84G~=k7-a87uYa}+@zs&m`fDq-WN{9NoWzP8mQ48+Aa6Yt(T+wy(V;eQ7&A5L zRDm7=+6Osm08%g(NbC1ZjgjMZTcfaP#b}(WyKS%4v`;#gHjLMb>OPR+v^_)-Sos;! zpdEldV&oRum@-P`?&<$5;F$V{&~+pbSwwG}L#RYI`n=ZVj4h>kSPv7v;PsQ#oi#fC zoW+hW_#uf`SVTfzO_FEaC(^?y$069q%YemswZe=3yLmJG`v)NfVbUPo==0GDsG@+h zf5$IgXGSFO=bO9f8ix*s_5(W6jbuLBd+gU|$Jb)ZZ?~rVnzV3-m-7trFmOn=jkm>G zmRcdJ3=L5q@IMB5!XOahnU6Io+2c0YHVXNE!_0mp^GvtOk%yzR^<;GmR8h5A?Agud zj&;j@NVWc5Y%2>hbwkHV0S)Z!ocy-6##}!;rH4>WEZk;=Y6Tl;^L{NH!!CkhZ#S`R~ub4Z`@JkEtaF=cW@_p(1>m^R1tHkPJY zL_zu5gKGd0_cKE~kd|kS0+$5mIuP&D6mR+@{0H^JR{Or5Zq@@fDj9i3!B0QwhZ4Sc z8Xh1Z9R-KsN6DybO0y6$jb#L__O#LnU;HOXbax6motoQ|Y6#W$c*(*I^$D(*6kVE7 z3r}U3zZfH86uGd(4+aKAeLT!y{`66AZGT%T#+Fg*0)^E~=P|D>9|vBSXH3q5z}#4a zhmQ&7FSMS!y)ARUg+1&&OHWgi^Hq1uKd+@QE!%^V9k0jgM~iYi#y{YR_SUJBJfnLC z7!EA4?K-k%7_hB~h1cV6!pZ?;=6No-H$Z{1?lYkX|O6hB(Lu9AaGXFl_q(vZ~ z##3SX-^&uGGH;P_fKq|V-d}#$SUM0>SkMk9k6);Ho|JcFvZ4t+h`ai$s^z2aO8-sR z!JL||4vnjpg9=4-R}upD5I_f0RqA#w{Zbx3j(JYYRx_;5|4cdV>UkqcNw!&FljMVd zPcnnpk|m{nuD=}V(nhi3eZJ0F!?WYSx!q4#{0adTk@R}*lrRMN{1C5v0!25JClOic z?Z0S{obk&`wpV<+3Z(5-D3KNPmp}7K@KPev*-aBH2epTkk{5?TT*xM56^G_krdtjtTxlH7nsbtY(A%6Vc()xN z_=9Hhq~d_Ryw1*ssPz(8wlwrZgpYv9hDVjAc(4V@L+@`K*Po9({?okKZbt&4fzCh4 zbYuGd3qt&qa^wqC*_H3%O@-%kcf9 zfo4;4wn!(HVI|wj7BQc5J%X2GS<3efyK!piqJ-&v*O;@4a8;Gx-uqjkrs2-v7t5S5 zRr|V-d9)q!k58TFCFn`_SSyG|oq`B*Je(4rOrm)*1+9tj9E6eaZPhy@udG$@7VxNQaP+5EC$wf>?bw%mZ`< zBxuJEKehT(d@2L{b&>olWh(Jnpy*3qY0`XC@EeAwfECQGwCy&-JGTgiDee#?9 zoc-kqy8{%>tajr%(mR|#nPx%u9}1_Q?O@+W4aD@Z%l>=LHwKmoz1uI^e}1K*kuqig zAh1G8ZGqUJQN+q;w#W@rS$@Y&`84gJzHZf|51* zS=jncjJ$22Yzc;`dyiGHYhZQj+<$Se=p-a2^`?Lf+?yP_l247~BJ&>wj>gLIk`{oq zzN3n%w!X@Z?868$6@Jw**%2&=9Z|=}s4X44N-T{wos-}sMSf3@<#b)N|C)EMad}Dp z!sc1WvzEcKpK|C%n^pVtpNhVbubvhM&G0gK!KNGc#M#lI;P4~S^h2k9cL(`Jh=LwV zgFriO|KTM=r%s+Jiy^xdE_JF&!};kh{@H^srl#tjvvdZ{>bPD~bislj(y%)=cypWI z!9(qGh>HZ|fMlwc{-}|W0SwU~W7~b`ojRjSf2;MLr$R<~9d}?f(YYgl34C04D6lwV z75CLA_t{sIb7~DsfjYt5^&dj;dk8A6`_)U$TNPP#&LPqsj25BmUT#Ekn&TA^ose5! z5K9(SKfO1>2rKj|)suHRO{1tQ>4{!4O~g*u1fSy62-E*EzBd~r{7H*0LzeYdy0qjy z^=iqWrV+{^xM}G`=@;W`cj)-)-wE<;2Aj9mh&up82tczhAC2R?w6ghf%lK)UT|90xH_XGY6)J}yrw3KE`VMvP^VrBwrHgxQZbScNz%~~r7F3xY#&uBU)B)ble zTnsMXY<6IsQYsjyYRyWcjHCplOfJqwX3xagE$=_po6;i69fU@{U9Kb#2cg$Sz+63O zK98JJ1$F-*!u8^T9(|@KmGPvwp3uuvC|q?=!u?D93C*2EVYWv7SoK!WlQ~Bbzyk&2 zlmPUdA-~C2%WeyI8GIr;r5rU|Na8AJs(FGgX6c~u>n)X2GDb)`d?S(I&8JvXsXMC+ z7z}+C3MYsG$m=vcocg3B?T0j`;A*T(dO6v)fao9^H6A2yhjxSY>BA z@JVb-trK#K*kb2E(EC86e+V5V0vl`$$XSW$gy^3oZDOdjiWto=c?^f{&@Rs6N?eha zm*;s^A7z>u88mupMJWQ=9W8fu9vlTx0<~lxCv(XZh5Ip%kAm9!ccmJ7!!5-fg$fQQYof;jmlz&eW z4O3+0-*F~hI0ng%^j?))f>b-beWttfw7;3VEb{p7 zAIg&cm}mmFJ=9?gDwovx|FZsGB#>4cZl^#5mz*Y^O3Fs3lD)hod{7jR|$*d-&R=^X{s%yiM&pK?M``;(k|w1Htcdv(qYO- zfYa=gn8Tz)quw(ciIS-iihaAtbP~;7YVkH30pz`SRIguKp==lNNgZmE;dnRd^S|sxYN}e&_bBKEEwv3TW$1QGA9DYw_ z`i@SE!JVSjLtT63@!#|5;XMt8|2L$)u3I~KDzU`92$yvO1V+&jD`ddS ze4$8_==k_lRJ?emm4WVj5bSCZ{5_<|2t?VDEIZ^V;GAPwgDfXCWmx*<<|=X^ReAx| zB9N-VsDwbuKxbI}$1CB{zZ&|12&C3E`pPavBNi*hCGZ|@ zn9Rwr98zHw=A1%1QdC;xl`B$0;%0oOQ$u0QQI{u9!r$LF14N4X%hZ8FP@3vbKuDDe z*T|({8+t@*QwON9!J5wZ>W-{lvE+2U7eU~EI<0E7P9Q~4Jx{`p!U~97Sg2|m2&1tt z)}dDrI!$bPy=bKy+>enD5f{Y@2nfH2S|jU#Xu-$d(O2n0_&#-z2<3R6kMbi^e)sVR zJHQq@8tqE}0o~>=HQF2S!3acHCS{2#A=mvEk(}U9hBFe8TQLa=P8SwYRO2(@3Q68+ zRSgPVqeaha+{wcK-A7%RNyJSx+K=HF{br;T<8RN;KUrK_z0iWSTEd!8V7CAia{xf0 z!~qY{=hCRoeBD`=_CriZmhy6W!l&wZ`=+~%u&RX;(G0Umy2Fl|h`hPN!0=6^!gXy4kVf1B z9_^HdQhApzc+E-y{}B2f3%t_NE7amD5s0e8vN@zkyHzmK;4y`+fZR^+6TWPtaXRwY zk7EL{vTB@b%irR)DgQmWT+j)c>FcQjxqp5BlG}azQR`jnrtTam#5fNmE!Ur{E@ZtQ;plD{?Jp2oNt9TX!G&XKzvDpHaT>;LWGra$f;y#d7`oX~ zY`20^m7N5#31k?*m#kugxb{@y6-%=RJYrgvD`^xj8%vcN_NGXp*Ni%Nm$(;PA z`rhnehuDKv=BUPy4#E@Lcsl-j;b7)tez24vQM-vGdqz|F+G~-ce4dKqqqRR1_ZH%XNH_d_X)}^eP)BOBe|s;gOR} z3<231bSCmT-E7d7#V0FVsawDWBr`>Xd2vILpc{pS4VzT}gwjvMKG0s^J)SzPc40}uo!rlVOB2deMMY}t{(=>lif zj3XwLwI@9pX4i86Kjct=L0Vs%);sX+A`WX&Hb{bAlT0*#b`z}hsW8$)o8L&+N1m$0X{ z0FzJvfc2&ajjapQatDdtmNDr(XNvw1RQQ17cIBJ@>NzP*23F5zrm*=0ImMCJS~8>z;!2O_2v%n8X{(2Wcw{uf=dJu|OUcN)8Z+eT?S&j2m3 z6Ek@u+jV`7EB&iQHIvw98q|*P=Jy*WVwF%c@n|K0nyaZJ?tprvWnl#9qapxpx1I)S z45~xFL@UTwZK}5Y%lSNg*O|sh(aMv{IiGNzF{fH-&#f-8_9=c&EE^ta#)Om)K zUg*)X2~+m<>NUn2e+D7hV|;%V(309Ur7_WeV|p{=MVc@%riqa^HiKK}yQT>*$fo`Q zgA^aX6XmijhK_(({R$m~TkMTk`QQTxglzr8^dwz+W7;S&yK+JPSOq|pS<+mrm`dZE zKyAF5`@)l^jMpqE;n;etgL5w{8 zbk1~iHf3ew|0So_==xwSeR2*W9>pQP?Jt138E@f%;L`n{Ah|f9w zYz?*iY)C_Zo<_jb?;cE8`0F4_Sjn*d_Eb1#7Vi?_eF%obGR~XW*LAi$84VAXnj|*Z3=%KsG7yf-7 z4x$KMWJsJnqO>Vx^}ZB!ZIE@5Yz9+F-(I2)+R-v^cTdcFMqeL*x^F6>?{fE4A_Uz+ zw3)Z1r7wmq;#Wh*Mmd;$%+5eMffHG6Ja%x~N~++tppEzE=j(;HYvHhm`Q}Z7O#P4S zQjoW6oM`Xuf0Zx(dFSronO1^(G?_bAF-H4_y}A+H;~Fdh!Cab-o4sAh9eI)>Co2C5 zTh3V(2^x$-zhg{|H)JZ;Y7E~-pbN`^8=ZB;zE7se!@A+6IUF@4gRmXs#n)S<%f3eU zyI_#Vm#G$7gzD5L8V|7AW;CO*u2bvbeQO<4ued>9GHv`@(bk`i_QjMBL}Pv9yGxkh z&;iD=4&QYW0*Q4-XC~YFIGISU#w7ENa|oQi z-QGp{6s=$hLP@~S4hf_;Z{OQJp=uF6wh4gN?pH%6&3GyV=u7IPoYhAxqpPj!eVjy@ zT$C~-4ELt``d$>{XN9QI8fDvszZG%#^M!S=z?%atwv3=W+Nlr|Z-@_Jn=Y2Kz`l5p z7#t zf|ZcRBrJnr|4zA!RC{f0{X%#RNhzpSJ1{zftq*iPcu63egluE66kFG{*)&RigmQ_T zvZASzEIDnFtA4JlHIxZ24TRZOntS2f#d>{`#AhC=SXc7QtpETG7yil`8KonZV>gJ3J9_xuT0!8QQb&R6|Ng(T*lDEImX) z!yr|X@4#={OSsK0PEJFzTW-|uD#zb;Pg-2^B7hyN6xDX8B`O~{5I+JEFQHqya#EIq zZpd~RbPhQc+6pxvi-_F#V+{7&-uE#({9J1ZanS-eH+3`Z&A&B>=FFTB2=lYACFaxl zj$TBlSN~Aids0tGskl|E1BFD$V7@1y0hd<`e3}zbRNexP$jZ2IjEI&!sVu&TZS{1W zCpsU6O@AkQjZ1Ig)y_QYpAfCC>xn00HigfKeQdK((PKz#w^~bBSV0KD5QFG~J7!`Y zfMH`SKYGU|o|z#P0FUu^NZ~DYX10069q7k-hJ%+EEfU4+JDt9ZcJxmT1#At4B=78G z91L0Nw>1#|Aq4N&s7wsRwFpbZ##HNVV#L6Z1zin^ui%>;Hk(|En_5JIY79XT2C%c~ zHXSJMyQstB%9`xR=1tYi)EH#5PSla}cY@#;AQP zrX`5rF~PnPg+w+o#aVwkqr3WXk-$dxGakXK%yM&Y{TNZj-7*BD_0&G^gl_7Npx8ySO*_3#ZIqdi-E zABQ3ADCHz7I<1qvS9@UN14k$X#>xK`QFnPw^kX?m2KLw@DB7DZ=2jc71v(FR)&Y>+B^ zjH9O723mYoNn-s_pP4OuW#~ao=|=Og-s5m~ckeVc8>0cB0hAyn;!0r1 zNQ+|A+R@>oGyIKI-btw&L3@gR2bNV$hRxTfN{>G}^5%bh!oOPuLfGN~xSwfRZod={ zM}mPp@d#})|0C%t{G$B6<}NI;bayP>4N7!IfK28!cv#?w{UJZC~iA1im^Wd1Vn(N*Llh09u?;Sq2PQ} zDbQB7N-WlDeRLX{&N*3J$4}n1s9e-?qunAki@#_!wKYksC#G{V>HfZT7>2y>UY9R< z_cOlb`vLt}_hk?L@?HM)AYFU5y}g$>_RKStX3-}!W;rs+z2=PHV}&T$ppi{Y<(qlt z-!TW`nbz@DN^(U?Z#eub|3hd$8g<>$pihU(Usw@qQ&J%~Ee&7OquF@yp47D=D$8Zy zlRWEW9U~bPnuMw@TLVwGiy;=S_~r0}W=q9F!j}#)wlx-?Z&08x0G;3hycb!a^l5Kf zbpNnugVXI~luK~?NnY>G{_9IEEzl_Xi6wN0o0JhPlB6q5#HF*;M)?iN-%V8@XM`PQ z8Rd5|x0y^RCBbg6BCyQ~wY-aT;!ff>20+HEx( zgqKFxQenPxjxRa)GX{gug(R46sii=aQIQUOx?hAGOy?f01WE43*%SpXoClEeAuKM=qG&%iQ#J>nJerp9H4X`w=ltz4V`aB*2iX*h1}yG#b|B?LnWRB3 z06+zRMH1J#WAgih6ju#{PNQ=LImD0}+0pIF^46Ly&NfQ7+FK4Z#tcD<*c)V447KaA za#H@fzB)e+N`v-!*tbHtIA(5fZInp$mpl>41fRdIfrs24Ld`0ky3yH)&IRyf=g+Q` zZ$(GZKM-38Y@1N!BfA_qwuUqSSDblwZcXuZPagCkSK zAe>}uD)h0q9=DA!V~W%MlE*)A7F3UL&G?Y695;629z3hEEs)@UA*gw8V626;QI z5x@YS9s-h}@DsB&SGH&2KZJHsm@;|S_3#D#r4=5jY#1X`-p(7Jf6A6UN#QcT!+fA4 z6&#e$yg*slN4;=n3Y zTTQoNX*B6Ufy|jLp^Nbr(hdKPQZvY=fj(59;=?V5HTo)d)1iFkCx_=uc-0>nc86I* zu+d3jLT57kp$(z*I&_5^j-vR_eoIhvL6e741xH{!Ffd@>0dtTn)RY=CRd@S|CC z36m|zU6E_krLsiz?fk2fr8ZEm(;R#I(#PNTjE_Hi$Ng2`r}uD)2|dk}aA(#G+5k}` zFswrg6r2aZlgSkcgu_35I=i6jIa`0CySH*=x_Vb*Y**J*@!k3nNDmJbNxudJ;>G~k zd;oaaAl|6^xi+}ROyFPWcw@`AJ3?zdw1&-y(IV9#pZT5a%BXnsDeMm+Q$bzE3}5*8 z24oU{4}N^71H;H4>U()t|G)oGJg7ueuRv3|L=qJL11ZKzwLXCT{1ga3Pv`c&!dvJt z6U8->)WoJy7n7hn9tG#?pq( zd0wiRIywGY)X`pA0Fe$d-%7r7(`w`cS$don#r;lgwv}fAvRY7BFfNL0MnGCvzGp3V~Xk_q= zcH+sEjOD;HGKvU^7Wx%X-&Po?Il+Hm1Fc-7!|8G%fYYjV%bVe#g4DQMG+>#9@^stb z$3LVD@}tz?AA%`Q{Qu`zkM#e;)LZRi=dBPqn#GlzP)qkv()5u0JNQ7#Wf6_}@UeDT z564OGqu)1v6)#@Vf6U7Dd6*}7iLdQdg0^z=A47U&qe74NKW%B@F$By`cz;foLHQ){ zFtCdlO;y9WN9oxeTkKT>K=t875@A_l-}R^`j$2V_0nLL_XkuGV6j~IK2^;fin+(^8 z?+;;#KOhkAGYo28;0ua@A6=o>8^~k~6uHWhBiU&i%E1_o@8Tgj+?A%DNv(HhSWsuq zZNR7l|CGMq@Vx!}o}2yw^LCM_vhg*`kT>>E`sGCC0RE>DKIXDGxCn1RxM^;zY~3Qa zrE7c1pHeSe{mC5ND#6QEn1@4EQg3HWvvKyHHZ@S}H#Zpt2)yhy%#Qjg7=Re}RzUo;UEJ<=3d&Qx>5$I0MrUohq9lo~t}%f|K2I zT3#~#4hVSoAD@WHDF&itU2+$Awue!8n&IIh0wn@%zC*bR^RTCAlJ99oldZDhPLs8I zw|^^hq9SXO{tarE{l}s0co4Sgs-7kp(iNMUQ;JbFP0daBzv098ln=Gh46y9t>g=>z zpD?8#ogewktYcfHw*v2Uo16FQjA(GKX}sPmJ0_cqmluFOL{>7IqEgUw5r{UY_e4wc z>#xxyG7NRlBWMuS%Wv)8?Y)bcjurbA?QLxh0`LP;L7QYu^%dO~a815Ql-L9`KT6`* zF-6XKrnUPhhEAsBfhXPLM|7oVISgW-Tg2G{93Tro+m4GYnFRxs!)(UnRSD2g%(0{u z*=Jb1Ow_yIe&;B8;en&sWor}Arn9zxvk*&6R_O=ep<>1uj#1<*Dya!{4wXz5Ct+ zH1ND%^o5@IwcPIIGdjgM9HfaMSD1q9)#yKy!Ofi7%x1k0fC^JggevA7(3op;giD2< zJco)GH0qph2mh|#Mm{|N3?4ve0wZ%$$i+qO(Qvfb#&Fr1zYg09=P^1JgfFRK<9%{m zT=bcTG}XkdVd-=KLkNZ0R!v_*hZpj)9O+2HXquL1VbH+eE4!TKb`qJz>Fd~iT;usu z$%Lm(o7>Rzj|%y}o+`{i2T$Jym$8SXcMLKVkt2e=ohv-CFItK28me1Nc^(N`y}!=8 zx=mms9C3!s#Urt0S=(OAGw3cOo|B$}PUr6zS3%91Xca$L2ms_Z((>_oLnlDB&LnIN z@{-s=*LZPd9^WTmwT?T+5~050+Y7Xxq;xR%&swiVrTQUQgQ(+*sc8J8#OI22D~c>4 z1lfg5pEX~RSQ$=?jXDw#4=OrjOick&sKRzf+gVXzAnv@kE=A;TMHK@=j7$66?>T>} z)$ttTZ9qv_SEzNgQ>8JXN;b#Oj_+(V!-4@`hS*-`dX<4T_Qzuz%ckv_A+Iz{mc>UX z6oo$J@n&&M%FP~~4lF+KSr+AKJgJG=?Mw|y;(Ox)wC+~o2Z zLJ8<=VzKe64SXTX;u6U^K#|VzfXaKmz{-JyO9&M{AsdG?Wi#VzBWGWZj)KDvAO-U; z=mOiMU3J;iypV=Q>GtdBBqm1s)SBc3FUz(pr0~_#= z6BEo6b!KqrB|TP?Iz;<|KKyH+nBh(1Pl5CsQBtno* zsQ}$ubzDGo*jZ|O47(^Mp-*-!xgw0@tGF?HUz?ZQqf)v!@v>8jmQyN3A6pRN zLhW5U>Qej!5V@$1wDfRvbC6bAbE_U9MQkxeNq{S#8{w~HZ5N)Kf&<(rv7k>ayYeXEK$SznFkQO#CbU$6`iC zD&H@(!~NTCVLJOg<+bgxtPYLew<~a!&A;@Z3;V#D;wLOgS4BD2V4S`Xuafe{vx*gl zW=f=GF1KYHK%ONk)-e{WMlv5N>4OVEA!H1Tq{Vr@SbwP`dG|m&5G=@6uC`HATk`n? zK*fl!;1|#=c2~|PjfJ0ECvKZ3DvzpF!#u2zsJbegPK2X&XZ`O(1O-N}h7TrbttQ!L zQyKsieXdMLfz5DI(=(`AK&gr24f)?#O0+H(0s;+r=kt0|(y&YY3eoNv7IER%0K~1$ z%FBf^&Pv}O*ocOing>gn3eCrc(xrh*shvxK)oIOEDi5NyrUzYI#LiQrHer7^1pwfU z%J51bP783(V~f`HH6+hdS|w#(;-ui_=E9?Q>TJDA!d0qcUo|`>*huQFY0ZYMRxVqG z8@v}m;-b5(_Pa@c4-b%wMG!rY67^*JTw1|MO5rXHKGf; z7iZ{aMi-QOGG;8ZEOt5(P0WwYjJ>sZq2?f|rgt-rsi5HSBqQLVfuP&qwe;R~jCBTGGsDoX1 zQ2Ua9f!4zlMjJO*CgTF?et%=19TLQj#RFiay_R!I#NRiD{1#Vb+2JO3m-`c)`5nf@ zVSK0?!CpFb8^30OE{OYBxG`ml8O|0}k;jY9bqKLQ@kr-Pg0$ka*A7=R^Ca_P^IIv7 z#@e|_Go3b<)Y_;lU#IXA_l2oGhS#s;j=zq6<7A0=J>LWmOkp#45)h*6&tflJmyMAA z=#>hT510ExDPT$(P{|i1OBR1L7Q>$P(&{Q?&|>x0@hSbtnRMUx{bqniEC8VHJGMX( ziixX!)lgx*x{3^VRl!dj4$j7T+us|m^w4MR_NBrXPvM$Ub4l59DQf(LhFR81h1WBW?m8GZ7jksWRJCK6E02&J<{f}`LXaZ#dS53woJ2NZN@OO z709~Bgnem7REZ^_)mj2So&)>UXe3KoqX}#v*AYmiW~{ zg@N(BJ@m1UgN}6iP2Te4?~1aZS;uY0#nFE@jiZ8fBwxz7#9j5DPTrObT?M%>vL8n# zwH|!KZctvn75(vr{$yM0TDtJOqipQb(Nsu-Oq#@ZME!j%RZzcXFEq%%q9<5RF!4=^ zk9W8A+h`tlNwysLY(*KC(p8N{&cX6Jn1qhBMM-60gz4vHQVqTmvH^T}5uIlJ@jLGUmIM zKOR5R5y>CwzD3v05sdG) z0$dUAnu3p{jK~jvtbiCIPY1Oj;VcQlwJ75}L-5~&-bLV_a!rIBAy(5I)%zgrdkU}7X7i_!-M zNV>J?1Ye3wH8FuiIGX2 zSvjYCOZ$~pnxju_Xx8pVT5r3aQ=IIvL+GqR+CikG$X`GIU^ugZ5ZHRhcZq2+LLpiJ zlD|L(r6Wj8OnxbVSqqFN!@x&dke#2#;A>0A!tde7jAF4#8Dy@|uwzl$p=C|`{O~J> z$+RS7mrS&`_|F~Fe+ccOg9Hur3!KRzLM&!{k{tQ?&>4dUDcr%;EVri!Fho*3j@-Mp zW6BhtK{S?)4pM7v%I=_1Iz_#Mt7cZ{vEH|}L>2tzLSwFGPK|bo?Tv_2kT?lh`D(~e z0Y0U^n?j8eljyd!8O!l((%okEtXHSgyLUHI&pCQ5ahND@R5=vDC7Vx-Dn**x3X66A z67$P|c^VP1oLUO6)t~-&ZE^7n`4kycH3Npcei4LQ^FP&f(QZLF?U8bk6hI0_ihiYe zLWvBDp{XjTJ*=wwa97>OJ3%je8!HG+thwo4L@|qvl4^$X; z?rs>I&jR#%Uo80^j%=TP6+x8+AcsO!O!h)znsX&?xKp{)W(9GAXoz$$JC=1*jYWmL zxWtOTtJ)P7Mnk+EM-{T%M#*BzIe~ub{|@!%R0Mt$+dQT~cL1^<3gWV!7Ak_-luLB@ zRRwWX;~3rNA$^el5IR9e3%1ZL$kX>0JyM^wA2TFaHG%#7*aV*de{hMwg;GbW{ad66 zkS+HM7o6*emsN7@xBE;wvv?c*n|dxIfbl{z$$)(|jt~b@osii~Ken7>>_ zC?^s1rZ=5w^QOx?^*cwry;Tuj!hGorx?(o8gJK-hQ^=GpPi#$ao3zb;0nL#CAr7G5 z97U>}xEA#Y>{=9Dj?<;<*5Ifr0JtDNPP>Tu!xKZP<63)Em(?-P*~%cK zEIQ!LUTkJkTJQgK3P|H6gtUHv4wtvkk$8(kIOn{9nu!*FCwvicFAS?iNUP2F?|!|@T(kA?Qb|40yPVlnJrev)Tk~nS)|kEMtp9Wj8G{G_ z@Bqu>0jwi`$kI8wUG88lLL6GGV?s8^S6OAQWV7_$9q&kvcTZV@Biy7q**{t#cK(F} z3)p^315v=z%mj+oGpSVUyLiQ9Bn?031YNvUzB7@$&C$1XY0q?k#4TtLXN`t=mY!`d zzpr^K#|?sro)uG&U8a=Dxm2PZT&VWH{IbUHgH9Zvw($AbU~%aebMz41n5|5!-XhIK z!UwLqfeu-#G%7y=1N9oqKjRnmXk(dSTmS&EH9nS9VLp0I2TKB{!@7IjzT|64USmTE z`^iZf*GEC}V8mws0|(|n+Sf^Y3Cgg>d3GG~LcVA*v{e9#x;H$I-8j`4Vm&kKge43T zt((~i;Vw>lpU><5!&Gj+xofnX?uTGr#;M3cFIBZ!0eADay1hY%GM_E4)h=h%Ob9e%etJUg00E0@t#>PwT>tQvf+u&q)~aqexL2>N_7 zo9(w;w6sDIIK#S8-Q7Q#PpqpBokhVAKrS_COjM|hu6?N4Vn63boNzEM97r)=y*+^< zUjk+ru@vr^{Fm~+9nWL4sDcpDiD{?G+BUCj=|cRR&`dLpn3 z=Aon-becc}Gk^F$LE|wFYOmmG0Uyw8Y?Qz;rfIn8%&PbldJ zICO+5k-j!~alM*VfY^}wQT|8qYvJmOtU;vJ^RTPvwF`kfBU%{i0wY!hd&M9<%JrE) zylhdpar#Rt=_Zqr7A8{1$cz8^5F7vW9vML8wfxk&8_*3vlUz=y+y7w411WS7z1C3Q zL?ud^$YoKhbWI-9U$wsI!T$D6XcFJiY)B1XRFFavV(KM6^x-vmI8{UO?soZn;&z6a^i%Dxlz{t^??Ne zJ7mkWP~u-@?Emxs`w|T@v-r}7&r>GCcqU~NgA_DcSZL;&%6`9ZF4fTwPuNLZ+8!4OR-I?@iST=Y^YwPh0sy|I$> zcH(JV_&HR<)rYS~4FKW*$}uPLK>y5UN}$QChV6^`E|Stv{kw?P zXSSvi1=DIzpyc*)5wive3UG7-M!qpHINx%xp$ebgrrjui=@ z1Yl8g5&M93Sn+<)<80Da=arT79O=sF5~#+uioFt`|F^5}Wi}n-B3h5LdSig(3sShf zM}Yay5$+HUCuZ~cMIuTT#m+l3fNt}8mtPGIzp^nLucUB%%n}WS| zRE$Ksz*o`if5V6MXw)^;bqRdVOMb@QFOn06X+Pr(J@|X!Geq3Yze$G|henLuTbvzG z4u}GN2KPPFWhOUvTh}^kALfZRw>9hB>YX(YTSE!_aApgog!hNND+&ZW# z*ATOFUkskV_J3cdXCA{ldT0CMDNORzinKUE%T#Yi^z+S{GVcQg6}7kG!qjuLs64uPZ5+K| zno7ki>}`FV5^2o$J|{T&)~8dX3`>UUWp=9CvOMSxX-o4Rs`Zs@tM5~Htr_3?v$~gv zrEC>ei*}~ppzZ_Ginf^NVv$<`q}WwNMNPZY#JT12>a_G@vn;xDg{oSPY*BCa`7cW>>|9>JQ^0D%7)nLnzx zx1t5vWq~j#oWz7XmgX(V697HPVj%$%O{EBG-6D7|TWUw{9V;LE6%~xa@S!M?rBKp* z-L=K#w+&{5>;LwQ_oA7zj12U+rBemMr;nw=B?%OtkS3=OvWr=6#=pS}(2t&2nx?La zOK}wq$Fp??U5>L^e)Hd-4y+fxD%>%rRp{qRV*Z;uW49?(rFaXBArco2rrDXDZ96)v zo)7gp-bGl{xUGZ}As9*k&rBFwO>u{EG$X5XTXL~>F%s-0QN zc(b>NfHo4e&gvJLI1y~(9;% zvVPX$wP=vjFR93QcOTe-FVpX%yScjd)D=YICQ(_C*THwqlJk(XLqK&3hXVkvWe;5_ zG_O*b<-&*(DG1zN8S=+hEVWk@I)B4fXo&E7b>i-m#;B#6MZo-iFKrs2(39pijVQw* z6}6&LK8=h|`>)vEMxX#EFx*=le@+J}zRX_y7A;T(4OCa8SC-&N&!vjrShl*`V&E(`8pw9} zA`$xNuFKlhlT-Q%00%;_03i$N*3;-|h91uBA~bRRzQz#@o@Qb0>Gt(`&UybZv1gi| zeM8VZvSItwpYR5r054t0FIfpwA$uI9IE_AXG&$y?c^&Pk-JOKr8Qs72eJYwrS8NVt zTVcsfG4XdVCP^oS~}F`lI3SW9y+cH%>;7YrzBrggf0tGb^ph(o(Wx_X`0e ziE6g4aKnK0s}b^(?rzmSf#mi&h}zY>mSbVR4?jt8m#;gJxB&IU9QuJc==AbHb&gw1 zzCw#vVKLIkNErF8aG*^s#pO$cB<+{pRDNso1UZl45sJ1l+p&Q(bSA1$SSw?*(pmTT zCRsTqQQi3Ee+YdGC$TqP>En0M(B^*3^D(0O)Z_4G zdGP^(7eI~4Qq~#N_d4mTaIJWulDtw3T0DIz;a#1V;RgvR{ejk3o*q~Ckx}Lwg2-|k zFh~Mm&z)ptFha*V!OZiZ399O}1ZH7nNyf3a78q?X%u;JzVf9c9AkI{2OOLzR$Jl>X zs44EA4Jyh4z#e-*cq#9u(^B=YzygPcLk>5WpgzMwcT$d(D6hfuA-n4d z6z}o5hsKSW)|58C3RJ3m)WPN?!)GMP>bZTFQDz}Lx5>o#<`)aKebuop)obw}L+TW~ z`sNhG6N8DdMh}8Mjf)BZu!U70=0}R_&kW*V$Tgybk1E7rNru~0r0%Cs7-QF~6EP43 zEoX|hY^Jd(!EM0&$fzjP6nuSVHRBphp>&M>!jgdf8ATWGV^Ins$#5d;FR(fESf<3v zf?f!m#r#3_KZL#m>=m>PBvknbB+5_gY*d770H-$61E~~QUj~{Euj{=M3MyXFP3j8JWrnKQ%DYb3f51%b-Ue4P z0bUS|?-7_#j!WwwV|tA#XPy`?DJv>@CPmDAN4W9P>|FfLQk_?<{G67IC{rw!^C4Km zqnq``es84tg~Gw{XXmfysD|K=$Ggf4vAholfD!<}IVqN@xz($@jmOuX$f)IBpFRFF zPv=Z8NCIkRQlI~l$}jY(u7YacaCE!lN7W`S9KcxsPc2aXu4-+a+UwWdUa%MefndJY z8LZs&MnU;h28W;}G}$bw#yfwW-Ov{WQ;q?h9IcJ%>lvvC9BeGlfffr z>4&!mytxr2*{>gWt-i)%L-qUGIxRytnrzR&rNPyeL|cp71GTC98?**gbr-MP@XjHi zc(4+HmRbjv*$dSrGq{gI;W8_@JTPERQreJTNy9vNRXpvu$dn!e763q%Wz@J$_Ao1yg_Lq|L8R0+E$_ z+XFPB$&5YOvl45ILmQiiOgPjeeE)HH{=T7BpJay?u~E@q`beNNaMZLAi2NFLU^uY` zE#O6*yrv_n;Kw(de_)H}Iqz5S?K3=x@Kg2my|Nig6;L+nhE!3MqEWgy@|GMD<=@$L z7-q3x=l|4Ml*#nhU$_;iA}V3NbddMvAmk|7SIaP!v^~NXY2$W?>(?J;dA8lqz~IFQ zO~*IhL2%}LyNl}_^VRryPnL2+ttVZrp!GvQ4!t`V0L*1INdouQvX7F;rL36#6YkuA zNVJ0QQyRpLy6sHevs>Uao{yQLPS?(d-=CqKYHxDZRy}T}R*`*=u3~Xz6^86{PVBgz z3C}ATloIQhdReqTndZ7wG~^yQpY)+swprDs8Kj0|PZRJ!y*3M_$_;jvenHLblWDXM zwoV4xVl)2}1@DG4eKGm6%)wK_Kc>EJV=GN~;-II648c1}tux4Mu$3-lbOE0lHd`~P zx0MXefJhW*j?HRok_0Y4yBtTW9rw0>>Wb^k4|@N7>+9y$w#@_@)+|uf8h`>YKxbwT zi)B=Q!v#trwlF?h82rud3oJ{|4bv~VY)YUQstl41BFDf&*L@m<9s$@C6=L%(6kdrD z@$x$g5rm-$C8Dyg`wOA^qe=D^i8^dLTn6P%P#JY>~Ru6G8Ha}_ehM@pt*HaZ8i|t^SRrl|hkQPX`mk*Vr zb?HKxb|=A!o|*LCf=is$e-Zp;IKPT|N!>%x32N#XolLpyYykkAETfXRLDvk zdF`1A!?YNbNKU}$VkBWx#3*t)RX&41k=h6LeT%X5O?inN1Hm_tYmYC{!~@L$ojgdi z*j2ULPJit`4jtm5o|&vt>yTE6pagH*pcoP^%xijl;~M;pfBG#mPnL_oh)~lRI|(T+ zmTMcxHS36_r>ETVB=%Dbb7U5i{=GrKNzQ#8n0u)|^)SCCH3{_4uGzzc*2sk^FEA6L zT2w8*UUStdlTCP|(bm8@N$ziK{#fDe=rHuIJZn9kezMJh>mRG)ki| z)hsqT^C1<47RPpv(yuXAi8FNYO_Yi}QKW*-*Gks*Yqo6+X8{`TECT9U3 zowdwtZg?_{AU?sw&{cqxJEK+HV^jAkk=EHec*{rDNT&R0tXmg?&sPiTK}{zrSGQjP zBqRXsi#!g?bSJ>6cA1)#m{MEO!;_bMHckEEd>`Nu+qIE zDb#PBSlJf_QAMjv349Pp^&s}>@Yp{q42nK=W#RU7^f`^Y!DhS-j`)PGx4WjaMb}?9 zWIo?9B>0EpoH% zEHuf)q;!XM_x7nz$`COy&u6a?`(^68lKx1G$ysUfM9c#LQZNCOWnxs1jQ7qLwl;+Q z6ZzhAb#HNE-x;458jW(C)8UxLs5o2XsE@8X1sO}z7VC1r)7lLV%>KIhLqcdW_}_WR zD=cQhA=s7Q#W5fl(AT4{2;$jifWD;?O%_J)%wUMDo>l7U(YbZydSxCQ^3s^q^TUgf z^&`Raj6nz8(mIp6H~e@0N%Dt_w3I~4V|v*3P%G|SLp5bA`$nmvqY~r8xi<#1+d)d2 zx+TP}#N1L-6D?GYNkxs3on5+HI_gj=D8L)TqpPo8yd!Ml^r_lY``sbQHx3miWB|mUAYuThP{B#8BW-J+CCJ zQr+`DJ*{xY6&JyIY0k9J-SGNODRT5*KstZ_;g@_PrrLQ4_uFcv9i+XjXK~VP>8lMJ72vF(^q0CU!~VcxG|v z5<@5AVe1o>l%yGdLh)h9JTJ217h>4MusbNCz_0HurW$%GIYT0Uz34{ZQzq?4#RjB)Nz7|+p7|RVT92^>@p93=c9OWgIa@L9(TVA2GlG83>OtzBKx>t=fVckn z=XXZVySs;LlvcsTEGGINe5%_gQmshO{ z7mxuqoxzFRzf*Vqrgnmc-~3kAj%b_Sv}n#6Pp}_3hwLKmvHmAh;Dj*>@ylhdX2BSU z>OFb#xbR{GvD&Xt%JWXshT;TY7oLM~CJYOzE}5el4hR-z?2fkXF#V&aXl*4UetPa4 zzbN_qA3_I!gHiJ@dfcQHsvz-j2PRY8Ar+76TwN1MQjVl-%9^ORQXev;Z|v>vy(sRz zx^I{#w=k=YEq~*V|61;S8v9q{YcH|&br&&iah7QGUFPBDT~Aa(t+dGXJjBNBlfz4Q z#FlSdhcy78F(fhlL3s_SdrM^p>zjnt+N+>^k(%XRHpP7%5!+MRuxw9wI{QhlDZ6Ig z%W0rNbZ(j@5*vY7*OV1rkSYBF0aP3fR+9?`5ZL@>JJwaFwH76UI~BQy_jAiW8jAe# z#JU@E?UBPhbcPDXGk0%Hdj#a`4f!Rr@D%RED|q0JQ@WR7T3P)mAbRY%v=A!$z0xC> z>uUFhq&4(c*Xz1%nii1IG=FdLQ%!xo-g!s%_~C7bbp?}HN%Rqwmgn0v2|8vv@s>fw z6=!K&q9ig4164WBSTu(&n{?D%Jj&%^hHB(8mxyU8Z`qrUA6j(4{K{j+aC`1f2+ha# zFf%$To@CK1(Z<}+Kh{mC=bkvnS5REtwuK_G=G90e0V z0AT6tl_u`yF4LL-TdQ+eGQD-q;I4=ool3nmQubODE@JwpfG6Ly{pcEP z#TR-fc1m+;O=5j-aS?~J>Yx*Vb#a6D>#?EeE#I@qhH>0)FQ#%R1AM6tj#QPRBw)z) zIdliI917^}*b4*=#xts1Ln1HbR2p#O>s~R-%(5PI9aNKeklje%9 z+lP%iW6H4uZd0`~#^Y1sWE=K;+va}~E}T>nsO`^)7e81y7@6B=vHXLJTTFh{Q2FS! zfOiqk|8Zyp&eUwWe#S-Gt`qHg>Jnv|qU2@j&fh%*Nvxa8rYw7bEbhG{M@M+PBZnWc zk~Gy@Y&}*{6a1H~vIL{_6azCz&nw2G3}w+F?76s{ws2y2U%rZdDxuOT5n z#O5q;B%FA8L8Zj3<+Y@wM-nh9^xvD_l78Ul!cUAWeK%L8(~jskI&GH5`%0CM^WbZnrlZPs;bf&;-(N}A1LQ~E*Nxx=cWwW{?q%>Uxwvg}8~ z$H|ZXHy`Q`XC|;Uqz3Z}D@O*WyBtfW*hpDuQgkm;5OAJkyw>|d-bx(?7)>v#&ah<3&nP(}IQ z52(N_$AHvz-S?^$QRx^-0U<^^1@zogv6zf@lLm(4)Gbeq5?1A&E;gn5q}iwT6;ube zHR;9q!#A2Cs|)WNC7qtH);Et@I2%IcNgpQuJw9MM{}z$&$>ot&a4N*tOT zMs%MA$T%nNV~yur6UST_nOvuzEczpmjj$+3np{-aEc&2f{CH_p!r@O2yCli(LbO^* zgs3(a2Ajs=3ES2&qVedSwAzvz_q?V=T0;j+34eLD-gIteohLZC2|AW ztWVG)LK7mDMmCG55SB&!gh#zR&K%7`fxh(eW=l(DYQ1SUmxFPUj5Q3>@+fQxXj>^! zuL$SnaZIT6@h~QEXq$|EJ^RHf(=Rq~?>7}z(GuPiEsSCH%qSFy2TLO!7?(mv|2-HQ z$ZSZ23RRZ&LzgeOWB~wcKnRC&Vcb!fcjhbDObM~=bt{R=Y`J;j2RFqe*E7-;Udb*j zzc;V^n-loh52{p9v}VN*(+qG@Q9RWEH&xAdP-P9raPW2aEBY{&9#^X8u}dFIrQUA? zx-2OPUmZOh!@kKTYfG>(ym0N7;pAquC>IKw+{bRPwWOQzNO9*gUHmcFVoB6%+whC* z=OilnxqSd*Uc~I|@eZ{q;z6d|YU^1-Cs-o;iJ+p0UnpDdCK@~y{z9cycN9xH5M`z& zp=|xY|8mGWHB@oZH5*rzjz}bgck*}KAN4xwXCqXNb}DN%LDE{x_duk22%v7nUL0R1 zV9)j+LIZgA^hSCG+@yn&Ob-(_;o5i}TrhY3HreZx)5trD2NBR8Lstk*SUVw zwSkF0u}xIHyNQ19K2Q(0x_6t0Np9jRl~0~W#3le$xYjn7S7mh1`Cnl;u!_8L+Eme) zQI|}V1?y)5a3FgaxuD?y9!K`%QpXGhTbgVr*P-MxGb;lot7Yq@`hEYHNhMVSm$;M7 z*ZqjzKY^a5H+5+0vIHI@}L-mN*gtKByc;#*V` z+RgD0!0Ys;@in)tr(W)^6GPG5-uV2}+u5(5VE*J<^oYfo>y~Njf+DFJ?b8I+F+~RC z`yoFtEenJKrGz-+o$I@tD6d_?%>;*U!IZ7J2K#b<(;qKlH5hQYhrk-cCc`7d`{2dO zp+zQm7?6lqLOn%|^kN=93f~>#m5fyE0)$VXw`=Il@{+#l_LpxVHoKnSIbbfJf zWMLBAD6qGFOP_WQv-$_xB91Hpj8{ z)mdt639GZeyg<9TdFtyZPKMU)C2&^}3BvlCVBP7##~*Ve3g#> zIJ5$1a@ASa{mwJ0d{9?s6XBd>j0^>*Fd}@J%gK;Uy7$-V14+%r`(MlIp+=>RL;U4Q zLW|X_%TArXMm#32m#x_LH5FplDO$dGYga-&^7~-ql|%w~UsL#+%!w*Rftoyzc1`@d zSzWqd`?|%_9fVh;(bG%us%>Ta&0HQ7{`Y$1 zSwn{{*LPBX{=`CEI?gZDTxZ;WQ4?)Ik5y$A!WGOMqeVFN%}U+%qKguK{;1j5LcH(d zk|SJRXhhTwo3F8;T2uTaOkjiqAtSevj46 zp3`58TaH)lceDmNX8sOcy>P*ozz@L0x*CZ(!Zp_2WkA#r*CQ-YD3NuR?@?DCJI=O! zCcQwTIF^f#())sxAc#qSX?FddO09^)RXxsPkxR>}zQ9qI!<){aAQZV&77i(<{f5MzO@Z;HZ$$XY&{uO-2M6 z^}AMlM7iu+0FilS9le!e1trvsuKZZT(T9>mlyNj6@i+YpEYWZ_e+@9~I-fg$rUbkWC>izn(u^*~6 z@;0wOf6kIcmOYSEBGaD=?x|g1cM>-){f^v3Gy)qJ)@6(ZKBs)5Y`(_qojEgnw5X!K zU&fw}!J#s)5AjMc8#d+FHK`IC1LaSQDiyp~Kp4+-6LOKYj*tpYgym=d3%>h(+*lNj zWdImiPIu9FupQ#_7hk}tIIyR1<6@o2>GDu`&Al%(+|(!QXdC^)L9Cs2>pm?&-n29q z{2xNQaMT%Vqh$_-3KfOZQ=4$pBp?v!a_X_DOv-f|nN_!*LjwL9htv4J+#=^A{bQHa zEvyw>vaVSY*w;Vyp-&STC}8mw2ZFm=4Htr~hD>%HQ=IQuXl!yr(+uQ` zfo55UV{Q7&2jGI%s~B}Wlyn0wK`*AD>!&0bGIan9{dUrc1<*%Xbn$&KG6Y_b8n6_4 zU|3_l8`949GnN-(G$3|qpr-sn{)w6)fCiPkb9}S;M!Mifd;1aBMJv5kbvih_zE^#F zbSF!x_$`7;>*ya{ZU^8%r(1+~V3F?>YnhVrXrz2gfS2eiii9VC)}2qvlpWswy5@GW&zL#;r$^N&=A`{cuDe&65;c0I!yhgR`Z^#p0=j z`BO5oXj40YF-PKzZ6!ouIMmN z!FuPSFC_FAp}f^$0(e`ua|Lzc8`{hJjQbTr0go0A0SK|m?E4#?YD8MvLD)R9Hz1F~ z3Of5_M&yHauAKnkzfk58zSy^ASWu^tNJ){?-{oR2G7Bt{Q2WL$;K|x7^-RuR^z840 zC`QMN@7=#|LryO)a}fjgME3wT2oPYHX^jD-@Nt5Cg{Z}$zE7TxH#Q8n$q)Ex^yY90 z-{>p8|5Pv*Rd%zk%d$Ob#oRBS1Jjc6WV-F2_c$IDp8Yfq5?Qju-|{z#UiN`3PAgO~ z3eW#K+0`5d%Kjy}?=VtPQ)nM@&RDBTD&C3BBCSWwSi8Sz0fVI8sWNvv>zmnx$7=i7 zCH@yN;|#EP>ZmkA zE=n3wHWEpUE?PW@t8G_7YycNLTyjVsrDR}`h@QUxRuEpe*ZVMG|8r_Nxz5PoUg?0_ ztliNicPLVpqfBq`)p;XtORl$p-8xLMaf;%2J;I?^LU`}B5@)v4`&qfcN;DyrNVE%DHi0z&RG3qV+Lb%;`33Z8td=QCo0c@Q_$GsZy=6NV zNB>yljQ69g`WM8gb?bcuaFO3pO5#P49PJ3QsJRA7&N}$wS6@$=mz8eex zq@m_EF9m_zYWgFQtju!VWF70d1Mc3-KrH`jniKH{bMNh|sheGlF0L=Hb-Bv79``~z zyjZq>{>kq{%I4uPBM`p>GcpW)IWsIN3rO}v&v=^1WX*FhesTA3$BJDjQ9)Iz1w4b; zZgV>6OY-G!I#lycoLL&AT0Eud=Q`>wUez3Vq^ZEKpaVS3zqpovWF4|&P#+1UixM$A z@iugI1vO_(u&|Vtl$^8<`|bRVLdk%DA~$gpVUY!JZhZi%2|&$4C({^TQr*g!2*7di z)k4X$04|Ota3!Q9drmTJ5|ui|J4<*2#ZH!&5H3!@qvQ&4Y6$ikOkxpZQbZn0KDOg= zcEkZ|J~H-V_ED7#Auq?@(#Kw+DQecG3`Huj-!BK5(YFO!anNg7C}y|-f8=f(9_C43s~vLN4cr)sG+}qWqg?n zC=*EF`q0rm1cbMi5}AYxZWIO2+{x;`>9j}Ohot883N?<4E6KE_?Ed7+jV~h|J6#*WVL|Hi=DQB)64r=1_R3Pd7M0wlapEs|=Sr!AuENjU5dx1$0D|lFKjz88L4jklQUBNcTny%^L-TBP&1~ z5H@m^1f~BB&s-%yF^@FKC0H3XqQ%z$?-7OQDbdb(kQc>BX7Haj+%t8{L_TRex4F5al=aM_@!d*{3jn#` ze-e*8v7XcVOxV|QLCPb%tFFonUQswe%m)i{hh;Rgd28#m1&Z7C{l1Q3i`R&$`9w5q7-qxqysl++*j%fUgC_y8ex!Ll zlZT)DJ;H2jP7@VYImtN#GCO+9s&r4~WPA4{1*n>HEdFqEW7j zdL|_|FsS||z=z{*QjslTStXBysN2j`&kT!=Nos#L4lDG}8&SM3&`HKLUc991P_zJ_ zFx9coHCNA{mY-tbjp=5f-J;q%DUcoV_kmH!B>=qW4Lf><_`}c|BW}%ofmZ1kkc3Pe z+ms5pzUt0{ud)+#jB!f6pGpSFUA#qyCh2YdK4wDkRmsN@Pw1n(z_VThX~wpTN(!hg zE_`*Lf5Geh%g=KhNsG}1OG6PB(t`})OXot^2ra;is21PZ)Z(>v$nTNx_FTx zfX+ht`?Dr;&4R3CII>CM=vK6BS+>CJbjxmI7L!R1T%Evg&KWTUqjEV(ow4x**x~EA z3DyFG=`S}N{vos+$9$}_;(<-pB3E&@A9WX2jb2EFn`eNjjk6SnIf}F``b4kTz(u7H9^-#CZMvNQL+vM1 zdfME3J%s%ItJht}0e5mdR?7zXa7Hk|78_Jnr+jp{_(JvV3Z7@{&LI~Y-ag)2_5DFR z#+_d8&!`N?UQ5X=W?ZuCJ8D?5*z@VNsHY+soEE%z1OQu->PV5ZR|nD6`!m=do%Hq; z41UmC-|^J^dd*euz4z-NSLL0IHGm`TND#0WH`xs0$f)7m>ZajrkX9d6RJHW&fw6PB zzWK!Kky&z1`|2lc)#W+*O8+X|b~JLpHW_tLEuWK^L9KU+l8Vd95-NUkK?Z># zk-;`Ou1cGVUd6Cr25f5RH~RmLOMx7E-+i%pJ0cjTwSs2uJ!9S96Fltr_M(FjElDft z=-`F;H%*G~`2P^vAOK3rAZZFZaPjiqBU!enbl0y&Ub144gOmoxtJF0kN>8Y!g^w0~ zj})^y6YkCzU$W9Nof}vdhw*%+r7C0GEq;G z6{b)64=5#T8y|j=o^I(>Xgk~j0j2g2r-i?k?4Oq`>oXVw~*>=h* zo^Jc(FFO@Zw8v+7gh)#h?YZw_hEX%87Q~(&@u<3^u%)nl7nx?IR zg(}!6`0|@#_e0n-K~93QF;cfgc4O8$;KadeOUaCE96|Ywg^#uXOOygMak(s?< z*#a9{8Q4f{H#M&v~i*eYN|=^-Pf{+nL8AF6g~InFGd6hDg70w_Q2IY4a%8 z0n=#QgP`JnqYqmcq`X$fhT41r;^lXbvdsR3H|IuPb{>OEi484(s3>tn$OYrc27Bmc zL*s6#!kf=;2-)?1-i9u0act%Gkfog3ks~PKlwc%98?fbTDWSA+1X2g!SXOFpLUGq< z)fl6piV49NxPF8B!g*jQfAkOnGr?r}$qZ>&ias(^fH#PmN&{fF0xKt^Sg{lU_yB2a zy9E%eDH9aI^(U{xtX{}_he)AGCpn_hm%!0?^WLgs7nWP->rdDO(2KlwhQ~=yeHhLT zw(v(KrjOT62P_xqSvDSFok7C_3rfPKc)yhHUZxSIV`_V$HD6Kk`y^yoUPP!MYa##_ z*pl|s6b~6X9){gEipSTp4yU}fPS899=FfYnDWZ~4nsTNQgE+$@xZ0pw*h>IMco*r< zmI-F7Wj zoyR@fqVnal*?WVJ5+gF%b*W(%>H3fJ6!9FsZecuuf{To!!9fyj3w^FzA1b!Q((i~) zOlh5>4mpvmB>)P5P}?majVL_dzkA0v{=D?F(1fjJdU@&L#faieww@A$6^=@pb$Q8O z0**D4M&!b9QqTkes%izK;{{kEOdJF(E(U+krblxP+E%`h#M6LVH2fd*6O<*b#0{qz zq9%3vTWW{mX=R8hvlK`(Hd|#JDQu!5#j7NktW6L3c4v(ABuxiak3`jC)id7UWK7B+ zAB!etGPrO3-3j^XTomn`3T&@~JYB?TJD%QrF+wbT`EYplptR(UhdedU0AkVRQe4Ae z1>8DMddHXzvLt3&6XiKgH+o@?fIun=c7@MAFKVp zO-4B3T}=NF`i8W&`KLq6eI;mLzi#(kEYr!#P=}`1q!W54Pw#$cnB7ASWOdm6V$#w0|4&S!?YxT}gn|VtBQ`LElh{i3x|19V3^M$L{kB z9PUv0oOu8jIm!S&%g6*U7njUZ!O=%M$#xjxV$^mJe5v`BRLkoCTZ7<_V~(~gQ9gP! zD_z{aeWcjJUzHZqVd$rd7qgQIvePE^`ZT=Ld&Ul@_PnByGlw@W7co<#H_EMIwkrbT ztZ^%T`D>BKR-rpYf3Z4+&Wi|p2{qFZU$VQrLc4UN_sLA-JppXXKosQ7hR!`eSXhL#{%@6i~d4gsL>T>z{{Cuv`) zpr8q!fpJs6#Op|yC0{LA2BY7_J&Q#LM!R+*U{K(X@9U#$4wpi+$~O5%;SHh zRm=W5XD_{8c~ZT5Ilza%k6jyXW$<;3&&$TTw0mIX`uPHvjFbdIYv>FHK!X8iacJQv zzD$a-jcU9TBnix4%u#A9q00`_lx5yV@Vo<}j;HA7ti5|hZBJ_OF2%=s z%y0Gq1V^I%l;#QpTxL2RRj{Rbn;@YEXwb{V1|Pp_3>Uo|MfAP4XPj1SO3IQEy3dn0 zUu{$oet!zxc<*anSrzbSNj|(QN*8-Chi3tVHo98C7>$a_Vh9^Hy04wvcoCNX9|A6m z^zNtCUB?H|{Vuc^ztp`L9gujBe(X73-~BYOi?W4m&mjxI@M$4`e;#4BdP1e$NOisDv4L`-9wyh;SV!V*SU)&;Y7vS01Xvy zzxV$k6y*psS@~xVB{rs6W5=aU#EGfvW#={cM8-vzQ|jK-mOa6aRUdjxQu>uZn$(@J zC3q(44#P<2^D8UY&-{FK4b_<~?#A-BAEQ;?}ISXpLZ;mM_MZ zMwk=BE+TT-#%Z;)&qBUF{IPAvm6W`Yy&(BPf#6U~XAL>&0pTV}O-w-w)W=oy6DMnh zPT7l(8*~QI&rX$QulTGhl$5u6Na3#jX?O~eWg?_wkuybCsLWy;s#z!XYIaa%n6%QE zqciY>>pBf#@=|iP#@eUvu|-<4VQC*|%6`AqRZKV}_)Y4Vu5-;gb0yAgWK{pQzCK|Z zqp>>Br#(+lGypJ|$fFFY$|iT<^vib8kNU>!&%S-B@W`~$sr4F zjCl8%HV?9IiC#MT8=Ff472mmqE8e=gbrRk`nGYOYKSdn%EZ!LYfR_40Pk=6aK{RFh?Ddu!riE-lxeS=HusGGF$uFpPizTa-uRboz zGwQPaf^v6`E4qE+x0^Y`f7=YPill@gKc{KRZk|)$sia9~1m#d1C2o{5qXykUZ6^;I z6^RLrQ7tw)t@H8UkqRC# zWwtMORwrY0hY{AOBshw1Nynw~ku6Z_?J^IDKDC-SQ}WhUKr^@IP5sTmP(Y*6VY5At z#Bz~Qljv$?zPkhZ)2jGqbx3qNs0vpsij*WFP??3eQ7Q#f*WFoP^f@I-o68a#ijY!{ zTdrPK#5m>5qE0^3QK)+33hD$&p0D3Ky=TbP{Y3sf^};~d$UdX49u&Jw=36xO%YF+>0hN%GjnYyzS(#5d6l>pYy`6>IX!W6rJ{MmX{vn5YFj*jT zam<+jMR6(<-AEIx12FO=DJfoz7+@w!?EF1ia7@n{b^6s`B|bk@H%bAvA|khnp6%q$ z2rCIO&1-$_S^VChA12Gle$1Xvz4rO~yzf@Yc}}NI7YhgOSa{J)_&1hU@Km0DA|bxi zuj!U7ur)yd%N7^V^Q^2%%aWH&*cdqFsjTrjDnme&z?a@TSi`_@&P-6k$(A-c8|ec@SaS^D1=$#*)YlAM|B(=7fAQZK>o$M| zTYKe%hpa_x6sO*aRXgph&J^iQ0zu9+RK<}A?XBkAbBFP>@5OIz&wcqgkeW40y*IEr zLcqC`d`KS}*Ct`L7iCxE1ul)epMJ)c@lV4~Q)SiG@@;GjE>^)&-m2N96E?BHD9VMv zF^bos&Bo6J0s$kmhQS(}O}6N#D7=h!^pjsz9y-zy*T5e!<&xk%cndA0f7~0(KA%z% zX>i7e4}vy*$<9MF;Ym;1eA}9cv-X|W*J-kFUefn?8Uv3-HPZS|0K3y!;mZSi;_IzE z;h;|I>1QuZmi;FB^b;t09EM`*>kAUdU6NY5DAhEo!hBr^d)~YT1EjnKqK1H8&qvvGDA0euga`BMiaM9LEtfCaBv$1xBF|KmxUTX2 zho2IeN;%hhi2o;rM@?j5i>y!WQSfJrY5cZXlp<%?1(|>P)RNMN45pwC#mY=_s!amy zN$u!RZJqLclJqQf7?(jcN-x{^g!h2Exphw3&B7+fe%0lNzl?map8YpIbV}f;CSg>p zEe4ZQPKrk&l(Aw3^|Ec6+|6~@i6(PzulJ6VILC_cuN`uer`G;&7ji-%vKJ#O9{ z***T#8|k21Ja^?DGPTf{<&QT3HMAh={ZNsC`-Dnl&q~WjRYwpHG&yc-CfQ{rn&{39j(Huu#{CV)VP4S zTI~%02m^+xJVfiyi$`qK#1^y4Pb=>AM>nCQtLBNau?{<&bPM2nyQwFIE|7mp0of@3&VGUHBOjt?c|^_V>Vf0{8rV5E||D~5WC zXUNxwNMx1+p?H{`_Up|5Aag&8!H$_zuHX^Ox)joW zXrp?CS-QUEQdcg^>)P{Jo`vfzIxSfZ%szr2?)$`3eJS1 zDRWtiTW0J)quwOskp&i1w5kKuB@oL>U9LxxrUEfnKiPXfP!z!9X*gi>=1!7da|IML zGj}S4UQq;5<;1O?R?SUQUaBY=-KAQSjWJDQO&GPS2Cg=qHeRu56Yf1Fz z>xsJ*DwB($TFoDa!WJmVlZT5;A&)7Ke$Oq232SVoQ=2S_1rJ+{gvNT>-tK$t-5Vis z>QeqZdUG*IZH~kwDW4FcMCpZRKdCXFUw-4Ld1-}CD5jYHN2@~r|IQ&)mPOG;l0v0_ z%2+;5tQH`28|Y6N6WCA^mvJy2|> ziRjsUoN8Sj>8DZ&u8RE!CkFj?T`Uu0bQkjWUpl*XoJ;^kbr^sXLP?`>_7YYkFh75n zP~vAS$RgA>*Ll-jZ(-~H0`$x5Ync^I;nl!Wf=T%U*%_C+)V%rJcUOD^Z;utPBtbx6@S@3|W=~TO8=dFJjRu00 zDmVin=D+>sMnpps+t_7b8F>KP{yJ0)?4e)D0)ylYEzr;YqMNzYLTjAL$p6HE<(W3S zaBuVH`CSmZ%2-5{C=8kBycGde5}5DCa)2@2Xz8Uo-NQ@q$uaM^gq<0qPd|e-+!vg( z$}d@I<7C=zX`b=6J(S?lXvg4yMc63KeJvBQ2B$Bh4y_nv68}><{f+_j7lHN#EBQ#N zSj@^yM1kl$kVBH)`k%;nIL`BMniqG;&$Hz*=FLNG=M_i7KZD1`*K_$1jO~oZq#buL zOAkYkK0ILO(jFB;Xic~c?^FU114gq|-T)*-r=rUSigZGSj7q|t5;RYyk_x0HN$6}- z?ObGuIn6w&yxgI9w+>{4jpw3hZiL0HU!z<~+FcWX_x<)loVeYz2eI@50o&t^QPqti z^DP_p{uxB83PRRfN~S9hu`)YqH*_+%BR-gPBBy>>HM`*wxf$8%C0H=` z#?{j|41U&*Dl(zAiA0i1#YRdn*Da_^Lu)apmHh+(?1n2(hz8y8`jb2HAf?wTrhR`e zzcj!%lX)P>bV~$7k;Z_(K$(AoS1BN$N>Z#jN{l42jz?DkszGstN&0kWA{?BJ4Q%Kr z=#4BE8A7EVpLPfe_6r<}0?OYsDa8D{$*E)Pi%2NKwq6Y%+tv3h3RY#aIFi>`^ih*) z{$h8&=VW6*lgR9+@3=?ppdLp3%B{I1-87ygbLhflQOfWyhL8whnjqyA=qe$*cRhBA z5+JK*x}GvdL!k5%|Ep91EQ{HS`mgIrwU)~-Qy_gaVMZyn`vJ=B1a!KefM*QY6Tn6K z7b;L(%-jf(7$O56*TXl-h@b)FdmxZMDsc`{({yi0G>w%TBijL2k?BxgE42h=?p5T!~|0_js>)dv$t|NB5L|`uA_q zGT(?>UUi*c%sFrIU$g0$+--hMc=~_`VNrqujHO~Iu6c)9avJ6`d1l$QSU460+`;in z;*QKo)o|qCWUmWqJVB4e@5*VbWf?hh$RKhB=*}&LwTjI7jQFIae64^fSX9Nv8$n~r zeo73~?oAv2pSY+HA2eC5xJMa4^-jXn-8V{(XMVmG{}9@a0(zLNE)gpEi`r}P%CaeE za$FiV+2Idv;rtYhFVGK$Gh>DnbM-{HnI=ESTn#U~@fvhaB``+gIMoCE zKY&Rl`3UglW};stp;!Tck!i_<`pZnB8I0F7Rzp!=*;h&^jB6WR1c1BQjMHFt9Wvoa zfW@A+!TBJ|*tW)X<9Y9D0s!*1VqAv4bl<;pD(ouof_RXl%3NZQs)QeHWzTjF3&)8r z$lf^i2aaa`C(U|o0#Pf;e0sKfeVLb(;+@=M9nYWEvW@nI@TC2nS5mF5KMCwOqHVLG z0E}8W7oP7!Y4=$)^nJ;6ace)KcO)PCl(eN?w0hRM zi|$XP@X|~&k0-LX9bid-Lk_Q`IGpVWcY6ymK&6laMUh`W6M*hYlnK40lybH(eK3oJ)k{puX1^!u!KvVaU9ezqR239` z7z1@W9y4-?C$|liU?S2&TY?KxN+8{4$2x15AvU{_$M%~DZF!H%l+ftowlaz&p@`c6 z$(U1t6$%G;sa&2r>D$P7a^sCT!Ni19?LqNUHyqyfB^l~1*<+7zV&`ZPy=jW^4WvSD zF!P8-I-e$qKL8uR?69hZhZeTQS7qQz#{p!wUn1AXUX|ddDDa9duI%7ug*=kt3}R)R zlSI}ebpro-Eg|0qkVlxKbe@w{N-z1OR2v4UA>{GEq3JhT@56+GC8_GQj|l z%aVL8JFv(XCTuV2FEcDs1Q^_?WD>luR7*%eGghh0cBFnXug)xMsG`R0_EFYG%Z$w+ z_T)J`jOz=b2Qfgj1TBYz2q<*uW1Ut0Gljpu+llY!`_9?!`j_p^B^gFSCcXpl8@RIxUV^kX%=LvQ`9`YXcPY0DvK#-?>oe3|F?3-wM?C z?R~UI(|)@RecQtGIXUXc*L=%-R_ad^#AjzJr~e3zQ*l6jW5XqFxoU|KsXN*4SlMN~ zs`!WJgWm`mk)6|x&fs%gvVZUb0Qv%)>G4=Y%5+YTjMDT#AreTWG6R8yxH$*WDK`oe zxzVwPR!Suu{hqic<65=?HITT+J_o|6_--p_OKP5*(Ux*48|;y~CUldtxJdl=)g~BZ zR`}vr0B5sMDfvA?|Jx;>fVbT(6Q183Qv%~0a@)%?e{lAt86n*2>zcKK1K#(Hh1Z+nEXb==5g%?G-rfn=O>hqVvjhl77SzRk6Z+8FS zbFGmjuF?!ov6fV`6m<6(&U`K~IS$PTgmmSo3x-M0y1WrOc4dw_(D$ziVUz~Kuo z+~w6zPvS3QKS(03!J%2M;!md81MzUhnCO2Y)Q>@iqXjh#;nf$3F1oWF^Uq!oR7E}y z=?^DzZ=V$oyLEb}Ud{&MwO8OLTxV{TyW92(^sniRuW}Hz#7OVI@c`>gAbodmCD&swV1Cd{g|{-m{4R z=FgnI=bwPReVkhU)@`$$D`3u94>$Ib;_W|#YSVz{S_{d~? zU>4c0zhuqOeesBOvM`|b(66Q=HoVl?H2rEC0sw;nAQVc5>GKj!l?Cuy3t7E3#Q?@1 z%&xZXEI20f0L~e<_9~m8WvcD@BThHGltwV=hnOLZ zu!pYIq6^2imD3KCVNd*K9ISLaxeK^GiD>w?pyCzE0QLtwLwZ7s@D!qu&U!|ypx<3~ zw(Fw9pyM`Kj*BPQ15IAwcr1=DLvS^d!tCOwoQ;7M?Fv5xl;!)9{$ez?Z2^;h==0Qh zh1y=ZraJ`bPIm!f%f`vaE+{9-4Q^k_1DylgzMB!OLTs@D7 zS?S39XCe@y(#d9%sFv<-{Q`_h(gI;DK`Fyb!~&xN9ZRB;Ye@*i>Si+RVMN~rrfCby z5i$g*dGWj{4Z%ijQK}ZiCh<5%8H_PTE(&!tGjum0%|eR5b^Mt@F;r#XIYtYpjmXH!^AATnsaMB>R;$&d8e{r5aHtD^74(hqr` zUcVDfR)D7^gC|l5hWBKWuW42&Dna@$p~Nro*E6K@GxQU(B@(H zKlLZ^*S+l2wqqW}!*Q@myeH(PrmmNN5d8dj&Jy%|5;;nY{P_OTmA{K-RI!$ds-5i3 zJPk90+>{4Tnv)<^0aQXimemwy)Lv4h^KkmnxpHC{fBZH~+7rMIv=-{j(w$*Aoea0$ zg&&{f_R4MLkmtPV_xDoYkM}d{O8H!#ds0X@_qkWg|K>Qdh~b;lH`g@s`W-3ib`lz<)Dk#yN+FqPmBqus|XPH zkoi^wGg4S2J4NvVt_o4CJRuV(5i6NX@$}LP;m+^V>lIK)7ws}AnsyMN5e;e-zJON{ zai^~2t(|(kp1PP@oT)4t2IL0?v0SoZD8Fb08Qv$6xqRQ=$S0#}W9y*`OUTy-a|);5 zQV)o)jYTb+e)b}}n^l=(8RKsu#8CYgL;1if8tWB9JaUjg^f4T%T}IeyWp)a-m|r61 zQi#cQUFhOCp833_esr~=G#Ows(+wpxEh|%US(wdbQ#1tY2jom$H{u84vCqa*C>(Dj zXU>O3oLk;qt-xRqM)$DznefH+xtrkt9ss70%1IU}N-A)gh{w7pPR(GH zpuXX);HV(<%qn5>9fQ&3O53CD#Z&Yp^(NVs0sqE3C>nSQOAyPX*EgLJVi|qYvuwu^ zYs^%b7srEto0vu>2HwU}cIrxjw&%0BIijkwMDx}dah z;TpZkzyld-xItl9?s;UDbeRs0oD=hdbHIS%e7hU#4?1Vv55-t^Q{I^6tuZJ<0F`A? z-_)(xh=#!9JFerzfX^xokM{f(|0!dYM*&exjh1l9;liUhRY-)g1fOZ^2=qhd(&~{@ ztnN|z0DJ&u-4Jd^t`CiI1OHGI>F0JC*7K`@5HnoUI zC?>KR2jB>Zat1_}jf`c%bR9j7$+H^K%FMTgq94x9RR>Q$y?8pTtOx7}1}3C;T&A7d z@i2t+$!u?5N-7(MupQ7&*3+9(_Lk0B)k|Z&tWQGQ!Q^2F4B=)jrRS0jEE>MhB;eMm zD50*PCOpqHoi3iDfNstit{xo+qQ;V0s&>sK5jRUbI>IgiJlGIanF+-*uJS$&dr#RM zwWBxb#@A@$7#~oW`?IwI2SfA|6e13fk(`TZzBftLKLAZE=zcX2vx-`uI#xw{-mi%) z!%6zIUKKzTBZFwl#4r>p)zRXVA=kq@rye_$y@~CM5%iW;741k=rm6te@<{Q;6E6eb z$37mxYW#8<-2$SR)clZo^bvoLt)|vyM;?A<9ZgKhNdgA_rRAWu&c-)6{D_0l!VH?) z!x21P(RTuOLIa$0%o85er>(sIVyFs(R8h`ITEiqm7^%=`J7z)D zRlkImj8gJ3t-8}El||EaobgzEz8x2R`u4Sr`~;QSL5GQAlJeVfG(@o(an`aNaR2}~ z2KfwuF&t$@(;cv zQHd10GJx_x`X-*bL?LZ&5+4fJ`l*4W>Zu^}7&V`GG5hU2XU0&2TwVg-=8RRxufqbgs)1 ze#LP_jE%&xrmR{3?}bwk&#U=~rf*bhzWqQGPIe4}r@!iv04iMI0uR{WMe0F|<}fjC zRSLO!*VwrsGxoU?x3(0SoNdC}Nx?(A?;L2Bj{A(L<#vY6iD3J8jjS!&vG~e$Os5=) zVfJJC`dGO5t9?MG*Hw3JBEV>LqTEHhIGd=5Se?ZM5|c09QV~=ttR5A4xzQ9$jvL7Z8x({ z$yH2-D9T#p)*EDk0P38p_U${7#OgAaWug|g{!shD9aRObXUzeQsSFRjbnCXR*^+#8 zQFJ&w0CiL=zvi7c9^vFqEdG+BmVEl@rtuohD0?^~_r2PZCxe=um>BqZw7YG1_7RpH(dLRnrtgC!0QQo zvV6TiGMg%$sp~VYC4ODV3t9=>@jv{&OV_|52ZsmsYGDE(Q7m-@8p>aDkUTcjNhN$% z#g6N^iBYY{ZOJSY`mbe?n=Kz51lj*o5=Ql!VxpW4U-!$8)TyBR7tV=yJb$i$rQ@HqB2GxUa`x zyBn`pq7G$wKERdN3AN zD7%`p+?#4Zr4kL!JjYZL34@c1B6#G#FXraPm zxvrU^;_JN6qG|w>-*gsi9y&0P>D3iLkm^Q&u2?jp_X-MSTch?wpLB5Cz{Y%)sTLT# zZIrFi!2bB=wg(jWI20efEzZMyCs{W6y^ctN2rr6+RgRVjMZ9)7he^G66NM@pD_oK) z6)T#J448)FvTSU!mN<;;Orm!HF{<7>*5bpbLUd)Q$@Ef%Jg3id!Rt9A*pX2aD3R6T z3x7xUj_LIJ>(F%4`gqtXv2Z(ZuUX6Z;$FPEot=E~*x%`Pm-|PvmEe2C-R(m%&|JhE zV&!zJuvoT!{M!|z(A}*3!H?n}LT?F-jKvMJHRM4;BX_;F!>$>((a5{p9b}B4zAz43 zfX||$vr8gd`fY5t?B4L|OAkb}+dH}|Y&<0#WMj#gJ%t5b5>I518T3(gNHKXwdfs<} zjM5W~WlZKWbBaYE`|EKabr6>6GR~VX)AlneS5i$kHifxqC_PejtIs?S^%?GLjyec8 zJfE$8^zGMjB0$q^ol$1m$8g-Z9}#DZ*nzf|*)LRu$exoMf5cI{OM!~qlJKA2%$c?g z#JCFTH0L)jaeTddQw)_idCCp-QS2a%h5#U+R8=giWw;ATNGyHwURNBIG_6VJ#<*kz zF!V(w%JXrznI&p<`OIwBAg$2>R<1FlHS|jK0)uKiy)qf45E-yPPxlOn$-35bUP#3T zI{1^P<$KKD^pqlbl$kLdrO_nU{h((nRk3VvLCWFwJd(4m=(*fwOEzNTw|r%@a`c_z zQMTaHVdAyEV{1)Pa>25TK<#ir&FfaP0LO72If26Q1=7v(`;Ph-QW5Jf4^7=Z+iiAK zz#H$fEdbg85Dd*BnH{$!%MIC5$Z~9rQ|_`gr178t^GCUNJF41dPATdBwEa0an$!>w zgKawpo|0N%03=FS*DQ~07S?iHjQ#nwGVYfczv}~O;*-reDhGg(7Xwpg(4*AY?;uE= zMz@n|vJU>TX3wj_F8B7~)rl`WI+^NSLZ!dHgoq2{N#}37P<=^Cjvt|FiZef3Shes> zxGQLzku01Yc&3Q8&Ss;wMR`FWE>7J&VWRv<+l{BL&~HOp%2BOOLHR9&E0ox~LxYh> z0HD9W@CLX_RLV?sWpL*CaW6G56-z0e30EqU{zq2>k>-Sy7XndMs0aE)FKt!>sWpeb zMBZV#{Mtms*4KRj-(mSyl<2mXUE*<4n-;{2nVV(@6Ups8c?l)hPj%pfwrv&R#q`&z z-+K)5m-|6U-V;{S$c#-?d|t#AD9@GX4n-_2Z5HG&ZJGD1*rCx}G+&$KU!1=mqdnmQ zGQ|*J&UQWZflmLY0oUjE)hl8@RH9(E% zHR#lYlT+zE-|F)#y1aZ}`rQ9_mureaixM(1#HNEw9enh%RrSs|k~TSIv4lO6^K|^d z7Uaq$H+>f2e;+)q`Mzm>7lQy&MI+Yl^pB*2LqMt2mV`Bx4?IiNA)9Xp2F^(+uZCsH z)|5f(I%9@m(b|z?s)|-|aF~{RXlH7w6V-MLQ`CTpfphuxLMP4DuJFlMGg{SSt0Qlb z--~gEh692H+Eq_=ZdvkHt)%d*L6uOHFp*#wrC%Q-^RZ1~@h=kEK+mAtn4LGT-0iO3 z1rA7Jc%kEY(jX9r!VSUk*VJ=1Z!!#3VaT2yURN!?sgBZDyi}yNJgQuh(#kFXMxO}$ zg=e-mXOIn5?A4Dn1wwYxgMLMEy3eDIDX_7QDhRql_ID50Vxu^}-?W`WaN4^kZ_y^r zD>%eZttvsanq5FsQx64~Zj6$0)j6eEo~a#!+Eba6nyA<*Co^{U#|EeAa*uX{q+y>F z`9;)u)whRJ<6i8cDAa`?ffC>(GP%?6UbhHo?;hP(W<#KLOLb$T5$!w4Hq_2h@h((CEaZZ&|{!nw0%0h+`0Cg2bo;oC4 z*@;aN*fcA7z<0P7#$#9)c+cAB$FqUsSs&g&r69Lsavk9+RB5C*YJ|m zlqY1$$$Oz%q^X{IiVjVYu8@C*G(*Tf7cx(KNIriac)*)Wo_O2L@e&)*dQ|7c(#CE7 zIwC{4+&E`?Ipw|S(H`|&CieE+(C*9wQH%Fsr)rjQwIr9h3J3aw+$*eWngP`##N%!A z%ANRDGZ)Qf3;y%`WnJF?s6KUZq%N99A3e$8qKeXdGHyOZrO)(rSRNqjc)vvc;9V1M z*7NF$d&EGg(G%x7d9mgfxfv*g5(P(2)?$la%vF`7Xt-oK3rzM@-2Q%w)_B8^&jmo1 zV3@4xvEwj|YD)-hwj^K|Z ztdqi%gsHL9^g?iZ2t>4er1Bk?=^ra}{@ZZ=`y@d4pb)MFv-FI zbjzYcaC{`f4$67E;Xqvt{~+bxvR`)yQ_PZQZAw zt95-163h=eS}C6HU`j88t<`j6D*i*&=z;JUPZ9s4g?$=gcnnz^D9cqwWFS z>!aEiW1Q2sXji-lMDyg`zZj}YBP}pp$__E~5iL)ql4Wzu3W?P9VzpGCCTOgkNbxIK zWSD!---;a$;ozU~*0dSYUz`W%dJ=E@OgNA)w;A225#OR`y6H~pX2fo=d;)k90iUaf z5L(Gk!{3>UZ|kb%TrB|rE+_zgg;+KmVpRQUN(-M@j5oHUsvrVmoVrZjun|R=fH2>N zZ47G5fHR7;hWUaRk6j8{eyfEl^2N&R<)zz}H7lt-#b#k!TzbFnZsOZSmFsunamUv2 z)36`c+?DYqNAW1Tq37r{XG^JxWv!cG$=Roxp}dBGzH^puQZ@!%@Cn3kg!pvxUFW4# z;e20nJs<&~j%+R30_fm`AI~8=xW@|2#JIj14xCw^mNuZ-U6e_jwdy$}5ZXldd9y>O zHJd*V3IF5hD*U48y717;QoD3ZcXzXNcXxL;g0C#y-C)p-GzbEcN=uhg(j_6FAh_T9 z{Qh{W3n|DH%5c3s00C9uJ`Kf{MDZI9!b#hXK1JD7K2K`Y!R0dUR z96vtC{=wAJpr~~n{MZa`C?%mA>mkF+<%twW1!JpC*LxGQ>dy4BI^@|F2N%OND$-d5 zGynJ3~k}dT5DKw z@gOsOuHz5A$M4RmmKDV=*b86dJo9t7{B01#6RTX{JI4^F)A{ZznAJXvmw<70$^W?& zXyrTMn#JJC_2^f~ysM7Y0Wrex|8u!4FmbgOa&jsQ;kQ>`l^VC#8;#dKt9XP>5}aNl zeV0%r%AKd2f2$nU$1srMF9;;YEK-YvI=!*|6Z)B!`~37UV&WdDVnC?;c)~w&DcsG- zjidv3U;+93SWv~fm~wCnOOk4#4yy(-SS9x_kxQYOxwCi9h$i%l^TG-DkJ6;i8c54y zdw{1N4T{OPJCDLdxRJ!45h3Tu#U?hiVvG$=21RL6iTsFZIkpB=@otGFl^rl~Nd0Y& z&5~A8qn;$EH)dJ7K`)Qz77Le;t$yo!YA-KU4HMWTj3+nwI}}Xn2`MU~*gb`|Xm&Ks z+oaL(C=GlQFtxz#!hiUR^6>lf+iUZ0yZ$dsy0QlY#gmOg{zjdKyv?tWB1Eza02GMO zc)@~2z{K4`4Dfd?}gJM~TPt z&(YDJ-^a+MjM^P4g|pR^Q#o^&%;6klmKA;QMGF!1vM~={>n5RMjE?(LRf{>qG@(7FiS3{|o#3e=sL>gpt0t^pNQp2uR!2-R;3jWehbIRKPn*92#7JgbWr_UMV@H$HQy0w%v^cxKIb6&rV z@QJYTj-^4&96)@oO)HUUL(wFCo@EJ4UxtHUu+A_4SbKDatI%U7VdEn~Q)5oj7SV{!x@tM5|2w%8_jn-^6k zy>UK0ahl7sn(l*~exe%7_9^C3o?YJE&SH+XN~&uOHDHTIxl9roTD! z#UK-C4!rsa6G(5*PaT-Y%^~OCpY0qjxu>k|v|Sh?MEat1>0R8(hMOo{r^J1pkL{t) zhhZbBr1W6@S+1yt6N7w{Tz%|^*SsXk@8a~H$>?S4RXCoO?h@ZWVa#NTU8dq>lijJH5!~58ILr)=!6fZatb3; zA9Rl!CPU*CeeKBD-+0s$1_G}q2}x^5a;DBJ4Ec`6DwN+kkvKdNxDzwUA`rjl*8ech zRc$;Yq%^=$7f4P+P%c7X005lQ_Zcwg1Gu&8Tx3|ooPMjG3b;<*^LZIJLLZCw+=*ky z78jnY>^>gq28|K_8@!@SnFlrEG8Ly0`MFVd$-!{-&|-6VS)705fd7bI;KDw-g$S(b z>MOzsA+m|oN1`Vc6Am+6Q=%f%T^72!UqR0JkxHq_B&O>dl=Rkr?u?BCreP^dA%qWa z*)w&x5-+MxZuz5&5i6&Qm0O#M54=>Ah~Y{A7eFbey8`9x_5V;%lq1HSfI4HUyM~%t z&$nLkq-b)MzNefM(xKJ>eKn=g?`rn`8nSCpMyCpaQ*Uq^g`@M-Z10LBV(v+LeIp?x z>Gs@+efqfnD{@^Z>>yCY?;blrg?`u(JIdaaoMU5&@IX26k54Hf2~&QwmCn1lxx z3CpxE2e#1`KeBprQhHX;hhpt$QXj>^r0Z)XN$Z z$|6x(lbO;yHB##&FrNPxPl)!&n^;`E9Qo`4d@s5;^71GyMd``n=s)X~!to&19N+F|yo3LQh^tue75)-}W&LJB1E`_5@XKobJ4LDJiS^McV1*bQ{RSy~o<**sqY zbz@~Gx^3Z;9jBw*7z-zs!5EPFhh zCoov0E2R-VVu%?3O`WHIHB=BML}zTYpu=6l6TRMnoXhDwnQ5ORb2*x@J#=p?0h#R5 zjAzA%9v|9n2?^t_DUhiFsE(*LvV=?(3X`>h38i#{b8a{)?0^^(12pWb?CcB8{`u31 zw*T02-H|&CO6XAvTA6MJAA{}j?`C1!*X=I2q~z@h%}30qv0PRYFXu^YAaELE2CGlz zQz^=H9u+_?v98h&r%QQ_Y@l=k6s0UQk(<0ohEYr5)U6ShGk@>($msPp>;s98s&nN# zGZXxI-f-Fv`9{edrrEB(lTLjaivt6 z3;;wHK&_Ps%tc|a_A=tZHnV>Jfp&bN;h4OR?rFThJjs!mtqq-_Q^h3BW%X8~X;%Ra z9Y6^i<9Y@9Q>%94Nn2>mCAL$_hPmUR#cj}y-%3I$k2$1?vTEvYn;I**-LXt8|4VH?L zT<`03xM!ISR>55^+N?AHKsf+j)KM)&VevqeVhUc)S@4Z(>AW}rQ2V<;b5_phjVc1yb@(bKbKG<*x zh?04((D%^iJP73yf%@C3o8`=oeJQkiR$qqR{|-v0qqSUh5MXi{`~DNtrai0VLdD=# zZ?a7b{$Jh){0a5m@h2IoDa@y5rc8A`*Ywm!+b5dH*&!*i)pv#)<430`kwDS+O~)OL zoBG)5w9J>R$bZ8Nn*EZc660-8ahTolY4{6|BGU>Q zS7@Qb_fzo(VX5yIBbaq9)k@O)4QGzu8XNjsiGT2wD`O#*o?5$*10E$ z7hY}ZiAg>?!1?sa^aW1s)7*im#7VAj6-l1mhN>_0#b*~mdZC=u#*c`4fAM0)qxk2Z zFX5~-xKec)&M*KAhARCJp;vIUQPY(LPNdLSUVU7e1rAAd&_!n30PDo3wK28jf?RH1 zOKUEgEq%O4SKJ%vJzc^D86GuB+vU@O1*Dx&l~HP>c=%j#ZT*-*t@S2L!*@Z;&p#$0jVNXrsU@)#*&NLsH$O?kuLHHK3UbNSL;MdO{Y=v0*{qnwN zgCqAjc8~xiOM$OF6(z>DL)ebF0v$-+QSl4db)`HZ}J3}3V z^iVY3^T|+Fx7Wtp3*W9^_G%#i6u>N;71DKmH98chh}$HlzKHq^7SG5?Ab6eol_AnB z;D$>qKnSPwx1+tsnXL%v9s#Wg%+z1km8Qfg88cajYf&@N%rYsCuR5_bZ$WDwKdVBZ zRz-_o)Qzt9)k@r7X;}s9-V=1*3VNcr`WRNLzx$u>H)%g!?w=-7OA<_;tmOo%#04+t zb~s;hfa?I#2{f82VTPpE)#oywAyn4Om1@b@?eQ{>ba%aj+Jj0#s z@*oTiVq@%~?>q*ao&w2UTnh8{JMlDC!!omOxg2uCWHxKhA&pG8zqez|_((IH>&r=* z+$#IDNhU*ItX9Z}go|YeFzynNJ^vjyKiYV1R(PFPBtVkk5I`cCUS3|tP#S!@cb#^F z*cLm6%J+a<>X@9rdk?D%NlcFnC9I00@2P?T7y#4&&=xOQR8v^_+nAbjhWIRYeri&~ zW;@>;l5SDXtTL$HKe}976uOb<{3OzNNeCT>+KyQZLgHe0F4aCegY6-7Q)ug!6YR?O zMRT=GV5@r@xo8yof7d6XkSF{R$PM013pWZUO1$40o`dL(rK^ve7JScKe!ij8X8f&1G>eE*5?} zA#g7KUTUoGF>f%SK@uz;AO0qN%-}lD&oYMz^8o}fv_7~O6~+$F`v3(sbGCagLK4cH zyf;;z7T%IFskn>d-}9Os!b;uw#j-G=R24;4`fPrV>eL-(9-VwXuw)H#`{452GyuS~uM zXCP90H`RM1$LqKYR7o=BGbyPB`?=`f(q;V#0&su0Zi{tuT9>NiGG*FP2E*>Bb?kX; z(EvOFeeV>0Y2oxZGZRnHy9EE|ok~Z!e2$T+JmkzWesTJWLeebgWq1vgNXMXiMg+3rJqQ&>r|qnjsj%^n`4-jo~wiCu4Wa39w;OG*tD` zv96NL49eXFyhYoT%-G4zgec0q0X=MXc62RCZf52;1#cI_McMA}uZ`w^jAS>`XE|1} z`xHVCF763k@*cUe1NIgDZ4+%oLu0pOzbMPUb3!0qn=}9nk!jRsaX248OP(Q9txx~} z2M##rq4UK>`zk<2VUOS&5H^TBDnXd7lTo>Q`L=GozdMwTytUlzUETAUBYB;3EuUk0 z8Qky4WlO9R`eKR*gcIykA643jO_@+ZATjQ~*a|)g+#1BwdnX`rCkD??DlF(pBlVSatZibzMGcd3s;7}=(1Z*Mnx2uH56q@{?!@7?(obn;8{>UK z&n8?D=i&WKyM|S<;0M1oF4QvyQ#Z$VeprM`Ftv}k(TYE4V4|g1LLmGf!M}X^m7IQw zI)+gSUUD!G-hn^oSo}HtPjGH}r|M^fB02|vj-vk;;uyvj#&}kPCi#tvJ}=#%*8puY zDBzUoBsncv^nrd3tPWda4|Y(pqSuS~_OE>5TG|y%z8Y3 zTRF>yj#LQ3F@OO@2#qZPJzJ<4KAKF@{La>dd+Vmj&kc~Bf{{LuN_jMtux@5W1F5z$y&LyI0m>Xl*#P3%^Ggy1|3RhMu0)Wy`)HuH`;>S zG`W8dio5>q>Amo4wsbr`j^U?)#l9&);qoN}#00!vIM`wosVY_*C`6OSQ8@{!9O6UL zJlgv&W1u3S$l&6&X4^k<<{IBEd&lA@Z4XB{Ycl5bdp@G7v##7|;7zgGW*Er`v&XtL z8Xn97VF(%9w|@`A z2WrqkK>(_v#MsZGE9)V0;)qjA>J&9BTw0p>m(*HUQrH`@Gw+l*EL0Y>xbp)NN#rGR z{~f?h%DbaRmDxdLxYQH^LWZB{uHg>t#TBq=a2T`v8$!u&K@{f>=^6XXSkwIjLqq9TpYupy`l(m?$bYi{`)G) zt7e{lSAT-AeiJAnB(L-eRcj4`mIMcWsjj2Tn#OvuX`CLkHK$Ua)jB#LUBq6Zz8Q7n zf6jIoVlL(i0ieXv$ITwDm}81l{OB-K4t1_K?kn=^Q^xDQM4)1EhTE5mWl$nJ?oY-r z)FyJGb4oCr-?UIy+DLzCw$KyjvJQN{q#qY4QRHO6>deXT$*7uW{M+Zi%U?y)Mw$}E z`ZKC&m4q+4qpa0voM=_n%5 zu$5utBxrm9qunEerCevHrDCn%_Z9B)i8T*K-RC&Hx!4uW6CN~*56<8BnJI4^Co5$u zMnAx5-H84n^eqlu*=|uXg$FJof0}N$O9L_epsm$Mn(-BS9u$*so3lU}6SN;Yn5s;h zp~{fcA=yn=OZE(-vBQ2vIc2n^>-6P_F8|qogP0QLO<1~B8)^t~+t+iuj-T5#m9fQb zX|`IK|7%c9d{smNpl_qON`lnN$jW|~zfUh^jyX!=b7+I8TE5cplTYKeH6D*D)~ji;s7ePzWcwdny5(G)jST)nn{~)y)1`{RXQee; zhobFictNJ#prxZmOx(a`W=zJcjDnX^&lHP6W-w*^GOKT#l4`>dCNx|Yu*2p-Q{5bVHLGEJXA6!kT{xM1^q+DzWer}X8CN+4n}bnD`Dns zQ|hwE(C1yf*cpO+FrzjvvDi5y-@Nta$;aD=nIPG}&yeA9IT=h#4pZ-4=f`mM3MSv; zp267|Qg>mB!=C{1RNT>~`tSlPzE;;wGLlRN)O_x%vLZ{@;8D#1Gpa{6KJw7=oUIZ$ z%W{We)Wv-I4YmrOa+XA1yYGyCN7tj-O7!@pS>x{n;CU-m< zim}L~2{M#*Wy%hHYeGEsO~kp^Q&qlg+6~-?0oZi9BdI83T06jiM>#mo;vp=(X20=#x>KT3skX>BXXcpfWu0 zy;fihf4VQvhHP0QzRcIbT&TNv!xK9Ab!<=3zvD+Xh4pLIr_G&hhM$KJo1+5+Lfg^= z6SVj^6S;e>veOJgwvdvxuK5dEJfrw{66XnO#*k1vj36oPuv$@B0kY4-bN37e*C>9_ ztt^zQHM$xu{q1>AweUDbJ>aO*;8z49_x1y#OdmtiMj^#q@8d3^$`#WfWLGK@ivWX1 zC9D1?d%o;>a2BmiYqgaHP%sqR#$>C>Cma;@TzSTvh|$IKWZte}ai|=tEh#C;P$Ban z&(ig3#anpwb$m2V3UoxQjrYe~2jcgq+wQdl?s&P+d826K%rYm-_?VXTOrG0NcP54x zoxa*0N1^F#>@)`ri7$1iOB*GumV{=OKP0EVtyFJ0%kz7~BU1Lf7%YP|A@Slj4;J=5 zkQ;$?C;0{jQ1yd9IPY?*GPxM#8R@rl?hR5Eq(a97M)~=rc~i{$bT~>15AaZ@R0EIP z2(ZfpA@IyRi+>0$B@w;SFhWMG38^Zq_aH+b(!2x>&-hyBhzL1i^HU`l-OG|3~ z=44 zOFKT0Y4Ga0T2?)hFtnnZ3Ry8wIub)bFwplfsyN+HMaC~5teAweW#ko}kK6w<$GZ58ECPs@?T}7FM*!QOCHnsSuFN7HMp&u(SEb=Qgivq01f7O8}ihai(uEI`>z=#{Wl z-1)}IJxboOY~zz}=A4Tw*a$v z3%WwiuU*R-a7wpEM8RrJCgqR;n;zv;!Mo`NwXp0%G%TE1(S6n;wYWa4DC488`_D88 zYyamOZh!BZ3I<~MvhwXA9m zXZ7ED{Mz%bS(D8rOhERD`~q>;^}+M2MfsCr(%%H6XcdkwqdRCxK&PM}K>)>9=S*j+ z+&o!b#K|gcrd(-k2H{r4QQ>^?`(&jye}TT`C^I7zHd0V0t%fo(H2j(N(V2X_l@h3m zZwko56v_MCf#W$vIdtf^P(saK3B|}IL@}ARH(f3(^~auV$Ao>n!paR3tX?NKqX(GV zzF@w+4YFWg-J7!S!$~3!rMHjA{?-)9d%CbRlz_#<@Urg6>dJ-@%`Kv%#Ab2J%S#Hi7!p$5*~*QQKEsjZ&>qtd&R}|weE`m#uyb&Vu75h+gk9WgWRCpt^30xZcp&TP&~CB;>rA_ zbs5{=zDK7AqDLYC1@IMfD8%#3X{+M!Wyqz*@%T*mA`df4JPfr|#-A*SbCoFiDN-z3 zJ3o);ZbGpT5>rq4i^B3Dx8-r%txO>)_wN*9?i434(FS>&h$rN;ViqL_T6SOMjI#(% zXiUXw?FPHLTXSixMQ$GKLL!ymBT#3ntfjQUmT`f01!#@a#XF{VdrUcMBDj5F(Jz+_ z7u~D%RnnKzaYXtE)rnrvICYYC5fO&cxQS21cNN%D%_#kqYv7PYJZRh>|NM2dRk9`Y z`ze>+Jg)%7$<$fQbWxPs*8)o|ASF4^WmUU24O3v8hU8BTW-sQx{8xR-nkZvt;qhs- z&$MY$`|H)Q5;5u@vk@!*Y_q;^A*w?{<^a^DO-f2J+$hHwkP#^k=kkj$&pzK*NjK7e zY{Zj1?brQRLyMr@LQBI1UcyT~N3er~4|-avm97_8=bRX{cDlOcp{vAP!!kvq_G`#r zcee+)0>FhHA70{0{9>=04t+&c#OXch215qI`aw>a1apEm!P0%`_jeI)K88GT5UXt|7bl@moM4hOeFGGvID07+@?a0Kv z_(KKq@iJmGt3UHUuv9csmsk>a)_gFzTl#BJHDZi7sb6Gb5dQF%D&wL{6#%fl$L1PC zPF$&d?@(6xVnshd^zw=<1!x5chM0Eq-!hroRGK1Z6aS_w}ydq+){ivwjg26OQ#f z*EDZKdpJdx&O7RmjV17` zeW>OTyUHNmA<|cUBx$x?oKi`WXAun($8Q zDHy>%yX5+`g}kS&HiRz>(9dfdoKHs%sbPWzQFQIkjh5*NXue>gv;Dx2-sFgs0-KePehryF9`i!VMK!eLvO@E^2V-)?L@TX3*sSd zKcYPNNHrxPuDs^+CG6dP3psFvIlKK*?u5Fu;8|%=gyQOdzL7p$s$M&T^o(qY`67xz zV`$tgIJ6~fGWB95F~yZBf&m&DJ}pr{1jHvN$$qQDk!zTK@XjnFJ=)kT-N0BSJ}xDq zg@eoqqp0IS)f=x#?tRQh39xH+td=XSRN|F6rC#Cg3?u1Zt;rW&I<$*=@&*-khppv} z1{eQFXfcKn#=lUkBXOx(K^gB9=bCCJX?WIKJBN|Qo|u!^Tn^6URdHca3Zzq+MLb#Z zH$1#bS*J|&n6=!66G&;l?9tX{9Ei3_jz4iCn8X73=W`5p0Nf!jp)kGObU+Gxvs>iK15QyV* zWRqi%HE3UolLv18OhRVj(furZ%~6orc+E;EjpzOGCM8-zzCuE*s)Bv_IBK1am#tS* zDExM#zv$A1+mq<9+_vB4+XG}hzv5mqVRk19Cxe4Zp(zftf5FE>#W#8C+0hUCFKT;) zasDlMjybED(^imSrYM#&pK>P_FcE{B2Z=W_fY;#4UEN`biOJtK7$d`g2CIpZB(nZM zgrh^n?BJd$n9hcsdj6fbNm7Pm-ox`cBsmDIKfs)-i9t|8z?RA&Pox_%M>?IYp|~&$ z=^x^j5J(_|<4y!sQWlt}1=(gc=`#@X1#aqqbq2_ zSs2AV6bE6(%hz;hq2OF^p27DZoR*Y>#C@ z7_YN?#l=a+lfpzv>N!n@%Yiy{!WA^a^Ggu%0ZGU?xrIaiamQme$9#R);2{Pgro-r( zH>0n(*Yb(sh2)n^y8Q4wj9GQk9_wWq45b4c)YT824RfR3;YY2iN;!(OHXgnc?gn>L z6+IU#9BYoGA1(2d$ zM4yOR=*;|-fF7;)ZE@&`ysm_g0Gj&F04fh0t>P_c788h(NA2Mj&*ERD?wbsH&m#T| zm5YZ_7ZL+|O*61tqi|n++|7#{4`QQ#Y~`T@x;X? zEPd7E@vV>U-F#oVfE)_yyf1mMKkPny(tq11$9MjWDrCNRPu88RMbA!7Gr(SXGLvGQ{u5Y1atd(RZo_YO$1& zL0IE_a%7&=^O2wpPg<<1#sEBKeXX<&i)?D!wm=grlZsDt}C+?4kpjlPH+hA+wo zMEGI?W~wA+QBp235G8SWImNj$Haf7UASODD5j`MMC!*9JYX%WW2$n#~> zzJ&&X4+JjQ9QmdG{9Sl|ysLoZUnryB+N6T~^rbrMq`D2|2#Y08dt)+6aVCxlATT3o z>fSR@fJSdl3Fj_-Pks(M(R2TAwyy>bQ?(zr#(L+UY^INN4nOkWt6cl=p6se;M7;*k zcSNWY#lMa-nq;0*aXg+Dr0++mRkc-bda=HV6Tg`E8%t>TC3Rp$z3j13u@X~2M~X?! z<^;o}!v!cMQRugC;~j@k6&%fAgbN0Gbc{TVZl1N8rlHOD&zpliXvvKuj85K|uwjtO zyR=jga>EI4r(TbNhE!w5MClVUu94<~wrR9Q_)iZGJu zNn9`O@=h6**W7>ta6Sja5xv*TI^_NcpvuHyg2DI>Rp_pE!)ikdd7y52x9QX|gCIUW z0kxA>MJdc!Roas)U2H#o&Dg*HDcbJ9^~IiR%-RyO1L|xPa%rev^oAj>=r1jJ(q;wo zn%EoK-HV2reOW4;g}GZ>5{gQyDmC=8iWF(`z_yND;(N6^$Vh%6(r;fjE-XD% zr=IArrPKGCCkX+lLI7jz<%$7~`pp{`HKF`AsGGQQMkDQuNDMT7bYWk0%g1SL=3i6# zhGWoh{`XbATUv7H$OQ*bTsy}Cyn9uTDn3u_sn(eU`Wnc^V>`%{z$4K+il@US{=6*v zse2NTNqMGNC~n&|la*CuDdn|paqS;lZtSIw3$zaX^;-MerC;V0Qpf7zz1zH19@gO$ z{nW+RI2Dd_!NHyX<>!llnk2-&#?J{E!+_6{sJp*UZwVg??xU^C_7Ko#<5%(}X#WtZ zgA>2BFqB04E{Rm&AjK)JP%|%+hUN#@Y*NGCO(7vP1HA+-F)Nq?>qR)zI+Nxxh2A^{ zN&!lf5~apu@$^VVRe%JEQmWXc9xp8jQ=B8{kgu|Tjghprb%es+P4a~YY3sWUh_CVh^DA!{(s*&!ospVYp7+?wBr$(CqS0-c_*q_c?Te zWR!?~j2SzfkuVmzAe?WVc6gPNIyue@^RHZghf8Kf?m9rN2LWJ3#X@=7O~kD4*M!4C z?)#iNYl{LVfhi7+)S?sc4Ts>;f3l|sAB}(XYt%;E>u`Llo))~(8Oi^cZ8F#3m3 zRTR3Xt-+)!FGLbG{26lU1Mx~WYUuq9JHYm2k1tpkL7w{oTvz_8?efr*DWtQ%RV}V! zic)#^KntW?HLXbB85bw&Jjam#fC*KA-c^LyZwZ;L+H-9LFwwzK!2(+HTtc)8Og`vP zXP$gNX4qcTVl9t@E4SQxyanhRoO&0g5!VP4=GLwC3C?!xlbOxRE%(19B>kO#ZkAJUxQ0Vy~7!)BchDnBAza=_A1XQC3|ltA&Xou616>?+eS#% zLqbQ_xXWmQa(ElyB!Q7#BOBdC_7k!AGOv}cYCb&F@4ZbbVj2OR1d!`4HpV}M%HTwk zRwf>pG8qE$MTd3=6y5t>a&zFqHCOP#1dBt}g0ysxKI82h9pSES&vko^4cgttOg(dq^ zrt^qwUOj5O(S#p`Q9Q%dtJb$ok-st?qvH+MON;4AqH6mod;L&d9v*VP$@?HqL}!Yjp=$451&$$iEtHOmihsI?@*1&;X)LH5_woNWwA%MlnrC zN|UG-OZ2XyKrPHKkBDbUF#WTl47p#DiF0)k=PTWRuI zn`s}n?i#n}>LN?|P;&tr_LHst`lK92bbEuScgbZn6lz@?S4C3|h2~^i$^Ap97K<2e zvrrr=xyL_Lw`g}j3F$D=Y~*`L7)ft%ipHKFrWN3y{$Y<5QrAjNfl-^-tRCR*Y*u>a z+vuooqSLRsWIH@kUzG&tBjG`QQ5+Eb4ueCKb0Kf|U`#)Q=eK`jlM?=BH?*ZU;0;>U zfS2i$)}rxc$m?D7_!`PdCmpiK+hmoa*-4VtwML8bM1?HuuvL}5X_We9--sXV+|)@K zZY)bTG?bwp9#>LaQaD#qzD8|ZIRQ^gDZ8lI0?9g`BJ_MBL|guQ@s;hqG()ZifP}x1 zwr3K;lZ zHe!z*JyEF|RqR^|94!8ONtQo!mR{MRyJR_r;}k6)%Iq%)zi<1XT5xztulWr&N5TPV zzGE
1+5yHIG- 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

q1MmAiMW7T&_w{>VRFWWflhJp zFn`bKU!EVyC#$)}OGS}To2e!@ldh1F3kR@LX*y+g&6`hyumDL?@^rSLYDZ zOn1Mg(6j@u2FYMgb^!yDdo^dOn5ztxnD}HM`6#&bjSCvWNhfdml|HmEJUMJi60J|) z{a8g};X6dnVpeR_W-d9$#X-DOA1Z|9dC|Y%60Rq^eXX5~3c2@jeKX+yp zOc5WDPE^h;PHY!{9JuJIF5SC2YO{S*|BWjrL6gg_gv zirRN_32&>OXK*B34t0kXyLD&%DY)bJeN9*D);M1tXh5N3|JcTn@rlR}UK4|CA3^5l zK!a0UeKb<>IZj;ke_2H0B&3bbSX@2*DC5G{E^yg3SrGHsfvx-|?OyhVWo)w{G}pr1 zNC2rie(Qt$vGesT>3Z%KQIaoTTM!3;0?Z}EO|&+l2V%yya2_b-6EwR%h8;31XN72i ztl)6L5qKT%+FmJkoi-+OIIJ9biBeYs{S4%KdQb=@p{i|gku@AO3f?Hp99v+`^o+EE@x!6;c=o(PxH$bxkOxIDMvMXd$YW{}1kHZH+_Z$Hl^9aA+ z0d7_f?hQF&L*5d%Az<~dJzqY#*o_N(dgG4ZR#M#+w#w0HF+GFXGPGU*Doy*}$YU0Y6v-x)3llI~dm()!&Kc3H`x-)cE14p%v;SEH<5N z&p&$uW{LZP5r!U}*W`0#srxrNEz9m?T`^a{ufiHpD8vCA=zSjjx-=Y7cdD_YUp_G{ zOETS$MP8o95Rq_CsOf1nZ*{!$A(>9u)h&>HwvE0fXwPjO3H1;{etlXXpAi_kzBp*VS0xU|6fKsB2GNz&;eKvZb5dbYK7A`Kt zN(>V+FaSzWrx1l9H!_p0|Yi?wP+)VC2f=lTXeK z&g}Rnr%Ha9y{$A|rKiXW%SV}b)-P?{T^N& zruUIVdehGd%ZlEjuxQUnnpI0Wp8=zNbd?MDRL>@OEqUe3 z?55wM@+iDJ|J`X1s!dD?ANEtAd2JZ4Gu4NyQ(I>liDu=BY*tl!(I==BFz zkjN2IsP2o^sRt`)$YOc5qhm#du!q_O;DAJyrgmg^Z+re8C#`pD7~G3}9dotm4b18x zHkU6MaOAI%(3mt2Wgo;$SO|zr+Nz4i<(;~7D4p}+Y@7XF?#t>`6rT0!$ve5r&1}m* z$N*_<=m(|W#141%%rN;s3H^~bSSS%E0HcHz2;%L52BKSad9^5LmKRfC!xphVWq%$L zm~Q!;moLkt~= zPVAbqi>ytKu`WACLI|0;1|`m4Oh2|NEbgUr%BCu`Y-&AP%fq#=>}gK?N%E7W0ZYxd zeDZ9AD(Bpdq;pfa-`y!0leGjTWcbN$l6$6T>B*xp@FBAka{iUqWVCt-GZF9-#y*$A z5HOW3K9Z#D78=`0anV(afnoptVL;n z7+UjXVP%teWVpzlE*B;mV*Lk?C-CL6YOic4D~4T4L^@9_48Za0m{zfHYw;*hOax<9 zZH?vpw9HW5#LQM|EahTD)HxxSl(zH$ zh6;_5-d5YWZHrp$G3<0~BCT`)z)KdP_Ya|dLNd6vey*RynGnnj$C_Cs#UNA*zqBK& zKc0u<3agnBM>B2528?oB4xw|FTJl5g21j#9)rwMtwD;*f84;e(cP1rRGV~nY@oS+O zEgpcATM@Ws+yfQ{n*d7h7nA>m1wnR*eF z_KpH0)O{U@ai7!ycQ2uxhA7HsWg6_!8(pW_vv*npdAxX7TTDcnNVS-9B#FB@b>Ax4%$OGG2UXN>E6>Ds`Zny72;TgcUI_Nt4%OUL7#OS+8Q0o zEBtX$D03`jV*f-aoqxk3$a4BO^7KJOv`c3D3&}eyK(sPT6d46}Akhp@_hO;Uxx;(9 z8XejEb^B%xFvF)|^%o7#cul(5D0qJVPY?AH_{18{lA1_*3ifskS?`ObsM>01?w)pc z;BxCmKsFfw{}>nS{&EaV2tqY?6e7-vz+jfuF(9a9wPE8MUt3LaMP$9Ow}y>QmLQx* zVx6lUOF@UBbu@?FK%X@k=6?_WDt1)l$+sdh9Brs|8Z zX5^4pBURuY3h{`%3k72-3XUgfvc6H_a7sHH65*)c6Sx^i*wj-9X@md}oWyvtBz%k@ zfAnZ9OISFr)L+R$yi+kaGZ!r>f5h1Hg{?z>%Xo|eAEoETLY9$pdI|JX#BC;~g#^%_ zEB0H~ss2t;W;`DNm6}=;E1|#1W`^q%_?C($M_j3oMs5nUrYBBNfQXLjTheT46=i$i_;Wa&8{&MyXBu=tE!KAFl z7x1Bn78b@ZJT>jPl_Nkm0{~n5|LLKw5HdrHIekCLmm=GvL-zYzNxbf;rca0L1THs9 za!M`v5oqPWc1^=!GcVf`+kD;wCMbr8x$e|IhD<+$8MIPi3oV6)bp}c%U!iW z^qDFV$(%)zgggl1OV^^fa*Mx;;3a&Rt9pgZRJcm3#x9b6&t}PGKSkOv|Nf2 zcm3u2VUPT0Bmzb}Kg(LbqHKN$AmmsCpzv^ZP1-ed39CY@o~zzqmlfNl6ImaHCQ5

Y_!V$?bjHhn0qp}D8tJ&1Qq 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

-o7@6!1=aAKir%?xaR~+YyPkT# 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

m;0rN?d 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 z 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

k#vp}SRgp(h`%w#a)) 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 %UwdLCMljbgaT5r(Z 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

QM};w#6n@b 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%0D%3pgA8>6G>vO` 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

    U~-u-U>HbcY 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 *6lkToPdR{Lmn7CglnAGU?lbGo$`4R*si}Az! z$}~a+?;!%l9y7QVd_F2LneFude0z7DB6RWV)@(D2DR#q1Hi||L586P z;1ipmIIepr9;javinUJ7#-h_K48T?@keoq2F!w}+>m#w50&WU5ZM9l2} zh!NLFiT=HfQpUG#RF5FfL}qog7-fQ1q*g_vy0|vbK-F=%mt8%W6613}AUDNSQx^@= zq^1W{7#dT57~?GL*!Yeln##Ew5>Uvu-$<|xOf*8XZE!AqIG|+_Zj?@cw1PV8@lj< zBR~c3P6rM(s;mK!*>X}KSpuM#$d^i%5sE2=)LM`f5XWJ^L9gGC+gF|%iQBjHI@7J5 zl6|*WU5*|9FTiU!1jhA~kp~LlF2A@StMD-uYJITR_cABB3)nL+cp?1KK~Jgx@Rr?^ z#e%n_JBS1Y;S#hL9NK@z3nt>+zvLGfiQ(z&(r(o0{N9t5pZMAVo;=Q8ExaP@X7@w1 z{peV!o!Yoh<&_y@ig2Cd;5@TQ`-gsUh3q*o_@z+!J@|DAe4hh;8}9pq2bF z1kb}^@x_K>Ks;KHflM0`N>ofT5i~gRKr{^aZ<0{sQgvU0GyzgK*s()OO{F1&pwfO0H0ez+O-h&RK|U%{-ogQ_PPF8|J(d4Yd35 z%R2urH0d8tTQ`Mu?1!scq}Q`jvFbuU$0YH+(K!0PRnyguPX~K<9%}rE@3m77VlHP$ zn*MRNL>pNBpY&l30HgMC6#UG4zUcb(r|3r_{uueY?--?{a_ zALlx4>padhCf;UAF5D+gWpC!1GY@!?IH#Ky>C`~@9_W{fs!1DuWL}6;6~DGHwAm!} zEYmw|(gVECD?>&(^!3;?!I0pzFD_-GNZj zdxTBb1iPnZ4EP&yq3qP>QIXhK4NR~d8x|^)X)BVsq_MrrF*lBH)dcF2({Cce3Qv6D z&#!J`6EW;SVtlPBnUGdb%CSs0gb77-pgQ}TOIha0yrQ##=r=`|+TTBd`3sw$9}X65 zV#PsT1$3-N++pEnh!DB3D3n!GSD;vV{3NyxC|%IyqJpjQKA;LX9woOxVaq%BJe2Ni z>U|3Gs03Bbd9Kxo5Bo`2O~$~o+ye6@7AkgGKbsl zr*_n1&aA2LWX;<2(ASCSscP2o%ZojX88_kH=(lxZ{{?SG1ObjiF`AdeNBh{dUCQN- zy_#^Yu-SjB+zk|t;U~Sn5W{*oSwTWGT7x8ZWh+M^hlw{5CiQSc(^P?q+CHIc1WiL5 z;!#~W$;Ux3CtQUMi$4lDjG}g(uu)nM+KOx*0D!BbkoX{=Id80!DF;l6yVMDv<)>Y$ z#GRI-%9Z-=t)Zr8$yzNs|DFY|xB)-Hl8`)2A!=?fiVhy<+yh|6LI61UsUg@UQ|k~h zlz_CEo;G3hSEMtp5BUgx5=->dnv6aRT?y9V+dASJxNoQ$zaQvNBU0r z9DJmAbTa6DF@*tcS9n9mSfS3YE%(mY>$6mE}8D!_K7c=#|piVV~v3&eS!$1_C~=9EDSWNEy=M6CUf0MpXO{K2g!#t_Ye?7<+&mlNg5yGt0)|gl(ra7C3+Ffa&&vL$ zm%C3NsD2S!nU`D+2)=q~e4e|v3{E6Zx5f!6kBP3_&>^X?9IlKPiQY(CVGzm4_)DmS zT4Nw!J!ekn9-ZKBtT>rrjSIsVZCVwfFB_TPY4hNR8j|i<#HGmRtS&bewX~1pckmeL zn`iXn`{F-@jsdW4x)5Uh$01?ycw-?ajU-eAGe;rskS)}6*IOhYZv&MPd29QCfw_4} z^{U(m&NV?7c~D35DtC($EhEf_*v3?QSSxN|bvc=6GKXAdoodSMO~To2U!R?lvTuKR zSu_bV? zmh3$EeIyhH)&wkWANOnFW44_jL@d(!dU^-21!C#JR^#6axHcQ+AGHno}25^={pfpW>Ir8Te>I z2VD@MIa5t+Yb_R>4;)pzEjaLh31Wp`4e(DSal1`HaY&mJ5CkoCvkMY%sG3HeGZf`8 z#eAa!+{ppxLjY{h(0oYHDtD~mLq}|;d_hX|qhAN7-mVaTkf}(*(hU7^C7lbdPXg^s z`ig9LI)dslP{aUGm=nIRENqEp^GK6yY#dTfCNU>Na^Ga^ub5>F<`2^{4YqK%xPpYt zWAQVrnEtDwFgPm1pW&)1sp93YOv2`R7=NUVQHuP;))CI0GVznEqP?sA_N;n6s|<`a zp(%0DbDTmD@&a+cr`bg=Ds5n11FD)C0{ZyMsSHHE>zYN?J& zf0}XheCj9=;ya3#kxkOQb;;;ILvMEQahdmckAK0j+d1HQ2retRJ*A=4gN*@TOd?1Q zl}Ab$#JC~-kXj@w=Q41Q`tl;MNHZv2XH9`|*U}~=bjJ7meP53)`H!i-vYgjEF{;~% zWI~J4IFa3^M@iEPREHX}^7GcFJwS9}J)rH+n%k_Wy~7lvvf+V`r@0IAk;fp+YJK@G ztps7HG+ur7wG@L>%_WU)Nn~yX#I8l3mu^0ar!7J%r-TgfF&4)@j`M_0F#x|b^oNwn zQqdpLKgu0hC6T+bmZv(P5*IM&bx*AvIoiGC+Ck9ZmXobbo#a`zV645;L@SQ8Sn+;Dntb8O))t|ktTsXGv zY-f#Yw@O+`Jq8sSB)ZkABIOJ?>FHj%9Z7{0DgDYA#_Ef>82e+ElM-ugLM0kZwFUHM?kE(w<}mTZ zjBGY4eMF~|QBf62O?fRzh2!VIP7SxWz`aH5dcgSKoL}d1LGn03uQU-$YHHF={pM-+8A29>pRXr^ zs8zLKWT7P4>-@c4&dgLR2k5To)ak1{K2>#q zoTVN>&Ocua0<7HMH=AAfv0tuwwOV~-sNLgymA^_uyV1MC!a}M)Id=)xRa1Ar1qK&K zIdf|HAV{DI-jR&@x1gDwc>)?fEL9Nyu=0853!A2hWLm9objN5L{fE~#I!k!{7_X_ z+bqV3C(O=R>+;02V_%kFxQ>N6r3}o?YWH0aB?<)`0x!|4ox9C+jlabyAEfM!dj#vT zvpX2f*Aux0So0B$qM$f4n}cf)8blI3%z9eQi7(c_*2?+yL$p5O9i4u2u}G)}5FeyK z-B*islFsbHAiTem0RgRkHh))eYw?&VE)Zr&`vt1V=wPp)n#tI3Uiy)q6oLqrulD@W zW$+?n{)_rF2#4J_HTW+48=7+uS>XT&kXjvWg;KT#>_cFtdSK$ff^!sC`4()lp^*jN zz4MNA{L=^?LjnIKRaI}oAfpZgCKelI8eFzS%>|@WVGVUpG4(D!1+L^qv+9QSCU(C6 z>f59iwH6L0Y$d>|WJ%RnDlx64&j;4X^|Yv6NR{BH+5C{IHKT6hwr1*kX^80W zfS(Eg5)=R`eYs@`mDM~Z`5y@kP3t=q8q@iNt7Nfo$DeB7;{_9qGe?)&9aa8(JbT}j z87Yo8<|E!H7N;#haLQg&sU&XQ5g4>=KL6Ef`S5fGn`249)937ilcxrDeYE=oW_V^& z{yNf@aogcyK9|AO?B&2tLb=OU__f=q6Qr>>k8L z?o31an-4(%7trZE-YXcCY+6PJ16+#9$bskN={jbUhwv4s(Z)V(F;!%ecw5wuHiyoy}dx+_MS&yWgkpAI*${MD2fOonJn@zU zUO*fofu&`$<6==MUrS906)0T6;(}RK0`3o9ZCroY7_FmgDIYKNye#i7n7;n`OGir@ z>ZsmSMAZ@x?k}W$>1e*WS;uOQmhPBlyu|5bR5aS<;Pw*%t)yH*x#*>PzeA7s3z_uC zENsrRMankt%}xDMPU?c$25OcnA9CK=cbXht3gxn4Xbixml_n*smAnxXd}=39OMjz6 zc1ob*_rHBeH5?XRQ@>R1qXtjpbiFXGQnI|N6$;ZDa1E6u;1+j&)U(}z*^)sNl(__1 zwIrkJQu7v)#JeXWs9zu@6bi}d@6 z?j+M_6K9FTn&J1gqDF?oGDH5k=CYZ$DMzkK=46}q^7F&V^Vh2?q4;XnwmpMeP<*n; zN#zgz^nsg=Dj|FxP86Z^mAlW4@AfOWfth_}1rA(?Jte0uD#sjf_C8(`lt*HKEt^nD zDixpsnGhqDXyRz#Ziek&68&k0S0E?-Ng+5E2vs~c4Omx&7&m|-Va135xWXTQA{izC zURoas2{p?47=*mCD@TS$Kq%KIruzU|i=&A2`w$Kj^*S-xsB)Q%F)n&FDi z#iUtR74RQDNf4;a@1~j?p+xl`2lk=-2 zYy{e!>it7VCj@52M4yu8BO9N&gRohlD1ru@ zl8BO3yIX61HLMSO`3Yk!{|`KrzWUe zL}~##AAMQ>7+r-4nPcmn0EY74%*|O{`3Vaz0yEKaN)Sad(&R*7n@Pgmv21UwOZa~%XhlY zQy}Z#C)gva9`d--T==@>{MZ<>n}Gy0#5ozQ2XDdnk>SJ;F^qrmFhZpb;_~-5pQL$m z)*m@@e{jkb*M9%Xq2X~eG@r5ywq(v!aS69otG+*%;rozWzHV zSIvbjUyXSsF?#0(fZ4c1{IgGj9@H6Z-&os~X+rxlgb@>h0daak$&^|x8lQtIdaZ|U z!E8|f6#Wk&n-G|NU40ASM-09a2O}YKPjpNhn>r>Rv2`>j*IVEb=_{_uBsxJS?${TIJoPiwZWEN-hw7VxjI>s#M&IeeU!q$p0Rq7%W1C2yi) zM0dn}ZhD+~3%&3K(*|vb%96}(4065g_DFH`#^i7O!eoIH0euFb@B^X65Pj zJ1FQ)u@ZuW2t$L6U@F%wc&p!%McfMF-}AY^8sQ9iIvsD|OFTdmmlO^lIpxEeRd+i} zq%48tM}PD&3Z+NQ0W?T!zE3fKXFO3Re1t&d=B}!dI|8yZnqOzUt^KW zx4wMn%KnFtClri5*ZN;bbVSToo_Gi>a9X zw?rF)#V%FUttz3{;;`qkgN)t>zpxYljKn^El_;TH0*Y7)E(d-t*oVE=Y`FV6b?*2? zjc+{!3U}}qC=wEsi)tPGl$2WbcE}@V1uMZs1|VZIl5bev?1W!BdYLYwXzu>O4R(l- z8&1!{laf%{FHerC`22yLdAvy2HDEvx%e=#jF{4r;l0%SU#V{v!TbH@QPf>u8Uw=17 z){mE0xsy64v;S#g=m5dDa|kNUfng}EF`%irIZurp2#9zsy9&jF>H8TJK*e$YF{-Do zo<1yfG|nOkN+WHTcoPRh000_b!2d4#@axT+c>=WXK?<$Hm&0@u!o3%VvZSJ9Qaw5; z2xJnbr@HLC$yTGq!T=TE)ND5_|B1$H4V$^#D#P=YXP2Q}3s4J_otzJC4Qr-QdzSqC zETHC5el66X7*6TwfjPanN6R5mRk;s-e@P3(`#fnVG8D(NbpE11WmwL}2gsyiH3x>1 zVX%9Z{zt4&4S`WsTDL&NHWk_JHHJv=P}!Djn5dj$9%G$6A5i%03pmzZ057|SRNU5H zNCFxFw*I7B`zLYIyR_EhaJ!jP-sjB%^=Q<=DjJ=GzOy1^yBRyY$YLMtn-@`x?CNEx zqtEyX4|c={-Y*oF{%z@VK8+=$kwEJcExU)^KM(yn2# z#!FkfI6Sp>S!!Z9xx_I>>xXtsXCn58+ju5eypONjr#bui)UVoDXJdhH{Dz83nKKyz zM%D|Jo;+^>rEM+gQ^NK6gqBwLQ8qTi*NB?q$bUPnF43KC8 zNE_zAXK5lz;zm!(+ir7wd?0ZR{kasvJwhAM2rY@9V2d z;cy}xBXSAC+yR3RMX2G#QcO`%Vr;cwjjSfCp=n1Al)K`*vm9W~i>XoDl}i0(fC$Cd zAGQs@J3mcKW?oH_Z75QZN6FRO=X4YwMqCf%?S?0C?_y`MErm}J zMVzn`%Sp7gZL{4?muozHTGq7m+d_-_3dNT4g97*jEwG$h7GOIq%qky^b=-JR1TQa^ z-{C>0ZxEDR;s)-C4fQtxW9P|&AAmnDz+k5g%x%x=P_C}3446;u1fJsLTL*i&8rFKP zd;eCs766R?r%%s^%q6_!8^-L%_=%h4PBX%GA^XV8?NO)DLd+9LTI|&WU^R z^Aqi0O)uBd{u)_GkyjY!gG*?yl0ccOH-n&MfFkAy94DRzxh7Je`w&_iI=yG9UBJ%* zLL>vaO0$h;AqZFG$Mk1=m%%pguT6*MOT1et0AcFJooX#6f;sDx`s#JI@wb63PMZyF zwW)OlujXj-9UG;&%iD*itF}T#5CM4kOixLyjI&Kco*#+W4SwR(n~pM-a0o6Y1}1ZC ziXY!B-eYWp*qlpfDH89!bTRa@f>0`C7wptyIM~zYJ4u-RyJV7J0}F)jZgZ*w#B&0&0vz-! zO#dM?9Rd@{zF~o4C?OP%Y%F9I@ugeZ#j4peMWWVg#qRb-0;RjgEBoY< zrGn8pe@h_@lS77gaXWE)HB?^Rl8wA<%PyLmz<-pIrPZCjXJt=ECIX zyUEMLM$HblUF31WI|DW(#c~oB9~&_p1__E2*V)+xh03Q)!h2r-P1#-Yf|93^pI+s< z2+`@ev%+t^YGH90Fl@OSbjUD`45hSjd1MDibe~`syLpDC*7zZ}?xfy=t+s{u<^pRt zT2AX9U2YQqlOmum$;#-;|Ch)~h&JNOJ(N{KonOcX()rO{K4Gb&ZELAF7qitLd&l-_;N`!UB7RN#>*L9y&D%D1K;?+2gztQ`kw~+ zl;ekxqmHS|pvH+-eQQVI%vRE~XQyx6+fb4_Qr6>ja;Y4(@&a5f=9$S8le~L@4Z?pO zUt7y*cY;e;%#SS9^Lrr?bBH0()@IS-tXQ+MkMLMkHrvr}0Q%})T(V!$66PA$>rL^z z{_@KCl@i+>NU-zNIHcNIRR{DUGE#&|q_f}MSNLkaw%q6GvW*%BU{q%56H85c3g%87 zJ-|n8I_grhQ@?r~bNX?wlWT1&l5t{-HZby7`1pc#dPtthQRj9@Vc(4Tiq+_V08F4h z6S}zqG4u@a&&HROWVcJ5HI(K&r*RhW>YFMs`8BwtbI41Pembl1ei__e%m5P$0I(5@ zD~?4_VTnjD-0!9H?n#Wtk8Pba+vRz-WJ9YRvFat?BG-Dk`7Zoxw^E_uE>LQF3V-qK`0J+sTC(lt_3@<00LyDmY_sDv*ycl<$ z@C^4U71wi?RqgHXbkco;w#gbW2pN3Gq|p{pYGKMzC_JvlN~=gx!6UQxK=z3qFHH;%M=oi9QNq6V^wg?0c3y;U~8ApNS^0GCQ}By#wNES_xhq<|tg1 zNj!QPiinVd1wh*?;oo%Bkne4MgR2ZP{Avr!ID0fZ6lFV*)v&10UuLZ(b$I6c2bwLs zAHTTs51Si51;oIGwbe6k^OFpvrrYU#0J^%fwtcd8G(S2wY^U zCxPG)!Y3+xQ#0XU$dEt(iRM@!F6b;jN=DNLghKET5Mu-IC1exJ!E4o{zDRH{6b;F9 zv1~4HJe_pBg^?gpm8OU{`_Sw|uchsjv9Z}=>s+jb?B)nPn3c0PLact}czHr5o>~`q z+WsN56#|Q^yeg^qv531;P*FHc09_x!ETOM{=y%-3-2+ZdvN9B1(LMVy0!Ue(xuJ$b z8dK6ON2@(DDCoiKVd{}6T}S0-LB;k61EKjBL&V9%ap8kKhd9FwG*6HQrTq6dhO)x9 zMi)_bMKX*r3`Elk+=VV5QrNm{Ib!Ru9uMV~TL`_2LK?GI<-K$_jYzQsQ7DB{x5tK+zO>4?eNPh+x96eAYB4fzdHzsYA#vfn zWYc5KahJR*nhRUF_!Rme6`g04U7dT#%~PO;lRuUrj}$D|z?bY8!pf@YGpo!JqHhZ_3Eo;SF9zV3himznk@I1nkYuoEP>t3d(I%->6_ zzQbz9of)NRuZSUwiat`{!>kp?)@u8~H5|&6R^Xb9Alol|ixX z>^?zJGw-^vh_8$w-(;koP-ux_91bm`(@MT9ayiG*Tbo$lE;oh%BkD@kN=#Qq82GE7 zGIzblLz9zjPl5Mo>hh+)7XyXo?=;yF10ZI)L}Rd@sPoI!;ok&fP@J+PcKc!3;-q4& z`(Bi;Kf!eOMrXst`zulH$Fk|>YB!WaApTR-Iu8c#j zN+nrooKMrDps^11XYYasZVUJLp%2KB%~+9Q_&|6VxKNU|R|||{)@CsPrNLrUH`g&l z{`jwkwgIqk>Z|Q`rU2fsX`u>y0I__AL(W$Kv`h7QC)*Wt2ahWp-4GP_ZZfPVR}Xc8 z-josN2QPY%mG)Gp+ZFQhG7ZwQA1U6itnTURmiPYG0*g1XZAj?-Pv^<5^s>R%C4;#E z-o&o&6(+Be+n?V-t#PZ1G_0U)>$aG=N2lPp;C`^tC0BGIG@AE~|NBsEZz*BQSxbOA z)7yFpeeeff4YihYE`PHwgl9vJUd6U=F90zRUoa(}4vE{$Q zg6LEau}g|BP`F8~xkbTqyXzn5=O{Z!Dc{X@z@Q>K@Pn_G=>Z^YPl|V;oF-f`oSdV^ zufCsi2^Qh?xK6ieg|&eyHX8G@*x^8wL2TMdKj-2oXKhYHSA213dB%$_vA8B`)rDo~ zJpMm~Lc?K6%?)LR0RVnUM#aNy0D5eo0}7kd#3l+;_E@n&q`eg&^vF&b-Es^;tfH$> zm{octeda>!tE|!#2D|x8c{pPVLMBac3?dqx<4@-tn(FCz@zfM(6j6)`%R4qb*F82A zKHz0j&v#49r)x^9l+pb@zZf8NF~Xj@eDXeAH;W<|JZvQO#0`G7m;!LQ15{x6>K0cD zKD_JP?em#j(ikQqz1q4z94a6_FW(hZmBW$1R&fQq+_1;jYNgm8|+iRvV zq`v)G|FP;v^e~7#8euvuj#;IKJEP*A%P3^#U7TEM<0G?j#SA3NmDoTfz(1nxS)XhW zACPj4Z7~@z{K#_pkr9&&FoXhA^_%i_AjXmcIHig1-b8q~=#^vbh0)1?@%N`$4>oH_ z`3?W*?-?eUw~yTFli^k`nzfMS4IH~$e1&8I6dO{imT-(!G^8Ax-8dWwtQVTSIkzRw zbNfx}p3^n7_J^i4^Qmg#uN*Yx7p^D5szZ*XkH)#9x_NS>(!{J|9ZkLp;cvDl)d}s@ z@iqStih+TJH8v1SRG0OO-k^PPHRjP8(I4tKb{eL zUyhivA+SSrOF3JZi)(8c{Zt%IsGV9J`7H!S4d4oZa^lk6k7lLG{NXUJ?^s=4YZ`J^ zF#6VnR{B!H-ZbznR2dJnLi_ox$=9Y9e$eFKo26lBLm3d;iZS+~QI~t=38U4O_we}7 zCJmlct=dw$Ip1j0M_7c`Sgd&4Rs5m$NY-wnI8UL|v@zL!e_(nY?{s)nP3QDOUEbd6 zG&eHqIR~!t`_m$G3}5XF$o4R$+_S14>mhPEqdoigN~@n9w~V?c#KRmda9B2ih( z^O^~3RYI#rQmqVi2|2HytF@B~PW7|Rp3sKW&+NSZdJ8uAH%cG3d4XY-h#F+iiqM6G zrY(+ak|*CX)Kpfh6aV&c2eR1FTa=YDd3_c}kH!z>q5961bTaIW`iNfk&m4n3;#W6^9iy5> z#7r?%^tT17UV4|(aAoY?x)!G2<81YYpuvAH0(n3yoKbplh;&~d>|Lx%dWnOOOfKo1 zp`_cRwGYa`E+rOp1_nj!x=@F0P|v$P-9|o>0vCL!={3|Zy?m>eNQJHIHEL=~CXJYP zCwzsIV!P;O)#u0dCXdc6@I{vX#@$EIJ0%}&~iE(2B`7VhR>)a;c$za`&X*paW~)TRo^ z#{@ae03wxI|| zKR-W47<2UyRFd#NWQx=S8OxP!_C(1Bt|^+AU?N(hEOWfVd!Q5~0*?p`)*MWN3jT*s zDKv~Qqv2l^LUUd@e?l(ky~G5tlOv=pca?Z{G*Y4Peh)~%K>@6DLK|)BlYBD(hGBKm zVr9_EqjAS1rWiClW*Cv4n3?v}tg5!H z-4LA*S&y6ojzHhqW%)$2eQIc6-oEg zG&*b(5Yn%2n`G-~#fJHfj@7UmwR_Recwb()w`%t`yBs-AZ!EOk?DUn8=v!HPi@D#< z>Pg6vN%0k-d$|ota9oFmAx?ZU%$`mig0qCD(I23gBbK!3D84`C)#53%4;ived&wsN zzg1j;m7j!p%E83CC(@84kJL$i=zvt~FN?n6AA8;Y3m+N) zz-WjWlAjT|3&HdfnnkjFQTB34Akz!^`^C}rE~8|R@Lu(%?rWHn+mT>V?(kXixkzhg z^k_!>M1{%i6Uz@>)I zo&P;WD(p8l1J=`<(Ry5r+~21|v9%ZF>>5J;bHAz%Ccm#3j1gy?PsUmaRNGou-kYV` zEn%cmRenWV7AAf&57>)kEjiXWiAj$<`EZv%g25UT=_%cF18K{+#qxQo_qBJGqSz!# zuVXbI#k28=pyf)}w)s@0Ckql)zC2kt$*^Y|Ilxw4>0z!9iD$S zK2V>;74*^-ArEA@t0tx#9+{^Mg zJqh&~8%vp(Y300N7$}Qo4A_|zoqMvH2L0kf9evOlwn=O6kS(%PBl!au0>Bw{>Sy#l zX{m+9`;;j(4?5)k41U!Z({o5p7-X?5gbX|E5Io^C2;zss27}*wA(pu&5Izl*In1zM z5lpPO+OHEtq#20N2wy7#+D6e=z>JCeHDt4!vmC3yxe+#HFy)Uu(^@rqWj9mhzLL|S ze3qj$m?&U;M~XmR;RkWl{@cKQK8?uSJvXV|_MF@!{iAX@+7G+WJLtJlb`Jl2ZJz;P z%47{JP)LfTWDQZxC@hoo&8!lrykkk5nU1as{5EZ(**TCc369KdzR&up1&V^$`?Ig( zvv=yV$}Nbb(@2@M6Nh1W<@6FpFvVUP5p7hi-?d=~DCCo4AOfQYjeLs5B6SW?dm4$m z>?B&`ph?d9U0CD$siIGx1|fTvr3pC81iU8?`70J6>43oy8n@3;Jn}BtZ!Fw!$;f(b znf-29vq*bqKAOm6SIWDW@?|daJB!pB*m224I083a-WUl@I$X7>U8eWo<B*B2?6bb1GQF=S!rT%HG3JQ$N7q*$XVgxdl)<1v@JTTEMHLKkz68tO zf!`aQxZ&{GJU_ywMWAeN*fIYqm8#eD<`)=SGb1gAPD2J@i06HorPb&^;lyhj?$aoX z6Gg9g@9w9yp{y|-vYNcLQa7Y2u&yyVf3~b#dOQ4XeCn%^7jrUd&SRZ>=Jcnam6JPnN1{2yGkrqi>w5H|#L0-{!vO4g z0HSneT~z$Al-~UAjV27(vstzr2 zeUK?ubB}E)!i&1PDZwGp+O?fu=V8hmLz3WHQ)XGbxXw4qb+~T1-+zkD85L!@SQt*j z?0yVBww6t&P()HHn9Uy}5&nFyllztQ!>+sKB_1I_3jhsZ*cYeAOD$5{2mnm&HKv z0>+X7knY4>`S`Ipt9IJ6ou1uOEO+T>MJ{dcG%t`~9_xNiNnXUFLz8_rZ}tMIYp(jt z5|MmI$wnay1DTJ-JLABk%`u{3>f=lrv5@YPX1!V;dY=6jxl`}3fX4YhLNHFB3^o{v zOchSo--W3yRereHK)$x+xr!OxqHy(mKV`7|;#%IJvKZ1GB+qfj`p}s4#Tesv0U}ul zR0o30g#Mm4t+2tT_4W_MzDY=<+`zxqZbT=uASD8b z;a9?CSnyjR82mdQFdFRwUTg-6LqiSZ%)fpC!g;Ef`*V3UP7`EM3dXf6x>6a0{!Wy_ zdE~Hk+a}YvBUu)8XBYQxu(_hN{pwzyo{S@#cz5Yy;y{tNy$XqN4*k5fW5z)#uZ%yx zT>r?C9L;v-*(zwKROX)TW`cB>T_#Z6Nx6DVHwpe(o;m4AtBr#Pap}P5im>fzfa}lbyTH8aP2fk)Vrv*8gfL}Op0DDWdAmc$W2pOe# z1N;7JtxwB*9a2=?IeZm8Pw z?+}dICW7!h-TqPzd~ILCR4@opd!%naFL)qd(pnrNSI`a$wr)RJ{fE#63{2%GeM(ls z8^szyBr^){BrjakgeDJpBDyo%yO=H=i*~L&$GY{Ec$*iBg}uR2*vUV0A+C*c9zZNM z3N{RQj6*lM<^~nbAD<%ekLkjjw$Oe{Ai*oC;|nA$gF=cgcYgr!JF;>l?9ah>?hO-C z*e_de!;ZbHljp&&)a}79;wAQtAq~7T6fbe)G{-a$_sn?xs^c&Hh-_y zw=al$dsQQ8?k*e%t>oT6HAY?h{-KfiO3$r7V{y03I|*$GKigNcR8e`1ZA}sGA^(|Q znhmz<^X}jxCo7p2tMc*4Iq96l%d=JYZQ*{S%YL|!YqA4XFMLE48EPuBunfI;s1rSL zf^dguc7X%T8Ekw-;7sU)u1YxmrjoAMk<<1yMHa;Dr^2B$xbMUSywp^T9~BnQ=T@o! zu6QI}00-hC0f6xsOps6rzU;|?J<8sYy&l90km#JLX&_~Fer6I^w02Z)!U4BkX6jof zmDN3+Eeb4qoNTeXVWBJi`7$llMw`4+;-`?Iz2%^>+?qsPXoW*2+J6Y0hG6ID>i=cL zqmZRWCKmc`jh=64k-+2=N=5EHoHe6Gs#hpJ7t$C9N^(ohj>CiOcVzP_K!F3WP0SEd3^r+}k$#NT&|3 z!-|GdorT!L{s&detnXsN9ThV6<;U>gs;ql)S*FMS7x4YN1w9}E00sLk8>984j-eb- zJC+cgCnqtgz{=*i+DO?7r}6s;2Qc-_kiOZ;V!zr@tIWOr2MWjY;U7XL0N5jg6-E~x zHVJFU1)g~m2H@6&sUJV&A>GOII@VQWc|=av`Gu0w(wuElm}1GmKJirPJRopaH4pT1 z``10fn%B53YpZEHO~WCUI(J9^ezx+vl=E;?FMJc;k$%`rvwEp5^S-k8~h1J%=Z{2A6kg!=dE`-UcuP!c%Y_ws|2`F06NjLbq zbU6V(FRN*y_3W>Vs(5qGJP@mJ!~%NEBbJ|bw~T6soYJujnr;Dz1dwEVVwmHSZn3bw zlO4p0SaDOsG3p;AwYM)>@9?tTYx?XXzvR%x%1{tVF=LW`sqJaDTQg;S4;mb@<(TFT zic-CNOAX;NP#;|ezVrdlfWS83#TFXyEpX-P_uCg8Z*E9%QviSzSygKy9|trP2TX+R;lDaPlLE%G9$uuzcF+u`9c{l zJf;5r90=+(5UFG&ssDXr$NZ5ro$jtQmzLMz=qga~G2iy{{Ug&_UO@av-!yqQ5gGtV zVM@Bg+QNn7shN#_SsZPs#8Y>qNmtU*&->1+N&<;vyz~6Zfdn+!f3u*9b9oh%_JHcA zjRYw>kQ+FN4B4b0{7IIKm@Uus|Ezf7q833c{F#8W8nbp>XeOO$?;N#ZC{dxuCw>UD zbZnoD7dlEfx_I>GI&PpPwIFAa%%Y!kNIi#rV!(@x{j#Fk%*>2jhS{<1qi|C7;GFOw zKnIG6lMP5_4pmSZ>I@~976m}TG&BM({TN_uB(a)NAM*)DbddoypVvJ9amJv=A467iLV5apcWR1r2 zX=39a+Wr1c#ZFJRaX)JnE!S>82yN1o`5(WWR?Vr*tpT6MErbb|%PuPybe%|P zbMK1OW+^TWCGPP4^6(ivvlQ(3>eOH78t4gPJ?dLhoa1{Dx`xJ z{5%Xe6Odiq{TM8`)L(8rakHxEix=$d_+-UmRedWSa)s*@K_>p1dycpm({P7F2+fe= zg|s7fs`1K^*X8}0r!}%>{p0<>Fi{Nj~^x1I^2)2k8BUajv1%iyX?tjoH?AXN9F)1VL6SnEwo;;tYOEqdkc{p z{c=TapJ!~oltYCrM27{}NvM!&h9HaU`GfHU5ALOI1hb{{`41sbKO%N2Y zgI;3giA(Qxx#_(guN4#EUj3MBJ2G$9(Bc zSEFfJyShxH;eS z;v`R;oY)lDh|q2SEQ=5npjF#u`9|aWWdBhIJoFC)s=}kLlf3~hvzyO3>*e6H?#IWO zGQ-q7CF*9fur=u&Ce}C0x|p*^KKs&-goeJhN-~(V{wyA1=4gy_#$MGr-H_}uIRr7xcwLxGmnClgz$nSEP zb>-t-qM{{zw~iHD1q?vf-qJLv?pfV6AhXH5PXZ`&F`$(=367M@nT*as^J-v68h8Ub zA~>n7)2Qybg8m*`1sWXJiBSeK1M=_TO5T;GE~UI$t+_4YgS%K77um8=`sWjh%h9(t zn?^tFt{|TZbfNCE`jxEQ#_jQU-c|9dw>LkoYm1&U{BK=T%eHUNtz@ZVP6RVFrz_qX z4Fv7tRgU{o{T+^&KT3EQe@YK;S}m|Kp4p?CqN}BR2}KeO(KZ>`!*!%73uv{9K+E|1 z>uSUySGQs53rw4Ug_)(?9eyCyLjds4*Bu?;8D=^gBtVvbkPy-mhHhC+ZZne)`_FOM z@-i}3Sk*C-*KPg{gISz4S~@n3y=JASk04xhhl>!5HhgS`;(H;%28}_hVhdhzjt%bm zCBiJz7Y9QUc-ybf8E}MXjdNNnCIWnw#BT6Kt1SZv-c%cSvvh4gV|or36qL3cd)D}O zKC_0N=e#zTUoY=IQQQn0Iisk9U{SVoN}|;Yjlo%y2`Qj>HAE2qA=D5G$z}FW`Y_08 zj?e>jiJO%4-7>aj6|nN%x%nX~ny%tfjMo(jJP`qb7*ev{fkO8tgaim&Y3r#qf(M5K z1nY`%A`C=yU;C~H8A&xpEY79cy>*#$OwKK1F56sxMX3R9H>o>M?{I{`D$vm)CvfYV zDfM^Ya~pHK8=4G3vRbl+Pzc4q&M(oi(aZlOHNv2)UtyO>LQM!m?!f=qLD~?3CN+8PYK&#=|dmaEJp3uwuR3l2IaFjW$}Zwr;=>EAjM+ z(6LhPRoXDqKvbn;Z73hTs6<59`eN-}JZoNl#&9oJ>?^Q{K|$Bheeb^R%oDw=YYhrq z8&9cI-Vv!}0(A}E>D3LH?>O0SOK#rnFfm%?*vtbWB1ON+$ zVFfnHJo{T(cUIf)J!QQ7T4Myls%!0iW^4O!#K-1IMC!f60MRPNN@u9EK6K3{7jvbC zxBQFv5WhCnqzjk78{(*OX_Q$lJc@oPY4EQDY!;sP1dhzO9U7D4-|uIbLh?xj&rWmX z?`SY1+|MIz(^RGYXewaP<1=R#q*@RIAoHx2B8j4Xc?w&oG>KFX;<#yvhrcD-f2IC_ z0la`uffGx|F&n^B$SO)jRBFUbHU!nF+w?d%yWt@eRu?4|D?{zdiYJe1N)mp*0=9R@aM+L zHz!-t0%-b=fq2lf%$sEBu!%iYf;5(^)A8ws_Q_>u=-`vtc*v%TqE#)-l=FdPZ-^s? z9sypjftAY|0mo~=1zLE3A}j#FK>#H>e#DIb!)A$+Zas0)B}yNP*te)9jL4Ti@ut4S zx7fFZ!*bfR8L6+wTlKMYD&C91swt9_)qj)2n7qRmrm7)_G~nujUjW&~Ln$X}hgHeGtOj1vswMc|n(}k2J_Z1t?^FnAD%dzlT)~KTJhWYvh!( zk5w`$-s$d59B)`_(&7EJS8aZC!r^obVV6zROFB9bTTn8Apji>|525KGh<2T|4Hg1( zo_&NkA@U&PpI>c2;*{|v45x+xWZFiuW93{sgc=qH%FJ*PQjN(O-j=BX#oCUAjqkt@ z;St)}e03~85oX*_ymFnc%AINSOyepta)7F?d^ns8QgBcvaUkQltr+RLn@LHnTywxq zb`vZyd~t?_wyo9(BRw_}Od^d^>>Y@8=xG&t(?I+T0#<2R<*6B>=!M z!-X|UP1@`+@j{Qg_^)gs)p9iv-~a#2}0WmX+_;y7l04*49J(HdR2c_ms*Zoa9K zli>}Bjq%FXl}a6f)qVAo8~h%3Om~r>etOuyXtu(q+AG;vyg8))kI=Xs1QDpcZh?Zo zF90s!ggXI13P-VWY;X$3%)Kmmf^ERx(1RiE($p<~+Okuo64x}_nd^U{WU7Ia1PAeq ztP7*6V3UZc;lK4^V_fK_@Re+&K|c-I5|a}p!FwRSuH9e8<|ll-pYL3#)SG-7NH&-h zy{@g&_n`+r+vbP5uR{ zW{px*#`;2gIB;`vR+~Z#m4g3=;ogoKm-MM+{(1EF&TINVUQQCyv26`(-&x`@;d5#( zGhaL#008Mw5)F`NP%|r(WnHY|XIbza&aKjA#=%L{OI0>sq+pYKnUu?ff9zUiCTxsS zEVsmp6X?{#jkuK_l4j%4XSJ!E!?!#u@EERRjtW=bW|Gl=vr+q3Lf0V>4HBzEpthXM zcL5ZaaG91!MN#hCA>tLp_pIRBs9xRom&dfv374$N$QW%PQ2R51C6CpS%;tk%WT6ks2abGc{Q-UpHc=BY9x}5lkrTQ= z)-#nO4QazYRg`b~Tkk0MTWBEA-0MXmgUhJU^sdJZ4TeM()AHJ)w5>?K+It$&MrM>u|d)GQ^C(}R9EXCLKgsNO7oQ_#Q<~B zas|*LCymkp3VmSo47!ZH21VPLGM-#z<^QtaKviVj_kSthHU?L_UrncGLMv7ZH3D-| zTYkFvNy?=Cav!^>ydWuPP%8fQ#?^iBoyp6@%IL#3wF&huhwEbNZA-n@K;`Q&f>E_U zqgEA;@(ksVcZIPWe(7Zg+)MVqgz(&y07%n*0$Z`sUH9TiuFxQ&Qgv(zS5=i;i#!i7 zE|T4GTwu=xaI4Mc13dwl4BBU_??~qp0l#7gmEbFNvI|){vAY?ioS`uE&ppD}@do}J^31a;qqO-iFxf|7q4&B1jPiZX*oQSH9D{unCN?8OGLjj%@81=!*fGp+V?8h zvd2n-x}LNyCZyPqXbpbk%ti-b&3QjU%jzz8Q7aKgv7wd!zM&N&6y&Zwr@Oqq(IWvL zbG=?zfHtpb0FXePI&5G~@yOk>KN+U2Lppj8S~hEX_CA!4?Z4~L6c_~1TyFzK{FW;u zhDmTx6RkGb46*QAvypm>UPP3cV$Y;TPKj+O>Bm1hXPjJ6ZebnhCO;_eCv*W2qWC)K z`T~q_6zl_*=ACB2yB8kmA(?s95lZgmiK9T^n>~%m1BodwXp#XB1sD)3g+X(oM;|Gx z0xBI7OB!g;Ij%1W7MZkPQJE0Joo zgmbI-ynIjI{friK*CL*>KLarc8EvapX!v0eqJS9GELeKkpxsGM+7{Dx8b%lgV(*Kv z!n64f+Une-4@Gv+M%?!R>;qoAf$V5O{S!1O2<$>)%3D_+(tkBH3jw)lpd-O3gU)7- z;Lk>?i{>L`g4p93ISzHzoKDI9qVY}eC1}cdSEE6C@<^1UmA+XjrCM|TgJq!Y@rxz6 zBXQ+l`z$Xm_~!Q?Xc(K$2jEurOMT51r2x}u8gpKD#y0TbbxlRzL|?J955(#+LwX!WupZ8Y0-$9gTOn}X zRlBtm-K*s(-(8_<_N;yLNtoPQGt5?dl*&&5owuuOOGR82?pRD?erKzArME;Y%BYTJ zAF>|1XmzC^SpVw6HJZAgBxVU||Ed>__h(vw^T5RcWKXN$gZ9}>O5UaaDA;Z!!Opj= z_Yj3)K@4B(!Ue04`m3RF-s_u5Sp;_7r`KKVG^>^A!?c)$y0{rDhA1WM4@`Y2$c3;e zs&<$wq`WD}}HJI#>PopkDay|-5p0tWf zT^}1+(D+80Y6+8=DdU}#^&~e;EDm(L2*!T%b{KyD_8UltNcXhwUiSGT;^u~f&0eaC zgU62>%_~snpgduoixwI!;|FV8#`SFW_0(P*C-*)Ixs^6s(UDfMjEuJlR^-XM ze#4@BrsJ8WP&~fW{ET9Q7f@N*A-9t8;S9t+Aq6>6)GBsh^NU1u_#=p{D0^{QbWvxa zwL)#m0|UE&$cDdU))KrcFm~{Qqw@S{0$^4Oy7710rY*8e0sj!{4}omf)gGebLFXjz zQWm1(Mpp|qVk`tnAK;yuK_`VdPv~e7Ah7t;gk$@j!AGfY6=YLJip2qqjGC$@b&C4b zeHX)T4HvtgA6_TwQLJse8Y67f?paGEzs$5&$0_dEdwWGB?L#w^`WHz;+jDbhV(aFk zc(v9(#;eZC_5n^KH#NSc(e2<@K1aOq5B8{y+I$;vK$2Z_;!I^ft>3Rq{XG;@maN^W z@Z&-GW?M^dH}AhksBO7FpC58oSnWEWKs z$)VH+7Ju}OSdlypnc+VKK_UXcqsw}uitXacAv)U%7u}T-%^9UBu*S}ujv#cM;bbf+WE0tW;x5$q6r!uhj)u#Y-36({YPqr z=>(OsaY=yaqYnqOnaTxOvXdoRZ+O5N=Cp6JzvbDnP~yO~y$-LxYR$DVW`CvIn7RxL z_i_EQPYR~nI<&dOdtdXKfxe-M&I95zxi%P{~r%&Mvr$LYz?Bx~}xEh#r5ke0h53cnr2HMkR&S2rZRD9HI{G zfR&gcYba8Sq?}wLNAkS%Gg(}G4@csq%~{)MikbRmr~g44vYyv~MQJx!pO2X4uA9{9 z4`_n61V9mx1_hlKIL(VMJz~aw==+Q%9VPW;IE6533c1EBt_C~l{#_U*zR^(9bBK=G z-+q1c4lmFNDEiwK@l?{Pnfdzn=BA*B<`}DIr6Q}YzT|_xsJ*Ut-{ei|B+Dn)TNE(f zbb*;o2?-9s3>L?7Zc; z0w)VZJhU5uf4i{ZYW4JZpENXfT5)KnK0Lr{ZESH%)TH>J|6AocgCL?sRuA9^+$6|z z7=Y`Ki=`Kka|LI`6lWdB^s@p;T77Hay-@diAu#DjhIOc~&Nk3H4n~vyPSAQpQn3-Qg_42ooqwePlh%Jj?GMx-$rxU=Vu7!i0Nz9Kg=$^vi<1}luL2Q=(6ey zM>>FBS*))pqzYu z0KYcPWi2BJY?qYTi+vtk%)wCDbxRnJ+y(TQ!0igq|*+cRpa|7(xn@?jCDid))h+PB2WXr}g(_{^$qet$&!C#yEcQN;dH-Q%U+n-S?; z`m&?ROs9m82bif$?#cSln?1!T8^h!N3bz+^k#IM#bxc+`Xnm+!@9Kbu!Ic|930w?h zMGRUG>8V&Gp-aG}F8Om2*}gYC^28L=en}`%gIVf!3oqTwPt+r!gdxpA7p(>RMrhGJ z%@Y1tmNG}77Q!ClU~$3xlh$6gDyJ%kK^@`3Mx97AMMVzctSFg(Mf+51x!k_TIjMmO zQZSoO%|?ZuqXz(pE7=?5v>lfCBHq<~x$Fh96D2(O&lw9b6cWkQK*kOL5EggnK4}KT z>xDbUvO4r%pkCe%N7)kZ{sx4u`T;iOlig!5$a2g>LnZc_TUptK$x?qy(@Ds%7B*#b z8Bdg%#UZE(Iv?y;?BT=oeu&P}S8k8Utv=WgGs@BTxO$j(8Kys{eVNwp>6^K<7nswp z{Sw13Bw--+t6KGa&W5qtnsZY!SPK@t6jj`0)0Q;3N^(iZ9@3qgOLUTGHwl-z)q>K9 z!{(&{>IFMyUSa8qpUG{dzvigNnO|$?loE`K72sS_L5g{}fn~wmRSTvYFcoz6!US*p zr@Mx!edgemr>0Hj${dHr`qw8;hTBF}?|wx?3j6Ht5Wc)NAuO6YD=NEmonNHhiIAg! zK6C{-88Na?!KI=MW61|nx3c(VTT650V~l$j&s9K<7yBfFDm0-eD0dVc<@@L{^>88l z_ybogawIO6Ic^nfx<9Swu)Kzg3ue`3+-G5Kkdo2{B5f^D=!FFM#(B>L#cd7{vF@m` zF1zEx!m_&=denx@V6a3%)Gi*pc$dXOT>m-%F|{BGjhl7=+{xGY1t8pBaAB>xQWGk+32Q?i{qb=yr8UP~@Ad zQtUEY8!xwDXw9x zV{Ok+bOenob4$Pb>y)NWJW=jf^h6ZRs6_Gmcsw1B-I}Kd$K%iW%Zu!{;dmSO)spzunH$z=!YFposVS8HQ z{of==fv+>E&;ku{K|bn0xz^fs7gN{PvNb2QV>Owm9#v=DOZ z&thd_1a~mNkAA=zVH;ZE2>;@*SA5Ay`WAon!RAXiBtJfqqu1!CRZ690f4H}2;D!uv z|4+e(nFc6N1=33iDqm7OHe!?d>2)H480I`HS!m7KBPC?(2c1G;X`tJ~i0bG{8TKtt7tx*%s_2hKnz(sZw~$UN-|-G5;)zub zlrgAoLrVe=`;O+`DVa4zfR!)^NRqLIzNZke^}m=JIw0TAo4F6h*&W@b$%yBDX8hvHUo zzIr#N>kqrUQ^)d|*ltoi>s12RO@O`Mj;Mcyg#q9YVIcn@BnScVmD7L%5&w>V(7?$o zTs9s`!tr~9E8rIC>ir4Ud#{u6%!6h5k5SX=9;Ipbb1c-b!D`~qw2m@qXRd()Oy{PC z{fzO}xfhmKAUT?E-(xVAg{T6VWRMNbz9D5aA@^PGZ6j@I`Z6F?Rj?v)}`~x#oI`V^DcgyduP~mD)Wx4FrcluW+4Dg^VUf zhOvGHgS5?=-9HmwLl9r?ZNIb}+nWOvNwZOdg(1PgD~sh5UDLZ$-8k48!xRyk_FyY3UNuti2(e-1qK1mJC{Iar zc*}mda77X(`gn7d=+g*u#Pc6WPKjZf{5qG$Y8=$DJb;z@w8Ly|ENKR}EM<%GjLLiR zUCe3`EjmHV(Bom$b zo-oZ(3t=~5@d90j87{+HWLd%qJMRA=LS!<=F+X7aI0 zO2XhJsauMZuC0M?nf61iJx7lMa`~O%%FkSC>0e4Y$*}HXCjdoP?y@yvPLtO#2f83f zen-7uCrcg_7F{W;-BJlt(D7yfJ6+YLzwkxxF$KLG!1o*AhY~n~5*aHwJ1xEE{>lQF zRQ|+h^fi;=TI?UrFsl{%1-y^>sOdnn{hO=hWwfEEyTa3vXyb)Pd-Vb@3fOSCrLUKQ z^_fR_s({Q*)uVYuL)(5++NLVm0X5zdEY;Cr4z};vbLLT%vhU-nlEeaW5$t6W^#F{?lQ7b$+XY=MS zN*2sOj4`w{1k9qxdABRi7n^WkMQKtYRe23uXV?P8z9`?kXOqWIyUNq@)xQQP8Scsd< z4!;?IE3O@@i(|{DI}naA&xYkwzf$_4W-rZBwYBDX>sX>+DK6g+09XbIb^9KB6I5Dq z-r!Bpn3xY@LCB8C&ri*a#^F$YYsC5S1_bT}p7)s;7r6WezHH`lzOIRbfkl>lzew+t zQ>w{og;Vt+hAXpJ<(oD(QkP(I#PsU@e5aP(KJs3?3XpQ(vuu_?EKij4#hkw_n7VhP z5cv$uZ46xLTzk9eBl#-4GuIl}VzO2JXJOZBg~|3c1Jp=X`iD?3D3`-%!)y zNN`*o(c8x*mQ`*7DdWohi4K=IDT)T99tr8y9ZAyV0e5B-N0(68KsK)oBDOWe_On4c zm`@cVG#nOJDFtz7UV*^0zzbc9^j|E%CEC$bprEreJo}y*cn~U)dZfgaK_W@82(AfH7fLqdFBt`8MT-47JTF)xzC5@uZpPt>$ z>JiCTgDjZtA#VGyBEbC5?}2IX-)NA4cLWf9uk%{#S0Cdaw37`Y(531>=;ow;y-A~$)DWm>GeoiAdMy`A=V+!p2>pa|Fqo;`Z>VP>UcCWFs%aUQ_ z>LnXS?Wj#RsknnQzSlCen90H+scto9s#iN2$r>gq2WuOOlbn0by_(OEAeQby%H&Xn zrHFt|whmXY^G%T1gsGQPa1o^sm?97ed9^;qCG}Dq=0@nRy7K#ByI0(=FpBec~RXPKz{DlXrGj~Gx;tC4etS(Mv* zvqd|<0@c1O<8&QtX;zlJb67IrTx4d@COCK-wJETh>0*V+S}omt z^}R!yu~&C-lA0)9M3zk`W5?+}baLqh$3Vy9iz*tP$kC$3zZwEb@Yr<>_D(VT1;HKY zh2Sh>OO2dtVs*#=WP&=U`Sfhh?9c5JNpUmh9#u>8{lSBKL(W39j@zjSHBpm%w;ZVA z_~2KfEyR;on^}+V4t(QL!jerz#@x?t*M}us*D=~49Z|3HX|Ci%@rd0T;^F48M zUD^9gFWy?}?KWb&Wqt&>Gj_T~Jqu1$QuMPbn?%?J8D1i8@zxade% zMARyGaK;tN3Q~PEl;*My2NiXs+;Q&ZF);&_2isDuSl~Z-D@kr>t&TE!;IHKS>;|+L zRwc<;OldF0A%ZYttg+F@V^vG5(I~|uEd77Fv($khSU*R}{x#SBTYFYE5tSJwt#h*+ zF+$iR@1QWnlJfe)C4Im#fWs}ug_s`R9`U25qo5|Do5%Bp?;k=N01P??eb9X9i-3fJ zzMynif|!#9BB}QPY+OzI6PIp*zX^j+eQaX?l+0wKWzgU<8F+uu>8f2<%w;#EDH#~5 z`*mKG6nJtK=9o|sVLIh~4MfO*NC8GJE83zVhC3orjZF37&ptv5iwEGXg0>3qHHO9w zzQ^;B+3S%KKuQWAZMU>$J`zG-EHP3P<{(#*P4NsyJBO?`fQuKird8+n(^%EXH+U?^ zHn8r~Oid2n!ISb=I)#ST4RLk@+%)^H$Aov| zaptTF@U5-~a&;w0aW?(v z4ZNQezCQt6F@x$GGpBI#vGnRI`or0hyg|CT$FZXt97mk5j$6s7`#s$3y(<}{`jm4U zc(8=;2QZ4Wg79wDe^>fI(KZMZk2xh>y6(2Hb-}Y7V}Sb zIS){UISTopuCM8D-xF(DG5{`zAR>D*;FXG_%sV(t6tM=@jwy*A48bK!cdw2%37{BCd2?X3w;Cmw~D;< zY*k-HduGqp>@nh~&P=2B%&X+Z(A?wIJ7xXOxv&M6{q_%r2h0fIpS0(z#AZ_*LUzGj9u~B|1K)|(H7&f<|Hyu#72Dy zmBOg9it#KD=e*`#I^YumQQr-* zrAzy}*%X>dyFe9FzHXXj&iGL*5U(No-aK9SNR52Uz=~K^Ve7g z8R)#yi>T1ql^BdR2|FwbF01S9lCqU~z;yPNTU?Z$4F2u)GAxzfT%G%YluX*?#yxO5 z2l&APeCp6I06H@*=m8FRX>JM0?>!Qz)F@`*^4mCd-T>Qhack*M5I=<+?{2o znQ>={1CJ=DlTFqg1S^UXh13hR<6cYN_>y76O(q}xe|Ke0k*j!P%zh^SD8bJOtfABX z;yHjNmz7;QiBYKCisH7k;#skC7h0{#+-PM7F=UYsdp_JWnbMK==^i$npxcWyoSUM@ zrD@&2SsP|>C7Db-9@cpI9lE3p^_P$)O$rv@TVvD71EeN}r<&_dKI2;-kj(1}IL(ST zI__Chm`0*BtLohDeAz?0^;8AE2mk|cLl{BUOqgl!XLB8bFX{T_Syn3&@i1$TWEjia zNZe++9TaIDfNAVHK8%!P}`?FD9Xes=)Z?`}F1mI(?595q)ndUf15@;+hwA3}RUkZL;GL$uiatYQuf zLFXueVQ~27WIeroS0~KT;nLaJsJm);*z22*o`&PX3+ux*l?cPq)K|AL_jQu(L+* z`c^dM#nx4gQys{q_)isIm}p^h*65wV z4O@0-7o1B-1Y$8(`0-*!fV{%lq-mqRzf+$6#{+Oko$vgv$0osfgkZl+PyUNUr&O~1 zt6lAR%lTIkw!>L`if!K^o0``du9yM;o@0a;Vu|dBvijO7-xJO3Phj9*tZ-`MgTRj! zz0$LS$N#$jAU^vC=!*m2BJ)MLr2WkxgLUP&CB`Z%seg32!yp(EYdvQNQb17+{|9LL zU=W;UgZDiM9I2WvgN+pc^XpY<3J#HRHqFjSqhW8NL;DM=xdXN5kN#nVXVj6`7ig{$c zAOn^NR@PRAJx?O>0|Oml-5uh*&(&=2SUnq1%?bzxsdZ ziGpWHz}!bO&yg9q*#S@h+F?R`NqI@gBy6-92KY^=We_LXd_r?MdgFCLng2TuFolYI zec>zf&TGsBWtN9+{YT%HN1>&aUnS=}4KV2tHk07yRWF5!pMI)ak`xaQz-Q~hKfw%d zD@&&hmsBm`q2a5i01-@i17^qjUon(30&|(d*}oEEg@Al8*Q2ot0w|wGUtQ7y zQ2&Hm$Fk0kzmi?i#$q;h@}$%mwwFoO3E1^izC0eOrUz2FWocF0KGOOVTj~VZFQsy% zxVWC)@J;DhRV?*LO3UjvJEKSA z6hWks;EGn$_nwiU8qAZLu-u>Lq|(D0uYv#mfk5ELGB=xC)WV|Y5l^bE#DYr6Gps2tbp<53&f0V+O_$(^(sc zf0#+WYUf4`R4)YT;6~zx111Gbd%l96nB@MDx?tp39TQFfkI_PF{yza*B!}Z!1YdJ&5I+Y>5Sd$p}(DAab$`m~ZgYz)>cu z8Ck|rE=2BN)>MWP$*&)&kuq^rv$17qo6Dx5ZbuYRwU5!}X5~2lvgUY}*Yy(O5BV_{ zAM%9y6oSWm3AEt2POHrlHF3gKBI;zUz1EStM~``FN4NQYd3Vx!aD^JUvBXorzC#b> zS7inVxF-U54-4n@6yYQd#g^)h`x<0DljC_x=UaNb_2C0OfLGed4w8Qa`k@1NBY;3A z)tskrnP}i5fGr51viC%fx`og~=$Zw=X!V5xF$6DmQ$D~0yF_;>miwu*Q`Nee_ z#l~8glqAdZ#~O_L7zeCOU2@=M>{_75+t9I`+N1LyLf9}AFB)sbh#czN!9?Q_jy3i2 zUK&ZUw4xP}R{(!z441aNZMDf|V&$9b;!ejlmvKkt_)&i_q!)^-@N#)ruqpsB5Cn}) z(jAb;JDq$2n_b5)WGnu$YUNKELen{bUjdVf1eW#ws^2g+3_KCp)Sml0zb*~|4%O%H zf*RQaUW>hr>%DpigCu1@tgOeHB}GymX<0e?qy5g)0|J~(xdksuc5Xhw#eLn|cPFgk zfqJbH!!onNkFRq0@J*?0+qpOa1~;Cjt$_2}MYhdSlNi$LoXRc{lYiOakj1?#_L|PI z0G>{7Y3>D6cwP^8KtWD~i)BweT_K>5T$<3}x=~d|7%nkOxS(qMCs_>ojC63^X5qEX zK6$LzQkDMYFh$^tyJ9?-O+eps1;q>I9Pm<$)$~?O6^%7RzQ43frgM&#gt}x$wN=mH zW2Kh==$F1!Irv?bsGmWaNZ1RF;OSS2sn!T1jMl|}2oVH9@X+fI(GfO?g!<77g$p7t z@!2@Cx{be~)PmGQ_Sz9j+GD*Gf<0AlP^H7XCs1+F2;t<%C8F19jMy5fc+e&((t2H* z!=2_5xR60~+>BtP;6VTaSM7|)U-WF!0wt~;>H!&*FF8nlRBZw&m8vZfEz}%gV`@je zHH0p;ET|P|$V0wNGVgvs50ghBbMyf)R3wc4ui^^C%q8p}t=`i-ND?i0!}ml-^bT6f zs|r58oV$kVp-rZAS(ur;(z_WDmwDBX0*Y_DX*dgrS&ZYqw$Ef^Shru|%DbfYV{PM( zaL3Uk-*W3fQQ;Mwg7=@oU#i*pQ2VbF5LG|8T%TA?zUALSVu4c@(gBc|K)FLEmee%k z7tnv+?qVxMxw0-77?;yhjMCI-xoXDI7 zNZ-cFU8(WkMoP2@Q0lKCF`}Xr9o-4WdIZQbfu9qTLYFyK@UO%qui%Jrs8LF^*-E=V z2zT)i$by8rrVpt#5pZ?1Qkoh zQ=d|>Q|jy{Ce}o|{Y)!_`#q%x*Ffk>xHDZZ^w!Z*caFH=0X@DqT@gQ9HYg+t6@{9} zN(uOF`Ez8H7%D1=v{5;&O(&a~h&1s#P^29;m;Ie@Og3KsbHs>-}c9X2YL@DZpqnI>&@EioBc5bw!N)$OUtdlhCJ6nYk_*hpp_i00fe>Ef#1R=|=FG0sB&SNgXPZj}- zSZV}vXtWyum!i4a+2QY(1waCFoxVB1VN=3wl%)*4iJc#_sf zj0zgnpCFa}qK=OIV2E1z5(Lv8SXSGV;o<9we!Zei_S=LgFP6wb4%u%ZLgP}xX~gif>4=(BVw!j?lv53AdSg%E%NIJAMdhXzo~-BdHo zc=9ur#2b_VYi1p|!6T97DyOuhr4 z0bp*iZgcMgY;jE>(apF2adZt1b-r!*gk_w#_{+9!+qPY+#if&Nx3+9s%Prenw!L`1 zv+qxM-|M*_-1h|#oUPX8sVE24|uGmb|QEBi* zRCDk=qkT=X+46Qxqi&;Iq2!|+Xe0UF&3lZ4vCuB=O}g9n?-tnLWW_brsO>O`BDUl3 z!}-QiIX2*7P*K8UVTZIe8f66)-tah~?L3_8%;0>qRCRKJ6V$+XEMUmP=grw@Fz|*&pe`9Kj|h)l zjQYtrNv%tf2)3l{Fea9k!h4F@FA+eDcQfUMx?09bu&4STLVf@kL9@-96S{5TVFi65D#_RbUyljF zQrY{QYQC^2(ynM3@pc2wR*i2Q)N6$uYO3j&k7fCA_K~7urhxxuQAU`W+V>(1AEFy) z#KZw@^%CkYH@3kh?I;mWKb|Pg9S7VLTwVf8!Oel-H?oNn67cgUpd=|7pceszlGhDG zZizlP(9C{Z;{FrQYmY@o^SRWG9nHcWRoN-3G1Q&U#t4Ca( zezE$fb+)FZMC_p=e!6(sW31ksySUY*f9S=(Tv*9{N`*^63Cy?6Lj{n)vCBI&a?k9d zvSZi;jB~r1ula{M&<#!`N!@## z(-03tYSKXo2{8$1Mav{tEN`O1Yi<4*ZYcmAr+lU+A7P{)|5kA^Z6KfG>{O)=d~MQw z<4ljRcn=~=PPhN1PQxyKw{aHwa^GfS0L}`;kg_OQ*s-$J%jP+O(Xk2Z7`6-{C+I269Y(aiaMXRz_+S}|X z^}VtwU}M!b>gVqOJ!PES{ETncf8DOQus$Kpqlq5P8P*;cOS(ys*QL7#cyL?@^hXEv zS#I=Qp+TG#wd#OQSJ;Y^$g65IR;b;qS;N0xHtF>N?jX2+5CAS1&i-3v7OJT^G+&!+ zRkSL4aMum>hQQLP;O5`H=qni8LYkNTUWj!%D~E90moC!a353*fUZf!em8lD zx#I>3s{^eOm5jYd)sk_zGwddidN2_DD$Dvbj|#SgI}O-;uzsyXIix2I z4Kcv8mqT=yNue-AIuadcR>&DGVHiN2pYgaVcFK4W2LYwYE@}1j=g{W z6Z3mhN}J7CI)$cP@JCQ)o|Oz(UiIebJ@9t;KjVw?k|yTHg1LI$nMF`AkQ}*LQ_EqW z-ZkqETeo(NK4xfmr1X#{8TRlYgE|D^xc;ukj$@!)dq#q+P|i}XdPJq;t+ur}dk#}o zF|_#(u27r-ho<1LDOwdK+(DLcL8R*@oMxr)CQqU=RLNak-F6H_3ZNH*xuBcmUCy=& zLc@hDJyT*8EO~1dv9YBWB_G{boIrs@1U0kCHzR87x@JhK>aQ{%uylOSG0uB55`^B_ zD`!2T?4oH*{N;NLsUn_m46a)x>reF={bB(IXs5ke=DA5=-!A!Glq247w>pNsYr4pH zHhx|o3DTuyVs{L&wg|!Ior09#uI$Nj|7vIo03#;4wsVY=Ct|@MC@AHP;uvKYD@5A| z8&@rq5oxQ^eS#c@>}N;p&d3y`h~!qL)m`oJzUF}p&f2K`(7V4MWd}s2x+KEVIJ6h_ zJHU_MNU6I`i6q7T)w8bo6|wc;$@T}$3jWo}$w0+r$%W0{=!H9T3tY>=;Ur1(pNE7= zh1dKyL0e%2Syd=R&2n~H;d27Ep@qjzCRhd99p3kA+U zxFtnXn}Iie_Ep71q@e&}N__0>yMp(=Q3Pp6LrhJ1T1<^mj=vb*e#%sYRaTF*>=ZNn zXb~BBtKC~46tBLrhCN`91E`D4i-6fvA!6gbDq*`147w!Dxe6$V=ot{D#nLM}5YoJ$ zYH+Q{{eT=lnT1@8WwdCTF%)N@gUT*3)uHa7?AMSWfbGP#=5nAC-OB$(5l8;SjyW1O znhb@H_HQw|QZ?`3ji3HzG&6k~_qkCYAI;r>VseU-@Ieq`3oGvT zQB&K>Smt@BBM|KR?DA+zb7qMctvOPx!y)xJYB=MQRvbuYq=$U_#C%(dUL+IZ12k8Q zG85AgVrPturV1Ty;=a&k-Gw0ot;YhmgF*mv(Sf}=ld*PWv@zwWVPgk<4{*kv{EZmm zogzu#kzR@X30Uijz*+v~LtakAkI`f9FPO=|WvgeTln)p1qt+)p2ttvbx*P)1q0*|0 z(NE*>NX8p&Gekwd$S$@cjaJ8FfWsYoU}?5`(QQpQ)iXM*SJ>EZFODGib8B(Zs6ys!Yc z-W*&SS+g7SFO!H)@e!wzdr4>BY(BuRU3zsE0eD+i1>{6O0)wOJ0CZ&H*6o-}6?!N9 zmlc@?W}j&At`_Q`AW?nlJ6~z-0LirV?kT#2)!5rw0b$XIaC8zPk!_{l`^k`bryr%5 zl)W)BtTxV=hn^+H6XsOwf|#Ql!2fx{H4b@7o#fJ!iq~v6PCh-@a#R5)@WeX)Nj4bpXG5@O2~es1RZ4_n_N5L4>qPk{?B`2F2ay={siwhuW$ zvjP-!ai2*k3WE^L0Hcabo%^#xo8Boe-*NM#9!1dtKMZ-tGii9l#U(@!!OgrqF8lguG0Jiw4v zLmjJPYFQtaM*(kLwp*P7MuWf;wCz$v<0&(m#-`@4h(c4POtzmg>yNTG#~;2f)Mb;@ zr|KVbRm|sVIjwePXNNDrTljAdeizQsX^7vHxnww#!vWvbl>byj-|Vl0_vU{m#aFt1 z^`8^wLhr(>DA~o1Qs^`;XgbYafPl-H*DKA63MVcOgd#nrLSuO;NMlNGxE8ZRA3h9m z$84u?ALe~PR{PnuWPrJOfM@x5n_W&nBa1@Emmm336TkT~kvGml^y!Hz zcnmogCJu-Zjej9Tq(u9qzI$u@n%v>$ldkz!LmL2iWUEzYt8Ks!xp891@Bzy;$T{Z; zgfNI*efN_Tkjp0Ri-fw}9T#Wy&fv{vJjdO6a)X9qpj~UeRBJrkgs|n(N_fT9L^EAW zsd$=b*S0XIG*s;L;Cm?K?@)D04PHERG15;u$<|MQt#LtiZO$<6Zk;^&AxCnAJH^ve z-W35rp-hA##YFWxzuF@TjUAn6jUjP&F-`gJEd(EmtV8MPBiH4v6GMLh3;Y4`GY5}r zK@CFEqoK4j>%wGzvZo_*&hO2JWd@`ixZ$Lkla(Z9IP*Am-U&^jnSSw>Gc+)7Nu#I! zr5&$U{o{mm`}W8T<~%?UIoAKd1D8#-_4y<f4a|fBgaVkN17JcIa0(CjCuHNZ zj97p~RBcfp)&w7IuNTSsJv0{)(?%EYy~}kOVg;VaG;4_JJ7 zXG#jI^?JOtkE8QuP2x(Aw@0BvZ`oh zWgq#x?!FqLAPAvJ@cc$PS~GTJW1k8W&)KQ?ikzE5t&~ShA9^^Jw7ajFvuI#BDxHMJ zX{x0hOH@EdEl^D_D-<)YE>D;4iU?#>pI4vTkkJZX986`1gi$=?+z_AVjKsjoyRW)t zceH0sZ{Wj~o!3opIJ&TFOU+GxfG-X2=SqY{#DoDraS;FdPy{0E#2ZR??nhHDVPa%b zQuA<>cs^>xC`w6LJM$6aa99+lTYEn}{HVMtp!R6(0%X zL{xmT=JaU1M5%j0;xC`P0qAS<_0;X8{nTEfQi!P@@6gK_lrSWqW&y$6iKZ%27_#@( z@w$7fnbD>PH^7zgarLp&WXSssm50d=HLX(4YLvE)QsJ;|vY$6l$}19|EM(d9)u0{U z7i8sjp6dE85%d_sm)K2CFYBxYPP@#(%8(|F%0ktBhtBU1PS=9V?8)_#G60tW-g2M8>tvXe2_j+sWZRsRdh9o)nabJ4tXg{ERlIbW6{Oj!TpLHvDoic-$>Qhs;;=9aNt{dcdqlCF5@ z@ygbCz4Y;>C$wzQYwtPB+PJan;(a>zmkq?dpIa2-6QaEYS3ykNWt{Kn6177w&^;RL zDTY6iE77GF?*CSL2ClR+c~g1Gr2|*K{i`887+506e29_VO~jl~9%84EgyUp0Q8y{O z63*0|*9DzuTZgTBqekCvEt?J_$caf0_(TdKh4Pr1!%>@cFbC*#PQZ)eV4n_*?xdGv z%UZRW(;-$X_?xO7uB|N2`sdQc5X5(oS>megx;IR_Q#vf}0AwA#D`}7w+e(dBj)gvv z9xDM^3vm`x3w6&fCz3H8FV4hPrlx;5H!;3uuSOMT1)On5P3HGW9t$$-?s)_+ zzBKmSo%=&$hj>sxa>0lk2ozp1eyiF#TK3p|D%y8+ccry9JQ?XUACc42Zfra^3+uE* zy?C;4LyD>RL#F%X+vmQOO{rh{2W(Cs$_FO2agpabie5YOp|56yu|1m|#LhW+RvjKl zHK*SYFnUG0jperW0r8jsIikPzM2_bbv@JoZ;%IY{G_?4W=`X*Q5VlJRT#Jx+=o2q`0Qb6G^~f69@3`dvcUw{NpJ)WH2fbVhHRR@CzH2zDVkB&+jizoXp-8_B++IFc~z zD=W<+Em{zO2mmxeVE*YScA(~|j)(^o3o5^d-JT&2qnv7LCe9c(4l?`sB@p3gEw|_2 z=a8k!fWfE`|8z|7pJvz&XGsY07&(7Up3;{2usog;UZURzyS;@+N~fgkqIdSuq1lQ< zmz`@J-t(=+C#n(dZ{`5~(J1oIZ&yDbTm>jODR@0l9}IZ2c=F|5@lmkL|J=PNaDcmw z0xR_74MqAK5HC;Q2+)SFp#cE+Z8(C$_)-qw+-$(=2zCuRRV-S2;-2k-vz5qVq^5?& z61D7=dZI?+@;ju}bp?L1!rTJ?l>ra3mnwwWgog?vzF7X&SJ)%aXCQt{WUU99&K8A6 z*c^UY*d|rPWj6=2A|DpfQEn_^8T>=Y5eh~bLODGoVi&Rb=jE&zA4h11Lg_H_R^V{| zh)Anm)!|v@i7PtQ8QkYD1b{^6DQxKv{7YOzRn}PPs+5jg@UmOgH_*IBAGvdGWv(x+!AHEx3 zct-m(#l*LbY)ub+mjY4z^!?!a4=D+xc)k>c^;ChcbCp=*A{^z}?_cfeCh=N!=IVv5 zJwJaeQeKz+u)h0U;hdnFw5=2V!-p(5h_wt)7cUW27;o`v-jo;*M3oWT?pW17iP+~c zI6@bn^hxnmqTlG0kZJeozu_B^x0fETwaiWrcT4I?=_Nb zD)^H@`iYWajS|!5OOqi4i`y$Flu$~kBOtA=>^nVlrQr~<)Qv+YU0(*Wt zzh3=td1jS*2fsSJ;5#bEfq8`fKOgb~!C;H6@4*p~3hqKwi!Ac7wpL!Hbt92a$mdOu z*xQ`yMVX48e>^UG0Ywl69SHE1Z@!iDMEY7shINy7^xG~FRh0BI+E~or-&$@^#vaxb zZ?Z0{A4(U`Uf>Zda4RJZ&2JNxcbrdcMYaS5x}TNRFT=_9c5a|F(z$n0ejWD^d(n&- z#)C<*VzUFL^W}DcoM&twmkSzyNx>a--Mo8uM)t+5*Yfj z|CRY&eHSvF{zP~su!(3Aeiz>{}2ROlYYW%yCFXq30>jGMw@+zdl+nAhy@IPR_G9F?W|DW- zQQF$25=ux*D$;cCnr>j{E^uy4j8=>dY@CTRsDE<9FtkNOA1K{cM;kj0SFeMWM;0ah zPsF&05uxK7d#LEKXe>-nSWx5l|94Km17Ki28|>_HLdz5r(hE_^qWoKwij?uWgY99J?GQb^i*wL?JgLT-JbtngI~|x&9YXXOdaK z?}{=|{pFV!C7rIpXILb)jw5Z)rb)kq7l&sum&Zzo%4Oq#rS<)sGWFCv|C6LFWxuxe zxFIp~!iz+;^rIf~@6B&4Z*V;UQ=^R(H=%nJYL(i%l4Ri|`&^`<0yUT0A+r z;s$<{w0M?lrt3-Itl?KPAoZfUCw4g#H5>;uzsoEUs@1E>#H7~4Ow|=R(E!MVp-B

    a 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 z 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≪|XR;Amj07qm5{vR|# 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

    O(Pg=9b-weX$fY^V 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

    |n){ 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 _!4C6$FM%g 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%0AptomBid-I%1`s&f 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π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

ZW z>LvWci|0Ys_~}zA<#r!FpYB||^on+Us`%f%qy+jTHN#5H_iqB-3Ph=a%NV&Ad-gHw zl4kvsk9?lBv!OO#qTiYn;vKECa%fn4tT|~nfbKPSY6FQp8|vk7r?}G(%x$_VOxJ)1tWAXy zcO*??y!+8dxoc9|2dW^~GN;B|U287!Nm=LIaJ|ooF+aLwJ~NGa1&q?uVsgUYS0mKc z^NMXa(-R0U<;Xo`mUgC|{_3V_zm68nk4b20hpwkRQkMb*pZZl2rg(>RoxTxgS~q>5 zb7#x}f7-3WFBmEwNSeWAM6RG)CF_BlV(;Q7?x!tD9MS)>b17=hXlnJg>danU(&=^r z-)3(3ih3{goV}bHi+zaagq6RWx_bm``PwSmsO_Yvdpio+qC;yl?_p;yv+s7FpwBj+ zQai?Me5wWN2(b*{1y)CJlZqTYJZ35$0sP!^-i64 z`d(46qTZAIEg zkrG#q7P)*}dk)#g;1erffjC^O)0hAQnxgE(`z}fm7Ix$@FIwC;_oNa zQb&n&LZp+=b$_xc{dgqZKj`Ci-p9j(Ryc}Wu~;G%Dtxnv98OyN+DAJgu2V;>(~qs& zkMFpj*r+4-hRg21{p371)eP8HBbcxVziL&b4fi2d@`LnFB1U$xu*{2mR8p>ft_poh zSMe{nu_Rcv;3^rP@5-rh|9xug(~ls?I)#9qyBhPnOY%II$Co)f@D+Kv_-R{h zXnyH(AMtPjD&-$N=K_KvHgl>^4Qkuj!*!WJ;SH=1X9TjeBd-x-1AbEA=ZaACwu*`O z0>$QkuFPMm%7?1@#NE3ripz13?~-Ww-aowBr@cqTsggA3 z3*J}p+tOY*WsqHRX2`&Z9p9#Ro4ul0WWTiGS|uwMo;BEVjY$vB+Ym)-U6|ZqF;3$! zrN(UN4VB^Vp_&@OB&0&+WJq@9)n3uzf+f zznj$JjkJc79b(a6waK(YWIRJ!Az;Yhj+_A5DxQ;Kv6B~B21}U1912nRRMCh4kTHon zgbPU{0EAg->BR!bLNdrCvr;(nAvdf6$s-c7u*ozhQK>)$bE0}2sB+FpRM6te|9d$z zsI5ztZ;OpjIolBaY**(tM0%96Ey=yE_lNV?pF1vK9eCUcm|=EY0VN(v_@u(f(o4}T zDPatNGza`q^$)!d@XiKafG`2@@smOcv1e`|<84JnJ<$xy@d428$9~ES%Y{8c)7c^n zCH|?WB}1}yOj(oly=x^m+d|brlb`{e)F_{pX_W>XA3CIEa{FgYkrY``lAH5~dex~$_1`jOy7Z>Rpw0O{g&wfc8 zQ=iC8D4!jalOX>Fj04tz^xgg$v?*Z*31uAo@4$U-n?rDBUjS!7h(YY2#tQ$g;|q`r z6c%wSK>q>Ig@9dl3le8G5Au%?{(s&QOGwMY?0V1x?*aY^;4c7v0ez8T2t?=ziU<*Q zMO}m4;J1V=b6XHD85m<@a-6rmf|5WzKtBLaw>$69b&G*`@%w?2Zjkc6QO@>=?2gJu zMR{rB{F(XX^z=(DJg1{C4X|8La0Q*-*h>dA!_qQDU=a$>G17i^XM`|v+iBl(Iv zYKMTn2yGB%@URuq#LNm(UQD`(h0j;Ag2v$b`0g3dRV!}5!n zTEcQZP5dOYHo4Ry7aVg&nCFwJ2=gMA7n7(ac8`;5MfKxIOA+d#TpcGn)LMvumjl_h zo=TuG8$p7Bf?;A&ZWQJu%%NpI#B&ojr;fSBGH2qv7l(3@jmyn)W{liT=O16Sw9;6L z{+-oC>l{M`sr;;@i}Pi}QD426)og?M6l$x zS285gwp@ILu`&NdHn$V;c6%=3-X!G9AXa1=cvs@ZL_|Vzr9F`=Ah$kY%Ji~+lH_D= zL7O9Z_ZSs!;N;Rya`B7GUm$`~Ji@B)bdN(}y-bR7g;nIr$RbUF^}8O`al0rNtw&g9LmFGLLJ}WJawYEuP%qpMa8&>OX((BGB7iL zav?s(?X2X)K#H-Ts&MCC_gC4>xZM`an()wF`FE zPdn)sjI?+bN3B7c4y#bF(PghHNxk}6vvN;Hv9F)~fUp=P%q3OF#j%NXp`xxh9l&44 z=jAvS{$#zW>(Kg?qqK&v&9m7?f77mxS$qJamj}TvR_Dm;DMFOQlcdEP`#VYx52Zox z-mW5ry3tedKXOK9e4(}cBy7K?kQR(iqc`g3o>c4aj!5&8Dy-LeO~M~!p(oxiu2*ho zLn9%w#gIoN#i!|qhQWk6#pSD%kD|;?in_(rx~ssH%rag?Sjw^?0W77Lz6RlQyIDF6 zJtPH865f#Vfh;!wD{fUcKiApATY)Fe&3}eFxo$iE0yUeVWI=<02d`rfxL5(W8Fs#& zD|%!AIC-?{7S>{`YwSP(puevN~8bE$j8Jz9Ekdec7tG3laqtU^S2(R!)|IFZidr8 zM?Ea*~cX?!2l%ch2t}LH@d0Z>zRw?(&cvQi&qA_X^7*j~MH%?!Vm{?-F zxBBi%s!LWQvKy7tFNzyd(X@tmZZzX@Tb{P0yIXo%MwByDUZ8^EiY8{k;i2N8iQ%i^ z=I3y8RZ=4?%qcxrOT?;@#QKt{uBuaGJH6_0+swNcL+{P~?o~_`Dy-W}Ij@h=n5$$m zPtoC`@Ym^ek#5v99bXR=wJd zjkC{>G-$8y&Q^AI=k_wycCAiIO>0onge-b}zDm_Sv$$%Rk(O5D)@m)!-4Pb9g0h^u zVh2jIrA)hORnx4S@%M{8>DJ1qwA0qIT)o#W^aRELD#loE<*;gecZ7;xU5Y3uCuLxMY*o3kV_?;x+$zS;kApXLtMS$yDy3%qX zFNWaAY&g0y92u@ zQbSQ1ixw`%hGI1p=aS+zmtaRV{HoQ_OU}%)X#LBKwRe`NWyfuHEq*Pzj zXVW&bQTtMDwPtyPfwI0&(ghi4>tTYLV%}?Vd**`tkiz(DqP3o}&%U>P4c{lrKJboL z^hH{#Y32c&bC0Gi$z4)^L8>~3O-(n!s*Z?i)z}2Aa4%$Q34HV3-t;6~PAHrQ%^J{8?pu7zZ2WqILvIix5cu~< z2cS5?>}{Zqt>^b`6&34|EjYvDU1h5H-N!Qkr3KbR9i=&rdqxMYwJ0m9{g`QoK3J z?cQ5Vzb2bf7Il>LYlch)(|rSKi><>nC)z9uhdB=+A^FS0mScljN_~eq8=8idCM4_H zG{T8czae68BX6#A(^U_S-_%L17*8(OS4WSrha#&&T223QEl{~|7BfyaSz7=N42Lb> z%3JS(T`RT{dIlXGQ#j5jtzZBMTV?EOFgu|(rT=2*D1Wo5Xr!23jnWfO-Q)V}K` zQPAF~LWXiwq>i{&PH;LI(%};6myPrntCEkHhjpXzR-2Fb z;?5o{%&u2lp~a6=#+Yf+)B7V7QmmGvdM^_3J5kir`MNpE_bk-w@7%;%IkaWfWMdFa zI&~ZNV_lD@LhHQvD53w8J6|v>kiSdK*9hq4jh++qR_j;RT6dcOGoE5f( zq~yp`FeKufrjhV&sgVleT4Dqgp<$^YHUE{7hT^?!R9Z^$cSd|P<=|SYlvDI4_bb6x zBUNqy&2h9%Ys>FZe6p0@H=ko(*>F2F^hG3N#pa^oJW<}YvTQ#jp02r9yuaQ%V@$qf zF-TS58swLOSYUkM2Unw`XgE>f{4gPqssfm?bWjQ#u0=$U> z=Jc?I?J=zxqkVC^1)C?mTmKS4M9MvcSCCjBiVE>B8vdy<0&FPPkf)XE9zKE%O21G4yIA*H6;_4fUyD;Cwk#)oXq2pLv#nW zKCi?Bq0JBx(&sR;M_GIYVsuT}5`X3L?0#HUCIEfRY694F#>%4_U8i-?QcgI!EMm$b ze|F3!dvVx8aJI>fg4hLsYsLg=nX{3~4agk1r$@=A*_%tD?E}=XSD^TwKD=v zTbsGdLP#Hz5Kv-eM<|n~H}YOAR|fksLfmO+e(Bf_L$hkx8C9rVgb**Z#yVBTq_F`h zx7_~0Uy&l_(gGi`Do$>YtHgVtc=yFcWi^(RF7XDqC351j{-nWUU_hq-f-DWJURP`d zQl27WA&6oeim2D7*Rqs{fN&5ZS#{fIh`yD~MTVpH8+`BfQ;Mm&&BImP6~-L0j5^aG zpfQVy)3ozqs_zbK`E~|qW&^Mm;_uY#9MEC?0HP6vnN>K~GOq}+0D`(!D z_KhCJC4n&(Rv9mn#X)1YPbe6V0(KZ%QUk}{4@mO@D8+9?aNrDFW?~@uk-fB$7sXt2 zp!w|&*KrhF*4GZU2Ra}M3VYj}QWz|MKHtfai+Y0e3ltW3vB4Aw3>D!D%mkICL6Vqb zIFe5pBKQ*TWo!)tndBT=V_XknuGkqF8nHO-5G{60g) zG&u(uh-CmrXe@}S1_q@3x5jZolcBo?Q$_;a;)i2~87(XzdbV+Jgc^Q?^|&fDm~?<_ zgKV@dltBUpwhkDu+6Yx*ihJ3}f>ZtxMYD%v~@)Z4coYVX8t;{Z2RMDD zTg)1GWmmEBB z6)Unp=FYv;i`MeJ4N6T#?$DUoW_X7Vxx;g|155RgZrH-b6_n_zbndns7gfXw@I-_S z=99|J0_L&B2^6Xa5?Zwyn{A@`IVZcMG)JRy$?W0-Nt_t z3)w@ClC|O?A2jfk6wojb9xGDU@ob}0k-J~OXkyi4%n?*t6(Aeq=T4q}O~4&C)9pIp zSEf#5eBe&@86Y)2iI~s8zYsIvw$^eqxWjnmhv}Q}f2tUSb*-3WW-;wkMuR?5)9r0v z9Ou#4&U9%!-d)ea4s}6STGnrj282tVgI3cC&_yYIkm$fQf)739>1{wwLd=XRA%_Qr zgH%P%(qwyK$_2my@7VH^p|k!hPyE6Td1Quf${;A+o^S$0-F(RJ_M`r4S6_TD?O&YV z%6-pqEsgmp%T(~M<%hrK?={3V{GE>D!< z6Qdlgz)g~tye8quf|t1kRD+MdJ(zzer_XqFmGk1A>kSN8E3+A1l9xx{J=D$mTzj@p zAHI~COYX-r8k8uhroB2}RT4rsWerlyZgzAys8eaoj5})qIxjE!>Nez%0X7^uCbi^& z=z2u*@yu7B6PmT|~?rr(PMa8;)g!;T~!S^(GSvD7! zD4Z>Lz!lQ%JQ4g)Z^ z2G7<_%0*Fu1J+ER>Ss1H7})UdwHPg)5uxe+sN=y01JWxWOf|f&n$Jx%je+k3W>#W7 z=`b>@9*K8d1K1R%_F!BYQSUV-a=1bF2v^p#J ztp}B6;=xa<_LK;f4#(;8m1}416L3f)yyQt}q+Z3vnxnz6LzA>b@Nr}rfiV`{npCr_ z`fc}cAB$~fkc)&xgR6S|-?8fzxBtqZVq^q``rc(}hND0B__^CRI-QyU>w@Pa)?JO0 zbpid?-)3wku=Pz7EtEJLA*MEo0eoH-a9c9UFr~jCiTg@|U>ngiJ7zM!zZhkDwx3P} zY|>n?wnU8)5b-njb<9JlRPH&`cQXOg(&nNH;yP4^rfb{hAI=UHWeBO_M`36~qkhEV zT{xVFR9dT8N6(-4+f^tfq%eha8OW#0K01%+w8AoVg3kqCA+O`<>aE#<(xVl7Giu)Hr2v53$$PF_!5& zZ7c3aH_Be+GJ=ZDwvN3VD8xls0B8D|b`r;)enF_(- zh?E-F7uPBqy|2Km`ntwK_%w$Z=*eKKYrb*u8<&vwkG!J0hws8xOi zBr%OCi6aE@)zx|IQEI7Nx0Df^}3U)$Ma{Vq(ZUEejB!Hlk ztBXR&vMCKZ0B{FEHhFbP}_@MbbxQ!45l|k(`VSj14nL3`&|Vsv&j&- z8tluCu*-ER(Y*#K(m(O|n<=uvnRs$b{@*wk38N?yVp=K_A73UuQX9D+FDdzAy!ObG zKIz(8i>@#TrmL&&`%Ad&K3RFIb@@)a&bk^y+J3z{Gqbq5P2MMOc4?^9fOGKi;sA!utAc%nTXqcgS${X|TFu*Ad-$sq zhFwT(jgL!jE@zy^r~{0=zY(ZSsV zQ`j_Y@9&!riaF^!K=j%AFmxR;y2`+Fz<1Ecbqc4qR8~d+uCqUFQCIj!! zqyY|7ahrSJ`_YOsRb1*0bHIHMMx+ni?0LhAQ+H|}Pt)Pmf}_%nQY&WJQ&H->yMx}@ zhfxjolgyTaJO{g~<{Q+@u^v7aB~`v!{bpJ=a*i_hMPn`ioukjeCjXMY-L&?{QEx?2 z#RUTaf!#NyKHVApc^AC;%+z>4D(p{}SXDnid|0WX+xu}B+Ub~1^c~O4^nE&$(8UJg zJ|G9%>4WnbR|<0kG~uTRrWrKChU&N*b?oZ3Rw-y#$>}zI(AiLJ=LPxpb*K0Z&Ja3( zyHInY?i{sF@tnvEoSIO~+Q@=)LGW|Ws{kBh9L^8ZpW#XMp$P>ALk^B7=8bSju01;^ zb+WvZCFO8S0AWfV{V&x8B&O)Ki`Z+WZ~Up9q=>}a$GF%t-|aqH%N@?Y3i>MT#4WamuUyCCO{98U~66ci+clIow~>BEQfU?0HT55-qbHZRnE_4xIs zpT{(QR_aV;4d~;jTD&f`&85&^|%k%7#goXx-k|T<|RfdLzW{-Og^G>nF zCI!G;0KcpZ1p@%lfVgiTi2DGM{_YP){w9>^05Gw9wObXYv#cynnKyES9RSA!)-#2M42Vf_?cV^Yyhs`v!kM zd}o4GG5_`y3TQ{SwKWTyZ6ikVhrBW1?HnMytb8!v@-MH}+2jo;)ANxy3)_R^_a9sx z_l~-EwW*LV1#*_;EzT@N3)TjQK|Cpgqw@Cw8-{* z0gD%7j@&%fd)!sa1U_wPYr8X6b-`mDcljod`N2HJf%6kPHvPB3J;8!>A~EqXE@Y{g z6CZjnc=Zhdm5;o3)YDI@Nk2HsH}g>zNCJw7ZiNdxjqeWkP?LP}pSZF9#GhXhTKIkW z5woMIloEbX{OcTgZ^rJ+tkQs5{rH$OxVLDf>m=j65&8wXe0lfM+GsIuhmHz&}r-;QS2H`2B zZ>WD31Gy&v5L*INeNfJW(B!4kiRy58FDp!VqP)CzsxDNtwVfb2#RRfEFa@!(;>zWw zuMTEDdL4k_YIuJ^2;hWV1$z;sXh$sG*9MLC*s+sJGUTUcG8&E0L7@TyvE$WLM_gzd z+b^r(alXe?#1gTqQUi|SYYdlle;Ei^QHIYJXqWsw7s%Tx8#`iGnH(L)W$8=-KGlVl zNa^eh;_j0_;_3J^{-_WG#Qs3byg!Lgz{e}}Sk215(Myd;O#))?1je?2XU3B$0Qv8R zq8E^Yw!@-?mE*rluWuPFq&{p%9-)2@&ss4S<6lsy2FE$kqJH!5;C@Zg>VuT)kw1u!YRRmC0Or`)p2zHSM zX{*H#Z@tgT2U80I&fqAoE9Fs0)CgG3TR{O6M?sbD(CDXrZxOVxg9hp7%h@Yy)UVyw zm+QjDn3tU_{IEuz>yuao0tD7hJPK?=11v2AHoNZh?uRQff;YOtM=n+QtyrNncz!&w zT3TK@kw!{ihvlTEa!9N4pI~BnGm6`hI#hc=TjU*`<{stQCFI!&O#p|^*9`x)t4(Wy z3F;Ik2B!}MKp+HrNaBE|Uzyqj2@MMbyfCx6_~>%8yIVL60~8hj-v>~Kp|9;wK+#U* zFL45t4Jnih^{@drmtb17xrLn4kJ-@{HQtSy4hi>s!rBrz@!pbeI}&oV>YR@9%4&-3Rt?=aBr4)ISSS5C@&qbP z4g0X$8y?t&eKdUcLrS5_{8H2G?GW*Xh7gI_wx-V4#xD58$2lO=gAr*ZrvJQQFW7>b z$5+3C6liNo>RU4**zIhUir53-gWlciBcUWcD_%=4(Eu*C_E0MIP9Zgc4Mv^*4wk|c z2;5&79n{8(?aeABAB#zKJBlrB?DwQ7VT@Fk2{TUpuf zG}6PibvZuRozRiVt?sx|c4W#Z}yFEE%SRdFO@~o_}lfTz7_ln^rr2Bz@q$-mL1x zy3x7J{>+Mw@#3(yxB7>d7j?Od&H0tnKN4HFM5n=t*!=C=O5sebsj4Bt;)q`}zuwo) zyT~E6%#@(?-DZLXJy&?4+o(-sdaE_1#*+NziNz(|GSw1n3v2yZ*HJN$c{X$1NOj`U ztf2pBdhI;z_A@?T_pK5Ad``G`*f6D}q4MTg95Av4JQQ!6C;)L^A()2xE9$GrZ)z`* zy^dQFo_J;5F91D*@3o70zuTX4eWVN8YrVZsi5mhS@Y=+Nx>^x%u2&p=qx4I?SDxMO zVKnv(e%g8wLm8i(sr4|v5gW!Z3=(r6AxhRH9*PIzD%c^^&=CB%gK$c*ps)!<5pCbL z_Li^b>?dvv3G|X<06G12uFT z;p$oSfY@f!F6B-gi~ct(;LF7hc>*wmu%);2vy{a)qy;0KpsY~?(H56dHg6afP zD@84{fMkWI^hehu1;K(=<*7!$zq^j%tlaU@m>nPAQ4X$f*3>yQ`uk$#S0NT+GW(Ca zO3K?D#t-kjk=wf>6e;M{y_QrtI;+(EFD)Gdg6foC-`K;m9i+aHh!Ma(kc=dkKEl&gFhgMbe-*`lnr-2iwxiW*{))&xbQE3S0fHM%uxaBX3WVzq9zXWUYI zvah*FQs?%6V(M0Ah~xCi@@Nj+Y8}XJDM0M}K0C6YU;rXQl&fWd^&*NfWZcj}LiZC0 z=tmtX4WRYE+py2cwd9`c>(7;yYtDX3p1=G+&Ck!~Dv^@ttAEZHXKN=rV&o;C;o%ae zoN4K6+Lo3(V1KQ4Ix+phnV@-`oQ+LjeTm1cIZVd^G91_k}-f%WPbi87eC|98%^s*fGOUIFO zWqs_!P~mRNUPAo!w#)8U+q|MXWEgBd+w5u7J_m?>f0q|c0gB}Dch~gGSKfjJ_=aEhp#|nt%&>QFTC@8 zXXC?ju6C9MZmEw8dRu=jsF&`$y>%`DP_H9-xfGyCUSDvXl4wl-cDmgS03>Ort59v? zVoJFfd!SncXu1wygF{piccW=oWnB;(+p(+A#Ol)DANVEEf^lo|@APu|=z()Wkpuw< z!4b0dDb!XsU$fYs+9V+x;bF_mSA=Z-6@c2!aEzAa^ZX|SFA55(Tj7y>A<|A|@WrXW zuF0J=G3zmc-r0>I8Wc{vCG^X(tx?dv0Q67!1S``JegBmuCete&&^ zzpcCFM_aYc=L1Q3ZEhg$Pr+WypS*#K>XV{CjD2elJSM84IOsH&Dv2f>5CQ06)CHK& z#1GHwfbcJ`#m;^B9RG5*;^h8D`Gp_l?aad=hSDp3#g$VJ`DW?L13!t+qS~V%?D`4& z?<&)Ox*h%V*~4yoo0eD4akv{87jf%>7cs3jIPhMofZZW;mNCGVW!w^KN_1VB61zV- z`yMd_ft7RsjY8UVRNtwacfN=>?j9-HVBgB&rjq8U1u2WO8TlXpOq%|`tswq#R~7QM z^OJt_i$&zRW&-9B(04k3%PL*F!Kc8FsWw=Ag|+< zKv%%B6LX}BDS?z(<^wU?&fZdtwya}kt!KNPjvf~2tN>!oQvg{sK-eN%y~xVI%& zp@0?9?h{-eO#RL6K@kzHL4nP|!GZOyKH&_{*kr6@EZMV1$&T2cR|*v9#pFA8$iJM^ z%go(8uUrY3hcf^LxGnelB02Gu49;09FD5l_xpiK=G2oi1jZL_2A{;cX>r}7lBEmkm zz`*5q3-$zVz>&wl6FKM)I2GAEe56RTd$5Tq>UvF!RgQ@Ut z^#89d6gYITj0x-SXUbfxhs0mPi^oZXenQoou-Zcly#EmWcSvqFv;oF{gvGvA-dWgDzmnS=r*xjbjlqUZ@+H!u?5xg zCN1pkzD?eInXvtA!7(UH8qPI9;&Ph2 zqWrm=%q^3m+tS>k_&4*-6)KJj!CRxn!@>UT5hTyfA^+MeAih!2M`%}elA@^%GZ4V2 zpnEJQhIa9Gb8+?qW@4@s!zq*TwlTA+o2QGTt0&N#Uf#&rxIHn^ zsOJwc8t)$$?dyLcuu5iQT_)T1C2$?8+S@I!=B(WQW%xJAD%#6GBEk;+@diw2V zUI8K~z1uGxapJw1v!9EL8;r7HZx@^;B9T!>EcA#fzFp!RPQ|L& z_g}_h`3kW>7ps~XyD#&d>ich4`Cw1?kOvH>sHGF5;wDaI4`xL8Cb(L|fdO5*4Yx0~ zM819e_fPmB;yE{JL9m_;Dx9UJZjV-uRdCBK3RbsLSi&f%sM}u#$HYDm`>Y8A(h;*h zPfSf_;w(@JU&Dk0?wAA3(LX(1O|{I2dZ*6|D#AVQCmzu)rrML^@%3G zEmV8uN#xLkoMoTPqij+ZDLD}ii+ZA(T)(l(is-B|_is(8R>tQb^X>xW^1%W;1XfEL zO4`Us?ZSEeaDA)_`1!pH^Lpwn;tEYHTzwo}+;Kyme8c3gu~x`^ERaTs~5 z{g-#Ckxz)Z>38{Fx#=7%xl}R|NM8c1Zk_SIa@LXgv(mqM6>=+q?sZEiDh(Ei$SU4I zluq@D5=*CP?9;0VJzcKs9Cp){$Mod>L*7F*l- zCEDjYB}UpY5&?4G%Pua_G1n#$Z%2!ymCuMK_VSLG7H{StMSdDduD|3`#Y_zWfhf z>x9XC=bKG^s7%hRq5)G5Z%a|m?X>9E2gf)hR%GbY0<-%i>Bli8(?VcTt7+`J->FQq z=*yuxHkRd8qFMUAIsQP+!Bs;W<)Iy0$m`~THQ1J~&GLH9)InZ152V^*7P=Rt6wF-w zaL%sm>!4n?aPwlEv#6`5BiXzwk6wsZ&m#&oh0UjOx2o8mMPMLz=}$oVTp)Y_=4tH0})g^L{2~5(D4@0mS~Hao;~| z5S+E40jdX_;1Q<39>A{_Y2-UCNlABZlLOq&X-O|McXKs0<$!tcJC;D~hx=J3?jB~A z?p`L8)J|q5xwGn$?4L8MOdcSgg;_CDBJ1_N&N@o24#{@NVEk1t1-i=ov#7(D@<7rv zgFMa7TT35@R>O~DOXi;a4c6OQ)RE~`3EC}{uW0UIjk>^3;(q$Mh`gEz2OmA0o|%?8 zRxd3G%VtKH`|J8D$9}7A1s2%lWyw6q%)=zENfPIL4se-~rX0H3OW@|>hcmTbAu+W20u({;IEV(9E=HXt5>V-|XQqE`wTtE0}z6lU0a3Cw)y0&4+eW0ji= zcQsZ0t4N8L-=7e>^0x~{Rji)3Uvd`i5P6@T{by%o+I!&}i@`jDI|)&pByl++i&ofC z+nGmeXsb`9UKP@lIkpG@O2=SYFza%pT!oa4rJJT)u|!@>n#{V$wAU8aE{MBClm{|+ z0FV@l_Af2q^!=?PYB&BoT)v$)=+t2)pw>LK%V`}=2;|8YqOMxJwr75h8RlgvV~@_P z#iYLZ0M^ehytj>I{x?E-SMg|may)m$EutbAb(j6ktdKutQ1}2gI`YKI3&wwXgmkkp zQLUxHQ_#7`@$>(%+AMFp^+7u|U-(HO@@a1fAFMsc7Z}^I?yl3aZ_)|^=orUTH$-*W zDm-mqU+LS*@HeZ;_j0m~o7L!A*m#&&JKSm&aT#}~;mh4Z|1l6QY=#8lUtlIoE(g?A z9XJPBK>p@Zz2+y5HP1CR?Z@c=4g$adhO|+|75t4EnPMr2&%y>ZT>dJesqmS0LyTxE#=>tDXfT3Fce44g8a@(f(q zSzuLe{+m)GzDiNdFQpYz=!@#WkT#^a;#D|(Up1dU*@vkH!vd2DGNLyE;TrQ>#n-lKlbrV zm$5=($WU_}xu~PU{;Rpr10ePvB!F}9cD?{5C<~P4j0}A1D|I>X-uq}DUbbS4PoRy; zOjiV)_#f3^|Fxr{h};|(GNh1be5UKk$AO#ORgT|)?YJ2b-zKN9C8q$yx8ZD5q1-50 zprId+0ALW!n0G2I-sSKEl>4t%FuYP~`|iWbq+x%mJCLmG-_nrJLH^W}di|K&GJE-v zq(}nN%inrZB`)^e9wF5WXBuKZe!0QNu*{k%V-2_Smm4dXyq+FEWE2vFVt}$O*X}ZO zkq!*RR!UP`txnC>|p1~)DoJW$AZoRP){pD?i2uhU;hUP0m%MUaG))!+pXVG6WWxiKjIcE zo@`p^_)Nd`#`$=W)2bb1&;++CuC4L5`~2UP)xTLO+++90eCp2hPipda@24;$U);$} z{w>0vGVZK{T#OBxu5#R7Zb7!)& z{H5&drF=^E@={KI>96$Um6ZIPrRD70uXr*sjz}iqeKSbJxC|mtvjs?zENtTa3B~Yk zgi3Ho^!iF!&R$X-{vJ-seY+Fu3b4NZ&xPQ8WJbdSPe3>$a_u-cLJS?JA)Tkr*H{sW zWKTSa>|a^#-xR}TtqxSuFZLk|j7y+L69IWB>(i^wilxW(99`XQT+S5B%W>mmt+X4? zv*XAC&nL5)?c=$g&(l&pPWDqy|2#=^oL?UR-mnF}8vy)|VF&pbh{b^s6|d#oqc#-&QX4R}Rm|%2pZ?$jK@X4VjE9q(jDIg5`i<_7 zIkc098QR^`MgU27za3#W|H&V29nE%~Ji}#{iG2NN8ju@UdykWH#hs4SNgA!#hF-`7 zGHOk`9InTY^^tid{v!h)2S%oWj=~+8xMGL+NdWlTNyTG01oHy&g3B~wYz*Roz17bu zuu^mn;jUA~JT}YtwqAM(^}mS?hnc(6&+B;Ns7(t;^j% zu`1}~+i^jCU#8*KS7A_|U0I9Mm8B9fs+w-!!Wh*MU5E2Jd-#{13=HaSqM~4`za~n_ z80O#_yRuzm5BSZ#>g}8#5XR=!l=+8$B=4|Z$FSjyn^I)ik~-B)H|B`o%>$}0Tn@8t z;~NT=NC`k@wwTTQ{m0`?Q!{Db$+4-a8x`^tynBHDTHk-E_I4>1^~1h_o<&P8w`Lmfi+VXKwFuWCwa$Uw*HZ#MI zs5?cOFdITRMk!(SNJ7pZ7Msf-7R2cx2KmFi>@bP9GatKVh{Rm1LostbP$v zI3$Bl$rd;0X$v}Zv!pnfo%Z0<2PSOe9)|Iz2R+rhzKtCc?Klzvj3~wE!GR}vkyH?K>Wcf{jmEROvCVH5HUW|pdy^D8{J|HB!sFI@Kp4xOtIRL|O*PcpLKyJZ^G5S>$Nvnbs z7gWvZu>?!tJT)OG>-f#|Tc$n@qcJyZvP5DF4|#}D%P!~1d2g19&))Wv&i8RGEMss? zyi^!_TObTFubQ;(i!$fC(Y<};g3_`hx+&Ki;GHS_zA632>)*g^eZk&}wruuxqj99I&$jpncu$r0JQ(fhZ=4J#3_GLH zyzn%`8|Nrn{w>fml0oNn;}t@<0yO_edzxX*GnV1K6~mz{@E-N2U|KW(5jzYsm%~y2 z5Ch6wS7_FUbSPOz+U$65gZ(+`DcFU46!xdZr-F%Z4rjyoc5Yz$o3X}_;0|(sYpVKu zN(01N1=hbeo3hs*v$=zt;OB$nQD}-zV{O!q9c)Fg4v<+ z*^Z6v+N_r8wupC2C&n9BOD9*W?#=Ebb!d&2qiHo%C{tTCWl9v9tW?3_jH3qz!(`Md zw$smHydrQw6*C1zM>Fcx>3i(gR`ktghgd5>a^vg{tUeiI>u`L7)k{ZPSZy~G-#C8F zOz=k(U9YwM&28syA{qcIC&C_RvO62#x`|978Gr|ZSU*2>p zs0z6MbErJAtJp34DG9jq{=)P&Pyd#TBd6=cje14nk~k=z5`XiUMV~^73pzGmN~e&A zQ#Ne_{LswUG*R%+>Z_ap7pE7mz1x%2b-D4+6}{M(Q*3?p{NmjEPnE}}{lBgp-#WXs zWpOe5cVWBC!oufozxAJ||Mlwjw;x;9;>PX&wqMVyTAVzn|F;AdERz9%cXI&14B#z5 z1wa_fd1Wl}J=-D0Jx3(2qYU#PEJKqK=~t(;2Pn4?wluGVst|4LxJGPPI#v-}c_$`7 z-&SW4BU@!2mq?9VAhh{jz*4(0eDk8DARR$m>4S1KECe!?D~2G#lA#*`%G&`wo+&A+ zB)T{}ksC+E4w*GW14-}NR*j$?4RlPsZi*LjF!d+^^ZrUER+6*icEmNrRij_k&WB_X zj7WQ~NFiiemR+jH8m`x-Rf0^}4OXdtq_K6GGGMImNbbsG@rPi)s!WY`;r!)t0cmcP zU=zC;q!QIH*Gk`Sfx$1+z=*AT0Kl-k0&;jMVCt65>)v0v`BF<=vv)FkYLOa|v20{; zpN1MH*E%+?C09nzYqVt88Z9akRM(Wsjp733;scMS>w@j0zyBrG?pYCNqGi(MdnKAC4S{8V+)a?+t zMqqKDo3Uk|QDbAe8SVjfb@sD>v28uF#aM*Mu_hsXmBt*YmZEtNF(t7jgJefGN8KG})I$;WIKE{Nf8n3Vg zl9(HmCyJ7|G94+}u+E_!xKDA`Bi7F1HXO#}kZR;He{OEO3O6-P!y$5aVC$9d#>dh5 zazz%tZfJSYRkb%h9>v@2Acm&gs|MsG3vzI*|s9d@8-D?nb8{*@jPdJ%y?Q3cCoMHsQiZdx)tRwOy?A z&MD=oo1+>gj7n$bl-;Nq88USDh~+*V`dZJ4&7VQ<7Gs^2m%BMlXXy-F8l`AgxpC}T zkqT!$CsB)_u==89G(F>LBS5=_01J1&WQVU?m|)G(IyV`hA+o9Ud5ByiuvlU;w(Mi7 z9A26hI$(;-^jNI{2HlDzNQ*H;Vi%O0RjXq)OxCC@`|BP?p@b02a75;-Z%qQ`??sZE7=~w%8!sKZ7Rp(4KK#1Z;sLe)yBYeAI=7NX zgBrl}PD+mC|i$mw86{pc0yLY)sybs z4Q_H5mOT8_m^w~AsJ^EDfAwwk_v(erubWC)8_XYO{Wa@mmOtx3RxBH{{KoRS1!RwB zJ8qlRuF9xMwWu~p(?BBm)R6~;Q6f<&PLs4mGF_)ht=3mv>7QOOUp0Sw$%a^>&9=oB z*#)~}-?wvioxzD|wz%Xo5A$`NV4h{CT<-+uxyHGT(P6weV1@)|I(L!_kKRs zXZlIcc;2rEgcz7$hAbRHQlNzGa1_QuOmcx95P$&az#T$>2-yH(6}lsv&Ou+gOG7k8 zA^ry!a1FO{KR@MRj_@L<5JGxHKmw!}4V1f!70*rzS1VS8SK`|tOgDtoQ6vSYa3m&=R+q{O)@(un(2$2Me zC`JWNdJNDod zdSMtQV?L5Ng-a;oG1ADRtj)U9O*-mPjYGTGE>{=A0xgT{@79c!zSgea#h=@E$w;Fl zOQAIFoPGHCx+*D-Qmc#lYm8^rW=8Q14(Zq`YKD5Q`@Sqv3RMQy>BuJX7nD(P~*+$^t^R2lO* ze)b){&(C=uALSqUYkt&6{YqevFdOipK5*gxqAgCbBW}g#aViQ?Nw&00MOsP$>DM%u z?7Z&7Pd?*&etWu|C6{QB12%Ai+x5||+Z`LSX&bYctws+ciKxho-c2a})ymqf*3(8h zzDM@7PU}^@wfA*S5A>6+d$9k}o(t$)vJ!o>cRu4fkv~+w1yfH(axu_7AxK77lpq zM=`HcuR~*YbujmpU3h=|b{+7(>b=njpJtz7pUZZxeboGIy07!S>UaBW&kt$8WxsnP zIl28S{>`&xjxK015U?IlwOZEf76Kpkm3?cc&f@d-^xo4VZX=l}Ceat?Y9h*Ix&ChNk~*=Yg5hPw)j3$GMlB|B{A3WZ01Kbd%sdTgNU2TB$cLZ+3zNr)%hO8|hFlK2iyb&$MJgFMPoExr;F5S0#m z#uhiyk$ssgAVF`+Xxe!kWZ}A6{8E#xSkzB0;%iv7czIh6=s4yUtjdj5#E2_bZ(EwS zFpVoLmR?qyPLq9JbV~!ZiE?%@Ej3J?2XR{~fU1Weq1x5}&|3=fA)%&<2&sC8NjQdB zPsZ^0>Al+`sN?Y4f|hi_QBkx_u_Gi3$SyiUOd+Z}QcGv_^=x7ZZ90KkGwHH>j@U;2 zIp4oQISN$aB?pcMBB7lz!Y(QHby=Vr>S7@@0dy)KP>BJd>RZq)f*gwTNU;_6s>Bq~rGk#d( zZ3J-d5Og9kG;8%@!LqQu7~EoiITr>|bfnki{Km=B*WQ+PZ+m$Qb;t_bJeqn4)vDFx zD^!{0AsO>sR#=#r5ct(ttMD$lvO<2#PS6)J_vK>OOArRDYPCG3oHijZ`$YPYh&$ud zAY12_d<13lItq`o+Gi*o%4yAkXTL) z&H8(w!T;ThbdrG(gmXzVc?3#;J)w|OmTzpm z#u|jnraxp3*b<#wc5h&DdKza@*m0VK+^_rSla#A=EIAFk7c zCd=1JY(5J+=-v2R5}JqkGJi=K7)z(`tKgtTik_LTME4ebHNqDR3>12dCLZpq{&AlA{nBpXa zXn|S|Rk;68`-G}ulsU51<1R0;WPGh=wU*i=fu=AMdRo%2_gm$vWKax*F$rE6XHWHV zq>KD4i>`fcBq*wnM3A37s0s&{RtV?K*L)`=hL>(UYJ;JEHRreJg>HKi`?>Udd*4P8 z^9Qk7Rf+g<%;mC%f;d(I7545KB^M75gA zl)cKgYK1)V)jjeeB+`J6%h4@vAZ>tPQcFsVXAh(NyiozIZw%N=X#H%ulaK&-@dl8{ zF1_b^P@q=hEoXVrCvc?*TtQ&#~Mu0tDD! zN00zQ>t0o|?FKsKh$caIaNpEiBZsa52hbW}om%N%5#H2Td(MsCFV|^{?nL(Hft^M*DF=x^i5^n+ zer%x_DvptT`tTfn|KrQ#aB#}{#dEt10>G}Xtqwl~<;uDECi(mpklOoXcvxMuOIYW4 zsl5?3ZT&$iwXs2zkZ%}nX^p{c&dKA76I@2Kx}c~Us6z15U2Q}v+~%ZoiWaa%dN#MHTj{44VExvK(=#pl9_8s}2(@T;MTci*jGOmoLk zJT-#R(ifu~GgnZNFy9;>u>+!LUW#N;UK4~?h(nKIH<sO>^#Rb%`miLdhqO2frc`zz#Kn2 z;>?MX1drUPlktwmeeuibyM|P1D$g`%-^IUTDYpTp)2)^QssnW_U=|Br01!13g*X@mNJd zNj@-TD(J~tf&o45wQNueTNx(A^Ev$_VjpLv!N8<6Av{@x5G>?4>(Ks9o}r;1z_O61 zg;cH*Xnr%e01_GXae<3p4+j(p-dZrgWKmsUIx2I>33ZtsLetWrdB)JZ_z|&hn4zV67QNKkwV3krxCSky-{Qb!jb` z!+ZSeqXjoS&KFgdClx9Z8>nTeyhHO&Yk*wRGcz=wf*x&xLZ6YbGUT(~;Nn)VJKT*6 zEss2>Mg-Y$ z&8t!+GxCk!=eEQY4D^m(I*Y;Fhj^g15>oXwfy0TXR-y+-LMER4YZ>1RO_-Sltc(rq zwI>ztn^XB@Z>=!CRjI8{OuSYO0!mN2!a--oAhp%b>@A2{`kQ`wx`e`x_7jwj(mIn2_O7a_&q z=9t)r?#O3v(0V66Jb!``{G(cex5iO_^t-trqI-d;AZ!?_-AF8b(VILU2bgsDtf+1J{VBnz^I{G-}p$gA!!=@yTNlp?$2f zpg_hc+fm32Wyh;dtb`0|ENlS1*;${aUQe?jsfL(w5(mPvxDS21)DdvAwgMmxY(={z zC~|Q7ve4Ek)u`@Ui2YEWSwLTTgttmStT3i5+@y~!s1S!+67Mx`1(WhJL6`ccPB=xf zfmWXr?1VHW9;?M4x(``0eBvgXBDr#~dTDrI3n(+Bno%8nWh6w5-SgmSVC92X<`|06 zyivBqS%ZW%)`Xf4X0_!~)^Eh!VI4cS%Q+jPmXECS; zEaf{=f_aoMZ9oG&$;VYF5%{#XvWa7$D&@x@=&rq;Ca3edMIKzt4@+NCHZ_;n z`shX2eV)o!@ebnZleXm)F8rK6-3-(dL?Yd*Ame^o7h*?kkXMqN$fD3E@_1;)R$c6Q+nL}dY&nGu41loLK zzodXF$Wp0?7&CGanLG@wmIf3kY#YT)KPYS#>pdBqh)`)qCck?1hE4_g0Bvt{0~=zm zMF==;k(BLn$&9KAn+PoqfPgd$YN+dM=HLWd?W_j|)kGj;t&70@LH`%Y6|snTOHz1+^a&2zBUKJ&ayZ@3pLPQ zf~^Y83A_zF;URRd6o^STk90r!6EpSB(bg6L__?R+P219%1yYA5p_3j~Lay7K&j}S1 z<&Z+@Z~FDHSIT(4=-D8fE8z#m_Bq|p7I`BcpGg?e30;@%>@;6Z3)V@u?VKRgP@_j4 znhVt~DHxX^*me{YfV2?dqD|$gnmJsHY<89T!Cj+?L;$IzmrcIYg_ET5XNi9V;ymnR zs>2#sk+4j8vVWe=2!L@`(A#dW8U-FqOF3D@5n8GnUkn55BYY0ihpmCfIRaLTfq}&_F$a#ImQ2z#Ie)8{1X8kx{9hoeM)j2S$F*!v zb;0}b5WJ;i`1aeqC6+ZT& ziV+jkQyl-n22(RDU-`0TBIgOX+rz(}IPYa+cp8Fz9wsNh0=lN}mCw_pCt>0(q^uh@jB@C5h# z{N}DrncX&r>UYT!emwnxdla(-Nz90=g*N>3cQJUf4vMaKnJgb3@)6GD_DN3-deE~< zQMl%j1oIMN!}?iC(A=)jouNUkA6Vz;RRXyn4_3tB@y0??MzRyl*WPk!9KGWTxI|oa zg|ojl-1dgfyQT0@OVuO}hl!g!kt+d@dqAOQ+~wXJX6|6&`jn+d7-Hx+KJ@kg!1RTp zl5*8$y!)6PZxTfzWlJq@p#~CgU?^Uj1yrm{N_=I-4VG@+ne_k^G(ravOh!^9=%{b0 z_I@=j$aADPET|pO+~0pH~T z;u^hECfLvTsoBtE$MSrATWRN##Vd=QyZNK0!5fY~?thT>{L9~cMVBUraVT8<)J$oM zYW}Xc-~Ra#12R=BU>;}3O93*F_D%_H2;{F?#|_niErEfN5moKqN>I{ZIuT=FW4MA6 zOj&6s1D$PW2g1V5?EvJw86-Fm4V{Pp9lD&Fu(?HrQ^+_rsW#Nn!Yrq2&4B}pDiS*F z1SFTlS&H3H2_3Cv6*U%bHwTI6*Ct^amx-YRKC~!7W9k$F5T}q!L4E~|=|yyHcy*qUL9m$|`(eFPaFLetUgRoglsjdz z!d~LR9(XQKJz`v7C!d~8nDaeMwI+m!p&SSu*Qt!h7(;!6Q{jvATj63Rt}wYAF9Xy& z&2i}fuos-67)oRT)pkCHSI_{DR60^`FYOJd!8Y$V#(by6Xf~vJJE%0RbfddXciA+^ zZ+Ip<6OR?!!#lh+3MFWJ{gA@p2k)SB0lh%k6CchN(NwkGmkvzy?FO<` zKYq4r)S>nC!FRF-a+kixec&@k)JG&}i(So$OP!oOi9>jVLdqo99jWMX2K z2oW;lz)-c8N{=?TO8}eJ0~e$NHgC3<==k9OF-n`rqeGej@dE(KIVNe(Y^ceNI=hI zYH$(A*Tvi^La1!3qun+8Km?C%a<1l$E zoyoIk@SUplO&s1O)5ZB<-jO#$1K&`H=Al#4eVfTQ+nR*hC2_JVXDsyZ>T#S# zi=TcNl%VvNKP-@Bbfd6vGJ3B`h?rBD(B^x#nE)C5NpvBB7{k$&|F}fu5Hp803+jXt zcVL5T!-G-nGJSU0;xHD4_rTXg#r8Xoa;YWNcTst&s;Iwl*E8io?sZx(VfGB z&DgEmjdsbioK-Eaaecj>5*t5OL$+@8ynt$mQq}d&OP0ZA6dBCdCQ<5ZMwm6yl6!k4BQ~ zl7HHwR#%GzRimgnX-{%yJXico6}nH0LsOsW$y43=wXv-GK;Bcro@EboY;jr#Yrfz1yx9(gWuz( zJ(bXkLs8p)Z3C-6(|X$saQFnf5p?rq#WgCf3SlO`HL9ULOfaDjo~X8yx4@lqM0gz~ zsngmdQ{&w0Am{{INsrit!qQb-z8GP5E8YtjxI%AVST{oxXv3J>7Vj!igPKjFK)O3F}n{XJ|$-= zytV+qw^&iZWG9pALi00V=8N5dIl*swJbgt%Y<84zj~#%WvF9>{!!lz)#cGb+N71%FD@Q(BA>H@1gy|ehtU7E-AvoqH`!33=<_>6Y!Msq_ z6*iL(Ap`JQy1GP%x-~6h4uXCgFD#g9S={FX@k{X7E!b+ZD!UAj@Ez&(i>U^_>Dk#~ z1$W@z#Dq;qCV;BTy0$c5ja+MD>s1_d6_s2GN(KrxoPB&@_eaRGXw_W(gh;*HT)e?@S6a5%(NOSa5e!(FOGM;)hO^K z_{gCF-1RBKM;fBuwgd57g6q!i218_ULRZ-l;hr_$OqNL!UDuWS5MoL>$dr=8<|j~b z2x7CEK2T0?Ziruk)7e5zQ$=t3zXv+eNY?2hka%e{hb%k{>-ROfJzNuWB)XdtDYDcCdZqk7Cuf?xWcrIFCg>U|rkR&N05AWb`MqDuzn^V9tt3yhwthQdcD1zj)F{W0D8~&r@89O!wr$> zT~PSEkqk8QyR0Tg9FC~etzdy0q}$TBa1_XYjhM1p0z*v}a4X|L&_rOg$qt6;^!TG| zl1%6#AcTCN$T;`JKDibCDCOPdQ1HwP5O1seS9=Ha+HjukgqeC590x(J##P zGP11@A+ErwF7o=D+R6z1c*m6FQU@lvrB_GO`;}^iZ?;aIO!k)^g71IZL2brOGPkP< z(*&83@%akon#i@0!6ZhD4*{{ot`0Wm7~S6c66LlU_Es}Z1Z)^81OTtAkcMklNo=Gq zzBZLd-&*y!q`K!QUx!Ay8|+KdU?`Eg88cD~={N(|h=@2Z2pt%D7?qvHfkhK-7u&8F06>mr=K(M^2f~O%{1H(IC(Onu=FlGYG6HIo?H8S*E+-sRD-l$GEN`< ze*&YqC2{{e(Wt0P62;b1cX_iUAtf;(CX(Q-0rq<_heVQOHg>a>Y%Qf%-@x?wF)Z8g zz&{UdTP;_yab7@?7K=_OWP39MeYVh(3Vp36SJUyBE&*LHCl~%bFkmuD-z>9r!`oKF zw)qw1);~Ox#A_P}{K$mCxX-wm19V;!Zj^sKI#4>VLduk&-CFqH63&|JW!uV?tMd7Y zjfvvJ0%{%SLl=KZoT?h#sEEx z-1)HpaN0}Xs`1_e#5?}F90gi9j+Cv9?hcr$!-~s62T+}I}Ko0i{Rm3IuwLQj#O zYVuo#TEqy&Gj1!AYAwOY5h>)RNI}DHnj#4u$rZ$>^bhwe{nMi?m@3Fl739FsQd%*n z^Vf*Dop}d2FKVn-Vw+8&cXn4%S+{#2y|8>&vdw$06&thu>l+jDy81S4WU6z)7eM^U z6CjtXNn_u-tG52h!FZYL{s2ooP(#Chdxg0YV_jijZ=yRSgVUx=8)j+5a9z+`PM_a4;4)nGO;c)EfFA3n%WJmFreoR+wY87@xAiQg_$$eS8S(OE-kT= z$wVS|Ot!2GN3RY>=k_N+sUQWrC*-DnWiH z8ZRfj@WDD3!&#xSItJef!OAi5YAXc!prv<9ZFaaCAx|KHw&6r|5CHUW{@Rz1Yl66} zz?{dh(7X2uiDUb3&WN^so6+u&>4}R3i)yCmzbaxa%$AC@0eoCfAA!k3H5k4)J(f_;r? z1qNPjP)=*|F+C2yF#A=p!A3AJNe2}Tj4(E~Ug%BQnPt$uYU(~5&YWvKKmFRte8DtU zbJ&ysOF*>0x||!_a%?-P8-=XU7JA^f(Iq24=e@(8^htNKZ4dVJMzY!RML({Z4EkNO zGTGN1oo8Q3jr=(jBcz=}`TIYcK4#K~(bQl&(>;sPIQaD&q07c4F0k>i0)Ok(fm;SY zf-8Li0#eI=Yz~M696-CkH)0U&X|Zb6`>k&>^K>Z_;MVFaB=9{z7&g#8y8I&`2Bf2U ze}E2jG70aC2zZ_iLo_MXt6vfl&oA^`~!HDq|?(40)SPVa!Ym+QX%7HlQ z9uZ?o9Um$y)ygDb>&Gp0SfTali*dP1PQeP%bIH4fAU4_=z1|FU9oCNO&}WN2thVDu zW(U8wnODpdEmPSB63%cNgVkjiW=Gngi>8xjxr9bz4_GX= zFF@0weY75vBuC9($0k&`M)ZID@pgT+YBAUb=M0^9Gn^c67pf~$0&iBZe>PIlGmIyy zstb!_tdvm0H^$VXbW=+hQj_$jz&7H@c=^6S?`Bq5b)-e`8%J=d)IvxC6=oppPSZ+L zI;YUiqN5Z=P5Nz2$~XwCX~xT_(yzDLm?K#C*|#hy8mr(MNctq`R##F#p;~3IEma&4 zQw{zYCZ0r5yva3d8Y#c80@9yzqD`pL0TQexNVJ`e?-uzaE>#hb^tD}!#M{%}*-d=Z zWjXOJQK~-L`gZmtc2%wI2?#td*IK}!Mov$n@(QEY3o8@yt5BxX+R8JCwQR@;g_B}I zGN;aiv&RxjWv`v1J~RJyq~p5cq*IS~w@}>+(JeLBClenWE+!0xQ)-url!d^l!N*CP zgNRKlh$b1%LFPio&>K%v4T_)$2(h^E24Xyk$)(asi-jZ!$d97j>|jBYmQ&r+jVN+t3yVD5Q&$=jo8POzQjptXg^HL}PvOKH`H^QT0~<6dD~pG=4EkN_|kMy}WE$|8B2GhrL#pL}aX z_F!N^MV3HAjx*{qD8@zdOOU~(Gg$YXW-2Y*%?;P!5fbk5TUrN^WwQPYBXFd$tb%=9b7sPYn35! z^M`6Es5lO`6cQWrW=|HGqM!V#3%Kqgte?*tdTnTQC zGVC{V=aq_cOo67kWKkcl>>_x6BBSjNB4mouGUfdBq;QqC+FGUVqzC&MM#-Q6N`lTP z^)?ak^Xu{LeIX&?Obr8HLZcj-LN;a(VG1++6iw|H+%r0oV#;6HPKtls-jedh#<2#@*tLp!$yU_r?Bp;J9w2$syIzS;mEfmv&(694*?tjWC1+ z5uN@ObB3Mddn`NV1z81wZLr;az>IjPN=W#<*`3ED;-=f-+$BzLYcd}Nd?7}}K;Wt+ zM#7>ucIm!2g=>0aM0`jlU=8Dv$m)!~mcGGFXwVF!IX)w8f*ov4GpQ9!`gcsnl z=AuKkP3-XKltAT@r1ReQR6em|cy@c3J2P7pps0bFI32)a#Xc9_#vk_>`*x}Wr2XmF zpzd0Th z&eU3_h=&yRCLhS&Y)vcEph(uZf$qW(T5S^jur%L^opCIA%>rS4h;h!VHg4~&6F~w- zxdOs8C4;)7oVN7(gQ9rMhGkhB9U-<|lP3xiA_|=mN(Oh=W)3PN4f{|Mr9}5ec>quZ z+eLM6c8Ku2=+=g03NrDJ9W+q7@9nZnLw70YltZs#Y2GG?2}w zg)HO5J-f0K4e8i<=AFUb8qd+Vh1HeL5xkN9drmz7m}{$e)oUrPGX`#$CF1~lbqZx; zV1!@cMa6tNGC^TKz~s-&H!^pPp9~8|w^1rQ4VwLfT}y|HyqJ>*~?3=j3SLb$1TjAmcZbqYwf! z+vf$of>p3kpT~?8%a;u{{HHN)e+{Fw4p>X&n|8;)gEH82DDE12p0C26P1f3BwisIf z!+xjce7Tj?T~q*RYVbQBI`6y;8y;{=#9%wB^@w#$4n|qC4`g;Da{vKB&cZfPiQo|{ z{f|J#fvBHi9_5P##G?xIFtKRwDveC&hh!m}^`Q&7Z;B}c!A6vLO^UGdb4h{{1*Xm^ z^~P!65sAbPTki3f)u}((+vMOnp(H5+2VptW6JQ*Nn?rJ`z|u_pp6N4AGxMPtO=Ab7 z8?`X{_;ilCCeSCF{Q&GJ)5}bE{44ax20I*T=ARVhRuL$GO*W_g#>Trd)2pfqwWPcj zEEpxJt@XH(@MMRi7oNE=a)oP54d-dG{Am0bMvT$Jp7cSf2W$+4(R?`sMQ0B>V@`#g zl76NjTX{hW@@?nSQAj6Nm=}{|@nq_{0&R6Bekg_z>yYLfL*tgO>+QWxZEW-a=f{8z z3v^P|0|mL;u}|(xa;n@n{2Ht~_+9gqp4dL_5_!>1wiI})d!kJjWElBuLIJdpLj!Lf zok`xCct`Q7eTzHP(2~)kNq7sh*lI~6+-6&icLJ}e2#Tg=5R+2O$GuiVYSwfR4ZHOP z97q=lPKP)KDf9k-B_Z8$qCR5wqapFzOn_{M+5QyUuOY)BPcXDFS1c#4h{J87$h?ox zL>^%v!|_0mlaI9~EMxcgH4|zUq~X4x5V`>#ZR$Z-psxhHQ2?bFy51O- zegxe)SC2h}7Pb`i0gQc85T$Jt(on`INPA9uh2A`)MmMmQGPN(~NUQ6TPk`&@15GWw zM2b2o9=z8T@&pmEFcwrAVFfKZ6-JgC5Vk0snL2{-M>}e~c75aR`E3*z9>mBPh$>8l z-4kSC0rR4J_i?jNg3kmGXP#GQgXzxP_Prx(w?)a(o#|E}u5d_(`h&S?6Xo7p>bt*s z-p68+sb$<=I5Zbr%BDSv>GKA36YlKEvk~@XOK4ULV9{d`b*ln+6B5KjN9ejTS__*i zl=lyFB^EjuJrUf2$GTEXuNj1>acWo8BfKaYlk&Efcv74|!#59M8s6Q7OU zu47Y!RG&+mYA3nKGJ&Zeg>8&y{1eA#jKrrNfMBVEtKO|XDa`5$ z1VZg@pHhW0#*C&U)3lKY%%O;XtPj^!Gu}6y1obK`>^KPg=@^>6Z>BdVG*7T&WogVT zLTEu)e=|Yilm=8KiR`*F9H;620Hg3{lU>*W%KNA@gf6fAAyiXIW4xwjF@vb)m$`nqAn>4m#$g9vkkx*$~KWX5#? z;YW}2<6DT9aP~t)e|z`E8UlqHKGhmA9GB}Z6gYHFtZH&dvrh188W9r-GBdBvA%Yfl z34_Z#!2pa$Kw{DlL32QYIRsxuOdfi)FlO`kYWd_5pkwm~H9y%698ciG!A|lJV&U{> za1TzDF*x+Vc1myKmr7FS?p!Kx_uL8!D-#{^lex_!b4iG2dQm?y5>Ris`IOUD z@WvU@OU;iS%gAV&Z8$^wknCqR2PQ*-unfgLH_9Ra50DiZ_vk11{9Qg%Gs0qg$|4BN zCOO!%k2d#w<^CD|Wsfl;^P2oxAWd0-@op&|y$T&IiFlznl`GjxvR%rvEtI{f6iQ?x zinB5v)RgXCA|Yext3hv`M-|^ARg&q(+$ph2{I2{!B~KvsA62z4RuG#C}>Im>C{>_y<0PVHBK zyY_^IaNj8(=Mbie6)YT^?I1!I@lKyqRGo;;uepCe<{sBIDLm2UCAsG3)(K5D^H4l zJv|t=wFN$NGdKq|+6fb?Jnbi>+I4UZ1p3Jk~Htj^nOik#BX0?P%CulOWIHxbDboxRmE!D)N*;V4800DziDg3zomI+8) zwi+21Z7FSMPyfE-E#&4t{kh{U)aE{&vEv_&4TFyP0(+Pm&(>{#ni+Kt5hKKk88K;gm6AC05dx7i9;v!RN>u=#`9uYJ1}M;qhQjb_V>!awG*6%(MUW=) z#i;+hSTZbYbc#=27tZ6(^4DD!2xw-2j_+4Me)gH=*9=T~z7^}jn7568XwAkkU_4Ev zlY`(poYBefIPH_(=9vMy`unCxcS>>wdkPb}@XYW_(oWB`w_Ni7xw+`X9X8EVx;IGs z&krg=vRAS^VG;)u`QkDcY{ZS2#oMb0f z{IsSjx<=lO_oV``z2_q2*AhinpeRc&Pd+c>k29&G!fDkZdZvEwg(;$z{6Zee1Q3i7 zlfH=kOfe`;FtC#ze2tRI!(_WD1sj#!^9(rW2($t(XY#lo*wAO)4K0-Sod9kQUPZ4* zAqL=l)+pvNE?CabSnp8!#Ga7bZT2^r;etiXku^{R-rBjD<8VFoS$B7>2|oED@5N&= zGG#A0KM^lYvfn-&~4_^St#KF*-)+O-u%{?sE~-Z2B+ak5m!Q_CX{xro47^MMI`;6` zwM9+b0pZ@j@TqHs__s7CCaHXJb+NPes(|y`kre2u9SoI1ow+S3CV6zMa!4?yC69S- zK&owSUy?~SV56}cZyms9sXwzDdbu$?*y~gdfSU>xD09{K!|P7;hz`S!Kw?Mp^Qym7 z72=bX%`xLl9=e?6gEyg9%zGw|Md`vdp&8AWl1#W`xCBP=Iu@{AgFE< zLc%hRcWL@xzGMr%^z@48$HZexTgXrI>pb^G$BDFXJ{*E_Q35ITV>6r41w`D(nr735 zB4U$b(})Y*`18$#QxVg2W?uAa;mHhl?oMjSn)9;fOeZsjNQFX2*TSH((6--!j+?u> z;(c6oWQt_pivbiNY$mnt{Yce%`zP^8s6FLk$f5c9O(bxYOfLpN-rdr(q6z z9o_sd8u$dW3aC_)hdm7RmVT^v+do@PoccaME<_l~t$LK`uzLPu09f?V?tz@eghNa) zh;9uo_ayJkh|WkUDsLXM2%+J9UYZcrFDlHA{DVT(iZ0CweBwV$7;s)3j{wM(+!`$f zIWBI6_PS1hE%8kr98-BJ9CAh6k2y7331g8e_Jx2rvQ8w*lSMS3*Nqkfu01q-+$!Tk z+|O4|rl#4v-B$$z?M@+;wD!9fr&5j7P}{1KL`mczWCa&LV566^MS!m=v?1RGMwblo<`%w;+1^RZD-C?#ugr)U>n2m&9^g7XV>V2Ji*c8hC-ga;JvFZ+gA zFZ-khT>26AQeMrGWd59q!B^Ynq1+7=-^4!kaBmPr;HCD4$kPutI@mwumPmJ5tl4G8 z`?~ichjBqdnu8Sv2I!AE+P}cNZ#7-DCza|yI(BkAlPMx5CRvDP$&A{Z)f#FFgtnUJ zYp^*F#ZN)oC<2I)6ZvxI`Qc)&@lopr>~i5=GTOMlGu8Ct&v4X3!(EEDQ$3tChAp(i zsU+quRWtGNQ2IDg$49LOjSn%Rv?#$@%4X1U?et)I^4 zV}e9*rk}@5%yQTfZAHidzDOX^pwR~dgxembDc*ZT-J;-}dM18l$8>r2jGc;X7wMhR zLIG$1USk1RayNHga=U-s-vsZPdPBCW@)O-dw5^E&?UYJ-3?2ur zOi?|;f%hX$xHVxkBREpWX&PwjNoPWJtqL;L#L)6!1 zZ9?{0HB)MM=_?}4QL6hftze%RkLn9~U~EVjd1M0G?LgF`orceugZ2--Gs$MIQ`(2E zM_kBS$SStSK((T4%ku@I&)CnwTv=HkroE6d=K0gynXt&*mQqTwP&CLeRV@z7nteZ| zw-fD)KdlQFP#fZ9I38)t!iFMw(qujK3Y&O;i!96y+z+EW?p@r<3>eB_VTK zdgJ^wSN&M*E^na@l!$Z9q9*%Ys5j$SO;+$s z$MmBJS;&up!46xXRL}bLCNkeWoKW+<%?U&sfQcZ1ZDU(p628r2uK;uu)K43l+0qwv zP0R6O!-f}#!ui;FPt-w5EvUb-`4!NVas|4l_#MuOAk;Oe$*@opv%3CZgktHGov`gpOqiqXn zVTXH>i#55l1TKBNa%tiK-FardB$5Z5 zUEqZ55XN$dfLT#ebviP}<3^BRPA>{j5oQf5cuK0at>i!ia;c74vHvJZ^7#gxfoU?= zBMuRx46(5Z{%f}Z93(9En--cJnlb_)|NfmWAxthd1wNBxS|(7qi3BNZ4ca0USo?y0 z_9Mk&d^d6Zh(eY%D{!UA&;6T7v0e@__H0?x@p|+emo=Hs$h>3oT4a>_&G~_-r zK=mwOpfO1W7mV;yUyJob3(zI%o^~YZ%%BTQN3}%>P9X&c)QR|@eN-u;o}#Ad`;&Hz z47U3u>>&b`296aq3;23Y$Tl`{nPjLmBn$J!pFFYsarwrag5ujg2U0B;&-!-!M;KjY z#&!P`z`1TYExG|+3AIaD< zq#jhe81yUWY{iFqvgwBXOul;t(~e_G2mLs&7_LQW80GJbp(I;uu)X}5KwQGsnaQp( zJRwpLBnnrAY)!JPd7lw)BXL&jYf@TG6>g1soUm1|aZOndDfhcEBb;g!1GNLszgG|lMZnF8qF6Mru} z;x$i2@u)R`M9@MJ;DHwv?o`EA&r47zL*MkhRpWr#TO9yL1&iW53xs#sAf{JmP~J(y z6X8xnDn!9XJ6`xxq(HUP9Swk&ZfjI@m5e0D8T-SS3(2kH7 z1FQyW1f`H`@u8M-I2rci3)g+%YsuV2-Rtnp{EH`#s_&4jR)p9Ju(?0rwWg5eN_S30 zOF8{j715gu1hXc3KQG>rT^NG1`51n2MkTej6;JXUMem|r({XA~_T1?VA3b7HB`;W` zfEm>Q@N>{QuV+p?;I+?AC-sc5tX!>vZRd>ShS_HqiA0u|;5A3?-EMFMfiVOyrXL$3 zP~TKcrfZ%j2Wg(*0ra!XcVHFkab={hp?Y>tH}lFWXonanmQl&tevL35BaU{+Qh@&R z%5F$rHSv!i-*@V*l&Efq#M&n$MlPrd45HjEpxT+=j#$8A>FECDR!EpP1)|l^`-+Js zF138ceDLK(pSyEcWgvX9G~n~asZ%8-AoLf+D<<7|Jry80;OZRQ-|#Kx04fk1W#l1c zk%*sh^U59#EK6tkq^&qRxG^k+sSTq1uSNb0vY3{*R0UdZB^+CteYmccvjZ!- z>(w4t)-*Kjp7J9E;Yty-Wo;{x=Mu>%BqcL>>Mmtd$-SR~@#8S|O?sg$`LaFVQZeH) zvMP^!;hJP-RPQ*9^{+S_{X^BJFo&e${1=HMjw(HenLIw-Z>$`Q>na$RZWcs+* zHd)0~&;^a-VCcn1YeCyEAjWPB;gZ4?+NY9X-pJU!XinuE=n| zk$@tshhPZ&nAh%XAR+~!e1C!n?G0G4gl8ScP|9nU=rVb$;*U^n180V=lLxbNVS)z} zZOJ`5nFz`p#!;n=1TM3TaDGlm&|8V~R37a8Z z7=C{9M6*be)k!MLV0aU;r{PrtM|7x3dIdVzFVW@NOGnDd*CYsMXnjP9Fg0jL>*`NQ zp5vTlu7Fc--|D4DVlJr5sh*V+j7Iv009NI#d#O_a;$7Mz@T|a@xxtax_nGL*tdw=s zOF&3nbwt_*FzzfHDB%Xo`~Tp?h1drWa>eFTv~H~qU{1Rc+aSdX_B0a6`y6^Q1%8yA zE(VCwKr?+Kp%p&P$bb2Ywr$KHDV{b3U&&f0;7i)W=Ix2wky_mb?-UCYPg@h=;RSJt zN8f_4{glkjb?k(MVL3ORjGBS{_m=cCY0;2|!`zmcyM0{J-HKl)xpx5ES=BsW0Qc>i zDo$BUC4rr6N0G2ty6+SL0#mBj5-9;hdZ%$;yY(sk3vNA0%5;z=&j@t@+U@4*OFkP! zy3qfI?WW{^D0Dz@=%MtZZ{x_D>)Ba9bu&30L7I&uFSN2D$MI?^mC4Lj;#)k?NuP7R z#Ej@GWZ!??0MU6_c~UaT2+h3Dw?OjeyhsCM`Mas-11>P;y||i7cv(Q#e$Wcqr}8&x zmCyo%KL-9ZD8s#F&UPX9N`uF0QQk+cK1($yU}R| z=Wd(Y{xrt+Q^p)BRp$b|}jssR1 z23JL}JdECJ@H%x5HPXzzI?vrg&-}v(66#z$8f&mDQCx94pPQD(gLLqqD#-jEQfzL} zVVf#C6K2)u;b=J~IMHsW;!K}VQgnMTT!3Uoc_&P-g-C-6z3^bFNOK!z@Irm+a1VS^ zy`7*Ry^r16SgJ9d;CpV?a(XT!0-kiRQ4>f^Bl{$m4IO|hXnNv{ppRlTZ=LuG*+PCW zOkgQX1GmV__uN~+QfqkZVybx}N`^z{%y@q(Tgo~=pBPQsv`5pvp zR3nt!@X-KC!FlY5=PWpl3qAvjj_`Xf6cx@ayiYQ5DRJO=<}u_PJF6_P#6lW$Qou(~ zcSLwHRT!uk*p--MCoV|h6(1b)_qxG3cX|CICKc`0IYGWPHI7afi!+HDqPTF=_vb!g zgLfSC=lc&~Sb6Z7_Oi0ib<2h3Olw(FPLIuKLnCFha%L^Yrt(tRw7=`~lFPV|HR}yN z`}-}=lI_iJOb8y-6$OuqKjqJH|3n{FL7HZmYHyUHWnKlkINYBc+oDKD!06ub5L)O3 zHMi;Hm-9MT4Mu9B^yxw4r(b95w0==b^3Su#w!Xxf_lT z+7(P;^?l=c7MU^7xN-dWHKXaLe(~L{*D{!*6)EAl3V-@nZCOEHr;e08+D$KAe@}*y z2^qYN-kTG3YAj`taew4OvaK#j3NR4lWS(28!MXyh-i1T^qjBN|xX9rLo&DPDjLra8 zb%Y~RHcmrNwpJPA?|Owz6SJ9ia&?Qr%Wm|F-Z)L)V&T8xy|D7Q01Zpuf7rb0D@odJGXnJ`|mHLK@7hwSU0A@VNTt%GKgzz_T9A1XI*$xV7Jv}r1 zyb~+n@v*+7Qy9>Uw{o8batL09*P*jxdS@Hpokqq1-+-6l=@?dS!_a8p&}%$jQY(7H ztC*6){8?VY{9THNs&2lKzmAA`ved3nVDhQFNR49+Mwz-IM z4&S5QMc2B812FV!*!HNy1FhK2Lm2yy^jJOr0bYdvEG!!Nkh{SI-Mu&XRD0)G@fDNQ zpm*}*k-0%%1=vdl=gJ=+5X&r^3KC}nV#<5+aDl1@eS)XDm?)qW6&~_&q3&o7MsCUE z2fajYbC8fdKQ`geU+Ct&%%KY~zRtZ;=WNs*<1DCdP=m_r#kv9?yqBwS8Fg`IgB#-` z`paunn@Iw-V{rhK8=873YSH@i_X?nMSl;#uYrDR%40{*tot&}`1whe89Vq?^maLOU zIPK9eN1j~%k{5%BsG?|GwZtSO2iB7-wZ6WlK16l=4zT< zV}nu(_=Fv*#G@$JN?2gmEM?9t==3|Lfn^NYVjM=|`ar8sACokQ`x3u@IQ;i5FkZ06 zx;7G@O>K=mSXD1a*^IWDELXY7AO+ncM+r+TaH7ryn_IZ#kOeB?tFb|JFB%>b!~Z}0 z`xhcM=@l9_f(dKFzv&xaAkYgN9!}sB(&09JNKZY~#0z3=fg)S8+O#Bvp2oJG^ ziTDWE9NBh~Sxq^t2Ib%20DD1S`pgdrJPjzX2+u2UxXirzZ z5FYjj{kVaGd!6Zm1|tNXmf%$pSYU_AVV0{9T1&O4&eOMKi>P{-q6R4H`K0{k@Nb6g zWrz&fjH(EZISQ7F<0iZ!49DSq)dFdhq(~5~n|IqK0A41Zrb#J)r*L{drya_OL1Oj^ zE+Yh`GU}Dns!WN@WfMNPdeXC2RJXOJlDk9-oy8oPHr_z&_u8r=fEIEeg{TPW2Q$kt z2zvd{nj!nRLP*LzX@1ELxFQfOC!|n+m9{oBi;d4o`=34%%TKfmJoOj8|3Nq9ulv#|XOqMi+Uf zB2$+$?n$>Gf{x-*JH+bkeS zYBLN#P)icO!?1zEG#bvb29Gy9!|N7j!u0#tAec2BfT76=XJ9~2+VgVGlW5!P%%37w z#Y7f2HKL%2CqpM5E^@!<0{dmY+t>_U7XzI`^$|i9lImn&6Cy?Y?4xHLJsRT@&neN< z{S+q&j!X<{DA9wZQ`XgIPy8-8CeU<4#-VTlVXsjdw)B09L?n4#vm<@(+#`M=yR74! zM06WH+#{K_9aDdgIgx#p!dS*dw-Dy>w@xMk-Z!LlX*E<>q-@&ttD)8R#-@% zlH@`(?_xA`5hK9vc=?BC-KkIZZrA}j=|VqGZQ18o8g{DO-b7+a?zKe1JK`Gg6FYS= z0NzMN24#lO`W+=L;SIZc798dlA-0o#6GVUn1_l{&2@md_CcSM$_ozav=`#qin8p~p)T(6iZ- zn)()H`55dz`T;!mx6tbwtUAg-?H6)<=IZ^NY1Qy5wH@9mt;oyg?G|^;1mYEGx6!7w z5y@1dQv?MzRu!4mz;Hk!b$Ip-SxCpsc0C(!#E`@^pDdh+huB!2cs%JG-$@5{SzIf{ zefaxbhtw_03{Z$}uE9L7!9{ri)3{fWqzTyOE#k9Z4i_o#fvDi;G*iP@`6B<0UTgd> zusji|1d~H-m5hyrf?|mF(9pHs;8mO3ox_+>M>f1ZOFS{{Jyw*xjlAD$6BVRKiZnco zi;z?(n`3oParb`X4~_0v{cNg)2GsWveGRoJfN!y5?UMhSsB} zxy-0K2k)z)1QiP?^8TD^>*Smnb7X@1Qmv)ih_cv+Vs?}-~I!& zMM?*6w}C8B*;SO7lqNSM*8u|nt|>%vJ!DdlSrI?lJ@%jP7zneEgaTP8I}ZLm*XgP# zm>1aGq%%8dDrKYpi?3GMCiq41nGg`jXn=)efChsg4xB%6w9mlupwN+}znIbah(+n!@z8e(MST>ej`5W@eWNK z7wVW6?kLv*B}~0=8w!|I!s5TD&>mwRZtq}`Z6E#_bdU=v8Be^$XGpl2G1zDS&6`0M z3NEe?dd?bql3lzTi=Fu_Wo1U zhbpJc=fB;BokmG!f0K~Dt^z{*^zaY-m@-uk4m8fy)z(l`Q|p2b2L5jA?T7#2aFkFf zPpneeL%}DTw`w{MPiQFS(G0QCAX*%(hc&%;27@zn()ALbbml%RE?#Q0(V~6OLjNJr zVyKHWOVx+CRC8j)2gh~xYyQf9H0~atU5k~J*AkK=oAPdm20{e^Q6x)K1dOb)FAFcO z3atlF(e{7V%!hoj$@Q=aCvQ6|QD{9|*hw}cD))8G7E`2l&G9>Ab;R8#{n_pG2lqKF z;Pp$=(N6&;zg(#6PVWkHK#9|!UHdqm-0+N;$)}QW(=`?*m*hh)!x5D44-jjM7o`NME9dCqn~E^6@^}zWlw$B-&bVU>q`$}#O~c? zCq?F$w(=K3p%&eRp;fSGDOY@+*+pZ)dml(^ZH+bXpj10#+g)M!q67H?m-xkVD-pqj zNb`n6o-@^HGpPZu>3z#u4aaOUR(hY&B%F&~r$!Sgizp$}pMzf34ZZBG{U}bi0yXjZ zy}lC7YM>Le$se_d5}I}aRDx}|8+TAXgf z)oL!(@gs@?cAYIwc{&FMC^BCYlA%XGnh&+Qo+`YN5O)Gx2AE@z0U0p{BXRijzGe^j zJP)7M6g&OAlp$aGN$R4lh`I*ot9GTQnOBZL(oX`=lMb~L+Hqq(bE=S56IEjw(S@4> z??sgg!c8aEc&p)+kvFX1IvL(`bmZ>YXn0~Q1WFAuJz?~G<;@O9eYK_8kU}sOMykSd zzUayRN1ZT;(n=hC>jS+znx$$VC~>tL;JfYGX>f(Xu z^r4IT{OU;D$JpArnrkM~T#;xx>6q05c&{e-}|*5 ze;W3DI>P$-6>U^FmeE)>Sok zmj!{**E5>wsFg14J!?LVZSj84F&qj#Kae_h$|T5I_pRU3=3X5)N{I$^#vD@{q(IR; z^OsP#O)S?sa<;K6Z)um#q(8}k^11jUb|%b8A|dY6Z^C zWQitTw7+^cl&4HahuYqiKXf0b!Tkuzf!xmVC4(*kNw?8t7AcveSS{aPGjtLUBh8di z4a1e%dX#NMElVJ-x05%bOt2b8-&lC0T+Cp!cSW0tm`-*Ryf=Oa>k=sEo93MeA5*f3 zW}+y&F0RHWclRVYcXs5?rk#`7-|@$7H#~LcU-s4Qz0Rj)$yNnZ91K=a`(d2y=oQAy zJ1Q0Xg4%8_WtiRd+}8D9c3dbzctk5A;mwvUY9UE9xq{V_Ahj9Z7eG>W_;Tm5Np-nM zT6F{xi`|UXI_1amN@7AXLxWGU5qLF>`vUX@^|G&Z{F_H3Js~X>WXyEuUt18mzO~?S zy(|4X^1^1Ue&%UM8!ohCTcS62*tgQ>QM?k~j8jsBasptINo$&p3j(dh=aAGG(AqY+ z(_T0WN4Oz5L5DNZcJ@!J0qF1N9oR< zec1!d`ULbRUC|EQVlach3^}&S4AABDl~q@SWlVmT>G1PF2kRsQ#pH?kOn zqt7@8SI8tsMzP74QnJmvCzX@1@M@EJ8heM2w1g-W70k!L;hAenh$J{uCPC~z-rdjv zJz;oU-}^cVhSYgo1b?Zng*P1A!VOcMa!;A79u%$sTqF8d+cI2F{1ICku z4=#SXH6#-E{PKp4Gl$VNo8Ok*bJiUu!uSm=cjJ#t>r~$C+SC-D~-{r!_PDE{$Dr@#zdw0#Cw`TFgr8}vnYKk%1p&i^6v8`(2 zLTkc9LGF=-V~DXgtyoKzL8rW<7b=)hhGctFDtg#^>>|9d@hV-DHz2j5%O`m9qN)Z> zEqdI(DxEu@&27HkYOx_E^6mSa)j3OHxfj&4Qf82{Qz(q((`$NPH>U+|lGeeq;JE5V zS~(@VP5hD{7Wo!W3sTg3bVwo#`9(z-MU~q{PVsQPk25HJ)%Q{|d*Qv^A!Vu2Y^u|k zow_0Av%TIj|NNQZVRU6;rei*N?2#-M3NlS|r!!wnPQ6I=D}MVX=^x`i9R=dp5gwY) zMGB!~BjbXRAj?F=Nb5&t3uM6+m-oi126a?x$Cb9wG4@n5vkI!q^^Gp{XEQBh^F)Z* zS7}C8?A~8n%-G3nxmBYCw&}FR8tFCWY!rbVqPX@vZN?|fyq+$`8eixhe>9?Ko?}K< zJ24k;sbIDyV@)pp zj17Soa##2(cRQq^p(3a)S%%jPd?VkqV)pib=$cRz<;}b=kfZhe%c^FL!rP-QqnP=K zOsbwpasOETDr5k9sA}`K%$8A??lHN`GQ6DJBDdDPw&06z{)`)iAX7Qts6V3fUP)7y zvVp_ONvD02f-RM-*wvRm)Aa2@x4OIc%chp3#W|8IVMTOd{P>*F6B4xn2##6x_UTha zdmel0F_iQK8S-gLVs6DwOJM6-E4cqI|7ZvlSNPW>p#^%0cCYQMXZFwAHoJ9Iy6%!t zLNqwWumSC__DYRmLY{Wf;+X4PLg;vLd3a*9t;gq*Q}3v^9mlW*4IB_n@AM0~1nMSF zBrLDq_(D4z#i3+6z9~?10S&Jl?X_((k}!`CLnR+1D8MCZY?09rC}{XI7F z20321fn-8$9Bk`+{hq3t`hhOeh=lX$kQaQ~vCxsJ_kexVd$98I~!XnV4=@3xcX1 z$9f1Rl~pN>OkgDN*BD0Co^T5;7$rM<_KwZ1j`|cmDL*FN9pAp_LK)q-)CT{IoH zi;Y`t`*t()X+^N7qWveHJuMiWtIB<&06x&4@AwwOu!WFSHuwJ-!xna%YopfLU1gP{ zryadg_tUNpomeO2ywvc|r3^G$ z16@HbV?j93rFG+cvb-mb^7-Wa7jb@3Zuihj?RT49UyDc*{8Tw z?`p+c{d=?Ls(!gWn;VITg-D09xLH(HoZ_f59JwIXd$=4?LzO^v7%7{`M#?EitccJ^ zE6t9nZ%}ws>_gQ$er6p2EPAR+>pp-zQnNr*+10b(GxpvvBu?WZNp}=`6W>hPn^98PGb0pSR}he} zN*CBp%$&pm3@CT%WFmG)f)3;duJ%H+ATDCs!9M2trxyI&qTh?n#r0BZ1yrhGgXOLm zsq?{{Qly0RO%u_%#Lz}e)MnkZ_82RR?MGPf?|^bo{g?w04(-Jhfj~_I1uK8BcrM(< zlS$~R$5>WQ@4QNDj9KS2P*ow=AzKY#O=ut>wvdK!>=lqeLSe}W7_`grQ1%6?h_^UYB4H ztlq7qsz7Jg9As!T=kxjao;r`@Mtuo)IXEByN0gGND2nP~_b33vZ?sQ0y)HF2*DP#R%iszz+i zPaH-I!q)>aADE}zHMFoLwG}E~=cjOB=v3+SF%byTjwT;Z-J29$T|bb`pnXChExP9L zSEf2(iFWWtgb|Y7L#a2mw6`UPPaEK1J9;5N(CZq1O~tDd85g&uk_pFXDxYy|>1_UD zn@ovq08W=*{_%rgU&8ff!*%#tQV@Tf0ST*vrrE?M4jjDk@~;|?OPJ{1^y;S9E?<;) zUhK+r4lh?DGhgi$#JavSGhvqw@GT^jxDkyy`|58NCz+#cO-mKFAv<-x0Z2}D4ttJ7 zNCdxw4+?d)d=UN78DkUa(s(NEK|~}NO9)b z{wwY|qRw?NGmNZrn%n5@%*Q2eba(vKwQXy&$RbfZH1>$DnQg6xpq#&q6$nKkmN&FE z0P5r6$EXJtBqq}sJl1%7`f6U=v`I~xdEjZ$7tpqrPC)V#k-}${c0CS4nl0?!bo^%~ zpc{Sz=ZZguSD+n^!x2g3R+Sq^3TYyfG5xXdpXgx|Qe1Mnr)o4L$@m(f!xC~swb%gU zi}qZ>|X03agC83mj_-S=}8f29*aArnHrRl4R)pB2fuEJ z(K7Mess19=_KSwMX~G{n{j^xgQu9NX988C#L%X3|;sSP?K7!5`|H%|=#n~sd-q^6e zt+r!dv5VhrPkq>PBeFg={;6qdp}sZiPvkZ#b0fOh&dNOdn^%RwKG;3dh~xu&Au~nM zSX1LHh@C`VRNFV_hUV1RrX%ezd}l(5NMq|a#5uUV!$m!s`7yAI^RW^oz*o7xxh@-6x2p~h%h`Fy^^mR(00IvYqTaQ zH+Uo)esUV^1%C5-tqF3%Yw9R_uI`tNCOK`?)TV@l3(bhzaavwBpo7GNQ0?UG!+=wf z(w+fKx7T?>kle%2-c4fSOJc!?wKtGf$YvXt`<}bgb>tkU=pumfQ3rb9`F!9HqPbaM z{(%c(K?{N-{mj|k_&GMq4L92s`xc$_$@;Q2h2-<%J6vl2r<3_p%N(k@^&i#)9M5y$ zo%Cv3QB(CY!S)YE(Uv$OgV-6@>JJ$_x;~-5cXy-&r+ZA{y4Y?ic6)6892W=qQE-68 z@5;VdQ3_G-7Zdy#6WFbwyLcCI8uD;t8Cb4M6ffcivl&?yz`S?H=k$Z6wX(#OqxpRF zm@k2WTi@W#-*o97!7K)abqHGP4CM}Cjvf4hm(~=z<^}x*?}>yIWs_xq!nLisHB^jF znb2f_TZ`|Z>j7zDakGcSE^bTAk3rzjICN5mvHD4>nvhiMp|ey`zk<%7YC&RERcAVq zffD*l?r`+(2NlhH9fd>cyjI6+BTGtar;ZV+=bDHek`9#ZhW4ib{-lk|D0a?MkeKJS zt)^>s?h|l6tg+rY0vQf^`uZ(XoBsTjR;PIKnPw1^s8?J)C`w+&e|G zp>u-q&=+*|^rwlXH1gzWuaG(kxdq9nF6dg&LpYd7>y1?|P8X*0L-VgJN!+!|wv3_(o=!)*=t@LjCkYswY)PM7AWrK@uHb!nd9 zKKqdONV3Z=Kky>Bg3ygJwqe@;mzsVvImgGq`oT?F=lJRGzw1>q1{(l!g5nuQ7kGGz z5BeGm`)Z|nFD=(ADpPIpwY8Ws8%!pn>r4InMz7fUZIb5+@KyXotG|W*X48CMNYd&H z7bo_oe9A6N9_T*ovduCWgFg&l=B3we`BHY3L}FYdt_Gu~1%aC#umy~0a?SDzZUt#f zMne4@sX*F%gqghUD+O%(|9xr(rWA`4VhVpqDqrl4<=<$2Vwct)_D5jDq)e zpIOv2&e%R5x$;C3c%y#gO83UTufS#$I*!8$_(%9D^tX3H2eiRWa5UB=s~(E6B9~=6 zz!5kKFThq+GgnLYuiio4lrY-3=Q*+9*$1*HHnD0j0_l~;x)?=sVdrC5+P{()+AcVp zHae4gRU1A$<81Ss3K$qunlph?&Cu6MU(+68f*+)$jq1M`*^pe@(?7n42%}o+vCuvb zezQ2`SzvmK3Pbo`m=3@ofPfHc-67*3kM z=i(}8OD4bqQ-$H{UTY*xO+`T1Pxerd*>82W(+dU27xsfCqd!D`9-V`gJU5&QbkZ|s zgkL|fO~1COExMBLu=9n;u$)up7v4k>g5irGrc{_aeEY|3!QopA!b+~o>JiPVhN{qo z4LUvK#nZgXGy6Ef*kduB3=mV?EPdWSppPQODE@EP9ojfK8=Kx&gBsiXqV^nOpSP@| zX^((gEd68^*oMRq@|Z`>AK_s4FdK~}*hs6n#XEIT)b$6^YL2(-aAY=RdQ6j9f)vxp zvkAIV&Rqfyhne|6BisLuDQzumpn@$uj6cBZtcN&xpNj=95Uq{+o37jg@m@aNI=}wz zP;xEtTE!RBgZ{RWYP4Dotq3O+m9r*f=}4v|%ua)U#Y} z^{gkKB zBHmydPH+t_B+4WFhpbJl>&a-ap`p2z#&L8o7f~^|a(lU4ZULh#-c|wYK;o_tdamhD zMSU`o{uMr{%Fnrix^S{WCn_#eQCNR9M#yC{ z5y<_0^Tdv~GZ;p{^rU^#Q%U@3%hVehc@}K_ck6GjM&);)dR|wv3%AeD)lY&U z6qzw|O+G5%2IdWlCVneLNu!(~9EC+y$==rRBu)#llVvwiQy}O9gUzC@+8kLz);TNS z0E-?id|qpB7fs{iGN(imW2?7ul&t}@B+w@`=ZYv}ju_mVKV?HeSkj;&0Ar6b;g_v+ z-;Af9c1K-j1AQSV+0YB;+@4PE@EFSxdtin@{}WN5td8nDF+x#|vGh)2uZA|lO;1+f zBb}H-jygnx{KdwoYV4Y@V+ib84Dx9E1?>a&m2mr;w^UVhK(^m6?w{C<*D^iqgU3(# zQ(WydSK1C2hyk93Q?TGK;2PX&%I0%%G|6C_PnktGOQ>A9jW5KovJ9MuJyD-_0iK>j zi4`akb<29Xl;z1_qgSAWNBD4-9}!v(dia~V*DTs5TLW1p)Zlf?Bf8CZnG7K{w+ts) zM6kTxm(FmEFi1wH{66C1TSP}F@I5g4YFpfGTV zY=@x|v%Y;;THwxO?14QlgwH|QPVsXJ*I&Zf%?+P|rU%SxAwfobL?(0}VO|OPITZwH zTJ2zpy}Hn;T%w6^CDC&GMIxegs~KU#O+XKCHU$;@f3nB441nom5h6Wd-KK4~Wk?7M z%y?wO-jZyGuwlu|LOzKS1$ZDTgP_1WQ<69FdqkGPwQC-)6eouI*X@ufA(Z!=h4b!; z3#G2dzSrme*eKPNevA^thq|SnFxnWCEB-qCP+j|kBI9%4eg^D%6Y~f*$l5s1dBz7q zD24F=NQ$Kjg`xfo_DHB6wU-2TW$m5eCNxmWrbw5SFqqEkCGpfTp%LE|)KvN-nA#Qg z3{khTu?IQ{Ma^35q=2QxAx~pE4E#FaCFx=@>mW^_?S!wtlLeM$4+tcgN>N73SUkET zdKHaR84Q9M8<%_G$(S%_Xdnj_S9YMTCr@V|5tL`6Fe`~os0$Ef2di1rNZMNz0HUzq z*#sX3$AWs-9b0sUmUPV1TSt&|b%R3A`uv$rM*JY4e67$_PW%;tK)s!C8e{N%6v2jb zXrGzGAyyD*JNCoEH}QSsn5`4)@5UP3QxZBKBw@sz>|g^+%3ke|zcR?vP3dp14mH0Y z8h9mN9vw)U&2{N4nZoee?7mmfz_+JdOW*_?VXfDv$(6HSbO;=1(|6 z540dIbKI#oVFg?tCJtbnf`$B@a!vy0OAvh4)Ecj_otI)b$!iFv zM!3FAwn`az+JO6e&kG~DRTTe#SbY5ZFZX5T`<4y8H7_aiw}~)%ME;&F<-AEdG0tfE zF7J2xwbSUBsA#jbe_SX!peJF-+`hjf`-QDQdZUiR!$4aU|DMbXM$*w8YLVSUC;+3Vt2a)7$+Rzog6aS=Z*6;`QsY(nAxsv2)i==;N!c zH|>oyrne&@fPZU?$gz^{r#*8oU9XitZM}%&bA5X&HQJl8T0ntaZ|d~aL@;V9;^w$7 z1Curb4O6v*;ZN2@`_P%iuuJ09*xp6J5i#qjWiNE>q?bSDw}~NWMD+Cqb~vwd)1kPE zDa2*RDk9tu#0cw+3PN7egTuMW^Q20JejWTS4KhsRLGX_{gZkN@k1Pu znt%c3kQUC-cp3Tc{BS08<)b@j`;e}jsUeICW65Mfvo*$|y3b!XzVJKY^&1Hvo*3~=N^!?CNn@>S(^|rs65$l}Nd3A%W28^yXze8Z#R~Vw_m`~w|g~QRQ zncueG&OLrqT?@VXb^h7d$g}nL!kha3{zFO>n!x_*+8X!AKQCsV&CIQ=$!ib=t_>*G zLOKHfA%L-Wuy=KEP-+rq1^C{u`B0B)3$;e5kdbWv?n1>U6v#VdTfd;vmQ}*SOZWie z)swsHp$W*)UP zk}2SgpKz@MgfFvcM1Aa};DydUQ9IdUSG=2m@e1U;S(3!I8}wM0q%NaOB8X#^jC} z-Tt-j`Q1o&OM3?+0dZ}s#}^M3(Q;h!=6Qx41Q_i2bZ9KsYTF!Cx*NN@)8jLCnw^~N zxao1$H0k&E`EAa4&CNeX%UZWe6cDR{+&JgrsM-38j85b_jBk{fgr=vq^A)_qdPjsj3G!+s8UT90_lTP(GNP z&HY%ARW+JS; zz0~~hT&YVWH8t>n{zc2Gah7!$#aJr1#+oM}hsJQ-61a@ZtMsJWb`*?6)v7$Ag>!IT zu6u94c=Khoy%vf#%c20O+0d?Vfk`fLp4)m8!d3=O*Bg-?nd~T9uQ_<1IJ_U9v>+Hs zUcj=}5wKAsd)Jad7U9;5;oZcXZmKACq3e5S`W0&l?U4Va#BrtDc|ztWk~Q4t#P zLilt7VB9gioGKCzmkfehYmGM8qe0Pvg`8t-Poo2kjj{219Q9tXFIM}VTP7kobU%@k zT3T7Oj7d0)e9;CP5I=CYi;X7i>#UoRi<&>;zwrC#^oM4w5RBvP&EjyG}94=W@|1cGywkA;odn-KRzHO?U_|3`rO@UPoj>TH)5U zBQm^br`Euw2GRV-mxi0eL|lbtC3J(Ct)==Jwhs3XV$0LfTmm8F6Ds6jT4Vke9KJFw zDU;Y9ILwznB9XF*`HePI#@y$OytZfGqc65b7#g@P>C=1<2BE+l&tA;Udb0!f9jg4q zOo#)5cI+Z-<2a|3hCkP7GO6KfoPg(GEipB6vYMUjW&+wb2JgX7;Qzq0daQ^tXi3SK z_n?=4Fky70LQ)P=Sfe3u?-Xm)zV;6HoIbF{Pz!JrUedKr^J|`(+(`DCTX(SKKP1m0 z=jFVgW^VM}oZHs6Ft@+tJK};!qedx=W& z!j#fWVpAZ5rJBS>K;Pl~N|{{WZ@HnycH2{uE%&iYaDKyE*}<4y*#Fqo&7p$-|518$ zQWv+#1IDe1M4!z)T)M6Hy7D0v$?v?-Q=XSJv2@8)ID+c47nIcA8{vB(N3edZw0s&} z1r?&6QU9Y1#b2=1J65YjWyJ=#beo_Psz_nn2=aCG1Ym{obZrGeY*u}p7*U=`mmFAPY6`GUf`lWnrPgNb_VhgG11GQMcaeTlgc(Y0HI41rnBz=@?j8wm*twryH| z@D+zCqnzIb-gNCRR62t(+duvNlG{%8o1u4$x7}mWhd_u)i5|GFy$u@$VbjN=Fc^hB zQy1~Xc^7$5)1^u>qO6^gH>X}jdb2+voQ&EA0@8QqCYs_We4PV}ummy;b01;WEL~ju zzY|WftgL)y322wZ6Y3)^>~;yrKjD4y3Q6w1&s2%_IG5H^>j!fO_HD5~v$cD3_F1MD z_@gxuI8|5U;(kd`dbd`}y5zE*59cn_jahko$PsWiRFBVuWCfUdQ6N!?L#nJLBkM+K z2mi}Gxb1vxIm8P znzoeSgf7&k$7V|6luu{kh6oz*C8-cY^C&#`&4Mf9anvg7FA+`~ioDVB5*-$pFgE97 z&DFgfldJ6y{Pz#3S*K%AFhNa0m9AK*-6?rf{ld;JwLtd%{T3rsSbW`qKFt4qOSWEV zP3t1g8VGfO)t_BM=JYDi<|sh$Pd@6d-lTfqQ zQ7Db%h*=!+K}hZc{P17-D>OyN{X_1#rDoI>379~gh&X6AHUKw2RxT} zB~eN`B_g2T_!0OYxqdxY=@36`xKT*GrU;83yQkPt^~y(AXp#Jd6)_ z$uMq@uioDK*l0TLH4-@wy{&%0{aPjOm8__QiXp|4WFakvE6O{`V>=~kl$gEszT%@{ za|krB0g+Mzk%ljRw&3k37Cz$|He$YY2?Mz-`gYHzBiy^+!{IuGFnp5|%a>DOQrPyuFb z9mM9)>sz%8d!QrDmc*WZz9@@H1}wmP7v3N{11cFNxIfu1sReKBltOl}B{utkt=tax z>kG$b{x(L+6+4z8xO9#ez0N6?ZRsgKndmS$H1rt>!dmYB`FSTfUhalx0iA^OA#voE ztD~u5ix?r>JJ=3Hf3rlZH7pKr#V7JB%4aCv>oZ7{MDuD#LvWW;Vxdq>Q=R!Dg9v!p zSo|35*w^I9D-cPy0?uvi6s4#W?eQ#WGC5ong+|jm6;j@4_9hZ}jAB25=6qoq&5gttU2wR)CdXSR4d&cAiac4 zb`A4oi!QJuc|4U;78K~3KKLiqLlY9{tqeGpp@*jc4iBfmTD-xPB()VyiQZpE(>d)O zznjiT`StgoS35aQGfPS>a~jK{v_o@lK*!L9qJi1rG{g7^73Q~0V$Oq=mSg376THJ9 z;QLcoMK^1|9C^-Su(&oltrR$2r74>)d zqq$y+Vw{&%5_Gu1qo$?`PU;f9F|2Hcb@ZW^LU%M`r{wwyjg_^2QIKe7HuystL7PAi z*-EcF?6A(0cUzP8mJt##+BTeoU-M0-{v~UC8kxrw-AghwSgA%^mNE2#GcG5>)3`u6 z!&JuIP*#o5ON9EB-b9^&*&q;e{<~r>eVfXU*g7&YeCVV3m#JIucW@L2H2jlQybgE~ ztk!>JFRww53Kgpb!22IgGp?N0Yl_nXG45_8Fxk!3@6e3f!p|G<)?)HeB}OBI>4SXg z>k5(rqOGa4V_D}x5A?=3_aiF8*$V*Ct#~tT+7UdiMC%_o>C$%;1AFu1`*LzFF$e;? zzNQ@j=Pfn>SD2?-cv_#Yjd?mrFdMr-dAcKR8Xh@2GxsIgkUNu!o0RPKSc5(76}sZ> z=*~gZC4HXr5d1#=3|{Psyezu*Z3^XNfyyejltI#a))O*XWe=&Si=&ng+8}L|>f8W< zjE6FkwL5GOEh5T!**^ut)=WO|CB&}n64nTU8^NYKh^)X2gUbkJP-fbzZS2;z^l_IO zN-&x~AiEe|_sNA(vlc$k$sFNF-Pv~^U=qS09zdo9Pm9v&$Szb4M7!&+R^rK+3dw=_uAd+ zn2GEUWLS(^#PbX(tZ?QaFxV0tWz)H=FX5J1$gpD=GJD%1;+~jLY|nzI6bxcTVd354 zQWr1>Ul!u!S9wyCU1`#2MSFLWii<`NDU9)Am zwk=v4T9Wig%+IG4(LR%-eq!3;qD62h=IJsf6Bo)QirJwV&LW6M{!-**1jkB+jnSg<8h4?KA3FT-_Xm zu&o)I!Pa>U?!)~X_rs(SsODho$8!cVz-ezgvklV$c$d1c8+N->`i^*R($a`;WoD%bqBv~h zC~N_6C?f;CFqh!&5A%WBG)-lQBO)V&twurZWk;O^4^4xY5L;(dqarVEyvhrph1?D= z3FC0ZY!q#!$&i_$uR9=z3_O(ZsQ6VTgrThumaee^N{G^=l4` zc2N+?aq#3OMXp^qWM}-3M5885@%9Z2_uNiXILf)+08M{&l?BzJcd=f07j^cpI0aN` zRkJT`sq<<)GSZ+TZqcr+s!ExM3noD%1W#ER9ZGa0T(_z|5{;_gkp$M}lA%6}l?Frb z^hI;Q3r4GHB7!f&J#+!y=^B+^g?Ci|AGyjZjzfRGbQ2wvH-xbalKfE`R7+$d*4Uw&0?o1WD zx^zDTZx{J|mB|gHFcwvs;l1{d{SA0A!iRwAv!`NP( z0?+i;LwXZ~c_)}-0E78)p;75fFoIKBevo+-ZCZRzwJZLLjaYwWRu~R*$w{3YQsIz@`A#KiDRMOHq zc%mq8FfMt#koK{*uYcfhA|;4K-&Xl?cXXtRz;xlHG|oh^fl0ZAGLyizYoa<38D3yJ^Sj|<9Fi>W?@ z)^P>w?X7>_YhR8zJ{q%)vVU)jX++V?2k-r>FoD$ckb zS@W<{Ut2NRxDvpM8V(0xHD5eWhvAQ0Wd6IT@|U5^sklB7*&(c@9e&?JH93dnHhk<* zJ1UK0Jlx)O6h5)$xDo?xTSl$_0m3kVR$c_xt94QK6M zJn2@e`;Nv+Cam=kgZRMszO>a|c!Qmqd6%*s)|U}!Y7UIh7T_Hm@RWa8xTLB(-4x_R z&b~M2;{;XOJM|PdD-^xXtd&P-YITJd;sF_lr4}Qm#(9$9-Yk*qo~c9|vkc(CpFD#L z=7*=_oLoge6P+S9S?+lJzmx-$kLHP`BZcuuFC~drO0bu>s!2k``uNOsz)yl)L&jP{ zN31r}$*(=ik}=VG#>OS#&09qsnY9Hu5=_E_j`#g*t@S;Ccd|ES`?YMmOy%R!kl7`E zhz|V_mB>sbv-q>ulpI~sI%N=b3p0QeeauN;$5XoUg-G2A!Y7aM^*pAe=mY9O zpz5LHU27(Y2sT4A%o*Q-plytyQ_Ov2;vL=INTzobwI`JBl2vAqO+zGdS}>;9bb8Qg zdbQ6NJA=Xj-@!8onCi~aADi6#O8hfPWq@*qA?jJS5LQID2-tDu771lOGg%IAF`?3L zCz&OS*|1?kwm6_TvL%O0a*LA<=WuQr4_jO?%3Ja{Lbl{XS+b=7QNCPdB!tBNwcu9YdFlm2{gp+xh`|woC;4g#xTb+YaZ6?eLkTP_iE+oi;Pbt>{`#W@m{; zPy)k1WP%Ya2rD=ftda<<5h4iapLYa-TR#VL_ii>>ZbeWSN#Rm^TQ;QWCgEGFEEaVM3?5FI4+g1*{T6bM>^JO31g@FnDRAIPS} zu||?D!_(Y!w@dr|HKdO< z%yH9yJ#5WwvEU!~Y~Ot|<~$m0v7n{Mx#*TE@aR9Z7jB)$(`a@&Wybq{74-aWdL5FU zTGrLkMw5nfG>;<-$Y3~yq*C9sFaRMaLV%6|*{mp|CeAP$MxUljz$CLz_(MdNGy2pC zB8JAKSSJy<`6T0y;XRx=hZq(+q6wCQqWX~s<{E8hWvfC#AbN9vhPSzdU1;MP@JsmJ zm&w|i-#4T(m3ZA;l@g+QRT>X2*UsZGIGWVtm4}z7cJuFSZB;m#1AnvbegHEIVyy0B zwc<WNXbG)i;+@Gtu5=?qd31PSy689{i9J97Aj~B!%6#{Je zi_3Et?f$H!mICmjW@DPhx|$N#sM+%6YdxhuYSPEvJRd|R=+i9cMg z+T{UHLQm0COvh@08`4U~K*d z3vu9EJ&VsSMQ}|cTzeJVRR*aGYg?7}(ANTR=nwbH;pVp3V>X+M-`i^K>uw-of9@J! zD@#ASP}XYf`M*1*6f4YZT<*Be=!>7X0SA!=teZ$h<2g+hF6hFv7Ud6FlgFtl%Q~)qT724S+o{|C zICt(0{XTxaTm1rXinh?0g)t?ufZ9|>xqtgO1XB8caVHf|FofV6VEVq`OgY6I(Gi3u zCaG2E1X9(a3uscS(vAsNi;hj+czHVn(bdR{Q#CLED4+?bfhJwVX$Z!n4_Ag`#)WW*Q;8?DtXEfvMAGdZBJm#S64Hln} zhfsne!H|)mnbRsIp@>tD{n15*_0sczbzUW;@?GO>XlZgnrys*6`3>C1038?N|7Ay! z6rrpEdj0$J{dWhGUHNKcaBv9ZDMs$Re>Xqc^KIhm?M@)@WW9)iz3dP}P1twx9+|{N zBe0%CAg~f-S+TRM>6_+BOy6xu70BVH%~d2D&m}FIwasE07t)Qp>DKI4r6qnn2!L(D z1n~x7GlABDEklhMh=2k?zz0B~UV77ObAg17XknVHH~&PGV5c8~D~V&Xm0~9HL4H%hsR%f z@}iaHZ+73{PK}suZw3Ap${sTRPn&JNks_XlFa|2cHx6^_rbvTckJR7&14e(xwe-$O7AU& zkjC(Vg>}jtOj+p^f1AeC4fHRo$mO@TTs2$pqotN#49Of-R%??Qj>AUpcnk1-7BJAy z`Yi#QePkl6Sc;fDKS%_8t~Tz*Rus`lv{3-LcC05f3b|A|Nt#5qD|U~x>yn;A@6)P; z!S@r#fM5t5+cuO*9Lu1n$~5B=ZSxG%oblAM<~}%otNv58+A8;1B56GL3E#6k=eY~~ z&G{pc-8|JQr~EqEF6mN{XfxR(#stRb2(b)G`X6<&TIJe}MCdeAn8rnF=;~Uh+7fNI zI**i^9JVd9_HXNxAEDXU_NpMi`Ct_&*0xI>aYutX;-7mi^&bzTfI@8I4i`0shQ*c@^*iOusXkesEo04K-`9 z>{T*ky1Tk&Oc|LfDHu-~lKE0$^llt<@71 z^NyxSTjvS#1Ya0cS4L_G@>FGUi>~>!n>vqq|4cY$G58Az(5Sl;ZBtSrlUoSH)=5h4oBvq4sHM#?LJuIfE513YEj zNoCcjxg`cu4%fmPGIWHR%tR0;h*SNxSS#zIDwei+v!4v8b|%w>M;NjZa{qmFEBE@C zkjzK#5-Wn3!ePT=LSTxQX&EAU?S8Yu^L~HAr2?H>@mKyd| zmwV&PbwUs@x7oRMc`Jp(vs#Q{_}`MbO^5 zZ2^Lg!74UUrc|cbrC6+NaB~()g1;ha4qBVUBgEn@$rUR}fq!lvgoBR&-^xt=7l<+a z%XLMC_4Cr!!*y!wC2w4XP+K@wRY;K91t{?$P$W@9QLr3LY!8cs^!XztMz*|q5cX>W z8x+Pf<4JCB$cjtI;HuoSpl;j;fnD@#kP(+_#AYA;@Kna*Xn{8sw?zwv1E549oxg-k z|1DC1NHc%%b(1zgOW~rrpAw_@aW+FkO98P4&_Znr(SzZTl}u|Ef^gTJkbn5$N-^tV z-vtnLe8Yci%@T6PQ(Z7*2NuJ;5v-z0RaOwoVAd6a3r*rd; zSyNOiUwmKmMZLYe%W?m9<5x2%=oJ2WKkHpDOTOQXWxiUT<}TOX`c872*=prJzNY*W z5#@F_dHT4nRFsTT?$H@t$(OWgG&NF}jLhHOV>?*lk4g7X z%9X%UNNMr!BW%~DIZ!pe+F^`K%loP8QYKWkG2Q9!+-a28PjwCt+AX%brCnXuA6t|y zc>354OGWo?BfaUuuH6ftxC{dZsU)=axF=@^hT>k<$^hQs^#!af%MP^VU@#54Fo#^U zn(LKI`SzDr(=g?R!W1!9dALTu(~VMxb&QZtPezT4NrezBJ(@ILJ|dH!G|E->29M}4 z`4Zjt`;LNe$A0|8qsi?)m@3{Y-Rf!Ku4*Uoj9mZA$$F*2SkE4+G)CJYyXU&Ax33ZM zeLS7lI4SnR9Wb-|&>7=ZXP#Zv>iDMxkH>n@WXw< zDq(B4=P!sk!SYRAj{4~`g(=!N%3mldn)3`B=+WMePSq%b@C#J{$RcloM!5Rq9Wdpl z&YG5UsJ@7+IyPqnvl9{e$dZF9WaUM0mXbRj3tO*TPi#Eh(Yt3Ce=k~DqKWLM_j=z# zt@sZo^M?$d;*8B$@bXL33C+gX+|y1g)_4M8%Dbfw>F71!?5;}s>Ye(O=2Nje;38=! zz+-7`aM!6o>dhng9Ci=0>E&5rn=HMMzIyhhCiF9vCc@KZZQ&m?HM(eM`uX}6p@9{FaK1+kE`ihT1Ugb3DH1op^=%!MPmn7Vd9e$UO{pKBc=77C$i{H*cuQjf-@}tFy7TIG z2i7K{k@qF=BFn8RNvG`^Cobb-#dN=OaG>`oFPid(;d31S^NhMGrI8XbA} zFSeLPv@*i4>f*Lo1GVL{Jf-rTM(&#r=GHXff^i9>UzIdR+&6lxwCee>srbj+jinAj zjtg$0MSP@|D1C~KWl$h_ow#p;}w#vjF0At`k)zswLn~J+n}yd2~qlAe%wu1- zO>uvh{gP_dO<<{1-Pi#4_o1nXoAcg|-p6mZ#HTWJYv z3U=>;@ZG0MQ}CXKv$`X;8QR^Ai6ck|f*_Df7}H+BN7(P!JGp+p9|GrD0Dd;+wOc0b zenoA9@g;{5ZUG&2X4%$UOO*NXe%9p(as=&*O?J(+%Vh0K9rC$oY{~-PR zfm2d_-#!k-TbHb#p39PoRbHhQCpP@S9oJ8Q1u{H?E`F6zO^5d8IQ$<}L;A7={?yR3juYnRLyvRn%(CbnUu@)+@%#6-i^` zlzY-NqZMj2E8dsn>xRRJfn@nxRD)7EuU^8t}&SMBs+wM}Xy97~noWk=LSg8FT zi3GPy=c)`6^Uwr({Fo8*MB{wro==>lI{6Hqyz^wE4fSNWPEt)u8CkKNB%qhn^@%pj zvE8#aLv&RQJhB9xG)6WYM;DK=Jn;Q61>fW2c0bjqC%lXHN*&=N=cEywj|)^N+|-y!plamG%eDivI|2rBWJ5;K7mzUe%2%;sDqs8nd8A~EH~B5+^GY0;QONYE%F1`S9fLqqv# zYLx8mWVyHu+N=j&{7B~KSn^QpvX*p=Xo($mXkErN6kjE9#bJE&2}%K)j_ydz^oUq^ za0miW@XRpkv{c7Hk0VL%@ml{Tge}@8n5J??(qtO8&8pr1SnI}O9swzFMh!`+Zdg&~ zPT8L}t##tL>PO&l6(NQ5^m0s9dF*rEa`htSMJtxeV5qWgMG<9LCP%V+bd1cpJdL18 z&^lpFdQ&G$pD`7TE3W!LmS?B^eKeo=kyNncQpS@H)8=5xx2|wzL*E?uZNi>LJ(KuH zS*?#Ch;Xiyp11*4OK^gky2n3ZjN=zxZ8#wcnUiynNJ%l*tfT(Yt&W2>E4w=^tcgF& zs)NRf(EJDNdXsu@vWXsuF~gKX8{q&9BUw9@b2=M~mg;4N22LM&xh30(3%2Sx@xZi# zJ8TW4`!Brc_cTGAofK6(8Ybw5kvgLg$Hav#kRmE{tdh&eZF``s>n@@N0Wp8Ng)HM6J}#XV-7UUeOe}@@^pfq19V{`d{M?oeGWJ@ zyda=bd(PL4#-zM(MgBdPZJZWN)}kI>?&;kK+VA^iimm+XVSqqr!MHunf@l_(OdWwW z(GY0nl-6Vm#`;N6?n$s1%XE`ZVt!A=V_vdWT;YiADj3Q%)p|Ry{d+-DR_tV}4sHJ% z6Yzm6OVk{HewQ?YD27(tB!+8`Skm3I89B4#(%XcO8j#$)C#&~YG=a{-VcN51 z6G487jEpyL5k2`uBRHS-yvco6=2|J&&e*xKtjpHIL|P0&;_=lq>L$WNF%D$G{dfT! zGr6e6Zim34S%Ug)`q8?Dsae>Bcp16et;9cUNcw(d?!8Hm(A2~Pb!xM_x=o}*B0~5w z^24^*pd&8Rb}NAI^=0Bt=vRLk`EwUS&;kBLuPkg(yZ4pHQB@e8RU2lkVk+sL^A%)$ z1Vm)##BDqAfO4}PPZ7eEe_I^-^7`5zWu#|#_N?bU9f+AGXgNPKzl)D#&O`H$i?=%i zocx+yh|8L^VB{w>Tt-m}FG;i2EyKx)&IV3#mX10~g`iOG=wlWIztdsL)9_?a{Jr(TcN49T6d+O3* zpM-1L8BDwq_F{jlZE*5>QAW^JGt=FLgTkEeNgWM-|CA+$`F%kI%iG3DxQb~ zK0BB8KPPZ;r4e8dTY~<($sx59{n>fn{L6+wHqm54G1B5RrQ1~XLWA~du-fXqgUn)W z>vsLa`fMk5OY{)7L@FvNAGWeK+>4`$a09$8dq^g-EC#I_woT(qw_N+Mv5ZQwIO5ze zsVz#g2x2^H(>B^pgDC%%F?=}*kIQC0l$z{=c;Wj7%mVYRotc%DMD|At1qf)@=XPA6 z+RKHOj%LgO{Wm`7Bj7E!5w99v7f z5_fDm|BqiPo4UVv3i>qDi~Y z1T#k)NrS9blkO^lr#N5v9{R+sb39d1jlEwxv;g zJnPy3kXOC6RnhyiL722! zc6C9MwY6kdTnwprX=#$^xE6fSvu|Lb))#RoLawmEx4k085)DzHOp-eDv zP9T<|ckuN==UQ?QQtmipma6n$V*NGvVYg;1`2 z#8a;x+lpyD?GLjU9WOfVT}Xx*m5#;7OZPc^TM-A zb;c}g-Sb^9t~F8g@j$l(V@U+1PE(09GfPZ)UTe1b57;?~85*&=L&@q!Gqu?(y*Kq+ zG8C|as(?b1y|ZTvd(RL&PFQKUQXsd9bm(0o z+qfSv#Ut>kfKpplZ*<#7;KS3yqzR&2Y`V4rBpwpbGLvet8?@q}@XsZQg4&f*v*R`k zV$s3e7LZgau5Y}q8=PGrIAwv*OZqef_t15ONK8c0E(#@^t<|@b4s&z}NyuhU;tmgD z(-C!1imQj$3Gu_)X`#EO>ATy>Y_fP2o2b5)ifP&^`fONOE@%s;hb6MR=*JRr z8Bo7g(&t{*E%9GMwLgevrkDQIT3P_79G&gi##;BumtOJP7gunl(X1VYc&f$kOn=k& z^*OhMsEDE!XIasd_T?oj5Qf2)8KW=Q{Qc=r>={@;bNb+e~f0>{_AC z3L(QNmjbZzp}x%YGP%F-UypHj!3e8i= zN4Ft@p+(PkjZ4W_3KC@TMOsHaTggS*|FXC4_FXlVTY29Q=4OW^;wm3Qr{+v)D5zEV zAvo!*ex}Z%kkZ=yOgrh$e-M)*NvWmyhj=+?L5oca?IQd_V>U#3PE|zM9*cg@fdQYJ zq?O@$_TC>UTtkLjs8dH~H9TkYBF}v#J|(KVg>p~5l<3vd3no8#a_$kmC=Q%M;yHxJ zUJ%c0sgv8IIkKt!t2Z7s!5q^%Cr#4PYSnHgG0Y*g)^0FYIQ-0}ozBlAFZbbB##v}$ zU<9&WBJu_wIC8jJQ6{Z8&Qn!vb$aPt-kSRQPYWgrBbzUcB!OQ*@4yc;VGL33z%pDu zMb#ALA>3~A%DY2`M$Ss{ifwOK%)|ru_SLPkYVdt-9Ttw~ut`!_PVi_X$9%?avp}G! zIjR&A*v5%G7VyAMPA5E^Bj{TV9)i5W)J&-;bHEKb^~T%orI5*fm$vOlIa={N-PCqx zq+9-Bm|J$ZBXocNymw!8VUIPU_xK@u)b z3l1B_#1B}iR)t0s04LrX@$A!*amBcyJ9uZ@B<+;%orGI?F;yGSTxGBY%E$nq1_nuq zi$_P=*waDXGtdGhgiPRr=;7UQvF)ZiAqqgYgaK`}NhJ`TL<(2pcR=4h)mBgiGX3-0 z(;xE)%6KFSE?_MBV!!P*Se+g23wyeGI;6`gm0h%V^;^uK?H7lagp}8boS?G`3IPPo~7^oyBru01d`ht z^y9*+4_&qq^rJI1fPJ|f^rXqW1-ssXx+3nu?0F^ma6(f}ItqI5PvnQ1gcSOwD&db_ zCq@#0exVe4V=WPgDKPpc0C~;;@{ZHd5AjnkG}RvXg^{=ix`!C_N!;><#@i2elA%ci zbkM#oij4Eqk{yuHAA$e}G^3Lmkay}f|K*zg`0hF#ND*UBxWRSHMF&V{^VYLjKB&R|xZ)HGT`(yMdqQLQGU zX59|BVy}Is-}QlI5?ptL}C!X(8#!@=eN0POT;?(ka!P(R;E|?|1KSSDmM^ zFz%^S22PlgJ>6^2JPVH_kXtMzRH89p?{C!_`|ReV>J_q7U9m~s`t11Ckn-WS(Kb>w)SRgKr@PO<=t~>(I|^@-$Qpenh;>L%B;|W zW4qxlWItbLjjyDEVBwFvZ#K~1A5DrdmK2N>3#ua zyfI$QDZ)90Nfr+Yi;F~hOWZ{R?%v@AsH(0j^W4u+tkL+AWNM|f zM2&j@M)CCX$ehzdl^@zW(EFFE#M=h|w>&f71pF%5bOY07JEJ~8(~!_qfj9RrkgF{C zzxQ~&iK`4=AVm3g#ua@8h389U;Y`ZNq%)L@o!bOE-3EXLL+c=L6u~Fg;ddO3SOMvckM3Flg0|} zpA?y1)Y&86{|=u~Ir$TPFYe0ki-r(!xJ_}*-p_?kxD(iQhK~>oIvK1Ma?4F4Ivas< zZJKs*8YwfR{9BuU#&sX3+XH`3Eiklfqe@};>iNJJjU%Or_XZ&h@#e7|RVeo$ z9)sFA`4k}X747f%;qD+{zC=w#^oPJQEbY%O^oJ6Q&LIPL#rN!Q-#~RYATD9XN+0|{ zer^ZzR)RT)ySG)-n%GI?CwT@Z+6Y1-^}1vka!)+vp&2N}jACL;*LOYXkuc5SqBGrM z)CW4M$>&Z<%}HIX*)4mIM~i$?@e+>X^JRS=y&(vjEpe?bfT$Ct5-~_3__y_h7Oj)@;d<| zSg6TVB(&BD2KjDzyzTbA%Q^N>EVt1Lso|GRInA26Vmddx|9EeSNlGJ|hofFwu~YN! zCrbx`AFB>lPy6~BEB{n&xNPd9vd`?YW2lYWH^q_q7*H9|vng~G+s*ZIfVnoLDzbUc zbx=Z5hpMPKc^wql{E;KV&pW}=8jBb6`Fj!)(HFjVz4xo$emINY1}uT!{h4D@#x^eN z?-)(f0rhp=lvzR2qE?Yroz-p_`)x`;EaR9bD~=QG~ZalQpb<5T^tmL z560_*Mz5vYk8+VkVk6+ZkVoOGLu>N}QudM=w%ofWBEIiePqQm>RLldt7qL}EVy1BNKtRJai91L=!HaNAVGhlJKKw}}ECJwD6$ng*G7iCzDbu-MncH$^v0%=XuGW3bY{*FxI9q&k|d%lNQaaBqUH#jxN zd^(jDR$$t+TY;}b&6^Vu2GfJWu^sG$^a_=SZ5M$8kCf69z2{E-CQbU5{3CO$Cwky)4W^ojgtDH_km zvVd3)^u0Ij^iV2bn%uSE07-z-kpS=Wy3C}9YowEzI3)X!? zfn^@u{Fo*0{e@-tLP@!1qlt!@!G)b%i0C{YXg)Ko1m9r@o~0xE{kdxxCB^A9q{zOp zqQ%#U6X0D8vXBnvi>QHU^Wa7^|BeYSKw`v_?A_ioMwHyRWil;q*Q@?$ke-~jX4q5? zeZe$>Y}Pt!Lv*Y#qkTzOW;|F(g0wd*gS~Am#{8fA@E&?IO&ZcBpGXem;kMvY*m*|<{2gE`V zT~+!_l~6NvXvnDOGTJ*BTj?16C8aD!3fy;eI%$cl_w`D)4}2t~r^M_~g_vcI?u~2@{fyijV20jyz!igAD8`spy!;_FpqDD({OSb!|$q){R zWo}FEouFNqqu!_Ms^2G{{x>OkX6#*0l;DuG!aRfuNQWD|H|{NSKo(7R+mU*`1vda| zLw}6^2{^mqF3myI`Ba?$+WRIWpgIf;6vp?{9TSs4Lzt&I3oVh&Ly4R^m7}S z0|f{0;5SbY`P&mSOI^zVQMLMURYIe$^6zIo^EBKO3)Q?Mk3}%= zvdduCD_Aq0*ii@>TeAFcR8X~`3*Y9J*-(M(2&Ul`aIY!5PQqLhEtx{MnqW|r z1cJGPYpTB44lI}|2GMW8B6WG6iG>Z>m$+Kj6Ei+DUKgF&mq?)amWnG zbs1@D>jT>Ne7XL`D%K?#MqIT~)|b5k&% zp=&!i{*_X@0926tyKJ6-f>1fi}cl!Y7I@sVHD!C|1&I#~ek&b7md5b%4v^DTtbOX_ASEv%jX^#l7 zbX`6>7|9{a-(&=%+W6O)zxo0i}&w<(-;dlY(42sSh1lTFJ zsZG2urBm)-J19QKRORv6YPMOMB?oeUI>Wtf!UtquEYC;g!Yft5q9}85ZIBZH5oF{H%)Ly+|bKJ|)&p1g5NTtxjZ6#8E zh?(}&Y@;-qLpyBd-Q>!LA}QRPR#g4C##A@!U0!@i-iagiy^KdP>a#OPWE`d7jP-Qs zBsyq%l){Uiu@m%P(L*Tjb~JKzuFCYTt?)%gfE1QgjtalIbZA`Mo$<5 zZaM&;Xc0-3-Z=REc(fZ$@zpf?e?9(1uGcH23;K(MtC!xxmMqIlUp#WbYA^LEGD7DWhh6Xvy}|$cnJbxTMIg2a5!9SyC*4i z(9-H;9uFuj-|3albI$Mc69K(vh0z}q(p{lZj{3k*a}bKwz$4rsC$11zn@3QWWEUm1p||K#GbX{)Ten<`vXfK7?XCmq!FR&6KYwmAMXbMYK!Z+fzegOwBh ze%e8!Qiea#G#{)>9@l6@Y}1c!;+h!VTy2ocQ3B4 zY5gsD(oz4e zzlO8}#mt2f?bhiGC?UUCLJ|JF{WJQ)(^&XRculqEcdfmlpE8>u<5cNI#&1YPNB3{G zcYRe~aBRPY8}sobu(Y}ygvIAy$)P@YrHC!=OQ(t4F~rBQHw8Rl{4}w6&!-)D9!YFSW)YlL-K*NKk(yfIkeu4az zauVYp`VD2*AA?CAfR}d!!d%K(Ja||7?bqIL?um@-Qh_flJq_!18srw zz=rd_fc>t5_7z6-%h4&J;@0adz$?ET9e+J&j4Vtx@*BettHF{Mrv?!NqF1T6mpeDE z6S=B{X_H!Z==Tn}F0HjVsXrXEuZi{+rX>B{O}vtX#>YqZT;X%5lgC31C8*j@u(VhP?Z95?Q6uueVJw)pP5^A$%;b~aidL8G=08iO-4 zvb^&C$SC}1qv)F9pniv3;$G%iY;pgRcTZCC%nRio*dTYckeXhUQ?V|7drm7JW0uM> zzst(61$YDv@U-)}=M{l|hP1alAv!$1A>y8!)o@ewvh-M6-sYK4mLE?o?}$7^)9e>! zwT8#w*yJHoiHS*tDT}V8vWJnTvZ)D&B^Dvzt(~0%AZwBPzZZmfoC2DpNIT!7?9UI> zy$w<-4136gdYdD{@B|E08Fg(_8!K{XykXSl$vBd439QTL1G;24d@L%eSa_*=ak_h; zn3H3|TMM%^hUVncsHjO4^YGE!!W1=2YoH}qr7E+fk?}Hcdq?0sLK*1Y=M}c|(TJW& zU^(g1>;3zRFRsg_?a?p!iHy>jkV_3Q*yz37anj~~gz^WmJ(UjHK zx9z9f2fw&uwjMNBzn4|pa5}ijoA}Br{pHm=ZdUis6Z-FpY95}F-mO0mI!Gy#f73#2 zTf&!$*Tik;QXQfdLe(ZO?%0wtyK26W;GjtsNG2p1jK)*`V(4`@B>sh;1c<%I1udw* zJTrdKdBTt^5|KE-Ucn)b9S(=sIrwt-_e-O{3>3Bh^DO3!U*UtISpxnHbeEM84#lvgFjksm(GVf3Z8sD~e!slIqX4$%!_>`IMEYJo!){hNqaX z+3#eGc|?evWjn`F%-pyu^V9mF7%iF}C1`%kn_$Vxvhj9ch1XQWZruqkCW1k;ASE7p z*ZZd_`s9+8@ttbnOKCcIcYD9C3wh`(DAWL(_3BZ;JwX^D2GiMZbZg*yAbl#uDH*w{ z4{0+SVxlcrhnzU<#<{HmqpPm{yL%`em+Qi`o?>2pI&~PCiJiJ%&Axe(OdX zsEgjba8L#?b#k~XDY6x&`MT||gPM$90qm^!tWI+xqN$QO%52gR<-!Ts%`@V@0;eAHuiLSdo3YWonTD-&_omAd`ai_dbRUJ%leElvf;S>BjcX`I+ zsERwKLqbDHXP!;`jvMMgu-%c^@%#wep@yhdNO&hEThgI-yXFM+oJiIj!I4hcC zFoZ;Lg1Bb=mzMwJ&P;;<1UCjGJNMjvpK=aXbZ93F5aGm~Iztvtq#5eHV)#eBlDuro zCV6LsZi5RX?GR|s-xdF0jbeqILh?))N7yiG3e8ZbYYqnON2j^dwt^EcQo^5|3T|)M zj{530Tj!ReKl;Nj`D^KbJFK?n-t7+UNfzH)5K8W5g;d?gjn?M!B#xlA@~C%8TmNvv zZ>Llyp@J}vNu}{S;_XKmRSh^YhpHvICv2WZ;9RifWTR~f@s3w8lEc(TQn2$BiS26y z11prAWy&EJ`WBclUaDae5Gjvl>;u<2BxLvbu{8&hv+EgP-$;40) z2-fMsb1i!~R9)HAAL~iA{bm=1H}Rwu8iacN5ZY@5u1aZ|YCq5kBx5R(%G+u>0Qkek zFPxns;w^+?aDdn-mO~KR5x0yViA+E+ALBjb?UR$08W5Wux^INwZc!UFNZ8fXIRRZx zO&Lozb2L@Wfw7>?csC~oO1t(+eQEx*8fyi0Q;a$8ET5+(X>Jec;-GBc=+pj^6iFu_l|pzl+<9%42Ubhg6Str-%q40?n-he8QdER4P$X+FDeD&lbwp$pZPA_kcNr zn{VA$)RWmZ3o0=ih6__R$-g)(&FJcyO0Tf8OrX^8fJ?;*KR;yCz!}crn_Ji|e$vZ~ z7MK%n22%verm=Ufs|ZBpCSt6gse`Rgi^OPh?PCkVNdM<%xub!<1RM8B`?JLqJC4fs znT0RUh^TWc$#6`_i#*~vGz=aEkDL6L9JCH|8oD+gft^56nJM~ixjO7hJ3Kty@zju8 zwDB)-{S$aIh6-jDjT8|}%*_OM$%OwYdZCp{1co!$jaZ~!gX3%yY z6Oshsa;18l1xRuPFb4ZTEcVG%9tH?Yv106A;k$v999diHW@vt{$m{=cM~0dl!Djdt zqMKy`%M79_u%NWt7qw2bH=E7()p$5B5)b6Yk95^w(667;=M`0U1|SU6@h;5$NO7d{Zzr!r26-QTDrn@>q^Rl%_IrbhnlgJ)BY=gH%sa^5%Bv{a zsbjM?4)<(p*y+eg!EKCBo#or>*X2+!qs)-{=KJ&9(nnj&C#>Bn)!A0H;nU((3Lmy# z7?aVl8$zF+u_(pSoUsu=;8~;o;-UB83h;EhXjNg)CN@*lB`!x~HZ}_5eBpTEHUm)f z?xa;Rz(3hKc6TsSBJj(UBr#$;Qgo=%_j14_4JrxD8DbZ+v<1d zwD&9u74Y9R%>R`Ra4Xik1lAuBcW{;V{7>@ngeN$#Zz(|R*G<0U)>))3AG0g5O}vUG znJLg(^3osF0%kQYyq|67A`{)n*_eVHc3>cbT5040H&}CqQR40tL;AGL9~pT#inEwB zaoK7m3+I}F8@Hfip3^~*kPqer*ksO-Pp@DMJYk@Px{0qPZnPyS(ogFVcs84wG}0}@ zymJn>^=`PpVxMr>n`X{@_hqcD+E25PPt|BNP4{;1aCX~?N8i}4uk0)}p!#W1uk_LG zZYx2NQ1j_52A;#kiFUbeq}bmg1G0np9Gfl)6k- zx?e+;QczO%gvAyz;h;EE`OgUNb;gcybY_ojx>jtvs}w8Cqq3?LE4rE#C7ANIcwzie z(mIhU((cVpjDPIFxxF>$U7Xks9-Zew1czFuC~RR2qsLEE$*hA~J~U5TaTk(+GU$eVha2$GhG%9>i`$7038qH-Tg^;472ZqUJju z|Fy8Bnw;-@W~|F&xN(JnBGmNyce8s*%X*_hirDm`5;;_X8q0Ii`Y8purhL+bF9fNk zcZ=apTh^c@gJsWnZ%9RrJdpF~T@t{oeTVewuP}|31tAAj+-RJMOzbey^aqi?1UE`r zo90VjXiO14CbarvRl_I&LgRF7BW!+k8xp(Tb6ijA{SFrB<(@{L5ZK(stL6HC08c=$zb!3_4YyJ)c4qT!nXW{l zE0ZziVwpNXIEa9W$F#H>r6o%#7andFeA1;|%Vtw0VPO&~l`v_kY;iW0_Q}j_DgI)ae=b4fnJER$K9d2)$?K?6g&u4}?Mmr=RL0JaxFCEBw^(t#Ww4wdzfnD8~ zb*X(HsMlP7J7k{z>sR}^Kze6nJ1cl&AcDYRO>^8i(3&(m%QlhPGB8fzpib?bp44M(*XET zzoO+i<)8d3#@-ymx4i83;(!F36O^M?1UkjzEB{Rd?wsBxv}OUih1MzPwwM8z*DNIT0c#w&8|Z+CN;FR>EMCePu?XyB_L;lZc$2A)kpY zshiDC`E4EHlf`kex6{|$H#ZYZywbeL>{N$?XP;E39u7%_Dk?nGwET72_Q~WJ$m6i< z{YH9Fw7?}GKZ?fWCj?Jk`Zn1o7zv4!(miYn3oBznHQu18-LPA+^tVp~GcT$|snp#n z!{ZXG7+zjtMlMxMjjNz|xnxApXk`?2&q=kY)W>ZuVW@xY}@Lc|KzksthY?jH6|U zUj%`wJTKeDx2jkQYP3cfbtJzxB+)0wAXRT>mDz||-8W-K4XBN)2cBO_EErY%T%b%$ ze&x@K_OBi=pQgF-%Jh~SlQ>T+;afk(0%B4Ys#wXfhdCUS>!jZDWK^n!jj21Q1_#j2 zB?Xi7&(h54CeIXmEiH#-*u9nr>l{mWdWR29L~mYx46!=FEvI>pYm9?fhW3gb6Y1RP)ATs9fcFtZHtMfs=3!;A^$aS^sO(+I7xx_2&gY*i!-;v4l@JcRWU{R^qirQeGJ-WwL_$dsy7;E|z~k>%kV#-)(e- z71;k^h8gTz#*FeQ3%-NrO%_n*#DCDW8@2w$h3W6L;VzDp{+q09&LtwkH+)w(*$0`T zP~-_rN|;s_#e7h1k3MY-?!U|g6T|!aSlraEU&JmT#tBh0G4lR77hQIia7>Fv_V=?g zGTK?b%uQ^6z;7iY)kCRejOeIl2~uyTO6ELlZoY z5&eDLl|yIFfKKiD$86F`tPwdao%HY?%)R)X{^g@ZybelvQY>? zera&^RONJh?e(*>967Ax>b#K`oyePRnn2bEr&`$BMwrB-fKyxDYvi4@2KOtgwmKz+ zCI*#mmXf>$+FNXoeIE@V{#h_JtbPCP{ri1|Gc#Ao5WgCxx>L1e~I5MmWVHZ`ZF!6nJIB+5io328$xq0xB z`zmoExdu5DLE&jD`NC^{F~k8b_dJ1nrlpqtP!0a{7R-%Dw{>2^Gt&ptocW>lGKf9N zDfMsC&OxNQHYMfo8N-2ja9v?HnS04yVV{_LVPD{L+)H#)J#Q7wMN4wG9q71Tq%*OZ5!tZN^7_=zCc;19oN0Pn_dahu+lnwoePs z?qBeQ$uRU*kT7UB$JAWbVPd`|ksnwc8Iw%9QV=%&vLejpN=P!O-*j5_vlwPwcO}$E z+JxIqasU+cxmmmWxwxp?+8hudHYEDuf`(4}XGOYNvpOvLJm5c%bzLPOh>SL}V4(4_ znZ!H$hczz#cxxB0b-T`9j)vCGVQ?$;-j3O$@$UXJ<&Q^RSPvOK_(_j&<{eQ36R*R7 zHTP)e?o;3Q>$tYk@2LBc!|o<;P!xwKq@Ib2hP`*luSwe7)XXnGpmTN&hELP&iHxsi zW^09Z&`qkSVakGsBxSmrM)Zafb)&U>Bb#Du)0L z;UEs<3;0qNbR(xtN!)q8ykkT9rz&_zpw(({cflmO) zpoBU*2Qx~S=kX_r!nje7pJQ%%kb}i`u!}41wK2-a#uBN&A78{7;4D}lC7AO0w@HrZ z5o*%qP?D}gG~(y>Q9d8azMqkJ;&mCUM_l!OaSt)j7iSabLnJ1}W+*1D6sIn4ZOdFy zY7yTHP))!9Xtar}$REBA#|yk+HBFXjhDw!NW|{d+iY*cu�zBE;A6`RoYnYVbGchb9$^iIU2 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 literal 0 HcmV?d00001 diff --git a/assets/inter-roman-vietnamese.paY3CzEB.woff2 b/assets/inter-roman-vietnamese.paY3CzEB.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5a9f9cb9ca0cd78b6ea2f3e5c9d2838dc8895598 GIT binary patch literal 8492 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 a!Vc~9U7SGB8$q3Ii#9CnAx#qS0RRAsKuhfa literal 0 HcmV?d00001 diff --git a/assets/me.md.ZKkPBK0C.js b/assets/me.md.ZKkPBK0C.js new file mode 100644 index 000000000..499e14270 --- /dev/null +++ b/assets/me.md.ZKkPBK0C.js @@ -0,0 +1 @@ +import{_ as i,c as t,J as a,V as s,o as n,G as o}from"./chunks/framework.SV1ROkXV.js";const y=JSON.parse('{"title":"恒帅的博客(关于我)","description":"","frontmatter":{"title":"恒帅的博客(关于我)","editLink":false,"aside":false,"lastUpdated":false},"headers":[],"relativePath":"me.md","filePath":"me.md","lastUpdated":1706247228000}'),l={name:"me.md"},h=s('