從零開(kāi)始搭建webpack+react開(kāi)發(fā)環(huán)境的詳細(xì)步驟
環(huán)境主要依賴版本
- webpack@4.8.1
- webpack-cli@2.1.3
- webpack-dev-server@3.1.4
- react@16.3.2
- babel-core@6.26.3
- babel-preset-env@1.6.1
- bable-preset-react@6.24.1
webpack安裝及配置
1. 起步
新建項(xiàng)目目錄,初始化npm,新建開(kāi)發(fā)源目錄
mkdir webpack-react && cd webpack-react npm init -y mkdir src
2.webpack-cli
webpack從4.x版本開(kāi)始,需要同時(shí)安裝webpack,webpack-cli(此工具用于在命令行中運(yùn)行webpack)。
npm install webpack webpack-cli --save-dev
3.wepback配置文件
在項(xiàng)目根目錄新建webpack.config.js文件,此文件為webpack運(yùn)行核心文件。
webpack.config.js 基本配置
// webpack.config.js const path = require('path'); module.exports = { entry: './src/index.js', // 入口文件 output: { // webpack打包后出口文件 filename: 'app.js', // 打包后js文件名稱 path: path.resolve(__dirname, 'dist') // 打包后自動(dòng)輸出目錄 } }
package.json 文件 scripts配置
"scripts": { "build": "webpack" }
此時(shí)在命令行運(yùn)行npm run build,就能執(zhí)行webpack了,webpack會(huì)自動(dòng)去找項(xiàng)目根目錄里的webpack.config.js文件,執(zhí)行打包。
npm run build // webpack打包后的項(xiàng)目 ├── dist │ └── app.js // 打包后的app.js ├── package.json ├── src │ └── index.js // 源目錄入口文件 └── webpack.config.js
webpack.config.js module相關(guān)配置
webpack 視所有文件都為模塊,圖片,css文件,字體等靜態(tài)資源都會(huì)打包進(jìn)js文件,所以會(huì)需要用到loader文件,更多Loaders可以查詢網(wǎng)址,接下來(lái)我們安裝一些必要的Loader文件。
npm install style-loader css-loader url-loader --save-dev
webpack.config.js加入module模塊
module.exports = { entry: './src/index.js', output: { filename: 'app.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] }, { test: /\.(png|svg|jpg|gif)$/, use: ['url-loader'] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: ['url-loader'] } ] } }
引入loader后,就可以在你的src/index.js文件import你想引入的css文件或者其他靜態(tài)資源。
cd src && touch main.css
src/index.js 文件引入css
import "./main.css";
webpack.config.js plugins配置
主要的js文件和靜態(tài)文件都能成功打包成一個(gè)js文件后,我們需要把這個(gè)js文件放到html文件里,webpack插件***html-webpack-plugin***就是干這個(gè)事兒的,它能自動(dòng)生成一個(gè)html文件并把我們打包好的js文件放入html。
npm install html-webpack-plugin --save-dev
webpack.config.js 配置plugins
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); // 引入插件 module.exports = { entry: './src/index.js', output: { filename: 'app.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] }, { test: /\.(png|svg|jpg|gif)$/, use: ['url-loader'] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: ['url-loader'] } ] }, plugins: [ new HtmlWebpackPlugin({title: 'production'}) // 配置plugin ] };
執(zhí)行npm run build后,我們可以看到dist目錄多出一個(gè)index.html文件。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>name</title> </head> <body> // 打包后的app.js已經(jīng)被自動(dòng)插入了html文件 <script type="text/javascript" src="app.js"></script></body> </html>
到這里,webpack最簡(jiǎn)單最基本的需求已經(jīng)配置完畢。 此時(shí)項(xiàng)目結(jié)構(gòu)為:
├── dist // 生產(chǎn)目錄 │ ├── app.js │ └── index.html ├── package.json ├── src // 源目錄 │ ├── index.js │ └── main.css └── webpack.config.js
React 的webpack配置
安裝react
npm install react react-dom --save
安裝react,wepback轉(zhuǎn)換依賴
React組件由JSX組成,瀏覽器無(wú)法識(shí)別JSX,需要babel進(jìn)行轉(zhuǎn)換。
- babel-croe 為babel核心文件
- babel-preset-env 將ES6轉(zhuǎn)義成ES5
- babel-preset-react 將JSX轉(zhuǎn)義成js
- babel-loader webpack的babe轉(zhuǎn)換
.babelrc配置文件
在項(xiàng)目根目錄下新建.babelrc文件,此文件為bable核心配置,babel會(huì)自動(dòng)在項(xiàng)目根目錄下識(shí)別。
// .babelrc { "presets": ["env", "react"] }
webpack babel-loader 配置
// 在webpack.config.js 的modules.rules中加入此配置 { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader' } }
html-webpack-plugin 模板配置
我們知道react需要獲取頁(yè)面一個(gè)根元素,然后render才會(huì)生效,我們可以新建一個(gè)html文件,讓html-webpack-plugin插件基于這個(gè)文件來(lái)進(jìn)項(xiàng)打包。
所以我們?cè)诟夸浵滦陆ㄒ粋€(gè)html文件,以此文件作模板。
// index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> // react需要的渲染根元素 <div id="root"></div> </body> </html>
此時(shí)webpack.config.js配置:
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/index.js', output: { filename: 'app.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader' } }, { test: /\.css$/, use: ['style-loader', 'css-loader'] }, { test: /\.(png|svg|jpg|gif)$/, use: ['url-loader'] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: ['url-loader'] } ] }, plugins: [ new HtmlWebpackPlugin({ title: 'production', template: './index.html' // 模板文件位置 }) ] };
書(shū)寫(xiě)React,運(yùn)行webpack
// src/index.js import React from 'react'; import ReactDom from 'react-dom'; import './main.css' ReactDom.render( <h1>hello world</h1>, document.getElementById('root') );
運(yùn)行npm run build,生成dist目錄,打開(kāi)dist目錄中的index.html文件,可以發(fā)現(xiàn)瀏覽器已正常渲染"hello world"。
dev環(huán)境熱更新配置
react的wepack完成以后,是不是發(fā)現(xiàn)每修改一次代碼,想看到效果,得重新打包一次才行。webpack-dev-server配置可以幫助我們實(shí)現(xiàn)熱更新,在開(kāi)發(fā)環(huán)境解放我們的生產(chǎn)力。
安裝webpack-dev-server
npm install webpack-dev-server --save-dev
webpack.config.js 配置
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); module.exports = { entry: './src/index.js', output: { filename: 'app.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader' } }, { test: /\.css$/, use: ['style-loader', 'css-loader'] }, { test: /\.(png|svg|jpg|gif)$/, use: ['url-loader'] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: ['url-loader'] } ] }, plugins: [ new HtmlWebpackPlugin({ title: 'production', template: './index.html' }), // hot 檢測(cè)文件改動(dòng)替換plugin new webpack.NamedModulesPlugin(), new webpack.HotModuleReplacementPlugin() ], // webpack-dev-server 配置 devServer: { contentBase: './dist', hot: true }, };
運(yùn)行webpack-dev-server
在 package.json 文件 加入 scripts 配置:
"scripts": { "build": "webpack", "dev": "webpack-dev-server --open --mode development" // webpack-dev-server },
命令行運(yùn)行 npm run dev
可以在瀏覽器中輸入localhost:8080 內(nèi)容即為dist目錄下的index.html內(nèi)容。修改src/index.js中的內(nèi)容或者依賴,即實(shí)時(shí)在瀏覽器熱更新看到。
至此,react的webpack的基礎(chǔ)開(kāi)發(fā)環(huán)境已全部配置完畢。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解使用WebPack搭建React開(kāi)發(fā)環(huán)境
- 基于Webpack4和React hooks搭建項(xiàng)目的方法
- 基于webpack4.X從零搭建React腳手架的方法步驟
- Webpack 4.x搭建react開(kāi)發(fā)環(huán)境的方法步驟
- webpack4 + react 搭建多頁(yè)面應(yīng)用示例
- 基于webpack4搭建的react項(xiàng)目框架的方法
- 使用webpack搭建react開(kāi)發(fā)環(huán)境的方法
- 手動(dòng)用webpack搭建第一個(gè)ReactApp的示例
- 詳解基于webpack搭建react運(yùn)行環(huán)境
- 使用webpack5從0到1搭建一個(gè)react項(xiàng)目的實(shí)現(xiàn)步驟
相關(guān)文章
React Native實(shí)現(xiàn)進(jìn)度條彈框的示例代碼
本篇文章主要介紹了React Native實(shí)現(xiàn)進(jìn)度條彈框的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07React?Hooks useReducer?逃避deps組件渲染次數(shù)增加陷阱
這篇文章主要介紹了React?Hooks?之?useReducer?逃避deps后增加組件渲染次數(shù)的陷阱詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09詳解React開(kāi)發(fā)中使用require.ensure()按需加載ES6組件
本篇文章主要介紹了詳解React開(kāi)發(fā)中使用require.ensure()按需加載ES6組件,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05React-Native做一個(gè)文本輸入框組件的實(shí)現(xiàn)代碼
這篇文章主要介紹了React-Native做一個(gè)文本輸入框組件的實(shí)現(xiàn)代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08Ant?Design?組件庫(kù)按鈕實(shí)現(xiàn)示例詳解
這篇文章主要介紹了Ant?Design?組件庫(kù)按鈕實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪</P><P><BR>2022-08-08react+antd 遞歸實(shí)現(xiàn)樹(shù)狀目錄操作
這篇文章主要介紹了react+antd 遞歸實(shí)現(xiàn)樹(shù)狀目錄操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11