npm介绍
在正式开始Node.js学习之前,我们先认识一下npm。npm是什么东东?npm其实是Node.js的包管理工具
(node package manager)
包可以理解为实现了某个功能模块的集合,用于分布和维护;
包是在模块基础上更深一步的抽象,node.js包类似c++函数库或者Java的类库,他将某个独立的功能封装起来,用于发布,更新,依赖管理和版本控制,node.js根据是CommonJs实现了包的机制;用npm解决包的发布和获取的需求;
包管理器npm
npm用于包的发布,传播,依赖控制,npm提供了命令行可以方便下载,安装,升级,删除;也可以发布和维护包;
NPM建立了一个NodeJS生态圈,NodeJS开发者和用户可以在里边互通有无。以下介绍NPM应用的三种场景:为啥我们需要一个包管理工具呢?
npm用于包的发布,传播,依赖控制,npm提供了命令行可以方便下载,安装,升级,删除;也可以发布和维护包;
一、获取一个包
npm [install/i] [packagename]
安装在当前目录的node_modules子目录下。
包的发布
发布之前,需要让包符合npm的规范,npm有一套以CommonJS为基础的包规范;通过使用:
npm init
交互式问答产生一个符合标准的package.json,步骤是:
(1)先创建一个目录(package)
(2)在这个目录中运行npm init,产生一系列的问题,
(3)最后填完问题,产生一个标准的package.json
讲了这么多,npm究竟在哪?其实npm已经在Node.js安装的时候顺带装好了。我们在命令提示符或者终端输入npm -v
,
上面的一大堆文字告诉你,npm
需要跟上命令。现在我们不用关心这些命令,后面会一一讲到。目前,你只需要确保npm正确安装了,能运行就行。
我们的依赖包,可能随时更新,我们永远想保持更新,或者保持一个版本检测,我们就可以用package来管理依赖。
检测package.json,安装package中的所有依赖
1.1 node简介(**)(40’)
1.1.1 历史(**)(10’)
话说有个叫Ryan Dahl的歪果仁,他的工作是用C/C++写高性能Web服务。对于高性能,但是用C/C++写就太痛苦了。于是这位仁兄开始设想用高级语言开发Web服务。他评估了很多种高级语言,最终,Ryan瞄向了JavaScript。因为JavaScript是单线程执行,也就是说,同一个时间只能做一件事,效率就会很低。但是可以利用js单线程事件循环来提高效率
选定了开发语言,还要有运行时引擎。这位仁兄曾考虑过自己写一个,不过明智地放弃了,因为V8就是开源的JavaScript引擎。让Google投资去优化V8,咱只负责改造一下拿来用,还不用付钱,这个买卖很划算。
Chrome V8 简称 V8,是由谷歌开源的一个高性能 JavaScript 引擎。该引擎采用 C++ 编写,Google Chrome 浏览器用的就是这个引擎。其他的 JavaScript 引擎一样,V8 会编译、执行 JavaScript 代码,并一样会管理内存、垃圾回收等。
于是在2009年,Ryan正式推出了基于JavaScript语言和V8引擎的开源Web服务器项目,命名为Node.js。虽然名字很土,但是,Node第一次把JavaScript带入到后端服务器开发,加上世界上已经有无数的JavaScript开发人员,所以Node一下子就火了起来。
1.2 node概念(10’)
node简介:
V8引擎本身就是用于Chrome浏览器的JS解释部分,但是Ryan Dahl这哥们,鬼才般的,把这个V8搬到了服务器上,用于做服务器的软件。
Node.js是一个专注于实现高性能Web服务器优化的专家,几经探索,几经挫折后,遇到V8而诞生的项目。
Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触角伸到了服务器端,可以与PHP、JSP、Python、Ruby平起平坐。
但Node似乎有点不同:
● Node.js****不是一种独立的语言,与PHP、JSP、Python、Perl、Ruby的“既是语言,也是平台”不同,Node.js的使用JavaScript****进行编程,运行在JavaScript引擎上(V8)。
● 与PHP、JSP等相比(PHP、JSP、.net都需要运行在服务器程序上,Apache、Naginx、Tomcat、IIS。
),Node.js跳过了Apache、Naginx**、IIS等HTTP服务器,它自己不用建设在任何服务器软件之上**。Node.js的许多设计理念与经典架构(LAMP = Linux + Apache + MySQL + PHP)有着很大的不同,可以提供强大的伸缩能力。一会儿我们就将看到,Node.js没有web容器。
Node.js自身哲学,是花最小的硬件成本,追求更高的并发,更高的处理性能。
node特点:单线程、非阻塞IO 事件驱动
所谓的特点,就是Node.js是如何解决服务器高性能瓶颈问题的。
1 、单线程
在Java、PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存。也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。要让Web应用程序支持更多的用户,就需要增加服务器的数量,而Web应用程序的硬件成本当然就上升了。
Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的。使用Node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接。
另外,带线程的带来的好处,还有操作系统完全不再有线程创建、销毁的时间开销,减少服务器内存开销
坏处,就是一个用户造成了线程的崩溃,整个服务都崩溃了,其他人也崩溃了。
多线程、单线程的一个对比。也就是说,单线程也能造成宏观上的“并发”。
2、非阻塞I/O
例如,当在访问数据库取得数据的时候,需要一段时间。在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地降低了程序的执行效率。**
由于Node.js中**采用了非阻塞型I/O机制,**因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。
当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。
阻塞模式下,一个线程只能处理一项任