深入理解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 相关文章推荐
自己整理的一个javascript日期处理函数
Oct 16 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
Mar 02 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
Dec 13 Javascript
基于bootstrap插件实现autocomplete自动完成表单
May 07 Javascript
confirm确认对话框的实现方法总结
Jun 17 Javascript
javascript日期比较方法实例分析
Jun 17 Javascript
js实现打地鼠小游戏
Feb 13 Javascript
详解Vue 动态添加模板的几种方法
Apr 25 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
Nov 24 Javascript
webpack源码之loader机制详解
Apr 06 Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
利用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 htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
零基础小白多久能学会python
2020/06/22 Python
导致python中import错误的原因是什么
2020/07/01 Python
python中使用np.delete()的实例方法
2021/02/01 Python
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
C有"按引用传递"吗
2016/09/06 面试题
2014年大学生四年规划书范文
2014/04/03 职场文书
建筑工地宣传标语
2014/06/18 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
应急管理工作总结2015
2015/05/04 职场文书
六年级数学教学反思
2016/02/16 职场文书
七年级作文之游记
2019/12/11 职场文书
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
python小型的音频操作库mp3Play
2022/04/24 Python