1. 简介
Node.js是一个基于谷歌V8引擎的JavaScript运行时,可以在服务器端运行JavaScript。它可以用来构建高性能的网络应用程序,因为它使用了事件驱动、非阻塞I/O模型。Node.js 最初由 Ryan Dahl 在2009年创建,目前由 Node.js基金会维护。Node.js 主要用途是构建后端网络应用,但也可以用于构建命令行工具。
需要注意的是,Node.js不是框架,而是一个可以运行JavaScript 的平台。所以,如果你需要搭建一个基于 Node.js 的应用程序,你需要使用框架或者底层库。
2. 安装
安装Node.js的方法有多种,可以通过官方网站下载适用于不同操作系统的安装包进行安装,也可以通过包管理器进行安装,这里以NPM为例进行介绍。
2.1 NPM安装
如果你已经安装了npm,那么可以在终端中输入以下命令来安装Node.js:
npm install node
如果你的npm版本比较旧,建议升级到npm5.2以上版本,因为这个版本以后使用了包括npx在内的一些全新的工具,这些工具让你在全局范围内方便地运行包内的可执行文件。
3. 模块化
Node.js采用了CommonJS模块规范,这个规范主要包括模块引用、模块定义和模块标识三个方面。
3.1 模块引用
在Node.js中,可以使用require来引用一个模块,代码如下:
var http = require('http');
使用require引用一个模块的时候,要遵循以下原则:
文件模块以 . 或者 .. 开头,表示相对路径和绝对路径。
如果文件模块不以 . 或者 .. 开头,表示这是一个核心模块(https://nodejs.org/api/中列出的模块),或者是放在node_modules目录中的模块。
require加载模块的时候会从module对象的exports属性返回,在文件中声明一个变量并通过exports赋值,即可导出。
如果模块导出的是一个函数或者是一个对象,可以直接调用对象上的属性或者方法;如果导出的是一个类,需要使用new关键字来创建对象。
3.2 模块定义
在Node.js中,可以通过exports对象将本模块中的属性或者方法导出,代码如下:
exports.test = function () {
console.log('test');
};
3.3 模块标识
在Node.js中,一个模块有一个唯一的标识符,它可以通过require方法中的参数传递。标识符可以是以下任意一种类型:
相对路径或者绝对路径:例如'./test'表示同一目录下的test.js文件。
核心模块名:例如‘http’、‘fs’等。
非路径形式的文件模块名:例如'myModule',当使用require方法时,Node.js会从当前目录的node_modules文件夹下面查找对应的模块,如果找不到就会往上级目录查找,直到找到为止(或者是达到根目录)。
4. 加载机制
Node.js是单线程的,采用的是事件驱动、非阻塞I/O模型。在使用Node.js开发应用程序时,需要注意加载机制的相关问题。
4.1 延迟加载
当使用require函数加载模块时,如果该模块没有被加载过,则Node.js会给该模块一个缓存。当再次使用require加载这个模块时,会直接从缓存中获取。也就是说,同一个模块只会被加载一次。
4.2 异步加载
Node.js中所有的I/O请求都是异步的,不会阻塞事件循环,提高了Node.js的性能。当使用require函数加载一个模块时,如果该模块还没有被加载,则Node.js会用异步的方式去查找。
5. Http模块
Node.js的Http模块是一个核心模块,可以用来创建HTTP服务器和客户端。下面是一个简单Http服务端的实现。
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World!');
res.end();
}).listen(8080);
上述代码创建了一个Http服务器,并监听着8080端口,当有访问请求时,返回一个"Hello World!"字符串。
6. 总结
本文简单介绍了Node.js的安装、模块化、加载机制和Http模块。各位读者可以根据这些关键节点深入学习和探索Node.js。Node.js作为服务端语言,拥有较高的性能和较好的扩展性,在云计算和移动开发中越来越受到重视。