什么是Node js

 Node.js 介绍
本文主要包含以下知识点:
Node.js 简介
安装 Node.js
书写第一个 Node.js 程序
Node.js 简介
Node.js,是一个可以让 JavaScript 运行在服务器端的运⾏环境。它可以让 JavaScript 脱离浏览器的束
缚,就像运行 Python、Perl、PHP、Ruby 程序一样,我们可以用 Node.js 轻松地进⾏服务器端应用开
发,Python、Perl、PHP、Ruby 能做的事情,Node.js 机乎都能做,并且可以做得更好。
回顾浏览器大战
众所周知,在 Netscape 设计出 JavaScript 后的短短几个月,JavaScript 事实上已经是前端开发的唯一
标准。后来,微软通过 IE 击败了 Netscape 后一统桌面,结果几年时间,浏览器毫无进步。(2001 年
推出的古老的 IE 6 到今天仍然有人在使用!)
没有竞争就没有发展。微软认为 IE 6 浏览器已经非常完善,几乎没有可改进之处,然后解散了 IE 6 开发
团队!而Google 却认为支持现代 Web 应用的新一代浏览器才刚刚起步,尤其是浏览器负责运行
JavaScript 的引擎性能还可提升 10 倍。
先是 Mozilla 借助已壮烈牺牲的 Netscape 遗产在 2002 年推出了 Firefox 浏览器,紧接着 Apple 于
2003 年在开源的 KHTML 浏览器的基础上推出了 WebKit 内核的 Safari 浏览器,不过仅限于 Mac 平
台。随后,Google 也开始创建⾃家的浏览器。他们也看中了 WebKit 内核,于是基于 WebKit 内核推出
了 Chrome 浏览器。
Chrome 浏览器是跨 Windows 和 Mac 平台的,并且,Google 认为要运行现代 Web 应用,浏览器必须
有一个性能非常强劲的 JavaScript 引擎,于是 Google 自己开发了一个高性能 JavaScript 引擎,名字叫
V8,以 BSD 许可证开源。
现代浏览器大战让微软的 IE 浏览器远远地落后了,因为他们解散了最有经验、战斗力最强的浏览器团
队!回过头再追赶却发现,支持 HTML5 的 WebKit 已经成为手机端的标准了,IE 浏览器从此与主流移
动端设备绝缘。
Node.js 诞生
Ryan Dahl,被称之为 Node.js 之父。他原本的工作是用 C/C++ 写高性能 Web 服务。对于高性能,异
步 IO 和事件驱动是基本原则,但是用 C/C++ 写就太痛苦了。于是 Ryan Dahl 开始设想用高级语言开发
Web服务。
他评估了很多种高级语言,发现很多语言虽然同时提供了同步 IO 和异步 IO,但是开发人员一旦用了同
步 IO,他们就再也懒得写异步 IO 了,所以,最终,Ryan 瞄向了 JavaScript 。
因为 JavaScript 是单线程执行,根本不能进行同步 IO 操作,所以,JavaScript 的这个“缺陷”导致了它只
能使用异步 IO。选定了开发语言,还要有运行时引擎。这位仁兄曾考虑过自己写一个,不过明智地放弃了,因为 V8 就
是开源的 JavaScript 引擎。让 Google 投资去优化 V8,咱只负责改造一下拿来用,还不用付钱,这个买
卖很划算。
于是在 2009 年,Ryan 正式推出了基于 JavaScript 语言和 V8 引擎的开源 Web 服务器项目,命名为
Node.js。虽然名字很土,但是,Node.js 第一次把 JavaScript 带入到后端服务器开发,加上世界上已经
有无数 JavaScript 开发人员,所以 Node.js 一下子就火了起来。
在 Node.js 上运⾏的 JavaScript 相比其他后端开发语言有何优势?
最大的优势是借助 JavaScript 天生的事件驱动机制加 V8 高性能引擎,使编写高性能 Web 服务轻而易
举。
其次,JavaScript 语言本身可以算是半个函数式语言,在前端开发时,开发人员往往写得比较随意,让
人感觉 JavaScript 就是个“玩具语言”。但是,在 Node.js 环境下,通过模块化的 JavaScript 代码,加上
函数式编程,并且无需考虑浏览器兼容性问题,直接使用最新的 ECMAScript 标准,可以完全满足工程
上的需求。
Node.js 特点
Node.js 作为一门新兴的后台语言平台,旨在帮助程序员快速构建可伸缩的应用程序,自发布以来,广
受开发人员的关注。Node.js 之所以这么受欢迎归功于它的一些吸引人的特点。
它是一个 JavaScript 的运行环境:Node.js 作为运行环境可以让 JavaScript 脱离浏览器,在服务器
端单独执行。如果客户端和服务器端使用相同的开发语言,可以在很大程度上达到客户端和服务器
端代码的共用。
依赖于 Chrome V8 引擎进行代码的解析:Chrome V8 负责在非浏览器解析情况下解析 JavaScript
代码。
事件驱动(Event-Driven):对于事件驱动来说,在学习 JavaScript 的初级阶段,都会接触到事
件,如 click , load 等,这些事件通常都会绑定在某个页面元素上,然后为其指定事件处理函
数,当事件被触发时才会执行相应的处理函数。可以说这样的事件处理机制就是标准的事件驱动机
制。
非阻塞I/O(non-blocking I/O):提到非阻塞 I/O,首先就有必要了解一下阻塞 I/O,
I/O(input/output)表述的是输入/输出操作,阻塞 I/O 可以理解为被阻塞了的输入/输出操作,在
服务器端有很多会涉及阻塞 I/O 的操作,例如在读取文件的过程中,需要等待文件读取完毕后才能
继续执行后续的操作, Node.js 中使用事件回调的方式来解决这种阻塞 I/O 的情况,避免了阻塞
I/O 所需的等待,所以说它具有非阻塞 I/O 的特点。
轻量、可伸缩,适用于实时数据交互应用:在 Node.js 中,Socket 可以实现双向通信,例如聊天
室就是实时的数据交互应用。
单进程、单线程:进程就是一个应用程序的一次执行过程,它是一个动态的概念。单线程是进程中
的一部分,进程包含多个线程在运行。单线程就是指进程中只有一个线程,阻塞 I/O 模式下一个线
程只能处理一个任务,而在非阻塞 I/O 模式下,一个线程永远在处理任务,这样 CPU 的利⽤率是
100%。Node.js 采用单线程,利用事件驱动的异步编程模式,实现了非阻塞的 I/O。
Node.js 能做什么
正如 JavaScript 为客户端而生,Node.js 为网络而生。但是 Node.js 能做的远不止开发一个网站那么简
单,使用 Node.js,我们可以轻松地开发:
  • 具有复杂逻辑的网站
  • 基于社交网络的大规模 Web 应用
  • Web Socket 服务器
  • TCP/UDP 套接字应用程序
  • 命令行工具
  • 交互式终端程序
  • 带有图形用户界面的本地应用程序
  • 单元测试工具
  • 客户端 JavaScript 编译器
Node.js 内建了 HTTP 服务器支持,也就是说我们可以轻而易举地实现一个网站和服务器的组合。
这和 PHP、Perl 不一样,因为在使用PHP 的时候,必须先搭建一个 Apache 之类的 HTTP 服务器,然
后通过 HTTP 服务器的模块加载或 CGI 调用,才能将 PHP 脚本的执行结果呈现给给户。
而当我们使用 Node.js 时,不用额外搭建一个 HTTP 服务器,因为 Node.js 本身就内建了一个。这个服
务器不仅可以用来调试代码,而且它本身就可以部署到产品环境,它的性能足以满足要求。
Node.js 版本
Node.js 的官网站站为:https://nodejs.org/en/
当我们进入 Node.js 的官网后可以看到如下的界面,一个是 LTS 版本,另外一个是 Current 版本。
甚至还有些人听说过 io.js,这又究竟是什么东西?
实际上是这样的,因为 Node.js 是开源项目,虽然由社区推动,但幕后一直由 Joyent 公司资助。由于
一群开发者对 Joyent 公司的经营策略不满,认为发展得过于缓慢。于是在 2014 年的时候从 Node.js 项
目中独立出了 io.js 项目,并决定单独发展,但两者实际上是兼容的。
然而中国有句古话,叫做"分久必合,合久必分"。分家后没多久,Joyent 公司表示要和解,于是,io.js
项目又决定回归 Node.js。
具体做法是首先在 io.js 里面添加新的特性,如果大家测试用得爽,就把新特性加入 Node.js 。换句话
说 io.js 是“尝鲜版”,也就是 Current 版本。而 Node.js 是线上稳定版,也就是LTS 版本。
安装 Node.js
在 Windows 和 Mac 上面都可以很轻松的安装 Node.js,只需要访问官方网站:https://nodejs.org/en/
点击 Download 链接,下载相应的安装包,然后进行安装即可。
安装好以后,可以在控制台里面通过 node -v 命令查看当前安装的 Node.js 的版本
olindeMacBook-Pro:~ olin$ node -v
v10.13.0
书写第一个 Node.js 程序
安装好 Node.js 以后,我们就可以开始书写我们的 Node.js 程序了。这里介绍下面这两种方式:
执行文件
我们就可以将我们所书写的 JavaScript 代码放到 Node.js 平台里面运行。这里我在我的桌面上新建了一
个 1.js 文件,书写的代码如下
console.log('Hello World!!!');
接下来打开电脑里面的终端,首先通过 cd 命令将目录切换到 desktop ,然后通过 Node.js 文件名 的
方式来运行我们刚才所书写的 JavaScript 代码,如下:
olindeMacBook-Pro:~ olin$ cd desktop
olindeMacBook-Pro:desktop olin$ node 1
Hello World!!!
可以看到,在终端里面成功打印出了 Hello World!!! 。
REPL 环境
除了上面所介绍的执行文件的方式以外,我们还可以通过 REPL 环境来执行 Node.js 程序。
REPL (Read-eval-print loop),即输入—求值—输出循环。如果你用过 Python,就会知道在终端下运行
无参数的 python 命令或者使用 Python IDLE 打开的 shell,可以进入一个即时求值的运行环境。
Node.js 也有这样的功能,运行无参数的 node 将会启动一个 JavaScript 的交互式 shell。
打开控制台或者终端,输入 node 进入 REPL 环境,如下:
olindeMacBook-Pro:~ olin$ node
>
进入REPL 环境后,可以在该环境下书写 JavaScript 代码,然后按回车键执行,如下:
olindeMacBook-Pro:~ olin$ node
> console.log('Hello World');
Hello World
undefined
进入REPL 模式以后,会出现一个 > 提示符提示我们输入命令,输入后按回车,Node.js 将会解析并执
行命令。如果是执行了一个函数,那么 REPL 还会在下面显示这个函数的返回值,上面例子中的
undefined 就是 console.log 的返回值。
如果输入了一个错误的指令,REPL 则会立即显示错误并输出调用栈。在任何时候,连续按两次 Ctrl +
C 即可推出 Node.js 的 REPL 模式。
Node.js 提出的 REPL 在应用开发时会给人带来很大的便利,例如我们可以测试一个包能否正常使用,
单独调用应用的某一个模块,执行简单的计算等。
Node.js 为 REPL 运行环境提供了一些常用命令,如下表:
Ctrl+C
终止当前命令
Ctrl+C+C
终止 REPL 环境
Ctrl+D
终止REPL 环境
Up/Down
查看命令历史记录和修改以前的命令
Tab
当前指令列表
.help
显示所有命令的列表
.break
退出多行表达式
.clear
从多行表达式退出
.save filename
当前 REPL 会话保存到文件中
.load filename
加载文件的内容到当前的 REPL 会话中
 
Chrome 浏览器中的 Console 控制台实际上就是一个 REPL 运行环境。
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/Yangyecool/p/13336175.html