【问题标题】:Excluding files for BrowserSync not working为 BrowserSync 排除文件不起作用
【发布时间】:2015-07-31 06:57:30
【问题描述】:

我目前正在学习 John Papa 关于使用 GulpJS 构建自动化的课程。目前我尝试设置browser-syncgulp-nodemon 以保持我的浏览器同步。这是为我的开发构建服务的 gulp 任务:

gulp.task('serve-dev', ['inject'], function () {
    var isDev = true;

    var nodeOptions = {
        script: config.settings.node.server,
        delayTime: 1,
        env: {
            'PORT': port,
            'NODE_ENV': isDev ? 'dev' : 'build'
        },
        watch: [config.server]
    };

    return $.nodemon(nodeOptions)
        .on('restart', ['vet'], function (event) {
            util.log('[nodemon] restarted');
        })
        .on('start', function () {
            util.log('[nodemon] started');
            startBrowserSync();
        })
        .on('crash', function () {
            util.log('[nodemon] crashed', 'red');
        })
        .on('exit', function () {
            util.log('[nodemon] exited cleanly');
        });
});

有趣的部分是函数startBrowserSync()

function startBrowserSync() {
    if (browserSync.active) {
        return;
    }

    util.log('[browser-sync] Starting on port ' + port);

    gulp
        .watch([config.sass], ['styles'])
        .on('change', function (event) {
            util.onChange(event);
        });

    var options = {
        proxy: 'localhost:' + port,
        port: 3000,
        files: [
            config.client + '**/*.*',
            '!' + config.sass,
            config.tmp + '**/*.css'
        ],
        ghostMode: {
            clicks: true,
            location: false,
            forms: true,
            scroll: true
        },
        injectChanges: true,
        logFileChanges: true,
        logLevel: 'debug',
        logPrefix: 'bsp',
        notify: true,
        reloadDelay: 1000
    };

    browserSync(options);
}

正如您在files 选项中看到的那样,我想查看客户端文件夹中除*.scss 文件之外的所有文件,并明确查看我的.tmp 目录中的CSS 文件。这就是约翰爸爸在他的课程中的做法。但是,每次我更改 *.scss 文件中的某些内容时,都会重新加载整个页面。这不是预期的行为,因为我将 injectChanges 设置为 true,这意味着注入 CSS 而不是重新加载整个页面。问题是! 不排除文件被监视。这里有什么问题?

顺便说一句;我的 sass 配置如下所示:

var client = './src/client/';

var config = {
    [...]
    sass: client + 'styles/**/*.scss',
    [...]
}

我已经查看了 BrowserSync herehere 的文档,但即使我使用 watchOptions 属性并忽略文件,它也不起作用。

另一个问题是config.tmp + '**/*.css' 无法正常工作。我将变量声明为var tmp = './.tmp/';。不知何故,BrowserSync 与.tmp 存在问题。如果我将其更改为tmp,它只会起作用。但是,.tmp 适用于所有其他 gulp 任务,例如styles 任务:

gulp.task('styles', ['clean-styles'], function () {
    util.log('Compiling SCSS to CSS');

    if (production) {
        config.settings.sass.outputStyle = 'compressed';
    }

    return gulp
        .src(config.sass)
        .pipe($.plumber({
            errorHandler: util.onError
        }))
        .pipe($.sass(config.settings.sass))
        .pipe($.autoprefixer({
            browsers: [
                'last 2 versions',
                '> 5%'
            ]
        }))
        .pipe(gulp.dest(config.tmp));
});

这里有什么问题?有什么想法吗?

编辑:由于我使用的是 BrowserSync 2.7.1,因此我还尝试了通过在模块导出上调用 create() 来创建 browserSync 实例的推荐方法。此外,我更改了 BrowserSync 调用,如this 博客文章所述:

 browserSync.init([
            config.client + '**/*.*',
            '!' + config.sass,
            config.tmp + '**/*.css'
        ], options);

我从选项对象中删除了files 属性,并将它们作为数组传递给init() 函数。仍然不会忽略 scss 文件,因此即使样式仅发生变化,也会重新加载整个页面。

【问题讨论】:

  • 请创建一个包含你的整个 gulpfile.js 的示例项目,它可以复制这个问题,我会调查它:)

标签: node.js npm gulp browser-sync


【解决方案1】:

我找到了解决问题的方法。由于我的路径声明,它实际上崩溃了。这是我以前的:

var client = './src/client/';
var clientApp = client + 'app/';
var server = './src/server/';
var bower = './bower_components/';
var tmp = './.tmp/';

如您所见,每个路径都以 ./ 开头,它仅适用于非 Windows 机器,因为 Windows 使用 .\ 作为当前工作目录的命令。也许是 BrowserSync 不能正确转换它,但对我来说,如果我改变它,它可以完美地工作如下:

var client = 'src/client/';
var clientApp = client + 'app/';
var server = 'src/server/';
var bower = 'bower_components/';
var tmp = '.tmp/';

我从路径中删除了所有./,并将我启动 BrowserSync 的方式更改为我在问题编辑中已经提到的推荐方式,并进行了轻微的重构:

var files = isDev ? [
    config.client + '**/*.*',
    '!' + config.sass,
    config.tmp + '**/*.css'
] : [];

browserSync.init(files, options);

我偶然发现的一些网站给了我测试的线索:

如果有人对我的问题有更好的解决方案,请随时补充我的帖子。

【讨论】:

  • 我也在使用 Windows。当前导 './' 被删除时,排除在起作用。但是在我的情况下, config.tmp + '*/.css' 不会在 temp 目录中获取 css 文件。我不得不使用没有模式匹配的路径 .tmp/styles.css 。 BrowserSync 版本是 2.10.1。
【解决方案2】:

如果其他人有同样的问题,我可以排除文件的唯一方法是在文件路径中删除 ./。例如,我必须将./config/*.less 更改为config/*.less,然后它会起作用。

【讨论】:

    【解决方案3】:

    来自 browserSync 文档:

    // Compile sass into CSS & auto-inject into browsers
    gulp.task('sass', function() {
        return gulp.src("app/scss/*.scss")
            .pipe(sass())
            .pipe(gulp.dest("app/css"))
            .pipe(browserSync.stream());
    });
    

    所以在 John Papa 课程中,我通过将样式任务更改为以下内容来实现它:

        gulp.task('styles', ['clean-styles'], function() {
            log('Compiling Less --> CSS');
    
            return gulp
                .src(config.less)
                .pipe($.less())
                .on('error', errorLogger)
                .pipe($.autoprefixer({browsers: ['last 2 version', '> 5%']}))
                .pipe(gulp.dest(config.temp))
                .pipe(browserSync.stream());
        });
    

    【讨论】:

    • 嗯,但我正在寻找我的排除模式不起作用的原因。与样式无关,这正是我的模式起作用的地方。
    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多