【问题标题】:Gulp-Change giving TypeError | React ApplicationGulp-Change 给 TypeError |反应应用
【发布时间】:2018-08-15 05:18:22
【问题描述】:

我正在学习一个非常基本的 react 教程,以熟悉它的功能。所以,如果我错过了一些明显的东西,请原谅我。本教程开头的部分内容是设置 gulp 来处理 sass 文件。所以我设置了我的 gulp 文件,设置了我的依赖项并尝试保存我的 scss 文件,不幸的是我收到了 TypeError 错误并花了大约一个小时左右试图自己克服它,但找不到任何具体的东西。

我遇到了 gulp-change 的问题。我逐行检查并确保这是导致TypeError 问题的行。 gulpfile.js

'use strict';

var gulp = require('gulp');
var sass = require('gulp-sass');
var minifyCSS = require('gulp-clean-css');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var changed = require('gulp-change');

/////////////////
// - SCSS / CSS
/////////////////

var SCSS_SRC = './src/Assets/scss/**/*.scss';
var SCSS_DEST = './src/Assets/css';

gulp.task('compile_scss', function(){
    gulp.src(SCSS_SRC)
    .pipe(sass().on('error', sass.logError))
    .pipe(minifyCSS())
    .pipe(rename({ suffix: '.min' }))

    ////////////line creating the error//////////////
    .pipe(changed(SCSS_DEST))        
    .pipe(gulp.dest(SCSS_DEST));
});

//detect changes in SCSS
gulp.task('watch_scss', function(){
    gulp.watch(SCSS_SRC, ['compile_scss']);
});

//run tasks
gulp.task('default', ['watch_scss']);

给定错误

internal/streams/legacy.js:59
      throw er; // Unhandled stream error in pipe.

TypeError: run.call is not a function
    at R:\Documents\Projects\React Goal App\goal-app\node_modules\gulp-change\index.js:31:14
    at wrappedMapper (R:\Documents\Projects\React Goal App\goal-app\node_modules\map-stream\index.js:84:19)
    at Stream.stream.write (R:\Documents\Projects\React Goal App\goal-app\node_modules\map-stream\index.js:96:21)
    at Transform.ondata (_stream_readable.js:639:20)
    at emitOne (events.js:116:13)
    at Transform.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)
    at Transform.Readable.push (_stream_readable.js:208:10)
    at Transform.push (_stream_transform.js:147:32)

gulp-change index.js

var eventStream = require('event-stream');

module.exports = gulpChange;

function gulpChange(run) {
    return eventStream.map(function(file, done) {
        if (file.isNull()) {
            return done(null, file);
        }
        if (file.isStream()) {
            return done(new PluginError('gulp-change', 'Streaming not supported.'));
        }
        var content = file.contents.toString();
        var ctx = {
            file: file,
            fname: file.history[file.history.length - 1].substr(file.base.length),
            originalContent: content
        };

        function next(err, content) {
            if (err) {
                return done(err);
            }
            if (content) {
                file.contents = new Buffer(content);
            }
            done(null, file);
        }

        if (run.length > 1) {
////////////////line 31 where run is indicated as not a function/////////////
            run.call(ctx, content, next);
        } else {
            next(null, run.call(ctx, content))
        }
    });
}

我正在使用的 default.scss 文件

body{
    font-size: 10px;
}

scss/css 的文件夹结构

  • 目标应用程序(根)
      • 资产
        • CSS
        • scss
          • default.scss

【问题讨论】:

  • 我假设你有一些未捕获的类型错误。提供您所面临的确切错误会很有帮助,
  • 我的错,我没有一路复制。我今晚一回家就会更新。感谢您与我们联系。
  • 添加了我之前省略的另外两个错误行

标签: javascript reactjs sass gulp gulp-changed


【解决方案1】:

如果我正确理解了您的代码,那么 gulpChange 方法的 run 参数与您在 .pipe(changed(SCSS_DEST)) 行中传递给 changed 方法的参数相同.这使得 run 变量成为 string

String 不是函数,但它具有长度属性,这就是为什么 if (run.length > 1) { 行不会抛出错误,甚至被计算为 true

使用的包是 gulp-change 不是 gulp-changed 可能想象的那样。 gulp-change 的文档说你必须将函数作为参数传递。

【讨论】:

  • 我在看东西的时候也有同样的想法。但是 gulp-changed 的​​文档显示字符串使用是正确的npmjs.com/package/gulp-changed
  • 但那是错误的包装。您正在使用 gulp-change 而不是 gulp-changed。正确的包是github.com/PoliteJS/gulp-change
  • 感谢你的新眼睛,虽然非常尴尬。绝对感谢你。会再花一个深夜排查错误的包。
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 2020-02-17
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多