浏览模块中的需求模块

我正在尝试使用Browserifysocket.io Web客户机中启用node.js如模块。 我有问题需要模块内的模块。

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

client.js要求path是相对于文件系统中main.js位置。

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

browserify main.js -o client.packaged.js生成一个embedded了client.js的文件。 在client.js触发事件时, admin.js是必需的。 当这个事件触发时,我得到以下错误:

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

我试着改变path相对于browserified束相对于client.js ,都导致上述错误,只是不同的path。

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

admin.js生成的源地图中, admin.js不在任何地方,所以一定不能find它。

如何正确使用模块内的相对path来使用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; 

 //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做静态分析。 这意味着它会在语句级别读取和“理解”您的代码,但实际上并没有执行它。 这种types的构造违背了静态分析的能力,因此admin.js没有检测到client.js模块依赖于admin.js 。 删除这个额外的元编程逻辑,并把普通的香草require('../../modules/admin/admin.js') ,我想你会很好去。