使用webpack和gulp的缩小的,转换的ES6代码的外部源映射

got*_*itz 25 javascript minify gulp webpack babeljs

我正在编写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")));
});
Run Code Online (Sandbox Code Playgroud)

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
    })
  ]
};
Run Code Online (Sandbox Code Playgroud)

以上工作并创建了工作源地图 - 但它们是内联的.

如果我更改了webpack.config.js devtool: "#source-map",那么源地图就会被创建为一个单独的文件(使用sourceMapFilenameas filename).但它不可用 - Chrome开发工具似乎不理解它.如果我删除webpack.optimize.UglifyJsPlugin源映射是可用的 - 但代码不会缩小.因此,源映射适用于两个单独的步骤,但不适用于按顺序运行的步骤.

我怀疑uglify步骤忽略了前一个转换器步骤中的外部源映射,因此它生成的源映射基于流,当然这不存在于gulp之外.因此无法使用的源地图.

我对webpack很新,​​所以我可能会遗漏一些明显的东西.

我正在尝试做的是类似于这个问题,但使用webpack而不是browserify:Gulp + browserify + 6to5 +源地图

提前致谢.

小智 11

我强烈建议将你的webpack配置放在gulpfile中,或者至少使它成为一个函数.这有一些很好的好处,例如能够将其重用于不同的任务,但具有不同的选项.

我还建议直接使用webpack而不是使用gulp-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 });
});
Run Code Online (Sandbox Code Playgroud)