React 與 Webpack4 專案建置全實戰 (2)

這是這個系列的第二部分,如果想從頭開始看的話可以往上一篇前進: React 與 Webpack4 專案建置全實戰 (1)

這個章節會是比較實戰的內容,前面已經解說完 webpack 的基本設定內容,現在讓我們來看看要如何實際執行。

文章大綱

  • 使用 package.json 建立自己的 script 指令集
  • webpack-dev-server
  • 開始撰寫 JS 程式碼

使用 package.json 建立自己的 script 指令集

(已經熟悉 node 的開發者可以跳過)

如同前面所說, webpack 必須在 node 環境下才能夠被執行,所以在專案目錄下通常會有 package.json 檔。

package.json 解說

如果前面你是使用 webpack-cli ,那麼它應該就會幫你產生一份 package.json 檔 ,這份檔案是 node 用來記錄專案所需要的套件的描述檔,讓我們稍微看一下內容:

其中比較重要的有 script 、 dependencies 、 devDependencies 三項,分別是用來:

  1. script : 用來撰寫自己的指令,可以用 npm run “你的 script” 來執行相對應的指令內容。

  2. dependencies : 專案開發時會用到的套件內容,因為 webpack 的使用通常只在開發階段,因此這個部分不會有相依賴的套件。

  3. devDependencies : 開發階段使用的套件,可以在 npm install 時加入 -D ,該套件就會被記錄至此。

加入自己的 script

根據官網,webpack 最基本的指令是:

webpack <entry> -o <output>

其中 entry 跟 output 各自會自動對應到 webpack.config.js 裡面的設定,所以其實直接下 webpack 也行,那麼 ,我們就在 script 裡面加入看看:

package.json
...
"script":{
    "build":"webpack"
}

然後試試看指令 :

 npm run build 

應該沒問題,這樣的好處是之後不管我 webpack 指令怎麼修改,我在 cli 裡面執行的指令都可以是相同的。之後你就可以在 dist 資料夾裡面找到 webpack 處理完的 js 檔。

不過這種編譯方式還是會有換行符號跟空白,佔據多餘的空間,因此我們可以在指令後面加入 mode 參數 :

"script":{
    "build":"webpack --mode=production"
}

可以看到webpack 幫我們把程式碼多餘的空白都被壓成單行了,這樣子的好處是減少程式碼體積加快瀏覽器頁面載入速度,所以通常在開發完成準備正式上線時我們都會這麼做。

webpack-dev-server

但在開發階段你應該不會希望每次修改完檔案都要手動build ,再自己開瀏覽器來看吧!? 這時候我們就希望他能夠即時偵測修改並重新產生新的 bundle 一個比較簡單的方式是:

 webpack --watch  

使用這個方式, webpack 會自動幫我們偵測檔案的變化並重新 build 一次,但還是需要手動重新整理才看得到結果。

安裝 webpack-dev-server

所以這裡我要介紹一個 webpack 裡一個很好用的套件叫做 web-dev-server,他可以直接幫你架起一個本地的開發 server ,除了能夠直接偵測並更新,還能自動幫你刷新頁面,省了不少功夫,毫無疑問是開發必備工具。

首先我們要安裝:

    npm install webpack-dev-server --save-dev

接下來在 webpack.config.js 裡面新增對應的設定區塊:

webpack.config.js 
... 

devServer: {
    contentBase: path.join(__dirname, 'dist'),
    open: true,
    hot: true
  }

“contentBase” 是 server啟動的時候預設的根目錄,通常是對應到編譯完檔案的資料夾 dist ,才能夠看見變更結果。

“open” 是使用 dev-server 指令啟動後自動幫你開啟瀏覽器,“hot” 是所謂的 「 hot module reload 」 ,當檔案有變更的時候自動幫你刷新內容,也是讓我想要使用它的主要原因。

其他 dev-server 相關的設定可以參考 Webpack 官方網站

啟動及運行

我一樣在 package.json 的script 標籤裡面加入 dev-server 相關的指令:

package.json 
... 
"script": "webpack-dev-server  --open"

這裡的 open 參數,跟上面設定檔內的 open 作用相同,所以擇一就可以了,執行完後你應該就會看到自動開啟的網頁內容了,這邊再提醒一次,記得要搭配 WebpackHtmlPlugin,才能夠讓 js 的修改順利插入到 html 裡面。

開始撰寫 JS 程式碼

在前面的段落裡,我們使用 webpack-cli 來快速產生基本的 webpack 設定,包括進入點、輸出資料夾、以及轉譯 sass、css 相關一系列的 loader ,來產生瀏覽器可以看得懂的程式碼。

最後我們用了 webpack 的 WebpackHtmlPlugin,來把我們編譯好的 js 檔直接插入我們預先寫好的 html 樣板中,現在我們可以實際撰寫 js 程式碼來看看結果是不是如同我們所預期。

JS 程式碼測試,抓取元素內容

首先,在 html 樣板裡面有一個 id 是 app 的區塊,這是後面會用來插入 react內容的地方。那麼既然我已經設定好 entry file 跟我的 html 樣板,照理說我應該可以在 js 檔裡面抓到這個 #app 元素,我試著在這個元素裡面插入一些內容:

document.getElementById('app').append('Hello, this is entry file from weboack bundler.')

看起來沒問題:

CSS 測試,套用元素外觀

接下來我要試著引入 CSS 內容,照著前面的說明,我一樣在 src/index.js 裡面加入了:

 import '../scss/index.scss' 

然後在 index.scss 套用所有 body 為橘色試試:

body{
    color:red;
}

也跟預期的一樣!!

你可能會發現這個 html 上面並沒有用來引入 css 內容的 <link> 標籤,這是因為style-loader 是透過插入 <style> 標籤的方式讓 css 內容生效,可以打開瀏覽器檢查工具查看:

測試結果都沒有問題的話,就只剩下引入 react 了! 我在下個章節會提到需要安裝的套件以及設定方式,還有加入 eslint 的設定,如果你也沒問題,那就跟著一起往下吧!

下一章節:React 與 Webpack4 專案建置全實戰 (3)

React 與 Webpack4 專案建置全實戰 (1)

寫了快一年的 Vue ,最近剛接觸 React ,我還挺中意這種架構跟撰寫方式的,所以順手研究了一下 Webpack。如果你在開發時是使用react-create-app 之類的手腳架,應該會跟 Vue 的 vue-cli 工具蠻類似的。但這類工具不太容易客製化的調整設定(有時候,你並不需要那麼多功能)。

所以為了讓自己能夠適應各種需求跟情況,我打算試試看打造一個適合自己做開發的 React 起始專案,方便之後進行任何需要 React 開發的時候使用。

適合閱讀對象

適合有至少接觸過手腳架工具或是 Gulp、Grunt 等 Task Runner 處理檔案的 Js 開發者,完全初學者建議先用手腳架練習即可,以免未入門先棄坑。

大綱

因為文章內容有點多,所以我預計分為三個部分來解說:

第一部分

  • 配置說明
  • webpack 緣由
  • 安裝 webpack
  • webpack.config.js 設定及說明

第二部分

  • 使用 package.json 建立自己的 script 指令集
  • webpack-dev-server
  • 開始撰寫 JS 程式碼

第三部分

  • 引入 React
  • 搭配 Eslint 做檢查
  • 延伸文章

配置說明

預計會使用到的工具如下 :

  1. webpack : 一定要的
  2. webpack-dev-server : 加速開發流程
  3. babel : 用來把專案裡的 JS 及 JSX 轉譯成為瀏覽器看得懂的程式碼
  4. sass : 方便做 CSS元件模組化,ㄧ樣需要轉譯成 CSS
  5. eslint : 檢查 JS 撰寫習慣必備

Webpack

什麼是 Webpack ?

Webpack 是一套非常完整的前端打包工具,他讓開發人員透過設定檔的方式很方便的去規劃專案架構。早期我們撰寫 Sass 的時候是透過 Grunt 或是 Gulp 等Task Runner來做轉譯,但以現在前端開發的規模,除了 Sass 轉譯,我們常常還需要處理其他事情,例如 minify、uglify 及 JS新舊版轉譯,當這些事情開始複雜起來的時候,相較於一個一個去撰寫 Task 的內容,有一個統一設置入口的 Webpack 就方便快速許多。

安裝 Webpack

Webpack 必須在 node 環境下執行,所以請注意你的系統是否有安裝 node ,如果沒有,我推薦你使用 nvm 安裝,除了可以方便的管理你的 node 版本,連 npm 都幫你裝好了。

Step1. 產生 package.json

你的專案目錄底下必須 package.json 檔案以紀錄你使用的套件,這邊可以使用指令:

     npm init

來產生 package.json,輸入後會有一些關於設定的問題,如專案名稱或是版本號,請依照自己的意思輸入就好。

Step2. 用 npm 安裝webpack

webapck 只會在開發環境使用,所以安裝的時候請加上參數

 npm install --save-dev webpack

Step3. 使用 webpack-cli

如果一開始不熟,想要快速產生設定檔模板的話,我找到了一個還不錯的工具: webpack-cli,它用起來就像上面 npm init ,使用互動介面來幫你產生設定檔。

npm i webpack-cli @webpack-cli/init
npx webpack-cli init

webpack-cli還有其他方便的指令,可以參考他的Github,但我後續還是比較習慣手動修改內容。

以上有幾個地方值得注意的:

  • 第二個問題提到的「 entry file 」 指的是 Webpack 來抓取你來源檔,準備編譯輸出時,所「進入」的第一個檔案,你可以想成是進入點。

  • 第三個提問:「what the location of the app…」指的是進入點檔案的確切位置(相對於專案根目錄)

  • 第四個提問:「 which folder will your…」指的是 檔案打包處理完之後要輸出到哪裡。

最後一個提問由於我還是比較習慣 使用sass,所以我選擇它。

webpack.config.js 設定及說明

產生完 config 檔之後,你會在裡面最先看到的應該有 module 、 entry 、 output 、plugins 四個設定,而這也是我們在調整的時候最長會需要注意的四個設定,以下將一一簡單介紹。

( 使用 webpack-cli 所產生的 config 似乎不會產生entry設定,但沒關係,你可以之後再補上,而且 webpack 也會有預設值,所以不用擔心會有問題。 )

entry :

進入點,你可以直接給一個路徑字串,但他其實還可以用物件跟陣列來表示,這邊先不詳細說明。

   entry: './app.js',

output

輸出點,表示檔案被處理完之後要放的位置,最常被使用的名稱是「 dist 」。

    output: {
        path: path.join(__dirname, 'dist'),
        filename: '[name].js',
    },

module

用來定義不同種類的檔案(模塊)是如何被處理的,會根據不同的副檔名套用不同的 rule ,也是最主要告訴 webpack 檔案如何被處理的設定,舉例來說,剛剛在 cli 設定的時候,最後的預處理我選擇了 sass ,他就在模板裡幫我產生了下面的內容 :

module: {
		rules: [
			{
				test: /\.(scss|css)$/,

				use: [
					{
						loader: 'style-loader'
					},
					{
						loader: 'css-loader'
					},
					{
						loader: 'sass-loader'
					}
				]
			}
		]
	},

以上設定的意思是「只要是.scss 或是 .css結尾的檔案,就幫我使用下列的處理方式。」,loader在 webpack 裡面主要是用來做轉譯處理的模組,所以記得在使用你想要的 loader前,要先使用 npm 安裝喔~

這邊要注意的是,當使用多個 loader 處理檔案時,loader 是從最後面開始被載入的(bottom-up),知道這點之後應該就可以理解上面的意思:

  1. 先透過 sass-loader 將 sass 檔案轉成 css 後
  2. 然後透過 css-loader ,讓我在 js 檔裡可以直接引入
  3. 最後透過 style-loader ,以在 <head> 內插入 <style> 標籤的方式,讓我剛剛在 js 檔裡引入的 css 內容順利生效」

plugin

除了上述 module 的處理,如果還有一些功能想要達成,還可以透過 webpack 的擴充套件來處理,例如我想要在把我 bundle 完的 js 檔案自動的插入某個 html 檔,讓我少做一些雜事,就可以使用 HtmlWebpackPlugin,官方還有推出許多的 Plugin 以便符合不同使用情境,可以參考這裡

  plugins: [
    new HtmlWebpackPlugin({
      template: './static/index.html'
    }),
  ],

處理前的 html 模板(static/index.html):


<html>
  <head>
    <meta charset="utf-8">
    <title>Title</title>
  </head>
  <body>
     <div id="app"></div>
  </body>
</html>

處理後的 index.html:

<html>
  <head>
    <meta charset="utf-8">
    <title>Title</title>
  <body>
     <div id="app"></div>
  <script type="text/javascript" src="/bundle.js">
  </script>
  </body>
</html>

可以看到 Webpack 幫我們把需要的 js 跟 css 資源載進來了。

先寫到這裡,在這個部分我只針對設定的屬性功能做說明,還沒有確切說到如何使用 Webpack 進行打包處理,下個章節開始會有更多實作的部分,所以請你消化吸收關於這些設定的方法之後,繼續前進吧!

下一篇:React 與 Webpack專案建置全實戰 (2)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×