1. 程式人生 > 實用技巧 >一個簡單的用webpack搭建react專案例項

一個簡單的用webpack搭建react專案例項

廢話不多說,直接開始。

雖然說是用webpack搭建react專案,但因為是我自己的命名和開發習慣,因此大家不一定要按照我的寫法來寫,選擇適合自己的就好

在進行搭建專案之前,要準備一個非常重要的東西,那就是NODE。

如果不知道NODE的話,那麼接下來你是無法操作的。

這裡簡單的介紹下NODE和我們的安裝包的工具NPM

Node,即nodejs, 是一個基於Chrome JavaScript 執行時建立的一個平臺。
在構建專案的腳手架時,我們需要使用node的npm來安裝一些module。

NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS程式碼部署上的很多問題
允許使用者從NPM伺服器下載別人編寫的第三方包到本地使用。


允許使用者從NPM伺服器下載並安裝別人編寫的命令列程式到本地使用。
允許使用者將自己編寫的包或命令列程式上傳到NPM伺服器供別人使用。
只有通過npm,我們才能夠快速方便的安裝我們在構建專案是所需的包

然後,當配置完NODE之後,便可以開始搭建react專案了。

開始搭建專案

首先,這是我開發專案時常用的檔案樹的

--public
--src
--.babel
--.gitgnore
--package.json
--webpack.config.js

首先,我們先新建一個資料夾,命名為react-cli(隨意)

在資料夾中新建public和src兩個資料夾。

這裡解釋一下為什麼要新建這兩個資料夾

1.Src :用來儲存react的元件和入口檔案等,是專案的身體部分。


2.Public: public目錄用來存放所有靜態資源以及我們最重要的的index.html檔案

相信使用過react的腳手架的同學對此一定不會陌生。

然後在public下建立我們的入口檔案index.html

完成後應該是這樣的:

之後,我們在index.html內寫入一些程式碼。

 1 <!DOCTYPE html>
 2 <html>
 3 
 4 <head>
 5   <meta charset="UTF-8" />
 6   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"
> 7 <title>React Starter</title> 8 </head> 9 10 <body> 11 <div id="root"></div> 12 <noscript> 13 this is a react project 14 </noscript> 15 <script src="../dist/bundle.js"></script> 16 </body> 17 18 </html>

這裡有兩行需要特別留意。一個是<div id=“root”></div> 。我們的react 應用可是要掛在裡面。
另一個是<script src=“../dist/bundle.js”></script>這個檔案裡面會寫我們的react程式碼。當然這裡可以隨便取名字。

這樣,我們的第一步就完成了

接下來開始我們的第二步

首先將命令列移到cli目錄下。

執行 npm init(npm init -y) 語句並配置生成的package.json

這條語句是用來建立我們的package.json檔案,有了它,我們便可以安裝一些依賴項和配置項。

執行完之後樣子是這樣的

packge.json裡是這樣子的:

 1 {
 2   "name": "cli",
 3   "version": "1.0.0",
 4   "description": "",
 5   "main": "index.js",
 6   "scripts": {
 7     "test": "echo \"Error: no test specified\" && exit 1"
 8   },
 9   "keywords": [],
10   "author": "",
11   "license": "ISC"
12 }

這裡解釋一下主要的部分

Name:專案名。
Version:版本。
Main:主入口檔案。
Scripts:在這裡可以配置一些啟動項和debug項,讓專案的啟動和debug命令簡化
devDependencies:在開發環境下安裝的依賴項,不會隨著專案打包被帶走。
preeDependencies:有時,你的專案和所依賴的模組,都會同時依賴另一個模組,但是所依賴的版本不一樣。 preeDependencies ,在模板安裝的時候提醒使用者安裝最高該模組的最高版本
dependencies:生產和開發都會用到的依賴,最後會被打包到專案中。

這裡的內容我們會在之後的過程中逐漸的更改,現在先這樣。

第三步:建立並配置webpack檔案

在專案目錄下建立webpack.config.js檔案

這個檔案便是webpack的配置檔案,我們將會在這裡配置一些項,來製作出react專案。

在配置webpack之前,我們需要安裝一些依賴項,通過NPM

因為只是簡單的製作,所以就不安裝過多的依賴項,只需安裝

webpack webpack-cli webpack-dev-server css-loader style-loader 在命令列輸入以下指令:
npm install webpack webpack-cli webpack-dev-server css-loader style-loader -D

便會安裝這些依賴項

安裝完以後packag.json會變成這樣

 1 {
 2   "name": "cli",
 3   "version": "1.0.0",
 4   "description": "",
 5   "main": "index.js",
 6   "scripts": {
 7     "test": "echo \"Error: no test specified\" && exit 1"
 8   },
 9   "keywords": [],
10   "author": "",
11   "license": "ISC",
12   "dependencies": {},
13   "devDependencies": {
14     "css-loader": "^4.2.1",
15     "style-loader": "^1.2.1",
16     "webpack": "^4.44.1",
17     "webpack-cli": "^3.3.12",
18     "webpack-dev-server": "^3.11.0"
19   }
20 }

同時會多一個packag-lock.json,用過NODE應該都知道是啥,就不講了。

現在開始配置webpack程式碼如下

 1 const path = require("path");
 2 const webpack = require("webpack");
 3 
 4 module.exports = {
 5   entry: "./src/index.jsx",
 6   mode: "development",
 7   module: {
 8     rules: [
 9       {
10         test: /\.css$/,
11         use: ["style-loader", "css-loader"],
12       },
13     ],
14   },
15   resolve: { extensions: ["*", ".js", ".jsx"] },
16   output: {
17     path: path.resolve(__dirname, "dist/"),
18     publicPath: "/dist/",
19     filename: "bundle.js",
20   },
21   devServer: {
22     contentBase: path.join(__dirname, "public/"),
23     port: 3000,
24     hot: true,
25     open:true,
26     overlay: {
27       warnings: true,
28       errors: true,
29     },
30     publicPath: "http://localhost:3000/dist/",
31     hotOnly: true,
32   },
33   plugins: [new webpack.HotModuleReplacementPlugin()],
34 };

解釋一下各配置項:

1、Entry:告訴webpack我們的應用程式從哪兒開始以及從哪裡開始打包我們的檔案。


2、Mode:告訴webpack我們正在以開發模式執行,這使我們不必在執行開發伺服器時新增模式標誌。


3、Module:物件定義你匯出的javascript模組如何轉換以及那些檔案要根據給定的rules進行轉換。
  其中的rules的配置項為:
  Test:要被解析的檔案型別。
  Exclude: 不包括哪裡的檔案。
  Use:配置用來解析檔案的loader,包含:
  Loader:loader項。
  Options:一些條件和強調項。
  其中的loader的配置項是使用各種檔案的解析依賴項,如css,js,less等。


4、Resolve:哪些型別的檔案要進行處理,這也允許我們在匯入modules的時候不用寫副檔名。


5、Output:告訴webpack我們打包之後的程式碼在哪裡輸出。

publicPath屬性定義了我們打包後的檔案應該跑到哪個目錄裡。同時告訴webpack-dev-server從哪裡去啟動我們的服務。

這個publicPath屬性是一個特殊的屬性 ,它可以幫助我們進行dev-server操作。他可以定義我們的公共url的目錄,起碼webpack-dev-server會很關心這一點。如果設定錯了,就會報404錯誤。


6、devServer:用來啟動webpack-dev-server服務。

這裡並沒有太多的要求。只要標出我們的靜態資源放那兒(比方說我們的index.html)以及我們要在哪個埠啟動該服務。你可以看到devServer也有一個publicPath,這裡的publicPath是為了告訴server我們打包後的檔案在哪兒。需要留心的是 output.publicPath 和 devServer.publicPath是不一樣的。


7、Plugins: 用來配置一些有用的外掛,例如熱更新外掛HotModuleReplacementPlugin
如果不配置這個外掛,每次更新程式碼儲存後需要重新啟動webpack-dev-server,而配置了這個外掛,則可以在儲存程式碼後自動的進行更新。

到這裡,webpack就基本配置完成,但這裡還有一個坑,為了強調一下,就放在這裡講。

我們知道react使用的是jsx語法,而wepack無法解析jsx,所以這裡我們的需要配置babel,用babel來解析jsx成js語法。因此我們需要配置babel檔案。

配置babel檔案步驟:

  1. 建立.babelrc檔案。
  2. Npm安裝babel-core, babel-cli, preset-react, preset-env
     npm install @babel/cli @babel/core @babel/preset-env @babel/preset-react babel-loader -D

  3. 在.babel 配置 “presets”: [“@babel/env”, “@babel/preset-react”],告訴babel 我們要使用env和react這兩個預設。

此時我們的babel就配置完成。
然後在module的rules裡配置babel-loader就可以了,配置完成後是這樣的

.babel:

1 {
2     "presets": ["@babel/env", "@babel/preset-react"] //使用env和react 來解析es6和jsx
3 }

webpack.config.js(多加的地方已加色加粗)

 1 const path = require("path");
 2 const webpack = require("webpack");
 3 
 4 module.exports = {
 5   entry: "./src/index.jsx",
 6   mode: "development",
 7   module: {
 8     rules: [
 9       {
10         test: /\.(js|jsx)$/,
11         exclude: /(node_modules|bower_tcomponents)/,
12         use: [
13           {
14             loader: "babel-loader",
15             options: { presets: ["@babel/env"] },
16           },
17         ],
18       },
19       {
20         test: /\.css$/,
21         use: ["style-loader", "css-loader"],
22       },
23     ],
24   },
25   resolve: { extensions: ["*", ".js", ".jsx"] },
26   output: {
27     path: path.resolve(__dirname, "dist/"),
28     publicPath: "/dist/",
29     filename: "bundle.js",
30   },
31   devServer: {
32     contentBase: path.join(__dirname, "public/"),
33     host: "0.0.0.0",
34     useLocalIp: true,
35     port: 3000,
36     hot: true,
37     open: true,
38     overlay: {
39       warnings: true,
40       errors: true,
41     },
42     publicPath: "http://localhost:3000/dist/",
43     hotOnly: true,
44   },
45   plugins: [new webpack.HotModuleReplacementPlugin()],
46 };

至此,webpack配置完成,此時我們的專案結構如下:

第四步:配置react的入口檔案

首先我們需要額外安裝兩個依賴包react以及react-dom。

命令列執行

1 npm install react react-dom -S

此時,你的packge.json應該是這樣

 1 {
 2   "name": "cli",
 3   "version": "1.0.0",
 4   "description": "",
 5   "main": "index.js",
 6   "scripts": {
 7     "test": "echo \"Error: no test specified\" && exit 1"
 8   },
 9   "keywords": [],
10   "author": "",
11   "license": "ISC",
12   "dependencies": {
13     "react": "^16.13.1",
14     "react-dom": "^16.13.1"
15   },
16   "devDependencies": {
17     "@babel/cli": "^7.10.5",
18     "@babel/core": "^7.11.1",
19     "@babel/preset-env": "^7.11.0",
20     "@babel/preset-react": "^7.10.4",
21     "babel-loader": "^8.1.0",
22     "css-loader": "^4.2.1",
23     "style-loader": "^1.2.1",
24     "webpack": "^4.44.1",
25     "webpack-cli": "^3.3.12",
26     "webpack-dev-server": "^3.11.0"
27   }
28 }

這裡解釋一下為什麼安這兩個依賴項:
React是 React庫的入口,只有引入React才能夠使用React的元件和元素。
ReactDom 用來做與瀏覽器或DOM相關的操作,例如ReactDom.render。

只有安裝它們才能夠寫react專案。

現在我們需要告訴Reactapp 我們要把reactapp掛在到哪個檔案

在src目錄下建立一個index.jsx檔案並寫入以下程式碼

 1 import React from "react";
 2 import ReactDOM from "react-dom";
 3 class App extends React.Component {
 4   render() {
 5     return (
 6       <div className="App">
 7         <h1> Hello, World! </h1>
 8       </div>
 9     );
10   }
11 }
12 ReactDOM.render(<App />, document.getElementById("root"));

ReactDom.render()告訴react渲染什麼,在哪兒渲染。這裡我們將要渲染一個叫做APP(馬上就要建立了)的元件,渲染到我們index.html中的一個div中。
至此,主入口檔案建立完成,接下來便可以運行了。

第五步:執行webpack,啟動專案。

首先我們修改package.json

 1 {
 2   "name": "cli",
 3   "version": "1.0.0",
 4   "description": "",
 5   "main": "index.jsx",
 6   "scripts": {
 7     "dev": "webpack-dev-server --mode development"
 8   },
 9   "keywords": [],
10   "author": "",
11   "license": "ISC",
12   "dependencies": {
13     "react": "^16.13.1",
14     "react-dom": "^16.13.1"
15   },
16   "devDependencies": {
17     "@babel/cli": "^7.10.5",
18     "@babel/core": "^7.11.1",
19     "@babel/preset-env": "^7.11.0",
20     "@babel/preset-react": "^7.10.4",
21     "babel-loader": "^8.1.0",
22     "css-loader": "^4.2.1",
23     "style-loader": "^1.2.1",
24     "webpack": "^4.44.1",
25     "webpack-cli": "^3.3.12",
26     "webpack-dev-server": "^3.11.0"
27   }
28 }

之後再命令列輸入

1 npm run dev

就會運行了

命令列是這樣的

同時會開啟一個網頁,寫著hello World

最後的專案結構為

至此,一個簡單的react專案構建完成

我會在後面逐步的介紹一些常用的webpack和babel的外掛。

感謝觀看

想要獲取程式碼的話請訪問我的GitHub:https://github.com/FuloliyaLansfroya/allProject