Browserify - 多个入口点

31

我正在使用gulp中的Browserify。我试图将我的测试编译到一个单独的文件中。但与我的主应用程序不同,我遇到了编译测试的问题。主要区别在于测试有多个入口点,而不像应用程序那样只有一个入口点。但是,Browserify报错说找不到入口点。

browserify   = require 'browserify'
gulp         = require 'gulp'
source       = require 'vinyl-source-stream'

gulp.task 'tests', ->
    browserify
        entries: ['./app/js/**/*Spec.coffee']
        extensions: ['.coffee']
    .bundle 
        debug: true
    .pipe source('specs.js') 
    .pipe gulp.dest('./specs/')
4个回答

40

以下是我构建的一个任务,似乎可以解决这个问题。基本上,我使用一个外部库将文件名收集为数组。然后将该数组作为入口点传递。

'use strict;'

var config = require('../config');
var gulp = require('gulp');
var plumber = require('gulp-plumber');
var glob = require('glob');
var browserify  = require('browserify');
var source = require('vinyl-source-stream');

gulp.task('tests', function(){
  var testFiles = glob.sync('./spec/**/*.js');
  return browserify({
      entries: testFiles,
      extensions: ['.jsx']
    })
    .bundle({debug: true})
    .pipe(source('app.js'))
    .pipe(plumber())
    .pipe(gulp.dest(config.dest.development));
});

1
var testFiles = glob.sync('./spec/**/*.js'); 对我来说很管用,而不是使用 glob(paths.js+'/**.js', function(err, widgetFiles) {...。+1 - Aamir Afridi
如果您有一个模式数组,请使用“globs”而不是“glob”:https://www.npmjs.com/package/globs - user2226755

19

这里是一份替代食谱,更符合使用 gulp.src() 的 gulp 风格。

var gulp = require('gulp');
var browserify = require('browserify');
var transform = require('vinyl-transform');
var concat = require('gulp-concat');

gulp.task('browserify', function () {

  // use `vinyl-transform` to wrap around the regular ReadableStream returned by b.bundle();
  // so that we can use it down a vinyl pipeline as a vinyl file object.
  // `vinyl-transform` takes care of creating both streaming and buffered vinyl file objects.
  var browserified = transform(function(filename) {
    var b = browserify(filename, {
      debug: true,
      extensions: ['.coffee']
    });
    // you can now further configure/manipulate your bundle
    // you can perform transforms, for e.g.: 'coffeeify'
    // b.transform('coffeeify');
    // or even use browserify plugins, for e.g. 'minifyiy'
    // b.plugins('minifyify');
    // consult browserify documentation at: https://github.com/substack/node-browserify#methods for more available APIs
    return b.bundle();
  });

  return gulp.src(['./app/js/**/*Spec.coffee'])
    .pipe(browserified)/
    .pipe(concat('spec.js'))
    .pipe(gulp.dest('./specs'));
});

gulp.task('default', ['browserify']);

关于这个工作的更多详细信息,请参阅我撰写的文章:http://medium.com/@sogko/gulp-browserify-the-gulp-y-way-bb359b3f9623


2
只是一个快速的提示,这种方法的缺点是你不能交换 watchify。随着构建时间的延长,gulp 的本地监视在我看来并不适合大型编译的 browserify 表单。 - Matt
我同意,对于更大的构建项目,您需要采用不同的方法:
  • 一种方法是使用watchify执行小的增量构建(但正如您所提到的,browserify+watchify需要更改配方;我可能会考虑为此编写一个)
  • 我个人更喜欢的另一种方法是将代码库分成捆绑包。大多数项目倾向于具有应用程序代码和供应商代码(react、angular等)。我在这里概述了这种方法(警告:写作仍然很生涩)
- Hafiz Ismail
请注意,这种方法可能与一些browserify插件不兼容,比如minifyify。在这种情况下,你几乎是被迫采用Matt的方法。 - superEb
1
当然可以在转换中调用 b.plugin("minifyify", opts),但是当我尝试这样做时,它会导致流错误,如 TypeError: Object #<Readable> has no method 'write'。没有插件时,转换可以正常工作,因此我认为 minifyify 和 vinyl-transform 之间存在不兼容性。 - superEb
我认为这个解决方案已经不能正常工作了:https://github.com/substack/node-browserify/issues/1217 - Con Antonakos
显示剩余2条评论

1

一个稍微复杂的例子,使用glob模式将文件构建成多个文件,并监视和重建分离的文件。不适用于.coffee,而是适用于es2015,但差别不大:

var gulp = require("gulp");
var babelify = require("babelify");
var sourcemaps = require("gulp-sourcemaps");
var gutil = require("gulp-util");
var handleErrors = require("../utils/handleErrors.js");
var browserify = require("browserify");
var eventStream = require("event-stream");
var glob = require("glob");
var source = require("vinyl-source-stream");
var buffer = require("vinyl-buffer");
var watchify = require("watchify");

var SRC_PATH = "./src";
var BUILD_PATH = "./build";

var bundle = function (bundler, entryFilepath) {
  console.log(`Build: ${entryFilepath}`);

  return bundler.bundle()
    .on("error", handleErrors)
    .pipe(source(entryFilepath.replace(SRC_PATH, BUILD_PATH)))
    .pipe(buffer())
    .on("error", handleErrors)
    .pipe(
      process.env.TYPE === "development" ?
        sourcemaps.init({loadMaps: true}) :
        gutil.noop()
    )
    .on("error", handleErrors)
    .pipe(
      process.env.TYPE === "development" ?
        sourcemaps.write() :
        gutil.noop()
    )
    .on("error", handleErrors)
    .pipe(gulp.dest("."))
    .on("error", handleErrors);
};

var buildScripts = function (done, watch) {
  glob(`${SRC_PATH}/**/[A-Z]*.js`, function (err, files) {
    if (err) {
      done(err);
    }

    var tasks = files.map(function (entryFilepath) {
      var bundler = browserify({
        entries: [entryFilepath],
        debug: process.env.TYPE === "development",
        plugin: watch ? [watchify] : undefined
      })
        .transform(
          babelify,
          {
            presets: ["es2015"]
          });

      var build = bundle.bind(this, bundler, entryFilepath);

      if (watch) {
        bundler.on("update", build);
      }

      return build();
    });

    return eventStream
      .merge(tasks)
      .on("end", done);
  });
};

gulp.task("scripts-build", function (done) {
  buildScripts(done);
});

gulp.task("scripts-watch", function (done) {
  buildScripts(done, true);
});

这里是完整的代码https://github.com/BigBadAlien/browserify-multy-build


1

1
我知道我可以使用套件,但我试图避免这样做。为了避免记得添加新文件时出现问题。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接