javascript - “Caller”, 'Callee',使用 Yeoman 部署时 Angular 应用程序出现严格模式错误

标签 javascript angularjs heroku yeoman yeoman-generator-angular

我使用 Yeoman 的 Angular 生成器构建了一个 Angular 应用程序,它在本地完美运行。然而,当部署到heroku时,什么也没有显示。控制台错误是“未捕获的类型错误:‘调用者’、‘被调用者’和‘参数’属性可能无法在严格模式函数或调用它们的参数对象上访问”。

我想我已经将其追溯到 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'
]);
};

最佳答案

您可以使用参数数组,但在严格模式下不能使用被调用者或调用者。这是 JavaScript 的事情。它与 Angular、yeoman、minification、heroku 或其他任何东西都没有任何关系。

关于javascript - “Caller”, 'Callee',使用 Yeoman 部署时 Angular 应用程序出现严格模式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349535/

相关文章:

javascript - 使用 node.js 调用 chargebee 之类的 api

javascript - jquery中 'a'标签的点击事件

javascript - ng-repeat 数组的关联数组?

javascript - 如何将 Kendo-grid 用于 Angular-ngRepeat

angularjs - 在angularjs中,如果输入有错误,如何在表单提交时将焦点设置为输入?

ruby-on-rails - 无法连接到 Heroku 上的数据库

javascript - 类型错误 : g is not a function

javascript - 从 UTC 字符串格式化日期

javascript - 当前 Play 应用程序的 Heroku 部署错误

ruby-on-rails - 在 Heroku 区域设置弃用警告上部署 Rails 4.0.2