- Cash एक बेहद छोटा jQuery विकल्प लाइब्रेरी है, जो IE11+ आधुनिक ब्राउज़रों में DOM को मैनिपुलेट करने के लिए jQuery-स्टाइल सिंटैक्स प्रदान करती है
- यह आधुनिक ब्राउज़र फीचर्स का उपयोग करके कोडबेस को छोटा रखती है और परिचित chaining methods को बहुत छोटे फ़ाइल साइज़ में उपलब्ध कराती है
- इसका लक्ष्य jQuery के साथ 100% feature parity हासिल करना नहीं है, लेकिन यह अधिकांश रोज़मर्रा के उपयोग मामलों को कवर करती है और इसका API आम तौर पर jQuery के साथ संगत है
- इसका आकार minified & gzipped आधार पर 6KB है, जो jQuery Slim 3.4.1 के 24.4KB की तुलना में 76.6% छोटा है, और partial builds से इसे और कम किया जा सकता है
- यह TypeScript codebase, कोड से जनरेट होने वाले TypeScript types, namespaced events, और अलग-अलग methods को हटाने योग्य partial builds को सपोर्ट करती है
Cash जिन समस्याओं को हल करता है
- Cash आधुनिक ब्राउज़रों के लिए एक jQuery विकल्प है, जो DOM manipulation के लिए jQuery-स्टाइल
$() selector और chainable collection methods देता है
- इसका समर्थन दायरा IE11+ ब्राउज़र हैं
- इसका लक्ष्य jQuery की हर सुविधा को हूबहू लागू करना नहीं है, लेकिन Cash द्वारा लागू की गई अधिकांश सुविधाएँ jQuery API के साथ संगत रहने के लिए डिज़ाइन की गई हैं
- jQuery से माइग्रेट करने वाले उपयोगकर्ता migration guide देख सकते हैं
आकार और फीचर तुलना
- फ़ाइल साइज़ तुलना में Cash, Zepto 1.2.0 और jQuery Slim 3.4.1 से छोटा है
- Unminified: 36.5KB
- Minified: 16KB
- Minified & Gzipped: 6KB
- jQuery Slim 3.4.1 का आकार minified & gzipped आधार पर 24.4KB है, और Cash इसके मुकाबले 76.6% आकार की बचत देता है
- अगर और छोटा bundle चाहिए, तो partial builds इस्तेमाल किए जा सकते हैं
- फीचर तुलना में Cash आधुनिक ब्राउज़र सपोर्ट, सक्रिय मेंटेनेंस, namespaced events, TypeScript codebase, और कोड से जनरेट होने वाले TypeScript types प्रदान करता है
- Partial builds में Cash अलग-अलग methods को बाहर करने देता है, जबकि Zepto और jQuery Slim में पूरे module स्तर पर exclusion दिखाया गया है
उपयोग का तरीका
- Cash को jsDelivr से लोड करके सीधे ब्राउज़र में इस्तेमाल किया जा सकता है
<script src="https://cdn.jsdelivr.net/npm/cash-dom/…;
<script>
$(function () {
$('html').addClass ( 'dom-loaded' );
$('<footer>Appended with Cash</footer>').appendTo ( document.body );
});
</script>
npm install --save cash-dom
import $ from "cash-dom";
$(function () {
$('html').addClass ( 'dom-loaded' );
$('<footer>Appended with Cash</footer>').appendTo ( document.body );
});
API संरचना
$() Cash का मुख्य selector method है, और यह मैनिपुलेट किए जा सकने वाले node collections लौटाता है
- यदि कोई function दिया जाए, तो DOM तैयार होने पर वह function चलाया जाता है
$() selector, DOM node, nodeList, HTML string, Cash collection, और document ready callback ले सकता है
- Cash मुख्य रूप से तीन तरह के API प्रदान करता है
- query selectors
- collection methods
- global
$ object की library methods
collection methods
- collection methods को
$() से collection बनाने के बाद $(element).addClass(className) जैसे तरीके से कॉल किया जाता है
- उपलब्ध श्रेणियाँ attributes, collection, CSS, data, dimensions, effects, events, forms, DOM manipulation, offsets, और traversal में बंटी हुई हैं
- मुख्य methods में ये शामिल हैं
- class/attributes:
addClass, removeClass, toggleClass, attr, prop, removeAttr
- collection processing:
add, each, eq, filter, first, get, map, slice
- DOM manipulation:
append, prepend, before, after, html, text, clone, remove, replaceWith, wrap
- events:
on, off, one, ready, trigger
- traversal:
find, children, closest, parent, parents, siblings, next, prev
- कुछ extra methods उपलब्ध हैं, लेकिन वे डिफ़ॉल्ट रूप से निष्क्रिय रहती हैं
$.fn collection का मुख्य prototype है, और इसके ज़रिए plugin की तरह सभी collections में custom methods जोड़े जा सकते हैं
global Cash methods
- global
$ object में type checking और utility methods शामिल हैं
- type checking methods में
$.isArray, $.isFunction, $.isNumeric, $.isPlainObject, $.isWindow उपलब्ध हैं
- utilities में
$.guid, $.each, $.extend, $.parseHTML, $.unique शामिल हैं
$.extend target object को source object की properties से विस्तारित करता है, और deep extension भी सपोर्ट करता है
$.parseHTML HTML string से collection लौटाता है, और $.unique duplicates हटाकर नया array लौटाता है
विस्तार और योगदान
- Cash को custom methods से बढ़ाया जा सकता है, और विस्तार का तरीका extending Cash में दिया गया है
- समस्या या feature request के लिए GitHub issue खोला जा सकता है
- Pull request workflow में repository clone करना, dependencies इंस्टॉल करना,
npm run dev से auto-recompile चलाना, npm run test से tests चलाना, और ज़रूरत पड़ने पर README अपडेट करना शामिल है
- लाइसेंस MIT है
1 टिप्पणियां
Hacker News की राय
आजकल ब्राउज़र इतने अच्छे हो गए हैं कि DOM manipulation को सरल बनाने के लिए अक्सर नीचे दिए गए दो लाइन के aliases ही काफी होते हैं
dqs = document.querySelector.bind(document);dqsA = document.querySelectorAll.bind(document);इसलिए
document.querySelector('#country')की जगहdqs('#country'), औरdocument.querySelectorAll('.city')की जगहdqsA('.city')की तरह इस्तेमाल कर सकते हैंबाकी के लिए बस native browser functions इस्तेमाल करना भी ठीक है, और आम तौर पर इन्हें
import { dqs, dqsA } from '/lib/js/dqs.js';की तरह module से लाया जाता हैhttps://github.com/no-gravity/dqs.js
querySelector/querySelectorAllको bind करने वाली ये दो लाइनें अपने-आप में उपयोगी और तार्किक लगती हैं, लेकिन उन्हेंimportकरके लाना जरूरत से ज्यादा हैबस साधारण दो लाइनें ही तो हैं; इन्हें dependency बनाने की जरूरत नहीं, सीधे copy-paste कर सकते हैं
उदाहरण के लिए कई events संभालने वाले
$.fn.one()या$.fn.on()को jQuery/Cash से इस्तेमाल करना ज्यादा आसान है, और अंदर की implementation देखें तो काफी काम है: https://github.com/fabiospampinato/cash/blob/master/src/even...querySelectorAll()live collection नहीं है, इसलिए अक्सर इसे तुरंत array में बदलकर इस्तेमाल किया जाता हैdqsA = s => Array.from(document.querySelectorAll(s));ऐसा करने पर result पर
.map()या.filter()जैसे array methods सीधे इस्तेमाल किए जा सकते हैं, इसलिए jQuery जैसा एहसास रहता हैउदाहरण के लिए testing के दौरान Safari में किसी element का
selectevent बिल्कुल fire नहीं हुआ, और कुछ browsers में सिर्फ caret move करने पर event नहीं आयाभले ही components, state, props जैसी React features की जरूरत न हो, सिर्फ native browser functions काफी नहीं थे; React DOM द्वारा browser differences को ढकने की value साफ दिखी
लगभग सारे polyfills हटाने के बाद, jQuery में बचने वाली स्थायी खूबी मुझे automatic list handling लगती है
form के अंदर सभी buttons को एक ही call में unselect करने की क्षमता अभी भी दूसरी जगह match करना मुश्किल है, और parent queries के साथ भी यही है
हालांकि implementation के लिहाज से सबसे बड़ी समस्या यह है कि list खाली होने पर यह चुपचाप fail हो जाता है
layout के मकसद से DOM tree को बाद में refactor करने पर बने ऐसे बहुत से bugs मैंने ठीक किए हैं, इसलिए अगर आज jQuery को फिर से बनाता तो default रूप से empty set पर error देता, और सच में परवाह न हो तभी chain call या flag से चुपचाप fail होने देता
पहले Sizzle को निकालकर इसे इस तरह बदल सकते हैं या नहीं, यह देखने में कुछ घंटे लगाए थे, लेकिन आगे नहीं बढ़ा
आखिरकार jQuery library बनाम framework वाली पुरानी बहस से भी जुड़ता है, और बड़े frameworks के साथ लंबे समय तक single-page apps बनाने के बाद फिर से मोहभंग की घाटी पास आती लग रही है
.fooको सब hide करने का आदेश दें तो अगर वे मौजूद हैं तो hide हो जाते हैं, नहीं हैं तो कुछ नहीं होता—यह fire and forget तरीका है, CSS जैसा.foo { color: red; }लिखा और document में.fooन हो, तो छोटे overhead के अलावा कोई side effect नहीं होताdocument.querySelectorAll('input[type=checkbox]').forEach((i) => i.checked = false);यह iterable
NodeListऔर iterator helpers का उपयोग करने वाला तरीका हैकई parent queries
element.closest()से संभाली जा सकती हैंjQuery आधारित code में हर developer को project के हर selector की जानकारी रखनी होती है और DOM बदलने पर उसे update करना होता है, जो जाहिर है असंभव है
jQuery initialization function को अपनी implementation से बदलकर length check enforce करना संभव लगता है
जब mainstream websites सचमुच megabytes में JavaScript परोस रही हैं, तो 50KB बचाने के लिए कम features वाली library को पूरी तरह फिर से लिखने की क्या वजह है, समझ नहीं आता
कई लेख package size और bandwidth constraints के कारण jQuery इस्तेमाल करने का विरोध करते हैं, और साथ ही कहीं ज्यादा bandwidth इस्तेमाल करने वाले SPA frameworks का समर्थन करते हैं
यह पूरी तरह बेतुकी cargo-cult reasoning है
तीनों मामलों में जवाब एक ही है: बड़ा वाला मैं नहीं हूं, और मैं कुछ छोटा अलग कर रहा हूं
एक और जवाब यह है कि अगर बहुत बड़ा होना समस्या है, तो छोटा होना समाधान जैसा लगता है
आखिरकार सवाल शायद यह है कि developers library को फिर से लिखने में समय क्यों लगाते हैं, लेकिन यह इतना चौंकाने वाला नहीं है
programming का बड़ा हिस्सा पहले से बनी चीजों को फिर से लिखना है—काम की जरूरत हो सकती है, थोड़ा अलग behavior या performance characteristics चाहिए हो सकते हैं, या बस यह सीखना हो सकता है कि चीज काम कैसे करती है
अगर आप jQuery का विकल्प ढूंढ रहे हैं, तो jQuery 4.0 का बहुत लंबे समय तक इंतज़ार करने के बाद आखिरकार मैंने कुछ अहम फर्क रखते हुए अपना खुद का jQuery जैसा कुछ बना लिया
animations, tweens और timelines के लिए jQuery के custom system की जगह शुद्ध CSS इस्तेमाल करता है, single element और list को transparent तरीके से संभालता है, और inline इस्तेमाल की दिशा में झुकाव रखता है
me()के बारे में लिखा है कि यह 1 element लौटाता है, या पहला element याnullलौटाता है, औरany()के बारे में लिखा है कि यह array या empty array लौटाता हैलेकिन नीचे के examples
any('button')?.forEach(...),any('button')?.map(...)जैसे हैं, जो संकेत देते हैं कि यहnullभी हो सकता हैसमझ नहीं आता कि
any()ऊपर के description की तरह हमेशा array लौटाता है, या नीचे के examples की तरहnullभी संभव हैमेरी खास दिलचस्पी behaviour की locality में है
currentScript.parentElementइस्तेमाल करने का अनुभव कैसा रहा है, यह जानना चाहूंगापिछले महीने जल्दी-जल्दी जांच करते समय मुझे लगा था कि शायद कुछ edge cases में यह भरोसेमंद नहीं है, लेकिन ठीक-ठीक कब था याद नहीं
मैंने बहुत गहराई से नहीं देखा, और खुशी है कि आपने इसे ठीक से काम करा लिया
अगर यह मान लिया जाए कि यह
asyncयाmoduleनहीं है, तो लगातार 3 scripts load करने पर भी सभी browsers मेंcurrentScript.parentElementअभी भी काम करना चाहिए, ऐसा मुझे लगता हैSvelteKit ने भी इस पर चर्चा की थी, और आखिरकार target element specify करने के लिए random ID implement किया: https://github.com/sveltejs/kit/issues/2221
migration guide देखते हुए मैंने jQuery में मौजूद लेकिन Cash में न होने वाली कुछ ऐसी capabilities के बारे में जाना, जिनके बारे में मुझे पता नहीं था और जिन्हें कभी आज़माया जा सकता है
https://github.com/fabiospampinato/cash/blob/master/docs/mig...
विस्तार के लक्ष्य के तौर पर, TypeScript template string magic इस्तेमाल करके element type को सटीक infer करना अच्छा रहेगा
उदाहरण के लिए
$('div#name')को static रूप सेHTMLDivElementinfer किया जा सकता हैtyped-query-selectorकहा जाता हैअसली usage example यहां है: https://github.com/GoogleChrome/lighthouse/blob/main/types/i...
TypeScript में यह संभव है या नहीं, मुझे नहीं पता, और यह कैसे किया जा सकता है, यह भी साफ नहीं दिखता
सुना है कि jQuery 4 modern browsers के लिए jQuery alternative है
जिस browser extension पर मैं काम कर रहा हूं, उसमें शुरुआत में मैंने इसे इस्तेमाल किया था, लेकिन आखिरकार JSX library पर चला गया
“simple app” वाली सीमा पार करते ही jQuery जल्दी ही ऐसा code बन जाता है जिसे समझना/infer करना मुश्किल होता है, और jQuery से प्रेरित library खुद बनाने वाले व्यक्ति के रूप में भी मुझे ऐसा ही लगता है
अंत में काम के हिसाब से सही tool इस्तेमाल करना चाहिए
[1]: https://github.com/aleclarson/dough
अगर आप medium-large apps में jQuery को अच्छी तरह संभाल सकते हैं तो ठीक है, लेकिन यह मेरी पसंद नहीं है
पहले जब JS कम करने की कोशिश कर रहा था, तो https://github.com/filamentgroup/shoestring इस्तेमाल किया था
मुख्य वजह यह थी कि यह सिर्फ सचमुच जरूरी चीजें शामिल करने वाला custom build देता था
Cash में भी ऐसा feature लगता है, लेकिन docs में थोड़ा ज्यादा छिपा हुआ है: https://github.com/fabiospampinato/cash/blob/master/docs/par...
अगर इस्तेमाल करूं तो शायद पहले उसी को try करूंगा
फिर भी मुझे अब भी लगता है कि आजकल browsers जो native तौर पर देते हैं, उसे सीधे इस्तेमाल करना बेहतर विकल्प है
वह सच में काफी अच्छा है, और jQuery अब जरूरी नहीं रह गया है
खासकर यह देखते हुए कि छोटा jQuery alternative भी 6kB का है, जबकि React जैसी library Preact उसका आधा size है
यह पहले से मौजूद Web API को aliases देने से ज्यादा मदद करता है या नहीं, मुझे ठीक से नहीं पता