我正在尝试使用Browserify
在node.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;
答案 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')
,我认为你会很高兴。