手写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 执行代码的缺点: 存在依赖关系, 依然可以访问全局数据, 不安全。

posted @ 2021-01-23 12:33  BNTang  阅读(477)  评论(0编辑  收藏  举报