[React] webpack開發環境安裝

既然之前已經架過 vue 的 webpack (系列文整理),最近正好在學 react ,於是想說那麼也架個 react 的 webpack 好了。

順便練習一下 yarn 指令。

大致都是照著 神Q超人 這篇文章照著做的: [筆記][React]從零到一的webpack開發環境(2)-React開發篇

我這篇就是懶人包整理,一些之前架設 vue 的 webpack 遇到過的問題就沒有特別寫出來了。

然後有碰到一些問題是我照著做無法順利執行的,有用另外的方式處理。大部分相同。
 

yarn 安裝

裝過 node.js 的話可以直接透過以下指令安裝yarn

npm install yarn

接下來用到的指令我都會寫使用 yarn 跟使用 npm 的,用 / 隔開。
 
還沒裝 node.js 的朋友可以參考我這篇的第一點: webpack架設2 – 前置作業,或是神Q大大的超詳細指南: [筆記][node.js]第一次建置node.js開發環境和安裝npm就上手!
 

初始化專案
yarn init -y / npm init -y

執行後會自動創建 package.json,之後所有安裝的依賴都可以在這裡面找到。
 

安裝webpack相關套件
yarn add webpack -S / npm install webpack -S
// 這一步會自動安裝 node_modules

yarn add webpack-cli -g / npm install webpack-cli -g

-S,表示現在安裝的這個套件,到了正式環境也依然會用到。

--save-dev / -D: 安裝開發時用的工具
--save / -S : 上線時(正式環境)必要的套件

-g 全域安裝
 

新增一個測試檔案 index.js
// index.js
console.log("Hello world!");

 

新增 webpack 的設定檔 webpack.config.js
// webpack.config.js
const path = require("path"); //引用path模組
module.exports = {
  // 這個webpack打包的對象,這裡面加上剛剛建立的index.js
  entry: {
    index: "./index.js",
  },
  output: { // 這裡是打包後的檔案名稱
    filename: "bundle.js",
    // 打包後的路徑,這裡使用path模組的resolve()取得絕對位置,
    // 也就是目前專案的根目錄
    path: path.resolve("./"),
  },
};

 
package.json之中新增指令

// package.json
"scripts": {
"build": "webpack"
},

 
做到這邊就可以試試打包了。

yarn build / npm run build

yarn 可以不打 run
npm 必須要打 run
 
目前還沒新增 html ,看不到結果總覺得有點空虛,所以新增一個 index.html 吧

新增 index.html
第一個webpack網站
    <!--這裡只需要嵌入webpack幫我們打包後的js檔就好,這裡指定剛剛output的檔案名稱bundle.js-->
    <script src="bundle.js"></script>

打開 index.html 有看到字,F12 有 show 出 console.log,就是沒問題了。
 

在 webpack 開發環境中安裝 react
yarn add react --save / npm install react --save
yarn add react-dom --save / npm install react-dom --save

 

新增 app.jsx

webpack 只看得懂 js,也就是說,react 的 jsx 他看不懂。
要讓 webpack 能夠讀懂非 js 檔案,需要透過 loader。
而要用 jsx 語法,副檔名必須叫做 .jsx

這邊先建立一個測試 jsx 來看看:

// app.jsx
import React from 'react';
import ReactDOM from 'react-dom';

let element =


<h1>Hello, world!</h1>


ReactDOM.render(
  element,
  document.getElementById('root')
);

 
index.html 的部分也要做出相應修改,在 body 中新增一個 <div>,令其 id="root"。

<!-- index.html -->
第一個webpack網站

<div id="root"></div>

    <!--這裡只需要嵌入webpack幫我們打包後的js檔就好,
        這裡指定剛剛output的檔案名稱bundle.js-->
    <script src="bundle.js"></script>

 

babel-loader 系列安裝

這邊安裝的幾個 loaders 是幫助 webpack 能夠辨別 jsx 檔案。

yarn add babel-loader --save-dev / npm install babel-loader --save-dev

這裡使用--save-dev是因為只有在正式上線前透過 webpack 打包才需要這個 loader,真正上線後已經是打包後的 JavaScript 不會有瀏覽器看不懂的問題。
 
裝完看一下版本。
根據官方文件,版本8以上的 Babel 核心套件 @babel/core 和版本7的 babel-core 不同,所以務必要確認好自己的版本後再下載對應的核心套件。

版本8以上的對應套件是 @babel/core,所以也要把他下載下來:

yarn add @babel/core --save-dev / npm install @babel/core --save-dev

 

有了Babel和他的核心@babel/core外,還要下載針對 JSX 處理的 @babel/preset-react(參考文檔: @babel/preset-react ),webpack 會在打包的時候依照選擇的 preset 把檔案編譯成 JacaScript。

yarn add @babel/preset-react --save-dev
or
npm install @babel/preset-react --save-dev

 
既然有處理JSX的preset套件,那也會有翻譯ES6語法的preset ( 瀏覽器看不懂 ES6 ),根據官方文件, @babel/preset-env 的用途是和 @babel/preset-es2015 相同的,所以安裝前者。

yarn add @babel/preset-env --save-dev / npm install @babel/preset-env --save-dev

 

安裝處理 css 檔案的 loader
yarn add style-loader css-loader -S / npm i style-loader css-loader -S

寫在一起就是兩個都會安裝,可以少打幾個字XD
 

配置 loader 設定

只是安裝了對應 loader,webpack 還是不知道怎麼打包 js 以外的檔案,這些設定要在 webpack.config.js 的 module.rules 中配置。

const path = require('path'); // 引用path模組
module.exports = {
  entry: ['./index.js', './app.jsx'],
  // 如果有一個以上的檔案需要打包,可以傳陣列給entry。
  output: {
    filename: 'bundle.js', // 打包後的檔案名稱
    path: path.resolve(__dirname, './dist'),
    // 打包後的路徑,這裡使用path模組的resolve(),
    // 可以看到其實目前專案裡面還沒有 dist 資料夾。
    // 這邊純粹是我習慣把把包完的東西塞進一個特定資料夾,比較整齊。
  },
  // 將loader的設定寫在module的rules屬性中
  module: {
    rules: [ // rules的值是一個陣列可以存放多個loader物件
      { // 編譯 JSX
        test: /.jsx$/,  // 指定編譯檔案的副檔名
        exclude: /node_modules/,
        // 不編譯的路徑。
        // 因為我們不會把node_nodules資料夾放到serve,
        // 所以不需要編譯他。
        use: { // 指定用來編譯符合副檔名條件的loader
          loader: 'babel-loader', // 指定進行編譯的套件
          options: {
            presets: ['@babel/preset-react', "@babel/preset-env"]
          } // 指定loader套件中的presets
        }
     },
     { // 編譯 ES6
       test: /.js$/,
       exclude: /node_modules/,
       use: {
         loader: "babel-loader",
         options: { presets: ["@babel/preset-env"] },
       },
     },
     { // 編譯 css 樣式檔
       test: /\.css$/,
       loader: ["style-loader", "css-loader"]
     },
   ],
  },
};

 
設定完成之後就可以打包看看結果了

yarn build / npm run build

 

webpack-dev-server

好了網頁有了,但是每次調整都要重刷好麻煩。
hot reload 是個好東西,你值得擁有。

可以透過安裝 webpack-dev-server 加上設定來達到這個效果。

yarn add webpack-dev-server --save-dev / npm i webpack-dev-server --save-dev

 

設定devServer

// webpack.config.js
// 加在 output 後面 (自己的習慣)

devServer: {
hot: true,
},

hot 設定 hot reload,儲存後重整即可看到效果,不用重新下指令。
port 沒有特別設定的話預設使用8080,如果被占用就使用8081。

目前測試後是 js 與 jsx 檔案都可以即時更新,html 的部分還是需要手動重刷。
但也還可以接受了,畢竟在 react 專案中 html 檔案不太會需要修改。
 
使用以下指令,跑完就可以得到一個預設 8080 的 localhost server。

webpack-dev-server

 
英打太慢手殘如我習慣在 package.json 中直接定義。

"scripts": {
"build": "webpack",
"serve": "webpack-dev-server"
},

 

這邊有更動的話記得重新再打包一次。

yarn build / npm run build

 
接著就可以用以下指令在本機架 server 了。

yarn serve / npm run serve

 
做到這邊差不多就可以開始進行 React 專案開發了,感謝 神Q大大 文章指導與閱讀到這邊的你 =)

 

題外話,前幾天做了兩個 react 的小作品:
[React] 抽獎小遊戲 陣列渲染實作練習
[React] state練習 可長按設定的進度條

我把這兩個作品都放進了這個剛架好的 webpack 專案了,其實就跟使用 create-react-app 做出來的效果一樣。

code 放在 github了,提供參考。

 
參考文章
[筆記][React]從零到一的webpack開發環境(2)-React開發篇