02-01.Webpack是什么

在很早之前,我們的前端代碼Javascript缤言,大多都是基于面向過程的形式宝当,并通過在主入口文件(index.html)直接引入。類似于下面這樣

  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="root"></div>
  <script src="./index.js"></script>
</body>
</html>
  • index.js
let root = document.getElementById("root")

let header = document.createElement('div')
header.innerText = "header"

let sidebar = document.createElement('div')
sidebar.innerText = "sidebar"

let footer = document.createElement('div')
footer.innerText = 'footer'

let content = document.createElement('div')
content.innerText = 'content'

root.appendChild(header)
root.appendChild(sidebar)
root.appendChild(content)
root.appendChild(footer)

這樣的面向過程的代碼胆萧,雖然也能夠滿足業(yè)務(wù)功能庆揩,但是隨著前端邏輯的日益復(fù)雜,這種形式的構(gòu)建項目方式跌穗,就會變得使單個文件越來越大订晌,不僅不易于維護(hù),而且還會降低前端應(yīng)用的加載速度蚌吸。為了解決這個問題锈拨,隨著前端項目的發(fā)展,面向?qū)ο蟾搿⒛K化的代碼構(gòu)建方式應(yīng)運而生奕枢。我們再來看下面的代碼

  • src

    • index.html
    • header.js
    • sidebar.js
    • content.js
    • footer.js
  • index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="root"></div>
  <script src="./js/header.js"></script>
  <script src="./js/sidebar.js"></script>
  <script src="./js/content.js"></script>
  <script src="./js/footer.js"></script>
  <script src="./js//index.js"></script>
</body>
</html>
  • header.js
function Header () {
  let header = document.createElement('div')
  header.innerText = "header"
  root.appendChild(header)
}
  • sidebar.js
function SideBar () {
  let sidebar = document.createElement('div')
  sidebar.innerText = "sidebar"
  root.appendChild(sidebar)
}
  • content.js
function Content () {
  let content = document.createElement('div')
  content.innerText = 'content'
  root.appendChild(content)
}
  • footer.js
function Footer () {
  let footer = document.createElement('div')
  footer.innerText = 'footer'
  root.appendChild(footer)
}
  • index.js
let root = document.getElementById('root')

new Header()
new SideBar()
new Content()
new Footer()

這種面向?qū)ο蟮拇a構(gòu)建形式,結(jié)構(gòu)更加清晰佩微,每一個對象或者模塊缝彬,承載其特定的職責(zé)或任務(wù),維護(hù)起來就方便的多哺眯。但是與此同時谷浅,也產(chǎn)生了新的問題:

  • 首先,主入口同時引入了更多的文件奶卓,造成了頁面的http增多一疯,加載速度變慢。
  • 其次寝杖,在index.js中违施,只是實例化了對象互纯,并不能清晰的看出瑟幕,當(dāng)前的模塊來自哪里,代碼的閱讀性很差。
  • 再次只盹,很難去排查錯誤辣往,對頁面JS的引入順序有了很強(qiáng)依賴。

為了解決上面的問題殖卑,又出現(xiàn)了ES Module 的模塊進(jìn)入方法

  • src

    • index.html
    • js
      • header.js
      • sidebar.js
      • content.js
      • footer.js
      • content.js
  • index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="root"></div>
  <script src="./js/index.js"></script>
</body>
</html>
  • index.js
// ES Module 模塊引入方式
import Header from './header'
import SideBar from './sidebar'
import Content from './content'
import Footer from './footer'

new Header()
new SideBar()
new Content()
new Footer()
  • header.js
export default function Header () {
  let root = document.getElementById('root')
  let header = document.createElement('div')
  header.innerText = "header"
  root.appendChild(header)
}
  • sidebar.js
export default function SideBar () {
  let sidebar = document.createElement('div')
  sidebar.innerText = "sidebar"
  root.appendChild(sidebar)
}
  • content.js
export default function Content () {
  let root = document.getElementById('root')
  let content = document.createElement('div')
  content.innerText = 'content'
  root.appendChild(content)
}
  • footer.js
export default function Footer () {
  let root = document.getElementById('root')
  let footer = document.createElement('div')
  footer.innerText = 'footer'
  root.appendChild(footer)
}

在瀏覽器中打開index.html文件站削,報錯了:
Uncaught SyntaxError: Unexpected identifier
import Header from './header'
原因在于瀏覽器并不支持ES Module的語法,這時候孵稽,webpack的作用就體現(xiàn)出來了许起。通過webpack,對代碼進(jìn)行翻譯和打包菩鲜,那么瀏覽器就能識別這種語法了

使用Webpack

安裝webpack

  1. 在當(dāng)前項目下园细,使用npm init,生成package.json文件接校。
  2. 在項目目錄下猛频,使用npm i webapck webpack-cli -D,安裝webpack蛛勉。
  3. npx webpack ./js/index.jsindex.js文件進(jìn)行打包鹿寻。
  4. 這時候,在就會在項目中生成dist目錄和/dist/main.js文件诽凌,在主入口文件index.html中毡熏,引入main.js
  5. 回到瀏覽器皿淋,刷新招刹。

這樣我們的瀏覽器就能正確的識別ES Module的語法了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窝趣,一起剝皮案震驚了整個濱河市疯暑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哑舒,老刑警劉巖妇拯,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洗鸵,居然都是意外死亡越锈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門膘滨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甘凭,“玉大人,你說我怎么就攤上這事火邓〉と酰” “怎么了德撬?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長躲胳。 經(jīng)常有香客問我蜓洪,道長,這世上最難降的妖魔是什么坯苹? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任隆檀,我火速辦了婚禮,結(jié)果婚禮上粹湃,老公的妹妹穿的比我還像新娘恐仑。我一直安慰自己,他們只是感情好为鳄,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布菊霜。 她就那樣靜靜地躺著,像睡著了一般济赎。 火紅的嫁衣襯著肌膚如雪鉴逞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天司训,我揣著相機(jī)與錄音构捡,去河邊找鬼。 笑死壳猜,一個胖子當(dāng)著我的面吹牛勾徽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统扳,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼喘帚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咒钟?” 一聲冷哼從身側(cè)響起吹由,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朱嘴,沒想到半個月后倾鲫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡萍嬉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年乌昔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壤追。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡磕道,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出行冰,到底是詐尸還是另有隱情溺蕉,我是刑警寧澤贯卦,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站焙贷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贿堰。R本人自食惡果不足惜辙芍,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羹与。 院中可真熱鬧故硅,春花似錦、人聲如沸纵搁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腾誉。三九已至徘层,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間利职,已是汗流浹背趣效。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留猪贪,地道東北人跷敬。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像热押,于是被迫代替她去往敵國和親西傀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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

  • 寫在開頭 先說說為什么要寫這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,279評論 4 31
  • 版權(quán)聲明:本文為博主原創(chuàng)文章尤慰,未經(jīng)博主允許不得轉(zhuǎn)載雷蹂。 webpack介紹和使用 一伟端、webpack介紹 1匪煌、由來 ...
    it筱竹閱讀 11,059評論 0 21
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,458評論 2 71
  • GitChat技術(shù)雜談 前言 本文較長党巾,為了節(jié)省你的閱讀時間,在文前列寫作思路如下: 什么是 webpack霜医,它要...
    蕭玄辭閱讀 12,679評論 7 110
  • 今天晚上齿拂,老師讓我們預(yù)習(xí)24節(jié)氣雨水,雨水是24節(jié)氣里面的第二個節(jié)氣肴敛。雨水署海,時間點在二月18到20日之間。...
    軒小豆閱讀 216評論 0 0