当Web请求发起时,会先查看本地是否有该资源已缓存的副本,如果有,就直接从本地读取,而不需要从原始服务器中获取该资源。这样一来可以非常有效地减少冗余的数据传输,也可以减轻原始服务器的请求压力。下图就是一个请求的神奇之旅: 左边虚线框都是在缓存层完成,大部分情况下是指浏览器内部的缓存机制,也可以指一些缓存代理服务,如CDN等(本文不讨论);右边虚线框都是在服务器端完成的。 下面就按照这个流程图,客户端使用Chrome浏览器打开Google(但愿你看到的不是404 not found)来演示不同场景下的请求。 缓存未命中 这是最简单的场景,所有资源都是从服务器返回,就好像没有缓存这一层一样。通常是资源从来没有请求过,或者在请求头部指明不使用缓存。Chrome开发者工具有个很方便的功能,就是可以设置当打开开发者工具时禁用缓存: 它的原理很简单,就是在每个请求前加上不使用缓存的头部cache-control: no-cache和pragma: no-cache: 在给静态文件打版本号还没流行的时候,这个办法也常用来更新静态文件的缓存,即用Aja…

原文:How to get a performance boost using Node.js native addons 也许你已经听说过上千次,但我今天要向你展示什么是Node.js的原生模块,以及你为什么应该关注它们。 Node.js addons是使用C或C++编写的动态链接共享对象,可以使用require()方法加载,并且像其他普通的Node.js模块一样使用。 (译注:addons: 扩展,为保持统一叫法,不予翻译) 说得这么好听,但是,为什么要我写C++代码,JavaScript已经让我很爽了,并且上一次看到C+…

Rock with async/await 本篇文章是作为上一篇的续集,考虑到第一篇的篇幅,还有更重要的一点就是上一篇讲的内容已经可以直接应用在最新版本的Node.js和一些高级浏览器(Chrome,FF)中,具体兼容性可参考:https://kangax.github.io/compat-table/es6/。 而这一篇讲的内容,是ECMAScript 2016(ES7)的async/await特性,目前的兼容性可参考:http://kangax.github.io/compat-table/esnext/#test-async_functions,虽然现在来看还不是非常乐观,但是我们可以通过第三方的代码转换工具(…

新的开发同事入职,总是要去帮他们重新搭建开发环境,刚开始一两个倒觉得还好,花半天时间就可以搞定;但随着新加入人数越来越多,而且还经常会碰到同事电脑上的某个服务没启动,导致项目没法跑起来,又要帮忙调试,这些无脑的体力活也变得越来越冗长乏味。消除重复,是程序猿的天生职责,工作的重复也不例外。 于是我找到了Vagrant,其实早在2014年就听说,只是当时团队还很小,而且每个人都能驾驭自己的开发环境,所以没多留意,只是知道有这么个东西。现在回想,当时真是目光短浅,早用起来就不会发上面那段牢骚了。下面进入正题。 什么是Vagrant? Vagrant为开发环境而生,是用于创建并配置轻量的、可重现的、可移植的开发环境。 为什么要用Vagrant? 据我了解,目前团队合作的开发环境大致分为三种: 第一种:每个人的电脑都有一套独立配置的开发环境。这种方式如果在项目中需要依赖一个新的服务,那所有人的电脑都要挨个装个遍,虽然这个情况不会经常出现,…

本文通过一个简单的需求:读取文件并备份到指定目录(详见第一段代码的注释),以不同的js代码实现,来演示代码是如何变优雅的。对比才能分清好坏,想知道什么是优雅的代码,先看看糟糕的代码。 不优雅的代码是什么样的? 1、 回调地狱 /** * 读取当前目录的package.json,并将其备份到backup目录 * * 1. 读取当前目录的package.json * 2. 检查backup目录是否存在,如果不存在就创建backup目录 * 3. 将文件内容写到备份文件 */ fs.readFile('./package.json', function(err, data) { if (err) { console.error(err)…