2011-04-04 10 views
8

हे सब, यह किसी भी चीज़ से अधिक दर्शन प्रश्न है। मैंने अपना पहला वेब ऐप लिखा है, बोस्टन इवेंट कैलेंडर http://bloozit.com पर मैंने इसे पायथन में लिखा है, और मैं इसकी सादगी से बहुत खुश हूं, हालांकि, मेरे पायथन में एचटीएमएल, सीएसएस और जावास्क्रिप्ट के ब्लब्स शामिल हैं, जैसे स्टू मछली के सिर और आंखों में तैरते हुए।वेब ऐप्स में भाषा एकरूपता का कितना लाभ है?

फिर मैंने इस ट्यूटोरियल को लिस्प का उपयोग करके वेब ऐप्स पर देखा: http://www.adampetersen.se/articles/lispweb.htm मैंने लिस्प पर पढ़ा है और लिस्प में कुछ सॉफ़्टवेयर लिखे हैं, इसलिए मैं पॉल ग्राहम नहीं हूं, लेकिन मैं इससे परिचित हूं। एक चीज जिसने मुझे अपील की थी कि लेखक ने लिस्पी से HTML और जावास्क्रिप्ट दोनों को कैसे उत्पन्न किया, जिससे पूरी चीज अच्छी और सजातीय हो गई।

सवाल यह है कि असली दुनिया में एकरूपता कितनी मूल्यवान है? जब भी कुछ गलत हो जाता है, तो आपको पेज को फायरबग में लोड करना होगा, और फिर आप जेनरेट किए गए एचटीएमएल, सीएसएस और जावास्क्रिप्ट को देखेंगे, लिस्प स्रोत नहीं, इसलिए आपको अपने सिर में मैपिंग रखना होगा। क्या लिस्प द्वारा प्रदान की गई एकरूपता वास्तव में कुछ भी हल करती है, या समस्या पर सिर्फ वॉलपेपर, जो अंत में फिर से नीचे की ओर आती है?

यदि वहां कोई भी व्यक्ति है जो वास्तव में दोनों दृष्टिकोणों की कोशिश करता है, तो मैं वास्तव में आपको सुनना चाहता हूं!

उत्तर

5

ठीक है, मैंने पेरेंटस्क्रिप्ट और एचटी-एजेक्स के साथ एक वर्ष कोडिंग बिताई और आखिरकार छोड़ दिया और हाथ से जावास्क्रिप्ट उत्पन्न किया (अभी भी सर्वर पर hunchentoot का उपयोग कर)। मैंने पाया कि परिणाम अधिक अनुमानित था और, जैसा कि आप अपने प्रश्न में अंतर्निहित थे, इसने फ़ायरबग का उपयोग करते समय क्या हो रहा था यह पता लगाने में बहुत आसान बना दिया। (मैंने jquery का उपयोग करने के लिए भी स्विच किया, जो एचटी-एजेक्स से काफी बेहतर था, लेकिन यह वास्तव में नहीं है कि आप क्या पूछ रहे हैं)।

उसने कहा, मैं बड़े पैमाने पर क्ल-जो (http://weitz.de/cl-who/) की अनुशंसा करता हूं, जो एचटीएमएल की गतिशील पीढ़ी को बहुत साफ बनाता है।

1

जावास्क्रिप्ट वास्तव में सीएसएस और एचटीएमएल से अलग श्रेणी में है यदि आप parenscript की तरह कुछ कर रहे हैं। ऐसा लगता है कि अगर वास्तव में अच्छा किया तो यह अच्छा हो सकता है। हालांकि, मुझे ऐसा उदाहरण नहीं मिला है। मैंने माता-पिता की कोशिश नहीं की है, लेकिन रूपर्ट का जवाब इसके बारे में अच्छी तरह से बात नहीं करता है। व्यक्तिगत रूप से मैं coffescript का उपयोग करता हूं, जो जावास्क्रिप्ट में मौजूदा भाषा को मैप करने की बजाए इसके ऊपर एक बेहतर बनाता है। आप जानते हैं कि यह क्या उत्पन्न करेगा क्योंकि यह जावास्क्रिप्ट के लिए बहुत साफ रूप से मानचित्र करता है, और इससे डीबग करना आसान हो जाता है।

यदि आप बस अपने एप्लिकेशन से जावास्क्रिप्ट में मूल्य डालना चाहते हैं, तो सिद्धांत HTML और CSS के लिए ऐसा करने के समान हैं। नीचे मैं रूबी वेब डेवलपर के रूप में अपने अनुभव से बात करूंगा और हैकेल वेब फ्रेमवर्क Yesod में योगदानकर्ता के रूप में - लेकिन मुझे लगता है कि यह किसी भी भाषा में वेब विकास के लिए सामान्यीकृत है।

एचटीएमएल उत्पन्न करने के लिए एक डीएसएल के रूप में एक HTML टेम्पलेट के बारे में सोचें। टैग नामों से पहले कॉलन का एक गुच्छा रख रहा है (या अन्य भाषाओं/टैग टैग नाम फ़ंक्शन कॉल करने में) वास्तव में डीएसएल में सुधार है? स्पष्ट रूप से यह उस भाषा में जूता-सुबह HTML है जहां कोई आसानी से टेम्पलेट भाषा को बेहतर बनाने के बजाय टेम्पलेट में हेरफेर कर सकता है।

लिस्प कोड को टैग बंद करने की आवश्यकता नहीं है, लेकिन टेम्पलेट को क्यों नहीं होना चाहिए इसका कोई कारण नहीं है। HAML मूल रूप से रूबी में लिखा गया एक बहुत ही शक्तिशाली और DRY templating भाषा है, जिनकी अवधारणाओं को अब अन्य भाषाओं में भेज दिया गया है, और विभिन्न वाक्यविन्यास वाले अन्य टेम्पलेटिंग भाषाएं हैं जो बंद टैग लिखने के बजाय सफेद-स्थान आधारित लेआउट की महत्वपूर्ण अवधारणा को बनाए रखती हैं। HAML के साथ मेरी समस्या यह है कि यह पूरी तरह से HTML वाक्यविन्यास को त्याग देता है। मुझे लगता है कि यह कोड में बजाय HAML में जूता-सुबह HTML है। यसोड वेब ढांचे में हमने एचएएमएल अवधारणा ली है, लेकिन सामान्य एचटीएमएल सिंटैक्स का इस्तेमाल किया DRY- हम इसे hamlet कहते हैं।

कोड में सभी एचटीएमएल पैदा करने के लिए कारणों में से एक है, क्योंकि अन्यथा यह सीधे code- में कुछ अपने टेम्पलेट के टुकड़े की रहना हम समाधान कर लिया है कि अच्छी तरह से गांव में अन्य भाषाओं में Haskell के quasiquotes- का उपयोग कर बोझिल हो सकता है आपको फ़ंक्शन कॉल और मल्टी-लाइन स्ट्रिंग की आवश्यकता हो सकती है, जो मल्टी-लाइन स्ट्रिंग सिंटैक्स के आधार पर भिन्न डिग्री के लिए अधिक बोझिल है।

ये अवधारणाएं सीएसएस के साथ समान रूप से अच्छी तरह से काम करती हैं। एचएएमएल उपयोगकर्ता एसएएसएस या एससीएसएस का उपयोग करते हैं, (जिसे हम अनिवार्य रूप से यसोड को भी पोर्ट कर रहे हैं)। Here are python equivalents

तो टेम्पलेट्स एक सिंटैक्स का प्रतिनिधित्व करते हैं जो सभी एचटीएमएल कोड के साथ मेल नहीं खाते हैं। यदि कोई टेम्पलेट आपको HTML उत्पन्न करने वाले सहायक फ़ंक्शन को आमंत्रित करने की अनुमति देता है, तो आपने अधिक शक्ति खो दी है।

कोड से एचटीएमएल, सीएसएस, और जेएस उत्पन्न करने का एक पहलू उन्हें एक साथ समूहबद्ध करने और अनुप्रयोग तर्क के साथ बातचीत करने की आसान क्षमता है। उदाहरण के लिए, यदि आप एक जावास्क्रिप्ट कैलेंडर पॉपअप का उपयोग करने वाले दिनांक फ़ील्ड चाहते हैं, तो आपको कुछ एचटीएमएल, सीएसएस, और जेएस सभी एक साथ काम करने की ज़रूरत है- और आप चाहते हैं कि आप अपने स्रोत में एक दूसरे के बगल में स्थित हों, लेकिन स्थित एचटीएमएल पेज में एक दूसरे से दूर, या ग्राहक द्वारा प्राप्त की जाने वाली अलग फाइलों में। यसोड में, हमारे पास widgets है जो कोड में या 3 अलग-अलग फ़ाइलों के साथ पूरा करने के लिए है। एचएएमएल में एचटीएमएल, जावास्क्रिप्ट, या सीएसएस के रूप में एक ही टेम्पलेट के भाग घोषित कर सकते हैं, हालांकि यदि आप उन्हें अधिक बुद्धिमान तरीके से जोड़ना चाहते हैं तो आपको अपने स्वयं के हेल्पर्स को अपने ढांचे या एप्लिकेशन से चाहिए।

4

सवाल यह है कि असली दुनिया में एकरूपता कितनी मूल्यवान है?

शायद काफी महत्वपूर्ण: इन दिनों सर्वर-पक्ष जावास्क्रिप्ट करने वाले सभी लोगों को देखें। जावास्क्रिप्ट किसी भी चीज़ पर उत्कृष्ट नहीं है, और सर्वर-साइड कोड के लिए इसका लाइब्रेरी समर्थन बिल्कुल बढ़िया नहीं है, लेकिन इसका उपयोग करके बड़े लाभ प्राप्त किए जा सकते हैं।

जब भी कुछ भी गलत हो जाता है, तो आप Firebug में पेज लोड करने के लिए है,

क्या "कुछ भी" है पर निर्भर करता है। मैं वास्तव में याद नहीं कर सकता कि आखिरी बार मुझे फ़ायरबग खोलना था कि क्या गलत हो रहा है - मैं निश्चित रूप से चरणों के माध्यम से रहा हूं, लेकिन यह कई बार भी नहीं है जब यह नहीं है।

उदाहरण के लिए, यदि आप अपने सीएसएस को एस-एक्सप से उत्पन्न करते हैं, तो आपके सीएसएस के साथ परेशानी केवल आपको अजीब सिंटैक्स मुद्दों (जैसे आई 6 चाल) के लिए "संकलित" सीएसएस को देखने की आवश्यकता हो सकती है। यदि आप केवल पृष्ठ को देखते हैं और निर्णय लेते हैं कि आपको अतिरिक्त सीमा की आवश्यकता है, तो आप (:border 1) जोड़ सकते हैं और इसके साथ किया जा सकता है। (बेशक, यदि आप क्लाइंट को सेवा देने के लिए सीएसएस नियमों का एक पूरा सेट उत्पन्न करने के लिए संसाधित करते हैं, तो यह एक बड़ी जीत भी है।)

इसके बारे में सोचने का एक और तरीका: बहुत दुर्लभ मौकों पर मुझे इसकी आवश्यकता है एक आधुनिक वेब ऐप पर काम करते समय एक पैकेट स्निफर और एक डिस्सेबलर खींचें। हाँ, यह बेकार है, लेकिन अच्छी पुस्तकालयों के साथ, यह भी बहुत असामान्य है। मुझे उस स्तर के स्तर की आवश्यकता होने पर दुर्लभ अवसर पर एक पैकेट स्निफर पर स्विच करने के प्रतिबाधा विसंगति से बचने के लिए पूरे दिन निम्न स्तर का कोड लिखना नहीं होगा।

यह मानता है कि आप उस स्तर पर जा सकते हैं जहां आप लिख रहे हैं (वी) एचएलएल कोड।सामान्य लिस्प सी सी होने पर सी को हरा नहीं सकता है, और यदि आप एचटीएमएल में एक साधारण ब्लॉग थूकने की कोशिश कर रहे हैं तो आप वहां मीठे स्थान पर नहीं हैं, या तो रेल पहले से ही इस तरह की चीज़ पर अच्छा है। लेकिन वहां बहुत सारे प्रयोगात्मक प्रोग्रामिंग हैं जहां सर्वर के बजाए क्लाइंट पर एक ध्वज और रन कोड बदलने में सक्षम होना उपयोगी है।

और फिर आप उत्पन्न एचटीएमएल, सीएसएस, और जावास्क्रिप्ट को देखेंगे, लिस्प स्रोत नहीं, इसलिए आपको अपने सिर में मैपिंग रखना होगा। क्या लिस्प द्वारा प्रदान की गई एकरूपता वास्तव में कुछ भी हल करती है, या समस्या पर सिर्फ वॉलपेपर, जो अंत में फिर से नीचे की ओर आती है?

मैं सभी लिस्प और सभी जावास्क्रिप्ट वेब क्षुधा लिखा है, और मुझे लगता है कि सबसे अच्छा जवाब मैं अभी दे सकते है: यह सकता। मैंने पेरेंटस्क्रिप्ट का उपयोग किया है, और बड़ी समस्या यह है कि माता-पिता एक लिस्प-वाई भाषा है लेकिन यह सामान्य लिस्प नहीं है, न ही यह कोई अन्य पूर्ण भाषा है जिसका आप सर्वर पक्ष पर उपयोग कर सकते हैं। (यदि जावास्क्रिप्ट कंपाइलर के लिए एक सामान्य लिस्प था, जैसे जीडब्ल्यूटी जावा के लिए है, तो यह बहुत अच्छा होगा। हालांकि, मुझे किसी को भी गंभीर बनाने की कोशिश नहीं कर रहा है।) तो आप अभी भी मिल चुके हैं, जैसा कि आप देखते हैं, दो भाषाएं।

जावास्क्रिप्ट आज थोड़ा बेहतर है, इस संबंध में, क्योंकि आप दोनों जगहों पर बिल्कुल वही कोड चला सकते हैं। यह काफी आदर्श नहीं है क्योंकि आपके सर्वर-पक्ष जावास्क्रिप्ट में ऐसी विशेषताएं हैं जिनकी आप गारंटी नहीं दे सकते हैं, क्लाइंट-साइड पर मौजूद होंगे (जब तक कि आप अपने उपयोगकर्ताओं को फ़ायरफ़ॉक्स के हाल के संस्करणों को सीमित न करें)। यदि आप मेरे जैसे हैं, तो आप अपने सर्वर कोड को जेएस पर सीमित नहीं करना चाहते हैं जो हर ब्राउज़र में चलने के लिए होता है, इसलिए आपका सर्वर-साइड जेएस और क्लाइंट-साइड जेएस कमजोर होगा। यह एक डीलब्रेकर नहीं है - यह अभी भी बहुत अच्छा है - लेकिन यह अभी भी 2 अलग-अलग भाषाओं है।

मुझे लगता है कि यह एक बहुत अच्छा होगा यदि कोई प्रोग्राम था जो नवीनतम जावास्क्रिप्ट (1.8.5) में लिखा गया कोड ले सकता है, और किसी भी ब्राउज़र में चलने वाले पुराने स्कूल जावास्क्रिप्ट उत्पन्न करता है। मुझे नहीं लगता कि ऐसा एक कार्यक्रम मौजूद है, लेकिन मुझे नहीं पता कि यह कितना मुश्किल होगा।

जावास्क्रिप्ट के लिए योजना कार्यान्वयन हैं, और इसलिए शायद योजना के साथ स्थिति बेहतर है। मुझे शायद इन दिनों में से किसी एक को देखना चाहिए।

मैं सर्वर-साइड भाषा का उपयोग करने के दौरान अक्सर निराश हूं जो मेरी क्लाइंट-साइड भाषा (जावास्क्रिप्ट) से बिल्कुल अलग है। लेकिन फिर भी मैं निराश हूं जब मुझे ऐसी भाषा का उपयोग करना है जो लिस्प की तुलना में निम्न-स्तर है (जो उनमें से अधिकतर है)। क्या यह अधिक लिस्प-जैसी, या अधिक जावास्क्रिप्ट की तरह एक बड़ी जीत है? मुझे नहीं पता। काश मैं चुनना नहीं था।

1

यह एक मजबूत राय के रूप में इतना जवाब नहीं है, लेकिन मूल समस्या यह है कि HTML और CSS केवल भयानक (1) हैं। न तो ऐसा करने के लिए माना जाता है। जावास्क्रिप्ट बेहतर है, और अक्सर उन दो (2) की कमियों के लिए सेवा में दबाया जाता है, लेकिन यह एक आदर्श समाधान नहीं है (3)। और परिणामस्वरूप एचटीएमएल और सीएसएस उत्पन्न करने के लिए सर्वर साइड भाषा की आवश्यकता होती है जो सिर्फ गड़बड़ी को और जटिल करती है। यह हास्यास्पद है कि सबसे सरल वेब एप्लिकेशन को चार अलग-अलग भाषाओं में प्रोग्रामिंग की आवश्यकता होती है।

तो, हां, एक अच्छी भरोसेमंद भाषा रखने की आपकी इच्छा जो आप दूसरों के बजाय इंटरफ़ेस कर सकते हैं समझ में आता है, लेकिन जब तक आप HTML लिख रहे हैं जो HTML/CSS उत्पन्न करता है जैसे कि आपको चिंतित होना है एचटीएमएल और सीएसएस के विवरण, फिर आप केवल मित्ते पहन रहे हैं जो संभवतः पढ़ सकते हैं ("शायद" पढ़ सकते हैं) जब आप पियानो खेलने के लिए जाते हैं तो हस्तक्षेप करते हैं। यदि आपका लिस्प कोड इस तरह दिख रहा है: (: body (: div (: @ (: शैली (: सीमा "1"))) (: पी "हैलो"))), तो आप वास्तव में चिंताओं से मुक्त नहीं हैं जो आपको पीड़ा देता है।

व्यक्तिगत रूप से, मुझे लगता है कि हमें अब सूप की जगह लेने के लिए कुछ और चाहिए और इसे को एचटीएमएल/सीएसएस/जेएस में संकलित करना चाहिए, लेकिन उपयोगकर्ता को अपनी चिंताओं से मुक्त रखें। सी असेंबली के लिए संकलित करता है लेकिन सी प्रोग्रामर कभी भी एसटीए, एमओवी, एलडीएक्स ऑपकोड नहीं देखता है जो इसे अपने लिखित कोड में संकलित करता है। और, यह लोकप्रिय होना था, तो ब्राउज़र सीधे इसका समर्थन कर सकते थे। वैसे भी, यह सिर्फ एक विचार है। एक चमकदार

गुड लक,

क्रिस पर्किन्स
medialab.com

(1) HTML दस्तावेज़ के साथ छवियों, स्क्रिप्ट, स्टाइलशीट, आदि यौगिक दस्तावेजों अन्य सभी फ़ाइलों में संग्रहीत किया जा रहा है। लेकिन एक बात यह है कि एक HTML दस्तावेज़ नहीं कर सकता है तरल रूप से एक और HTML दस्तावेज़ एम्बेड करें - एक चीज जिसकी सबसे अधिक आवश्यकता है। iframes/ऑब्जेक्ट टैग निश्चित आकार हैं और दोनों प्रतिकूल प्रभाव एसईओ को प्रभावित करते हैं। यह एक छोटा सा काम प्रायः एकमात्र कारण है कि कई वेबसाइटों पर PHP की तरह सर्वर की भाषा भाषा का उपयोग किया जाता है।
आपको मुझे यह बताने की ज़रूरत नहीं है कि सीएसएस कितना खराब है।

(2) उदाहरण बहुत अधिक हैं: कम (lesscss.org), document.write, AJAX, और और भी बहुत कुछ।

(3) जावास्क्रिप्ट डॉम और सीएसएस नियमों के बीच बाधा मेल नहीं है लगभग अविश्वसनीय है। डीओएम में एक div क्या कितनी ऊंचाई है (scrollHeight, ऑफसेट हाइट, क्लाइंट हाइट, और अधिक)? 4 या अधिक, शायद? उनमें से कितने सीएसएस के माध्यम से पता योग्य हैं? 0 या 1. इसके अलावा, जबकि जावास्क्रिप्ट बहुत सारे छेद प्लग कर सकता है, यह अक्सर एसईओ

की कीमत पर ऐसा करता है
संबंधित मुद्दे