32

我正在尝试编写一个 gulp 任务,允许我在 JS 中使用模块(CommonJS 很好),使用 browserify + 6to5。我也希望源映射能够工作。

所以: 1. 我使用 ES6 语法编写模块。2. 6to5 将这些模块转换为 CommonJS(或其他)语法。3. Browserify 捆绑模块。4. Source maps 指回原始的 ES6 文件。

如何编写这样的任务?

编辑:这是我到目前为止所拥有的:

吞咽任务

gulp.task('browserify', function() {
    var source = require('vinyl-source-stream');
    var browserify = require('browserify');
    var to5ify = require('6to5ify');

    browserify({
        debug: true
    })
    .transform(to5ify)
    .require('./app/webroot/js/modules/main.js', {
        entry: true
    })
    .bundle()
    .on('error', function(err) {
        console.log('Error: ' + err.message);
    })
    .pipe(source('bundle.js'))
    .pipe(gulp.dest(destJs));
});

模块/A.js

function foo() {
    console.log('Hello World');

    let x = 10;

    console.log('x is', x);
}

export {
    foo
};

模块/B.js

import {
    foo
}
from './A';

function bar() {
    foo();
}

export {
    bar
};

模块/main.js

import {
    bar
}
from './B';

bar();

代码似乎可以工作,但它没有被缩小,并且源映射是内联的(这实际上不适用于生产)。

4

2 回答 2

45

以此为起点:

var gulp = require('gulp');
var gutil = require('gulp-util');
var sourcemaps = require('gulp-sourcemaps');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var browserify = require('browserify');
var to5ify = require('6to5ify');
var uglify = require('gulp-uglify');

gulp.task('default', function() {
  browserify('./src/index.js', { debug: true })
    .transform(to5ify)
    .bundle()
    .on('error', gutil.log.bind(gutil, 'Browserify Error'))
    .pipe(source('bundle.js'))
    .pipe(buffer())
    .pipe(sourcemaps.init({loadMaps: true})) // loads map from browserify file
    .pipe(uglify())
    .pipe(sourcemaps.write('./')) // writes .map file
    .pipe(gulp.dest('./build'));
});
于 2015-01-22T12:02:31.400 回答
3

我不明白为什么我们必须使用某些东西才能让它工作,所以我在这里添加我自己的答案。对于那些正在寻找解决方案的babelify人,我在下面添加了一个。我还认为最好谈谈每行的作用。

对于那些想在他们的 Gulpfile 中使用 ES6 的人,你可以看这里,但如果你将文件重命名Gulpfile.babel.js为 Gulp 3.9 起, Gulp 支持它

需要注意的一件大事是您需要使用vinyl-source-streamBrowserify 才能将输出转换为 Gulp 可以理解的内容。从那里开始,许多gulp 插件需要乙烯基缓冲区,这就是我们缓冲源流的原因。

对于那些不熟悉 sourcemap 的人来说,它们本质上是一种将 minifed 捆绑文件映射到主源文件的方法。ChromeFirefox支持它,所以当你调试时你可以查看你的 ES6 代码以及它失败的地方。

import gulp          from 'gulp';
import uglify        from 'gulp-uglify';
import sourcemaps    from 'gulp-sourcemaps';
import source        from 'vinyl-source-stream';
import buffer        from 'vinyl-buffer';
import browserify    from 'browserify';
import babel         from 'babelify';

gulp.task('scripts', () => {
  let bundler = browserify({
    entries: ['./js/main.es6.js'], // main js file and files you wish to bundle
    debug: true,
    extensions: [' ', 'js', 'jsx']
  }).transform(babel.configure({
    presets: ["es2015"] //sets the preset to transpile to es2015 (you can also just define a .babelrc instead)
  }));

  // bundler is simply browserify with all presets set
  bundler.bundle()
    .on('error', function(err) { console.error(err); this.emit('end'); })
    .pipe(source('main.es6.js')) // main source file
    .pipe(buffer())
    .pipe(sourcemaps.init({ loadMaps: true })) // create sourcemap before running edit commands so we know which file to reference
      .pipe(uglify()) //minify file
      .pipe(rename("main-min.js")) // rename file
    .pipe(sourcemaps.write('./', {sourceRoot: './js'})) // sourcemap gets written and references wherever sourceRoot is specified to be
    .pipe(gulp.dest('./build/js'));
});

其他有用的读物​​:

Gulp 浏览器化 gulp-y 方式

于 2016-01-12T22:05:20.870 回答