前言javascript
本系列文章是根据Mosh
大佬的视频教程全方位Node开发 - Mosh整理而成,我的以为视频很是不错,因此计划边学习边整理成文章方便后期回顾。该视频教程是英文的,可是有中文字幕,感谢marking1212提供的中文字幕翻译。前端
Node.js
或Node
是一个开源跨平台的运行环境,用来在浏览器外执行JavaScript
代码。java
咱们经常使用Node
来建立后端程序,咱们更常说API,也就是应用程序接口,这些是用来支撑客户端的服务。node
好比网络应用,它们在浏览器中运行,或者手机应用,它们在手机中运行,这些客户端简单说就是管理用户所见和所作。数据库
Node
是建立高扩展性数据密集型和实时的后端服务,去支持客户端服务的理想工具。后端
Node
首先很容易上手,能够很好的适应原型和敏捷的开发工做Node
重构了一个原来基于Java和Spring的应用,而后他们发现比起用Spring,开发速度快了一倍并只用更少的人,而且减小了三分之一的代码,并且减小了四成的文件,更重要的是他们实现了每秒服务效率的翻倍,同时使响应时间减小了35%,因此Node
是用于构建高可扩展性应用的不二选择Node
应用是用JavaScript
编写的,因此若是你是熟悉JavaScript
的前端开发者,你就能够复用你的JavaScript
知识,并转为一个全栈开发者,并以此走上人生巅峰,你无需学习一门新语言JavaScript
,你的代码将更简洁明了,你可使用相同的命名规范、工具和最佳实践Node
是一个运行JavaScript
的环境。浏览器
在Node
以前,JavaScript
只能运行在浏览器里,每一个浏览器都有咱们所说的JavaScript
引擎,它将JavaScript
代码转换为机器才懂的机器码。例如,微软的Edge
浏览器使用的引擎是查克
拉,FireFox
的引擎是SpiderMonkey
,Chrome
的引擎是V8
。bash
就是由于引擎是有几种,因此JavaScript
的行为可能在浏览器之间会有不一样。网络
浏览器提供了一个JavaScript
代码的运行环境,好比,如你所知在浏览器是有window
或document
对象的,这些对象容许咱们操做代码的运行环境,直到2009年,浏览器是运行JavaScript
的惟一途径。架构
2009年,Node
的做者Ryan Dahl
他想若是能在浏览器外运行JavaScript
将是极好的,因此他抽取了当时最快的引擎,也就是Google
的V8
,并用C++
编写了一个程序封装起来后取名为Node
,与浏览器相似,Node
也是一个JavaScript
的运行环境,它包含了一个能够运行JavaScript
代码的引擎,可是它也包括一些用来提供环境的对象,这些对象与在浏览器中的对象不一样,比方说Node
里没有document
对象,相反它有另外一个对象提供了不少有趣的能力,好比说咱们能够操做文件系统,或者列出对给定端口的请求,这些咱们在浏览器作不到,因此Node
是一个包含JavaScript
引擎的程序,并提供给咱们一些浏览器没有的新特性,咱们能够处理文件系统或者网络请求等等。
Node
它不是语言,它不是框架,它是一个用来运行JavaScript代码的运行环境。
Node
的高可扩展性是由于Node
的无阻塞或者异步的特性。
举个例子,你去餐厅,服务员过来给你下单并给到厨房,而后服务员就去服务其余客人,并等待大厨作好菜,因此同一个服务员能够服务不少张桌子,他在服务其余客人以前不用等着大厨作菜,这就是咱们所说的无阻塞或者异步的设计思路。
这就是Node
应用的工做方式。
服务员就好像等待需求的进程,因此一个进程能够服务多个需求,对比无阻塞或者异步工做方式,咱们还有阻塞或者同步的设计。
想象你去另外一个餐厅,一个服务员过来点单,他下好单并给到了厨房,而后他就坐在厨房里,等大厨给你作好菜,这段时间他什么都不作,只是等着,他在给你送到餐以前不会去给其余客人下单,这就是咱们所说的阻塞或者同步的设计方式。
这就是什么有些框架如C#
或者Rails
就很慢,当咱们的服务收到一个请求,一个进程就被分配去处理这个请求,做为处理这个请求的一部分,就好像咱们去查询数据库,如你所知,有时候咱们须要等待它给咱们结果,当数据库执行着一个查询,那个进程就在那里等待,它不能用于服务另外一个客户端,这样就须要一个新的进程来服务这个客户端,想象一下,若是咱们有很是多的客户端,有时候咱们须要开启全部进程来响应请求,这样新的请求就要等待直到有进程空闲,若是它不想等,咱们就须要增长新的硬件了,当使用这种架构的时候,你没办法作到物尽其用,这就是阻塞或者同步结构的弊端。就像asp.net
开发的程序默认就是这个模式。
做为比较,Node
默认就是以异步方式工做,你无需作任何额外工做,Node
中一个进程能够服务全部请求,当请求来,这个进程就去响应,若是这时须要查询数据库,这个进程不会去等到数据库返回结果,当数据库正在执行查询的时候,这个进程就被指派去服务另外一个客户端,当数据库准备好结果了,它会给咱们说的事件队列推一个消息,Node
持续在后台监听这个队列,当它发现队列中有事件,它就去取出事件并处理,这种特性使得Node
成为构建桌面与网络链接的理想工具,咱们不用投入不少硬件就能够服务众多用户,这就是为何Node
具备高可扩展性的特色。
一样,Node
不适用于密集运算型的应用,好比视频渲染或者图片操做服务,这种类型的应用须要CPU完成大量运算,须要操做文件和网络的极少,由于Node
应用是单线程的,当要给一个用户提供运算,其余的用户就要等待,这就是为什么Node
不能应用于密集运算,它只适用建立数据密集型或者实时响应的应用,
查看电脑是否安装了Node
,打开CMD
,输入
node --version
复制代码
若是没有安装,打开官网nodejs.org
,你能够看到有两个选项,咱们选择安装LTS
这个稳定的版本便可。
打开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
中有另外一个对象来操做文件、使用操做系统或者网络等等,后面咱们会学习到的。
感谢您的阅读,但愿对你有所帮助。因为本人水平有限,若是文中有描述不当的地方,烦请指正,很是感谢。
欢迎你们关注个人公众号前端帮帮忙
。
Node的模块系统