Node.js:模块

本文来自 Node.js Log 系列

Node.js 提供了很多模块,有内置的和第三方的,这些模块提供了各种各样的功能。

可以简单的理解为将一个功能存在一个 JS 文件里,这就是一个模块,接着使用预设好的「require、exports、module」三个变量调用这个文件,也就是模块进行使用。

当将多个模块组合起一个大模块时,可以称之为包(package)。

内置模块

此处创建一个项目后,新建一个 index.js 文件,以使用「os」模块作为一个例子

const os = require('os');
console.log(os.hostname());

以上例子的意思为先新建一个常量,一般以模块名命名,然后使用 require 方法引入 os 模块,

接着使用 os 模块的「hostname()」方法打印出操作系统的主机名。

在终端运行即可看到你电脑的主机名了:

node index.js

第三方模块

内置模块提供的功能毕竟有限,拥抱开源社区的好处是可以使用其他开发者开发的各式各样的模块,一般第三方模块可以在 NpmJS 网站上通过关键字等方式查找查找你需要的功能,在 NpmJS 上提供的模块也称为包,需要通过 NPM 或者 Yarm 下载后方可使用,此处以包「request」为例

npm install request --save
yarn add request

使用 npm 安装包记得加上「–save」下载的包信息得以保存在项目配置文件「package.json」中,以免项目在其他地方使用使确实相关包信息,而 Yarn 则会自动保存不需要相关参数。

接着按照 Request – Simplified HTTP client 提供的使用说明,在「index.js」中使用

const request = require('request');
request('http://www.google.com', function (error, response, body) {
    console.log('error:', error); // Print the error if one occurred
    console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
    console.log('body:', body); // Print the HTML for the Google homepage.
});

在终端运行「node index.js」即可看到 Google 首页的 HTTP 请求信息。

自定义模块

当第三方开发者都不能满足需求时,也可以自行创造模块,比如在项目下新建一个名为「tips.js」的文件,文件内容为

const hi = () => {
    console.log('hi')
}

module.exports.tips = hi; // 导出一个 tips,它的值是上面 const 常量 hi

这里就写一个打印字符串「hi」的模块,写完相关功能后使用「module.exports」方法将其导出,接着在「index.js」中引入并使用

const say = require('./hi');
say.tips();

此时引入的模块就需要写上确切路径了,这个路径可以是绝对路径或者相对路径,并且可以不需要文件后缀名也就是「.js」。

然后在终端运行「node index.js」中就可以看到字符串提示「hi」。

主模块

通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其它模块完成工作。

上面自定义模块的例子中,通过「index.js」模块调用了「tips.js」模块,这里的「index.js」就是主模块。

再来个例子,新建一个「count.js」模块

let num = 0;

const count = () => ++num;

module.exports.count = count;

接着新建一个主模块「main.js」

const counter1 = require('./count');
const counter2 = require('./count');

console.log(counter1.count());
console.log(counter2.count());
console.log(counter2.count());

接着运行主模块,可以看到输出结果是「1 2 3」说明了没有因为被「require」了两次而初始化两次。

模块解析规则

以上例子中「require」时,内置模块和第三方模块都没有填写路径,但在自定义模块时填写了,这个模块路径解析过程大致如下:

如果是内置模块,那么不做路径解析,直接返回内置模块的导出对象,比如上面用的「os」

如果是第三方模块,在通过 npm 等包管理下载时是放置到了 Node.js 定义的「node_modules」下,所以此处可以不用填写路径。如果目录「node_modules」下找不到,则一级级的向上查找每个目录下的「node_modules」,如果还找不到则是查找模块同名目录下的「index.js」和「index.node」,如果还是找不到则查找全局环境。

关于如何查找模块可以看官方文档了解更多。

 

Conners Hua

欢迎加入群聊: Telegram 群聊 | QQ 群聊(不讨论敏感话题) 如果你想学习数据分析/机器学习/人工智能编程基础,可以来优达试试

您可能还喜欢...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.