文件说明
-
npm是随同node.js一起安装的包管理工具,能解决node.js代码部署上的很多问题
$ 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)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数
观察者模式: 定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
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");
参考资料