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高级程序设计 阅读笔记(二十) js错误处理
Aug 14 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
js清理Word格式示例代码
Feb 13 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
Sep 21 Javascript
jQuery 选择器详解
Jan 19 Javascript
JavaScript创建一个object对象并操作对象属性的用法
Mar 23 Javascript
JS使用eval解析JSON的注意事项分析
Nov 14 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
Jul 16 Javascript
vue中使用input[type="file"]实现文件上传功能
Sep 10 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
Oct 30 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
Mar 08 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
php 购物车实例(申精)
2009/05/11 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
寻找网站后台地址的python脚本
2014/09/01 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
介绍一下linux的文件权限
2014/07/20 面试题
保护环境倡议书
2014/04/14 职场文书