溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Webpack 4.x怎樣搭建react開發(fā)環(huán)境

發(fā)布時間:2021-02-20 11:18:42 來源:億速云 閱讀:161 作者:小新 欄目:web開發(fā)

這篇文章主要介紹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以上的高級語法的編譯。但是因為react有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,因為依賴代碼中可能會有環(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í)行打包操作,但是目前為止還是會報錯,因為缺少babel設置,webpack打包時無法識別jsx語法,什么時jsx語法?就是在js代碼中寫的類似于dom結構的東西,如下:

...
<h2 onClick={this.handleClick.bind(this)} style={{ color: "red" }}>
  {'Hello ' + this.state.text}
</h2>
...

要解析這個東西還需要添加.babelrc文件,在其中添加:

{
  "plugins": ["transform-react-jsx"]
}

這句主要是說在babel參與打包時,會啟用jsx轉換成js的插件。到這里你已經可以成功打出你想要的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的坑

此外還有一點要說一下,就是在引入React時,請整個引入,要么就額外引入它在編譯后的代碼中可能會用到的api,否則會說什么什么沒找到而導致頁面加載不出來。看編譯后的代碼:

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(
  "h2",
  { 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你會看到大量飄紅,首先是在項目的開發(fā)環(huán)境安裝依賴:

"devDependencies": {
  ···
  "eslint": "^5.3.0",
  "eslint-plugin-import": "^2.14.0"
  ···
}

在項目根路徑下添加.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快速上手指南(雖然已經過時,還有部分不適用,但是還是借鑒了一部分代碼)

  • 阮一峰 四課時培訓課,雖然過時,但是還是能帶你體驗一番前端開發(fā)

以上是“Webpack 4.x怎樣搭建react開發(fā)環(huán)境”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI