如何在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上工作:
- 在右侧面板中选择shell选项卡
- 在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;