不同的编程语言都有各自的代码组织和复用的方式,如.net、php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染。一直都没搞清楚node中的exports和module.exports的区别,借此搞清楚node的代码模块复用方式。

首先怎么创建node中的modules。

可以直接创建一个文件作为module,如下module.js

function writeLine(){
console.log("module.js");
}
exports.dbleNum=function(num){
return num*2;
}
exports.tripleNum=function(num){
return num*3;
}

其中,我们exports两个函数,在example.js文件中(如下),我们可以利用require就能取得这两个函数

var module = require('./module');
console.log(module.dbleNum(3));
console.log(module.tripleNum(3));

这样就可以用module.js中的函数了。其中./表示这模块和当前的调用模块在同一目录下,若是放在子目录lib下面,就是require('./lib/module'),不需要后缀.js的。

当然这是简单的单个文件的模块,如果是比较复杂的可以以包的形式,也即n像pm安装的包那样子。如上module.js文件,我们将其放在example_module文件夹下,里面新建一个package.json文件(这是是包的主要信息),有名称,描述,依赖,main,作者,版本等等,我们简略一下就不写那么多,主要写了如下

{
"name": "module",
"description": "example",
"version": "0.0.1",
"dependencies": {
},
"main": "module",
}

一般模块中的主文件是index.js,也就是"main":"index.js"。这里模块我们写的是module.js,我也就懒的改了,所以写成了module。

var module = require('./example_module');
console.log(module.dbleNum(3));
console.log(module.tripleNum(3));

这样就可以调用example_module这个包了。由于不是通过npm安装,不能直接require('example_module');自己尝试了下,如果新建个node_modules文件夹,把example_module放里面,就可以直接require('example_module'),应该是因为npm安装的包也是会安装到node_modules中的。

说到现在还没说exports和module.exports的区别,囧。

如果创建了一个module,想返回其中的一个变量或者函数,将其直接赋给exports是不可以的,如下

var calcNum = function(){};
calcNum.prototype.dbleNum=function(num){
return num*2;
}
calcNum.prototype.tripleNum=function(num){
return num*3;
}
exports = calcNum;

这样是不可以的。但是如果可以将exports换成module.exports就是可行的。此时倒出的calcNum,如果在example.js中调用就要像下面这样子。

var module = require('module');
var test = new module;
console.log(module.dbleNum(3));
console.log(module.tripleNum(3));

这是因为exports是module.exports的全局引用,exports.myfunc是module.exports.myfunc的缩略写法。于是,如果将任何函数、对象、变量赋给exports就断开了exports与module.exports的引用关系,而事实上module.exports是真正的出口,所以直接将变量或者函数赋给exports是不可以的(exports.myfunc=myfun是可以的,因为没有切断exports和module.exports的引用关系)。因此,在同一个module中,如果exports和module.exports同时存在,exports是会被忽略的。

如有错误,欢迎指正。

node.js中的exports和module.exports的更多相关文章

  1. Node.js中的模块接口module.exports浅析

    在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.这里作者对此做了个简单 ...

  2. Node.js中的模块接口module.exports

    在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.在此做了个简单的总结. ...

  3. Node.js中exports与module.exports的区别

    原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html 你肯定对Node.js模块中用来创建函数的exports对象很 ...

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

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

  5. node.js模块中exports和module.exports的区别

    Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定 ...

  6. Node.js中的exports与module.exports的区分

    1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 3. exports.a = xxx 会将修改更新到mod ...

  7. Node.js 中 exports 和 module.exports 的区别

    每一个模块中都有一个 module 对象, module 对象中有一个 exports 对象 我们可以把需要导出的成员都放到 module.exports 这个接口对象中,也就是 module.exp ...

  8. Node.js exports与module.exports的关系

    今天搜索module.exports时看到CNode社区上发的Hack Sparrow一篇相关文章的链接 Node.js Module – exports vs module.exports 一篇5年 ...

  9. (译)Node.js的模块-exports和module.exports

    原文标题:Node.js Module – exports vs module.exports 原文链接:http://www.hacksparrow.com/node-js-exports-vs-m ...

随机推荐

  1. Asp.net自定义控件开发任我行(5)-嵌入资源上

    摘要 上一篇我们讲了VitwState保存控件状态,此章我们来讲讲嵌入css文件,js文件,嵌入Image文件我也一笔带过. 内容 随着我的控件的完善,我们目标控件DropDwonCheckList最 ...

  2. Python+Selenium练习篇之1-摘取网页上全部邮箱

    前面已经介绍了Python+Selenium基础篇,通过前面几篇文章的介绍和练习,Selenium+Python的webUI自动化测试算是入门了.接下来,我计划写第二个系列:练习篇,通过一些练习,了解 ...

  3. camelot工具进行pdf表格解析重建

    camelot内置生成html文件的方法,但表格数据转化成pandas.dataframe的过程中,丢失了跨行跨列的结构信息,故生成html的表格无跨行跨列结构. 于是我在输出部分选择直接手写html ...

  4. 菜鸟之路——机器学习之非线性回归个人理解及python实现

    关键词: 梯度下降:就是让数据顺着梯度最大的方向,也就是函数导数最大的放下下降,使其快速的接近结果. Cost函数等公式太长,不在这打了.网上多得是. 这个非线性回归说白了就是缩小版的神经网络. py ...

  5. Java中转发与重定向的区别

        转发与重定向的区别 转发是服务器行为,重定向是客户端行为 1.转发在服务器端完成的:重定向是在客户端完成的2.转发的速度快:重定向速度慢3.转发的是同一次请求:重定向是两次不同请求4.转发不会 ...

  6. Ethernet,token ring,FDDI,ATM,WLAN

    局域网(Local Area Network:LAN) 通常我们常见的"LAN"就是指局域网,这是我们最常见.应用最广的一种网络.现在局域网随着整个计算机网络技术的发展和提高得到充 ...

  7. CSA Round #84 The Sprawl

    题目 Analysis 曼哈顿距离($L1$ metric)最小生成树. Implementation 下面的代码参考了 gispzjz 在比赛中的提交. #include <bits/stdc ...

  8. 使用caffe测试自己的图片

    第一种方法是测试批量图片,使用caffe.bin即可,首先要做的是把你的jpg图片转换为LMDB的格式,如何转换呢?用/build/tools/convert_image --resize_width ...

  9. 挑战程序设计竞赛》P345 观看计划

                                                 <挑战程序设计竞赛>P345 观看计划 题意:一周一共有M个单位的时间.一共有N部动画在每周si时 ...

  10. PHP一维数组和二维数字排序整理

    <?php /** 一维数组排序 sort() - 以升序对数组排序 rsort() - 以降序对数组排序 asort() - 根据值,以升序对关联数组进行排序 ksort() - 根据键,以升 ...