Voici mon 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})
]
};
Je construis avec
$ webpack
Dans mon dossier dist
, je ne reçois que
bundle.min.js
bundle.min.js.map
J'aimerais aussi voir le bundle.js
non compressé
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
})
]
};
Depuis Webpack 4, webpack.optimize.UglifyJsPlugin
est obsolète et son utilisation entraîne une erreur:
webpack.optimize.UglifyJsPlugin a été supprimé, utilisez plutôt config.optimization.minimize
Comme le manuel explique, le plugin peut être remplacé par l'option minimize
. Une configuration personnalisée peut être fournie au plug-in en spécifiant UglifyJsPlugin
instance:
const webpack = require("webpack");
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
// ...
optimization: {
minimize: true,
minimizer: [new UglifyJsPlugin({
include: /\.min\.js$/
})]
}
};
Cela fait le travail pour une installation simple. Une solution plus efficace consiste à utiliser Gulp avec Webpack et à faire la même chose en un seul passage.
Vous pouvez utiliser un seul fichier de configuration et inclure le plug-in UglifyJS de manière conditionnelle à l'aide d'une variable d'environnement:
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 }
})
] : []
};
et ensuite il suffit de définir cette variable lorsque vous souhaitez la réduire:
$ PROD_ENV=1 webpack
Edit:
Comme mentionné dans les commentaires, NODE_ENV
est généralement utilisé (par convention) pour indiquer si un environnement particulier est un environnement de production ou de développement. Pour le vérifier, vous pouvez également définir var PROD = (process.env.NODE_ENV === 'production')
et continuer normalement.
Vous pouvez exécuter webpack deux fois avec des arguments différents:
$ webpack --minimize
puis vérifiez les arguments de ligne de commande dans 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());
}
...
exemple webpack.config.js
Pour ajouter une autre réponse, l'indicateur -p
(abréviation de --optimize-minimize
) activera UglifyJS avec les arguments par défaut.
Vous n'obtiendrez pas un ensemble restreint et brut à partir d'un seul cycle, ni ne générerez des ensembles portant un nom différent, de sorte que l'indicateur -p
ne corresponde pas nécessairement à votre cas d'utilisation.
Inversement, l'option -d
est un raccourci pour --debug
--devtool sourcemap
--output-pathinfo
Mon webpack.config.js omet devtool
, debug
, pathinfo
et le plug-in minmize en faveur de ces deux drapeaux.
Peut-être que je suis en retard ici, mais j'ai le même problème, alors j'ai écrit un nminified-webpack-plugin à cet effet.
Installation
npm install --save-dev unminified-webpack-plugin
Utilisation
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()
]
};
En procédant comme ci-dessus, vous obtiendrez deux fichiers library.min.js et library.js. Pas besoin d'exécuter webpack deux fois, ça marche! ^^
À mon avis, il est beaucoup plus facile d'utiliser l'outil glifyJS directement:
npm install --save-dev uglify-js
./dst/bundle.js
.Ajoutez une commande build
à votre 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
.Pas besoin d'installer uglify-js globalement, installez-le simplement localement pour le projet.
Vous pouvez créer deux configurations pour Webpack, une qui minimise le code et une autre (ne supprimez que la ligne optimise.UglifyJSPlugin), puis exécutez les deux configurations en même temps $ webpack && webpack --config webpack.config.min.js
Selon cette ligne: https://github.com/pingyuanChen/webpack-uglify-js-plugin/blob/master/index.js#L117
devrait être quelque chose comme:
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
})
]
};
En effet, vous pouvez avoir plusieurs versions en exportant différentes configurations en fonction de vos stratégies env/argv.
Vous pouvez formater votre webpack.config.js comme ceci:
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 }),
],
};'
Et ensuite, pour le construire non finifié, (dans le répertoire principal du projet):
$ webpack
Pour le construire, procédez comme suit:
$ NODE_ENV=production webpack
Remarques: Assurez-vous que pour la version non minisée, vous modifiez le nom du fichier de sortie en library.js
et pour le minified library.min.js
afin qu'ils ne se écrasent pas.
webpack entry.jsx ./output.js -p
fonctionne pour moi, avec le drapeau -p
.
J'avais le même problème et je devais satisfaire à toutes ces exigences:
Je l'ai finalement résolu comme suit:
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"
}
}
Ensuite, je peux construire par (n'oubliez pas de npm install
avant):
npm run-script build
Vous devriez exporter un tableau comme ceci:
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'),
];
J'ai trouvé une nouvelle solution à ce problème.
Ceci utilise un tableau de configuration pour permettre à Webpack de construire la version minifiée et non minifiée en parallèle. Cela rend la construction plus rapide. Pas besoin d'exécuter le webpack deux fois. Pas besoin de plugins supplémentaires. Juste 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;
}
};
Lancer webpack
ne construira que la version non minifiée.
Lancer webpack --env=production
construira les versions minifiée et non-minifiée en même temps.