第一章:Node学习之什么是Node
什么是Node?
- 第一章:Node学习之什么是Node
- 前言
- 什么是Node?
- Node有什么特别之处?
- Node的设计结构
- 运行环境
- Node的由来
- Node如何工作?
- 什么是异步?
- 什么是同步?
- 同步的弊端
- Node的优势
- 安装Node
- 你的第一个Node应用
前言
本系列文章是通过学习Mosh的视频node教程全方位Node开发-Mosh而整理的笔记,该教程是英文的,有中文字幕,感谢marking1212提供中文字幕翻译
什么是Node?
Node.js或Node是一个开源跨平台的运行环境,用来在浏览器外执行JavaScript代码。
我们常用Node来创建后端程序,我们更常说API,也就是应用程序接口,这些是用来支撑客户端的服务。
比如网络应用,它们在浏览器中运行,或者手机应用,它们在手机中运行,这些客户端简单说就是管理用户所见和所做。他们只是外壳,他们需要与一些在服务器或者云端的服务对话,去保存数据,发送邮件,推送消息等
Node是创建高扩展性数据密集型和实时的后端服务,去支持客户端服务的理想工具。
Node有什么特别之处?
1.Node首先很容易上手,可以很好的适应原型和敏捷的开发工作
2.它也支持开发超速和高扩展性服务,它已经应用于多个大公司的系统,比如PayPal、优步、Netflix、沃尔玛等等。实际上在PayPal,他们使用了Node重构了一个原来基于Java和Spring的应用,然后他们发现比起用Spring,开发速度快了一倍并只用更少的人,并且减少了三分之一的代码,而且减少了四成的文件,更重要的是他们实现了每秒服务效率的翻倍,同时使响应时间减少了35%,所以Node是用于构建高可扩展性应用的不二选择
3.Node应用是用JavaScript编写的,所以如果你是熟悉JavaScript的前端开发者,你就可以复用你的JavaScript知识,并转为一个全栈开发者,并以此走上人生巅峰,你无需学习一门新语言
4.同时,因为你可以同时在前后端使用JavaScript,你的代码将更简洁明了,你可以使用相同的命名规范、工具和最佳实践
5.Node有着强大的生态和众多开源库,所以如果你想在应用添加一些特性或者功能块,你就可以使用很多免费和开源的库
Node的设计结构
运行环境
在Node之前,JavaScript只能运行在浏览器里,每个浏览器都有我们所说的JavaScript引擎,它将JavaScript代码转换为机器才懂的机器码。例如,微软的Edge浏览器使用的引擎是查克拉,FireFox的引擎是SpiderMonkey,Chrome的引擎是V8。
就是因为引擎是有几种,所以JavaScript的行为可能在浏览器之间会有不同。
浏览器提供了一个JavaScript代码的运行环境,比如,如你所知在浏览器是有window或document对象的,这些对象允许我们操作代码的运行环境,直到2009年,浏览器是运行JavaScript的唯一途径。
Node的由来
2009年,Node的作者Ryan Dahl他想如果能在浏览器外运行JavaScript将是极好的,所以他抽取了当时最快的引擎,也就是Google的V8,并用C++编写了一个程序封装起来后取名为Node,与浏览器类似,Node也是一个JavaScript的运行环境,它包含了一个可以运行JavaScript代码的引擎,但是它也包括一些用来提供环境的对象,这些对象与在浏览器中的对象不同,比方说Node里没有document对象,相反它有另一个对象提供了很多有趣的能力,比如说我们可以操作文件系统,或者列出对给定端口的请求,这些我们在浏览器做不到,所以Node是一个包含JavaScript引擎的程序,并提供给我们一些浏览器没有的新特性,我们可以处理文件系统或者网络请求等等。
Node它不是语言,它不是框架,它是一个用来运行JavaScript代码的运行环境。
Node如何工作?
Node的高可扩展性是因为Node的无阻塞或者异步的特性。
什么是异步?
异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作
举个例子,你去餐厅,服务员过来给你下单并给到厨房,然后服务员就去服务其他客人,并等待大厨做好菜,所以同一个服务员可以服务很多张桌子,他在服务其他客人之前不用等着大厨做菜,这就是我们所说的无阻塞或者异步的设计思路。
这就是Node应用的工作方式。
服务员就好像等待需求的进程,所以一个进程可以服务多个需求,对比无阻塞或者异步(Asynchronous)工作方式,我们还有阻塞或者同步的设计。
什么是同步?
同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果
想象你去另一个餐厅,一个服务员过来点单,他下好单并给到了厨房,然后他就坐在厨房里,等大厨给你做好菜,这段时间他什么都不做,只是等着,他在给你送到餐之前不会去给其他客人下单,这就是我们所说的阻塞或者同步(Synchronous)的设计方式。
同步的弊端
这就是什么有些框架如C#或者Rails就很慢,当我们的服务收到一个请求,一个进程就被分配去处理这个请求,作为处理这个请求的一部分,就好像我们去查询数据库,如你所知,有时候我们需要等待它给我们结果,当数据库执行着一个查询,那个进程就在那里等待,它不能用于服务另一个客户端,这样就需要一个新的进程来服务这个客户端,想象一下,如果我们有非常多的客户端,有时候我们需要开启所有进程来响应请求,这样新的请求就要等待直到有进程空闲,如果它不想等,我们就需要增加新的硬件了,当使用这种架构的时候,你没办法做到物尽其用,这就是阻塞或者同步结构的弊端。就像asp.net开发的程序默认就是这个模式。
Node的优势
作为比较,Node默认就是以异步方式工作,你无需做任何额外工作,Node中一个进程可以服务所有请求,当请求来,这个进程就去响应,如果这时需要查询数据库,这个进程不会去等到数据库返回结果,当数据库正在执行查询的时候,这个进程就被指派去服务另一个客户端,当数据库准备好结果了,它会给我们说的事件队列推一个消息,Node持续在后台监听这个队列,当它发现队列中有事件,它就去取出事件并处理,这种特性使得Node成为构建桌面与网络连接的理想工具,我们不用投入很多硬件就可以服务众多用户,这就是为什么Node具有高可扩展性的特点。
同样,Node不适用于密集运算型的应用,比如视频渲染或者图片操作服务,这种类型的应用需要CPU完成大量运算,需要操作文件和网络的极少,因为Node应用是单线程的,当要给一个用户提供运算,其他的用户就要等待,这就是为何Node不能应用于密集运算,它只适用创建数据密集型或者实时响应的应用,
安装Node
查看电脑是否安装了Node,打开CMD,输入
node --version
复制代码
如果没有安装,打开官网nodejs.org,下载最新版本安装即可
你的第一个Node应用
打开CMD,新建一个文件夹
mkdir first-app
复制代码然后进入这个文件夹
cd first-app
复制代码然后再输入
code .
复制代码打开编辑器,我这边用的是VS Code
我们新建一个app.js文件,在这里可以写原生的JavaScript代码,就像你给浏览器写的JS一样。
我们定义一个函数
function sayHello(name) {
console.log('Hello ' + name)
}
复制代码然后调用这个函数
sayHello('Mosh')
复制代码为了运行这个函数,我们需要回到CMD,运行Node,并将文件名作为参数,也就是app.js
node app.js
复制代码Node如我之前所说是一个C++程序,抽离了Chrome的V8引擎,所以这个app.js文件传给Node,Node会把它传给V8来执行。
可以看到在CMD输出了Hello Mosh
。
接下来我们打印一下window对象,看看会发生什么,我们在app.js输入
console.log(window)
复制代码然后回到CMD,再次执行node app.js,可以看到CMD报了一个错误:window is not defined。
这是因为Node中没有window或者document对象,这些是在浏览器作为运行环境才有的东西,在Node中有另一个对象来操作文件、使用操作系统或者网络等等