繁体   English   中英

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

[英]NodeJS + CoffeeScript, render coffeescript compiled js on request

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

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

NodeJS,Express和Coffeescript可以实现这样吗?

谢谢!

何塞

好消息:这已经附带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将送达。 请注意, compiler 之后设置static很重要。

更新:从Connect 1.7开始, compiler中间件已被删除。 部分原因是,为了提供更多类似Rails 3.1的体验,我创建了一个名为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”目录不作为静态路径暴露,所以无法访问coffeescript。

笔记:

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

对于我们这些使用最新版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的Connect-Assets 它有助于编译,缩小和连接.js和.coffee文件,并优化文件的提供方式(使用文件的md5-hash进行无效的远期过期标头)。 写得很好的插件。

咖啡中间件正是我想要的 - 最小的设置,没有生成的文件,而不是马虎。 当它收到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

祝好运!

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

如果您想使用Express 3或任何Web框架使用咖啡,请查看此repo ExpressOnSteroids您可以使用此解决方案,或者使用此项目中的Cakefile创建自己的解决方案

您可以使用Coffee4Clients通过快速服务器动态地将咖啡资产渲染为javascript。

更新:Coffee4Clients已被杀,有利于DocPad预编译您的资产。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM