¿Por qué los navegadores de Internet modernos aún no admiten módulos ES6?

Sí, lo hay: todavía está evolucionando.

Si bien los cambios en el funcionamiento de los módulos se han calmado, todavía están cambiando. Recientemente se han realizado cambios para ayudar a acomodar a Node.JS en la implementación de módulos ES y la interoperabilidad con CommonJS. Es probable que esos cambios aún se estén discutiendo a pesar de que existen versiones de ES con alguna forma de módulos.

Webpack + Babel es genial, pero engaña. O solía hacerlo. El comportamiento con, por ejemplo, las importaciones predeterminadas, ha cambiado con el tiempo. En los módulos ES reales y actuales, si un módulo no exporta un símbolo predeterminado, no puede importar la biblioteca como un símbolo directamente, IE

importar Reaccionar desde “reaccionar”

Eso solo funciona si hay una exportación predeterminada, no es lo mismo que importar un módulo CommonJS. En cambio, tendrías que hacer:

importar * como reaccionar desde “reaccionar”

Pero, por supuesto, necesitaría React como módulos ES para comenzar incluso con esto.

Hay otra cosa más sutil: HTTP / 2

HTTP / 1.1 tiene un problema evidente y conocido: apesta a la concurrencia. Con los módulos ES en el navegador, el navegador descargará muchos archivos seguidos y la latencia terminará afectando los tiempos de carga peor que el rendimiento. Y sin el empuje del servidor HTTP / 2, su cliente aún debe pasar por el proceso de descarga de módulos para encontrar qué módulos importan.

Sigo escéptico de que los módulos es6 alguna vez reciban una adopción generalizada, y que muera silenciosamente en unos pocos años, cuando todos se den cuenta de que rompe demasiados códigos existentes en la web, al tiempo que no ofrece ninguno de los beneficios que promete. En su estado actual y previsible, los módulos es6 no aportan valor a nadie (ni al desarrollador ni al usuario final) y realmente es una solución en busca de un problema.

También para abordar algunos de los puntos que John Chadwick mencionó en su respuesta:

1)

Recientemente se han realizado cambios para ayudar a acomodar a Node.JS en la implementación de módulos ES y la interoperabilidad con CommonJS. Es probable que esos cambios aún se estén discutiendo a pesar de que existen versiones de ES con alguna forma de módulos.

según require vs ES6 import · Issue # 53 · nodejs / help, nodejs no ha hecho nada y solo está esperando que el equipo v8 de google haga un movimiento. Google casi admite que no lo implementarán en el corto plazo (porque es demasiado difícil y rompe demasiadas cosas) como se vio en 1569 – Implementar módulos de armonía – v8 – Monorriel.

2)

HTTP / 1.1 tiene un problema evidente y conocido: apesta en concurrencygolang.org

entonces no es concurrente. ¿A usted o a mí, como usuarios finales, realmente nos importa? no. ¿Es lo suficientemente importante como para justificar la ruptura de los sistemas de módulos actuales? no. Probablemente haya mejores maneras de introducir incrementalmente la concurrencia http, que ir con la ruta de cambio radical que los módulos es6 se han ido.

La “semántica” de los módulos ES6 se define en la especificación ES2015, pero la forma en que realmente se utilizan en las páginas web no lo es.

¿Qué significa esto?

Significa que ES2015 explica cómo usaría las palabras clave de importación y exportación, cómo extraen valores y objetos de otros módulos y la sintaxis en torno a todo eso. Pero lo que no explica es cómo se cargan realmente estos módulos. Es decir, ¿en qué orden cargan? ¿Cómo se hace referencia a uno desde HTML (se propuso un elemento )?

La especificación que definió esa parte está aquí: Loader

Observe cómo definen muchas API nuevas. Estos no solo le permiten importar y exportar utilizando la sintaxis ES2015, sino también importar dinámicamente módulos utilizando llamadas de función en tiempo de ejecución (algo así como scripts XHRing y eval ()).

ES2015 se implementa completamente en todos los principales navegadores, y todos implementan principalmente la gramática para las importaciones y exportaciones (aunque genera un error). Chrome y Firefox están trabajando activamente en la implementación de las especificaciones del cargador, y Edge debería hacer lo mismo pronto.