我希望为用户创建一种在nodejs
应用内扩展各种服务的简便方法。它使用electron
,webpack
和babel
。
我找到了一种动态require
给定文件夹中每个文件的方便方法:
// At the top of my class file
const thing_files = require.context('./things', false, /\.js$/)
// In my class constructor
this.things = {};
thing_files.keys().forEach(key => {
try {
this.things[key.replace(/(\.\/|\.js)/g, '')] = thing_files(key).default; // edit: also tried default()
} catch(err) {
process.send({message:`unable to add thing ${key}`});
}
});
这适用于如下所示的文件:
export default {
getName() {
return 'thangythang';
}
}
但是,导出课程时它不起作用:
import Thing from "../base-thing";
export default class extends Thing {
constructor() {
super();
}
getName() {
return 'thangythang';
}
}
也没有命名类:
export default class ThingOne extends Thing {
当我require
符合预期时,这些类别可以正常工作:
const ThingOne = require('./things/thing-one')
var thing = new ThingOne.default();
process.send({message:`thing: ${thing.getName()}`}); // thing: thangythang
如何使用webpack
' require.context
与他们合作?
答案 0 :(得分:0)
在玩弄各种东西后,我意识到:
export default {}
基本上会将Object
分配给default
,而export default class ThingOne
则不会。考虑到这一点,我将我的类文件更改为以下内容:
import Thing from "../base-thing";
class ThingOne extends Thing {
constructor() {
super();
}
getName() {
return 'thangythang';
}
}
export default new ThingOne();
哪个也有效。但是,我想要一些更健壮的以防万一我需要在构造期间传递参数,或者创建多个类的实例。在playing围绕with实例化类的替代方法之后,我遇到了一个有效的解决方案!
this.things[key.replace(/(\.\/|\.js)/g, '')] = new (thing_files(key).default)(/* args */);