NodeJS简介和环境搭建

NodeJS是一个基于Chrome V8引擎的JavaScript运行时环境,它使JavaScript能够脱离浏览器在服务端运行。NodeJS采用事件驱动、非阻塞I/O模型,使其非常适合构建高并发、I/O密集型的网络应用。NodeJS由Ryan Dahl于2009年创建,如今已成为现代Web开发中不可或缺的工具,无论是后端服务开发、前端工程化构建,还是各类CLI工具,都离不开NodeJS的支持。

本系列笔记我们将着重介绍NodeJS的模块机制和内置模块,对于基础的JavaScript语言这里就不重复介绍了,具体可以参考Web前端/Web客户端编程相关章节。

NodeJS官网:https://nodejs.org/en/

NodeJS的发展历史和适用场景

JavaScript语言最初被设计为浏览器端执行的脚本语言,专门用于操作HTML的DOM结构,为了执行JavaScript脚本,Chrome浏览器中内置了高性能的V8引擎。NodeJS的作者后来将V8引擎抽取出来并编写了一套与之配合使用的标准库,使得JavaScript可以脱离浏览器环境编写通用程序,NodeJS就这样诞生了。

JavaScript是一个事件驱动的语言,NodeJS利用这个特点,能让开发人员较简单的编写出基于事件驱动的高性能服务端程序,同时V8引擎本身也比十分先进,它具有很好的执行性能,因此NodeJS在IO密集型应用领域目前已是主流技术方案之一。除此之外,NodeJS的出现也极大的丰富了JavaScript语言的生态,目前许多流行的前端工具都是由JavaScript本身编写的,如果开发者不会使用NodeJS和npm,也同样难以迈入前端开发的门槛。

如今,NodeJS的应用场景非常广泛,主要包括以下几个方面:

Web服务端开发:NodeJS可以用于构建高性能的Web服务器和API服务,常见的框架有Express、Koa、NestJS等。由于其非阻塞I/O特性,NodeJS特别适合处理IO密集型高并发请求。

前端工程化领域:现代前端开发离不开各种构建工具,如Webpack、Vite、Rollup等,这些工具都是基于NodeJS运行的。此外,npm、yarn、pnpm等包管理工具也是NodeJS生态的重要组成部分。

CLI命令行工具:NodeJS非常适合开发CLI工具,许多流行的开发工具如ESLint、Prettier、TypeScript编译器等都是用NodeJS编写的。

桌面应用开发:通过Electron框架,NodeJS可以用于构建跨平台的桌面应用程序,如VSCode、Slack等知名软件都是基于Electron开发的。

实时应用:借助WebSocket等技术和NodeJS处理IO密集型应用领域的性能优势,NodeJS非常适合构建实时通信应用,如聊天室、在线协作工具等。

安装NodeJS

NodeJS版本更新迭代较快,推荐在官网寻找最新软件包安装。我们可以在官网找到Downloads页面,其中提供了LTS(长期支持)版本和当前最新版本,实际开发中我们一般选择LTS版本。

对于Windows操作系统,建议直接下载.zip格式的压缩包,对于Linux操作系统也建议使用压缩包方式下载,软件源中的版本可能较旧。压缩包下载解压完成后,我们还需要配置环境变量,以Windows为例,我们直接将包含node.exe的NodeJS的目录加入环境变量Path即可。

配置完成后,我们可以使用node -v查看是否安装成功。

创建工程

在工程目录下,执行npm init即可创建一个NodeJS工程。默认情况下npm init是一个交互式的命令,我们可以根据提示输入项目名、版本、描述、入口文件等,npm init命令会根据这些信息创建工程的package.json描述文件,这里我们也可以使用npm init -y跳过这些输入操作全部使用默认值。有关什么是package.json的内容可以参考Web前端/Web客户端编程/开发工具链/npm章节。

创建好package.json后,我们就可以创建JavaScript源代码文件了,我们这里简单编写一段最简单的JavaScript代码,在控制台上输出一段信息。

index.js

console.log("Hello, world!");

然后使用以下命令即可执行代码。

node index.js

当然,我们也可以在pacakge.json中编写启动命令,然后使用npm run方式启动项目,和前端工程开发中使用各种NodeJS编写的工具用法是类似的,这里就不多介绍了。

使用TypeScript开发NodeJS工程

TypeScript是由微软开发并开源的一门编程语言,相比JavaScript,TypeScript支持静态类型和许多优秀的语言特性,对大型项目的开发效率提升明显。对于NodeJS环境,TypeScript需要编译为JavaScript运行,不过我们通常不需要手动调用tsc编译器。ts-node是用于一键编译执行TypeScript的库,使用TypeScript开发NodeJS程序通常都使用ts-node实现。

我们先安装TypeScript编译器、ts-node和NodeJS的TypeScript类型信息。

npm i -D typescript ts-node @types/node

然后编辑tsconfig.json设置编译器参数,有关这部分可以参考Web前端/Web客户端编程/TypeScript相关章节。

{
  "compilerOptions": {
    "rootDir": "./src",
    "outDir": "./dist",
    "target": "esnext",
    "module": "nodenext",
    "lib": ["esnext"],
    "declarationMap": true,
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "declaration": true,
    "sourceMap": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

由于我们的ts-node是工程内局部安装的,无法直接通过命令行调用,因此还需要我们在package.json中写入启动命令。

{
  "scripts": {
    "start": "ts-node src/main.ts"
  },
  // ... 其它配置
}

最后,我们在src文件夹内创建TypeScript源码文件编译执行即可。

NodeJS代码和前端代码的主要区别

虽然NodeJS和浏览器环境都使用JavaScript作为编程语言,但由于运行环境的不同,两者在API支持、模块系统、执行上下文等方面存在显著差异。

全局变量不同:在浏览器中,全局对象是window,而NodeJS中则是global

模块化机制差异:浏览器原生支持ES6模块(通过<script type="module">),而早期NodeJS采用的是CommonJS规范(使用require()module.exports)并持续了相当长的一段时间。虽然现代NodeJS也支持ES6模块了,但部分库仍存在CommonJS模块,NodeJS14版本提供了两种模块化机制的互操作性。

无DOM/BOM API:NodeJS运行在服务端,没有浏览器环境,因此没有windowdocumentlocalStorage等API,这是显而易见的。问题在于一些第三方库可能是专为浏览器环境设计的,这些库的代码中调用了DOM/BOM API,因此NodeJS可能无法直接使用,与之相对的,使用了NodeJS环境专有API的库也可能无法在浏览器环境中使用。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。