Karya seni: https://code-art.pictures/
Hari ini mungkin mengejutkan, tetapi trafik internet masih menjadi isu dalam banyak senario. Rangkaian mudah alih selalunya mempunyai pelan data yang terhad, bateri peranti tidak terhingga dan, yang paling penting, perhatian pengguna semasa menunggu tapak anda dimuatkan adalah terhad. Itulah sebabnya saiz bundle masih penting. Berikut ialah tujuh petua untuk anda pertimbangkan.
Pada tahun 2020, saya telah mengekalkan apl promosi untuk rangkaian sosial tempatan. Ia adalah aplikasi pek web React TypeScript biasa yang menyasarkan ES5. Apabila webpack 5 dikeluarkan, saya memutuskan untuk menaik taraf. Semuanya berjalan lancar; Saya memantau analitik ralat dan maklum balas pengguna, dan tiada apa yang tidak dijangka. Hanya selepas seminggu saya secara tidak sengaja mendapati bahawa berkas saya mengandungi fungsi anak panah — ia adalah ciri pek web baharu.
Berikut ialah artikel hebat tentang keadaan ES5. Ambilan penting:
Berikut ialah beberapa ciri yang membolehkan anda menulis kod yang lebih baik dan lebih padat.
Penjana ialah cara yang cekap untuk melintasi struktur bersarang:
type TreeNode<T> = { left?: TreeNode<T> value: T right?: TreeNode<T> }; function* traverse<T>(root: TreeNode<T>): Generator<T> { if (root.left) yield* traverse(root.left) yield root.value if (root.right) yield* traverse(root.right) }
Minifier mengetahui dengan pasti bahawa medan ini tidak boleh mempunyai penggunaan luaran, walaupun dalam objek yang dieksport dan bebas untuk memendekkan namanya.
Sumber
export class A { #myFancyStateObject }
Himpunan
export class A{#t}
Ini tidak akan berfungsi, sudah tentu, dengan medan peribadi TypeScript, kerana pengetahuan bahawa ia adalah peribadi hilang apabila tsc telah melaksanakan tugasnya.
Pernahkah anda mendengar tentang Promise.withResolvers() atau Map.groupBy()? API ini tidak tersedia secara meluas pada masa penulisan ini, tetapi akan tersedia tidak lama lagi. Luangkan sedikit masa untuk membiasakan diri dengan mereka sekarang dan bersedia untuk menerima pakai mereka dalam beberapa tahun.
Terdapat banyak blog dan podcast, tetapi saya dapati “surat berita” terbaik ialah fail .d.ts baharu dalam repositori TypeScript. Buka sahaja, sebagai contoh, es2024.collection.d.ts dan nikmati ?
Adakah anda perasan corak yang berulang?
type TreeNode<T> = { left?: TreeNode<T> value: T right?: TreeNode<T> }; function* traverse<T>(root: TreeNode<T>): Generator<T> { if (root.left) yield* traverse(root.left) yield root.value if (root.right) yield* traverse(root.right) }
Kod berulang bukan sahaja meningkatkan saiz berkas tetapi juga menjadikannya lebih sukar untuk memahami perkara yang dilakukan oleh setiap bahagian. Ini selalunya menyebabkan pembangun menulis kod baharu dan bukannya mengenal pasti dan menggunakan semula fungsi utiliti sedia ada, seterusnya membebankan berkas.
Sudah ada banyak bahan yang sangat baik tentang topik ini, jadi daripada menceritakannya semula, saya mengesyorkan klasik: Pemfaktoran Semula oleh Martin Fowler. Ia merangkumi bukan sahaja contoh mudah seperti di atas tetapi juga kes kompleks seperti hierarki berganding dan reka bentuk berulang.
Sekarang, mari kita perbaiki contoh kecil kita. Nampaknya pengapit sering digunakan untuk mengehadkan parameter kepada julat indeks tatasusunan, jadi kami boleh membuat pintasan:
export class A { #myFancyStateObject }
Perubahan ini menjadikannya jelas bahawa n mungkin bertujuan untuk menjadi integer, yang tidak disemak pada masa ini. Ia juga menyerlahkan kes tepi yang tidak dikendalikan: tatasusunan kosong. Dengan membuat deduplikasi kecil ini, kami turut menemui dua potensi pepijat ?
Saya tidak ingat sumber sebenar pepatah ini, tetapi saya rasa ia tepat:
Overgineering ialah menyelesaikan masalah yang anda tidak ada.
Dalam dunia pembangunan web, saya telah memerhatikan dua jenis utama kejuruteraan berlebihan.
Pertimbangkan kod ini. Pelapik ialah gandaan 4px dan warna latar belakang adalah warna biru. Ini mungkin bukan satu kebetulan, dan jika ya, ia mungkin menunjukkan kemungkinan pertindihan. Tetapi adakah kita benar-benar mempunyai maklumat yang mencukupi untuk mengekstrak komponen Butang generik, atau adakah kita terlalu kejuruteraan?
CSS
export class A{#t}
JSX
const clamp = (min, val, max) => Math.max(min, Math.min(val, max)) const x = clamp(0, v1, a.length - 1) const y = clamp(0, v2, b.length - 1) const z = clamp(0, v3, c.length - 1)
Nasihat ini agak bercanggah dengan "Elakkan pertindihan". Kod penyahduplikasi yang berlebihan boleh menyebabkan kejuruteraan berlebihan. Jadi, di manakah anda membuat garisan? Secara peribadi, saya menggunakan nombor ajaib "3": sebaik sahaja saya melihat tiga tempat dengan corak yang serupa, mungkin sudah tiba masanya untuk mengekstrak komponen generik.
Dalam kes butang biru kami, saya percaya penyelesaian terbaik ialah menggunakan pembolehubah CSS, sekurang-kurangnya untuk pelapik, dan bukannya mencipta komponen baharu.
Ya, saya bercakap tentang perkara yang kita suka — Next.js, React, Vue dan sebagainya. Jika apl anda tidak melibatkan banyak interaktiviti pada tahap elemen DOM, atau tidak dinamik, atau sangat mudah, pertimbangkan pilihan lain:
Matlamat semasa TypeScript terutamanya JavaScript menyemak taip, tetapi ia tidak selalu seperti ini. Pada hari sebelum ES6, terdapat banyak percubaan untuk mencipta "JavaScript yang lebih baik," dan TypeScript tidak terkecuali. Sesetengah ciri bermula sejak zaman awal tersebut.
Bukan sahaja ia sukar digunakan dengan betul, tetapi ia juga bertukar menjadi struktur yang agak bertele-tele:
TypeScript
type TreeNode<T> = { left?: TreeNode<T> value: T right?: TreeNode<T> }; function* traverse<T>(root: TreeNode<T>): Generator<T> { if (root.left) yield* traverse(root.left) yield root.value if (root.right) yield* traverse(root.right) }
JavaScript
export class A { #myFancyStateObject }
Buku Panduan TypeScript rasmi mengesyorkan menggunakan objek mudah dan bukannya enum. Anda juga boleh mempertimbangkan jenis kesatuan.
Ruang nama ialah penyelesaian modul pra-ESM. Ia bukan sahaja meningkatkan saiz berkas, tetapi memandangkan ruang nama bertujuan untuk menjadi global, ia menjadi sangat sukar untuk mengelakkan konflik menamakan dalam projek besar.
TypeScript
export class A{#t}
JavaScript
const clamp = (min, val, max) => Math.max(min, Math.min(val, max)) const x = clamp(0, v1, a.length - 1) const y = clamp(0, v2, b.length - 1) const z = clamp(0, v3, c.length - 1)
Daripada ruang nama, gunakan modul ES.
Nota: Ruang nama masih berguna, walau bagaimanapun, untuk menulis definisi jenis untuk lib global.
Setiap helah kecil ini boleh menjimatkan beberapa hingga berpuluh-puluh bait dalam berkas. Jika digunakan secara konsisten, ia boleh membawa hasil yang ketara.
Sebagai contoh, rentetan kosong adalah palsu. Untuk menyemak sama ada ia ditakrifkan dan tidak kosong, anda hanya boleh menulis:
const clampToRange = (n, {length}) => clamp(0, n, length - 1) const x = clampToRange(v1, a) // ...
Saya percaya menggunakan == untuk memaksa null kepada undefined, atau sebaliknya, adalah wajar.
.btn-a { background-color: skyblue; padding: 4px; } .btn-b { background-color: deepskyblue; padding: 8px; }
<button className='btn-a' onClick={handleClick}> Show </button> // ... <button className='btn-b' onClick={handleSubmit}> Submit </button>
Sebaliknya:
enum A { x, y }
Tulis ini:
var A; (function (A) { A[A["x"] = 0] = "x"; A[A["y"] = 1] = "y"; })(A || (A = {}));
Sebaliknya:
namespace A { export let x = 1 }
Tulis ini:
var A; (function (A) { A.x = 1; })(A || (A = {}));
Anda juga boleh membekukan objek untuk melindungi sifatnya daripada perubahan.
Bagi setiap pengikat, terdapat alat untuk menggambarkan kandungannya, seperti penganalisis webpack-bundle untuk pek web dan penganalisis vite-bundle untuk Vite. Alat seperti ini membantu anda mengenal pasti isu biasa dengan himpunan anda:
Selain alatan ini, adalah idea yang baik untuk sekali-sekala membaca berkas secara manual untuk mengesan penyelewengan. Sebagai contoh, anda mungkin menemui pembantu ES5 dalam berkas ES6 atau pembantu CJS dalam projek ESM disebabkan salah konfigurasi TypeScript. Masalah ini mungkin tidak ditangkap oleh alatan automatik tetapi masih boleh meningkatkan masa pemuatan dan berpotensi menyebabkan kerugian kepada aset anda yang paling berharga — perhatian pengguna.
Terima kasih kerana membaca. Selamat mengekod!
Atas ialah kandungan terperinci Petua ratikal untuk Meminimumkan Saiz Bundle JavaScript Anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!