0
点赞
收藏
分享

微信扫一扫

手写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>

执行结果如下所示:

手写Node模块系统-执行字符串中的代码_字符串

存在依赖关系, 字符串可以访问外界数据, 不安全。

<script>
let name = "BNTang";
let str = "console.log(name);";
eval(str);
</script>

手写Node模块系统-执行字符串中的代码_依赖关系_02

通过 ​​eval​​ 执行代码的缺点: 存在依赖关系, 字符串可以访问外界数据, 不安全。

通过 new Function 执行代码

<script>
let str = "console.log('www.it6666.top');";
let fn = new Function(str);
console.log(fn);
fn();
</script>

执行结果如下所示:

手写Node模块系统-执行字符串中的代码_字符串_03

还是一样的问题存在依赖关系, 字符串可以访问外界数据, 不安全。

<script>
let name = "BNTang";
let str = "console.log(name);";
let fn = new Function(str);
fn();
</script>

手写Node模块系统-执行字符串中的代码_字符串_04

通过 new Function 执行代码的缺点: 存在依赖关系, 依然可以访问全局数据, 不安全。




举报

相关推荐

0 条评论