Dieser Artikel wurde von https://web.dev/bundling-non-js-resources/ übersetzt. Der Originaltext wurde nicht verändert. Angenommen, Sie entwickeln eine Webanwendung. In diesem Fall haben Sie es wahrscheinlich nicht nur mit JavaScript-Modulen zu tun, sondern auch mit verschiedenen anderen Ressourcen – Web Eine Möglichkeit zum Laden statischer Ressourcen besteht darin, sie direkt im HTML zu referenzieren. Normalerweise sind sie jedoch logisch mit anderen wiederverwendbaren Komponenten gekoppelt. Beispielsweise ist Die meisten Build-Systeme für größere Projekte führen jedoch zusätzliche Optimierungen und Neuorganisationen des Inhalts durch, beispielsweise Bündelung und 1. Benutzerdefinierter Import in Verpackungstools Ein gängiger Ansatz besteht darin, die vorhandene statische Importsyntax zu nutzen. Einige Bundler erkennen das Format automatisch anhand der Dateierweiterung, während andere Plugins die Verwendung eines benutzerdefinierten // Normales JavaScript importimport { loadImg } von './utils.js'; // Spezieller „URL-Import“ – statische Ressourcen importieren imageUrl von „asset-url:./image.png“; importiere wasmUrl aus „asset-url:./module.wasm“; importiere workerUrl von „js-url:./worker.js“; Bild laden(Bild-URL); : WebAssembly.instantiateStreaming(fetch(wasmUrl)); neuer Worker(workerUrl); Wenn ein Bundler-Plugin einen Import mit einer erkannten Erweiterung oder einem erkannten Die Vorteile dieses Ansatzes sind: Wiederverwendung Dies hat jedoch einen offensichtlichen Nachteil: Ein solcher Code funktioniert nicht direkt in Browsern, da Browser nicht wissen, wie sie mit diesen benutzerdefinierten Importschemata oder Erweiterungen umgehen sollen. Wenn Sie Ihren gesamten Code kontrollieren und bei der Entwicklung ohnehin auf einen Bundler angewiesen sind, klingt das natürlich großartig. Um den Aufwand zu reduzieren, wird es jedoch immer üblicher, 2. Allgemeine Importsyntax in Browsern und BundlernWenn Sie eine wiederverwendbare Komponente entwickeln, möchten Sie, dass sie in jeder Umgebung funktioniert, unabhängig davon, ob sie direkt im Browser verwendet oder als Teil einer größeren Anwendung vorgefertigt wird. Die meisten modernen Bundler akzeptieren die folgende Importsyntax für JavaScript-Module: Es sieht aus wie eine spezielle Syntax, ist aber tatsächlich ein gültiger Mit dieser Syntax kann das vorherige Beispiel wie folgt umgeschrieben werden: // regulärer JavaScript-Import importiere { loadImg } aus './utils.js'; loadImg(neue URL('./image.png', import.meta.url)); WebAssembly.instantiateStreaming( holen(neue URL('./module.wasm', import.meta.url)), { /* … */ } ); neuer Worker (neue URL ('./worker.js', import.meta.url)); Lassen Sie uns analysieren, wie es funktioniert: Es hat ähnliche Vor- und Nachteile wie der dynamische Import. Während es möglich ist, Inhalte mit import(...) zu importieren, etwa mit Ebenso können Sie 3. Mehrdeutige relative URLs Sie fragen sich vielleicht, warum Bundler andere gängige Syntax nicht erkennen können, beispielsweise „ Der Grund hierfür liegt darin, dass sich im Gegensatz zum Schlüsselwort Datei: <script src="src/main.js" Typ="Modul"></script> Quelle/ Haupt-JS modul.wasm Wenn Sie Allerdings kennt Indem Sie relative URLs in Durch einfaches Ersetzen von 4. Unterstützung in der Toolchain4.1 VerpackungswerkzeugeDie folgenden Bundler unterstützen bereits die neue URL-Syntax:
5. WebAssembly Wenn Sie 5.1 C/C++ kompiliert mit Emscripten Wenn wir die $ emcc Eingabe.cpp -o Ausgabe.mjs ## Wenn Sie die mjs-Erweiterung nicht verwenden möchten: $ emcc input.cpp -o output.js -s EXPORT_ES6 Wenn diese Option verwendet wird, nutzt der Ausgabe-Glue-Code Durch Hinzufügen des Parameters $ emcc input.cpp -o output.mjs -pthread ## Wenn Sie die mjs-Erweiterung nicht verwenden möchten: $ emcc input.cpp -o output.js -s EXPORT_ES6 -pthread In diesem Fall wird der generierte 5.2 Rust kompiliert mit wasm-pack / wasm-bindgen Standardmäßig wird ein Alternativ können wir wasm-pack mit dem Argument -target web auffordern, ein browserkompatibles ES6-Modul auszugeben: $ wasm-pack build --Zielweb Die Ausgabe verwendet die oben beschriebene neue URL-Syntax (..., import.meta.url) und Wasm-Dateien werden automatisch vom Bundler erkannt. Wenn Sie Kurz gesagt, Sie können nicht beliebige Threading-APIs verwenden, aber wenn Sie Rayon [14] verwenden, können Sie den wasm-bingen-rayon [15]-Adapter ausprobieren, der Worker generieren kann, die im Web ausgeführt werden können. Der von 6. Zukünftige Importmethoden6.1 importiere.meta.resolve Eine mögliche zukünftige Verbesserung ist eine spezielle // Aktuelle Syntax neue URL('...', import.meta.url) // Zukünftige Syntax wartet auf import.meta.resolve('...') Es lässt sich auch besser in 6.2 Import-AssertionenImport-Assertions sind eine neue Funktion, die den Import von Typen außerhalb von ECMAScript-Modulen ermöglicht, obwohl derzeit nur JSON-Typen unterstützt werden. foo.json { "Antwort": 42 } Haupt.mjs importiere json aus './foo.json' assert { Typ: 'json' }; konsole.log(json.antwort); // 42 (Anmerkung des Übersetzers: Es gibt auch einige interessante Informationen zu dieser weniger intuitiven Syntaxwahl https://github.com/tc39/proposal-import-assertions/issues/12) Sie können auch von Bundlern verwendet werden und die Szenarien ersetzen, die derzeit von der neuen URL-Syntax unterstützt werden, aber die Typen in den Importbehauptungen müssen einzeln unterstützt werden. Derzeit wird nur Weitere Informationen zu dieser Funktion finden Sie in der Funktionserklärung auf v8.dev [19]. 7. Zusammenfassung Wie Sie sehen, gibt es verschiedene Möglichkeiten, Nicht- Bis dieser Tag kommt, ist Dies ist das Ende dieses Artikels zum Verpacken von statischen Ressourcen ohne JavaScript. Weitere relevante Inhalte zum Verpacken von statischen Ressourcen ohne JavaScript finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! 8. Referenzen[1]; import.meta.url: https://v8.dev/features/modules#import-meta [2]; Dynamischer Import: https://v8.dev/features/dynamic-import [3]: Code-Splitting: https://web.dev/reduce-javascript-payloads-with-code-splitting/ [4]: Webpack v5: https://webpack.js.org/guides/asset-modules/#url-assets [5]: Rollup: 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 (beta): 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-Integrationsvorschlag: https://github.com/WebAssembly/esm-integration [13]: Entsprechender Teil: https://web.dev/webassembly-threads/#rust [14]: Rayon: https://github.com/rayon-rs/rayon [15]: wasm-bindgen-rayon: https://github.com/GoogleChromeLabs/wasm-bindgen-rayon [16]: Ebenfalls enthalten: https://github.com/GoogleChromeLabs/wasm-bindgen-rayon/blob/4cd0666d2089886d6e8731de2371e7210f848c5d/demo/index.js#L26 [17]: Experimentelle Funktion: https://nodejs.org/api/esm.html#esm_import_meta_resolve_specifier_parent [18]: Es gibt noch einige ungelöste Probleme: https://github.com/WICG/import-maps/issues/79 [19]: Funktionserklärung auf v8.dev: https://v8.dev/features/import-assertions Das könnte Sie auch interessieren:
|
<<: Einführung in gängige XHTML-Tags
>>: So erstellen Sie eine MySQL-Datenbank und unterstützen chinesische Schriftzeichen
Inhaltsverzeichnis 1. Vier Konzepte 1. JavaScript...
Inhaltsverzeichnis Herkunft Status Quo Anfrage ab...
Inhaltsverzeichnis Starten und Stoppen Datenbankb...
1. MySQL Workbench herunterladen Workbench ist ei...
Heute möchte ich mit Ihnen teilen, dass der Stand...
Einführung Die Docker-Community hat viele Open-So...
1. Häufig verwendete höherwertige Funktionen von ...
Vorwort Die Verwendung von CSS zum Generieren gep...
Wirkungsprinzip Verwenden Sie hauptsächlich CSS-F...
Der folgende Fehler wird gemeldet, wenn MySQL meh...
In diesem Artikel wird der spezifische Code von j...
Code kopieren Der Code lautet wie folgt: <!--[...
Inhaltsverzeichnis Produktanforderungen Ideen Pro...
Sie können eine Funktion schreiben: Verwenden Sie...
Inhaltsverzeichnis 1 Frage 2 Methoden 3 Experimen...