NodeJS + CoffeeScript, рендеринг coffeescript скомпилированных js по запросу
Что бы я хотел сделать, добавьте следующее ко мне, уже запустив написанный сервер coffeescript
app.get '/test.js', (req, res) ->
render coffee somecoffeefile.coffee
Что-то вроде этого возможно с помощью NodeJS, Express и Coffeescript?
Спасибо!
Jose
Ответы
Ответ 1
Хорошие новости: это уже есть Connect (и, следовательно, Express, который расширяет Connect) в качестве плагина! Это не хорошо документировано; на самом деле я написал нечто подобное себе (connect-coffee), прежде чем мне сообщили, что такая вещь уже существует.
Здесь вы можете настроить его с помощью Express:
# 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
. Обратите внимание, что это важно для static
для настройки после compiler
.
Обновление:. Что касается Connect 1.7, промежуточное программное обеспечение compiler
было удалено. Отчасти из-за этого, а отчасти для обеспечения большего опыта работы с Rails 3.1, я создал новое промежуточное программное обеспечение под названием connect-assets. Установите его с помощью npm, затем настройте его так:
app.use require('connect-assets')(directory)
где directory
- папка, в которой находятся ваши файлы CoffeeScript (по умолчанию это assets
). Простой, не так ли? Попробуйте и дайте мне знать, что вы думаете.
Ответ 2
CoffeeScript = require 'coffee-script'
app.get '/test.js', (req, res) ->
render CoffeeScript.compile coffeeSourceCode
Ответ 3
По какой-то причине компилятор больше не работает, поэтому я сделал это:
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, выполните стандартный script src= '/animal.js. Это скрывает детали реализации. Кофейный документ недоступен, потому что директория "/coffee" не отображается как статический путь.
Примечания:
- Это, конечно же, приложение CoffeeScript Node. Я предполагаю, что если вы используете CS для клиентских скриптов, вы также используете его для своего сервера.
- "Статическая" линия является необязательной. Могу сказать, что вы можете с радостью хранить файлы "js" в статическом каталоге, например. библиотечные файлы, такие как jquery.min.js.
- Как и большинство примеров Node/Express, это хорошо для развития; но для производства вы должны отправлять кеш-заголовки, сжимать их и, в идеале, в какой-то форме обратного проксирования, чтобы не читать и компилировать его каждый раз.
Ответ 4
Для тех из нас, кто использует последнюю версию Connect и Express, я только что опубликовал новый модуль, npm install connect-coffee- script, которые собирают файлы кофе script на лету. Представлены документация и образец, а также статья .
Здесь пример из readme:
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)
Ответ 5
Если вы хотите использовать большой существующий плагин, я бы рекомендовал Trevor Burnham Connect-Assets. Он помогает компилировать, минимизировать и конкатенировать .js и. Coffee файлы и оптимизирует, как файлы будут обслуживаться (будущее будущее заканчивается заголовком с недействительностью с использованием файла md5-hash). Хорошо написанный плагин.
Ответ 6
coffee-middleware сделал именно то, что я хотел - минимальная настройка, отсутствие сгенерированных файлов и не sloppy.
Когда он получит запрос для 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
Удачи!
Ответ 7
Вы можете использовать Coffee4Clients для рендеринга кофейных активов в javascript на лету с вашим экспресс-сервером.
Обновление: Coffee4Clients был убит в пользу DocPad, который предварительно компилирует ваши активы.
Ответ 8
Я думаю, что вы должны компилировать файлы COFFEE только один раз, особенно в режиме производства
Если вы хотите использовать кофе с Express 3 или с любым веб-фреймворком, посмотрите на это репо ExpressOnSteroids Вы можете использовать это решение или создать свой собственный Cakefile из этого проекта