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的命令
执行后会先读取自己的配置,再进行代码的转换。

猜你喜欢

转载自blog.csdn.net/m0_48459838/article/details/113826581