module.exports

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

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

举例:通过 module.exports 输出变量 age 和 sayHelloTo 函数。
./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 文件夹中查找)

exports 与 module.exports

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

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 来指向一个值)

./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 命令规定的是对外的接口,必须与模块内部的变量建立一一对应的关系

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';
    
    • 对于默认方式导出的,则导入的时候,名称可以随便取。
    • 默认导出:不能使用 let,var 或 const 作为默认导出。

import *

将一个 js 文件中定义的方法,模块,对象等,全部导出,一般结合别名使用,如:
myModule.js

export const fun1 = ()=>{}
export const objInfo = {...};

demo.js:引用 myModule.js

import * as myAlias from './myModule';

// fun1() 和 objInfo 都是定义在 myModule 中的方法和对象
myAlias.fun1();
myAlias.objInfo;

export,export default,module.exports,import,require之间的区别和关联的更多相关文章

  1. Node.js中exports,module.exports以及require方法

    在Node.js中,使用module.exports.f = ...与使用exports.f = ...是一样的,此时exports就是module.exports的一种简写方式.但是,需要注意的是, ...

  2. Ruby中 Include, Extend, Import, Require 的使用区别

    Include 如下例当你Include一个模块到某个类时, 相当于把模块中定义的方法插入到类中.它允许使用 mixin.它用来 DRY 你的代码, 避免重复.例如, 当你有多个类时, 需要相同的函数 ...

  3. PHP中 Include 与 Require之间的区别

    *引入机制 如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找.如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工 ...

  4. 关于common.js里面的module.exports与es6的export default的思考总结

    背景 公司项目需要裁切功能,基于第三方图片裁切组件vue-cropper(0.4.0版本),封装了图片裁切组件(picture-cut)(放在公司内部组件库,仅限于公司内部使用) 在vue-cropp ...

  5. node.js module.exports & exports & module.export all in one

    node.js module.exports & exports & module.export all in one cjs const log = console.log; log ...

  6. 【node】------module.exports&&exports之间的区别------【巷子】

    1.再讲module.exports 与exports之间的区别的时候我们先来回顾一下js里面的引用传递 001.引用传递 var arr = [10,20,30]; var newarr = arr ...

  7. require exports module.exports

    require 用于引入模块(js文件). JSON.或本地文件 自己写的模块必须是相对路径,省略了node就认为该自定义模块(js文件)是核心模块(内置模块或者第三方模块) node  有模块作用域 ...

  8. node——module.exports

    module.exports 1. 在a.js中 var b=require('./b.js'); console.log(b); 在b.js中 function add(x,y){ return x ...

  9. Module.exports和exports的区别

    原文链接: https://www.ycjcl.cc/2017/02/10/module-exportshe-exportsde-qu-bie/ 学习Seajs时,看到了exports.doSomet ...

随机推荐

  1. 【微信小程序】记录

    学习新东西时,大体都遵循一样的道理,由总入深. 以下整理一下学习小程序的过程.虽然现在做的东西还有许多问题,比如说数据超过一定数量时循环效率低,或者是多次跳转页面后会变卡等问题.这些问题只解决了部分, ...

  2. Centos7下安装Mysql8.0

    突然发现mysql都有8.0了,且性能提升比较明显,就自己装来玩玩. centos的yum源中默认是没有mysql的,所以我们需要先去官网下载mysql的repo源并安装: 官网:http://dev ...

  3. 算法详解之最近公共祖先(LCA)

    若图片出锅请转至here 概念 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节 ...

  4. Js笛卡尔乘积

    self.getDescartesSku = function (selSaleProp, i, nowLst, allALst) {         if (selSaleProp.length = ...

  5. 深入理解Java虚拟机笔记——虚拟机类加载机制

    目录 概述 动态加载和动态连接 类加载的时机 类的生命周期 被动引用 例子一(调用子类继承父类的字段) 例子二(数组) 例子三(静态常量) 类加载的过程 加载 验证 准备 解析 符号引用 直接引用 初 ...

  6. 什么是JDK什么是JRE?JDK和JRE的关系

    什么是JDK什么是JRE?JDK和JRE的关系 我们看看来自百度百科的解释: JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心 ...

  7. 腾讯云tomcat问题

    Ubuntu启动特别慢 1.在$JAVA_HOME/jre/lib/security/java.security中,把securerandom.source=file:/dev/urandom替换成s ...

  8. mac环境下java项目无创建文件的权限

    1.问题: 先抛问题,由于刚刚换用mac环境,之前windows上开发的代码调试完毕,还未上线.之后上线部署之前,tl直连测试本地环境(mac)环境,功能无法使用,显示java.io.IOExcept ...

  9. 启动Chrome时自动开启开发者模式

    右键点击Google Chrome浏览器图标→属性,在目标里面加上参数--auto-open-devtools-for-tabs即可

  10. Spring Boot 中 Redis 的使用

    Spring Boot 对常用的数据库支持外,对 Nosql 数据库也进行了封装自动化,如Redis.MongoDB等,本文主要介绍Redis的使用. Redis 介绍 Redis 是目前业界使用最广 ...