React Update Notes Companion

Linda Hamilton
リリース: 2025-01-12 16:39:44
オリジナル
935 人が閲覧しました

React Update Notes Companion

React の新しいメジャー バージョンの更新ノートは常に信じられないほど情報が密集しており、フレームワーク自体が非常に幅広いため、私は常にメモを取ったり、リファレンス ドキュメントと比較したりして、何が変更され、どのように使用されるかだけでなく、アップデートノートで説明されているさまざまな主要な概念が実際に内部でどのように機能するかを理解します。 React は非常に詳しく文書化されていますが、更新ノートは概念を理解するのに常に「十分」であるとは限りません。たとえば、React 19 の更新ノートでは、useOptimistic の例がわかりにくく、実際にフックがどのように機能するかについては実際に少し不正確であることがわかりました。

私は、React 19 の変更点を検討する際に取ったメモを、メモを調べてその意味を理解するのを恐れている人たちのお供として書くことにしました。それでは、始めましょう。

アクションとフォーム処理/useActionState

最初の大きな改善は、フォーム処理の大幅な改善です。 React はボイラープレートを削除し、ネイティブ HTML フォームとより適切に統合する方向に徐々に移行しており、その新しい useActionState はこの推進の一部です。これはエラー処理を改善することを目的としており (現在組み込まれているため)、読み込み状態を自動的に追跡するため、常に保留状態で手動でコーディングする必要がなく、プログレッシブ エンハンスメントのサポートが向上します。

useActionState に提供されているコード例は非常にわかりにくいことがわかりました。実際、このコード例がこの記事を書き始めたすべての理由です。実際には、useActionState には 2 つの部分があり、それらは 2 つの部分で結合されています。スペースを節約するための例ですが、最終的には鮮明さが大幅に低下します。 useActionState は、フォーム送信の非同期アクションがいつ完了したかを追跡するタプルを返しますが、渡したアクションの修正バージョンはフォームに直接渡されます。 useActionState 自体は、非同期 formAction (呼び出されたときに前の状態とフォーム データの両方を引数として受け取ります) と初期状態の 2 つの入力を受け取ります。初期状態は null、ゼロ、または変数にすることができます。

フォームがまだ送信されていない場合、以前の状態が初期状態になります。フォームが以前に送信されている場合は、送信された内容がそのまま反映されます。サーバー関数では、ハイドレーションが発生する前にサーバーの応答を実際に表示できます。最後に useActionState は、フォームが変更することを目的とした一意のページ URL を含む文字列を受け入れることができます。 つまり、オプションのパーマリンク パラメータも受け入れることができます。これは、プログレッシブ エンハンスメントに特に役立ちます。これは、JavaScript が読み込まれる前にユーザーがフォームを送信した場合にブラウザに移動先を指示します。

最後に、useActionState が返すタプルは、現在の状態 (最初のレンダリング中は初期状態の値です)、アクションとしてフォームに渡すことができる、またはプロップとしてボタンに渡すことができる反応修正された formAction で構成される配列です。 isPending フラグ/ステートフル変数。これは特に便利そうなので、React チームが他にどのような新しい開発を思いつくか楽しみにしています。

React-DOM の更新

<フォーム>アクション

この React-dom の追加は、NextJS とフォーム アクションを使用している人なら誰でもよく知っているでしょう。Reac チームはフォーム アクションがプライムタイムに対応できると判断したようです。 NextJS や React 上の別のフレームワークでこれらを使用したことがない人にとって、これらは基本的に、ネイティブ フォーム送信を使用して React のパフォーマンスを向上させる方法です。 onClick の代わりに、アクション プロパティを介してネイティブ フォームの送信を渡すことができます。アクションまたは formAction に渡される関数は、その送信が自動的に処理されます。 React は、制御されていないフォーム フィールドも自動的にリセットします。 API 経由でリセットする手動オプションもあります。 React チームは、エラー境界を使用したエラー処理も統合しました。 ほとんどの人が NextJS で覚えていると思うので、これについてはあまり話しませんが、質問がある場合はフォローアップを書きます。

useFormStatus フック

これは、プロップドリルやコンテキストを使用せずに、フォーム内で何が起こっているかを確認するのに役立つ優れた追加機能です。なぜプロップドリルしないのかと言うと、コードを保守しやすく、変更しやすくするためです。 コンテキストに関しては、コンテキスト内の何かが変更されるたびに、特定のコンテキストにサブスクライブされているすべてのコンポーネントが再レンダリングされるため、コンテキストを過度に使用するとパフォーマンスの問題が発生します。 したがって、コードが整理され、エラーの可能性が減り、アプリのパフォーマンスをごまかしてしまうことがなくなります。

フックは 4 つのプロパティを持つオブジェクトを返します: pending - 保留中の送信があるかどうかを示すブール値、 data - 親フォームによって送信されたデータを含む formData オブジェクト (アクティブな送信または親フォームがない場合、これは null です) )、メソッド (get または post)、およびアクション - アクション プロパティを介して渡されるアクションです。

useOptimistic フック

楽観的な更新を管理するための新しい簡単な方法。 オプティミスティック更新に慣れていない方のために説明すると、これは、サーバー側の更新が行われる前にクライアント側の表示を更新することを意味します。 何かを気に入ったことがあり、アニメーションの再生を見て、それを画面にお気に入りとして登録した後、「いいねは失敗しました」というトースト エラーが表示された場合、これは楽観的なレンダリングが原因です。

useOptimistic フックは、オプティミスティックにレンダリングしたいステートフル変数と、純粋な関数、つまり副作用のない決定論的な関数である必要がある更新関数を受け入れます。基本的に、update 関数は状態への更新のソースを取得します。したがって、通常は formData.get(‘name’) のようなものになります。 useOptimistic は、オプティミスティック状態と addOptimistic 関数の 2 つの値を返します。

このドキュメントは、特に使用フローに関して少し弱いと思いました。基本的には、useOptimistic を呼び出し、オプティミスティックな更新を表示する初期状態と更新関数を渡します。新しくオプティミスティックに強化されたステートフル値 (optimisticState) とオプティミスティックに状態を変更する関数の 2 つの関数を受け取ります。ユーザーによって送信された新しい値がある場合、ドキュメントでは addOptimistic と呼ばれる 2 番目の関数を呼び出し、ユーザーが送信した値を渡します。ステートフル変数をオプティミスティックにレンダリングしたい場合は、コンポーネント内でオプティミスティック拡張ステートフル値を渡します。

全体的に、私はオプティミスティックな更新を実行するこのより標準化された方法がとても気に入っています。私は以前、NextJS でのキャッシュとオプティミスティックな更新の作成に問題を抱えていたので、オプティミスティックな更新を作成する標準化された方法は素晴らしいです。そして、これはきっと役に立つでしょう。 NextJS をバブルアップしていない場合は、バブルアップします。

使用 API

これは非常に高密度な API であり、React がページをレンダリングしている間にリソースにアクセスするまったく新しい方法です。使用されている正確な表現は「レンダリングでリソースを読み取る」です。では、具体的には何のためにあるのでしょうか? この新しい API を使用すると、条件文またはループ内のコンポーネント情報にアクセスできます。 これがなぜ便利なのかよく分からない方のために説明すると、これは React のレンダリング プロセスがどのように機能するかに関係しています。 React/react-fiber は、毎回すべてを同じ順序でレンダリングすることに依存しているため、通常、レンダリング プロセス中にほとんどのフックにアクセスできません。 より明確に言うと、状態は実際にはフックが呼び出される順序に基づいて追跡されるため、フックが予測できない順序で呼び出される場合、レンダリングのバグが発生します。良い例は、ユーザーがログインしているかどうかに応じてテーマ コンテキストにアクセスすることです。

それでは、なぜこれが重要な進展なのでしょうか? これは、実際に必要な場合にのみ情報/データをロードできることを意味します。ユーザーが実際にログインしている場合にのみ、特別なテーマの CSS がロードされます。データはシリアル化可能である必要があるため、プロミスが実際に実行されている間に、サーバー コンポーネントからクライアント コンポーネントに Promise を送信できることになります。これは、ウォーターフォール リクエストが少なくなり、自動的に並列化されることを意味します。 サーバー コンポーネントで作業する場合、実際には、データのフェッチに使用するよりも async/await を使用することを優先する必要があることに注意してください。これは、async/await は中断したところから正確にレンダリングを再開するのに対し、使用すると完全な再レンダリングがトリガーされるためです。データ解決後のコンポーネント。もちろん、この変更は、実際には、使用の設定を誤った場合に、ウォーターフォール リクエストの潜在的なソースが新たに存在することを意味することにも注意しておきたいと思います。

注意すべき重要な点の 1 つは、try/catch ブロックで「use」API を使用できないことです。これは、「use」が Promise で呼び出されたときに自動的にリアクション サスペンス境界を使用するためです。 try/catch ブロックにより、React レベルに到達することができなくなります。エラーが発生すると、React に到達する前に実際に JS レベルでの実行が停止し、機能が中断されてしまうためです。 他のフックと同様に、フックは特定のコンポーネントまたは関数のスコープの最上位に存在する必要があります (これもレンダリング順序のため)。

つまり、「使用」の実際の目的は、コンテキストにアクセスして条件付きでレンダリングし、実際に必要な場合にのみデータをフェッチできるようにすることです。これは、react の難解さをもう少し軽減し、条件付きデータの取得を簡素化し、開発エクスペリエンスを向上させ、パフォーマンスを一気に向上させるためのもう 1 つのステップです。経験豊富な React 開発者は、テーマ設定などの方法を再学習する必要がありますが、これにより、新しいユーザーにとってフレームワークがはるかにアクセスしやすくなり、常に素晴らしいことだと思います。

新しい React Dom 静的 API

これら 2 つの新しい静的 API、prerender と prerenderToNodeStream は、どちらもサーバー サイド レンダリング (SSR) に使用される renderToString の改良版です。これらの新しい改善は、renderToString を使用して静的サイト生成 (SSG) を実行するためのものです。 コンテンツ チャンクが利用可能になると送信できる従来のストリーミング SSR とは異なり、これらの新しい API は、最終的な HTML を生成する前にすべてのデータがロードされるのを特に待ちます。これらは、Node.js ストリームや Web ストリームなどの最新のストリーミング環境とシームレスに連携するように設計されていますが、部分コンテンツのストリーミングは意図的にサポートしていません。代わりに、ビルド時に完全で完全に読み込まれたページを確実に取得できるようにします。これらは、データが利用可能になると事前にレンダリングされたサイトを送信する従来のストリーミング SSR 方式とは異なります。

NextJS など、React 上に構築された SSG 対応フレームワークはすでにありましたが、これは SSG 用の React のネイティブ機能であることを目的としています。 SSG を備えたフレームワークは renderToString を使用し、それを中心に独自の複雑なデータ取得調整を構築しました。 これをユーザーが自分で作成するのは非常に困難であり、これらのフレームワークはそのために非常に複雑なパイプラインを使用していました。 これらの新しいメソッドは基本的に、静的 HTML の生成中にデータをロードできるようにします。SSG に詳しくない場合は、基本的にビルド時にすべてをレンダリングし、間違いなくページをレンダリングする最速の方法です。ユーザーのリクエストに応じてページをレンダリングするため、Vercel でのデプロイメントまたは非常に複雑なデプロイメント プロセスが必要な Next のようなものを使いたくない人にとって、この種の機能があるのは素晴らしいことです。

サーバーコンポーネント

React サーバー コンポーネントの概念は、NextJS の最新バージョンを使用したことがある人にとっては目新しいものではありませんが、まだ使用していない人にとっては、サーバー コンポーネントはデータ取得に関する新しいパラダイムです。率直に言って、サーバー コンポーネント (およびサーバー アクション) の概念自体は記事全体を書く価値がありますが、概念を簡単に要約すると、サーバー コンポーネントは、JavaScript がロードされた後でも、クライアントに送信される前に常にサーバー上でレンダリングされます。 つまり、後続のレンダリングはサーバー側で行われます。

これらのコンポーネントの主な利点は、セキュリティとデータの取得です。サーバー コンポーネント内でデータをリクエストした場合、リクエスト情報はクライアント側には表示されず、応答のみが表示されるため、安全性が大幅に高まります。 API、エンドポイントなどはクライアント側からはアクセスできません。また、前述のアクションの JavaScript がクライアントに送信されないため、バンドル サイズも削減されます。さらに、サーバー上でメモリや計算負荷の高い操作を実行して、非強力なマシンでのレンダリングの負担を軽減することもできます。 また、データベースに近いマシンで順次データの取得を実行できるため、クライアント側のウォーターフォールも削減されますが、もちろん、開発者がテスト ブラウザ開発者からの簡単なリクエスト情報にアクセスできなくなるため、まったく新しいサーバー側のウォーターフォールが発生する可能性も広がります。ツールがあり、それらを調べるには OpenTelemetry コレクターやビューアーなどを使用する必要があります。最後に、サーバー コンポーネントは、段階的な機能強化にも最適です。

サーバー コンポーネントには制限のリストもあります。ローカル ブラウザ API (ローカル ストレージ、ウィンドウなど) は使用できません。反応フックの動作は異なります。状態に依存したり使用したりすることはできません。イベント ハンドラーを使用しないため、コンポーネントに対するユーザーの対話性は明らかに希薄です。 基本的に、このパラダイムは、サーバー コンポーネントでのデータの取得、クライアント コンポーネントでの対話機能として考えてください。

サーバー コンポーネントを初めて使用する人にとって最も重要な注意点は、サーバー コンポーネントをクライアント コンポーネントにインポートできないことです。インポートすると、コンパイラーが上記のコンポーネントを処理するため、エラーが発生します (データの取得を追加したと仮定して)。サーバーコンポーネントをクライアントコンポーネントとして使用します。サーバー コンポーネントをクライアント コンポーネントに渡したい場合は、それを {children} プロパティ経由で渡す必要があります。

サーバーアクション

これらは、製品や機能の構築方法に多くの影響を与えるもう 1 つの複雑なトピックであり、これらは 1 年ほど前から NextJS にも存在しています。 サーバーアクションは、ファイルの先頭に「useserver」と入力することで宣言され、クライアントコンポーネントの内部から呼び出すことができるサーバー関数への直接参照を渡します。

これらは、概念的にはリモート プロシージャ コール (RPC) に似ています。どちらもクライアントからサーバー側の関数を呼び出すことができ、クライアントとサーバーのやり取りの複雑さを抽象化し、シリアル化と逆シリアル化を処理しますが、注意すべき重要な違いがいくつかあります。 サーバー アクションの主な利点は、React のプログレッシブ機能強化と連携し、クライアント/サーバーの境界を越えてタイプ セーフティを強制するのに役立ち、パフォーマンスの最適化 (プログレッシブな機能強化に関連する) が組み込まれており、React エコシステムとよりシームレスに統合できることです。つまり、組み込みの保留状態が提供され、ネイティブ フォームの送信と自動的に統合されます。

最新の RPC、つまりタイプ セーフティとパフォーマンスの最適化がすでに備わっている gRPC のようなものについて話している場合、サーバー アクションの主な利点は一般に、組み込みのフォーム処理とプログレッシブ機能強化に集約されますが、重要なのは、それが機能することでもあるということです。反応のサスペンスとエラーの境界があります。最も重要なことは、gRPC 用に別のサーバーをセットアップする必要がないため、デプロイがはるかに簡単であるということです。そのため、小規模なプロジェクトには絶対に理想的ですが、大規模なプロジェクトとなると、gRPC の方がはるかに望ましいことがわかります。バックエンド言語などの点で柔軟性が高まります。

プロバイダとしてのコンテキスト

これは本質的に構文の簡略化であり、React がよりクリーンで宣言的な構文を持つのに役立ちます。 正直に言うと、「気に入った」以外にこれについて言うことはあまりありません。

Prop としての参照と参照のクリーンアップ関数

以前は、ref をクリーンアップするには、コンポーネント内で null チェックを実行する必要があり、ref はある程度不定の時点でクリーンアップされていました。 React は、コンポーネントがアンマウントされると、null を使用して ref コールバックを呼び出すため、アタッチとデタッチの両方のケースを明示的に処理する必要があります。新しい ref 構文の利点は決定論的なクリーンアップです。これは、ref クリーンアップがいつ (アンマウント時) に行われるかを正確に知ることができるため、外部リソースやサードパーティ ライブラリの操作がはるかに簡単になることを意味します。 新しいアプローチでは、クリーンアップ関数を直接返すことができます。 TypeScript の統合では、クリーンアップ関数に関する曖昧さを避けるために、明示的な return ステートメントが必要です。

useEffect と同じパターンなので、この実装方法がとても気に入っています。フレームワーク全体で一貫性を維持するのは素晴らしいことです。この新しい ref クリーンアップは、特に WebGL コンテキストやその他の重いリソースだけでなく、ネイティブ JS メソッドを使用して追加された DOM イベント リスナーの処理にも非常に役立つと思います。 これは、以前は、react がクリーンアップ時に dom 要素への参照を削除していたためです…しかし、それを行った場合、イベント リスナーがアタッチされているコンポーネントへの参照が失われるため、イベント リスナーを削除するのがはるかに複雑になります。 。 その結果、要素の外部に参照を保存する必要があり、複雑さがさらに増しました。これで、コンポーネントの return 関数内の ref へのアクセスが保持されるため、コンポーネントの return 関数内のイベント リスナーを削除するだけで済みます。これは、クリーンアップ関数を使用するときに React が null で ref を呼び出すことがなくなるため、ほとんどの状況で null の場合を心配する必要がなくなったことも意味します。クリーンアップ関数自体がその機能を置き換えることで、コードがよりクリーンになり、予測可能になります。

useDeferredValue

useDeferredValue フックの目的は、応答性の高いユーザー インターフェイスを維持しながら、計算量の多い操作を管理することです。これは、バックグラウンドで新しいデータを計算または取得しているときに、コンポーネントが以前の「古い」値を表示できるようにすることで実現します。一般的な使用例は、ユーザーが入力したときに結果を表示する検索機能です。保留しないと、キーストロークごとにコストのかかる検索操作がトリガーされ、入力が遅く感じる可能性があります。 useDeferredValue を使用すると、新しい検索結果を計算しながら以前の検索結果を表示することで、インターフェイスの応答性を維持できます。

この新しい追加は、このフックの初期読み込み動作に対する重要な改善です。以前は、最初のレンダリングでは useDeferredValue に渡された値がすぐに使用され、開始時に負荷の高い計算がトリガーされる可能性がありました。新しいバージョンでは、より高価な値をバックグラウンドで処理しながら、すぐに表示される軽量の初期値 (空の文字列など) を提供できます。これは、安全なデフォルト値を使用してユーザーに即時にフィードバックを表示し、高価な計算が完了したら実際のデータで更新できることを意味します。基本的に、これにより useDeferredValue のパフォーマンス向上がさらに向上します。

ドキュメントのメタデータの追加

これらの新しい変更は、実際のコンポーネント内にさまざまなメタデータ タグを追加するためのものです。対象となるオプションは、、<meta> の 3 つです。 <title> に注意することが重要です。重複排除はありません。リポジトリごとに 1 回のみ使用することを目的としています。他の 2 つは、<link> <meta> には、重複排除に関してかなり複雑な相互作用があり、学習した後では、90% のユーザーには特に関係ないと思います。 </p> <p>これらの変更による主な利点は、コンポーネントが完全に自己完結型になることです。コンポーネントは、スタイルやスクリプトとともに独自のメタデータを管理できるようになりました。メタデータを最上位レベルに引き上げる方法を考えたり、そのためにライブラリを使用したりする必要がなくなり、SEO がはるかに簡単になります。 SPA 内のさまざまなページに、より簡単に異なるメタデータを持たせることができます。これまでは、ページごとに異なるメタデータを持つ場合にリスクであった、メタデータがページに表示されるコンテンツと同期しなくなるリスクを回避できます。</p> <p><strong>スタイルシートのサポート</strong></p> <p>人々は忘れるほど長い間 tailwind を使用してきたかもしれませんが、カプセル化されていない CSS を実行すると、スタイルシートの読み込み方法、つまり読み込み順序の優先ルールに起因して問題が発生する可能性があります。まず、スタイルのないコンテンツがフラッシュして表示される可能性があります。CSS のダウンロードが完了する前に HTML が読み込まれてレンダリングされるときは常に、完全に白いページとして表示されます。通常は、巨大なフォント サイズとネイティブ画像サイズを備えた 1 列で表示されます。判読できなくなります。</p> <p>さらに、CSS のロード順序ルールによって別の問題が発生する可能性があります。たとえば、同じ詳細度を持つルールがあり、それらが特定の順序でロードされることが期待されている場合などです。これは、たとえば、テーマにさまざまなオプションがある場合 (ダーク モードなど) に関係します。ダーク モード CSS が最後に読み込まれるように意図されているが、ダーク モード用の CSS ファイルが最初に読み込まれる場合、ダーク モードが明るくなったり、ルールが遵守されているアプリの一部の部分とそうでない部分が発生したりする可能性があります。遵守しました。 </p> <p>JS の CSS のように、すべての CSS を <head> にロードするなど、これを回避するための解決策はたくさんありました。ただし、これらの新しい CSS の変更は、宣言的に優先順位を設定することで、これらの問題の管理を支援することを目的としています。また、コンポーネント内に配置されたスタイルシートは、コンポーネント自体がレンダリングされる前に確実に読み込まれるようになります。 また、重複排除機能も組み込まれているため、スタイルシート リンクが含まれるコンポーネントを再利用するときに、同じスタイルシートを何度も読み込む必要がなくなります。 </p> <p>この新しい機能にアクセスする方法 (コンポーネントをレンダリングする前に CSS がロードされるのを待つ、CSS を自動的に head に巻き上げるなど) も非常に簡単です。特定の <link> に優先順位を含めるだけです。 ;成分。 全体として、私は typescript の愛好家なので、私にとって特定の問題を正確に解決するものではありませんが、これは大規模なレガシー プロジェクトにとって非常に役立つものになると確信しています。 </p> <p><strong>非同期スクリプトのサポート</strong></p> <p>これは、人々が心配するような新しいコア機能を作成するのではなく、特殊なケースに対処します。<script> を使用してスクリプトを手動で追加/直接管理します。私の経験では、最新の React ではタグはかなりまれです。 ほとんどの開発者は、webpack や vite などのバンドラー、パッケージ マネージャー、インポート ステートメントを使用しており、スクリプトを動的にロードする必要がある場合は useEffect などを使用します。 ただし、これは SSR と、</p> 内のコンテンツのロード順序に関する前述の問題を回避するための UX の向上に関連します。 <p>スクリプトは非同期でロードできるため、適切なスタイルなしで反応アプリがロードされる可能性が大幅に低くなります。 この変更は、直接スクリプト タグを必要とするレガシー システムを管理する開発者や、バンドルできないサードパーティ スクリプト (分析、ウィジェットなど) の管理、または特に重いスクリプト (ビデオなど) の防止を担当する開発者にも関係します。 player) をロードする前にパフォーマンスを向上させる必要がありますが、私にはそれらの経験がないため、それ以上のことは実際にはコメントできません。 </p> <p><strong>リソースのプリロードのサポート</strong></p> <p>リソースの事前読み込みを管理するための新しい API は、特に、さまざまなソースからの大量のサードパーティ リソースに依存する、コンテンツの多いアプリなど、さまざまなネットワーク条件を持つ世界中の視聴者にシームレスな読み込みエクスペリエンスを確保する必要がある大企業にとって、非常に興味深いものです。そして、知覚されたパフォーマンスがユーザー維持にとって重要であるアプリの場合 (正直に言うと、それがほぼすべてです) </p> <p>しかし、react の上にあるほとんどのフレームワーク (Next、Remix など) はすでにこれに対処している傾向があります。これらの新しい API が上記のフレームワークとどのように対話するかはよくわかりませんが、どうやらこれは競合の新たな原因となるため、これらのフレームワークを使用し、新しい API を使用してパフォーマンスを最適化しようとするときに留意する重要なことです。 </p> <p>プリロードは間違いなく最も幅広い使用例 (スタイルシートのロードなど) を持つ API ですが、上記の問題のおかげで、最も関連性があると私が思うのは preinit です。これはすぐに開始されるハードロードであり、熱心にロードすることを目的としています。スクリプト。 私が思いつく最も明白な用途は、ショッピング カートのレビューですぐにストライプを読み込むようなものです。これにより、チェックアウト プロセスが大幅に高速化されます。これは、パフォーマンスの問題によって顧客を失いたくない電子商取引のステップです。 。 </p> <p><strong>サードパーティスクリプトの互換性</strong></p> <p>ブラウザ アドオンがますます一般的になっていることを考えると、これは非常に歓迎すべき変更です。おそらくこの変更から恩恵を受ける DOM 構造を変更する例としては、広告ブロッカー、価格比較ツール、文法/AI アシスタント アドオン、翻訳拡張機能などがあります。 。これについては、現在ハイドレーションがどのように機能するかを実際に読まない限りこれ以上言うことはありませんが、主な変更点はコンパイラーが予期しないタグをスキップすることのようです。 </p> <p><strong>エラー報告の改善</strong></p> <p>このセクションは非常にわかりやすいと思います。 エラー処理の変更は常に歓迎されます。以前はエラー スパムが存在していたため、特定のエラーを追跡するのが少し困難でした。これは、大量のエラーが発生する傾向にある、メンテナンスが不十分なサードパーティ ソリューションを使用している場合に特に関係します。<br> カスタム要素のサポート</p> <p>これまでカスタム要素について聞いたことがなかったので、このセクションは特に興味深かったです。 要約すると、カスタム要素は開発者が独自の HTML 要素を作成できるようにする新しい Web 標準です。 上記の Web 標準に準拠しているため、どのページでも機能し、フレームワークに依存しないように設計されています。たとえば、すべての個人プロジェクトでよく使用するコンポーネントを作成し、それを洗練されたものとして作成し、それを小規模なプロジェクトに使用することができます。スタートアップ向けの契約作業や、vue などの短期契約 </p> <p>React は、認識されないプロパティを実際のプロパティではなく属性として扱っていました。新しいアップデートでは、カスタム要素を作成するためにプロパティを適切に使用できるシステムが追加されました。この変更により、React でのカスタム要素の使用が完全にサポートされるようになりました。 余談ですが、props の問題に加えて、以前は React の合成イベント システムとの非互換性もありました (現在は解決済み)。カスタム要素はシステムと完全に統合できなかったため、実際には手動で統合する必要がある場合がありました。他の回避策の中でも特に、ref を使用してイベント リスナーを追加します。 </p> <p>以上がReact Update Notes Companionの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。</p> </div> </div> <div style="height: 25px;"> <div style="display: inline-flex;float: right; color:#333333;">ソース:dev.to</div> </div> <div class="wzconOtherwz"> <a href="https://www.php.cn/ja/faq/1796752021.html" title="React と Transformers.js を使用して AI を活用した背景除去ツールを構築する"> <span>前の記事:React と Transformers.js を使用して AI を活用した背景除去ツールを構築する</span> </a> <a href="https://www.php.cn/ja/faq/1796752027.html" title="JavaScriptホイスティング"> <span>次の記事:JavaScriptホイスティング</span> </a> </div> <div class="wzconShengming"> <div class="bzsmdiv">このウェブサイトの声明</div> <div>この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。</div> </div> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="2507867629"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div class="wzconZzwz"> <div class="wzconZzwztitle">著者別の最新記事</div> <ul> </ul> </div> <div class="wzconZzwz"> <div class="wzconZzwztitle">最新の問題</div> <div class="wdsyContent"> <div class="wdsyConDiv flexRow wdsyConDiv1"> <div class="wdcdContent flexColumn"> <a href="https://www.php.cn/ja/wenda/176411.html" target="_blank" title="function_exists() はカスタム関数を決定できません" class="wdcdcTitle">function_exists() はカスタム関数を決定できません</a> <a href="https://www.php.cn/ja/wenda/176411.html" class="wdcdcCons">Function test () {return true;} if (function_exists ('test')) {echo "テストは関数です";</a> <div class="wdcdcInfo flexRow"> <div class="wdcdcileft"> <span class="wdcdciSpan"> から 2024-04-29 11:01:01</span> </div> <div class="wdcdciright flexRow"> <div class="wdcdcirdz flexRow ira"> <b class="wdcdcirdzi"></b>0 </div> <div class="wdcdcirpl flexRow ira"><b class="wdcdcirpli"></b>3</div> <div class="wdcdcirwatch flexRow ira"><b class="wdcdcirwatchi"></b>2584</div> </div> </div> </div> </div> <div class="wdsyConLine wdsyConLine2"></div> <div class="wdsyConDiv flexRow wdsyConDiv1"> <div class="wdcdContent flexColumn"> <a href="https://www.php.cn/ja/wenda/176410.html" target="_blank" title="Google Chromeのモバイル版を表示する方法" class="wdcdcTitle">Google Chromeのモバイル版を表示する方法</a> <a href="https://www.php.cn/ja/wenda/176410.html" class="wdcdcCons">こんにちは、先生、Google Chrome をモバイル版に変更するにはどうすればよいですか?</a> <div class="wdcdcInfo flexRow"> <div class="wdcdcileft"> <span class="wdcdciSpan"> から 2024-04-23 00:22:19</span> </div> <div class="wdcdciright flexRow"> <div class="wdcdcirdz flexRow ira"> <b class="wdcdcirdzi"></b>0 </div> <div class="wdcdcirpl flexRow ira"><b class="wdcdcirpli"></b>11</div> <div class="wdcdcirwatch flexRow ira"><b class="wdcdcirwatchi"></b>2720</div> </div> </div> </div> </div> <div class="wdsyConLine wdsyConLine2"></div> <div class="wdsyConDiv flexRow wdsyConDiv1"> <div class="wdcdContent flexColumn"> <a href="https://www.php.cn/ja/wenda/176407.html" target="_blank" title="子ウィンドウは親ウィンドウを操作しますが、出力は応答しません。" class="wdcdcTitle">子ウィンドウは親ウィンドウを操作しますが、出力は応答しません。</a> <a href="https://www.php.cn/ja/wenda/176407.html" class="wdcdcCons">最初の 2 つの文は実行可能ですが、最後の文は実装できません。</a> <div class="wdcdcInfo flexRow"> <div class="wdcdcileft"> <span class="wdcdciSpan"> から 2024-04-19 15:37:47</span> </div> <div class="wdcdciright flexRow"> <div class="wdcdcirdz flexRow ira"> <b class="wdcdcirdzi"></b>0 </div> <div class="wdcdcirpl flexRow ira"><b class="wdcdcirpli"></b>1</div> <div class="wdcdcirwatch flexRow ira"><b class="wdcdcirwatchi"></b>2307</div> </div> </div> </div> </div> <div class="wdsyConLine wdsyConLine2"></div> <div class="wdsyConDiv flexRow wdsyConDiv1"> <div class="wdcdContent flexColumn"> <a href="https://www.php.cn/ja/wenda/176406.html" target="_blank" title="親ウィンドウには出力がありません" class="wdcdcTitle">親ウィンドウには出力がありません</a> <a href="https://www.php.cn/ja/wenda/176406.html" class="wdcdcCons">document.onclick = function(){ window.opener.document.write('私は子ウィンドウの出力です');</a> <div class="wdcdcInfo flexRow"> <div class="wdcdcileft"> <span class="wdcdciSpan"> から 2024-04-18 23:52:34</span> </div> <div class="wdcdciright flexRow"> <div class="wdcdcirdz flexRow ira"> <b class="wdcdcirdzi"></b>0 </div> <div class="wdcdcirpl flexRow ira"><b class="wdcdcirpli"></b>1</div> <div class="wdcdcirwatch flexRow ira"><b class="wdcdcirwatchi"></b>2166</div> </div> </div> </div> </div> <div class="wdsyConLine wdsyConLine2"></div> <div class="wdsyConDiv flexRow wdsyConDiv1"> <div class="wdcdContent flexColumn"> <a href="https://www.php.cn/ja/wenda/176405.html" target="_blank" title="CSS マインド マッピングに関するコースウェアはどこにありますか?" class="wdcdcTitle">CSS マインド マッピングに関するコースウェアはどこにありますか?</a> <a href="https://www.php.cn/ja/wenda/176405.html" class="wdcdcCons">コースウェア</a> <div class="wdcdcInfo flexRow"> <div class="wdcdcileft"> <span class="wdcdciSpan"> から 2024-04-16 10:10:18</span> </div> <div class="wdcdciright flexRow"> <div class="wdcdcirdz flexRow ira"> <b class="wdcdcirdzi"></b>0 </div> <div class="wdcdcirpl flexRow ira"><b class="wdcdcirpli"></b>0</div> <div class="wdcdcirwatch flexRow ira"><b class="wdcdcirwatchi"></b>2272</div> </div> </div> </div> </div> <div class="wdsyConLine wdsyConLine2"></div> </div> </div> <div class="wzconZt" > <div class="wzczt-title"> <div>関連トピック</div> <a href="https://www.php.cn/ja/faq/zt" target="_blank">詳細> </a> </div> <div class="wzcttlist"> <ul> <li class="ul-li"> <a target="_blank" href="https://www.php.cn/ja/faq/mysqldatediff"><img src="https://img.php.cn/upload/subject/202407/22/2024072213465556960.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="MySQLのdatediff関数の使用法" /> </a> <a target="_blank" href="https://www.php.cn/ja/faq/mysqldatediff" class="title-a-spanl" title="MySQLのdatediff関数の使用法"><span>MySQLのdatediff関数の使用法</span> </a> </li> <li class="ul-li"> <a target="_blank" href="https://www.php.cn/ja/faq/gitcommit"><img src="https://img.php.cn/upload/subject/202407/22/2024072214285424929.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="gitcommit後に元に戻す方法" /> </a> <a target="_blank" href="https://www.php.cn/ja/faq/gitcommit" class="title-a-spanl" title="gitcommit後に元に戻す方法"><span>gitcommit後に元に戻す方法</span> </a> </li> <li class="ul-li"> <a target="_blank" href="https://www.php.cn/ja/faq/psxlhcs5"><img src="https://img.php.cn/upload/subject/202407/22/2024072214330785096.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="psのシリアル番号cs5" /> </a> <a target="_blank" href="https://www.php.cn/ja/faq/psxlhcs5" class="title-a-spanl" title="psのシリアル番号cs5"><span>psのシリアル番号cs5</span> </a> </li> <li class="ul-li"> <a target="_blank" href="https://www.php.cn/ja/faq/rowcounthsyf"><img src="https://img.php.cn/upload/subject/202407/22/2024072213362920410.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="rowcount関数の使用法" /> </a> <a target="_blank" href="https://www.php.cn/ja/faq/rowcounthsyf" class="title-a-spanl" title="rowcount関数の使用法"><span>rowcount関数の使用法</span> </a> </li> <li class="ul-li"> <a target="_blank" href="https://www.php.cn/ja/faq/linuxzxgwjm"><img src="https://img.php.cn/upload/subject/202407/22/2024072214030864171.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="Linuxでファイル名を変更する方法" /> </a> <a target="_blank" href="https://www.php.cn/ja/faq/linuxzxgwjm" class="title-a-spanl" title="Linuxでファイル名を変更する方法"><span>Linuxでファイル名を変更する方法</span> </a> </li> <li class="ul-li"> <a target="_blank" href="https://www.php.cn/ja/faq/htmlssm"><img src="https://img.php.cn/upload/subject/202407/22/2024072214210727109.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="htmlとは何ですか" /> </a> <a target="_blank" href="https://www.php.cn/ja/faq/htmlssm" class="title-a-spanl" title="htmlとは何ですか"><span>htmlとは何ですか</span> </a> </li> <li class="ul-li"> <a target="_blank" href="https://www.php.cn/ja/faq/zipwjjmdpjff"><img src="https://img.php.cn/upload/subject/202407/22/2024072213545779122.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="zipファイルの暗号化を解読する方法" /> </a> <a target="_blank" href="https://www.php.cn/ja/faq/zipwjjmdpjff" class="title-a-spanl" title="zipファイルの暗号化を解読する方法"><span>zipファイルの暗号化を解読する方法</span> </a> </li> <li class="ul-li"> <a target="_blank" href="https://www.php.cn/ja/faq/excelzxlshxls"><img src="https://img.php.cn/upload/subject/202407/22/2024072214132675587.jpg?x-oss-process=image/resize,m_fill,h_145,w_220" alt="Excelのxlsとxlsxの違い" /> </a> <a target="_blank" href="https://www.php.cn/ja/faq/excelzxlshxls" class="title-a-spanl" title="Excelのxlsとxlsxの違い"><span>Excelのxlsとxlsxの違い</span> </a> </li> </ul> </div> </div> </div> </div> <div class="phpwzright"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5902227090019525" data-ad-slot="3653428331" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div class="wzrOne"> <div class="wzroTitle">人気のおすすめ</div> <div class="wzroList"> <ul> <li> <div class="wzczzwzli"> <span class="layui-badge-dots wzrolr"></span> <a style="height: auto;" title="jsはどういう意味ですか" href="https://www.php.cn/ja/faq/482163.html">jsはどういう意味ですか</a> </div> </li> <li> <div class="wzczzwzli"> <span class="layui-badge-dots wzrolr"></span> <a style="height: auto;" title="jsで文字列を配列に変換するにはどうすればよいですか?" href="https://www.php.cn/ja/faq/461802.html">jsで文字列を配列に変換するにはどうすればよいですか?</a> </div> </li> <li> <div class="wzczzwzli"> <span class="layui-badge-dots wzrolr"></span> <a style="height: auto;" title="JavaScriptを使用してページを更新する方法" href="https://www.php.cn/ja/faq/473330.html">JavaScriptを使用してページを更新する方法</a> </div> </li> <li> <div class="wzczzwzli"> <span class="layui-badge-dots wzrolr"></span> <a style="height: auto;" title="js配列内の項目を削除する方法" href="https://www.php.cn/ja/faq/475790.html">js配列内の項目を削除する方法</a> </div> </li> <li> <div class="wzczzwzli"> <span class="layui-badge-dots wzrolr"></span> <a style="height: auto;" title="sqrt関数の使い方" href="https://www.php.cn/ja/faq/415276.html">sqrt関数の使い方</a> </div> </li> </ul> </div> </div> <script src="https://sw.php.cn/hezuo/cac1399ab368127f9b113b14eb3316d0.js" type="text/javascript"></script> <div class="wzrThree"> <div class="wzrthree-title"> <div>人気のチュートリアル</div> <a target="_blank" href="https://www.php.cn/ja/course.html">詳細> </a> </div> <div class="wzrthreelist swiper2"> <div class="wzrthreeTab swiper-wrapper"> <div class="check tabdiv swiper-slide" data-id="one">関連するチュートリアル <div></div></div> <div class="tabdiv swiper-slide" data-id="two">人気のおすすめ<div></div></div> <div class="tabdiv swiper-slide" data-id="three">最新のコース<div></div></div> </div> <ul class="one"> <li> <a target="_blank" href="https://www.php.cn/ja/course/812.html" title="最新の ThinkPHP 5.1 ワールドプレミアビデオチュートリアル (PHP エキスパートになるための 60 日間のオンライン トレーニング コース)" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/041/620debc3eab3f377.jpg" alt="最新の ThinkPHP 5.1 ワールドプレミアビデオチュートリアル (PHP エキスパートになるための 60 日間のオンライン トレーニング コース)"/> </a> <div class="wzrthree-right"> <a target="_blank" title="最新の ThinkPHP 5.1 ワールドプレミアビデオチュートリアル (PHP エキスパートになるための 60 日間のオンライン トレーニング コース)" href="https://www.php.cn/ja/course/812.html">最新の ThinkPHP 5.1 ワールドプレミアビデオチュートリアル (PHP エキスパートになるための 60 日間のオンライン トレーニング コース)</a> <div class="wzrthreerb"> <div>1429806 <b class="kclbcollectb"></b></div> <div class="courseICollection" data-id="812"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/74.html" title="PHP 入門チュートリアル 1: 1 週間で PHP を学ぶ" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/068/6253d1e28ef5c345.png" alt="PHP 入門チュートリアル 1: 1 週間で PHP を学ぶ"/> </a> <div class="wzrthree-right"> <a target="_blank" title="PHP 入門チュートリアル 1: 1 週間で PHP を学ぶ" href="https://www.php.cn/ja/course/74.html">PHP 入門チュートリアル 1: 1 週間で PHP を学ぶ</a> <div class="wzrthreerb"> <div>4281791 <b class="kclbcollectb"></b></div> <div class="courseICollection" data-id="74"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/286.html" title="JAVA 初心者向けビデオチュートリアル" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/068/62590a2bacfd9379.png" alt="JAVA 初心者向けビデオチュートリアル"/> </a> <div class="wzrthree-right"> <a target="_blank" title="JAVA 初心者向けビデオチュートリアル" href="https://www.php.cn/ja/course/286.html">JAVA 初心者向けビデオチュートリアル</a> <div class="wzrthreerb"> <div>2597543 <b class="kclbcollectb"></b></div> <div class="courseICollection" data-id="286"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/504.html" title="Little Turtle のゼロベースの Python 学習入門ビデオ チュートリアル" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/068/62590a67ce3a6655.png" alt="Little Turtle のゼロベースの Python 学習入門ビデオ チュートリアル"/> </a> <div class="wzrthree-right"> <a target="_blank" title="Little Turtle のゼロベースの Python 学習入門ビデオ チュートリアル" href="https://www.php.cn/ja/course/504.html">Little Turtle のゼロベースの Python 学習入門ビデオ チュートリアル</a> <div class="wzrthreerb"> <div>511613 <b class="kclbcollectb"></b></div> <div class="courseICollection" data-id="504"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/2.html" title="PHP ゼロベースの入門チュートリアル" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/068/6253de27bc161468.png" alt="PHP ゼロベースの入門チュートリアル"/> </a> <div class="wzrthree-right"> <a target="_blank" title="PHP ゼロベースの入門チュートリアル" href="https://www.php.cn/ja/course/2.html">PHP ゼロベースの入門チュートリアル</a> <div class="wzrthreerb"> <div>869939 <b class="kclbcollectb"></b></div> <div class="courseICollection" data-id="2"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> </ul> <ul class="two" style="display: none;"> <li> <a target="_blank" href="https://www.php.cn/ja/course/812.html" title="最新の ThinkPHP 5.1 ワールドプレミアビデオチュートリアル (PHP エキスパートになるための 60 日間のオンライン トレーニング コース)" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/041/620debc3eab3f377.jpg" alt="最新の ThinkPHP 5.1 ワールドプレミアビデオチュートリアル (PHP エキスパートになるための 60 日間のオンライン トレーニング コース)"/> </a> <div class="wzrthree-right"> <a target="_blank" title="最新の ThinkPHP 5.1 ワールドプレミアビデオチュートリアル (PHP エキスパートになるための 60 日間のオンライン トレーニング コース)" href="https://www.php.cn/ja/course/812.html">最新の ThinkPHP 5.1 ワールドプレミアビデオチュートリアル (PHP エキスパートになるための 60 日間のオンライン トレーニング コース)</a> <div class="wzrthreerb"> <div >1429806 回の学習</div> <div class="courseICollection" data-id="812"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/286.html" title="JAVA 初心者向けビデオチュートリアル" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/068/62590a2bacfd9379.png" alt="JAVA 初心者向けビデオチュートリアル"/> </a> <div class="wzrthree-right"> <a target="_blank" title="JAVA 初心者向けビデオチュートリアル" href="https://www.php.cn/ja/course/286.html">JAVA 初心者向けビデオチュートリアル</a> <div class="wzrthreerb"> <div >2597543 回の学習</div> <div class="courseICollection" data-id="286"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/504.html" title="Little Turtle のゼロベースの Python 学習入門ビデオ チュートリアル" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/068/62590a67ce3a6655.png" alt="Little Turtle のゼロベースの Python 学習入門ビデオ チュートリアル"/> </a> <div class="wzrthree-right"> <a target="_blank" title="Little Turtle のゼロベースの Python 学習入門ビデオ チュートリアル" href="https://www.php.cn/ja/course/504.html">Little Turtle のゼロベースの Python 学習入門ビデオ チュートリアル</a> <div class="wzrthreerb"> <div >511613 回の学習</div> <div class="courseICollection" data-id="504"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/901.html" title="Web フロントエンド開発の簡単な紹介" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/067/64be28a53a4f6310.png" alt="Web フロントエンド開発の簡単な紹介"/> </a> <div class="wzrthree-right"> <a target="_blank" title="Web フロントエンド開発の簡単な紹介" href="https://www.php.cn/ja/course/901.html">Web フロントエンド開発の簡単な紹介</a> <div class="wzrthreerb"> <div >216466 回の学習</div> <div class="courseICollection" data-id="901"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/234.html" title="PSビデオチュートリアルをゼロからマスターする" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/068/62611f57ed0d4840.jpg" alt="PSビデオチュートリアルをゼロからマスターする"/> </a> <div class="wzrthree-right"> <a target="_blank" title="PSビデオチュートリアルをゼロからマスターする" href="https://www.php.cn/ja/course/234.html">PSビデオチュートリアルをゼロからマスターする</a> <div class="wzrthreerb"> <div >905210 回の学習</div> <div class="courseICollection" data-id="234"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> </ul> <ul class="three" style="display: none;"> <li> <a target="_blank" href="https://www.php.cn/ja/course/1648.html" title="[Web フロントエンド] Node.js クイック スタート" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/067/662b5d34ba7c0227.png" alt="[Web フロントエンド] Node.js クイック スタート"/> </a> <div class="wzrthree-right"> <a target="_blank" title="[Web フロントエンド] Node.js クイック スタート" href="https://www.php.cn/ja/course/1648.html">[Web フロントエンド] Node.js クイック スタート</a> <div class="wzrthreerb"> <div >8500 回の学習</div> <div class="courseICollection" data-id="1648"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/1647.html" title="海外のWeb開発フルスタックコースの完全なコレクション" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/067/6628cc96e310c937.png" alt="海外のWeb開発フルスタックコースの完全なコレクション"/> </a> <div class="wzrthree-right"> <a target="_blank" title="海外のWeb開発フルスタックコースの完全なコレクション" href="https://www.php.cn/ja/course/1647.html">海外のWeb開発フルスタックコースの完全なコレクション</a> <div class="wzrthreerb"> <div >6799 回の学習</div> <div class="courseICollection" data-id="1647"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/1646.html" title="Go言語実践GraphQL" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/067/662221173504a436.png" alt="Go言語実践GraphQL"/> </a> <div class="wzrthree-right"> <a target="_blank" title="Go言語実践GraphQL" href="https://www.php.cn/ja/course/1646.html">Go言語実践GraphQL</a> <div class="wzrthreerb"> <div >5651 回の学習</div> <div class="courseICollection" data-id="1646"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/1645.html" title="550W ファンマスターが JavaScript をゼロから段階的に学習します" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/067/662077e163124646.png" alt="550W ファンマスターが JavaScript をゼロから段階的に学習します"/> </a> <div class="wzrthree-right"> <a target="_blank" title="550W ファンマスターが JavaScript をゼロから段階的に学習します" href="https://www.php.cn/ja/course/1645.html">550W ファンマスターが JavaScript をゼロから段階的に学習します</a> <div class="wzrthreerb"> <div >756 回の学習</div> <div class="courseICollection" data-id="1645"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> <li> <a target="_blank" href="https://www.php.cn/ja/course/1644.html" title="Python マスター Mosh、基礎知識ゼロの初心者でも 6 時間で始められる" class="wzrthreelaimg"> <img src="https://img.php.cn/upload/course/000/000/067/6616418ca80b8916.png" alt="Python マスター Mosh、基礎知識ゼロの初心者でも 6 時間で始められる"/> </a> <div class="wzrthree-right"> <a target="_blank" title="Python マスター Mosh、基礎知識ゼロの初心者でも 6 時間で始められる" href="https://www.php.cn/ja/course/1644.html">Python マスター Mosh、基礎知識ゼロの初心者でも 6 時間で始められる</a> <div class="wzrthreerb"> <div >28963 回の学習</div> <div class="courseICollection" data-id="1644"> <b class="nofollow small-nocollect"></b> </div> </div> </div> </li> </ul> </div> <script> var mySwiper = new Swiper('.swiper2', { autoplay: false,//可选选项,自动滑动 slidesPerView : 'auto', }) $('.wzrthreeTab>div').click(function(e){ $('.wzrthreeTab>div').removeClass('check') $(this).addClass('check') $('.wzrthreelist>ul').css('display','none') $('.'+e.currentTarget.dataset.id).show() }) </script> </div> <div class="wzrFour"> <div class="wzrfour-title"> <div>最新のダウンロード</div> <a href="https://www.php.cn/ja/xiazai">詳細> </a> </div> <script> $(document).ready(function(){ var sjyx_banSwiper = new Swiper(".sjyx_banSwiperwz",{ speed:1000, autoplay:{ delay:3500, disableOnInteraction: false, }, pagination:{ el:'.sjyx_banSwiperwz .swiper-pagination', clickable :false, }, loop:true }) }) </script> <div class="wzrfourList swiper3"> <div class="wzrfourlTab swiper-wrapper"> <div class="check swiper-slide" data-id="onef">ウェブエフェクト <div></div></div> <div class="swiper-slide" data-id="twof">公式サイト<div></div></div> <div class="swiper-slide" data-id="threef">サイト素材<div></div></div> <div class="swiper-slide" data-id="fourf">フロントエンドテンプレート<div></div></div> </div> <ul class="onef"> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a target="_blank" title="jQuery エンタープライズ メッセージ フォームの連絡先コード" href="https://www.php.cn/ja/toolset/js-special-effects/8071">[フォームボタン] jQuery エンタープライズ メッセージ フォームの連絡先コード</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a target="_blank" title="HTML5 MP3 オルゴール再生効果" href="https://www.php.cn/ja/toolset/js-special-effects/8070">[プレイヤーの特殊効果] HTML5 MP3 オルゴール再生効果</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a target="_blank" title="HTML5 クールなパーティクル アニメーション ナビゲーション メニューの特殊効果" href="https://www.php.cn/ja/toolset/js-special-effects/8069">[メニューナビゲーション] HTML5 クールなパーティクル アニメーション ナビゲーション メニューの特殊効果</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a target="_blank" title="jQuery ビジュアル フォームのドラッグ アンド ドロップ編集コード" href="https://www.php.cn/ja/toolset/js-special-effects/8068">[フォームボタン] jQuery ビジュアル フォームのドラッグ アンド ドロップ編集コード</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a target="_blank" title="VUE.JS 模倣 Kugou 音楽プレーヤー コード" href="https://www.php.cn/ja/toolset/js-special-effects/8067">[プレイヤーの特殊効果] VUE.JS 模倣 Kugou 音楽プレーヤー コード</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a target="_blank" title="古典的な HTML5 プッシュ ボックス ゲーム" href="https://www.php.cn/ja/toolset/js-special-effects/8066">[html5特殊効果] 古典的な HTML5 プッシュ ボックス ゲーム</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a target="_blank" title="画像効果を追加または削減するための jQuery スクロール" href="https://www.php.cn/ja/toolset/js-special-effects/8065">[画像の特殊効果] 画像効果を追加または削減するための jQuery スクロール</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a target="_blank" title="CSS3 個人アルバム カバー ホバー ズーム効果" href="https://www.php.cn/ja/toolset/js-special-effects/8064">[フォトアルバム効果] CSS3 個人アルバム カバー ホバー ズーム効果</a> </div> </li> </ul> <ul class="twof" style="display:none"> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8328" title="室内装飾クリーニングおよび修理サービス会社のウェブサイトのテンプレート" target="_blank">[フロントエンドテンプレート] 室内装飾クリーニングおよび修理サービス会社のウェブサイトのテンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8327" title="フレッシュカラーの個人履歴書ガイドページテンプレート" target="_blank">[フロントエンドテンプレート] フレッシュカラーの個人履歴書ガイドページテンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8326" title="デザイナーのクリエイティブな仕事の履歴書 Web テンプレート" target="_blank">[フロントエンドテンプレート] デザイナーのクリエイティブな仕事の履歴書 Web テンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8325" title="現代のエンジニアリング建設会社のウェブサイトのテンプレート" target="_blank">[フロントエンドテンプレート] 現代のエンジニアリング建設会社のウェブサイトのテンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8324" title="教育サービス機関向けのレスポンシブ HTML5 テンプレート" target="_blank">[フロントエンドテンプレート] 教育サービス機関向けのレスポンシブ HTML5 テンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8323" title="オンライン電子書籍ストア モールのウェブサイト テンプレート" target="_blank">[フロントエンドテンプレート] オンライン電子書籍ストア モールのウェブサイト テンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8322" title="IT テクノロジーがインターネット企業の Web サイト テンプレートを解決します" target="_blank">[フロントエンドテンプレート] IT テクノロジーがインターネット企業の Web サイト テンプレートを解決します</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8321" title="パープルスタイル外国為替取引サービスウェブサイトテンプレート" target="_blank">[フロントエンドテンプレート] パープルスタイル外国為替取引サービスウェブサイトテンプレート</a> </div> </li> </ul> <ul class="threef" style="display:none"> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-materials/3078" target="_blank" title="かわいい夏の要素のベクター素材 (EPS+PNG)">[PNG素材] かわいい夏の要素のベクター素材 (EPS+PNG)</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-materials/3077" target="_blank" title="4 つの赤い 2023 卒業バッジ ベクター素材 (AI+EPS+PNG)">[PNG素材] 4 つの赤い 2023 卒業バッジ ベクター素材 (AI+EPS+PNG)</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-materials/3076" target="_blank" title="歌う鳥と花がいっぱいのカートデザイン春のバナーベクター素材(AI+EPS)">[バナー画像] 歌う鳥と花がいっぱいのカートデザイン春のバナーベクター素材(AI+EPS)</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-materials/3075" target="_blank" title="金色の卒業帽ベクター素材(EPS+PNG)">[PNG素材] 金色の卒業帽ベクター素材(EPS+PNG)</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-materials/3074" target="_blank" title="黒と白のスタイルの山アイコン ベクター素材 (EPS+PNG)">[PNG素材] 黒と白のスタイルの山アイコン ベクター素材 (EPS+PNG)</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-materials/3073" target="_blank" title="異なる色のマントと異なるポーズを持つスーパーヒーローのシルエットベクター素材(EPS+PNG)">[PNG素材] 異なる色のマントと異なるポーズを持つスーパーヒーローのシルエットベクター素材(EPS+PNG)</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-materials/3072" target="_blank" title="フラット スタイルの植樹祭バナー ベクター素材 (AI+EPS)">[バナー画像] フラット スタイルの植樹祭バナー ベクター素材 (AI+EPS)</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-materials/3071" target="_blank" title="9つのコミックスタイルの爆発するチャットバブルベクター素材(EPS+PNG)">[PNG素材] 9つのコミックスタイルの爆発するチャットバブルベクター素材(EPS+PNG)</a> </div> </li> </ul> <ul class="fourf" style="display:none"> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8328" target="_blank" title="室内装飾クリーニングおよび修理サービス会社のウェブサイトのテンプレート">[フロントエンドテンプレート] 室内装飾クリーニングおよび修理サービス会社のウェブサイトのテンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8327" target="_blank" title="フレッシュカラーの個人履歴書ガイドページテンプレート">[フロントエンドテンプレート] フレッシュカラーの個人履歴書ガイドページテンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8326" target="_blank" title="デザイナーのクリエイティブな仕事の履歴書 Web テンプレート">[フロントエンドテンプレート] デザイナーのクリエイティブな仕事の履歴書 Web テンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8325" target="_blank" title="現代のエンジニアリング建設会社のウェブサイトのテンプレート">[フロントエンドテンプレート] 現代のエンジニアリング建設会社のウェブサイトのテンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8324" target="_blank" title="教育サービス機関向けのレスポンシブ HTML5 テンプレート">[フロントエンドテンプレート] 教育サービス機関向けのレスポンシブ HTML5 テンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8323" target="_blank" title="オンライン電子書籍ストア モールのウェブサイト テンプレート">[フロントエンドテンプレート] オンライン電子書籍ストア モールのウェブサイト テンプレート</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8322" target="_blank" title="IT テクノロジーがインターネット企業の Web サイト テンプレートを解決します">[フロントエンドテンプレート] IT テクノロジーがインターネット企業の Web サイト テンプレートを解決します</a> </div> </li> <li> <div class="wzrfourli"> <span class="layui-badge-dots wzrflr"></span> <a href="https://www.php.cn/ja/toolset/website-source-code/8321" target="_blank" title="パープルスタイル外国為替取引サービスウェブサイトテンプレート">[フロントエンドテンプレート] パープルスタイル外国為替取引サービスウェブサイトテンプレート</a> </div> </li> </ul> </div> <script> var mySwiper = new Swiper('.swiper3', { autoplay: false,//可选选项,自动滑动 slidesPerView : 'auto', }) $('.wzrfourlTab>div').click(function(e){ $('.wzrfourlTab>div').removeClass('check') $(this).addClass('check') $('.wzrfourList>ul').css('display','none') $('.'+e.currentTarget.dataset.id).show() }) </script> </div> </div> </div> <footer> <div class="footer"> <div class="footertop"> <img src="/static/imghw/logo.png" alt=""> <p>福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!</p> </div> <div class="footermid"> <a href="https://www.php.cn/ja/about/us.html">私たちについて</a> <a href="https://www.php.cn/ja/about/disclaimer.html">免責事項</a> <a href="https://www.php.cn/ja/update/article_0_1.html">Sitemap</a> </div> <div class="footerbottom"> <p> © php.cn All rights reserved </p> </div> </div> </footer> <input type="hidden" id="verifycode" value="/captcha.html"> <script>layui.use(['element', 'carousel'], function () {var element = layui.element;$ = layui.jquery;var carousel = layui.carousel;carousel.render({elem: '#test1', width: '100%', height: '330px', arrow: 'always'});$.getScript('/static/js/jquery.lazyload.min.js', function () {$("img").lazyload({placeholder: "/static/images/load.jpg", effect: "fadeIn", threshold: 200, skip_invisible: false});});});</script> <script src="/static/js/common_new.js"></script> <script type="text/javascript" src="/static/js/jquery.cookie.js?1737907740"></script> <script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script> <link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css?2' type='text/css' media='all'/> <script type='text/javascript' src='/static/js/viewer.min.js?1'></script> <script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script> <script type="text/javascript" src="/static/js/global.min.js?5.5.53"></script> <!-- Matomo --> <script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://tongji.php.cn/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '9']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <!-- End Matomo Code --> </body> </html>