【问题标题】:Conditional ES6 import and export有条件的 ES6 导入导出
【发布时间】:2021-05-17 01:46:26
【问题描述】:

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

注意,package.json 说 type : "module"。

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
}

【问题讨论】:

    标签: javascript npm ecmascript-6 import


    【解决方案1】:

    不幸的是,它不是那样工作的。您所描述的基本上是动态导入。

    从两个文件中导入两个密钥集。
    然后创建一个基于 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;
    

    【讨论】:

    • 好吧,如果要部署此代码,这肯定行不通,因为我没有将 development.js(秘密代码)提交给 heroku。因此,服务器肯定会想从“development.js”中找到 developmentKeys,如果找不到它们就会给我一个错误。
    • 那为什么文件名要不同呢?只需创建一个名为 `keys.js' 的文件,并在您的生产环境和开发环境中使用不同的值。从提交中忽略文件并将其手动放置在两个环境中。
    • 是的,正是我后来所做的。
    【解决方案2】:

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

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

    这是您的解决方案:

    index.js

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

    生产.js

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

    开发.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;
    

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

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

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

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

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

    Working Example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-13
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      相关资源
      最近更新 更多