深入理解Node module模块


Posted in Javascript onMarch 26, 2018

在开发复杂Web应用的时候,通常需要把各个功能进行拆分、封装到不同的文件并在需要的时候引用该文件,即进行代码的模块化管理。几乎所有的编程语言都有自己的模块组织方式,比如Java中的包、C#中的程序集,而Node采用CommonJS模块规范。

模块规范

CommonJS旨在将运行在浏览器之外的JS进行标准化,并已经解决了大量的JS问题(如全局命名冲突)。Node对CommonJS的实现中,每个模块都会被封装在一个单独的JS文件中,即一个文件就是一个模块,而文件路径就是模块名。在编写每个模块时,都有以下三个预定义好的变量可供使用:

require()

该函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可以使用相对路径(以./开头),也可以使用绝对路径(以/或C: 之类的盘符开头)。另外,模块名中的.js 扩展名是可以省略的,此时Node会寻找同名的文件夹,如果找不到,则寻找同名的js文件。还可以使用该函数加载和使用一个JSON文件,但此时.json 扩展名不可省略。

exports

该对象是当前模块的导出对象,用于导出模块公有方法和属性,默认为一个空对象{}。别的模块通过require()函数使用当前模块时得到的就是当前模块的exports对象。以下代码中导出了一个公有方法:

exports.hello = function() {
  console.log("Hello World!");
};

module

该对象用于提供当前模块的元数据等相关信息,但用途最多的是使用其exports属性替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,可以使用以下方式使其变成一个函数:

module.exports = function() {
  console.log("Hello World!");
};

注意:当使用以上方式时,对exports对象的所有修改都将被忽略!

模块初始化

一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。

在test.js定义一个模块

//定义私有变量
var name = "";
function setName(n) {
  name = n;
}

function logName() {
  console.log(name);
}

//导出公有方法
exports.setName = setName;
exports.logName = logName;

在main中加载test模块

//加载test模块
var test1 = require("./test.js"),
  test2 = require("./test.js");

//使用test1
test1.setName("Neo");

//使用test2
test2.logName(); //Neo

可见,无论调用多少次require() ,对于同一个模块只加载一次,引用多次获取的其实是相同的实例。

主模块

通过命令行参数传递给Node以启动程序的模块称为主模块,主模块负责调度组成整个应用程序的其他模块协同工作。例如通过以下命令行启动程序时,main.js 就是主模块:

$ node main.js

二进制模块

Node除了可以使用JS编写模块,也支持使用C/C++编写二进制模块,编译好的二进制模块除了文件扩展名是.node外,和JS模块的使用方式相同。虽然二进制模块能使用操作系统提供的所有功能,但难以跨平台使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery垂直公告滚动实现代码
Dec 08 Javascript
jQuery中removeProp()方法用法实例
Jan 05 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
May 07 Javascript
九种原生js动画效果
Nov 11 Javascript
AngularJS基础 ng-class-odd 指令示例
Aug 01 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
js内置对象处理_打印学生成绩单的简单实现
Sep 24 Javascript
JS验证input输入框(字母,数字,符号,中文)
Mar 23 Javascript
Angularjs 事件指令详细整理
Jul 27 Javascript
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
Bootstrap Fileinput 4.4.7文件上传实例详解
Jul 25 Javascript
微信小程序制作扭蛋机代码实例
Sep 24 Javascript
利用Console来Debug的10个高级技巧汇总
Mar 26 #Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
Mar 26 #Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
Mar 26 #Javascript
Vue中v-show添加表达式的问题(判断是否显示)
Mar 26 #Javascript
使用Vue构建可重用的分页组件
Mar 26 #Javascript
基于jQuery实现Ajax验证用户名是否可用实例
Mar 25 #jQuery
jQuery实现的回车触发按钮事件功能示例
Mar 25 #jQuery
You might like
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
详解webpack介绍&安装&常用命令
2017/06/29 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
python赋值操作方法分享
2013/03/23 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
校园游戏活动新闻稿
2014/10/15 职场文书
小升初自荐信范文
2015/03/05 职场文书
小学感恩节活动总结
2015/03/24 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
人与自然观后感
2015/06/16 职场文书