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 CSS画图之基础篇
Jul 29 Javascript
JS 事件绑定函数代码
Apr 28 Javascript
ParseInt函数参数设置介绍
Jan 02 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
Mar 04 Javascript
使用Jquery实现每日签到功能
Apr 03 Javascript
浅谈javascript语法和定时函数
May 03 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
jQuery解决$符号命名冲突
Jun 18 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
Aug 31 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
Feb 12 jQuery
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
原生JavaScript实现换肤
Feb 19 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
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
Vue绑定内联样式问题
2018/10/17 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
python如何实现数据的线性拟合
2019/07/19 Python
python django model联合主键的例子
2019/08/06 Python
Python tcp传输代码实例解析
2020/03/18 Python
python识别验证码的思路及解决方案
2020/09/13 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
公务员政审个人鉴定
2014/02/25 职场文书
财产公证书格式
2014/04/10 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
高中生旷课检讨书
2014/10/08 职场文书
员工辞职信范文大全
2015/05/12 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书