Web paketi ile küçültülmüş ve sıkıştırılmamış paket nasıl oluşturulur?


233

İşte benim 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})
  ]
};

İle inşa ediyorum

$ webpack

Benim içinde distklasörün, sadece alıyorum

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

Sıkıştırılmamışları da görmek isterim bundle.js

Yanıtlar:


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.UglifyJsPluginkullanımdan kaldırıldığından ve kullanımı hataya neden olduğundan:

webpack.optimize.UglifyJsPlugin kaldırıldı, lütfen config.optimization.minimize komutunu kullanın

Gibi manuel açıklıyor, eklenti ile değiştirilebilir minimizeseçenek. Özel yapılandırma, UglifyJsPluginörnek belirtilerek eklentiye sağlanabilir :

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

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

Bu, basit bir kurulum için işi yapar. Daha etkili bir çözüm Gulp'i Webpack ile birlikte kullanmak ve aynı şeyi bir geçişte yapmaktır.


1
@FeloVilches Bunun webpack.config.js dosyasında yapıldığından bahsetmiyorum bile, ancak Node.js topraklarında olduğumuzda ve Webpack kullandığımızda bu varsayım yapıldı.
Estus Flask

3
Hmm, içinde WebPack 4 i got:Error: webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead.
entithat

3
Güncelleme: artık terser-webpack-plugin webpack.js.org/plugins/terser-webpack-plugin
ijse

156

Tek bir yapılandırma dosyası kullanabilir ve bir ortam değişkeni kullanarak UglifyJS eklentisini koşullu olarak ekleyebilirsiniz:

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 }
    })
  ] : []
};

ve daha sonra küçültmek istediğinizde bu değişkeni ayarlayın:

$ PROD_ENV=1 webpack


Düzenle:

Yorumlarda belirtildiği gibi NODE_ENV, genellikle (sözleşmeyle) belirli bir ortamın bir üretim veya geliştirme ortamı olup olmadığını belirtmek için kullanılır. Kontrol etmek için ayrıca ayarlayabilir var PROD = (process.env.NODE_ENV === 'production')ve normal şekilde devam edebilirsiniz .


6
Düğümde bunun için bir "varsayılan" değişken vardır, buna NODE_ENV adı verilir.
JCM

2
Seçenek compressyerine çağrılmıyor minimizemu?
Slava Fomin II

1
Sadece küçük bir gotcha: webpack'i webpack yapılandırmanızdaki webpack -payarlar gibi argümanlarla çağırdığınızda , webpack yapılandırmanızdaki (en azından kısmen) yok sayılır (en azından ayar mangle: falseyok sayılır).
Christian Ulbrich

2
Bunun aynı anda yalnızca bir dosya oluşturduğuna dikkat edin. Bu nedenle, bu çalışmanın soru için birden fazla Webpack geçişi olması gerekir webpack && webpack -p.
Estus Flask

1
Bunu okuyan herkes için definePluginbunun yerine Webpack ile varsayılan olarak yüklendiğini düşünüyorum.
Ben Gubler

54

Web paketini farklı argümanlarla iki kez çalıştırabilirsiniz:

$ webpack --minimize

ardından komut satırı bağımsız değişkenlerini kontrol edin 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());
}

...

örnek webpack.config.js


2
Bana çok basit bir çözüm gibi görünüyor; webpack v3.5.5'ten itibaren --optimize-minimize veya -p adı verilen yerleşik bir anahtara sahiptir.
sinerjik

Fikir güzel, ama şimdi çalışmıyor, webpack "Bilinmeyen argüman: en aza indirmek" diye bağırır Çözüm: aşağıdaki linkte --env.minimize
Zhli

Web paketinde ortam gösterimini geçmek için daha standart bir yol kullanabilir: stackoverflow.com/questions/44113359/…
MaMazav

40

Başka bir cevap eklemek için bayrak -p(--optimize-minimize ) UglifyJS'yi varsayılan bağımsız değişkenlerle etkinleştirir.

Küçültülmüş ve ham bir paketi tek bir çalışmadan elde -pedemez veya farklı adlandırılmış paketler oluşturamazsınız, böylece bayrak kullanım durumunuzu karşılamayabilir.

Tersine, -dseçenek kısa--debug --devtool sourcemap --output-pathinfo

Benim webpack.config.js atlar devtool, debug, pathinfove bu iki bayrakların lehine eklentisi asgaride tutacak.


Teşekkürler everett1992, bu çözüm harika çalışıyor. Dev derlemesini çalıştırdığım zamanın büyük çoğunluğu, o zaman bitirdiğimde küçültülmüş bir üretim derlemesi tükürmek için -p bayrağı kullanıyorum. İki ayrı Webpack yapılandırması oluşturmanıza gerek yok!
pmont

36

Belki burada geç kaldım , ama aynı sorun var, bu yüzden bu amaçla bir web-eklenti yazmadım .

Kurulum

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

kullanım

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()
    ]
};

Yukarıdaki gibi yaparak, iki dosya library.min.js ve library.js dosyası alırsınız. Gerek webpack iki kez yürütmek gerek, sadece çalışıyor! ^^


Bu eklenti SourceMapDevToolPlugin ile uyumlu görünmüyor. Kaynak haritaları saklamak için herhangi bir öneriniz var mı?
BhavikUp

@BhavikUp, desteklenmiyor. Son js dosyasıyla birlikte çıktı almak için kaynak haritasına gerçekten ihtiyacınız olduğunu düşünüyor musunuz?
Howard

1
"Webpack'i iki kez yürütmeye gerek yok [...]" Güzel, ama estus'un çözümü de "webpack'i iki kez yürütmek" ve ayrıca bir üçüncü taraf eklentisi eklemek gerektirmez.
Louis

@ Adamım, tam vaktinde geldin :). En azından benim için. Harika eklenti için çok teşekkürler! Webpack 2 ve -p seçeneği ile mükemmel çalışıyor gibi görünüyor.
gaperton

34

Bence sadece UglifyJS aracını doğrudan kullanmak çok daha kolay :

  1. npm install --save-dev uglify-js
  2. Web paketini normal olarak kullanın, örneğin bir ./dst/bundle.jsdosya oluşturmak.
  3. Bir buildkomut ekleyin package.json:

    "scripts": {
        "build": "webpack && uglifyjs ./dst/bundle.js -c -m -o ./dst/bundle.min.js --source-map ./dst/bundle.min.js.map"
    }
  4. Uglified code ve sourcemaps yanı sıra bir paket oluşturmak istediğinizde, npm run buildkomutu çalıştırın .

Küresel olarak uglify-js kurmaya gerek yok, sadece proje için yerel olarak kurun.


evet bu sadece bir kez inşa etmenizi sağlayan kolay bir çözümdür
Flion

15

Web paketi için biri kodu küçülten ve diğeri (yalnızca optimize et.UglifyJSPlugin satırını kaldırın) olmayan iki yapılandırma oluşturabilir ve ardından her iki yapılandırmayı aynı anda çalıştırabilirsiniz. $ webpack && webpack --config webpack.config.min.js


2
Teşekkürler, bu harika çalışıyor, ancak böyle bir yaygın kullanım durumu (hemen hemen her kütüphane derlemesi) göz önüne alındığında, iki yapılandırma dosyasını korumaktan daha iyi bir yol olsaydı iyi olurdu.
Rick Strahl

12

Bu hatta göre: https://github.com/pingyuanChen/webpack-uglify-js-plugin/blob/master/index.js#L117

şöyle bir şey olmalı:

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

Gerçekten de env / argv stratejilerinize göre farklı konfigürasyonları dışa aktararak birden fazla yapıya sahip olabilirsiniz.


Yaşlı ama yine de alakalı bir soruya
verdiğiniz

1
minimizeDokümanlar'da seçenek bulunamıyor . Belki de kullanımdan kaldırılmıştır?
adi518

@ adi518 Belki de eklenti daha yeni bir sürümünü kullanıyorsunuz, web paketinin içinde değil, eklentinin daha yeni bir sürümünü kullanıyorsunuz?
thexpand

4

webpack entry.jsx ./output.js -p

-pbayraklı benim için çalışıyor .


4

Webpack.config.js dosyanızı şu şekilde biçimlendirebilirsiniz:

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

Ve sonra onu, projenin ana dizinindeyken sonlandırılmamış çalıştırmak için inşa etmek:

$ webpack

Minimize edilmiş çalışma oluşturmak için:

$ NODE_ENV=production webpack

Notlar: Sonlandırılmamış sürüm için çıktı dosyasının adını library.js, küçültülmüş olarak ve küçültülmüş olarak değiştirdiğinizden emin olun, library.min.jsböylece birbirlerinin üzerine yazmazlar .


3

Aynı sorunu yaşadım ve tüm bu gereksinimleri karşılamak zorunda kaldım:

  • Küçültülmüş + Küçültülmemiş sürüm (sorudaki gibi)
  • ES6
  • Çapraz platform (Windows + Linux).

Sonunda şu şekilde çözdüm:

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

Sonra inşa edebilirim (Daha npm installönce unutmayın ):

npm run-script build

HATA bilinmeyen bu hatayı aldım: Geçersiz typeof değeri
Kushal Jain 9:08

3

Bu sorun için yeni bir çözüm buldum.

Web paketinin küçültülmüş ve küçültülmemiş sürümü paralel olarak oluşturmasını sağlamak için bir yapılandırma dizisi kullanır. Bu, yapıyı daha hızlı hale getirir. Web paketini iki kez çalıştırmanıza gerek yoktur. Eklentilere gerek yok. Sadece 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;
  }
};

Çalıştırma webpackyalnızca küçültülmemiş sürümü oluşturur.

Running webpack --env=production, küçültülmüş ve küçültülmemiş sürümü aynı anda oluşturur.


1

Bunun gibi bir diziyi dışa aktarmalısınız:

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 yapılandırmanızda biri normal js, diğeri minimize js için olmak üzere iki giriş noktası tanımlayabilirsiniz. Daha sonra paketinizi adıyla çıkarmalı ve UglifyJS eklentisini min.js dosyalarını içerecek şekilde yapılandırmalısınız. Daha fazla ayrıntı için örnek web paketi yapılandırmasına bakın:

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'i çalıştırdıktan sonra, dağıtım klasörünüzde bundle.js ve bundle.min.js dosyasını alacaksınız, ekstra eklentiye gerek yok.


kullanımdan kaldırıldı
Olaf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.