何言 發表於 2020-3-5 17:53:00

Webpack搭建React开发环境详细步骤

<p><span style="text-decoration: underline"><strong>1.安装node.js</strong></span></p>
<p>  Webpack实际是用Node.js写的,所以要先安装Node.js环境。而且Node.js中集成了NPM包管理,我们在后面用到的很多模块都需要使用NPM下载。</p>
<p>  首先进入Node.js的官网:https://nodejs.org/zh-cn/download/,选择对应系统下载安装包,对于 windows 用户,直接下载安装包安装即可,如果是 Macos 用户,推荐使用 brew 进行安装。Node.js有很多版本,包括稳定版和开发版,不同的项目需要的Node.js版本不同,推荐大家安装 8.x 以上的版本。<br><span style="text-decoration: underline"><strong>2.安装webpack的步骤如下:</strong></span></p>
<p> 1.<span class="md-plain md-expand">创建<span><code>React</code><span class="md-plain">项目的文件夹,在项目根目录下打开命令提示符,执行初始化命令,生成<span><code>package.json</code><span class="md-plain md-expand">文件(如果已经安装了cnpm的话,可以使用cnpm代替npm,执行指令):</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm init -y</pre>
</div>
<p> 2.安装react和react-dom依赖(注:install可以简写成i)</p>
<p>  a.安装react</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm install react -S</pre>
</div>
<p>  b.安装react-dom</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm install react-dom -S</pre>
</div>
<p> 3.安装webpack和webpack-cli开发依赖</p>
<p>  a.安装webpack</p>
<div class="cnblogs_code">
<pre>cnpm install webpack -D</pre>
</div>
<p>  b.安装webpack-cli</p>
<div class="cnblogs_code">
<pre>cnpm install webpack-cli -D</pre>
</div>
<p>&nbsp; 4.安装babel和babel preset-react</p>
<p>  a.安装babel</p>
<div class="cnblogs_code">
<pre>cnpm i babel-loader @babel/core @babel/preset-env -D</pre>
</div>
<p>  b.安装 babel preset-react</p>
<div class="cnblogs_code">
<pre>cnpm i @babel/preset-react -D</pre>
</div>
<p> 以上的指令执行之后的package.json文件是:</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1902049/202003/1902049-20200305165529292-1666787299.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp; 5.在react项目的文件夹下创建webpack.config.js文件,<span class="md-plain md-expand">并在配置文件中添加对<span><code>JSX</code><span class="md-plain">语法的<span><code>Babel</code><span class="md-plain md-expand">编译支持:</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">    resolve: {
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>         extensions: ['.wasm', '.mjs', '.js', '.json', '.jsx'<span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">    module: {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">      rules: [
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>               test: /\.jsx?$/, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> jsx/js文件的正则</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>               exclude: /node_modules/, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 排除 node_modules 文件夹</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">                use: {
</span><span style="color: rgba(0, 128, 128, 1)">11</span>                     <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> loader 是 babel</span>
<span style="color: rgba(0, 128, 128, 1)">12</span>                     loader: 'babel-loader'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">                  options: {
</span><span style="color: rgba(0, 128, 128, 1)">14</span>                         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> babel 转义的配置选项</span>
<span style="color: rgba(0, 128, 128, 1)">15</span>                         babelrc: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">                        presets: [
</span><span style="color: rgba(0, 128, 128, 1)">17</span>                           <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加 preset-react</span>
<span style="color: rgba(0, 128, 128, 1)">18</span>                           require.resolve('@babel/preset-react'<span style="color: rgba(0, 0, 0, 1)">),
</span><span style="color: rgba(0, 128, 128, 1)">19</span>                           
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">                        ],
</span><span style="color: rgba(0, 128, 128, 1)">21</span>                         cacheDirectory: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">                  }
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)">      ]
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">27</span> };</pre>
</div>
<p> 6.<span class="md-plain md-expand">在项目根目录创建 <span><code>src/index.js</code><span class="md-plain">文件,<span><code>src</code><span class="md-plain">是源文件目录,index.js<span><code></code><span class="md-plain md-expand">文件内容如下:</span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import React from 'react'
<span style="color: rgba(0, 128, 128, 1)">2</span> import ReactDOM from 'react-dom'
<span style="color: rgba(0, 128, 128, 1)">3</span>
<span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">ReactDOM.render(
</span><span style="color: rgba(0, 128, 128, 1)">5</span>   &lt;div&gt;hellowebpack !!!&lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>   , document.getElementById("root"))</pre>
</div>
<p> 7.<span class="md-plain md-expand">将index.js文件添加到<span><code>webpack.config.js</code><span class="md-plain">中的<span><code>entry</code><span class="md-plain md-expand">:</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   entry: './src/index.js'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">3</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ...</span>
<span style="color: rgba(0, 128, 128, 1)">4</span> };</pre>
</div>
<p> 8.在项目根目录创建 public<code>/index.html</code><span class="md-plain">文件,public<code></code><span class="md-plain">是源文件目录,index.html<span class="md-plain md-expand">文件内容如下:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">&lt;!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html </span><span style="color: rgba(255, 0, 0, 1)">lang</span><span style="color: rgba(0, 0, 255, 1)">="en"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">charset</span><span style="color: rgba(0, 0, 255, 1)">="UTF-8"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="viewport"</span><span style="color: rgba(255, 0, 0, 1)"> content</span><span style="color: rgba(0, 0, 255, 1)">="width=device-width, initial-scale=1.0"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>webpack练习<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="root"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p> 9.<span class="md-plain md-expand">需要使用 <span class=" md-link"><span class="md-plain">html-webpack-plugin</span><span class="md-plain"> 插件来复制 public/<span><code>index.html</code><span class="md-plain"> 到 <span><code>dist</code><span class="md-plain md-expand"> 文件夹下,指令是:</span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>cnpm i html-webpack-plugin -D</pre>
</div>
<p> 10.修改webpack.config.js文件的配置:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> const HtmlWebPackPlugin = require('html-webpack-plugin'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ...</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">    plugins: [
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>         <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> HtmlWebPackPlugin({
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>             template: 'public/index.html'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>             filename: 'index.html'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>             inject: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">    ]
</span><span style="color: rgba(0, 128, 128, 1)">11</span> };</pre>
</div>
<p> 11.上面的操作都完成之后,可以执行打包命令:</p>
<div class="cnblogs_code">
<pre>npx webpack --mode development</pre>
</div>
<p>  如果出现下面的情况,就证明在react项目下自动生成了一个dist的文件夹,里面<span class="md-plain md-expand">存放的是<span><code>webpack</code><span class="md-plain md-expand">编译打包后的文件</span></span></span></p>
<p><img src="https://img2020.cnblogs.com/i-beta/1902049/202003/1902049-20200305171623058-155342708.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;  这时在package.json文件中配置以下 的内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   "scripts"<span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(0, 128, 128, 1)">3</span>         "build": "webpack --mode production"
<span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">5</span> }</pre>
</div>
<p> 12.配置好了以后,我们就可以使用简化的命令来操作打包了:</p>
<div class="cnblogs_code">
<pre>npm run build</pre>
</div>
<p>  如果出现下面的内容,打包成功了</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1902049/202003/1902049-20200305171956089-585290727.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;<span style="text-decoration: underline"><strong>3.配置React项目的本地服务</strong></span></p>
<p>  我们可以基于<code>Node.js</code>的<code>Express</code>搭建一个本地服务器,通过<code>Express</code>的中间件&nbsp;<code>webpack-dev-middleware</code>&nbsp;来实现与&nbsp;<code>Webpack</code>的交互。</p>
<p>(1)配置服务,需要以下四步:</p>
<p>  第一步:<span class="md-plain md-expand">安装<span><code>webpack-dev-server</code><span class="md-plain md-expand">依赖:</span></span></span></p>
<div class="cnblogs_code">
<pre>cnpm i webpack-dev-server -D</pre>
</div>
<p>  第二步:<span class="md-plain md-expand">在<span><code>webpack.config.js</code><span class="md-plain">配置文件中<span><strong><span class="md-plain">添加</span></strong><span class="md-plain md-expand">服务相关配置,完整配置如下:</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">webpackage.config.js</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> const path = require('path'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> const HtmlWebPackPlugin = require('html-webpack-plugin'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   mode: 'development'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   devtool: 'cheap-module-source-map'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">    devServer: {
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>         contentBase: path.join(__dirname, './src/'<span style="color: rgba(0, 0, 0, 1)">),
</span><span style="color: rgba(0, 128, 128, 1)">10</span>         publicPath: '/'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">11</span>         host: '127.0.0.1'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">12</span>         port: 3000<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">      stats: {
</span><span style="color: rgba(0, 128, 128, 1)">14</span>             colors: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">17</span>   entry: './src/index.jsx'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">18</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 将 jsx 添加到默认扩展名中,省略 jsx</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">    resolve: {
</span><span style="color: rgba(0, 128, 128, 1)">20</span>         extensions: ['.wasm', '.mjs', '.js', '.json', '.jsx'<span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">    module: {
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">      rules: [
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)">25</span>               test: /\.jsx?$/, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> jsx文件的正则</span>
<span style="color: rgba(0, 128, 128, 1)">26</span>               exclude: /node_modules/, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 排除 node_modules 文件夹</span>
<span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)">                use: {
</span><span style="color: rgba(0, 128, 128, 1)">28</span>                     <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> loader 是 babel</span>
<span style="color: rgba(0, 128, 128, 1)">29</span>                     loader: 'babel-loader'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)">                  options: {
</span><span style="color: rgba(0, 128, 128, 1)">31</span>                         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> babel 转义的配置选项</span>
<span style="color: rgba(0, 128, 128, 1)">32</span>                         babelrc: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 0, 1)">                        presets: [
</span><span style="color: rgba(0, 128, 128, 1)">34</span>                           <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加 preset-react</span>
<span style="color: rgba(0, 128, 128, 1)">35</span>                           require.resolve('@babel/preset-react'<span style="color: rgba(0, 0, 0, 1)">),
</span><span style="color: rgba(0, 128, 128, 1)">36</span>                           
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 0, 1)">                        ],
</span><span style="color: rgba(0, 128, 128, 1)">38</span>                         cacheDirectory: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">39</span> <span style="color: rgba(0, 0, 0, 1)">                  }
</span><span style="color: rgba(0, 128, 128, 1)">40</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">41</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">42</span> <span style="color: rgba(0, 0, 0, 1)">      ]
</span><span style="color: rgba(0, 128, 128, 1)">43</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(0, 0, 0, 1)">    plugins: [
</span><span style="color: rgba(0, 128, 128, 1)">45</span>         <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> HtmlWebPackPlugin({
</span><span style="color: rgba(0, 128, 128, 1)">46</span>             template: 'public/index.html'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">47</span>             filename: 'index.html'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">48</span>             inject: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">49</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">50</span> <span style="color: rgba(0, 0, 0, 1)">    ]
</span><span style="color: rgba(0, 128, 128, 1)">51</span> };</pre>
</div>
<p>  第三步:<span class="md-plain md-expand">修改<span><code>package.json</code><span class="md-plain">文件的<span><code>scripts</code><span class="md-plain">配置,添加<span><code>start</code><span class="md-plain md-expand">字段</span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   "scripts"<span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(0, 128, 128, 1)">3</span>         "build": "webpack --mode production"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">4</span>         "start": "webpack-dev-server --mode development --open"
<span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">6</span> }</pre>
</div>
<p>  第四步:执行启动服务命令:</p>
<div class="cnblogs_code">
<pre>npm start</pre>
</div>
<p>  之后在浏览器上会出现:</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1902049/202003/1902049-20200305173515951-1961663755.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>(2)配置热加载(意思是,配置成功后,可以自动刷新),有三步:</p>
<p>  第一步:<span class="md-plain md-expand">在<span><code>src</code><span class="md-plain">目录中新建<span><code>dev.js</code><span class="md-plain md-expand">文件,添加以下代码:</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (module.hot) {
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   module.hot.accept(err =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">3</span>         <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
</span><span style="color: rgba(0, 128, 128, 1)">4</span>             console.error('Cannot apply HMR update.'<span style="color: rgba(0, 0, 0, 1)">, err);
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 0, 1)">    });
</span><span style="color: rgba(0, 128, 128, 1)">7</span> }</pre>
</div>
<p> <span class="md-plain md-expand">上面代码用于触发<span><code>HMR</code><span class="md-plain md-expand">,这部分代码不属于业务代码。</span></span></span>  </p>
<p>  第二步:<span class="md-plain md-expand">在<span><code>webpack.config.js</code><span class="md-plain md-expand">配置文件中添加热加载配置:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> webpack.config.dev.js</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> const webpack = require('webpack'); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">增加导入webpack</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">    devServer: {
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">      ...
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>         hot: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在devServer中增加hot字段</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">      ...
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">    ...
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   entry: ['./src/index.jsx', './src/dev.js'], <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在entry字段中添加触发文件配置</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">    ...
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">    plugins: [
</span><span style="color: rgba(0, 128, 128, 1)">15</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> plugins中增加下面内容,实例化热加载插件</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>         <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> webpack.HotModuleReplacementPlugin(),
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">    ...
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">    ]
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">    ...
</span><span style="color: rgba(0, 128, 128, 1)">20</span> }</pre>
</div>
<p>  第三步:启动服务,测试热加载</p>
<div class="cnblogs_code">
<pre>npm start</pre>
</div>
<p>  可以自动刷新</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1902049/202003/1902049-20200305174436631-229197035.png"></p>
<p>&nbsp;</p>
<p>以下的代码,可以让我们检查,看看是哪一点没有或者忘记配置(这只是一个参考,还需要自己动手来操作)</p>
<p>  a.这是webpack.config.js的文件内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> const path = require('path'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> const HtmlWebPackPlugin = require('html-webpack-plugin'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> const webpack = require('webpack'); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">增加导入webpack</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   mode: 'development'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   devtool: 'cheap-module-source-map'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">    devServer: {
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>         hot: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在devServer中增加hot字段</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>         contentBase: path.join(__dirname, './src/'<span style="color: rgba(0, 0, 0, 1)">),
</span><span style="color: rgba(0, 128, 128, 1)">10</span>         publicPath: '/'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">11</span>         host: '127.0.0.1'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">12</span>         port: 3000<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">      stats: {
</span><span style="color: rgba(0, 128, 128, 1)">14</span>             colors: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">17</span>   entry:['./src/index.js', './src/dev.js'], <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在entry字段中添加触发文件配置</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">    resolve: {
</span><span style="color: rgba(0, 128, 128, 1)">19</span>         extensions: ['.wasm', '.mjs', '.js', '.json', '.jsx'<span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">    module: {
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">      rules: [
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)">24</span>               test: /\.jsx?$/, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> jsx/js文件的正则</span>
<span style="color: rgba(0, 128, 128, 1)">25</span>               exclude: /node_modules/, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 排除 node_modules 文件夹</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">                use: {
</span><span style="color: rgba(0, 128, 128, 1)">27</span>                     <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> loader 是 babel</span>
<span style="color: rgba(0, 128, 128, 1)">28</span>                     loader: 'babel-loader'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)">                  options: {
</span><span style="color: rgba(0, 128, 128, 1)">30</span>                         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> babel 转义的配置选项</span>
<span style="color: rgba(0, 128, 128, 1)">31</span>                         babelrc: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 0, 1)">                        presets: [
</span><span style="color: rgba(0, 128, 128, 1)">33</span>                           <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加 preset-react</span>
<span style="color: rgba(0, 128, 128, 1)">34</span>                           require.resolve('@babel/preset-react'<span style="color: rgba(0, 0, 0, 1)">),
</span><span style="color: rgba(0, 128, 128, 1)">35</span>                           
</span><span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 0, 0, 1)">                        ],
</span><span style="color: rgba(0, 128, 128, 1)">37</span>                         cacheDirectory: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)">                  }
</span><span style="color: rgba(0, 128, 128, 1)">39</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">40</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">41</span> <span style="color: rgba(0, 0, 0, 1)">      ]
</span><span style="color: rgba(0, 128, 128, 1)">42</span> <span style="color: rgba(0, 0, 0, 1)">    },
</span><span style="color: rgba(0, 128, 128, 1)">43</span> <span style="color: rgba(0, 0, 0, 1)">    plugins: [
</span><span style="color: rgba(0, 128, 128, 1)">44</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> plugins中增加下面内容,实例化热加载插件</span>
<span style="color: rgba(0, 128, 128, 1)">45</span>         <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> webpack.HotModuleReplacementPlugin(),
</span><span style="color: rgba(0, 128, 128, 1)">46</span>         <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> HtmlWebPackPlugin({
</span><span style="color: rgba(0, 128, 128, 1)">47</span>             template: 'public/index.html'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">48</span>             filename: 'index.html'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">49</span>             inject: <span style="color: rgba(0, 0, 255, 1)">true</span>
<span style="color: rgba(0, 128, 128, 1)">50</span> <span style="color: rgba(0, 0, 0, 1)">      })
</span><span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 0, 0, 1)">    ]
</span><span style="color: rgba(0, 128, 128, 1)">52</span> };</pre>
</div>
<p>  b.这是package.json文件内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>   "name": "webpack_exercise"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>   "version": "1.0.0"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   "description": ""<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   "main": "index.js"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   "scripts"<span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>   "build": "webpack --mode production"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>   "start": "webpack-dev-server --mode development --open"
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)">11</span>   "keywords"<span style="color: rgba(0, 0, 0, 1)">: [],
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   "author": ""<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">13</span>   "license": "ISC"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">14</span>   "dependencies"<span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(0, 128, 128, 1)">15</span>   "react": "^16.13.0"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">16</span>   "react-dom": "^16.13.0"
<span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 128, 1)">18</span>   "devDependencies"<span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(0, 128, 128, 1)">19</span>   "@babel/core": "^7.8.7"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">20</span>   "@babel/preset-env": "^7.8.7"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">21</span>   "@babel/preset-react": "^7.8.3"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">22</span>   "babel-loader": "^8.0.6"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">23</span>   "html-webpack-plugin": "^3.2.0"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">24</span>   "webpack": "^4.42.0"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">25</span>   "webpack-cli": "^3.3.11"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">26</span>   "webpack-dev-server": "^3.10.3"
<span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">28</span> }</pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/xps-03/p/12421600.html
頁: [1]
查看完整版本: Webpack搭建React开发环境详细步骤