webpack - Orden de carga de módulos incorrecto con la opción del compilador de TypeScript "module": "es2015"
Estamos usando WebPack 3.10.0 con awesome-typescript-loader 3.4.1 (la versión de TS es 2.6.2). Fragmento relevante:
const win = <any>window;
...
console.log('jQuery before', {import: jQuery, win$: win.$, winJQuery: win.jQuery});
import * as jQuery from 'jquery';
win.jQuery = win.$ = jQuery;
console.log('jQuery after', {import: jQuery, win$: win.$, winJQuery: win.jQuery});
...
import 'bootstrap';
En el código real hay unas pocas líneas entre la carga de jQuery y Bootstrap. Sin estas líneas, Bootstrap no se iniciará (poniendo instancias ficticias de tether y popper en un objeto window para no desperdiciar ancho de banda, ya que no estamos usando nada de Bootstrap que use estas bibliotecas).
"module": "commonjs"
Bootstrap empieza bien, el registro contiene el resultado esperado:
jQuery before {import: undefined, win$: undefined, winJQuery: undefined}
jQuery after {import: ƒ, win$: ƒ, winJQuery: ƒ}
"module": "es2015"
Bootstrap se bloquea con:
Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.
Cuando se elimina la importación de Bootstrap, se produce el siguiente registro:
jQuery before {import: ƒ, win$: undefined, winJQuery: undefined}
jQuery after {import: ƒ, win$: ƒ, winJQuery: ƒ}
Observe que la importación de jQuery se imprime desde el "futuro", porque en el momento de ejecutar "jQuery antes" aún no debería haberse importado.
Pregunta
Sospecho que las importaciones en es2015 se elevan, lo cual no tiene mucho sentido cuando uno importa solo por efectos secundarios.
¿Cómo hacer que las importaciones respeten el orden en el que están en el código al usar "module": "es2015"?
O si esto no es posible, ¿hay alguna otra forma de posponer la carga de algún módulo (por ejemplo, Bootstrap) hasta que se ejecute el código, para que pueda configurar el entorno adecuado que el módulo espera?
Respuesta #1
Puedes usar require('') si quieres diferir la carga de un módulo, esto no se elevará