2013-03-27 67 views
0

我想加載存儲在/data/projects.js(或.json,取決於問題的答案)中的server.js文件中的一些數據。Node.js同步加載JS變量的最佳方法

我看到兩種可能性:

  1. 使用readFileSync:

    function readJsonFileSync() { 
        var file = fs.readFileSync(__dirname + '/data/projects.json', 'utf8'); 
        return JSON.parse(file); 
    } 
    

    和projects.json是使用傳統的JSON文件

  2. 要求:

    function readJsonFileReq() { 
        return require('./data/projects.js')['projects'] ; 
    } 
    

    含projects.js:

    exports.projects = { 
        // My variable 
    }; 
    

問題是哪一個是最好的:

  • 在性能方面?
  • 在節點可寫性/哲學方面? (如需要()被保留以供模塊)

我猜想溶液2爲更好,因爲需要()可能是用於讀取JS代碼優化,而溶液1具有讀取該文件,然後解析它,但解析它可能比執行它便宜。

回答

1

http://nodejs.org/api/modules.html#modules_file_modules

。 js文件被解釋爲JavaScript文本文件,.json文件被解析爲JSON文本文件。 .node文件被解釋爲用dlopen加載的編譯插件模塊。

所以我會做require("./data/projects.json"),因爲它是最短的,並且大概是最優化的。

Laurent給出了一個好評:require的結果被緩存了。這可能是一個優點或缺點。如果您只在應用程序啓動時讀取一次文件,則無關緊要。

這點是怎麼做的(除了緩存結果):

Module._extensions['.json'] = function(module, filename) { 
var content = NativeModule.require('fs').readFileSync(filename, 'utf8'); 
try { 
    module.exports = JSON.parse(stripBOM(content)); 
} catch (err) { 
    err.message = filename + ': ' + err.message; 
    throw err; 
} 
}; 

https://github.com/joyent/node/blob/master/lib/module.js#L479

3

在node.js中使用sync fs函數的主要原因是在應用程序啓動之前加載文件。最常見的原因是加載配置文件。在這種情況下,性能並不重要。

這就是說,readFileSyncrequire之間的主要區別是需要緩存文件的內容。我已經看過無數次require被用來加載json文件,所以我不認爲它是保留給模塊的(確保在文件路徑中包括.json)。

最後,如果您想寫var projects = require('./data/projects.js');,請不要忘記您可以使用module.exports = {..}

編輯:作爲參考,我檢查的node.js的源代碼,併爲疑似,require使用readFileSync內部:

https://github.com/joyent/node/blob/master/lib/module.js#L472

 
// Native extension for .js 
Module._extensions['.js'] = function(module, filename) { 
    var content = NativeModule.require('fs').readFileSync(filename, 'utf8'); 
    module._compile(stripBOM(content), filename); 
}; 
+1

我一般纏上了我的每環境外部配置文件管理缺省值,系統變量的模塊中,等等,所以我使用'require' *和*'readFileSync' – 2013-03-27 08:56:50