Node.js NodeJS+;CoffeeScript,根据请求呈现CoffeeScript编译的js

Node.js NodeJS+;CoffeeScript,根据请求呈现CoffeeScript编译的js,node.js,coffeescript,express,Node.js,Coffeescript,Express,我想做的是向已经运行coffeescript编写服务器的我添加以下内容 app.get '/test.js', (req, res) -> render coffee somecoffeefile.coffee NodeJS、Express和Coffeescript是否可以实现类似的功能 谢谢 Jose好消息:这已经是Connect(以及扩展Connect的Express)的插件了!它没有很好的记录;事实上,我自己也写过类似的东西(),直到我被告知这样的东西已经存在 以下是如何使

我想做的是向已经运行coffeescript编写服务器的我添加以下内容

app.get '/test.js', (req, res) ->
    render coffee somecoffeefile.coffee
NodeJS、Express和Coffeescript是否可以实现类似的功能

谢谢


Jose

好消息:这已经是Connect(以及扩展Connect的Express)的插件了!它没有很好的记录;事实上,我自己也写过类似的东西(),直到我被告知这样的东西已经存在

以下是如何使用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
。请注意,在
编译器
之后设置
静态
非常重要

更新:自Connect 1.7起,
编译器
中间件已被删除。部分原因在于此,部分原因是为了提供更类似Rails 3.1的体验,我创建了一个新的中间件,名为。使用npm安装,然后按如下方式进行设置:

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

其中
目录
是您的咖啡脚本文件所在的文件夹(默认为
资产
)。很简单,对吧?试试看,让我知道你的想法。

由于某种原因,编译器不再工作,所以我这样做:

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'。这隐藏了实现细节。coffeescript不可访问,因为“/coffee”目录未作为静态路径公开

注:

  • 当然,这是一个CoffeeScript节点应用程序。我假设,如果您将CS用于客户端脚本,那么您也将其用于服务器
  • “静态”行是可选的。我的观点是,您可以愉快地将“js”文件保存在静态目录中,例如jquery.min.js之类的库文件
  • 与大多数Node/Express示例一样,这有利于开发;但是对于生产环境,您应该发送缓存头,压缩它,最好是某种形式的反向代理,以避免每次读取和编译文件
  • 您可以使用express服务器动态地将咖啡资产呈现为javascript


    更新:Coffee4客户端已被删除,以支持预编译您的资产。

    如果您想使用现有的优秀插件,我建议您使用。它有助于编译、缩小和连接.js和.coffee文件,并优化文件的服务方式(使用文件的md5散列进行失效失效的遥远未来expires头文件)。编写良好的插件。

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


    如果您想将咖啡与Express 3一起使用,或者与任何web框架一起使用此repo,您可以使用此解决方案,或者使用此项目创建您自己的咖啡

    ,对于我们这些使用最新版本的Connect and Express的人,我刚刚发布了一个新模块,可以动态编译咖啡脚本文件。提供了文件和样本以及一份报告

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

        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)
    
    做了我想做的事情-最小的设置,没有生成的文件,也不马虎。 当它收到对
    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
    

    祝你好运

    Trevor,我遇到了一个错误:TypeError:无法读取Object.compiler[作为句柄](/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/compiler.js:58:19)未定义的属性“match”(/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/compiler.js,例如,
    coffeeDir=\uu dirname+/scripts'
    如果您的
    .coffee
    文件位于
    scripts
    子目录中。请注意,目录路径未添加到URL。因此,如果您在
    scripts/foo.coffee
    上有一个文件,您将请求
    http://localhost/foo.js
    获取已编译的JavaScript。在较新版本的connect中,
    staticProvider()
    现在被称为
    static()
    。此外,为了安全起见,如果您不希望人们能够获取您的原始
    *.coffee
    文件,您应该在调用
    编译器()
    时同时设置
    dest
    src
    。它们不应该是相同的
    src
    是原始
    *。coffee
    文件所在的位置,
    dest
    是它们编译到的静态目录。谢谢,阿米尔!我已经编辑了我的答案以纳入你的建议。这对我不适用。是否有禁用此功能的新更新?它没有抛出错误,只是没有找到client.js(应该查找client.coffee并编译它)。我添加了一个从文件编译的单独答案。听起来您使用的是新版本的Connect,不再有编译器中间件。查看我的最新答案。我还从CoffeeScript twitter帐户获得了此消息:“@mahemoff是的,编译器中间件在最新的Connect/Express中消失了。正在开发替代方案…”是的,我运行了CoffeeScript twitter帐户。是我所指的备选方案。:)啊:)。您是否有支持生产配置的计划?我为生产部署做了一些自定义编码,因为我想组合脚本(以及样式表)并在它们上运行压缩器。在Connect/Express中,可以使用标准方式执行此操作。(很高兴与大家分享
    (function() {
      console.log("Hello world!");
    
    }).call(this);
    
    //@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LmpzIiwic291cmNlcyI6WyJzY3JpcHQuY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUEsRUFBQSxPQUFPLENBQUMsR0FBUixDQUFZLGNBQVosQ0FBQSxDQUFBO0FBQUEifQ==NHS0076