node-js-best-practices-how-to-become-a-better-developer-in-2017
一年前,我们写了一篇文章How to Become a Better Node.js Developer in 2016 ,这篇文章成功地获取了不错的反响,所以我想现在是时候回顾这个主题为2017年做准备了。
Closures
Closures are functions that refer to independent (free) variables (variables that are used locally, but defined in an enclosing scope). In other words, these functions ‘remember’ the environment in which they were created. — MDN
看不懂上面的英文这么办,下面是中文翻译
闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。
Javascript原型链
原型链的继承就是将子类的prototype.__proto__
链接到父类的prototype
,借此完成原型链1
child.prototype.__proto__.= parent.prototype
实例化的对象没有prototype
,prototype
是函数特有的属性,所有的对象都有__proto__
, 这是指向实例化这个对象的类的prototype
,所有对象的原型链最后是null
Javascript 代码优化
客户端的脚本可以使你的应用变得动态和生动,但是浏览器对于JavaScript的解释可能会导致效率的底下,而且随着客户端本身的不同也会导致性能的不同。我们整理了一些建议和最好的实践来优化你的Javascript 代码。
About this and prototype
对于js中this创建的对象,相当于改变了自身的字面量,而本身有一个自带的属性为prototype,这个不属于字面量的内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function Person () {
this.name = "wang";
this.age = 15;
}
Person.prototype.name = 'lala';
var john = new Person();
console.log(JSON.stringify(john));
//{name:"wang", age:15}
//这里说明了this等同于的是对象字面量
console.log(john.name)
//“wang”,这里说明了,js会优先寻找字面量里面是否有这个对象,其次才会去prototype里面寻找
对象的样子如下1
2
3
4
5
6
7
8{
name:'wang',
age: 15,
prototype:{
constructor:[Function],
name: 'lala'
}
}
require()
1 | module = new Module() //module 为 Module类的实例 |
1 | var Module = function(id, parent) { |
1 | var require = function(){ |
模块的加载实质上就是,注入exports、require、module三个全局变量,然后执行模块的源码,然后将模块的 exports 变量的值输出。—— require() 源码解读
所以说每一个require的文件执行的过程,都是先读取文件,注入变量,再执行代码,所以node文件不需要自己实例化Module,在require的时候会自动实例化的,所以从另一个角度说,文件并不会直接执行,所以看上去文件中的require,module等变量都为创建而可以执行。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17//a.js
exports.multiply = function(n) {
return n * 1000
};
//index.js
require('./a.js')
//require('./a.js')实际的变为了
var module = {
exports: {}
};
(function(module, exports) {
exports.multiply = function(n) {
return n * 1000
};
}(module, module.exports))
return module.exports;
use generator and co in mocha
主要的点在于当 it()
函数的回调函数带有done参数,mocha会等到回调函数里面出 done
或者或者超时才完成一条测试。同时因为每个测试用例最多执行2000毫秒,所以要面对需要很长时间的测试,需要通过设置 -t
来修改最长时间(暂时没有更好的方法)1
2
3
4it('option is empty', function(done) {
...
done()//结束一条测试
});
例子
1 | describe('runBash', function() { |
ps
Mocha默认每个测试用例最多执行2000毫秒(可以通过-t来调整)
Mocha默认会高亮显示超过75毫秒的测试用例(可以通过-s来调整)
<<测试框架 Mocha 实例教程>>(阮一峰)