Hice ng build -prod y encontré un error extraño que es _zone_symbol__error :
Error: Uncaught (in promise): Error: Runtime compiler is not loaded Error: Runtime compiler is not loaded at d (http://localhost:4200/polyfills.cd321326a3dfc08ceb46.bundNo estoy usando el compilador manualmente en mi aplicación. Y lo más raro es que el error parece provenir de los polyfills. Como puedo resolver esto?
En mi caso, funciona para deshabilitar la compilación anticipada para la compilación
ng build -prod --aot=falseDe esta manera, la fuente todavía está empaquetada y fea y se incluye el compilador Just-in-Time.
El archivo main.bundle js es más pequeño que cuando se utiliza una compilación aot, pero el archivo vendor.bundle js aumenta aproximadamente 1,5 MB.
Editar 2018-07-11
Parece que hay dos casos:
1) Si su proyecto crea intencionalmente verdaderos componentes dinámicos, actualmente la única forma de incluir el compilador JIT parece deshabilitar AOT para la compilación de producción. Ver https://github.com/angular/angular/issues/11780 para una discusión
2) Si su proyecto no necesita crear componentes dinámicamente y no sabe por qué ocurre el error, deshabilitar AOT puede ser una solución , pero tenga cuidado con los inconvenientes. Sin AOT, tiene archivos de mayor tamaño y el usuario tarda más en comenzar con su aplicación. En este caso, puede ser más apropiado investigar por qué se hace referencia al compilador JIT en la compilación de producción.
Hay algunas discusiones SO ( AngularCli y AOT: ERROR Error: el compilador de tiempo de ejecución no está cargado ,solución de problemas "El compilador de tiempo de ejecución no está cargado" ) en torno a las cuales sugieren que la carga diferida de un módulo de terceros que usa 'COMPILER_PROVIDERS' puede ser el motivo de la error. Sin embargo, al momento de escribir no tienen una respuesta aceptada.
Para la descripción de otra trampa al usar módulos de carga diferida, vea la respuesta de Alexei en este hilo
Nigromancia... Recibí el mismo error sin un uso explícito del compilador, por lo que me tomó un tiempo entender lo que estaba pasando.
Al realizar la carga diferida de algunos módulos, AOT parece tener problemas para determinar cuáles son los módulos necesarios , como se indica en este hilo . El resultado es que la compilación final no incluirá esos módulos y, cuando se necesiten, la aplicación intentará compilarlos sobre la marcha y fallará porque el compilador no está disponible.
La solución se proporciona aquí y para mí funcionó así:
export function getSomeModule() { return SomeModule; } export const routes: Routes = [ // some routes here { path: "some", loadChildren: "./some/some.module#SomeModule" } ]; Entonces, se indica la ruta al módulo y también AOT conocerá SomeModule a través de la función getSomeModule (que no se usa en el código, pero ayuda a AOT a incluir el módulo).
Esto sucede en @angular/cli@1.0.0-rc.2 cuando se realiza una compilación de producción ( ng build -prod ) mientras se usa la clase de compiler en su código.
Para reemplazar el compiler , querrá usar la "creación dinámica de componentes". Ver este SO:
.
Pude deshacerme de esto comparando mi proyecto @angular/cli@1.0.0-rc2 con un proyecto CLI recién creado y noté que polyfills.ts no se importó en ningún lugar excepto en .angular-cli.json
Por ejemplo, estaba importando polyfills.ts en main.ts
import 'polyfills.ts'; // Remove this line import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; if (environment.production) { enableProdMode(); } platformBrowserDynamic().bootstrapModule(AppModule); Polyfill.ts solo necesita estar en .angular-cli.json aquí:
... "index": "index.html", "main": "main.ts", "polyfills": "polyfills.ts", "test": "test.ts", "tsconfig": "tsconfig.app.json", ...Duplicar: