node.js的代码都是构建在模块化开发的基础之上,模块化开始也是node.js的核心之一。
node.js跳过了服务器,它自己不用建设在任何服务器软件之上,node.js的许多设计理念与经典架构(LAMP=linux +apache +mysql+php)有着很大的不同,它可以提供强大的伸缩能力,node.js没有web容器。
node.js的自身哲学:花最小的成本,追求更高的并发,更高的处理性能
node.js的特点:1.单线程
2.非阻塞I/O
什么是IO? 就是输入和输出(input,output),什么会输入输出?如:硬盘,网络,file,socket,其他mysql,tcp都是网络IO的一种
3.事件驱动
阻塞模式下,一个线程只能处理一个任务,想要提高吞吐量必须通过多线程,而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100%。
node.js底层是C++ (V8也是C++写的).底层代码中,近半数都用于事件队列,回调函数队列的构建,用事件驱动来完成服务器的任务调度。(鬼才)
node.js没有根目录,没有web容器,让node.js实现一个静态服务都非常难!!
传统非模块化开发的缺点:1.命名冲突 2.文件依赖
标准的模块化规范:
1。AMD -requirejs
2。CMD- seajs
模块化的规范定义的一些写代码的规则,只要遵循了同样的标准,基本上风格都是一致的
服务端的模块化规范:
1.Common.js -Node.js
模块化相关的规则:
1.一个js文件 都是一个独立的模块,模块内部的成员都是相互独立的
2.模块化的导入和导出
案例1(exports):
在01.js文件中
var sum=function(a,b){ sum = parseInt(a)+parseInt(b); } exports.sum=sum;
在02.js文件中
//用require 进入模块 var module =require(./01.js) //当前文件夹下的01.js文件 var ret =module.sum(12,13); console.log(ret);
案例2(moudle)
在01.js文件中
var sum=function(a,b){ sum = parseInt(a)+parseInt(b); } module.exports=sum;
在02.js文件中
var module=require('./01.js') var ret=moudle(12,15); console.log(ret);
成员的导出,还可以用global这个全局对象来实现
模块化的一些特性:
1.已经加载的模块会缓存(根据文件的路径,知晓已经加载的模块,不会重复加载),提高了性能
2.模块文件的后缀的3中情况: js json node (不加文件后缀,同名文件的优先级是按照从左到右的文件加载)
除了自定义模块还有
系统的核心模块(mudule):
1.fs文件操作
2.http网络操作
创建服务器 http.create( function(req,res) {... } )
3.path路径操作
4.querystring查询参数解析(与url有重叠)
5.url url解析 url.parse(a,b) 能将url拆分成很多个部分