我正在使用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访问权限)在这里就可以了。
答案 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(!),以解释此解决方案(请参阅问题注释)。