Gulp + browserify + 6to5 + 源地图
Gulp + browserify + 6to5 + source maps
我正在尝试编写一个 gulp 任务,允许我使用 JS 中的模块(CommonJS 很好),使用 browserify + 6to5。我也希望源映射工作。
所以:
1. 我使用 ES6 语法编写模块。
2. 6to5 将这些模块转换为 CommonJS(或其他)语法。
3. Browserify 捆绑模块。
4. Source maps 参考原始ES6文件。
这样的任务怎么写?
编辑:这是我目前所拥有的:
gulp任务
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));
});
modules/A.js
function foo() {
console.log('Hello World');
let x = 10;
console.log('x is', x);
}
export {
foo
};
modules/B.js
import {
foo
}
from './A';
function bar() {
foo();
}
export {
bar
};
modules/main.js
import {
bar
}
from './B';
bar();
代码似乎可以工作,但它没有缩小并且源映射是内联的(这对于生产来说并不是真正的工作)。
以此为起点:
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'));
});
我不明白为什么我们必须使用某些东西才能让它工作,所以我在这里添加我自己的答案。对于那些寻找 babelify
解决方案的人,我在下面添加了一个。我还认为最好谈谈每一行的作用。
对于那些想在他们的 Gulp 文件中使用 ES6 的人,您可以查看 here 但如果您将文件重命名为 Gulpfile.babel.js
则 Gulp 支持它Gulp3.9
需要注意的一件大事是您需要使用 . From there a lot of 这就是我们缓冲源流的原因。
对于那些不熟悉源映射的人来说,它们本质上是一种将 minifed 捆绑文件映射到主源文件的方法。 Chrome and Firefox 支持它,以便在调试时可以查看 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 任务,允许我使用 JS 中的模块(CommonJS 很好),使用 browserify + 6to5。我也希望源映射工作。
所以: 1. 我使用 ES6 语法编写模块。 2. 6to5 将这些模块转换为 CommonJS(或其他)语法。 3. Browserify 捆绑模块。 4. Source maps 参考原始ES6文件。
这样的任务怎么写?
编辑:这是我目前所拥有的:
gulp任务
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));
});
modules/A.js
function foo() {
console.log('Hello World');
let x = 10;
console.log('x is', x);
}
export {
foo
};
modules/B.js
import {
foo
}
from './A';
function bar() {
foo();
}
export {
bar
};
modules/main.js
import {
bar
}
from './B';
bar();
代码似乎可以工作,但它没有缩小并且源映射是内联的(这对于生产来说并不是真正的工作)。
以此为起点:
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'));
});
我不明白为什么我们必须使用某些东西才能让它工作,所以我在这里添加我自己的答案。对于那些寻找 babelify
解决方案的人,我在下面添加了一个。我还认为最好谈谈每一行的作用。
对于那些想在他们的 Gulp 文件中使用 ES6 的人,您可以查看 here 但如果您将文件重命名为 Gulpfile.babel.js
则 Gulp 支持它Gulp3.9
需要注意的一件大事是您需要使用
对于那些不熟悉源映射的人来说,它们本质上是一种将 minifed 捆绑文件映射到主源文件的方法。 Chrome and Firefox 支持它,以便在调试时可以查看 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'));
});
其他有用的读物: