了不起的Node.js:将JavaScript进行到底

书名:SMASHING Node.js : JavaScript Everywhere

原作者:(美)劳奇 Rauch.G

译者:赵静

出版日期:2014.1

Node中的JavaScript

1. global对象

在浏览器中,全局对象指的是window对象。在window对象上定义的所有内容(属性和函数)都可以被全局访问到。

setTimeout  === window.setTimeout
document === window.document

Node中的2个全局对象:

  • global--类似window对象,global对象上的属性都可以被全局访问到
  • process-所有全局执行上下文中的内容都在preocess对象中。

2. 模块系统

Node内置了很多实用的模块作为基础工具,包括http、net、fs等。

Node摒弃了采用定义一堆全局变量的方式,转而引入了一个简单却强大无比的模块系统,该模块系统有3个核心的全局对象:requiremoduleexports

绝对模块

绝对模块是指Node通过在其内部node_modules查找到的模块,或者Node内置的如fs这样的模块。

require('http');
require('fs');

直接通过名字来require这个模块,无须添加路径名的,就是绝对模块。

对于使用npm来安装的模块,例如安装colors模块,当安装完毕后,其路径就变成了./node_modules/colors

可以直接通过名称来require。

require('colors);

这种情况也是绝对模块。

相对模块

相对模块是将require指向一个相对工作目录中的js文件。例如

require('./src/module_a');
require('./src/module_b');

暴露API

暴露一个对象

在默认情况下,每个模块都会暴露出一个空对象。可以使用exports来暴露对象的属性和函数。

// module_a.js
exports.name = 'john';
exports.data = 'this is some data'; var privateVar = 5; exports.getPrivate = function(){
return privateVar;
}

在main.js 中调用

var a = require('./src/module_a');

console.log(a.name); //john
console.log(a.data); // this is some data
console.log(a.getPrivate()); // 5

暴露一个构造函数

person.js

module.exports = Person; // 对module.exports重写

function Person(name){
this.name = name;
} Person.prototype.talk = function(){
console.log('my name is' , this.name);
}

main.js

var Person = require('./src/person');

var John = new Person('John');
John.talk(); // my name is John

事件

在Node中事件的监听和分发使用EventEmit,定义了on 、 emit、once等方法。

使用EventEmitter

var EventEmitter = require('events');
var a = new EventEmitter();
a.on('event', function(){
console.log('event called.');
}); a.emit('event');

让自定义的类也可以使用事件监听,需要继承自EventEmitter。

使用原型继承方式

修改person.js

module.exports = Person;

function Person(name){
this.name = name;
} const EventEmitter = require('events');
Person.prototype = new EventEmitter; Person.prototype.talk = function(){
console.log('my name is' , this.name);
}

在main.js中调用

var Person = require('./src/person');

var John = new Person('John');
John.talk();
John.on('sleeping', function(){
console.log('sleeping called.')
}); John.emit('sleeping');

ES6继承方式

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');

3. 文件系统

Node中使用fs模块操作文件。

同步读取文件

var fs = require('fs');

// 同步获取当前目录的文件列表
console.log(fs.readdirSync('.'));

异步读取文件(推荐方式)

var fs = require('fs');
// 异步的方式
function async(err, files){
console.log(files);
} fs.readdir(__dirname, async);

流对象

process全局对象中包含了3个流对象,分别对应3个Unix标准流。

  • stdin 标准输入
  • stdout 标准输出
  • stderr 标准错误

当前工作路径

process.cwd();
// or
__dirname

监视文件变化

使用fs.watchFile 或fs.watch监视文件变化

var fs = require('fs');
function callBackFiles(err, files){
files.forEach(function(file){
// 监听后缀是css的文件
if(/\.css/.test(file)){
fs.watchFile(process.cwd() + '/' + file, function(){
console.log(' - ' + file + ' changed!');
});
}
});
}
var files = fs.readdir(process.cwd(), callBackFiles);

当修改index.css文件并保存后,控制台将输出。

Smashing Nodejs 读书笔记(二)的更多相关文章

  1. Smashing Nodejs 读书笔记(一)

    了不起的Node.js:将JavaScript进行到底 书名:SMASHING Node.js : JavaScript Everywhere 原作者:(美)劳奇 Rauch.G 译者:赵静 出版日期 ...

  2. 深入浅出Nodejs读书笔记

    深入浅出Nodejs读书笔记 转:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html cate ...

  3. 《你必须知道的.NET》读书笔记二:小OO有大原则

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...

  4. spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...

  5. ES6读书笔记(二)

    前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,现在为第二篇,本篇内容包括: 一.数组扩展 二.对象扩展 三.函数扩展 四.Set和Map数据结构 五.Reflect 本文 ...

  6. spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...

  7. 【记】《.net之美》之读书笔记(二) C#中的泛型

    前言 上一篇读书笔记,很多小伙伴说这本书很不错,所以趁着国庆假期,继续我的读书之旅,来跟随书中作者一起温习并掌握第二章的内容吧. 一.理解泛型 1.为什么要使用泛型?-----通过使用泛型,可以极大地 ...

  8. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  9. nodejs爬虫笔记(二)---代理设置

    node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var chee ...

随机推荐

  1. 375-基于TI DSP TMS320C6657、XC7K325T的高速数据处理核心板

    基于TI DSP TMS320C6657.XC7K325T的高速数据处理核心板 一.板卡概述    该DSP+FPGA高速信号采集处理板由我公司自主研发,包含一片TI DSP TMS320C6657和 ...

  2. Educational Codeforces Round 55 (Rated for Div. 2) D. Maximum Diameter Graph (构造图)

    D. Maximum Diameter Graph time limit per test2 seconds memory limit per test256 megabytes inputstand ...

  3. blazeFace

    围绕四个点构造模型 1.扩大感受野 使用5*5卷积替换3*3来扩大感受野,在深度分离卷积中,pw与dw计算比为d/k^2,d为输出通道,k为 dw的卷积核,即增加dw的卷积核所带来的计算并不大. 在M ...

  4. php内置函数分析之array_fill_keys()

    PHP_FUNCTION(array_fill_keys) { zval *keys, *val, *entry; if (zend_parse_parameters(ZEND_NUM_ARGS(), ...

  5. 图解NuGet服务器搭建和使用过程

    听语音 浏览:0 | 更新:2017-10-31 09:13 | 标签:服务器 1 2 3 4 5 6 7 分步阅读 本篇经验将和大家介绍内网搭建NuGet服务器的步骤,希望对大家的工作和学习有所帮助 ...

  6. 用递归将嵌套的JSON对象遍历出来,转为二维数组 或一维数组

    var map = new Array();//二维数组 var map2 = new Array();//一维数组 for (var i = 0; i < e.Data.length; i++ ...

  7. 阅读《Effective Java》每条tips的理解和总结(2)(持续更新)

    15. 使类和成员的可访问性最小化 一个好用的类的属性必须要隐藏起来,干净的将它与类的api分离开来,类之间只通过api相互使用,降低他们之间的耦合性.为了做到这一点,建议根据情况选择尽可能低的访问级 ...

  8. python如何导入自定义文件和模块$PYTHONHOME$\Lib\site-packages 方法

    python 中如何引用自己创建的源文件(*.py)呢? 也就是所谓的模块. 假如,你有一个自定义的源文件,文件名:saySomething.py .里面有个函数,函数名:sayHello.如下图: ...

  9. 【Linux】CentOS6上安装Python3.7(config、make、make install)及“No module named '_ctypes'”/pip install时“ssl module in Python is not available.”的解决

    1.下载安装包 https://www.python.org/ftp/python/ 该目录下选择所需要的版本进行下载.解压. wget https://www.python.org/ftp/pyth ...

  10. 软件安装——JRE多版本问题

    [Q]运行UMongo.exe文件时显示错误信息“The registry refers to a nonexsistent JAVA Runtime Envioroment or the Runti ...