Mosh的Node.js教程(一)

前言javascript

本系列文章是根据Mosh大佬的视频教程全方位Node开发 - Mosh整理而成,我的以为视频很是不错,因此计划边学习边整理成文章方便后期回顾。该视频教程是英文的,可是有中文字幕,感谢marking1212提供的中文字幕翻译。前端

本篇文章大纲

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

什么是Node?

Node.jsNode是一个开源跨平台的运行环境,用来在浏览器外执行JavaScript代码。java

咱们经常使用Node来建立后端程序,咱们更常说API,也就是应用程序接口,这些是用来支撑客户端的服务。node

好比网络应用,它们在浏览器中运行,或者手机应用,它们在手机中运行,这些客户端简单说就是管理用户所见和所作。数据库

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的引擎是V8bash

就是由于引擎是有几种,因此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的模块系统

相关文章
相关标签/搜索