2016-03-23 60 views
0

在NodeJS中,我想簡單地執行一個文件並允許它修改全局名稱空間。我知道這不是最好的做法,如果我自己設計項目,我會確保每個模塊都導出一個變量。在全局範圍內執行文件而不是返回導出的對象

我正在將一個結構不好的SPA項目通過腳本標記加入到節點中,我想這樣做是漸進式的。

現在我有:

require('./three.js')

這是一個版本的threejs它只是填充名爲「三」與模塊的內容的全局變量。由於require的執行隱式地創建了一個閉包,所以不會爲我創建一個全局變量。

所以我想要做的就是運行一個完整的js文件,並允許它創建全局變量。

有沒有一個優雅的方式來做到這一點?

+0

*「由於require的執行隱式地創建了一個閉包,所以沒有爲我創建一個全局變量。」*這真的取決於如何實現three.js。任何模塊都可以通過執行'global.foobar = 42'來向全局範圍添加內容。如果'three.js'正在輸出一個你想要的值,你可以用'global.THREE = require('...')'把它添加到全局對象中。 –

+0

好點 - 這個版本的three.js期望通過腳本標籤連接到一個網頁,所以它沒有這個。如果我有一個單獨的模塊,它會被微不足道地添加,但這取決於30個以上的腳本標記,我不想改變它們,直到我可以逐漸測試何時打破它爲止。我做的第一件事是將所有內容都放入一個js文件中,而不是依賴於嵌入html的腳本。我將通過使用AMD友好版本替換每個模塊,但這是中間步驟。 – pixelpax

+0

您不在全局名稱空間中運行node.js代碼。如果需要的話,任何節點模塊都可以直接訪問'global'對象來混淆全局名稱空間。爲什麼不這樣做呢?或者,更好的學習如何正確編程節點模塊和輸出,因爲這通常是更好的代碼編寫方式。 – jfriend00

回答

0

您正在使用使用節點服務器運行的單頁應用程序。那麼爲什麼你不試試module.exports =,以便你可以在你給的名字空間下看到。

所以舉例 var THREE_74 = require('./ three');

現在這個THREE_74.HemispherLight()

可以或許你這樣做有什麼訪問。

如果你想讓你的應用程序脫離節點而不是使用與現在相同的佈局(因爲你正在轉換SPA應用程序),然後創建index.html將require.js文件(http://requirejs.org/docs/download.html)加載到腳本標記中在這個js文件之後創建你所有的文件而不是調用(在這些文件中,像你現在所做的那樣完成這個需求)。

然後運行一行服務器蟒蛇-m SimpleHTTPServer並在瀏覽器上簡單的:)

+0

正如我上面提到的,這些模塊期望在一個腳本標記中被連接起來,並且很多沒有導出語句。我瞭解require的常規用法,我正在詢問一個特殊情況。 – pixelpax

0

我能找到這個片段運行。它在Node中不是本地的,但它可以很好地用作臨時解決方案!

var fs = require('fs'); 
var vm = require('vm'); 
var includeInThisContext = function(path) { 
    var code = fs.readFileSync(path); 
    vm.runInThisContext(code, path); 
}.bind(this); 
includeInThisContext("<PATH_TO_FILE>"); 
相關問題