Node中

导出

向外导出成员,使用module.exports和exports

module.exports = {}

导出多个成员(必须是在对象中)

foo.js

exports.a = 123
exports.b = 'hello'
exports.c = function () {
console.log('ccc')
}
exports.d = {
foo: 'bar'
}

main.js

var fooExports = require('./foo')
console.log(fooExports) //{ a: 123, b: 'hello', c: [Function], d: { foo: 'bar' } }

导出单个成员(拿到的就是:函数、字符串)

foo.js

module.exports = 'hello'

main.js

var fooExports = require('./foo')
console.log(fooExports) //'hello'

以下情况会被覆盖

foo.js

module.exports = 'hello'

//后者会覆盖前者
module.exports = function (x, y) {
return x + y
}

main.js

var fooExports = require('./foo')
console.log(fooExports) //[Function]

也可以这样来导出多个成员

module.exports = {
add: function () {
return x + y
},
str: 'hello'
}

exports与module.exports是相同的

console.log(exports === module.exports)     //true

为什么exports与module.exports两者相同,但是使用 exports = 'foo'  最后得到的还是一个空对象。是因为最后模块的返回值是module.exports而不是exports,所以给exports直接赋值,exports丢失了之前对象的引用关系,指向了另一个字符串,所以最后是拿不到'foo'的

exports与module.exports总结

每个模块中都有一个module对象,module对象中有一个exports对象,我们可以把需要导出的成员都挂载到module.exports接口对象中,也就是module.exports.xxx = xxx的方式,但是每次都这样做很麻烦,所以Node为了方便,同时在每个模块中都提供了一个成员exports,exports === module.exports。所以对于之前的方式可以简写成exports.xxx = xxx。当一个模块需要导出单个成员时,必须使用 module.exports = xxx 的方式,不可使用exports = xxx 。因为每个模块最终向外导出的是module.exports,而exports只是module.exports的一个引用,所以即便为exports = xx 重新赋值,并不能影响module.exports 。但是有一种赋值方式比较特殊,就是exports = module.exports,这个会重新建立引用关系。

导入

Node中导入模块
const 名称 = require('模块标识符')

require具体加载规则链接

在ES6中

规定了如何导入和导出模块
导入:
import 模块名称 from '模块标识符'
import '标识路径'
导出,使用export default和export暴露

export default

export default向外暴露的成员可以使用任意的变量来接收
//test.js
export default {
name: 'zs',
age: 10
} //main.js
import m1 from './test'
//m1 为一个包含 name 和 age 属性的对象
在一个模块中,只能使用export default向外暴露一次
// test.js
export default {
name: 'zs',
age: 10
} export default {
name: 'xiaoming',
age: 10
} //会报错`Only one default export allowed per module`

export

在一个模块中可以同时使用 export default 和 export 暴露成员
使用 export 向外暴露的成员只能使用 {} 接收,这种情况叫做 按需导出
// test.js
export default {
name: 'zs',
age: 10
} export var title = "小星星"
//这样使用不会报错 //main.js
import m1, { title } from './test'
一个模块中可以同时使用多个 export
//test.js
export var title = "小星星"
export var content = '哈哈哈' // main.js
import { title,content } from './test'
如果想在引用时改变名称,可以通过 as
import { title as title123,content } from './test'
注意成套使用

export default和export的使用方法的更多相关文章

  1. ES6:export default 和 export 区别

    export default 和 export 区别: 1.export与export default均可用于导出常量.函数.文件.模块等 2.你可以在其它文件或模块中通过import+(常量 | 函 ...

  2. export default与export的区别

    1.export default 和export都可以用于导出常量,函数,文件,模块等: 2.可以在模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使 ...

  3. export default 和 export的使用方式

    注意:1.export default 向外暴露的成员,可以使用任意的变量来接收 2.在一个模块中 ; export default 只允许向外暴露一次 3.在一个模块中 ; 可以同时使用 expor ...

  4. export default 和 export 的使用方式(六)

    一:ES6 的导入模块方式和暴露对象方式: ES6 中导入模块使用:import 模块名称 from '模块标识符':import '表示路径': 在 ES6 中使用 export default 和 ...

  5. ES6 export default 和 export 的区别

    export default 和 export 区别: 1.export与export default均可用于导出常量.函数.文件.模块等 2.你可以在其它文件或模块中通过import+(常量 | 函 ...

  6. module.exports,exports和export default,export的区别

    前提:CommonJS模块规范和ES6模块规范是完全不同的两个概念. module.exports,exports属于CommonJS模块规范: export default,export属于ES6模 ...

  7. ES6中export default与export的区别

    1.export default 和export都可以用于导出常量,函数,文件,模块等: 2.可以在模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使 ...

  8. export default和export的使用

    export default和export都是用来向外暴露成员 export default 向外暴露的成员可以使用任意的变量来接收,在一个模块中,export default只允许向外暴露一次,可以 ...

  9. export default 和 export 的主要区别

    export default 和 export 的主要区别 在于对应的import的区别:export 对应的 import 需要知道 export抛出的变量名或函数名 import{a,b}expo ...

随机推荐

  1. kvm 中 Guest Is already in use 处理办法

    在安装kvm时,如果安装相同名字的虚拟机,是会有错误提示的,就算是删除了虚拟机的xml文件,也会弹出错误提示.如下: ERROR Guest name 'test' is already in use ...

  2. 死磕java(7)

    http://www.cnblogs.com/liunanjava/p/4296045.html 自己写的例子 package com.sougn.trynew; public abstract cl ...

  3. C语言出现 "initializer element is not constant" 错误的原因

    当在全局变量定义一个指针变量,并动态分配内存后,发现竟然编译不过去,并提示 ""initializer element is not constant"": c ...

  4. ARTS Week 14

    Jan 27, 2020 ~ Feb 2, 2020 Algorithm Problem 160.Intersection of Two Linked Lists(相交链表) 题目链接 题目描述:给定 ...

  5. 【Java并发工具类】ReadWriteLock

    前言 前面介绍过ReentrantLock,它实现的是一种标准的互斥锁:每次最多只有一个线程能持有ReentrantLock.这是一种强硬的加锁规则,在某些场景下会限制并发性导致不必要的抑制性能.互斥 ...

  6. Go语言实现:【剑指offer】字符串的排列

    该题目来源于牛客网<剑指offer>专题. 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,b ...

  7. 深入理解JVM(学习过程)

    这,仅是我学习过程中记录的笔记.确定了一个待研究的主题,对这个主题进行全方面的剖析.笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长.不止是技术. 2020年02月06日22:43:0 ...

  8. Classmethod and Staticmethod - Python 类方法 和 静态方法

    classmethod and staticmethod classmethod 的是一个参数是类对象 cls (本类,或者子类), 而不是实例对象 instance (普通方法). classmet ...

  9. Hexo搭建静态博客踩坑日记(一)

    前言 博客折腾一次就好, 找一个适合自己的博客平台, 专注于内容进行提升. 方式一: 自己买服务器, 域名, 写前端, 后端(前后分离最折腾, 不分离还好一点)... 方式二: 利用Hexo, Hug ...

  10. 【5min+】 设计模式的迷惑?Provider vs Factory

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...