亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

webpack開發環境和生產環境的深入理解

2024-05-06 16:46:47
字體:
來源:轉載
供稿:網友

以前自己寫一小項目時,webpack的配置基本就是一套配置,沒有考慮生產環境和開發環境的區分,最近在做一個復雜的商城項目接觸到了webpack的高級配置,經過兩天的研究,寫出了一份目前來說比叫滿意的配置,在這里分享一下。

如何區分開發環境和生產環境?

眾所周知,webpack時基于node.js平臺運行的,要區分開發環境和生產環境還要存,node入手。我們啟動webpack時,都需要輸入一些命令,npm run 、yarn start之類的,所以我們就從命令行入手,告訴webpack,當前是什么環境。

package.json

{  "name": "webpac-demo",  "version": "1.0.0",  "description": "webpack練習",  "main": "index.js",  "scripts": {    //配置開發環境參數。注意:真實開發中 package.json 文件中不能有注釋    "dev": "webpack --env=development",    //配置生產環境參數    "dist": "webpack --env=production",    "start": "webpack-dev-server --env=development"  },  "dependencies": {    "font-awesome": "^4.7.0",    "react": "^16.2.0",    "react-dom": "^16.2.0"  },  "devDependencies":{  ...  }}

這樣配置,當我們在命令行輸入 npm run dev 和 npm run dist 時,就會附帶一些參數到命令行中,有了參數,我們該如何拿到呢?那就要用到 node 的一個命令行參數解析引擎了。

minimist

minimist輕量級的命令行參數解析引擎

// test.jsvar args = require('minimist')(process.argv.slice(2));console.log(args.hello);$ node test.js --env=production// production$ node test.js --env=development// development$ node test.js --env// true 注意:不是空字符串而是true

minimist會把參數解析成一個JSON對象:{key:value},有了這個JSON對象,我們就可以知道,當前的命令是要執行開發打包,還是生產打包了。

// webpack.config.jsconst webpack = require('webpack');//當前項目的絕對路勁const path = require('path');// 命令行參數解析引擎const argv = require('minimist')(process.argv.slice(2));let env = null;switch (argv.env) {  case 'production':    //生產環境配置文件名     env = 'webpack.config.prod';    break;  default:    //開發環境配置文件名     env = 'webpack.config.dev';}console.log(`當前是 ${argv.env} 打包`);// 這時候,我們就可以加載相應的wabpack配置了。module.exports = require( path.resolve( '加載的配置文件路勁',env ) );

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

開發環境配置

在開發環境下,我們首先考慮的是方便開發,方便代碼調試,不需要考慮代碼合并和css樣式分離這些。

這里主要說三個 :1.css模塊化;2.模塊熱替換功能;3.source-map(代碼映射)

// 開發環境打包配置const path = require('path');const webpack = require('webpack');const base = require('./webpack.config.base')const dfPath = require('./path')// webpack配置合并工具const merge =require('webpack-merge')const RS = (...arg)=>path.resolve( __dirname , ...arg )// 合并方式配置let strategyMerge = merge.strategy({  entry: 'prepend'});let config = {  entry: {    app: path.resolve(dfPath.root,'src/app.js')  },  output: {    path: dfPath.dist,    filename: '[name].bundle.js',    publicPath: '/',    chunkFilename: '[name].sepChunk.js'  },  module:{    rules: [      {        test: //.js$/,        use:['babel-loader'],        exclude: [          dfPath.node_modules        ]      },      {        test://.css$/,        use:[          'style-loader',          {            loader:'css-loader',            options:{              // css模塊化,方便多人開發              module:true,              // 定義模塊化css后的類名(默認為hash值,可讀性差)path:路勁; name:文件名; local:本地定義的className              localIdentName: '[path][name]__[local]--[hash:base64:5]'            },          }        ],        // 排除的文件,遇到這些文件不會用當前 loader 處理,也就不會模塊化        exclude:[          RS('./src/common'),                   RS('node_modules')        ]      },      {        test://.css$/,        use:['style-loader','css-loader'],        include:[          RS('./src/common'),                   RS('node_modules')        ]              },                  {        test: //.(png|jpg|jpeg|gif)$/,        use: ['url-loader?limit=8192'],      }    ]  },  plugins:[    // 模塊熱替換功能    new webpack.HotModuleReplacementPlugin()  ],    // 代碼映射,方便報錯時,找到對應的源代碼  devtool: 'cheap-module-eval-source-map',  devServer:{    // 服務器打包后,輸出的資源路勁    publicPath:'/',    open:true  }};// 導出合并后的webpack配置module.exports = strategyMerge( base , config );

生產環境配置

相比開發環境,生產環境打包是要最后發布到服務器部署的代碼,我們需要盡量保持代碼簡潔,加載性能最優,不需要調試輔助工具。

我們從這幾個方面優化 :1.公共模塊拆分,單獨打包;2. css文件分離,單獨打包輸出;3.代碼壓縮;

// 生產環境配置const webpack = require('webpack');const base = require('./webpack.config.base')const path = require('path');const dfPath = require('./path');const merge = require('webpack-merge');// 壓縮工具const ClosureCompilerPlugin = require('webpack-closure-compiler');// css單獨打包插件const extractTextWebpackPlugin = require('extract-text-webpack-plugin');const extractCSS = new extractTextWebpackPlugin('assets/css/[name]_[contenthash:6].css');// weback合并配置let strategyMerge = merge.strategy({  entry: 'replace',  output: 'replace',  module:{    rules: 'replace'  }});let config ={  entry: {    // 公共模塊拆分,這些代碼會單獨打包,一般我們會把引用的框架文件拆分出來,方便瀏覽器緩存,節省資源。    vender:['react'],    app: path.resolve(dfPath.root,'src/app.js')  },    output: {    path: dfPath.dist,    filename: 'assets/js/[name]_[chunkhash].bundle.js',    publicPath: '/',    chunkFilename: 'assets/js/[name].sepChunk.js',    hashDigestLength: 6  },  module:{    rules: [      {        test: //.js$/,        use:['babel-loader'],        exclude: [          dfPath.node_modules        ]      },      /* 開啟 css單獨打包 和 css模塊化的配置 */       {        test: //.css$/,        use: extractCSS.extract({          use: [            {              loader: 'css-loader',              options:{                modules: true              }                          }          ]        })      },           {        test: //.(png|jpg|jpeg|gif)$/,        use: [          {            loader: 'url-loader',            options:{              limit:8192,              name: '[name]_[hash].[ext]',              outputPath: 'assets/img/'            }          }        ],      },            {        test: //.(mp4|ogg|svg|ico)$/,        use: [          {            loader: 'file-loader',            options:{              name: '[name]_[hash].[ext]',              outputPath: 'assets/media/'            }          }        ]      },      {        test: //.(woff|woff2)(/?v=/d+/./d+/./d+)?$/,        use: [          {            loader: 'url-loader',            options:{              limit:10000,              name: '[name]_[hash].[ext]',              outputPath: 'assets/font/',              mimetype: 'application/font-woff'            }          }        ]      },      {        test: //.ttf(/?v=/d+/./d+/./d+)?$/,        use: [          {            loader: 'url-loader',            options:{              limit:10000,              name: '[name]_[hash].[ext]',              outputPath: 'assets/font/',              mimetype: 'application/octet-stream'            }          }        ]      },      {        test: //.eot(/?v=/d+/./d+/./d+)?$/,        use: [          {            loader: 'file-loader',            options:{              name: '[name]_[hash].[ext]',              outputPath: 'assets/font/',            }          }        ]      },      {        test: //.svg(/?v=/d+/./d+/./d+)?$/,        use: [          {            loader: 'url-loader',            options:{              limit:10000,              name: '[name]_[hash].[ext]',              outputPath: 'assets/font/',              mimetype: 'image/svg+xml'            }          }        ]      },    ]  },  plugins:[    extractCSS,        // 設置 process.env(生產環境) 環境變量的快捷方式。    new webpack.EnvironmentPlugin({      NODE_ENV: 'production'    })        ,new ClosureCompilerPlugin()  ],  devtool: 'source-map'};module.exports = strategyMerge(base,config);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品福利在线| 国产一区二区三区在线播放免费观看| 91在线视频一区| 91精品视频一区| 中文字幕av一区二区三区谷原希美| 国产欧美日韩免费| 俺也去精品视频在线观看| 国产成人aa精品一区在线播放| 国产精品1区2区在线观看| 日韩av在线免费观看| 国产噜噜噜噜噜久久久久久久久| 精品国产一区二区三区久久久| 人人爽久久涩噜噜噜网站| 综合网日日天干夜夜久久| 欧美精品在线看| 国产a∨精品一区二区三区不卡| 欧美国产极速在线| 69**夜色精品国产69乱| 亚洲女人初尝黑人巨大| 欧美高清电影在线看| 日韩电影中文字幕| 91精品视频播放| 国产日韩中文字幕在线| 亚洲热线99精品视频| 国产美女扒开尿口久久久| 成人444kkkk在线观看| 97视频在线观看免费高清完整版在线观看| 91国自产精品中文字幕亚洲| 亚洲尤物视频网| 97精品视频在线播放| 久色乳综合思思在线视频| 久久久电影免费观看完整版| 神马久久久久久| 91精品国产自产91精品| 精品伊人久久97| 亚洲综合精品一区二区| 播播国产欧美激情| 国产精自产拍久久久久久蜜| 国产精品成人免费视频| 亚洲国产天堂久久国产91| 成人网页在线免费观看| 国产精选久久久久久| 亚洲乱码av中文一区二区| 欧美综合国产精品久久丁香| 国产精品视频不卡| 国产亚洲人成a一在线v站| 亚洲电影成人av99爱色| 7m精品福利视频导航| 中文字幕日韩av| 欧美日韩亚洲一区二区| 国产精品成人v| 欧美日韩福利电影| 国产日韩欧美中文在线播放| 欧美猛交ⅹxxx乱大交视频| 国产精品久久久久久久午夜| 欧美性videos高清精品| 久久精品国产久精国产一老狼| 欧美激情一区二区三级高清视频| 亚洲人成在线免费观看| 亚洲人精选亚洲人成在线| 久久天天躁夜夜躁狠狠躁2022| 久久天天躁狠狠躁老女人| 国产精品午夜一区二区欲梦| 亚洲国产精品999| 日韩a**中文字幕| 国产精品美乳在线观看| 97色在线视频| 久久av在线看| 国产福利精品视频| 少妇高潮久久77777| 欧美床上激情在线观看| 国产在线高清精品| 国产在线观看精品一区二区三区| 亚洲第一页自拍| 亚洲高清一区二| 国产精品福利久久久| 97在线视频国产| 欧美性猛交xxxx| 国产丝袜精品第一页| 97超级碰碰人国产在线观看| 亚洲人精选亚洲人成在线| 久久久久久久久91| 青青久久aⅴ北条麻妃| 青青精品视频播放| 欧美日韩国产中文精品字幕自在自线| 在线播放精品一区二区三区| 欧美成年人视频网站欧美| 精品国内产的精品视频在线观看| 成年无码av片在线| 亚洲欧美在线一区二区| 美日韩精品免费观看视频| 欧美黑人一区二区三区| 国产精品久久久999| 欧美成aaa人片在线观看蜜臀| 国产精品7m视频| 亚洲xxxx3d| 国产日本欧美在线观看| 欧美视频在线免费看| 欧美极品少妇xxxxⅹ裸体艺术| 91精品国产色综合| 国产精品美女呻吟| 日日狠狠久久偷偷四色综合免费| 精品视频久久久久久久| 日本电影亚洲天堂| 日本午夜精品理论片a级appf发布| 国产日韩精品一区二区| 欧美午夜视频在线观看| 播播国产欧美激情| 成人免费福利视频| 国产精品专区第二| 欧美裸身视频免费观看| 国产丝袜视频一区| 欧美精品精品精品精品免费| 日本伊人精品一区二区三区介绍| 亚洲精品99久久久久| 色综合男人天堂| 日韩最新在线视频| 日本久久久久久久久久久| 久久精品国产电影| 最好看的2019年中文视频| 国产精品久久网| 日韩电影中文 亚洲精品乱码| 国产精品欧美日韩久久| 北条麻妃久久精品| 国产精品中文字幕在线| 成人激情视频在线| 一本色道久久88精品综合| 日韩久久免费电影| 欧美极品欧美精品欧美视频| 欧美大片va欧美在线播放| 亚洲综合中文字幕68页| 欧美电影在线观看完整版| 亚洲福利视频二区| 国产精品欧美亚洲777777| 在线观看欧美日韩国产| 91精品国产高清| 欧美成人亚洲成人日韩成人| 欧美日韩国产页| 欧美怡春院一区二区三区| 日韩久久精品电影| 不用播放器成人网| 亚洲电影成人av99爱色| 91亚洲国产精品| 国产精品免费电影| 久久久久久这里只有精品| 日韩精品视频免费在线观看| 成人精品一区二区三区| 91sa在线看| 欧美黑人一级爽快片淫片高清| 日韩影视在线观看| 欧美精品日韩www.p站| 国产999精品| 国产视频久久久久| 亚洲新声在线观看| 色狠狠久久aa北条麻妃| www.日韩av.com| 日韩电影在线观看免费| 欧美激情综合色综合啪啪五月| 欧美日韩国产精品一区| 青青草精品毛片| 国产精品免费久久久久影院| 国产精品日韩在线一区| 亚洲欧美综合精品久久成人| 中文字幕亚洲欧美日韩在线不卡|