


Membersih & mempercepatkan ekosistem JS - Perjalanan setakat ini
Sejak sekian lama, saya telah bekerja keras untuk meningkatkan prestasi merentas ekosistem. Biasanya melalui pembersihan pokok pergantungan yang sudah tua, mengurangkan tapak kaki pemasangan dan meningkatkan prestasi CPU/memori bagi kebergantungan yang biasa digunakan.
Catatan blog ini hanyalah percubaan ringkas saya untuk menerangkan beberapa perjalanan yang membawa kepada e18e dan pembersihan ekosistem.
Pemikiran tentang utiliti mikro
Utiliti mikro ialah penyumbang utama kepada saiz pemasangan dan, lebih-lebih lagi, kerumitan pokok pergantungan bagi banyak projek.
Pakej seperti is-number dan is-nan sesuai dengan kategori ini.
Yang penting, kebanyakan pakej ini mempunyai kegunaan dalam sesetengah situasi tetapi pastinya bukan dalam kes penggunaan biasa.
Biasanya ia boleh diganti dalam situasi ini:
- Ia ditulis pada masa ketika fungsi asli yang setara tidak wujud, tetapi kini wujud
- Mereka melakukan lebih daripada apa yang pengguna perlukan
Contoh: ialah-nombor
Sebagai contoh, is-number menentukan sama ada nilai ialah nombor atau rentetan seperti nombor yang bukan NaN atau +/-Infiniti.
Dalam sesetengah projek, ini adalah bahagian berulang pengesahan yang mungkin lebih baik diekstrak ke dalam modul atau pakejnya sendiri.
Walau bagaimanapun, dalam kes biasa, ramai pengguna tidak memerlukan pengesahan NaN dan Infiniti, malah untuk menyokong rentetan seperti nombor.
Ini membuka beberapa kemungkinan penambahbaikan dalam pelbagai projek. Kami boleh menggantikan penggunaan pakej ini dalam projek tersebut dengan logik sebaris yang lebih mudah (cth. dalam banyak projek dunia sebenar, kami selamat beralih kepada typeof n === 'nombor' kerana projek tersebut kemudiannya diandaikan dan bergantung pada nilai sebagai nilai sebenar nombor pula).
Contoh lain: is-regexp
Anda boleh menguji bahawa sesuatu ialah ungkapan biasa menggunakan instanceof: v instanceof RegExp.
Walau bagaimanapun, dalam sesetengah situasi (mis. menggunakan konteks maya), ini tidak akan berfungsi kerana RegExp bukan kelas yang sama yang v berasal. Dalam kes tersebut, kita perlu menggunakan sesuatu seperti ini:
Object.prototype.toString.call(obj) === '[object RegExp]'
Jika anda tidak mahu menyelaraskan kod tersebut dan perlu menyokong konteks maya atau yang serupa, mungkin perpustakaan masuk akal.
Walau bagaimanapun, dalam banyak kes, projek tidak menyokong konteks maya (dan tidak mahu). Itu membuka peluang kepada kami untuk memudahkan lagi kepada contoh mudah.
Menyokong masa jalan yang lebih lama
Satu lagi bidang potensi penambahbaikan ialah sokongan masa jalan yang lebih lama.
Agak banyak pakej yang sangat popular mempunyai pokok pergantungan yang sangat mendalam bagi pelbagai modul seperti polyfill. Ini biasanya wujud atas satu atau kedua-dua sebab berikut:
- Untuk melindungi daripada gangguan ruang nama global
- Untuk mengekalkan sokongan dalam masa jalan yang tidak mempunyai fungsi ini
Ramai di antara kita tidak memerlukan tahap keserasian ke belakang ini dan boleh memperoleh keuntungan prestasi yang besar jika kita boleh mengurangkannya.
Adalah penting untuk diperhatikan, sudah tentu, masih ada orang yang melakukan perlu bekerja dalam kekangan tersebut. Itulah sebabnya di kawasan ini, kami sering menyediakan garpu atau alternatif daripada cuba menukar pakej sedia ada (yang tidak akan terbuka kepada perubahan sedemikian).
Bermula untuk memperbaiki keadaan
Saya mula memikirkan kawasan tertentu ini pada tahun 2018 atau lebih, selepas melihat betapa besar dan mendalamnya node_modules saya untuk projek terkecil sekalipun.
Beberapa percubaan pertama saya untuk menukar ialah mencipta sejenis pemalam ESLint yang boleh mengesan pakej ini dan mencadangkan ia dialih keluar. Setiap beberapa bulan, saya akan mempunyai idea yang sama dan mencuba lagi tetapi tidak pernah sampai ke tempat yang saya inginkan.
Sepanjang masa ini, saya sekurang-kurangnya menyumbang kepada pelbagai projek besar untuk membersihkan dan menambah baik apa yang saya boleh (cth. yang saya telah sumbangkan untuk masa yang lama ialah buku cerita).
Pembersihan ekosistem
Saya kemudian mencipta pembersihan ekosistem, repositori untuk meningkatkan kemungkinan peningkatan prestasi merentas ekosistem (pada asasnya penjejak isu). Sekali lagi, ini pada asasnya saya dan penjejak isu peribadi saya sendiri untuk beberapa lama, tetapi sekurang-kurangnya ia boleh dilihat secara terbuka.
Tidak lama selepas itu, saya mula melihat orang ramai muncul dalam isu dan menyumbang kepada projek huluan. Saya sangat gembira melihat ini kerana saya telah menghabiskan masa bertahun-tahun untuk menyelesaikan perkara ini sendirian, dan tertanya-tanya sama ada saya membuat perubahan. Untuk melihat orang lain turut serta sangat membantu dalam mengetahui orang lain mengambil berat.
Penggantian modul
Walaupun projek pembersihan itu telah dan masih sangat berguna, kami sebenarnya tidak mempunyai tempat untuk berkongsi dengan seluruh komuniti tentang alternatif yang baik yang wujud.
Untuk menyelesaikannya, saya mencipta projek penggantian modul.
Projek ini pada asasnya memegang beberapa senarai JSON modul yang mungkin boleh diganti dan alternatif yang dicadangkan. Ini kini dibahagikan kepada tiga tahap "ketegasan" atau "berpendapat": asli (modul yang boleh digantikan dengan fungsi asli), utiliti mikro (modul yang mungkin boleh digantikan dengan kod sebaris ringkas), dan pilihan (modul yang kami fikirkan. harus diganti dengan alternatif yang lebih berprestasi).
Codemods
Langkah seterusnya projek penggantian adalah untuk mencipta satu set codemod supaya kami boleh mengautomasikan penggantian beberapa modul ini.
Didorong oleh @passle, projek ini dengan cepat menerima sejumlah besar sumbangan dalam bentuk pelbagai codemod.
Pasukan codemod juga telah melakukan beberapa kerja yang baik untuk memindahkan ini ke platform codemod. Pada masa hadapan, kami juga mahu menyediakannya melalui beberapa jenis peraturan CLI atau auto fix.
e18e
Titik perubahan di mana saya rasa kita semua yang mengambil berat tentang perkara ini bertemu antara satu sama lain ialah e18e.
Bjorn sedang melakukan beberapa kerja hebat untuk meningkatkan prestasi astro, dan Marvin juga menulis tentang mempercepatkan ekosistem. Akhirnya, laluan kami bertemu dan kami mengadakan beberapa perbincangan yang hebat di sebelah.
Sekumpulan kecil kami bekerjasama untuk melihat sama ada kami semua berada di halaman yang sama dan jika ada komuniti yang perlu dibina daripada ini. Kemudian datang e18e!
Dibina untuk menjadi ruang komuniti untuk orang ramai bekerjasama dalam meningkatkan prestasi ekosistem, ini telah menunjukkan kepada kami betapa ramai orang mengambil berat tentang perkara ini. Ramai yang telah menyertai dan telah menyumbangkan jumlah yang besar. Kami melihat peningkatan kelajuan dan pengurangan saiz hampir setiap hari di seluruh ekosistem.
Sedikit terima kasih
Komuniti berkembang pesat dan mempunyai terlalu ramai orang untuk berterima kasih atas sumbangan tersebut. Walau bagaimanapun, saya ingin mengucapkan terima kasih kepada mereka khususnya kerana membantu mewujudkan komuniti ini:
- @patak
- @antfu7
- @bluwyoo
- @passle_
Begitu juga, mereka yang telah pun mengusahakan projek yang menyumbang kepada matlamat yang sama secara selari:
- @asleMammadam melalui tinylibs
- pi0 melalui unjs
Atas ialah kandungan terperinci Membersih & mempercepatkan ekosistem JS - Perjalanan setakat ini. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Kedua -dua pilihan Python dan JavaScript dalam persekitaran pembangunan adalah penting. 1) Persekitaran pembangunan Python termasuk Pycharm, Jupyternotebook dan Anaconda, yang sesuai untuk sains data dan prototaip cepat. 2) Persekitaran pembangunan JavaScript termasuk node.js, vscode dan webpack, yang sesuai untuk pembangunan front-end dan back-end. Memilih alat yang betul mengikut keperluan projek dapat meningkatkan kecekapan pembangunan dan kadar kejayaan projek.

C dan C memainkan peranan penting dalam enjin JavaScript, terutamanya digunakan untuk melaksanakan jurubahasa dan penyusun JIT. 1) C digunakan untuk menghuraikan kod sumber JavaScript dan menghasilkan pokok sintaks abstrak. 2) C bertanggungjawab untuk menjana dan melaksanakan bytecode. 3) C melaksanakan pengkompil JIT, mengoptimumkan dan menyusun kod hot-spot semasa runtime, dan dengan ketara meningkatkan kecekapan pelaksanaan JavaScript.

Python lebih sesuai untuk sains data dan automasi, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python berfungsi dengan baik dalam sains data dan pembelajaran mesin, menggunakan perpustakaan seperti numpy dan panda untuk pemprosesan data dan pemodelan. 2. Python adalah ringkas dan cekap dalam automasi dan skrip. 3. JavaScript sangat diperlukan dalam pembangunan front-end dan digunakan untuk membina laman web dinamik dan aplikasi satu halaman. 4. JavaScript memainkan peranan dalam pembangunan back-end melalui Node.js dan menyokong pembangunan stack penuh.
