Javascript gulp.watch()无法使用ftp更新

Javascript gulp.watch()无法使用ftp更新,javascript,ftp,gulp,browserify,gulp-watch,Javascript,Ftp,Gulp,Browserify,Gulp Watch,我最近学习了gulp,并在本地计算机上编写了这个gulp脚本,这样它就可以监视任何更改,并将我的javascripts(在本例中为/js/main.js及其依赖项)编译成一个文件/js/bundle.js: var gulp = require('gulp'); // Plugins var jshint = require('gulp-jshint'); var browserify = require('gulp-browserify'); var rename = require('gul

我最近学习了gulp,并在本地计算机上编写了这个gulp脚本,这样它就可以监视任何更改,并将我的javascripts(在本例中为
/js/main.js
及其依赖项)编译成一个文件
/js/bundle.js

var gulp = require('gulp');
// Plugins
var jshint = require('gulp-jshint');
var browserify = require('gulp-browserify');
var rename = require('gulp-rename');

// Lint Task
gulp.task('lint', function() {
  return gulp.src(['./js/**/*.js', '!./js/bundle.js'])
    .pipe(jshint())
    .pipe(jshint.reporter('default'));
});

// browserify task
gulp.task('b', function() {
  gulp.src('js/main.js')
    .pipe(browserify())
    .pipe(rename('bundle.js'))
    .pipe(gulp.dest('js/'));

});

// Watch Files For Changes
gulp.task('watch', function() {
  gulp.watch(['./js/*.js', './js/**/*.js', '!./js/bundle.js'], ['lint', 'b'])
    .on('change', function(event) {
      console.log("\n============");
      console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
    });
});

// Default Task
gulp.task('default', ['lint', 'watch']);
它在我的本地计算机(Windows7)上运行良好,所以我试着把它放到我的远程Ubuntu服务器上,让它监视任何ftp更新并浏览它们

换句话说,我想远程编码并通过ftp更新
/js/main.js
,让gulp监视更改并自动浏览

问题是:Gulp识别更改并登录控制台:

File /home/wordpress/public_html/cm/mobileCoder02/src/js/main.js was changed, running tasks...
[09:27:47] Starting 'lint'...
[09:27:47] Starting 'b'...
[09:27:47] Finished 'b' after 34 μs
[09:27:47] Finished 'lint' after 6.71 ms
但是输出文件,
bundle.js
只包含模块加载程序脚本:

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){

},{}]},{},[1])
然后代码运行正常

我想问一下,为什么要等一段时间才能浏览。ftp传输完成后,
gulp.watch()
不应该触发“更改”事件吗?如果不是,至少应该使用旧版本吗


谢谢。

乍一看,我认为这种行为主要是由于
FTP协议的工作方式

事实上,在每种传输模式下,
压缩
,并非所有数据都是一次性发送的。所有传输都被分割成小块数据,实际上是字节大小的8位。这就是
FTP客户端
通过比较成功传输的
数据包数
与要传输的文件的实际数据包数
来确定传输进度的方法

所有这一切都意味着,当您启动
上传
您的
main.js
文件时,
客户端开始传输数据(默认情况下,使用
模式,正如其名称所示,一个
字节的
(嘿!就像
吞下
!),在大多数情况下,发送
STOR
命令,在服务器上创建一个不存在的文件,或者替换其所有内容

由于每次文件更改时都会触发
gulp
watcher
,因此即使文件未完成上载,成功传输数据包的一个勾号也可以启动任务。就像我说的,当文件已经存在于服务器上时,在传输数据之前,它的所有内容都会被清除,因此您的
任务将以空文件或部分文件运行

您的
超时时间
有助于等待文件上传完成,顺便说一句,
1秒
暂时有效,但对我来说似乎有点短,特别是当您的连接不良或文件大小将要扩大时


您可以查看以了解更多详细信息,这是
FTP协议的当前标准规范

我也遇到了同样的问题。我现在使用的不是GulpWatch,而是Python库。它监视一个目录中的文件更改,但它似乎不像gulp那样有FTP上传的问题

我已经删除了gulpfile的watch部分,现在使用以下命令运行“watch”部分:

when-changed -r /var/www/website/css/internal /var/www/website/js/internal -c gulp
when-changed -r /var/www/website/css/internal /var/www/website/js/internal -c gulp