深入理解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 相关文章推荐
JS宝典学习笔记(下)
Jan 10 Javascript
juqery 学习之六 CSS--css、位置、宽高
Feb 11 Javascript
JavaScript如何从listbox里同时删除多个项目
Oct 12 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
Sep 01 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 Javascript
AngularJs基于角色的前端访问控制的实现
Nov 07 Javascript
浅谈angularjs依赖服务注入写法的注意点
Apr 24 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
Apr 25 jQuery
webpack源码之loader机制详解
Apr 06 Javascript
Vue循环组件加validate多表单验证的实例
Sep 18 Javascript
全面分析JavaScript 继承
May 30 Javascript
vue router-link 默认a标签去除下划线的实现
Nov 06 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(8) php 数组
2010/03/05 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
php关联数组快速排序的方法
2015/04/17 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
python实现在pickling的时候压缩的方法
2014/09/25 Python
python检索特定内容的文本文件实例
2018/06/05 Python
Python os.access()用法实例
2019/02/18 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
医学生职业规划范文
2014/01/05 职场文书
党员教师工作决心书
2014/03/13 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
汽车转让协议书范本
2014/12/07 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers