antd+reactプロジェクトをviteに移行するためのソリューションの詳細な説明

antd+reactプロジェクトをviteに移行するためのソリューションの詳細な説明

Antd+react+webpackは、多くの場合、Reactテクノロジースタックに基づくフロントエンドプロジェクトの標準的な組み合わせです。3つとも成熟したエコシステムと安定したパフォーマンスを備えています。ただし、フロントエンドテクノロジーの継続的な革新と、いわゆる次世代ビルドプラットフォームであるvite2のリリースにより、webpackはあまり人気がないようです。なぜそう言うのでしょうか?それは、viteが速すぎるからです。しばらく実験した後、プロジェクトで webpack を vite に置き換えることにしたので、この記事を書いて皆さんと共有することにしました。

Viteとは

この記事の主人公として、まずはビルドツール Vite について簡単に紹介したいと思います。このツールは、You Yuxi がリリースした [次世代フロントエンド開発およびビルドツール] です。Vite は実は新しいツールではありません。1 年以上前にはすでに多くのバージョンがリリースされています。バージョン 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 ははるかにシンプルで、静的リソースの処理など多くの機能が組み込まれており、関数のアクティブ化も次のように比較的簡単です。

'vite' から {defineConfig} をインポートします。
'vite-plugin-html' から vitePluginHtml をインポートします。
'@vitejs/plugin-react-refresh' から reactRefresh をインポートします。

デフォルトのdefineConfigをエクスポートする({
    css: {
        プリプロセッサオプション: {
            少ない: {
                javascriptが有効: true、
            },
        }
    },
    パブリックディレクトリ: './src/configs',
    プラグイン: [
        反応リフレッシュ()、
        antdViteImportPlugin()、
        vitePluginHtml({
            縮小: true、
            注入: {
                挿入データ: {
                    タイトル: 'vite-react-example',
                    injectScript: '<script src="/configs.js"></script>', // ルートディレクトリとしてpublicDir},
                挿入オプション: {
                    ファイル名: './index.html', // テンプレートページ}
            },
        })、
    ]、
    サーバー: {
        オープン: 真、
        ポート: 10010、
    }
});

ここでは、html-webpack-plugin の代わりに vite-plugin-html プラグインを使用します。injectData および injectOptions オプションに注意してください。injectData を使用すると、テンプレート ページにカスタム データを簡単に挿入でき、injectOptions を使用すると、テンプレート ページを指定できます。その他の設定項目については、https://www.npmjs.com/package/vite-plugin-html を参照してください。 index.html ページをそれに応じて変更する必要があります。

<!DOCTYPE html>
<ヘッド>
    <メタ文字セット="utf-8">
    <タイトル><%- タイトル %></タイトル>
    ......
</head>
<本文>
    <div id="アプリ"></div>
    <スクリプト>
        var global = globalThis || window; // 起動エラーを防ぐ</script>
    <%- スクリプトを挿入 %>
    <script type="module" src="/src/index.jsx"></script>
</本文>
</html>

webpack との違いは、ここではエントリ ファイルを手動で指定する必要があり、スクリプト タグ タイプがモジュールであることです。

4. ファイルの拡張子を変更する

ここで紹介するファイルは、js をサフィックスとする react コンポーネントです。webpack 構築プラットフォームでは、js(x) や ts(x) で問題ありませんが、vite を使用する場合は、ts、jsx、tsx のサフィックスを持つファイルを使用することをお勧めします。この問題については、こちらの問題を参照してください: https://github.com/vitejs/vite/issues/1552。最後に、サフィックスを一括で変更するのは非常に難しいと作者が不満を述べています。忘れて、変更してください。手動で変更するのが面倒であれば、スクリプトを書くのは難しくありません。

5. 起動スクリプトを追加する

「スクリプト」: {
 "dev": "vite",
 "ビルド": "vite ビルド",
 ......
}

これで終わりのはずですが、物事は順調に進んでいません。プロジェクトは実行すらできません。まあ、順調に進むものはありません。次に、遭遇した問題を見てみましょう。

発生した問題

1. デコレータはサポートされていません

ビジネス コードでは、次のように dva によって提供される接続を使用してステータスをバインドします。

@connect(状態 => state.foo)
クラス Foo は React.PureComponent を拡張します {
 ....
}

ただし、デコレータ構文は V​​ite ではサポートされていません。この問題については、https://github.com/vitejs/vite/issues/2349 に問題があります。現時点では適切な解決策がないため、デコレータを削除し、代わりに通常の関数バインディングを使用する必要があります。

2.antd 不明なテーマ タイプ: 未定義、名前: 未定義

私たちのプロジェクトは現在、antd のバージョン 3.x を使用しています。このエラーは起動時に発生しました。実際、これは主に、antd コンポーネントが初期化されるときに antd/es/icon/index.js ファイルが読み込まれることが原因です。

'@ant-design/icons/lib/dist' から allIcons として * をインポートします。
......
ReactIcon.add.apply(ReactIcon、_toConsumableArray(Object.keys(allIcons).map(function (key) {
  allIcons[キー]を返します。
})));
......

'@ant-design/icons/lib/dist' によってエクスポートされたオブジェクトは { default: {...} } です。正しいアクセス形式は allIcons.default であり、allIcons ではありません。その結果、アイコンの正しいエクスポート オブジェクトを取得できません。この問題については、この問題を参照してください: 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){obj&amp;&amp; obj .__ esmodule){obj === null || _typeof(obj)!キャッシュ() all(obj、key){var desc = haspropertydescriptor(obj、key):null; 「デフォルト」= obj;
......

ここで、_interopRequireWildcard メソッドはエクスポートの問題に対処するのに役立ちますので、babel-plugin-import の設定を変更したほうがよいのではないでしょうか。まあ、それはそれほど簡単ではありません。Vite は babel-plugin-import をあまりサポートしていません。まず、Vite の問題を探します。同様の質問があります: https://github.com/vitejs/vite/issues/1389。私はそれを見て、それでは私の問題は解決されないことがわかりました。そこに言及されているいくつかのプラグインから、いくつかのアイデアが得られました。私たちのニーズを満たす Vite プラグインを作成します。プラグインのアイデアは非常にシンプルで、antd コンポーネントの導入方法を均一に変更することです。

---修正前---
'antd' から Button をインポートします。
---修正後---
'antd/lib/button' から Button をインポートします。
'antd/lib/button/style/index.css' をインポートします。

ここで説明する必要があるのは、CSS スタイルの導入です。style/index または style/css が導入されると、require が定義されていないという問題が発生します。これは、これら 2 つの js ファイルでは require が使用されているものの、vite はプリコンパイル時に node 環境ではないため、当然エラーが報告されるからです。
このプラグインの使用方法については、 https://www.npmjs.com/package/antd-vite-import-plugin を参照してください。

3.「デフォルト」はエクスポートされません

サードパーティの依存関係をロードするときに、「default」がエクスポートされないなどのエラーが発生する場合があります。 https://github.com/vitejs/vite/issues/2679 を参照してください。

実際の開発プロセスでは、奇妙な問題に遭遇することは避けられません。これは、新しいことに挑戦する代償です。

スピードレース

vite の利点の 1 つは、高速であることです。では、webpack と比較するとどれくらいの差があるのでしょうか? ここでは、それぞれ webpack と vite を使用して同じローカル プロジェクトを開始します。

ビルドツール起動時間(ミリ秒)
ヴィテ702ミリ秒
ウェブパック7093ミリ秒

これはあくまでも大まかな比較です。データからすると10倍の差があります。速度だけで言えば、Viteは非常に高速です。公式サイトの説明によると、Viteは依存関係を事前にビルドするためにesbuildを使用するとのこと。 Esbuild は Go で記述されており、JavaScript で記述されたバンドラーよりも 10 ~ 100 倍高速に依存関係を構築できます。

やっと

いくつかトラブルがあった後、vite2 はまだ成熟度が足りないと感じ、いくつかの小さなプロジェクトで試してみることにしました。私の場合、まずは webpack を使うことにしました。結局のところ、webpack は長年にわたって開発され、落とし穴もほとんどありませんが、vite はまだ react に最適ではありません。

antd+react プロジェクトを vite に移行するソリューションに関するこの記事はこれで終わりです。antd react を vite に移行することに関する関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ReactプロジェクトにSCSSを導入する方法
  • ReactでAngularコンポーネントを導入する方法
  • ReactはコンテナコンポーネントとディスプレイコンポーネントをVueに導入します
  • React の国際化 react-intl の使用
  • React 合成イベントの説明
  • ReactのPropsの簡単な比較
  • Reactイベントスロットリング効果が失敗する理由と解決策
  • Amap を使用した React 実装例 (react-amap)
  • Reactの簡単な紹介

<<:  SQL と MySQL のステートメント実行順序の分析

>>:  Linux で利用可能なネットワーク インターフェイスを表示する方法

推薦する

MySQLでカーソルトリガーを使用する方法

カーソル選択クエリによって返される行のセットは、結果セットと呼ばれます。結果セット内の行は、入力した...

CentOS 6-7 PHPのyumインストール方法(推奨)

1. 現在インストールされているPHPパッケージを確認するyum list installed |...

WeChatアプレット+mqtt、esp8266温度と湿度の読み取り実装方法

まず、 esp8266 は mqtt を通じてメッセージを公開し、WeChat アプレットは mqt...

Vue プロジェクトを使用して複数のプロキシを構成する際の注意事項

Vue プロジェクトの開発プロセスでは、ローカル デバッグの利便性のため、通常、vue.config...

MySQLインデックスに関する重要な面接の質問をいくつか共有します

序文インデックスは、データベース内の 1 つ以上の列の値を並べ替え、データベースが効率的にデータを取...

MySQLデータベーストリガーの詳細な説明

目次1 はじめに2 トリガーの紹介3 トリガーを作成する4 トリガーを表示5. トリガーの削除6 結...

Dockerイメージ内のファイルを表示する方法

Dockerイメージ内のファイルを表示する方法1. すでに実行中の場合すでに実行中のイメージについて...

MySQL データベースのバックアップをスケジュールするいくつかの方法 (包括的)

目次1. データをバックアップするためのmysqldumpコマンド2. 一般的なmysqldump操...

Nginx は rtmp ライブ サーバーの実装コードを構築します

1. nginxソースディレクトリに新しいrtmpディレクトリを作成し、git clone http...

フロントエンド JavaScript ハウスキーパー package.json

目次1. 必須属性1. 名前2. バージョン2. 説明情報1. 説明2. キーワード3. 著者4. ...

CSS3セレクターの新機能の実装

目次基本的なセレクタ拡張属性セレクタ疑似クラスと疑似要素セレクター基本的なセレクタ拡張1. 子要素セ...

CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する複数の方法

CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する 7 つの方法。コー...

MySQLでよく使われる演算子と関数の概要

まずデータ テーブルを作成しましょう。 使用テスト; テーブル「従業員」を作成します( emp_no...

MySQL データベース面接に必須の 3 つのログの紹介

目次1. redo ログ (MySQL ストレージ エンジン InnoDB のトランザクション ログ...

Dockerコンテナの自動終了を停止する方法の詳細な説明

この記事では、Docker コンテナとフロントエンド プロセスの関係と、コンテナを永続的に実行できる...