概述
Node.js 是在服务器上运行的 JavaScript 运行时。
Node.js 是开源的、跨平台的,自2009推出以来,受到了极大地欢迎,现在在web开发领域发挥着重要的作用。如果以 Github star 作为一个受欢迎程度的指标,那么拥有59000(当你看到这文章的时候可能已经过60000了)多个star意味着非常受欢迎。
Node.js 在浏览器外运行V8 javascript引擎,它是Google Chrome的核心。它能够充分利用工程师们的工作,使chrome javascript运行时快速发展,这使得 Node.js 能够从V8 运行时的巨大性能改进和及时编译中获益。因此,在 Node.js 中运行的 JavaScript 代码性能非常好。
一个 Node.js 应用示例
一个最常见的 Hello World Web服务示例:
const http = require('http')
const hostname = '127.0.0.1'
const port = 3000
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})
要运行此代码段,请将其保存为 server.js 文件,然后在终端中运行 node server.js
。
这段代码首先引入了 http
模块,Node.js 有很棒的标准库,包括对网络的一流支持。
http
模块的 createServer()
方法创建一个新的 HTTP 服务并返回塔。
这个服务被设置为监听指定的端口和主机名。当服务就绪时,将调用回调函数,在本例中,回调函数通知我们服务器正在运行。
每当收到新的请求时,都会调用请求事件,提供两个对象:一个请求( http.incomingMessageObject
)和一个响应( http.serverResponseObject
)
这两个对象对于处理 HTTP 调用是必不可少的。
第一个对象(request)提供了请求的详细信息。在这个简单的示例中,虽然没有使用它,但是你可以访问请求头和请求数据。
第二个对象(response)用于向调用者返回数据。
在示例中:
res.statusCode = 200
我们将 statusCode
属性设置为 200
,以表示响应成功。
我们设置请求头 Content-Type
:
res.setHeader('Content-Type', 'text/plain')
最后,关闭响应,将内容作为参数添加到 end()
res.end('Hello World\n')
Node.js 框架和工具
Node.js是一个底层平台。为了使开发人员更容易、更有趣的开发,数以千计数的库构建于在 Node.js 之上。
其中许多是随着时间的推移而确立下来的热门项目。以下是我认为非常有意义且值得学习的一些框架的清单:
Express
创建Web服务器的最简单但最强大的方法之一。 它极简主义的方法和对服务器qi核心功能的专注,是成功的关键。
Meteor
一个非常强大的全栈框架,为你提供了一种同构方法,可以使用JavaScript构建应用程序并在客户端和服务器上共享代码。它曾经是提供所有功能的现成工具,现在可以与React,Vue和Angular等前端库集成。 Meteor也可用于创建移动应用程序。
Koa
Koa由Express背后的同一团队建造,旨在使其更加简单和小巧,建立在多年的知识基础之上。 新项目的诞生源于在不破坏现有社区的情况下创建不兼容的变更的需要。
Next.js
这是一个服务端渲染 React 应用的框架。
Micro
这是一个非常轻量级的服务器,用于创建异步HTTP微服务。
Socket.io
这是一个用于构建网络应用程序的实时通信引擎
Node.js 简史
回顾 Node.js 从2009年到今天的历史
信不信由你,Node.js 才10岁。
相比之下,JavaScript已经有23年的历史了,而我们所知道的网络(mosaic诞生后)已经有25年的历史了。
对于一项技术来说,10年的时间是如此之短,但是Node.js似乎已经存在了很久。
从 Node.js 2岁的时候开始,我就很荣幸地与它合作,尽管网上关于它的信息还很少,但已经可以感觉到它是一大事件。在这一节中,我想对 Node.js 的历史做一个全面的介绍,以使大家对它有一个正确的认识。
简史
2009
Node.js 诞生
创造了npm的初始版
2010
Express 诞生
Socket.io 诞生
2011
npm 升级到 1.0
大公司开始采用 Node.js: LinkedIn, Uber
Hapi 诞生
2012
迅速被大众接受并使用
2013
第一个 Node.js 博客平台:Ghost
Koa 诞生
2014
大事件:分支出IO.js 引入了新的ES6特性 ,更新发布更快
2015
Node 基金会成立
IO.js合并到Node.js
Node 4发布 (Node 没有1,2,3版本)
npm 支持私有模块
2016
Node 6发布
leftpad 事件
Yarn 诞生
2017
Node 8发布:更加专注与安全
HTTP/2
npm 周下载量超过30亿
2018
Node 10 发布
ES modules
mjs 实验性支持
2019
Node.js 基金会与 JS 基金会合并为 OpenJS 基金会
如何安装 Node.js
如何在你的系统上下载安装 Node.js: 包管理器、官方网站或者NVM
Node.js 可以以用不同的方式安装。本文重点介绍最常见和最方便的方法。
所有主要平台的官方包均可在此处(官方网站)获得。
我们也可以通过包管理器非常方便的安装Node.js,不同的操作系统有他们自己的包管理器。
在 MacOS 上:Homebrew 是事实上的标准,一旦安装,可以方便的在命令行中,运行此命令安装 Node.js:
brew install node
此处列出了适用于Linux和Windows的其他程序包管理器。
nvm 是一种运行 Node.js 的流行方式。例如,它允许您轻松切换Node.js版本,并安装新版本以尝试在出现故障时轻松回滚。使用旧的 Node.js 版本测试代码时也非常有用。
如果你刚刚开始学习 Node.js 而且没使用过 Homebrew,那么我建议你使用官方安装包,否则 Homebrew 是我最喜欢的解决方案
使用 Node.js 需要掌握多少 JavaScript 知识
如果你是刚刚开始使用 JavaScript,你需要对它了解多深呢?
作为一个初学者,你很难对自己的编程能力有信心。在学习编程时,你可能会对多久结束 JavaScript 学习,多久开始学习 Node.js 感到疑惑,反之亦然。
在深入了解 Node.js 之前,我建议您掌握 JavaScript 的主要概念:
语法结构
表达式
类型
变量
函数
this
箭头函数
循环
循环与作用域
数组
模板字符串
分号
严格模式
ECMAScript6,2016,2017...
有了这些概念,你可以在浏览器和 Node.js 中成为一名熟练的JavaScript开发人员。
以下概念也是理解异步编程的关键,异步编程是 Node.js 的一个重要部分:
异步编程和回调
定时器
Async Await
闭包
事件循环
Node.js 与浏览器的区别
在 Node.js 中编写 JavaScript 应用程序与在浏览器中编写Web不同。虽然在浏览器和在 Node.js 中都是用 JavaScript 作为编程语言,但是构建在浏览器中的运行的应用程序与在 Node.js 应用程序完全是两码事。
编写 Node.js 应用程序对于前端开发人员来说有一个巨大的优势 —— 编程语言仍然是一样的(JavaScript)。你有一个巨大的机会,我们都知道全面深入的学习一门编程语言是很难的。通过使用相同的语言在 Web 上执行所有工作 —— 无论是在客户端还是在服务器上 —— 你都处于独特的优势地位。
改变的仅仅是生态系统。
在浏览器中,大多数情况下你与 DOM
或其他Web平台API(如Cookie)进行交互。当然,那些在Node.js中不存在。你没有 DOM
, window
和浏览器提供的所有其他对象。
在浏览器中,我们没有 Node.js 通过模块机制提供的所有API,比如文件系统访问功能。
另一个很大的区别是在 Node.js中,你可以控制你的环境,除非您正在构建一个任何人都可以在任何地方部署的开源应用程序,否则您知道将在哪个版本的 Node.js 上运行该应用程序。与浏览器环境相比,这是非常方便的,因为在浏览器环境中,您无法奢侈地选择访问者将使用什么浏览器。
这意味着您可以编写 Node.js 版本支持的所有现代JavaScript ES6-7-8-9 新特性。
由于 JavaScript 发展速度很快,但是浏览器发展的速度有点慢,用户升级的速度也慢。有时候在web上,你只能使用较旧的 JavaScript/ECMAScript 版本。
你可使用 Babel 将代码转换为兼容ES5的格式,然后再将其发送给浏览器,但在Node.js中,你不需要这样做。
另一个区别是 Node.js 使用 CommonJS 模块系统,而在浏览器中我们开始看到正在实施 ES Modules 标准。
实际上,这一意味着目前在 Node.js 使用 require()
,在浏览器中使用 import()
JavaScript V8引擎
V8 是谷歌 Chrome 的 JavaScript 引擎名称,它在我们使用 Chrome 浏览网页时,获取 JavaScript 并执行它。
V8 引擎提供了 JavaScript 执行的运行时,DOM和其他浏览器API 由浏览器提供。很酷的一点是JavaScript引擎是独立于它所在的浏览器的。这个关键特性支持 Node.js 的兴起。早在2009年,V8就被 Node.js 选择为引擎,随着 Node.js 的流行,V8成为了驱动大量用 JavaScript 编写的服务器端代码的引擎。
Node.js的生态系统非常庞大,并且由于它,V8也为桌面应用程序提供支持,其中包括 Electron 等项目。
其他 JS 引擎
其他的一些浏览器有他们自己的 JavaScript 引擎:
Firefox 的 Spidermonkey
Safari 的 JavaScriptCore (也称为Nitro)
Edge 的 Chakra
还存在很多其他的引擎……
这些引擎都实现了ECMA ES-262标准,也称为ECMAScript,这是JavaScript使用的标准。
追求性能
V8 是用 C++ 编写的,并且不断改进。它是便携式的,可在Mac,Windows,Linux和其他一些系统上运行。
在 V8 的介绍中,我将忽略V8的实现细节。它们可以在更权威的网站上找到,包括 V8官方网站,因为随着时间的推移,它们经常发生根本性的变化。
与其他JavaScript引擎一样,V8也在不断发展,以加速 Web 和 Node.js 生态系统。
在网络上,有一场多年来一直在进行的性能竞赛,我们(作为用户和开发者)从竞争中获益很多,因为我们可以年复一年地获得运行更快,优化更好的机器。
编译执行
JavaScript 通常被认为是一种解释型语言,但现代 JavaScript 引擎不再只是解释 JavaScript,而是编译它。
这种变化发生在2009年,当时 SpiderMonkey JavaScript 编译器被添加到 Firefox 3.5 中,并且之后每个人都遵循了这种思想。
JavScript由V8内部编译,使用即时编译(JIT)来加快执行速度。这似乎违反直觉。但自从2004年引入谷歌地图以来,JavaScript已经从一种通常只执行几十行代码的语言演变为在浏览器中运行数千至数十万行代码的应用程序。
我们的应用程序现在可以在浏览器中运行几个小时,而不仅仅是一些表单验证规则或简单脚本。
在这个新时代,编译 JavaScript 是非常有意义的,因为尽管准备 JavaScript 可能需要花费更多的时间,但是一旦完成,它将比纯解释代码具有更高的性能。
往期精彩回顾:
Node命令行工具开发【看段子】
node爬虫:小年夜送你一大波美腿图
《Node.js从入门到上线》入门篇
左手代码右手砖,抛砖引玉
给点个赞,好不好啊