2016-06-10 65 views
0

我正在編寫一個Node模塊,它將接收一些參數,並輸出一個包含對DOM API的引用(如document)的客戶端腳本。現在,它看起來像這樣包含未定義變量的輸出腳本

module.exports = function(a, b){ 
    return (function(){ 
      function run(a, b){ 
       console.log(a + ' and ' + b); 
      } 

      document.addEventListener('DOMContentLoaded', run(a,b); 
     }).toString() 
} 

,然後我可以使用它像

var myModule = require('./myModule.js') 
var fs = require('fs) 
fs.writeFile('script.js', myModule("A", "B"),() => .....) 

這不是因爲document工作沒有定義,但它肯定感覺像有一定的設計模式爲此我沒有想到。

是否有更好的解決方案來編寫輸出另一個腳本的腳本?

+0

是什麼問題? –

+0

增加了一個更明確的問題。是否有更好的解決方案來編寫輸出另一個腳本的腳本? – Weston

+0

@Weston我想你想要某種預處理和馬科斯...看看http://sweetjs.org/ – cswl

回答

1

通過將函數括入括號中,即(...),您正在執行不帶參數的此函數。然後你應用toString()結果。 如果你想通過一個函數作爲一個字符串,只是把它放在引號中,像這樣:

module.exports = function(a, b){ 
    return 'function(){ 
      function run(a, b){ 
       console.log(a + ' and ' + b); 
      } 

      document.addEventListener('DOMContentLoaded', run); 
     }'; 
} 
+0

我想過只是用引號包裝這個東西,但認爲必須有更好的設計,因爲這樣做很難測試,因爲我不得不求助於eval()。但我想我可能只是在過度複雜。 – Weston

+0

@Weston您如何期望在沒有eval的情況下在node.js中執行該函數?無論你通過它,在那個範圍內的'document'將永遠是'undefined'。 –

+0

那麼真正的腳本可能會有一些功能根本不觸及DOM,並且可以在Node中進行單元測試。但是當腳本只存在於字符串中時,測試必須在另一個模塊運行此函數並獲取真實腳本後完成,然後以某種方式將其解釋爲可以測試的模塊。這實際上可能是一個更好的設計,這也是我要問的部分原因,因爲這對我來說是一個未知的領域。 – Weston