Webpack 4.x搭建react開發(fā)環(huán)境的方法步驟
本文介紹了了Webpack 4.x搭建react開發(fā)環(huán)境的方法步驟,分享給大家,也給自己留個筆記
必要依賴一覽(npm install) 安裝好。
"dependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-preset-env": "^1.7.0",
"react": "^16.4.2",
"react-dom": "^16.4.2",
"webpack": "^4.16.5"
...
}
babel系列是干什么用的呢?是為了支持es6以上的高級語法的編譯。但是因?yàn)閞eact有jsx這個東西存在,所以單純的babel是不夠的,此外要讓babel作用于webpack,需要給webpack添加一個loader(以前版本叫l(wèi)oader,4.x版本開始改用‘rules'),在工程根目錄新建webpack.config.js文件,并添加如下代碼:
var path = require('path');
var node_modules = path.resolve(__dirname, 'node_modules');
var deps = [
];
//以上代碼可以忽略,沒有必要不要添加noParse,因?yàn)橐蕾嚧a中可能會有環(huán)境的判斷,而瀏覽器中是拿不到process變量的,會報錯!
var config = {
//這里是打包的入口
entry: path.resolve(__dirname, './react/app.js'),
resolve: {
alias: {
}
},
//打包完成后輸出到./build/bundle.js文件中
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js',
},
mode: 'development',
module: {
//上述的規(guī)則,loader就放在這里,這段沒什么好說的,從Webpack官方文檔上直接拿來用
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
//剛剛下載的module之一
presets: ['babel-preset-env']
}
}
}
]
}
};
//遍歷你的自定義要排除的依賴,安裝到node_modules里的依賴一般不需要排除掉
deps.forEach(function (dep) {
var depPath = path.resolve(node_modules, dep);
config.resolve.alias[dep.split(path.sep)[0]] = depPath;
config.module.noParse.push(depPath);
});
module.exports = config;
以上代碼可以直接用,請先將注釋去掉。有了以上文件配置,你可以直接在package.json中添加scripts來打包你的app.js。
...
"scripts": {
...
"build-config": "webpack",
...
}
...
執(zhí)行npm run build-config可執(zhí)行打包操作,但是目前為止還是會報錯,因?yàn)槿鄙賐abel設(shè)置,webpack打包時無法識別jsx語法,什么時jsx語法?就是在js代碼中寫的類似于dom結(jié)構(gòu)的東西,如下:
...
<h1 onClick={this.handleClick.bind(this)} style={{ color: "red" }}>
{'Hello ' + this.state.text}
</h1>
...
要解析這個東西還需要添加.babelrc文件,在其中添加:
{
"plugins": ["transform-react-jsx"]
}
這句主要是說在babel參與打包時,會啟用jsx轉(zhuǎn)換成js的插件。到這里你已經(jīng)可以成功打出你想要的bundle.js
> webpack
Hash: e716d360a6a752006c09
Version: webpack 4.16.5
Time: 973ms
Built at: 2018-08-14 15:19:14
Asset Size Chunks Chunk Names
bundle.js 715 KiB main [emitted] main
Entrypoint main = bundle.js
[./react/app.js] 2.74 KiB {main} [built]
+ 21 hidden modules
webpack打包的好處就是這里,可以讓你的app加載速度更快,如上的包總計715kb,隱藏了沒有用到的模塊21個。這就是為什么要搭手腳架開發(fā)的理由。
jsx-transform的坑
此外還有一點(diǎn)要說一下,就是在引入React時,請整個引入,要么就額外引入它在編譯后的代碼中可能會用到的api,否則會說什么什么沒找到而導(dǎo)致頁面加載不出來??淳幾g后的代碼:
var _react = __webpack_require__(/*! react */ "./node_modules/react/index.js");
var _react2 = _interopRequireDefault(_react);
...
_createClass(MyTitle, [{
key: "handleClick",
value: function handleClick() {
this.setState({
text: "Clicked"
});
}
}, {
key: "render",
value: function render() {
return _react2.default.createElement(
"h1",
{ onClick: this.handleClick.bind(this), style: { color: "red" } },
'Hello ' + this.state.text
);
}
}]);
如果你不引入react, 編譯后render()函數(shù)中的_react2會是React.createElement而React顯然是找不到這個變量的??吹骄幾g后的代碼,你可能更能理解,哦在jsx的dom中那樣寫原來是這個意思啊···
Vscode中開發(fā),需要配置好eslint
react中有大量的es6的寫法,如果不配置eslint你會看到大量飄紅,首先是在項(xiàng)目的開發(fā)環(huán)境安裝依賴:
"devDependencies": {
···
"eslint": "^5.3.0",
"eslint-plugin-import": "^2.14.0"
···
}
在項(xiàng)目根路徑下添加.eslintrc.json,并添加以下代碼[^eslint]:
{
"parserOptions": {
//使用的ecma版本
"ecmaVersion": 6,
"sourceType": "module",
//使用jsx特性
"ecmaFeatures": {
"jsx": true
}
},
"rules": {
//忽略console的警告
"no-console": "off",
"semi": ["error", "always"]
}
}
參考:
- eslint官方文檔
- babel-plugin-transform-jsx文檔
- webpack4.15.1 官方文檔
- babelrc 配置文檔
- React+Webpack快速上手指南(雖然已經(jīng)過時,還有部分不適用,但是還是借鑒了一部分代碼)
- 阮一峰 四課時培訓(xùn)課,雖然過時,但是還是能帶你體驗(yàn)一番前端開發(fā)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解使用WebPack搭建React開發(fā)環(huán)境
- 基于Webpack4和React hooks搭建項(xiàng)目的方法
- 基于webpack4.X從零搭建React腳手架的方法步驟
- webpack4 + react 搭建多頁面應(yīng)用示例
- 基于webpack4搭建的react項(xiàng)目框架的方法
- 從零開始搭建webpack+react開發(fā)環(huán)境的詳細(xì)步驟
- 使用webpack搭建react開發(fā)環(huán)境的方法
- 手動用webpack搭建第一個ReactApp的示例
- 詳解基于webpack搭建react運(yùn)行環(huán)境
- 使用webpack5從0到1搭建一個react項(xiàng)目的實(shí)現(xiàn)步驟
相關(guān)文章
React中的setState使用細(xì)節(jié)和原理解析(最新推薦)
這篇文章主要介紹了React中的setState使用細(xì)節(jié)和原理解析(最新推薦),前面我們有使用過setState的基本使用, 接下來我們對setState使用進(jìn)行詳細(xì)的介紹,需要的朋友可以參考下2022-12-12
關(guān)于React狀態(tài)管理的三個規(guī)則總結(jié)
隨著 JavaScript 單頁應(yīng)用開發(fā)日趨復(fù)雜,JavaScript 需要管理比任何時候都要多的 state (狀態(tài)),這篇文章主要給大家介紹了關(guān)于React狀態(tài)管理的三個規(guī)則,需要的朋友可以參考下2021-07-07
react antd如何防止一份數(shù)據(jù)多次提交
這篇文章主要介紹了react antd如何防止一份數(shù)據(jù)多次提交問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
淺談React組件props默認(rèn)值的設(shè)置
本文主要介紹了淺談React組件props默認(rèn)值的設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
基于React實(shí)現(xiàn)一個todo打勾效果
這篇文章主要為大家詳細(xì)介紹了如何基于React實(shí)現(xiàn)一個todo打勾效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
使用Jenkins部署React項(xiàng)目的方法步驟
這篇文章主要介紹了使用Jenkins部署React項(xiàng)目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03

