NodeJS速览

文件说明

$ npm install <Module Name> #然后使用require引入
$ $ npm init #引入模块
  • package.json 位于模块的目录下,用于定义包的属性

    main scripts字段

//package.jsons示例
{
  //项目名称
  "name": "demo",
  //版本号(遵守“主版本.次要版本.补丁号”的格式
  "version": "1.0.0",
  //description描述你的模块,或者搜索
  "description": "vue.js js iview ",
  //main字段指定了加载的入口文件,即主文件
  "main": "app.js",
  //scripts指定了运行npm start时,所要执行的命令
  "scripts": {
    "start": "node index.js"
  },
  //repository(仓库)指定一个代码存放地址
  "repository": {
    "type": "git",
    "url": "git+https://github.com/XXXX"
  },
  //作者
  "author": "mayuan",
  //授权方式
  "license": "MIT",
  //指明node.js运行所需要的版本
  "engines": {
      "node": "0.10.x"
  },
  "bugs": {
      "url": "https://github.com/XXXX"
  },
  // 一个字符串数组,方便别人搜索到本模块
  "keywords": [
  "vue","iview"
  ],

  //devDependencies指定项目开发所需要的模块
  "devDependencies": {
      "babel-core": "^6.23.1",
      "babel-loader": "^6.3.2",
      "babel-preset-es2015": "^6.22.0",
      "vue-html-loader": "^1.0.0",
      "vue-loader": "^8.5.2",
      "vue-style-loader": "^1.0.0",
      "webpack": "^1.13.2"
  },
  //dependencies字段指定了项目运行所依赖的模块
  "dependencies": {
      "express": "latest", //指定express是最新版本
      "mongoose": "~3.8.3",
      "handlebars-runtime": "~1.0.12",
      "express3-handlebars": "~0.5.0",
      "MD5": "~1.2.0"
  }
}

回调函数

Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。回调函数一般作为参数的最后一个参数出现:

function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }
var fs = require("fs");

fs.readFile('input.txt', function (err, data) { //异步函数用于读取文件
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");

事件循环

  • Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高

  • Node.js 几乎每一个 API 都是支持回调函数的

  • Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现

  • Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数

观察者模式: 定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

模式的秘密——观察者模式

img

EventEmitter

  • Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列
  • Node.js里面的许多对象都会分发事件:一个net.Server 对象会在每次有新连接时分发一个事件, 一个fs.readStream 对象会在文件被打开的时候发出一个事件, 所有这些产生事件的对象都是 events.EventEmitter 的实例
//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
    console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
    event.emit('some_event'); 
}, 1000); 
//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

EventEmitter 的属性

var events = require('events');
var eventEmitter = new events.EventEmitter();

var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

eventEmitter.addListener('connection', listener1);// 绑定 connection 事件,处理函数为 listener1 
eventEmitter.on('connection', listener2);// 绑定 connection 事件,处理函数为 listener2

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

eventEmitter.emit('connection');// 处理 connection 事件 
eventEmitter.removeListener('connection', listener1);// 移除监绑定的 listener1 函数
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类

Buffer(缓冲区)

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

模块系统

一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。

  • 方式一
//从外部获取一个模块的接口 main.js
var hello = require('./hello');
hello.world();

//模块公开的接口 hello.js
exports.world = function() {
  console.log('Hello World');
}
  • 方式二
//hello.js 
function Hello() { 
    var name; 
    this.setName = function(thyName) { 
        name = thyName; 
    }; 
    this.sayHello = function() { 
        console.log('Hello ' + name); 
    }; 
}; 
module.exports = Hello;

//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello(); 
//Person.js
module.exports = function(log){
    llog = log;
    console.log(llog);
}
//main.js
var Person = require('./Person');
Person("this is a test");

函数

  • 常规函数
function say(word) {
  console.log(word);
}

function execute(someFunction, value) {
  someFunction(value);
}

execute(say, "Hello");
  • 匿名函数
function execute(someFunction, value) {
  someFunction(value);
}

execute(function(word){ console.log(word) }, "Hello");

参考资料

Node.js 教程

猜你喜欢

转载自blog.csdn.net/robothj/article/details/80717734