Javascript Gulp失败,错误消息不明

Javascript Gulp失败,错误消息不明,javascript,html,gulp,polymer-1.0,Javascript,Html,Gulp,Polymer 1.0,当我运行gulp生成dist文件时,我得到一些警告,后面是一条神秘的错误消息,如下所示 > ⚠ 22 warnings > > [01:54:54] 'jshint' errored after 3.49 s [01:54:54] Error in plugin > 'gulp-jshint' Message: > JSHint failed for: app/elements/bronze-auth/bronze-auth.html, app/el

当我运行gulp生成dist文件时,我得到一些警告,后面是一条神秘的错误消息,如下所示

>   ⚠  22 warnings
> 
> [01:54:54] 'jshint' errored after 3.49 s [01:54:54] Error in plugin
> 'gulp-jshint' Message:
>     JSHint failed for: app/elements/bronze-auth/bronze-auth.html, app/elements/bronze-changepwd/bronze-changepwd.html,
> app/elements/bronze-list/bronze-list-item.html,
> app/elements/bronze-list/bronze-list-new-item.html,
> app/elements/bronze-list/bronze-list.html,
> app/elements/bronze-lists/bronze-lists.html,
> app/elements/bronze-main/bronze-main.html,
> app/elements/bronze-share/bronze-share-add-user.html,
> app/elements/bronze-share/bronze-share-item.html,
> app/elements/bronze-share/bronze-share.html [01:54:54] 'default'
> errored after 5.41 s [01:54:54] Error in plugin 'run-sequence'
> Message:
>     An error occured in task 'jshint'. [01:54:54] images all files 27.16 kB [01:54:54] Finished 'images' after 3.33 s [01:54:54] html all files 129.9 kB [01:54:54] Finished 'html' after 3.12 s
因为这个错误太神秘了,我不知道如何去修复它

我的gulpfile.js复制如下:

'use strict';

// Include Gulp & tools we'll use
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
var del = require('del');
var runSequence = require('run-sequence');
var browserSync = require('browser-sync');
var reload = browserSync.reload;
var merge = require('merge-stream');
var path = require('path');
var fs = require('fs');
var glob = require('glob-all');
var historyApiFallback = require('connect-history-api-fallback');
var packageJson = require('./package.json');
var crypto = require('crypto');
// var ghPages = require('gulp-gh-pages');

var AUTOPREFIXER_BROWSERS = [
  'ie >= 10',
  'ie_mob >= 10',
  'ff >= 30',
  'chrome >= 34',
  'safari >= 7',
  'opera >= 23',
  'ios >= 7',
  'android >= 4.4',
  'bb >= 10'
];

var DIST = 'dist';

var dist = function(subpath) {
  return !subpath ? DIST : path.join(DIST, subpath);
};

var styleTask = function(stylesPath, srcs) {
  return gulp.src(srcs.map(function(src) {
      return path.join('app', stylesPath, src);
    }))
    .pipe($.changed(stylesPath, {extension: '.css'}))
    .pipe($.autoprefixer(AUTOPREFIXER_BROWSERS))
    .pipe(gulp.dest('.tmp/' + stylesPath))
    .pipe($.minifyCss())
    .pipe(gulp.dest(dist(stylesPath)))
    .pipe($.size({title: stylesPath}));
};

var imageOptimizeTask = function(src, dest) {
  return gulp.src(src)
    .pipe($.imagemin({
      progressive: true,
      interlaced: true
    }))
    .pipe(gulp.dest(dest))
    .pipe($.size({title: 'images'}));
};

var optimizeHtmlTask = function(src, dest) {
  var assets = $.useref.assets({
    searchPath: ['.tmp', 'app', dist()]
  });

  return gulp.src(src)
    // Replace path for vulcanized assets
    .pipe($.if('*.html', $.replace('elements/elements.html', 'elements/elements.vulcanized.html')))
    .pipe(assets)
    // Concatenate and minify JavaScript
    .pipe($.if('*.js', $.uglify({
      preserveComments: 'some'
    })))
    // Concatenate and minify styles
    // In case you are still using useref build blocks
    .pipe($.if('*.css', $.minifyCss()))
    .pipe(assets.restore())
    .pipe($.useref())
    // Minify any HTML
    .pipe($.if('*.html', $.minifyHtml({
      quotes: true,
      empty: true,
      spare: true
    })))
    // Output files
    .pipe(gulp.dest(dest))
    .pipe($.size({
      title: 'html'
    }));
};

// Compile and automatically prefix stylesheets
gulp.task('styles', function() {
  return styleTask('styles', ['**/*.css']);
});

gulp.task('elements', function() {
  return styleTask('elements', ['**/*.css']);
});

// Lint JavaScript
gulp.task('lint', function() {
  return gulp.src([
      'app/scripts/**/*.js',
      'app/elements/**/*.js',
      'app/elements/**/*.html',
      'gulpfile.js'
    ])
    .pipe(reload({
      stream: true,
      once: true
    }))

  // JSCS has not yet a extract option
  .pipe($.if('*.html', $.htmlExtract()))
  .pipe($.jshint())
  .pipe($.jscs())
  .pipe($.jscsStylish.combineWithHintResults())
  .pipe($.jshint.reporter('jshint-stylish'))
  .pipe($.if(!browserSync.active, $.jshint.reporter('fail')));
});

// Optimize images
gulp.task('images', function() {
  return imageOptimizeTask('app/images/**/*', dist('images'));
});

// Copy all files at the root level (app)
gulp.task('copy', function() {
  var app = gulp.src([
    'app/*',
    '!app/test',
    '!app/cache-config.json'
  ], {
    dot: true
  }).pipe(gulp.dest(dist()));

  var bower = gulp.src([
    'bower_components/**/*'
  ]).pipe(gulp.dest(dist('bower_components')));

  var elements = gulp.src(['app/elements/**/*.html',
      'app/elements/**/*.css',
      'app/elements/**/*.js'
    ])
    .pipe(gulp.dest(dist('elements')));

  var swBootstrap = gulp.src(['bower_components/platinum-sw/bootstrap/*.js'])
    .pipe(gulp.dest(dist('elements/bootstrap')));

  var swToolbox = gulp.src(['bower_components/sw-toolbox/*.js'])
    .pipe(gulp.dest(dist('sw-toolbox')));

  var vulcanized = gulp.src(['app/elements/elements.html'])
    .pipe($.rename('elements.vulcanized.html'))
    .pipe(gulp.dest(dist('elements')));

  return merge(app, bower, elements, vulcanized, swBootstrap, swToolbox)
    .pipe($.size({
      title: 'copy'
    }));
});

// Copy web fonts to dist
gulp.task('fonts', function() {
  return gulp.src(['app/fonts/**'])
    .pipe(gulp.dest(dist('fonts')))
    .pipe($.size({
      title: 'fonts'
    }));
});

// Scan your HTML for assets & optimize them
gulp.task('html', function() {
  return optimizeHtmlTask(
    ['app/**/*.html', '!app/{elements,test}/**/*.html'],
    dist());
});

// Vulcanize granular configuration
gulp.task('vulcanize', function() {
  var DEST_DIR = dist('elements');
  return gulp.src(dist('elements/elements.vulcanized.html'))
    .pipe($.vulcanize({
      stripComments: true,
      inlineCss: true,
      inlineScripts: true
    }))
    .pipe(gulp.dest(DEST_DIR))
    .pipe($.size({title: 'vulcanize'}));
});

// Generate config data for the <sw-precache-cache> element.
// This include a list of files that should be precached, as well as a (hopefully unique) cache
// id that ensure that multiple PSK projects don't share the same Cache Storage.
// This task does not run by default, but if you are interested in using service worker caching
// in your project, please enable it within the 'default' task.
// See https://github.com/PolymerElements/polymer-starter-kit#enable-service-worker-support
// for more context.
gulp.task('cache-config', function(callback) {
  var dir = dist();
  var config = {
    cacheId: packageJson.name || path.basename(__dirname),
    disabled: false
  };

  glob([
    'index.html',
    './',
    'bower_components/webcomponentsjs/webcomponents-lite.min.js',
    '{elements,scripts,styles}/**/*.*'],
    {cwd: dir}, function(error, files) {
    if (error) {
      callback(error);
    } else {
      config.precache = files;

      var md5 = crypto.createHash('md5');
      md5.update(JSON.stringify(config.precache));
      config.precacheFingerprint = md5.digest('hex');

      var configPath = path.join(dir, 'cache-config.json');
      fs.writeFile(configPath, JSON.stringify(config), callback);
    }
  });
});

// Clean output directory
gulp.task('clean', function() {
  return del(['.tmp', dist()]);
});

// Watch files for changes & reload
gulp.task('serve', ['lint', 'styles', 'elements', 'images'], function() {
  browserSync({
    port: 5000,
    notify: false,
    logPrefix: 'PSK',
    snippetOptions: {
      rule: {
        match: '<span id="browser-sync-binding"></span>',
        fn: function(snippet) {
          return snippet;
        }
      }
    },
    // Run as an https by uncommenting 'https: true'
    // Note: this uses an unsigned certificate which on first access
    //       will present a certificate warning in the browser.
    // https: true,
    server: {
      baseDir: ['.tmp', 'app'],
      middleware: [historyApiFallback()],
      routes: {
        '/bower_components': 'bower_components'
      }
    }
  });

  gulp.watch(['app/**/*.html'], reload);
  gulp.watch(['app/styles/**/*.css'], ['styles', reload]);
  gulp.watch(['app/elements/**/*.css'], ['elements', reload]);
  gulp.watch(['app/{scripts,elements}/**/{*.js,*.html}'], ['lint']);
  gulp.watch(['app/images/**/*'], reload);
});

// Build and serve the output from the dist build
gulp.task('serve:dist', ['default'], function() {
  browserSync({
    port: 5001,
    notify: false,
    logPrefix: 'PSK',
    snippetOptions: {
      rule: {
        match: '<span id="browser-sync-binding"></span>',
        fn: function(snippet) {
          return snippet;
        }
      }
    },
    // Run as an https by uncommenting 'https: true'
    // Note: this uses an unsigned certificate which on first access
    //       will present a certificate warning in the browser.
    // https: true,
    server: dist(),
    middleware: [historyApiFallback()]
  });
});

// Build production files, the default task
gulp.task('default', ['clean'], function(cb) {
  // Uncomment 'cache-config' if you are going to use service workers.
  runSequence(
    ['copy', 'styles'],
    'elements',
    ['lint', 'images', 'fonts', 'html'],
    'vulcanize', // 'cache-config',
    cb);
});

// Build then deploy to GitHub pages gh-pages branch
gulp.task('build-deploy-gh-pages', function(cb) {
  runSequence(
    'default',
    'deploy-gh-pages',
    cb);
});

// Deploy to GitHub pages gh-pages branch
gulp.task('deploy-gh-pages', function() {
  return gulp.src(dist('**/*'))
    // Check if running task from Travis Cl, if so run using GH_TOKEN
    // otherwise run using ghPages defaults.
    .pipe($.if(process.env.TRAVIS === 'true', $.ghPages({
      remoteUrl: 'https://$GH_TOKEN@github.com/polymerelements/polymer-starter-kit.git',
      silent: true,
      branch: 'gh-pages'
    }), $.ghPages()));
});

// Load tasks for web-component-tester
// Adds tasks for `gulp test:local` and `gulp test:remote`
require('web-component-tester').gulp.init(gulp);

// Load custom tasks from the `tasks` directory
try {
  require('require-dir')('tasks');
} catch (err) {}
“严格使用”;
//包括我们将使用的吞咽和工具
var gulp=需要(“gulp”);
var$=require('gulp-load-plugins')();
var del=需要('del');
var runSequence=require('run-sequence');
var browserSync=require('browser-sync');
var reload=browserSync.reload;
var merge=require('merge-stream');
var path=require('path');
var fs=需要('fs');
var glob=需要('glob-all');
var historyApiFallback=require('connect-history-api-fallback');
var packageJson=require('./package.json');
var crypto=require('crypto');
//var ghPages=需要('gulp-gh-pages');
var AUTOPREFIXER\u浏览器=[
'ie>=10',
'ie_mob>=10',
‘ff>=30’,
'铬>=34',
“safari>=7”,
“歌剧>=23”,
'ios>=7',
“安卓>=4.4”,
‘bb>=10’
];
var DIST=‘DIST’;
var dist=函数(子路径){
return!subpath?DIST:path.join(DIST,subpath);
};
var styleTask=函数(stylesPath,srcs){
返回gulp.src(srcs.map)(函数(src){
返回路径join('app',stylesPath,src);
}))
.pipe($.changed(stylesPath,{扩展名:'.css'}))
.pipe($.autoprefixer(autoprefixer_浏览器))
.pipe(大口目的地('.tmp/'+stylesPath))
.pipe($.minifyCss())
.管道(大口目的地(距离(样式)))
.pipe($.size({title:stylesPath}));
};
var imageOptimizeTask=函数(src,dest){
回灌量src(src)
.pipe($.imagemin({
进步:是的,
交错:对
}))
.管道(大口目的地(目的地))
.pipe($.size({title:'images'}));
};
var optimizeHtmlTask=函数(src,dest){
var资产=$.useref.assets({
搜索路径:['.tmp',app',dist()]
});
回灌量src(src)
//替换硫化资产的路径
.pipe($.if('*.html',$.replace('elements/elements.html','elements/elements.suverized.html'))
.管道(资产)
//连接并缩小JavaScript
.pipe($.if('*.js',$.uglify({
评论:“一些”
})))
//连接和缩小样式
//如果您仍在使用useref构建块
.pipe($.if('*.css',$.minifyCss()))
.pipe(assets.restore())
.pipe($.useref())
//缩小任何HTML
.pipe($.if('*.html',$.minifyHtml({
语录:没错,
空:是的,
备用:是的
})))
//输出文件
.管道(大口目的地(目的地))
.管道(美元/尺寸)({
标题:“html”
}));
};
//编译并自动为样式表添加前缀
gulp.task('style',function()){
返回styleTask('styles',['***.css']);
});
gulp.task('elements',function()){
返回styleTask('elements',['***.css']);
});
//Lint脚本
吞咽任务('lint',函数(){
回灌([
“app/scripts/***.js”,
“app/elements/***.js”,
“app/elements/***.html”,
“gulpfile.js”
])
.管道(重新装载)({
溪流:没错,
一次:对
}))
//JSCS还没有提取选项
.pipe($.if('*.html',$.htmlExtract()))
.pipe($.jshint())
.pipe($.jscs())
.pipe($.jscsstyle.combineWithHintResults())
.pipe($.jshint.reporter('jshint-style'))
.pipe($.if(!browserSync.active,$.jshint.reporter('fail'));
});
//优化图像
gulp.task('images',function(){
返回imageOptimizeTask('app/images/***',dist('images');
});
//复制根级别的所有文件(应用程序)
吞咽任务('copy',function(){
var app=gulp.src([
“app/*”,
“!应用程序/测试”,
“!app/cache config.json”
], {
多特:是的
}).管道(吞咽目的地(dist());
var bower=gulp.src([
“bower_组件/***”
]).pipe(大口目的地(dist('bower_components'));
var elements=gulp.src(['app/elements/***.html',
“app/elements/***.css”,
“app/elements/***.js”
])
.pipe(吞咽目的地(dist('elements'));
var swBootstrap=gulp.src(['bower_components/platinum sw/bootstrap/*.js']))
.pipe(吞咽目的地(dist('elements/bootstrap'));
var swToolbox=gulp.src(['bower\u components/sw toolbox/*.js']))
.管道(大口目的地(区(“sw-toolbox”));
var硫化=gulp.src(['app/elements/elements.html'])
.pipe($.rename('elements.duvered.html'))
.pipe(吞咽目的地(dist('elements'));
返回合并(应用程序、bower、元素、硫化、swBootstrap、swToolbox)
.管道(美元/尺寸)({
标题:“副本”
}));
});
//将web字体复制到dist
gulp.task('font',function()){
return gulp.src(['app/font/**'))
.pipe(gulp.dest(dist('font'))
.管道(美元/尺寸)({
标题:“字体”
}));
});
//扫描HTML中的资源并对其进行优化
gulp.task('html',function(){
返回优化HtmlTask(
['app/***.html','!app/{elements,test}/***.html'],
dist());
});
//硫化颗粒结构
吞咽任务('硫化',函数(){
var DEST_DIR=dist(“元素”);
return gulp.src(dist('elements/elements.suverized.html'))
.管道(美元)({
评论:是的,
inlineCss:对,
inlineScripts:true
}))
.管道(大口目的地(目的地方向))
.pipe($.size({title:'suverize'}));
});
//为元素生成配置数据。
//这包括一个应该预缓存的文件列表,以及一个(希望是唯一的)缓存
//确保多个PSK项目不共享同一缓存存储的id。
//默认情况下,此任务不会运行,但如果您对使用服务工作者缓存感兴趣,则会运行此任务
//在项目中,请在“默认”任务中启用它。
//看https://github.com/PolymerElements/polymer-starter-kit#enable-服务人员支持
//了解更多上下文。
gulp.task('cache-config',函数(回调){
var dir=dist();
变量配置={
cacheId:packageJson.name | | path.basename(uu dirname),
禁用:false
};
地球仪([
“index.html”,
'./',
“bower_components/webcomponentsjs/webcomponents lite.min.js”,
“{元素、脚本、样式}/***.*”],
{cwd:dir},函数(错误,文件){
如果(e)