2016-06-10 70 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