开发者问题收集

未捕获的 RangeError:运行 grunt 开发时超出最大调用堆栈大小

2017-01-12
2585

我收到此错误:

angular.js:4767 Uncaught RangeError: Maximum call stack size exceeded
    at Object.invoke (angular.js:4767)
    at angular.js:4574
    at forEach (angular.js:325)
    at createInjector (angular.js:4574)
    at doBootstrap (angular.js:1805)
    at bootstrap (angular.js:1826)
    at angularInit (angular.js:1711)
    at HTMLDocument.<anonymous> (angular.js:32539)
    at fire (jquery.js:3187)
    at Object.fireWith [as resolveWith] (jquery.js:3317)

我知道这不是我的代码中的循环,因为同一个项目在其他环境中运行良好,因此我怀疑问题出在我的 nodegrunt 上。

node v5.3.0
grunt v0.4.5
grunt-cli v1.2.0

这是用于 dev 的 grunt 命令:

grunt.registerTask('dev', ['ngconstant:dev', 'dom_munger:read', 'jshint', 'ngtemplates', 'less', 'connect', 'watch']);

packages.json

{
  "name": "myapp.maso.app",
  "version": "1.0.0-beta.172",
  "repository": {
    "type": "git",
    "url": ""
  },
  "devDependencies": {
    "chai": "^3.5.0",
    "chromedriver": "~2.21.2",
    "grunt": "~0.4.5",
    "grunt-angular-templates": "~1.0.3",
    "grunt-browser-output": "1.0.3",
    "grunt-connect-proxy": "^0.2.0",
    "grunt-contrib-clean": "~1.0.0",
    "grunt-contrib-concat": "~1.0.0",
    "grunt-contrib-connect": "~1.0.0",
    "grunt-contrib-copy": "~1.0.0",
    "grunt-contrib-cssmin": "~1.0.1",
    "grunt-contrib-htmlmin": "~1.1.0",
    "grunt-contrib-imagemin": "~1.0.0",
    "grunt-contrib-jshint": "~1.0.0",
    "grunt-contrib-less": "^1.2.0",
    "grunt-contrib-uglify": "~1.0.1",
    "grunt-contrib-watch": "~1.0.0",
    "grunt-dom-munger": "~3.4",
    "grunt-karma": "~0.12.2",
    "grunt-manifest": "^0.4.4",
    "grunt-ng-annotate": "^2.0.1",
    "grunt-ng-constant": "^2.0.1",
    "grunt-npm-install": "^0.3.1",
    "grunt-protractor-runner": "~3.0.0",
    "grunt-serve": "^0.1.6",
    "grunt-version": "^1.0.0",
    "jshint-stylish": "^2.1.0",
    "karma": "^0.13.22",
    "karma-chai": "^0.1.0",
    "karma-chrome-launcher": "~0.2.2",
    "karma-firefox-launcher": "~0.1.7",
    "karma-jasmine": "~0.3.8",
    "karma-mocha": "^0.2.2",
    "karma-mocha-reporter": "~2.0.0",
    "karma-ng-html2js-preprocessor": "^0.2.1",
    "karma-ng-json2js-preprocessor": "^1.1.2",
    "karma-phantomjs-launcher": "^1.0.0",
    "less": "^2.6.1",
    "load-grunt-tasks": "~3.4.1",
    "mocha": "^2.4.5",
    "protractor": "~3.2.1",
    "webdriver-manager": "~8.0.0"
  }
}

如果有人可以帮助我调试这个问题,我已经尝试了许多其他问题和 GitHub 问题,但仍然无法解决这个问题。

如果需要更多信息,请在下面发表评论。

编辑 - 我所有的 grunt 任务:

grunt.registerTask('dev', ['ngconstant:dev', 'dom_munger:read', 'jshint', 'ngtemplates', 'less', 'connect', 'watch']);
grunt.registerTask('live', ['ngconstant:live', 'dom_munger:read', 'jshint', 'ngtemplates', 'less', 'connect', 'watch']);

// isracard development environment
grunt.registerTask('devi', ['ngconstant:devi', 'dom_munger:read', 'jshint', 'less', 'connect', 'watch']);
grunt.registerTask('livei', ['ngconstant:livei', 'dom_munger:read', 'jshint', 'less', 'connect', 'watch']);
grunt.registerTask('forms', ['ngconstant:forms', 'dom_munger:read', 'jshint', 'less', 'connect', 'watch']);

// build
grunt.registerTask('build', ['ngconstant:live', 'version:project:prerelease', 'jshint', 'clean:before', 'less', 'dom_munger', 'ngtemplates', 'cssmin', 'concat', 'ngAnnotate', 'copy', 'htmlmin', 'manifest', 'clean:after']);

grunt.registerTask('test', ['ngconstant:mock', 'dom_munger:read', 'karma:all_tests']);
grunt.registerTask('e2e', ['dom_munger:read', 'protractor']);

非常感谢。

2个回答

好吧, GruntJS FAQ 说,

您可能创建了一个与常规任务同名的别名任务

示例: grunt.registerTask('uglify', ['uglify:my_target']); 应该是 grunt.registerTask('myUglify', ['uglify:my_target']);。

请检查您是否犯了此类错误。

希望这对您有帮助!

David R
2017-01-12

这意味着您已超出 JS 引擎允许的最大调用次数。这可能意味着以下两种情况之一:

  1. 您在某个地方有一些无限递归循环——一个函数不断调用自身而从未中断/退出,甚至一组函数以类似的方式循环调用彼此。在某个时候,引擎说够了,然后退出。
  2. 或者,如果您正在使用某种任务,将文件(如模板或 JSON)按行拆分为字符串并在 Javascript 中将它们连接在一起,则可能您的文件行数太多,以至于使用的 + 运算符数量过多导致堆栈大小溢出。我自己在尝试将模拟数据注入 Karma 测试时也遇到过几次这种情况——显然 11,000 行代码加在一起太多了。

不幸的是,除了尝试一点一点地隔离代码并查看是否可以追踪问题之外,没有其他很好的方法来测试这个问题。有一件事可能会有所帮助,那就是使用 node-inspector 工具,并在抛出错误之前将其设置为 break,就像在 Chrome 中一样——然后您可以调查调用堆栈,看看是否可以通过追溯来了解任何东西。祝你好运!

(请注意,这不是一个 独家 列表——可能还有其他原因——这些只是我最常遇到的两个)。

Alexander Nied
2017-01-12