代码之家  ›  专栏  ›  技术社区  ›  Code-Apprentice

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

  •  0
  • Code-Apprentice  · 技术社区  · 2 年前

    我正在创建一个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 s我只想要这个 loadConfig() 函数在启动时执行一次。这些配置值在执行过程中不应更改。我不想在中重复(也许)耗时的逻辑 loadConfig() 在每次请求我的API时多次。

    如果没有,正确的呼叫方式是什么 loadConfig() 一旦在服务器上启动并创建一个所有其他模块都可以导入和引用的对象。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Code-Apprentice    2 年前

    文件范围内的所有内容都执行 一旦 。一旦解析了文件的导出,它们将直接通过引用用于任何后续导入。

    任何不在函数内部的函数调用都将在程序首次启动时导入该文件时执行一次。

    // 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.
    

    这听起来不像你想要的,但我在这里列出它是为了清楚地说明区别。

    推荐文章