Node.js初体验(一)
1.什么是Node.js?
简单的说 Node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
2.Node.js的特点?
Node.js优点:
1、采用事件驱动、异步编程,为网络服务而设计。其实Javascript的匿名函数和闭包特性非常适合事件驱动、异步编程。而且JavaScript也简单易学,很多前端设计人员可以很快上手做后端设计。
2、Node.js非阻塞模式的IO处理给Node.js带来在相对低系统资源耗用下的高性能与出众的负载能力,非常适合用作依赖其它IO资源的中间层服务。
3、Node.js轻量高效,可以认为是数据密集型分布式部署环境下的实时应用系统的完美解决方案。
Node.js缺点:
1、可靠性低。
2、单进程,单线程,只支持单核CPU,不能充分的利用多核CPU服务器。一旦这个进程崩掉,那么整个web服务就崩掉了。
3.Node.js和JavaScript的对比?
在ECMAScript部分Node.js和JavaScript是一样的,比如数据类型的定义,语法结构,内置对象等。
本质区别:
node.js和javascript区别还是挺大的,1个平台,1个是编程语言;
javascript是客户端编程语言,需要浏览器的javascript解释器进行解释执行;
node.js是一个基于Chrome JavaScript运行时建立的平台,它是对Google V8引擎进行了封装的运行环境。
- 简单的说node.js就是把浏览器的解释器封装起来作为服务器运行平台,用类似javascript的结构语法进行编程,在node.js上运行。
内容细节的区别:顶层对象不同,JavaScript的顶层对象是Window对象,Node.js的顶层对象是Global对象,在node没有window。
4.Global对象包含的属性:
5.Global对象的内置属性:_filename,_dirname
_filename:当前文件被解析过后的绝对路径,这个属性不是全局的,而是模块作用域下的。
console.log(__filename); //E:\nodejs\base\base.js
结果说明:因为运行这行代码时的文件保存的路径为:E:\nodejs\base\base.js
_dirname:返回当前模块文件被解析后的绝对路径,这个属性也不是全局的,而是模块作用域下的。
例如:console.log(__dirname); //E:\nodejs\base
等同于 __filename 的 path.dirname()。
例如,从 /Users/mjr 运行 node example.js:
console.log(__dirname);
// 输出: /Users/mjr
console.log(path.dirname(__filename));
// 输出: /Users/mjr
6.模块(module)
在node中,模块和文件是一一对应的,一个文件就是一个模块。
每个模块都有自己的作用域。
通过var声明的变量,并不是全局变量,而是该模块作用域下的。
例如:
var a =100;
console.log(a); //100
console.log(global.a); //undefined
global.a = 200;
console.log(a); //100
console.log(global.a); //200
7.模块加载:require(‘模块’)
(1) 例: base.js文件:
require("./modle.js");
modle.js文件:
console.log("这是被加载的模块里的内容");`
执行base.js后控制台会显示:这是被加载的模块里的内容 ,表示模块加载成功。
(2) 注意:模块加载的路径问题。
- 绝对路径 : require(“E:\nodejs\base\modle.js”);
- 相对路径 : require(“./modle.js”);
- 加载 node中的核心模块或是node_modules(这个文件是安装node时带有的): require(“modle.js”);
(3) node文件查找加载的顺序:
1)首先根据文件名查找。
2)没有,在文件名后加上.js后缀查找。
3).js没有,在文件名后加.json后缀进行查找。
4).json还没有,则在文件名后加.node后缀进行查找。
例如:require(“modle”);
1)先查找有没有modle文件。
2)modle文件没有,查找有没有modle.js文件。
3)modle.js文件没有,查找有没有modle.json文件。
4)modle.json文件还没有,查找有没有modle.node文件。
5)都没有就没找到。
(4) 模块机制:在一个模块中,var定义的变量,其作用域是当前的,不能被其他模块访问。
一个模块中访问里一个模块中var定义的变量,方法有:
(A)把变量作为global对象的一个属性(不推荐使用)
(B)使用模块对象:module
module对象:保存提供和当前模块有关的信息。
例如: console.log(module);
控制台输出的结果如下图:
(5) module对象中,有一个子对象:exports ,可以通过这个子对象,把一个模块中的局部变量对外提供访问。
例如:modle.js文件:
var a=100;
module.exports.a = a;
base.js文件:
var s = require('./modle.js');
console.log(s); //控制台输出结果:{ a: 1000 }
require()方法加载模块时,其返回值是加载模块中的module.exports
在模块作用域下,还有一个内置对象就是:exports ,它其实就是module.exports
console.log(module.exports === exports); //true
例如:modle.js文件:
var a =100;
exports.a = 100;
base.js文件:
var s = require('./modle.js');
console.log(s); //控制台输出结果:{ a: 100 }
但是:类似module.exports = XXX; 这样的写法,会使得module.exports和exports的指向关系断开。
例如:例如:modle.js文件:
module.exports = [1,2,3];
exports.a = 100;
base.js文件:
var s = require('./modle.js');
console.log(s); //[ 1, 2, 3 ]
结果只会输出[ 1, 2, 3 ],而并不会输出100,因为exports 和module.exports的指向关系已经断开了。
exports=xxx,这样的写法也会造成和上面一样的结果。
所以一般的操作就只是添加module.exports属性,而不会像以上这两种做法去操作。