深入理解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 相关文章推荐
CSS JavaScript 实现菜单功能 改进版
Dec 09 Javascript
js AspxButton的客户端操作
Jun 26 Javascript
纯JS实现动态时间显示代码
Feb 08 Javascript
深入探究AngularJS框架中Scope对象的超级教程
Jan 04 Javascript
使用jQuery UI库开发Web界面的简单入门指引
Apr 22 Javascript
jQuery实现对象转为url参数的方法
Jan 11 Javascript
漂亮实用的页面loading(加载)封装代码
Feb 03 Javascript
解决vue点击控制单个样式的问题
Sep 05 Javascript
JavaScript对JSON数组简单排序操作示例
Jan 31 Javascript
详解package.json版本号规则
Aug 01 Javascript
vue3修改link标签默认icon无效问题详解
Oct 09 Javascript
为react组件库添加typescript类型提示的方法
Jun 15 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
织梦模板标记简介
2007/03/11 PHP
php 图片上传类代码
2009/07/17 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
删除重复数据的算法
2006/11/23 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
Python读写Excel文件方法介绍
2014/11/22 Python
用Python代码来解图片迷宫的方法整理
2015/04/02 Python
python实现网站的模拟登录
2016/01/04 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
岗位职责的含义
2013/11/17 职场文书
2013年保送生自荐信格式
2013/11/20 职场文书
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
事业单位接收函
2014/01/10 职场文书
走群众路线剖析材料
2014/10/09 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
李白故里导游词
2015/02/12 职场文书
redis 查看所有的key方式
2021/05/07 Redis
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python