如何使用现代的nodeJS动态选择模块?

时间:2019-03-03 11:30:56

标签: node.js ecmascript-6

我正在使用node --experimental-modules test.mjs(NodeJs v11.9.0)。

实现同一个类有很多选择,我需要在终端处进行切换,

switch (process.argv[2]) {
  case 'a':
    import MyClass from './MyClass-v1.mjs'; break;
  case 'b':
    import MyClass from './MyClass-v2.mjs'; break;
  default:
    import MyClass from './MyClass-v3.mjs';
}

import MyClass上的错误:意外的标识符

PS:使用 isolated (隔离) import MyClass from './MyClass-v3.mjs';时工作正常。


注意:const MyClass = require('./MyClass-v3.mjs')不适用于现代Javascript。 ( ReferenceError:未定义)。该文件只有一个类定义,

export default class MyClass { ... }

PS:NodeJ没有像C_preprocessor那样的东西吗?旧的预编译器(具有argv访问权限)在这里就可以了。

2 个答案:

答案 0 :(得分:1)

import ClassV1 from './MyClass-v1.mjs';
import ClassV2 from './MyClass-v2.mjs'; 
import ClassV3 from './MyClass-v3.mjs';

const classes = {
  a: ClassV1,
  b: ClassV2
}

const Class = classes[process.argv[2]] || ClassV2;

您还可以编写包含所有类的索引文件并执行import * as classes from 'classes.mjs';

答案 1 :(得分:0)

现代Javascript(ES6 +)实现正在构建中,某些语法可与NodeJS(node --experimental-modules)和优秀的 browsers 配合使用,

这是唯一无需“全部加载”成本的方法(请参阅@Markus解决方案),但是由于要付出非全局导入的代价,因此需要一个丑陋的块来定义作用域和异步操作...第一步是了解基本的impor块语法:

import('./MyClass-v3.mjs').then(({default: MyClass}) => {
    // can use MyClass only here in this block
    let x = new MyClass();
    console.log("DEBUG=",x);
});

它们将argv选择和可选导入放在一起。

解决方案

const classes = {
  a: './MyClass-v1.mjs'
  ,b: './MyClass-v3.mjs'
  ,c: './MyClass-v3.mjs'
};
import(classes[process.argv[2]] || classes.c ).then(({default: MyClass}) => {
    let x = new MyClass();
    console.log("DEBUG=",x);
});

PS:有些魔术(没有道理)是使用({default: MyClass})代替(MyClass)


谢谢

致@Bergi(!),以解释此解决方案(请参阅问题注释)。