node简介
-node.js是一个能够在服务器端运行javascript的开放源代码、跨平台javascript运行环境
-node采用google开发的V8引擎运行代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模
总结:node.js扩展了js的适用范围,从前端到整个系统(浏览器–》服务器)
瑞安·达尔(node之父),node主要借鉴Ruby
所有项目最终的问题都是i/o问题,
node主要是在客户端和服务器间加了一个node服务器,用来渲染页面
node的用途
- WEB服务api,比如REST
- 实时多人游戏
- 后端的WEB服务,例如跨域、服务器端的请求
- 基于WEB的应用
- 多客户端的通信,如即时通信
node的服务器单线程的
-node处理请求时时单线程,但是后台已拥有一个I/O线程池
-node单线程的解决方法—分布式,多布置几个node服务器
node执行js文件:
外部执行:进入命令行窗口,进到js文件所在的目录下,node 文件名
内部执行:右击run执行(ws)
CommonJS规范
ECMAScript标准的缺陷
- 没有模块系统
- 标准库较少
- 没有标准接口
- 缺乏管理系统
CommonJS的提出主要是弥补当前javascript没有标准的规范的缺陷
CommonJS对模块的定义:
-模块引用
-模块定义
-模块标识
模块化(module)—将完成的程序按照一定的标准分为小块程序
- 降低了程序之间的耦合性
- 提高了代码的复用性
在node中,一个js 就是一个模块
在node中,每一个js文件中的js代码都是独立运行在一个函数中(自执行函数)
而不是全局作用域,所以一个模块中的变量和函数在其他的模块中无法访问
require()函数node引入其他的模块:
在node中,通过require()函数来引入外部的函数
require()可以传递一个文件的路径作为参数,node将会自动根据该路径引入外部模块(每个模块都是封闭的)
这里路径使用相对路径,必须使用…或者.开头
require('./module.js');
使用require()引入模块以后,该函数会返回一个对象(md),这个对象是引入的模块
var md = require('./module.js');
exports向外部暴露属性和方法
只需要将需要暴露给外界的变量和属性设置为exports属性即可
exports.x = '我是module.js 中的x';
exports.fn = function (){};
模块标识
模块标识,使用require()引入外部模块时,使用的就是模块标识(下面的路径’./module.js’就是模块标识),通过模块标识可以找到指定的模块
-模块分为两大类:
核心模块
-由node引擎提供的模块
-核心模块的标识就是模块的名字
文件模块
-由用户自己的创建的模块
-文件模块的标识就是文件的路径(绝对路径和相对路径)
相对路径使用./和…/
var md = require('./module.js');
global
在node中有一个全局对象global,它的作用和网页中的window类似
在全局中创建的变量都会作为global的属性保存
在全局中创建的函数都会作为global的方法保存
注意:
1.当node 在执行模块中的代码时,会在代码顶部添加function (exports,require,module,_filename,__dirname){
代码底部添加}
2.实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进入了5个实参
exports
该对象时将函数和变量暴露到外部
require
函数,用来引入外部的模块
module
-module代表当前的模块本身
-exports就是module的属性
-既可以使用exports导出,也可以使用module.exports
_filename
当前文件所在的完整路径
_dirname
当前文件夹所在的路径
证明node模块存储的是一个函数
如何证明:在node中,每一个js文件中的js代码都是独立运行在一个函数中?
—使用arguments.callee(这个属性保存的是当前执行函数的对象)
当前文件所在的完整路径
_dirname
当前文件夹所在的路径
证明node模块存储的是一个函数
如何证明:在node中,每一个js文件中的js代码都是独立运行在一个函数中?
—使用arguments.callee(这个属性保存的是当前执行函数的对象)