为什么进行模块化开发?

在传统的非模块化开发中,可能会出现命名冲突和文件依赖等一系列缺点,再用上模块化开发之后,各个模块之间都是相对独立的,这种问题就可以有效的避免。但是在最开始进行模块化开发的时候是没有标准的,各个项目之间使用的可能是完全不一样的两套标准,后来就对模块化开发的标准进行了统一。

在前端,我们比较常用两种模块化规范。

  • AMD - requirejs 国外使用较多
  • CMD - seajs 淘宝开发的一套标准

在服务器端使用的最多的模块化规范就是

  • CommonJS - Node.js

node.js提供了很多直接可以使用的系统模块,比如说文件处理模块,网络处理模块等等,在其他的文件直接导入就可以使用,那么我们怎么来自定义和使用模块呢?

自定义模块

一个js文件就是一个独立模块,所有模块内部的成员都是互相独立的。也就是说只要写一个js文件,它就是一个模块了(当然也有其他的类型的模块,例如json文件和node文件,但是最常用的还是js模块)。

导出和导入模块

方法一:experts

举例

mod1.js

var sum = function(a,b){
    return parseInt(a) + parseInt(b);
}

exports.sum = sum;

mod2.js

var module = require('./mod1');

let x = module.sum(12,10);

console.log(x);

运行mod.js,最后得到的结果就是22。导出的时候为exports设置一个新的成员变量,这个成员的值等于要导出的函数或者变量。而在另一个模块中,要先使用require()函数将模块导入,并将其返回值赋值给一个变量,通过这个变量就可以直接访问到原先模块中的方法或者变量了。

方法二: module.exports

注意的是这个exports是module这个全局变量下的。而方法一的exports本身就是一个全局变量。

举例

mod1.js

var sum = function(a,b){
    return parseInt(a) + parseInt(b);
}

module.exports = sum;

mod2.js

var sum = require("./模块21");

var a = sum(10,10);

console.log(a);

运行mod2.js,最后得到的结果就是20了,这种方法就是直接将函数对应的变量赋值给 module.exports,然后在另一个模块中,用require函数就可以直接获取到对应的函数的变量,直接传入参数使用即可。

方法三:使用global

举例

mod1.js

var flag = 123;

global.flag = flag;

mod2.js

require('./模块31')

console.log(global.flag);

运行mod2.js直接得到123。

这个方法和方法一类似,不同的是方法一在使用时需要用require方法返回一个模块的对象,调用这个对象里面的方法,而global直接用.来使用被导入模块中添加在global下的成员变量就可以了。

模块的缓存

NodeJS的模块不会被重复加载,这是因为NodeJS通过文件名缓存所有加载过的文件模块,所以以后再访问时就不会重新加载,注意,NodeJS是根据实际文件名缓存的,而不是require提供的参数缓存的,即使你分别通过require('express')和require('./node_module/express')加载两次,也不会重复加载,因为两者解析到的文件是同一个。

举例

mod1.js

console.log("hello");

mod2.js

require('./模块缓存1.js');
require('./模块缓存1.js');
require('./模块缓存1.js');
require('./模块缓存1.js');
require('./模块缓存1.js');

结果是只打印了一次hello,也就是说模块只加载了一次,一次访问后就不会再重新加载了。

不带后缀时模块的默认加载顺序

node.js在导入模块时可以默认不加后缀名,而node.js只有三中类型的模块,第一种是js后缀的模块,第二种是存放json数据的json文件,用来直接存放一些对象,第三种node后缀结尾的文件是C/C++编写的node.js模块.

这三种模块如果在同一个文件夹下不表明后缀并且文件名相同时,谁会被优先导入呢,他们加载的优先级顺序是

.js > .json > .node,就比如说原来三个文件,a.jsa.jsona.node我们把这三个文件全部重命名为a,然后新建一个js文件,在文件中写入require('a'),原先是.js后缀的文件优先被导入,如果没有.js的文件,.json后缀的文件优先被导入,最后才是node文件。

最后编辑:2021年02月09日 ©著作权归作者所有

评论已关闭