IE 環境での css-vars-ponyfill の使用に関する詳細な説明 (nextjs ビルド)

IE 環境での css-vars-ponyfill の使用に関する詳細な説明 (nextjs ビルド)

css-vars-ポニーフィル

CSS 変数を使用して Web ページのスキニングを実現すると、互換性の問題が発生する可能性があります。

IE、QQ、Baiduブラウザなどの互換性問題を解決するために、css-vars-ponyfillが導入されました。しかし、IEブラウザでは、css-vars-ponyfillはnextjsでのパフォーマンスが低下します。主な欠陥は、ページがサーバー側でレンダリングされるため、ユーザーがインターフェイスを見た後、動的なテーマカラーやその他のスタイルをすばやくレンダリングできず、遷移時間があり(css-vars-ponyfillはクライアント側のみをサポート)、明らかな色の置き換えプロセスが発生し、ユーザーエクスペリエンスが低下します。ソース コードを読むと、cssVars はブラウザー コンテンツが読み込まれるまで待機してからトリガーされる必要があることがわかります。そうしないと、dom のデータ コンテンツ イベントをリッスンし続けることになり、エクスペリエンス上の問題が発生します。

解決

1. 解析速度

document.readyState !== 'loading'の制約条件を直接削除することで、ブラウザはそれを解析し、css-vars-ponyfill の導入方法を変更することができます (以前の導入方法は、nextjs の mainjs にモジュールを導入し、cssVars() を直接呼び出すことでした。この方法では、ponyfill スクリプトを呼び出す前に、他の無関係なチャンクが解析されます。css 変数をより速く解析するには、挿入位置を手動で選択する必要があります)。変更された css-vars-ponyfill は、css 変数の場所を見つけ (nextjs はヘッダー内のさまざまなコンポーネントの下にスタイルをパッケージ化します)、変更された ponyfill を呼び出し用のスタイルに挿入します。この手順は、サーバー上でレンダリングされる_document.tsxファイルで変更されます。

2. 分析の安定性

ファイルの解析場所を手動で変更し、ソースコードの条件トリガーメカニズムに関連する変更を加えることで、ホームページのカラーレンダリング速度がある程度向上しました。しかし、まだ問題があります。つまり、ルートジャンプインターフェースを通じて新しいスタイルチャンクが挿入されると、効果的な CSS 変数解析が実行できません (MutationObserver をオンにするために cssVars オプションを設定しようとしました)。

したがって、解決策は、IE などのブラウザー内のすべてのルートを a タグを介してリダイレクトし、css-ponyfill の再解析と実行をトリガーできるように UA を決定することです。

エクスポート関数ブラウザ() {
  定数 UA = window.navigator.userAgent
  if (UA.includes("qqbrowser")) は "qqbrowser" を返します
  if (UA.includes("baidu")) は "baidu" を返します
  if (UA.includes("Opera")) は "Opera" を返します
  if (UA.includes("Edge")) は "Edge" を返します
  (UA.includes("MSIE") || (UA.includes("Trident") && UA.includes("rv:11.0")) の場合
    「IE」を返す
  if (UA.includes("Firefox")) は "Firefox" を返します
  if (UA.includes("Chrome")) は "Chrome" を返します
  if (UA.includes("Safari")) は "Safari" を返します
}
タイプ CommonLinkProps = {
    子: ReactElement
    href?: 文字列
    ターゲット?: 文字列
    アウターリンク?: ブール値
    スタイル: 不明
}
デフォルトの関数 CustomLink(props: CommonLinkProps) をエクスポートします。
  const { children, href, target, as, outerLink, styles = emptyStyles } = props
  const [isIE, setIE] = useState<boolean>(false)
  const cloneEl = (c: ReactElement、props?: any) =>
    React.cloneElement(c, { href: ?? href, target, ...props }) の複製
  使用効果(() => {
    if (["IE", "qqbrowser", "baidu"].includes(browser())) {
      IEをtrueに設定する
    }
  }, [])
  関数renderLink() {
    (Children.only(children).type === "a")の場合{
      const ノード = cloneEl(ReactElement の子)
      戻りノード
    } それ以外 {
      fn: () => void | null = null とします
      if (アウターリンク) {
        関数 = () => {
          window.open(?? href として)
        }
      } それ以外 {
        関数 = () => {
          window.location.href = ??href として
        }
      }
      const node = cloneEl(children as ReactElement, {
        クリック時: () => {
          関数()
        },
      })
      戻りノード
    }
  }

  戻る (
    <>
      {!href ? (
        子供たち
      ) : isIE ? (
        レンダリングリンク()
      ) : (
        <リンク {...props}>{children}</リンク>
      )}
      <style jsx>{スタイル}</style>
    </>
  )
}

ここで、 children の型は、スロットで通常サポートされているReactNodeではなく、 ReactElementです。これは主に、文字列を直接挿入する状況を考慮したくないためです。文字列を直接挿入すると、問題の複雑さが増します。したがって、型レベルで直接制限します。フラグメントは考慮されず、有効なフラグメントタイプが見つからないため、ReactNode で省略できません。フラグメントが最初のレイヤーに挿入されると、nextjs 内のリンクが正常にジャンプできません。フラグメントに有効なイベントをバインドできないことが原因である可能性があります。現在、フラグメント (16.13.1) はキー属性のみをサポートしています。後で最適化されることを期待しています。

要約する

IE 環境 (nextjs ビルド) での css-vars-ponyfill の使用に関する記事はこれで終了です。より関連性の高い css-vars-ponyfill の使用コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  JS 内の Json 文字列 + Cookie + ローカルストレージ

>>:  Docker での FastAPI デプロイの詳細なプロセス

推薦する

HTML の一般的でないタグ optgroup、sub、sup、bdo のサンプルコード

Optgroup は、ドロップダウン リストのコンテンツをより整理するために、select タグで使...

VMware 仮想マシンの NAT モードを構成する方法

この記事では、VMware仮想マシンのNAT構成プロセスを詳しく説明します。具体的な内容は次のとおり...

jQueryはネストされたタブ機能を実装します

この記事では、ネストされたタブ機能を実装するためのjQueryの具体的なコードを参考までに紹介します...

MySQL テーブルとデータベース シャーディングのアプリケーション シナリオと設計方法

多くの友人がフォーラムやメッセージエリアで、どのような状況で MySQL をシャーディングする必要が...

Vueはv-modelを使用してel-paginationコンポーネントのプロセス全体をカプセル化します。

v-model を使用してページング情報オブジェクトをバインドします。ページング情報オブジェクトに...

MySQL マルチテーブル結合クエリの詳細な説明

目次複数テーブル結合クエリ内部結合左結合右結合サブクエリ要約する複数テーブル結合クエリテーブル間の接...

Vue3 トランジションアニメーションの落とし穴記録について

目次背景問題の場所さらなる分析要約する背景私のコース「Vue 3 エンタープライズレベルの音楽アプリ...

Docker イメージの作成、アップロード、プル、およびデプロイ操作 (Alibaba Cloud を使用)

学習プロセス中にプッシュ イメージが常にタイムアウトすることがわかったため、Alibaba Clou...

LeetCode の SQL 実装 (196. 重複するメールボックスを削除する)

[LeetCode] 196.重複したメールを削除するSQL クエリを記述して、Person とい...

Alibaba Cloud Serverにプログラムをデプロイし、ドメイン名を使用して直接アクセスする方法の詳細な説明

何もすることがなかったので、学習用に最も安いAlibaba Cloudサーバーを購入しました。年間3...

プロファイルを使用して遅い SQL を分析する MySQL の詳細な説明 (グループ左結合はサブクエリよりも効率的です)

プロファイルを使用して遅いSQLを分析するMySQL の SQL パフォーマンス アナライザーの主な...

MySQL でデータ テーブルを作成し、主キーと外部キーの関係を確立する方法の詳細な説明

序文MySQL テーブルの主キーと外部キーを作成するときは、次の点に注意する必要があります。主キーと...

HTMLを使用してシンプルなメールテンプレートを作成する

今日は、「ローテク」の問題について書きたいと思います。ちなみに、私は JavaScript Week...

CSS background-blend-modeの仕組みを深く理解する

この記事は共有および集約することを歓迎します。全文を転載する必要はありません。著作権を尊重してくださ...

Windows 10 で Hyper-V サービスをシャットダウンするいくつかの方法

VMware Workstation を使用して Windows 10 で仮想マシンを開くと、VMw...