Javascript 在运行时中需要(),但它只运行一次。可以吗?

Javascript 在运行时中需要(),但它只运行一次。可以吗?,javascript,node.js,config,Javascript,Node.js,Config,我在它们的目录中有许多配置,它们响应不同的任务。但在某些情况下,我需要从另一个文件获取配置。例如: 文件1: module.exports = Object.freeze({ uid: 'uid', name: 'name', admin: 'admin', balance: 'balance', state: 'state', bet: 'bet', size: 'size', chance: 'chance', language: 'language' }

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

文件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调用将缓存在require.cache对象下。 您所做的一切都是正常的,因为您只导出了一个对象。因此,在多次要求之后,它不会重新计算

如果您对此感到担忧,您可以这样做:

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

就用吧。这会更简单:)

动态调用
require()
没有什么错。根据文档,所有需求都被缓存。

文件1是否依赖于文件2

如果不是,为什么你不能

// 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')
}

这没什么错,它只会被评估一次。对
require()
的所有调用都以相同的方式工作,事实上,它有一个内部缓存,以防止依赖项多次运行,因此后续调用基本上减少为对缓存对象的属性访问。这是错误的。导出不会重新执行。模块顶层中的任何内容都不会被重新执行。您的回答意味着
module。exports
会被重新执行。没有
只有清除require的缓存,它才能得到重新处理
仍然是错误的。我刚刚检查过,如果清除require缓存,整个模块都会得到重新处理。在module.exports之外的文件中放置一个console.log,然后在清除缓存并重新要求模块后重新调用它。“它可以重新处理”中的“it”指的是
module.exports=…
,而不是
require()
本身。这里有3个不同的文件。文件
/api/user/config.js
,其中一个
require()
ing并导出另一个对象,第三个文件未显示,需要该对象。如果你从缓存中清除
/api/user/config.js
,代码
module.exports=…
不会被重新执行,这就是我要说的。但实际上,缓存永远不会被清除,所以这一点一开始就不需要担心。请仅仅发布一些内容并不是回答的质量