Webpack4+React 項目框架從0到1

一、確定項目技術棧

React 技術棧:react 16、redux、react-router-v4、redux-saga
UI 框架:antd
構建工具:webpack 4

二、webpack 基礎配置及相關包的安裝

// 初始化 package.json
npm init

// 安裝 webpack、webpack-dev-server、webpack-cli
npm i --save-dev webpack webpack-dev-server webpack-cli
// webpack.config.js
module.exports = {
  entry: '',  // 入口文件
  output: {},  // 打包出口文件
  module: {},    // 處理對應模塊
  plugin: [],  // 對應的插件
  devServer: {}  // 開發服務器配置
}

基礎 Loaders:

// 轉義 ES6
npm i babel-core babel-loader babel-preset-env -D
// 轉義 react
npm i babel-preset-react -D
// 解析 CSS 樣式 loader
npm i style-loader css-loader -D
// 引入 less 文件的話,也需要安裝對應的 loader
npm i less less-loader -D
// 處理圖片 loader
npm i file-loader url-loader -D
// 頁面 img 引用圖片
npm i html-withimg-loader -D

基礎 Plugins:

// 配置 HTML 模板
npm i html-webpack-plugin -D
// 抽離 CSS
npm i mini-css-extract-plugin -D
// 每次打包之前將dist目錄下的文件都清空
npm i clean-webpack-plugin -D

? 具體細節配置請參考文章:webpack4-用之初體驗,一起敲它十一遍

三、mock 數據

根據后端定義的接口,前端可以自己 mock 數據進行開發,從而使前后端開發更加高效。

mock 數據可以通過兩種方式實現:

(1)啟動 mock server,配置 devServer 的 target 進行請求轉發實現數據 mock(一個好的 mock server 可以用數據模板來模擬大量數據);
(2)通過 devServer 的 bypass 映射到本地 mock 目錄(json文件,有一定限制性)。

devServer: {    // 配置此靜態文件服務器,可以用來預覽打包后項目
    contentBase: path.resolve(__dirname, 'dist'),   // 開發服務運行時的文件根目錄
    host: 'localhost',  // 如果想要映射到本機IP,這里改成 '0.0.0.0'
    port: 3000,
    compress: true,  // 開發服務器是否啟動gzip等壓縮
    proxy: {
            '**/*.action': {
                // target: 'http://127.0.0.1:' + mockport,  // 如果起一個本地 mock 服務的話,可以通過 target 進行請求轉發
                bypass: function(req, res, proxyOptions) {
                    if (req.url.indexOf('.action') !== -1) {
                        req.method = 'GET';
                        return '/mock/data' + req.url.replace('.action','.json');
                    }
                }
            }
     }
}

四、區分不同的環境進行構建

一般,我們在構建項目時,會區分開發環境和線上環境:

  • 開發環境是需要方便代碼調試的,比如利用 Source Map 映射代碼方便調試,或者輸出一些提示日志。
  • 線上環境是真正運行項目代碼的,需要對代碼進行壓縮,利用瀏覽器緩存優化請求等。

有些項目還會區分聯調環境和測試環境,比如各個環境的請求地址可能不同,可以根據實際項目進行配置。

let publicPath = '';
if (process.env.NODE_ENV === 'production') {  // 線上環境
  publicPath = 'http://xxx.com';
} else {  // 開發環境
  publicPath = '/dist';
}

? webpack4.0打包優化策略(二)

五、利用 webpack 進行優化

1、熱模塊替換(HMR)

什么叫熱模塊替換呢?

它其實是利用了 websocket 的原理,當你對代碼進行修改并保存后,webpack 將對代碼重新打包,并將新的模塊發送到瀏覽器端,瀏覽器通過新的模塊替換老的模塊,這樣在不刷新瀏覽器的前提下就能夠對應用進行更新,從而減少很多時間,能夠幫助我們更加高效的進行開發調試。

要使用它,首先需要開啟 HotModuleReplacementPlugin

webpack-dev-server --hot

添加 HMR 有兩種方式:

【方案1】:module.hot

if(module.hot) {
  module.hot.accept(App);
}

【方案2】:react-hot-loader

// .babelrc
{
  "plugins": ["react-hot-loader/babel"]
}

// App.js
import React from 'react'
import { hot } from 'react-hot-loader'

const App = () => <div>Hello World!</div>

export default hot(module)(App)

? devserver-hot

2、source-map

在開發環境下,開啟 source-map,可以方便調試代碼。

const config = {
  //...
 devtool: process.env.NODE_ENV === 'production' ? '' : 'source-map'; 
}
3、代碼提取

提取公共代碼分為兩種:一種是所有頁面都依賴的基礎庫,如 react、react-dom 等;一種是業務代碼中的公共部分,這樣就可以實現瀏覽器緩存。

前者只要不升級基礎庫的版本,Hash 值不會被更新,緩存就不會被更新,后者只要緩存了,就可以實現公共頁面之間的緩存共享。

webpack4 使用內置 API optimization 代替了 CommonsChunkPlugin,默認會為你生成共享的代碼塊。

? Webpack 日常使用與優化
? 沒有了CommonsChunkPlugin,咱拿什么來分包(譯)

4、緩存

一般有兩種緩存方式,chunkhash 和版本號。有時候對外的線上項目會采用版本號來進行緩存,而一些內部項目則使用 chunkhash。

? 緩存 - Webpack 中文文檔

五、項目實戰

?? DEMO

webpack4+router4

ps:好氣哦,再也不想當webpack配置工程師了 ̄へ ̄

六、參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 初始化項目 進入一個文件夾作為項目的根目錄 npm init 新建src, dist目錄,package.json...
    love_program閱讀 1,249評論 0 4
  • GitChat技術雜談 前言 本文較長,為了節省你的閱讀時間,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,710評論 7 110
  • 提到微視頻,我們最熟悉的莫過于PPT錄屏的方式,即事先做好一個PPT課件,然后打開我們的Camtasia錄屏軟件,...
    信息技術教育應用閱讀 4,351評論 0 5
  • 感恩節,我把爸媽的照片翻了翻,也把你的照片翻了翻,奇怪,我還是沒有刪。 可能有很多我這樣的人,我?不信星座,...
    同樣的我閱讀 109評論 0 0
  • 弱肉強食,在哪里都一樣。 當毛克利一直以人孩的軀體遵守狼族的生存法則時,它只能是狼群里最弱小的那一個,身邊的親人也...
    冰清言心閱讀 159評論 0 0