如何使用 webpack 构建缩小和未压缩的包?

IT技术 javascript node.js webpack
2021-02-28 22:11:03

这是我的 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

6个回答

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 一起使用,并一次性完成相同的事情。

更新:现在你可以使用 terser-webpack-plugin webpack.js.org/plugins/terser-webpack-plugin
2021-04-17 22:11:03
嗯,在webpack 4 中我得到了:Error: webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead.
2021-04-23 22:11:03
@FeloVilches 我什至没有提到这是在 webpack.config.js 中完成的,但是一旦我们进入 Node.js 领域并使用 Webpack,就会假定这是。
2021-05-15 22:11:03

您可以使用单个配置文件,并使用环境变量有条件地包含 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'),然后正常继续。

只是一个小问题:当您使用参数调用 webpack 时,例如webpack 配置中webpack -p来自webpack.optimize.UglifyJsPlugin的设置将(至少部分)被忽略(至少设置mangle: false被忽略)。
2021-04-22 22:11:03
对于阅读本文的任何人,我建议definePlugin改用它,我认为 Webpack 默认安装了它。
2021-04-24 22:11:03
请注意,这一次仅生成一个文件。因此,为了解决这个问题,应该有多个 Webpack 传递,webpack && webpack -p.
2021-05-02 22:11:03
Node 有一个“默认”变量,称为 NODE_ENV。
2021-05-12 22:11:03
不是调用选项compress而不是minimize
2021-05-16 22:11:03

您可以使用不同的参数运行 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

可以使用更标准的方式在 webpack 中传递环境指示:stackoverflow.com/questions/44113359/...
2021-04-30 22:11:03
这个想法很酷,但现在不起作用,webpack 会大喊“未知参数:最小化” 解决方案:在以下链接中使用 --env.minimize 更多详细信息 github.com/webpack/webpack/issues/2254
2021-05-12 22:11:03
对我来说似乎很简单的解决方案;只是从 webpack v3.5.5 开始,它有一个名为 --optimize-minimize 或 -p 的内置开关。
2021-05-15 22:11:03

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

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

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

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

谢谢@everett1992,这个解决方案很好用。大多数时候我运行开发构建,然后当我完成时,我使用 -p 标志来输出一个缩小的生产构建。无需创建两个单独的 Webpack 配置!
2021-05-07 22:11:03

也许我来晚了,但我有同样的问题,所以我为此编写了一个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 两次,它就可以工作!^^

这个插件似乎与 SourceMapDevToolPlugin 不兼容。有什么建议可以保留源地图?
2021-04-23 22:11:03
@Howard Man,你来得正是时候:)。至少对我来说。非常感谢伟大的插件!似乎与 webpack 2 和 -p 选项完美配合。
2021-04-23 22:11:03
@BhavikUp,不支持。您认为您真的需要将源映射与最终的 js 文件一起输出吗?
2021-04-30 22:11:03
“不需要执行两次 webpack [...]” 不错,但是estus的解决方案也不需要“执行两次 webpack”,另外不需要添加第三方插件。
2021-05-03 22:11:03