执行ng build --prod失败:调用栈大小超出上限(ag-grid相关)
Problem Description
When running ng build --prod for an Angular project using ag-grid, the build fails with a RangeError: Maximum call stack size exceeded originating from the gridOptionsWrapper.js module in ag-grid. Here's the relevant build log:
==> ng build --prod Date: 2018-06-01T10:20:07.564Z Hash: e43a7d775a617f72e760 Time: 84869ms chunk {scripts} scripts.385b291e179030219400.bundle.js (scripts) 137 kB [initial] [rendered] chunk {0} main.eb9c978f12021c39965e.bundle.js (main) 2.22 MB [initial] [rendered] chunk {1} polyfills.c9bd3d92b786a9531262.bundle.js (polyfills) 166 kB [initial] [rendered] chunk {2} styles.e270cced36800690ed11.bundle.css (styles) 307 kB [initial] [rendered] chunk {3} inline.318b50c57b4eba3d437b.bundle.js (inline) 796 bytes [entry] [rendered] ERROR in ./node_modules/ag-grid/dist/lib/gridOptionsWrapper.js Module build failed: RangeError: Maximum call stack size exceeded at Object.forEachChild (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:12719:26) at traverse (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:29674:110) at visitNode (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:12690:24) at Object.forEachChild (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:12821:24) at traverse (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:29674:110) at visitNode (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:12690:24) at Object.forEachChild (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:12915:24) at traverse (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:29674:110) at visitNodes (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:12699:30) at Object.forEachChild (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:12875:24) at traverse (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:29674:110) at containsArgumentsReference (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:29657:56) at getSignatureFromDeclaration (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:29618:84) at getSignaturesOfSymbol (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:29708:37) at resolveAnonymousTypeMembers (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:28899:43) at resolveStructuredTypeMembers (/home/jhalliley/work/my-ui/node_modules/@angular-devkit/build-optimizer/node_modules/typescript/lib/typescript.js:29031:25)
Solutions to Fix the Build
Here are several proven ways to resolve this issue:
1. Disable Build Optimizer Temporarily
The Angular build-optimizer gets stuck in infinite recursion when processing ag-grid's type definitions. You can bypass this by disabling it:
- Command Line: Run the build with the
--build-optimizer=falseflag:ng build --prod --build-optimizer=false - Configuration File: For older Angular versions using
.angular-cli.json, modify thedefaults.buildsection:
For newer versions using"defaults": { "build": { "buildOptimizer": false } }angular.json, update theproductionconfiguration underprojects.[your-project].architect.build.configurations:"production": { "buildOptimizer": false // ... other existing configs }
2. Upgrade ag-grid to a Compatible Version
This issue comes from circular references in ag-grid's type definitions that the build-optimizer couldn't handle. Later versions of ag-grid fixed this problem. Upgrade your ag-grid packages (both ag-grid and ag-grid-angular if using the Angular wrapper) to a version released after mid-2018 (e.g., v20.x or later, matching your Angular version compatibility).
3. Skip Third-Party Library Type Checks
Tell TypeScript to skip type checking for external libraries to avoid the stack overflow caused by ag-grid's problematic type definitions. Add this to your tsconfig.json:
"compilerOptions": { // ... other options "skipLibCheck": true }
Issue Attribution
This is a compatibility issue between ag-grid and Angular's build-optimizer, not a bug in ng build itself. The root cause was circular references in ag-grid's type definitions that triggered infinite recursion in the build-optimizer's TypeScript processing logic. Later versions of ag-grid addressed these circular references, and newer build-optimizer versions also improved handling for such cases.
内容的提问来源于stack exchange,提问作者Tom Halliley

