この記事は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データベースを作成し、中国語の文字をサポートする方法
nginx サーバーnginx は、静的ファイルの処理に非常に効率的な優れた Web サーバーです。...
フロントエンド開発において、$ は jQuery の関数です。$ のパラメータが異なると、実装される...
最初のもの: CSSの位置プロパティの使用 <スタイル タイプ="text/css&...
inline-block について学習しているときに、境界線と inline-block を持つ複数...
ビジネスを想定: 2位の従業員の給与情報を見るデータベースを作成する emps が存在する場合はデー...
1. はじめに:ウェブページにフラッシュ コンテンツを正常に表示したい場合は、ページ上のフラッシュ ...
目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...
Dockerfile でのボリュームのマウントと docker -v コマンドによるマウントには明ら...
カルーセルを作りたい場合、まずその原理を理解する必要があります。画像を右から左にスライドさせるにはど...
目次1. はじめに2. Viteプロジェクトを作成する1. viteをインストールする2. プロジェ...
目次1. クエリ結果を挿入する2. 集計クエリ2.1 はじめに2.2 集計関数2.3 group b...
Optgroup は、ドロップダウン リストのコンテンツをより整理するために、select タグで使...
CSS インポート方法 - インラインスタイルタグ属性を通じて、CSSのキーと値のペアがタグに直接書...
(?i) は大文字と小文字を区別しないことを意味します。大文字と小文字をすべて置き換えます。 htm...
この記事の例では、タイマー機能を実装するためのVueの具体的なコードを参考までに共有しています。具体...