javascript - promesas - Módulos asíncronos ES6 que utilizan múltiples baseurls
funciones asincronas jquery (2)
El sistema de módulos ES6 parece ser el adecuado para unificar las sintaxis CommonJs / AMD. Como usuario de requireJs / AMD me gustaría convertir a módulos ES6 (usando babel.js por el momento).
Parece que hay un problema; Al leer los documentos y tutoriales, no parece posible cargar paquetes de módulos que dependan de más de una baseurl. Usando requireJs esto se puede resolver usando el campo de context
:
// async dependencies are loaded from http://path/to/domain
var contextedRequire1 = require.config({
baseUrl: ''http://path/to/domain/js'',
context: ''mainContext''
});
// async dependencies are located on http://path/to/otherdomain
var contextRequire2 = require.config({
baseUrl: ''http://path/to/otherdomain/js'',
context: ''pluginContext''
});
contextedRequire1([''main.js''], function(main){
// loaded using http://path/to/domain/js/main.js
contextedRequire2([''plugin-lazyloading-deps.js''], function(plugin){
plugin.init();
});
});
En main.js
define([''main-deps''], function(mainDeps){
// loaded using http://path/to/domain/js/main-deps.js
})
En plugin-lazyloading-deps.js
define([''require''], function(require){
// loaded using http://path/to/otherdomain/js/plugin-lazyloading-deps.js
if(Modernizr.touch) {
require([''hammer''], function(){
// loaded using http://path/to/otherdomain/js/hammer.js
hammer.init();
})
}
})
En el módulo asíncrono ES6, esto no es posible, ya que el System
es un singleton
System.baseURL = "http://path/to/domain/js";
System.import("main").then(function(main){
// loaded using http://path/to/domain/js/main.js
// This will potentially break when main.js tries to load hammer.js from http://path/to/domain/js
System.baseURL = "http://path/to/otherdomain/js";
System.import("plugin-lazyloading-deps").then(function(){ /** code **/ });
});
Mi pregunta es: ¿hay algo en los documentos que haya pasado por alto (es posible que la subclase Sistema pueda configurar varias basesUrls), o esto está en proceso para futuras extensiones de módulos?
Al menos con la versión actual de SystemJS, puede proporcionar rutas de comodines. https://github.com/systemjs/systemjs/wiki/Configuration-Options#paths-unstable
No lo he usado, pero para tu caso, parece que harías
System.baseURL = ''http://path/to/domain/js'';
System.paths[''plugin-*''] = ''http://path/to/otherdomain/js/plugin-*'';
Parece como si System.js tuviera una forma (no documentada) extendiendo el objeto System utilizando Object.create(System)
.
var context1 = Object.create(System);
context1.baseURL = ''http://path/to/otherdomain/js'';
context1.import(''plugin-lazyloading-deps'').then(function(m){
m.setSystem(context1);
m.initialize();
));
Tenga en cuenta que hasta que el objeto System se implemente en browsers / nodeJs, este enfoque puede romperse. Sin embargo, con suerte, el mismo efecto puede lograrse utilizando el class context1 extends System
en ES6.
La implementación no es 100% análoga a requireJs, ya que no es posible inyectar el contexto actual para cargar de forma asíncrona otros módulos desde un contexto de ámbito (es decir, la dependencia ''require'' debe ser reemplazada por m.setSystem(..)
o similar).