Mosh的Node.js教程(一)

前言

本系列文章是根据Mosh大佬的视频教程全方位Node开发 – Mosh整理而成,个人觉得视频非常不错,所以计划边学习边整理成文章方便后期回顾。该视频教程是英文的,但是有中文字幕,感谢marking1212提供的中文字幕翻译。

本篇文章大纲

  • 什么是Node
  • Node的设计结构
  • Node是如何工作的
  • 安装Node
  • 你的第一个Node应用

什么是Node?

Node.jsNode是一个开源跨平台的运行环境,用来在浏览器外执行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是一个运行JavaScript的环境。

运行环境是什么?

Node之前,JavaScript只能运行在浏览器里,每个浏览器都有我们所说的JavaScript引擎,它将JavaScript代码转换为机器才懂的机器码。例如,微软的Edge浏览器使用的引擎是查克拉,FireFox的引擎是SpiderMonkeyChrome的引擎是V8

就是因为引擎是有几种,所以JavaScript的行为可能在浏览器之间会有不同。

浏览器提供了一个JavaScript代码的运行环境,比如,如你所知在浏览器是有windowdocument对象的,这些对象允许我们操作代码的运行环境,直到2009年,浏览器是运行JavaScript的唯一途径。

Node的由来

2009年,Node的作者Ryan Dahl他想如果能在浏览器外运行JavaScript将是极好的,所以他抽取了当时最快的引擎,也就是GoogleV8,并用C++编写了一个程序封装起来后取名为Node,与浏览器类似,Node也是一个JavaScript的运行环境,它包含了一个可以运行JavaScript代码的引擎,但是它也包括一些用来提供环境的对象,这些对象与在浏览器中的对象不同,比方说Node里没有document对象,相反它有另一个对象提供了很多有趣的能力,比如说我们可以操作文件系统,或者列出对给定端口的请求,这些我们在浏览器做不到,所以Node是一个包含JavaScript引擎的程序,并提供给我们一些浏览器没有的新特性,我们可以处理文件系统或者网络请求等等。

Node它不是语言,它不是框架,它是一个用来运行JavaScript代码的运行环境。

Node如何工作

Node的高可扩展性是因为Node的无阻塞或者异步的特性。

什么是异步?

举个例子,你去餐厅,服务员过来给你下单并给到厨房,然后服务员就去服务其他客人,并等待大厨做好菜,所以同一个服务员可以服务很多张桌子,他在服务其他客人之前不用等着大厨做菜,这就是我们所说的无阻塞或者异步的设计思路。

这就是Node应用的工作方式。

服务员就好像等待需求的进程,所以一个进程可以服务多个需求,对比无阻塞或者异步工作方式,我们还有阻塞或者同步的设计。

什么是同步?

想象你去另一个餐厅,一个服务员过来点单,他下好单并给到了厨房,然后他就坐在厨房里,等大厨给你做好菜,这段时间他什么都不做,只是等着,他在给你送到餐之前不会去给其他客人下单,这就是我们所说的阻塞或者同步的设计方式。

同步的弊端

这就是什么有些框架如C#或者Rails就很慢,当我们的服务收到一个请求,一个进程就被分配去处理这个请求,作为处理这个请求的一部分,就好像我们去查询数据库,如你所知,有时候我们需要等待它给我们结果,当数据库执行着一个查询,那个进程就在那里等待,它不能用于服务另一个客户端,这样就需要一个新的进程来服务这个客户端,想象一下,如果我们有非常多的客户端,有时候我们需要开启所有进程来响应请求,这样新的请求就要等待直到有进程空闲,如果它不想等,我们就需要增加新的硬件了,当使用这种架构的时候,你没办法做到物尽其用,这就是阻塞或者同步结构的弊端。就像asp.net开发的程序默认就是这个模式。

Node的优势

作为比较,Node默认就是以异步方式工作,你无需做任何额外工作,Node中一个进程可以服务所有请求,当请求来,这个进程就去响应,如果这时需要查询数据库,这个进程不会去等到数据库返回结果,当数据库正在执行查询的时候,这个进程就被指派去服务另一个客户端,当数据库准备好结果了,它会给我们说的事件队列推一个消息,Node持续在后台监听这个队列,当它发现队列中有事件,它就去取出事件并处理,这种特性使得Node成为构建桌面与网络连接的理想工具,我们不用投入很多硬件就可以服务众多用户,这就是为什么Node具有高可扩展性的特点。

同样,Node不适用于密集运算型的应用,比如视频渲染或者图片操作服务,这种类型的应用需要CPU完成大量运算,需要操作文件和网络的极少,因为Node应用是单线程的,当要给一个用户提供运算,其他的用户就要等待,这就是为何Node不能应用于密集运算,它只适用创建数据密集型或者实时响应的应用,

安装Node

查看电脑是否安装了Node,打开CMD,输入

node --version

如果没有安装,打开官网nodejs.org,你可以看到有两个选项,我们选择安装LTS这个稳定的版本即可。

你的第一个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++程序,抽离了ChromeV8引擎,所以这个app.js文件传给NodeNode会把它传给V8来执行。

可以看到在CMD输出了Hello Mosh

接下来我们打印一下window对象,看看会发生什么,我们在app.js输入

console.log(window)

然后回到CMD,再次执行node app.js,可以看到CMD报了一个错误:window is not defined

这是因为Node中没有window或者document对象,这些是在浏览器作为运行环境才有的东西,在Node中有另一个对象来操作文件、使用操作系统或者网络等等,后面我们会学习到的。

最后

感谢您的阅读,希望对你有所帮助。由于本人水平有限,如果文中有描述不当的地方,烦请指正,非常感谢。

关注

欢迎大家关注我的公众号前端帮帮忙

下篇文章预告

Node的模块系统

https://juejin.im/post/5e37defff265da3df6200812

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论