2012-11-20 110 views
2

我試圖創建一個用JavaScript + NodeJS編寫的IRC bot。該機器人應該能夠在運行時加載插件,並且應該能夠在更改後重新加載相同的插件等。運行時加載+覆蓋函數

什麼可行?

在運行時加載文件+執行其代碼。

怎麼回事?

如果仍然執行我的代碼再次加載相同的插件,但現在它發生兩次或第n次我加載插件。

當前代碼:

bot.match(/\.load/i, function(msg) { 
    require('./plugins/plug.js')(this); 
}); 

module.exports = function(bot) { 
    bot.match(/\.ping/i, function(msg) { 
    msg.reply('pong'); 
}); 

那麼,有沒有什麼辦法來解決我的問題,使這項工作?

P.s.我使用IRC-JS作爲此機器人的基礎。

更新,固定:

即使更改該文件會被忽略,所以一定會像 緩存。

通過清除require.cache

回答

3

回答我自己的問題。在加載插件時,我將每個對象添加到全局數組中。這可以很容易地訪問和刪除之後。

function clearplugins() { 
    require("fs").readdirSync("./plugins/active").forEach(function(file) { 
     delete require.cache[require.resolve("./plugins/active/" + file)]; 
    }); 

    plugins.forEach(function(obj) { 
     obj(); 
    }); 
} 

function loadplugins() { 
    require("fs").readdirSync("./plugins/active").forEach(function(file) { 

     if(file.slice(-2) == 'js') { 
      plugins.push(require("./plugins/active/" + file)(bot)); 
      console.log(file+' loaded'); 
     } 
    }); 
} 
4

require不會重新加載一個文件固定。一旦它被加載一次,它就在內存中,它不會重新加載。這聽起來像你想離開機器人,並改變它的腳本內容。你可以通過刪除require.cache來做到這一點。退房node.js require() cache - possible to invalidate?http://nodejs.org/api/modules.html#modules_caching

+0

還是這個? http://stackoverflow.com/questions/6676612/unloading-code-modules – meetamit

+0

好的,非常感謝你的回答!我已經找到了,但是我錯過了一些東西來從'require.cache':完整路徑中刪除條目。正如例子'require.resolve'在這種情況下的幫助。但是仍然有一個問題:我的函數的輸出仍然出現第n次,這意味着函數仍然在內存中。任何想法? – sascha