gpt4 book ai didi

gulp - 在 watchify 运行之前运行 eslint

转载 作者:行者123 更新时间:2023-12-04 12:47:05 25 4
gpt4 key购买 nike

我正在添加 watchify到我们的构建过程,但我想设置一个先决条件来监视运行,即更改的文件通过了我们的 linting 步骤(使用 ESLint)。

我想这样做:

function runBrowserify(watch){
var babel = babelify.configure({
optional: ['es7.objectRestSpread']
});
var b = browserify({
entries: './app/main.js',
debug: true,
extensions: ['.jsx', '.js'],
cache: {},
packageCache: {},
fullPaths: true
})
.transform(babel);

if(watch) {
// if watch is enable, wrap this bundle inside watchify
b = watchify(b);
b.on('update', function(ids) {
//run the linting step
lint(ids);

//run the watchify bundle step
gutil.log(gutil.colors.blue('watchify'), 'Started');
bundleShare(b);
});
b.on('time', function (time) {
gutil.log(gutil.colors.blue('watchify'), 'Finished', 'after', gutil.colors.magenta(time), gutil.colors.magenta('ms'));
});
}

bundleShare(b);
}

function bundleShare(b) {
b.bundle()
.pipe(source('main.min.js'))
.pipe(gulp.dest('./dist'));
}

function lint(glob) {
return gulp.src(glob)
.pipe(eslint())
.pipe(eslint.format())
.pipe(eslint.failOnError());
}

问题是 linting 步骤是异步的,所以它不会在捆绑完成之前完成(它也会抛出,所以我可能需要使用 plumber 来阻止它终止 watch 步骤)。

那么,在我调用 bundleShared 之前,我将如何设定前提条件? ?

最佳答案

我能够使用我上面提到的闭包方法来做到这一点。我还将我的 Browserify 和 Watchify 代码移动到每个构建都可以利用的辅助函数中。

gulpfile.js (部分的)

gulp.task('build:dev', buildDev); 
gulp.task('lint:js', lintJS);

function lintJS(callback) {
return gulp.src(['src/**/*.js', 'src/**/*.jsx', '!src/js/vendor/**/*.*',])
.pipe(eslint())
.pipe(eslint.format())
.pipe(eslint.failAfterError());
}

function buildDev(callback) {
var bundler = getBundler('src/js/app.jsx', { debug: true }, callback);
var watcher = getWatcher(bundler, rebundle);

function rebundle() {
lintJS(callback);

return watcher.bundle()
.pipe(source('bundle.min.js'))
.pipe(buffer())
.pipe(gulp.dest('dist/js'));
}

rebundle();
// Call watch methods here, i.e.: watchHTML()
return callback();
}

/****************************** Helper functions ******************************/

/**
* Gets the default Browserify bundler used by all builds.
*
*
* @param path A string representing where Browserify should start from
* @param options An Object containing options for the bundler
* @param callback The Gulp callback function from the calling task
* @return A basically configured Browserify bundler
*/
function getBundler(path, options, callback) {
var bundler = browserify(path, { debug: options.debug, cache: {}, packageCache: {} });
bundler.transform(babelify);
bundler.on('log', gutil.log);
bundler.on('error', gutil.log.bind(gutil.colors.red, 'Browserify Error'));

return bundler;
}

/**
* Gets the default Watchify watcher used by dev builds. By default, the watcher
* will rebundle the Browserify package when an update occurs.
*
* @param bundle The Browserify bundler object
* @param rebundle A function to perform when Watchify detects a code update
* @return A basically configured Watchify watcher
*/
function getWatcher(bundle, rebundle) {
var watcher = watchify(bundle);
watcher.on('update', rebundle);

return watcher;
}

对于我的测试和生产版本,我不使用 Watchify(因此没有 rebundle() 方法)所以我将 'lint:js' 任务保留为依赖项:
gulp.task('build:test', ['lint:js'], buildTest);
gulp.task('build:prod', ['lint:js'], buildProd);

关于gulp - 在 watchify 运行之前运行 eslint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30362259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com