我是Java的背景,初入node,对对象复用不是很清楚。
比如,我现在的controller到了两不同的js文件中,文件中都需要用redis的client,我应该怎么处理? **Solution A: **
file1.js:
var redis = require(‘redis’).createClient();
file2.js
var redis = require('redis').createClient();
Solution B: redis.js
var redis = require('redis').createClient();
module.exports = redis;
file1.js
var redis = require('./redis');
file2.js
var redis = require(‘./redis’);
================ 另外我也用到了socket.io,获取io对象采用 var app = require(‘express’)() , server = require(‘http’).createServer(app) , io = require(‘socket.io’).listen(server); 情况也一样,如果我要在两个文件中使用socket.io,难道我要用上面的代码两次么?如果是用两次,那么相当于要创建两个server对象?
请教一个最佳的实战方法。
如果你说的对象复用是指在不同模块之间访问同一个对象,那我可以理解为,你需要解决的是模块间的互访。
懒人的方式:使用全局对象 global
file1.js var redis_client = global.redis_client = require(‘redis’).createClient();
纠结但据说更优雅的方式:使用 exports 导出每个模块需要对外的接口
file1.js exports.redis_client = require(‘redis’).createClient();
file2.js var redis_client = require(‘./file1.js’).redis_client;
var app = require(‘express’)() , server = require(‘http’).createServer(app) , io = require(‘socket.io’).listen(server);
比如这段代码,如果我在两个文件中都有这段代码,意思是我得到的io是同一个实例?
@yuyue007 不是。多次的require(‘socket.io’)是同一个对象,但是你执行了函数运行,得到的就不是同一个了。require的模块是会被缓存的,多次require同一个模块,这个模块只产生一个实例。如果你需要复用的是模块里的某个变量,那就把这个变量导出,用exports或global导出都行