我有一个js文件。我使用eval()函数使用其他javascrupt文件加载它。我看到eval很慢,还有一些其他的限制。因为我需要将我的JS文件对象存储在缓存中,并在apllication启动后随时使用它。我不想每次都做eval()。
无论如何都要以简单的方式去做。
var evalObj;
if(evalObj) {
console.log('eval object already evaluated');
_myfunctionInJSFile_(layouts.FormatDate(startTime), threadName, level, categoryName, message);
}
else {
evalObj = eval(fs.readFileSync('./myJSFile', 'utf8'));
console.log('re evaluating object ..' );
_myfunctionInJSFile_(layouts.FormatDate(startTime), threadName, level,message);
}
myJSFile
var _sigmaAlarmHandler_ =function(args)
{
var args = Array.prototype.slice.call(arguments);
args.unshift();
console.log('Alarm : ', args);
}
条件评估不起作用。
答案 0 :(得分:0)
在node.js
中你可以简单地要求你的js文件:
var obj = require('./myJSFile');
obj.foo();
./myJSFile.js
:
exports.foo = function() {
console.log('foo');
}
此文件将成为您需要导出功能的模块
它加载一次,然后每个require
重用已经加载的模块。
答案 1 :(得分:0)
如果它不符合commonjs(即使用module.exports
将无效),那么您可以在自己的vm中运行它:
var vm = require('vm');
vm.runInNewContext(jscode,{/*globalvars*/});
其中第二个参数是一个对象,其中全局变量在运行jscode的上下文中可用。因此,如果第二个参数是{a:1,b:"foo"}
,则您的jscode将运行,全局变量a
设置为1
,全局变量b
设置为"foo"
}。
jscode本身是一个从文件或其他地方加载的字符串。
将vm.runInNewContext()
视为“练习安全评估”。嗯,相对安全,如果你传递特定的变量,你仍然可以做一些危险的事情,比如process
或file
等。
我将此用作node_s
的cansecurity http://github.com/deitch/cansecurity的声明部分您可以在文件lib/declarative.js
以下是vm
http://nodejs.org/api/vm.html
可以选择在相同的环境中运行,等等。但这是非常危险的。
当您实际运行代码时,请使用上面的示例:
_myfunctionInJSFile_(layouts.FormatDate(startTime), threadName, level,message);
您希望传递4个参数:startTime
,threadName
,level
,message
并执行该功能。问题是您无法在当前上下文中运行该功能。您需要在文件中定义和定义的函数。所以你应该有类似的东西:
vm.runInNewContext(jscode,{startTime:layouts.FormatDate(startTime),threadName:threadName,level:level,message:message});
然后jscode
应该看起来像
function _myfunctionInJSFile(startTime,threadName,level,message) {
// do whatever you need to do
}
// EXECUTE IT - the above vars are set by the global context provide in vm.runInNewContext
_myfunctionInJSFile(startTime,threadName,level,message);
如果您希望定义该函数并将其加载并在此上下文中运行,那么只需使用commonjs格式。
答案 2 :(得分:0)
我想我找到了答案。
由于我的应用程序在使用v8引擎平台的节点js中运行。当应用程序启动 v8引擎缓存时,所有代码/配置都可以随时使用。 同样在我的代码中,我将使用eval预加载JS代码,我将只执行一次。所以在下一次调用时,我将只返回加载的JS代码。在这里,我需要修改代码加载一次。 但我们看到的主要观点是,将来如果任何机构有类似的要求,他们可以使用eval缓存他们的JS代码(感谢v8引擎)并使用它直到你的应用程序运行。