无法使用require.context要求类

时间:2017-07-20 18:51:42

标签: webpack babeljs

我希望为用户创建一种在nodejs应用内扩展各种服务的简便方法。它使用electronwebpackbabel

我找到了一种动态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与他们合作?

1 个答案:

答案 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 */);