(Cuando digo Angular, me refiero a Angular 2+ y diré explícitamente angular-js si menciono angular 1).
Preludio: es confuso
Angular, y probablemente con más precisión angular-cli, han combinado una serie de herramientas de tendencias en Javascript que están involucradas en el proceso de construcción. Conduce a un poco de confusión.
Para aumentar la confusión, el término compile
se usaba a menudo en angular-js para referirse al proceso de tomar el pseudo-html de la plantilla y convertirlo en elementos DOM. Eso es parte de lo que hace el compilador, pero una de las partes más pequeñas.
En primer lugar, no es necesario utilizar TypeScript, angular-cli o Webpack para ejecutar Angular. Para responder tu pregunta. Deberíamos mirar una pregunta simple: "¿Qué es Angular?"
Angular: ¿Qué hace?
Esta sección puede ser controvertida, veremos. En esencia, el servicio que proporciona Angular es un mecanismo de inyección de dependencia que funciona en Javascript, HTML y CSS. Escribes todos los pequeños fragmentos y piezas individualmente y en cada pequeña pieza sigues las reglas de Angular para hacer referencia a las otras piezas. Angular luego teje eso por completo de alguna manera.
Para ser (un poco) más específico:
- Las plantillas permiten conectar HTML al componente Javascript. Esto permite que la entrada del usuario en el DOM mismo (por ejemplo, haga clic en un botón) se alimente en el componente Javascript y también permite que las variables en el componente Javascript controlen la estructura y los valores en el DOM.
- Las clases de Javascript (incluidos los componentes de Javascript) deben poder acceder a instancias de otras clases de Javascript de las que dependen (por ejemplo, inyección de dependencia clásica). Un BookListComponent necesita una instancia de BookListService que podría necesitar una instancia de BookListPolicy o algo así. Cada una de estas clases tiene diferentes tiempos de vida (por ejemplo, los servicios son usualmente singletons, los componentes usualmente no son singletons) y Angular tiene que administrar todos esos tiempos de vida, la creación de los componentes y el cableado de las dependencias.
- Las reglas CSS debían cargarse de tal manera que solo se apliquen a un subconjunto del DOM (el estilo de un componente es local para ese componente).
Una cosa posiblemente importante a tener en cuenta es que Angular no es responsable de cómo los archivos Javascript hacen referencia a otros archivos Javascript (por ejemplo, la import
palabra clave). De eso se encarga Webpack.
¿Qué hace el compilador?
Ahora que sabe lo que hace Angular, podemos hablar sobre lo que hace el compilador. Evitaré ser demasiado técnico principalmente porque soy ignorante. Sin embargo, en un sistema de inyección de dependencias que normalmente tienen para expresar sus dependencias con algún tipo de metadatos (por ejemplo, ¿cómo puede un ejemplo de clase I can be injected
, My lifetime is blah
o You can think of me as a Component type of instance
). En Java, Spring originalmente hizo esto con archivos XML. Posteriormente, Java adoptó las anotaciones y se han convertido en la forma preferida de expresar metadatos. C # usa atributos para expresar metadatos.
Javascript no tiene un gran mecanismo para exponer estos metadatos incorporados. angular-js hizo un intento y no estuvo mal, pero había muchas reglas que no se podían verificar fácilmente y eran un poco confusas. Con Angular, hay dos formas compatibles de especificar los metadatos. Puede escribir Javascript puro y especificar los metadatos manualmente, algo similar a angular-js y simplemente seguir las reglas y escribir código adicional. Alternativamente, puede cambiar a TypeScript que, como sucede, tiene decoradores (esos @
símbolos) que se utilizan para expresar metadatos.
Así que aquí es donde finalmente podemos llegar al compilador. El trabajo del compilador es tomar esos metadatos y crear el sistema de piezas de trabajo que es su aplicación. Te concentras en todas las piezas y todos los metadatos y el compilador crea una gran aplicación interconectada.
¿Cómo lo hace el compilador?
El compilador puede funcionar de dos formas, en tiempo de ejecución y con anticipación. De aquí en adelante, asumiré que estás usando TypeScript:
- Tiempo de ejecución: cuando se ejecuta el compilador de mecanografiado, toma toda la información del decorador y la introduce en el código Javascript adjunto a las clases, métodos y campos decorados. En su
index.html
, hace referencia a su main.js
que llama al bootstrap
método. Ese método pasa a su módulo de nivel superior.
El método bootstrap enciende el compilador en tiempo de ejecución y le da una referencia a ese módulo de nivel superior. El compilador en tiempo de ejecución comienza a rastrear ese módulo, todos los servicios, componentes, etc. a los que hace referencia ese módulo, y todos los metadatos asociados, y crea su aplicación.
- AOT: en lugar de hacer todo el trabajo en tiempo de ejecución, Angular ha proporcionado un mecanismo para hacer la mayor parte del trabajo en tiempo de compilación. Esto casi siempre se hace usando un complemento de paquete web (este debe ser uno de los paquetes npm más populares pero menos conocidos). Se ejecuta después de que se haya ejecutado la compilación de mecanografiado, por lo que ve esencialmente la misma entrada que el compilador en tiempo de ejecución. El compilador AOT crea su aplicación como el compilador en tiempo de ejecución, pero luego la guarda en Javascript.
La ventaja aquí no es solo que puede ahorrar el tiempo de CPU requerido para la compilación en sí, sino que también le permite reducir el tamaño de su aplicación.
Respuestas específicas
Angular CLI Primero llama al compilador integrado angular escrito en Typescript => luego llama al Typecript Transpiler => luego llama al Webpack para empaquetar y almacenar en el directorio dist /.
No. Angular CLI llama a Webpack (el servicio real de Angular CLI es configurar webpack. Cuando lo ejecutas, ng build
no es mucho más que un proxy para iniciar Webpack). Webpack primero llama al compilador Typecript, luego al compilador angular (asumiendo AOT), todo mientras agrupa su código al mismo tiempo.
Aunque main.ts se usa en la Declaración anterior para explicar el proceso de arranque, ¿no se arranca la aplicación angular o se inicia con archivos Javascript .js?
No estoy del todo seguro de lo que pregunta aquí. main.ts
se transpilará en Javascript. Ese Javascript contendrá una llamada a la bootstrap
que es el punto de entrada a Angular. Cuando bootstrap
haya terminado, tendrá su aplicación Angular completa en ejecución.
Esta publicación dice que Angular tiene dos compiladores:
Ver compilador
Compilador de módulos
Para ser honesto, solo voy a afirmar ignorancia aquí. Creo que a nuestro nivel podemos pensar en todo como un gran compilador.
¿Alguien sabe cómo encajan todas las partes en profundidad?
Espero que lo anterior satisfaga esto.
Don't @ Me: Angular hace más que una inyección de dependencia
Por supuesto. Realiza enrutamiento, visualización de edificios, detección de cambios y todo tipo de cosas. El compilador en realidad genera Javascript para la creación de vistas y la detección de cambios. Mentí cuando dije que era solo una inyección de dependencia. Sin embargo, la inyección de dependencia está en el núcleo y es suficiente para impulsar el resto de la respuesta.
¿Deberíamos llamarlo compilador?
Probablemente hace mucho análisis y lectura y definitivamente genera una gran cantidad de código como resultado, por lo que podría llamarlo compilador por esa razón.
Por otro lado, en realidad no está traduciendo su código en simplemente una representación diferente. En su lugar, se trata de tomar un montón de diferentes piezas de código y tejerlas en piezas consumibles de un sistema más grande. El proceso de arranque luego (después de compilar, si es necesario) toma esas piezas y las conecta al núcleo angular.
The compiler does actually generate
Javascript` para la construcción de vistas y detección de cambios. Eso es lo que hace el compilador, ¿no? Y angular hace la inyección de dependencia.