..
17 | ```
18 |
19 | 块级元素和行内元素的区别:
20 |
21 | 1. 块级元素独占一行,块级元素内可嵌套部分块级元素,而行内元素不能嵌套块级元素
22 | 2. 块级元素可设置 margin、padding,但是行内元素只有 margin-left/right 和 padding-left/right 有效
23 | 3. 块级 display:block;行内:display:inline(行内块:display: inline-block)
24 |
25 | ## 参考资料
26 |
27 | - [前端面试-HTML 篇](https://github.com/PDKSophia/blog.io/blob/master/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95-HTML%E7%AF%87.md)
28 |
--------------------------------------------------------------------------------
/docs/Basic/JQuery/如何设计一个JS插件.md:
--------------------------------------------------------------------------------
1 | # 如何设计一个 JS/jQuery 插件
2 |
3 | ## 前言
4 |
5 | 许多开源库都有插件系统,例如:Vue、JQuery、Gatsby。插件是库和框架的一个常见特性,用于运行开发人员以一种安全、可伸缩的方式添加工鞥呢。那么怎么构建一个插件系统?让我们用 JS 构建一个自己的插件系统来回答这个问题
6 |
7 | ## 参考资料
8 |
9 | - [如何动手写一个 JQuery 插件](http://i5ting.github.io/How-to-write-jQuery-plugin/build/jquery.plugin.html#1)
10 | - [设计一个 JS 插件系统](https://juejin.cn/post/6871077497044205575)
11 | - [如何设计一个 JavaScript 插件系统,编程思维比死磕 API 更重要](https://zhuanlan.zhihu.com/p/231848209?utm_source=wechat_session&utm_medium=social&utm_oi=56197411504128&utm_content=sec)
12 | - [循序渐进,如何优雅地编写一个高逼格的JS插件?](https://mp.weixin.qq.com/s/9s1GrxMonMuKGpWU4Jm3SQ)
13 |
--------------------------------------------------------------------------------
/docs/Basic/JQuery/手写jQuery.md:
--------------------------------------------------------------------------------
1 | # 手写jQuery
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | 项目描述:通过分析jQuery源码,封装一个jQuery。1. 支持jQuery对象极联调用如 $('body').addClass().addClass();2. 支持静态方法调用$.get()。通过项目能学到
10 |
11 | 1. 面向对象、原型等知识极其深度的应用,让基本功更坚实
12 | 2. 学习代码封装技巧
13 |
--------------------------------------------------------------------------------
/docs/Basic/JQuery/阅读源码.md:
--------------------------------------------------------------------------------
1 | # 阅读源码-JQuery
2 |
3 | ## 参考资料
4 |
5 | - [【深入浅出 jQuery】源码浅析--整体架构](https://github.com/chokcoco/cnblogsArticle/issues/3)
6 | - [前端 JQuery 系列](https://github.com/JsAaron/jQuery)
7 |
--------------------------------------------------------------------------------
/docs/Basic/JQuery/高效jQuery.md:
--------------------------------------------------------------------------------
1 | # 高效 jQuery 的奥秘
2 |
3 | ## 参考资料
4 |
5 | - [高效 jquery 的奥秘](https://justjavac.com/javascript/2013/11/25/writing-better-jquery-code.html)
6 |
--------------------------------------------------------------------------------
/docs/Basic/index.md:
--------------------------------------------------------------------------------
1 | # 前端基础知识点
2 |
3 | 前端除了学最重要的 JavaScript 外,还需要学习 [HTML](/Basic/HTML/) 和 [CSS](/Basic/CSS/),老一派的后端也许都接触过 [JQuery](/Basic/JQuery/)
4 |
--------------------------------------------------------------------------------
/docs/Browser/BOM.md:
--------------------------------------------------------------------------------
1 | # 浏览器对象模型(BOM)
2 |
3 | 浏览器对象模型(BOM)
4 |
5 |
6 |
7 |
8 |
9 | ## navigator
10 |
11 | **`Geolocation.getCurrentPosition()`** 方法用来获取设备当前位置
12 |
13 | [api文档](https://developer.mozilla.org/zh-CN/docs/Web/API/Geolocation/getCurrentPosition)
14 |
15 | ```javascript
16 | navigator.geolocation.getCurrentPosition(pos => console.log(pos), pos => console.log('err', pos))
17 | ```
18 |
19 | js 获取浏览的版本
20 |
21 | ```
22 | navigator.userAgent
23 | ```
24 |
25 |
--------------------------------------------------------------------------------
/docs/Browser/DOM.md:
--------------------------------------------------------------------------------
1 | # 文档对象模型(DOM)
2 |
3 | 文档对象模型(DOM)
4 |
--------------------------------------------------------------------------------
/docs/Browser/index.md:
--------------------------------------------------------------------------------
1 | # 浏览器总纲导航
2 |
3 | 上升到一万米的高空,俯视整个浏览器,你能看到高山,也能看到沟壑。
4 |
5 | 我们不仅要知道每一座山叫什么,而且要对山中有多少人有所了解,甚至可以看看动植物的生活状态。
6 |
7 | ## 从宏观角度看,浏览器是由什么组成?
8 |
9 | 我们要弄明白浏览器的各种特性,必须从它是什么,由什么组成入手。它是我们了解浏览器世界的基石。
10 |
11 | ## 在浏览器地址栏输入 URL 到页面现实,浏览器到底发生了什么?
12 |
13 | 从输入那一刻,我们会在浏览器本地内存中查数据,当它发送 HTTP 请求后,就与 HTTP 世界有了一层交流,在 HTTP 世界里,命令经过 DNS 解析,缓存,有可能还会进行 301 重定向。。。
14 |
15 | 它们之间的世界如下所示:
16 |
17 | 
18 |
19 | 最后返回浏览器拿到 HTTP 世界返回的数据,通过渲染引擎渲染页面
20 |
21 | 因为渲染加载能影响用户体验,所以这一块的回流与重绘要格外注意,同样,也是考点之一
22 |
23 | ## 浏览器内核
24 |
25 | 如果我们知道了浏览器是由什么组成,我们会对其中的渲染进程刚到好奇。渲染进程也就是我们所说的浏览器内核...
26 |
27 | ## 事件循环的理解
28 |
29 | 宏任务和微任务
30 |
31 | 浏览器中的事件循环
32 |
33 | Node 中的事件循环(暂时不写)
34 |
35 | ## V8 工作原理
36 |
37 | 垃圾回收:如何自动回收?
38 |
39 | ...
40 |
41 | ## 对跨域的理解
42 |
43 | 介绍浏览器跨域
44 |
45 | 介绍同源策略
46 |
47 | CORS 如何设置,JSONP 为什么不支持 post,JSONP 方案后端需要怎么配合,Ajax 跨域前端需要设置什么
48 |
49 | localStorage 与 cookie
50 |
51 | ## 定时器的理解
52 |
53 | 定时器是怎么实现的
54 |
55 | 定时器为什么是不准确的
56 |
57 | 用 setTimeout 模拟 setInterval
58 |
59 | ## 其他
60 |
61 | 防抖和节流
62 |
63 | 如何系统优化页面
64 |
65 | ## 本章与 HTTP 章的联动
66 |
67 | HTTP 缓存
68 |
69 | 三次握手,四次挥手(HTTP 方面的内容)
70 |
--------------------------------------------------------------------------------
/docs/Browser/localStorage.md:
--------------------------------------------------------------------------------
1 | # localStorage
2 |
3 | localStorage 与 sessionStorage 与 cookie 的对比
4 |
5 | 在一个网站上存 localStorage ,在同一台电脑上操作,如果让他保持会话。不知道是不是这个问题,有一次平安面试的时候遇到过,然后不会答
6 |
7 | 你有提到白屏时间,有什么办法可以减少吗?都是什么原理
8 |
9 | 答案: GZIP,SSR 同构、PWA 应用、预渲染、localStorage 缓存 js 文件等、
10 |
11 | ## 参考资料
12 |
13 | - [一种简单无副作用的同源跨页面数据同步方案](https://mp.weixin.qq.com/s?__biz=MzI0NTE5NzYyMw==&mid=2247483801&idx=1&sn=390c7900b227e0dd1d5727878cff34ec&chksm=e9537fc1de24f6d70c25695e7f32b4b713ab2fef42ea5d24b4a5b6a6768006d365b7e459b8d3&mpshare=1&scene=1&srcid=&sharer_sharetime=1571583079156&sharer_shareid=778ad5bf3b27e0078eb105d7277263f6#rd)
14 | - [如何给 localStorage 设置一个有效期?](https://www.javascriptc.com/112.html?from=groupmessage&isappinstalled=0)
15 |
--------------------------------------------------------------------------------
/docs/Browser/webworker和websocket.md:
--------------------------------------------------------------------------------
1 | # Web Worker 和 Web Socket
2 |
3 | HTML5 有两个新特性,Web Worker 和 Web Socket
4 |
5 |
6 |
7 |
8 |
9 | ## Web Worker
10 |
11 | Web Worker 允许 Web 应用程序创建后台线程来执行耗时的任务,而不会阻塞主线程的执行,它有以下特点:
12 |
13 | - 独立线程运行:浏览器提供一个子线程,可单独执行,不会阻塞主线程的执行
14 | - 通信机制:Web Worker 与主线程之间通过消息传递的方式通信。主线程可以向 Worker 发送数据,Worker 也可以向主线程发送数据
15 | - 数据隔离:Web Worker 运行在独立的线程,不能访问 DOM 等主线程专有的资源,可以避免 Worker 对主线程造成干扰
16 | - 种类:HTML5 标准定义了两种 Web Worker,分别是 Dedicated Worker 和 Shared Worker。前者仅能被创建它的页面使用,后者可以被多个页面共享
17 |
18 | 应用场景:
19 |
20 | - 图像处理和数据分析:耗时的计算任务放在 Worker 中执行,保持主线程的流畅
21 | - 网路请求:使用 Worker 执行网络请求,避免阻塞主线程
22 | - 离线缓存和数据存储:Worker 可以在后台执行数据的缓存和持久化操作
23 |
24 |
25 |
26 |
27 |
28 | ## Web Socket
29 |
30 | Web Socket 是一种网络通信协议,它提供了浏览器与服务器之间的双向通讯通道,相比传统的 HTTP 协议,Web Socket 具有以下特点:
31 |
32 | - 持久连接
33 | - 双向通信
34 | - 实时性
35 |
36 | 应用场景:实时聊天、实时推送、协同编辑、游戏和物联网
37 |
38 |
39 |
40 | ## 总结
41 |
42 | Web Worker 作用于浏览器,名为 Web 工人,它是为了让页面渲染更流畅而出的一个特性,把复杂的计算、耗时的网络请求放在 Worker 线程上,避免长时间的卡顿。当数据计算、请求有结果后给主线程,主线程拿到数据后直接渲染即可
43 |
44 | Web Socket 作用于客户端(浏览器端)和服务器端,没 Socket 之前客户端只能请求服务端,服务端只能接受客户端的请求。有了 Socket 之后,服务端可以请求客户端,实现双向通讯
45 |
--------------------------------------------------------------------------------
/docs/Browser/web安全.md:
--------------------------------------------------------------------------------
1 | # web 安全
2 |
3 | 只要讲以下几点攻击方式:XSS 攻击、CSRF 攻击、SQL注入、点击劫持以及 URL 跳转漏洞
4 |
5 | 在阅读本文之前,先试着问自己以下几个面试题:
6 |
7 | > 1.前端有哪些攻击方式?
8 | >
9 | > 2.什么是XSS攻击?XSS攻击有几种类型?如果防范XSS攻击?
10 | >
11 | > 3.什么是CSRF攻击?如何防范CSRF攻击
12 | >
13 | > 4.如何检测网站是否安全?
14 |
15 | ## XSS攻击
16 |
17 | XSS 攻击,即跨站脚本攻击(Cross-Site Scripting),攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。
18 |
19 | XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。
20 |
21 | 根据攻击的来源,XSS攻击可以分为反射型(非持久型)、存储型(持久性)和DOM型三种
22 |
23 | ### 反射型XSS
24 |
25 | ### 存储型XSS
26 |
27 | ### DOM 型 XSS
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | ## CSRF攻击
38 |
39 | CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | ## SQL注入
48 |
49 | 漏洞危害:
50 |
51 | - 可导致数据库被拖
52 | - 重要信息泄露
53 | - 上传webshell
54 | - 执行系统命令,进而控制服务器
55 |
56 | 之所以会发生SQL注入,主要因为代码中存在拼接SQL语句的情况。比如:
57 |
58 | ## 点击劫持
59 |
60 | 点击劫持是指在一个Web页面中隐藏了一个透明的iframe,用外层假页面诱导用户点击,实际上是在隐藏的frame上触发了点击事件进行一些用户不知情的操作。
61 |
62 |
63 |
64 | ## URL跳转漏洞
65 |
66 |
67 |
68 |
69 |
70 | ## 参考资料
71 |
72 | - [【面试篇】寒冬求职之你必须要懂的 Web 安全](https://github.com/YvetteLau/Blog/issues/29)
73 | - [XSS网络攻击 - 原理,类型和实践](https://www.bilibili.com/video/BV1rg411v7B8)
74 | - [跨站请求伪造CSRF攻击的原理以及防范措施](https://www.bilibili.com/video/BV1UH4y1M7Dg)
75 |
--------------------------------------------------------------------------------
/docs/Browser/事件Api.md:
--------------------------------------------------------------------------------
1 | # 事件 Api
2 |
3 | ## 参考资料
4 |
5 | - [【JS】你所忽略掉的事件基础 才是最重要的](https://mp.weixin.qq.com/s?__biz=MzkwODIwMDY2OQ==&mid=2247488428&idx=1&sn=cdf6ffbfdec44616b5a493905785f6a1&source=41#wechat_redirect)
6 |
--------------------------------------------------------------------------------
/docs/Browser/回流与重绘.md:
--------------------------------------------------------------------------------
1 | # 回流与重绘
2 |
3 |
4 |
5 |
6 |
7 | **重绘**是指当页面中元素的样式发生改变(如颜色、阴影、边框等)而不影响它在文档流中的位置时,浏览器会对这些元素进行重新绘制,这个过程称为重绘
8 |
9 | **回流**是指页面中元素的尺寸、结构或某些属性发生改变时,浏览器需要重新计算元素的大小和位置,然后再重新渲染页面的过程
10 |
11 | 回流必定会触发重绘,但重绘不一定会引起回流
12 |
13 | 触发回流的常见情况包括:
14 |
15 | - 添加或者删除可见的 DOM 元素
16 | - 元素位置/尺寸/内容发声改变
17 | - 浏览器窗口大小发生变化
18 | - 应用 CSS 样式的改变
19 |
20 | 引起回流的样式改变:
21 |
22 | - 改变元素的尺寸(width、height、padding、margin等)
23 | - 改变元素位置(top、left、right、bottom等)
24 | - 改变元素显示(display:none)
25 | - 添加或删除可见的 DOM 元素
26 | - 改变元素字体
27 | - 改变浏览器窗口大小
28 |
29 | 引起重绘的样式改变:
30 |
31 | - 改变元素颜色
32 | - 改变元素背景颜色
33 | - 改变元素阴影
34 | - 改变元素边框
35 |
36 | 所以在页面优化优性能时,我们应该尽量减少触发回流的操作,一些常见的优化手段:
37 |
38 | - 批量修改DOM(Render 的批处理也会如此考虑的)
39 | - 使用 transform 代替 top/left
40 | - 使用 visibility 代替 `display:none`
41 | - 尽量减少不必要的样式改变
42 | - 将颜色、背景颜色、边框等发生重绘的样式写在 CSS 样式的前头
43 |
--------------------------------------------------------------------------------
/docs/Browser/渲染机制.md:
--------------------------------------------------------------------------------
1 | # 浏览器渲染机制
2 |
3 | 在面试中我们常遇到这样的一个问题:从输入 url 到页面展示这一过程(浏览器)做了什么?
4 |
5 | ## 渲染机制
6 |
7 | 1.处理 HTML 并构建 DOM 树
8 |
9 | 2.处理 CSS 构建 CSSOM 树
10 |
11 | 3.将 DOM 与 CSSOM 合并成一个渲染树
12 |
13 | 4.根据渲染树来布局,计算每个节点的位置
14 |
15 | 5.调用 GPU 回执,合成图层,显示在屏幕上
16 |
17 | ## 重绘(Repaint)和回流(Reflow)
18 |
19 | 回流必定会发生重绘,重绘不一定会引发回流。回流所需的成本比重绘高的多,
20 |
21 | 导致性能问题:
22 |
23 | - 改变 window 大小
24 | - 改变字体
25 | - 添加或删除样式
26 | - 文字改变
27 | - 定位或者浮动
28 | - 盒模型
29 |
30 | ## 什么会引起回流
31 |
32 | 1.页面渲染初始化
33 |
34 | 2.DOM 结构改变,比如删除了某个节点
35 |
36 | 3.render 树变化,比如减少了 padding
37 |
38 | 4.窗口的 resize
39 |
40 | ## 参考资料
41 |
42 | - [浏览器的渲染原理简介](https://coolshell.cn/articles/9666.html)
43 | - [前端工程师需要掌握的浏览器渲染笔记](https://mp.weixin.qq.com/s/ngBL8d9Rxw2iCYMbKw_M-w)
44 | - [浏览器合成与渲染层优化](https://mp.weixin.qq.com/s?__biz=MzI5NjIzNjA1Nw==&mid=2247483752&idx=1&sn=f8e2550e73127177aaaac0ee107557ca&chksm=ec46241edb31ad08ad5d4807011365664e703abc4ec766a4fb8b8d49637b028de005d7767756&mpshare=1&scene=1&srcid=&sharer_sharetime=1571358925480&sharer_shareid=778ad5bf3b27e0078eb105d7277263f6#rd)
45 | - [渲染树的形成原理你真的很懂吗?](https://mp.weixin.qq.com/s?__biz=MzUxNzk1MjQ0Ng==&mid=2247484397&idx=1&sn=47283dba1a4c1db938810db0af2cde78&chksm=f991053ccee68c2a918f1fbf9cee012de3e4c593e559ce9e9d7090e30dc73af0f43cad57b72f&mpshare=1&scene=1&srcid=&sharer_sharetime=1572220890411&sharer_shareid=778ad5bf3b27e0078eb105d7277263f6#rd)
46 |
--------------------------------------------------------------------------------
/docs/Browser/面试题/index.md:
--------------------------------------------------------------------------------
1 | # 浏览器面试题
2 |
3 | 写点东西
4 |
--------------------------------------------------------------------------------
/docs/CSBasic/TCP的那些事儿.md:
--------------------------------------------------------------------------------
1 | # TCP 的那些事儿
2 |
3 | 应用层
4 |
5 | 表示层
6 |
7 | 会话层
8 |
9 | 传输层(Transport 层)
10 |
11 | 网络层(Network 层)
12 |
13 | 数据链路层(Data Link 层)
14 |
15 | 物理层
16 |
17 | 在第二层上的数据,我们叫 Frame,在第三层上的数据叫 Packet,第四层的数据叫 Segment
18 |
--------------------------------------------------------------------------------
/docs/CSBasic/index.md:
--------------------------------------------------------------------------------
1 | # 计算机基础导航
2 |
3 | [计算机的起源](./计算机的起源.md)
4 |
5 | [计算机的组成](./计算机的组成.md)
6 |
--------------------------------------------------------------------------------
/docs/CSBasic/从传纸条轻松学习到基础网络概念.md:
--------------------------------------------------------------------------------
1 | # 从传纸条轻松学习到基础网络概念
2 |
3 | ## 参考资料
4 |
5 | - [从传纸条轻松学习到基本网络概念](https://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651234302&idx=1&sn=13cbc951dc746e50490b0ac964fec5b9&chksm=bd49467a8a3ecf6cd6fb160faddaf1bfac76c3c15453359bc00a39b0095fefaca63e612cc968&mpshare=1&scene=1&srcid=&sharer_sharetime=1571440541730&sharer_shareid=778ad5bf3b27e0078eb105d7277263f6#rd)
6 |
--------------------------------------------------------------------------------
/docs/CSBasic/传输层.md:
--------------------------------------------------------------------------------
1 | # 创输层
2 |
3 | 概述: 管理端到端的通信连接
4 |
5 | 虚拟的互连网络
6 |
7 | 进程与进程的通信
8 |
9 | 跨设备 跨网络
10 |
11 | 使用端口(Port)来标记不同的网络进程
12 |
13 | 端口(Port)使用比特位表示(0~65535)
14 |
15 | | FTP | HTTP | HTTPS | DNS | TELNET |
16 | | --- | ---- | ----- | --- | ------ |
17 | | 21 | 80 | 443 | 53 | 23 |
18 |
--------------------------------------------------------------------------------
/docs/CSBasic/大话计算机基础硬核知识.md:
--------------------------------------------------------------------------------
1 | # 大话计算机基础硬核知识
2 |
3 | 大话计算机基础硬核知识
4 |
5 | ## 参考资料
6 |
7 | - [大话计算机基础硬核知识](https://mp.weixin.qq.com/s?__biz=MjM5NTk4MDA1MA==&mid=2458073184&idx=2&sn=8c72748bc8b9658a3bf5e003774e586a&chksm=b187ae1d86f0270b35eb9f8ab2ac2b3a10f50cf8ba500551696bc2358d5e3acb826893a26531&mpshare=1&scene=1&srcid=&sharer_sharetime=1579308245137&sharer_shareid=778ad5bf3b27e0078eb105d7277263f6#rd)
8 |
--------------------------------------------------------------------------------
/docs/CSBasic/编程必备基础知识.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 | 1946——1957 电子管计算机
42 |
43 | 1957——1964 晶体管计算机
44 |
45 | 1964——1980 集成电路计算机
46 |
47 | 1980——至今 超大集成电路计算机
48 |
49 | #### 电子管计算机
50 |
51 | 二极管
52 |
53 | 第二次世界大战是电子管计算机产生的催化剂
54 |
55 | 英国为了解密德国海军的密文
56 |
57 | ps:我觉得可以看看卷福演的《模仿游戏》,讲的就是这件事情,图灵的伟大
58 |
59 | 电子管计算机——埃尼阿克(ENIAC),18000 多个电子管,运行耗电量 150 千瓦,重达 30 村,占地 1500 平方英尺
60 |
--------------------------------------------------------------------------------
/docs/CSBasic/计算机中的三大件.md:
--------------------------------------------------------------------------------
1 | # 计算机中的三大件
2 |
3 | 1.CPU
4 | 中央处理器,是一块超大规模的集成电路
5 | 负责处理数据/计算 2.内存
6 | 临时 存储数据(断电后,数据会消失)
7 | 速度快
8 | 内容小(单位价格高) 3.硬盘
9 | 永久存储数据
10 | 速度慢
11 | 空间大(单位价格低)
12 |
--------------------------------------------------------------------------------
/docs/CSBasic/计算机的操作系统.md:
--------------------------------------------------------------------------------
1 | # 计算机的操作系统
2 |
3 | 第六章:基础篇
4 |
5 | 第七章:提升篇
6 |
7 | 第八章:综合实践
8 |
--------------------------------------------------------------------------------
/docs/CSBasic/计算机的组成.md:
--------------------------------------------------------------------------------
1 | # 计算机的组成
2 |
3 | 第二章: 概述篇
4 |
5 | 第三章:组成篇
6 |
7 | 第四章: 计算片
8 |
9 | 第五章:综合实战
10 |
--------------------------------------------------------------------------------
/docs/CSBasic/计算机的起源.md:
--------------------------------------------------------------------------------
1 | # 计算机的起源
2 |
3 | 本章分六部分,计算机的发展历程,计算机的分类,计算机的体系结构,计算机的层次与编程语言,计算机的计算单位,计算机的字符与编码集
4 |
5 | ## 计算机的发展简史
6 |
7 | ### 计算机发展的四个阶段
8 |
9 | 1946——1957 电子管计算机
10 |
11 | 1957——1964 晶体管计算机
12 |
13 | 1964——1980 集成电路计算机
14 |
15 | 1980——至今 超大集成电路计算机
16 |
17 | 
18 |
19 | #### 第一阶段:电子管计算机
20 |
21 | - 第二次世界大战是电子管计算机产生的催化剂
22 | - 埃尼阿克(ENIAC)
23 | - 产生原因:
24 | - 战争使用了飞机和火箭
25 | - 打得准则需要计算射击参数
26 | - 射击参数需要几千次运算才能计算出来
27 | - 特点:
28 | - 18000 多个电子管
29 | - 运行耗电量 150 千瓦
30 | - 重量达 30 吨,占地 1500 平方英尺
31 | - 电子管计算机的特点:
32 | - 集成度小,空间占用大
33 | - 功耗搞,运行速度慢
34 | - 操作复杂,更换程序需要接线
35 |
36 | #### 第二阶段:晶体管计算机
37 |
38 | 起因:贝尔实验室的三个科学家发明了晶体管
39 |
40 | 特点:
41 |
42 | - 集成度相对较高,空间占用相对小
43 | - 功耗相对较低,运行速度较快
44 | - 操作相对简单,交互更加方便
45 |
46 | #### 第三阶段:集成电路计算机
47 |
48 | 起因:德州仪器的工程师发明了集成电路(IC)
49 |
50 | 特点:
51 |
52 | - 计算机变得更小
53 | - 功耗变得更低
54 | - 计算速度变得更快
55 |
56 | #### 第四阶段:超大规模集成电路计算机
57 |
58 | - 一个芯片集成了上百万的晶体管
59 | - 速度更快,体积更小,价格更低
60 | - 用途更广:应用上升
61 |
62 | #### 第五阶段:未来的计算机
63 |
64 | 生物计算机:以蛋白质分子作为主要原材料
65 |
66 | 量子计算机:遵循量子力学的物理计算机
67 |
68 | ### 微型计算机的发展历程
69 |
70 | 受限于性能
71 |
72 | 摩尔定律:集成电路的性能,每 18—24 个月就会提升一倍
73 |
74 | 单核 CPU —— 多核 CPU
75 |
76 | ## 计算机的分类
77 |
78 | ## 计算机的体系结构
79 |
80 | ## 计算机的层次与编程语言
81 |
82 | ## 计算机的计算单位
83 |
84 | ### 计算机的字符与编码集
85 |
86 | #### 电子管计算机
87 |
88 | 二极管
89 |
90 | 第二次世界大战是电子管计算机产生的催化剂
91 |
92 | 英国为了解密德国海军的密文
93 |
94 | ps:我觉得可以看看卷福演的《模仿游戏》,讲的就是这件事情,图灵的伟大
95 |
96 | 电子管计算机——埃尼阿克(ENIAC),18000 多个电子管,运行耗电量 150 千瓦,重达 30 村,占地 1500 平方英尺
97 |
--------------------------------------------------------------------------------
/docs/CSBasic/计算机网络.md:
--------------------------------------------------------------------------------
1 | # 计算机网络
2 |
3 | ## 参考资料
4 |
5 | - [「计算机网络」前端必备知识,看到就是赚到系列](https://mp.weixin.qq.com/s/rKtI6sr8ahfnDxRqrGMSUA)
6 |
--------------------------------------------------------------------------------
/docs/CSBasic/计算机网络传输层篇.md:
--------------------------------------------------------------------------------
1 | # 计算机网络传输层篇
2 |
3 | 计算机网络传输层篇
4 |
--------------------------------------------------------------------------------
/docs/CSBasic/计算机网络应用层篇.md:
--------------------------------------------------------------------------------
1 | # 计算机网络应用层篇
2 |
3 | 计算机网络应用层篇
4 |
--------------------------------------------------------------------------------
/docs/CSBasic/计算机网络网络层篇.md:
--------------------------------------------------------------------------------
1 | # 计算机网络网络层篇
2 |
3 | 计算机网络网络层篇
4 |
5 | 第十章:网络层篇
6 |
--------------------------------------------------------------------------------
/docs/CSBasic/进程与线程.md:
--------------------------------------------------------------------------------
1 | # 进程(process)与线程(thread)
2 |
3 | ### 一句话解释:
4 |
5 | 进程就是应用程序创建的实例,而线程依托于进程,它是计算机最小的调度和运行单位
6 |
7 | 多线程可以并行处理任务,但是线程是不能单独存在的,它是由进程来启动和管理。那么什么又是进程呢?
8 |
9 | **一个进程就是一个程序的运行实例**。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫做进程
10 |
11 | ### 进程和线程之间的关系
12 |
13 | 1. 进程中的任意一线程执行出错,都会导致整个进程的奔溃
14 | 2. 线程之间共享进程中的数据
15 | 3. 当一个进程关闭之后,操作系统会回收进程所占用的内存
16 | 4. 进程之间的内容相互隔离
17 |
18 | 打个比方,QQ 是应用程序,你启动 QQ,就是在操作系统中创建了一个进程。QQ 架构里有很多线程,不同线程处理不同的事情,
19 |
20 | 你启动一个 QQ,就是创建一个进程,再启动一个就是再创建进程
21 |
22 | CPU 就像一个工厂,进程就像一个车间,线程就好比车间里的工作。一个进程可以包含多个线程
23 |
24 |
--------------------------------------------------------------------------------
/docs/DesignPattern/MVC模式与MVVM模式.md:
--------------------------------------------------------------------------------
1 | # MVC 模式与 MVVM 模式
2 |
3 | mvc 模式
4 |
5 | ## 参考资料
6 |
7 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
8 |
--------------------------------------------------------------------------------
/docs/DesignPattern/index.md:
--------------------------------------------------------------------------------
1 | # 设计模式章
2 |
3 | > 所谓设计模式,就是写代码的“套路”,而且这是针对面向对象的“套路”
4 | >
5 |
6 | JavaScript 即使面向对象语言又是函数式语言,那么你在代码中用函数式的写法来写代码,你会发现,代码是如何的简洁(以及别人看不懂时的装逼)
7 |
8 | 好的设计模型能让你对一些框架有更深层次的了解,例如 Vue 的 MVVM 模式,Koa 的洋葱模型,更甚者 JS 语言中的原型也是一种模式(原型模式),再比如我们面向对象继承时最简单的工厂模式,new 一个实例时的单例模式,再写 Mobx 作为状态管理时用到的装饰器模式等等等等
9 |
10 | 好的模式在生活中也无处不在,细心的你有发现吗?
11 |
12 | 这一章我们将模式,每一节介绍一样模式
13 |
14 | ### SOLID 设计原则
15 |
16 | > “SOLID”是由罗伯特·C·马丁在 21 世纪早期引入的记忆术手写字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则
17 |
18 | 设计原型是设计模式的指导理论,它可以帮助我们规避不良的软件设计。SOLID 指代的五个基本原则分别是:
19 |
20 | - 单一功能原则(Single Responsibility Principle)
21 | - 开放封闭原则(Opened Closed Principle)
22 | - 里式替换原则(Liskov Substitution Principle)
23 | - 接口隔离原则(Interface Segregation Principle)
24 | - 依赖反转原则(Dependency Inversion Principle)
25 |
26 | ### 设计模式的核心思想——封装变化
27 |
28 | 我们要做到是将变化造成的影响最小化——将变与不变分离,确保变化的部分灵活,不变的部分稳定
29 |
30 | ### 设计模式的“术”
31 |
32 | 所谓“术”,其实就是指二十年前 GOF 提出的最经典的 23 种设计模式。二十年前,四位程序员前辈通过《设计模式:可复用面向对象软件的基础》这本书,阐述了设计模式领域的开创性成果。
33 |
34 | ## 参考资料
35 |
36 | - [【速学速记】《设计模式》这样学就对了!](https://mp.weixin.qq.com/s/dQE7-945x_2rieyBXV46rQ)
37 |
--------------------------------------------------------------------------------
/docs/DesignPattern/原型模式.md:
--------------------------------------------------------------------------------
1 | # 原型模式
2 |
3 | ## 参考资料
4 |
5 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
6 |
--------------------------------------------------------------------------------
/docs/DesignPattern/发布订阅模式.md:
--------------------------------------------------------------------------------
1 | # 发布订阅模式
2 |
3 |
4 |
5 | 三个 API
6 |
7 | on:监听事件
8 |
9 | off:取消监听事件
10 |
11 | emit:触发事件
12 |
13 |
14 |
15 | ```javascript
16 | const eventHub = {
17 | map: {},
18 | on: (name, fn) => {
19 | eventHub.map[name] = eventHub.map[name] || []
20 | eventHub.map[name].push(fn)
21 | },
22 | emit: (name, data) => {
23 | const q = eventHub.map[name]
24 | if (!q) return
25 | q.map(f => f.call(null, data))
26 | return undefined
27 | },
28 | off: (name, fn) => {
29 | const q = eventHub.map[name]
30 | if (!q) return
31 | const index = q.indexOf(fn)
32 | if (index < 0) return
33 | q.splice(index, 1)
34 | }
35 | }
36 |
37 | eventHub.on('click', console.log)
38 | eventHub.off('click', console.error)
39 |
40 | setTimeout(() => {
41 | eventHub.emit('click', 'johnny')
42 | }, 3000)
43 | ```
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | ## 参考资料
54 |
55 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
56 |
57 | - [发布订阅模式,在工作中它的能量超乎你的想象](https://mp.weixin.qq.com/s?__biz=MzI1ODk2Mjk0Nw==&mid=2247484667&idx=1&sn=2e889204c79ff4a2076fb86190882fa4&chksm=ea016797dd76ee81a873f0e7d8b7d1cc8d11f9e840e1fcd55181ad6b858e661ed7a2b28960f1&mpshare=1&scene=1&srcid=&sharer_sharetime=1569457860757&sharer_shareid=778ad5bf3b27e0078eb105d7277263f6#rd)
58 |
--------------------------------------------------------------------------------
/docs/DesignPattern/外观模式.md:
--------------------------------------------------------------------------------
1 | # 外观模式
2 |
3 | ### 介绍
4 |
5 | 为子系统中的一组接口提供了一个高层接口
6 |
7 | 使用者使用这个高层接口
8 |
9 | ### 示例
10 |
11 | 去医院看病,接待员去挂号、门诊、划价、取药
12 |
13 | ### 场景
14 |
15 | ```javascript
16 | function bindEvent(elem, type, selector, fn) {
17 | if(fn === null) {
18 | fn = selector;
19 | selector = null
20 | }
21 | ...
22 | }
23 | // 调用
24 | bindEvent(elem, 'click', '#div1', fn)
25 | bindEvent(elem, 'click', fn)
26 | ```
27 |
28 | ## 参考资料
29 |
30 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
31 |
--------------------------------------------------------------------------------
/docs/DesignPattern/建造者模式.md:
--------------------------------------------------------------------------------
1 | # 建造者模式
2 |
3 | ## 参考资料
4 |
5 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
6 |
--------------------------------------------------------------------------------
/docs/DesignPattern/构造器模式.md:
--------------------------------------------------------------------------------
1 | # 构造器模式
2 |
3 | ## 参考资料
4 |
5 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
6 |
--------------------------------------------------------------------------------
/docs/DesignPattern/策略模式.md:
--------------------------------------------------------------------------------
1 | # 策略模式
2 |
3 | ## 参考资料
4 |
5 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
6 |
--------------------------------------------------------------------------------
/docs/DesignPattern/迭代器模式.md:
--------------------------------------------------------------------------------
1 | # 迭代器模式
2 |
3 | ## 参考资料
4 |
5 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
6 |
--------------------------------------------------------------------------------
/docs/DesignPattern/适配器模式.md:
--------------------------------------------------------------------------------
1 | # 适配器模式
2 |
3 | 适配器模式通过把一个类的接口变换成客户端所期待的另一个接口,可以帮我们解决不兼容的问题
4 |
5 | 比如 axios 等库都有适配器模式
6 |
7 | ## 参考资料
8 |
9 | - [深入设计模式](https://refactoringguru.cn/design-patterns/singleton)
10 |
--------------------------------------------------------------------------------
/docs/DevOps/index.md:
--------------------------------------------------------------------------------
1 | # 部署服务
2 |
3 |
4 |
5 | Nginx 配置
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Vue 项目打包部署总结
14 |
15 | https://mp.weixin.qq.com/s/LNor6uX1xPV4XtKjSYUOfw
16 |
17 | 2021 年当我们聊前端部署时,我们在聊什么
18 |
19 | https://juejin.cn/post/7017710911443959839
20 |
21 | 前端项目自动化部署——超详细教程(Jenkins、Github Actions)
22 |
23 | https://juejin.cn/post/6887751398499287054
24 |
25 | 前端轻量化部署脚手架实践
26 |
27 | https://mp.weixin.qq.com/s/HlrNOvkiEOdqxgMU0a7Ngw
28 |
29 | 关于前端部署的几个灵魂拷问
30 |
31 | https://mp.weixin.qq.com/s/AmCSBSjXj3CWMyWX7CmwsQ
32 |
--------------------------------------------------------------------------------
/docs/Docker/docker-compose.md:
--------------------------------------------------------------------------------
1 | # docker-compose
2 |
3 | ## 介绍
4 |
5 | 软件设计和开发,有单一职责原则。Docker 也一样,每个容器只负责一个服务
6 |
7 | 如果开发环境需要多个服务(nodejs mysql mongodb redis),就需要启动多个 Docker 容器
8 |
9 | 要连同着多个 Docker 容器,就需要 docker-compose
10 |
11 | docker-compose 解决了容器与容器之间如何管理编排的问题
12 |
13 | ## 安装
14 |
15 | 一行命令即可安装。完成之后运行 `docker-compose --version` 可以看到当前版本
16 |
17 | ## 配置文件
18 |
19 | 新建 `docker-compose.yml` 文件
20 |
21 | ```yml
22 | version: '3'
23 | services:
24 | db:
25 | image: mysql:5.7
26 | volumes:
27 | - db_data:/var/lib/mysql
28 | restart: always
29 | environment:
30 | MYSQL_ROOT_PASSWORD: somewordpress
31 | MYSQL_DATABASE: wordpress
32 | MYSQL_USER: wordpress
33 | MYSQL_PASSWORD: wordpress
34 |
35 | wordpress:
36 | depends_on:
37 | - db
38 | image: wordpress:latest
39 | ports:
40 | - '5555:80'
41 | restart: always
42 | environment:
43 | WORDPRESS_DB_HOST: db:3306
44 | WORDPRESS_DB_USER: wordpress
45 | WORDPRESS_DB_PASSWORD: wordpress
46 | volumes:
47 | db_data:
48 | ```
49 |
50 | docker-cpmpose 基本结构
51 |
52 | 
53 |
54 | ## 语法
55 |
56 | 服务(`service`):一个应用的容器,实际上可以包括若干相同镜像的容器实例
57 |
58 | 项目(`project`):由一组关联的应用容器组成的一个完整业务单元,在 `docker-compose.yml` 文件中定义
59 |
60 | `compose` 的默认管理对象是项目,通过子命令对项目的一组容器进行便捷的生命周期管理
61 |
62 |
--------------------------------------------------------------------------------
/docs/Docker/dockerfile指令.md:
--------------------------------------------------------------------------------
1 | # dockerfile
2 |
3 | ## 介绍
4 |
5 | 一个简单的配置文件,描述如何构建一个新的 image 镜像
6 |
7 | > PS:必须是 `Dockerfile` 这个文件名,必须在项目的根目录
8 |
9 | ## 语法
10 |
11 | ```dockerfile
12 | FROM node:14
13 | WORKDIR /app
14 | COPY . /app
15 |
16 | # 构建镜像时,一般用于做一些系统配置,安装必要的软件。可有多个 RUN
17 | RUN XXX
18 | RUN XXX
19 | RUN XXX
20 |
21 | # 启动容器时,只能由一个 CMD
22 | CMD XXX
23 |
24 | # 环境变量
25 | ENV K1=V1
26 | ENV K2=V2
27 | ```
28 |
29 | - `FROM`:基于什么
30 | - `WORKDIR xx` :进入工作目录
31 |
32 | - `ADD . xx` :复制文件至容器
33 |
34 | - `RUN xx ` :构建镜像时的步骤
35 |
36 | - `EXPOSE` :暴露的端口
37 |
38 | - `COPY` :复制
39 | - `VOLUME` 定义匿名数据卷
40 |
41 | > `RUN` 是构建镜像(images),CMD 是容器(container)启动
42 | >
43 | > RUN 是在 docker build
44 | >
45 | > CMD 在 docker run 时运行
46 |
47 | `CMD` 类似于 RUN 指令,用于运行程序,它最后的语法是要阻塞后台的命令
48 |
49 | ## VOLUME
50 |
51 | `VOLUME` :数据卷
52 |
53 | 作用:
54 |
55 | - 避免重要的数据,因容器重启而丢失,这是非常致命的
56 | - 避免容器不断变大
57 |
58 | 可以理解为**文件映射**
59 |
60 | 格式:
61 |
62 | ```bash
63 | VOLUME ["<路径1>", "路径2"...]
64 | ```
65 |
66 | 在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点
67 |
68 | 
69 |
70 | ## 例子
71 |
72 | ```dockerfile
73 | # base image
74 | FROM johanbo/ubuntu_node:v1
75 |
76 | # 复制文件到容器
77 | ADD . /var/www
78 |
79 | # 进入工作目录
80 | WORKDIR /var/www
81 |
82 | # 安装项目依赖包
83 | RUN npm install --registry=https://registry.npm.taobao.org
84 |
85 | # 暴露 端口
86 | EXPOSE 3010
87 |
88 | # 开始命令
89 | CMD ["pm2", "start", "app.js", "--no-daemon"]
90 |
91 | ```
92 |
--------------------------------------------------------------------------------
/docs/Docker/docker的原理.md:
--------------------------------------------------------------------------------
1 | # docker 的原理
2 |
3 | 两个关键字:namespace、cgroup
4 |
5 | - namespace:解决的问题是环境隔离问题
6 |
7 |
8 | - cgroup:解决计算机资源使用上的隔离
9 |
10 | 
11 |
12 |
13 |
14 | NameSpace
15 |
16 | - 我们知道 Linux 中的 PID、IPC、网络等资源都是全局的,而 NameSpace 机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是数据某个特定的 NameSpace,各个 NameSpace 下的资源互不干扰,这就使得每个 NameSpace 看起来像个独立的操作系统一样,但只有 NameSpace 是不够的
17 |
18 | Control groups
19 |
20 | - 虽然有了 NameSpace 技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如 CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Dokcer 采用 control groups(也就是 cgroup),有了 cgroup 就可以控制容器中进程对系统资源的消耗,比如你可以限制某个容器使用内存的上限、可以在哪些 CPU 上运行等等
21 |
22 | 主要靠两种技术,一种是看起来是隔离的技术,称为 **namespace**(命名空间)。在每个 namespace 中的应用看到的,都是不同的 IP 地址、用户空间、进程 ID 等。另一种是用起来是隔离的技术,称为 **cgroup**(网络资源限制),即命名这台机器有很多的 CPU、内存,但是一个用用只能用其中的一部分
23 |
24 |
--------------------------------------------------------------------------------
/docs/Docker/index.md:
--------------------------------------------------------------------------------
1 | # docker 导航
2 |
3 | > 道格拉斯·亚当斯的科技三定律:
4 | >
5 | > 1,任何在我出生时已经有的科技都是稀松平常的世界本来秩序的一部分;
6 | >
7 | > 2,任何在我 15-35 岁之间诞生的科技都是将会改变世界的革命性产物;
8 | >
9 | > 3,任何在我 35 岁之后诞生的科技是违反自然规律要遭天谴的!
10 |
11 | 笔者像以往一样关注着 docker,从 18 年初识 docker,到现在能自行打包上传 docker,想说 docker 确实能简便部署。本章会简单介绍一下 docker,从它的[基本介绍](./docker基本介绍.md),到[如何安装](如何安装docker.md),再到[常见命令](./docker常见命令.md),了解下 docker 的基本介绍,再来说说它的[实现原理](./docker的原理.md)。就 [dockerfile](./dockerfile指令.md) 进行讲解,以及 [docker compose](./docker-compose.md) 是什么。最后再通过实战来检验,如[构建自己的镜像](./实战:构建自己的镜像.md),[dockerfile 的最小实践](./实战:dockerfile最小实践.md),[docker-jenkins](./实战:docker-jenkins.md)
12 |
13 | ## 推荐教程/课程
14 |
15 | [方糖完免课:Docker 和容器入门](https://mian.ftqq.com/course/detail/23)
16 |
17 | [【docker 入门】10 分钟,快速学会 docker](https://www.bilibili.com/video/BV1R4411F7t9)
18 |
19 | [Docker 1 小时快速上手教程,无废话纯干货](https://www.bilibili.com/video/BV11L411g7U1?p=1)
20 |
21 | [Docker 1 小时快速上手教程,无废话纯干货文档](https://docker.easydoc.net/)
22 |
23 | [一杯茶的时间,上手 Docker](https://segmentfault.com/a/1190000022132491)
24 |
25 | [Docker — 从入门到实践](https://yeasy.gitbook.io/docker_practice/)
26 |
--------------------------------------------------------------------------------
/docs/Docker/服务器上安装docker.md:
--------------------------------------------------------------------------------
1 | # 服务器上安装 Docker
2 |
3 | 在服务器上安装 docker 、docker-compose
4 |
5 | ### 更新、安装必备软件
6 |
7 | ```bash
8 | apt-get update && apt-get install -y wget vim
9 | ```
10 |
11 | ### 非大陆 Docker 安装
12 |
13 | ```bash
14 | wget -q0- get.docker.com | bash
15 | ```
16 |
17 | ### 查看 Docker 版本
18 |
19 | ```bash
20 | docker -v
21 | ```
22 |
23 | ### 开机自动启动
24 |
25 | ```bash
26 | systemctl enable docker
27 | ```
28 |
29 | ### 卸载 Docker
30 |
31 | ```bash
32 | sudo apt-get purge docker-ce docker-ce-cli containerd.io
33 | sudo rm -rf /var/lib/docker
34 | sudo rm -rf /var/lib/containerd
35 | ```
36 |
37 | ### 非大陆 Docker-compose 安装
38 |
39 | ```bash
40 | sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
41 | ```
42 |
43 | ```bash
44 | sudo chmod +x /usr/local/bin/docker-compose
45 | ```
46 |
47 | ```bash
48 | docker-compose --version
49 | ```
50 |
51 | ### 修改 Docker 配置
52 |
53 | 以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘
54 |
55 | ```bash
56 | cat > /etc/docker/daemon.json < 真正做生意的人,只赚取有限的利润,暴利是长久不了的
4 | >
5 | > ——K 先生
6 |
7 | 在写这章时,主要参考了[《透视 HTTP 协议》](https://time.geekbang.org/column/intro/100029001)的内容。这里我只取重要的内容讲解。了解 HTTP 协议,目的是什么,了解它是为了什么?
8 |
9 | 一方面现代开发都是前后端分离,前端需要调用接口就需要了解网络请求,那多多少少需要了解 HTTP 协议。其次呢?在面试的时候我们常会遇到各种各样的 HTTP 相关问题。如果你自信了解 HTTP,不妨看看这些[面试题](./面试题/)
10 |
11 | 在我的 HTTP 世界里,必须要先了解 [HTTP 是什么](./HTTP是什么.md),知道它是什么,它有什么特点,对它有个大致的了解。其次要知道 [HTTP 的历史](./HTTP历史.md),从中了解到从协议的制定到 HTTP0.9/1.0、HTTP1.1、HTTP2.0、HTTP3.0,了解每个阶段 HTTP 协议的历史背景,从纵向角度理解网络层面的性能优化是因什么原因而优化。再然,我们就一个问题展开,那就是和[从输入 url 到看到页面发生了什么](../Browser/从url输入到返回请求的过程.md)展开,看看这道网红题究竟要考哪些知识。其中涉及到底层的[TCP/IP 协议](./TCPIP协议及网络分层模型.md)、TCP 连接时会经历[三次握手和四次挥手](./三次握手和四次挥手.md)、而发送和响应的报文内容有什么呢?它是由什么组成的?所以我们会去了解下[HTTP 的报文组成](./HTTP 报文组成.md),并且把[HTTP 状态码](./HTTP状态码.md)单独作为一节好方便自己查看状态码代表意义
12 |
13 | 我们再根据 HTTP 是不安全的协议,所以有了 [HTTPS](./HTTPS.md) ,尝试理解对称加密和非对称加密
14 |
15 | 我们还不得不提一嘴 [HTTP 缓存](./HTTP缓存.md),因为它是个对网页提速帮助很大的特性
16 |
17 | 这时,我们再去看[从输入 url 到看到页面发生了什么](../Browser/从url输入到返回请求的过程.md)。能发现这套题把所有知识点都串起来,而且还把浏览器方面的知识点做了一些补充,可谓是一石二鸟,即考察了面试者的网络方面知识、又考察了他对浏览器的理解,后续还可以衍生性能优化方面的问题
18 |
19 | 最后,我们将所有知识总结一下,总结下[网络层面的性能优化](./性能优化.md)
20 |
--------------------------------------------------------------------------------
/docs/HTTP/restful.md:
--------------------------------------------------------------------------------
1 | # RESTful
2 |
3 | ## RESTful API 是什么?
4 |
5 | ### 什么是 REST
6 |
7 | REST 的全称是 Representational state transfer
8 |
9 | - Representational:数据的表现形式(JSON、XML...)
10 | - state:当前状态或者数据
11 | - transfer:数据传输
12 |
13 | 它描述了一个系统如何与另一个交流。比如一个产品的状态(名字,详情)表现为 XML,JSON 或者普通文本
14 |
15 | REST 有六个约束:
16 |
17 | - Client—Server(客户端——服务器端)
18 | - Stateless(无状态)
19 | - Cache(缓存)
20 | - Uniform Interface(统一接口)
21 | - Layered System(分层系统)
22 | - Code-On-Demand(按需代码)
23 |
24 | ### 最佳实践
25 |
26 | #### 请求设计规范
27 |
28 | - URI 使用名词,尽力使用复数,如 /users
29 | - URI 使用 嵌套 表示 关联关系,如 /users/123/repos/234
30 | - 使用 正确的 HTTP 方式,如 GET/POST/PUT/DELETE
31 |
32 | #### 相应设计规范
33 |
34 | - 查询
35 | - 分页
36 | - 字段过滤
37 |
38 | 如果记录数量很多,服务器不可能都将它们返回给用户。API 应该提供参数,过滤返回结果。如以下代码参考:
39 |
40 | ```bash
41 | ?limit=10:指定返回记录的数量
42 | ?offest=10:指定返回记录的开始位置
43 | ?page=2&pre_page=100:指定第几页,以及每页的记录数
44 | ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
45 | ?animal_type_id=1:指定筛选条件
46 | ```
47 |
48 | - 状态码
49 | - 错误处理
50 |
51 | 就像 HTML 的错误页面向访问者展示了有用的错误消息一样,API 也应该用之前清晰易读的格式来提供有用的错误消息
52 |
--------------------------------------------------------------------------------
/docs/HTTP/session.md:
--------------------------------------------------------------------------------
1 | # 干掉 session,爽死了
2 |
3 | Cookie 从入门到进阶:一文彻底弄懂其原理以及应用
4 |
5 | https://mp.weixin.qq.com/s/zUQ59SFq1AMsSUwuFeJC9g
6 |
7 | ## 参考资料
8 |
9 | - [干掉 session,爽死了!](https://mp.weixin.qq.com/s/vGhfOhBqHPcEdKq037FAog)
10 |
--------------------------------------------------------------------------------
/docs/HTTP/性能优化.md:
--------------------------------------------------------------------------------
1 | # 网络层面的性能优化
2 |
3 | HTTP 方面
4 |
5 | HTTP1.1 时候的性能优化
6 |
7 | HTTP2 时候的性能优化
8 |
9 | 像我们最开始用雪碧图是为了性能优化,但是在 HTTP2 中就不适用了
10 |
11 | ## 参考资料
12 |
13 | - [我是如何将网页性能提升 5 倍的 — 网络优化篇](https://mp.weixin.qq.com/s?__biz=Mzg4MTYwMzY1Mw==&mid=2247496572&idx=1&sn=0708a819dd0703bdf7fd472360eacbb6&source=41#wechat_redirect)
14 |
--------------------------------------------------------------------------------
/docs/HTTP/面试题/index.md:
--------------------------------------------------------------------------------
1 | # HTTP 面试题
2 |
3 | ## Q:HTTP 1、2、3 的区别
4 |
5 | A:
6 |
7 | ## Q:HTTP 与 HTTPS 有什么区别
8 |
9 | - http 是明文传输协议,https 是 ssl +http 协议构建的可进行加密传输、身份认真的网络协议,比 http 协议安全
10 | - https 比 http 更加安全,搜索引擎对其更友好,利于 SEO
11 | - https 需要 ssl 证书,http 不用
12 | - https 端口是 443,http 端口是 80
13 | - https 是基于传输层,http 是基于应用层
14 | - https 在浏览器上会显示安全锁,http 没有,且部分网站浏览器会提示不安全
15 |
16 | ## Q: HTTP 2.0 做了哪些改进
17 |
18 | A:
19 |
20 | ## Q:HTTP 缓存机制
21 |
22 | A:强缓存和协商缓存,在 http1.0 中强缓存 cache-control,http1.1 是 expires。协商缓存时 http1.0 的 last-modified 和 http1.1 的 etag
23 |
24 | ## Q:HTTP 状态码有哪些
25 |
26 | A:
27 |
28 | ## Q:GET 和 POST 的区别在哪里?
29 |
30 | A:
31 |
32 | - 从缓存角度看,GET 会被缓存,POST 不会被缓存
33 | - 从参数角度看,GET 通过在 url 的"?"后以 key=value 方式传参,数据之间以“&”相连接;POST 则要将数据封装到请求体中发送,这个过程不可见
34 | - 从安全角度看,GET 不安全,因为 URL 可见;POST 较 GET 安全度高
35 | - 从编码角度看,GET 只接受 ASCII 字符,向服务器发送中文字符可能会出现乱码;POST 支持标准字符集,可以正确传递中文
36 | - 从数据长度的限制看,GET 一般受 URL 长度限制(URL 的最大长度是 2048 个字符),POST 无限制
37 |
38 | ## Q、HTTP 是什么,HTTP 又不是什么?
39 |
40 | A:
41 |
42 | ## Q:你是怎么理解 HTTP 字面上的“超文本”和“传输协议”的?
43 |
44 | ## Q:能否谈一下你对 HTTP 的认识?越多越好。
45 |
46 | ## Q:HTTP 有什么特点?有什么优点和缺点?
47 |
48 | ## Q:HTTP 下层都有哪些协议?是如何工作的?
49 |
50 | ## Q:聊聊 HTTP2,会导致前端产生什么变化
51 |
52 | ## 参考资料
53 |
54 | - [GET 和 POST 请求的本质区别是什么?](https://segmentfault.com/a/1190000038556123)
55 | - [点亮前端必会网络知识点](https://mp.weixin.qq.com/s?__biz=Mzg5ODA5NTM1Mw==&mid=2247484152&idx=1&sn=ba6fc3a8c71c69a2290f2284aad74fcb&scene=19#wechat_redirect)
56 |
--------------------------------------------------------------------------------
/docs/Interview/talk/index.md:
--------------------------------------------------------------------------------
1 | # 面试向我看齐
2 |
3 | 面试时会遇到一些问题,该如何回答,笔者这里整理和总结了下面试环节会问到的题目,仅供参考
4 |
5 | [解决的最难的项目回答模板](./解决的最难的项目回答模板)
6 |
7 | [如何反问面试官](./如何反问面试官)
8 |
9 |
10 |
11 | ## 你的缺点是什么
12 |
13 | 1.说确实存在的缺点
14 |
15 | 2.说出你改进的过程
16 |
17 | 3说出你的进步程度
18 |
19 | 我不是科班出身,所以我在职业生涯中最大的问题在于专业性,比如数据结构和算法不强,但是我去XXXXX
20 |
21 |
22 |
23 | ## 你的薪资要求多少
24 |
25 | 原则:
26 |
27 | 1. 心理价位+2~3k
28 | - 每人只有一次报价机会,说了就不好改口,所以尽量高
29 | - 如果对方砍价,那就做出让步姿势
30 | - 如果对方不砍价,可能你还是要低了,也可能对方财大气粗
31 | 2. 只要过了面试,你就没理由压我工作
32 | - 工资流水怎么办?
33 | 3. 如果报价低于预期,就收作备胎,继续面小家
34 | - 要求我明天到岗?不好意思,目前的工作还没交接完/下周要去老家当伴郎
35 |
36 |
37 |
38 |
39 |
40 | ## 何时可以到岗
41 |
42 | 错误答案:随时可以到岗
43 |
44 | 如果公司强烈要求你明天到岗,就一定不要去,说明是个火坑
45 |
46 | 可能接受的答案:
47 |
48 | 1. 下周三,给自己面试下一家公司留一周时间
49 | 2. 最晚下个月15号。等工作交接完了就可以(实际留时间面试下一家)
50 |
51 |
52 |
53 | ## 你对加班的看法
54 |
55 | - 我不赞同无效的加班、看似在加班实际上却什么都没做(我从来不划水摸鱼)
56 | - 当公司的重要项目有延期风险,那么为了保证项目如期上线是可以加班的
57 | - 另外,我觉得更重要的是提升自己的工作效率,降低项目延期的分享(责任心)
58 |
59 |
--------------------------------------------------------------------------------
/docs/Interview/talk/你做过什么有亮点的项目吗.md:
--------------------------------------------------------------------------------
1 | # 你做过什么有亮点的项目吗
2 |
3 |
4 |
5 | 这个问题和问技术难点、技术亮点一个意思,以下三篇文章是前端相关的,可以参考下。
6 |
7 | - [大厂面试官:你做过什么有亮点的项目吗?](https://juejin.cn/post/7211437215334989884)
8 | - [作为面试官,为什么我推荐微前端作为前端面试的亮点?](https://juejin.cn/post/7252342216843296828)
9 | - [作为面试官,为什么我推荐组件库作为前端面试的亮点?](https://juejin.cn/post/7261080561480089655)
10 |
--------------------------------------------------------------------------------
/docs/Interview/talk/学习成长原则.md:
--------------------------------------------------------------------------------
1 | # 学习原则
2 |
3 | 学习一项知识,必须问自己三个重要问题:
4 |
5 | 1.它的本质是什么?
6 |
7 | 2.它的第一原则是什么?
8 |
9 | 3.它的知识结构是怎样的
10 |
11 | 获得的多少并不取决于读了多少,而取决于思考了多少、多深
12 |
13 | 人与人学习的差距不在资质上,而在花在思考的时间和思考的深度上
14 |
15 | 重要的事情优先
16 |
17 | 你可以”投入“很多时间在一件事情上面,却发现毫无进展,因为你没有整天把你要做的事情,要学习的东西常驻在你的大脑中,时刻给与它最高的优先级。你走路的时候吃饭的时候,做梦的时候心心念念想的就是这件事情,你的 CPU 总是分配给他,这个时候你的思维时间就被利用到了极致,你投入的时间就真正等于了实际流逝的时间,因为你的 CPU 是满载的
18 |
19 |
20 |
21 |
22 |
23 | ## 知识与技能
24 |
25 | 知识是需要记忆力的,技能需要反复练习
26 |
27 | FE 前端地图是知识,需要反复阅读,记忆
28 |
29 | 而技能包括
30 |
31 | - 写可阅读代码的能力
32 | - 阅读别人代码的能力
33 | - 写单元测试的能力
34 | - 写设计文稿的能力
35 | - Debug 能力
36 | - 10 分钟讲清楚自己想法的能力
37 | - 做 PPT 的能力
38 | - ......
39 |
40 | 读书也可以获得上面能力的一些指导,但是,单纯通过读书无法练习技能,最后要掌握这些技能,你还是要下场练习。
41 |
42 | 所以,如果要问程序员应该怎样去规划自己的学习路线,那么请遵照这样的路线:
43 |
44 | - 确定一个技能培养目标
45 | - 搜集这个技能相关领域的书籍列表
46 | - 找到相关领域最顶级而且没读过的 3 本书
47 | - 读这 3 本书
48 | - 练习书中所说的内容
49 | - 向别人 show 一 show 自己练习的结果,别人是高手最好
50 | - 虚心接受一切批评和反馈,即使这种批评惨无人道,即使那些反馈非常严苛
51 | - 觉得自己不够精通,GOTO 第 4 步;觉得自己已经很牛了,GOTO 第 1 步
52 |
53 | ## 参考
54 |
55 | - [程墨的回答](https://www.zhihu.com/question/417528243/answer/1435103711)
56 | - [工程师的个人发展规划](https://speakerdeck.com/baidufe/gong-cheng-shi-de-ge-ren-fa-zhan-gui-hua)
57 | - [关于时间和知识管理](https://github.com/zenany/zenany.github.io/blob/master/_posts/about_time_and_knowledge_management.md)
58 | - [从高效能人士的七个习惯谈成长](https://www.yuque.com/zenany/up/be_independent)
59 | - [从内容创作到个人品牌](https://talk.bmpi.dev/2022/content-marketing-to-personal-brand/30)
60 |
--------------------------------------------------------------------------------
/docs/JavaScript/String.md:
--------------------------------------------------------------------------------
1 | # 字符串
2 |
3 | ## 概要
4 |
5 | String()构造函数用于创建字符串对象和字符串原始值
6 |
7 | ## 属性和方法
8 |
9 | 字符串对象具有以下属性和方法(不包括继承的属性和方法)
10 |
11 | ### **属性**
12 |
13 | - prototype
14 |
15 | ### **方法**
16 |
17 | - froCharCode()
18 |
19 | ## 实例属性和方法
20 |
21 | ### **实例属性**
22 |
23 | - constructor
24 | - length
25 |
26 | ### **实例方法**
27 |
28 | - slice():提取某个字符串的一部分,并返回一个新的字符串,且不会改动原字符串
29 |
30 | - substr():返回一个字符串中从指定位置开始到指定字符串的字符
31 |
32 | > PS: 未来可能会被移除掉,如果可以的话,使用 `substring()` 代替它
33 |
34 | - substring():返回一个字符串在开始索引到结束索引之间的一个子集,或从开始索引知道字符串的末尾的一个子集
35 |
36 | - concat():将一个或多个字符串与原字符串连接合并,形成一个新的字符串并返回
37 |
38 | - indexOf():返回调用它的 `String` 对象中第一次出现的指定值的索引,从 `fromIndex` 处进行搜索。如果未找到该值,则返回 -1
39 |
40 | - replace():返回一个由替换值(replacement)替换一些或所有匹配的模式(pattern)后的新字符串。模式可以使一个字符串或者一个正则表达式,替换值可以使一个字符串或者一个每次匹配都要调用的回调函数。
41 |
42 | - 原字符串不会改变
43 |
44 | - toString():返回指定对象的字符串形式
45 |
46 | - valueOf():返回 String 对象的原始值
47 |
48 | - charAt():从一个字符串中返回指定的字符
49 |
50 | - charCodeAt():返回 0 到 65535 之间的整数,表示给定索引处的 UTF-16 代码单元
51 |
52 | - lastIndexOf():返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始
53 |
54 | - localeCompare():返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同
55 |
56 | - match():检索返回一个字符串匹配正则表达式的结果
57 |
58 | - toLowerCase():将调用该方法的字符串值转为小写形式,并返回
59 |
60 | - toUpperCase():将调用该方法的字符串转为大写形式,并返回
61 |
62 |
63 |
64 |
65 |
66 | ## 参考资料
67 |
68 | - [MDN](https://developer.mozilla.org/zh-CN/)
69 |
--------------------------------------------------------------------------------
/docs/JavaScript/TypeScript/TypeScript中的类型.md:
--------------------------------------------------------------------------------
1 | # TypeScript 中的类型
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 | TypeScript 通过类型注解提供编译时的静态类型检查,可以在编译阶段就发现潜在 Bug,同时让编码过程中的提示也更智能。使用方式很简单,在 `:` 冒号后面注明变量的类型即可。
28 |
29 | ```typescript
30 | const str: string = 'abc';
31 | ```
32 |
33 |
34 |
35 | ## 类型保护
36 |
37 | 类型保护就是在我们已经识别到当前数据是某种数据类型的情况下,安全的调用这个数据类型对应的属性和方法。常用的类型保护包括 `in` 类型保护、`typeof` 类型保护、`instanceof` 类型保护和 `自定义` 类型保护。具体见以下示例:
38 |
39 | - `in` 类型保护
40 |
41 |
42 |
43 |
44 |
45 | ## 参考资料
46 |
47 | https://mp.weixin.qq.com/s?__biz=Mzg3NTcwMTUzNA==&mid=2247486311&idx=1&sn=e673c558cde252bcd3357074fbf0a365&source=41#wechat_redirect
--------------------------------------------------------------------------------
/docs/JavaScript/TypeScript/TypeScript中的面向对象.md:
--------------------------------------------------------------------------------
1 | # TypeScript 中的面向对象
2 |
3 |
4 |
5 | ## 原型
6 |
7 |
8 |
9 | ## class(类)
10 |
11 |
12 |
13 | ### 类与接口
14 |
15 | - 类实现接口
16 | - 接口继承类
17 | - 类作为接口使用
18 |
19 |
--------------------------------------------------------------------------------
/docs/JavaScript/以游戏的角度理解继承.md:
--------------------------------------------------------------------------------
1 | # 以游戏的角度理解继承
2 |
3 |
4 |
5 | 笔者这里有个打个游戏比喻解释下原型和构造函数的关系,不知道恰不恰当,原型是模板,也就是职业,有战士、法师、奶妈、弓箭手,构造函数就是特定的属性。创建实例,继承的职业以及属性
6 |
7 |
8 |
9 | 小说的角度理解继承
10 |
11 |
12 |
13 | 
14 |
--------------------------------------------------------------------------------
/docs/JavaScript/作用域与执行上下文.md:
--------------------------------------------------------------------------------
1 | # 作用域 VS 执行上下文
2 |
3 | 笔者在前文 [作用域](./作用域.md) 、[执行上下文](./执行上下文与调用栈.md) 中介绍过作用域和执行上下文,它们是 JavaScript 中很重要的知识点,是基础中的重点,是重点中的基础。
4 |
5 | 我们讲过 JavaScript 中的作用域是词法作用域,与在哪里定义有关;而执行上下文则和调用有关,两者有关联但却是不同概念
6 |
7 | ## 作用域
8 |
9 | - 作用域与哪里定义有关,在引擎编译时就知道它在哪里定义
10 | - 其中函数作用域最为重要,因为作用域中的变量,作用域外不能访问,这起到了保护变量的作用
11 | - 无生命周期
12 | - 它可以理解为是“静态”的(词法作用域)
13 | - 共全局作用域、函数作用域、块级作用域、eval 作用域
14 |
15 | ## 执行上下文
16 |
17 | - 而执行上下文与调用有关
18 | - 它表示一段代码执行时所带的所有信息
19 | - 包括 this、词法环境、变量环境(ES5标准)
20 | - 结合之前 [this](./this关键字.md) 所给的定义:**谁调用它,this 就指向谁** 就是和执行上下文相关。执行上下文也是如此,与调用者息息相关
21 | - 生命周期为两个阶段
22 | - 创建阶段
23 | - 确定 this 指,即我们熟知的 this 绑定
24 | - 创建变量环境
25 | - 环境记录器
26 | - 登记 var、function 等声明的变量
27 | - 此时会发生变量提升和函数提升
28 | - 对外部环境的引用(outer)
29 | - 指向父作用域(作用域在代码执行前就确定了)
30 | - 创建词法环境
31 | - 环境记录器
32 | - 登记 let、const 等声明的变量
33 | - 会发生变量提升(hoist),但是不会被初始化,所以提前使用会报 ReferenceError,如例1所示
34 | - 对外部环境的引用(outer)
35 | - 同样指向父作用域
36 | - 执行阶段
37 | - 指向代码
38 | - 确定作用域链
39 | - 它则是“动态”的(与调用方相关)
40 | - 共全局执行上下文、函数执行上下文、模块执行上下文、eval 执行上下文
41 |
42 |
43 |
44 | 例子1:
45 |
46 | ```javascript
47 | a // undefined
48 | b // ReferenceError
49 | c // ReferenceError
50 | d // function d() {}
51 |
52 | var a = 1;
53 | let b = 2;
54 | const c = 3;
55 | function d(){}
56 | ```
57 |
58 | var 声明变量会被初始化为 undefined,一般函数(函数声明式写法)定义会被初始化为 `function xx(){}` ,let、const 则不会被初始化,所以 var 定义的变量可以提前使用但指为 undefined,一般函数定义可以正常提前使用,let、const 提前使用则会报错
59 |
60 | > PS,如果使用函数表达式写法使用函数,则跟变量,如 var e = function(){} 或者 let f = () => {}
61 |
62 |
63 |
64 | 以上就是作用域和指向上下文的各种区别
65 |
66 |
--------------------------------------------------------------------------------
/docs/JavaScript/原理/index.md:
--------------------------------------------------------------------------------
1 | # JavaScript 原理及源码实现
2 |
3 |
4 |
5 | 未完待续,也许以后会写,也许以后也不会再写
6 |
7 | [0.1+0.2 为什么不等于 0.3](./0.1+0.2 为什么不等于 0.3)
8 |
9 | [图片懒加载解决方案](./图片懒加载)
10 |
11 | [实现模板引擎](./实现模板引擎)
12 |
13 | [模拟 MVVM 的实现](./模拟MVVM的实现)
14 |
--------------------------------------------------------------------------------
/docs/JavaScript/原理/图片懒加载.md:
--------------------------------------------------------------------------------
1 | # 图片懒加载解决方案
2 |
3 | ## 为什么使用图片懒加载?
4 |
5 | **为了性能**。如果你要访问
6 |
7 | 我们在讲 [浏览器的渲染原理](../../Browser/浏览器的渲染原理.md) 中曾经说过:
8 |
9 | > DOMContentLoaded:浏览器已完全加载完 HTML,并构建了 DOM 树,但像图片、样式表之类的外部资源可能尚未加载完成
10 | >
11 | > load:浏览器不仅加载完成了 HTML,还加载完所有的外部资源:图片、字体、样式等
12 |
13 | 我们要让图片小,一是压缩图片,还有些方法如换图片格式,比如 Google 提出的 WebP,
14 |
15 | 还有例如图片懒加载
16 |
17 | 一个页面如果一开始就加载整个站的图片无疑会花很多时间,那么我们通过一些手段,用 placeholder 来代替图片,或者用小图来代替,等
18 |
19 | 视图内看到的图片可以第一时间显示,没看到的先不用展示
20 |
21 | 图片的加载权重比较高,会让页面卡顿
22 |
23 | 
24 |
25 | ## 最简单的实现——以小换大
26 |
27 | 最开始是小图片或 placeholder 图,等图片加载完毕后换成大图
28 |
29 | 小图所花的时间少,马上就能显示出来,然后通过 JS 显示原来的图
30 |
31 | ## 监听图片高度
32 |
33 | 最开始展示页面范围内的图片,然后往下滑再逐步展示图片
34 |
35 | 在这里也要做节流
36 |
37 | 主要技术点:节流 + 当前元素 offsetTop
38 |
39 | ## Intersection Observer
40 |
41 | 它是什么
42 |
43 | 它的语法是怎么样
44 |
45 | 怎么用这个实现图片懒加载
46 |
47 | ## 以实养战
48 |
49 | 我们已经用 JS 来实现了图片懒加载,但是这还不够。因为现在的项目基本基于 React/Vue 框架实现,我们来用 React 来实现一下图片懒加载
50 |
51 | ### 图片 API
52 |
53 | 申请 unsplash API 的使用,
54 |
55 | ### 自定义 Hooks
56 |
57 | 自定义 Intersection Observer Hooks
58 |
59 | ### 参考佳作
60 |
61 | 看别人怎么做的? medium 如何加载图片
62 |
63 | - 直到图片进入可是范围才加载图片
64 |
65 | - 然后,加载一张模糊的缩略图
66 |
67 | - 然后,加载全尺寸图片,并替代调缩略图
68 |
69 | Github 地址
70 |
71 | 线上 [demo](https://codepen.io/jojobo/pen/QWEzYvY)
72 |
73 | ## 参考资料
74 |
75 | - [图片懒加载从简单到复杂](https://hateonion.me/posts/19jan30/)
76 |
77 | - [懒加载的 3 种实现方式](https://segmentfault.com/a/1190000017795499)
78 |
--------------------------------------------------------------------------------
/docs/JavaScript/原理/实现模板引擎.md:
--------------------------------------------------------------------------------
1 | # 实现模板引擎
2 |
3 | 模板引擎我们之前看到过很多,比如 hbs,template....
4 |
5 | 那么看他们的源码,对于新手来说并不友好,新手之所以为新手,在于他基础不行,看一些难一点的代码,就看不懂,所以我们做一件简单的,有利于新手理解的模板引擎,然后根据这个模板引擎来做一个简单的 demo,以此加深我们对模板引擎的理解
6 |
7 | 核心掌握,剩下的就是兼容和加各种好用功能的方法。
8 |
9 | ## 参考资料
10 |
11 | - [web-template](https://github.com/XboxYan/web-template)
12 | - [ES6 模板字符串在 HTML 模板渲染中的应用](https://www.zhangxinxu.com/wordpress/2020/10/es6-html-template-literal/)
13 |
--------------------------------------------------------------------------------
/docs/JavaScript/原理/模拟MVVM的实现.md:
--------------------------------------------------------------------------------
1 | # 模拟 MVVM 的实现
2 |
3 | 50 行代码的 MVVM,理解闭包的艺术
4 |
5 | ## 参考资料
6 |
7 | - [50 行代码的 MVVM,理解闭包的艺术](https://github.com/imaoda/js-front-end-practice/blob/master/50%E8%A1%8C%E4%BB%A3%E7%A0%81%E7%9A%84MVVM%EF%BC%8C%E7%90%86%E8%A7%A3%E9%97%AD%E5%8C%85%E7%9A%84%E8%89%BA%E6%9C%AF.md)
8 |
--------------------------------------------------------------------------------
/docs/JavaScript/高阶/JavaScript工作机制.md:
--------------------------------------------------------------------------------
1 | # JavaScript 工作机制
2 |
3 | ## 参考资料
4 |
5 | - [开发做了这么多年,你真的了解 JS 工作机制吗](https://www.infoq.cn/article/E2Vvaa-ZfIrMrjrxtdF9)
6 | - [Js 是怎样运行起来的?](https://juejin.cn/post/6978664826893500423)
7 | - [how-javascript-works](https://github.com/Troland/how-javascript-works)
8 | - [从 JavaScript 的运行原理谈解析效率优化](https://mp.weixin.qq.com/s?__biz=Mzk0MDMwMzQyOA==&mid=2247490285&idx=1&sn=86ed879706094c1b053c3d6ccfc062c5&source=41#wechat_redirect)
9 | - [JavaScript 是如何运行的?](https://blog.fundebug.com/2019/09/26/how-does-javascript-execute/)
10 |
--------------------------------------------------------------------------------
/docs/JavaScript/高阶/JavaScript引擎.md:
--------------------------------------------------------------------------------
1 | # JavaScript 引擎
2 |
3 | ## 参考资料
4 |
5 | - [揭开 JavaScript 引擎的面纱](https://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651234200&idx=1&sn=ab00fa8ba5e80fada6c7a05f39c7d566&chksm=bd49461c8a3ecf0abf0b8c45cd440727ac6269820f2cdb96584a6b64b79ae3e76a8d474502e6&mpshare=1&scene=1&srcid=&sharer_sharetime=1570679832256&sharer_shareid=778ad5bf3b27e0078eb105d7277263f6#rd)
6 | - [从 JS 引擎到 JS 运行时(上)](https://mp.weixin.qq.com/s?__biz=Mzg4MTYwMzY1Mw==&mid=2247496337&idx=1&sn=4c9250ad12d6020fbe68d78adf616997&source=41#wechat_redirect)
7 | - [JavaScript 引擎 V8 执行流程概述](https://mp.weixin.qq.com/s/qFVxdN2J3qYbBo8_q93SAA)
8 | - [JavaScript 幕后工作原理:JS 引擎和运行时](https://mp.weixin.qq.com/s/JUpNZ762MDCkg-z1sk4eIg)
9 |
--------------------------------------------------------------------------------
/docs/JavaScript/高阶/index.md:
--------------------------------------------------------------------------------
1 | # JavaScript 高阶
2 |
3 |
4 |
5 | 也许以后会写,也许以后不会写
6 |
7 | [JavaScript 工作机制](./JavaScript工作机制)
8 |
9 | [JavaScript 引擎](./JavaScript引擎)
10 |
11 | [深入理解 JSCore](./深入理解JSCore)
12 |
13 | [用 js 写 js 解析器](./用js写js解析器)
14 |
15 | [如何用 JavaScript 实现一门编程语言](./如何用JavaScript实现一门编程语言)
16 |
--------------------------------------------------------------------------------
/docs/JavaScript/高阶/如何用JavaScript实现一门编程语言.md:
--------------------------------------------------------------------------------
1 | # 如何用 JavaScript 实现一门编程语言
2 |
3 | V8 是用 C++写的,是 js 的解析器
4 |
5 | 我们用 js 来试着写一个 js 解析器,从根本上了解 js 是如何运行的
6 |
7 | ## 参考资料
8 |
9 | - [如何用 JavaScript 实现一门编程语言](https://mp.weixin.qq.com/s/K-R8L90x0Dfw-zie9c4dJQ)
10 |
--------------------------------------------------------------------------------
/docs/JavaScript/高阶/深入理解JSCore.md:
--------------------------------------------------------------------------------
1 | # 深入理解 JSCore
2 |
3 | ## 参考资料
4 |
5 | - [深入理解 JSCore](https://tech.meituan.com/2018/08/23/deep-understanding-of-jscore.html)
6 |
--------------------------------------------------------------------------------
/docs/JavaScript/高阶/用js写js解析器.md:
--------------------------------------------------------------------------------
1 | # 用 js 写 js 解析器
2 |
3 |
4 |
5 | ## 参考资料
6 |
7 | - [「 giao-js 」用 js 写一个 js 解释器](https://juejin.cn/post/6898093501376905230)
8 |
--------------------------------------------------------------------------------
/docs/Linux/index.md:
--------------------------------------------------------------------------------
1 | # Linux 导航
2 |
3 | > 犹太人最厉害的手段是调起人的欲望
4 | >
5 | > 没有阴谋,都是阳谋,所谓阴谋都是掌握的信息不够
6 |
7 | 如果要在编程的道路上继续精进,那么 Linux 就是绕不开的一道门槛。笔者这里记录自己学习 Linux 的学习笔记,供君参考
8 |
9 | 笔者想的是,Linux 是个很庞大的学习资源,但笔者只要其中开发运维所需要的东西即可
10 |
11 | 所以笔者的学习顺序是先了解 Linux 是什么、Linux 的目录结构、Linux 的常用命令,最后笔者会分享自己云服务器的初始化脚本
12 |
13 | - [Linux 基本概念](./基本概念)
14 | - [Linux 包管理器](./包管理器)
15 | - [Linux 系统目录结构](./系统目录结构)
16 | - [Linux 常用命令](./常用命令)
17 | - [Linux 文件目录基本操作](./文件目录及权限)
18 | - [Linux 用户和用户组管理](./用户和用户组管理)
19 | - [Linux 其他命令](./其他命令)
20 | - [Shell命令大全](./shell命令大全)
21 |
22 | ## 为什么要学Linux
23 |
24 | [知乎问题:为什么要学习 Linux?](https://www.zhihu.com/question/20117703)
25 |
26 | [Vamei博客:为什么要学习Linux](https://link.zhihu.com/?target=http%3A//www.cnblogs.com/vamei/p/3733488.html)
27 |
28 | [Zaikun's Blog:自由谈](https://link.zhihu.com/?target=http%3A//mat.uc.pt/~zhang/blog.html)
29 |
30 | [张纪刚博客:我为什么要学习Linux?](https://link.zhihu.com/?target=http%3A//blog.csdn.net/zhangjg_blog/article/details/17621339)
31 |
32 | ## 官方网站
33 |
34 | Linux中国:[https://linux.cn/](https://www.ruby-lang.org/)
35 |
36 | 蓝桥云课:https://www.lanqiao.cn/courses/
37 |
38 | - 笔者看过 oeasy 老师的课,但是他讲的又短太细了,不适合我
39 |
40 | 鸟哥的linux私房菜:https://linux.vbird.org/
41 |
42 | - 太全面了,不适合我
43 |
44 | Linux命令大全(手册):https://www.linuxcool.com/
45 |
46 | Linux 教程:https://www.myfreax.com/linux-tutorial/
47 |
48 |
--------------------------------------------------------------------------------
/docs/Linux/其他命令.md:
--------------------------------------------------------------------------------
1 | # Linux 其他命令
2 |
3 |
4 |
5 |
6 |
7 | ## scp 上传下载文件
8 |
9 | 从服务器下载文件
10 |
11 | ```shell
12 | sudo scp username@servername:/path/filename /var/www/local_dir(本地地址)
13 | ```
14 |
15 | 从服务器下载整个目录
16 |
17 | 加上 `-r`(directory 目录)
18 |
19 | ```shell
20 | sudo scp -r username@servername:/path/remote_dir(远程目录) /var/www/local_dir(本地地址)
21 | ```
22 |
23 | 上传本地文件至服务器
24 |
25 | ```shell
26 | sudo scp /path/filename username@servername:/path/
27 | ```
28 |
29 | 上传目录到服务器
30 |
31 | ```shell
32 | sudo -r local/dir username@servername:remote_dir
33 | ```
34 |
35 |
36 |
37 |
38 |
39 | ## 扩展屏技巧
40 |
41 | 查看显示器的信息
42 |
43 | ```shell
44 | xrandr --listmonitors
45 | Monitors: 2
46 | 0: +eDP-1 1920/309x1080/173+0+0 eDP-1
47 | 1: +HDMI-2 1920/527x1080/296+1920+0 HDMI-2
48 | ```
49 |
50 | 根据需求调整显示器位置
51 |
52 | ```shell
53 | xrandr --output HDMI-2 --primary --right-of eDP-1
54 | ```
55 |
56 | 以上命令是说将 HDMI-2 视为主屏,并把它置于 eDP-1 的右边
57 |
58 | ```shell
59 | xrandr --output HDMI-2 --right-of eDP-1 --auto
60 | ```
61 |
62 | 以上命令是说将 HDMI-2 放在 eDP-1 的右边,默认把 eDP-1 视为主屏
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/docs/Linux/平民(独立)开发者服务器折腾笔记.md:
--------------------------------------------------------------------------------
1 | # 平民(独立)开发者服务器折腾笔记
2 |
3 |
4 |
5 | 我独立开发的网站不是挂在 vercel 上,就是挂在 cloudflare 上。最近,入职了一家国产操作系统公司,在折腾了几周的 Linux 服务开发后,我开始在开发机上折腾之前云服务器上折腾的事情
6 |
7 | 比如搭建 wordpress、halo、宝塔、1panel 等等,玩到后续,又了解到几个好玩的 docker 项目,
8 |
9 | 于是,我想着把这些
10 |
11 |
12 |
13 | ## 1panel
14 |
15 | 应用商店:wordpress、halo
16 |
17 | 数据库 mysql、postgresql
18 |
19 |
20 |
21 | 防火墙
22 |
23 |
24 |
25 | 数据库备份
26 |
27 | 面板设置-备份账号-存在 cloudflare 里
28 |
29 |
30 |
31 | 反向代理
32 |
33 | Nginx Proxy Manager
34 |
35 |
36 |
37 | ## 一些 docker 服务
38 |
39 | 比如说 1panel 上没有的 docker 服务:独角卡、uptime、Plausible、syncthing
40 |
41 | 当我们弄好
42 |
43 |
44 |
45 | syncthing 同步文件,家里和公司电脑的笔记等
46 |
47 |
48 |
49 |
50 |
51 | https://blog.laoda.de/archives/docker-compose-install-uptimekuma
52 |
53 | https://blog.laoda.de/archives/docker-compose-install-plausible
54 |
55 | https://blog.laoda.de/archives/docker-compose-install-dujiaoka
56 |
57 | https://blog.laoda.de/archives/umami
--------------------------------------------------------------------------------
/docs/Linux/用户和用户组管理.md:
--------------------------------------------------------------------------------
1 | # Linux 用户和用户组管理
2 |
3 | > 登陆时尽量少用 root 账号登录,因为它权限最大,普通用户登录,登录后用 `su - root`切换到root 账号
4 | >
5 |
6 |
7 |
8 | ## 速看
9 |
10 | /etc/passwd:查看所有用户信息
11 |
12 | /etc/shadow:也是查看用户信息,不过密码是经过 md5 加密
13 |
14 | useradd:添加用户
15 |
16 | passwd:设置/修改用户密码
17 |
18 | usermod:修改用户信息
19 |
20 | userdel:删除用户
21 |
22 | groupadd:添加用户组
23 |
24 | groupdel:删除用户组
25 |
26 |
27 |
28 | ## 用户
29 |
30 | ### 查看用户
31 |
32 | - `whoami`
33 | - `id`
34 |
35 | ### 切换用户
36 |
37 | root 具有最高权限,可以新建和添加用户
38 |
39 | - `sudo su`:切换到 root 账号
40 | - `su `:可以切换用户 user
41 | - `su - `:完全变更至指定的用户身份
42 | - `su -l `:切换身份时,同时变更工作目录
43 | - `sudo `:可以以特权级别运行 cmd 命令
44 | - 需要当前用户属于 sudo 组,且需要输入当前用户的密码
45 |
46 | ### 新建用户
47 |
48 | useradd:创建用户
49 |
50 | - `useradd `:创建指定的用户信息
51 |
52 | - `-c`:添加备注文字
53 | - `-d`:设置新用户登录时所使用的家目录
54 | - `-g`:设置用户对应的基本用户组
55 | - `-s`:设置新用户的默认Shell终端
56 | - `-m`:用户目录不存在时则自动创建
57 | - 例如:`useradd -m -s /usr/bin/bash johan`
58 |
59 | ### 修改用户
60 |
61 | usermod:修改改用户信息
62 |
63 | - `-a`:将用户添加至扩展组中
64 | - `-G`:修改用户所属的扩张群
65 | - `-g`:修改用户所属的基本群
66 | - `-d `:修改用户登录时的家目录
67 | - `-l`:修改用户名称
68 |
69 | - 例如:`usermod -a -G docker johan `
70 |
71 | ### 删除用户
72 |
73 | userdel:删除用户
74 |
75 | - `userdel `:删除指定用户
76 | - `-r`:删除指定用户信息以及家目录
77 | - 例如:`userdel johan `
78 |
79 | ## 用户组
80 |
81 | ### 显示用户组信息
82 |
83 | groups:显示用户组
84 |
85 | - `groups `:显示指定用户所对应的群组信息
86 |
87 | ### 创建新的用户组
88 |
89 | groupadd:创建新的用户组
90 |
91 | - `groupadd `:创建一个新的用户组
92 |
93 | ### 删除用户组
94 |
95 | groupdel:删除用户组
96 |
97 | - `groupdel `:删除指定名称的用户组
98 |
99 |
--------------------------------------------------------------------------------
/docs/Node/Express.md:
--------------------------------------------------------------------------------
1 | # Express
2 |
3 | > 放仓库里半天,也没有动静,对于这个库,笔者只能说它是基础层,我们可以在其基础上创建出更多的价值。学 NextJS 吧,不要把时间浪费在这里
4 |
5 | 分三部分
6 |
7 | 一、基础介绍
8 |
9 | 二、源码分析
10 |
11 | 三、手写 Express
12 |
13 | 四、[如何将 Express API 部署到 Vercel](./如何将 Express API 部署到 Vercel.md)
14 |
15 |
16 |
17 | ## 介绍
18 |
19 | Express 是基于 [Node.js](https://nodejs.org/en/) 平台,快速、开放、极简的 Web 开发框架
20 |
21 | ## 官网
22 |
23 | - [官网](http://expressjs.com/)
24 |
25 | - [中文官网](https://www.expressjs.com.cn/)
26 |
27 | - [npmjs 库](https://www.npmjs.com/package/express)
28 |
29 | ## 安装
30 |
31 | ```bash
32 | npm i express
33 | ```
34 |
35 | ## 一个简单的 demo
36 |
37 | ```javascript
38 | const express = require('express');
39 | const app = express();
40 |
41 | app.get('/', function (req, res) {
42 | res.send('Hello World');
43 | });
44 |
45 | app.listen(3000);
46 | ```
47 |
48 |
49 |
50 | ## 源码分析
51 |
52 | [渐进式Express源码学习](https://github.com/sunkuo/grow-to-express)
53 |
54 |
55 |
56 |
57 |
58 | ## 手写 Express
59 |
60 | [使用 Node.js 实现一个 express 框架](https://segmentfault.com/a/1190000023498413)
61 |
62 |
--------------------------------------------------------------------------------
/docs/Node/Koa2/Koa2基础.md:
--------------------------------------------------------------------------------
1 | # Koa2 基础
2 |
3 | ## 知识储备
4 |
5 | Node 基本常识
6 |
7 | ## 什么是 Koa2
8 |
9 | 由 Express 原班人马打造的新生代 Node.js Web 框架,它的代码很简单,没有像 Express 那样,提供路由、静态服务等等,它是为了解决 Node 问题(简化了 Node 中操作)并取代之,它本身是一个简单的中间件框架,需要配合各个中间件才能使用
10 |
11 | [文档](https://koajs.com/)
12 |
13 | [中文文档](https://koa.bootcss.com/) (野生)
14 |
15 | Koa2 是什么?
16 |
17 | - 用 NodeJS 写的 Web 框架
18 | - Koa 可被视为 nodejs 的 HTTP 模块的抽象
19 |
20 | Koa 可被视为 nodejs 的 HTTP 模块的抽象
21 |
22 | 用法很简单:
23 |
24 | Koa2 启动服务
25 |
26 | ```javascript
27 | const Koa = require('koa');
28 |
29 | const app = new Koa();
30 |
31 | app.use((ctx) => {
32 | ctx.body = 'Hello World';
33 | });
34 |
35 | app.listen(3000, () => {
36 | console.log('3000端口已启动');
37 | });
38 | ```
39 |
40 | 其中,Koa2 封装了 request 和 response,将它们放在一起,成了 ctx。
41 |
42 | 再 Koa2 中,ctx 是个很关键的值,
43 |
44 | ctx.body :返回值
45 |
46 | ctx.status:返回的 code
47 |
48 | ctx.request:请求体
49 |
50 | ctx.response:返回体
51 |
52 | app 实例、context、request、request 官方 API 文档
53 |
54 | https://github.com/demopark/koa-docs-Zh-CN/blob/master/api/index.md
55 |
56 | https://github.com/demopark/koa-docs-Zh-CN/blob/master/api/context.md
57 |
--------------------------------------------------------------------------------
/docs/Node/Koa2/index.md:
--------------------------------------------------------------------------------
1 | # Koa2 导航
2 |
3 | > 成功只有一个——按照自己的方式,去度过人生
4 |
5 | 了解一个框架,尤其是 JavaScript 写的框架,大体可以分着几步
6 |
7 | 一:知道它是什么?它的基本操作是什么
8 |
9 | 二:做这个框架做一个应用
10 |
11 | 三:手写这个框架
12 |
13 | 对于 Koa2 来说,我们也是从这几步来着手,首先我们要了解 [Koa2 基础](./Koa2基础.md) ;其次,我们做个实战项目——[实战:Koa2 从零到脚手架](./实战:Koa2从零到脚手架.md);最后,我们[手写 Koa2](./手写Koa2.md),不过再次之前,我们先去读一下 [Koa2 的源码](./源码分析.md)
14 |
15 | 无论是 Koa2,还是 [Express](../Express)、[Redux](../../Read/code/Redux.md),在读过它们的源码后,我们有了对比,就能分析出优秀框架是怎么做出的——[对比 Express、Koa2、Redux](./对比Express、Koa2、Redux.md)。
16 |
17 | 另外的实战:[实战:vercel部署node服务](./实战:vercel部署node服务.md)、[实战:李瓶儿博客开发](./实战:李瓶儿博客开发.md)
18 |
--------------------------------------------------------------------------------
/docs/Node/Koa2/对比Express、Koa2、Redux.md:
--------------------------------------------------------------------------------
1 | # 对比 Express、Koa2、Redux
2 |
3 | Koa 的 compose 能处理异步,Redux 的不能
4 |
5 | 后续做到 Redux 再更新,这个牵扯到太多函数式编程概念
6 |
7 | ## 参考资料
8 |
9 | - [多维度分析 Express、Koa 之间的区别](https://mp.weixin.qq.com/s?__biz=MzIyNDU2NTc5Mw==&mid=2247484704&idx=1&sn=145e6b9b3812ec39a06dcc79d2ac0d82&chksm=e80c4a6edf7bc378343e94e47ed2248f197ef6a47ec5c79953b53420f27498ac6cad3848f5a9&mpshare=1&scene=1&srcid=&sharer_sharetime=1584923014577&sharer_shareid=778ad5bf3b27e0078eb105d7277263f6#rd)
10 | - [对比 Koa 和 Redux:分析前端中的中间件原理](https://mp.weixin.qq.com/s/MDUs23Avf1yV_3VMCyZOrg)
11 | - [深入理解洋葱模型](https://mp.weixin.qq.com/s/L9cAdBZ9YDmtdEaX8v29jA)
12 |
--------------------------------------------------------------------------------
/docs/Node/PM2.md:
--------------------------------------------------------------------------------
1 | # PM2
2 |
3 | ## 是什么
4 |
5 | - 进程守护,系统奔溃自动重启
6 | - 启动多进程,充分利用 CPU 和内存
7 | - 自带日志记录功能
8 |
9 | ## 下载安装
10 |
11 | - `npm install pm2 -g`
12 | - `pm2 --version`
13 |
14 | ## 常用命令
15 |
16 | `pm2 start [app.js]` 启动
17 |
18 | - `pm2 start app.js --name blog`
19 |
20 | `pm2 restart [app.js]` 重启
21 |
22 | `pm2 stop [app.js]` 停止
23 |
24 | `pm2 list` 查看启动列表
25 |
26 | `pm2 info / `查看基本信息
27 |
28 | `pm2 log /` 查看日志打印
29 |
30 | `pm2 monit /` 监控这个进程的 CPU 和内存信息
31 |
32 | `pm2 delete /` 删掉
33 |
--------------------------------------------------------------------------------
/docs/Node/应用开发/elme.md:
--------------------------------------------------------------------------------
1 | # 类似cangdu饿了么项目
2 |
3 |
4 |
5 | 用 [Monorepo管理方法论和依赖安全](https://sakina.blog.csdn.net/article/details/125583482?spm=1001.2014.3001.5502) 管理仓库
6 |
7 | 三个仓库,三个 61 个接口,还是弄成商业项目吧
8 |
9 |
10 |
11 | 真正的Node课程除了Web框架,MySQL,还应该有微服务,Redis缓存,消息队列RabbitMQ ,搜索引擎ElasticSearch,安全Auth认证
12 |
--------------------------------------------------------------------------------
/docs/Node/应用开发/实战:Redis.md:
--------------------------------------------------------------------------------
1 | 第 22 天:使用 Redis 处理实时数据
2 |
3 | - 了解什么是 Redis 及其工作原理
4 | - 了解如何使用 Redis 缓存和实时数据
5 | - 编写一个使用 Redis 缓存和实时数据的 Express Web 应用程序
6 |
7 | 编码问题:创建一个使用 Redis 缓存 API 响应并为项目列表提供实时更新的 Express Web 应用程序
--------------------------------------------------------------------------------
/docs/Node/应用开发/实战:realworld项目.md:
--------------------------------------------------------------------------------
1 | # 实战:realworld 项目
2 |
3 |
4 |
5 | real-world:https://codebase.show/projects/realworld?category=backend&language=javascript
6 |
7 | https://codebase.show/projects/realworld?category=fullstack&language=javascript
8 |
9 | https://github.com/winterrrrrff/realWorld-server
10 |
--------------------------------------------------------------------------------
/docs/Node/应用开发/实战:极简做个saas应用.md:
--------------------------------------------------------------------------------
1 | # 实战:极简做个saas应用
2 |
3 |
4 |
5 | 什么是 saas
6 |
7 | 我想做个什么 saas 应用
8 |
9 | 一定要简单到极值
10 |
11 |
12 |
13 | 其实这个逼的网站:https://paperwebsite.com/showcase,还有[简单简历](https://easycv.cn/),看起来很简单的应用,但是所需要的能力还是很多的
14 | vitepress + utterances,fe 可以用这个试试
15 |
--------------------------------------------------------------------------------
/docs/Node/应用开发/实战:聊天室.md:
--------------------------------------------------------------------------------
1 | # 实战:聊天室
2 |
3 |
4 |
5 | nextjs
6 |
7 |
8 |
9 | HTTP 只能是客户端请求至服务端,WebSocket 允许服务器请求服务端
10 |
11 | 了解 Websockets 是什么以及它们是如何工作的
12 |
13 |
14 |
15 | HTTP:单向请求,只能从浏览器发送请求至服务器
16 |
17 | WebSocket:双向请求,服务器与客户端彼此请求
18 |
19 |
20 |
21 |
22 |
23 | ## 正文
24 |
25 | 新建项目`npx create-next-app@latest`
26 |
27 | 
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | - 了解 Websockets 是什么以及它们是如何工作的
40 | - 了解如何在 Express Web 应用程序中使用[Socket.io](http://socket.io/)
41 | - 编写一个使用[Socket.io](http://socket.io/)进行实时通信的Express Web 应用程序
42 |
43 | 编码问题:创建一个使用[Socket.io](http://socket.io/)实现简单聊天室的 Express Web 应用程序。
44 |
45 |
46 |
47 | [Node.js + Socket.io 实现一对一即时聊天](https://www.nodejs.red/#/nodejs/npm/private-chat-socketio?id=nodejs-socketio-实现一对一即时聊天)
48 |
49 | nextjs
50 |
51 |
52 |
53 | https://vercel.com/templates/next.js/realtime-chat-app
54 |
55 |
56 |
57 | https://www.bilibili.com/video/BV1Zh4y1H7UM/
58 |
59 | https://github.com/joschan21/nextjs-realtime-chat
60 |
61 |
62 |
63 | https://github.com/joschan21/nextjs-realtime-chat
64 |
65 | nextjs+ redis。https://upstash.com/(可以)
66 |
67 |
68 |
69 | 别人的聊天室:https://github.com/songquanpeng/chat-room
70 |
71 |
72 |
73 |
74 |
75 | 需求分析
76 |
77 | 数据库设计
78 |
79 | 微服务拆分
80 |
81 | 功能开发
82 |
83 | docker compose 部署
84 |
--------------------------------------------------------------------------------
/docs/Node/文件模块.md:
--------------------------------------------------------------------------------
1 | # 文件模块
2 |
3 |
4 |
5 | Todo
6 |
--------------------------------------------------------------------------------
/docs/Performance/React层面优化.md:
--------------------------------------------------------------------------------
1 | # React层面优化
2 |
3 | 如何排查网页的性能问题
4 |
5 |
6 |
7 | FCP:首次内容绘制
8 |
9 | LS:
10 |
11 | LCP:最大内容绘制
12 |
13 |
14 |
15 | 4.首屏渲染 (ssr、骨架图)
16 |
17 |
18 |
19 | ## FCP
20 |
21 | 首次内容绘制(FCP)指标测试页面从开始加载到页面内容的任何部分在屏幕上完成渲染的时间。对于该指标,”内容“指的是文本、图像(包括背景图像)、`