Node.js 如何使用现代节点动态选择模块?

Node.js 如何使用现代节点动态选择模块?,node.js,ecmascript-6,Node.js,Ecmascript 6,我使用的是节点——实验模块test.mjs(nodejsv11.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 './

我使用的是
节点——实验模块test.mjs
(nodejsv11.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';
}
导入MyClass时出错:意外标识符

PS:使用隔离的时工作正常
从“/MyClass-v3.mjs”导入MyClass


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

export default class MyClass { ... }

附言:没有比NodeJs更好的了?一个旧的预编译器(带有一些argv访问权限)在这里就可以了

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;
您还可以编写一个包含所有类的索引文件,并从'classes.mjs'作为类执行
import*

您还可以编写一个包含所有类的索引文件,并从'classes.mjs'作为类执行
import*

现代Javascript(ES6+)实现正在构建中,一些语法可以与NodeJ(
node——实验模块)和优秀的浏览器一起使用,其他的则不能

这是唯一没有“全部加载”成本的方法(请参阅@Markus solution),但由于非全局导入的成本,需要一个丑陋的块来定义范围和关联操作。。。第一步是了解基本的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选择和可选导入

解决方案 PS:一些神奇的(非理性的)方法是使用
({default:MyClass})
代替
(MyClass)


谢谢 对于@Bergi(!),为了解释这个解决方案(请参见问题注释)。

现代Javascript(ES6+)实现正在构建中,一些语法正在与NodeJ(
node——实验模块)和优秀的浏览器一起使用,而其他的则没有

这是唯一没有“全部加载”成本的方法(请参阅@Markus solution),但由于非全局导入的成本,需要一个丑陋的块来定义范围和关联操作。。。第一步是了解基本的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选择和可选导入

解决方案 PS:一些神奇的(非理性的)方法是使用
({default:MyClass})
代替
(MyClass)


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

您好。也许你需要使用工厂模式Hi@VladKosko,有意义。。。使用Node实现它的最佳方式是什么?动态加载没有简单的方法?我的代码也是一种。import语句只允许在模块的顶层使用。要在其他任何地方导入,请使用
require
。为此,您需要一个导入声明,不能将导入声明放在交换机外壳内。不确定节点是否已经支持
import()
@PeterKrauss,但您无法对ES6模块执行同步动态导入。鉴于此代码似乎位于main.js中,异步执行应该不会有问题。也许你需要使用工厂模式Hi@VladKosko,有意义。。。使用Node实现它的最佳方式是什么?动态加载没有简单的方法?我的代码也是一种。import语句只允许在模块的顶层使用。要在其他任何地方导入,请使用
require
。为此,您需要一个导入声明,不能将导入声明放在交换机外壳内。不确定节点是否已经支持
import()
@PeterKrauss,但您无法对ES6模块执行同步动态导入。鉴于此代码似乎位于main.js中,异步执行应该不会有问题。您好,这是一个有效的解决方案,因为它可以工作(!),但它与“只需导入”的理念相反。。。旧的预编译解决方案会更好。如果在编译时不知道需要哪个类,就不能使用预编译解决方案。因此,所有模块都必须在运行时可用。但是如果你想要一个预编译器,这可能是你得到的最接近的:Use可以使用codeshift进行转换:Hi,是一个有效的解决方案,因为它可以工作(!),但它与“只导入必需的”理念相反。。。旧的预编译解决方案会更好。如果在编译时不知道需要哪个类,就不能使用预编译解决方案。因此,所有模块都必须在运行时可用。但是如果您想要一个预编译器,这可能是最接近的:Use可以使用codeshift进行转换: