2015-04-14 1 views
2

Я ищу для создания системы модулей в своем приложении. Я не уверен в том, как реализовать следующее:Browserify ES6 - Dynamic Requires

Модуль 1

class SomethingModule { 

} 

export default SomethingModule; 

Модуль 2

class SomethingElseModule { 

} 

export default SomethingElseModule; 

Модуль загрузчика

class ModuleLoader { 

    load(module) { 
     // "module" could be "Something" which should create a 
     // new instance of "SomethingModule" 
     module = module + 'Module'; 
     // Require and create an instance of "module" 
    } 

} 

export default ModuleLoader; 

Главная Файл

var ModuleLoader = require('./ModuleLoader'); 

var loader = new ModuleLoader(); 
loader.load('SomethingElse'); 

Я довольно новыми для JavaScript и преобразованы в модульные понятия не имею, если это вообще возможно/осуществимо. Если нет, есть ли способ сделать это, вы бы предложили, не загрязняя глобальное пространство имен и ссылаясь на window[moduleName]?

+0

Почему вы хотите использовать глобальное пространство имен? Я предлагаю потребовать в вашем файле «загрузчик модуля» модули – bln

+0

@bln. Я этого не делаю. И требование отдельных модулей в «ModuleLoader» именно то, что я пытаюсь найти альтернативой. – Oyed

ответ

2

Если я хорошо понимаю вашу проблему, вы можете создать Map и загрузить модуль там:

class ModuleLoader { 
    constructor() { 
     this._modules = new Map(); 
    } 

    load(module) { 
     // you should check if the module exist in a good world to not get any error 
     // and probably adjust the path of what you are requiring 
     this._modules.set(module, new require(`${module}Module`)); 
    } 

    getModuleByName(name) { 
     return this._modules.get(name); 
    } 

} 

Edit: Чтобы заставить его работать с browserify, вам нужно будет иметь этот список всех модули где-то. Вы можете создать отдельный файл ModuleBag так:

//moduleBag.js 
import yourModule from './yourModule'; 
import yourSecondModule from './yourSecondModule'; 

var map = new Map(); 
map.set('yourModule', yourModule); 
map.set('yourSecondModule', yourSecondModule); 

export default class map; 

//moduleLoader.js 
import moduleBag from './moduleBag'; 
class ModuleLoader { 
     constructor() { 
      this._modules = new Map(); 
     } 

     load(module) { 
      var mod = moduleBag.get(module); 
      this._modules.set(module, new mod()); 
     } 

     getModuleByName(name) { 
      return this._modules.get(name); 
     } 

    } 

или просто положить его в том же файле. С этим browserify сможет загрузить все необходимые файлы.

+0

И это будет работать с Browserify? Поскольку 'require' является динамическим, будет ли он скомпилирован Browserify? – Oyed

+0

Не прямо, см. Мое редактирование – Pierrickouw