{"record":{"id":"fcad793998e42cc3","repo":"angular/angular-cli","slug":"the-buildoptimizer-option-cannot-be-used-without","errorCode":null,"errorMessage":"The 'buildOptimizer' option cannot be used without 'aot'.","messagePattern":"The 'buildOptimizer' option cannot be used without 'aot'\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/angular_devkit/build_angular/src/utils/webpack-browser-config.ts","lineNumber":41,"sourceCode":"export type BrowserWebpackConfigOptions = WebpackConfigOptions<NormalizedBrowserBuilderSchema>;\n\nexport type WebpackPartialGenerator = (\n  configurationOptions: BrowserWebpackConfigOptions,\n) => (Promise<Configuration> | Configuration)[];\n\nexport async function generateWebpackConfig(\n  workspaceRoot: string,\n  projectRoot: string,\n  sourceRoot: string | undefined,\n  projectName: string,\n  options: NormalizedBrowserBuilderSchema,\n  webpackPartialGenerator: WebpackPartialGenerator,\n  logger: BuilderContext['logger'],\n  extraBuildOptions: Partial<NormalizedBrowserBuilderSchema>,\n): Promise<Configuration> {\n  // Ensure Build Optimizer is only used with AOT.\n  if (options.buildOptimizer && !options.aot) {\n    throw new Error(`The 'buildOptimizer' option cannot be used without 'aot'.`);\n  }\n\n  const tsConfigPath = path.resolve(workspaceRoot, options.tsConfig);\n  const tsConfig = await readTsconfig(tsConfigPath);\n\n  const buildOptions: NormalizedBrowserBuilderSchema = { ...options, ...extraBuildOptions };\n  const wco: BrowserWebpackConfigOptions = {\n    root: workspaceRoot,\n    logger: logger.createChild('webpackConfigOptions'),\n    projectRoot,\n    sourceRoot,\n    buildOptions,\n    tsConfig,\n    tsConfigPath,\n    projectName,\n  };\n\n  wco.buildOptions.progress = defaultProgress(wco.buildOptions.progress);","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/angular_devkit/build_angular/src/utils/webpack-browser-config.ts#L23-L59","documentation":"generateWebpackConfig enforces that Build Optimizer (a TypeScript/Angular transform that only makes sense with ahead-of-time compilation) is never enabled when the AOT compilation flag is off. The check happens before any webpack configuration is generated, so the build fails fast at configuration time. It is a pure options-validation guard, not a runtime failure.","triggerScenarios":"Setting buildOptimizer: true in the builder options (angular.json target options, CLI --build-optimizer flag) while aot is false or omitted where the default is false.","commonSituations":"Mixing flags like `ng build --aot=false --build-optimizer`, inheriting target options in angular.json where one target sets buildOptimizer and another disables aot, copy-pasted configurations from JIT-mode setups.","solutions":["Enable AOT: add \"aot\": true next to \"buildOptimizer\": true in the configuration","Remove the buildOptimizer option if you intentionally need a JIT build (Build Optimizer is meaningless in JIT)","Split configurations: keep a production configuration with aot+buildOptimizer and a separate JIT configuration without it"],"exampleFix":"// angular.json before\n\"buildOptimizer\": true\n// after\n\"aot\": true,\n\"buildOptimizer\": true","handlingStrategy":"validation","validationCode":"function assertBuildOptimizerNeedsAot(options: { aot?: boolean; buildOptimizer?: boolean }) {\n  if (options.buildOptimizer && !options.aot) {\n    throw new Error(\"The 'buildOptimizer' option cannot be used without 'aot'.\");\n  }\n}\n// run on your resolved angular.json options before scheduling the build","typeGuard":"function canUseBuildOptimizer(o: { aot?: boolean; buildOptimizer?: boolean }): o is { aot: true; buildOptimizer?: boolean } {\n  return !o.buildOptimizer || o.aot === true;\n}","tryCatchPattern":"try {\n  await scheduleBuild(target, options);\n} catch (e) {\n  if ((e as Error).message.includes(\"cannot be used without 'aot'\")) {\n    // fix angular.json: set aot true or drop buildOptimizer\n  }\n  throw e;\n}","preventionTips":["Define buildOptimizer only in production configurations that already set aot: true","Lint angular.json with a custom schema check forbidding buildOptimizer without aot","Avoid mixing JIT-era flags into AOT-era configurations when upgrading"],"tags":["configuration","aot","build-optimizer","angular-cli"],"backgroundTag":"incompatible-build-options","analyzedSha":"bb72145f9ab45aee29f523236b3a25cd0813a841","analyzedAt":"2026-08-30T02:47:34.745Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}