typescript JavaScript中的导出行为和导出默认值

k2fxgqgv  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(163)

我正在创建一个NodeJS和Express应用程序,并希望有一个配置模块在启动时运行一次,然后使serverConfig对象可用于需要这些值的任何其他模块。

const loadConfig = () => {
    // logic to load configuration from environment variables, AWS Secrets Manager, etc.
}

export default loadConfig()

现在我能做的

import serverConfig from 'config'

当我在多个文件中执行此操作时,每次都会调用loadConfig()吗?或者我可以访问所有import中对单个对象的引用吗?我只想在启动时执行一次loadConfig()函数。这些配置值在执行过程中不应更改。而且我不想重复(也许)在每次请求我的API时,在loadConfig()中多次使用耗时的逻辑。
如果不是,在服务器启动时调用loadConfig()一次并创建一个所有其他模块都可以导入和引用的对象的正确方法是什么?

64jmpszr

64jmpszr1#

文件范围内的所有内容都执行 * 一次 *。一旦解析了文件的导出,它们将直接通过引用用于任何后续导入。
任何不在函数本身内部的函数调用将在程序首次启动时导入该文件时执行一次。

// a.ts
console.log('foo')

// b.ts
import './a'

// c.ts
import './a'

// main.ts
import './b'
import './c'

如果您编译并运行main.ts,您将得到"foo"的 * 一个 * 输出到控制台。
考虑到这一点,您的示例可以重写为:

const loadConfig = () => {
    // logic to load configuration from environment variables, AWS Secrets Manager, etc.
}

const config = loadConfig()

export default config

现在很清楚,loadConfig()是从文件范围调用的,因此只执行一次。
此版本:

export default loadConfig()

只是避免了中间变量,但其他功能完全相同。
如果您确实想多次运行该逻辑,只需导出一个函数即可。

// config.ts
export const loadConfig = () => {
    // ...
}

// main.ts
import { loadConfig } from './config'

loadConfig()
loadConfig() // now do it again.

这听起来不像你想要的,但我在这里列出它,以明确区别是什么。

相关问题