2014-05-15 169 views
2

我試圖與Browserify,以啓用node.js類似socket.io Web客戶端模塊。我遇到需要模塊內部需要模塊的問題。Browserify模塊內需要的模塊

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,都導致上述錯誤,只是不同的路徑。

我把Chrome打開爲--alow-file-access-from-files,所以我知道這不應該成爲問題的一部分。

在由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
//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'),我認爲你會很好去。

+1

點是相對路徑是相對於它們都包含在文件中。你的句子使得它聽起來像你對我認爲含有「main.js」的目錄變成某種基本路徑,然後其他文件可能需要的東西相對對此。像往常一樣,對於這樣的問題,代碼比英語更清晰。除文件內容外,顯示目錄和文件的佈局也將幫助人們解決您的問題。 –

+0

我想我對這種方法有點太聰明瞭。我覺得有一些錯誤的交流,所以我甩掉了源頭來幫忙。感謝您的幫助! – nathansizemore