Lo que este último paso hará es tomar todos esos nombres explícitos de TS con puntos y convertirlos en importaciones con nombre. Entonces, esto se acerca mucho más a lo que realmente queremos al final del día. De hecho, si tomas el código y lo comparas con el estado original, lo único que habrá cambiado es la línea de importación en sí. El código a continuación es idéntico.
En este punto, el trabajo tedioso está hecho. Pero aún no hemos terminado, porque hay muchos cambios manuales que debemos hacer después de la transformación masiva. De hecho, hubo 29 commits. Obviamente, esto es un poco preocupante, ¿verdad? Porque cualquier cambio aguas arriba podría romper cualquiera de nuestras correcciones y tendríamos problemas. Pero afortunadamente, estábamos utilizando Git para gestionar esto. Entonces, cuando le pedimos a Git que aplique todos estos parches, nos dirá que el parche no se aplicó, ¿puedes solucionar el problema? Y luego continuamos con el rebase. Y luego le pedimos que muestre los parches. Los parches se almacenan con la herramienta de transformación, por lo que cuando llegue el momento, podemos ejecutar la herramienta y funciona.
Ahora, obviamente hay 29 cambios manuales, así que no puedo revisarlos todos. Pero hay algunos realmente interesantes. Primero que nada, estamos agrupando TypeScript usando ESBuild. Por diversas razones, TypeScript todavía quería enviar todo su código como estos grandes archivos agrupados. Antes, vimos que se producía mediante outfile y prepend, así que si queremos recrear esos mismos archivos en el nuevo TypeScript con módulos, necesitamos usar algún tipo de agrupador. Hay muchos agrupadores disponibles, no voy a intentar enumerarlos todos, pero elegí ESBuild. Obviamente, es muy, muy rápido, por lo que 200 milisegundos para construir TSC es realmente bueno. También tiene muchas características realmente geniales, como scope hoisting, que saca todo el código de los módulos de las personas y los lleva al nivel superior para que no tengas que hacerlo indirectamente. Hay tree shaking, que elimina el código muerto, y luego enum inlining. Entonces, cuando declaramos nuestros enums en nuestro compilador, se inyectan y se propagan por todo el código para que sea más rápido y no tenga que pasar por una búsqueda de objetos.
Ahora, obviamente, dependemos de un proyecto externo para agrupar nuestro código, y solo para asegurarnos de que aún podamos ejecutarnos en el trabajo, nuestra compilación tiene un modo alternativo llamado nobundle, y nos aseguramos de que podamos emitir todo nuestro código como common.js y que siga funcionando. Ahora, debido a que estamos utilizando esbuild para agrupar, no hay nadie que pueda agrupar los archivos DTS. Así que terminé creando mi propio agrupador DTS. Son alrededor de 400 líneas de código. Hay muchos otros agrupadores DTS disponibles, API extractor, TS up, rollup plugins, etc. Y todos son buenos a su manera, pero para nosotros, solo necesitábamos un subconjunto muy pequeño de las características. Específicamente, debido a que estábamos utilizando espacios de nombres, no teníamos conflictos de nombres. Por lo tanto, pudimos usar nuestro propio agrupador personalizado para ir un poco más rápido, pero también producir una salida que se parece mucho a nuestra salida anterior.
Comments