【问题标题】:require() in a runtime but it runs only once. Is it ok?require() 在运行时,但它只运行一次。可以吗?
【发布时间】:2018-12-23 00:01:24
【问题描述】:

我在他们的目录中有许多配置,它们响应不同的任务。但在某些情况下,我需要从另一个文件中获取配置。示例:

文件1:

module.exports = Object.freeze({
  uid: 'uid',
  name: 'name',
  admin: 'admin',
  balance: 'balance',
  state: 'state',
  bet: 'bet',
  size: 'size',
  chance: 'chance',
  language: 'language'
})

文件2:

module.exports = Object.freeze({
  url: 'mongodb://localhost:27017/',
  table: 'casino-db',
  row: 'users',
  user: require('/api/user/config')
})

没事吧?我听说动态调用 require() 很糟糕,因为它以另一种方式工作,而不是从文件开始调用它。

有人使用这种配置结构吗?

【问题讨论】:

  • 这没有错,它只会被评估一次。所有对require() 的调用都以相同的方式工作,实际上它有一个内部缓存以防止依赖项运行多次,因此后续调用基本上被简化为对缓存对象的属性访问。

标签: javascript node.js config


【解决方案1】:

后续的 require 调用被缓存在 require.cache 对象下。 您正在做的事情没关系,因为您重新导出的只是一个对象。所以它不会在多次请求后重新计算。

如果你担心的话,你可以这样做:

const user = require('/api/user/config')
module.exports = Object.freeze({
  url: 'mongodb://localhost:27017/',
  table: 'casino-db',
  row: 'users',
  user
})

【讨论】:

  • 这是错误的。出口不会重新执行。模块顶层中的任何内容都不会被重新执行。
  • 您的回答暗示module.exports 被重新执行。它没有。 Only if you clear require's cache, it can get re-processed 还是错的。
  • 我刚刚检查过,如果你清除了 require 缓存,整个模块会被重新处理。在文件中放置了一个 console.log,从 module.exports 中取出,并在清除缓存并再次要求模块后被重新调用
  • “it can get re-processed”中的“it”指的是module.exports = ...,而不是require()本身。这里有 3 个不同的文件。文件/api/user/config.js,一个require(),并导出另一个对象,第三个文件未显示,需要它。如果您从缓存中清除/api/user/config.js,代码module.exports = ... 确实不会重新执行就是我的意思。
  • 但在实践中,缓存永远不会被清除,所以这不是首先要担心的事情。
【解决方案2】:

动态调用require() 没有任何问题。根据文档,所有需求都被缓存。

【讨论】:

    【解决方案3】:

    file1 是否依赖于 file2?

    如果没有,你为什么不能……

    // file 1
    module.exports = Object.freeze({
      uid: 'uid',
      name: 'name',
      admin: 'admin',
      balance: 'balance',
      state: 'state',
      bet: 'bet',
      size: 'size',
      chance: 'chance',
      language: 'language'
    })
    
    // file2
    module.exports = Object.freeze({
      url: 'mongodb://localhost:27017/',
      table: 'casino-db',
      row: 'users'
    })
    
    // some index.js
    module.exports = {
      file1: require('./file1'),
      file2: require('./file2')
    }
    

    【讨论】:

      【解决方案4】:

      只需使用dotenv。这会更容易:))

      【讨论】:

      • 请只发帖不是回答的质量
      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 2012-06-18
      相关资源
      最近更新 更多