被 require 的模块是如何能够调用到主模块中定义的变量的

2021-07-20 14:34:24 +08:00
 dicc
module.exports = (pwd, data, ext = null) => {
  // 生成一个随机变量名
  let randomID;
  if (ext.opts.otherConf['use-random-variable'] === 1) {
    randomID = antSword.utils.RandomChoice(antSword['RANDOMWORDS']);
  } else {
    randomID = `${antSword['utils'].RandomLowercase()}${Math.random().toString(16).substr(2)}`;
  }
  data[randomID] = Buffer
    .from(data['_'])
    .toString('base64');
  data[pwd] = `@eval(@base64_decode($_POST['${randomID}']));`;
  delete data['_'];
  return data;
}

该代码片段来自蚁剑.

  1. 其中 antSword 是定义于 app.entry.js 中的一个常量
  2. 在某些过程中,上面的代码片段会被动态 require.

我尝试写了一个 test.js,在其中定义 antSword 常量
然后再动态调用上面的代码,但是它会抛出 ReferenceError: antSword is not defined 异常

1692 次点击
所在节点    Node.js
5 条回复
anzerwall
2021-07-20 14:41:29 +08:00
node 中的模块都处于闭包中,如果不是手动挂到 global 的话,是不能直接拿到。


window 环境下 script 中声明的变量会自动挂到 window,你看是不是这个区别导致的
dicc
2021-07-20 14:49:45 +08:00
@anzerwall 哥,刘辟. 我把他定义到 global 上面就可以了
libook
2021-07-20 18:00:19 +08:00
global 肯定能解决问题,只不过不一定是个好办法,比如任何 module 都可以访问 global 里的属性,以及 global 上属性过多可能会影响性能。

这个文件 export 出去的是一个箭头函数,你看是不是可以把 antiSword 作为一个函数参数,在调用的时候传进来。
如果 antiSword 会在 app.entry.js 里 export 出来的话也可以在这个文件里 require app.entry.js 。
当然也可以把 antiSword 从 app.entry.js 里拆出来,作为一个公共 module 让各个其他 module require 。
dicc
2021-07-21 08:57:34 +08:00
@libook 你这个思路是对的,不过我是想偷懒,用最简单的方式复用.而且这样在它的源码更新的情况下,尽量少的改动就可以用起来
libook
2021-07-21 10:07:39 +08:00
@dicc #4 这就看你的项目对技术债是什么态度了,如果是临时性的改动或项目预期维护周期不长的话也就无所谓了,可以简单粗暴地来,如果是长期维护的项目的话,还是得多多少少考虑避免技术债的,前面爽了后面可能就会哭。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/790605

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX