Dynamiska importer i JavaScript: BemÀstra koddelning och lazy loading | MLOG | MLOG

Komponenten Modal laddas endast nĂ€r anvĂ€ndaren klickar pĂ„ knappen "Öppna modal".

3. Funktionsbaserad koddelning

Detta tillvÀgagÄngssÀtt fokuserar pÄ att dela upp kod baserat pÄ distinkta funktioner eller funktionaliteter i din applikation. Detta Àr sÀrskilt anvÀndbart för stora applikationer med komplexa funktioner som inte alltid behövs av alla anvÀndare. Till exempel kan en e-handelssida anvÀnda lazy loading för kod relaterad till produktrecensioner eller önskelistor endast nÀr anvÀndaren interagerar med dessa funktioner.

Exempel (lazy loading av en rapporteringsfunktion):

            import React, { useState, lazy, Suspense } from 'react';

const ReportingDashboard = lazy(() => import('./features/ReportingDashboard'));

function AdminPanel() {
  const [showReporting, setShowReporting] = useState(false);

  const handleShowReporting = () => {
    setShowReporting(true);
  };

  return (
    
{showReporting && ( Laddar rapportering...
}> )}
); } export default AdminPanel;

Komponenten ReportingDashboard, som sannolikt innehÄller komplexa datavisualiseringar och analyslogik, laddas endast nÀr administratören klickar pÄ knappen "Visa rapporteringspanel".

4. Villkorlig koddelning

Denna teknik innebĂ€r att dynamiskt importera moduler baserat pĂ„ vissa villkor, sĂ„som anvĂ€ndarens enhet, webblĂ€sare eller plats. Detta gör att du kan skrĂ€ddarsy din applikations kod efter varje anvĂ€ndares specifika behov, vilket ytterligare optimerar prestanda och resursanvĂ€ndning. ÖvervĂ€g att servera olika bildformat (t.ex. WebP för webblĂ€sare som stöder det) eller att endast ladda polyfills för Ă€ldre webblĂ€sare.

Exempel (laddar polyfills för Àldre webblÀsare):

            async function loadPolyfills() {
  if (!('fetch' in window)) {
    await import('whatwg-fetch');
    console.log('Fetch polyfill laddad.');
  }

  if (!('Promise' in window)) {
    await import('promise-polyfill/src/polyfill');
    console.log('Promise polyfill laddad.');
  }
}

loadPolyfills();

            

Denna kod kontrollerar om fetch API:et och Promise stöds av webblÀsaren. Om inte, importerar den dynamiskt motsvarande polyfills.

Strategier för lazy loading

Lazy loading Àr en teknik som skjuter upp laddningen av resurser tills de faktiskt behövs. Detta kan avsevÀrt förbÀttra initiala sidladdningstider och minska bandbreddsförbrukningen. Dynamiska importer Àr ett kraftfullt verktyg för att implementera lazy loading i JavaScript-applikationer.

1. Lazy loading av bilder

Bilder Àr ofta en stor bidragande orsak till sidstorlek. Lazy loading av bilder sÀkerstÀller att bilder nedanför vecket (dvs. de som inte Àr omedelbart synliga i viewporten) endast laddas nÀr anvÀndaren rullar ner pÄ sidan.

Exempel (med Intersection Observer API):

            const images = document.querySelectorAll('img[data-src]');

function preloadImage(img) {
  img.src = img.dataset.src;
  img.onload = () => {
    img.removeAttribute('data-src');
  };
}

const imgObserver = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      preloadImage(entry.target);
      observer.unobserve(entry.target);
    }
  });
});

images.forEach(img => {
  imgObserver.observe(img);
});

            

I detta exempel innehÄller attributet data-src bildens URL. Intersection Observer API anvÀnds för att upptÀcka nÀr bilden kommer in i viewporten, varpÄ bilden laddas.

2. Lazy loading av videor

Liksom bilder kan videor ocksÄ avsevÀrt pÄverka sidladdningstider. Lazy loading av videor förhindrar att de laddas tills anvÀndaren interagerar med dem (t.ex. klickar pÄ en play-knapp).

Exempel (lazy loading av en video med en platshÄllare):

            
Video Placeholder

Videon representeras initialt av en platshÄllarbild. NÀr anvÀndaren klickar pÄ play-knappen laddas videokÀllan och videon börjar spelas upp.

3. Lazy loading av iframes

Iframes, som ofta anvÀnds för att bÀdda in innehÄll frÄn tredjepartskÀllor, kan ocksÄ pÄverka sidans prestanda. Lazy loading av iframes sÀkerstÀller att de endast laddas nÀr anvÀndaren rullar nÀra dem.

Exempel (lazy loading av en iframe med Intersection Observer API):

            const iframes = document.querySelectorAll('iframe[data-src]');

function loadIframe(iframe) {
  iframe.src = iframe.dataset.src;
  iframe.onload = () => {
    iframe.removeAttribute('data-src');
  };
}

const iframeObserver = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      loadIframe(entry.target);
      observer.unobserve(entry.target);
    }
  });
});

iframes.forEach(iframe => {
  iframeObserver.observe(iframe);
});

            

Liknande exemplet för lazy loading av bilder anvÀnder denna kod Intersection Observer API för att upptÀcka nÀr iframen kommer in i viewporten och laddar sedan iframens innehÄll.

Webpack och dynamiska importer

Webpack Àr en populÀr modulbuntare som ger utmÀrkt stöd för dynamiska importer. Den upptÀcker automatiskt dynamiska import-satser och delar upp din kod i separata chunks, som sedan kan laddas vid behov.

Konfiguration:

Ingen sÀrskild konfiguration krÀvs vanligtvis för att aktivera dynamiska importer i Webpack. Du kanske dock vill konfigurera koddelning ytterligare genom att anvÀnda funktioner som:

Exempel (Webpack-konfiguration för koddelning):

            module.exports = {
  // ...
  output: {
    filename: '[name].[chunkhash].js',
    chunkFilename: '[name].[chunkhash].js',
    path: path.resolve(__dirname, 'dist'),
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all',
        },
      },
    },
  },
  // ...
};

            

Denna konfiguration skapar en separat chunk för tredjepartsbibliotek (kod frÄn node_modules) och anvÀnder en unik hash för varje chunk för att möjliggöra webblÀsarcachelagring.

React och dynamiska importer

React har inbyggt stöd för lazy loading av komponenter med hjÀlp av funktionen React.lazy() och komponenten Suspense. Detta gör det enkelt att implementera koddelning i React-applikationer.

Exempel (lazy loading av en React-komponent):

            import React, { lazy, Suspense } from 'react';

const MyComponent = lazy(() => import('./MyComponent'));

function App() {
  return (
    Laddar...
}> ); } export default App;

Funktionen React.lazy() tar en funktion som returnerar en dynamisk import. Komponenten Suspense tillhandahÄller ett fallback-grÀnssnitt medan komponenten laddas.

Angular och dynamiska importer

Angular stöder lazy loading av moduler med hjÀlp av sin routing-konfiguration. Du kan definiera rutter som laddar moduler vid behov, vilket avsevÀrt kan förbÀttra den initiala laddningstiden för din Angular-applikation.

Exempel (lazy loading av en modul i Angular):

            import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  {
    path: 'feature',
    loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule)
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

            

I detta exempel laddas FeatureModule endast nÀr anvÀndaren navigerar till rutten /feature.

Vue.js och dynamiska importer

Vue.js ger ocksÄ stöd för lazy loading av komponenter med dynamiska importer. Du kan anvÀnda syntaxen import() i dina komponentdefinitioner för att ladda komponenter vid behov.

Exempel (lazy loading av en Vue.js-komponent):

            Vue.component('async-component', () => ({
  // Komponenten som ska laddas. Ska vara ett Promise
  component: import('./AsyncComponent.vue'),
  // En komponent att anvÀnda medan den asynkrona komponenten laddas
  loading: LoadingComponent,
  // En komponent att anvÀnda om laddningen misslyckas
  error: ErrorComponent,
  // Fördröjning innan laddningskomponenten visas. Standard: 200 ms.
  delay: 200,
  // Felkomponenten visas om en timeout anges
  // och överskrids.
  timeout: 3000
}))

            

Detta exempel definierar en asynkron komponent med namnet async-component som laddar filen AsyncComponent.vue vid behov. Det ger ocksÄ alternativ för laddnings-, fel-, fördröjnings- och timeout-komponenter.

BÀsta praxis för dynamiska importer och lazy loading

För att effektivt utnyttja dynamiska importer och lazy loading, övervÀg följande bÀsta praxis:

Globala övervÀganden

NÀr du implementerar dynamiska importer och lazy loading för en global publik Àr det avgörande att tÀnka pÄ följande:

Slutsats

Dynamiska importer i JavaScript erbjuder en kraftfull mekanism för att implementera koddelning och lazy loading, vilket gör att du kan optimera din webbapplikations prestanda och leverera en överlÀgsen anvÀndarupplevelse för en global publik. Genom att strategiskt dela upp din kod baserat pÄ rutter, komponenter eller funktioner, och genom att anvÀnda lazy loading för resurser vid behov, kan du avsevÀrt minska initiala laddningstider, förbÀttra responsiviteten och öka den totala applikationseffektiviteten. Kom ihÄg att följa bÀsta praxis, ta hÀnsyn till globala övervÀganden och kontinuerligt övervaka din applikations prestanda för att sÀkerstÀlla att du levererar bÀsta möjliga upplevelse till anvÀndare över hela vÀrlden. Omfamna dessa tekniker och se din applikation blomstra i det globala digitala landskapet.