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

Jos*_*ose 20 node.js coffeescript express

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

app.get '/test.js', (req, res) ->
    render coffee somecoffeefile.coffee
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

何塞

Tre*_*ham 30

好消息:这已经附带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)
Run Code Online (Sandbox Code Playgroud)

现在,当http://yourapp/foo.js被请求时,如果public目录中不存在这样的文件,foo.coffee将自动编译,并将提供结果foo.js.请注意,之后static进行设置非常重要. compiler

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

app.use require('connect-assets')(directory)
Run Code Online (Sandbox Code Playgroud)

directoryCoffeeScript文件所在的文件夹在哪里(默认为assets).简单吧?尝试一下,让我知道你的想法.

  • 在较新版本的 connect 中,“staticProvider()”现在称为“static()”。另外,为了安全起见,如果您不希望人们能够获取原始的“*.coffee”文件,则应该在“compiler()”的调用中同时设置“dest”和“src”。它们不应该是相同的。`src` 是原始 `*.coffee` 文件所在的位置,而 `dest` 是它们编译到的静态目录。 (2认同)
  • 这对我不起作用.是否有禁用此功能的新更新?它不会抛出错误,但它只是找不到client.js(应该查找client.coffee并编译它). (2认同)

jas*_*nas 12

CoffeeScript = require 'coffee-script'

app.get '/test.js', (req, res) ->
  render CoffeeScript.compile coffeeSourceCode
Run Code Online (Sandbox Code Playgroud)


mah*_*off 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
Run Code Online (Sandbox Code Playgroud)

现在你可以编写coffee/animal.coffee代码并在你的html中,做一个标准的脚本src ='/ animal.js'.这隐藏了实现细节.因为"/ coffee"目录不作为静态路径暴露,所以无法访问coffeescript.

笔记:

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


wda*_*idw 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)
Run Code Online (Sandbox Code Playgroud)