Как создать миниатюрный и несжатый пакет с 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:
Не нужно устанавливать 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, нет необходимости в дополнительном плагине.