browserify循环依赖:某些东西不是函数

时间:2015-07-04 10:43:46

标签: javascript google-chrome-extension browserify commonjs

我最近开始编写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};
})();

1 个答案:

答案 0 :(得分:2)

不是您问题的直接答案,但Browserify将为您提供自我调用功能。您可以简化lib文件:

// main.js
var storage = require('./storage');
storage.store();

因为您不使用helloexample,所以不要求它们。

// 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.jsexample.js之间存在循环依赖关系。由于您不能使用storageexample的任何内容,因此您可以删除该要求。我仍然认为你应该删除自我调用函数,因为它已经是commonjs的一部分。

加载模块时,Commonjs只会执行一次文件。然后缓存module.exports上的所有内容以供将来调用。当您第一次包含循环依赖项时,模块加载程序会看到它当前正在加载,并且您不会得到任何结果。后续调用将照常完成。