Browserify需要模块内的模块

时间:2014-05-15 14:43:35

标签: javascript node.js browserify

我正在尝试使用Browserifynode.js网络客户端中启用类似模块的socket.io。我在需要模块中需要模块时遇到问题。

main.js需要client.js,这需要admin.js

client.js要求路径相对于文件系统中的main.js位置。

admin.js要求路径相对于文件系统中的client.js位置。

browserify main.js -o client.packaged.js生成嵌入了client.js的文件。在admin.js中触发事件时,client.js是必需的。当此事件触发时,我收到以下错误:

Uncaught Error: Cannot find module '../../../modules/admin/admin.js'

我尝试将路径更改为相对于浏览器化的捆绑包并且相对于client.js,两者都导致上面的错误,只是不同的路径。

我已经使用--alow-file-access-from-files打开了Chrome,所以我知道这不应该成为问题的一部分。

browserify生成的源地图中,admin.js不在任何地方,因此无法出于某种原因找到它。

在使用browserify

时,如何正确使用模块中的相对路径来要求其他模块?

提前感谢您的帮助!

编辑 - 添加以下内容以帮助澄清

main.js

//Include the client
var client = require('../../base/client/client.js').client;

//Start when document is ready
$(function() {
    console.log(client);
    client.start();
});

client.js

var client = new Object();
client.start = function() {
    //Server specific information
    var IP = 'localhost';
    var PORT = '1337';

    //Flags
    //SSL - true for secured connections
    //DEBUG - true to enable console.log() messages
    var SSL = false;
    var DEBUG = true;

    //Locations of modules to include
    var MODULE_LOCATIONS = [
        '../../modules/admin/admin.js'
    ];

    //Builds an array of modules to start
    var MODULES = [];
    for (var i = 0; i < MODULE_LOCATIONS.length; i++) {
        MODULES.push(require(MODULE_LOCATIONS[i]));
    }

    var socket = io.connect(getConnectionString());    
    socket.on('connection', function(socket) {
        client.onConnection(socket);

        //Load modules
        for (var i = 0; i < MODULES.length; i++) {
            MODULES[i].start(socket, io);
        }
    });

    //Returns a connection string to the socket.io server
    function getConnectionString() {
        if (SSL) {
            return 'https://' + IP + ':' + PORT;
        } else {
            return 'http://' + IP + ':' + PORT;
        }
    }
};
module.exports.client = client;

admin.js

//Events
var SYSTEM_STATS = 'system_stats';
var start = function(socket, io) {
    socket.on(SYSTEM_STATS, function(data) {
        admin.onSystemStats(socket, data);
    });
}
module.exports.start = start;

1 个答案:

答案 0 :(得分:1)

//Locations of modules to include
var MODULE_LOCATIONS = [
    '../../modules/admin/admin.js'
];

//Builds an array of modules to start
var MODULES = [];
for (var i = 0; i < MODULE_LOCATIONS.length; i++) {
    MODULES.push(require(MODULE_LOCATIONS[i]));
}

所以是的,browserify进行静态分析。这意味着它在语句级别读取和“理解”您的代码,但它实际上并不执行它。这种类型的构造会破坏静态分析的功能,因此browserify不会检测到client.js模块依赖于admin.js。删除这个额外的元编程逻辑并输入一个简单的香草require('../../modules/admin/admin.js'),我认为你会很高兴。