在节点js中导入时执行脚本,而不调用函数

Executing a script upon import in node js, without calling a function

我正在尝试导入一个加载我的环境变量的打字稿模块。由于我的变量的导入和执行顺序对我的应用程序很重要,我想将它们从我的 index.ts 文件重构到另一个模块中。但是,我不想调用一个函数来 运行 我的脚本,而是我想在导入我现在正在使用 loadEnvVars() 函数的模块时执行它们。

// index.ts

import loadEnvVars from './settings';
**loadEnvVars();**
import app from './server';

app.run();

我想要的不是上面的:

// index.ts
import loadEnvVars from './settings';
import app from './server';

app.run();
// ./settings.ts

import dotenv from 'dotenv';
import path from 'path';
const envVars = (): void => {
  dotenv.config({
    path: path.join(__dirname, '../.env.' + process.env.NODE_ENV),
    debug: process.env.NODE_ENV === 'development' ? true : false,
  });
};

export default envVars

我自己想出了以下解决方案,但我不确定这是否是进行此类导入的正确方法:

// index.ts

import './settings';
...

// settings.ts

import dotenv from 'dotenv';
import path from 'path';

const envVars = (): void => {
  dotenv.config({
    path: path.join(__dirname, '../.env.' + process.env.NODE_ENV),
    debug: process.env.NODE_ENV === 'development' ? true : false,
  });
};

envVars();

export default envVars;

您可以通过完全删除该函数使其更简洁一些,因为它不再使用,而是自动调用:

// settings.ts

import dotenv from 'dotenv';
import path from 'path';

dotenv.config({
  path: path.join(__dirname, '../.env.' + process.env.NODE_ENV),
  debug: process.env.NODE_ENV === 'development' ? true : false,
});

// remove this next line
// export default envVars;

就是说 - 取决于 import 顺序会导致代码脆弱。在导入 settings 之前不小心导入其他东西很容易搞砸,这取决于已经设置的配置。如果我是你,请考虑继续使用原始代码。显式执行依赖时间线很好。

另请注意,导入已挂起。您的代码

import loadEnvVars from './settings';
loadEnvVars();
import app from './server';

相当于

import loadEnvVars from './settings';
import app from './server';
loadEnvVars();