手写Node模块系统-执行字符串中的代码
  TEZNKK3IfmPf 2023年11月13日 36 0

在 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模块系统-执行字符串中的代码

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

通过 new Function 执行代码

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

执行结果如下所示:

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

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

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

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

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年04月12日   34   0   0 字符串java
  TEZNKK3IfmPf   2024年05月17日   33   0   0 字符串php
TEZNKK3IfmPf