Как динамически выбрать модуль с современным nodeJS? - PullRequest
0 голосов
/ 03 марта 2019

Я использую 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';
}

ОШИБКАon import MyClass: неожиданный идентификатор

PS: работает нормально при использовании изолированный import MyClass from './MyClass-v3.mjs';.


ПРИМЕЧАНИЕ: const MyClass = require('./MyClass-v3.mjs') не работает с современным Javascript.( ReferenceError: require не определен ).Файл имеет только определение класса,

export default class MyClass { ... }

PS: нет ничего похожего на C_preprocessor для NodeJs?Старый прекомпилятор (с некоторым доступом к argv) будет в порядке.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Современные реализации Javascript (ES6 +) находятся в стадии разработки, некоторые синтаксисы работают с NodeJS (node --experimental-modules) и хорошими браузерами , другие нет.

Это единственный способ сделатьбез стоимости «загрузить все» (см. решение @Markus), но с затратами на неглобальный импорт, требуется некрасивый блок для определения области действия и асинхронной операции ... Первый шаг - понять базовый синтаксис блока импорта:

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 (!) За объяснение этого решения (см. Комментарии к вопросу).

0 голосов
/ 03 марта 2019
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';.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...