2011-10-20 8 views
21

में सर्वर और क्लाइंट के बीच कोड साझा करना कहें कि मैं अपने क्लाइंट-साइड * .cljs और मेरे सर्वर-साइड * .clj, उदाहरण के बीच कुछ सामान्य कोड को कारगर बनाना चाहता हूं। विभिन्न डेटा संरचनाएं और सामान्य संचालन, क्या मैं ऐसा कर सकता हूं? क्या यह समझ में आता है?क्लोजरस्क्रिप्ट/क्लोजर

+2

यह वास्तव में समझ में आएगा, जैसे कि जीडब्ल्यूटी में आप सर्वर पर और क्लाइंट पर जावा कोड भी साझा कर सकते हैं। इस पर जवाब सुनने के लिए बहुत अच्छा होगा! –

+0

एकमात्र तरीका मैं अभी सोच सकता हूं कि साझा कोड को सर्वर नेमस्पेस और निर्देशिका संरचना में रखना है, फिर फ़ाइलों को प्रतिलिपि बनाने के लिए अपने संकलन कोड में लाइनें जोड़ें, * .cljs के रूप में नामकरण - क्योंकि क्लोजरस्क्रिप्ट कंपाइलर केवल .cljs – Hendekagon

उत्तर

13

अद्यतन: क्लोजर 1.7 के रूप में, Clojure reader conditionals or cljc देखें। मैंने सर्वर और ब्राउज़र के बीच बहुत सी कोड साझा करने के लिए बहुत सफलता के साथ cljc का उपयोग किया है।

शानदार सवाल! मैं हाल ही में इसके बारे में बहुत कुछ सोच रहा हूं और प्रयोग करने के लिए कुछ ऐप्स लिखे हैं।

  • मेरे मुवक्किल के अधिकांश फ़ाइलों cljs कोड है कि डोम manipulates शामिल हैं:

    यहाँ क्या प्रकार चीजें आप साझा करने के लिए और पेशेवरों/प्रत्येक के विपक्ष चाहते हो सकता है की मेरी सूची है। इसलिए, सर्वर

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

आशा है कि ये विचार उपयोगी हैं, मुझे बहुत कुछ पता है कि दूसरों ने अब तक क्या पाया है!

+0

नाम की फ़ाइलों के लिए दिखता है उत्कृष्ट अंक! मैं अपने सर्वर कोड को संकलक में अपने कार्यों का सबसेट पास करके अपने सभी क्लोजरस्क्रिप्ट कोड को ऑटो-बिल्ड करके प्रक्रिया को एकजुट करना चाहता हूं। मैंने अभी तक कंपाइलर कोड नहीं पढ़ा है, लेकिन इसे .cljs फ़ाइलों का उपयोग किए बिना सीधे अभिव्यक्तियों को खिलाना संभव होना चाहिए। – Hendekagon

+0

डेटास्ट्राचर शेयरिंग के संबंध में, लाइब्रेरी 'fetch' बहुत साफ दिखता है! https://github.com/ibdknox/fetch – leontalbot

2

कोड की एक त्वरित बिट लिखा मेरी clojurescript कोड के लिए खत्म हो अपने सर्वर clojure कोड के किसी उप-कॉपी करने के लिए, निर्माण से पहले .cljs के रूप में नाम बदलने:

(ns clj-cljs.build 
    (use 
    [clojure.java.io] 
) 
    (require 
    [cljs.closure :as cljsc] 
) 
) 

(defn list-files [path] 
(.listFiles (as-file path)) 
) 

(defn copy-file* [from to] 
;(println " coping " from " to " to) 
(make-parents to) 
(copy from to) 
)  

(defn rename [to-path common-path f] 
(str to-path common-path (.replaceAll (.getName f) ".clj" ".cljs")) 
) 

(defn clj-cljs* [files common-path to-path] 
    (doseq [i (filter #(.endsWith (.getName %) ".clj") files)] 
    (copy-file* i (file (rename to-path common-path i))) 
) 
    (doseq [i (filter #(.isDirectory %) files)] 
    (clj-cljs* (list-files i) (str common-path (.getName i) "/") to-path) 
) 
) 

(defn build [{:keys [common-path clj-path cljs-path js-path module-name]}] 
    (clj-cljs* (list-files (str clj-path common-path)) common-path cljs-path) 
    (cljsc/build 
    cljs-path 
    { 
    :output-dir js-path 
    :output-to (str js-path module-name ".js") 
    } 
) 
) 

(defn build-default [] 
    (build 
    { 
    :clj-path "/home/user/projects/example/code/src/main/clojure/" 
    :cljs-path "/home/user/projects/example/code/src/main/cljs/" 
    :js-path "/home/user/projects/example/code/public/js/cljs/" 
    :common-path "example/common/" ; the root of your common server-client code 
    :module-name "example" 
    } 
) 
) 
10

Leiningen के लिए नए lein-cljsbuild प्लगइन में निर्मित support है शुद्ध क्लोजर कोड साझा करने के लिए।

+2

[cljsbuild] (https://github.com/emezeske/lein-cljsbuild) के अंतर्निर्मित समर्थन (क्रॉसओवर) को [cljx] (https) के पक्ष में बहिष्कृत कर दिया गया है : //github.com/lynaghk/cljx), [यह] देखें (http://stackoverflow.com/a/10369314/1209442) उत्तर। –

15

मैंने cljx लीइंगिंग प्लगइन विशेष रूप से क्लोजर डेटा विज़ुअलाइजेशन लाइब्रेरी के लिए क्लोजर/क्लोजरस्क्रिप्ट कोड साझाकरण को संभालने के लिए लिखा था। गैर-होस्ट-इंटरऑप कोड का 9 5% समान दिखता है, और cljx आपको core.logic का उपयोग करके पुनः लिखने के नियमों को निर्दिष्ट करके स्वचालित रूप से उस अंतिम 5% को फिर से लिखने देता है। अधिकांश समय, हालांकि, यह सरल प्रतीक प्रतिस्थापन है; उदाहरण के लिए क्लोजरस्क्रिप्ट में clojure.lang.IFn क्लोजरस्क्रिप्ट में IFn है।

आप विशिष्ट प्लेटफ़ॉर्म के लिए कोड उत्पन्न होने पर शामिल किए जाने या बहिष्कृत करने के लिए मेटाडेटा का भी उपयोग कर सकते हैं।

+0

उपयोगी चीरज़ – Hendekagon

+1

[cljx] (https://github.com/lynaghk/cljx) को पसंद करता है [cljsbuild] द्वारा पसंद के कोड-शेयरिंग टूल के रूप में अपनाया गया है (https://github.com/emezeske/lein-cljsbuild) –

0

यह प्रश्न cljc से पूर्व निर्धारित करता है, लेकिन जब से मैंने उस पर ठोकर खाई, मैंने सोचा कि मैं क्लोजर reader conditionals का उल्लेख करूंगा।