带有eval()的Javascript模块;

时间:2013-05-06 09:17:28

标签: javascript security module eval

每个javascript开发人员都知道; eval是邪恶的

但是由于我正在寻找javascript中的最终模块技术,我读到了一些非常有趣的东西,有人使用eval作为模块加载器,它有两个主要的好处:

  • 移动设备的加载速度更快,因为它一次加载整个字符串
  • 脚本分离而不做花哨的定义包装,如每个模块中的require.js

那么这一切都是什么?它可以是一个解决方案,只通过eval加载几个函数吗?我的意思是从安全方面......

编辑:sry忘记了文章的链接:Article

1 个答案:

答案 0 :(得分:6)

由于3G连接的高延迟,即使有更多数据,单个HTTP请求通常比多个较小的请求快得多。

该文章提出的是将多个模块组合成一个文件,如下所示:

var modules = {
    'main.js': 'alert("Main module")',
    'another.js': 'alert("Another module")',
    'notUsed.js': 'alert("I am never used")',
};

通过这种方式,可以使用更快的单个HTTP请求下载它们,您仍然可以只包含/评估所需的模块。

e.g。你可以这样做:

var requireFile = function(file) {
    if(modules[file])
        eval(modules[file]);
};

requireFile('main.js');
requireFile('another.js');

仅评估main.jsanother.jsnotUsed.js将被忽略。

安全方面,通过<script>标记包含它们应该没有任何不同,只要你用来组合脚本的任何东西都不会意外地组合/包含其他文件/字符串。

因此,从安全角度来看,与上述内容并没有任何区别:

<scruipt src="main.js"></script>
<scruipt src="another.js"></script>

当然你还有other disadvantages of eval