ホームページ  >  記事  >  ウェブフロントエンド  >  require.context の使用法の概要 (例付き)

require.context の使用法の概要 (例付き)

不言
不言転載
2019-03-26 09:46:545128ブラウズ

この記事では、require.context の使い方を (例とともに) 紹介します。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。

原因: webpack の管理機能が突然使用されるようになったのはなぜですか?

プロジェクトの特定のページでは、N 枚のデモ画像を紹介する必要があります。つまり、リソースのバッチ インポート: 10 個を超える画像リソースをインポートする場合は、次のように 10 個のインポート コードを記述する必要があります: import XXX from 'relative/path/assets/imgs/xxx';, それ以上の画像リソースがある場合は、静的リソース 導入する必要がありますか?ここで、require.context が役に立ちます。

Documentation

公式ドキュメントの紹介が先にありますが、利用姿勢を理解するためにこれを見てみるのも良いでしょう。

Chestnut を見てみましょう

早速、上記のシナリオのコードを見てみましょう。

このシナリオでは、指定したフォルダーの下にあるすべての WebP 形式の画像をインポートし、demo1 をクリックすると、demo1 の下に x 枚のケース画像を表示し、demoX ケース図をクリックすると、demoX の下に x 枚の画像を表示する必要があります。

    // 通过require.context的方式引入指定的路径下匹配到的模块引用
    const demoImgsContext = require.context('@src/assets/imgs/demo', false, /\.webp$/);
    ...
    // 使用姿势
    trigger(type) {
        this.demoImgs = Arry.from({length: config.type}, (key, value) => value + 1)
            .map(index => demoImgsContext(`./${type}_demo${index}.webp`));
    }

1 つの例から推測するシーンはまだ必要ですか?
たとえば、vuex では複数のモジュール ストアが導入されています。この方法も使えます。

    // 添加module文件是,文件命请按照module_XXX的方式命名
    // 自动引入module文件夹下的js文件
    const mutationContext = require.context('./module', false, /.*\.js/);
    const modules = mutationContext.keys().reduce((prev, cur) => {
        // 排除module_root文件
        const matches = cur.match(/module_(?!.*root)(\w+)\.js/);
        const key = matches && matches[1];
        key && (prev[key] = mutationContext(cur).default);
        return prev;
    }, {});

次に、require.context がリソースを動的に導入する方法を見てみましょう。

パッケージ化された dist ディレクトリを見て、静的画像のケースのチャンク部分のコードがどのようなものであるかを確認してください。

trigger メソッド内でモジュールのリソースを参照するコードは次のとおりで、y メソッドが呼び出され、リソースのパスが渡されます。

    map(function (e) {
        return y("./".concat(t, "_demo").concat(e, ".webp"))
    })

y メソッドとは何ですか?手がかりに従って、パッケージ化されたコードを調べ続けます。

   y = a("ae36");

y メソッドは特定のモジュールのエクスポートです。この ID でモジュール コードを引き続き表示します:

ae36: function (t, e, a) {
      // 此处是一个map映射,key值和真正的资源id的映射
      var i = {
        "./a_module_demo1.webp": "6085",
        "./a_module_demo2.webp": "fd3b",
        "./b_module_demo1.webp": "cbf6",
        "./b_module_demo2.webp": "220e",
        "./c_module_demo1.webp": "273e",
        "./c_module_demo2.webp": "5a5e",
        "./d_module_demo1.webp": "75b0",
        "./d_module_demo2.webp": "2d3e"
      };
      // 此处根据module的id值,真正require一个资源
      function r(t) {
        var e = o(t);
        return a(e)
      }
      
      function o(t) {
        var e = i[t];
        if (!(e + 1)) {
          var a = new Error("Cannot find module '" + t + "'");
          throw a.code = "MODULE_NOT_FOUND", a
        }
        return e
      }
      r.keys = function () {
        return Object.keys(i)
      }, r.resolve = o, t.exports = r, r.id = "ae36"
    },

"6085"、"fd3b" およびその他のマップされた値の値を表示できます。は実際のリソース ID 値であり、対応するモジュール マッピングは次のとおりです:

6085: function (t, e) {
      t.exports =
        "//${你配置的项目publicPath}/img/1_module_demo1.ed6db768.webp"
    },

ユーザーがトリガー メソッドをトリガーすると、タイプとインデックスで指定された値に基づいて、モジュール リソース参照require.context に保存されているリソース モジュールは、キー値に基づいて実際のリソース参照を見つけます。リソース モジュール、require、ブラウザーは、対応するリソースをダウンロードするのに役立ち、バッチで導入された後にオンデマンドでロードするというアイデアを実現します。

この記事はここで終了しています。その他のエキサイティングなコンテンツについては、PHP 中国語 Web サイトの JavaScript ビデオ チュートリアル 列に注目してください。

以上がrequire.context の使用法の概要 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。