從0開始使用webpack構建一個React腳手架。

源碼地址 順手求一波star

項目使用:

git clone git@github.com:TigerHee/react-cli-diy.git

cd react-cli-diy

npm install

開發(fā)模式啟動:
npm run dev

生產打包:
npm run build

實現步驟:

首先新建一個項目目錄眼滤,在此目錄內執(zhí)行npm init初始化項目環(huán)境庭敦。

創(chuàng)建webpack配置文件:

  • webpack.config.js //公共配置
  • webpack.prod.js //生產環(huán)境配置
  • webpack.dev.js //開發(fā)環(huán)境配置

創(chuàng)建public目錄存放html模版文件。

創(chuàng)建src目錄存放前端項目所需資源兰迫。

安裝webpack相關依賴:

npm i webpack webpack-cli webpack-merge -D

修改webpack.config.js文件:

module.exports = {
  entry: './src/index.js',  // 入口
  output: {                 // 出口
    filename: 'bundle.[hash:8].js',
    path: path.resolve(__dirname, 'dist')
  },
}

使用webpack-merge包merge公共配置文件分別到生產和開發(fā)配置文件:

const merge = require('webpack-merge')
const baseConfig = require('./webpack.config.js')

module.exports = merge(baseConfig, {
  // 各自單獨的配置
})

安裝本地服務及使用html模版相關依賴:

npm i webpack-dev-server html-webpack-plugin -D

公共配置內使用html-webpack-plugin來使用index.html模版:

plugins: [
  new HtmlWebpackPlugin({
    template: './public/index.html',
    filename: 'index.html',
    hash: true,                       // 添加hash值解決緩存問題
    minify: {                         // 對打包的html模板進行壓縮
      removeAttributeQuotes: true,    // 刪除屬性雙引號
      collapseWhitespace: true        // 折疊空行變成一行
    }
  }),
]

開發(fā)模式需要使用到開發(fā)服務器:

devServer: { // 內置開發(fā)服務器配置
  port: 3000,
  progress: true,
  contentBase: './dist',
  open: true,
  proxy: {
    //設置開發(fā)時接口代理地址
  }
},

配置好上訴基本配置之后在package.json內設置啟動腳本:

"scripts": {
  "build": "webpack  --config webpack.prod.js",
  "dev": "webpack-dev-server --config webpack.dev.js"
},

接下來在公共配置里設置處理css與less:

rules:[
  {
    test: /\.(css|less)$/,
    use: [
      'style-loader',
      'css-loader',
      'postcss-loader',
      'less-loader'
    ]
  },
]

postcss-loader處理兼容前綴需要一個單獨的配置文件postcss.config.js信殊。

如上述配置處理css的話,樣式文件被插入到html模版內汁果,我們想抽離css文件涡拘,通過link方式引入:

npm i mini-css-extract-plugin -D

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

{
  module:{
    rules: [
      {
        test: /\.(css|less)$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          'postcss-loader',
          'less-loader'
        ]
      },
    ]
  },
  plugins: [
    // 抽離css插件
    new MiniCssExtractPlugin({
      filename: '[name].[hash:8].css',
      chunkFilename: '[id].[hash:8].css',
    }),
  ]
}

此時在執(zhí)行npm run build的時候發(fā)現,每次打包上次的打包結果都沉積在哪里需要先清除:

npm i clean-webpack-plugin -D

修改生產環(huán)境配置:

const { CleanWebpackPlugin } = require('clean-webpack-plugin');

plugins:[
  //每次打包前刪除清空dist
  new CleanWebpackPlugin(),
]

用了mini-css-extract-plugin抽離css為link需使用optimize-css-assets-webpack-plugin進行壓縮css,使用此方法壓縮了css需要uglifyjs-webpack-plugin壓縮js:

npm i optimize-css-assets-webpack-plugin uglifyjs-webpack-plugin -D

optimization: {              // 優(yōu)化項
  minimizer: [
    new UglifyJsPlugin({     // 優(yōu)化js
      cache: true,           // 是否緩存
      parallel: true,        // 是否并發(fā)打包
    }),
    new OptimizeCSSAssetsPlugin({})    // css 的優(yōu)化
  ]
},

在公共配置里設置處理js與jsx:

npm i babel-loader @babel/core @babel/preset-env @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators -D

再加上React的babel:

npm i @babel/preset-react -D

{
  test: /\.(js|jsx)$/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: [
        '@babel/preset-env',
        '@babel/preset-react'
      ],
      plugins: [
        ["@babel/plugin-proposal-decorators", { "legacy": true }],
        ["@babel/plugin-proposal-class-properties", { "loose": true }]
      ]
    }
  },
  exclude: /node_modules/
},

項目添加React相關依賴:

npm i react react-dom -S

在index.js內書寫React代碼须鼎,嗯~~~鲸伴,可以運行府蔗。

再在公共配置里加上圖片處理:

npm i file-loader url-loader -D

{
  test: /\.(png|jpg|gif)$/,
  use: {
    loader: 'url-loader',
    options: {
      limit: 200 * 1024,          // 小于200k變成base64
    }
  }
}

在less內加個background-image試試晋控,ok。

開發(fā)模式需要監(jiān)聽更改熱更新:

watch: true,
watchOptions: {
  poll: 1000,              // 每秒監(jiān)聽1000次
  aggregateTimeout: 300,   // 防抖姓赤,當第一個文件更改赡译,會在重新構建前增加延遲
  ignored: /node_modules/  // 可以排除一些巨大的文件夾,
},

最后npm run buildnpm run dev都可以完美運行了不铆,腳手架構建成功蝌焚。

定義可能會用到的全局環(huán)境變量:

const webpack = require('webpack');

// 生產環(huán)境:
plugins: [
  new webpack.DefinePlugin({
    ENV: JSON.stringify('PROD')
  })
]

// 開發(fā)環(huán)境:
plugins: [
  new webpack.DefinePlugin({
    ENV: JSON.stringify('DEV')
  })
]

再在壓縮代碼里加個版權聲明:

const webpack = require('webpack');

plugins: [
  new webpack.BannerPlugin('tigerHee 2019')
]

點擊獲取更多前端知識點

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市誓斥,隨后出現的幾起案子只洒,更是在濱河造成了極大的恐慌,老刑警劉巖劳坑,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毕谴,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機涝开,發(fā)現死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門循帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舀武,你說我怎么就攤上這事拄养。” “怎么了银舱?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵瘪匿,是天一觀的道長。 經常有香客問我纵朋,道長柿顶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任操软,我火速辦了婚禮嘁锯,結果婚禮上,老公的妹妹穿的比我還像新娘聂薪。我一直安慰自己家乘,他們只是感情好,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布藏澳。 她就那樣靜靜地躺著仁锯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翔悠。 梳的紋絲不亂的頭發(fā)上业崖,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機與錄音蓄愁,去河邊找鬼双炕。 笑死,一個胖子當著我的面吹牛撮抓,可吹牛的內容都是我干的妇斤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼丹拯,長吁一口氣:“原來是場噩夢啊……” “哼站超!你這毒婦竟也來了?” 一聲冷哼從身側響起乖酬,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤死相,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咬像,有當地人在樹林里發(fā)現了一具尸體算撮,經...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡双肤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了钮惠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茅糜。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖素挽,靈堂內的尸體忽然破棺而出蔑赘,到底是詐尸還是另有隱情,我是刑警寧澤预明,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布缩赛,位于F島的核電站,受9級特大地震影響撰糠,放射性物質發(fā)生泄漏酥馍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一阅酪、第九天 我趴在偏房一處隱蔽的房頂上張望旨袒。 院中可真熱鬧,春花似錦术辐、人聲如沸砚尽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽必孤。三九已至,卻和暖如春瑞躺,著一層夾襖步出監(jiān)牢的瞬間敷搪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工幢哨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赡勘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓嘱么,卻偏偏與公主長得像狮含,于是被迫代替她去往敵國和親顽悼。 傳聞我的和親對象是個殘疾皇子曼振,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內容