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进行转换: