NodeJS + CoffeeScript,根据请求渲染coffeescript编译的js

我想要做的是添加以下给我已经运行咖啡书面服务器

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

像NodeJS,Express和Coffeescript这样的可能吗?

谢谢!

何塞

好消息:这已经与连接(因此Express,扩展连接)作为插件来! 它没有很好的文件logging; 实际上,在我被告知这样的事情已经存在之前,我自己写了一些类似的东西( 连接咖啡 )。

以下是您如何设置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 请注意, compiler 之后设置static非常重要。

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

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

其中directory是您的CoffeeScript文件所在的文件夹(默认值是assets )。 很简单,对吧? 试试看,让我知道你的想法。

 CoffeeScript = require 'coffee-script' app.get '/test.js', (req, res) -> render CoffeeScript.compile coffeeSourceCode 

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

 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”dir没有公开为静态path,所以不能访问咖啡脚本。

笔记:

  1. 这当然是一个CoffeeScript Node应用程序。 我假设如果你使用客户端脚本的CS,你也使用它的服务器!
  2. “静态”行是可选的。 我的观点是你可以愉快地保留静态目录中的“js”文件,例如像jquery.min.js这样的库文件。
  3. 像大多数的Node / Express例子一样,这对开发很有帮助。 但是为了生产,你应该发送caching头文件,压缩它,理想的情况是使用某种forms的反向代理来避免每次读取文件和编译它。

对于我们这些使用最新版本的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) 

如果你想使用一个伟大的现有插件,我会推荐Trevor Burnham的连接资产 。 它有助于编译,缩小和连接.js和.coffee文件,并优化文件的服务方式(使用文件的md5散列,无效的远期头文件)。 写得好的插件。

咖啡中间件做了我想要的 – 最小的设置,没有生成的文件,而不是马虎。 当它得到一个somescript.js的请求,它会检查是否有一个somescript.coffee 。 如果有,它会编译并发送它。

安装它:

 npm install coffee-middleware 

要使用,只需添加

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

无论你用什么来提供静态文件。

在“public”目录中提供文件的简单示例,在发送之前遵循coffeescript,并进行彩色logging:

 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 

你可以复制整个一堆到terminal,它会设置和运行服务器。

去testing:

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

最后一点应该吐出来

 (function() { console.log("Hello world!"); }).call(this); //@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LmpzIiwic291cmNlcyI6WyJzY3JpcHQuY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUEsRUFBQSxPQUFPLENBQUMsR0FBUixDQUFZLGNBQVosQ0FBQSxDQUFBO0FBQUEifQ==NHS0076 

祝你好运!

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

如果你想用Express 3或任何Web框架来使用咖啡,请看这个回购ExpressOnSteroids你可以使用这个解决scheme,或者从这个项目中用Cakefile创build你自己的

您可以使用Coffee4Clients将您的快速服务器上的咖啡资源呈现给JavaScript。

更新:Coffee4Clients已经被DocPad预先编译好了。