深入理解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 获取子节点函数 (兼容FF与IE)
Apr 18 Javascript
jQuery Tools tab使用介绍
Jul 14 Javascript
js jquery数组介绍
Jul 15 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
详解基于angular路由的requireJs按需加载js
Jan 20 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
Aug 24 Javascript
JS使用栈判断给定字符串是否是回文算法示例
Mar 04 Javascript
json_decode 索引为数字时自动排序问题解决方法
Mar 28 Javascript
利用React高阶组件实现一个面包屑导航的示例
Aug 23 Javascript
vue实现几秒后跳转新页面代码
Sep 09 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
文件上传的实现
2006/10/09 PHP
function.inc.php超越php
2006/12/09 PHP
PHP编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
php 冒泡排序 交换排序法
2011/05/10 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
PHP生成图片缩略图类示例
2017/01/12 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
JS 时间显示效果代码
2009/08/23 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
Python使用asyncio包处理并发详解
2017/09/09 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Python单向链表和双向链表原理与用法实例详解
2018/08/31 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
HTML5 weui使用笔记
2019/11/21 HTML / CSS
西班牙手机之家:Phone House
2018/10/18 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
店面销售职位的职责
2014/03/09 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书