├── .gitignore
├── README.md
├── docs
├── .nojekyll
├── _sidebar.md
├── algorithm.md
├── assets
│ ├── LCP-FID-CLS.png
│ ├── css
│ │ └── main.css
│ ├── fourhand.png
│ ├── github-main-page.png
│ ├── interface-vs-type.png
│ ├── js
│ │ └── main.js
│ ├── prototype-constructor.png
│ ├── react-life-cycle-15.png
│ ├── react-life-cycle-16.png
│ ├── ssl_message_process.png
│ ├── tcp_connect.png
│ ├── tcp_release.png
│ └── threehand.png
├── browserPrinciple.md
├── css.md
├── engineering.md
├── html.md
├── index.html
├── javascript.md
├── lib
│ ├── docsify-copy-code.min.js
│ ├── docsify-pagination.min.js
│ ├── docsify-tabs.min.js
│ ├── docsify-themeable.min.js
│ ├── docsify.min.js
│ ├── external-script.min.js
│ ├── ga.min.js
│ ├── prism-bash.min.js
│ ├── search.js
│ ├── theme-defaults.css
│ ├── theme-simple-dark.css
│ ├── theme-simple.css
│ └── zoom-image.min.js
├── networkProtocol.md
├── nodejs.md
├── performance.md
├── plugins
│ └── putOnRecord.js
├── react.md
├── typescript.md
├── v8.md
└── vue.md
├── package.json
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | */.DS_Store
3 | *node_modules*
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 前端技术栈
2 |
3 | 其中包括`js` `css` `html` 基础,`react` `vue` `redux` `mobx` 等原理总结,`网络` `v8` `前端工程化` `typescript` `性能优化`等
4 |
5 |
6 |

7 |
8 |
9 |
10 | [在线访问](http://duobaoaide.com/)
11 |
12 | > 🚀 持续更新中
13 |
14 | ## Reference
15 |
16 | https://docsify.js.org/#/zh-cn/quickstart
17 |
--------------------------------------------------------------------------------
/docs/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/.nojekyll
--------------------------------------------------------------------------------
/docs/_sidebar.md:
--------------------------------------------------------------------------------
1 |
2 | - [JavaScript](/)
3 | - [CSS](css)
4 | - [HTML](html)
5 | - [Vue技术栈](vue)
6 | - [React技术栈](react)
7 | - [TypeScript](typescript)
8 | - [NodeJs](nodejs)
9 | - [前端工程化](engineering)
10 | - [浏览器原理](browserPrinciple)
11 | - [性能优化](performance)
12 | - [网络](networkProtocol)
13 | - [V8原理](v8)
--------------------------------------------------------------------------------
/docs/algorithm.md:
--------------------------------------------------------------------------------
1 | # 数据结构与算法
2 |
3 |
4 |
5 | # 数据结构
6 |
7 | ## 数组
8 |
9 |
10 |
11 | ## 链表
12 |
13 |
14 |
15 | ## 队列
16 |
17 |
18 |
19 | ## 栈
20 |
21 |
22 |
23 | ## 字符串
24 |
25 |
26 |
27 | ## 散列
28 |
29 |
30 |
31 | ## 堆
32 |
33 |
34 |
35 | ## 树
36 |
37 |
38 |
39 | ## 图
40 |
41 |
42 |
43 | # 算法策略
44 |
45 | ## 排序
46 |
47 |
48 |
49 | ## 搜索 & 查找
50 |
51 |
52 |
53 | ## 双指针
54 |
55 |
56 |
57 | ## 贪心
58 |
59 |
60 |
61 | ## 分治
62 |
63 |
64 |
65 | ## 回溯
66 |
67 |
68 |
69 | ## DFS & BFS
70 |
71 |
72 |
73 | ## 动态规划
74 |
75 |
--------------------------------------------------------------------------------
/docs/assets/LCP-FID-CLS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/LCP-FID-CLS.png
--------------------------------------------------------------------------------
/docs/assets/css/main.css:
--------------------------------------------------------------------------------
1 | .markdown-section iframe[src*="buttons.github.io"] {
2 | margin: 0;
3 | }
4 |
5 | figure.thumbnails img {
6 | margin: 0.75em 0;
7 | border-radius: 3px;
8 | box-shadow: 0 2px 6px rgba(0,0,0,0.1), 0 4px 12px rgba(0,0,0,0.15);
9 | }
10 |
11 | @media (min-width: 30em) {
12 | figure.thumbnails:after {
13 | content: "";
14 | display: table;
15 | clear: both;
16 | }
17 |
18 | figure.thumbnails img {
19 | float: left;
20 | width: calc(50% - 0.75em);
21 | }
22 |
23 | figure.thumbnails img:nth-child(even) {
24 | margin-left: 1.5em;
25 | }
26 |
27 | @supports (display: flex) {
28 | figure.thumbnails {
29 | display: flex;
30 | align-items: center;
31 | }
32 |
33 | figure.thumbnails img {
34 | flex-grow: 1;
35 | width: 0;
36 | }
37 |
38 | figure.thumbnails img + img {
39 | margin: 0 0 0 1.5em;
40 | }
41 | }
42 | }
--------------------------------------------------------------------------------
/docs/assets/fourhand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/fourhand.png
--------------------------------------------------------------------------------
/docs/assets/github-main-page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/github-main-page.png
--------------------------------------------------------------------------------
/docs/assets/interface-vs-type.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/interface-vs-type.png
--------------------------------------------------------------------------------
/docs/assets/js/main.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | // Functions
3 | // =========================================================================
4 | /**
5 | * Adds event listeners to change active stylesheet and restore previously
6 | * activated stylesheet on reload.
7 | *
8 | * @example
9 | *
10 | * This link:
11 | * Foo
12 | * Will active this existing link:
13 | *
14 | *
15 | * @example
16 | *
17 | * This link:
18 | * Bar
19 | * Will activate this existing link:
20 | *
21 | * Or generate this active link:
22 | *
23 | */
24 | function initStyleSwitcher() {
25 | var isInitialzed = false;
26 | var sessionStorageKey = 'activeStylesheetHref';
27 |
28 | function handleSwitch(activeHref, activeTitle) {
29 | var activeElm = document.querySelector('link[href*="' + activeHref +'"],link[title="' + activeTitle +'"]');
30 |
31 | if (!activeElm && activeHref) {
32 | activeElm = document.createElement('link');
33 | activeElm.setAttribute('href', activeHref);
34 | activeElm.setAttribute('rel', 'stylesheet');
35 | activeElm.setAttribute('title', activeTitle);
36 |
37 | document.head.appendChild(activeElm);
38 |
39 | activeElm.addEventListener('load', function linkOnLoad() {
40 | activeElm.removeEventListener('load', linkOnLoad);
41 | setActiveLink(activeElm);
42 | });
43 | }
44 | else if (activeElm) {
45 | setActiveLink(activeElm);
46 | }
47 | }
48 |
49 | function setActiveLink(activeElm) {
50 | var activeHref = activeElm.getAttribute('href');
51 | var activeTitle = activeElm.getAttribute('title');
52 | var inactiveElms = document.querySelectorAll('link[title]:not([href*="' + activeHref +'"]):not([title="' + activeTitle +'"])');
53 |
54 | // Remove "alternate" keyword
55 | activeElm.setAttribute('rel', (activeElm.rel || '').replace(/\s*alternate/g, '').trim());
56 |
57 | // Force enable stylesheet (required for some browsers)
58 | activeElm.disabled = true;
59 | activeElm.disabled = false;
60 |
61 | // Store active style sheet
62 | sessionStorage.setItem(sessionStorageKey, activeHref);
63 |
64 | // Disable other elms
65 | for (var i = 0; i < inactiveElms.length; i++) {
66 | var elm = inactiveElms[i];
67 |
68 | elm.disabled = true;
69 |
70 | // Fix for browsersync and alternate stylesheet updates. Will
71 | // cause FOUC when switching stylesheets during development, but
72 | // required to properly apply style updates when alternate
73 | // stylesheets are enabled.
74 | if (window.browsersyncObserver) {
75 | var linkRel = elm.getAttribute('rel') || '';
76 | var linkRelAlt = linkRel.indexOf('alternate') > -1 ? linkRel : (linkRel + ' alternate').trim();
77 |
78 | elm.setAttribute('rel', linkRelAlt);
79 | }
80 | }
81 |
82 | // CSS custom property ponyfil
83 | if ((window.$docsify || {}).themeable) {
84 | window.$docsify.themeable.util.cssVars();
85 | }
86 | }
87 |
88 | // Event listeners
89 | if (!isInitialzed) {
90 | isInitialzed = true;
91 |
92 | // Restore active stylesheet
93 | document.addEventListener('DOMContentLoaded', function() {
94 | var activeHref = sessionStorage.getItem(sessionStorageKey);
95 |
96 | if (activeHref) {
97 | handleSwitch(activeHref);
98 | }
99 | });
100 |
101 | // Update active stylesheet
102 | document.addEventListener('click', function(evt) {
103 | var dataHref = evt.target.getAttribute('data-link-href');
104 | var dataTitle = evt.target.getAttribute('data-link-title')
105 |
106 | if (dataHref || dataTitle) {
107 | dataTitle = dataTitle
108 | || evt.target.textContent
109 | || '_' + Math.random().toString(36).substr(2, 9); // UID
110 |
111 | handleSwitch(dataHref, dataTitle);
112 | evt.preventDefault();
113 | }
114 | });
115 | }
116 | }
117 |
118 | // Main
119 | // =========================================================================
120 | initStyleSwitcher();
121 | })();
--------------------------------------------------------------------------------
/docs/assets/prototype-constructor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/prototype-constructor.png
--------------------------------------------------------------------------------
/docs/assets/react-life-cycle-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/react-life-cycle-15.png
--------------------------------------------------------------------------------
/docs/assets/react-life-cycle-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/react-life-cycle-16.png
--------------------------------------------------------------------------------
/docs/assets/ssl_message_process.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/ssl_message_process.png
--------------------------------------------------------------------------------
/docs/assets/tcp_connect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/tcp_connect.png
--------------------------------------------------------------------------------
/docs/assets/tcp_release.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/tcp_release.png
--------------------------------------------------------------------------------
/docs/assets/threehand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coralf/tech-doc/b470757778fa664c93423830348d7b07b8913788/docs/assets/threehand.png
--------------------------------------------------------------------------------
/docs/browserPrinciple.md:
--------------------------------------------------------------------------------
1 | # 浏览器原理
2 |
3 | 浏览器原理
4 |
5 | > https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/#Render_tree_construction
6 |
7 | chrome 开发者工具
8 |
9 | > https://developers.google.com/web/tools/chrome-devtools
--------------------------------------------------------------------------------
/docs/css.md:
--------------------------------------------------------------------------------
1 | # 选择器
2 |
3 | ## 普通选择器
4 |
5 | 类:`.box`
6 |
7 | id:`#box`
8 |
9 | 后代:`div p`
10 |
11 | 子元素:`div > p`
12 |
13 | 相邻兄弟:`div + p`,选中div后面的元素,第二个元素需要紧跟在第一个元素后面,才会选中第二个元素,只会选择一个。
14 |
15 | 普通兄弟:`div ~ p`,选中div后面的元素,不需要紧挨着,只需要同层级,选中所有。
16 |
17 | 分组选择:`div,p`,选择div和p。
18 |
19 | 属性:`[属性名=属性值]`,属性值是可选的,=号前面可以还可加,*(包含属性值),$(以属性值结尾的),~(包含属性值,且属性值被空格分割)。
20 |
21 | ```css
22 | a[title]{}选择有title属性的元素
23 | a[title="abc"]{}选择有title的值为abc的元素
24 | a[title*="abc"]{}选择title的值包含abc的元素
25 | a[title|="abc"]{}选择title的值以abc开头的元素,或者以abc-开头的元素
26 | a[title^="abc"]{}选择title的值以abc开头的元素
27 | a[title$="abc"]{}选择title的值以abc结尾的元素
28 | a[title~="abc"]{}选择title的值以空格分开abc字符串的元素
29 | a[title="abc" i]{}不区分大小写
30 | a[title="abc" s]{}区分大小写
31 | ```
32 |
33 | ## 伪类
34 |
35 | `:first-child`:选中第一个子元素。
36 |
37 | `:last-child`:选中最后一个子元素。
38 |
39 | `:first-of-type`:同一个父元素下,第一个元素,嵌套有效。
40 |
41 | `:last-of-type `:同一个父元素下,最后一个元素,嵌套有效。
42 |
43 | `:nth-child(n)`:同一个父元素下,选中第n个。
44 |
45 | `:nth-of-type(n)`: 同一个父元素下按类型选中第n个。不是这个类型的则不会被选中。
46 |
47 | `:root`声明全局变量
48 |
49 | **a标签的书写顺序(LVHA)**
50 |
51 | ```css
52 | a:link{} a:visited{} a:hover{} a:active{}
53 | ```
54 |
55 | ## 伪元素
56 |
57 | `p::after`选中p的最后一个子元素,可以使用`content:'xxx'`来插入内容。
58 |
59 | `p::before`:与`::after`对应。
60 |
61 | `p::first-letter`:选中第一行第一个字母。
62 |
63 | `p::first-line`:选择第一行,只能在块元素中有效。
64 |
65 | ## 优先级计算
66 |
67 | > 第一等:代表内联样式,如: style="",权值为1000。
68 | >
69 | > 第二等:代表ID选择器,如:#content,权值为0100。
70 | >
71 | > 第三等:代表类,伪类和属性选择器,如.content,权值为0010。
72 | >
73 | > 第四等:代表类型选择器和伪元素选择器,如div,权值为0001。
74 | >
75 | > 通配符、子选择器、相邻选择器、兄弟选择器。如*、>、+,权值为0000,优先级仅高于继承
76 | >
77 | > 继承的样式没有权值
78 | >
79 | > !important 拥有最高权值(高于内联)
80 | >
81 | > 这篇文章讲得很好 https://www.cnblogs.com/lvonve/p/11250196.html
82 |
83 | *在计算css优先级的时候直接把样式中有的优先级相加就行了,数值越大优先级越高。*
84 |
85 | # 层叠性
86 |
87 | 层叠性根据不同来源的css样式划分,来规定css的应用的优先级。
88 |
89 | 程序员编写的代码 > 用户(用浏览器的人)> 用户代理(浏览器默认)
90 |
91 | # 包含块
92 |
93 | 一个元素的包含块,影响该元素的位置和大小。一般来说一个元素的包含块是它的祖先元素。
94 |
95 | 1、position为static、sticty、relative的包含块为它的父元素。
96 |
97 | 2、position:absolute的包含块为最近非static元素。
98 |
99 | 3、position:fixed为viewport(视口)
100 |
101 | 4、position为absolute或fixed元素的包含块也可能是父元素为以下几种情况。
102 |
103 | - `transform`或者`perspective`的值不为none;
104 | - `will-change`的值为`transform 或 perspective `;
105 | - `filter`的值不为`none`或者`will-change`的值为`filter`(Firefox有效);
106 | - `contain`的值为`paint`。
107 |
108 |
109 |
110 | # 盒子模型
111 |
112 | ## content-box
113 |
114 | width的设置只限制content(内容),盒子的实际宽度为border+padding+content,设置padding,border会撑大盒子。
115 |
116 | ## border-box
117 |
118 | width的设置限定了border+padding+content,如果padding和border的增加,只会让盒子往里撑。
119 |
120 | *如果盒子内部padding、border的值超过了盒子本身宽高,盒子依然会被撑大。*
121 |
122 | > 不管是content-box还是border-box,outline不占任何空间。
123 |
124 | ## 包含块
125 |
126 | 包含块是一个元素,它作为其他元素的尺寸、位置计算的参考元素。
127 |
128 | 比如一个元素定位为`position:fixed`,那么它的包含块就是视口。
129 |
130 | ## BFC
131 |
132 | **块级格式化上下文**,BFC规定了块级盒子的布局规则。
133 |
134 | ### 布局规则
135 |
136 | 1、内部的盒子会在垂直方向一个一个放置。
137 |
138 | 2、盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻盒子上下的margin会发生重叠。
139 |
140 | 3、每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此。
141 |
142 | 4、BFC的区域不会与float重叠。
143 |
144 | 5、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之也如此。
145 |
146 | 6、计算BFC的高度时,浮动元素也参与计算。
147 |
148 | ### 产生BFC的条件
149 |
150 | 1、根元素;
151 |
152 | 2、float的属性不为none;
153 |
154 | 3、position为absolute或fixed;
155 |
156 | 4、display为inline-block,table-cell,table-caption,flex;
157 |
158 | 5、overflow不为visible;
159 |
160 | 6、display:flow-root
161 |
162 | ## IFC
163 |
164 | **行级格式上下文**,IFC规定了行级盒子的布局规则。
165 |
166 | ### 布局规则
167 |
168 | 1、内部的盒子会在水平方向,一个个地放置。
169 |
170 | 2、IFC的高度,由里面最高盒子的高度决定。
171 |
172 | 3、当一行不够放置的时候会自动切换到下一行。
173 |
174 | # 布局
175 |
176 | ## 浮动
177 |
178 | ```html
179 |
194 |
199 | ```
200 |
201 | ### 清除浮动的方式
202 |
203 | 1、伪元素。
204 |
205 | ```css
206 | .row::after {
207 | content: '';
208 | display: block;
209 | clear: both;
210 | }
211 | ```
212 |
213 | 或者
214 |
215 | ```css
216 | .row::after {
217 | content: '';
218 | display: block;
219 | overflow:hidden;
220 | }
221 | ```
222 |
223 | 2、在最后插入一个子元素``;
224 |
225 | 3、将父元素css设置为`display:flow-root`或者`overflow: hidden;`;
226 |
227 | ## flex
228 | > http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
229 |
230 | ## grid
231 | > http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html
232 | >
233 | > https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Grids
234 |
235 | ## 几种经典布局方式
236 | > https://lhammer.cn/You-need-to-know-css/#/zh-cn/fluid-fixed
237 |
238 | # 定位
239 |
240 | `absolute`:相对最近非static的父元素定位,脱离文档流,形成BFC;
241 |
242 | `fixed`:相对视口定位,脱离文档流,形成BFC;
243 |
244 | `relative`:相对父元素定位,正常文档流;
245 |
246 | `static`:默认定位,正常文档流;
247 |
248 | `sticky`:粘性定位(滚动固定),正常文档流;
249 |
250 | > https://developer.mozilla.org/zh-CN/docs/Web/CSS/position
251 |
252 | # 字体
253 | > https://developer.mozilla.org/zh-CN/docs/Web/CSS/font
254 |
255 | # 圆角
256 | > https://developer.mozilla.org/zh-CN/docs/Web/CSS/border-radius
257 |
258 | # 边框
259 | > 边框 https://developer.mozilla.org/zh-CN/docs/Web/CSS/border
260 | > 轮廓 https://developer.mozilla.org/zh-CN/docs/Web/CSS/outline
261 |
262 | # 背景
263 | > https://developer.mozilla.org/zh-CN/docs/Web/CSS/background
264 |
265 | # 阴影
266 | > https://developer.mozilla.org/zh-CN/docs/Web/CSS/box-shadow
267 |
268 | # 渐变
269 |
270 | > 线性渐变:https://developer.mozilla.org/zh-CN/docs/Web/CSS/linear-gradient()
271 |
272 | > 径向渐变:https://developer.mozilla.org/zh-CN/docs/Web/CSS/radial-gradient()
273 |
274 | > 重复线性渐变:https://developer.mozilla.org/zh-CN/docs/Web/CSS/repeating-linear-gradient()
275 | >
276 | > 重复径向渐变:https://developer.mozilla.org/zh-CN/docs/Web/CSS/repeating-radial-gradient()
277 |
278 | # 变换
279 | > https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform
280 |
281 | # 动画
282 |
283 | ## Animation
284 |
285 | **动画书写规则**
286 |
287 | `animation:动画名、持续时间、运动函数、延迟多久执行、动画执行多少次、动画方向、动画执行完成后如何应用CSS样式`
288 |
289 | > 时间是单位都是s或者ms
290 |
291 | **运动函数**
292 |
293 | ```css
294 | animation-timing-function: ease、ease-in、ease-out、ease-in-out、linear、steps()、cubic-bezier(0.1, 0.7, 1.0, 0.1)
295 | ```
296 |
297 | **动画执行多少次**
298 |
299 | ```css
300 | animation-iteration-count: infinite、数字;
301 | ```
302 |
303 | **动画方向**
304 |
305 | ```css
306 | animation-direction: reverse;//从动画完结状态开始执行
307 | animation-direction: alternate;//交替执行
308 | animation-direction: alternate-reverse;//混用
309 | ```
310 |
311 | **动画执行完成后如何应用CSS样式**
312 |
313 | ```css
314 | animation-fill-mode: forwards;//完成后不会恢复原来状态
315 | animation-fill-mode: backwards;//恢复原来状态
316 | ```
317 |
318 | **动画名**
319 |
320 | ```css
321 | //方式1
322 | @keyframe 动画名{
323 | from{
324 | css样式
325 | }
326 | to{
327 | css样式
328 | }
329 | }
330 |
331 | //方式2
332 | @keyframe 动画名{
333 | 0%{
334 | css样式
335 | }
336 | 50%{
337 | css样式
338 | }
339 | ...
340 | 100%{
341 | css样式
342 | }
343 | }
344 | ```
345 |
346 | ## 过渡(Transition)
347 |
348 | **书写规则**
349 |
350 | ```css
351 | transition:css属性 、持续时间、运动函数、延迟多久执行。
352 | ```
353 |
354 | > 1、可以配合hover伪类和js来使用
355 | >
356 | > 2、只要transition-property监听的值发生了变化,就会执行动画。
357 |
358 |
359 |
360 | ## css动画实现抛物线运动轨迹
361 |
362 | css不管是通过animation还是transition都无法实现曲线运动。这里是曲线运动使用两个元素配合来完成抛物线。一个元素往X轴运动,另一个往Y轴运动,然后通过cubic-bezier这个函数使两个元素不同时间运动的快慢不一样。就形成了抛物线的运动轨迹。
363 |
364 | **css**
365 |
366 | ```css
367 | .container {
368 | position: absolute;
369 | left: 500px;
370 | top: 500px;
371 | }
372 |
373 | .box {
374 | width: 20px;
375 | height: 20px;
376 | /* background-color: coral; */
377 | background-color: transparent;
378 | border-radius: 50%;
379 | animation: xAxis 2s infinite cubic-bezier(.6, .28, .68, .58);
380 | }
381 |
382 | .box::after {
383 | content: '';
384 | display: block;
385 | width: 20px;
386 | height: 20px;
387 | background-color: aquamarine;
388 | /* background-color: transparent; */
389 | border-radius: 50%;
390 | animation: yAxis 2s infinite cubic-bezier(0, 1.48, .77, 1.74);
391 | }
392 |
393 | @keyframes xAxis {
394 | 100% {
395 | transform: translateX(200px)
396 | }
397 | }
398 |
399 | @keyframes yAxis {
400 | 100% {
401 | transform: translateY(-200px);
402 | }
403 | }
404 | ```
405 |
406 | **html**
407 |
408 | ```html
409 |
412 | ```
413 |
414 | # 滤镜
415 |
416 | > https://developer.mozilla.org/zh-CN/docs/Web/CSS/filter
417 |
418 | # 裁剪
419 | > https://developer.mozilla.org/en-US/docs/Web/CSS/clip-path
420 |
421 | # 单位
422 |
423 | > https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Values_and_Units
424 |
425 | # 参考
426 |
427 | > MDN : https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference
428 | >
429 | > 你需要知道的css:https://lhammer.cn/You-need-to-know-css/#/zh-cn/
--------------------------------------------------------------------------------
/docs/engineering.md:
--------------------------------------------------------------------------------
1 | # 前端工程化
2 |
3 | # webpack
4 |
5 | > https://webpack.docschina.org/concepts/
6 |
7 | # Rollup
8 |
9 | > https://www.rollupjs.com/guide/command-line-reference
10 |
11 | # Babel
12 |
13 | 官方文档
14 |
15 | > https://www.babeljs.cn/docs/
16 |
17 | babel编译原理
18 |
19 | > https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md
20 |
21 | 抽象语法树节点类型
22 |
23 | > https://github.com/babel/babel/blob/master/packages/babel-parser/ast/spec.md
24 |
25 | 抽象语法树生成器
26 |
27 | > https://astexplorer.net/
28 |
29 | # 设计模式
30 |
31 | > https://refactoring.guru/design-patterns/typescript
32 |
33 | # 部署
34 |
35 | ## docker
36 |
37 | 官方文档
38 |
39 | > https://www.docker.com/
40 |
41 | 中文文档
42 |
43 | > http://www.dockerinfo.net/document
44 |
45 | ## ngnix
46 |
47 | # 兼容性
48 |
49 | Can I Use
50 |
51 | > https://caniuse.com/
52 |
53 | # Micro Frontends
54 |
55 | > https://micro-frontends.org/
56 |
57 | bit
58 |
59 | > https://docs.bit.dev/docs/quick-start
60 |
61 | # Atomic Design
62 |
63 | > https://blog.bitsrc.io/atomic-design-and-ui-components-theory-to-practice-f200db337c24
64 |
65 | > https://bradfrost.com/blog/post/atomic-web-design/
66 |
67 | > https://atomicdesign.bradfrost.com/table-of-contents/
--------------------------------------------------------------------------------
/docs/html.md:
--------------------------------------------------------------------------------
1 | # HTML、DHTML、XHTML之间的区别
2 |
3 | DHTML指是的javaScript+html,动态html。XHTML是使用xml的规范来编写html。
4 |
5 | # 常用块元素
6 |
7 | `div` `table` `form` `p` `ul` `li` `ol` `h1~h6` `hr`
8 |
9 | # 常用行内元素
10 |
11 | `a` `abbr` `br` `input` `em` `code` ` span` ` strong` ` video` ` audio` `textarea` `u` `lable` `img`
12 |
13 | # 语义化
14 |
15 | `aside`:表示独立的一块内容,单独拆分出来不会影响整体。
16 |
17 | `footer`:表示页面底部。
18 |
19 | `header`:页面头部,里面放logo、标题、导航等。
20 |
21 | `main`:页面主体。
22 |
23 | `nav`:导航栏。
24 |
25 | `section`:表示单独的一块。
26 |
27 |
28 |
29 | # HTML5新特性
30 |
31 | ## 音频
32 |
33 | `video` `audio`
34 |
35 | ## 定位
36 |
37 | `navigator.geolocation`
38 |
39 | ## 图形
40 |
41 | `svg` `canvas`
42 |
43 | ## 存储
44 |
45 | `localStorage` `sessionStorage` `IndexedDB` `cookie`(非新增)
46 |
47 |
48 |
49 | ## 应用缓存
50 |
51 | `manifest`
52 |
53 |
54 |
55 | ## Web Workers
56 |
57 | Web Worker可以让JavaScript代码在后台运行。
58 |
59 | `const worker = new Worker('xxx.js')`
60 |
61 | 监听worker消息
62 |
63 | ```javascript
64 | worker.onmessage=function(event){
65 |
66 | }
67 | ```
68 |
69 | 向worker发送消息
70 |
71 | ```javascript
72 | worker.popostMessage({msg:'xxx'});
73 | ```
74 |
75 | 终止worker
76 |
77 | ```javascript
78 | worker.terminate();
79 | ```
80 |
81 |
82 |
83 | ## Server-Sent Event
84 |
85 | 使用EventSource创建的对象用于监听服务端推送的消息。
86 |
87 | ```javascript
88 | const eventSource = new EventSource(url);
89 | ```
90 |
91 | 一但服务端有消息推送会触发onmessage回调。
92 |
93 | ```javascript
94 | eventSource.onmessage=function(e){
95 | console.log(e.data);
96 | }
97 | ```
98 |
99 | ## 表单
100 |
101 | ### 新增Input类型
102 |
103 | `email` `number` `url` `range` `date` `month` `week` `time` `datetime` `datetime-local` `search`
104 |
105 |
106 |
107 | ### 新增元素
108 |
109 | ``
110 |
111 | `` 目前只有这个被实现了
112 |
113 | ``
114 |
115 | ### 新增属性
116 |
117 | #### form属性
118 |
119 | `autocomplete` `novalidate(未被实现)`
120 |
121 | #### input属性
122 |
123 | `autocomplete` `autofocus` `min、max、step` `placeholder` `required`
124 |
125 | ## 拖放
126 |
127 | `img`元素设置`draggable="true"`表示该元素可以被拖动,`ondragstart`为拖拽开始的回调。
128 |
129 | `div`元素`ondrop`为元素被放置时的回调。
130 |
131 | 如果要将数据或元素放置到其他元素中`ondragover`回调需要阻止默认事件。
132 |
133 | 通过`dataTransfer`可以在元素之间传送数据。
134 |
135 | ```html
136 |
137 |
138 |
139 |
140 |
153 | ```
154 |
155 |
156 |
157 | ## Web Socket
158 |
159 | 基于TCP、套字节、全双工、双向通讯。
160 |
161 | url以`ws://`、`wss://(安全加密)`开头。
162 |
163 | 不受同源策略。
164 |
165 | ### 创建WebSocket
166 |
167 | ```javascript
168 | let ws = new WebSocket("ws://www.example.com/server.php");
169 | ```
170 |
171 |
172 | ### 连接成功后发送消息
173 |
174 | 使用`send`发送消息,`close`关闭连接
175 |
176 | ```javascript
177 | //方式1
178 | ws.onopen = function () {
179 | ws.send('Hello Server!');
180 | }
181 | //方式2
182 | ws.addEventListener('open', function (event) {
183 | ws.send('Hello Server!');
184 | });
185 | ```
186 |
187 |
188 |
189 | ### 接收消息
190 |
191 | ```javascript
192 | ws.onmessage = function(event) {
193 | var data = event.data;
194 | // 处理数据
195 | };
196 |
197 | ws.addEventListener("message", function(event) {
198 | var data = event.data;
199 | // 处理数据
200 | });
201 |
202 | ```
203 |
204 |
205 | ### 状态
206 |
207 | - CONNECTING:值为0,表示正在连接。
208 | - OPEN:值为1,表示连接成功,可以通信了。
209 | - CLOSING:值为2,表示连接正在关闭。
210 | - CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
211 |
212 | ```javascript
213 | switch (ws.readyState) {
214 | case WebSocket.CONNECTING:
215 | // do something
216 | break;
217 | case WebSocket.OPEN:
218 | // do something
219 | break;
220 | case WebSocket.CLOSING:
221 | // do something
222 | break;
223 | case WebSocket.CLOSED:
224 | // do something
225 | break;
226 | default:
227 | // this never happens
228 | break;
229 | }
230 | ```
231 |
232 |
233 | ### 连接关闭回调
234 |
235 | ```javascript
236 | ws.onclose = function(event) {
237 | var code = event.code;
238 | var reason = event.reason;
239 | var wasClean = event.wasClean;
240 | // handle close event
241 | };
242 |
243 | ws.addEventListener("close", function(event) {
244 | var code = event.code;
245 | var reason = event.reason;
246 | var wasClean = event.wasClean;
247 | // handle close event
248 | });
249 | ```
250 |
251 |
252 |
253 | > 参考:http://www.ruanyifeng.com/blog/2017/05/websocket.html
254 |
255 | # Web Components
256 |
257 | ## 自定义元素
258 |
259 | Web Components允许自定义web页面元素,通过继承dom接口的方式。
260 |
261 | 有两种方式可以自定义元素,第一种Autonomous custom elements为完全自定义元素,第二种Customized built-in elements暂且就叫半自定义元素吧。
262 |
263 | ### Autonomous custom elements
264 |
265 | 这种方式直接继承HTMLElement对象实现完全自定义元素,使用这种方式自定义元素就相当于新创建了一个dom元素类型,可以像div、p一样使用。
266 |
267 | 调用`customElements.define`第一个参数表示html页面元素的名字,第二个参数是自定义元素的类。
268 |
269 | ```javascript
270 | class MyEl extends HTMLElement {
271 | constructor() {
272 | super();
273 | //做自定义操作
274 | this.style.color = '#ff6b6b';
275 | }
276 | }
277 | customElements.define('my-el', MyEl);
278 | ```
279 |
280 | ```html
281 |
自定义的元素
282 | ```
283 |
284 |
285 |
286 | ### **Customized built-in elements**
287 |
288 | 这里需要在`customElements.define`方法中传入第三个参数,`extennds`表示继承的元素。
289 |
290 | 使用的时候在对应元素上面使用`is`属性指定。
291 |
292 | ```javascript
293 | class MyDiv extends HTMLDivElement {
294 | constructor() {
295 | super();
296 | //做自定义操作
297 | this.style.color = '#ff6b6b';
298 | }
299 | }
300 | customElements.define('my-div', MyDiv,{extends:'div'});
301 | ```
302 |
303 | ```html
304 |
自定义div
305 | ```
306 |
307 | > 自定义元素可继承的接口
308 | >
309 | > https://developer.mozilla.org/zh-CN/docs/Web/API/Document_Object_Model#HTML_%E6%8E%A5%E5%8F%A3
310 |
311 |
312 |
313 | ## Shadow DOM
314 |
315 | Shadow DOM 可以将一个隐藏的、独立的 DOM 附加到一个元素上,就相当于DOM中的DOM。
316 |
317 | Shadow DOM可以隔绝上下文,相当于独立出来的一部分。外面与里面的DOM互不影响。
318 |
319 | ```javascript
320 | class MyElement extends HTMLElement {
321 | constructor() {
322 | super();
323 | const shadow = this.attachShadow({ mode: 'open' });
324 | const div = document.createElement('div');
325 | const style = document.createElement('style');
326 | style.textContent = `
327 | .box{
328 | width:200px;
329 | height:100px;
330 | background:#ff6b6b;
331 | }
332 | `;
333 | div.setAttribute('class', 'box');
334 | shadow.appendChild(style);
335 | shadow.appendChild(div);
336 | }
337 | }
338 | customElements.define('my-element', MyElement);
339 |
340 | ```
341 |
342 | ```html
343 |
自定义元素与Shadow DOM
344 | ```
345 |
346 |
347 |
348 | > const shadow = this.attachShadow({ mode: 'open' });
349 | >
350 | > mode:'open' 外面可以通过myElement.shadowRoot来获取里面的DOM,如果为closed则返回null
351 |
352 |
353 |
354 | ## Template/Slot
355 |
356 | 在页面中`template`中的元素不会被直接渲染出来,只有通过DOM添加到时才会渲染。
357 |
358 | `slot`是一个插槽,如果指定了一个元素slot属性,则该元素相当于替换slot的标签。
359 |
360 | ```html
361 |
362 |
363 | block-p
364 |
365 |
366 | slot outer
367 |
368 | slot inner
369 |
370 |
371 |
372 |
373 |
374 |
375 | xxxxx
376 |
377 |
378 | ```
379 |
380 | ```javascript
381 | customElements.define('my-block',(
382 | class MyBlock extends HTMLElement{
383 | constructor(){
384 | super();
385 | const template = document.getElementById('my-temp');
386 | const shadow = this.attachShadow({mode:'open'});
387 | shadow.appendChild(template.content.cloneNode(true));//只有这个时候才会渲染template标签中的内容
388 | }
389 | }
390 | ));
391 | ```
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
9 |
11 |
12 |
docsify-themeable - A delightfully simple theme system for docsify.js
13 |
14 |
15 |
17 |
18 |
19 |
20 |
22 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/docs/javascript.md:
--------------------------------------------------------------------------------
1 | # JavaScript
2 |
3 | # 数据类型
4 |
5 | javascript中目前一共有8中数据类型,其中原始(基本)类型有7种、剩下1种为引用类型。
6 |
7 | ## 原始类型
8 | `string` `number` `boolean` `null` `undefined` `symbol` `bigInt`
9 | ## 对象类型
10 | `Date` `RegExp` `Global` `Math` `Map` `Set` `Object` `Array` `Boolean` `Number` `String` ...
11 |
12 | # var、let、const
13 |
14 | `var`可重复定义、没有块级作用域。
15 |
16 | `let`与`const`用来定义变量,都有块级作用域 ,`let`可变,`const`不可变。
17 |
18 |
19 |
20 | # 函数
21 |
22 | ## 三种声明函数的方式
23 |
24 | 1、普通函数`function test(){}`
25 |
26 | 2、箭头函数`const test = ()=> {}`
27 |
28 | 3、变量声明`const test = function(){}`
29 |
30 | > JavaScript中都是以变量来存储函数的,无法声明两个相同变量名,因此没有重载。
31 |
32 | # 闭包
33 |
34 | ## 什么是闭包?
35 |
36 | 闭包是用来保存哪些本该被回收的变量,也可以说闭包会延长变量的使用周期。
37 |
38 | ## 闭包的应用
39 |
40 | #### 节流
41 |
42 | ```javascript
43 | const throttle = (function () {
44 | let timer = null;
45 | return function (seconds) {
46 | if (timer === null) {
47 | timer = setTimeout(() => {
48 | console.log('=>>');
49 | clearTimeout(timer);
50 | timer = null;
51 | }, seconds);
52 | }
53 | }
54 | })();
55 | ```
56 |
57 |
58 |
59 | #### 防抖
60 |
61 | ```javascript
62 | const antShaking = (function () {
63 | let timer = null;
64 | return function (seconds) {
65 | if (timer === null) {
66 | console.log('=>>')
67 | } else {
68 | if (new Date().getTime() - timer > seconds) {
69 | console.log('=>>x');
70 | }
71 | }
72 | timer = new Date().getTime();
73 | }
74 | })();
75 | ```
76 |
77 |
78 |
79 | # this
80 |
81 | ## this的绑定
82 |
83 | * 当一个函数被调用时有一个活动记录(执行上下文),这个活动记录包含了函数执行的相关信息,this只是这个活动记录中的一个属性。
84 | * this的指向取决于函数在哪里被调用。
85 |
86 | *按照下面顺序判断。*
87 |
88 | 1、是否是new 创建的;
89 |
90 | 2、是否调用call、apply、bind;
91 |
92 | 3、函数被某个对象调用 `obj.test()`;
93 |
94 | 4、是否默认绑定到了全局对象。非严格模式var 声明的默认会绑定到全局对象上面。
95 |
96 | 5、箭头函数的this指向与它的外层函数保持一致
97 |
98 | ## this的优先级
99 |
100 | > new > call 、apply 、bind > 隐式绑定 > 默认绑定
101 |
102 | # 原型链
103 |
104 | 声明一个类(函数)会有一个`prototype`的属性,该属性默认指向`Object`。当实例化一个类后会自带一个`__proto__`的属性。这个属性是隐式的。
105 |
106 | > 这两个属性的关系:`__proto__===prototype`
107 |
108 | 如果我们使用将一个类的`prototype`绑定一个对象的实例,这样就可以实现继承。这样就形成了原型链。
109 |
110 | > Person === Person.prototype.constructor
111 |
112 | # 继承
113 |
114 | ## 组合继承
115 |
116 | **组合继承实现步骤**
117 |
118 | 1、调用`call()`继承属性
119 |
120 | 2、`prototype`继承方法
121 |
122 | 3、修复构造函数
123 |
124 | ```javascript
125 | const Animal = function () {
126 |
127 | this.run = () => {
128 | console.log('Animal running');
129 | }
130 | }
131 | const Cat = function () {
132 | Animal.call(this)
133 | this.name = 'miaom';
134 | }
135 |
136 | Cat.prototype = new Animal();
137 | Cat.prototype.constructor = Cat;
138 | console.log(new Cat());
139 | console.log(Cat.prototype.constructor);
140 | ```
141 |
142 |
143 |
144 | # 代理反射
145 |
146 | ## Reflect
147 |
148 | **1、不能实例化提供可调用的静态方法**。
149 |
150 | **2、Reflect里面的方法与Object中方法类似。**
151 |
152 | > Reflect方法与Object方法的不同点
153 | >
154 | > https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/Comparing_Reflect_and_Object_methods
155 |
156 | ### Reflect.apply()
157 |
158 | 与`Function.prototype.apply()`类似
159 |
160 | ```javascript
161 | function test(...param) {
162 | console.log(param);
163 | }
164 | Reflect.apply(test, null, [1, 2, 3]);//output => [1,2,3]
165 | ```
166 |
167 | ### Reflect.defineProperty()
168 |
169 | 与`Object.defineProperty()`类似
170 |
171 | ```javascript
172 | const obj = {
173 | _name: 'xxx'
174 | };
175 | Reflect.defineProperty(obj, 'name', {
176 | enumerable: false,//是否可以使用for in 和Object.keys()
177 | configurable: false,//是否可以被删除
178 | writable: false,//可写
179 | get() {
180 | return this._name;
181 | },
182 | set(val) {
183 | this._name = val;
184 | }
185 | })
186 | obj.name = '90';
187 | console.log(obj.name);
188 | ```
189 |
190 |
191 |
192 | ## Proxy
193 |
194 | **target** : 被代理的对象
195 |
196 | **handler** :处理对象
197 |
198 | **捕捉器**:handler中的方法
199 |
200 | ```javascript
201 | const handler={
202 | get(){},
203 | set(){},
204 | defineProperty(){}
205 | ...
206 | }
207 | const pObj = new Proxy(target,handler);
208 | ```
209 |
210 |
211 |
212 | # 异步
213 |
214 | ## JS中的异步
215 |
216 | 由于js的执行是单线程。在js中有两个队列来执行异步任务,一个是执行微任务的队列,一个是执行宏任务的队列。微任务执行的优先级高于宏任务。
217 |
218 | ## 微任务与宏任务
219 |
220 | ### 宏任务
221 |
222 | setTimeout、setInterval、I/O、事件、postMessage、setImmediate(Node.js废弃)、requestAnimationFrame、UI渲染
223 |
224 | ### 微任务
225 |
226 | Promise.then、MutationObserver、process.nextTick(Node.js)
227 |
228 | # 其他
229 |
230 | 1、try 或 catch 块无法阻止 finally 块执行,包括 return 语句。
--------------------------------------------------------------------------------
/docs/lib/docsify-copy-code.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * docsify-copy-code
3 | * v2.1.1
4 | * https://github.com/jperasmus/docsify-copy-code
5 | * (c) 2017-2020 JP Erasmus
6 | * MIT license
7 | */
8 | !function(){"use strict";function s(o){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o})(o)}!function(o,e){void 0===e&&(e={});var t=e.insertAt;if(o&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===t&&n.firstChild?n.insertBefore(c,n.firstChild):n.appendChild(c),c.styleSheet?c.styleSheet.cssText=o:c.appendChild(document.createTextNode(o))}}(".docsify-copy-code-button,.docsify-copy-code-button span{cursor:pointer;transition:all .25s ease}.docsify-copy-code-button{position:absolute;z-index:1;top:0;right:0;overflow:visible;padding:.65em .8em;border:0;border-radius:0;outline:0;font-size:1em;background:grey;background:var(--theme-color,grey);color:#fff;opacity:0}.docsify-copy-code-button span{border-radius:3px;background:inherit;pointer-events:none}.docsify-copy-code-button .error,.docsify-copy-code-button .success{position:absolute;z-index:-100;top:50%;right:0;padding:.5em .65em;font-size:.825em;opacity:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.docsify-copy-code-button.error .error,.docsify-copy-code-button.success .success{right:100%;opacity:1;-webkit-transform:translate(-115%,-50%);transform:translate(-115%,-50%)}.docsify-copy-code-button:focus,pre:hover .docsify-copy-code-button{opacity:1}"),document.querySelector('link[href*="docsify-copy-code"]')&&console.warn("[Deprecation] Link to external docsify-copy-code stylesheet is no longer necessary."),window.DocsifyCopyCodePlugin={init:function(){return function(o,e){o.ready(function(){console.warn("[Deprecation] Manually initializing docsify-copy-code using window.DocsifyCopyCodePlugin.init() is no longer necessary.")})}}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(o,r){o.doneEach(function(){var o=Array.apply(null,document.querySelectorAll("pre[data-lang]")),c={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};r.config.copyCode&&Object.keys(c).forEach(function(t){var n=r.config.copyCode[t];"string"==typeof n?c[t]=n:"object"===s(n)&&Object.keys(n).some(function(o){var e=-1',''.concat(c.buttonText,""),''.concat(c.errorText,""),''.concat(c.successText,""),""].join("");o.forEach(function(o){o.insertAdjacentHTML("beforeend",e)})}),o.mounted(function(){document.querySelector(".content").addEventListener("click",function(o){if(o.target.classList.contains("docsify-copy-code-button")){var e="BUTTON"===o.target.tagName?o.target:o.target.parentNode,t=document.createRange(),n=e.parentNode.querySelector("code"),c=window.getSelection();t.selectNode(n),c.removeAllRanges(),c.addRange(t);try{document.execCommand("copy")&&(e.classList.add("success"),setTimeout(function(){e.classList.remove("success")},1e3))}catch(o){console.error("docsify-copy-code: ".concat(o)),e.classList.add("error"),setTimeout(function(){e.classList.remove("error")},1e3)}"function"==typeof(c=window.getSelection()).removeRange?c.removeRange(t):"function"==typeof c.removeAllRanges&&c.removeAllRanges()}})})}].concat(window.$docsify.plugins||[])}();
9 | //# sourceMappingURL=docsify-copy-code.min.js.map
--------------------------------------------------------------------------------
/docs/lib/docsify-pagination.min.js:
--------------------------------------------------------------------------------
1 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e():"function"==typeof define&&define.amd?define(e):e()}(0,function(){"use strict";var t,p=(function(t,e){function n(t,e){return e.querySelector(t)}(e=t.exports=function(t,e){return n(t,e=e||document)}).all=function(t,e){return(e=e||document).querySelectorAll(t)},e.engine=function(t){if(!t.one)throw new Error(".one callback required");if(!t.all)throw new Error(".all callback required");return n=t.one,e.all=t.all,e}}(t={exports:{}},t.exports),t.exports);p.all,p.engine;try{var a=p}catch(t){a=p}var e=Element.prototype,r=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector,u=function(t,e){if(!t||1!==t.nodeType)return!1;if(r)return r.call(t,e);for(var n=a.all(e,t.parentNode),i=0;i*{line-height:1;vertical-align:middle}.pagination-item-label svg{height:.8em;width:auto;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1px}.pagination-item--next{margin-left:auto;text-align:right}.pagination-item--next svg{margin-left:.5em}.pagination-item--previous svg{margin-right:.5em}.pagination-item-title{font-size:1.6em}.pagination-item-subtitle{text-transform:uppercase;opacity:.3}");var o=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},l=function(){function i(t,e){for(var n=0;n ul > li"),p("p",e)),this.hyperlink=m(t))}return l(n,[{key:"toJSON",value:function(){if(this.hyperlink)return{name:this.hyperlink.innerText,href:this.hyperlink.getAttribute("href"),chapterName:this.chapter&&this.chapter.innerText||""}}}]),n}();var x={container:function(){return''},inner:function(t,e){return[t.prev&&'\n \n ",t.next&&'\n \n "].filter(Boolean).join("")}};window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(t,e){var n=c({},s(e.config),e.config.pagination||{});function i(){var t=p("."+h);t&&(t.innerHTML=x.inner(function(t,e){var n=e.crossChapter,i=e.routerMode;try{var a=i===d.HISTORY?t.route.path:"#"+t.route.path,r=g(p.all(".sidebar-nav li a")).filter(function(t){return!u(t,".section-link")}),o=r.find(v(a)),l=g((f(o,"ul")||{}).children).filter(function(t){return"LI"===t.tagName.toUpperCase()}),c=n?r.findIndex(v(a)):l.findIndex(function(t){var e=m(t);return e&&v(a,e)}),s=n?r:l;return{prev:new y(s[c-1]).toJSON(),next:new y(s[c+1]).toJSON()}}catch(t){return{}}}(e,n),n))}t.afterEach(function(t){return t+x.container()}),t.doneEach(function(){return i()})}].concat(window.$docsify.plugins||[])});
--------------------------------------------------------------------------------
/docs/lib/docsify-tabs.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * docsify-tabs
3 | * v1.5.2
4 | * https://jhildenbiddle.github.io/docsify-tabs/
5 | * (c) 2018-2021 John Hildenbiddle
6 | * MIT license
7 | */
8 | !function(){"use strict";!function(t,o){void 0===o&&(o={});var a=o.insertAt;if(t&&"undefined"!=typeof document){var e=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===a&&e.firstChild?e.insertBefore(c,e.firstChild):e.appendChild(c),c.styleSheet?c.styleSheet.cssText=t:c.appendChild(document.createTextNode(t))}}(':root{--docsifytabs-border-color:#ededed;--docsifytabs-border-px:1px;--docsifytabs-border-radius-px: ;--docsifytabs-margin:1.5em 0;--docsifytabs-tab-background:#f8f8f8;--docsifytabs-tab-background--active:var(--docsifytabs-content-background);--docsifytabs-tab-color:#999;--docsifytabs-tab-color--active:inherit;--docsifytabs-tab-highlight-px:3px;--docsifytabs-tab-highlight-color:var(--theme-color,currentColor);--docsifytabs-tab-padding:0.6em 1em;--docsifytabs-content-background:inherit;--docsifytabs-content-padding:1.5rem}.docsify-tabs:before,.docsify-tabs__tab{z-index:1}.docsify-tabs__tab--active,.docsify-tabs__tab:focus{z-index:2}.docsify-tabs{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative}.docsify-tabs:before{-ms-flex-order:0;content:"";-ms-flex:1 1;flex:1 1;order:0}.docsify-tabs__tab{-ms-flex-order:-1;appearance:none;font-size:inherit;margin:0;order:-1;position:relative}.docsify-tabs__content{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.docsify-tabs__content :first-child{margin-top:0}.docsify-tabs__content :first-child~:last-child,.docsify-tabs__content :last-child{margin-bottom:0}.docsify-tabs__tab--active+.docsify-tabs__content{height:auto;overflow:auto;position:relative;visibility:visible}[class*=docsify-tabs--]{margin:1.5em 0;margin:var(--docsifytabs-margin)}[class*=docsify-tabs--] .docsify-tabs__tab{background:#f8f8f8;background:var(--docsifytabs-tab-background);color:#999;color:var(--docsifytabs-tab-color);padding:.6em 1em;padding:var(--docsifytabs-tab-padding)}[class*=docsify-tabs--] .docsify-tabs__tab--active{background:inherit;background:var(--docsifytabs-tab-background--active);color:inherit;color:var(--docsifytabs-tab-color--active)}[class*=docsify-tabs--] .docsify-tabs__content{background:inherit;background:var(--docsifytabs-content-background);padding:1.5rem;padding:var(--docsifytabs-content-padding)}.docsify-tabs--classic .docsify-tabs__content,.docsify-tabs--classic .docsify-tabs__tab,.docsify-tabs--classic:before{border-color:#ededed;border-width:1px;border:var(--docsifytabs-border-px) solid var(--docsifytabs-border-color)}.docsify-tabs--classic:before{border-left-width:0;border-right-width:0;border-top-width:0;margin-right:1px;margin-right:var(--docsifytabs-border-px)}.docsify-tabs--classic .docsify-tabs__tab:first-of-type{border-top-left-radius:var(--docsifytabs-border-radius-px)}.docsify-tabs--classic .docsify-tabs__tab:last-of-type{border-top-right-radius:var(--docsifytabs-border-radius-px)}.docsify-tabs--classic .docsify-tabs__tab~.docsify-tabs__tab{margin-left:-1px;margin-left:calc(0px - var(--docsifytabs-border-px))}.docsify-tabs--classic .docsify-tabs__tab--active{border-bottom-width:0;box-shadow:inset 0 3px 0 0 var(--theme-color,currentColor);box-shadow:inset 0 var(--docsifytabs-tab-highlight-px) 0 0 var(--docsifytabs-tab-highlight-color)}.docsify-tabs--classic .docsify-tabs__content{border-radius:0;border-radius:0 var(--docsifytabs-border-radius-px) var(--docsifytabs-border-radius-px) var(--docsifytabs-border-radius-px);border-top:0;margin-top:-1px;margin-top:calc(0px - var(--docsifytabs-border-px))}.docsify-tabs--material .docsify-tabs__tab{background:transparent;border:0;margin-bottom:2px;margin-bottom:calc(var(--docsifytabs-tab-highlight-px) - var(--docsifytabs-border-px))}.docsify-tabs--material .docsify-tabs__tab--active{background:transparent;box-shadow:0 3px 0 0 var(--theme-color,currentColor);box-shadow:0 var(--docsifytabs-tab-highlight-px) 0 0 var(--docsifytabs-tab-highlight-color)}.docsify-tabs--material .docsify-tabs__content{border-color:#ededed;border-width:1px 0;border-bottom:var(--docsifytabs-border-px) solid var(--docsifytabs-border-color);border-left:0 solid var(--docsifytabs-border-color);border-right:0 solid var(--docsifytabs-border-color);border-top:var(--docsifytabs-border-px) solid var(--docsifytabs-border-color)}',{insertAt:"top"});var t="tabs:replace",o={tabsContainer:"content",tabBlock:"docsify-tabs",tabButton:"docsify-tabs__tab",tabButtonActive:"docsify-tabs__tab--active",tabContent:"docsify-tabs__content"},a={codeMarkup:/(```[\s\S]*?```)/gm,commentReplaceMarkup:new RegExp("\x3c!-- ".concat(t," (.*) --\x3e")),tabBlockMarkup:/[\r\n]*(\s*)()[\r\n]+([\s|\S]*?)[\r\n\s]+()/m,tabCommentMarkup:/[\r\n]*(\s*)[\r\n]+([\s\S]*?)[\r\n]*\s*(?=)/m},e={persist:!0,sync:!0,theme:"classic",tabComments:!0,tabHeadings:!0};function c(t,o){if(Element.prototype.closest)return t.closest(o);for(;t;){if(r(t,o))return t;t=t.parentNode||null}return t}function r(t,o){return(Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector).call(t,o)}function s(t){var a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=c(t,".".concat(o.tabButton));if(r){var n=r.getAttribute("data-tab"),i=document.querySelector(".".concat(o.tabsContainer)),d=r.parentNode,b=Array.apply(null,d.querySelectorAll(".".concat(o.tabButton))),f=d.offsetTop;if(b.forEach((function(t){return t.classList.remove(o.tabButtonActive)})),r.classList.add(o.tabButtonActive),!a){if(e.persist){var l=i?Array.apply(null,i.querySelectorAll(".".concat(o.tabBlock))):[],u=l.indexOf(d),y=JSON.parse(sessionStorage.getItem(window.location.href))||{};y[u]=n,sessionStorage.setItem(window.location.href,JSON.stringify(y))}if(e.sync){var p=i?Array.apply(null,i.querySelectorAll(".".concat(o.tabButton,'[data-tab="').concat(n,'"]'))):[],m=JSON.parse(sessionStorage.getItem("*"))||[];p.forEach((function(t){s(t,!0)})),window.scrollBy(0,0-(f-d.offsetTop)),m.indexOf(n)>0&&m.splice(m.indexOf(n),1),0!==m.indexOf(n)&&(m.unshift(n),sessionStorage.setItem("*",JSON.stringify(m)))}}}}function n(){var t=decodeURIComponent((window.location.hash.match(/(?:id=)([^&]+)/)||[])[1]),a=t&&".".concat(o.tabBlock," #").concat(t);if(t&&document.querySelector(a)){var e,c=document.querySelector("#".concat(t));if(c.closest)e=c.closest(".".concat(o.tabContent));else for(e=c.parentNode;e!==document.body&&!e.classList.contains("".concat(o.tabContent));)e=e.parentNode;s(e.previousElementSibling)}}window&&(window.$docsify=window.$docsify||{},window.$docsify.tabs=window.$docsify.tabs||{},Object.keys(window.$docsify.tabs).forEach((function(t){Object.prototype.hasOwnProperty.call(e,t)&&(e[t]=window.$docsify.tabs[t])})),window.$docsify.tabs.version="1.5.2",(e.tabComments||e.tabHeadings)&&(window.$docsify.plugins=[].concat((function(c,r){var i=!1;c.beforeEach((function(c){return(i=a.tabBlockMarkup.test(c))&&(c=function(c,r){for(var s,n,i=c.match(a.codeMarkup)||[],d=i.map((function(o,a){var e="\x3c!-- ".concat(t," CODEBLOCK").concat(a," --\x3e");return c=c.replace(o,(function(){return e})),e})),b=e.theme?"".concat(o.tabBlock,"--").concat(e.theme):"",f=document.createElement("div"),l=1,u=function(){var i=s[0],d="",u="",y=e.tabComments&&a.tabCommentMarkup.test(i),p=e.tabHeadings&&a.tabHeadingMarkup.test(i),m=s[1],h=s[2],g=s[4];if(y||p){d="\x3c!-- ".concat(t,' --\x3e'),u="\n".concat(m,"\x3c!-- ").concat(t,"
--\x3e");for(var v=function(){f.innerHTML=n[2].trim()?r.compiler.compile(n[2]).replace(/<\/?p>/g,""):"Tab ".concat(l);var a=f.innerHTML,e=(n[3]||"").trim(),c=(f.textContent||f.firstChild.getAttribute("alt")||f.firstChild.getAttribute("src")).trim().toLowerCase();i=i.replace(n[0],(function(){return["\n".concat(m,"\x3c!-- ").concat(t,' --\x3e"),"\n".concat(m,"\x3c!-- ").concat(t,' --\x3e'),"\n\n".concat(m).concat(e),"\n\n".concat(m,"\x3c!-- ").concat(t,"
--\x3e")].join("")})),l++};null!==(n=(e.tabComments?a.tabCommentMarkup.exec(i):null)||(e.tabHeadings?a.tabHeadingMarkup.exec(i):null));)v()}i=(i=i.replace(h,(function(){return d}))).replace(g,(function(){return u})),c=c.replace(s[0],(function(){return i}))};null!==(s=a.tabBlockMarkup.exec(c));)u();return d.forEach((function(t,o){c=c.replace(t,(function(){return i[o]}))})),c}(c,r)),c})),c.afterEach((function(t,o){i&&(t=function(t){for(var o,e=function(){var a=o[0],e=o[1]||"";t=t.replace(a,(function(){return e}))};null!==(o=a.commentReplaceMarkup.exec(t));)e();return t}(t)),o(t)})),c.doneEach((function(){var t,a,c,r;i&&(a=(t=document.querySelector(".".concat(o.tabsContainer)))?Array.apply(null,t.querySelectorAll(".".concat(o.tabBlock))):[],c=JSON.parse(sessionStorage.getItem(window.location.href))||{},r=JSON.parse(sessionStorage.getItem("*"))||[],n(),a.forEach((function(t,a){var s=t.querySelector(".".concat(o.tabButtonActive));s||(e.sync&&r.length&&(s=r.map((function(a){return t.querySelector(".".concat(o.tabButton,'[data-tab="').concat(a,'"]'))})).filter((function(t){return t}))[0]),!s&&e.persist&&(s=t.querySelector(".".concat(o.tabButton,'[data-tab="').concat(c[a],'"]'))),(s=s||t.querySelector(".".concat(o.tabButton)))&&s.classList.add(o.tabButtonActive))})))})),c.mounted((function(){var t=document.querySelector(".".concat(o.tabsContainer));t&&t.addEventListener("click",(function(t){s(t.target)})),window.addEventListener("hashchange",n,!1)}))}),window.$docsify.plugins||[])))}();
9 | //# sourceMappingURL=docsify-tabs.min.js.map
--------------------------------------------------------------------------------
/docs/lib/docsify-themeable.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * docsify-themeable
3 | * v0.8.6
4 | * https://jhildenbiddle.github.io/docsify-themeable/
5 | * (c) 2018-2021 John Hildenbiddle
6 | * MIT license
7 | */
8 | !function(){"use strict";function e(){return(e=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},n={mimeType:t.mimeType||null,onBeforeSend:t.onBeforeSend||Function.prototype,onSuccess:t.onSuccess||Function.prototype,onError:t.onError||Function.prototype,onComplete:t.onComplete||Function.prototype},r=Array.isArray(e)?e:[e],o=Array.apply(null,Array(r.length)).map((function(e){return null}));function a(e){var t="string"==typeof e,n=t&&"<"===e.trim().charAt(0);return t&&!n}function s(e,t){n.onError(e,r[t],t)}function c(e,t){var a=n.onSuccess(e,r[t],t);e=!1===a?"":a||e,o[t]=e,-1===o.indexOf(null)&&n.onComplete(o)}var i=document.createElement("a");r.forEach((function(e,t){if(i.setAttribute("href",e),i.href=String(i.href),Boolean(document.all&&!window.atob)&&i.host.split(":")[0]!==location.host.split(":")[0]){if(i.protocol===location.protocol){var r=new XDomainRequest;r.open("GET",e),r.timeout=0,r.onprogress=Function.prototype,r.ontimeout=Function.prototype,r.onload=function(){var e=r.responseText;a(e)?c(e,t):s(r,t)},r.onerror=function(e){s(r,t)},setTimeout((function(){r.send()}),0)}else console.warn("Internet Explorer 9 Cross-Origin (CORS) requests must use the same protocol (".concat(e,")")),s(null,t)}else{var o=new XMLHttpRequest;o.open("GET",e),n.mimeType&&o.overrideMimeType&&o.overrideMimeType(n.mimeType),n.onBeforeSend(o,e,t),o.onreadystatechange=function(){if(4===o.readyState){var e=o.responseText;o.status<400&&a(e)||0===o.status&&a(e)?c(e,t):s(o,t)}},o.send()}}))}function n(e){var n=/\/\*[\s\S]+?\*\//g,o=/(?:@import\s*)(?:url\(\s*)?(?:['"])([^'"]*)(?:['"])(?:\s*\))?(?:[^;]*;)/g,a={rootElement:e.rootElement||document,include:e.include||'style,link[rel="stylesheet"]',exclude:e.exclude||null,filter:e.filter||null,skipDisabled:!1!==e.skipDisabled,useCSSOM:e.useCSSOM||!1,onBeforeSend:e.onBeforeSend||Function.prototype,onSuccess:e.onSuccess||Function.prototype,onError:e.onError||Function.prototype,onComplete:e.onComplete||Function.prototype},s=Array.apply(null,a.rootElement.querySelectorAll(a.include)).filter((function(e){return t=e,n=a.exclude,!(t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector).call(t,n);var t,n})),c=Array.apply(null,Array(s.length)).map((function(e){return null}));function i(){if(-1===c.indexOf(null)){c.reduce((function(e,t,n){return""===t&&e.push(n),e}),[]).reverse().forEach((function(e){return[s,c].forEach((function(t){return t.splice(e,1)}))}));var e=c.join("");a.onComplete(e,c,s)}}function u(e,t,n,r){var o=a.onSuccess(e,n,r);d(e=void 0!==o&&!1===Boolean(o)?"":o||e,n,r,(function(e,r){null===c[t]&&(r.forEach((function(e){return a.onError(e.xhr,n,e.url)})),!a.filter||a.filter.test(e)?c[t]=e:c[t]="",i())}))}function l(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],s={};return s.rules=(e.replace(n,"").match(o)||[]).filter((function(e){return-1===a.indexOf(e)})),s.urls=s.rules.map((function(e){return e.replace(o,"$1")})),s.absoluteUrls=s.urls.map((function(e){return r(e,t)})),s.absoluteRules=s.rules.map((function(e,n){var o=s.urls[n],a=r(s.absoluteUrls[n],t);return e.replace(o,a)})),s}function d(e,n,r,o){var s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],c=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],i=l(e,r,c);i.rules.length?t(i.absoluteUrls,{onBeforeSend:function(e,t,r){a.onBeforeSend(e,n,t)},onSuccess:function(e,t,r){var o=a.onSuccess(e,n,t),s=l(e=!1===o?"":o||e,t,c);return s.rules.forEach((function(t,n){e=e.replace(t,s.absoluteRules[n])})),e},onError:function(t,a,u){s.push({xhr:t,url:a}),c.push(i.rules[u]),d(e,n,r,o,s,c)},onComplete:function(t){t.forEach((function(t,n){e=e.replace(i.rules[n],t)})),d(e,n,r,o,s,c)}}):o(e,s)}s.length?s.forEach((function(e,n){var o=e.getAttribute("href"),s=e.getAttribute("rel"),l="link"===e.nodeName.toLowerCase()&&o&&s&&-1!==s.toLowerCase().indexOf("stylesheet"),d=!1!==a.skipDisabled&&e.disabled,f="style"===e.nodeName.toLowerCase();if(l&&!d)t(o,{mimeType:"text/css",onBeforeSend:function(t,n,r){a.onBeforeSend(t,e,n)},onSuccess:function(t,a,s){var c=r(o);u(t,n,e,c)},onError:function(t,r,o){c[n]="",a.onError(t,e,r),i()}});else if(f&&!d){var m=e.textContent;a.useCSSOM&&(m=Array.apply(null,e.sheet.cssRules).map((function(e){return e.cssText})).join("")),u(m,n,e,location.href)}else c[n]="",i()})):a.onComplete("",[])}function r(e,t){var n=document.implementation.createHTMLDocument(""),r=n.createElement("base"),o=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(o),r.href=t||document.baseURI||(document.querySelector("base")||{}).href||location.href,o.href=e,o.href}var o=a;function a(e,t,n){e instanceof RegExp&&(e=s(e,n)),t instanceof RegExp&&(t=s(t,n));var r=c(e,t,n);return r&&{start:r[0],end:r[1],pre:n.slice(0,r[0]),body:n.slice(r[0]+e.length,r[1]),post:n.slice(r[1]+t.length)}}function s(e,t){var n=t.match(e);return n?n[0]:null}function c(e,t,n){var r,o,a,s,c,i=n.indexOf(e),u=n.indexOf(t,i+1),l=i;if(i>=0&&u>0){if(e===t)return[i,u];for(r=[],a=n.length;l>=0&&!c;)l==i?(r.push(l),i=n.indexOf(e,l+1)):1==r.length?c=[r.pop(),u]:((o=r.pop())=0?i:u;r.length&&(c=[a,s])}return c}function i(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={preserveStatic:!0,removeComments:!1},a=e({},r,n),s=[];function c(e){throw new Error("CSS parse error: ".concat(e))}function i(e){var n=e.exec(t);if(n)return t=t.slice(n[0].length),n}function u(){return i(/^{\s*/)}function l(){return i(/^}/)}function d(){i(/^\s*/)}function f(){if(d(),"/"===t[0]&&"*"===t[1]){for(var e=2;t[e]&&("*"!==t[e]||"/"!==t[e+1]);)e++;if(!t[e])return c("end of comment is missing");var n=t.slice(2,e);return t=t.slice(e+2),{type:"comment",comment:n}}}function m(){for(var e,t=[];e=f();)t.push(e);return a.removeComments?[]:t}function p(){for(d();"}"===t[0];)c("extra closing bracket");var e=i(/^(("(?:\\"|[^"])*"|'(?:\\'|[^'])*'|[^{])+)/);if(e){var n,r=e[0].trim();/\/\*/.test(r)&&(r=r.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g,""));var o=/["']\w*,\w*["']/.test(r);return o&&(r=r.replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g,(function(e){return e.replace(/,/g,"")}))),n=/,/.test(r)?r.split(/\s*(?![^(]*\)),\s*/):[r],o&&(n=n.map((function(e){return e.replace(/\u200C/g,",")}))),n}}function v(){if("@"===t[0])return O();i(/^([;\s]*)+/);var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,n=i(/^(\*?[-#/*\\\w.]+(\[[0-9a-z_-]+\])?)\s*/);if(n){if(n=n[0].trim(),!i(/^:\s*/))return c("property missing ':'");var r=i(/^((?:\/\*.*?\*\/|'(?:\\'|.)*?'|"(?:\\"|.)*?"|\((\s*'(?:\\'|.)*?'|"(?:\\"|.)*?"|[^)]*?)\s*\)|[^};])+)/),o={type:"declaration",property:n.replace(e,""),value:r?r[0].replace(e,"").trim():""};return i(/^[;\s]*/),o}}function h(){if(!u())return c("missing '{'");for(var e,t=m();e=v();)t.push(e),t=t.concat(m());return l()?t:c("missing '}'")}function y(){d();for(var e,t=[];e=i(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/);)t.push(e[1]),i(/^,\s*/);if(t.length)return{type:"keyframe",values:t,declarations:h()}}function g(){var e=i(/^@([-\w]+)?keyframes\s*/);if(e){var t=e[1];if(!(e=i(/^([-\w]+)\s*/)))return c("@keyframes missing name");var n,r=e[1];if(!u())return c("@keyframes missing '{'");for(var o=m();n=y();)o.push(n),o=o.concat(m());return l()?{type:"keyframes",name:r,vendor:t,keyframes:o}:c("@keyframes missing '}'")}}function b(){if(i(/^@page */))return{type:"page",selectors:p()||[],declarations:h()}}function w(){var e=i(/@(top|bottom|left|right)-(left|center|right|top|middle|bottom)-?(corner)?\s*/);if(e)return{type:"page-margin-box",name:"".concat(e[1],"-").concat(e[2])+(e[3]?"-".concat(e[3]):""),declarations:h()}}function E(){if(i(/^@font-face\s*/))return{type:"font-face",declarations:h()}}function S(){var e=i(/^@supports *([^{]+)/);if(e)return{type:"supports",supports:e[1].trim(),rules:M()}}function C(){if(i(/^@host\s*/))return{type:"host",rules:M()}}function x(){var e=i(/^@media([^{]+)*/);if(e)return{type:"media",media:(e[1]||"").trim(),rules:M()}}function A(){var e=i(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/);if(e)return{type:"custom-media",name:e[1].trim(),media:e[2].trim()}}function k(){var e=i(/^@([-\w]+)?document *([^{]+)/);if(e)return{type:"document",document:e[2].trim(),vendor:e[1]?e[1].trim():null,rules:M()}}function L(){var e=i(/^@(import|charset|namespace)\s*([^;]+);/);if(e)return{type:e[1],name:e[2].trim()}}function O(){if(d(),"@"===t[0]){var e=L()||E()||x()||g()||S()||k()||A()||C()||b()||w();if(e&&!a.preserveStatic){var n=!1;if(e.declarations)n=e.declarations.some((function(e){return/var\(/.test(e.value)}));else n=(e.keyframes||e.rules||[]).some((function(e){return(e.declarations||[]).some((function(e){return/var\(/.test(e.value)}))}));return n?e:{}}return e}}function _(){if(!a.preserveStatic){var e=o("{","}",t);if(e){var n=/:(?:root|host)(?![.:#(])/.test(e.pre)&&/--\S*\s*:/.test(e.body),r=/var\(/.test(e.body);if(!n&&!r)return t=t.slice(e.end+1),{}}}var s=p()||[],i=a.preserveStatic?h():h().filter((function(e){var t=s.some((function(e){return/:(?:root|host)(?![.:#(])/.test(e)}))&&/^--\S/.test(e.property),n=/var\(/.test(e.value);return t||n}));return s.length||c("selector missing"),{type:"rule",selectors:s,declarations:i}}function M(e){if(!e&&!u())return c("missing '{'");for(var n,r=m();t.length&&(e||"}"!==t[0])&&(n=O()||_());)n.type&&r.push(n),r=r.concat(m());return e||l()?r:c("missing '}'")}return{type:"stylesheet",stylesheet:{rules:M(!0),errors:s}}}function u(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={parseHost:!1,store:{},onWarning:function(){}},o=e({},r,n),a=new RegExp(":".concat(o.parseHost?"host":"root","$"));return"string"==typeof t&&(t=i(t,o)),t.stylesheet.rules.forEach((function(e){"rule"===e.type&&e.selectors.some((function(e){return a.test(e)}))&&e.declarations.forEach((function(e,t){var n=e.property,r=e.value;n&&0===n.indexOf("--")&&(o.store[n]=r)}))})),o.store}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r={charset:function(e){return"@charset "+e.name+";"},comment:function(e){return 0===e.comment.indexOf("__CSSVARSPONYFILL")?"/*"+e.comment+"*/":""},"custom-media":function(e){return"@custom-media "+e.name+" "+e.media+";"},declaration:function(e){return e.property+":"+e.value+";"},document:function(e){return"@"+(e.vendor||"")+"document "+e.document+"{"+o(e.rules)+"}"},"font-face":function(e){return"@font-face{"+o(e.declarations)+"}"},host:function(e){return"@host{"+o(e.rules)+"}"},import:function(e){return"@import "+e.name+";"},keyframe:function(e){return e.values.join(",")+"{"+o(e.declarations)+"}"},keyframes:function(e){return"@"+(e.vendor||"")+"keyframes "+e.name+"{"+o(e.keyframes)+"}"},media:function(e){return"@media "+e.media+"{"+o(e.rules)+"}"},namespace:function(e){return"@namespace "+e.name+";"},page:function(e){return"@page "+(e.selectors.length?e.selectors.join(", "):"")+"{"+o(e.declarations)+"}"},"page-margin-box":function(e){return"@"+e.name+"{"+o(e.declarations)+"}"},rule:function(e){var t=e.declarations;if(t.length)return e.selectors.join(",")+"{"+o(t)+"}"},supports:function(e){return"@supports "+e.supports+"{"+o(e.rules)+"}"}};function o(e){for(var o="",a=0;a1&&void 0!==arguments[1]?arguments[1]:{},r={preserveStatic:!0,preserveVars:!1,variables:{},onWarning:function(){}},o=e({},r,n);return"string"==typeof t&&(t=i(t,o)),d(t.stylesheet,(function(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;if(-1===e.indexOf("var("))return e;var r=o("(",")",e);function a(e){var r=e.split(",")[0].replace(/[\s\n\t]/g,""),o=(e.match(/(?:\s*,\s*){1}(.*)?/)||[])[1],a=Object.prototype.hasOwnProperty.call(t.variables,r)?String(t.variables[r]):void 0,s=a||(o?String(o):void 0),c=n||e;return a||t.onWarning('variable "'.concat(r,'" is undefined')),s&&"undefined"!==s&&s.length>0?p(s,t,c):"var(".concat(c,")")}if(r){if("var"===r.pre.slice(-3)){var s=0===r.body.trim().length;return s?(t.onWarning("var() must contain a non-whitespace string"),e):r.pre.slice(0,-3)+a(r.body)+p(r.post,t)}return r.pre+"(".concat(p(r.body,t),")")+p(r.post,t)}return-1!==e.indexOf("var(")&&t.onWarning('missing closing ")" in the value "'.concat(e,'"')),e}var v="undefined"!=typeof window,h=v&&window.CSS&&window.CSS.supports&&window.CSS.supports("(--a: 0)"),y={group:0,job:0},g={rootElement:v?document:null,shadowDOM:!1,include:"style,link[rel=stylesheet]",exclude:"",variables:{},onlyLegacy:!0,preserveStatic:!0,preserveVars:!1,silent:!1,updateDOM:!0,updateURLs:!0,watch:null,onBeforeSend:function(){},onError:function(){},onWarning:function(){},onSuccess:function(){},onComplete:function(){},onFinally:function(){}},b={cssComments:/\/\*[\s\S]+?\*\//g,cssKeyframes:/@(?:-\w*-)?keyframes/,cssMediaQueries:/@media[^{]+\{([\s\S]+?})\s*}/g,cssUrls:/url\((?!['"]?(?:data|http|\/\/):)['"]?([^'")]*)['"]?\)/g,cssVarDeclRules:/(?::(?:root|host)(?![.:#(])[\s,]*[^{]*{\s*[^}]*})/g,cssVarDecls:/(?:[\s;]*)(-{2}\w[\w-]*)(?:\s*:\s*)([^;]*);/g,cssVarFunc:/var\(\s*--[\w-]/,cssVars:/(?:(?::(?:root|host)(?![.:#(])[\s,]*[^{]*{\s*[^;]*;*\s*)|(?:var\(\s*))(--[^:)]+)(?:\s*[:)])/},w={dom:{},job:{},user:{}},E=!1,S=null,C=0,x=null,A=!1;function k(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r="cssVars(): ",o=e({},g,t);function a(e,t,n,a){!o.silent&&window.console&&console.error("".concat(r).concat(e,"\n"),t),o.onError(e,t,n,a)}function s(e){!o.silent&&window.console&&console.warn("".concat(r).concat(e)),o.onWarning(e)}function c(e){o.onFinally(Boolean(e),h,N()-o.__benchmark)}if(v){if(o.watch)return o.watch=g.watch,L(o),void k(o);if(!1===o.watch&&S&&(S.disconnect(),S=null),!o.__benchmark){if(E===o.rootElement)return void O(t);var d=[].slice.call(o.rootElement.querySelectorAll('[data-cssvars]:not([data-cssvars="out"])'));if(o.__benchmark=N(),o.exclude=[S?'[data-cssvars]:not([data-cssvars=""])':'[data-cssvars="out"]',"link[disabled]:not([data-cssvars])",o.exclude].filter((function(e){return e})).join(","),o.variables=j(o.variables),d.forEach((function(e){var t="style"===e.nodeName.toLowerCase()&&e.__cssVars.text,n=t&&e.textContent!==e.__cssVars.text;t&&n&&(e.sheet&&(e.sheet.disabled=!1),e.setAttribute("data-cssvars",""))})),!S){var m=[].slice.call(o.rootElement.querySelectorAll('[data-cssvars="out"]'));m.forEach((function(e){var t=e.getAttribute("data-cssvars-group");(t?o.rootElement.querySelector('[data-cssvars="src"][data-cssvars-group="'.concat(t,'"]')):null)||e.parentNode.removeChild(e)})),C&&d.length2&&void 0!==arguments[2]?arguments[2]:[],d=e({},w.dom,w.user);if(w.job={},r.forEach((function(e,t){var r=n[t];if(e.__cssVars=e.__cssVars||{},e.__cssVars.text=r,b.cssVars.test(r))try{var c=i(r,{preserveStatic:o.preserveStatic,removeComments:!0});u(c,{parseHost:Boolean(o.rootElement.host),store:w.dom,onWarning:s}),e.__cssVars.tree=c}catch(t){a(t.message,e)}})),e(w.job,w.dom),o.updateDOM?(e(w.user,o.variables),e(w.job,w.user)):(e(w.job,w.user,o.variables),e(d,o.variables)),y.job>0&&Boolean(Object.keys(w.job).length>Object.keys(d).length||Boolean(Object.keys(d).length&&Object.keys(w.job).some((function(e){return w.job[e]!==d[e]})))))V(o.rootElement),k(o);else{var m=[],p=[],v=!1;if(o.updateDOM&&y.job++,r.forEach((function(t,r){var c=!t.__cssVars.tree;if(t.__cssVars.tree)try{f(t.__cssVars.tree,e({},o,{variables:w.job,onWarning:s}));var i=l(t.__cssVars.tree);if(o.updateDOM){var u=n[r],d=b.cssVarFunc.test(u);if(t.getAttribute("data-cssvars")||t.setAttribute("data-cssvars","src"),i.length&&d){var h=t.getAttribute("data-cssvars-group")||++y.group,g=i.replace(/\s/g,""),E=o.rootElement.querySelector('[data-cssvars="out"][data-cssvars-group="'.concat(h,'"]'))||document.createElement("style");v=v||b.cssKeyframes.test(i),o.preserveStatic&&t.sheet&&(t.sheet.disabled=!0),E.hasAttribute("data-cssvars")||E.setAttribute("data-cssvars","out"),g===t.textContent.replace(/\s/g,"")?(c=!0,E&&E.parentNode&&(t.removeAttribute("data-cssvars-group"),E.parentNode.removeChild(E))):g!==E.textContent.replace(/\s/g,"")&&([t,E].forEach((function(e){e.setAttribute("data-cssvars-job",y.job),e.setAttribute("data-cssvars-group",h)})),E.textContent=i,m.push(i),p.push(E),E.parentNode||t.parentNode.insertBefore(E,t.nextSibling))}}else t.textContent.replace(/\s/g,"")!==i&&m.push(i)}catch(e){a(e.message,t)}c&&t.setAttribute("data-cssvars","skip"),t.hasAttribute("data-cssvars-job")||t.setAttribute("data-cssvars-job",y.job)})),C=o.rootElement.querySelectorAll('[data-cssvars]:not([data-cssvars="out"])').length,o.shadowDOM)for(var h,g=[].concat(o.rootElement).concat([].slice.call(o.rootElement.querySelectorAll("*"))),S=0;h=g[S];++S)if(h.shadowRoot&&h.shadowRoot.querySelector("style")){var x=e({},o,{rootElement:h.shadowRoot});k(x)}o.updateDOM&&v&&_(o.rootElement),E=!1,o.onComplete(m.join(""),p,JSON.parse(JSON.stringify(w.job)),N()-o.__benchmark),c(p.length)}}}));else document.addEventListener("DOMContentLoaded",(function e(n){k(t),document.removeEventListener("DOMContentLoaded",e)}))}}function L(e){function t(e){var t=n(e)&&e.hasAttribute("disabled"),r=(e.sheet||{}).disabled;return t||r}function n(e){return"link"===e.nodeName.toLowerCase()&&-1!==(e.getAttribute("rel")||"").indexOf("stylesheet")}function r(e){return"style"===e.nodeName.toLowerCase()}window.MutationObserver&&(S&&(S.disconnect(),S=null),(S=new MutationObserver((function(o){o.some((function(o){return function(r){var o=!1;if("attributes"===r.type&&n(r.target)&&!t(r.target)){var a="disabled"===r.attributeName,s="href"===r.attributeName,c="skip"===r.target.getAttribute("data-cssvars"),i="src"===r.target.getAttribute("data-cssvars");a?o=!c&&!i:s&&(c?r.target.setAttribute("data-cssvars",""):i&&V(e.rootElement,!0),o=!0)}return o}(o)||function(e){var t=!1;if("childList"===e.type){var n=r(e.target),o="out"===e.target.getAttribute("data-cssvars");t=n&&!o}return t}(o)||function(e){var o=!1;return"childList"===e.type&&(o=[].slice.call(e.addedNodes).some((function(e){var o=1===e.nodeType&&e.hasAttribute("data-cssvars"),a=r(e)&&b.cssVars.test(e.textContent);return!o&&(n(e)||a)&&!t(e)}))),o}(o)||function(t){var n=!1;return"childList"===t.type&&(n=[].slice.call(t.removedNodes).some((function(t){var n=1===t.nodeType,r=n&&"out"===t.getAttribute("data-cssvars"),o=n&&"src"===t.getAttribute("data-cssvars"),a=o;if(o||r){var s=t.getAttribute("data-cssvars-group"),c=e.rootElement.querySelector('[data-cssvars-group="'.concat(s,'"]'));o&&V(e.rootElement,!0),c&&c.parentNode.removeChild(c)}return a}))),n}(o)}))&&k(e)}))).observe(document.documentElement,{attributes:!0,attributeFilter:["disabled","href"],childList:!0,subtree:!0}))}function O(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;clearTimeout(x),x=setTimeout((function(){e.__benchmark=null,k(e)}),t)}function _(e){var t=["animation-name","-moz-animation-name","-webkit-animation-name"].filter((function(e){return getComputedStyle(document.body)[e]}))[0];if(t){for(var n=e.getElementsByTagName("*"),r=[],o="__CSSVARSPONYFILL-KEYFRAMES__",a=0,s=n.length;a0&&void 0!==arguments[0]?arguments[0]:{},t=/^-{2}/;return Object.keys(e).reduce((function(n,r){return n[t.test(r)?r:"--".concat(r.replace(/^-+/,""))]=e[r],n}),{})}function T(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.href,n=document.implementation.createHTMLDocument(""),r=n.createElement("base"),o=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(o),r.href=t,o.href=e,o.href}function N(){return v&&(window.performance||{}).now?window.performance.now():(new Date).getTime()}function V(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=[].slice.call(e.querySelectorAll('[data-cssvars="skip"],[data-cssvars="src"]'));n.forEach((function(e){return e.setAttribute("data-cssvars","")})),t&&(w.dom={})}function q(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=3===e.childNodes[0].nodeType,o=e.querySelector("ul");if(r&&o){var a=Array.apply(null,e.children).some((function(e){return e.tabIndex>-1})).length;if(!a){var s=document.createElement("span");for(null!==n&&s.setAttribute("tabindex",n),e.insertBefore(s,o);e.childNodes[0]!==s;)s.appendChild(e.childNodes[0])}}}k.reset=function(){for(var e in y.job=0,y.group=0,E=!1,S&&(S.disconnect(),S=null),C=0,x=null,A=!1,w)w[e]={}};function R(e,t){return Number("0."+((window.Docsify||{}).version||"0").replace(/\./g,"")) a");e&&(e.parentNode.innerHTML=e.innerHTML)}))},function(e,t){e.doneEach((function(){var e=Array.apply(null,document.querySelectorAll("body > nav.app-nav > ul > li")),t=Array.apply(null,document.querySelectorAll(".sidebar > nav > ul > li"));e.forEach((function(e){var t="focus-within";q(e,"span",0),e.addEventListener("focusin",(function(n){e.contains(document.activeElement)&&e.classList.add(t)})),e.addEventListener("focusout",(function(n){e.contains(document.activeElement)||e.classList.remove(t)}))})),t.forEach((function(e){q(e,"span")}))}))},function(e,t){e.doneEach((function(){Array.apply(null,document.querySelectorAll("pre[data-lang]")).forEach((function(e){var t=e.querySelector("code"),n="language-".concat(e.getAttribute("data-lang"));e.classList.add(n),t.classList.add(n)}))}))},function(e,t){e.mounted((function(){var e=document.querySelector(".content"),t=setInterval((function(){e.textContent.length&&(document.body.classList.add("ready-fix"),clearInterval(t))}),250)})),e.ready((function(){document.body.classList.add("ready-fix")}))},function(e,t){e.init((function(){if(!1!==((window.$docsify||{}).themeable||{}).responsiveTables){var e=window.$docsify.markdown=window.$docsify.markdown||{},t=e.renderer=e.renderer||{};e.smartypants=e.smartypants||!0,t.table=t.table||function(e,t){var n='\n \n
\n '.concat(e,"\n ").concat(t,"\n
\n
");try{var r=document.createElement("div"),o=document.head.appendChild(document.createElement("style")).sheet,a="_"+Math.random().toString(36).substr(2,9);r.innerHTML=n;var s=r.querySelector("table");Array.apply(null,s.getElementsByTagName("th")).map((function(e){return e.innerHTML.replace(" "," ")})).forEach((function(e,t){var n="#".concat(a," td:nth-child(").concat(t+1,')::before{content:"').concat(e,'";}');o.insertRule(n,o.cssRules.length)})),s.id=a,n=r.innerHTML}catch(e){console.log("Failed to render responsive table: "+e)}return n}}}))}],window.$docsify.plugins||[],[function(e,t){e.ready((function(){var e=document.querySelector(".sidebar .search .clear-button");if(e){var t=document.createElement("button");t.className="clear-button",t.setAttribute("aria-label","Clear search"),t.innerHTML='\n \n ',e.parentNode.replaceChild(t,e)}}))},R("4.8.0",(function(e,t){e.ready((function(){var e=document.querySelector(".sidebar .search"),t=document.querySelector(".sidebar .search input[type=search]"),n=document.querySelector(".sidebar .search .clear-button");e&&e.addEventListener("click",(function(r){(r.target===n||n.contains(r.target))&&(e.classList.remove("show"),t.focus())})),t&&t.addEventListener("input",(function(n){t.value.length?e.classList.add("show"):e.classList.remove("show")}))}))})),R("4.8.0",(function(e,t){var n=Element.prototype.matches||Element.prototype.webkitMatchesSelector||Element.prototype.msMatchesSelector;e.doneEach((function(){var e="medium-zoom-image";Array.apply(null,document.querySelectorAll(".".concat(e))).forEach((function(t){var r=n.call(t,"a img"),o=n.call(t,".content img");if(r||!o){var a=t.cloneNode(!0);t.parentNode.replaceChild(a,t),a.classList.remove(e)}}))}))}))]).filter((function(e){return null!==e})),window.$docsify.search=window.$docsify.search||{},window.$docsify.search.hideOtherSidebarContent=!0,window.$docsify.themeable=window.$docsify.themeable||{},window.$docsify.themeable.version="0.8.6",window.$docsify.themeable.util={cssVars:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:D;k(e)}}}}();
9 | //# sourceMappingURL=docsify-themeable.min.js.map
--------------------------------------------------------------------------------
/docs/lib/external-script.min.js:
--------------------------------------------------------------------------------
1 | !function(){function e(){for(var o=Docsify.dom.getNode("#main"),e=Docsify.dom.findAll(o,"script"),n=e.length;n--;){var i,t=e[n];t&&t.src&&(i=document.createElement("script"),Array.prototype.slice.call(t.attributes).forEach(function(o){i[o.name]=o.value}),t.parentNode.insertBefore(i,t),t.parentNode.removeChild(t))}}window.$docsify.plugins=[].concat(function(o){o.doneEach(e)},window.$docsify.plugins)}();
--------------------------------------------------------------------------------
/docs/lib/ga.min.js:
--------------------------------------------------------------------------------
1 | !function(){function n(n){var o;(o=document.createElement("script")).async=!0,o.src="https://www.google-analytics.com/analytics.js",document.body.appendChild(o),window.ga=window.ga||function(){(window.ga.q=window.ga.q||[]).push(arguments)},window.ga.l=Number(new Date),window.ga("create",n,"auto")}function o(){window.ga||n($docsify.ga),window.ga("set","page",location.hash),window.ga("send","pageview")}$docsify.plugins=[].concat(function(n){$docsify.ga?n.beforeEach(o):console.error("[Docsify] ga is required.")},$docsify.plugins)}();
--------------------------------------------------------------------------------
/docs/lib/prism-bash.min.js:
--------------------------------------------------------------------------------
1 | !function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],s=a.variable[1].inside,i=0;i': '>',
71 | '"': '"',
72 | "'": ''',
73 | };
74 |
75 | return String(string).replace(/[&<>"']/g, function (s) { return entityMap[s]; });
76 | }
77 |
78 | function getAllPaths(router) {
79 | var paths = [];
80 |
81 | Docsify.dom
82 | .findAll('.sidebar-nav a:not(.section-link):not([data-nosearch])')
83 | .forEach(function (node) {
84 | var href = node.href;
85 | var originHref = node.getAttribute('href');
86 | var path = router.parse(href).path;
87 |
88 | if (
89 | path &&
90 | paths.indexOf(path) === -1 &&
91 | !Docsify.util.isAbsolutePath(originHref)
92 | ) {
93 | paths.push(path);
94 | }
95 | });
96 |
97 | return paths;
98 | }
99 |
100 | function getTableData(token) {
101 | if (!token.text && token.type === 'table') {
102 | token.cells.unshift(token.header);
103 | token.text = token.cells
104 | .map(function(rows) {
105 | return rows.join(' | ');
106 | })
107 | .join(' |\n ');
108 | }
109 | return token.text;
110 | }
111 |
112 | function getListData(token) {
113 | if (!token.text && token.type === 'list') {
114 | token.text = token.raw;
115 | }
116 | return token.text;
117 | }
118 |
119 | function saveData(maxAge, expireKey, indexKey) {
120 | localStorage.setItem(expireKey, Date.now() + maxAge);
121 | localStorage.setItem(indexKey, JSON.stringify(INDEXS));
122 | }
123 |
124 | function genIndex(path, content, router, depth) {
125 | if ( content === void 0 ) content = '';
126 |
127 | var tokens = window.marked.lexer(content);
128 | var slugify = window.Docsify.slugify;
129 | var index = {};
130 | var slug;
131 | var title = '';
132 |
133 | tokens.forEach(function(token, tokenIndex) {
134 | if (token.type === 'heading' && token.depth <= depth) {
135 | var ref = getAndRemoveConfig(token.text);
136 | var str = ref.str;
137 | var config = ref.config;
138 |
139 | if (config.id) {
140 | slug = router.toURL(path, { id: slugify(config.id) });
141 | } else {
142 | slug = router.toURL(path, { id: slugify(escapeHtml(token.text)) });
143 | }
144 |
145 | if (str) {
146 | title = str
147 | .replace(//, '')
148 | .replace(/{docsify-ignore}/, '')
149 | .replace(//, '')
150 | .replace(/{docsify-ignore-all}/, '')
151 | .trim();
152 | }
153 |
154 | index[slug] = { slug: slug, title: title, body: '' };
155 | } else {
156 | if (tokenIndex === 0) {
157 | slug = router.toURL(path);
158 | index[slug] = {
159 | slug: slug,
160 | title: path !== '/' ? path.slice(1) : 'Home Page',
161 | body: token.text || '',
162 | };
163 | }
164 |
165 | if (!slug) {
166 | return;
167 | }
168 |
169 | if (!index[slug]) {
170 | index[slug] = { slug: slug, title: '', body: '' };
171 | } else if (index[slug].body) {
172 | token.text = getTableData(token);
173 | token.text = getListData(token);
174 |
175 | index[slug].body += '\n' + (token.text || '');
176 | } else {
177 | token.text = getTableData(token);
178 | token.text = getListData(token);
179 |
180 | index[slug].body = index[slug].body
181 | ? index[slug].body + token.text
182 | : token.text;
183 | }
184 | }
185 | });
186 | slugify.clear();
187 | return index;
188 | }
189 |
190 | function ignoreDiacriticalMarks(keyword) {
191 | if (keyword && keyword.normalize) {
192 | return keyword.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
193 | }
194 | return keyword;
195 | }
196 |
197 | /**
198 | * @param {String} query Search query
199 | * @returns {Array} Array of results
200 | */
201 | function search(query) {
202 | var matchingResults = [];
203 | var data = [];
204 | Object.keys(INDEXS).forEach(function (key) {
205 | data = data.concat(Object.keys(INDEXS[key]).map(function (page) { return INDEXS[key][page]; }));
206 | });
207 |
208 | query = query.trim();
209 | var keywords = query.split(/[\s\-,\\/]+/);
210 | if (keywords.length !== 1) {
211 | keywords = [].concat(query, keywords);
212 | }
213 |
214 | var loop = function ( i ) {
215 | var post = data[i];
216 | var matchesScore = 0;
217 | var resultStr = '';
218 | var handlePostTitle = '';
219 | var handlePostContent = '';
220 | var postTitle = post.title && post.title.trim();
221 | var postContent = post.body && post.body.trim();
222 | var postUrl = post.slug || '';
223 |
224 | if (postTitle) {
225 | keywords.forEach(function (keyword) {
226 | // From https://github.com/sindresorhus/escape-string-regexp
227 | var regEx = new RegExp(
228 | escapeHtml(ignoreDiacriticalMarks(keyword)).replace(
229 | /[|\\{}()[\]^$+*?.]/g,
230 | '\\$&'
231 | ),
232 | 'gi'
233 | );
234 | var indexTitle = -1;
235 | var indexContent = -1;
236 | handlePostTitle = postTitle
237 | ? escapeHtml(ignoreDiacriticalMarks(postTitle))
238 | : postTitle;
239 | handlePostContent = postContent
240 | ? escapeHtml(ignoreDiacriticalMarks(postContent))
241 | : postContent;
242 |
243 | indexTitle = postTitle ? handlePostTitle.search(regEx) : -1;
244 | indexContent = postContent ? handlePostContent.search(regEx) : -1;
245 |
246 | if (indexTitle >= 0 || indexContent >= 0) {
247 | matchesScore += indexTitle >= 0 ? 3 : indexContent >= 0 ? 2 : 0;
248 | if (indexContent < 0) {
249 | indexContent = 0;
250 | }
251 |
252 | var start = 0;
253 | var end = 0;
254 |
255 | start = indexContent < 11 ? 0 : indexContent - 10;
256 | end = start === 0 ? 70 : indexContent + keyword.length + 60;
257 |
258 | if (postContent && end > postContent.length) {
259 | end = postContent.length;
260 | }
261 |
262 | var matchContent =
263 | '...' +
264 | handlePostContent
265 | .substring(start, end)
266 | .replace(
267 | regEx,
268 | function (word) { return ("" + word + ""); }
269 | ) +
270 | '...';
271 |
272 | resultStr += matchContent;
273 | }
274 | });
275 |
276 | if (matchesScore > 0) {
277 | var matchingPost = {
278 | title: handlePostTitle,
279 | content: postContent ? resultStr : '',
280 | url: postUrl,
281 | score: matchesScore,
282 | };
283 |
284 | matchingResults.push(matchingPost);
285 | }
286 | }
287 | };
288 |
289 | for (var i = 0; i < data.length; i++) loop( i );
290 |
291 | return matchingResults.sort(function (r1, r2) { return r2.score - r1.score; });
292 | }
293 |
294 | function init(config, vm) {
295 | var isAuto = config.paths === 'auto';
296 | var paths = isAuto ? getAllPaths(vm.router) : config.paths;
297 |
298 | var namespaceSuffix = '';
299 |
300 | // only in auto mode
301 | if (paths.length && isAuto && config.pathNamespaces) {
302 | var path = paths[0];
303 |
304 | if (Array.isArray(config.pathNamespaces)) {
305 | namespaceSuffix =
306 | config.pathNamespaces.filter(
307 | function (prefix) { return path.slice(0, prefix.length) === prefix; }
308 | )[0] || namespaceSuffix;
309 | } else if (config.pathNamespaces instanceof RegExp) {
310 | var matches = path.match(config.pathNamespaces);
311 |
312 | if (matches) {
313 | namespaceSuffix = matches[0];
314 | }
315 | }
316 | var isExistHome = paths.indexOf(namespaceSuffix + '/') === -1;
317 | var isExistReadme = paths.indexOf(namespaceSuffix + '/README') === -1;
318 | if (isExistHome && isExistReadme) {
319 | paths.unshift(namespaceSuffix + '/');
320 | }
321 | } else if (paths.indexOf('/') === -1 && paths.indexOf('/README') === -1) {
322 | paths.unshift('/');
323 | }
324 |
325 | var expireKey = resolveExpireKey(config.namespace) + namespaceSuffix;
326 | var indexKey = resolveIndexKey(config.namespace) + namespaceSuffix;
327 |
328 | var isExpired = localStorage.getItem(expireKey) < Date.now();
329 |
330 | INDEXS = JSON.parse(localStorage.getItem(indexKey));
331 |
332 | if (isExpired) {
333 | INDEXS = {};
334 | } else if (!isAuto) {
335 | return;
336 | }
337 |
338 | var len = paths.length;
339 | var count = 0;
340 |
341 | paths.forEach(function (path) {
342 | if (INDEXS[path]) {
343 | return count++;
344 | }
345 |
346 | Docsify.get(vm.router.getFile(path), false, vm.config.requestHeaders).then(
347 | function (result) {
348 | INDEXS[path] = genIndex(path, result, vm.router, config.depth);
349 | len === ++count && saveData(config.maxAge, expireKey, indexKey);
350 | }
351 | );
352 | });
353 | }
354 |
355 | /* eslint-disable no-unused-vars */
356 |
357 | var NO_DATA_TEXT = '';
358 | var options;
359 |
360 | function style() {
361 | var code = "\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .input-wrap {\n display: flex;\n align-items: center;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 0 7px;\n line-height: 36px;\n font-size: 14px;\n border: 1px solid transparent;\n}\n\n.search input:focus {\n box-shadow: 0 0 5px var(--theme-color, #42b983);\n border: 1px solid var(--theme-color, #42b983);\n}\n\n.search input::-webkit-search-decoration,\n.search input::-webkit-search-cancel-button,\n.search input {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.search .clear-button {\n cursor: pointer;\n width: 36px;\n text-align: right;\n display: none;\n}\n\n.search .clear-button.show {\n display: block;\n}\n\n.search .clear-button svg {\n transform: scale(.5);\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}\n\n.app-name.hide, .sidebar-nav.hide {\n display: none;\n}";
362 |
363 | Docsify.dom.style(code);
364 | }
365 |
366 | function tpl(defaultValue) {
367 | if ( defaultValue === void 0 ) defaultValue = '';
368 |
369 | var html = "\n \n ";
370 | var el = Docsify.dom.create('div', html);
371 | var aside = Docsify.dom.find('aside');
372 |
373 | Docsify.dom.toggleClass(el, 'search');
374 | Docsify.dom.before(aside, el);
375 | }
376 |
377 | function doSearch(value) {
378 | var $search = Docsify.dom.find('div.search');
379 | var $panel = Docsify.dom.find($search, '.results-panel');
380 | var $clearBtn = Docsify.dom.find($search, '.clear-button');
381 | var $sidebarNav = Docsify.dom.find('.sidebar-nav');
382 | var $appName = Docsify.dom.find('.app-name');
383 |
384 | if (!value) {
385 | $panel.classList.remove('show');
386 | $clearBtn.classList.remove('show');
387 | $panel.innerHTML = '';
388 |
389 | if (options.hideOtherSidebarContent) {
390 | $sidebarNav && $sidebarNav.classList.remove('hide');
391 | $appName && $appName.classList.remove('hide');
392 | }
393 |
394 | return;
395 | }
396 |
397 | var matchs = search(value);
398 |
399 | var html = '';
400 | matchs.forEach(function (post) {
401 | html += "";
402 | });
403 |
404 | $panel.classList.add('show');
405 | $clearBtn.classList.add('show');
406 | $panel.innerHTML = html || ("" + NO_DATA_TEXT + "
");
407 | if (options.hideOtherSidebarContent) {
408 | $sidebarNav && $sidebarNav.classList.add('hide');
409 | $appName && $appName.classList.add('hide');
410 | }
411 | }
412 |
413 | function bindEvents() {
414 | var $search = Docsify.dom.find('div.search');
415 | var $input = Docsify.dom.find($search, 'input');
416 | var $inputWrap = Docsify.dom.find($search, '.input-wrap');
417 |
418 | var timeId;
419 |
420 | /**
421 | Prevent to Fold sidebar.
422 |
423 | When searching on the mobile end,
424 | the sidebar is collapsed when you click the INPUT box,
425 | making it impossible to search.
426 | */
427 | Docsify.dom.on(
428 | $search,
429 | 'click',
430 | function (e) { return ['A', 'H2', 'P', 'EM'].indexOf(e.target.tagName) === -1 &&
431 | e.stopPropagation(); }
432 | );
433 | Docsify.dom.on($input, 'input', function (e) {
434 | clearTimeout(timeId);
435 | timeId = setTimeout(function (_) { return doSearch(e.target.value.trim()); }, 100);
436 | });
437 | Docsify.dom.on($inputWrap, 'click', function (e) {
438 | // Click input outside
439 | if (e.target.tagName !== 'INPUT') {
440 | $input.value = '';
441 | doSearch();
442 | }
443 | });
444 | }
445 |
446 | function updatePlaceholder(text, path) {
447 | var $input = Docsify.dom.getNode('.search input[type="search"]');
448 |
449 | if (!$input) {
450 | return;
451 | }
452 |
453 | if (typeof text === 'string') {
454 | $input.placeholder = text;
455 | } else {
456 | var match = Object.keys(text).filter(function (key) { return path.indexOf(key) > -1; })[0];
457 | $input.placeholder = text[match];
458 | }
459 | }
460 |
461 | function updateNoData(text, path) {
462 | if (typeof text === 'string') {
463 | NO_DATA_TEXT = text;
464 | } else {
465 | var match = Object.keys(text).filter(function (key) { return path.indexOf(key) > -1; })[0];
466 | NO_DATA_TEXT = text[match];
467 | }
468 | }
469 |
470 | function updateOptions(opts) {
471 | options = opts;
472 | }
473 |
474 | function init$1(opts, vm) {
475 | var keywords = vm.router.parse().query.s;
476 |
477 | updateOptions(opts);
478 | style();
479 | tpl(keywords);
480 | bindEvents();
481 | keywords && setTimeout(function (_) { return doSearch(keywords); }, 500);
482 | }
483 |
484 | function update(opts, vm) {
485 | updateOptions(opts);
486 | updatePlaceholder(opts.placeholder, vm.route.path);
487 | updateNoData(opts.noData, vm.route.path);
488 | }
489 |
490 | /* eslint-disable no-unused-vars */
491 |
492 | var CONFIG = {
493 | placeholder: 'Type to search',
494 | noData: 'No Results!',
495 | paths: 'auto',
496 | depth: 2,
497 | maxAge: 86400000, // 1 day
498 | hideOtherSidebarContent: false,
499 | namespace: undefined,
500 | pathNamespaces: undefined,
501 | };
502 |
503 | var install = function(hook, vm) {
504 | var util = Docsify.util;
505 | var opts = vm.config.search || CONFIG;
506 |
507 | if (Array.isArray(opts)) {
508 | CONFIG.paths = opts;
509 | } else if (typeof opts === 'object') {
510 | CONFIG.paths = Array.isArray(opts.paths) ? opts.paths : 'auto';
511 | CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge;
512 | CONFIG.placeholder = opts.placeholder || CONFIG.placeholder;
513 | CONFIG.noData = opts.noData || CONFIG.noData;
514 | CONFIG.depth = opts.depth || CONFIG.depth;
515 | CONFIG.hideOtherSidebarContent =
516 | opts.hideOtherSidebarContent || CONFIG.hideOtherSidebarContent;
517 | CONFIG.namespace = opts.namespace || CONFIG.namespace;
518 | CONFIG.pathNamespaces = opts.pathNamespaces || CONFIG.pathNamespaces;
519 | }
520 |
521 | var isAuto = CONFIG.paths === 'auto';
522 |
523 | hook.mounted(function (_) {
524 | init$1(CONFIG, vm);
525 | !isAuto && init(CONFIG, vm);
526 | });
527 | hook.doneEach(function (_) {
528 | update(CONFIG, vm);
529 | isAuto && init(CONFIG, vm);
530 | });
531 | };
532 |
533 | $docsify.plugins = [].concat(install, $docsify.plugins);
534 |
535 | }());
--------------------------------------------------------------------------------
/docs/lib/theme-defaults.css:
--------------------------------------------------------------------------------
1 | .github-corner{position:absolute;z-index:40;top:0;right:0;border-bottom:0;text-decoration:none}.github-corner svg{height:70px;width:70px;fill:var(--theme-color);color:var(--base-background-color)}.github-corner:hover .octo-arm{-webkit-animation:octocat-wave 560ms ease-in-out;animation:octocat-wave 560ms ease-in-out}@-webkit-keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}.progress{position:fixed;z-index:2147483647;top:0;left:0;right:0;height:3px;width:0;background-color:var(--theme-color);transition:width var(--duration-fast),opacity calc(var(--duration-fast) * 2)}body.ready-transition:after,body.ready-transition>*:not(.progress){opacity:0;transition:opacity var(--spinner-transition-duration)}body.ready-transition:after{content:'';position:absolute;z-index:1000;top:calc(50% - (var(--spinner-size) / 2));left:calc(50% - (var(--spinner-size) / 2));height:var(--spinner-size);width:var(--spinner-size);border:var(--spinner-track-width, 0) solid var(--spinner-track-color);border-left-color:var(--theme-color);border-left-color:var(--theme-color);border-radius:50%;-webkit-animation:spinner var(--duration-slow) infinite linear;animation:spinner var(--duration-slow) infinite linear}body.ready-transition.ready-spinner:after{opacity:1}body.ready-transition.ready-fix:after{opacity:0}body.ready-transition.ready-fix>*:not(.progress){opacity:1;transition-delay:var(--spinner-transition-duration)}@-webkit-keyframes spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}*,*:before,*:after{box-sizing:inherit;font-size:inherit;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none}:root{box-sizing:border-box;background-color:var(--base-background-color);font-size:var(--base-font-size);font-weight:var(--base-font-weight);line-height:var(--base-line-height);letter-spacing:var(--base-letter-spacing);color:var(--base-color);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased}html,button,input,optgroup,select,textarea{font-family:var(--base-font-family)}button,input,optgroup,select,textarea{font-size:100%;margin:0}a{text-decoration:none;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}body{margin:0}hr{height:0;margin:2em 0;border:none;border-bottom:var(--hr-border, 0)}img{max-width:100%;border:0}main{display:block}main.hidden{display:none}mark{background:var(--mark-background);color:var(--mark-color)}pre{font-family:var(--pre-font-family);font-size:var(--pre-font-size);font-weight:var(--pre-font-weight);line-height:var(--pre-line-height)}small{display:inline-block;font-size:var(--small-font-size)}strong{font-weight:var(--strong-font-weight);color:var(--strong-color, currentColor)}sub,sup{font-size:var(--subsup-font-size);line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}body:not([data-platform^="Mac"]) *{scrollbar-color:hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.3) hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.1);scrollbar-width:thin}body:not([data-platform^="Mac"]) * ::-webkit-scrollbar{width:5px;height:5px}body:not([data-platform^="Mac"]) * ::-webkit-scrollbar-thumb{background:hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.3)}body:not([data-platform^="Mac"]) * ::-webkit-scrollbar-track{background:hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.1)}::-moz-selection{background:var(--selection-color)}::selection{background:var(--selection-color)}.emoji{height:var(--emoji-size);vertical-align:middle}.task-list-item{list-style:none}.task-list-item input{margin-right:0.5em;margin-left:0;vertical-align:0.075em}.markdown-section code[class*="lang-"],.markdown-section pre[data-lang]{font-family:var(--code-font-family);font-size:var(--code-font-size);font-weight:var(--code-font-weight);letter-spacing:normal;line-height:var(--code-block-line-height);-moz-tab-size:var(--code-tab-size);-o-tab-size:var(--code-tab-size);tab-size:var(--code-tab-size);text-align:left;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.markdown-section pre[data-lang]{position:relative;overflow:hidden;margin:var(--code-block-margin);padding:0;border-radius:var(--code-block-border-radius)}.markdown-section pre[data-lang]::after{content:attr(data-lang);position:absolute;top:0.75em;right:0.75em;opacity:0.6;color:inherit;font-size:var(--font-size-s);line-height:1}.markdown-section pre[data-lang] code{display:block;overflow:auto;padding:var(--code-block-padding)}code[class*="lang-"],pre[data-lang]{color:var(--code-theme-text)}pre[data-lang]::-moz-selection,pre[data-lang] ::-moz-selection,code[class*="lang-"]::-moz-selection,code[class*="lang-"] ::-moz-selection{background:var(--code-theme-selection, var(--selection-color))}pre[data-lang]::-moz-selection, pre[data-lang] ::-moz-selection, code[class*="lang-"]::-moz-selection, code[class*="lang-"] ::-moz-selection{background:var(--code-theme-selection, var(--selection-color))}pre[data-lang]::selection,pre[data-lang] ::selection,code[class*="lang-"]::selection,code[class*="lang-"] ::selection{background:var(--code-theme-selection, var(--selection-color))}:not(pre)>code[class*="lang-"],pre[data-lang]{background:var(--code-theme-background)}.namespace{opacity:0.7}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:var(--code-theme-comment)}.token.punctuation{color:var(--code-theme-punctuation)}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:var(--code-theme-tag)}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:var(--code-theme-selector)}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:var(--code-theme-operator)}.token.atrule,.token.attr-value,.token.keyword{color:var(--code-theme-keyword)}.token.function{color:var(--code-theme-function)}.token.regex,.token.important,.token.variable{color:var(--code-theme-variable)}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}.markdown-section{position:relative;max-width:var(--content-max-width);margin:0 auto;padding:2rem 45px}.app-nav:not(:empty) ~ main .markdown-section{padding-top:3.5rem}.markdown-section figure,.markdown-section p,.markdown-section ol,.markdown-section ul{margin:1em 0}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section ol ol,.markdown-section ol ul,.markdown-section ul ol,.markdown-section ul ul{margin-top:0.15rem;margin-bottom:0.15rem}.markdown-section a{border-bottom:var(--link-border-bottom);color:var(--link-color);-webkit-text-decoration:var(--link-text-decoration);text-decoration:var(--link-text-decoration);-webkit-text-decoration-color:var(--link-text-decoration-color);text-decoration-color:var(--link-text-decoration-color)}.markdown-section a:hover{border-bottom:var(--link-border-bottom--hover, var(--link-border-bottom, 0));color:var(--link-color--hover, var(--link-color));-webkit-text-decoration:var(--link-text-decoration--hover, var(--link-text-decoration));text-decoration:var(--link-text-decoration--hover, var(--link-text-decoration));-webkit-text-decoration-color:var(--link-text-decoration-color--hover, var(--link-text-decoration-color));text-decoration-color:var(--link-text-decoration-color--hover, var(--link-text-decoration-color))}.markdown-section a.anchor{border-bottom:0;color:inherit;text-decoration:none}.markdown-section a.anchor:hover{text-decoration:underline}.markdown-section blockquote{overflow:visible;margin:2em 0;padding:1.5em;border-width:var(--blockquote-border-width, 0);border-style:var(--blockquote-border-style);border-color:var(--blockquote-border-color);border-radius:var(--blockquote-border-radius);background:var(--blockquote-background);color:var(--blockquote-color);font-family:var(--blockquote-font-family);font-size:var(--blockquote-font-size);font-style:var(--blockquote-font-style);font-weight:var(--blockquote-font-weight);quotes:"“" "”" "‘" "’"}.markdown-section blockquote em{font-family:var(--blockquote-em-font-family);font-size:var(--blockquote-em-font-size);font-style:var(--blockquote-em-font-style);font-weight:var(--blockquote-em-font-weight)}.markdown-section blockquote p:first-child{margin-top:0}.markdown-section blockquote p:first-child:before,.markdown-section blockquote p:first-child:after{color:var(--blockquote-quotes-color);font-family:var(--blockquote-quotes-font-family);font-size:var(--blockquote-quotes-font-size);line-height:0}.markdown-section blockquote p:first-child:before{content:var(--blockquote-quotes-open);margin-right:0.15em;vertical-align:-0.45em}.markdown-section blockquote p:first-child:after{content:var(--blockquote-quotes-close);margin-left:0.15em;vertical-align:-0.55em}.markdown-section blockquote p:last-child{margin-bottom:0}.markdown-section code{font-family:var(--code-font-family);font-size:var(--code-font-size);font-weight:var(--code-font-weight);line-height:inherit}.markdown-section code:not([class*="lang-"]):not([class*="language-"]){margin:var(--code-inline-margin);padding:var(--code-inline-padding);border-radius:var(--code-inline-border-radius);background:var(--code-inline-background);color:var(--code-inline-color, currentColor);white-space:nowrap}.markdown-section h1:first-child,.markdown-section h2:first-child,.markdown-section h3:first-child,.markdown-section h4:first-child,.markdown-section h5:first-child,.markdown-section h6:first-child{margin-top:0}.markdown-section h1 a[data-id],.markdown-section h2 a[data-id],.markdown-section h3 a[data-id],.markdown-section h4 a[data-id],.markdown-section h5 a[data-id],.markdown-section h6 a[data-id]{display:inline-block}.markdown-section h1 code,.markdown-section h2 code,.markdown-section h3 code,.markdown-section h4 code,.markdown-section h5 code,.markdown-section h6 code{font-size:0.875em}.markdown-section h1+h2,.markdown-section h1+h3,.markdown-section h1+h4,.markdown-section h1+h5,.markdown-section h1+h6,.markdown-section h2+h3,.markdown-section h2+h4,.markdown-section h2+h5,.markdown-section h2+h6,.markdown-section h3+h4,.markdown-section h3+h5,.markdown-section h3+h6,.markdown-section h4+h5,.markdown-section h4+h6,.markdown-section h5+h6{margin-top:1rem}.markdown-section h1{margin:var(--heading-h1-margin, var(--heading-margin));padding:var(--heading-h1-padding, var(--heading-padding));border-width:var(--heading-h1-border-width, 0);border-style:var(--heading-h1-border-style);border-color:var(--heading-h1-border-color);font-family:var(--heading-h1-font-family, var(--heading-font-family));font-size:var(--heading-h1-font-size);font-weight:var(--heading-h1-font-weight, var(--heading-font-weight));line-height:var(--base-line-height);color:var(--heading-h1-color, var(--heading-color))}.markdown-section h2{margin:var(--heading-h2-margin, var(--heading-margin));padding:var(--heading-h2-padding, var(--heading-padding));border-width:var(--heading-h2-border-width, 0);border-style:var(--heading-h2-border-style);border-color:var(--heading-h2-border-color);font-family:var(--heading-h2-font-family, var(--heading-font-family));font-size:var(--heading-h2-font-size);font-weight:var(--heading-h2-font-weight, var(--heading-font-weight));line-height:var(--base-line-height);color:var(--heading-h2-color, var(--heading-color))}.markdown-section h3{margin:var(--heading-h3-margin, var(--heading-margin));padding:var(--heading-h3-padding, var(--heading-padding));border-width:var(--heading-h3-border-width, 0);border-style:var(--heading-h3-border-style);border-color:var(--heading-h3-border-color);font-family:var(--heading-h3-font-family, var(--heading-font-family));font-size:var(--heading-h3-font-size);font-weight:var(--heading-h3-font-weight, var(--heading-font-weight));color:var(--heading-h3-color, var(--heading-color))}.markdown-section h4{margin:var(--heading-h4-margin, var(--heading-margin));padding:var(--heading-h4-padding, var(--heading-padding));border-width:var(--heading-h4-border-width, 0);border-style:var(--heading-h4-border-style);border-color:var(--heading-h4-border-color);font-family:var(--heading-h4-font-family, var(--heading-font-family));font-size:var(--heading-h4-font-size);font-weight:var(--heading-h4-font-weight, var(--heading-font-weight));color:var(--heading-h4-color, var(--heading-color))}.markdown-section h5{margin:var(--heading-h5-margin, var(--heading-margin));padding:var(--heading-h5-padding, var(--heading-padding));border-width:var(--heading-h5-border-width, 0);border-style:var(--heading-h5-border-style);border-color:var(--heading-h5-border-color);font-family:var(--heading-h5-font-family, var(--heading-font-family));font-size:var(--heading-h5-font-size);font-weight:var(--heading-h5-font-weight, var(--heading-font-weight));color:var(--heading-h5-color, var(--heading-color))}.markdown-section h6{margin:var(--heading-h6-margin, var(--heading-margin));padding:var(--heading-h6-padding, var(--heading-padding));border-width:var(--heading-h6-border-width, 0);border-style:var(--heading-h6-border-style);border-color:var(--heading-h6-border-color);font-family:var(--heading-h6-font-family, var(--heading-font-family));font-size:var(--heading-h6-font-size);font-weight:var(--heading-h6-font-weight, var(--heading-font-weight));color:var(--heading-h6-color, var(--heading-color))}.markdown-section iframe{margin:1em 0}.markdown-section img{max-width:100%}.markdown-section kbd{display:inline-block;min-width:var(--kbd-min-width);margin:var(--kbd-margin);padding:var(--kbd-padding);border:var(--kbd-border);border-radius:var(--kbd-border-radius);background:var(--kbd-background);font-family:inherit;font-size:var(--kbd-font-size);text-align:center;letter-spacing:0;line-height:1;color:var(--kbd-color)}.markdown-section kbd+kbd{margin-left:-0.15em}.markdown-section table{display:block;overflow:auto;margin:1rem 0;border-spacing:0;border-collapse:collapse}.markdown-section th,.markdown-section td{padding:var(--table-cell-padding)}.markdown-section th:not([align]){text-align:left}.markdown-section thead{border-color:var(--table-head-border-color);border-style:solid;border-width:var(--table-head-border-width, 0);background:var(--table-head-background)}.markdown-section th{font-weight:var(--table-head-font-weight);color:var(--strong-color)}.markdown-section td{border-color:var(--table-cell-border-color);border-style:solid;border-width:var(--table-cell-border-width, 0)}.markdown-section tbody{border-color:var(--table-body-border-color);border-style:solid;border-width:var(--table-body-border-width, 0)}.markdown-section tbody tr:nth-child(odd){background:var(--table-row-odd-background)}.markdown-section tbody tr:nth-child(even){background:var(--table-row-even-background)}.markdown-section>ul .task-list-item{margin-left:-1.25em}.markdown-section>ul .task-list-item .task-list-item{margin-left:0}.markdown-section .table-wrapper{overflow-x:auto}.markdown-section .table-wrapper table{display:table;width:100%}.markdown-section .table-wrapper td::before{display:none}@media (max-width: 30em){.markdown-section .table-wrapper tbody,.markdown-section .table-wrapper tr,.markdown-section .table-wrapper td{display:block}.markdown-section .table-wrapper th,.markdown-section .table-wrapper td{border:none}.markdown-section .table-wrapper thead{display:none}.markdown-section .table-wrapper tr{border-color:var(--table-cell-border-color);border-style:solid;border-width:var(--table-cell-border-width, 0);padding:var(--table-cell-padding)}.markdown-section .table-wrapper tr:not(:last-child){border-bottom:0}.markdown-section .table-wrapper td{padding:0.15em 0 0.15em 8em}.markdown-section .table-wrapper td::before{display:inline-block;float:left;width:8em;margin-left:-8em;font-weight:bold;text-align:left}}.markdown-section .tip,.markdown-section .warn{position:relative;margin:2em 0;padding:var(--notice-padding);border-width:var(--notice-border-width, 0);border-style:var(--notice-border-style);border-color:var(--notice-border-color);border-radius:var(--notice-border-radius);background:var(--notice-background);font-family:var(--notice-font-family);font-weight:var(--notice-font-weight);color:var(--notice-color)}.markdown-section .tip:before,.markdown-section .warn:before{display:inline-block;position:var(--notice-before-position, relative);top:var(--notice-before-top);left:var(--notice-before-left);height:var(--notice-before-height);width:var(--notice-before-width);margin:var(--notice-before-margin);padding:var(--notice-before-padding);border-radius:var(--notice-before-border-radius);line-height:var(--notice-before-line-height);font-family:var(--notice-before-font-family);font-size:var(--notice-before-font-size);font-weight:var(--notice-before-font-weight);text-align:center}.markdown-section .tip{border-width:var(--notice-important-border-width, var(--notice-border-width, 0));border-style:var(--notice-important-border-style, var(--notice-border-style));border-color:var(--notice-important-border-color, var(--notice-border-color));background:var(--notice-important-background, var(--notice-background));color:var(--notice-important-color, var(--notice-color))}.markdown-section .tip:before{content:var(--notice-important-before-content, var(--notice-before-content));background:var(--notice-important-before-background, var(--notice-before-background));color:var(--notice-important-before-color, var(--notice-before-color))}.markdown-section .warn{border-width:var(--notice-tip-border-width, var(--notice-border-width, 0));border-style:var(--notice-tip-border-style, var(--notice-border-style));border-color:var(--notice-tip-border-color, var(--notice-border-color));background:var(--notice-tip-background, var(--notice-background));color:var(--notice-tip-color, var(--notice-color))}.markdown-section .warn:before{content:var(--notice-tip-before-content, var(--notice-before-content));background:var(--notice-tip-before-background, var(--notice-before-background));color:var(--notice-tip-before-color, var(--notice-before-color))}.cover{display:none;position:relative;z-index:20;min-height:100vh;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--cover-border-inset, 0px) + var(--cover-border-width, 0px));color:var(--cover-color);text-align:var(--cover-text-align)}@media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none){.cover{height:100vh}}.cover:before,.cover:after{content:'';position:absolute}.cover:before{top:0;bottom:0;left:0;right:0;background-blend-mode:var(--cover-background-blend-mode);background-color:var(--cover-background-color);background-image:var(--cover-background-image);background-position:var(--cover-background-position);background-repeat:var(--cover-background-repeat);background-size:var(--cover-background-size)}.cover:after{top:var(--cover-border-inset, 0);bottom:var(--cover-border-inset, 0);left:var(--cover-border-inset, 0);right:var(--cover-border-inset, 0);border-width:var(--cover-border-width, 0);border-style:solid;border-color:var(--cover-border-color)}.cover a{border-bottom:var(--cover-link-border-bottom);color:var(--cover-link-color);-webkit-text-decoration:var(--cover-link-text-decoration);text-decoration:var(--cover-link-text-decoration);-webkit-text-decoration-color:var(--cover-link-text-decoration-color);text-decoration-color:var(--cover-link-text-decoration-color)}.cover a:hover{border-bottom:var(--cover-link-border-bottom--hover, var(--cover-link-border-bottom));color:var(--cover-link-color--hover, var(--cover-link-color));-webkit-text-decoration:var(--cover-link-text-decoration--hover, var(--cover-link-text-decoration));text-decoration:var(--cover-link-text-decoration--hover, var(--cover-link-text-decoration));-webkit-text-decoration-color:var(--cover-link-text-decoration-color--hover, var(--cover-link-text-decoration-color));text-decoration-color:var(--cover-link-text-decoration-color--hover, var(--cover-link-text-decoration-color))}.cover h1{color:var(--cover-heading-color);position:relative;margin:0;font-size:var(--cover-heading-font-size);font-weight:var(--cover-heading-font-weight);line-height:1.2}.cover h1 a,.cover h1 a:hover{display:block;border-bottom:none;color:inherit;text-decoration:none}.cover h1 small{position:absolute;bottom:0;margin-left:0.5em}.cover h1 span{font-size:calc(var(--cover-heading-font-size-min) * 1px)}@media (min-width: 26em){.cover h1 span{font-size:calc((var(--cover-heading-font-size-min) * 1px) + (var(--cover-heading-font-size-max) - var(--cover-heading-font-size-min)) * ((100vw - 420px) / (1024 - 420)))}}@media (min-width: 64em){.cover h1 span{font-size:calc(var(--cover-heading-font-size-max) * 1px)}}.cover blockquote{margin:0;color:var(--cover-blockquote-color);font-size:var(--cover-blockquote-font-size)}.cover blockquote a{color:inherit}.cover ul{padding:0;list-style-type:none}.cover .cover-main{position:relative;z-index:1;max-width:var(--cover-max-width);margin:var(--cover-margin);padding:0 45px}.cover .cover-main>p:last-child{margin:1.25em -.25em}.cover .cover-main>p:last-child a{display:block;margin:.375em .25em;padding:var(--cover-button-padding);border:var(--cover-button-border);border-radius:var(--cover-button-border-radius);box-shadow:var(--cover-button-box-shadow);background:var(--cover-button-background);text-align:center;-webkit-text-decoration:var(--cover-button-text-decoration);text-decoration:var(--cover-button-text-decoration);-webkit-text-decoration-color:var(--cover-button-text-decoration-color);text-decoration-color:var(--cover-button-text-decoration-color);color:var(--cover-button-color);white-space:nowrap;transition:var(--cover-button-transition)}.cover .cover-main>p:last-child a:hover{border:var(--cover-button-border--hover, var(--cover-button-border));box-shadow:var(--cover-button-box-shadow--hover, var(--cover-button-box-shadow));background:var(--cover-button-background--hover, var(--cover-button-background));-webkit-text-decoration:var(--cover-button-text-decoration--hover, var(--cover-button-text-decoration));text-decoration:var(--cover-button-text-decoration--hover, var(--cover-button-text-decoration));-webkit-text-decoration-color:var(--cover-button-text-decoration-color--hover, var(--cover-button-text-decoration-color));text-decoration-color:var(--cover-button-text-decoration-color--hover, var(--cover-button-text-decoration-color));color:var(--cover-button-color--hover, var(--cover-button-color))}.cover .cover-main>p:last-child a:first-child{border:var(--cover-button-primary-border, var(--cover-button-border));box-shadow:var(--cover-button-primary-box-shadow, var(--cover-button-box-shadow));background:var(--cover-button-primary-background, var(--cover-button-background));-webkit-text-decoration:var(--cover-button-primary-text-decoration, var(--cover-button-text-decoration));text-decoration:var(--cover-button-primary-text-decoration, var(--cover-button-text-decoration));-webkit-text-decoration-color:var(--cover-button-primary-text-decoration-color, var(--cover-button-text-decoration-color));text-decoration-color:var(--cover-button-primary-text-decoration-color, var(--cover-button-text-decoration-color));color:var(--cover-button-primary-color, var(--cover-button-color))}.cover .cover-main>p:last-child a:first-child:hover{border:var(--cover-button-primary-border--hover, var(--cover-button-border--hover, var(--cover-button-primary-border, var(--cover-button-border))));box-shadow:var(--cover-button-primary-box-shadow--hover, var(--cover-button-box-shadow--hover, var(--cover-button-primary-box-shadow, var(--cover-button-box-shadow))));background:var(--cover-button-primary-background--hover, var(--cover-button-background--hover, var(--cover-button-primary-background, var(--cover-button-background))));-webkit-text-decoration:var(--cover-button-primary-text-decoration--hover, var(--cover-button-text-decoration--hover, var(--cover-button-primary-text-decoration, var(--cover-button-text-decoration))));text-decoration:var(--cover-button-primary-text-decoration--hover, var(--cover-button-text-decoration--hover, var(--cover-button-primary-text-decoration, var(--cover-button-text-decoration))));-webkit-text-decoration-color:var(--cover-button-primary-text-decoration-color--hover, var(--cover-button-text-decoration-color--hover, var(--cover-button-primary-text-decoration-color, var(--cover-button-text-decoration-color))));text-decoration-color:var(--cover-button-primary-text-decoration-color--hover, var(--cover-button-text-decoration-color--hover, var(--cover-button-primary-text-decoration-color, var(--cover-button-text-decoration-color))));color:var(--cover-button-primary-color--hover, var(--cover-button-color--hover, var(--cover-button-primary-color, var(--cover-button-color))))}@media (min-width: 30.01em){.cover .cover-main>p:last-child a{display:inline-block}}.cover .mask{visibility:var(--cover-background-mask-visibility, hidden);position:absolute;top:0;bottom:0;left:0;right:0;background-color:var(--cover-background-mask-color);opacity:var(--cover-background-mask-opacity)}.cover.has-mask .mask{visibility:visible}.cover.show{display:flex}.app-nav{position:absolute;z-index:30;top:calc(35px - (0.5em * var(--base-line-height)));left:45px;right:80px;text-align:right}.app-nav.no-badge{right:45px}.app-nav li>img,.app-nav li>a>img{margin-top:-0.25em;vertical-align:middle}.app-nav li>img:first-child,.app-nav li>a>img:first-child{margin-right:0.5em}.app-nav ul,.app-nav li{margin:0;padding:0;list-style:none}.app-nav li{position:relative}.app-nav li a{display:block;line-height:1;transition:var(--navbar-root-transition)}.app-nav>ul>li{display:inline-block;margin:var(--navbar-root-margin)}.app-nav>ul>li:first-child{margin-left:0}.app-nav>ul>li:last-child{margin-right:0}.app-nav>ul>li>a,.app-nav>ul>li>span{padding:var(--navbar-root-padding);border-width:var(--navbar-root-border-width, 0);border-style:var(--navbar-root-border-style);border-color:var(--navbar-root-border-color);border-radius:var(--navbar-root-border-radius);background:var(--navbar-root-background);color:var(--navbar-root-color);-webkit-text-decoration:var(--navbar-root-text-decoration);text-decoration:var(--navbar-root-text-decoration);-webkit-text-decoration-color:var(--navbar-root-text-decoration-color);text-decoration-color:var(--navbar-root-text-decoration-color)}.app-nav>ul>li>a:hover,.app-nav>ul>li>span:hover{background:var(--navbar-root-background--hover, var(--navbar-root-background));border-style:var(--navbar-root-border-style--hover, var(--navbar-root-border-style));border-color:var(--navbar-root-border-color--hover, var(--navbar-root-border-color));color:var(--navbar-root-color--hover, var(--navbar-root-color));-webkit-text-decoration:var(--navbar-root-text-decoration--hover, var(--navbar-root-text-decoration));text-decoration:var(--navbar-root-text-decoration--hover, var(--navbar-root-text-decoration));-webkit-text-decoration-color:var(--navbar-root-text-decoration-color--hover, var(--navbar-root-text-decoration-color));text-decoration-color:var(--navbar-root-text-decoration-color--hover, var(--navbar-root-text-decoration-color))}.app-nav>ul>li>a:not(:last-child),.app-nav>ul>li>span:not(:last-child){padding:var(--navbar-menu-root-padding, var(--navbar-root-padding));background:var(--navbar-menu-root-background, var(--navbar-root-background))}.app-nav>ul>li>a:not(:last-child):hover,.app-nav>ul>li>span:not(:last-child):hover{background:var(--navbar-menu-root-background--hover, var(--navbar-menu-root-background, var(--navbar-root-background--hover, var(--navbar-root-background))))}.app-nav>ul>li>a.active{background:var(--navbar-root-background--active, var(--navbar-root-background));border-style:var(--navbar-root-border-style--active, var(--navbar-root-border-style));border-color:var(--navbar-root-border-color--active, var(--navbar-root-border-color));color:var(--navbar-root-color--active, var(--navbar-root-color));-webkit-text-decoration:var(--navbar-root-text-decoration--active, var(--navbar-root-text-decoration));text-decoration:var(--navbar-root-text-decoration--active, var(--navbar-root-text-decoration));-webkit-text-decoration-color:var(--navbar-root-text-decoration-color--active, var(--navbar-root-text-decoration-color));text-decoration-color:var(--navbar-root-text-decoration-color--active, var(--navbar-root-text-decoration-color))}.app-nav>ul>li>a.active:not(:last-child):hover{background:var(--navbar-menu-root-background--active, var(--navbar-menu-root-background, var(--navbar-root-background--active, var(--navbar-root-background))))}.app-nav>ul>li ul{visibility:hidden;position:absolute;top:100%;right:50%;overflow-y:auto;box-sizing:border-box;max-height:calc(50vh);padding:var(--navbar-menu-padding);border-width:var(--navbar-menu-border-width, 0);border-style:solid;border-color:var(--navbar-menu-border-color);border-radius:var(--navbar-menu-border-radius);background:var(--navbar-menu-background);box-shadow:var(--navbar-menu-box-shadow);text-align:left;white-space:nowrap;opacity:0;transform:translate(50%, -0.35em);transition:var(--navbar-menu-transition)}.app-nav>ul>li ul li{white-space:nowrap}.app-nav>ul>li ul a{margin:var(--navbar-menu-link-margin);padding:var(--navbar-menu-link-padding);border-width:var(--navbar-menu-link-border-width, 0);border-style:var(--navbar-menu-link-border-style);border-color:var(--navbar-menu-link-border-color);border-radius:var(--navbar-menu-link-border-radius);background:var(--navbar-menu-link-background);color:var(--navbar-menu-link-color);-webkit-text-decoration:var(--navbar-menu-link-text-decoration);text-decoration:var(--navbar-menu-link-text-decoration);-webkit-text-decoration-color:var(--navbar-menu-link-text-decoration-color);text-decoration-color:var(--navbar-menu-link-text-decoration-color)}.app-nav>ul>li ul a:hover{background:var(--navbar-menu-link-background--hover, var(--navbar-menu-link-background));border-style:var(--navbar-menu-link-border-style--hover, var(--navbar-menu-link-border-style));border-color:var(--navbar-menu-link-border-color--hover, var(--navbar-menu-link-border-color));color:var(--navbar-menu-link-color--hover, var(--navbar-menu-link-color));-webkit-text-decoration:var(--navbar-menu-link-text-decoration--hover, var(--navbar-menu-link-text-decoration));text-decoration:var(--navbar-menu-link-text-decoration--hover, var(--navbar-menu-link-text-decoration));-webkit-text-decoration-color:var(--navbar-menu-link-text-decoration-color--hover, var(--navbar-menu-link-text-decoration-color));text-decoration-color:var(--navbar-menu-link-text-decoration-color--hover, var(--navbar-menu-link-text-decoration-color))}.app-nav>ul>li ul a.active{background:var(--navbar-menu-link-background--active, var(--navbar-menu-link-background));border-style:var(--navbar-menu-link-border-style--active, var(--navbar-menu-link-border-style));border-color:var(--navbar-menu-link-border-color--active, var(--navbar-menu-link-border-color));color:var(--navbar-menu-link-color--active, var(--navbar-menu-link-color));-webkit-text-decoration:var(--navbar-menu-link-text-decoration--active, var(--navbar-menu-link-text-decoration));text-decoration:var(--navbar-menu-link-text-decoration--active, var(--navbar-menu-link-text-decoration));-webkit-text-decoration-color:var(--navbar-menu-link-text-decoration-color--active, var(--navbar-menu-link-text-decoration-color));text-decoration-color:var(--navbar-menu-link-text-decoration-color--active, var(--navbar-menu-link-text-decoration-color))}.app-nav>ul>li:hover ul,.app-nav>ul>li:focus ul,.app-nav>ul>li.focus-within ul{visibility:visible;opacity:1;transform:translate(50%, 0)}@media (min-width: 48em){nav.app-nav{margin-left:var(--sidebar-width)}}main{position:relative;overflow-x:hidden;min-height:100vh}.sidebar,.sidebar-toggle,.sidebar+.content{transition:all var(--sidebar-transition-duration) ease-out}@media (min-width: 48em){.sidebar+.content{margin-left:var(--sidebar-width)}}.sidebar{display:flex;flex-direction:column;position:fixed;z-index:10;top:0;right:100%;overflow-x:hidden;overflow-y:auto;height:100vh;width:var(--sidebar-width);padding:var(--sidebar-padding);border-width:var(--sidebar-border-width);border-style:solid;border-color:var(--sidebar-border-color);background:var(--sidebar-background)}.sidebar>h1{margin:0;margin:var(--sidebar-name-margin);padding:var(--sidebar-name-padding);background:var(--sidebar-name-background);color:var(--sidebar-name-color);font-family:var(--sidebar-name-font-family);font-size:var(--sidebar-name-font-size);font-weight:var(--sidebar-name-font-weight);text-align:var(--sidebar-name-text-align)}.sidebar>h1 img{max-width:100%}.sidebar>h1 .app-name-link{color:var(--sidebar-name-color)}body:not([data-platform^="Mac"]) .sidebar::-webkit-scrollbar{width:5px}body:not([data-platform^="Mac"]) .sidebar::-webkit-scrollbar-thumb{border-radius:50vw}@media (min-width: 48em){.sidebar{position:absolute;transform:translateX(var(--sidebar-width))}}@media print{.sidebar{display:none}}.sidebar-nav,.sidebar nav{order:1;margin:var(--sidebar-nav-margin);padding:var(--sidebar-nav-padding);background:var(--sidebar-nav-background)}.sidebar-nav ul,.sidebar nav ul{margin:0;padding:0;list-style:none}.sidebar-nav ul ul,.sidebar nav ul ul{margin-left:var(--sidebar-nav-indent)}.sidebar-nav a,.sidebar nav a{display:block;overflow:hidden;margin:var(--sidebar-nav-link-margin);padding:var(--sidebar-nav-link-padding);border-width:var(--sidebar-nav-link-border-width, 0);border-style:var(--sidebar-nav-link-border-style);border-color:var(--sidebar-nav-link-border-color);border-radius:var(--sidebar-nav-link-border-radius);background-color:var(--sidebar-nav-link-background-color);background-image:var(--sidebar-nav-link-background-image);background-position:var(--sidebar-nav-link-background-position);background-repeat:var(--sidebar-nav-link-background-repeat);background-size:var(--sidebar-nav-link-background-size);color:var(--sidebar-nav-link-color);font-weight:var(--sidebar-nav-link-font-weight);white-space:nowrap;-webkit-text-decoration:var(--sidebar-nav-link-text-decoration);text-decoration:var(--sidebar-nav-link-text-decoration);-webkit-text-decoration-color:var(--sidebar-nav-link-text-decoration-color);text-decoration-color:var(--sidebar-nav-link-text-decoration-color);text-overflow:ellipsis;transition:var(--sidebar-nav-link-transition)}.sidebar-nav a img,.sidebar nav a img{margin-top:-0.25em;vertical-align:middle}.sidebar-nav a img:first-child,.sidebar nav a img:first-child{margin-right:0.5em}.sidebar-nav a:hover,.sidebar nav a:hover{border-width:var(--sidebar-nav-link-border-width--hover, var(--sidebar-nav-link-border-width, 0));border-style:var(--sidebar-nav-link-border-style--hover, var(--sidebar-nav-link-border-style));border-color:var(--sidebar-nav-link-border-color--hover, var(--sidebar-nav-link-border-color));background-color:var(--sidebar-nav-link-background-color--hover, var(--sidebar-nav-link-background-color));background-image:var(--sidebar-nav-link-background-image--hover, var(--sidebar-nav-link-background-image));background-position:var(--sidebar-nav-link-background-position--hover, var(--sidebar-nav-link-background-position));background-size:var(--sidebar-nav-link-background-size--hover, var(--sidebar-nav-link-background-size));color:var(--sidebar-nav-link-color--hover, var(--sidebar-nav-link-color));font-weight:var(--sidebar-nav-link-font-weight--hover, var(--sidebar-nav-link-font-weight));-webkit-text-decoration:var(--sidebar-nav-link-text-decoration--hover, var(--sidebar-nav-link-text-decoration));text-decoration:var(--sidebar-nav-link-text-decoration--hover, var(--sidebar-nav-link-text-decoration));-webkit-text-decoration-color:var(--sidebar-nav-link-text-decoration-color);text-decoration-color:var(--sidebar-nav-link-text-decoration-color)}.sidebar-nav ul>li>span,.sidebar-nav ul>li>strong,.sidebar nav ul>li>span,.sidebar nav ul>li>strong{display:block;margin:var(--sidebar-nav-strong-margin);padding:var(--sidebar-nav-strong-padding);border-width:var(--sidebar-nav-strong-border-width, 0);border-style:solid;border-color:var(--sidebar-nav-strong-border-color);color:var(--sidebar-nav-strong-color);font-size:var(--sidebar-nav-strong-font-size);font-weight:var(--sidebar-nav-strong-font-weight);text-transform:var(--sidebar-nav-strong-text-transform)}.sidebar-nav ul>li>span+ul,.sidebar-nav ul>li>strong+ul,.sidebar nav ul>li>span+ul,.sidebar nav ul>li>strong+ul{margin-left:0}.sidebar-nav ul>li:first-child>span,.sidebar-nav ul>li:first-child>strong,.sidebar nav ul>li:first-child>span,.sidebar nav ul>li:first-child>strong{margin-top:0}.sidebar-nav::-webkit-scrollbar,.sidebar nav::-webkit-scrollbar{width:0}@supports (width: env(safe-area-inset)){@media only screen and (orientation: landscape){.sidebar-nav,.sidebar nav{margin-left:calc(env(safe-area-inset-left) / 2)}}}.sidebar-nav li>a:before,.sidebar-nav li>strong:before{display:inline-block}.sidebar-nav li>a{background-repeat:var(--sidebar-nav-pagelink-background-repeat);background-size:var(--sidebar-nav-pagelink-background-size)}.sidebar-nav li>a[href^="/"]:not([href*="?id="]),.sidebar-nav li>a[href^="#/"]:not([href*="?id="]){transition:var(--sidebar-nav-pagelink-transition)}.sidebar-nav li>a[href^="/"]:not([href*="?id="]),.sidebar-nav li>a[href^="/"]:not([href*="?id="]) ~ ul a,.sidebar-nav li>a[href^="#/"]:not([href*="?id="]),.sidebar-nav li>a[href^="#/"]:not([href*="?id="]) ~ ul a{padding:var(--sidebar-nav-pagelink-padding, var(--sidebar-nav-link-padding))}.sidebar-nav li>a[href^="/"]:not([href*="?id="]):only-child,.sidebar-nav li>a[href^="#/"]:not([href*="?id="]):only-child{background-image:var(--sidebar-nav-pagelink-background-image);background-position:var(--sidebar-nav-pagelink-background-position)}.sidebar-nav li>a[href^="/"]:not([href*="?id="]):not(:only-child),.sidebar-nav li>a[href^="#/"]:not([href*="?id="]):not(:only-child){background-image:var(--sidebar-nav-pagelink-background-image--loaded, var(--sidebar-nav-pagelink-background-image));background-position:var(--sidebar-nav-pagelink-background-position--loaded, var(--sidebar-nav-pagelink-background-image))}.sidebar-nav li.active>a,.sidebar-nav li.collapse>a{border-width:var(--sidebar-nav-link-border-width--active, var(--sidebar-nav-link-border-width));border-style:var(--sidebar-nav-link-border-style--active, var(--sidebar-nav-link-border-style));border-color:var(--sidebar-nav-link-border-color--active, var(--sidebar-nav-link-border-color));background-color:var(--sidebar-nav-link-background-color--active, var(--sidebar-nav-link-background-color));background-image:var(--sidebar-nav-link-background-image--active, var(--sidebar-nav-link-background-image));background-position:var(--sidebar-nav-link-background-position--active, var(--sidebar-nav-link-background-position));background-size:var(--sidebar-nav-link-background-size--active, var(--sidebar-nav-link-background-size));color:var(--sidebar-nav-link-color--active, var(--sidebar-nav-link-color));font-weight:var(--sidebar-nav-link-font-weight--active, var(--sidebar-nav-link-font-weight));-webkit-text-decoration:var(--sidebar-nav-link-text-decoration--active, var(--sidebar-nav-link-text-decoration));text-decoration:var(--sidebar-nav-link-text-decoration--active, var(--sidebar-nav-link-text-decoration));-webkit-text-decoration-color:var(--sidebar-nav-link-text-decoration-color);text-decoration-color:var(--sidebar-nav-link-text-decoration-color)}.sidebar-nav li.active>a[href^="/"]:not([href*="?id="]):not(:only-child),.sidebar-nav li.active>a[href^="#/"]:not([href*="?id="]):not(:only-child){background-image:var(--sidebar-nav-pagelink-background-image--active, var(--sidebar-nav-pagelink-background-image--loaded, var(--sidebar-nav-pagelink-background-image)));background-position:var(--sidebar-nav-pagelink-background-position--active, var(--sidebar-nav-pagelink-background-position--loaded, var(--sidebar-nav-pagelink-background-image)))}.sidebar-nav li.collapse>a[href^="/"]:not([href*="?id="]):not(:only-child),.sidebar-nav li.collapse>a[href^="#/"]:not([href*="?id="]):not(:only-child){background-image:var(--sidebar-nav-pagelink-background-image--collapse, var(--sidebar-nav-pagelink-background-image--loaded, var(--sidebar-nav-pagelink-background-image)));background-position:var(--sidebar-nav-pagelink-background-position--collapse, var(--sidebar-nav-pagelink-background-position--loaded, var(--sidebar-nav-pagelink-background-image)))}.sidebar-nav li.collapse .app-sub-sidebar{display:none}.sidebar-nav>ul>li>a:before{content:var(--sidebar-nav-link-before-content-l1, var(--sidebar-nav-link-before-content));margin:var(--sidebar-nav-link-before-margin-l1, var(--sidebar-nav-link-before-margin));color:var(--sidebar-nav-link-before-color-l1, var(--sidebar-nav-link-before-color))}.sidebar-nav>ul>li.active>a:before{content:var(--sidebar-nav-link-before-content-l1--active, var(--sidebar-nav-link-before-content--active, var(--sidebar-nav-link-before-content-l1, var(--sidebar-nav-link-before-content))));color:var(--sidebar-nav-link-before-color-l1--active, var(--sidebar-nav-link-before-color--active, var(--sidebar-nav-link-before-color-l1, var(--sidebar-nav-link-before-color))))}.sidebar-nav>ul>li>ul>li>a:before{content:var(--sidebar-nav-link-before-content-l2, var(--sidebar-nav-link-before-content));margin:var(--sidebar-nav-link-before-margin-l2, var(--sidebar-nav-link-before-margin));color:var(--sidebar-nav-link-before-color-l2, var(--sidebar-nav-link-before-color))}.sidebar-nav>ul>li>ul>li.active>a:before{content:var(--sidebar-nav-link-before-content-l2--active, var(--sidebar-nav-link-before-content--active, var(--sidebar-nav-link-before-content-l2, var(--sidebar-nav-link-before-content))));color:var(--sidebar-nav-link-before-color-l2--active, var(--sidebar-nav-link-before-color--active, var(--sidebar-nav-link-before-color-l2, var(--sidebar-nav-link-before-color))))}.sidebar-nav>ul>li>ul>li>ul>li>a:before{content:var(--sidebar-nav-link-before-content-l3, var(--sidebar-nav-link-before-content));margin:var(--sidebar-nav-link-before-margin-l3, var(--sidebar-nav-link-before-margin));color:var(--sidebar-nav-link-before-color-l3, var(--sidebar-nav-link-before-color))}.sidebar-nav>ul>li>ul>li>ul>li.active>a:before{content:var(--sidebar-nav-link-before-content-l3--active, var(--sidebar-nav-link-before-content--active, var(--sidebar-nav-link-before-content-l3, var(--sidebar-nav-link-before-content))));color:var(--sidebar-nav-link-before-color-l3--active, var(--sidebar-nav-link-before-color--active, var(--sidebar-nav-link-before-color-l3, var(--sidebar-nav-link-before-color))))}.sidebar-nav>ul>li>ul>li>ul>li>ul>li>a:before{content:var(--sidebar-nav-link-before-content-l4, var(--sidebar-nav-link-before-content));margin:var(--sidebar-nav-link-before-margin-l4, var(--sidebar-nav-link-before-margin));color:var(--sidebar-nav-link-before-color-l4, var(--sidebar-nav-link-before-color))}.sidebar-nav>ul>li>ul>li>ul>li>ul>li.active>a:before{content:var(--sidebar-nav-link-before-content-l4--active, var(--sidebar-nav-link-before-content--active, var(--sidebar-nav-link-before-content-l4, var(--sidebar-nav-link-before-content))));color:var(--sidebar-nav-link-before-color-l4--active, var(--sidebar-nav-link-before-color--active, var(--sidebar-nav-link-before-color-l4, var(--sidebar-nav-link-before-color))))}.sidebar-nav>:last-child{margin-bottom:2rem}.sidebar-toggle,.sidebar-toggle-button{width:var(--sidebar-toggle-width);outline:none}.sidebar-toggle{position:fixed;z-index:11;top:0;bottom:0;left:0;max-width:40px;margin:0;padding:0;border:0;background:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer}.sidebar-toggle .sidebar-toggle-button{position:absolute;top:var(--sidebar-toggle-offset-top);left:var(--sidebar-toggle-offset-left);height:var(--sidebar-toggle-height);border-radius:var(--sidebar-toggle-border-radius);border-width:var(--sidebar-toggle-border-width);border-style:var(--sidebar-toggle-border-style);border-color:var(--sidebar-toggle-border-color);background:var(--sidebar-toggle-background, transparent);color:var(--sidebar-toggle-icon-color)}.sidebar-toggle span{position:absolute;top:calc(50% - (var(--sidebar-toggle-icon-stroke-width) / 2));left:calc(50% - (var(--sidebar-toggle-icon-width) / 2));height:var(--sidebar-toggle-icon-stroke-width);width:var(--sidebar-toggle-icon-width);background-color:currentColor}.sidebar-toggle span:nth-child(1){margin-top:calc(0px - (var(--sidebar-toggle-icon-height) / 2))}.sidebar-toggle span:nth-child(3){margin-top:calc((var(--sidebar-toggle-icon-height) / 2))}@media (min-width: 48em){.sidebar-toggle{position:absolute;overflow:visible;top:var(--sidebar-toggle-offset-top);bottom:auto;left:0;height:var(--sidebar-toggle-height);transform:translateX(var(--sidebar-width))}.sidebar-toggle .sidebar-toggle-button{top:0}}@media print{.sidebar-toggle{display:none}}@media (max-width: 47.99em){body.close .sidebar,body.close .sidebar-toggle,body.close .sidebar+.content{transform:translateX(var(--sidebar-width))}}@media (min-width: 48em){body.close .sidebar+.content{transform:translateX(0)}}@media (max-width: 47.99em){body.close nav.app-nav,body.close .github-corner{display:none}}@media (min-width: 48em){body.close .sidebar,body.close .sidebar-toggle{transform:translateX(0)}}@media (min-width: 48em){body.close nav.app-nav{margin-left:0}}@media (max-width: 47.99em){body.close .sidebar-toggle{width:100%;max-width:none}body.close .sidebar-toggle span{margin-top:0}body.close .sidebar-toggle span:nth-child(1){transform:rotate(45deg)}body.close .sidebar-toggle span:nth-child(2){display:none}body.close .sidebar-toggle span:nth-child(3){transform:rotate(-45deg)}}@media (min-width: 48em){body.close .sidebar+.content{margin-left:0}}@media (min-width: 48em){body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}}body .docsify-copy-code-button,body .docsify-copy-code-button:after{border-radius:var(--border-radius-m, 0);border-top-left-radius:0;border-bottom-right-radius:0;background:var(--copycode-background);color:var(--copycode-color)}body .docsify-copy-code-button span{border-radius:var(--border-radius-s, 0)}body .docsify-pagination-container{border-top:var(--pagination-border-top);color:var(--pagination-color)}body .pagination-item-label{font-size:var(--pagination-label-font-size)}body .pagination-item-label svg{color:var(--pagination-label-color);height:var(--pagination-chevron-height);stroke:var(--pagination-chevron-stroke);stroke-linecap:var(--pagination-chevron-stroke-linecap);stroke-linejoin:var(--pagination-chevron-stroke-linecap);stroke-width:var(--pagination-chevron-stroke-width)}body .pagination-item-title{color:var(--pagination-title-color);font-size:var(--pagination-title-font-size)}body .app-name.hide{display:block}body .sidebar{padding:var(--sidebar-padding)}.sidebar .search{margin:0;padding:0;border:0}.sidebar .search input{padding:0;line-height:1;font-size:inherit}.sidebar .search .clear-button{width:auto}.sidebar .search .clear-button svg{transform:scale(1)}.sidebar .search .matching-post{border:none}.sidebar .search p{font-size:inherit}.sidebar .search{order:var(--search-flex-order);margin:var(--search-margin);padding:var(--search-padding);background:var(--search-background)}.sidebar .search a{color:inherit}.sidebar .search h2{margin:var(--search-result-heading-margin);font-size:var(--search-result-heading-font-size);font-weight:var(--search-result-heading-font-weight);color:var(--search-result-heading-color)}.sidebar .search .input-wrap{align-items:stretch;margin:var(--search-input-margin);background-color:var(--search-input-background-color);border-width:var(--search-input-border-width, 0);border-style:solid;border-color:var(--search-input-border-color);border-radius:var(--search-input-border-radius)}.sidebar .search input[type="search"]{min-width:0;padding:var(--search-input-padding);border:none;background-color:transparent;background-image:var(--search-input-background-image);background-position:var(--search-input-background-position);background-repeat:var(--search-input-background-repeat);background-size:var(--search-input-background-size);font-size:var(--search-input-font-size);color:var(--search-input-color);transition:var(--search-input-transition)}.sidebar .search input[type="search"]::-ms-clear{display:none}.sidebar .search input[type="search"]::-moz-placeholder{color:var(--search-input-placeholder-color, gray)}.sidebar .search input[type="search"]:-ms-input-placeholder{color:var(--search-input-placeholder-color, gray)}.sidebar .search input[type="search"]::placeholder{color:var(--search-input-placeholder-color, gray)}.sidebar .search input[type="search"]::-webkit-input-placeholder{line-height:normal}.sidebar .search input[type="search"]:focus{background-color:var(--search-input-background-color--focus, var(--search-input-background-color));background-image:var(--search-input-background-image--focus, var(--search-input-background-image));background-position:var(--search-input-background-position--focus, var(--search-input-background-position));background-size:var(--search-input-background-size--focus, var(--search-input-background-size))}@supports (width: env(safe-area-inset)){@media only screen and (orientation: landscape){.sidebar .search input[type="search"]{margin-left:calc(env(safe-area-inset-left) / 2)}}}.sidebar .search p{overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2}.sidebar .search p:empty{text-align:center}.sidebar .search .clear-button{margin:0;padding:0 10px;border:none;line-height:1;background:transparent;cursor:pointer}.sidebar .search .clear-button svg circle{fill:var(--search-clear-icon-color1, gray)}.sidebar .search .clear-button svg path{stroke:var(--search-clear-icon-color2, #fff)}.sidebar .search.show ~ *:not(h1){display:none}.sidebar .search .results-panel{display:none;color:var(--search-result-item-color);font-size:var(--search-result-item-font-size);font-weight:var(--search-result-item-font-weight)}.sidebar .search .results-panel.show{display:block}.sidebar .search .matching-post{margin:var(--search-result-item-margin);padding:var(--search-result-item-padding)}.sidebar .search .matching-post,.sidebar .search .matching-post:last-child{border-width:var(--search-result-item-border-width, 0) !important;border-style:var(--search-result-item-border-style);border-color:var(--search-result-item-border-color)}.sidebar .search .matching-post p{margin:0}.sidebar .search .search-keyword{margin:var(--search-result-keyword-margin);padding:var(--search-result-keyword-padding);border-radius:var(--search-result-keyword-border-radius);background-color:var(--search-result-keyword-background);color:var(--search-result-keyword-color, currentColor);font-style:normal;font-weight:var(--search-result-keyword-font-weight)}.medium-zoom-overlay,.medium-zoom-image--open,.medium-zoom-image--opened{z-index:2147483646 !important}.medium-zoom-overlay{background:var(--zoomimage-overlay-background) !important}:root{--mono-hue: 113;--mono-saturation: 0%;--mono-shade3: hsl(var(--mono-hue), var(--mono-saturation), 20%);--mono-shade2: hsl(var(--mono-hue), var(--mono-saturation), 30%);--mono-shade1: hsl(var(--mono-hue), var(--mono-saturation), 40%);--mono-base: hsl(var(--mono-hue), var(--mono-saturation), 50%);--mono-tint1: hsl(var(--mono-hue), var(--mono-saturation), 70%);--mono-tint2: hsl(var(--mono-hue), var(--mono-saturation), 89%);--mono-tint3: hsl(var(--mono-hue), var(--mono-saturation), 97%);--theme-hue: 204;--theme-saturation: 90%;--theme-lightness: 45%;--theme-color: hsl(var(--theme-hue), var(--theme-saturation), var(--theme-lightness));--modular-scale: 1.333;--modular-scale--2: calc(var(--modular-scale--1) / var(--modular-scale));--modular-scale--1: calc(var(--modular-scale-1) / var(--modular-scale));--modular-scale-1: 1rem;--modular-scale-2: calc(var(--modular-scale-1) * var(--modular-scale));--modular-scale-3: calc(var(--modular-scale-2) * var(--modular-scale));--modular-scale-4: calc(var(--modular-scale-3) * var(--modular-scale));--modular-scale-5: calc(var(--modular-scale-4) * var(--modular-scale));--font-size-xxxl: var(--modular-scale-5);--font-size-xxl: var(--modular-scale-4);--font-size-xl: var(--modular-scale-3);--font-size-l: var(--modular-scale-2);--font-size-m: var(--modular-scale-1);--font-size-s: var(--modular-scale--1);--font-size-xs: var(--modular-scale--2);--duration-slow: 1s;--duration-medium: 0.5s;--duration-fast: 0.25s;--spinner-size: 60px;--spinner-track-width: 4px;--spinner-track-color: rgba(0, 0, 0, 0.15);--spinner-transition-duration: var(--duration-medium)}:root{--base-background-color: #fff;--base-color: var(--mono-shade2);--base-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--base-font-size: 16px;--base-font-weight: normal;--base-line-height: 1.7;--emoji-size: calc(var(--base-line-height) * 1em);--hr-border: 1px solid var(--mono-tint2);--mark-background: #ffecb3;--pre-font-family: var(--code-font-family);--pre-font-size: var(--code-font-size);--pre-font-weight: normal;--selection-color: #b4d5fe;--small-font-size: var(--font-size-s);--strong-color: var(--heading-color);--strong-font-weight: 600;--subsup-font-size: var(--font-size-s)}:root{--content-max-width: 55em;--blockquote-background: var(--mono-tint3);--blockquote-border-style: solid;--blockquote-border-radius: var(--border-radius-m);--blockquote-em-font-weight: normal;--blockquote-font-weight: normal;--code-font-family: Inconsolata, Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;--code-font-size: calc(var(--font-size-m) * 0.95);--code-font-weight: normal;--code-tab-size: 4;--code-block-border-radius: var(--border-radius-m);--code-block-line-height: var(--base-line-height);--code-block-margin: 1em 0;--code-block-padding: 1.75em 1.5em 1.5em 1.5em;--code-inline-background: var(--code-theme-background);--code-inline-border-radius: var(--border-radius-s);--code-inline-color: var(--code-theme-text);--code-inline-margin: 0 0.15em;--code-inline-padding: 0.125em 0.4em;--code-theme-background: var(--mono-tint3);--heading-color: var(--mono-shade3);--heading-margin: 2.5rem 0 0;--heading-h1-border-style: solid;--heading-h1-font-size: var(--font-size-xxl);--heading-h2-border-style: solid;--heading-h2-font-size: var(--font-size-xl);--heading-h3-border-style: solid;--heading-h3-font-size: var(--font-size-l);--heading-h4-border-style: solid;--heading-h4-font-size: var(--font-size-m);--heading-h5-border-style: solid;--heading-h5-font-size: var(--font-size-s);--heading-h6-border-style: solid;--heading-h6-font-size: var(--font-size-xs);--kbd-background: var(--mono-tint3);--kbd-border-radius: var(--border-radius-m);--kbd-margin: 0 0.3em;--kbd-min-width: 2.5em;--kbd-padding: 0.65em 0.5em;--link-text-decoration: underline;--notice-background: var(--mono-tint3);--notice-border-radius: var(--border-radius-m);--notice-border-style: solid;--notice-font-weight: normal;--notice-padding: 1em 1.5em;--notice-before-font-weight: normal;--table-cell-padding: 0.75em 0.5em;--table-head-border-color: var(--table-cell-border-color);--table-head-font-weight: var(--strong-font-weight);--table-row-odd-background: var(--mono-tint3)}:root{--cover-margin: 0 auto;--cover-max-width: 40em;--cover-text-align: center;--cover-background-color: var(--base-background-color);--cover-background-mask-color: var(--base-background-color);--cover-background-mask-opacity: 0.8;--cover-background-position: center center;--cover-background-repeat: no-repeat;--cover-background-size: cover;--cover-blockquote-font-size: var(--font-size-l);--cover-border-color: var(--theme-color);--cover-button-border: 1px solid var(--theme-color);--cover-button-border-radius: var(--border-radius-m);--cover-button-color: var(--theme-color);--cover-button-padding: 0.5em 2rem;--cover-button-text-decoration: none;--cover-button-transition: all var(--duration-fast) ease-in-out;--cover-button-primary-background: var(--theme-color);--cover-button-primary-border: 1px solid var(--theme-color);--cover-button-primary-color: #fff;--cover-heading-color: var(--theme-color);--cover-heading-font-size: var(--font-size-xxl);--cover-heading-font-weight: normal;--cover-link-text-decoration: underline }:root{--navbar-root-border-style: solid;--navbar-root-margin: 0 0 0 1.5em;--navbar-root-transition: all var(--duration-fast);--navbar-menu-background: var(--base-background-color);--navbar-menu-border-radius: var(--border-radius-m);--navbar-menu-box-shadow: rgba(45,45,45,0.05) 0px 0px 1px, rgba(49,49,49,0.05) 0px 1px 2px, rgba(42,42,42,0.05) 0px 2px 4px, rgba(32,32,32,0.05) 0px 4px 8px, rgba(49,49,49,0.05) 0px 8px 16px, rgba(35,35,35,0.05) 0px 16px 32px;--navbar-menu-padding: 0.5em;--navbar-menu-transition: all var(--duration-fast);--navbar-menu-link-border-style: solid;--navbar-menu-link-margin: 0.75em 0.5em;--navbar-menu-link-padding: 0.2em 0 }:root{--copycode-background: #808080;--copycode-color: #fff}:root{--docsifytabs-border-color: var(--mono-tint2);--docsifytabs-border-radius-px: var(--border-radius-s);--docsifytabs-tab-background: var(--mono-tint3);--docsifytabs-tab-color: var(--mono-tint1)}:root{--pagination-border-top: 1px solid var(--mono-tint2);--pagination-chevron-height: 0.8em;--pagination-chevron-stroke: currentColor;--pagination-chevron-stroke-linecap: round;--pagination-chevron-stroke-width: 1px;--pagination-label-font-size: var(--font-size-s);--pagination-title-font-size: var(--font-size-l)}:root{--search-margin: 1.5rem 0 0;--search-input-background-repeat: no-repeat;--search-input-border-color: var(--mono-tint1);--search-input-border-width: 1px;--search-input-padding: 0.5em;--search-flex-order: 1;--search-result-heading-color: var(--heading-color);--search-result-heading-font-size: var(--base-font-size);--search-result-heading-font-weight: normal;--search-result-heading-margin: 0 0 0.25em;--search-result-item-border-color: var(--mono-tint2);--search-result-item-border-style: solid;--search-result-item-border-width: 0 0 1px 0;--search-result-item-font-weight: normal;--search-result-item-padding: 1em 0;--search-result-keyword-background: var(--mark-background);--search-result-keyword-border-radius: var(--border-radius-s);--search-result-keyword-color: var(--mark-color);--search-result-keyword-font-weight: normal;--search-result-keyword-margin: 0 0.1em;--search-result-keyword-padding: 0.2em 0}:root{--zoomimage-overlay-background: rgba(0, 0, 0, 0.875)}:root{--sidebar-background: var(--base-background-color);--sidebar-border-width: 0;--sidebar-padding: 0 25px;--sidebar-transition-duration: var(--duration-fast);--sidebar-width: 17rem;--sidebar-name-font-size: var(--font-size-l);--sidebar-name-font-weight: normal;--sidebar-name-margin: 1.5rem 0 0;--sidebar-name-text-align: center;--sidebar-nav-strong-border-color: var(--sidebar-border-color);--sidebar-nav-strong-color: var(--heading-color);--sidebar-nav-strong-font-weight: var(--strong-font-weight);--sidebar-nav-strong-margin: 1.5em 0 0.5em;--sidebar-nav-strong-padding: 0.25em 0;--sidebar-nav-indent: 1em;--sidebar-nav-margin: 1.5rem 0 0;--sidebar-nav-link-border-style: solid;--sidebar-nav-link-border-width: 0;--sidebar-nav-link-color: var(--base-color);--sidebar-nav-link-font-weight: normal;--sidebar-nav-link-padding: 0.25em 0;--sidebar-nav-link-text-decoration--active: underline;--sidebar-nav-link-text-decoration--hover: underline;--sidebar-nav-link-before-margin: 0 0.35em 0 0;--sidebar-nav-pagelink-background-repeat: no-repeat;--sidebar-nav-pagelink-transition: var(--sidebar-nav-link-transition);--sidebar-toggle-border-radius: var(--border-radius-s);--sidebar-toggle-border-style: solid;--sidebar-toggle-border-width: 0;--sidebar-toggle-height: 36px;--sidebar-toggle-icon-color: var(--base-color);--sidebar-toggle-icon-height: 10px;--sidebar-toggle-icon-stroke-width: 1px;--sidebar-toggle-icon-width: 16px;--sidebar-toggle-offset-left: 0;--sidebar-toggle-offset-top: calc(35px - (var(--sidebar-toggle-height) / 2));--sidebar-toggle-width: 44px}
2 | /*# sourceMappingURL=theme-defaults.css.map */
--------------------------------------------------------------------------------
/docs/lib/zoom-image.min.js:
--------------------------------------------------------------------------------
1 | !function(){function o(e){return"IMG"===e.tagName}function E(e){return e&&1===e.nodeType}function c(e){return".svg"===(e.currentSrc||e.src).substr(-4).toLowerCase()}function m(e){try{return Array.isArray(e)?e.filter(o):(t=e,NodeList.prototype.isPrototypeOf(t)?[].slice.call(e).filter(o):E(e)?[e].filter(o):"string"==typeof e?[].slice.call(document.querySelectorAll(e)).filter(o):[])}catch(e){throw new TypeError("The provided selector is invalid.\nExpects a CSS selector, a Node element, a NodeList or an array.\nSee: https://github.com/francoischalifour/medium-zoom")}var t}function w(e,t){var o=l({bubbles:!1,cancelable:!1,detail:void 0},t);return"function"==typeof window.CustomEvent?new CustomEvent(e,o):((t=document.createEvent("CustomEvent")).initCustomEvent(e,o.bubbles,o.cancelable,o.detail),t)}function a(e,t){function o(e){function u(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,o=void 0;v.container&&(v.container instanceof Object?(t=(e=l({},e,v.container)).width-e.left-e.right-2*v.margin,o=e.height-e.top-e.bottom-2*v.margin):(d=(i=(E(v.container)?v.container:document.querySelector(v.container)).getBoundingClientRect()).width,a=i.height,r=i.left,m=i.top,e=l({},e,{width:d,height:a,left:r,top:m}))),t=t||e.width-2*v.margin,o=o||e.height-2*v.margin;var n=z.zoomedHd||z.original,i=!c(n)&&n.naturalWidth||t,d=!c(n)&&n.naturalHeight||o,r=(a=n.getBoundingClientRect()).top,m=a.left,n=a.width,a=a.height,i=Math.min(i,t)/n,d=Math.min(d,o)/a,d="scale("+(d=Math.min(i,d))+") translate3d("+((t-n)/2-m+v.margin+e.left)/d+"px, "+((o-a)/2-r+v.margin+e.top)/d+"px, 0)";z.zoomed.style.transform=d,z.zoomedHd&&(z.zoomedHd.style.transform=d)}var s=(0v.scrollOffset&&setTimeout(p,150))}),window.addEventListener("resize",p);var b={open:o,close:p,toggle:d,update:function(e){var t=0 OSI:Open System Interconnect Reference Model
29 |
30 |
31 |
32 | ## 应用于模型层的网络协议
33 |
34 | | 模型层 | 协议 | 数据类型 |
35 | | :--------- | :--------------------- | :------------- |
36 | | 应用层 | FTP,HTTP,SMTP,DNS,DHCP | 报文,用户数据 |
37 | | 运输层 | TCP,UDP | 段 |
38 | | 网络层 | IP | 包 |
39 | | 数据链路层 | MAC | 帧 |
40 | | 物理层 | | 比特流 |
41 |
42 |
43 |
44 | ## 网络连接的硬件
45 |
46 | | 网络硬件 | 作用 |
47 | | -------- | ------------------------------------------------------------ |
48 | | 同轴电缆 | 半双工通讯、容易冲突、不安全、中间断了整个瘫痪 |
49 | | 集线器 | 半双工通讯、容易冲突、不安全 |
50 | | 网桥 | 能够记住接口那侧的Mac地址、隔绝冲突域 |
51 | | 交换机 | 相对于接口更多的网桥、全双工、比集线器安全 |
52 | | 路由器 | 网线直连、同轴电缆、集线器、网桥、交换机连接的设备必须在同一网段、和同一广播域;
路由器可以在不同的网段之间转发数据、隔绝广播域 |
53 |
54 |
55 |
56 | ## Mac地址
57 |
58 | 网卡的唯一标识
59 |
60 | **ARP协议**
61 |
62 | 通过IP获取MAC地址的解析协议。
63 |
64 | **RARP协议**
65 |
66 | 将MAC地址转换成IP地址的协议
67 |
68 | 后来被`bootp`,`DHCP`取代。
69 |
70 |
71 |
72 | ## IP地址
73 |
74 | **IPV4**
75 |
76 | IPV4由32位组成(4个字节)
77 |
78 | ### IP地址的组成
79 |
80 | IP地址由两部分组成:网络标识(网络ID),主机标识(主机ID)
81 |
82 | > 位就是一个二进制数
83 | >
84 | > 1字节=8位
85 |
86 |
87 |
88 | ### IP地址分类
89 |
90 | | IP地址类型 | 描述 | 默认子网掩码 |
91 | | ---------- | ----------------------------------------------------- | ------------- |
92 | | A类 | 0开头,网络ID占8位,主机ID占24位(16777214) | 225.0.0.0 |
93 | | B类 | 10开头,网络ID占16位,主机ID占16位(最多65534个主机) | 225.225.0.0 |
94 | | C类 | 110开头,网络ID占24位,主机ID占8位(最多254个主机) | 225.225.255.0 |
95 | | D类 | 1110开头, | |
96 | | E类 | 1111开头, | |
97 |
98 |
99 |
100 | ### 网段
101 |
102 | 主机所在的网段 = 子网掩码 & IP地址
103 |
104 | 不同网段之间通讯需要用路由器转发。
105 |
106 |
107 |
108 | ## 子网掩码
109 |
110 | 用来划分子网
111 |
112 |
113 |
114 | ## 物理层
115 |
116 | 物理层定义了接口标准、线缆标准、传输速率、传输方式等。
117 |
118 |
119 |
120 | ### 数字信号、模拟信号
121 |
122 | * 模拟信号属于连续的信号、适合长距离传输、容易受干扰。
123 | * 数字信号属于离散的信号,不适合长距离传输,抗干扰强。
124 |
125 | > 广域网的通讯:就是使用调制解调器(光猫),将数字信号于模拟信号互转实现长距离通讯。
126 |
127 | ### 信道
128 |
129 | 信息传输的通道,一条传输介质(网线)上可以有多条信道。
130 |
131 | **单工通讯**
132 |
133 | * 信号只能往一个方向传输,任何时候都不能改变信号的传输方向。
134 | * 比如无线电广播、有线电视广播。
135 |
136 | **半双工通讯**
137 |
138 | * 信号可以双向传输,但必须交替进行,同一时间只能往一个方向传输
139 | * 比如对讲机
140 |
141 | **全双工通讯**
142 |
143 | * 信号可以同时双向传输
144 | * 比如手机(打电话,听说可以同时进行)
145 |
146 | ## 数据链路层
147 |
148 | ### 链路
149 |
150 | 从一个节点到相邻节点的一段物理线路(有线或无线)。从一个节点到另一个节点怎么走。
151 |
152 | ### 数据链路
153 |
154 | 在一条链路上传输数据时需要由对应的通讯协议来控制数据的传输。
155 |
156 | **不同类型的数据链路对应的通讯协议**
157 |
158 | 广播信道:CSMA/CD协议(比如同轴电缆、集线器组成的网络)
159 |
160 | 点对点信道:PPP协议(两个路由器之间的信道)
161 |
162 |
163 |
164 | ### 数据链路的三个基本问题
165 |
166 | * 封装成帧
167 | * 透明传输
168 | * 差错检验
169 |
170 | ## 网络层
171 |
172 | 网络层数据包(IP数据包、Packet):由首部、数据两部分组成。
173 |
174 | > 数据:由传输层传递下来的数据段
175 |
176 | ## 传输层
177 |
178 | 运输层协议为提供了网络之间的逻辑通讯。将报文报文整理成段,传递给网络层。
179 |
180 | 运输层主要的作用是将报文段交付给主机上适当的进程。
181 |
182 | ### 多路分解 多路复用
183 |
184 | **多路分解**
185 |
186 | 传输层接收到数据后并不是直接将数据交付给进程,而是将数据先给到套字节,正确的将数据给到套字节的过程叫**多路分解**。
187 |
188 | **多路复用**
189 |
190 | 发送数据时主机从不同的套字节中收集数据,并处理传递给网络层的过程叫**多路复用**。
191 |
192 | ### 传输层协议(TCP、UDP)
193 |
194 | 传输层有两个协议分别是`TCP`和`UDP`
195 |
196 | | | TCP | UDP |
197 | | ------------ | -------------------------- | ------------------------------------ |
198 | | 连接性 | 面向连接 | 无连接 |
199 | | 可靠性 | 可靠传输、不丢包 | 不可靠传输、尽最大努力交付、可能丢包 |
200 | | 首部占用空间 | 大 | 小 |
201 | | 传输速率 | 慢 | 快 |
202 | | 资源消耗 | 大 | 小 |
203 | | 应用场景 | 浏览器、文件传输、邮件发送 | 音视频通话、直播 |
204 | | 应用层协议 | HTTP,HTTPS,FTP,SMTP,DNS | DNS |
205 |
206 | ### UDP协议
207 |
208 | #### 数据格式
209 |
210 | 首部只有8个字节,由目标端口号、源端口号、UDP长度(首部的长度+数据长度)、校验和组成。
211 |
212 | #### 校验和
213 |
214 | 用于校验数据的完整性和准确性。
215 |
216 | 校验和的计算内容:伪首部+首部+数据。
217 |
218 | 伪首部仅在计算校验和起作用,不会传递给网络层。
219 |
220 | ### TCP协议
221 |
222 | #### 数据格式
223 |
224 | TCP协议为了保证数据的可靠传输、完整。首部也比UDP长,有20个字节的固定首部。
225 |
226 |
227 |
228 | #### 校验和
229 |
230 | 计算内容:伪首部 + 首部 + 数据
231 |
232 | 占12个字节,不会传递给网络层
233 |
234 |
235 |
236 | #### 标志位
237 |
238 | * URG=1时,紧急指针生效,表示当前报文中有紧急数据,优先尽快传输。
239 | * ACK =1时,确认号字段才会生效。
240 | * PSH (push)
241 | * RST (Reset) = 1时 ,表示连接中出现严重差错,必须释放连接,然后重新连接。
242 | * SYN , 当syn=1时、ack=0,表示这是一个建立连接的请求。如果对方同意连接,则回复syn=1、ack=1。
243 | * FIN , 当FIN = 1时,表明数据已经发送完毕,要求释放连接。
244 |
245 | #### 序号
246 |
247 | * 占4字节
248 | * 传输过程中每一个字节都有一个编号,序号表示传递给对方数据部分的,第一个字节的编号。
249 |
250 | #### 确认号
251 |
252 | * 占4字节
253 | * 表示期望对方下一次传过来的TCP数据部分的第一个字节的编号
254 |
255 |
256 |
257 | #### TCP的特点
258 |
259 | #### 可靠传输
260 |
261 | ##### 停止等待ARQ协议
262 |
263 | 如果发生数据包丢失,则超时重传。
264 |
265 | 如果在B发送确认数据时发生了丢失数据,A会重新发送。过了一会儿B的M1数据确认再到达A,则A什么也不做。
266 |
267 | > 如果重传5次还没有成功,就会使RST=1,然后断开连接。
268 |
269 |
270 |
271 | #### 连续ARQ协议 + 滑动窗口
272 |
273 | 由于停止等待协议每一次A都要发送然后等待B确认,这个过程效率太低。使用连续ARQ协议连续发送多个分组数据。然后再等待B确认。
274 |
275 | **滑动窗口**
276 |
277 | 发送方与接收方,使用滑动滑动窗口来缓存数据。
278 |
279 | 发送方将一组数据发送给接收方,接收方接收到数据后缓存起来,然后再滑动窗口接收下一次的数据。
280 |
281 | > 批量发送数据可能会导致数据某个包丢失
282 | >
283 | > SACK技术会告知发送方接收到的数据和丢失的数据,这样发送方只需要重新发送丢失的包。而不用重发相同的数据
284 |
285 | #### 流量控制
286 |
287 | 让发送方发送的速率不要太快,不然接收方来不及接收。
288 |
289 | * 通过确认保存中窗口字段来控制发送方的发送速率。
290 | * 发送方的发送窗口大小不能超过接收方给出的窗口大小。
291 | * 当发送方收到的接收窗口大小为0时,发送方就会停止发送数据。
292 |
293 | #### 拥塞控制
294 |
295 | 拥塞控制需要所有的主机,路由器协作完成。避免带宽造成拥挤,导致数据包丢失。
296 |
297 | 解决拥塞控制采用下面几种策略:
298 |
299 | * 慢开始
300 |
301 | 一开始cwnd的值很小,在数据传输过程中。拥塞窗口成指数级增长。
302 |
303 | * 拥塞避免
304 |
305 | cwnd达到阈值,则线性增加。
306 |
307 | 只要网络出现拥塞(cwnd恢复到初始值)
308 |
309 | * 快速重传
310 |
311 | 接收方只要收到失序的分组,则发送重复确认。接收方如果连续收到3次重复确认就立即重传。
312 |
313 | * 快速恢复
314 |
315 | 快速恢复就是将拥塞降到一定阈值后,然后加法增大。(而不是回到慢开始重新来)
316 |
317 | > MSS : 每个段最大数据部分大小
318 | >
319 | > cwnd : 拥塞窗口
320 | >
321 | > rwnd : 接收窗口
322 | >
323 | > swnd : 发送窗口
324 |
325 | #### 三次握手
326 |
327 | 
328 |
329 | **第一次握手**
330 |
331 | 客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。
332 |
333 | **第二次握手**
334 |
335 | 服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。
336 |
337 | **第三次握手**
338 |
339 | 当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。
340 |
341 | > 为什么 TCP 建立连接需要三次握手,明明两次就可以建立起连接
342 | >
343 | > 客户端第一次发送因为网络超时,然后再发一次。服务端收到了第二次的请求进行响应,结果客户端第一次又到达了服务端,服务端以为客户端又要握手,于是有进行响应。三次握手可以解决不必要的资源浪费
344 |
345 | #### 四次挥手
346 |
347 | 
348 |
349 | **第一次握手**
350 |
351 | 若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。
352 |
353 | **第二次握手**
354 |
355 | B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A。
356 |
357 | **第三次握手**
358 |
359 | B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进入 LAST-ACK 状态。
360 |
361 | PS:通过延迟确认的技术(通常有时间限制,否则对方会误认为需要重传),可以将第二次和第三次握手合并,延迟 ACK 包的发送。
362 |
363 | **第四次握手**
364 |
365 | A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。
366 |
367 | > 为什么 A 要进入 TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态?
368 | >
369 | > 为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进入 CLOSED 状态,如果确认应答因为网络问题一直没有到达,那么会造成 B 不能正常关闭。
370 |
371 | ## 应用层
372 |
373 | ### http
374 |
375 | #### 请求与响应报文
376 |
377 | **请求报文**
378 |
379 | 请求报文由3部分组成:请求行,首部行,实体。
380 |
381 | 请求行:整个报文的第一行,由请求方法,URL,http版本组成。
382 |
383 | **响应报文**
384 |
385 | 响应报文由3部分组成:状态行,首部行,实体。
386 |
387 | 状态行:http版本,状态码,短语组成
388 |
389 | > 短语:与状态码对应
390 |
391 |
392 |
393 | #### http 缓存
394 |
395 | `pragma`与catche-control相似,http1.0
396 |
397 | `expires` 缓存的过期时间,GMT格式时间,http1.0
398 |
399 | `cache-control `:设置缓存策略
400 |
401 | 1. no-storage:不缓存数据到本地
402 | 2. public :允许用户、代理服务器缓存数据
403 | 3. private:只允许用户缓存数据
404 | 4. max-age:缓存的有效时间,单位秒
405 | 5. no-cache:每次需要发请求给服务器询问缓存是否有变化,再决定如何使用缓存
406 |
407 | > 优先级 : pragma > cache-control > expires
408 |
409 | **cache-control : no-cache 的情况**
410 |
411 | 1、
412 |
413 | `last-modified :xxx ` 资源最后一次修改的时间(response携带)。
414 |
415 | `if-modified-since:xxx` 把last-modified返回的时间再带回服务器(request携带)。
416 |
417 | 2、
418 |
419 | `etag:xxx`资源的唯一标识(根据文件内容计算出来的值,如果文件修改了这个值就不一样了)。(response携带)
420 |
421 | `if-none-match:xxx`把etag的值再带回服务器(request携带)
422 |
423 |
424 |
425 |
426 |
427 | **持续连接与非持续连接**
428 |
429 | 多个请求由一个连接发送与响应就是持续连接,反之就是非持续连接。
430 |
431 | http可以持续连接,也可以非持续连接。
432 |
433 |
434 |
435 | > 无状态协议 : 服务器不记录客户端请求的信息。http就是无状态协议。
436 |
437 |
438 |
439 | ### https
440 |
441 | http + 加密 + 认证 + 完整性保护 = https
442 |
443 | #### https加密
444 |
445 | 公开密钥加密:发送方使用对方的公开密钥加密,接收方使用私钥解密。
446 |
447 | 共享密钥加密:发送方和接收方使用共享密钥的方式加密。
448 |
449 | Https使用共享密钥和公开密钥两种方式混合加密,在双方交换密钥时使用公开密钥加密方式,在确保密钥安全的情况下使用共享密钥加密通讯。
450 |
451 | > 为什么不使用单独一种方式呢?
452 | >
453 | > 耗费资源
454 |
455 | #### 证书
456 |
457 | 公开密钥无法证明自己是真实的公开密钥,这时就需要证明公开密钥的证书。
458 |
459 | 服务器将自己公开密钥交给数字认证机构进行认证,认证机构使用自己的私钥给服务器颁发证书,客户端拿到服务器的公钥和证书后确保公开密钥的真实性。
460 |
461 | > 安全性更高的证书
462 | >
463 | > 客户端证书:需要用户自行安装证书,比如网上银行就采用了客户端证书
464 |
465 |
466 |
467 | #### https安全通讯流程
468 |
469 | 
470 |
471 | #### SSL和TSL
472 |
473 | TSL是以SSL为原型开发的协议,统称SSL
474 |
475 |
476 |
477 | ### http2
478 |
479 | #### 二进制传输
480 |
481 | 所有数据采用二进制编码
482 |
483 | #### 多路复用
484 |
485 | 可以发送多个请求,对方可以通过帧中的标识知道属于哪个请求,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。
486 |
487 | 头部压缩
488 |
489 | 使用 HPACK 压缩格式对传输的 header 进行编码,减少了 header 的大小。并在两端(客服端/服务器)维护了索引表,用于记录出现过的 header ,后面在传输过程中就可以传输已经记录过的 header 的键名,对方收到数据后就可以通过键名找到对应的值。
490 |
491 | 服务端发送
492 |
493 | ### http3
494 |
495 | #### QUIC协议
496 |
497 | QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议。
498 |
499 | #### 多路复用
500 |
501 | #### O-RTT
502 |
503 | 通过使用类似 TCP 快速打开的技术,缓存当前会话的上下文,在下次恢复会话的时候,只需要将之前的缓存传递给服务端验证通过就可以进行传输了。
504 |
505 | #### 纠错机制
506 |
507 | 当出现其中的非校验包丢包的情况时,可以通过另外三个包计算出丢失的数据包的内容。
508 |
509 | > 当然这种技术只能使用在丢失一个包的情况下,如果出现丢失多个包就不能使用纠错机制了,只能使用重传的方式了。
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
--------------------------------------------------------------------------------
/docs/nodejs.md:
--------------------------------------------------------------------------------
1 | # NodeJs
2 |
3 | 官方文档
4 |
5 | >https://nodejs.org/en/docs/
--------------------------------------------------------------------------------
/docs/performance.md:
--------------------------------------------------------------------------------
1 | #
2 | # 衡量Web性能的几个指标
3 |
4 | 
5 |
6 | **LCP**
7 |
8 | 大内容绘制时间 < `2.5s`,最长不能超过`4s`
9 |
10 | **FID**
11 |
12 | 首次输入延迟时间 < `100ms`,最长不能超过`300ms`
13 |
14 | **CLS**
15 |
16 | CLS得分 < `0.1`,最高不能超过`0.25`
17 |
18 | CLS = 元素在连续两帧相对于视口移动的位置百分比(distance fraction) * 元素在连续两帧内相对于视口的可见区域的总和(impact fraction)
19 |
20 | ```text
21 | CLS = impact fraction * distance fraction
22 | ```
23 |
24 | **TTI**
25 |
26 | Time to Interactive : 页面完成渲染后,用户能够立马交互的时间。
27 |
28 | **TBT**
29 |
30 | Total Blocking Time : 从FCP到TTI总的阻塞时间。
31 |
32 | **FCP**
33 |
34 | 从页面开始加载到有内容显示出来的时间
35 |
36 | # 如何优化
37 |
38 | * 避免阻塞的JavaScript文件引入
39 | * 精简css样式的书写,减少不必要的解析、移出不被使用的css、使用css预加载
40 | * 缩短服务端响应时间,减少网络请求次数
41 | * 尽量避免重定向带来的页面重新加载
42 | * 避免不必要的大资源`preload`
43 | * 使用缓存
44 | * 避免深层的dom嵌套
45 |
46 |
47 |
48 | # 性能监控
49 |
50 | **Lighthouse 生成指标测试报告**
51 |
52 | **PerformanceObsever API 性能指标监控**
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/docs/plugins/putOnRecord.js:
--------------------------------------------------------------------------------
1 | // 备案
2 | var defaultOptions = {
3 | ICP: "",
4 | NISMSP: {
5 | number: "",
6 | url: "",
7 | },
8 | }
9 | //
${defaultOptions.NISMSP.number}
10 | // Docsify plugin functions
11 | function plugin(hook, vm) {
12 | hook.afterEach(function (html, next) {
13 |
14 | //add html string
15 | next(
16 | html +
17 | `
18 |
19 |
35 | `
36 | )
37 | })
38 | }
39 |
40 | // Docsify plugin options
41 | window.$docsify["beian"] = Object.assign(
42 | defaultOptions,
43 | window.$docsify["beian"]
44 | )
45 | window.$docsify.plugins = [].concat(plugin, window.$docsify.plugins)
--------------------------------------------------------------------------------
/docs/react.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # React技术栈
4 |
5 | # React
6 |
7 | ## React生命周期
8 |
9 | ### React 15生命周期
10 |
11 | 
12 |
13 | ### React 16+生命周期
14 |
15 | **1、挂载阶段**
16 |
17 | - constructor()
18 |
19 | - getDerivedStateFromProps()
20 | - render()
21 | - componentDidMount()
22 |
23 | 2、**更新阶段**
24 |
25 | props改变、state改变、调用foreUpdate方法这三种情况组件会发生更新。
26 |
27 | - getDerivedStateFromProps()
28 | - shouldComponentUpdate()
29 | - render()
30 | - getSnapshotBeforeUpdate()
31 | - componentDidUpdate()
32 |
33 | **3、卸载**
34 |
35 | - componentWillUnmount()
36 |
37 | 
38 |
39 | > https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/
40 |
41 | ### React16+ 移除的生命周期
42 |
43 | 由于fiber架构更新组件的任务是可以被中断的,这样就会导致生命周期方法被多次调用执行。
44 |
45 | React 16 + 移除了`componentWillMount`、`componentWillReceiveProps`,并使用静态方法
46 |
47 | `static getDerivedStateFromProps(props, state)`替代。
48 |
49 | 移除`componentWillUpdate` 使用静态方法 `getSnapshotBeforeUpdate`替代
50 |
51 |
52 |
53 | ## React Fiber原理
54 |
55 | ### **React Fiber架构分为3层**
56 |
57 | * 虚拟dom:描述页面
58 | * Reconciler:调用生命周期,进行diff计算
59 | * Renderer:根据不同的平台渲染出响应的页面
60 |
61 | ### Fiber特性
62 |
63 | * Fiber更新是可中断的
64 | * 优先级
65 |
66 | ### Reconciler 执行阶段
67 |
68 | #### 1、Reconciliation阶段
69 |
70 | 生成fiber树得到更新节点的信息,这个阶段可打断
71 |
72 | #### 2、commit阶段
73 |
74 | 将需要更新的节点进行批量更新,这个阶段不可打断
75 |
76 | ### 优先级的任务调度
77 |
78 | * synchronous:同步执行(首屏、首次渲染)
79 | * task : 由浏览器空闲时间调度(requestIdleCallBack)
80 | * animation : 下一帧之前执行
81 | * hight : 不久的将来执行
82 | * low : 表示优先级低,延迟执行
83 | * offscreen : 下一次render,或者scroll (滚动) 的时候执行
84 |
85 | ## React 源码分析
86 |
87 | React完成一次渲染调用的方法栈。从render到appendChildToContainer方法React完成首次渲染。
88 |
89 | ### 渲染主流程方法分析
90 |
91 | - render()
92 |
93 | - legacyRenderSubtreeIntoContainer()
94 |
95 | - unbatchedUpdates()
96 |
97 | - updateContainer()
98 |
99 | - scheduleUpdateOnFiber()
100 |
101 | - performSyncWorkOnRoot()
102 |
103 | - commitRoot()
104 |
105 | - runWithPriority$1()
106 |
107 | - Scheduler_runWithPriority()
108 |
109 | - unstable_runWithPriority()
110 |
111 | - commitRootImpl()
112 |
113 | 首次初始化nextEffect
114 |
115 | - invokeGuardedCallback()
116 |
117 | - invokeGuardedCallbackImpl$1()
118 |
119 | react 通过invokeGuardedCallbackImpl方法自定义事件来更新dom。
120 |
121 | ```javascript
122 | var evtype = 'react-event-callback';
123 | var react = document.createElement('react');
124 | react.addEventListener(evtype, function (e) {
125 | console.log('call Back');
126 | });
127 | var ev = document.createEvent('Event');
128 | ev.initEvent(evtype, false, false);
129 | react.dispatchEvent(ev);
130 | ```
131 |
132 | - invokeGuardedCallbackDev()
133 |
134 | 自定义事件实现dom更新
135 |
136 | - callCallback()
137 |
138 | - commitMutationEffects()
139 |
140 | nextEffect
141 | 循环取nextEffect不为空的情况,更新容器。
142 |
143 | - commitPlacement()
144 |
145 | - getHostParentFiber()
146 |
147 | - insertOrAppendPlacementNodeIntoContainer()
148 |
149 | - appendChildToContainer()
150 |
151 | ## Component与PureComponent
152 |
153 | PureComponent内部实现了shouldComponentUpdate函数来对props和state进行浅对比来决定是否渲染更新组件。
154 |
155 | component则会直接更新,或者自行实现shouldComponentUpdate来决定是否渲染更新。
156 |
157 | *如果父组件不是纯组件,子组件是纯组件。子组件的props的值与上一次一样时,还是会更新子组件。*
158 |
159 | *难道props指的是纯组件传给子组件的props?*
160 |
161 |
162 |
163 | ## 纯组件
164 |
165 | 使用props与state的浅对比用于是否更新数据;
166 |
167 | PureComponent:用于class组件;
168 |
169 | React.memo:用于函数式组件
170 |
171 |
172 |
173 | ## useMemo & useCallback & memo
174 |
175 | React数据的更新会导致整个组件重新发生渲染,使用这三个API是为了优化性能避免组件、数据和声明的函数造成不必要的更新。
176 |
177 | 只有第二个参数中的数组中的变量发生改变时才会回调更新。
178 |
179 | ```javascript
180 | useMemo(()=>fn,[a,b,c]);用来缓存数据与React.memo()搭配使用
181 | React.memo();用来缓存组件
182 | userCallback(fn,[a,b,c]);用来缓存函数
183 | ```
184 |
185 |
186 |
187 | ## 多层组件传值Context
188 |
189 | ```react
190 | //组件外
191 | const Context = React.createContext({});
192 |
193 | //组件内
194 |
195 |
196 |
197 |
198 |
199 | //子组件中
200 |
201 | {
202 | value=>(
203 |
204 | )
205 | }
206 |
207 |
208 | //函数式组件中
209 | //使用了该hook的函数组件,Context的值一但修改就会更新渲染该组件
210 | const value = React.useContext(Context);
211 |
212 | ```
213 |
214 |
215 |
216 |
217 |
218 | ## 其他
219 |
220 | ### 1、React 17中为什么要把事件的绑定从document到root元素?
221 |
222 | 如果把事件绑定到document中,就算调用`stopPropagation()`仍然会触发` document.addEventListener();`
223 |
224 | ```react
225 | class App extends React.Component {
226 | componentDidMount() {
227 | document.addEventListener("click", this.handleClickOnDocument);
228 | window.addEventListener("click", this.handleClickOnWindow);
229 | }
230 |
231 | componentWillUnmount() {
232 | document.removeEventListener("click", this.handleClickOnDocument);
233 | window.removeEventListener("click", this.handleClickOnWindow);
234 | }
235 |
236 | handleClickOnDocument = e => {
237 | console.log("handling event on document");
238 | };
239 |
240 | handleClickOnWindow = e => {
241 | console.log("handling event on window");
242 | };
243 |
244 | render() {
245 | return (
246 | console.log("handling event on div")}>
247 |
254 |
255 | );
256 | }
257 | }
258 | ```
259 |
260 | **Output:**
261 |
262 | `handling event on document`
263 |
264 | # redux
265 |
266 | ## redux执行原理
267 |
268 | 1、用户在进行操作,通过dispatch触发action
269 |
270 | 2、action找到对应的reducer获取新的状态值
271 |
272 | 3、将新的状态更新到store , store通知页面渲染
273 |
274 | # mobx
275 |
276 | ## mobx执行原理
277 |
278 | 1、通过action去触发数据更新
279 |
280 | 2、action修改mobx的状态数据
281 |
282 | 3、状态更新后,computed计算属性也会根据依赖重新计算属性值
283 |
284 | 4、状态更新完成后出发reaction从而更新页面数据
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
--------------------------------------------------------------------------------
/docs/typescript.md:
--------------------------------------------------------------------------------
1 | # TypeScript
2 |
3 |
4 |
5 | # TS中数据类型
6 |
7 | 原生类型:number、boolean、undefined、null、symble、bigInt
8 |
9 | 特殊类型:any、unknow、void、never
10 |
11 | 其他:元组类型、enum、泛型、交叉类型、联合类型
12 |
13 |
14 |
15 | ### any与unknow
16 |
17 | * any表示任何类型都行
18 |
19 | * unknow表示未知的类型,在使用时会做类型检查
20 |
21 | ```typescript
22 | function f1(a: any) {
23 | a.b(); // OK
24 | }
25 | function f2(a: unknown) {
26 | a.b();//报错,Object is of type 'unknown'.
27 | }
28 | ```
29 |
30 |
31 |
32 | # interface & type
33 |
34 | * `type`与interface的作用几乎一样,但`type`能够给类型再添加一个别名。
35 |
36 | * `type`无法重新声明追加属性。
37 |
38 | 
39 |
40 |
41 |
42 | # TS值得注意的点
43 |
44 | 1、接口可以继承接口,并且是多继承。接口不能实现接口(接口本身就是被实现的)
45 |
46 | ```typescript
47 | interface Colorful {
48 | color: string;
49 | }
50 |
51 | interface Circle {
52 | radius: number;
53 | }
54 |
55 | interface ColorfulCircle extends Colorful, Circle {}
56 |
57 | const cc: ColorfulCircle = {
58 | color: "red",
59 | radius: 42,
60 | };
61 | ```
62 |
63 | 2、类的继承是必须单继承。
64 |
65 | 3、类可以直接实现类。
66 |
67 | 4、public、private、protected不能用来修饰类。可以用来修饰类的属性,方法。
68 |
69 | 5、抽象类不能被实例化
70 |
71 | ```typescript
72 | abstract class Base {
73 | abstract getName(): string;
74 |
75 | printName() {
76 | console.log("Hello, " + this.getName());
77 | }
78 | }
79 |
80 | const b = new Base();//Cannot create an instance of an abstract class.
81 | ```
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
--------------------------------------------------------------------------------
/docs/v8.md:
--------------------------------------------------------------------------------
1 | # V8原理
2 |
3 | How JavaScript works
4 |
5 | > https://blog.sessionstack.com/tagged/tutorial
6 |
7 | V8 blog
8 |
9 | > https://v8.dev/blog
10 |
11 |
--------------------------------------------------------------------------------
/docs/vue.md:
--------------------------------------------------------------------------------
1 | # vue技术栈
2 |
3 |
4 |
5 | # vue
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | # vuex
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | # vue-router
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tech-doc",
3 | "version": "1.0.0",
4 | "description": "前端技术栈",
5 | "main": "index.js",
6 | "directories": {
7 | "doc": "docs"
8 | },
9 | "scripts": {
10 | "start":"docsify serve docs",
11 | "test": "echo \"Error: no test specified\" && exit 1"
12 | },
13 | "repository": {
14 | "type": "git",
15 | "url": "git+https://github.com/coralf/tech-doc.git"
16 | },
17 | "keywords": [],
18 | "author": "",
19 | "license": "ISC",
20 | "bugs": {
21 | "url": "https://github.com/coralf/tech-doc/issues"
22 | },
23 | "homepage": "https://github.com/coralf/tech-doc#readme"
24 | }
25 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 |
--------------------------------------------------------------------------------