Rumah >hujung hadapan web >tutorial js >Reka dan Bina Perpustakaan JavaScript Anda Sendiri: Petua & Trik
Bina dan siarkan perpustakaan JavaScript anda sendiri: Panduan terperinci
mata teras
Artikel ini dikaji semula oleh Adrian Sandu, Vildan Softic dan Dan Prince. Terima kasih kepada semua pengulas rakan sebaya untuk mendapatkan kandungan SitePoint dengan sebaik -baiknya!
Kami sering menggunakan perpustakaan. Perpustakaan adalah kod yang dibungkus yang boleh digunakan oleh pemaju dalam projek mereka, yang pasti menjimatkan beban kerja dan mengelakkan roda pendua. Mempunyai pakej yang boleh diguna semula (kedua-dua sumber terbuka atau sumber tertutup) adalah lebih baik daripada membina semula fungsi yang sama atau salinan-pasang secara manual dari projek masa lalu.Tetapi selain kod yang dibungkus, apakah sebenarnya perpustakaan? Dengan beberapa pengecualian, perpustakaan harus selalu menjadi satu fail, atau beberapa fail yang terletak dalam satu folder. Kodnya harus dikekalkan secara berasingan dan tetap sama apabila ia dilaksanakan ke dalam projek. Perpustakaan harus membolehkan anda menetapkan konfigurasi dan/atau tingkah laku khusus projek. Fikirkannya sebagai peranti USB yang hanya membolehkan komunikasi melalui port USB. Sesetengah peranti, seperti tikus dan papan kekunci, membolehkan konfigurasi melalui antara muka yang disediakan oleh peranti.
Dalam artikel ini, saya akan menerangkan bagaimana perpustakaan dibina. Walaupun kebanyakan topik yang dilindungi sesuai untuk bahasa lain, jawatan ini memberi tumpuan kepada membina perpustakaan JavaScript.
Mengapa membina perpustakaan JavaScript anda sendiri?
Projek sumber terbuka yang popular juga boleh membawa peluang besar. Sebuah syarikat mungkin kagum dengan kualiti pekerjaan anda dan menawarkan pekerjaan kepada anda. Mungkin syarikat akan meminta bantuan untuk mengintegrasikan projek anda ke dalam permohonan mereka. Lagipun, tiada siapa yang tahu perpustakaan anda lebih baik daripada anda.
Bagi ramai orang, ia hanya hobi - menikmati proses menulis kod, membantu orang lain, dan belajar dan berkembang dalam proses. Anda boleh menolak had anda dan mencuba perkara baru.
Skop dan Sasaran
hanya melakukan satu perkara dan lakukan dengan baik
Tanya diri anda: Apakah masalah yang diselesaikan oleh perpustakaan anda? Bagaimana anda akan menyelesaikannya? Adakah anda akan menulis semuanya sendiri atau bolehkah anda menggunakan perpustakaan orang lain?
Cuba buat peta jalan tanpa mengira saiz perpustakaan. Senaraikan semua ciri yang anda inginkan dan kemudian keluarkan ciri -ciri seberapa banyak yang anda boleh sehingga anda mempunyai perpustakaan kecil tetapi berfungsi sepenuhnya seperti produk yang paling kecil. Ini akan menjadi versi pertama anda. Dari sana, anda boleh membuat tonggak untuk setiap ciri baru. Pada asasnya, anda memecahkan projek ke dalam kepingan kecil, menjadikan setiap ciri lebih seperti pencapaian dan lebih menyeronokkan. Percayalah, ini akan membuatkan anda waras.
reka bentuk API
Ujian kualiti API akhir adalah untuk makan makanan anjing anda sendiri dan menggunakan perpustakaan anda dalam projek anda sendiri. Cuba ganti kod aplikasi dengan perpustakaan anda dan lihat sama ada ia meliputi semua ciri yang anda mahukan. Cuba buat perpustakaan sebagai nipis mungkin sambil menjadikannya cukup fleksibel untuk menjadikannya sesuai untuk situasi yang melampau mereka serta penyesuaian (seperti yang diterangkan kemudian dalam artikel ini).
Berikut adalah apa pelaksanaan atau ringkasan perpustakaan rentetan ejen pengguna mungkin kelihatan seperti:
<code>// 以空的UserAgent字符串开始 var userAgent = new UserAgent; // 创建并添加第一个产品:EvilCorpBrowser/1.2 (X11; Linux; en-us) var application = new UserAgent.Product('EvilCorpBrowser', '1.2'); application.setComment('X11', 'Linux', 'en-us'); userAgent.addProduct(application); // 创建并添加第二个产品:Blink/20420101 var engine = new UserAgent.Product('Blink', '20420101'); userAgent.addProduct(engine); // EvilCorpBrowser/1.2 (X11; Linux; en-us) Blink/20420101 userAgent.toString(); // 对引擎产品进行更多更改 engine.setComment('Hello World'); // EvilCorpBrowser/1.2 (X11; Linux; en-us) Blink/20420101 (Hello World) userAgent.toString(); </code>
Bergantung pada kerumitan perpustakaan, anda juga mungkin perlu mempertimbangkan struktur. Menggunakan corak reka bentuk adalah cara terbaik untuk membina perpustakaan atau mengatasi masalah teknikal tertentu. Ia juga mengurangkan risiko refactoring kebanyakan kod apabila menambah ciri -ciri baru.
Apa yang menjadikan perpustakaan berkuasa adalah fleksibiliti, tetapi juga sukar untuk menarik garis antara apa yang anda boleh menyesuaikan dan apa yang anda tidak dapat. Contoh yang sempurna ialah Chart.js dan D3.Js. Kedua -duanya adalah perpustakaan yang sangat baik untuk menggambarkan data. Chart.js menjadikannya sangat mudah untuk membuat dan menubuhkan pelbagai jenis carta terbina dalam. Walau bagaimanapun, jika anda memerlukan lebih banyak kawalan ke atas grafik, anda perlu menggunakan d3.js. Terdapat beberapa cara untuk memberi kawalan pengguna: konfigurasi, mendedahkan kaedah awam, dan melalui panggilan balik dan acara.
Konfigurasi perpustakaanbiasanya dilakukan semasa permulaan, tetapi beberapa perpustakaan membolehkan anda mengubah suai pilihan pada masa runtime. Pilihan biasanya terhad kepada butiran, menukar pilihan ini tidak boleh melakukan apa -apa kecuali mengemas kini nilai -nilai ini untuk kegunaan kemudian.
Kaedah boleh didedahkan untuk berinteraksi dengan keadaan, seperti mengambil data dari keadaan, meletakkan data ke dalam keadaan (setter), dan melakukan operasi.
<code>// 在初始化时配置 var userAgent = new UserAgent({ commentSeparator: ';' }); // 使用公共方法进行运行时配置 userAgent.setOption('commentSeparator', '-'); // 使用公共属性进行运行时配置 userAgent.commentSeparator = '-'; </code>
panggil balik kadang -kadang diluluskan bersama dengan kaedah awam, biasanya menjalankan kod pengguna selepas tugas tak segerak.
<code>var userAgent = new UserAgent; // 获取器,用于从所有产品中检索注释 userAgent.getComments(); // 用于打乱所有产品顺序的操作 userAgent.shuffleProducts(); </code>
Acara mempunyai potensi besar. Mereka sama dengan panggilan balik, kecuali penambahan pengendali acara tidak boleh mencetuskan tindakan. Peristiwa biasanya digunakan untuk menunjukkan (anda mungkin telah meneka) peristiwa! Sama seperti panggilan balik, anda boleh memberikan maklumat tambahan dan nilai pulangan yang boleh digunakan oleh perpustakaan.
<code>var userAgent = new UserAgent; userAgent.doAsyncThing(function asyncThingDone() { // 异步操作完成后运行代码 }); </code>
Dalam beberapa kes, anda mungkin mahu membenarkan pengguna melanjutkan perpustakaan anda. Untuk melakukan ini, anda boleh mendedahkan kaedah atau harta awam untuk pengguna mengisi, seperti modul sudut (angular.module ('mymodule')) dan jQuery's fn (jQuery.fn.myplugin), atau berbuat apa -apa, hanya berikan pengguna akses pengguna ke ruang nama perpustakaan anda:
<code>var userAgent = new UserAgent; // 验证添加的产品 userAgent.on('product.add', function onProductAdd(e, product) { var shouldAddProduct = product.toString().length // 告诉库添加或不添加产品 return shouldAddProduct; }); </code>
Sekali lagi, ini membolehkan anda mengatasi kaedah.
<code>// AngryUserAgent 模块 // 可以访问UserAgent命名空间 (function AngryUserAgent(UserAgent) { // 创建新的方法 .toAngryString() UserAgent.prototype.toAngryString = function() { return this.toString().toUpperCase(); }; })(UserAgent); // 应用程序代码 var userAgent = new UserAgent; // ... // EVILCORPBROWSER/1.2 (X11; LINUX; EN-US) BLINK/20420101 userAgent.toAngryString(); </code>
Dalam kes yang kedua, membolehkan pengguna mengakses ruang nama perpustakaan anda akan mengurangkan kawalan anda ke atas bagaimana sambungan/plugin ditakrifkan. Untuk memastikan bahawa lanjutan mengikuti konvensyen tertentu, anda boleh (dan harus) menulis dokumentasi.
<code>// AngryUserAgent 模块 (function AngryUserAgent(UserAgent) { // 存储旧的 .toString() 方法以供以后使用 var _toString = UserAgent.prototype.toString; // 覆盖 .toString() UserAgent.prototype.toString = function() { return _toString.call(this).toUpperCase(); }; })(UserAgent); var userAgent = new UserAgent; // ... // EVILCORPBROWSER/1.2 (X11; LINUX; EN-US) BLINK/20420101 userAgent.toString(); </code>
ujian
Jani Hartikainen menerangkan cara menulis ujian unit dalam "Menggunakan Mocha dan Chai untuk Unit Menguji JavaScript anda". Dalam "Ujian JavaScript dengan Jasmine, Travis, dan Karma", Tim Evko menunjukkan bagaimana untuk menubuhkan saluran paip ujian yang hebat dengan rangka kerja lain yang dipanggil Jasmine. Kedua -dua kerangka ujian ini sangat popular, tetapi terdapat banyak jenis kerangka lain.
Ringkasan yang saya buat sebelum ini dalam artikel ini telah mengulas mengenai output yang diharapkan. Di sinilah semua ujian bermula: bermula dengan jangkaan. Ujian Jasmine untuk perpustakaan saya adalah seperti berikut:
<code>// 以空的UserAgent字符串开始 var userAgent = new UserAgent; // 创建并添加第一个产品:EvilCorpBrowser/1.2 (X11; Linux; en-us) var application = new UserAgent.Product('EvilCorpBrowser', '1.2'); application.setComment('X11', 'Linux', 'en-us'); userAgent.addProduct(application); // 创建并添加第二个产品:Blink/20420101 var engine = new UserAgent.Product('Blink', '20420101'); userAgent.addProduct(engine); // EvilCorpBrowser/1.2 (X11; Linux; en-us) Blink/20420101 userAgent.toString(); // 对引擎产品进行更多更改 engine.setComment('Hello World'); // EvilCorpBrowser/1.2 (X11; Linux; en-us) Blink/20420101 (Hello World) userAgent.toString(); </code>
Sebaik sahaja anda berpuas hati dengan versi pertama reka bentuk API, sudah tiba masanya untuk mula memikirkan seni bina dan bagaimana perpustakaan anda akan digunakan.
anda mungkin atau tidak boleh menggunakan pemuat modul. Walau bagaimanapun, pemaju yang memilih untuk melaksanakan perpustakaan anda boleh menggunakannya, jadi anda mahu perpustakaan anda bersesuaian dengan Loader Modul. Tetapi yang mana? Bagaimanakah anda memilih antara CommonJs, RequireJs, AMD dan pemuat modul lain?
Sebenarnya, anda tidak perlu memilih! Definisi Modul Universal (UMD) adalah satu lagi strategi yang direka untuk menyokong pelbagai pemuat modul. Anda boleh menemui versi coretan kod yang berbeza dalam talian, dan anda juga boleh mencari versi UMD yang berbeza di repositori UMD Github untuk menjadikan perpustakaan anda serasi dengan UMD. Mulakan perpustakaan anda dengan salah satu templat, atau tambahkan UMD dengan alat binaan kegemaran anda, dan anda tidak perlu bimbang tentang pemuat modul.
Jika anda ingin menggunakan sintaks import/eksport ES2015, saya sangat mengesyorkan menggunakan Babel untuk disusun ke ES5, digabungkan dengan plugin UMD Babel. Dengan cara ini, anda boleh menggunakan ES2015 dalam projek anda semasa masih menjana perpustakaan yang sesuai untuk semua orang.
Saya benar -benar memihak kepada dokumentasi menyeluruh semua projek, tetapi ini sering dianggap banyak kerja, ditangguhkan dan akhirnya dilupakan.
Dokumentasi harus selalu bermula dengan maklumat asas, seperti nama projek dan perihalan. Ini akan membantu orang lain memahami fungsi perpustakaan anda dan sama ada ia berfungsi untuk mereka.
Anda boleh memberikan maklumat tambahan, seperti skop dan matlamat, untuk memaklumkan pengguna dengan lebih baik, serta peta jalan supaya mereka tahu apa yang akan berlaku pada masa akan datang atau bagaimana mereka dapat menyumbang.
Sudah tentu, anda perlu membiarkan pengguna mengetahui cara menggunakan perpustakaan anda. Ini bermula dengan dokumentasi API. Tutorial dan contoh adalah penambahan yang hebat, tetapi menulis ini boleh mengambil banyak kerja. Walau bagaimanapun, ini tidak berlaku dengan dokumentasi sebaris. Ini adalah komen yang boleh dihuraikan dan ditukar ke halaman dokumen menggunakan JSDOC.
Sesetengah pengguna mungkin mahu menukar perpustakaan anda. Dalam kebanyakan kes, ini akan menjadi sumbangan, tetapi sesetengah orang mungkin ingin membuat versi tersuai untuk kegunaan peribadi. Bagi pengguna ini, dokumen yang mengandungi metatasks berguna, seperti senarai arahan untuk perpustakaan bangunan, ujian menjalankan, menjana, menukar, atau memuat turun data, dll.
Sumbangan sangat penting apabila anda membuka sumber perpustakaan anda. Untuk membimbing penyumbang, anda boleh menambah dokumentasi kepadanya, menerangkan langkah -langkah untuk menyumbang dan kriteria yang perlu dipenuhi. Ini akan memudahkan anda mengkaji semula dan menerima sumbangan dan memudahkan mereka menyumbang dengan betul.
Terakhir tetapi tidak kurang, sila sertakan lesen. Secara teknikal, jika anda memilih untuk tidak memasukkan lesen, ia masih berhak cipta, tetapi tidak semua orang tahu ini.
Saya dapati pilihanikence.com untuk menjadi sumber yang hebat untuk anda memilih lesen tanpa menjadi pakar undang -undang. Selepas memilih lesen, simpan teks dalam fail Lesen.TXT dalam direktori root projek.
versi adalah penting untuk perpustakaan yang baik. Jika anda memilih untuk membuat perubahan yang ketara, pengguna mungkin mahu terus menggunakan versi yang berfungsi untuk mereka.
Kriteria penamaan versi de facto semasa adalah kawalan versi semantik, atau Semver. Versi Semver terdiri daripada tiga nombor, masing -masing mewakili perubahan yang berbeza: versi utama, kecil, dan patch.
Jika anda mempunyai repositori git, anda boleh menambah nombor versi ke repositori. Anda boleh memikirkannya sebagai gambar repositori. Kami menyebutnya label. Untuk membuat tag, buka terminal dan jenis:
<code>// 以空的UserAgent字符串开始 var userAgent = new UserAgent; // 创建并添加第一个产品:EvilCorpBrowser/1.2 (X11; Linux; en-us) var application = new UserAgent.Product('EvilCorpBrowser', '1.2'); application.setComment('X11', 'Linux', 'en-us'); userAgent.addProduct(application); // 创建并添加第二个产品:Blink/20420101 var engine = new UserAgent.Product('Blink', '20420101'); userAgent.addProduct(engine); // EvilCorpBrowser/1.2 (X11; Linux; en-us) Blink/20420101 userAgent.toString(); // 对引擎产品进行更多更改 engine.setComment('Hello World'); // EvilCorpBrowser/1.2 (X11; Linux; en-us) Blink/20420101 (Hello World) userAgent.toString(); </code>
Banyak perkhidmatan (seperti GitHub) akan memberikan gambaran keseluruhan semua versi dan pautan muat turun untuk setiap versi.
node.js (enjin JavaScript yang berdiri sendiri) dilengkapi dengan npm. Jika anda tidak biasa dengan NPM, kami mempunyai panduan pemula yang hebat.
Secara lalai, pakej NPM anda akan diterbitkan secara terbuka. Jangan risau! Anda juga boleh menerbitkan pakej peribadi, menyediakan pendaftaran peribadi, atau mengelakkan penerbitan sama sekali.
Untuk menerbitkan pakej anda, projek anda memerlukan fail pakej.json. Anda boleh melakukan ini secara manual atau menggunakan wizard interaktif. Untuk memulakan wizard, ketik:
Atribut versi
sepadan dengan tag git anda. Juga, pastikan anda mempunyai fail ReadMe.md. Sama seperti GitHub, NPM menggunakannya sebagai halaman yang menjadikan pakej anda.<code>// 在初始化时配置 var userAgent = new UserAgent({ commentSeparator: ';' }); // 使用公共方法进行运行时配置 userAgent.setOption('commentSeparator', '-'); // 使用公共属性进行运行时配置 userAgent.commentSeparator = '-'; </code>Selepas
, anda boleh menerbitkan pakej anda dengan menaip arahan berikut:
itu sahaja! Anda telah menyiarkan pakej NPM anda.
<code>var userAgent = new UserAgent; // 获取器,用于从所有产品中检索注释 userAgent.getComments(); // 用于打乱所有产品顺序的操作 userAgent.shuffleProducts(); </code>
Bower
Jika anda tidak biasa dengan Bower, kami juga mempunyai panduan pemula.
Seperti NPM, anda juga boleh menyediakan repositori swasta. Anda juga boleh menghalangnya daripada menerbitkan sepenuhnya dalam Wizard.
Menariknya, sepanjang tahun atau dua tahun lalu, ramai orang nampaknya beralih ke NPM untuk sumber-sumber front-end. Walaupun pakej NPM terutamanya JavaScript, banyak pakej front-end juga dikeluarkan pada NPM. Sama ada cara, Bower masih sangat popular, jadi saya pasti mengesyorkan anda menyiarkan pakej anda kepada Bower juga.
Adakah saya menyebut bahawa Bower sebenarnya adalah modul NPM dan pada mulanya diilhamkan olehnya? Perintah sangat serupa. Untuk menjana fail Bower.json, taip:
<code>// 以空的UserAgent字符串开始 var userAgent = new UserAgent; // 创建并添加第一个产品:EvilCorpBrowser/1.2 (X11; Linux; en-us) var application = new UserAgent.Product('EvilCorpBrowser', '1.2'); application.setComment('X11', 'Linux', 'en-us'); userAgent.addProduct(application); // 创建并添加第二个产品:Blink/20420101 var engine = new UserAgent.Product('Blink', '20420101'); userAgent.addProduct(engine); // EvilCorpBrowser/1.2 (X11; Linux; en-us) Blink/20420101 userAgent.toString(); // 对引擎产品进行更多更改 engine.setComment('Hello World'); // EvilCorpBrowser/1.2 (X11; Linux; en-us) Blink/20420101 (Hello World) userAgent.toString(); </code>Sama seperti NPM init, penjelasannya jelas. Akhirnya, siarkan pakej anda:
<code>// 在初始化时配置 var userAgent = new UserAgent({ commentSeparator: ';' }); // 使用公共方法进行运行时配置 userAgent.setOption('commentSeparator', '-'); // 使用公共属性进行运行时配置 userAgent.commentSeparator = '-'; </code>itu sahaja, anda telah menyiarkan perpustakaan anda ke internet untuk semua orang menggunakan projek nod mereka dan/atau di web!
Kesimpulan
Banyak tugas yang saya nyatakan adalah mudah untuk mengautomasikan, seperti ujian berjalan, membuat tag, mengemas kini versi dalam pakej.json, dan menerbitkan semula pakej anda ke NPM dan Bower. Di sinilah anda masuk ke dalam bidang integrasi berterusan dan menggunakan alat seperti Travis CI atau Jenkins. Saya sebutkan tadi mengenai artikel Tim Evko juga menyentuh perkara ini.
Adakah anda membina dan menerbitkan perpustakaan? Sila kongsi di bahagian komen di bawah!
Soalan Lazim (Soalan Lazim) untuk Merancang dan Membina Perpustakaan JavaScript Anda Sendiri
Bagaimana saya mula membuat perpustakaan JavaScript?
Bagaimana saya menguji perpustakaan JavaScript saya?
Bagaimana saya merakam perpustakaan JavaScript saya?
Terdapat pelbagai cara untuk mengedarkan perpustakaan JavaScript. Cara yang sama adalah untuk menerbitkannya kepada pengurus pakej seperti NPM. Ini membolehkan pemaju lain dengan mudah memasang perpustakaan anda menggunakan arahan mudah. Anda juga boleh mengedarkan perpustakaan anda dengan menganjurkannya pada CDN (rangkaian pengedaran kandungan) atau menyediakan pautan muat turun di laman web anda.
Mengekalkan perpustakaan JavaScript termasuk menetapkan pepijat, menambah ciri -ciri baru, dan mengekalkan perpustakaan selaras dengan standard dan amalan JavaScript terkini. Adalah penting untuk menguji perpustakaan anda dengan kerap dan mendengar maklum balas pengguna. Anda juga boleh mempertimbangkan versi perpustakaan anda supaya pengguna boleh memilih untuk menggunakan versi stabil atau versi terkini dengan ciri -ciri baru.
Untuk memastikan perpustakaan JavaScript anda adalah cekap, anda harus memberi tumpuan kepada menulis ringkas dan jelas. Elakkan pengiraan dan peruntukan memori yang tidak perlu. Gunakan alat seperti Chrome Devtools untuk menganalisis perpustakaan anda dan mengenal pasti sebarang kesesakan prestasi. Anda juga boleh mempertimbangkan memampatkan perpustakaan anda untuk mengurangkan saiz failnya dan meningkatkan masa pemuatan.
Oleh kerana setiap pelayar menafsirkan JavaScript secara berbeza, memastikan keserasian penyemak imbas dapat menjadi cabaran. Anda boleh menggunakan alat seperti Babel untuk menukar kod anda menjadi versi JavaScript yang serasi dengan pelayar yang lebih tua. Anda juga harus menguji perpustakaan anda dalam penyemak imbas yang berbeza untuk mengenal pasti dan menyelesaikan sebarang masalah keserasian.
Pengendalian ralat adalah bahagian penting dalam membangunkan perpustakaan JavaScript. Anda harus berusaha untuk memberikan mesej ralat yang jelas dan berguna untuk membantu pengguna memahami apa yang salah. Anda boleh menggunakan blok cuba/menangkap untuk menangkap dan mengendalikan kesilapan. Anda juga boleh mempertimbangkan untuk memberikan cara untuk membiarkan pengguna melaporkan kesilapan dan masalah.
Terdapat beberapa cara untuk mendapatkan maklum balas mengenai perpustakaan JavaScript anda. Anda boleh meminta pemaju lain untuk menyemak kod anda, menyiarkan perpustakaan anda ke forum atau media sosial, atau menyiarkannya kepada pengurus pakej seperti NPM dan mendapatkan maklum balas. Anda harus terbuka untuk kritikan dan bersedia membuat perubahan berdasarkan maklum balas yang anda terima.
Atas ialah kandungan terperinci Reka dan Bina Perpustakaan JavaScript Anda Sendiri: Petua & Trik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!