【发布时间】:2015-01-20 10:07:15
【问题描述】:
我想知道以下是否以及如何实现:
CommonJS 环境,用于节点和/或浏览器的模块(带有Browserify)。
两个(或更多)模块,每个返回一个单例需要在应用程序的不同部分/模块中可用。它们也应该能够相互调用,因此存在循环依赖的情况。我知道通过某种依赖注入是可能的,但我想避免代码结构,当我在其中一个单例中调用方法时,我需要调用类似 this.dependencies.ModuleName 的代码结构那些。我希望能够直接在 require 语句返回的对象上调用方法。
我意识到这不可能通过两个 CommonJS 模块直接导出实例化的单例对象(因为循环依赖)。所以我希望可以使用一个通用的代码来包装它。比如:
var Magic = require('./magic');
module.exports = Magic.createSingelton({
// ...
});
由于循环依赖而失败的浏览示例:
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var a = require('./class-a'),
b = require('./class-b');
a.printSomething();
b.printSomething();
},{"./class-a":2,"./class-b":3}],2:[function(require,module,exports){
var b = require('./class-b');
var A = function() {};
A.prototype = {
printSomething: function() {
document.querySelector('body').innerHTML = document.querySelector('body').innerHTML + 'A got from B: ' + b.getSomething() + '<br />';
},
getSomething: function() {
return 'FROM A';
}
};
module.exports = new A();
},{"./class-b":3}],3:[function(require,module,exports){
var a = require('./class-a');
var B = function() {};
B.prototype = {
printSomething: function() {
document.querySelector('body').innerHTML = document.querySelector('body').innerHTML + 'B got from A: ' + a.getSomething() + '<br />';
},
getSomething: function() {
return 'FROM B';
}
};
module.exports = new B();
},{"./class-a":2}]},{},[1]);
我知道RefluxJS 数据存储正在以这种方式工作。可以从商店外部调用操作,也可以从一个商店调用到另一个商店。但是,您必须同时创建一个操作模块和一个存储模块。是否需要某种类似的结构,或者是否可以像上面描述的那样每个单个模块使用一个模块?示例代码表示赞赏。
【问题讨论】:
标签: javascript node.js browserify circular-dependency commonjs