【问题标题】:Browserify Requiring Modules within ModulesBrowserify 需要模块中的模块
【发布时间】:2014-05-16 01:39:02
【问题描述】:

我正在尝试使用Browserifysocket.io Web 客户端中启用node.js 之类的模块。我在所需模块中需要模块时遇到问题。

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

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

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

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

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

我尝试将路径更改为相对于 browserified 包和相对于 client.js,两者都会导致上述错误,只是路径不同。

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

browserify生成的源图中,admin.js不在任何地方,所以一定是因为某种原因找不到。

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

提前感谢您的帮助!

编辑 - 在下方添加源代码以帮助澄清

ma​​in.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;

【问题讨论】:

    标签: javascript node.js browserify


    【解决方案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'),我想你会很高兴的。

    【讨论】:

    • 重点是相对路径是相对于它们所包含的文件的。你的句子让我听起来像你认为包含“main.js”的目录成为某种基本路径,然后是其他文件可能需要与此相关的东西。与往常一样,对于此类问题,代码比英语更清晰。除了文件内容,显示目录和文件的布局也可以帮助人们解决你的问题。
    • 我想我用这种方法有点太聪明了。我认为有一些错误的沟通,所以我转储了消息来源以提供帮助。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2014-05-30
    相关资源
    最近更新 更多