深入理解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 相关文章推荐
关于可运行代码无法正常执行的使用说明
May 13 Javascript
jquery实现手风琴效果实例代码
Nov 15 Javascript
js中Math之random,round,ceil,floor的用法总结
Dec 26 Javascript
js 绑定键盘鼠标事件示例代码
Feb 12 Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 Javascript
JavaScript如何实现跨域请求
Aug 05 Javascript
利用JQuery直接调用asp.net后台的简单方法
Oct 27 Javascript
jQuery读取XML文件的方法示例
Feb 03 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
Apr 10 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
Nov 30 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
May 17 jQuery
解决Antd 里面的select 选择框联动触发的问题
Oct 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
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
JS删除String里某个字符的方法
2021/01/06 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
python保留小数位的三种实现方法
2020/01/07 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
企业军训感言
2014/02/08 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
情人节单身感言
2015/08/03 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
goland 设置project gopath的操作
2021/05/06 Golang
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android