首先,Webpack 是一個開源模塊打包工具,核心功能是解決模塊間的依賴,將模塊按照必定規則組織在一塊兒,合併爲一個或多個 .js
文件。html
瞭解過 Web 前端開發的小夥伴都知道,咱們一般都在與 HTML、CSS 和 JS 等靜態資源打交道,直接將工程中的源文件發佈到服務器不就能夠了嗎?中間過程當中加了 webpack 環節,有多大意義呢?前端
一個項目在立項後,對於程序結構的設計,要是把全部代碼都堆在一個文件中,那將是很是很是很是糟糕的事情(怎麼會有人怎麼作)。更好的方式是將這些代碼按照特定功能拆分爲多個代碼段並存到多個文件中,即麼個代碼段(文件)只實現特定功能,最終纔將全部代碼段組合在一塊兒。這就是咱們熟悉的模塊化思想,相信你會不排斥這種設計思路。webpack
像 C、C++、Java 等程序語言,開發者直接可使用模塊化進行開發,但是 Javascript 在很長一段時間內只能經過 script 標籤將多個 js 文件插入到頁面中。這些都是歷史緣由了,真要追溯,那是設計 Javascript 的做者最初將 Javascript 定位成腳本語言,實現網頁動態效果,因此無需模塊化。隨着用戶對體驗的要求變高,Javascript 原來的設計思路就暴露出許多問題:git
爲了解決上述問題,就不得不引入模塊化設計思路。github
引入模塊化思路後,各社區前後開發了 AMD、CommonJS、CMD 等解決方案(這些或許讀者都接觸過或許都沒用過,都沒有關係,不用緊張)。2015年,ECMAScript 6.0(就是 ES6)正式定義了 Javascript 模塊標準,前先後後 20 年,這一刻終於能夠堂堂正正地說 Javascript 擁有模塊這個概念了(感動的痛哭而涕,場面一度失控,哈哈)。web
但是(我不想聽),在獲得大多數現代瀏覽器支持的同時,有些特性和功能還不能直接使用。npm
既然問題出現了,那就得有方案解決。模塊打包工具(module bundler,mb 這不是罵人那個單詞的簡稱)就是保證將打包後的文件正確無誤地運行在瀏覽器中。當下,明星產品有 webpack、parce 和 Rollup 等。json
其工做方式:瀏覽器
那爲什麼選擇 webpack 呢?(由於這本書就是講它啊,這個就不用說了)主要是 webpack 很給力,自帶特性以下,容我慢慢道來:服務器
依賴 Node.js 這個就不在贅述,推薦使用 Node.js 的 LTS (Long Term Support)版本。
1.建立 myapp/01
,而後執行安裝命令
npm init -y
npm i webpack webpack-cli -D
複製代碼
2.編寫 01/index.html
、01/index.js
和 01/util.js
文件
<!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>01 webpack</title>
</head>
<body>
<script src="./dist/bundler.js"></script>
</body>
</html>
複製代碼
// 01/index.js
import util from './util';
document.write('我是主文件');
setTimeout(util, 3000);
複製代碼
// 01/util.js
export default function() {
document.write('我是依賴文件');
}
複製代碼
3.打包執行
命令行直接輸入執行
npx webpack --entry=./index.js --output-filename=bundler.js --mode=development
複製代碼
或修改 package.json
中的 scripts
,而後命令行執行 npm run build
// 01/package.json
"scripts": {
"build": "webpack --entry=./index.js --output-filename=bundler.js --mode=development",
},
複製代碼
util.js
,而後一塊兒打包成一個文件;development、production、none
三種;4.在瀏覽器打開 index.html
文件;
完整代碼可查看目錄 01 =>O(∩_∩)O~
其實像上面打包方式,參數寫在命令中,雖可行但囉嗦不耐看,一旦打包需求複雜,那將是災難,因此咱們得藉助配置文件,簡化打包命令。可查看 myapp/02
// 02/webpack.config.js
const webpackConfig = {
entry: './src/index.js',
output: {
filename: 'bundler.js'
},
mode: 'development'
};
module.exports = webpackConfig;
複製代碼
此時,對應 package.json
中的 scripts
可簡化爲
// 02/package.json
"scripts": {
"build": "webpack"
}
複製代碼
完整代碼可查看目錄 02 =>O(∩_∩)O~
不知道你可發現,每次改變文件,都要打包,而後才能刷新看到結果(天啊,世上還有更爛的開發環境麼?)。因此,咱們得改變,webpack-dev-seaver
就要登場了,從文件名就可看出其功能提供 webpack 開發服務。既然是開發,那就說明在發生產時不須要此包,那安裝就是 npm install webpack-dev-seraver -D
。
其主要功能是服務啓動時,讓 webpack 模板打包並生成靜態資源,待接收瀏覽器請求後,進行 url 校驗,若是地址正確(即配置參數 publicPath
),就從打包結果(內存)中找到對應資源(此刻請求的文件 bundler.js
只在內存中,未寫入到實際硬盤 bundler.js
中,驗證這點很簡單,刪除 03/release
目錄,你會發現即時沒有該目錄依舊能夠訪問文件 /release/bundler.js
)返回給瀏覽器,若是不正確,就從硬盤讀取資源文件返回給瀏覽器。寫入內存,讀取速度很快,若是每次都刪除磁盤文件而後再寫入,性能明顯低下。
// 03/webpack.config.js
const webpackConfig = {
entry: './src/index.js',
output: {
filename: 'bundler.js'
},
mode: 'development',
devServer: {
publicPath: '/release',
port: '1989',
open: true
}
};
module.exports = webpackConfig;
複製代碼
devServer
對象,主要配置 webpack-dev-server
;publicPath
是開發環境靜態資源的地址(內存中),這裏爲了能體現出效果,本該設置 /dist
,現改成 /release
;port
就是端口了;open
設爲 true
,即當服務啓動好後,自動打開地址 http://localhost:1989
(太人性化了,my love);既然靜態資源地址改了,那咱們 HTML (03/src/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>03 webpack</title>
</head>
<body>
<script src="./release/bundler.js"></script>
</body>
</html>
複製代碼
此刻,你能夠改下 03/index.js
和 03/util.js
文件,瀏覽器會自動刷新是否是(我知道你看到了),這是 webpack-dev-server
的自動刷新(live-reloading)功能。再一次提高了本地開發的效率。
經過親自實踐,咱們能夠總結:webpack-dev-server
至少有如下幾點功能:
完整代碼可查看目錄 03 =>O(∩_∩)O~