Как создать миниатюрный и несжатый пакет с webpack?

Здесь мой 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

Ответ 1

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 и делать то же самое за один проход.

Ответ 2

Вы можете использовать один файл конфигурации и включать плагин 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


Edit:

Как упоминалось в комментариях, NODE_ENV обычно используется (по соглашению), чтобы указать, является ли конкретная среда производством или средой разработки. Чтобы проверить это, вы также можете установить var PROD = (process.env.NODE_ENV === 'production') и продолжить нормально.

Ответ 3

Вы можете запустить 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());
}

...

example webpack.config.js

Ответ 4

Чтобы добавить еще один ответ, флаг -p (сокращение от --optimize-minimize) будет включать UglifyJS с аргументами по умолчанию.

Вы не получите ни один из пронумерованных и необработанных пакетов из одного прогона или создадите пакеты с разными именами, поэтому флаг -p может не соответствовать вашему прецеденту.

Наоборот, параметр -d является коротким для --debug --devtool sourcemap --output-pathinfo

Мой webpack.config.js пропускает devtool, debug, pathinfo и плагин minmize в пользу этих двух флагов.

Ответ 5

Возможно, я опаздываю здесь, но у меня такая же проблема, поэтому я написал 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 дважды, он просто работает! ^^

Ответ 6

По-моему, лот проще просто использовать инструмент UglifyJS:

  • npm install --save-dev uglify-js
  • Использовать webpack как обычно, например. создание файла ./dst/bundle.js.
  • Добавьте команду build в свой package.json:

    "scripts": {
        "build": "webpack && uglifyjs ./dst/bundle.js -c -m -o ./dst/bundle.min.js --source-map ./dst/bundle.min.js.map"
    }
    
  • Всякий раз, когда вы хотите создать свой пакет, а также углубленный код и исходные коды, запустите команду npm run build.

Не нужно устанавливать uglify-js глобально, просто установите его локально для проекта.

Ответ 7

Вы можете создать две конфигурации для webpack, которая минимизирует код и тот, который этого не делает (просто удалите строку optimize.UglifyJSPlugin), а затем запустите обе конфигурации в одно и то же время $ webpack && webpack --config webpack.config.min.js

Ответ 8

В соответствии с этой строкой: 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.

Ответ 9

webpack entry.jsx./output.js -p

работает для меня, с флагом -p.

Ответ 10

Вы можете отформатировать свой 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 }),
    ],
};'

И затем, чтобы построить его unminified run (в основном каталоге проекта):

$ webpack

Чтобы создать минимальный прогон:

$ NODE_ENV=production webpack

Примечания: Убедитесь, что для несроченной версии вы изменяете имя выходного файла на library.js и для мини-library.min.js, чтобы они не перезаписывали друг друга.

Ответ 11

У меня была та же проблема, и я должен был удовлетворить все эти требования:

  • Minified + не минимизированная версия (как в вопросе)
  • 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

Ответ 12

Я нашел новое решение для этой проблемы.

При этом используется массив конфигурации, позволяющий веб-пакету параллельно создавать минимизированную и минимизированную версии. Это делает сборку быстрее. Нет необходимости запускать веб-пакет дважды. Не нужно дополнительных плагинов. Просто веб-пакет.

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 вы создадите минимизированную и неминифицированную версии одновременно.

Ответ 13

Вы должны экспортировать массив следующим образом:

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

Ответ 14

Вы можете определить две точки входа в своей конфигурации webpack, одну для вашего обычного js, а другую для мини-js. Затем вы должны вывести свой пакет с его именем и настроить плагин UglifyJS для включения файлов min.js. Дополнительную информацию см. В примере конфигурации веб-пакета:

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 вы получите bundle.js и bundle.min.js в своей папке dist, нет необходимости в дополнительном плагине.