摘要:指向的内存有了变化,而指向的内存并无变化,仍为空对象。返回的是而不是。关于和的关系可以总结为初始值为一个空对象,也指向这个空对象返回的是而不是和模块功能主要由和构成。导出模块的对外接口,命令导入其他模块暴露的接口。
基本问题
module.exports和exports是属于CommonJS模块规范,导出模块!
export和export default是属于ES6语法,导出模块!
同样import和require分别属于ES6和CommonJS,导入模块!
module.exports和exports每一个Node.js执行文件,都自动创建2个对象 exports 和 module, module 又有一个属性 exports, 这个exports 属性指向一个空对象 {}; 同时 exports这个对象也指向了这个空对象{}。
exports => {} <=module.exports
exports和module.exports指向同一块内存,但require()返回的是module.exports而不是exports。
var str = "difference" exports.a = str; exports.b = function () { //////// }
给 exports 打点添加属性其实也是给 module.exports 这个空对象打点添加了两个属性而已,上面的代码相当于:
var str = "difference" module.exports.a = str; module.exports.b = function () { //////// }
来看下exports和module.exports的使用
使用exports
//app.js var s = require("./log"); s.log("hello"); //log.js exports.log =function (str) { console.log(str); }
使用module.exports
//app.js var s = require("./log"); s.log("hello"); //log.js module.exports =function (str) { console.log(str); }
上述两种用法都没问题,但如果这样使用
exports = function (str) { console.log(str); }
运行程序就会报错。
前面的例子中给 exports 打点添加属性,只是对 exports 指向的内存做了修改。而上例则是对exports指向的内存进行了覆盖,使exports指向了一块新的内存,这样,exports和module.exports指向的内存并不是同一块,exports和module.exports并无任何关系。exports指向的内存有了变化,而module.exports指向的内存并无变化,仍为空对象{}。
require得到的会是一个空对象,则会有
TypeError: s.log is not a function
再看下面的例子
//app.js var x = require("./init"); console.log(x.a) //init.js module.exports = {a: 2} exports.a = 1
运行app.js会有输出
2
module.exports通过赋值方式已经和exports对象指向的对象不同了,exports对象怎么改和module.exports对象没关系了。require()返回的是module.exports而不是exports。
关于exports和module.exports的关系可以总结为
module.exports 初始值为一个空对象 {},exports也指向这个空对象
require() 返回的是 module.exports 而不是 exports
export和export default模块功能主要由:export和import构成。export导出模块的对外接口,import命令导入其他模块暴露的接口。
export其实和export default就是写法上面有点差别,一个是导出一个个多带带接口,一个是默认导出一个整体接口。使用import命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载。这里就有一个简单写法不用去知道有哪些具体的暴露接口名,就用export default命令,为模块指定默认输出。
使用export
// testA.js var f = "Miel"; var name = "Jack"; var data= 1988; export {f, name, data};
使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。
// main.js import {f, name, data} from "./testA";
使用export default
// export-default.js export default function () { console.log("foo"); } // 或者写成 function foo() { console.log("foo"); } export default foo; // import-default.js import customName from "./export-default"; customName(); // "foo"
下面比较一下export default和export 输出。
// 第一组 export default function car() { // 输出 // ... } import car from "car"; // 输入 // 第二组 export function car2() { // 输出 // ... }; import {car2} from "car2"; // 输入
可以看到第一组是使用export default,import语句不需要使用大括号;第二组使用export,对应的import语句需要使用大括号,一个模块只能有一个默认输出,所以export default只能使用一次。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/87396.html
摘要:优化代码拆分从入口文件开始,递归地构建了整个应用的模块依赖图表,然后通常会将所有的模块打包成一个。 如果你还不知道什么是React,请点击这里github源码 安装Node.js 如果你还不知道什么是ECMAScript,请点击这里 如果你还不知道什么是Node.js,请点击这里 下载Node.js并安装;接着打开windows命令行窗口分别输入node -v及npm -v如下图所示,...
摘要:前言难得有空,今天开始重新规范的学习一下编程。简而言之,区分他们之间的区别就是只是的引用,辅助后者添加内容用的。导出了方法导出了集合成对象导出因为导出是把零散的聚集在一起作为一个对象,而是导出为属性。 前言 难得有空,今天开始重新规范的学习一下node编程。但是引入模块我看到用 require的方式,再联想到咱们的ES6各种export 、export default。 阿西吧,头都大...
摘要:每个模块内部,变量代表当前模块。这个变量是一个对象,它的属性即是对外的接口。加载某个模块,其实是加载该模块的属性。为了方便,为每个模块提供一个变量,指向。这等同在每个模块头部,有一行这样的命令。 我们前端在开发过程中经常会遇到导入导出功能,在导入时,有时候是require,有时候是import在导出时,有时候是exports,module.exports,有时候是export,expo...
摘要:模块的文件名,带有绝对路径。返回一个布尔值,表示模块是否已经完成加载。返回一个对象,表示调用该模块的模块。表示模块对外输出的值。 我们在编写js过程中,经常会碰到 requrie和import的写法,也会看到export default,exports的写法,他们能不能混用呢,我们来探究一下 当前环境: node版本 v9.6.1 操作系统 Mac module 我们打印出modul...
阅读 3015·2021-09-03 10:33
阅读 1174·2019-08-30 15:53
阅读 2598·2019-08-30 15:45
阅读 3360·2019-08-30 14:11
阅读 512·2019-08-30 13:55
阅读 2566·2019-08-29 15:24
阅读 1877·2019-08-26 18:26
阅读 3539·2019-08-26 13:41