document.addEventListener("DOMContentLoaded", function() {
 var lazyloadImages = document.querySelectorAll("img.lazy");

 function lazyload () {
 lazyloadImages.forEach(function(img) {
 if (img.offsetTop < (window.innerHeight + window.pageYOffset)) {
 img.src = img.dataset.src;
 img.classList.remove("lazy");
 }
 });
 if(lazyloadImages.length === 0) {
 document.removeEventListener("scroll", lazyload);
 window.removeEventListener("resize", lazyload);
 window.removeEventListener("orientationChange", lazyload);
 }
 }

 document.addEventListener("scroll", lazyload);
 window.addEventListener("resize", lazyload);
 window.addEventListener("orientationChange", lazyload);
 });
            

Handlingsorienteret indsigt: Implementer lazy loading for billeder, videoer og andre ressourcer, der ikke er umiddelbart synlige på skærmen. Overvej at bruge biblioteker som `lozad.js` eller browser-native lazy-loading-attributter.

6. Tree Shaking og eliminering af død kode

Tree shaking er en teknik, der fjerner ubrugt kode fra din applikation under build-processen. Dette kan reducere bundlestørrelsen betydeligt, især hvis du bruger biblioteker, der indeholder meget kode, som du ikke har brug for.

Eksempel:

Antag, at du bruger et hjælpebibliotek, der indeholder 100 funktioner, men du bruger kun 5 af dem i din applikation. Uden tree shaking ville hele biblioteket blive inkluderet i din bundle. Med tree shaking ville kun de 5 funktioner, du bruger, blive inkluderet.

Konfiguration:

Sørg for, at din bundler er konfigureret til at udføre tree shaking. I webpack er dette typisk aktiveret som standard, når man bruger production mode. I Rollup kan det være nødvendigt at bruge `@rollup/plugin-commonjs`-pluginnet.

Handlingsorienteret indsigt: Konfigurer din bundler til at udføre tree shaking og sørg for, at din kode er skrevet på en måde, der er kompatibel med tree shaking (f.eks. ved at bruge ES-moduler).

7. Minimering af afhængigheder

Antallet af afhængigheder i dit projekt kan have en direkte indflydelse på modulgrafens kompleksitet. Hver afhængighed tilføjes til grafen, hvilket potentielt øger build-tider og bundlestørrelser. Gennemgå jævnligt dine afhængigheder og fjern dem, der ikke længere er nødvendige eller kan erstattes med mindre alternativer.

Eksempel:

I stedet for at bruge et stort hjælpebibliotek til en simpel opgave, kan du overveje at skrive din egen funktion eller bruge et mindre, mere specialiseret bibliotek.

Handlingsorienteret indsigt: Gennemgå jævnligt dine afhængigheder med værktøjer som `npm audit` eller `yarn audit` og identificer muligheder for at reducere antallet af afhængigheder eller erstatte dem med mindre alternativer.

8. Analyse af bundlestørrelse og ydeevne

Analyser jævnligt din bundlestørrelse og ydeevne for at identificere forbedringsområder. Værktøjer som webpack-bundle-analyzer og Lighthouse kan hjælpe dig med at identificere store moduler, ubrugt kode og ydelsesmæssige flaskehalse.

Eksempel (webpack-bundle-analyzer):

Tilføj `webpack-bundle-analyzer`-pluginnet til din webpack-konfiguration.

            const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
 // ... other webpack configuration
 plugins: [
 new BundleAnalyzerPlugin()
 ]
};

            

Når du kører dit build, vil pluginnet generere et interaktivt treemap, der viser størrelsen på hvert modul i din bundle.

Handlingsorienteret indsigt: Integrer bundle-analyseværktøjer i din build-proces og gennemgå jævnligt resultaterne for at identificere optimeringsområder.

9. Module Federation

Module Federation, en funktion i webpack 5, giver dig mulighed for at dele kode mellem forskellige applikationer under kørsel. Dette kan være nyttigt til at bygge microfrontends eller til at dele fælles komponenter mellem forskellige projekter. Module Federation kan hjælpe med at reducere bundlestørrelser og forbedre ydeevnen ved at undgå duplikering af kode.

Eksempel (Grundlæggende Module Federation-opsætning):

Applikation A (Host):

            // webpack.config.js
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
 // ... other webpack configuration
 plugins: [
 new ModuleFederationPlugin({
 name: "appA",
 remotes: {
 appB: "appB@http://localhost:3001/remoteEntry.js",
 },
 shared: ["react", "react-dom"]
 })
 ]
};

            

Applikation B (Remote):

            // webpack.config.js
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
 // ... other webpack configuration
 plugins: [
 new ModuleFederationPlugin({
 name: "appB",
 exposes: {
 './MyComponent': './src/MyComponent',
 },
 shared: ["react", "react-dom"]
 })
 ]
};

            

Handlingsorienteret indsigt: Overvej at bruge Module Federation til store applikationer med delt kode eller til at bygge microfrontends.

Specifikke overvejelser for bundlers

Forskellige bundlers har forskellige styrker og svagheder, når det kommer til optimering af modulgrafen. Her er nogle specifikke overvejelser for populære bundlers:

Webpack

Rollup

Parcel

Globalt perspektiv: Tilpasning af optimeringer til forskellige kontekster

Når man optimerer modulgrafen, er det vigtigt at overveje den globale kontekst, som din applikation vil blive brugt i. Faktorer som netværksforhold, enhedskapaciteter og brugerdemografi kan påvirke effektiviteten af forskellige optimeringsteknikker.

Konklusion

Optimering af JavaScript-modulgrafen er et afgørende aspekt af front-end-udvikling. Ved at forenkle afhængigheder, fjerne cirkulære afhængigheder og implementere code splitting kan du markant forbedre build-ydelsen, reducere bundlestørrelsen og øge applikationens indlæsningstider. Analyser jævnligt din bundlestørrelse og ydeevne for at identificere forbedringsområder og tilpas dine optimeringsstrategier til den globale kontekst, som din applikation vil blive brugt i. Husk, at optimering er en løbende proces, og kontinuerlig overvågning og forbedring er afgørende for at opnå optimale resultater.

Ved konsekvent at anvende disse teknikker kan udviklere verden over skabe hurtigere, mere effektive og mere brugervenlige webapplikationer.

Optimering af JavaScript-modulgraf: Forenkling af afhængighedsgrafen | MLOG | MLOG