Node的模块开发
一、什么是模块化开发
js在一开始使用时,存在多个js引用先后问题,执行顺序是按引入的顺序,
但有可能先引入的js文件依赖后引入的js文件,会出现问题。而且多个js文件中可能会有同名的全局变量,后引入的文件中的同名变量会覆盖前面引入js文件中的同名变量,会发生错误。
在模块化开发中,文件之间的关系不需要认为来维护,且模块之间,同名的全局变量不会互相影响,只暴露需要使用的变量。
node.js规定一个js文件就是一个模块,模块内部定义的变量和函数在外部无法得到的。
node使用的是CommonJS规范
二、导出模块
使用exports对象导出模块,可以看成导出的方法都在这个exports对象实例上。
function test(){
console.log('test')
}
let demo = function(){
console.log('demo')
}
exports.test = test
exports.demo = demo
三、引入模块require()
一个文件的引入,引入的是一个模块对象,方法都在这个对象上。
let testobj = require('模块的路径')//接收的是一个模块对象
testobj.test();//通过对象点的形式来调用对应的方法
testobj.demo ();
引入模块可以省略后缀的.js
四、module.exports和exports
module.exports和exports使用方法一致
exports是module.exports的别名,他们就是两个不同名的变量,但地址都是引用的同一个模块对象,同一个文件的多个方法,既可以使用exports点方法的形式导出也能使用module.exports点方法的形式导出。但要是module.exports直接等于一个对象时,最终的导出按这个对象为准。
let a = 'test';
let b = 'demo';
exports.a = a;
module.exports.b = b;
//到这为止都能成功导出a和b,在另一个文件中可以得到
//接下来,要是写上
module.exports = {
a : 'change'
}
//此时其他文件引入的模块对象就是这个对象了,上面的a和b被覆盖掉了。可以看作重新赋值了一个模块对象。
//要是同时写module.exports = {
//a : 'change'
//}和下面的exports
exports = {
b: 'test'
}
//其他文件引用的还是module.exports 导出的对象。
五、使用es6的模块化规范
node支持commonJS,但是对应es6的模块化规范不是很支持,所以需要使用babel插件来把高级的js语法,转换成低级的js语法,
1.babel的使用
1.安装
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
上面的安装后,再安装下面的
npm install --save @babel/polyfill
2.创建babel.config.js文件
在项目根目录创建。
3.配置babel
const presets = [
[
//这个插件表示转换后的语法一定要支持下面的浏览器
"@babel/env",
{
target :{
edge:"17",
//17表示版本号
firefox:"60",
chrome:"67",
safari:"11.1"
}
}]
];
//暴露这个模块对象
module.exports = {
presets
};
4.执行babel文件
npx babel-node ./index.js
//表示使用babel-node来执行当前下的index.js文件。
//会把文件里的高级代码转换成低级js代码
//并会执行这个js文件,相当于node ./index.js执行文件
npx是npm默认提供的,能够执行某些cli的命令
执行后会先读取自己的配置,再进行代码的转换。
扫描二维码关注公众号,回复:
12647380 查看本文章
