手写Node模块系统-执行字符串中的代码
Node 模块
在 CommonJS 规范中 一个文件
就是 一个模块
。
在 CommonJS 规范中暴露数据通过 exports
进行暴露。
在 CommonJS 规范中导入模块通过 require()
进行导入需要使用的模块。
Node 模块原理分析
既然一个文件就是一个模块, 既然想要使用模块必须先通过 require()
导入模块, 所以可以推断出 require()
的作用其实就是 读取文件
, 所以要想了解 Node 是如何实现模块的, 必须先了解如何执行读取到的代码。
执行从文件中读取的代码
我们都知道通过 fs
模块可以读取文件, 但是读取到的数据要么是 二进制
, 要么是 字符串
无论是二进制还是字符串都无法直接执行, 但是我们知道如果是字符串, 在 JS 中是有办法让它执行的可以通过 eval
或者 new Function
来进行执行。
通过 eval 执行代码
<script>
let str = "console.log('www.it6666.top');";
eval(str);
</script>
执行结果如下所示:
存在依赖关系, 字符串可以访问外界数据, 不安全。
<script>
let name = "BNTang";
let str = "console.log(name);";
eval(str);
</script>
通过 eval
执行代码的缺点: 存在依赖关系, 字符串可以访问外界数据, 不安全。
通过 new Function 执行代码
<script>
let str = "console.log('www.it6666.top');";
let fn = new Function(str);
console.log(fn);
fn();
</script>
执行结果如下所示:
还是一样的问题存在依赖关系, 字符串可以访问外界数据, 不安全。
<script>
let name = "BNTang";
let str = "console.log(name);";
let fn = new Function(str);
fn();
</script>
通过 new Function 执行代码的缺点: 存在依赖关系, 依然可以访问全局数据, 不安全。