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