0

我已经使用Yeoman的Angular生成器构建了一个角度应用,该应用完美地在本地运行。但是,在部署到heroku时,什么也没有显示出来。控制台错误是“Uncaught TypeError:'caller','callee'和'arguments'属性可能无法在严格模式函数或调用它们的参数对象上访问”。'Caller','Callee',使用Yeoman部署的Angular应用严格模式错误

我想我已经将它追溯到Grunt构建任务,它将所有js文件和html文件一起缩小。有没有一种方法可以将js简化为单个文件,而不是缩小以避免这些问题?

这里是我的Gruntfile.js

// Generated on 2014-11-18 using generator-angular-fullstack 2.0.13 
'use strict'; 

module.exports = function (grunt) { 
    var localConfig; 
    try { 
    localConfig = require('./server/config/local.env'); 
    } catch(e) { 
    localConfig = {}; 
    } 

    // Load grunt tasks automatically, when needed 
    require('jit-grunt')(grunt, { 
    express: 'grunt-express-server', 
    useminPrepare: 'grunt-usemin', 
    ngtemplates: 'grunt-angular-templates', 
    cdnify: 'grunt-google-cdn', 
    protractor: 'grunt-protractor-runner', 
    injector: 'grunt-asset-injector', 
    buildcontrol: 'grunt-build-control' 
    }); 

    // Time how long tasks take. Can help when optimizing build times 
    require('time-grunt')(grunt); 

    // Define the configuration for all the tasks 
    grunt.initConfig({ 

// Project settings 
pkg: grunt.file.readJSON('package.json'), 
yeoman: { 
    // configurable paths 
    client: require('./bower.json').appPath || 'client', 
    dist: 'dist' 
}, 
express: { 
    options: { 
    port: process.env.PORT || 9000 
    }, 
    dev: { 
    options: { 
     script: 'server/app.js', 
     debug: true 
    } 
    }, 
    prod: { 
    options: { 
     script: 'dist/server/app.js' 
    } 
    } 
}, 
open: { 
    server: { 
    url: 'http://localhost:<%= express.options.port %>' 
    } 
}, 
watch: { 
    injectJS: { 
    files: [ 
     '<%= yeoman.client %>/{app,components}/**/*.js', 
     '!<%= yeoman.client %>/{app,components}/**/*.spec.js', 
     '!<%= yeoman.client %>/{app,components}/**/*.mock.js', 
     '!<%= yeoman.client %>/app/app.js'], 
    tasks: ['injector:scripts'] 
    }, 
    injectCss: { 
    files: [ 
     '<%= yeoman.client %>/{app,components}/**/*.css' 
    ], 
    tasks: ['injector:css'] 
    }, 
    mochaTest: { 
    files: ['server/**/*.spec.js'], 
    tasks: ['env:test', 'mochaTest'] 
    }, 
    jsTest: { 
    files: [ 
     '<%= yeoman.client %>/{app,components}/**/*.spec.js', 
     '<%= yeoman.client %>/{app,components}/**/*.mock.js' 
    ], 
    tasks: ['newer:jshint:all', 'karma'] 
    }, 
    injectSass: { 
    files: [ 
     '<%= yeoman.client %>/{app,components}/**/*.{scss,sass}'], 
    tasks: ['injector:sass'] 
    }, 
    sass: { 
    files: [ 
     '<%= yeoman.client %>/{app,components}/**/*.{scss,sass}'], 
    tasks: ['sass', 'autoprefixer'] 
    }, 
    gruntfile: { 
    files: ['Gruntfile.js'] 
    }, 
    livereload: { 
    files: [ 
     '{.tmp,<%= yeoman.client %>}/{app,components}/**/*.css', 
     '{.tmp,<%= yeoman.client %>}/{app,components}/**/*.html', 
     '{.tmp,<%= yeoman.client %>}/{app,components}/**/*.js', 
     '!{.tmp,<%= yeoman.client %>}{app,components}/**/*.spec.js', 
     '!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.mock.js', 
     '<%= yeoman.client %>/assets/images/{,*//*}*.{png,jpg,jpeg,gif,webp,svg}' 
    ], 
    options: { 
     livereload: true 
    } 
    }, 
    express: { 
    files: [ 
     'server/**/*.{js,json}' 
    ], 
    tasks: ['express:dev', 'wait'], 
    options: { 
     livereload: true, 
     nospawn: true //Without this option specified express won't be reloaded 
    } 
    } 
}, 

// Make sure code styles are up to par and there are no obvious mistakes 
jshint: { 
    options: { 
    jshintrc: '<%= yeoman.client %>/.jshintrc', 
    reporter: require('jshint-stylish') 
    }, 
    server: { 
    options: { 
     jshintrc: 'server/.jshintrc' 
    }, 
    src: [ 
     'server/**/*.js', 
     '!server/**/*.spec.js' 
    ] 
    }, 
    serverTest: { 
    options: { 
     jshintrc: 'server/.jshintrc-spec' 
    }, 
    src: ['server/**/*.spec.js'] 
    }, 
    all: [ 
    '<%= yeoman.client %>/{app,components}/**/*.js', 
    '!<%= yeoman.client %>/{app,components}/**/*.spec.js', 
    '!<%= yeoman.client %>/{app,components}/**/*.mock.js' 
    ], 
    test: { 
    src: [ 
     '<%= yeoman.client %>/{app,components}/**/*.spec.js', 
     '<%= yeoman.client %>/{app,components}/**/*.mock.js' 
    ] 
    } 
}, 

// Empties folders to start fresh 
clean: { 
    dist: { 
    files: [{ 
     dot: true, 
     src: [ 
     '.tmp', 
     '<%= yeoman.dist %>/*', 
     '!<%= yeoman.dist %>/.git*', 
     '!<%= yeoman.dist %>/.openshift', 
     '!<%= yeoman.dist %>/Procfile' 
     ] 
    }] 
    }, 
    server: '.tmp' 
}, 

// Add vendor prefixed styles 
autoprefixer: { 
    options: { 
    browsers: ['last 1 version'] 
    }, 
    dist: { 
    files: [{ 
     expand: true, 
     cwd: '.tmp/', 
     src: '{,*/}*.css', 
     dest: '.tmp/' 
    }] 
    } 
}, 

// Debugging with node inspector 
'node-inspector': { 
    custom: { 
    options: { 
     'web-host': 'localhost' 
    } 
    } 
}, 

// Use nodemon to run server in debug mode with an initial breakpoint 
nodemon: { 
    debug: { 
    script: 'server/app.js', 
    options: { 
     nodeArgs: ['--debug-brk'], 
     env: { 
     PORT: process.env.PORT || 9000 
     }, 
     callback: function (nodemon) { 
     nodemon.on('log', function (event) { 
      console.log(event.colour); 
     }); 

     // opens browser on initial server start 
     nodemon.on('config:update', function() { 
      setTimeout(function() { 
      require('open')('http://localhost:8080/debug?port=5858'); 
      }, 500); 
     }); 
     } 
    } 
    } 
}, 

// Automatically inject Bower components into the app 
wiredep: { 
    target: { 
    src: '<%= yeoman.client %>/index.html', 
    ignorePath: '<%= yeoman.client %>/', 
    exclude: [/bootstrap-sass-official/, /bootstrap.js/, '/json3/', '/es5-shim/', /bootstrap.css/, /font-awesome.css/ ] 
    } 
}, 

// Renames files for browser caching purposes 
rev: { 
    dist: { 
    files: { 
     src: [ 
     '<%= yeoman.dist %>/public/{,*/}*.js', 
     '<%= yeoman.dist %>/public/{,*/}*.css', 
     '<%= yeoman.dist %>/public/assets/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', 
     '<%= yeoman.dist %>/public/assets/fonts/*' 
     ] 
    } 
    } 
}, 

// Reads HTML for usemin blocks to enable smart builds that automatically 
// concat, minify and revision files. Creates configurations in memory so 
// additional tasks can operate on them 
useminPrepare: { 
    html: ['<%= yeoman.client %>/index.html'], 
    options: { 
    dest: '<%= yeoman.dist %>/public' 
    } 
}, 

// Performs rewrites based on rev and the useminPrepare configuration 
usemin: { 
    html: ['<%= yeoman.dist %>/public/{,*/}*.html'], 
    css: ['<%= yeoman.dist %>/public/{,*/}*.css'], 
    js: ['<%= yeoman.dist %>/public/{,*/}*.js'], 
    options: { 
    assetsDirs: [ 
     '<%= yeoman.dist %>/public', 
     '<%= yeoman.dist %>/public/assets/images' 
    ], 
    // This is so we update image references in our ng-templates 
    patterns: { 
     js: [ 
     [/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images'] 
     ] 
    } 
    } 
}, 

// The following *-min tasks produce minified files in the dist folder 
imagemin: { 
    dist: { 
    files: [{ 
     expand: true, 
     cwd: '<%= yeoman.client %>/assets/images', 
     src: '{,*/}*.{png,jpg,jpeg,gif}', 
     dest: '<%= yeoman.dist %>/public/assets/images' 
    }] 
    } 
}, 

svgmin: { 
    dist: { 
    files: [{ 
     expand: true, 
     cwd: '<%= yeoman.client %>/assets/images', 
     src: '{,*/}*.svg', 
     dest: '<%= yeoman.dist %>/public/assets/images' 
    }] 
    } 
}, 

// Allow the use of non-minsafe AngularJS files. Automatically makes it 
// minsafe compatible so Uglify does not destroy the ng references 
ngAnnotate: { 
    dist: { 
    files: [{ 
     expand: true, 
     cwd: '.tmp/concat', 
     src: '*/**.js', 
     dest: '.tmp/concat' 
    }] 
    } 
}, 

// Package all the html partials into a single javascript payload 
ngtemplates: { 
    options: { 
    // This should be the name of your apps angular module 
    module: 'nameThatSongApp', 
    htmlmin: { 
     collapseBooleanAttributes: true, 
     collapseWhitespace: true, 
     removeAttributeQuotes: true, 
     removeEmptyAttributes: true, 
     removeRedundantAttributes: true, 
     removeScriptTypeAttributes: true, 
     removeStyleLinkTypeAttributes: true 
    }, 
    usemin: 'app/app.js' 
    }, 
    main: { 
    cwd: '<%= yeoman.client %>', 
    src: ['{app,components}/**/*.html'], 
    dest: '.tmp/templates.js' 
    }, 
    tmp: { 
    cwd: '.tmp', 
    src: ['{app,components}/**/*.html'], 
    dest: '.tmp/tmp-templates.js' 
    } 
}, 

// Replace Google CDN references 
cdnify: { 
    dist: { 
    html: ['<%= yeoman.dist %>/public/*.html'] 
    } 
}, 

// Copies remaining files to places other tasks can use 
copy: { 
    dist: { 
    files: [{ 
     expand: true, 
     dot: true, 
     cwd: '<%= yeoman.client %>', 
     dest: '<%= yeoman.dist %>/public', 
     src: [ 
     '*.{ico,png,txt}', 
     '.htaccess', 
     'bower_components/**/*', 
     'assets/images/{,*/}*.{webp}', 
     'assets/fonts/**/*', 
     'index.html' 
     ] 
    }, { 
     expand: true, 
     cwd: '.tmp/images', 
     dest: '<%= yeoman.dist %>/public/assets/images', 
     src: ['generated/*'] 
    }, { 
     expand: true, 
     dest: '<%= yeoman.dist %>', 
     src: [ 
     'package.json', 
     'server/**/*' 
     ] 
    }] 
    }, 
    styles: { 
    expand: true, 
    cwd: '<%= yeoman.client %>', 
    dest: '.tmp/', 
    src: ['{app,components}/**/*.css'] 
    } 
}, 

buildcontrol: { 
    options: { 
    dir: 'dist', 
    commit: true, 
    push: true, 
    connectCommits: false, 
    message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%' 
    }, 
    heroku: { 
    options: { 
     remote: 'heroku', 
     branch: 'master' 
    } 
    }, 
    openshift: { 
    options: { 
     remote: 'openshift', 
     branch: 'master' 
    } 
    } 
}, 

// Run some tasks in parallel to speed up the build process 
concurrent: { 
    server: [ 
    'sass', 
    ], 
    test: [ 
    'sass', 
    ], 
    debug: { 
    tasks: [ 
     'nodemon', 
     'node-inspector' 
    ], 
    options: { 
     logConcurrentOutput: true 
    } 
    }, 
    dist: [ 
    'sass', 
    'imagemin', 
    'svgmin' 
    ] 
}, 

// Test settings 
karma: { 
    unit: { 
    configFile: 'karma.conf.js', 
    singleRun: true 
    } 
}, 

mochaTest: { 
    options: { 
    reporter: 'spec' 
    }, 
    src: ['server/**/*.spec.js'] 
}, 

protractor: { 
    options: { 
    configFile: 'protractor.conf.js' 
    }, 
    chrome: { 
    options: { 
     args: { 
     browser: 'chrome' 
     } 
    } 
    } 
}, 

env: { 
    test: { 
    NODE_ENV: 'test' 
    }, 
    prod: { 
    NODE_ENV: 'production' 
    }, 
    all: localConfig 
}, 

// Compiles Sass to CSS 
sass: { 
    server: { 
    options: { 
     loadPath: [ 
     '<%= yeoman.client %>/bower_components', 
     '<%= yeoman.client %>/app', 
     '<%= yeoman.client %>/components' 
     ], 
     compass: false 
    }, 
    files: { 
     '.tmp/app/app.css' : '<%= yeoman.client %>/app/app.scss' 
    } 
    } 
}, 

injector: { 
    options: { 

    }, 
    // Inject application script files into index.html (doesn't include bower) 
    scripts: { 
    options: { 
     transform: function(filePath) { 
     filePath = filePath.replace('/client/', ''); 
     filePath = filePath.replace('/.tmp/', ''); 
     return '<script src="' + filePath + '"></script>'; 
     }, 
     starttag: '<!-- injector:js -->', 
     endtag: '<!-- endinjector -->' 
    }, 
    files: { 
     '<%= yeoman.client %>/index.html': [ 
      ['{.tmp,<%= yeoman.client %>}/{app,components}/**/*.js', 
      '!{.tmp,<%= yeoman.client %>}/app/app.js', 
      '!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.spec.js', 
      '!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.mock.js'] 
     ] 
    } 
    }, 

    // Inject component scss into app.scss 
    sass: { 
    options: { 
     transform: function(filePath) { 
     filePath = filePath.replace('/client/app/', ''); 
     filePath = filePath.replace('/client/components/', ''); 
     return '@import \'' + filePath + '\';'; 
     }, 
     starttag: '// injector', 
     endtag: '// endinjector' 
    }, 
    files: { 
     '<%= yeoman.client %>/app/app.scss': [ 
     '<%= yeoman.client %>/{app,components}/**/*.{scss,sass}', 
     '!<%= yeoman.client %>/app/app.{scss,sass}' 
     ] 
    } 
    }, 

    // Inject component css into index.html 
    css: { 
    options: { 
     transform: function(filePath) { 
     filePath = filePath.replace('/client/', ''); 
     filePath = filePath.replace('/.tmp/', ''); 
     return '<link rel="stylesheet" href="' + filePath + '">'; 
     }, 
     starttag: '<!-- injector:css -->', 
     endtag: '<!-- endinjector -->' 
    }, 
    files: { 
     '<%= yeoman.client %>/index.html': [ 
     '<%= yeoman.client %>/{app,components}/**/*.css' 
     ] 
    } 
    } 
}, 
    }); 

    // Used for delaying livereload until after server has restarted 
grunt.registerTask('wait', function() { 
grunt.log.ok('Waiting for server reload...'); 

var done = this.async(); 

setTimeout(function() { 
    grunt.log.writeln('Done waiting!'); 
    done(); 
}, 1500); 
}); 

grunt.registerTask('express-keepalive', 'Keep grunt running', function() { 
this.async(); 
}); 

grunt.registerTask('serve', function (target) { 
if (target === 'dist') { 
    return grunt.task.run(['build', 'env:all', 'env:prod', 'express:prod', 'wait', 'open', 'express-keepalive']); 
} 

if (target === 'debug') { 
    return grunt.task.run([ 
    'clean:server', 
    'env:all', 
    'injector:sass', 
    'concurrent:server', 
    'injector', 
    'wiredep', 
    'autoprefixer', 
    'concurrent:debug' 
    ]); 
} 

grunt.task.run([ 
    'clean:server', 
    'env:all', 
    'injector:sass', 
    'concurrent:server', 
    'injector', 
    'wiredep', 
    'autoprefixer', 
    'express:dev', 
    'wait', 
    'open', 
    'watch' 
]); 
}); 

grunt.registerTask('server', function() { 
    grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.'); 
    grunt.task.run(['serve']); 
}); 

grunt.registerTask('test', function(target) { 
    if (target === 'server') { 
    return grunt.task.run([ 
     'env:all', 
     'env:test', 
     'mochaTest' 
    ]); 
} 

else if (target === 'client') { 
    return grunt.task.run([ 
    'clean:server', 
    'env:all', 
    'injector:sass', 
    'concurrent:test', 
    'injector', 
    'autoprefixer', 
    'karma' 
    ]); 
} 

else if (target === 'e2e') { 
    return grunt.task.run([ 
    'clean:server', 
    'env:all', 
    'env:test', 
    'injector:sass', 
    'concurrent:test', 
    'injector', 
    'wiredep', 
    'autoprefixer', 
    'express:dev', 
    'protractor' 
    ]); 
} 

else grunt.task.run([ 
    'test:server', 
    'test:client' 
]); 
}); 

grunt.registerTask('build', [ 
'clean:dist', 
'injector:sass', 
'concurrent:dist', 
'injector', 
'wiredep', 
'useminPrepare', 
'autoprefixer', 
'ngtemplates', 
'concat', 
'ngAnnotate', 
'copy:dist', 
'cdnify', 
'cssmin', 
'uglify', 
'rev', 
'usemin' 
]); 

grunt.registerTask('default', [ 
'newer:jshint', 
'test', 
'build' 
]); 
}; 
+0

我怀疑缩小是造成你的问题。如果使用uglify,请使用漂亮的打印选项或使用源映射,并禁用mangling来调试您的代码。在'argument.callee'或'argument.caller'之上的某个范围内,您有''use strict''语句。 – 2014-12-08 00:22:05

+0

为什么您在使用不允许的功能时使用严格模式?为什么你使用严格模式? – RobG 2014-12-08 00:37:08

+0

严格模式被内置到角度发生器中。另外,我被告知这是很好的做法,并且由于它在严格模式下在本地工作,所以我不明白为什么它一旦部署就无法工作,纯粹是由于严格的模式。 – sebradloff 2014-12-08 05:15:09

回答

0

您可以使用参数数组,但在严格的模式不被呼叫者或来电者。这是一个JavaScript的东西。它与角度,自我,缩小,英雄或其他任何东西都没有关系。