module.exports与exports与require

更新日期: 2019-06-10 阅读: 2.5k 标签: 模块

nodejs的模块

Node.js分为原生模块 第三方模块 自定义模块

原生模块:不需要加载也不需要指定地址也不用npm下载 常见的有:

global;  process;  timer;  console;  module;  buffer
第三方模块:npm下载到node_moules,不需要指定地址
自定义模块:用require引用,需要指定地址


nodejs的遵循的规则

nodejs的模块遵循CommonJs规范;模块是Node.js的重要组成部分,文件与模块一一对应,一个Node.js文件就是一个模块,拥有单独的作用域。普通方式定义的变量,函数,对象都属于该模块内.


CommonJs

在模块运行时,会自动生成一个 module 对象和一个 exports 对象,module 对象下也有一个 exports 对象;为了方便使用,exports指向module.exports,相当于在模块头部加入了exports=module.exports,在对外输出时,可以给exports对象添加s属性(不能直接赋值,因为会改变exports=module.exports)默认情况下,module.exports 与 exports 是空对象 即exports=module.exports={} ;当module.exports与exports被赋值时,该模块就是带返回值的模块。

通过require加载模块,通过exports和module.exports来暴露模块内容

所有代码都运行在模块作用域,不会污染全局作用域,模块可以多次加载,但只会在第一次加载时运行一次,然后运行结果就被缓存,以后再加载,就直接读取缓存结果,模块的加载顺序,按照代码的出现顺序同步加载的


module.exports与exports的区别

(1)exports只是module.exports的一个引用; 
(2)一个模块真正导出的是module.exports,require引用的也是module.exports而非exports 
(3)module.exports可以把类,方法,数组,对象,类公布给外部文件,module.exports可直接导出(直接赋值) 
(4)exports只能以引用的方式把值,方法,数组,对象公布给外部文件,exports不可以直接导出
引用即[[exports指向的地址与module.exports指向的地址一致
exports的值改变时,地址(重新开辟新的空间)就会改变]]
let obj1={a:1};
let obj2=obj1;
console.log(obj1,obj2);//{a:1} {a:1}
obj2.a=2;
console.log(obj1,obj2);//{a:2} {a:2}
obj2={b:2}; //开辟新的空间存储 obj2
console.log(obj1,obj2);//{a:2} {b:2}
obj2就是obj1的引用

所以node模块经常这样写: exports=module.exports=()=>{ } 这是为了让exports引用指向module.exports同一块内存,确保数据的一致性。


延伸export和export default

export与export default可以用于导出常量,函数,文件,模块
在一个文件或模块中,export,import可以有多个,export default只能有一个
通过export方式导出 ,在导出时要加入{},export default则不需要
export能直接导出变量表达式, export default不行
require: node和ES6都支持的引入
export/import:只用ES6支持的导出与引入
module.exports/exports只有node支持的导出


eg1:

01.js
var a=1;  //变量
var b=['arr1','arr2']; //数组
var c={name:'对象',age:12}; //对象
var d=function t1(){   //函数
    console.log("函数");
}
/* 方法1:module.exports导出 
  module.exports.a=a;
  module.exports.b=b; 
  module.exports.c=c;  
  module.exports.d=d;   
*/
/* 方法2:module.exports直接导出 
   module.exports={
    a,b,c,d
} 
*/
/* 方法3:exports导出
  exports.a=a;
  exports.b=b;
  exports.c=c;
  exports.d=d; 
*/

02.js
const s=require("./01.js");
console.log(s.a);
console.log(s.b) 
console.log(s.c.name);
s.d();
console.log(s);

eg2:

03.js
function Demo(){
    this.a="类属性";
    this.b=function(){
        console.log("类方法");
    }
}

module.exports=Demo;

04.js
const Demo=require("./03.js");
var demo=new Demo(); 
console.log(demo.a);
demo.b();

eg3:

 module.exports直接赋值导出
 module.exports={
    'b':function(){
        console.log('哈哈');
    }
} 

exports.b=function(){
    console.log('哈哈');
} 


参考文章 http://javascript.ruanyifeng.com/nodejs/module.html


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/3620

相关推荐

Node.js使用Kafka-node模块实现生产者与消费者

基于Node.js,采用Kafka-node模块实现生产者与消费者,我正在做一个的项目,我在自己的服务器上有一个Kafka生产者,并使用Kafka-Node作为我的应用程序的消费者。

关于export和export default你不知道的事

网上有很多关于export和export default的文章,他们大部门都是只讲了用法,但是没有提到性能,打包等关键的东西。大家应该应该能理解import * from xxx会把文件中export default的内容都打包到文件中,而import {func} from xxx只会把文件中的func导入

ES6模块功能:export和import的加载方式

ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范。commonjs主要应用于服务器,实现同步加载,如nodejs。AMD规范应用于浏览器,如requirejs,为异步加载。

import和export的用法

import和export语句表示什么意思?有什么区别呢?ES6模块功能主要有两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

module、export、require、import的使用

module每个文件就是一个模块。文件内定义的变量、函数等等都是在自己的作用域内,都是自身所私有的,对其它文件不可见。在module中有一个属性exports,即:module.exports。它是该模块对外的输出值,是一个对象。

如何让 node 运行 es6 模块文件,及其原理

最新版的 node 支持最新版 ECMAScript 几乎所有特性,但有一个特性却一直到现在都还没有支持,那就是从 ES2015 开始定义的模块化机制。而现在我们很多项目都是用 es6 的模块化规范来写代码的,包括 node 项目

export和export default的区别

export与export default均可用于导出常量、函数、文件、模块;你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使用;

Node的https模块_创建HTTPS服务器

Node的https模块:HTTPS服务器使用HTTPS协议,需要证书授权,SSL安全加密后传输,使用443端口

ES模块基础用法及常见使用问题

ES6中引入了模块(Modules)的概念,相信大家都已经挺熟悉的了,在日常的工作中应该也都有使用。本文会简单介绍一下ES模块的优点、基本用法以及常见问题。

node路径之path模块

node当在没在当前js文件下执行该js文件时,该js文件引用的路径会是相对于node命令的路径。显然会造成引用路径不对。因此;无论终端目录是在哪个磁盘下,node执行js文件时,里面的引用的路径都能只指向正确的

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!