使用Gulp实现index.html的Livereload

5

我正在尝试在项目根目录下更改index.html时,使浏览器更新。当更新CSS时,Livereload正常工作。 我已经在gulpfile.js中删除了让这个功能运行的代码,以下是代码...

谢谢!

var gulp = require('gulp'),
sass = require('gulp-ruby-sass'),
autoprefixer = require('gulp-autoprefixer'),
minifycss = require('gulp-minify-css'),
jshint = require('gulp-jshint'),
uglify = require('gulp-uglify'),
imagemin = require('gulp-imagemin'),
rename = require('gulp-rename'),
clean = require('gulp-clean'),
concat = require('gulp-concat'),
notify = require('gulp-notify'),
cache = require('gulp-cache'),
livereload = require('gulp-livereload'),
lr = require('tiny-lr'),
server = lr();

gulp.task('styles', function() {
return gulp.src('components/sass/style.scss')
.pipe(sass({ style: 'expanded' }))
.pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6',         'android 4'))
.pipe(gulp.dest(''))
.pipe(rename({suffix: '.min'}))
.pipe(minifycss())
.pipe(gulp.dest(''))
.pipe(livereload(server))
.pipe(notify({ message: 'Styles task complete' }));
});

gulp.task('scripts', function() {
return gulp.src('components/js/*.js')
// .pipe(jshint('.jshintrc'))
.pipe(jshint.reporter('default'))
.pipe(concat('main.js'))
.pipe(gulp.dest('js'))
.pipe(rename({suffix: '.min'}))
.pipe(uglify())
.pipe(gulp.dest('js'))
.pipe(livereload(server))
.pipe(notify({ message: 'Scripts task complete' }));

});

gulp.task('images', function() {
return gulp.src('components/img/*')
.pipe(imagemin({ optimizationLevel: 5, progressive: true, interlaced: true }))
.pipe(gulp.dest('img'))
.pipe(livereload(server))
.pipe(notify({ message: 'Images task complete' }));
});

// gulp.task('clean', function() {
//   return gulp.src(['css', 'js', 'img'], {read: false})
//     .pipe(clean());
// });

gulp.task('watch', function() {

server.listen(35729, function (err) {
if (err) {
return console.log(err)
};
// Watch .scss files
gulp.watch('components/sass/*.scss', ['styles']);
// Watch .js files
gulp.watch('components/js/*.js', ['scripts']);
// Watch image files
gulp.watch('components/img/*', ['images']);
});    
});

// gulp.task('default', ['clean'], function() {
gulp.task('default', function() {
gulp.start('styles', 'scripts', 'images');
});
4个回答

5
你可以尝试将html文件放在一个名为components/html的子文件夹中,并使用类似于styles任务的任务。
gulp.task('html', function() {
    return gulp.src('components/html/**/*.html')
        .pipe(gulp.dest(''))
        .pipe(livereload(server))
        .pipe(notify({ message: 'HTML task complete' }));
});

你的默认任务应该如下所示:

// gulp.task('default', ['clean'], function() {
gulp.task('default', function() {
    gulp.start('styles', 'scripts', 'images', 'html');
});

并修改您的监视任务:

gulp.task('watch', function() {

    server.listen(35729, function (err) {
        if (err) {
            return console.log(err)
        };
        // Watch .scss files
        gulp.watch('components/sass/*.scss', ['styles']);
        // Watch .js files
        gulp.watch('components/js/*.js', ['scripts']);
        // Watch image files
        gulp.watch('components/img/*', ['images']);
        // Watch html files
        gulp.watch('components/html/**/*.html', ['html']);
    });
});

你好 Ralf


它对我有效,但所有的HTML文件都被重新加载了,而不仅仅是已更改的文件。有没有办法只重新加载更改过的内容? - jmcollin92

2

使用当前gulp语法(截至2016年4月)手动重新加载项目根目录中特定文件类型的浏览器同步,参考链接:

https://www.browsersync.io/docs/gulp/#gulp-manual-reload

示例:在SCSS引用下添加以下内容以使用browser-sync监视HTML和HTM文件:

gulp.watch("./scss/*.scss", ['sass']);
gulp.watch("*.html").on("change", reload);
gulp.watch("*.htm").on("change", reload);

1

也许有更好的方式来实现你想要做的事情。

你有没有考虑使用带有 livereloadexpress 实例?

另一种选择是使用 gulp-connect,这将使你尝试的操作更加容易。无论哪种情况,不要在任务中调用 livereload,而是在设置服务器的任务中处理 livereloading。总体思路是在你想要进行 livereloading 的文件上设置一个监视任务,然后在更改时重新加载。

gulp.task('serve', function(event) {
    connect.server({
        root: destinations.docs,
        port: 1987,
        livereload: true
    });
    // sets up a livereload that watches for any changes in the root
    watch({glob: [sources.html, sources.styles]})
        .pipe(connect.reload());
});

我已经尝试过两种方式,gulp-connect 是更简单的选项。无论如何,我编写了两个 gulp 样板文件,您可以在 https://github.com/jh3y/gulp-boilerplate-v2https://github.com/jh3y/gulp-boilerplate 查看。希望这能帮助到您!

1
如果您不想使用livereload或express实例,您可以像下面这样做,这是我在我的laravel 5项目中使用elixir gulp扩展和live.js结合使用的方法。
扩展elixir elixir.extend('livereloader',function(message) { gulp.task('livereloader',function(){ return gulp.src('public/js/livereloader.js') .pipe(insert.append('')) .pipe(gulp.dest('public/js/')); }); this.registerWatcher("livereloader", 'resources/views/**/*.php'); return this.queueTask('livereloader'); }); 使用任务

mix.livereloader();

足够简单。即使没有livereload或express(我不明白为什么我应该使用它们...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接