20

我想做的是将以下内容添加到我已经在运行咖啡脚本编写的服务器

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

使用 NodeJS、Express 和 Coffeescript 可以实现类似的功能吗?

谢谢!

何塞

4

8 回答 8

30

好消息:Connect(以及扩展 Connect 的 Express)已经作为插件提供!它没有很好的记录;事实上,在我被告知这样的东西已经存在之前,我自己写了一些类似的东西( 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中不存在这样的文件,将自动编译,并提供结果。请注意,.publicfoo.coffeefoo.jsstatic compiler

更新:从 Connect 1.7 开始,compiler中间件已被删除。部分是因为这个,部分是为了提供更像 Rails 3.1 的体验,我创建了一个名为connect-assets的新中间件。使用 npm 安装它,然后像这样设置它:

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

CoffeeScript 文件所在directory的文件夹在哪里(默认为assets)。很简单,对吧?试试看,让我知道你的想法。

于 2011-03-04T17:30:37.517 回答
12
CoffeeScript = require 'coffee-script'

app.get '/test.js', (req, res) ->
  render CoffeeScript.compile coffeeSourceCode
于 2011-03-04T17:11:00.097 回答
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

现在您可以编写coffee/animal.coffee 并在您的html 中执行标准脚本src='/animal.js'。这隐藏了实现细节。咖啡脚本不可访问,因为“/coffee”目录未作为静态路径公开。

笔记:

  1. 这当然是一个 CoffeeScript Node 应用程序。我假设如果您将 CS 用于客户端脚本,那么您也将它用于您的服务器!
  2. “静态”行是可选的。我的观点是你可以愉快地将“js”文件保存在静态目录中,例如像 jquery.min.js 这样的库文件。
  3. 像大多数 Node/Express 示例一样,这有利于开发;但是对于生产,您应该发送缓存标头,对其进行压缩,最好是某种形式的反向代理,以避免每次读取文件并对其进行编译。
于 2011-08-26T13:03:09.687 回答
6

对于我们这些使用最新版本的 Connect 和 Express 的人,我刚刚发布了一个新模块npm install connect-coffee-script,它可以即时编译咖啡脚本文件。提供了文档和样本以及介绍文章

这是自述文件中的一个示例:

    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)
于 2012-07-24T12:36:04.423 回答
2

如果您想使用一个很棒的现有插件,我会推荐Trevor Burnham 的 Connect-Assets。它有助于编译、缩小和连接 .js 和 .coffee 文件,并优化文件的服务方式(使用文件的 md5-hash 失效的远期过期标头)。写得很好的插件。

于 2012-04-16T16:04:15.390 回答
2

咖啡中间件完全符合我的要求 - 最少的设置,没有生成的文件,而且不马虎。当它收到请求时,somescript.js它将检查是否有somescript.coffee. 如果有,它会编译并发送过去。

安装它:

npm install coffee-middleware

要使用,只需添加

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

在您用于提供静态文件的任何内容之前。

在“公共”目录中提供文件的简单示例,在发送之前编译咖啡脚本,并进行彩色日志记录:

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

祝你好运!

于 2014-05-19T05:44:23.697 回答
0

我认为你应该只编译一次COFFEE 文件,尤其是在生产模式下

如果你想在 Express 3或任何 web 框架中使用咖啡,请查看这个 repo ExpressOnsteroids你可以使用这个解决方案,或者使用这个项目中的Cakefile创建你自己的解决方案

于 2012-07-06T12:46:38.193 回答
0

您可以使用Coffee4Clients将咖啡资产通过您的快递服务器即时渲染到 JavaScript。

更新:Coffee4Clients 已被取消,取而代之的是预编译您的资产的DocPad 。

于 2011-09-20T10:49:52.507 回答