【问题标题】:Does organizing code in multiple modules that require the same package decrease performance in Node.js?在需要相同包的多个模块中组织代码会降低 Node.js 的性能吗?
【发布时间】:2021-07-06 20:06:52
【问题描述】:

我正在使用 Node.js 和 Puppeteer,我正在使用 Puppeteer 抓取多个网站。我正在考虑通过将每个站点实现分离到自己的文件来组织代码。所以我会喜欢 example.com.js example2.com.js 等

每一个都需要相同的模块(puppeteer/jsdom),并且会导出一个包含变量和函数的对象。这样,我可以在 index.js 文件中导入所有这些模块。

我已经阅读了有关 Nodejs 缓存模块的信息,并且这种组织代码的方式是标准的,但是,就我而言,如果说我有 100 个不同的网站要抓取,那么我将有 100 个模块需要(puppeteer/jsdom) 中的每一个,所以如果 Nodejs 正在缓存模块,我仍然使用 100 个不同的变量来存储模块。

const puppeteer = require('puppeteer');

所以我将这行代码放在 100 个文件中,即使 Nodejs 正在缓存 Puppeteer 模块,我仍在创建 100 个 puppeteer 变量,如果我将所有代码写在一个文件中,我可以只创建一个。

我在这里错过了什么吗?

【问题讨论】:

    标签: node.js node-modules


    【解决方案1】:

    来自官方文档here

    模块在第一次加载后被缓存。这意味着(除其他外)每次调用 require('foo') 都将返回完全相同的对象,如果它会解析为同一个文件。

    “Nodejs 正在缓存 Puppeteer 模块”是正确的,但“我仍在创建 100 个 puppeteer 变量”是不正确的。所以,我想说,别担心 :),你可以继续在多个文件中组织你的代码。

    【讨论】:

      【解决方案2】:

      例如,如果这是您的设置:

      // a.js
      const puppeteer = require('puppeteer');
      
      // b.js
      const puppeteer = require('puppeteer');
      
      // c.js
      const a = require('./a.js');
      const b = require('./b.js');
      

      会发生以下情况;

      1. 需要文件a.js
      2. 模块puppeteer正在被文件中的变量puppeteer解析和引用。
      3. 需要文件b.js
      4. 同样创建了对puppeteer的引用,但是模块已经被解析并执行了,所以它被'缓存'了

      这样做不会导致性能问题,关于多次导入同一个模块。

      关于你的陈述

      我仍在创建 100 个 puppeteer 变量

      如上所述,您只是创建引用,内容不会被深度克隆。

      【讨论】:

      • 我有两个问题。首先,如果我用 let 而不是 const 声明 puppeteer,这会不会一样?其次,如果我在 a.js 中更改 puppeteer 对象中的值,b.js 会访问不同的新 puppeteer 对象,还是 b.js 会访问更改后的 puppeteer 对象
      • 1.从 const 更改为 let 不会改变任何东西,唯一的区别是,引用 puppeteer 的变量可以被完全覆盖。 2.如果你更改了puppeteerobject中的值,它会在其他所有地方都被更改,其中puppeteer也被使用(并且事先没有创建深度克隆)。
      猜你喜欢
      • 1970-01-01
      • 2018-03-28
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      相关资源
      最近更新 更多