Node.js 入门指南:Node.js 简介

作者: 刘星
日期: 2021年4月12日

nodejs

概述

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 中不存在。你没有 DOMwindow和浏览器提供的所有其他对象。

在浏览器中,我们没有 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 可能需要花费更多的时间,但是一旦完成,它将比纯解释代码具有更高的性能。

文档信息

版权声明:署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0)

原文链接:https://www.liuxing.io/blog/nodejs-introduction/

发表日期:2021年04月12日


相关文章

node 打造微信个人号机器人

现在,日常生活已经离不开微信,本文将会抛砖引玉演示如何使用wechaty操作微信个人号做一些有意思的东西,可以实现自动通过好友请求、关键词回复、自动拉群等功能。大大提高了社群运营的效率。 wechaty(https://github.com/Chatie/wechaty)是一款开源的微信个人号 SDK,进行了一系列的封装,提供简单好用的接口,然后开发者可以在其之上进行微信机器人的开发。你可以用它来做很多事:

2018年4月25日

最近更新

Curl 使用指南

Curl 是一个常用的命令行数据传输工具, 可以方便的从命令行创建网络请求

2021年5月04日

JavaScript 中的分号

JavaScript 代码到底加不加分号。本文带你了解 JavaScript 的分号自动插入机制,以及哪些情况必须加分号

2021年5月02日