深入理解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 相关文章推荐
ie7+背景透明文字不透明超级简单的实现方法
Jan 17 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
AngularJS使用指令增强标准表单元素功能
Jul 01 Javascript
AngularJS中过滤器的使用与自定义实例代码
Sep 17 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 Javascript
原生node.js案例--前后台交互
Feb 20 Javascript
原生JS实现圆环拖拽效果
Apr 07 Javascript
基于vue cli 通过命令行传参实现多环境配置
Jul 12 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
jQuery实现验证用户登录
Dec 10 jQuery
jQuery实现点击滚动到指定元素上的方法分析
Mar 19 jQuery
利用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
php数字游戏 计算24算法
2012/06/10 PHP
php下载文件的代码示例
2012/06/29 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
拖动一个HTML元素
2006/12/22 Javascript
js 操作css实现代码
2009/06/11 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
django缓存配置的几种方法详解
2018/07/16 Python
python调用百度语音识别api
2018/08/30 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
python实现经纬度采样的示例代码
2020/12/10 Python
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
2014年班主任自我评价范文
2014/04/23 职场文书
综合测评自我评价
2015/03/06 职场文书
大学生敬老院活动总结
2015/05/07 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书