webpack生產環境和開發環境的配置

最近在做公司遊戲預約頁面的時候,在配置webpack的時候,忽略了生產模式切換,導致開發過程中有些痛苦,當改動樣式或者某個插件配置時,本地server要等待編譯很久才生效。用了很久的webpack做開發,之前一直沒太在意,現在特地整理下,也爲以後做項目更加規範吧。

在配置前,還是先了解下生產環境和開發環境有哪些區別,知道這些後,才知道我們到底要做些什麼

開發環境(development)生產環境(production)的構建目標差異很大。在開發環境中,我們需要具有強大的、具有實時重新加載(live reloading)或熱模塊替換(hot module replacement)能力的 source map 和 localhost server。而在生產環境中,我們的目標則轉向於關注更小的 bundle,更輕量的 source map,以及更優化的資源,以改善加載時間。由於要遵循邏輯分離,我們通常建議爲每個環境編寫彼此獨立的 webpack 配置

雖然,以上我們將生產環境開發環境做了略微區分,但是,請注意,我們還是會遵循不重複原則(Don't repeat yourself - DRY),保留一個“通用”配置。爲了將這些配置合併在一起,我們將使用一個名爲 webpack-merge 的工具。通過“通用”配置,我們不必在環境特定(environment-specific)的配置中重複代碼

那麼,開始配置文件的編寫。這裏,我們把公共的配置,放到webpack.common.js中,生產環境配置放到webpack.prod.js中,開發環境配置放到webpack.dev.js中。

公共配置(webpack.common.js)中,我們常用的插件,入口、輸出文件、模塊配置

  1. const path = require('path');
  2. const CleanWebpackPlugin = require('clean-webpack-plugin');
  3. const HtmlWebpackPlugin = require('html-webpack-plugin');
  4. module.exports = {
  5. entry: {
  6. app: './src/index.js'
  7. },
  8. plugins: [
  9. new CleanWebpackPlugin(['dist']),
  10. new HtmlWebpackPlugin({
  11. title: 'Production'
  12. })
  13. ],
  14. module: {
  15. rules: [
  16. {
  17. test: /\.css$/,
  18. use: ['style-loader', 'css-loader']
  19. }
  20. ]
  21. },
  22. output: {
  23. filename: '[name].bundle.js',
  24. path: path.resolve(__dirname, 'dist')
  25. }
  26. }

生產配置(webpack.prod.js)中配置"source-map",生產環境下的插件,然後合併

  1. const merge = require('webpack-merge');
  2. const webpack = require('webpack');
  3. const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
  4. const common = require('./webpack.common');
  5. module.exports = merge(common, {
  6. devtool: 'source-map',
  7. plugins: [
  8. new UglifyJSPlugin({
  9. sourceMap: true
  10. }),
  11. new webpack.DefinePlugin({
  12. 'process.env.NODE_ENV': JSON.stringify('production')
  13. })
  14. ]
  15. })

注意這裏使用了webpack.DefinePlugin()插件,來指定環境。這是因爲,許多 library 將通過與 process.env.NODE_ENV 環境變量關聯,以決定 library 中應該引用哪些內容。例如,當不處於生產環境中時,某些 library 爲了使調試變得容易,可能會添加額外的日誌記錄(log)和測試(test)。其實,當使用 process.env.NODE_ENV === 'production' 時,一些 library 可能針對具體用戶的環境進行代碼優化,從而刪除或添加一些重要代碼

開發環境(webpack.dev.js)中配置"inline-source-map"、本地服務器,然後合併公共配置

  1. const merge = require('webpack-merge');
  2. const common = require('./webpack.common.js');
  3. module.exports = merge(common, {
  4. devtool: 'inline-source-map',
  5. devServer: {
  6. contentBase: './dist'
  7. }
  8. })

現在,我們可以在package.json中爲生產和開發模式配置單獨的運行腳本,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章