浏览模块中的需求模块
我正在尝试使用Browserify
在socket.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')
,我想你会很好去。