Koa 是一个类似于 Express 的 Web 开发框架,创始人也是同一个人。它的主要特点是,使用了 ES6 的 Generator 函数,进行了架构的重新设计。也就是说,Koa 的原理和内部结构很像 Express,但是语法和内部结构进行了升级。

官方faq有这样一个问题:“为什么 koa 不是 Express 4.0?”,回答是这样的:“Koa 与 Express 有很大差异,整个设计都是不同的,所以如果将 Express 3.0 按照这种写法升级到 4.0,就意味着重写整个程序。所以,我们觉得创造一个新的库,是更合适的做法。”

Koa 应用

一个 Koa 应用就是一个对象,包含了一个 middleware 数组,这个数组由一组 Generator 函数组成。这些函数负责对 HTTP 请求进行各种加工,比如生成缓存、指定代理、请求重定向等等。

1
2
3
4
5
6
7
8
var koa = require("koa");
var app = koa();

app.use(function* () {
this.body = "Hello World";
});

app.listen(3000);
阅读全文 »

PhantomJS

概述

有时,我们需要浏览器处理网页,但并不需要浏览,比如生成网页的截图、抓取网页数据等操作。PhantomJS的功能,就是提供一个浏览器环境的命令行接口,你可以把它看作一个“虚拟浏览器”,除了不能浏览,其他与正常浏览器一样。它的内核是 WebKit 引擎,不提供图形界面,只能在命令行下使用,我们可以用它完成一些特殊的用途。

PhantomJS 是二进制程序,需要安装后使用。

1
npm install phantomjs -g
阅读全文 »

Gulp 与 Grunt 一样,也是一个自动任务运行器。它充分借鉴了 Unix 操作系统的管道(pipe)思想,很多人认为,在操作上,它要比 Grunt 简单。

安装

Gulp 需要全局安装,然后再在项目的开发目录中安装为本地模块。先进入项目目录,运行下面的命令。

1
2
3
npm install -g gulp

npm install --save-dev gulp

除了安装 gulp 以外,不同的任务还需要安装不同的 gulp 插件模块。举例来说,下面代码安装了 gulp-uglify 模块。

阅读全文 »

Browserify:浏览器加载 Node.js 模块

随着 JavaScript 程序逐渐模块化,在 ECMAScript 6 推出官方的模块处理方案之前,有两种方案在实践中广泛采用:一种是 AMD 模块规范,针对模块的异步加载,主要用于浏览器端;另一种是 CommonJS 规范,针对模块的同步加载,主要用于服务器端,即 node.js 环境。

Browserify 是一个 node.js 模块,主要用于改写现有的 CommonJS 模块,使得浏览器端也可以使用这些模块。使用下面的命令,在全局环境下安装 Browserify。

1
npm install -g browserify

基本用法

阅读全文 »

Grunt:任务自动管理工具

在 Javascript 的开发过程中,经常会遇到一些重复性的任务,比如合并文件、压缩代码、检查语法错误、将 Sass 代码转成 CSS 代码等等。通常,我们需要使用不同的工具,来完成不同的任务,既重复劳动又非常耗时。Grunt 就是为了解决这个问题而发明的工具,可以帮助我们自动管理和运行各种任务。

简单说,Grunt 是一个自动任务运行器,会按照预先设定的顺序自动运行一系列的任务。这可以简化工作流程,减轻重复性工作带来的负担。

安装

Grunt 基于 Node.js,安装之前要先安装 Node.js,然后运行下面的命令。

阅读全文 »

概述

Lint 工具用于检查代码的语法是否正确、风格是否符合要求。

JavaScript 语言的最早的 Lint 工具,是 Douglas Crockford 开发的 JSLint。由于该工具所有的语法规则,都是预设的,用户无法改变。所以,很快就有人抱怨,JSLint 不是让你写成正确的 JavaScript,而是让你像 Douglas Crockford 一样写 JavaScript。

JSHint 可以看作是 JSLint 的后继者,最大特定就是允许用户自定义自己的语法规则,写在项目根目录下面的.jshintrc文件。

JSLint 和 JSHint 同时检查你的语法和风格。另一个工具 JSCS 则是只检查语法风格。

阅读全文 »

RequireJS 和 AMD 规范

概述

RequireJS 是一个工具库,主要用于客户端的模块管理。它可以让客户端的代码分成一个个模块,实现异步或动态加载,从而提高代码的性能和可维护性。它的模块管理遵守AMD 规范(Asynchronous Module Definition)。

RequireJS 的基本思想是,通过 define 方法,将代码定义为模块;通过 require 方法,实现代码的模块加载。

首先,将 require.js 嵌入网页,然后就能在网页中进行模块化编程了。

阅读全文 »

Source Map

概述

随着 JavaScript 脚本变得越来越复杂,大部分源码(尤其是各种函数库和框架)都要经过转换,才能投入生产环境。

常见的源码转换,主要是以下三种情况:

  • 压缩,减小体积。比如 jQuery 1.9 的源码,压缩前是 252KB,压缩后是 32KB。
  • 多个文件合并,减少 HTTP 请求数。
  • 其他语言编译成 JavaScript。最常见的例子就是 CoffeeScript。
阅读全文 »

为什么要写测试?

Web 应用程序越来越复杂,这意味着有更多的可能出错。测试是帮助我们提高代码质量、降低错误的最好方法和工具之一。

  • 测试可以确保得到预期结果。
  • 加快开发速度。
  • 方便维护。
  • 提供用法的文档。

通过测试提供软件的质量,在开始的时候,可能会降低开发速度。但是从长期看,尤其是那种代码需要长期维护、不断开发的情况,测试会大大加快开发速度,减轻维护难度。

测试的类型

阅读全文 »

数组方法详细介绍:Array 对象

数组的四个基本方法

数组元素的添加和删除

方法描述备注
push()向数组的最后面插入一个或多个元素,返回结果为该数组新的长度会改变原数组
pop()删除数组中的最后一个元素,返回结果为被删除的元素会改变原数组
unshift()在数组最前面插入一个或多个元素,返回结果为该数组新的长度会改变原数组
shift()删除数组中的第一个元素,返回结果为被删除的元素会改变原数组

数组的常见方法

阅读全文 »