Node.js 的模块知识汇总

 更新时间:2017年08月16日 08:41:19   作者:边城  
node.js中是通过模块来划分为单位来划分所有功能的。每个模块为一个js文件。每个模块中定义的全局变量或函数的作用范围也被限制在这个模块中,只能用exports对象将其传递到外部。

在写 Node.js 应用程序的时候,你确实可以把所有代码放在巨大原 index.js 文件中,不在乎你的应用程序会变得多大多复杂。Node.js 解释器不会在意这个事情。但在代码组织方面,你很快就会陷入混乱,不能理解代码,而且难以调试。所以,作为一个人,你应该关心代码的结构。这就是使用模块的原因。

你可以把 Node.js 模块当作 JavaScript 库 —— 是整体代码中你想放在一起的某个部分(比如,函数集),你会想把这部分代码相对独立于代码库中的其它部分,可以把事情区分清楚。

就们我们把袜子放在衣柜一个抽屉,把衬衣放在衣柜的另一个抽屉 —— 我们可以把它们组成一天的着装 ——在代码库中,我们将不同的部分保存在不同的模块中,然后将它们有条不紊地合并成一个应用程序。

内建模块

即使我们不创造任何 Node.js 模块,也有模块可用,因为 Node.js 环境提供了内建模块。我们已经遇到过一个模块,就是在博客中寻找如何使用内建的 SHATWG URL 解析器的时候。

在我们自己的代码文件中,我们需要使用已经存在但是在别处声明的代码 —— 这种情况下,URL类是 Node.js 内置模块url中的一部分。

var URL = require('url').URL;

require('url')让我们可以访问url模块。这个模块定义在哪里,是怎么定义的,对我们来说完全不透明 —— 我们所需要知道的只是它的名称 ——url—— 以及它公开的属性,比如URL。

其它内建的模块直接导出我们需要的属性(通常是 JavaScript 对象)。以http模块为例:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end('Hello World!');
}).listen(8080);



这里,请求http模块让我们可以直接访问http对象,我们可以直接使用其方法,比如createServer。

Node 初学者这本书讲述了如何使用 Node.js 写一个完整的 Web 服务器,它就是使用的内建http模块。

外部模块

内建模块随 Node.js 发布,它可以解决很多开发问题,而不需要为每个应用发明新的轮子,但是真正促进 Node.js 编程能力的是由来自 Node.js 社区的开源模块构建起来的庞大生态系统。这些模块也可以集成到我们的代码库中,但是由于它们不是内置的,并且不会随每次安装Node.js 一起安装,所以只在是我们的代码中require是不够的。我们需要先安装包含外部模块的代码库,由于 NPM,Node Package Manager(Node 包管理器) 的存在,这很容易。

请参博客文章,它以如何使用 async 库为例来介绍如何使用外部模块。

此外,Node工匠书还使用了一个章节来介绍了使用 NPM 的细节。

创建你自己的模块

内建模块和外部模块都是别人提供的,但它们不会妨碍你创建自己的 Node.js 模块。

下面的例子创建了一个名为myRandom的模块,它会提供了一个辅助函数,用于返回 0 到 10 之间的数。

文件myRandom.js:

function getRandom(min, max) {
   return Math.random() * (max - min) + min;
}

exports.between1and10 = function() {
   return getRandom(1, 10);
};



你应该把代码放在自己的myRandom.js文件中。由于此文件存在,并通过exports向外提供属性,另一个文件index.js可以使用导出的功能:

文件index.js:

var myRandom = require('./myRandom.js');

console.log(myRandom.between1and10());



require再次发挥作用,它让本地myRandom模块中导出的属性生效 —— 在这里是指between1and10函数。

注意:虽然模块系统允许公开模块的功能,但它也允许隐藏在模块之外不会用到的功能,只要不通过exports导出就好。即使index.js文件请求了myRandom.js文件,它也不能访问未导出的getRandom函数:

var myRandom = require('./myRandom.js');

console.log(myRandom.getRandom(5, 99));

这会导致 TypeError: myRandom.getRandom is not a function.

通过将实现细节隐藏在模块中,只暴露出需要在其它代码中使用的部分,可以很好的组织你的代码。

相关文章

  • pm2 部署 node的三种方法示例

    pm2 部署 node的三种方法示例

    本篇文章主要介绍了pm2 部署 node的三种方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例

    从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例

    这篇文章主要介绍了Node.js EventEmitter发送和接收事件的方法,结合实例形式分析了EventEmitter发送和接收事件的原理、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • Node.js 使用request模块下载文件的实例

    Node.js 使用request模块下载文件的实例

    今天小编就为大家分享一篇Node.js 使用request模块下载文件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • nodejs使用Express框架写后端接口的全过程

    nodejs使用Express框架写后端接口的全过程

    最近学习了基于前后端分离的开发模式,我前端使用Vue框架,后端使用nodejs开发API接口,下面这篇文章主要给大家介绍了关于nodejs使用Express框架写后端接口的相关资料,需要的朋友可以参考下
    2022-05-05
  • nodejs密码加密中生成随机数的实例代码

    nodejs密码加密中生成随机数的实例代码

    本篇文章主要介绍了nodejs密码加密中生成随机数的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • node-sass是干什么用的

    node-sass是干什么用的

    node-sass是一个项目依赖,在一个项目中在使用sass语法的时候,必须通过sass-loader来解析sass,从而使sass语法变成浏览器能够识别的CSS语法,下面介绍node-sass是什么,一起看看吧
    2023-08-08
  • node.js接口复习及使用案例解析

    node.js接口复习及使用案例解析

    这篇文章主要为大家介绍了node.js接口的复习及使用案例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 浅析Node.js实用的内置API

    浅析Node.js实用的内置API

    这篇文章主要介绍了Node.js实用的内置API,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Node.js 中判断一个文件是否存在

    Node.js 中判断一个文件是否存在

    这篇文章主要记录一些 Node.js 应用中的小知识点,如果你 Google/Baidu “Node.js 如何判断文件是否存在” 发现给出的很多答案还是使用的 fs.exists,这里不推荐使用 fs.exists 你可以选择 fs.stat 或 fs.access。
    2020-08-08
  • Node.js调试技术总结分享

    Node.js调试技术总结分享

    Node.js是一个可以快速构建网络服务及应用的平台。该平台的构建是基于Chrome's JavaScript runtime,也就是说,实际上它是对Google V8引擎(应用于Google Chrome浏览器)进行了封装。 今天介绍Node.js调式目前有几种技术,需要的朋友可以参考下。
    2017-03-03

最新评论