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 デプロイの詳細なプロセス

推薦する

yum の基本的な使い方と例(推奨)

yumコマンドYum (フルネームは Yellow dog Updater, Modified) ...

HTML の表のフレームとルール属性の詳細な説明

テーブル タグの frame 属性と rules 属性は境界線の表示を制御できます。フレーム プロパ...

CMDコマンドを使用してMySqlデータベースを操作する方法の詳細な説明

まず、mysqlサービスを開始および停止します ネットストップmysql ネットスタートMySQL ...

Nginx の一般的な設定とテクニックの概要

序文この記事では、Nginx の一般的な、実用的で興味深い構成をいくつか紹介します。この記事を読んだ...

Websocket に基づくシンプルなチャットルームダイアログの実装

この記事では、WebSocketを使用して簡単なチャットルームの会話を実装するための具体的なコードを...

nginx+FastDFS を使ってファイル管理システムを段階的に構築する

目次1. FastDFS の概要1. はじめに2. FastDFSストレージ戦略3. FastDFS...

WeChatアプレットのスクロールビューは、プルアップ時にデータの読み込みを重複させるソリューションを実装しています。

WeChat アプレットのスクロール ビューでは、プルアップして読み込むときにバグが多く発生します...

表の最初の行と最初の列を固定し、適応型ウィンドウを実現するための CSS の例コード

今日のキャンパス採用筆記試験では、固定された最初の行と最初の列を実装し、幅をウィンドウの変更に適応さ...

Oracle Rownum 書き込みに似た MySQL の詳細な例

Rownum は、Oracle での独自の書き込み方法です。Oracle では、rownum を使用...

JavaScriptでページスクロールアニメーションを実装する

目次レイアウトを作成するCSSスタイルを追加するJavaScript で要素を操作する対象要素を取得...

Ubuntu 16.04 64 ビット版の VMware Tools のインストールと構成のグラフィック チュートリアル

この記事では、VMware Toolsのインストールと構成に関するグラフィックチュートリアルを参考と...

Videojs+swiper が Taobao の商品詳細カルーセルを実現

この記事では、Taobao商品詳細のカルーセルを実現するためのvideojs+swiperの具体的な...

MySQL マスターライブラリ binlog (master-log) とスレーブライブラリ relay-log 間のコードの詳細な説明

メインライブラリのバイナリログ: # 2420 で #170809 17:16:20 サーバー ID...

Vueプロジェクトでのトークン検証ログイン(フロントエンド部分)

この記事の例では、Vueプロジェクトでのトークン検証ログインの具体的なコードを参考までに共有していま...

CSSはラジオをクリックして2つの画像スタイルを切り替えますが、複数のラジオのうち1つだけをチェックできます。

クリックされたボタンには赤い画像スタイルを実装し、選択されていない他のボタンには灰色の画像スタイルを...