この記事は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データベースを作成し、中国語の文字をサポートする方法
この記事では、参考までにMySQL 5.7.18 MSIインストールチュートリアルを紹介します。具体...
1. MySQLの一般的な接続INNER JOIN (内部結合、または等価結合): 2 つのテーブ...
目次MySql8.0 トランザクション分離レベルエラーの表示質問コマンドは次のように変更されますMy...
1 セミコロン「;」のない CSS スタイル2 タグが閉じられておらず、「>」がありません...
1. 事件の背景:仕事上、Ubuntu への vscode リモート接続を使用する必要があります。 ...
目次インデックスモデルB+ツリーインデックスの選択インデックスの最適化インデックスの選択性カバーイン...
この記事の例では、WeChatアプレットで写真をアップロードするための具体的なコードを参考までに共有...
目次必要:機能ポイントレンダリング実装のアイデア具体的なコード(react\taro3.0)特定のコ...
序文以前フロントエンドを勉強していたとき、メタタグに対する私の理解はこの一文だけでした。 <メ...
目次CentOS7環境での設定コマンド手順1. DHCP設定ファイルを設定する2. グローバル構成を...
【1】<i></i>タグと<em></em>タグ同じ...
MySQL では通常、limit を使用してページ上のページング機能を完了しますが、データ量が大きな...
この記事ではMySQL 5.7.16のインストールと設定方法を記録します。具体的な内容は以下のとおり...
目次1. Vue3コンポーネント通信方式2. Vue3通信の使い方2.1 小道具2.2 $エミット2...
ご存知のとおり、binlog ログは MySQL データベースにとって非常に重要です。万が一、データ...