2014-09-21 95 views
184

這裏是我的webpack.config.js如何使用webpack構建縮小的和未壓縮的包?

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

回答

102

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

它可以完成簡單的設置。更有效的解決方案是將Gulp和Webpack一起使用,並且一次完成相同的事情。

+1

這固定對我來說... 插件:[ 新的webpack.optimize.UglifyJsPlugin({最小:真正}) ] – codemeasandwich 2016-01-20 12:51:09

+0

在答案中,這似乎是最好的之一。 – 2017-01-27 17:37:07

+3

這對我來說非常合適 - 這裏最好的答案。 – repoleved 2017-01-29 17:29:42

15

您可以創建兩個CONFIGS爲的WebPack,一個minifies代碼和一個不(只是刪除optimize.UglifyJSPlugin線),然後同時運行同時配置$ webpack && webpack --config webpack.config.min.js

+1

謝謝,這個工程很好,但是如果有更好的方法來做這件事,比起維護兩個配置文件,它確實會很好,因爲這是一個常見的用例(幾乎任何庫構建)。 – 2017-10-10 21:03:51

139

您可以使用一個配置文件,包括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'),並繼續正常。

+3

節點有一個「默認」變量,它被稱爲NODE_ENV。 – JCM 2016-02-15 23:11:41

+2

不是''compress'而不是'minim'選項嗎? – 2016-03-31 13:46:13

+0

@SlavaFominII你是對的。更新了答案 – lyosef 2016-04-02 23:25:53

36

要添加另一個答案,標記-p--optimize-minimize的簡稱)將啓用具有默認參數的UglifyJS。

您不會從單次運行中獲得縮小的原始包或生成不同名稱的包,因此-p標誌可能不符合您的使用案例。

相反的-d選項是短期的--debug--devtool sourcemap--output-pathinfo

我webpack.config.js省略devtooldebugpathinfo,並有利於這兩個標誌的minmize插件。

+0

謝謝@ everett1992,這個解決方案效果很好。絕大多數時候我運行開發版本,然後當我完成時,我使用-p標誌來吐出一個縮小的生產版本。無需創建兩個獨立的Webpack配置! – pmont 2016-12-11 07:01:13

51

你可以用不同的參數運行的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-minim或-p的內置開關。 – synergetic 2017-09-03 02:02:23

+0

這個想法很酷,但現在不工作,webpack會大喊「未知參數:最小化」 解決方案:在以下鏈接https:// github中使用--env.minimize 更多詳細信息。com/webpack/webpack/issues/2254 – Zhli 2017-12-21 10:41:12

+0

可以使用更多標準方式在webpack中傳遞環境指示:https://stackoverflow.com/questions/44113359/passing-command-line-arguments-to-webpack-config-js – MaMazav 2018-01-08 20:20:24

35

也許我遲到了這裏,但我有同樣的問題,所以我寫了一個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兩次,它只是工作^^

+0

這個插件似乎與SourceMapDevToolPlugin不兼容。任何建議保留源地圖? – BhavikUp 2016-10-11 05:58:05

+0

@BhavikUp,它不受支持。你認爲你真的需要源圖與最終的js文件一起輸出嗎? – Howard 2016-10-14 02:50:28

+1

「不需要執行webpack兩次[...]」很好,但[estus](http://stackoverflow.com/a/34018909/1906307)的解決方案也不需要「執行webpack兩次」不需要添加第三方插件。 – Louis 2016-11-04 12:57:38

31

在我看來這是一個很多容易只是直接使用的UglifyJS工具:

  1. npm install --save-dev uglify-js
  2. 使用的WebPack爲正常,如建立一個./dst/bundle.js文件。
  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. 每當你想建立一個你的包,以及變醜代碼和sourcemaps,運行npm run build命令。

無需全局安裝uglify-js,只需在本地爲項目安裝。

+0

是的,這是一個簡單的解決方案,只允許您構建一次 – Flion 2016-08-01 08:55:37

+0

殺手!那簡單! – 2018-02-01 12:54:08

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

然後建立它unminified運行(而在項目的主目錄):

$ webpack 

構建它精縮運行:

$ NODE_ENV=production webpack 

評論: 請確保對於無語的版本ñ您將輸出文件名更改爲library.js並將縮小的library.min.js更改爲不覆蓋對方。

10

這一行根據: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的戰略出口不同CONFIGS。

+0

感謝您對一個老舊的問題,但不知何故仍然相關的問題,Mauro^_^ – naomik 2017-01-30 11:58:36

+1

在文檔中找不到選項'minim'。也許它已被棄用? – adi518 2017-03-30 10:31:36

+0

@ adi518也許你正在使用更新版本的插件,而不是一個,捆綁在webpack內? – thexpand 2018-03-07 08:23:17

0

您可以在webpack配置中定義兩個入口點,一個用於正常的js,另一個用於縮小的js。然後你應該輸出你的bundle的名字,並配置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後,你會得到bundle.js和bundle.min.js在DIST文件夾中,無需額外的插件。

1

我有同樣的問題,而不得不滿足所有這些要求:

  • 精縮+非精縮版(如題)
  • 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