V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dicc
V2EX  ›  Node.js

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

  •  
  •   dicc · 130 天前 · 800 次点击
    这是一个创建于 130 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 异常

    5 条回复    2021-07-21 10:07:39 +08:00
    anzerwall
        1
    anzerwall   129 天前
    node 中的模块都处于闭包中,如果不是手动挂到 global 的话,是不能直接拿到。


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

    这个文件 export 出去的是一个箭头函数,你看是不是可以把 antiSword 作为一个函数参数,在调用的时候传进来。
    如果 antiSword 会在 app.entry.js 里 export 出来的话也可以在这个文件里 require app.entry.js 。
    当然也可以把 antiSword 从 app.entry.js 里拆出来,作为一个公共 module 让各个其他 module require 。
    dicc
        4
    dicc   129 天前
    @libook 你这个思路是对的,不过我是想偷懒,用最简单的方式复用.而且这样在它的源码更新的情况下,尽量少的改动就可以用起来
    libook
        5
    libook   129 天前
    @dicc #4 这就看你的项目对技术债是什么态度了,如果是临时性的改动或项目预期维护周期不长的话也就无所谓了,可以简单粗暴地来,如果是长期维护的项目的话,还是得多多少少考虑避免技术债的,前面爽了后面可能就会哭。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2324 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:39 · PVG 14:39 · LAX 22:39 · JFK 01:39
    ♥ Do have faith in what you're doing.