最近我男神拍结婚照了,感觉受到了伤害,哎,难过死了!换了工作之后要上手Node了项目了,其实一直想学习来着,奈何没有项目,现在终于有了,哈哈哈哈哈哈,学起来!这篇文章讲了node的一个大概,适合不懂node想了解的同学!
什么是Node.js
简单的说 Node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
Node.js 全局对象
所有模块都可以调用
1)global:表示Node所在的全局环境,类似于浏览器中的window对象。
2)process:指向Node内置的process模块,允许开发者与当前进程互动。
例如你在DOS或终端窗口直接输入node,就会进入NODE的命令行方式(REPL环境)。退出要退出的话,可以输入 process.exit();
3)console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。
通常是写console.log(),
Node.js全局函数
1)定时器函数:共有4个,分别是setTimeout(), clearTimeout(), setInterval(), clearInterval()。
2)require:用于加载模块。
Node.js全局变量
1)_filename:指向当前运行的脚本文件名。
2)_dirname:指向当前运行的脚本所在的目录。
Node.js准全局变量
模块内部的局部变量,指向的对象根据模块不同而不同,但是所有模块都适用,可以看作是伪全局变量,主要为module, module.exports, exports等。
module变量指代当前模块。module.exports变量表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。
module.id 模块的识别符,通常是模块的文件名。
module.filename 模块的文件名。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回使用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
这里需要特别指出的是,exports变量实际上是一个指向module.exports对象的链接,等同在每个模块头部,有一行这样的命令。
var exports = module.exports;
这造成的结果是,在对外输出模块接口时,可以向exports对象添加方法,但是不能直接将exports变量指向一个函数:
exports.自定义模块 = function (x){ console.log(x);};
上面这样的写法是无效的,因为它切断了exports与module.exports之间的链接。但是,下面这样写是可以的。
Node.js模块化结构
Node.js采用模块化结构,按照CommonJS规范定义和使用模块。模块与文件是一一对应关系,即加载一个模块,实际上就是加载对应的一个模块文件。
require命令用于指定加载模块,加载时可以省略脚本文件的后缀名。
一、Node中的常用核心模块
http:提供HTTP服务器功能。
url:解析URL。
fs:与文件系统交互。
querystring:解析URL的查询字符串。
child_process:新建子进程。
util:提供一系列实用小工具。
path:处理文件路径。
crypto:提供加密和解密功能,基本上是对OpenSSL的包装。
传送门:https://github.com/chyingp/nodejs-learning-guide
二、自定义模块
Node模块采用CommonJS规范。只要符合这个规范,就可以自定义模块,如下
//test.js
module.exports =function(obj) {
console.log(obj);
};
//main.js
var main = require('./test');
console.log('这是自定义模块:'+main('test~~~~~'));
//test
node main.js;
复制代码
NodeJS的回调函数
Node.js 异步编程的直接体现就是回调
Node 使用了大量的回调函数,对于IO读取完成后,作为回调函数的参数返回,在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。阻塞是按顺序执行的,而非阻塞是不需要按顺序的。
var http = require('http');
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/plain'});
response.write('-----hello,world\n');
response.end();
}).listen(8887);
console.log('server running at http://127.0.0.1:8887/');
var fs = require(``'fs'``);
var data = fs.readFileSync('1.txt');
console.log(data.toString());
console.log('end');
复制代码
NodeJS的事件循环、事件驱动
1、Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
2、Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
3、Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
4、Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
5、node.js 使用驱动模型时,当web server接收到请求
NodeJS的异常处理
Node是单线程运行环境,一旦抛出的异常没有被捕获,就会引起整个进程的崩溃。所以,Node的异常处理对于保证系统的稳定运行非常重要。
一般来说,Node有三种方法,传播一个错误。
- 使用throw语句抛出一个错误对象,即抛出异常。
- 将错误对象传递给回调函数,由回调函数负责发出错误。
- 通过EventEmitter接口,发出一个error事件。
1.try…catch结构
try{
process.nextTick(function () {
throw new Error("error");
});
} catch(err) {
//can not catch it`
console.log(err);
}
try {
setTimeout(function(){
throw new Error("error");
},1)
} catch(err) {
//can not catch it
console.log(err);
}
复制代码
2.回调函数
function async2(continuation) {
setTimeout(function() {
try{
var res = 42;
if(true)
throw new Error("woops!");
else
continuation(null, res); // pass 'null' for error
} catch(e) {
continuation(e, ``null``);
}
}, 2000);
}
async2(function(err, res) {
if(err)
console.log("Error: (cps) failed:", err);
else
console.log("(cps) received:", res);
});
// Error: (cps) failed: woops!`
复制代码
3.EventEmitter接口的error事件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();
emitter.emit('error', new Error('something bad happened'));
//使用上面的代码必须小心,因为如果没有对error事件部署监听函数,会导致整个应用程序崩溃。所以,一般总是必须同时部署下面的代码。
emitter.on(``'error'``, function(err) {
console.error(``'出错:'` `+ err.message);
});
复制代码
Mac下node多版本管理
在实际开发过程中,我们会发现不同是项目可能需要不同的node版本,版本不对的话就会有一些莫名其妙的报错,这个时候,我们就需要node多版本管理工具了