2011-03-04 22 views
20

पर coffeescript संकलित js मैं लिखा सर्वर मेरे लिए निम्नलिखित पहले से चल रहा coffeescript जोड़ने है करना चाहते हैं क्याNodeJS + CoffeeScript, प्रस्तुत करना अनुरोध

app.get '/test.js', (req, res) -> 
    render coffee somecoffeefile.coffee 

है NodeJS साथ यह संभव तरह कुछ, एक्सप्रेस, और Coffeescript?

धन्यवाद!

जोस

उत्तर

12
CoffeeScript = require 'coffee-script' 

app.get '/test.js', (req, res) -> 
    render CoffeeScript.compile coffeeSourceCode 
+0

इस मामले में, "कॉफीसोर्सकोड" वास्तविक स्रोत कोड है, पथ पथ नहीं है। मैंने फ़ाइल से संकलित करने के लिए एक अलग उत्तर जोड़ा। – mahemoff

30

अच्छी खबर: यह पहले से ही है कनेक्ट (और इसलिए एक्सप्रेस, जो कनेक्ट फैली) एक प्लगइन के रूप में साथ आता है! यह अच्छी तरह से प्रलेखित नहीं है; वास्तव में, मैंने कुछ ऐसा ही लिखा था (connect-coffee) इससे पहले कि मुझे सूचित किया गया कि ऐसी चीज पहले से मौजूद है।

करने का तरीका यहां एक्सप्रेस के साथ यह स्थापित करने के बारे जाना चाहते हैं:

# Notice the following code is coffescript 
# You must add the parens for the app.use method to use in js 
coffeeDir = __dirname + '/coffee' 
publicDir = __dirname + '/public' 
app.use express.compiler(src: coffeeDir, dest: publicDir, enable: ['coffeescript']) 
app.use express.static(publicDir) 

अब जब, कहते हैं, http://yourapp/foo.js का अनुरोध किया जाता है, अगर ऐसी कोई फाइल नहीं अपने public निर्देशिका में मौजूद है, foo.coffee स्वचालित रूप से संकलित किया जाएगा, और परिणामस्वरूप foo.js परोसा जाएगा। ध्यान दें कि compiler के बाद static सेट अप करना महत्वपूर्ण है।

अद्यतन: कनेक्ट 1.7 के रूप में, compiler मिडलवेयर हटा दिया गया है। इसके कारण आंशिक रूप से, और आंशिक रूप से अधिक रेल 3.1 जैसे अनुभव प्रदान करने के लिए, मैंने connect-assets नामक एक नया मिडलवेयर बनाया है। NPM के साथ स्थापित करें, तो यह सेट करें जिससे की तरह:

app.use require('connect-assets')(directory) 

जहां directory फ़ोल्डर आपके CoffeeScript फाइलों में हो रहा है (डिफ़ॉल्ट assets है)। सरल, सही? इसे आज़माएं और मुझे बताएं कि आप क्या सोचते हैं।

+0

ट्रेवर, मुझे इसके साथ एक त्रुटि मिल रही है: TypeError: Object.compiler [as handle] के रूप में अपरिभाषित की संपत्ति 'मिलान' नहीं पढ़ सकता (/usr/local/lib/node/.npm/connect/0.5.10/package /lib/connect/middleware/compiler.js:58:19) – Jose

+0

आपको 'कॉफीडियर' को परिभाषित करने की आवश्यकता है, उदाहरण के लिए'कॉफीडीआईआर = __dirname + '/ scripts'' अगर आपकी' .coffee' फ़ाइलें 'स्क्रिप्ट' उपनिर्देशिका में हैं। ध्यान दें कि निर्देशिका पथ URL में नहीं जोड़ा गया है। तो अगर आपके पास 'स्क्रिप्ट/foo.coffee' पर एक फ़ाइल थी, तो आप संकलित जावास्क्रिप्ट प्राप्त करने के लिए 'http: // localhost/foo.js' का अनुरोध करेंगे। –

+1

कनेक्ट के नए संस्करणों में, 'staticProvider()' को अब' स्थिर() 'कहा जाता है। साथ ही, सुरक्षा के लिए, यदि आप नहीं चाहते हैं कि लोग आपकी मूल '* .coffee' फाइलें प्राप्त कर सकें, तो आपको कॉल में 'dest' और' src' दोनों को' कंपाइलर() 'पर सेट करना चाहिए। वे वही नहीं होना चाहिए। 'src' वह जगह है जहां आपकी मूल' * .coffee' फ़ाइलें स्थित हैं, और 'dest' स्थिर निर्देशिका है जहां उन्हें संकलित किया गया है। – Amir

8

किसी कारण से, संकलक अब और काम कर रहा है नहीं, इसलिए मैं ऐसा किया:

fs = require 'fs' 
coffee = require 'coffee-script' 

app.use express.static "#{__dirname}/static" 

app.get '/:script.js', (req, res) -> 
    res.header 'Content-Type', 'application/x-javascript' 
    cs = fs.readFileSync "#{__dirname}/coffee/#{req.params.script}.coffee", "ascii" 
    js = coffee.compile cs 
    res.send js 

अब आप कॉफी/animal.coffee अप कोड और अपने html में कर सकते हैं, एक मानक स्क्रिप्ट src करना = ' /animal.js '। यह कार्यान्वयन विस्तार छुपाता है। कॉफ़ीस्क्रिप्ट उपलब्ध नहीं है क्योंकि "/ कॉफी" डीआईआर एक स्थिर पथ के रूप में प्रकट नहीं होता है।

नोट्स:

  1. यह वह जगह है, जाहिर है, एक CoffeeScript नोड अनुप्रयोग। मुझे लगता है कि क्या आप क्लाइंट स्क्रिप्ट के लिए सीएस का उपयोग कर रहे हैं, तो आप इसे अपने सर्वर के लिए भी उपयोग कर रहे हैं!
  2. "स्थिर" रेखा वैकल्पिक है। मेरा मुद्दा यह है कि आप स्थिर डीआईआर में "जेएस" फ़ाइलों को खुशी से रख सकते हैं, उदा। लाइब्रेरी फाइलें जैसे jquery.min.js।
  3. अधिकांश नोड/एक्सप्रेस उदाहरणों की तरह, यह विकास के लिए अच्छा है; लेकिन उत्पादन के लिए, आपको फाइल पढ़ने से बचने और इसे हर बार संकलित करने के लिए कैश हेडर भेजना, इसे संपीड़ित करना और आदर्श रूप से रिवर्स-प्रॉक्सीइंग का कुछ रूप भेजना चाहिए।
+0

लगता है जैसे आप कनेक्ट का एक नया संस्करण उपयोग कर रहे हैं, जिसमें अब कंपाइलर मिडलवेयर नहीं है। मेरा अद्यतन उत्तर देखें। –

+0

मुझे यह कॉफीस्क्रिप्ट ट्विटर खाते से भी मिला: "@mahemoff हाँ, कंपाइलर मिडलवेयर नवीनतम कनेक्ट/एक्सप्रेस में चला गया है। वैकल्पिक पर काम करना ..." https://twitter.com/#!/ कॉफीस्क्रिप्ट/स्थिति/107080947706503168 – mahemoff

+0

हाँ, मैं कॉफीस्क्रिप्ट ट्विटर खाता चलाता हूं। [कनेक्ट-एसेट्स] (https://github.com/TrevorBurnham/connect-assets) वह विकल्प है जिसका मैं जिक्र कर रहा था। :) –

0

आप Coffee4Clients का उपयोग अपने एक्सप्रेस सर्वर के साथ उड़ पर जावास्क्रिप्ट को कॉफी संपत्ति प्रस्तुत करने के लिए कर सकते हैं।

अपडेट: कॉफी 4 क्लाइंट्स DocPad के पक्ष में मारे गए हैं जो आपकी संपत्ति को पूर्व-संकलित करता है।

+0

404 इस लिंक पर – jcollum

+0

@ कोल्लम धन्यवाद, अवशोषण को समझाया – balupton

2

यदि आप एक महान मौजूदा प्लगइन का उपयोग करना चाहते हैं तो मैं Trevor Burnham's Connect-Assets की अनुशंसा करता हूं। यह .js और .coffee-files संकलन, minifying और concatenating में मदद करता है और फ़ाइलों को कैसे सेवा दी जा रही है अनुकूलित करता है (एक भविष्य में फ़ाइल के md5-hash का उपयोग करके अमान्यता के साथ शीर्षलेख समाप्त हो जाता है)। अच्छी तरह से लिखित प्लगइन।

+1

+1 व्यवस्थित संपत्ति प्रबंधन प्रणाली की सिफारिश करने वाली सूची में केवल एक होने के लिए। कनेक्ट-एसेट्स का नया घर है: https://github.com/adunkman/connect-assets – lorefnon

0

मुझे लगता है कि आप विशेष रूप से उत्पादन मोड

आप एक्सप्रेस 3 साथ कॉफी उपयोग करना चाहते हैं के साथ, कॉफी फ़ाइलों केवल एक बार संकलन चाहिए, या इस रेपो ExpressOnSteroids आप इस समाधान का उपयोग कर सकते हैं के लिए किसी भी वेब रूपरेखा देखो के साथ , या इस परियोजना से Cakefile के साथ अपना खुद का निर्माण करें

6

कनेक्ट और एक्सप्रेस के नवीनतम संस्करण का उपयोग करने वाले हमारे लिए, मैंने अभी एक नया मॉड्यूल प्रकाशित किया है, npm install connect-coffee-script, जो फ्लाई पर कॉफी स्क्रिप्ट फ़ाइलों को संकलित करता है। दस्तावेज़ीकरण और एक नमूना प्रदान किया जाता है साथ ही introduction article प्रदान किया जाता है।

यहाँ रीडमी से एक उदाहरण है:

var coffeescript = require('connect-coffee-script'); 
    var connect = require('connect'); 

    var app = connect(); 

    app.use(coffeescript({ 
     src: __dirname, 
     dest: __dirname + '/public', 
     bare: true 
    })); 

    app.use(connect.static(__dirname + '/public')); 

    app.listen(3000) 
+0

शिक्षक के जवाब के रूप में, ये सभी मध्यवर्ती एक बार संशोधित होने पर कॉफी फ़ाइलों को संकलित करेंगे। एकमात्र लागत फ़ाइल के संशोधन समय और उत्पादन मोड में प्राप्त करने के लिए है, कनेक्ट-कॉफी-स्क्रिप्ट जैसी प्लगइन को बस टिप्पणी की जा सकती है क्योंकि डिस्क पर जेएस फ़ाइल पहले ही जेनरेट की गई है। – wdavidw

+1

मैं वास्तव में उलझन में हूं - मैं इसका उपयोग एक्सप्रेस के साथ कैसे करूं? –

+0

यह मेरे पास है http://i.imm.io/LkpE.png –

2

coffee-middleware किया मैं वास्तव में क्या करना चाहता था - कम से कम सेटअप, कोई उत्पन्न फ़ाइलों, और लापरवाह नहीं। जब इसे somescript.js के लिए अनुरोध मिलता है तो यह जांच करेगा कि somescript.coffee है या नहीं। यदि ऐसा है, तो यह इसे संकलित करेगा और इसे भेज देगा।

यह स्थापित करें:

npm install coffee-middleware 

, उपयोग करने के लिए बस आप जो कुछ भी स्थिर फ़ाइलों की सेवा के लिए उपयोग करने से पहले जोड़ने

app.use require('coffee-middleware') src: "#{__dirname}/your/web/root" 

सरल उदाहरण है कि एक "सार्वजनिक" निर्देशिका में फ़ाइलों में कार्य करता है, इस पर भेजने से पहले coffeescript अनुपालन करता है और लॉगिंग रंग का होता है:

app = require('express')() 

app.use require('morgan') 'dev' 
app.use require('coffee-middleware') src: "#{__dirname}/views" 
app.use require('serve-static') "#{__dirname}/views" 
app.listen 80 

कोड ऊपर का उपयोग करें:

mkdir coffeeServer 
cd coffeeServer 
npm install morgan coffee-middleware serve-static 
npm install coffee-script -g 

echo 'app = require("express")() 
app.use require("morgan") "dev" 
app.use require("coffee-middleware") src: "#{__dirname}/views" 
app.use require("serve-static") "#{__dirname}/views" 
app.listen 80' > server.coffee 

coffee -c server.coffee 
mkdir views 
cd views 
echo 'console.log "Hello world!"' > script.coffee 
cd .. 
node server.js 

आप कॉपी कर सकते हैं टर्मिनल में पूरा गुच्छा और यह सर्वर को सेटअप और चलाएगा।

परीक्षण करने के लिए:

curl XXX.XXX.XXX.XXX/script.js 

कि पिछले बिट

(function() { 
    console.log("Hello world!"); 

}).call(this); 

//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LmpzIiwic291cmNlcyI6WyJzY3JpcHQuY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUEsRUFBQSxPQUFPLENBQUMsR0FBUixDQUFZLGNBQVosQ0FBQSxDQUFBO0FBQUEifQ==NHS0076 

गुड लक थूक से बाहर करना चाहिए!