当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 深入理解Node module模块

深入理解Node module模块

2018年04月18日  | 移动技术网IT编程  | 我要评论

在开发复杂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模块的使用方式相同。虽然二进制模块能使用操作系统提供的所有功能,但难以跨平台使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网