繁体   English   中英

如何将node.js模块/源合并到一个.js文件中,以在节点内部执行

[英]How to combine node.js modules/source into one .js file, to execute inside node

我需要使用vm.createScript / script.runInNewContext在节点应用程序(在沙箱中)中执行节点代码/模块的地方。 主机节点应用程序在heroku上运行,因此没有本地文件系统可言。 我能够下载并运行没有外部依赖关系的代码,但是要求是还必须包括其他节点模块。 (因为构建/打包步骤是理想的)

有很多现有的解决方案(browserify是我花了最多时间的解决方案),它们接近了……但是它们不可避免地会生成一个单一的代码块(是!),意在浏览器中执行(boo!)。 例如,Browserify生成对window等的依赖关系。

有谁知道一种工具,该工具将读取package.json依赖项{}(或查看源代码中的所有require())并生成适合于节点的runInNewContext的单个整体blob?

我认为您要找的解决方案不是正确的解决方案。 基本上,您想获取一堆require('lib') ,将它们融合到单个Javascript上下文中,将该上下文序列化为源代码,然后将该序列化的形式传递给runInNewContext函数以反序列化并重建为Javascript上下文,然后反序列化您的自定义沙盒代码,最后运行整个程序。

仅创建一个包含所需require('lib')的上下文对象并将该对象直接传递到您的VM中,是否更有意义? 根据文档中的代码:

var vm = require('vm'), 
initSandbox = {
    async: require('async'),
    http: require('http')
},
context = vm.createContext(initSandbox);
vm.runInContext("async.forEach([0, 1, 2], function(element) { console.log(element); });", context);

现在,您可以通过上下文访问所需的库,而无需执行昂贵的序列化/反序列化过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM