我正在使用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访问)在这里就可以了。
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';
。
现代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(!),解释这个解决方案(参见问题评论)。