`;\n')),(0,s.kt)("h3",{id:"2-css-in-js"},"2. CSS-in-JS"),(0,s.kt)("p",null,"\u5982\u540d\u5b57\u6240\u89c1\uff0cCSS-in-JS \u662f\u4e00\u79cd\u5728 JavaScript \u91cc\u5199 CSS \u7684\u65b9\u5f0f\u3002\u5229\u7528 JS \u7684\u4f18\u52bf\u53ef\u5b9e\u73b0\u975e\u5e38\u7075\u6d3b\u7684\u53ef\u6269\u5c55\u7684\u6837\u5f0f\u3002CSS-in-JS \u6709\u5f88\u591a\u5b9e\u73b0\uff0c\u76ee\u524d\u6bd4\u8f83\u6d41\u884c\u7684\u662f ",(0,s.kt)("a",{parentName:"p",href:"https://www.styled-components.com/"},"Styled-components"),"\u3002"),(0,s.kt)("p",null,"\u901a\u8fc7 Styled-components \u5199 CSS \u7684\u793a\u4f8b\u5982\u4e0b\uff1a"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-javascript"},'import React from "react";\nimport styled from "styled-components";\n\nfunction hzfe() {\n const Title = styled.h1`\n font-size: 1.5em;\n text-align: center;\n color: #666;\n `;\n return HZFEStudio;\n}\n')),(0,s.kt)("h3",{id:"3-tailwind-\u548c-utility-first-css"},"3. Tailwind \u548c Utility-first CSS"),(0,s.kt)("p",null,"\u8fd1\u51e0\u5e74\u968f\u7740 Tailwind \u7684\u6d41\u884c\uff0c\u529f\u80fd\u7c7b\u4f18\u5148\uff08Utility-first CSS\uff09\u7684\u7406\u5ff5\u4e5f\u518d\u6b21\u6d41\u884c\u8d77\u6765\u3002\u8fd9\u91cc\u7b80\u5355\u4ecb\u7ecd\u4e00\u4e0b Tailwind CSS\u3002"),(0,s.kt)("h4",{id:"31-tailwind6"},"3.1 Tailwind",(0,s.kt)("sup",null,"[6]")),(0,s.kt)("p",null,"Tailwind CSS \u662f\u4e00\u4e2a\u529f\u80fd\u7c7b\u4f18\u5148\u7684 CSS \u6846\u67b6\uff0c\u901a\u8fc7\u7ec4\u5408\u4e0d\u540c\u7684\u7c7b\u540d\u5b9e\u73b0\u9875\u9762\u8bbe\u8ba1\u3002Tailwind \u4e3b\u8981\u4f18\u52bf\u5982\u4e0b\uff1a"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"\u4e0d\u7528\u8003\u8651 class \u7684\u547d\u540d\u3002"),(0,s.kt)("li",{parentName:"ol"},"CSS \u6587\u4ef6\u5927\u5c0f\u589e\u957f\u53ef\u63a7\uff0c\u901a\u8fc7 ",(0,s.kt)("inlineCode",{parentName:"li"},"purge")," \u53ef\u751f\u6210\u975e\u5e38\u5c0f\u7684 CSS \u6587\u4ef6\u3002"),(0,s.kt)("li",{parentName:"ol"},"\u7edf\u4e00\u8bbe\u8ba1\u7cfb\u7edf\u4e0b\u7684\u6837\u5f0f\u4e0e\u5e03\u5c40\u3002"),(0,s.kt)("li",{parentName:"ol"},"IDE \u96c6\u6210\u4f18\u79c0\u3002")),(0,s.kt)("h2",{id:"\u53c2\u8003\u8d44\u6599"},"\u53c2\u8003\u8d44\u6599"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("a",{parentName:"li",href:"https://postcss.org/"},"PostCSS - A tool for transforming CSS with JavaScript")),(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("a",{parentName:"li",href:"https://sass-lang.com/"},"Sass - CSS with superpowers")),(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("a",{parentName:"li",href:"https://lesscss.org/"},"Less - It's CSS, with just a little more")),(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("a",{parentName:"li",href:"https://www.stylus.com/"},"Stylus - Foresight has never been so crucial")),(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/css-modules/css-modules"},"CSS Modules")),(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("a",{parentName:"li",href:"https://tailwindcss.com/"},"Tailwind CSS"))))}S.isMDXComponent=!0}}]);
\ No newline at end of file
diff --git a/assets/js/da95f3d6.1b5d8318.js b/assets/js/da95f3d6.1b5d8318.js
new file mode 100644
index 0000000..ed21d46
--- /dev/null
+++ b/assets/js/da95f3d6.1b5d8318.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkjjbook=self.webpackChunkjjbook||[]).push([[1050],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},k=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),k=p(n),m=a,d=k["".concat(c,".").concat(m)]||k[m]||f[m]||i;return n?r.createElement(d,l(l({ref:t},u),{},{components:n})):r.createElement(d,l({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=k;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var p=2;pHZFE\n\n\x3c!-- new --\x3e\n
HZFE
\n'))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20")),(0,i.kt)("p",{parentName:"li"},"\u5982\u679c\u5143\u7d20\u662f\u4e24\u4e2a\u76f8\u540c\u7c7b\u578b\u7684 React DOM \u5143\u7d20\u65f6\uff0cReact \u4f1a\u67e5\u770b\u4e24\u8005\u7684\u5c5e\u6027\uff0c\u4fdd\u7559 DOM \u8282\u70b9\uff0c\u53ea\u66f4\u65b0\u6539\u53d8\u7684\u5c5e\u6027\u3002\u5982\u4ee5\u4e0b\u60c5\u51b5\uff0cReact \u53ea\u66f4\u65b0\u989c\u8272\u6837\u5f0f\u3002"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-html"},'\x3c!-- old --\x3e\n\n\n\x3c!-- new --\x3e\n\n')))),(0,i.kt)("p",null,"\u5728\u5143\u7d20\u7c7b\u578b\u76f8\u540c\u7684\u60c5\u51b5\u4e0b\uff0c\u6bd4\u5bf9\u5b8c\u5143\u7d20\u540e\uff0c\u4f1a\u9012\u5f52\u5143\u7d20\u7684\u5b50\u5143\u7d20\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cReact \u4f1a\u540c\u65f6\u8fed\u4ee3\u65b0\u8001\u4e24\u4e2a\u5b50\u5143\u7d20\u5217\u8868\u3002\u5bf9\u4e8e\u5217\u8868\u7684\u66f4\u65b0\uff0cReact \u5efa\u8bae\u5728\u5217\u8868\u9879\u4e2d\u6807\u8bc6 key \u5c5e\u6027\u3002\u907f\u514d\u4ee5\u4e0b\u4f4e\u6548\u573a\u666f\uff1a"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-html"},'\x3c!-- bad --\x3e\n\x3c!-- React \u4e0d\u4f1a\u610f\u8bc6\u5230\u53ef\u4ee5\u4fdd\u7559
HZFE
\u548c
Front-End
\u5b50\u6811\u7684\u5b8c\u6574\uff0c\u800c\u662f\u91cd\u5199\u6bcf\u4e2a\u5143\u7d20 --\x3e\n\n\x3c!-- old --\x3e\n
\n
HZFE
\n
Front-End
\n
\n\x3c!-- new --\x3e\n
\n
Back-End
\n
HZFE
\n
Front-End
\n
\n\n\x3c!-- good --\x3e\n\x3c!-- \u5b50\u5217\u8868\u9879\u6709\u7a33\u5b9a\u4e14\u5728\u5144\u5f1f\u8282\u70b9\u4e2d\u552f\u4e00\u7684 key \u5c5e\u6027\uff0c --\x3e\n\x3c!-- React \u4f7f\u7528 key \u4ece\u65b0\u8001\u6811\u4e2d\u5339\u914d\u5bf9\u5e94\u8282\u70b9\u6bd4\u8f83\uff0c\u63d0\u9ad8 Diff \u6548\u7387\u3002 --\x3e\n\n\x3c!-- old --\x3e\n
\n
HZFE
\n
Front-End
\n
\n\x3c!-- new --\x3e\n
\n
Back-End
\n
HZFE
\n
Front-End
\n
\n')),(0,i.kt)("h3",{id:"2-vue2x-diff"},"2. Vue2.x Diff"),(0,i.kt)("p",null,"Vue \u7684 Diff \u7b97\u6cd5\u548c React \u7684\u7c7b\u4f3c\uff0c\u53ea\u5728\u540c\u4e00\u5c42\u6b21\u8fdb\u884c\u6bd4\u8f83\uff0c\u4e0d\u8fdb\u884c\u8de8\u5c42\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u4e2a\u5143\u7d20\u88ab\u5224\u5b9a\u4e3a\u4e0d\u76f8\u540c\uff0c\u5219\u4e0d\u7ee7\u7eed\u9012\u5f52\u6bd4\u8f83\u3002\u5728 Diff \u5b50\u5143\u7d20\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u53cc\u7aef\u6bd4\u8f83\u7684\u65b9\u6cd5\uff0c\u8bbe\u7acb 4 \u4e2a\u6307\u9488\uff1a"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"oldStartIdx \u6307\u5411\u65e7\u5b50\u5143\u7d20\u5217\u8868\u4e2d\uff0c\u4ece\u5de6\u8fb9\u5f00\u59cb Diff \u7684\u5143\u7d20\u7d22\u5f15\u3002\u521d\u59cb\u503c\uff1a\u7b2c\u4e00\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u3002"),(0,i.kt)("li",{parentName:"ul"},"newStartIdx \u6307\u5411\u65b0\u5b50\u5143\u7d20\u5217\u8868\u4e2d\uff0c\u4ece\u5de6\u8fb9\u5f00\u59cb Diff \u7684\u5143\u7d20\u7d22\u5f15\u3002\u521d\u59cb\u503c\uff1a\u7b2c\u4e00\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u3002"),(0,i.kt)("li",{parentName:"ul"},"oldEndIdx \u6307\u5411\u65e7\u5b50\u5143\u7d20\u5217\u8868\u4e2d\uff0c\u4ece\u53f3\u8fb9\u5f00\u59cb Diff \u7684\u5143\u7d20\u7d22\u5f15\u3002\u521d\u59cb\u503c\uff1a\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u3002"),(0,i.kt)("li",{parentName:"ul"},"newEndIdx \u6307\u5411\u65b0\u5b50\u5143\u7d20\u5217\u8868\u4e2d\uff0c\u4ece\u53f3\u8fb9\u5f00\u59cb Diff \u7684\u5143\u7d20\u7d22\u5f15\u3002\u521d\u59cb\u503c\uff1a\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u3002")),(0,i.kt)("p",null,(0,i.kt)("img",{parentName:"p",src:"https://user-images.githubusercontent.com/17002181/130326547-7cdcbc06-b400-43d3-89ce-e73934e38bdf.png",alt:"image"})),(0,i.kt)("p",null,"Vue \u540c\u65f6\u904d\u5386\u65b0\u8001\u5b50\u5143\u7d20\u865a\u62df DOM \u5217\u8868\uff0c\u5e76\u91c7\u7528\u5934\u5c3e\u6bd4\u8f83\u3002\u4e00\u822c\u6709 4 \u79cd\u60c5\u51b5\uff1a"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"\u5f53\u65b0\u8001 start \u6307\u9488\u6307\u5411\u7684\u662f\u76f8\u540c\u8282\u70b9")),(0,i.kt)("p",{parentName:"li"},"\u590d\u7528\u8282\u70b9\u5e76\u6309\u9700\u66f4\u65b0\u3002"),(0,i.kt)("p",{parentName:"li"},"\u65b0\u8001 start \u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\u3002")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"\u5f53\u65b0\u8001 end \u6307\u9488\u6307\u5411\u7684\u662f\u76f8\u540c\u8282\u70b9")),(0,i.kt)("p",{parentName:"li"},"\u590d\u7528\u8282\u70b9\u5e76\u6309\u9700\u66f4\u65b0\u3002"),(0,i.kt)("p",{parentName:"li"},"\u65b0\u8001 end \u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\u3002")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"\u5f53\u8001 start \u6307\u9488\u548c\u65b0 end \u6307\u9488\u6307\u5411\u7684\u662f\u76f8\u540c\u8282\u70b9")),(0,i.kt)("p",{parentName:"li"},"\u590d\u7528\u8282\u70b9\u5e76\u6309\u9700\u66f4\u65b0\uff0c\u5c06\u8282\u70b9\u5bf9\u5e94\u7684\u771f\u5b9e DOM \u79fb\u52a8\u5230\u5b50\u5143\u7d20\u5217\u8868\u961f\u5c3e\u3002"),(0,i.kt)("p",{parentName:"li"},"\u8001 start \u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\u3002"),(0,i.kt)("p",{parentName:"li"},"\u65b0 end \u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\u3002")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"\u5f53\u8001 end \u6307\u9488\u548c\u65b0 start \u6307\u9488\u6307\u5411\u7684\u662f\u76f8\u540c\u8282\u70b9")),(0,i.kt)("p",{parentName:"li"},"\u590d\u7528\u8282\u70b9\u5e76\u6309\u9700\u66f4\u65b0\uff0c\u5c06\u8282\u70b9\u5bf9\u5e94\u7684\u771f\u5b9e DOM \u79fb\u52a8\u5230\u5b50\u5143\u7d20\u5217\u8868\u961f\u5934\u3002"),(0,i.kt)("p",{parentName:"li"},"\u8001 end \u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\u3002"),(0,i.kt)("p",{parentName:"li"},"\u65b0 start \u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\u3002"))),(0,i.kt)("p",null,"\u5728\u4e0d\u6ee1\u8db3\u4ee5\u4e0a\u60c5\u51b5\u7684\u524d\u63d0\u4e0b\uff0c\u4f1a\u5c1d\u8bd5\u68c0\u67e5\u65b0 start \u6307\u9488\u6307\u5411\u7684\u8282\u70b9\u662f\u5426\u6709\u552f\u4e00\u6807\u8bc6\u7b26 key\uff0c\u5982\u679c\u6709\u4e14\u80fd\u5728\u65e7\u5217\u8868\u4e2d\u627e\u5230\u62e5\u6709\u76f8\u540c key \u7684\u76f8\u540c\u7c7b\u578b\u8282\u70b9\uff0c\u5219\u53ef\u590d\u7528\u5e76\u6309\u9700\u66f4\u65b0\uff0c\u4e14\u79fb\u52a8\u8282\u70b9\u5230\u65b0\u7684\u4f4d\u7f6e\u3002\u65b0 start \u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\u3002\u5982\u679c\u4f9d\u65e7\u4e0d\u6ee1\u8db3\u6761\u4ef6\uff0c\u5219\u65b0\u589e\u76f8\u5173\u8282\u70b9\u3002"),(0,i.kt)("p",null,"\u5f53\u65b0\u8001\u5217\u8868\u7684\u4e2d\u4efb\u610f\u4e00\u4e2a\u5217\u8868\u7684\u5934\u6307\u9488\u7d22\u5f15\u5927\u4e8e\u5c3e\u6307\u9488\u7d22\u5f15\u65f6\uff0c\u5faa\u73af\u904d\u5386\u7ed3\u675f\uff0c\u6309\u9700\u5220\u9664\u6216\u65b0\u589e\u76f8\u5173\u8282\u70b9\u5373\u53ef\u3002"),(0,i.kt)("h2",{id:"\u53c2\u8003\u8d44\u6599"},"\u53c2\u8003\u8d44\u6599"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://reactjs.org/docs/reconciliation.html"},"Reconciliation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/vuejs/vue/blob/2.6/src/core/vdom/patch.js"},"patch"))))}k.isMDXComponent=!0}}]);
\ No newline at end of file
diff --git a/assets/js/e2f5eafd.aa00fe09.js b/assets/js/e2f5eafd.aa00fe09.js
new file mode 100644
index 0000000..38a0d5b
--- /dev/null
+++ b/assets/js/e2f5eafd.aa00fe09.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkjjbook=self.webpackChunkjjbook||[]).push([[9791],{3905:function(e,t,n){n.d(t,{Zo:function(){return c},kt:function(){return k}});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(n),k=a,f=s["".concat(p,".").concat(k)]||s[k]||m[k]||l;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:a,o[1]=i;for(var u=2;u=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=r.createContext({}),u=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},k=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,p=e.parentName,k=o(e,["components","mdxType","originalType","parentName"]),m=u(n),s=l,N=m["".concat(p,".").concat(s)]||m[s]||c[s]||a;return n?r.createElement(N,i(i({ref:t},k),{},{components:n})):r.createElement(N,i({ref:t},k))}));function s(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,i=new Array(a);i[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:l,i[1]=o;for(var u=2;u\n \n \n \u6211\u7684\u535a\u5ba2\n \n
watch 本质上是为每个监听属性 setter 创建了一个 watcher,当被监听的属性更新时,调用传入的回调函数。常见的配置选项有 deep 和 immediate,对应原理如下:
deep:深度监听对象,为对象的每一个属性创建一个 watcher,从而确保对象的每一个属性更新时都会触发传入的回调函数。主要原因在于对象属于引用类型,单个属性的更新并不会触发对象 setter,因此引入 deep 能够很好地解决监听对象的问题。同时也会引入判断机制,确保在多个属性更新时回调函数仅触发一次,避免性能浪费。
immediate:在初始化时直接调用回调函数,可以通过在 created 阶段手动调用回调函数实现相同的效果。
# SYN 是建立连接时的握手信号,TCP 中发送第一个 SYN 包的为客户端,接收的为服务端# TCP 中,当发送端数据到达接收端时,接收端返回一个已收到消息的通知。这个消息叫做确认应答 ACK
+ 假设有客户端A,服务端B。我们要建立可靠的数据传输。 SYN(=j) // SYN: A 请求建立连接 A ----------> B | SYN(=j+1) | // ACK: B 确认应答 A 的 SYN SYN(=k) | // SYN: B 发送一个 SYN A <----------- | | ACK(=k+1) -----------> B // ACK: A 确认应答 B 的包
+
客户端发送 SYN 包(seq = j)到服务器,并进入 SYN_SEND 状态,等待服务器确认。
服务器收到 SYN 包,必须确认客户的 SYN(ACK = k + 1),同时自己也发送一个 SYN 包(seq = k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。
客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ACK = k + 1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。
一个网页通常会使用多个外部资源,如图片、JavaScript、CSS、字体等。主线程在解析 DOM 的过程中遇到这些资源后会一一请求。为了加速渲染流程,会有一个叫做预加载扫描器(preload scanner)线程并发运行。如果 HTML 中存在 img 或 link 之类的内容,则预加载扫描器会查看 HTML parser 生成的标记,并发送请求到浏览器进程的网络线程获取这些资源。
JavaScript 可能阻塞解析
当 HTML 解析器发现 script 标签时,会暂停 HTML 的解析,转而开始加载、解析和执行 JavaScript。因为 JS 可能会改变 DOM 的结构。如果不想因 JS 阻塞 HTML 的解析,可以为 script 标签添加 defer 属性或将 script 放在 body 结束标签之前,浏览器会在最后执行 JS 代码,避免阻塞 DOM 构建。
HOC 写法看似简洁,但开发者无法通过阅读 HOC 的调用辨别出方法的作用:看不到接收和返回的结构,增加调试和修复问题的成本;进行多个 HOC 组合使用时,不能确定使用顺序且有命名空间冲突风险,需要了解每个 HOC 的具体实现,难以维护。不建议过度使用 HOC,但比较适合不需要个性化开发定制时使用:常见于第三方库提供 HOC 类型的 API 给开发者进行功能增强。
现代网站大多具有复杂布局,大量的节点和交互操作等特征,直接操作 DOM 方法不当带来的性能问题不可忽视。虚拟 DOM 的本质是 JavaScript 对象,它可以代表 DOM 的一部分特征,是 DOM 的抽象简化版本。通过预先操作虚拟 DOM,在某个时机找出和真实 DOM 之间的差异部分并重新渲染,来提升操作真实 DOM 的性能和效率。
<!-- bad --><!-- React 不会意识到可以保留<li>HZFE</li>和<li>Front-End</li>子树的完整,而是重写每个元素 -->
+<!-- old --><ul><li>HZFE</li><li>Front-End</li></ul><!-- new --><ul><li>Back-End</li><li>HZFE</li><li>Front-End</li></ul>
+<!-- good --><!-- 子列表项有稳定且在兄弟节点中唯一的 key 属性, --><!-- React 使用 key 从新老树中匹配对应节点比较,提高 Diff 效率。 -->
+<!-- old --><ul><likey="2016">HZFE</li><likey="2017">Front-End</li></ul><!-- new --><ul><likey="2015">Back-End</li><likey="2016">HZFE</li><likey="2017">Front-End</li></ul>
JavaScript 是一种同步的、阻塞的、单线程的语言,一次只能执行一个任务。但浏览器定义了非同步的 Web APIs,将回调函数插入到事件循环,实现异步任务的非阻塞执行。常见的异步方案有异步回调、定时器、发布/订阅模式、Promise、生成器 Generator、async/await 以及 Web Worker。