iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0

https://i.imgur.com/UiqwPHd.jpg

一、前言

Webpack 是網頁的打包工具。當我們的網頁越寫越大,檔案越來越多(例如一個網站有好幾個.html檔案),甚至還有使用到框架。這時候我們可以使用 Webpack 來打包這些檔案,讓它們個只有一個檔案,比如說把好幾個.html檔案打包成只有一個.html檔,或者是把好幾個.js檔案打包成只有一個.js


二、基本環境建置

首先,學習 Webpack 最好的方式就是直接把環境架設起來,這裡蒐集一些課程和文件,對於幫助我們建立 Webpack 環境很有幫助,參考的資源如下。

  1. 認識 Webpack 一點都不難:主要參考的教學【1】
  2. Getting Started:Webpack 5 官網【2】
  3. webpack 中文網:中文教學文件【3】

2.1 環境建置

先建立一個資料夾,裡面放兩個.js檔案,分別為 main.js 和 helper.js(名稱自己取),我們先將 main.js 當作 Webpack 的進入點,也就是說要讓所有的.js檔案都會和main.js都要產生關聯性,那麼要如何讓多個.js檔案可以被main.js給呼叫?這時候可使用importexport來解決【1】。

起手式,我們在 VS Code 中建立一個新的 Webpack 環境,在 webpack-demo 資料夾裡面再放入一個 src 資料夾,然後在 src 裡面加入三個檔案,檔案分別為:helper.jsmain.jsindex.html。可以參考下列的結構圖。

https://i.imgur.com/zWChiij.jpg

然後,在我們的檔案中,分別加入下面的語法來做測試。

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 無法直接使用importexport」。

緊接著,我們要來安裝 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

顯示結果:

https://i.imgur.com/aXzdcet.gif

跑完install webpack後則會出現node_modules資料夾與package-lock.json檔案。

https://i.imgur.com/ETcUjEv.gif

更新過後的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"

顯示結果:

https://i.imgur.com/f7RzNwi.jpg

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去新增或刪除。

2.2 如何忽略 node_modules

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

三、Webpack 操作

3.1 JavaScript 基本操作

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,其內容如下圖。

https://i.imgur.com/3LTsc5L.jpg

然後,我們剛剛又更動了 helper.js、main.js 的內容。最後,在執行一次 build 指令。

PowerShell:

npm run build

此時的main.bundle.js就會被更新,這時只要打開之前在 dist 資料夾中所建立的 index.html 檔案,確認內容是否已被更新。

https://i.imgur.com/c6dKgyN.jpg

其實,上面在做的事情,就只是把多個 .js 檔案,webpack 透過 run 指令將多個 .js 檔案編譯成一個 .js 檔案,也就是main.bundle.js

3.2 使用 CSS loader

除了 JavaScript 可以打包外,也可以加入其他的檔案,但是這裡會出現一個問題,那就是我們的 node.js 不會認識其他的檔案,所以要依靠 loader 來讓 Webpack 識別檔案,這裡先安裝 css loader 相關資源,指令如下。

PowerShell:

npm install --save-dev style-loader css-loader

指令打完會出現類似下列的訊息。

https://i.imgur.com/UXTGnGy.jpg

使用官網提供的語法。將它們加入到 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 的背景改成紫色。

https://i.imgur.com/pKFPmLX.gif

顯示結果:

https://i.imgur.com/PP6MWQZ.gif


四、推薦資源

  1. Webpack4 從零開始的前端自動化工具
  2. Webpack 是什麼?模組打包工具的用途及基本 Webpack 教學
  3. Webpack Tutorial 繁體中文 Gitbook
  4. How to use Webpack with React: an in-depth tutorial

五、結論

本篇寫的東西算是入門系列,Webpack 其實還有很多的用法,像是在 React 框架使用 Webpack,或是匯入各種不同檔案的 loader 寫法,這要等到需要用到時,再慢慢研究。對於初學者來說,推薦直接看教學影片,並且動手操作過一遍,會比一直讀資料還要來的有效果。而在世間花費上,影片雖然只有短短的 37 分鐘 ,但是要一步一步驟的紀錄操作方法,也是花好幾個小時,儘管這樣學習很費時,但是自己也寫了一套 Webpack 操作 SOP,投資的時間沒有白費。


六、參考資料

  1. 認識 Webpack 一點都不難
  2. Getting Started
  3. webpack 中文網
  4. Delete Node Modules like a PRO

上一篇
Day 09:UI 設計工具 Figma 快速入門
下一篇
Day 11:Position 功能實作
系列文
手刻武器庫,30 天前端學習心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言