【问题标题】:Trouble with splitting gulpfile.js into multiple files in Gulp 4在 Gulp 4 中将 gulpfile.js 拆分为多个文件的问题
【发布时间】:2021-08-30 09:40:50
【问题描述】:

我是 Javascript 和 Gulp 的初学者。我正在根据使用 Gulp 3 的 udemy 课程学习这一点,并且我一直在查看将代码转换为 Gulp 4 的文档。到目前为止,这很有趣,因为我在自己进行转换时学到了更多东西,但我坚持这个。不知道各位能不能给点建议。

问题:当我将 gulpfile.js 拆分为单独的文件以更好地组织我的文件时,它开始抛出错误。代码如下。

styles.js

var gulp = require('gulp'),
    postcss = require('gulp-postcss'),
    autoprefixer = require('autoprefixer'),
    cssvars = require('postcss-simple-vars'),
    nested = require('postcss-nested'),
    cssImport = require('postcss-import');


function styles(cb) {
    return gulp.src('./app/assets/styles/styles.css')
    .pipe(postcss([cssImport, cssvars, nested, autoprefixer]))
    .pipe(gulp.dest('./app/temp/styles'));
    cb();
}

exports.styles = styles;

watch.js

var gulp = require('gulp'),
browserSync = require('browser-sync').create();


function cssInject(cb) {
    return gulp.src('./app/temp/styles/styles.css')
    .pipe(browserSync.stream());
    cb();
}

function browserSyncReload(cb) {
    browserSync.reload();
    cb();
}

function watch(cb) {
    browserSync.init({
        notify: false,
        server: {
            baseDir: "app"
        }
    });
    watch('./app/index.html', browserSyncReload);
    watch('./app/assets/styles/styles.css', gulp.series(cssInject, styles));
    cb();
}

exports.browserSyncReload = browserSyncReload;
exports.watch = watch;

gulpfile.js

var stylesTasks = require('./gulp/tasks/styles.js'),
    watchTasks = require('./gulp/tasks/watch.js');

    
exports.watch = watchTasks.watch;
exports.styles = stylesTasks.styles;
exports.browserSyncReload = watchTasks.browserSyncReload;

当我运行“gulp watch”时,这就是我得到的。

错误

$ gulp watch
[21:14:28] Using gulpfile ~/Projects/travel-site/gulpfile.js
[21:14:28] Starting 'watch'...
internal/async_hooks.js:195
function emitInitNative(asyncId, type, triggerAsyncId, resource) {                      ^

RangeError: Maximum call stack size exceeded
(Use `node --trace-uncaught ...` to show where the exception was thrown)

我发现另一个帖子的代码几乎相同,但有一个不同的错误 - 这恰好是我之前遇到的错误之一,并且遵循了该帖子中提到的解决方案 - 那就是我收到此错误的时候.这是帖子的link

非常感谢任何帮助。感谢您的宝贵时间。

【问题讨论】:

    标签: javascript gulp gulp-4


    【解决方案1】:

    我有一篇完整的文章展示了从 gulp3 到 gulp4 的许多方法,我想你会找到你需要的一切there

    但基本上,我认为你需要看看这些模块:

    然后,从 gulp.js 的角度来看,你可以得到这样的结果:

    // gulpfile.js
    
    global.config = require('./gulp/config/config.json');
    
    require('events').EventEmitter.prototype._maxListeners = 1000;
    
    require('require-dir')('./gulp/tasks/styles');
    require('require-dir')('./gulp/tasks/watch');
    //... etc ...
    

    这样您就可以创建样式任务并将其导出:

    var gulp = require('gulp'),
    postcss = require('gulp-postcss'),
    autoprefixer = require('autoprefixer'),
    cssvars = require('postcss-simple-vars'),
    nested = require('postcss-nested'),
    cssImport = require('postcss-import'); 
    
    function styles(cb) {
        return gulp.src('./app/assets/styles/styles.css')
        .pipe(postcss([cssImport, cssvars, nested, autoprefixer]))
        .pipe(gulp.dest('./app/temp/styles'));
        cb();
    }
    
    const stylesTask = task('styles', styles);
    exports.stylesTask = stylesTask;
    

    然后您可以验证它是否被 gulp 识别:

    gulp --tasks
    

    如果你正确地看到你的样式任务,你现在应该可以通过运行来运行你的任务了:

    gulp styles
    

    对监视任务重复这些步骤。

    【讨论】:

    • 感谢您的回复,非常感谢。虽然我认为我在玩了 2 天后找到了解决方案。发布在下面。
    【解决方案2】:

    回答我自己的问题感觉很奇怪,但在玩了几天后我找到了解决方案。见下文。

    我需要将样式导入 watch.js,而不是 gulpfile.js。那是我的第一个错误。为此,我在 watch.js 中添加了以下行

    var styles = require('./styles').styles;
    

    那我的 gulpfile.js 只需要两行

    gulpfile.js

    var watchTask = require('./gulp/tasks/watch').watch;
    exports.default = watchTask;
    

    我还删除了变量 gulp,而是为 src 和 dest 创建了变量。因此,其余代码如下所示。

    styles.js

    var {src, dest} = require('gulp'),
        postcss = require('gulp-postcss'),
        autoprefixer = require('autoprefixer'),
        cssvars = require('postcss-simple-vars'),
        nested = require('postcss-nested'),
        cssImport = require('postcss-import');
    
    const styles = function (cb) {
        return src('./app/assets/styles/styles.css')
        .pipe(postcss([cssImport, cssvars, nested, autoprefixer]))
        .pipe(dest('./app/temp/styles'));
        cb();
    }
    
    exports.styles = styles;
    

    watch.js

    var styles = require('./styles').styles;
    var {src, series, watch} = require('gulp'),
        browserSync = require('browser-sync').create();
    
    const cssInject = function (cb) {
        return src('./app/temp/styles/styles.css')
        .pipe(browserSync.stream());
        cb();
    }
    
    const reload = function (cb) {
        browserSync.reload();
        cb();
    }
    
    const watchTask = function (cb) {
        browserSync.init({
            notify: false,
            server: {
                baseDir: "app"
            }
        });
        watch('./app/index.html', reload);
        watch('./app/assets/styles/styles.css', series(cssInject, styles));
        cb();
    }
    
    exports.watch = watchTask;
    

    因此解决了!希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多