Webpackで圧縮されていない圧縮されたバンドルを構築する方法は?


233

これが私の 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

回答:


151

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と一緒に使用して、同じことを1つのパスで実行することです。


1
@FeloVilches私はこれがwebpack.config.jsで行われることについては言及していませんが、Node.jsランドにいてWebpackを使用すると、これは推定されます。
Estus Flask 2017

3
うーん、webpack 4で私が手に入れました:Error: webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead.
entithat

3
更新:terser-webpack-plugin webpack.js.org/plugins/terser-webpack-plugin
ijse

156

単一の構成ファイルを使用し、環境変数を使用して条件付きでUglifyJSプラグインを含めることができます。

var webpack = require('webpack');

var 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'
  },
  plugins: PROD ? [
    new webpack.optimize.UglifyJsPlugin({
      compress: { warnings: false }
    })
  ] : []
};

そして、それを縮小したいときにこの変数を設定するだけです:

$ PROD_ENV=1 webpack


編集:

コメントで述べたように、NODE_ENV通常は(慣例により)特定の環境が本番環境か開発環境かを示すために使用されます。これを確認するには、を設定してvar PROD = (process.env.NODE_ENV === 'production')、通常どおり続行することもできます。


6
ノードにはそのための「デフォルト」変数が1つあり、NODE_ENVと呼ばれます。
JCM 2016

2
compress代わりにオプションが呼び出されていませんminimizeか?
Slava Fomin II

1
ちょっとした落とし穴:webpack configのwebpack.optimize.UglifyJsPluginwebpack -pの設定などの引数を使用してwebpackを呼び出すと、(少なくとも部分的に)無視されます(少なくとも設定mangle: falseは無視されます)。
クリスチャンウルブリッチ2016年

2
これにより、一度に1つのファイルのみが生成されることに注意してください。したがって、この問題を解決するためには、複数のWebpackパスが必要webpack && webpack -pです。
Estus Flask 2017

1
これを読んでいる人は、definePlugin代わりに使用することをお勧めします。これは、Webpackでデフォルトでインストールされると思います。
ベン・ガブラー

54

異なる引数で2回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


2
私には非常に簡単な解決策のようです。Webpack v3.5.5以降、-optimize-minimizeまたは-pと呼ばれるスイッチが組み込まれています。
2017

アイデアはクールですが、今は機能しません。webpackは「不明な引数:最小化」と叫びます解決策:次のリンクで--env.minimizeの
Zhli

WebPACKの環境指標を渡すために、より標準的な方法を使用することができます。stackoverflow.com/questions/44113359/...
MaMazav

40

別の答えを追加するには、フラグ-p(略して--optimize-minimize)により、デフォルトの引数でUglifyJSが有効になります。

-pフラグがユースケースに適合しない可能性があるため、1回の実行から縮小された未加工のバンドルを取得したり、異なる名前のバンドルを生成したりすることはありません。

逆に、-dオプションは--debug --devtool sourcemap --output-pathinfo

マイwebpack.config.jsの省いdevtooldebugpathinfo、およびこれら二つのフラグの賛成でプラグインminmize。


@ everett1992に感謝します。このソリューションはうまく機能します。ほとんどの場合、開発ビルドを実行し、完了したら-pフラグを使用して、縮小された本番ビルドを吐き出します。2つの個別のWebpack構成を作成する必要はありません。
pmont 2016

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の2つのファイルが作成されます。webpackを2回実行する必要はありません。それだけで動作します!^^


このプラグインは、SourceMapDevToolPluginと互換性がないようです。ソースマップを保持するための提案はありますか?
BhavikUp 2016年

@BhavikUp、それはサポートされていません。最終的なjsファイルと一緒に出力されるソースマップが本当に必要だと思いますか?
ハワード、

1
「webpackを2回実行する必要はありません[...]」estusのソリューションでは、「webpackを2回実行する」必要がなく、サードパーティのプラグインを追加する必要もありません。
Louis

@ハワードマン、あなたは時間通りに正しい:)。少なくとも私にとっては。すばらしいプラグインをありがとう!webpack 2と-pオプションで完全に動作するようです。
ギャパートン2017年

34

私の意見では、それは たくさんちょうど使用する方が簡単UglifyJSの直接ツール:

  1. npm install --save-dev uglify-js
  2. ./dst/bundle.jsファイルの作成など、通常どおりwebpackを使用します。
  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をグローバルにインストールする必要はありません。プロジェクトのローカルにインストールするだけです。


はい、これは一度だけビルドできる簡単なソリューションです
Flion

15

コードを縮小するものとしないものの2つの構成を作成し(optimize.UglifyJSPlugin行を削除するだけ)、両方の構成を同時に実行できます。 $ webpack && webpack --config webpack.config.min.js


2
おかげで、これはうまく機能しますが、これが非常に一般的な使用例(ライブラリのビルドについてのみ)であることを考えると、2つの構成ファイルを維持するよりもこれを行うより良い方法があるといいでしょう。
Rick Strahl、2017年

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戦略に従って異なる設定をエクスポートすることで、複数のビルドを作成できます。


古くてどういうわけかまだ関連のある質問、Mauroに役立つ回答を
ありがとう

1
minimizeドキュメントにオプションが見つかりません。おそらく非推奨ですか?
adi518 2017年

@ adi518たぶんあなたはプラグインのより新しいバージョンを使っていて、webpackにバンドルされているものではないのですか?
thexpand 2018年

4

webpack entry.jsx ./output.js -p

-pフラグ付きで動作します。


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れていないバージョンでは、出力ファイル名をに変更し、縮小版では相互に上書きしないようにしてください。


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
        }
    };
}

package.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

不明なエラーERROR:Invalid typeof value
Kushal Jain

3

この問題の新しい解決策を見つけました。

これは構成の配列を使用して、webpackが縮小バージョンと非縮小バージョンを並行してビルドできるようにします。これにより、ビルドが速くなります。Webpackを2回実行する必要はありません。追加のプラグインは必要ありません。ただウェブパック。

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すると、縮小バージョンと非縮小バージョンが同時にビルドされます。


1

次のように配列をエクスポートする必要があります。

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'),
];

0

Webpack構成で2つのエントリポイントを定義できます。1つは通常のjs用で、もう1つは縮小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が作成されます。追加のプラグインは必要ありません。


非推奨の説明
オラフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.