259

这是我的webpack.config.js

var webpack = require("webpack");

module.exports = {

  entry: "./entry.js",
  devtool: "source-map",
  output: {
    path: "./dist",
    filename: "bundle.min.js"
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin({minimize: true})
  ]
};

我正在建造

$ webpack

在我的dist文件夹中,我只得到

  • bundle.min.js
  • bundle.min.js.map

我也想看看未压缩的bundle.js

4

14 回答 14

165

webpack.config.js

const webpack = require("webpack");

module.exports = {
  entry: {
    "bundle": "./entry.js",
    "bundle.min": "./entry.js",
  },
  devtool: "source-map",
  output: {
    path: "./dist",
    filename: "[name].js"
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      include: /\.min\.js$/,
      minimize: true
    })
  ]
};

自 Webpack 4 以来,webpack.optimize.UglifyJsPlugin已弃用,并且使用它会导致错误:

webpack.optimize.UglifyJsPlugin 已被移除,请改用 config.optimization.minimize

正如手册所解释的,插件可以替换为minimize选项。可以通过指定UglifyJsPlugin实例向插件提供自定义配置:

const webpack = require("webpack");
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
  // ...
  optimization: {
    minimize: true,
    minimizer: [new UglifyJsPlugin({
      include: /\.min\.js$/
    })]
  }
};

这完成了简单设置的工作。更有效的解决方案是将 Gulp 与 Webpack 一起使用,并一次性完成相同的操作。

于 2015-12-01T11:09:29.710 回答
164

您可以使用单个配置文件,并使用环境变量有条件地包含 UglifyJS 插件:

const webpack = require('webpack');
const TerserPlugin = require('terser-webpack-plugin');

const PROD = JSON.parse(process.env.PROD_ENV || '0');

module.exports = {

  entry: './entry.js',
  devtool: 'source-map',
  output: {
    path: './dist',
    filename: PROD ? 'bundle.min.js' : 'bundle.js'
  },
  optimization: {
    minimize: PROD,
    minimizer: [
      new TerserPlugin({ parallel: true })
  ]
};

然后在你想缩小它时设置这个变量:

$ PROD_ENV=1 webpack

编辑:

如评论中所述,NODE_ENV通常(按惯例)用于说明特定环境是生产环境还是开发环境。要检查它,您也可以设置const PROD = (process.env.NODE_ENV === 'production'),然后正常继续。

于 2015-07-05T08:38:42.003 回答
57

你可以使用不同的参数运行 webpack 两次:

$ webpack --minimize

然后检查命令行参数webpack.config.js

var path = require('path'),
  webpack = require('webpack'),
  minimize = process.argv.indexOf('--minimize') !== -1,
  plugins = [];

if (minimize) {
  plugins.push(new webpack.optimize.UglifyJsPlugin());
}

...

示例webpack.config.js

于 2015-10-05T10:19:59.723 回答
40

要添加另一个答案,标志-p(缩写--optimize-minimize)将使用默认参数启用 UglifyJS。

您不会从一次运行中获得缩小的原始包或生成不同命名的包,因此该-p标志可能不符合您的用例。

相反,该-d选项是缩写--debug --devtool sourcemap --output-pathinfo

我的 webpack.config.js 省略了devtool, debug,pathinfo和 minmize 插件以支持这两个标志。

于 2015-09-21T05:07:28.840 回答
36

也许我在这里迟到了,但我有同样的问题,所以我为此目的编写了一个unminified-webpack-plugin

安装

npm install --save-dev unminified-webpack-plugin

用法

var path = require('path');
var webpack = require('webpack');
var UnminifiedWebpackPlugin = require('unminified-webpack-plugin');

module.exports = {
    entry: {
        index: './src/index.js'
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'library.min.js'
    },
    plugins: [
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            }
        }),
        new UnminifiedWebpackPlugin()
    ]
};

通过上述操作,您将获得两个文件 library.min.js 和 library.js。无需执行两次 webpack,它就可以工作!^^

于 2016-05-12T15:44:03.027 回答
35

在我看来,直接使用UglifyJS工具容易得多:

  1. npm install --save-dev uglify-js
  2. 正常使用 webpack,例如构建./dst/bundle.js文件。
  3. build命令添加到您的package.json

    "scripts": {
        "build": "webpack && uglifyjs ./dst/bundle.js -c -m -o ./dst/bundle.min.js --source-map ./dst/bundle.min.js.map"
    }
    
  4. 每当你想构建你的包以及丑陋的代码和源映射时,运行npm run build命令。

uglify-js不需要全局安装,项目本地安装即可。

于 2016-06-11T10:01:43.843 回答
15

您可以为 webpack 创建两个配置,一个缩小代码,一个不缩小(只需删除 optimize.UglifyJSPlugin 行),然后同时运行这两个配置$ webpack && webpack --config webpack.config.min.js

于 2014-10-04T21:26:16.993 回答
12

根据这一行:https ://github.com/pingyuanChen/webpack-uglify-js-plugin/blob/master/index.js#L117

应该是这样的:

var webpack = require("webpack");

module.exports = {

  entry: "./entry.js",
  devtool: "source-map",
  output: {
    path: "./dist",
    filename: "bundle.js"
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin({
     minimize: true,
     compress: false
    })
  ]
};

事实上,您可以通过根据您的 env / argv 策略导出不同的配置来进行多个构建。

于 2017-01-30T10:31:22.720 回答
7

我为这个问题找到了一个新的解决方案。

这使用一组配置来使 webpack 能够并行构建缩小版和非缩小版。这使构建更快。无需运行 webpack 两次。不需要额外的插件。只是网页包。

webpack.config.js

const devConfig = {
  mode: 'development',
  entry: { bundle: './src/entry.js' },
  output: { filename: '[name].js' },
  module: { ... },
  resolve: { ... },
  plugins: { ... }
};

const prodConfig = {
  ...devConfig,
  mode: 'production',
  output: { filename: '[name].min.js' }
};

module.exports = (env) => {
  switch (env) {
    case 'production':
      return [devConfig, prodConfig];
    default:
      return devConfig;
  }
};

运行webpack只会构建非缩小版本。

运行webpack --env=production将同时构建缩小版和非缩小版。

于 2019-05-04T02:30:07.633 回答
4

webpack entry.jsx ./output.js -p

为我工作,带有-p标志。

于 2016-11-23T19:02:14.440 回答
4

你可以像这样格式化你的 webpack.config.js:

var debug = process.env.NODE_ENV !== "production";
var webpack = require('webpack');

module.exports = {
    context: __dirname,
    devtool: debug ? "inline-sourcemap" : null,
    entry: "./entry.js",
    output: {
        path: __dirname + "/dist",
        filename: "library.min.js"
    },
    plugins: debug ? [] : [
        new webpack.optimize.DedupePlugin(),
        new webpack.optimize.OccurenceOrderPlugin(),
        new webpack.optimize.UglifyJsPlugin({ mangle: false, sourcemap: false }),
    ],
};'

然后构建它未缩小的运行(在项目的主目录中):

$ webpack

要构建它缩小运行:

$ NODE_ENV=production webpack

注意:确保对于未缩小的版本,您将输出文件名更改library.js为缩小版library.min.js,这样它们就不会相互覆盖。

于 2017-01-28T19:51:41.377 回答
3

我有同样的问题,并且必须满足所有这些要求:

  • 缩小版+非缩小版(如问题所示)
  • ES6
  • 跨平台(Windows + Linux)。

我终于解决了如下:

webpack.config.js:

const path = require('path');
const MinifyPlugin = require("babel-minify-webpack-plugin");

module.exports = getConfiguration;

function getConfiguration(env) {
    var outFile;
    var plugins = [];
    if (env === 'prod') {
        outFile = 'mylib.dev';
        plugins.push(new MinifyPlugin());
    } else {
        if (env !== 'dev') {
            console.log('Unknown env ' + env + '. Defaults to dev');
        }
        outFile = 'mylib.dev.debug';
    }

    var entry = {};
    entry[outFile] = './src/mylib-entry.js';

    return {
        entry: entry,
        plugins: plugins,
        output: {
            filename: '[name].js',
            path: __dirname
        }
    };
}

包.json:

{
    "name": "mylib.js",
    ...
    "scripts": {
        "build": "npm-run-all webpack-prod webpack-dev",
        "webpack-prod": "npx webpack --env=prod",
        "webpack-dev": "npx webpack --env=dev"
    },
    "devDependencies": {
        ...
        "babel-minify-webpack-plugin": "^0.2.0",
        "npm-run-all": "^4.1.2",
        "webpack": "^3.10.0"
    }
}

然后我可以构建(不要忘记npm install之前):

npm run-script build
于 2018-01-08T21:33:04.963 回答
3

您应该像这样导出一个数组:

const path = require('path');
const webpack = require('webpack');

const libName = 'YourLibraryName';

function getConfig(env) {
  const config = {
    mode: env,
    output: {
      path: path.resolve('dist'),
      library: libName,
      libraryTarget: 'umd',
      filename: env === 'production' ? `${libName}.min.js` : `${libName}.js`
    },
    target: 'web',
    .... your shared options ...
  };

  return config;
}

module.exports = [
  getConfig('development'),
  getConfig('production'),
];
于 2019-06-13T08:44:38.580 回答
0

您可以在 webpack 配置中定义两个入口点,一个用于普通 js,另一个用于缩小 js。然后你应该用它的名字输出你的包,并配置 UglifyJS 插件来包含 min.js 文件。有关更多详细信息,请参阅示例 webpack 配置:

module.exports = {
 entry: {
   'bundle': './src/index.js',
   'bundle.min': './src/index.js',
 },

 output: {
   path: path.resolve(__dirname, 'dist'),
   filename: "[name].js"
 },

 plugins: [
   new webpack.optimize.UglifyJsPlugin({
      include: /\.min\.js$/,
      minimize: true
   })
 ]
};

运行 webpack 后,你会在 dist 文件夹中获得 bundle.js 和 bundle.min.js,不需要额外的插件。

于 2017-10-18T14:56:50.057 回答