Node.js 的模块知识汇总


Posted in Javascript onAugust 16, 2017

在写 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.

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

Javascript 相关文章推荐
JavaScript 直接操作本地文件的实现代码
Dec 01 Javascript
纯js模拟div层弹性运动的方法
Jul 27 Javascript
JS+CSS3模拟溢出滚动效果
Aug 12 Javascript
AngularJS中$http服务常用的应用及参数
Aug 22 Javascript
JavaScript中数组slice和splice的对比小结
Sep 22 Javascript
jQuery获取this当前对象子元素对象的方法
Nov 29 Javascript
微信小程序实现选项卡功能
Jun 19 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
Nov 04 Javascript
详解vue项目打包步骤
Mar 29 Javascript
Layui多选只有最后一个值的解决方法
Sep 02 Javascript
Element MessageBox弹框的具体使用
Jul 27 Javascript
Javascript类型判断相关例题及解析
Aug 26 Javascript
vue绑定设置属性的多种方式(5)
Aug 16 #Javascript
jQuery中each循环的跳出和结束实例
Aug 16 #jQuery
随机生成10个不重复的0-100的数字(实例讲解)
Aug 16 #Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
Aug 16 #Javascript
基于js 本地存储(详解)
Aug 16 #Javascript
基于Vue实例生命周期(全面解析)
Aug 16 #Javascript
基于JQuery的Ajax方法使用详解
Aug 16 #jQuery
You might like
Look And Say 序列php实现代码
2011/05/22 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
一些常用的Javascript函数
2006/12/22 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
更改Python命令行交互提示符的方法
2015/01/14 Python
python实现的简单猜数字游戏
2015/04/04 Python
python通过函数属性实现全局变量的方法
2015/05/16 Python
Python yield与实现方法代码分析
2018/02/06 Python
python语音识别实践之百度语音API
2018/08/30 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
python RSA加密的示例
2020/12/09 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
人事行政主管岗位职责
2013/12/22 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
保护环境标语
2014/06/09 职场文书
投标授权委托书范文
2014/08/02 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫
Python PIL按比例裁剪图片
2022/05/11 Python