Node.js模块化开发

Javascript开发弊端

在实际开发过程中,我们发现Javascript存在两大问题,一是文件依赖,二是命令冲突

文件依赖:

文件依赖指的是文件与文件之间依赖关系不明确,在Javascript中文件与文件之间的依赖关系是由文件先后引入的顺序来决定的,比如在HTML中引入了a.js,b.js,c.js文件,从这个引入的顺序只能判断出后引入的文件可能会依赖于先引入的文件,而这种依赖关系的不确定会给我们带来很多的困扰。比如在实际项目中想引入 stellar.js(视差滚动插件),而这个插件是基于JQuery的,那么就需要先引入JQuery.js,否则该插件无法使用。而在模块化开发中,文件与文件之间的依赖关系是不需要人为来维护的,文件与文件之间可以自动维护。

命名冲突:

命名冲突指的是在不同的.js文件中声明了同一个变量,而这就导致后声明的变量会将之间的变量覆盖。要知道在Javascript中,文件与文件是完全开放的,也就是说在a.js文件中声明的变量,可以在b.js文件中使用,这就导致项目存在着很多的不确定性。而这个问题目前只能通过模块化开发来解决。(ps:要是与Java一样,在每个文件中可以指定当前的文件是否可以被外界访问,具体可以访问哪些变量/函数就完美了。)

什么是模块化开发?

在实际开发过程中,一个功能就是一个模块,多个模块可以构建一个完成的应用,而抽离其中的某一个模块并不会影响其它功能的运行。

模块化开发

Node.js模块化开发规范

1、Node.js规定一个Javascript.js文件就是一个模块模块内部定义的变量和函数默认情况下外部无法访问

2、当需要.js文件与.js文件之间相互依赖时,可以通过在模块内部定义exports对象对成员进行导出使用require()导入其它模块

模块成员导出和导入方式一:

通过在模块内部定义exports对象对成员进行导出,使用require()导入其它模块,示例代码如下:

模块成员的导出

// a.js
/* =============== 模块成员的导出 ===============*/
let number = 17;
function getValue() {
    return 19;
}

// 导出变量
exports.number = number;
// 导出函数
exports.getValue = getValue;

模块成员的导入

// b.js
/* =================== 模块成员的引入 =================== */
// 在b.js文件中导入a.js文件(ps:文件后缀可以省略)
const a = require('./a.js');

console.log('执行了b.js文件');
// 获取导入的a对象中的number变量
console.log('number:'+a.number);
// 调用导入的a对象中的getValue()
console.log('value:'+a.getValue());

效果图:

模块成员的导入和导出

模块成员导出和导入方式二:

通过module.exports导出,通过require()导入

模块成员导出

// a.js
/* =============== 模块成员的导出 ===============*/
let number = 17;
function getValue() {
    return 19;
}

// 导出变量
module.exports.number = number;
// 导出函数
module.exports.getValye = getValue;

模块成员导入

// b.js
/* =================== 模块成员的引入 =================== */
// 在b.js文件中导入a.js文件(ps:文件后缀可以省略)
const a = require('./a.js');

console.log('执行了b.js文件');
// 获取导入的a对象中的number变量
console.log('number:'+a.number);
// 调用导入的a对象中的getValue()
console.log('value:'+a.getValue());

效果图:

通过module.exports导出,通过require()导入

exports和module.exports之间是什么关系?

exports是module.exports的别名, 两者默认指向的是同一个变量,同一块内存空间。

exports.number = number;

等价于

module.exports.number = number;

但是,当exports对象和module.exports对象指向的不是同一个对象时,最终以module.exports为准。如下代码:

// a.js
/* =============== 模块成员的导出 ===============*/
let number = 17;
function getValue() {
    return 19;
}

// 导出变量
exports.number = number;
// 导出函数
exports.getValue = getValue;

// 重新赋值一个新的对象给module.exports这个对象
module.exports = {
    number,
    getValue
};

效果图:

exports和module.exports
如果觉得文章有帮助到你,可以扫描以下二维码
   请本文作者 喝一杯
pay_weixin pay_weixin

发表评论

电子邮件地址不会被公开。 必填项已用*标注