我目前正在关注 John Papa 的关于使用 GulpJS 构建自动化的课程。目前,我尝试使用 gulp-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 的文档,但即使我使用该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 调用,如这篇博文中所述:
browserSync.init([
config.client + '**/*.*',
'!' + config.sass,
config.tmp + '**/*.css'
], options);
我files
从选项对象中删除了该属性,并将它们作为数组传递给init()
函数。仍然scss
不会忽略文件,因此即使样式仅发生变化,也会重新加载整个页面。