Uncaught RangeError: Maximum call stack size exceeded running grunt development

Uncaught RangeError: Maximum call stack size exceeded running grunt development

我收到这个错误:

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.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']);

非常感谢。

嗯,GruntJS FAQ 这么说,

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

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

请检查您是否犯了这样的错误。

希望对您有所帮助!

所以这意味着你已经超过了JS引擎允许的最大调用次数。这可能意味着两件事之一:

  1. 你在某个地方有一些无限递归循环——一个函数一直在调用自己而不用 breaking/exiting,或者甚至是一组函数以类似的方式在一个循环中互相调用。在某个时刻,引擎说够了,然后退出。
  2. 或者,如果您正在使用某种任务将文件(想想模板或 JSON)按行拆分为字符串并将它们连接在一起 Javascript,则可能您有一个文件的行数太多,以至于使用的 + 运算符的绝对数量导致堆栈大小溢出。在尝试将模拟数据注入 Karma 测试时,我自己已经 运行 自己进行了几次——显然 11,000 行加起来太多了。

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

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