条件必选ES6导入导出



如何在ES6中为导入和导出编写嵌套的if else。这里我有2个文件,production.js和development.js分别为开发代码和生产代码提供密钥,另一个文件keys.js根据要求导入和导出它们。

注意,包。json显示类型:"模块"

production.js

const keys = {
GOOGLE_CLIENT_ID : process.env.GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET : process.env.GOOGLE_CLIENT_SECRET,
mongoURI : process.env.MONGO_URI,
cookieKey : process.env.COOKIE_KEY
}
export default keys;

development.js

const keys = {
GOOGLE_CLIENT_ID : 'something.something',
GOOGLE_CLIENT_SECRET : 'itisasecret',
mongoURI : 'database',
cookieKey : 'blabla',
}
export default keys;

keys.js

if(process.env.NODE_ENV === 'production'){

/*This section throws error*/

import keys from './production.js'
export default keys
}
else{
/*This section also throws error*/
import keys from './development.js'
export default keys
}

您不必编写嵌套的if/else来动态导入模块,但必须使用动态导入语法。这样做的原因是因为import语句只接受一个单引号或双引号字符串,该字符串是要导入的模块的路径。如果你使用import()的动态语法(看起来像一个函数,但实际上不是),那么在括号内你可以放一个字符串模板文字来拉入你需要的文件。

的缺点是,import()返回一个承诺对象,你必须处理。但这并不太难。

这是你的解决方案:

index.js

import keys from './keys.js';
console.log(keys);

production.js

const keys = { stuff: 'production' }
export default keys;

development.js

const keys = { stuff: 'development' }
export default keys;

keys.js

process.env.NODE_ENV = 'production';
let keys;
(async ()=>{
try {
keys = import( `./${process.env.NODE_ENV}.js`);
} catch(err) {
console.log(err);
}
})();
export default await keys;

注意这里使用async代码来处理Promise对象。此外,try/catch应始终包装await语句,以处理任何承诺拒绝。

以这种方式使用时,不需要if/else条件逻辑。

最后,一个工作的repl来演示这个工作。但是,为了使它在repl上工作:

  1. 在右侧面板中选择shell选项卡
  2. 在shell中运行这个命令:npx node@14 index.js

如果你只是点击页面顶部的Run按钮,它将不起作用,你会看到关于import的错误。

工作示例

不幸的是,它不是这样工作的。你所描述的基本上是一个动态导入。

从两个文件导入两个密钥集。
然后创建一个对象,该对象根据NODE_ENV值映射键。
选择密钥并导出。

import productionKeys from './production.js'
import developmentKeys from './development.js'
const keys = {
'production': productionKeys,
'development': developmentKeys
};
const selectedKeys = keys[process.env.NODE_ENV];
export default selectedKeys;

最新更新