AtklÄjiet ÄtrÄkas tÄ«mekļa lietotnes ar mÅ«su ceļvedi par JavaScript koda sadalīŔanu. ApgÅ«stiet dinamisku ielÄdi, marÅ”rutu sadalīŔanu un veiktspÄjas optimizÄciju.
JavaScript koda sadalīŔana: padziļinÄts ieskats dinamiskajÄ ielÄdÄ un veiktspÄjas optimizÄcijÄ
MÅ«sdienu digitÄlajÄ vidÄ lietotÄja pirmo iespaidu par jÅ«su tÄ«mekļa lietotni bieži nosaka viens rÄdÄ«tÄjs: Ätrums. LÄna, gausa vietne var izraisÄ«t lietotÄju neapmierinÄtÄ«bu, augstu atteikuma gadÄ«jumu skaitu un tieÅ”u negatÄ«vu ietekmi uz biznesa mÄrÄ·iem. Viens no galvenajiem lÄnu tÄ«mekļa lietotÅu vaininiekiem ir monolÄ«ts JavaScript sainis ā viens, milzÄ«gs fails, kas satur visu jÅ«su vietnes kodu, un tas ir jÄlejupielÄdÄ, jÄparsÄ un jÄizpilda, pirms lietotÄjs var mijiedarboties ar lapu.
Å eit talkÄ nÄk JavaScript koda sadalīŔana. TÄ nav tikai tehnika; tÄ ir fundamentÄla arhitektÅ«ras maiÅa veidÄ, kÄ mÄs veidojam un piegÄdÄjam tÄ«mekļa lietotnes. Sadalot lielo saini mazÄkos, pÄc pieprasÄ«juma ielÄdÄjamos gabalos, mÄs varam ievÄrojami uzlabot sÄkotnÄjÄs ielÄdes laiku un radÄ«t daudz plÅ«denÄku lietotÄja pieredzi. Å Ä« rokasgrÄmata jÅ«s vedÄ«s padziļinÄtÄ ceļojumÄ koda sadalīŔanas pasaulÄ, izpÄtot tÄs pamatkoncepcijas, praktiskÄs stratÄÄ£ijas un dziļo ietekmi uz veiktspÄju.
Kas ir koda sadalīŔana un kÄpÄc tai vajadzÄtu pievÄrst uzmanÄ«bu?
SavÄ bÅ«tÄ«bÄ koda sadalīŔana ir prakse, kurÄ jÅ«su lietotnes JavaScript kods tiek sadalÄ«ts vairÄkos mazÄkos failos, bieži sauktos par "gabaliem" (chunks), kurus var ielÄdÄt dinamiski vai paralÄli. TÄ vietÄ, lai nosÅ«tÄ«tu lietotÄjam 2 MB lielu JavaScript failu, kad viÅÅ” pirmo reizi apmeklÄ jÅ«su mÄjaslapu, jÅ«s varat nosÅ«tÄ«t tikai nepiecieÅ”amos 200 KB, kas vajadzÄ«gi Ŕīs lapas renderÄÅ”anai. PÄrÄjais kods ā tÄdÄm funkcijÄm kÄ lietotÄja profila lapa, administratora panelis vai sarežģīts datu vizualizÄcijas rÄ«ks ā tiek ienests tikai tad, kad lietotÄjs faktiski pÄriet uz Ŕīm funkcijÄm vai mijiedarbojas ar tÄm.
IedomÄjieties to kÄ pasÅ«tÄ«jumu restorÄnÄ. MonolÄ«ts sainis ir kÄ saÅemt visu daudzu Ädienu Ädienkarti uzreiz, neatkarÄ«gi no tÄ, vai jÅ«s to vÄlaties vai nÄ. Koda sadalīŔana ir Ć la carte pieredze: jÅ«s saÅemat tieÅ”i to, ko pasÅ«tÄt, tieÅ”i tad, kad tas ir nepiecieÅ”ams.
ProblÄma ar monolÄ«tiem saiÅiem
Lai pilnÄ«bÄ novÄrtÄtu risinÄjumu, mums vispirms ir jÄsaprot problÄma. Viens, liels sainis negatÄ«vi ietekmÄ veiktspÄju vairÄkos veidos:
- PalielinÄta tÄ«kla latentitÄte: LielÄku failu lejupielÄde prasa ilgÄku laiku, Ä«paÅ”i lÄnÄkos mobilajos tÄ«klos, kas ir izplatÄ«ti daudzÄs pasaules daļÄs. Å is sÄkotnÄjais gaidīŔanas laiks bieži ir pirmais ŔķÄrslis.
- IlgÄks parsÄÅ”anas un kompilÄÅ”anas laiks: PÄc lejupielÄdes pÄrlÅ«kprogrammas JavaScript dzinÄjam ir jÄparsÄ un jÄkompilÄ viss kods. Tas ir CPU ietilpÄ«gs uzdevums, kas bloÄ·Ä galveno pavedienu, nozÄ«mÄjot, ka lietotÄja saskarne paliek sastingusi un nereaÄ£Ä.
- BloÄ·Äta renderÄÅ”ana: KamÄr galvenais pavediens ir aizÅemts ar JavaScript, tas nevar veikt citus kritiskus uzdevumus, piemÄram, renderÄt lapu vai reaÄ£Ät uz lietotÄja ievadi. Tas tieÅ”i noved pie slikta laika lÄ«dz interaktivitÄtei (TTI).
- IzŔķÄrdÄti resursi: IevÄrojama daļa koda monolÄ«tÄ sainÄ« var nekad netikt izmantota tipiskas lietotÄja sesijas laikÄ. Tas nozÄ«mÄ, ka lietotÄjs tÄrÄ datus, akumulatoru un apstrÄdes jaudu, lai lejupielÄdÄtu un sagatavotu kodu, kas viÅam nesniedz nekÄdu vÄrtÄ«bu.
- Slikti Core Web Vitals rÄdÄ«tÄji: Å Ä«s veiktspÄjas problÄmas tieÅ”i kaitÄ jÅ«su Core Web Vitals rÄdÄ«tÄjiem, kas var ietekmÄt jÅ«su pozÄ«ciju meklÄtÄjprogrammu rezultÄtos. BloÄ·Äts galvenais pavediens pasliktina pirmÄs ievades aizkavi (FID) un mijiedarbÄ«bu lÄ«dz nÄkamajai krÄsoÅ”anai (INP), savukÄrt aizkavÄta renderÄÅ”ana ietekmÄ lielÄkÄ satura krÄsoÅ”anu (LCP).
ModernÄs koda sadalīŔanas pamats: dinamiskais import()
MaÄ£ija, kas slÄpjas aiz vairuma moderno koda sadalīŔanas stratÄÄ£iju, ir standarta JavaScript funkcija: dinamiskÄ import()
izteiksme. AtŔķirÄ«bÄ no statiskÄ import
apgalvojuma, kas tiek apstrÄdÄts bÅ«vÄÅ”anas laikÄ un apvieno moduļus, dinamiskais import()
ir funkcijai lÄ«dzÄ«ga izteiksme, kas ielÄdÄ moduli pÄc pieprasÄ«juma.
LÅ«k, kÄ tas darbojas:
import('/path/to/module.js')
Kad saiÅotÄjs, piemÄram, Webpack, Vite vai Rollup, redz Å”o sintaksi, tas saprot, ka './path/to/module.js' un tÄ atkarÄ«bas ir jÄievieto atseviÅ”Ä·Ä gabalÄ. Pats import()
izsaukums atgriež Promise, kas tiek atrisinÄts ar moduļa saturu, kad tas ir veiksmÄ«gi ielÄdÄts no tÄ«kla.
Tipiska implementÄcija izskatÄs Å”Ädi:
// PieÅemot, ka ir poga ar id="load-feature"
const featureButton = document.getElementById('load-feature');
featureButton.addEventListener('click', () => {
import('./heavy-feature.js')
.then(module => {
// Modulis ir veiksmÄ«gi ielÄdÄts
const feature = module.default;
feature.initialize(); // Palaist funkciju no ielÄdÄtÄ moduļa
})
.catch(err => {
// ApstrÄdÄt kļūdas ielÄdes laikÄ
console.error('NeizdevÄs ielÄdÄt funkciju:', err);
});
});
Å ajÄ piemÄrÄ `heavy-feature.js` nav iekļauts sÄkotnÄjÄ lapas ielÄdÄ. Tas tiek pieprasÄ«ts no servera tikai tad, kad lietotÄjs noklikŔķina uz pogas. Tas ir dinamiskÄs ielÄdes pamatprincips.
Praktiskas koda sadalīŔanas stratÄÄ£ijas
ZinÄt "kÄ" ir viena lieta; zinÄt "kur" un "kad" ir tas, kas padara koda sadalīŔanu patiesi efektÄ«vu. Å eit ir visbiežÄk sastopamÄs un jaudÄ«gÄkÄs stratÄÄ£ijas, ko izmanto modernajÄ tÄ«mekļa izstrÄdÄ.
1. Uz marŔrutiem balstīta sadalīŔana
Å Ä«, iespÄjams, ir visefektÄ«vÄkÄ un plaÅ”Äk izmantotÄ stratÄÄ£ija. Ideja ir vienkÄrÅ”a: katrai lapai vai marÅ”rutam jÅ«su lietotnÄ tiek izveidots savs JavaScript gabals. Kad lietotÄjs apmeklÄ `/home`, viÅÅ” ielÄdÄ tikai mÄjaslapas kodu. Ja viÅÅ” pÄriet uz `/dashboard`, tad dinamiski tiek ienests informÄcijas paneļa JavaScript.
Å Ä« pieeja lieliski saskan ar lietotÄja uzvedÄ«bu un ir neticami efektÄ«va daudzlapu lietotnÄm (pat vienas lapas lietotnÄm jeb SPA). LielÄkajai daļai moderno ietvaru ir iebÅ«vÄts atbalsts Å”im nolÅ«kam.
PiemÄrs ar React (React.lazy
un Suspense
)
React padara uz marÅ”rutiem balstÄ«tu sadalīŔanu vienmÄrÄ«gu, izmantojot React.lazy
komponentu dinamiskai importÄÅ”anai un Suspense
, lai parÄdÄ«tu rezerves lietotÄja saskarni (piemÄram, ielÄdes indikatoru), kamÄr komponenta kods tiek ielÄdÄts.
import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
// Statiski importÄjam komponentus biežÄkajiem/sÄkotnÄjiem marÅ”rutiem
import HomePage from './pages/HomePage';
// Dinamiski importÄjam komponentus retÄkiem vai smagÄkiem marÅ”rutiem
const DashboardPage = lazy(() => import('./pages/DashboardPage'));
const AdminPanel = lazy(() => import('./pages/AdminPanel'));
function App() {
return (
Lapa ielÄdÄjas...
PiemÄrs ar Vue (asinhronie komponenti)
Vue marÅ”rutÄtÄjam ir pirmklasÄ«gs atbalsts komponentu slinkajai ielÄdei, izmantojot dinamisko import()
sintaksi tieÅ”i marÅ”ruta definÄ«cijÄ.
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
const routes = [
{
path: '/',
name: 'Home',
component: Home // IelÄdÄts sÄkotnÄji
},
{
path: '/about',
name: 'About',
// Koda sadalīŔana marŔruta līmenī
// Tas Ä£enerÄ atseviŔķu gabalu Å”im marÅ”rutam
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
}
];
const router = createRouter({
history: createWebHistory(),
routes
});
export default router;
2. Uz komponentiem balstīta sadalīŔana
Dažreiz pat vienas lapas ietvaros ir lieli komponenti, kas nav uzreiz nepiecieÅ”ami. Tie ir ideÄli kandidÄti uz komponentiem balstÄ«tai sadalīŔanai. PiemÄri ietver:
- ModÄlie logi vai dialoglodziÅi, kas parÄdÄs pÄc tam, kad lietotÄjs noklikŔķina uz pogas.
- Sarežģītas diagrammas vai datu vizualizÄcijas, kas atrodas zem redzamÄs lapas daļas.
- BagÄtinÄta teksta redaktors, kas parÄdÄs tikai tad, kad lietotÄjs noklikŔķina "rediÄ£Ät".
- Video atskaÅotÄja bibliotÄka, kurai nav jÄielÄdÄjas, kamÄr lietotÄjs nenoklikŔķina uz atskaÅoÅ”anas ikonas.
ImplementÄcija ir lÄ«dzÄ«ga uz marÅ”rutiem balstÄ«tai sadalīŔanai, bet to ierosina lietotÄja mijiedarbÄ«ba, nevis marÅ”ruta maiÅa.
PiemÄrs: modÄlÄ loga ielÄde pÄc klikŔķa
import React, { useState, Suspense, lazy } from 'react';
// ModÄlais komponents ir definÄts savÄ failÄ un atradÄ«sies atseviÅ”Ä·Ä gabalÄ
const HeavyModal = lazy(() => import('./components/HeavyModal'));
function MyPage() {
const [isModalOpen, setIsModalOpen] = useState(false);
const openModal = () => {
setIsModalOpen(true);
};
return (
Laipni lÅ«dzam lapÄ
{isModalOpen && (
IelÄdÄ modÄlo logu... }>
setIsModalOpen(false)} />
)}