【发布时间】:2011-07-08 22:20:46
【问题描述】:
我想做的是将以下内容添加到我已经在运行咖啡脚本编写的服务器
app.get '/test.js', (req, res) ->
render coffee somecoffeefile.coffee
NodeJS、Express 和 Coffeescript 可以实现类似的功能吗?
谢谢!
何塞
【问题讨论】:
标签: node.js coffeescript express
我想做的是将以下内容添加到我已经在运行咖啡脚本编写的服务器
app.get '/test.js', (req, res) ->
render coffee somecoffeefile.coffee
NodeJS、Express 和 Coffeescript 可以实现类似的功能吗?
谢谢!
何塞
【问题讨论】:
标签: node.js coffeescript express
coffee-middleware 完全符合我的要求 - 最少的设置,没有生成的文件,而且没有马虎。
当它收到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
祝你好运!
【讨论】:
您可以使用Coffee4Clients 将咖啡资产通过您的快递服务器即时渲染到 JavaScript。
更新:Coffee4Clients 已被取消,取而代之的是 DocPad,它会预编译您的资产。
【讨论】:
对于我们这些使用最新版本的 Connect 和 Express 的人,我刚刚发布了一个新模块 npm install connect-coffee-script,它可以即时编译咖啡脚本文件。提供了文档和示例以及introduction article。
这是自述文件中的一个示例:
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)
【讨论】:
我认为您应该只编译一次 COFFEE 文件,尤其是在生产模式下
如果您想将咖啡与 Express 3 一起使用,或与任何 Web 框架一起使用,请查看此 repo ExpressOnSteroids 您可以使用此解决方案,或使用此项目中的 Cakefile 创建自己的解决方案
【讨论】:
如果你想使用一个很棒的现有插件,我会推荐Trevor Burnham's Connect-Assets。它有助于编译、缩小和连接 .js 和 .coffee 文件,并优化文件的服务方式(使用文件的 md5-hash 失效的远期过期标头)。插件写得很好。
【讨论】:
好消息: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 时,如果您的public 目录中不存在这样的文件,foo.coffee 将自动编译,并提供生成的foo.js。请注意,在static 之后设置static 很重要 compiler。
更新:从 Connect 1.7 开始,compiler 中间件已被删除。部分是因为这个,部分是为了提供更像 Rails 3.1 的体验,我创建了一个名为connect-assets 的新中间件。用 npm 安装它,然后像这样设置它:
app.use require('connect-assets')(directory)
其中directory 是您的CoffeeScript 文件所在的文件夹(默认为assets)。很简单,对吧?试试看,让我知道你的想法。
【讨论】:
coffeeDir,例如coffeeDir = __dirname + '/scripts' 如果您的 .coffee 文件位于 scripts 子目录中。请注意,目录路径不会添加到 URL。所以如果你在scripts/foo.coffee 有一个文件,你会请求http://localhost/foo.js 来获取编译后的JavaScript。
staticProvider() 现在称为 static()。此外,为了安全起见,如果您不希望人们能够获取您的原始 *.coffee 文件,则应在对 compiler() 的调用中同时设置 dest 和 src。它们不应该相同。 src 是您的原始 *.coffee 文件所在的位置,dest 是它们编译到的静态目录。
由于某种原因,编译器不再工作,所以我这样做了:
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”目录未公开为静态路径。
注意事项:
【讨论】:
CoffeeScript = require 'coffee-script'
app.get '/test.js', (req, res) ->
render CoffeeScript.compile coffeeSourceCode
【讨论】: