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

问题描述 投票:0回答:2

我正在使用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:使用隔离的import MyClass from './MyClass-v3.mjs';时工作正常。


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

export default class MyClass { ... }

PS:NodeJs没有像C_preprocessor那样的东西吗?一个旧的预编译器(有一些argv访问)在这里就可以了。

node.js ecmascript-6
2个回答
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';


0
投票

现代Javascript(ES6 +)实现正在构建中,一些语法正在使用NodeJS(node --experimental-modules)和良好的浏览器,其他不是。

这是没有“加载所有”成本的唯一方法(参见@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(!),解释这个解决方案(参见问题评论)。

© www.soinside.com 2019 - 2024. All rights reserved.