從無到有建立 webpack 設定檔(一)

sexyoung
進擊的 Front End‘s
11 min readJun 16, 2016

好吧,首先你想會想問什麼是 webpack, 依照官方網站的說明,可以用一張圖來表示它的功能:

為什麼要使用 webpack?

網頁寫久了,難免你會使用到一些需要編譯的語法來加速開發時間。像是 scss 啊、less啊、coffee啊、react啊、vue啊,甚至是 ES6。但搞笑的是,瀏覽器並沒有支援這些語法(廢話)。所以我們需要編譯器幫我們把這些語法做編譯轉為原生語法。(因為你不可能一直去 terminal 下指令轉換,是時間太多嗎?)

怎麼開始?

首先,你需要先安裝 nodeJS,而且你有2種選擇:

  1. 直接去官網下載安裝 node。
  2. 使用 node version manager (NVM) 安裝 node。

如果是去官網下載 node,那就沒什麼好說的,一直下一步就對了。

為什麼要使用 NVM下載?開發某個a專案時,a專案有指定 node 版本,然後b專案也是指定另一個 node 版本,我們當然不可能一直重複的安裝node, 此時就可以使用 nvm 來幫我們安裝並且切換電腦裡的 node 版本。

  1. windows 使用者直接安裝 nvm installer
  2. mac 使用者請到 github 依照步驟安裝。

如果安裝完 node, 打開 terminal,並下指令 node -v 即可看見 node 版本。

安裝webpack

npm install webpack -g

安裝好之後我們先建立一個資料夾叫 website 好了

mkdir website && cd website

然後我們先建立1個html檔在根目錄

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="content">content</div>
</body>
</html>

當然,此時你已經可以直接點擊 index.html 兩次來開啟它了。

但是你可以看見,它是以 file:// 來開啟,並非以 http:// 開啟,這樣一來你就無法做其他裝置的連線測試。

接著,我們建立一個 server.js 檔

touch server.js

裡面暫時先不用寫東西

目前長這樣

然後我們需要建立一個 package.json 檔

npm init

沒有什麼特別需要寫的就一直 enter 下去就可以了。

npm init 會幫我們產生 package.json

package.json 負責幫我們記錄專案裡我們使用了哪些 node packages,類似一個套件索引檔。它的內容大概長這樣:

剛開始的 package.js

然後我們可以使用 npm 來安裝套件,第一個要灌的就是node 常用的網頁伺服器 express

安裝 Express

npm install express --save-dev

install 也可以簡寫成 i

npm i express --save-dev

然後你可以看到你的 package.json 會多了一個 devDependencies 區塊:

多出來的 devDependencies 裡,有一個 express

然後你可以看見 devDependencies 裡面有一個 express, 如果再繼續裝,它就會繼續在 devDependencies 新增。

特別說明:
如果沒有使用 --save-dev 這個參數,不會更新 package.json,只會默默的幫你在專案裡新增 node_modules 這個資料夾,並且把你的套件放進去。
除了 --save-dev 之外,還有 --save 可以使用,兩者的差別在於:
--save-dev:用來安裝開發時用的工具
--save:用於上線時必要的套件
比方說 express 這就是我們開發時會用到的臨時伺服器,應該使用 --save-dev
而 jquery, react ... 等,是上線必備的套件,應該使用 --save
通常我們把把專案傳到 github 時,不會上傳套件(因為網路上有),只會上傳 package.json,然後看 package.json 裡有什麼 Dependencies(上線依賴) 與 devDependencies(開發依賴) 套件,再下載下來。所以通常把專案 pull 到開發環境,你會使用 npm i 來安裝所有的依賴套件。
但如果 pull 到正式環境,你會使用 npm i --production 來安裝 Dependencies(上線依賴)的套件。

安裝專案用 webpack

npm i --save-dev webpack

安裝用之後你的 package.json 應該會長這樣:

多了 webpack

修改 server.js

請把 server.js 修改成這樣:

require webpack 稍後我會說明,require express 就是建立一個暫時用的伺服器,建好後設定路由「/」 會回傳 index.html 檔。然後 listen 在 3000 port, host 開在 0.0.0.0。接著到 termianl 下:

node server.js

可以看到這個畫面:

然後打開 http://0.0.0.0:3000/ 就可以看見我們剛剛定義的 index.html 了~

內容很空的 index.html
特別說明:使用 0.0.0.0 這個 host 有個好處,就是你可以使用 localhost 或是 [內部ip] 來瀏覽你的專案,所以你可以打 http://localhost:3000/ 或是 http://內部ip:3000/ 來查看。
內部 IP 可以從這邊來看,像我的就是 192.168.0.13,所以我們可以輸入 http://192.168.0.13:3000
既然我們有內部ip,就意味著可以使用同個網域下的其他裝置來瀏覽你電腦裡的專案!

安裝 webpack-dev-middleware 與webpack-hot-middleware

webpack-dev-middleware 可以幫我們在 express 下建立 webpack-dev-server 中介層,你可以給它一些 webpack-dev-server 參數,比方說 noInfo: false, 那你在 terminal 啟動它時就不會 console.log 東西。

webpack-hot-middleware 則可以幫我們免重整來更新存檔的檔案用(等下你就知道了)

npm i --save-dev webpack-dev-middleware webpack-hot-middleware

然後要更新一下 server.js

更新的 server.js

安裝 babel-loader 與 babel-preset-react

因為我們會使用 ES6(下一代的JavaScript) 語法,所以我們需要安裝 babel-loader、babel-core、babel-preset-es2015、 還有 babel-preset-react(轉碼規則) , 然後在 webpack 裡幫我們轉換。

npm i --save-dev babel-core babel-loader babel-preset-react babel-preset-es2015

安裝 React

等下我們要寫 react,所以要安裝 react 跟 react-dom

npm i --save react react-dom

建立 webpack.hot.config.js 在專案根目錄

這邊有很多東西其實我也不太懂,但這邊就以我知道的說明一下:

  1. entry 屬性設定 js 的進入點,屬性為 object,每個進入點需設定來源,以本次案例來說,我的 entry 裡面有 app 進入點,它的來源有2:一是hot-middleware,另一個是等下我們要建立的 /components/app.js 。之後我們就可以使用 [publicPath]/app.js 來存取這個app進入點。
  2. output 屬性用來設定存取進入點的資訊,也是要打包時輸出的位置。path是設定進入點的來源base路徑,filename指的是進入點打包的後的檔名,可以使用 “bundle.js” 把所有進入點js打成一包,或是像此案例使用 “[name].js” 讓每個進入點各自一包。 publicPath 是設定<script src..>要存取它時的路徑。像以此例,我們到時就可以使用 http://localhost:3000/static/app.js 來存取它。
  3. module 屬性設定遇到什麼檔案時,要使用什麼 loader 去轉換它。在此例中,我們遇到 js 時,會使用 babel-loader 去讀取它,好讓webpack看得懂 es6 語法, __dirname(此專案根目錄) 裡的每個 js 都要用 babel-loader, 除了 /node_modules/ 裡的除外。

設定.babelrc檔

剛剛安裝的 babel-preset-es2015 跟 babel-preset-react 就在這個檔裡被使用,但老實說我並不明白為什麼要設定它們才可以跑。內容如下:

建立 /components/app.js

app.js 檔案內容

其中的 ReactDOM 則是幫我們把 React 的 App Component 渲染到 #content 這個 div 的工具。而 module.hot 如果支援的話,則開啟熱渲染模式(存檔即改變,不用重整)。

特別注意:如果你沒有使用 babel-loader, babel-preset-react, 這種HTML與JS混著用的檔案webpack可是不認得的。(會出錯)

幫index.html 安插js進入點。

好了,到目前為止,我們的檔已經設定的差不多了,把 node server.js 先按 ctrl + c 關掉。

在 package.json 加上 scripts > start

打開 package.json 看一下 devDependencies (開發依賴) 與 dependencies (上線依賴) 應該會像這樣,然後我們在 scripts 屬性加入一個 start 命令。

所以我們之後只要輸入:

npm run start

就等同於使用

node server.js

好,接著我們啟動 npm run start, 然後看一下。

果不其然出現了 app

接著我們修改一下 /components/app.js

把原本的 app 改成欸批批
修改後的 app.js

接著你就可以看見不在重整的情況下,它也會修改內容了!

建立 Header, Content, Footer

然後在 app.js 引用它們:

存檔後看看瀏覽器:

引用 header, content, footer 後的 app

如果你修改了被 app 引用的 Header.js:

header 修改成 抬頭
被引入的 Header.js 也立即改變

如此一來,我們就可以開始開發我們的 React 程式了~

下一章會帶入 scss 進來~

如果這文章有幫助到您,希望您也可以幫我按個讚!謝謝您

--

--