私はES6コードを書いて、それをBabelでES5にトランスパイルしてから、Uglifyで縮小します。すべてgulpを介してwebpackで実行されます。外部ソースマップを使用したい(ファイルサイズをできるだけ小さく保つため)。
Gulpタスクはかなり基本的です-ファンキーなものはすべてwebpack設定にあります:
var gulp = require("gulp");
var webpack = require("gulp-webpack");
gulp.task("js:es6", function () {
return gulp.src(path.join(__dirname, "PTH", "TO", "SRC", "index.js"))
.pipe(webpack(require("./webpack.config.js")))
.pipe(gulp.dest(path.join(__dirname, "PTH", "TO", "DEST")));
});
webpack.config.js:
var path = require("path");
var webpack = require("webpack");
module.exports = {
output: {
filename: "main.js",
sourceMapFilename: "main.js.map"
},
devtool: "#inline-source-map",
module: {
loaders: [
{ test: path.join(__dirname, "PTH", "TO", "SRC"),
loader: "babel-loader" }
]
},
plugins: [
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
output: {
comments: false,
semicolons: true
},
sourceMap: true
})
]
};
上記は機能し、機能するソースマップを作成しますが、インラインです。
devtool: "#source-map"
と表示されるようにwebpack.config.jsを変更すると、ソースマップは(sourceMapFilename
をファイル名として使用して)別のファイルとして作成されます。しかし、使用できません-Chrome開発ツールはそれを理解していないようです。webpack.optimize.UglifyJsPlugin
を削除すると、ソースマップは使用できますが、コードは縮小されません。ソースマップは2つの個別のステップで機能しますが、それらが順番に実行される場合は機能しません。
Uglifyステップは前のトランスパイラーステップからの外部ソースマップを無視しているのではないかと思います。そのため、生成されるソースマップはストリームに基づいており、もちろんgulpの外部には存在しません。したがって、使用できないソースマップです。
私はwebpackにかなり慣れていないので、明らかなものがないかもしれません。
私がやろうとしていることはこの質問に似ていますが、browserifyの代わりにwebpackを使用しています: Gulp + browserify + 6to5 + source maps
前もって感謝します。
私はあなたのwebpack設定をgulpfile内に置くか、少なくとも機能させることを強くお勧めします。これにはいくつかの素晴らしい利点があります。たとえば、さまざまなタスクで再利用できますが、オプションは異なります。
また、gulp-webpack
を使用する代わりに、直接webpackを使用することをお勧めします(特に、それが唯一のパイプラインである場合)。これにより、私の経験では、より予測可能な結果が得られます。次の構成を使用すると、UglifyJSを使用している場合でもソースマップが正常に機能します。
"use strict";
var path = require("path");
var gulp = require("gulp");
var gutil = require("gulp-util");
var webpack = require("webpack");
function buildJs (options, callback) {
var plugins = options.minify ? [
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false,
},
output: {
comments: false,
semicolons: true,
},
}),
] : [];
webpack({
entry: path.join(__dirname, "src", "index.js"),
bail: !options.watch,
watch: options.watch,
devtool: "source-map",
plugins: plugins,
output: {
path: path.join(__dirname, "dist"),
filename: "index.js",
},
module: {
loaders: [{
loader: "babel-loader",
test: /\.js$/,
include: [
path.join(__dirname, "src"),
],
}],
},
}, function (error, stats) {
if ( error ) {
var pluginError = new gutil.PluginError("webpack", error);
if ( callback ) {
callback(pluginError);
} else {
gutil.log("[webpack]", pluginError);
}
return;
}
gutil.log("[webpack]", stats.toString());
if (callback) { callback(); }
});
}
gulp.task("js:es6", function (callback) {
buildJs({ watch: false, minify: false }, callback);
});
gulp.task("js:es6:minify", function (callback) {
buildJs({ watch: false, minify: true }, callback);
});
gulp.task("watch", function () {
buildJs({ watch: true, minify: false });
});
Webpackのdevtool: 'source-map'
の使用をお勧めします
以下に、ソースマッピングを含むwebpack.configの例を示します。
var path = require('path');
var webpack = require('webpack');
module.exports = {
devtool: 'source-map',
entry: ['./index'],
output: {
filename: 'bundle.js',
path: path.join(__dirname, 'public'),
publicPath: '/public/'
},
module: {
loaders: [
{ test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }
]
},
plugins: [
]
};