blog
blog copied to clipboard
对于经常使用 git 的人来说,很少有机会发现关于 git 的新东西。我最近发现在高级命令列表中增加了 2 个新功能: - git restore - git switch 为了理解为什么新增这两个命令,我们先回顾一下经常使用的 git checkout 这个命令。 ## Git checkout 有些新手刚开始使用 git checkout 时会感到困惑。这是因为它造成的结果依赖于传入的参数。 下面我们看一下 git checkout 的几个使用场景 - 切换本地分支,更准确的说法是,切换...
对于经常使用 git 的人来说,很少有机会发现关于 git 的新东西。我最近发现在高级命令列表中增加了 2 个新功能: - git restore - git switch 为了理解为什么新增这两个命令,我们先回顾一下经常使用的 git checkout 这个命令。 ## Git checkout 有些新手刚开始使用 git checkout 时会感到困惑。这是因为它造成的结果依赖于传入的参数。 下面我们看一下 git checkout 的几个使用场景 - 切换本地分支,更准确的说法是,切换...
## 前言 刚开始看 redux 时候,reducer、store、dispatch、middleware 这些名词都比较难以理解,后面接触了 vuex 就比较好理解了。本章会从零开始实现一个简单版本的状态管理器。方便大家今后理解 vuex 和 redux 的状态管理库的源码 ## 什么是状态管理器 一个状态管理器的核心思想是将之前放权到各个组件的修改数据层的 controller 代码收归一处,统一管理,组件需要修改数据层的话需要去触发特定的预先定义好的 dispatcher,然后 dispatcher 将 action 应用到 model 上,实现数据层的修改。然后数据层的修改会应用到视图上,形成一个**单向**的数据流。 ## 简单的状态管理器 本文会一步步的编写一个 Store 类,实现状态的同步更新、异步更新、中间件等方法。 首先,我们编写一个...
# 记 mysql 并发更新时的表锁问题 最近在做一个 nodejs 项目时遇到的一个基础的 mysql 问题,下面记录一下。 ### 问题 当对数据表中的数据做更新操作时,如果并发的对同一条数据进行更新,那么后面触发的会有一定概率更新失败。 ### 原因 mysql innodb 的行锁基于索引的,当我们执行下面这条更新语句时,会触发 mysql 的排它锁,如果更新还没完成,其他对于 id=1 的更新操作会执行失败 ```mysql update tableName set field = newField where id=1...
# SSL或TLS握手的概述 SSL或TLS握手建立了用于客户端和服务端通信的秘钥。 客户端和服务端SSL或TLS能够相互通信的基本步骤: - 确认使用协议的版本 - 选择加密算法 - 通过交换和验证数字证书对彼此进行身份验证 - 使用非对称加密技术生成共享密钥,避免了密钥分发问题。然后SSL或TLS使用共享密钥对消息进行对称加密解密,这比非对称加密更快 综上所述SSL握手的步骤如下: 1. SSL或TLS客户端先向服务端发送一个加密通信请求,叫做ClientHello请求。该请求包含以下信息: - 客户端支持的SSL或者TLS版本 - 客户端生成的随机数,用于生成后续通信的随机字符串("对话密钥") - 客户端支持的加密算法 2. SSL或TLS服务端收到客户端请求后,向客户端发出响应,叫做ServerHello。该响应包含以下信息: - 服务端从客户端提供的SSL或TLS列表中选择的版本 - Sesstion ID 和 另外生成的随机数...
# JavaScript中的执行上下文和堆栈是什么 在这篇文章中,将深入研究JavaScript最基本的部分之一,即执行上下文。在这篇文章的最后,你应该更清楚地理解解释器要做什么,为什么在声明一些函数/变量之前可以使用它们,以及它们的值是如何确定的。 ## 什么是执行上下文 当JavaScript代码运行时,执行代码的环境是相当重要的。一般有以下三种情况: - 全局代码 -- 代码首次开始执行的默认环境 - 函数代码 -- 每当进入一个函数内部 - Eval代码 -- eval内部代码执行时 把执行上下文看作是当前代码正在执行的环境/作用域 ```js // global context var sayHello = 'sayHello' function person() {...
# 优化网站性能最佳实践 ## HTTP 方面 - 减少 HTTP 请求 - 合并文件 - CSS Sprites: 减少 image 的请求,将多个背景图片合并到一张图片,然后使用 CSS backgroud-image 和 backgroud-position 属性来展示这个大背景图片的一部分 - 内联图片: 使用 data: URL scheme 形式的图片格式,这样虽然增加减少了一次 http...
# 简单讲解一下 http2 多路复用 多路复用是 http2 提供的一个功能,在同一个 tcp 连接中客户端和服务端都可以同时发送多个请求或回应。而且两端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。 ## 帧和流 HTTP/2 是一个二进制协议, 每一个请求和响应都有一个唯一的 id,叫做流 id。每个请求和响应的数据会被划分为帧。帧是二进制数据块,流id用于标识一个帧属于哪个请求或响应。流是具有相同流id的帧的集合。 要发出HTTP请求,客户端首先将请求划分为二进制帧,并将请求的流ID分配给帧。然后,它与服务端建立TCP连接。连接成功后客户端开始向服务端发送帧数据。一旦服务端准备好响应,它就将响应划分为帧,并为响应帧提供相同的响应流id。服务端以帧的形式发送响应。 在 HTTP/2 中给请求流和响应流分配唯一 id 是必须的,因为多个不同的请求会使用同一个 TCP 连接发送。所以流 id 可以标识出一个帧属于哪个请求或响应。这样就能同步的发送多个 http 请求而不造成阻塞。...
## new 做了什么 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下操作: 1. 创建一个空对象 2. 设置该空对象的原型为构造函数的原型({}.__protp__ = constructor.prototype) 3. 执行构造函数,将 this 指向新创建的空对象 4. 如果构造函数没有返回值或返回的不是一个对象,则返回步骤 1 新创建的对象 ## 实现一个 new 根据以上步骤,用原生 js 实现一个 new ```js function _new(fn,...
## JavaScript 单线程语言 众所周知 JavaScript 是单线程语言,也就是说,同一时间只能做一件事。JavaScrpt之所以设计成单线程语言,是与它的用途有关, JavaScript 被设计之初的主要用途是操作 DOM, 假设如果有两个线程,一个线程在某个节点上添加元素,另外一个线程删除了这个节点,这时,浏览器该以哪个线程为准呢。所以为了避免这一问题, JavaScript 诞生之初就是单线程。 这样就可能导致的问题是,所有的任务都需要排队,只有前一个任务结束,才会执行后一个任务,如果前一个任务耗时太长,后一个任务就只能等着,如 IO 操作(AJAX请求等),在数据返回之前,CPU 一直是空闲状态,就大大浪费了时间和资源。所以 JavaScript 通过时间循环来解决这个问题。 ## Event Loop JavaScript 中所有任务分为两种,一种是同步任务,另一种是异步任务。同步任务是指,在主线程上排队的任务,只有前一个任务执行完毕,才会执行后一个任务。异步任务是指,不进入主线程,而是进入“任务队列”,只有“任务队列”通知主线程,某个异步任务可以执行了。该任务的回调函数才会进入主线程执行。异步任务又分为**宏任务**和**微任务** 具体来说,异步执行的运行机制如下。 1. JavaScript 中有一个主执行栈,所有同步任务都在主执行栈上执行。 2. 主执行栈之外,还存在一个“任务队列”,只有异步任务有了运行结果,就把回调函数放到”任务队列“之中。 3....