【问题标题】:How to use a stream as input for Browserify?如何使用流作为 Browserify 的输入?
【发布时间】:2014-12-24 04:22:42
【问题描述】:

在 Gulp 中,我正在尝试编译 TypeScript,将其连接起来,然后通过 Browserify 运行它以处理 requires(如果处于生产模式,则在之后进行 uglify)。

This sample code 是我发现的最接近我正在尝试做的事情,但是它使用了一个中间文件。如果可能的话,我宁愿将内容保留在流中以避免中间文件的开销。

既然 Browserify 输出一个流,它似乎也应该知道如何接受一个流。

相关代码:

var gulp = require('gulp');
var browserify = requ
var concat = require('gulp-concat');
var sourcemaps = require('gulp-sourcemaps');
var transform = require('vinyl-transform');
var typeScript = require('gulp-typescript');

gulp.task('scripts', function () {
    return gulp.src([mySrcDir,'typings/**/*.d.ts'])
        .pipe(sourcemaps.init())
        .pipe(typeScript(typeScriptProject))
        .pipe(concat('main.js'))
        .pipe(transform(function (filename) {
            return browserify(filename).bundle();
        }))
        .pipe(sourcemaps.write())
        .pipe(gulp.dest(ns.outDir))
        // Reload, notify...
        ;

结果:

Error: Cannot find module 'C:\path\to\project\root\src\main.js' in 'C:\path\to\project\root'

当我省略连接时,结果是相同的,除了 foobar.js 而不是 main.js 其中foobar.ts 是输入文件之一。

第二次尝试

gulp.task('scripts', function () {
    var stream = gulp.src([mySrcDir,'typings/**/*.d.ts'])
        .pipe(sourcemaps.init())
        .pipe(typeScript(typeScriptProject))
        .pipe(concat('main.js'));
    var bundleStream = ns.browserify(stream).bundle().on('error', errorHandler);
    // and then...

一个新错误

C:\path\to\project\root\_stream_0.js:1
[object Object]
        ^
ParseError: Unexpected token

【问题讨论】:

  • 那么在您的源文件中,您是否有一个入口文件可以构建一个包含其余文件的依赖关系图,或者您是否有一堆单独的入口文件?
  • 我正在尝试做同样的事情。如果我们必须击中磁盘,我们就会回到 Grunt 土地。 Gulp 是关于流的。希望看到这个答案。

标签: javascript typescript gulp browserify


【解决方案1】:

您不能将 vinyl 流传递给 browserify。它只接受textbuffer 流。唯一的解决方案是将输入的vinyl流转换为browserify可以掌握的text流:

var gutil = require('gulp-util')
var through = require('through2')
var intoStream = require('into-stream')

// ...
.pipe(through.obj(function(file, encoding, next) {
  bundle = browserify(intoStream(file.contents))
  this.push(new gutil.File({
    path: 'index.js',
    contents: bundle.bundle()
  }))
  next()
}))

【讨论】:

    【解决方案2】:

    看看gulp-browserify,它是browserify的gulp插件。

    例子:

    gulp.src([mySrcDir,'typings/**/*.d.ts'])
        .pipe(sourcemaps.init())
        .pipe(typeScript(typeScriptProject))
        .pipe(concat('main.js'))
        .pipe(browserify(options)
        .pipe(sourcemaps.write())
        .pipe(gulp.dest(ns.outDir))
        // Reload, notify...
        ;
    

    关于选项,您可以参考上面发布的链接

    【讨论】:

    • 我看过了; gulp-browserify 已过时并被列入黑名单。
    • @Qwertman - 是吗?抱歉,我一直在我的项目中使用它,但不知道它已被列入黑名单
    • 是的,现在这是我发现的唯一可行的方法(所以你的回答有点正确——我会赞成但不标记它)。也感谢您修改和添加更多细节。有很多人抱怨黑名单。主要问题是,作为回应,维护者停止了维护,所以现在我们被旧版本的 Browserify 困住,它最终将与其他模块或可能与 Node 本身不兼容(我对以下任何一种可能性都没有信心:我对生态系统的了解不够,所以充其量只是猜测)。
    • @Qwertman,因为它是开源的,请尝试 PR。或者如果作者对你的 PR 没有回应,你自己建一个:]
    • 据我所知,目前还没有香草解决方案。 The code in this link 无法正常工作。
    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2020-09-22
    • 2021-04-07
    • 2022-01-08
    相关资源
    最近更新 更多