Webpack 是網頁的打包工具。當我們的網頁越寫越大,檔案越來越多(例如一個網站有好幾個.html
檔案),甚至還有使用到框架。這時候我們可以使用 Webpack 來打包這些檔案,讓它們個只有一個檔案,比如說把好幾個.html
檔案打包成只有一個.html
檔,或者是把好幾個.js
檔案打包成只有一個.js
。
首先,學習 Webpack 最好的方式就是直接把環境架設起來
,這裡蒐集一些課程和文件,對於幫助我們建立 Webpack 環境很有幫助,參考的資源如下。
先建立一個資料夾,裡面放兩個.js
檔案,分別為 main.js 和 helper.js(名稱自己取),我們先將 main.js 當作 Webpack 的進入點
,也就是說要讓所有的.js
檔案都會和main.js
都要產生關聯性,那麼要如何讓多個.js
檔案可以被main.js
給呼叫?這時候可使用import
和 export
來解決【1】。
起手式,我們在 VS Code 中建立一個新的 Webpack 環境,在 webpack-demo 資料夾裡面再放入一個 src 資料夾,然後在 src 裡面加入三個檔案,檔案分別為:helper.js
、main.js
、index.html
。可以參考下列的結構圖。
然後,在我們的檔案中,分別加入下面的語法來做測試。
JavaScript:(helper.js)
export default {
fn() {
console.log('Hello World');
},
};
JavaScript:(main.js )
import helpers from './helper.js';
helpers.fn();
export 主要放在外部的 JavaScript Function,如同前面說過,main.js
是進入點。所以,由上面的寫法能清楚明白:「外部的 helper.js 會匯入到 main.js 中,要注意這種用法只能在 JavaScript 中執行。在 Node.js 無法直接使用import
和 export
」。
緊接著,我們要來安裝 webpack 套件
,先在 VS Code 的終端機先切換到之前建立的 wepback 資料夾下。而在下安裝指令前,我們要先得到一個package.json
來存放一些資訊,若是想要產生乾淨的package.json
,只需使用如下指令即可。
關於 PowerShell 的指令其實跟 Linux 指令相同。像是切換資料夾使用
cd
指令,查看當前目錄使用ls
指令等等。
PowerShell:
npm init
這裡我們先不要設定任何資訊,所以只要直接按下鍵盤的 Enter 鍵先跳過資訊的輸入,這些資訊在之後都能夠去設定,所以不必太擔心。當資料夾產生之後可以輸入install webpack
的指令,參考下列指令。
PowerShell:
npm install webpack webpack-cli --save-dev
顯示結果:
跑完install webpack
後則會出現node_modules
資料夾與package-lock.json
檔案。
更新過後的package.json
如下。
JSON:
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^5.74.0",
"webpack-cli": "^4.10.0"
}
}
npm install webpack webpack-cli --save-dev
其中的--save-dev
屬於開發者模式,你也可以寫成--save
上線模式。這裡先不糾結使用哪一種,兩種都可以用。
這裡需要有一個入口起點(entry),暫時先借用文件中的webpack.config.js
。
JavaScript:
const path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'main.bundle.js',
},
};
webpack.config.js
請自行新增一個.js
檔案,然後將檔案放在package.json
相同的路徑下。
接著先打開package.json
檔案,添加一條編譯 js 的規則。到時要編譯 webpack 時,只要用npm run build
就能夠編譯,編譯完成後,webpack-demo
資料夾內,會出現一個dist
資料夾,裡面的檔案就是打包過後的檔案。
JSON:
"build":"webpack"
顯示結果:
build 的規則一定要寫上去啊!否則無法正常編譯。
PowerShell:
npm run build
最後編譯後的main.bundle.js
後,可以得到類似下面的檔案。並且 Webpack 在編譯完成後會自帶 ugly 效果。也就是讓人不好辨識的寫法。也可以減少檔案的容量大小。
JavaScript:
(()=>{"use strict";({fn(){console.log("Hello World")}}).fn()})();
main.bundle.js
這個 Filename 設定可以到webpack.config.js
做修改。其實 Webpack 的相關設定都可以到webpack.config.js
去新增或刪除。
node_modules 檔案一個都 MB 起跳,若是不想要把它存放在 GitHub 上,這時候可以建立一個.gitignore
文件在專案的根目錄下,讓 node_modules 不被 Git 追蹤。
在.gitignore
的文件中加入node_modules
。
node_modules
如果根目錄找不到
.gitignore
,你可以新增一個空白文字檔,直接把 .txt 文字檔改名為.gitignore.
,值得注意的是,.gitignore
這後面的點,是為了要忽視 Windows 的命名限制。
若想要刪除一整個 node_modules 資料夾,執行下列指令。
rm -rf node_modules package-lock.json
在dist
資料夾中建立一個 index.html 檔案,然後將剛剛產生的ain.bundle.js
匯入到 HTML 檔案中。
HTML:
<script src="./main.bundle.js"></script>
我們將之前的 helper 和 main 檔案新增程式。
JavaScript:(helper.js)
export default {
fn() {
console.log('Hello World');
},
fn2() {
console.log('How are you?');
},
};
JavaScript:(main.js )
import helpers from './helper.js';
helpers.fn();
helpers.fn2();
原本跑npm run build
指令後所產生的main.bundle.js
,其內容如下圖。
然後,我們剛剛又更動了 helper.js、main.js 的內容。最後,在執行一次 build 指令。
PowerShell:
npm run build
此時的main.bundle.js
就會被更新,這時只要打開之前在 dist 資料夾中所建立的 index.html 檔案,確認內容是否已被更新。
其實,上面在做的事情,就只是把多個 .js 檔案,webpack 透過 run 指令將多個 .js 檔案編譯成一個 .js 檔案,也就是main.bundle.js
。
除了 JavaScript 可以打包外,也可以加入其他的檔案,但是這裡會出現一個問題,那就是我們的 node.js 不會認識其他的檔案,所以要依靠 loader 來讓 Webpack 識別檔案,這裡先安裝 css loader 相關資源,指令如下。
PowerShell:
npm install --save-dev style-loader css-loader
指令打完會出現類似下列的訊息。
使用官網提供的語法。將它們加入到 webpack.config.js 裡面。
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'],
},
],
},
然後在專案的 src 資料夾裡面新增一個style.css
,並且貼上下面的內容來更改背景顏色。
CSS:
body {
background: darkorchid;
}
這時,只要切回到main.js
檔案,將剛剛建立的style.css
匯入到裡面。
JavaScript:
import './style.css';
這裡寫清楚一點,在main.js
加入下列這幾行語法。
JavaScript:
import helpers from './helper.js';
import './style.css';
helpers.fn();
helpers.fn2();
再次執行npm run build
。
PowerShell:
npm run build
經過 webpack 編譯後的main.bundle.js
,因為加入 CSS 相關東西,所以會產生一大串醜醜的語法,而在最後執行 HTML 檔案,將 body 的背景改成紫色。
顯示結果:
本篇寫的東西算是入門系列,Webpack 其實還有很多的用法,像是在 React 框架使用 Webpack,或是匯入各種不同檔案的 loader 寫法,這要等到需要用到時,再慢慢研究。對於初學者來說,推薦直接看教學影片,並且動手操作過一遍,會比一直讀資料還要來的有效果。而在世間花費上,影片雖然只有短短的 37 分鐘 ,但是要一步一步驟的紀錄操作方法,也是花好幾個小時,儘管這樣學習很費時,但是自己也寫了一套 Webpack 操作 SOP,投資的時間沒有白費。