如何将coffeescript与AMD加载程序和节点服务器一起使用?

时间:2013-01-25 18:28:58

标签: node.js coffeescript middleware amd

Http Server: node.js 0.8.16
source files: mix of js and coffee
AMD loader: curl / require
Markup: jade 
CSS: styl

我正在使用上述设置构建原型应用程序。它一切正常,但我正在努力让AMD加载器与应用程序集成。 assets文件夹如下所示:

|____assets                                                    
| |____css                                                     
| | |____style.css                                             
| | |____style.styl                                            
| |____img                                                     
| |____js                                                      
| | |____bacon.js                                              
| | |____curl.js                                               
| | |____foo.coffee                                   
| | |____index.coffee     

好的,所以我希望将index.coffeefoo.coffee编译为js,并在浏览器请求/js/foo.js等时提供服务。如果我使用connect-assets,这将正常工作并将!= js('foo')放入我的玉标记中。但!= js(正在开始连接资产编译,这是(我认为)即时编译咖啡文件到js。

但是,如果我将curl"foo" : "/js/foo.js"这样的路径一起使用,那么它将无效,因为connect-assets的js()方法并没有开始。

是否有节点的中间件将处理咖啡文件的请求作为js文件?我看了一下,连接资产是我能找到的最接近的。

我想避免在我的咖啡文件上设置“观察者”。由于我使用的是一些js文件和一些coffee-as-js文件,我不想跟踪'真正的'js文件的位置以及'on-the-fly'js文件的位置。

更新5/24 :我抛弃了所有中间件小提琴,并与grunt一起使用了一个可以在更改时编译内容的观察者。效果很好。

2 个答案:

答案 0 :(得分:0)

是的,重复,大多数。无论如何,我会回答它,以防其他人在路上。

https://github.com/wdavidw/node-connect-coffee-script

var app = express();

srcFolder = path.join(__dirname, 'assets', 'src', 'coffee');
publicFolder = path.join(__dirname, 'assets');
console.log("public folder: " + publicFolder);

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  ...
  app.use(require('connect-coffee-script')({
         src: srcFolder, dest: path.join( publicFolder, 'js')
  }));

  app.use(stylus.middleware ({
    debug: true,
    force: true,
    src: path.join(__dirname, 'assets', 'src', 'styl' ),
    dest:  path.join(__dirname, 'assets', 'css')})
  );

  app.use(express.static(publicFolder));
});

然后在layout.jade方面:

script
  curl = {
        baseUrl: "/js",
        paths: {
          "jquery": "//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.0/jquery.min.js",
          "foo" : "foo.js",
          "index" : "index.js",
          "bacon" : "bacon.js"
        }
      };
script(src='/js/curl.js')
script
  //debugger; 
  curl(['js!jquery', 'js!bacon', 'js!foo!order', 'js!index!order'])
    .then(function(){
          console.log("scripts loaded");
          },
        function(){
          alert("a module failed to load");
         });

答案 1 :(得分:0)

我将提供另一种解决方案,它不是连接中间件。我编写了工具 - camel,用于将coffeescript与require风格的AMD风格加载器一起使用。

要使用驼峰,您可以:

  • npm install camel
  • camel YOURPROGRAM.coffee

YOURPROGRAM.coffee应该用AMD风格编写。

对于小例子,您可以查看:

对于Big示例,您可以查看:

它使用带有AMD风格库的Camel,服务器端的WebWorkers和其他HTML5案例,所有代码都在CoffeeScript中。