不同的编程语言都有各自的代码组织和复用的方式,如.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是会被忽略的。

如有错误,欢迎指正。

最新文章

  1. 作业三: 代码规范、代码复审、PSP
  2. python中的generator(coroutine)浅析和应用
  3. 十一天 python操作rabbitmq、redis
  4. config 写入
  5. Ceph的客户端丢失文件夹的解决办法
  6. Hackers' Crackdown( UVA UVA 11825状压dp)
  7. FE: Responsive Web Design Overview
  8. Russia
  9. 转: js中的getYear()函数的问题(推荐用 getFullYear())
  10. OSX MacVim + vim-lldb配置和使用心得
  11. WebBrowser加载一个URL被多次调用DocumentCompleted 的问题解决方案<转>
  12. HttpPost方式调用接口的3种方式
  13. canvas的api小结
  14. svn执行update操作后出现:Error : Previous operation has not finished; run 'cleanup' if it was interrupted.
  15. TCP程序设计基础
  16. CONFIG_DEBUG_USER【转】
  17. 003-JSR303校验
  18. AVAudioSession应用指南
  19. Java NIO 之 Buffer(缓冲区)
  20. C语言终极面试及答案分析

热门文章

  1. python re模块详解
  2. jsp中/el表达式中将后台传来的时间戳格式化为年月日时分秒
  3. python 文件(file)操作
  4. 文本处理grep命令
  5. java之ArrayList.add
  6. selenium webdriver——多表单切换与多窗口切换
  7. The following signatures couldn't be verified because the public key is not available 解决方法
  8. jquery 实践操作:iframe 相关操作
  9. Memcache缓存用好了,性能有了很大的提高
  10. Bits