Skip to main content

· 2 min read
Goroyal Dai

我们在 Linux 的命令行里面会用到exit,比方说退出某个 shell。在 shell 脚本中这个命令可以终止脚本的执行。exit后面是可以接一个数字表示退出时候的状态。

· 6 min read
Kimi Gao

前言

对于一些 GitHub 上的仓库,我们希望当代码进入 master 或者其它特定分支时网站能够自动部署。此时,就需要用到 Github Webhooks 功能。本文以静态网站的自动化部署为例,介绍如何配置 GitHub webhook、如何写自动化脚本以及如何开启监听服务等,非静态网站原理也是类似。

整体流程

github-webhooks-sequence-chart

Happy Path

· 6 min read
Robbie Han

前言

exports 和 module.exports这篇博客中,我们详细解释了在 CommonJS 规范中exportsmodule.exports的区别。本篇博客将讨论 CommonJS 规范和 ES6 规范模块导出之间的关系。

export 和 export default

ES6 导出模块一般会使用exportexport default,使用两者的语法在 javaScript 文档中的ES6 Module已经做了详细的讲解,此处不再赘述。那么为什么已经有了export还要整个export default呢?exportexport default之间的关系是什么呢?下面的内容也将通过这两个问题进行展开。

为什么已经有了 export 还要整个 export default 呢?

在 ES6 模块中,如果模块导出中使用export var name = 'Robbie',那么在导入改模块的时候,导入的变量必须与之相对应,即import {name} form Info。而export default name在模块导入时的导入变量的命名可是任意的import myName form Info。对比两者来看使用export default可能具有更高的灵活性,也更便于不熟悉该库的开发者进行开发。

export 和 export default 之间的关系是什么呢?

我们知道浏览器是不支持 ES6 模块语法的,所以对于代码中的 ES6 模块一般是采用 Babel 转成 CommonJS 规范的代码。此时的代码虽然浏览器仍然不能执行,但是 Node 可以,因为 webpack 是基于 Node 构建的,所以我们可以通过 webpack 将代码打包成浏览器支持的 ES5 代码。

· 7 min read
Robbie Han

前言

exportsmodule.exports这两个之间的关系一直傻傻的分不清,为啥有了module.exports还要有exports?我想通过这篇文章来理清两者之间的关系。

引用类型的形参

在说这两个之前,想先说一个知识点,当 JS 函数参数是引用类型时,其形参在函数内的改变对原变量的影响,这也是理解exportsmodule.exports关系的关键。

· 9 min read
Robbie Han

什么是 Web Service:

相比于 Web Service(网络服务),“本地服务”这个名词我们似乎更加的熟悉。本地服务通过本地的计算机环境为系统功能提供服务,完成某项特定的功能,使用期间不需要使用网络。而对应的 Web Service 则是利用网络调用其他网站的资源来实现系统的某项特定功能。

​ 例如,当我们想在个人网站中添加一个显示天气的功能时,如果我们仅仅使用一些简单的前端组件显然是无法实现的。这项功能的数据可能不仅依赖于数据库的分析,甚至还需要卫星的探测等。此外,天气展示这项功能并不是我们这个网站中的核心功能,我们不会为了实现这项功能付出太多的开发成本。

图:360导航中的天气功能

于是乎,Web Service 就应运而生了。对于像在网页上显示天气、地图、Twitter 上的最新动态这类的非核心功能,我们不需要自己去开发,Web Service 就可以让我们的网站使用其他网站的资源。这些网络资源会向外界暴露出能够通过 Web 进行调用的 API,我们只需要调用这些 API,就可以拿到这些网络资源的数据

· 5 min read
Robbie Han

正向代理

A 同学创业需要启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了。情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来 A 同学的大学老师王老师是马云的同学,于是 A 同学找到王老师,托王老师帮忙去马云那借 500 万过来。

不过马云并不知道这钱是 A 同学借的,马云是借给王老师的,最后由王老师转交给 A 同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理。王老师代替 A 同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。

正向代理的过程中,服务器并不知道真正的客户端是谁,客户端的请求都是依靠代理服务器来请求。在我们访问谷歌的时候,会被防火墙阻止,此时我们需要购买一款可以翻墙的服务器,这个翻墙的服务器就扮演者正向代理的角色。

· 5 min read
Robbie Han

setTimeout 和 setInterval 功能

setTimeout()会在确定的时间调用回调函数,且回调函数只会执行一次。

setInterval()会重复调用一个函数,在每次调用之间具有固定的时间延迟。

为什么要模拟

为什么使用setTimeout模仿setInterval呢?这需要通过事件循环机制来解释,如果不清楚的话可以点击查看事件循环机制浏览器内核相关内容。

由于setIntervalsetTimeout不是 JS 中定义的,他们并不会在 JS 引擎线程中直接执行。当代码执行到setIntervalsetTimeout时,事件循环机制会为setTimeoutsetInterval开一个定时器线程并开始计时,等定义的时间过后,将回调函数放到回调队列里,等到函数调用栈空(JS引擎线程空闲)时,将回调函数放入函数调用栈(使用 JS 引擎线程)执行。

· 4 min read
Robbie Han

前言:

浏览器事件循环经典题目:

for (var i=0; i<5; i++) {
setTimeout( function timer() {
console.log(new Date, i);
}, 1000);
}
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5

解析: 根据 setTimeout 定义的操作在函数调用栈清空之后才会执行的特点,for 循环里定义了 5 个 setTimeout 操作。而等待 1 秒后,任务队列里的 setTimeout 开始依次执行时,for 循环的 i 值,已经先一步变成了 5。因为任务队列推到函数调用栈执行的时间可以忽略不记(毫秒级),所以打印的 GMT 时间(精确到秒)和 i 的值都是相同的。