è°è¯ Angular Stack Overflow è§£å³æ¹æ¡ | AIçæåç¿»è¯
é®é¢ï¼ æä»¬è½å¦æ´æ° ivy/index.js æºä»£ç ï¼å¨é£éè¾åºå æ ï¼ä»¥è°è¯ Angular è¿ç§»æé´ç âMaximum call stack size exceededâ é误ï¼ï¼
åçï¼
æ¯çââææ¯ä¸æ¯å¯è½çï¼ä½è¿é叏䏿¯ä¸ä¸ªå¥½æå®ç¨çè§£å³æ¹æ¡ã以䏿¯åå ï¼ä»¥åä½ å¯ä»¥åä»ä¹ã
为ä»ä¹ä¿®è¡¥ @ngtools/webpack/src/ivy/index.js å¾å°é¾ / 䏿¨è
- 该æä»¶ä½äº
node_modules/@ngtools/webpack/src/ivy/index.jså - 宿¯ç¼è¯/转è¯å çä¸é¨åââçæ£çé»è¾ä½äº Angular ä»åºä¸ç TypeScript æºä»£ç ä¸
- node_modules é叏卿¯æ¬¡
npm install/npm ciæ¶è¢«è¦ç - å³ä½¿ä½ 修补å®ï¼å¤§å¤æ°å¢éé½è®¤ä¸ºè¿æ¯ä¸ä¸ªç»´æ¤å©æ¢¦ï¼å¨ä¸æ¬¡
@angular-devkit/build-angularæ´æ°æ¶ä¼ä¸æï¼
è·åæ´å¥½å æ è·è¸ªçå®é æ¹æ³
-
æä½³ä¸æå¹²åçé项ï¼ä½¿ç¨ NODE_OPTIONS âstack-trace-limit
大夿°ç°ä»£ node çæ¬é½å°éæ¤æ å¿ï¼
# å å°è¯ 200â500ï¼ç¶å妿éè¦åæé« NODE_OPTIONS="--stack-trace-limit=300" ng build # æè æ´é« NODE_OPTIONS="--stack-trace-limit=1000" ng build --verboseè¿é叏伿¾ç¤ºé¢å¤ 5â15 个帧ï¼å¹¶é常åè¯ä½ åªä¸ªæä»¶ / ç¬¦å· / è£ é¥°å¨ / å¯¼å ¥å¯¼è´äºéå½ã
-
ä½¿ç¨ patch-package 临æ¶ä¿®è¡¥ï¼æå¯æ§çæ¹å¼ï¼
æ¥éª¤ï¼
npm install --save-dev patch-package- æå¼
node_modules/@ngtools/webpack/src/ivy/index.js - æ¾å°æåº RangeError çå°æ¹ï¼æç´¢ âMaximum call stack size exceededâï¼
-
åè¿æ ·æ¿æ¢ / å è£ å®ï¼
// åå§ä»£ç 大è´å¦ä¸ï¼ throw new Error("Maximum call stack size exceeded"); // æ¹ä¸ºï¼ const err = new Error("Maximum call stack size exceeded"); err.stack = new Error().stack; // æè·æ´å®æ´çå æ console.error("[IVY PATCH] Deep recursion detected"); console.error(err.stack); throw err; -
ç¶åè¿è¡ï¼
npx patch-package @ngtools/webpack - æäº¤çæç
patches/@ngtools+webpack+...patchæä»¶ - å¨ package.json ç scripts 䏿·»å
"postinstall": "patch-package"
â ç°å¨æ¯æ¬¡
npm installæ¶ï¼ä¿®è¡¥é½ä¼èªå¨åºç¨ã - æå¼
-
使ç¨è°è¯å¨è䏿¯ä¿®è¡¥
-
å¨ä½ ç
package.jsonscripts 䏿·»å ï¼"build:debug": "node --inspect-brk ./node_modules/@angular-devkit/build-angular/src/dev-server/index.js" -
æè æ´ç®åââä» ä»¥ inspect 模å¼è¿è¡æå»ºå¨ï¼
node --inspect-brk ./node_modules/.bin/ng build - æå¼ chrome://inspect â è¿æ¥ â å¨æåº âMaximum call stack size exceededâ çè¡ä¸è®¾ç½®æç¹
- å½å®æåæ¶ï¼å¨ Chrome DevTools 䏿¥çè°ç¨å æ
-
-
å¿«éä¸ç²ç³çæ¹æ³ â è¿è¡æ¶ monkey-patch
å建ä¸ä¸ªæä»¶
debug-ivy.jsï¼const originalError = Error; Error = function (...args) { const err = new originalError(...args); if (args[0]?.includes?.("Maximum call stack size exceeded")) { console.error("[DEBUG] Ivy recursion crash"); console.error(new originalError().stack); // æè·å¤é¨å æ console.error(err.stack); } return err; }; Error.prototype = originalError.prototype;ç¶åè¿è¡ï¼
node -r ./debug-ivy.js ./node_modules/.bin/ng build
æ»ç» â æ¨è顺åº
- é¦å
å°è¯ â
NODE_OPTIONS="--stack-trace-limit=500" ng build --verbose - 妿ä»ä¸è¶³ â 使ç¨
patch-package修补 ivy/index.jsï¼ææç»´æ¤ï¼ - 妿ççéè¦æ·±åº¦è°è¯ â 使ç¨
--inspect-brk+ Chrome è°è¯å¨ - é¿å ç´æ¥ç¼è¾ node_modules èä¸ç¨ patch-package
å¨ 95% çç宿¡ä¾ä¸ï¼äººä»¬å¨éè¿ --stack-trace-limit æ¥çé¢å¤ 30â50 ä¸ªå æ 帧åï¼å°±è½è§£å³åºå±å¾ªç¯å¯¼å
¥é®é¢ã
修补æºä»£ç æ¯å¯è½çââä½åºè¯¥æ¯ä½ çæåææ®µï¼è䏿¯é¦éã
åèï¼
- https://github.com/angular/angular-cli/issues?q=is%3Aissue+label%3A%22type%3A+bug%22+%22Maximum+call+stack%22
- https://stackoverflow.com/questions/73197135/angular-14-ng-serve-error-ngtools-webpack-src-ivy-index-js-error-maximum
