javascript - node - Pasar opciones a las importaciones del módulo ES6
patron modulo javascript (4)
Concepto
Aquí está mi solución usando ES6
Muy en línea con la respuesta de @Bergi, esta es la "plantilla" que uso al crear importaciones que necesitan parámetros aprobados para class
declaraciones de class
. Esto se usa en un marco isomorfo que estoy escribiendo, por lo que funcionará con un transpiler en el navegador y en node.js (yo uso Babel
con Webpack
):
./MyClass.js
export default (Param1, Param2) => class MyClass {
constructor(){
console.log( Param1 );
}
}
./main.js
import MyClassFactory from ''./MyClass.js'';
let MyClass = MyClassFactory(''foo'', ''bar'');
let myInstance = new MyClass();
Lo anterior generará foo
en una consola
EDITAR
Ejemplo de mundo real
Para un ejemplo del mundo real, estoy usando esto para pasar un espacio de nombres para acceder a otras clases e instancias dentro de un marco. Debido a que simplemente estamos creando una función y pasando el objeto como un argumento, podemos usarlo con nuestra declaración de clase likeso:
export default (UIFramework) => class MyView extends UIFramework.Type.View {
getModels() {
// ...
UIFramework.Models.getModelsForView( this._models );
// ...
}
}
La importación es un poco más complicada y automagical
en mi caso dado que es un marco completo, pero esencialmente esto es lo que está sucediendo:
// ...
getView( viewName ){
//...
const ViewFactory = require(viewFileLoc);
const View = ViewFactory(this);
return new View();
}
// ...
¡Espero que esto ayude!
¿Es posible pasar opciones a las importaciones de ES6?
Cómo traduces esto:
var x = require(''module'')(someoptions);
a ES6?
Basándose en la answer @ Bergi para usar el módulo de depuración con es6 sería la siguiente
// original
var debug = require(''debug'')(''http'');
// ES6
import * as Debug from ''debug'';
const debug = Debug(''http'');
// Use in your code as normal
debug(''Hello World!'');
Creo que puedes usar los cargadores de módulos es6. http://babeljs.io/docs/learn-es6/
System.import("lib/math").then(function(m) {
m(youroptionshere);
});
No hay forma de hacer esto con una sola declaración de import
, no permite las invocaciones.
Entonces no lo llamarías directamente, pero básicamente puedes hacer exactamente lo mismo que commonjs con las exportaciones predeterminadas:
// module.js
export default function(options) {
return {
// actual module
}
}
// main.js
import m from ''module'';
var x = m(someoptions);
Alternativamente, si usa un cargador de módulos compatible con las promesas monadic , es posible que pueda hacer algo como
System.import(''module'').ap(someoptions).then(function(x) {
…
});
Con el nuevo 2ality.com/2017/01/import-operator.html podría convertirse en
const promise = import(''module'').then(m => m(someoptions));
o
const x = (await import(''module''))(someoptions)
sin embargo, probablemente no desee una importación dinámica, sino una estática.