溫馨提示×

溫馨提示×

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

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

如何解決antd+react項目遷移vite的問題

發布時間:2021-07-07 15:54:04 來源:億速云 閱讀:270 作者:chen 欄目:編程語言

本篇內容介紹了“如何解決antd+react項目遷移vite的問題”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

  antd+react+webpack往往是以react技術棧為主的前端項目的標準組合,三者都有成熟的生態和穩定的表現,但隨著前端圈的技術不斷革新,號稱下一代構建平臺vite2的發布,webpack似乎不那么香了,為什么這么說呢,因為vite太快了。經過一段時間的嘗試,決定在項目中把webpack替換成vite試試,遂寫成本文分享給大家。

  Vite是什么

  作為本文的主角,首先簡單介紹一下vite這個構建工具,該工具是尤雨溪推出的【下一代前端開發和構建工具】,vite其實也不是一個新的工具,早在一年多以前,就已經推出了很多版本,直到2.x版本的推出,在前端圈引起了足夠大的震動,標志著vite的成熟和強大,這里并不打算詳細介紹vite,大家可以參考官網https://cn.vitejs.dev/ 了解。

  遷移過程

  了解了vite這款工具之后,我們就可以著手準備做遷移工作了;

  1.安裝vite依賴

  npm i vite antd-vite-import-plugin @vitejs/plugin-react-refresh vite-plugin-html -D

  2.更新項目原有依賴項

  這里我們項目使用的是dva+antd3.x作為基礎的開發框架,這里我將系統的主要依賴項都升級到了最新的版本,比如dva我用的2.6.0-beta.22版本,其他附帶的react、react-dom、react-router-dom及@babel/plugin-transform-runtime等相關依賴項都更新了(antd還是3.x版本,暫未更新到4.x的大版本),這一塊取決于自己的實際需求;

  3.項目根目錄添加vite.config.js配置文件

  和webpack的配置文件比起來,vite的簡單了許多,而且很多功能都是內置的,比如對靜態資源的處理,功能開啟也比較簡單,具體如下:

  import { defineConfig } from 'vite';

  import vitePluginHtml from 'vite-plugin-html';

  import reactRefresh from '@vitejs/plugin-react-refresh';

  export default defineConfig({

  css: {

  preprocessorOptions: {

  less: {

  javascriptEnabled: true,

  },

  }

  },

  publicDir: './src/configs',

  plugins: [

  reactRefresh(),

  antdViteImportPlugin(),

  vitePluginHtml({

  minify: true,

  inject: {

  injectData: {

  title: 'vite-react-example',

  injectScript: '', // publicDir作為根目錄

  },

  injectOptions: {

  filename: './index.html', // 模板頁

  }

  },

  }),

  ],

  server: {

  open: true,

  port: 10010,

  }

  });

  這里我們使用了vite-plugin-html插件作為html-webpack-plugin的替代方案,其中需要注意injectData和injectOptions選項,injectData可以方便的往我們的模板頁中插入自定義數據,injectOptions可以指定模板頁,還有其他配置項可以參考https://www.npmjs.com/package/vite-plugin-html 。相應的需要改造index.html頁面:

  ......

  和webpack有差異的是,這里我們需要手動指定一下入口文件,script的標簽type為module。

  4.修改文件后綴

  這里的文件是以js作為后綴的react組件,在webpack構建平臺下,js(x)、ts(x)都是沒啥問題的,但如果使用vite的話,那么最好是ts 、 jsx 、 tsx 的后綴文件,關于這個問題,可以看下這個issue:https://github.com/vitejs/vite/issues/1552 ,最后作者發出批量改個后綴有這么難的吐槽,算了,還是改吧,如果覺得手動改麻煩,寫個腳本也不是啥難事。

  5.添加啟動腳本

  "scripts": {

  "dev": "vite",

  "build": "vite build",

  ......

  }

  到這里應該就差不多了吧,但是情況卻不是那么順利,項目居然跑不起來,好吧,沒有那么一帆風順的事情,接下來我們來看下遇到的問題吧。

  遇到的問題

  1.decorators not support

  在業務代碼中,我們使用了dva提供的connect來綁定狀態,形如:

  @connect(state => state.foo)

  class Foo extends React.PureComponent {

  ....

  }

  但是decorators語法居然不被vite支持,關于這個問題,也有一個issus:https://github.com/vitejs/vite/issues/2349 ,目前沒有一個好的解決辦法,只好去掉decorators,改用常規的函數綁定了。

  2.antd Unknown theme type: undefined, name: undefined

  我們項目目前還是使用的antd的3.x版本,在啟動時就出現了這個錯誤,其實主要是antd組件初始化的時候,加載了antd/es/icon/index.js文件:

  import * as allIcons from '@ant-design/icons/lib/dist';

  ......

  ReactIcon.add.apply(ReactIcon, _toConsumableArray(Object.keys(allIcons).map(function (key) {

  return allIcons[key];

  })));

  ......

  '@ant-design/icons/lib/dist'導出的對象是{ default: {...} },要正確訪問的形式是allIcons.default,而不是allIcons,因此導致獲取不到icon的正確導出對象,關于這個問題,大家可以看下這個issue:https://github.com/ant-design/ant-design/issues/19002 ,這里要說明的一點是antd4.x版本不會出現,但是對于我們的項目來講,目前還不會升級到4這個大版本,那么怎么解決呢,其實只要引用antd/lib下的組件,就沒有這個問題了,我們可以看下antd/lib/icon/index.js:

  ......

  var allIcons = _interopRequireWildcard(require("@ant-design/icons/lib/dist"));

  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

  ......

  這里_interopRequireWildcard方法幫我們處理了導出的問題,那么修改一下babel-plugin-import的配置不就好了么,好吧,沒有那么容易的,vite對babel-plugin-import支持不那么好,首先還是去vite的issues里面找找看,有一個類似的提問:https://github.com/vitejs/vite/issues/1389 ,看了下,并沒有解決我的問題,里面提到的幾個插件倒是給我了思路,那就自己寫個vite插件去實現我們的需求唄。插件的思路很簡單,就是將antd組件的引入方式進行統一的修改:

  ---修改前---

  import { Button } from 'antd';

  ---修改后---

  import Button from 'antd/lib/button';

  import 'antd/lib/button/style/index.css';鄭州治療男科病醫院http://www.zztjnk.com/

  這里需要說明的是css樣式的引入,如果引入style/index或者style/css,會出現require is not defined的問題,因為這兩個js文件中使用了require,但是vite在預編譯時不是node環境,當然就報錯了。

  關于這個插件的使用,可以參考https://www.npmjs.com/package/antd-vite-import-plugin 。

  3.'default' is not exported  鄭州同濟醫院http://www.xasgnk.com/

  有時候三方依賴項加載會出錯,例如'default' is not exported等,這里可以參考https://github.com/vitejs/vite/issues/2679

  在實際開發過程中,還是難免遇到一些奇怪的問題,這都是嘗鮮的代價。

  速度之爭

  vite的一個優勢就是快,那么和webpack相比,到底有多大的差距呢,這里我們用webpack和vite分別啟動同一個本地項目:

  構建工具啟動時間(ms)  鄭州同濟醫院http://www.zzfkyy120.com/

  vite702ms

  webpack7093ms

  這里只是一個粗略的對比,從數據上看有十倍之差,單從速度上講,vite是很快了,根據官網的解釋,Vite 將會使用 esbuild 預構建依賴。Esbuild 使用 Go 編寫,并且比以 JavaScript 編寫的打包器預構建依賴快 10-100 倍。

  最后

  經歷過一番折騰后,覺得vite2的成熟度有所欠缺,在一些小項目中可以試試。對我而言還是決定先用webpack吧,畢竟webpack經過這么多年的發展,坑很少,而目前vite對于react來說還是不那么完美。

“如何解決antd+react項目遷移vite的問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女