この記事はhttps://web.dev/bundling-non-js-resources/から翻訳されたものです。原文は変更されていません。 Web アプリケーションを開発しているとします。この場合、JavaScript モジュールだけでなく、Web 静的リソースをロードする方法の 1 つは、HTML 内で直接参照することですが、通常は他の再利用可能なコンポーネントと論理的に結合されます。たとえば、カスタム ドロップダウン メニューの ただし、大規模プロジェクト向けのビルド システムのほとんどは、バンドルや 1. パッケージングツールでのカスタムインポート一般的なアプローチは、既存の静的インポート構文を活用することです。一部のバンドラーはファイル拡張子によってフォーマットを自動的に検出しますが、他のバンドラーでは次の例のようにプラグインがカスタム // 通常の JavaScript importimport { loadImg } from './utils.js'; // 特別な「URL インポート」静的リソース import imageUrl from 'asset-url:./image.png'; 'asset-url:./module.wasm' から wasmUrl をインポートします。 'js-url:./worker.js' から workerUrl をインポートします。 イメージURLをロードします。 WebAssembly.instantiateStreaming(fetch(wasmUrl)); 新しいワーカー(workerUrl); バンドラ プラグインは、認識できる拡張子または このアプローチの利点は、 ただし、明らかな欠点があります。ブラウザーはカスタム インポート スキームや拡張機能の処理方法を知らないため、このようなコードはブラウザーで直接動作しません。もちろん、すべてのコードを自分で管理していて、開発にバンドラーに依存している場合は、これは素晴らしいことのように思えます。ただし、手間を減らすために、ブラウザで 2. ブラウザとバンドラの共通インポート構文再利用可能なコンポーネントを開発している場合は、ブラウザで直接使用する場合でも、大規模なアプリケーションの一部として事前に構築する場合でも、あらゆる環境で機能するようにする必要があります。最新のバンドラーのほとんどは、次の JavaScript モジュール インポート構文を受け入れます。 特殊な構文のように見えますが、実際にはブラウザで直接使用できる有効な この構文を使用すると、前の例は次のように書き直すことができます。 // 通常のJavaScriptインポート './utils.js' から { loadImg } をインポートします。 loadImg(新しいURL('./image.png', import.meta.url)); WebAssembly.instantiateStreaming() は、 フェッチ(新しいURL('./module.wasm'、import.meta.url))、 { /* … */ } ); 新しいワーカー(新しい URL('./worker.js'、import.meta.url)); どのように動作するかを分析してみましょう: 動的インポートと同様の利点と欠点があります。 同様に、 3. あいまいな相対URLバンドラーが他の一般的な構文 (たとえば、 その理由は、 インデックス.html: <script src="src/main.js" type="module"></script> ソース/ メイン.js モジュール.wasm
ただし、 相対 URL を 4. ツールチェーンのサポート4.1 パッケージングツール次のバンドラーはすでに新しい URL 構文をサポートしています。
5. Webアセンブリ
5.1 EmscriptenでコンパイルされたC/C++ $ emcc 入力.cpp -o 出力.mjs ## mjs 拡張機能を使用しない場合: $ emcc 入力.cpp -o 出力.js -s EXPORT_ES6 このオプションを使用すると、出力グルーコードは $ emcc 入力.cpp -o 出力.mjs -pthread ## mjs 拡張機能を使用しない場合: $ emcc 入力.cpp -o 出力.js -s EXPORT_ES6 -pthread この場合、生成された 5.2 wasm-pack / wasm-bindgen でコンパイルされた Rust デフォルトでは、 あるいは、-target web 引数を使用して wasm-pack にブラウザ互換の ES6 モジュールを出力するように要求することもできます。 $ wasm-pack ビルド --target web 出力では、上で説明した新しい URL(..., import.meta.url) 構文が使用され、Wasm ファイルはバンドラーによって自動的に検出されます。 つまり、任意のスレッドAPIを使用することはできませんが、Rayon [14]を使用する場合は、Web上で実行できるワーカーを生成できるwasm-bingen-rayon [15]アダプタを試すことができます。 6. 今後の輸入方法6.1 インポート.meta.resolve将来的に改善される可能性のある点の 1 つは、特殊な // 現在の構文 new URL('...', import.meta.url) // 将来の構文 await import.meta.resolve('...') また、 6.2 インポートアサーションインポートアサーションは、ECMAScript モジュールの外部の型をインポートできる新しい機能ですが、現時点では JSON 型のみがサポートされています。 foo.json { "答え": 42 } メイン.mjs './foo.json' から json をインポートします。 assert { type: 'json' }; console.log(json.answer); // 42 (翻訳者注: このあまり直感的ではない構文の選択に関する興味深い情報もいくつかあります https://github.com/tc39/proposal-import-assertions/issues/12) これらはバンドラーによって使用され、新しい URL 構文で現在サポートされているシナリオを置き換えることもできますが、インポートアサーションの型は 1 つずつサポートされる必要があります。現在は この機能の詳細については、v8.dev [19]の機能説明を参照してください。 7. まとめご覧のとおり、Web 上に その日が来るまでは、 非 JavaScript 静的リソースのパッケージ化に関するこの記事はこれで終わりです。非 JavaScript 静的リソースのパッケージ化に関する関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 8. 参考文献[1]; import.meta.url: https://v8.dev/features/modules#import-meta [2]; 動的インポート: https://v8.dev/features/dynamic-import [3]:コード分割: https://web.dev/reduce-javascript-payloads-with-code-splitting/ [4]:Webpack v5: https://webpack.js.org/guides/asset-modules/#url-assets [5]:ロールアップ: https://rollupjs.org/ [6]: @web/rollup-plugin-import-meta-assets: https://modern-web.dev/docs/building/rollup-plugin-import-meta-assets/ [7]: @surma/rollup-plugin-off-main-thread: https://github.com/surma/rollup-plugin-off-main-thread [8]: Parcel v2(ベータ版): https://v2.parceljs.org/languages/javascript/#url-dependencies [9]:Vite: https://vitejs.dev/guide/assets.html#new-url-url-import-meta-url [10]:WebAssembly: https://web.dev/webassembly-threads/#c [11]: wasm-pack: https://github.com/rustwasm/wasm-pack [12]:WebAssembly ESM統合提案: https://github.com/WebAssembly/esm-integration [13]: 該当部分: https://web.dev/webassembly-threads/#rust [14]:レイヨン: https://github.com/rayon-rs/rayon [15]: wasm-bindgen-rayon: https://github.com/GoogleChromeLabs/wasm-bindgen-rayon [16]: 以下も含まれています: https://github.com/GoogleChromeLabs/wasm-bindgen-rayon/blob/4cd0666d2089886d6e8731de2371e7210f848c5d/demo/index.js#L26 [17]: 実験的な機能: https://nodejs.org/api/esm.html#esm_import_meta_resolve_specifier_parent [18]: まだ解決されていない問題がいくつかあります: https://github.com/WICG/import-maps/issues/79 [19]: v8.devでの機能説明: https://v8.dev/features/import-assertions 以下もご興味があるかもしれません:
|
>>: MySQLデータベースを作成し、中国語の文字をサポートする方法
この記事では、Linux 環境の Apache サーバーでセカンダリ ドメイン名を構成する方法につい...
Antd+react+webpackは、多くの場合、Reactテクノロジースタックに基づくフロントエ...
目次I. 概要2. 従来の多段階イメージ構築3. Buildkitを使用してイメージをビルドする4....
この記事の例では、すべてのチェックボックスの選択を実現するためのJavaScriptの具体的なコード...
目次1. 基本的なSELECT文1. 指定されたフィールドをクエリする3. エイリアスを設定する4....
VUE は vue-seamless-scroll を使用して、自動的にスクロールしていいねします。...
mysql idは1から始まり、不連続なidの問題を解決するために自動的に増加します。強迫性障害の私...
React プロジェクトで要素フレームワークを使用するのは今回が初めてです。非常に単純な問題に遭遇し...
JSXとは何かJSX は Javascript の構文拡張であり、JSX = Javascript ...
とあるサイトからレンタルした仮想マシンの有効期限が近づいており、更新料が200元以上かかります。Al...
背景モバイル デバイスでは、ページ ジャンプ間のキャッシュが必須要件です。例: ホームページ =&g...
目次序文1. カスタムフォーカスコマンド1. 方法1 2. 方法2 3. 方法3 2. 入力ボックス...
この記事では、主に HTML のサンプル コードを紹介し、次のように交互に色を変更する方法を共有しま...
目次Vue2.x の使用法グローバル登録部分登録使用フック機能フック関数のパラメータVue3.x の...
1. 継続的デリバリーとは何かソフトウェア製品の出力プロセスは、ソフトウェアがいつでもリリースできる...