module.exports、exports 、export default之间的差别区别及与require、import的使用

module.exports

Node应用由模块组成,采用CommonJS模块规范。根据这个规范,每一个文件就是一个模块,有本身的做用域。在这些文件里面定义的变量、函数、类,都是私有的,对外不可见,所以规避掉了做用域污染。javascript

根据CommonJS规定,每一个模块内部,module变量表明当前模块,这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实就是加载该模块的exports属性。java

举例:经过module.exports输出变量 age 和 sayHelloTo 函数。node

./MyModule.js
    var age = 7; 
    var sayHelloTo= function (name) { 
        return "hello " + name;
    }; 
    module.exports.age = age; 
    module.exports.sayHelloTo=sayHelloTo;
复制代码

require:用于加载模块

var temp = require('./MyModule.js');  //这里也可使用 import myModule from './MyModule.js'
console.log(temp.age); // 7 
console.log(temp.sayHelloTo("Steve")); // hello Steve
复制代码

额外说明:对于自定义的模块,须要使用相对路径,不然会提示找不到模块/组件(默认状况下,非相对路径的引用,会从node_modules文件夹中查找)express

exports 与 module.exports

为了方便,node为每一个模块提供了一个exports变量,指向module.exports。这等同于在每一个模块头部,有这么一行代码:promise

var exports = module.exports;
复制代码

所以,咱们能够直接在exports对象上添加方法(等同于在 module.exports 添加同样)函数

./MyModule.js
    var age = 7; 
    var sayHelloTo= function (name) { 
        return "hello " + name;
    }; 
    exports.age = age;  //等效于: module.exports.age = age;
    exports.sayHelloTo=sayHelloTo;  //等效于: module.exports.sayHelloTo=sayHelloTo;
复制代码

P.S.不能直接将exports指向一个值,这会切断 exports 与 module.exports 的联系(可是能够用module.exports来指向一个值)ui

./MyModule.js
    var age = 7; 
    var sayHelloTo= function (name) { 
        return "hello " + name;
    }; 
    exports = age;  //不要这么干。这么作会切断exports与module.exports的联系
复制代码

不一样于CommonJS,ES6使用 export 和 import 来导入、导出模块

用 export 导出的模块,须要用 import 来进行导入,而不能用 require。 P.S.:export 命令规定的是对外的接口,必须与模块内部的变量创建一一对应的关系spa

const utils = {
    showSth : function(){
        console.log("showSth");
    },
    saySth : function(){
        console.log("saySth");
    }
}
//导出的3种方式
export var m = utils; // 方式1,这种方式在引用的时候须要这样: import {m} from './utils.js';
export {utils}; // 方式2,用大括号来导出变量,若是导出的变量有多个,则{变量1,变量2,变量3...,变量N}。这种方式在引用的时候须要这样: import {utils} from './utils.js';
export {utils as myUtils}; // 方式3,这种方式在引用的时候须要这样: import {myUtils} from './utils.js';
在引用的地方,也能够直接指定别名,如:import {myUtils as utils} from './utils.js';
复制代码

MDN对于export和import的语法说明:

export语法:
    export { name1, name2, …, nameN };
    export { variable1 as name1, variable2 as name2, …, nameN };
    export let name1, name2, …, nameN; // also var, const
    export let name1 = …, name2 = …, …, nameN; // also var, const
    export function FunctionName(){...}
    export class ClassName {...}

    export default expression;
    export default function () { … } // also class, function*
    export default function name1() { … } // also class, function*
    export { name1 as default, … };

    export * from …;
    export { name1, name2, …, nameN } from …;
    export { import1 as name1, import2 as name2, …, nameN } from …;
    export { default } from …;
复制代码
import语法:
    import defaultExport from "module-name";
    import * as name from "module-name";
    import { export } from "module-name";
    import { export as alias } from "module-name";
    import { export1 , export2 } from "module-name";
    import { export1 , export2 as alias2 , [...] } from "module-name";
    import defaultExport, { export [ , [...] ] } from "module-name";
    import defaultExport, * as name from "module-name";
    import "module-name";
    var promise = import(module-name);
复制代码

export 和 export default

  1. export 和export default 都可用于导出(常量 | 函数 | 文件 | 模块)等。
  2. 能够在其余文件中经过 import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便可以进行使用。
  3. 在一个文件或者模块中,export、import 能够有多个,但 export default 仅有一个。
    const utils = {
        showSth : function(){
            console.log("showSth");
        },
        saySth : function(){
            console.log("saySth");
        }
    }
    const name = "my name is Artech";
    export {name}; //命名导出
    export {utils};
    
    对于命名方式导出的,在导入的时候必须使用相应对象的相同名称
    引用的时候:import {utils,name as myName} from './utils.js';
    复制代码
  4. 经过 export 方式导出,在导入时要用花括号{ };而经过 export default 方式导出的,则不须要:
    如经过 export default 导出
       export default utils;  
    则在使用的时候不用加花括号,且导入时的名字能够自定义,如:
       import myUtils from './utils.js';  对于默认方式导出的,则导入的时候,名称能够随便取
    
    默认导出:不能使用 letvarconst 做为默认导出
    复制代码

import *

将一个js文件中定义的方法,模块,对象等,所有导出,通常结合别名使用,如:code

myModule.js
   export const fun1 = ()=>{}
   export const objInfo = {...};
复制代码
demo.js:引用mymODULE。JS
    import * as myAlias from './myModule';
    //fun1()和objInfo都是定义在myModule中的方法和对象
    myAlias.fun1();
    myAlias.objInfo;
复制代码
相关文章
相关标签/搜索