【Node】Node.js的模块系统、ES6的模块导入导出

文章目录

  • Node.js的模块系统
    • 为什么要使用模块
    • 模块的使用
    • 模块中成员暴露的方法
  • ES6中的模块导出导入


软件中的模块开发:
一个功能就是一个模块,多个模块可以组成完整应用,抽离一个模块不会影响其他功能的运行

require: node 和 es6 都支持的引入
export / import : 只有es6 支持的导出引入
module.exports / exports: 只有 node 支持的导出

Node.js的模块系统

CommonJS:它是一个致力于将 JavaScript 生态系统标准化的一个组织,它最出名的一个提议就是我们众所周知的 CommonJS modules ,Node 则是在本规范的基础上构建了他自己的模块系统,并且添加了一些自定义扩展。

  • CommonJS定义的模块分为: 模块标识(module)、模块定义(exports) 、模块引用(require)

  • Node.js规定一个 JavaScript文件 就是一个模块,模块内部定义的变量、函数、类默认情况下在外部无法得到。

  • 模块内部可以使用exports对象进行成员导出, 使用require()方法导入其他模块

  • Node.js主要用于服务器端编程,无须考虑非同步加载的方式,选择CommonJS规范。

  • 按照CommonJS规范要求,使用exports接口对象导出模块中的成员,通过require()方法将其他模块的输出加载到当前模块作用域中。
    【Node】Node.js的模块系统、ES6的模块导入导出_第1张图片

为什么要使用模块

  • Node.js将可重用代码封装在各种模块中,减少应用程序的代码量,提高开发效率和代码的可读性。
  • 模块打包代码的方式不会改变全局作用域,开发人员可以在被载入的模块文件中选择要对外暴露的方法和变量。
  • 模块可以发布到npm仓库中与他人共享。

模块的使用

  • require()方法,除了用来加载某个模块外,还可以拿到当前加载进来的文件模块导出的接口对象,因为在每个文件模块中都提供了一个exports对象,这个exports对象它是用来将某个方法或变量暴露(导出)出去。
  • exports默认是一个空对象。
  • 我们可以动态地为这个exports对象添加一些成员,我们现在要做的便是把所有需要被外部访问到的成员方法或属性挂载到这个exports对象当中,如果没有挂载到exports对象中的方法或变量,外部是无法访问的。

模块中成员暴露的方法

通过exports:

  • exports.变量名 主要用来暴露变量和函数
  • exports返回的是模块函数
//j1.js
var func1 = function() {
   console.log("func1");
};
 
var func2 = function() {
   console.log("func2");
};
 
exports.function1 = func1;
exports.function2 = func2;
//调用
var functions = require("./j1");
functions.function1();
functions.function2();

通过module.export:

  • module.exports主要用来暴露一个类
  • module.exports 返回的是模块对象本身,返回的是一个类
  • module.exports需要new对象之后才可以调用
var CLASS = function(args){
     this.args = args;
}
module.exports = CLASS;
//调用
var CLASS = require('./CLASS.js');
varc = new CLASS('arguments');
// 此类情况会覆盖
module.exports='hello';
module.exports={
    num:123,
    str:'world'
}

exports是module.exports的一个引用,辅助后者添加内容用的。exports指向的是module.exports,也就是说exports的方法module.exports也是一定能完成的

  • exports是moudle.exports的一个引用
  • exports和module.exports的区别在于,每个模块都有一个module对象,module对象中有一个exports对象,可以把需要导出的成员都挂载到module.exports接口对象中,也就是module.exports.xxx=xxx的方式
  • 但是每次都这样书写太麻烦,所以nodejs为了更加方便,同时在每一个模块提供了一个成员叫exports,令 exports===module.exports 结果为true ,所以对于 module.exports的方式完全可以使用exports.xxx=xxx

exports.[function name] = [function name]
moudle.exports= [function name]
在使用上:
moudle.exports.[function name] = [function name]
exports.[function name] = [function name] 这两个是等价的
但是我们通常还是推荐使用exports.[function name]


ES6中的模块导出导入

导出:exportexport default
导入:import a from ..,import {a} from ..

export:

  • import命令接受一对大括号,里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块(profile.js)对外接口的名称相同。
// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;

export {firstName, lastName, year};
  • 如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名。
//导入
import { lastName as surname } from './profile.js';

export default命令,为模块指定默认输出:

  • 使用import命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载。
  • 为了给用户提供方便,让他们不用阅读文档就能加载模块,就要用到export default命令,为模块指定默认输出。
// export-default.js
export default function () {
  console.log('foo');
}
  • 其他模块加载该模块时,import命令可以为该匿名函数指定任意名字。
  • 这时import命令后面,不使用大括号。
  • 本质上,export default就是输出一个叫做default的变量或方法,然后系统允许你为它取任意名字。
  • 因为export default命令其实只是输出一个叫做default的变量,所以它后面不能跟变量声明语句。
// import-default.js
import customName from './export-default';
customName(); // 'foo'

export 和 export default:

  • export与export default均可用于导出常量、函数、文件、模块等
  • 在一个文件或模块中,export、import可以有多个,export default仅有一个
  • 通过export方式导出,在导入时要加{ },export default则不需要
  • export能直接导出变量表达式,export default不行

你可能感兴趣的:(JavaScript基础,Node.js,javascript,node.js,前端)