我最近开始编写CommonJS模块,但面临需要模块的问题。为什么storage.js无法访问我需要的示例模块?在这种情况下,需要依赖模块的正确方法是什么?
编辑:包含更多信息,因为上一个问题省略了hello.js,我认为这不是问题的原因。似乎包括它会导致未被捕获的类型错误。此外,这是chrome扩展的代码的一部分,main.js是内容脚本。
// main.js
var hello = require('./hello');
var storage = require('./storage');
var example = require('./example');
storage.store();
// storage.js
var example = require('./example');
module.exports = (function() {
function store() {example.ex();}
return {store: store};
})();
// example.js
var storage = require('./storage');
module.exports = (function() {
function ex() {
console.log('example');
}
return {ex: ex};
})();
// hello.js
var example = require('./example'); // <<<< Including this gives Uncaught TypeError: example.ex is not a function
module.exports = (function() {
function hello() {
console.log('hello');
}
return {hello:hello};
})();
答案 0 :(得分:2)
不是您问题的直接答案,但Browserify将为您提供自我调用功能。您可以简化lib文件:
// main.js
var storage = require('./storage');
storage.store();
因为您不使用hello
或example
,所以不要求它们。
// storage.js
var example = require('./example');
function store() {example.ex();}
module.exports.store = store;
这里不需要通过自我调用功能。
// example.js
module.exports.ex = ex;
function ex() {
console.log('Example');
}
这不会使用storage
,所以不要包含它。
hello.js
除了触发循环依赖之外什么都不做,删除它。
在更新后的代码中,storage.js
和example.js
之间存在循环依赖关系。由于您不能使用storage
中example
的任何内容,因此您可以删除该要求。我仍然认为你应该删除自我调用函数,因为它已经是commonjs的一部分。
加载模块时,Commonjs只会执行一次文件。然后缓存module.exports
上的所有内容以供将来调用。当您第一次包含循环依赖项时,模块加载程序会看到它当前正在加载,并且您不会得到任何结果。后续调用将照常完成。