重溫webpack:骨架搭建

github 地址 找到skeleton分支

什么是骨架:個人覺得:就是可以簡單打包css,js,html凉馆,這樣的使用場景比較多的是應用在于企業(yè)官網(wǎng)的開發(fā)低匙。

目標

開發(fā)一個官網(wǎng)坠七,你肯定不止一個頁面冷溶,所以我們需要多個頁面入口葛碧,多頁面出口設置。
比如

|---- build //存放webpack配置類似vue-cli生成的目錄
 //打包結(jié)構(gòu)
|----dist
      |---- index.html
      |---- list.html
      |---- css
             |---- index.css
             |---- list.css
      |---- img
      |---- js
             |---- index.js
             |---- list.js
// 目標結(jié)構(gòu)
|---- src
       |---- modules // 存放公共文件
                |---- css
                |---- js
       |---- pages
               |---- index
               |---- list
// html,css,js都放入對應的文件夾

Tips

我們不會只有一個簡簡單單的webpack.config.js文件碟婆。我們想要高性能開發(fā)电抚,就需要分別配置開發(fā)環(huán)境與生產(chǎn)環(huán)境。所以我們最開始的目錄就是放在build文件夾下面竖共。記得我之前學習如何打包的時候都是直接輸入webpack打包蝙叛。但是我們可以看vue腳手架的script是直接運行node ./build/build.js(我們暫且不講dev-server),而它的根本的是運行這一段肘迎。
所以我們要先npm i webpack -D

如何配置自動化的多入口多出口文件

我們需要用到glob的依賴甥温。glob的使用在于遍歷某個文件夾下面的所有文件。
我們只需要知道簡單的使用

// 比如在我的電腦
const path = require('path')
const PAGE_PATH = path.resolve(__dirname, '../src/pages')
entryFiles = glob.sync(PAGE_PATH + '/*/*')
glob會打出匹配目錄下面的所有文件

當然在webpack里面js是第一公民妓布,所以只需要在glob.sync(PAGE_PATH + '/*/*.js')加一層過濾就好了敛腌。

圖一.png

  • 首先雷酪,webpack入口長什么樣子的加叁?
// 大概是
{
  entry:{
   index:'index path',
   list:'list path'
 }
}
  • 知道了樣子,我們根據(jù)glob的遍歷的結(jié)果(結(jié)構(gòu)類似圖一)生成入口接口它長成的樣子:
/**** utiles ****/
const path = require('path')
const glob = require('glob')
const PAGE_PATH = path.resolve(__dirname,'../src/pages/')

const entries = function(){
  let entryFiles = glob.sync(PAGE_PATH+'/*/*.js')
  let map = {}
  entryFiles.forEach(filePath=>{
    let filename = filePath.substring(filePath.lastIndexOf('\/') + 1,filePath.lastIndexOf('.'))
    //多目錄下有多個js文件進行過濾
    let arr = filePath.split('\/')
    if(arr[arr.length-2]===filename){
      map[filename] = filePath
    }
  })
  return map
}
entries()
module.exports={
  entries
}
  • 入口解決完了,出口還不是分分鐘嗎告希?
{
  output:{
    filename:'js/[name].js', //[name]代表的是entry的key值
    path: path.resolve(__dirname, '../dist') //定義輸出文件夾,
    publicPath:'/'
  }
}

到這里我們會發(fā)現(xiàn)只打包js。接下來就是配置各種loader指么,當然還有最重要的,如何單獨打包出css姑廉,html文件

  • 配置loader
module{
  rule:{
      {
        test: /\.css$/,
        use: ['style-loader','css-loader']
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: 'img/[name].[hash:7].[ext]'
            }
          }
        ]
      },
     {
       test: /\.html$/,
       use:'html-loader'
     }
  }
}
  1. 單獨打包css
const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')
// 插件項目
plugins: [
  new ExtractTextWebpackPlugin('css/[name].css') // 類似于output的filename
]
// rules里面的loader的修改
{
  test: /\.css$/,
  use: ExtractTextWebpackPlugin.extract({
    fallback:'style-loader',
    use: 'css-loader'  
  })
}
  1. 單獨打包html
    這一步會比較麻煩弯汰,首先曙搬,webpack怎么知道你要加載的哪些css?因為可以在對應的js文件下import進來,如何知道需要哪些js對應的哪些html就需要手動配置了挽唉。并且因為我們設置的是自動化多頁面入口,當然出口也是自動化的。
    先說一下html-webpack-plugin如何使用吧
  new HtmlWebpackPlugin({
     filename: 'index.html', // 類似于output的filename
     template: path.resolve(__dirname, '../src/index.html'), // 文件位置
     chunks: 'index', // 依賴的js
   }),

前面我們可以通過glob把所有路徑解析成類似圖一,要生成類似以上模板勒奇,最主要要得到的就是文件位置也就是template劈彪,根據(jù)之前的多文件入口,我們可以這樣做:

exports.htmlPlugins=function(){
  let entryHtml = glob.sync(PAGE_PATH+'/*/*.html')
  let arr = []
  entryHtml.forEach(filePath=>{
    let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
    let conf = {
      filename:filename+'.html',
      template:path.resolve(PAGE_PATH,filename+'/'+filename+'.html'),
      chunks:[filename],
      inject:true,
    }
    arr.push(new HtmlWebpackPlugin(conf))
  })
  return arr
}

結(jié)束

做到這里,我們的骨架就差不多完成了,可以打包基本js,css,html的文件灶芝,其中有些方方面面的細節(jié)沒有細說女器,大家可以到github上下載下來驾胆,自己改改玩玩~~~涣澡。
到這里明顯不夠,比如:為了適配es6語法的babel的配置,scss的配置驳阎,添加css的瀏覽器私有前綴蜘腌,webpack-dev-server開啟一個簡單的服務器......

之后會慢慢更新這一個系列芯急,歡迎大家點個star

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末养泡,一起剝皮案震驚了整個濱河市嗜湃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌购披,老刑警劉巖刚陡,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異株汉,居然都是意外死亡筐乳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門乔妈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝙云,“玉大人,你說我怎么就攤上這事路召〔伲” “怎么了波材?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長身隐。 經(jīng)常有香客問我廷区,道長,這世上最難降的妖魔是什么贾铝? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任躲因,我火速辦了婚禮,結(jié)果婚禮上忌傻,老公的妹妹穿的比我還像新娘大脉。我一直安慰自己,他們只是感情好水孩,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布镰矿。 她就那樣靜靜地躺著,像睡著了一般俘种。 火紅的嫁衣襯著肌膚如雪秤标。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天宙刘,我揣著相機與錄音苍姜,去河邊找鬼。 笑死悬包,一個胖子當著我的面吹牛衙猪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播布近,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼垫释,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撑瞧?” 一聲冷哼從身側(cè)響起棵譬,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎预伺,沒想到半個月后订咸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡酬诀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年脏嚷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片料滥。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡然眼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葵腹,到底是詐尸還是另有隱情高每,我是刑警寧澤屿岂,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站鲸匿,受9級特大地震影響爷怀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜带欢,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一运授、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乔煞,春花似錦吁朦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至空骚,卻和暖如春纺讲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囤屹。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工熬甚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肋坚。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓乡括,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冲簿。 傳聞我的和親對象是個殘疾皇子粟判,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容