Подтвердить что ты не робот

NodeJS + CoffeeScript, рендеринг coffeescript скомпилированных js по запросу

Что бы я хотел сделать, добавьте следующее ко мне, уже запустив написанный сервер coffeescript

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

Что-то вроде этого возможно с помощью NodeJS, Express и Coffeescript?

Спасибо!

Jose

4b9b3361

Ответ 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 из этого проекта