如何使用Laravel在主CoffeeScript中要求其他CoffeeScripts文件?

时间:2015-06-05 08:25:25

标签: php laravel coffeescript asset-pipeline laravel-elixir

我有一个带有“Ruby on Rails”框架的CoffeeScript项目。现在我想使用“Laravel”框架而不是“Ruby on Rails”。

在“Ruby on Rails”中,有“Sprocket”资产管道管理库。使用“Sprocket”,我可以使用#= require#= require_tree语句导入主coffeescript文件中的其他coffeescript文件,例如

#= require views/view
#= require_tree ./views

#= require_tree ./templates

init = ->
  document.removeEventListener 'DOMContentLoaded', init, false

  if document.body
    app.init()
  else
    setTimeout(init, 42)

Laravel对这些#= require#= require_tree声明的对应方是什么?还有其他方法可以用Elixir解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

由于没有答案,我必须自己探索解决方案,这是一个解决方案。

Laravel-elixir版本(2.3.6)中,coffeescript有一个串联功能。您必须将coffeescript个文件存储在resources/assets/coffee目录中。然后,gulpfile.js中的以下脚本将生成一个app.js,用于编译和连接所提供的数组参数中的所有coffeescripts。

elixir(function(mix) {
   mix.coffee(['app.coffee', 'collection.coffee']);
});

因此,您不需要在主要coffeescript文件中包含其他coffeescript文件,例如在Ruby on Rails的Sprocket中。

但是仍有一个问题是如何在多个目录中要求所有coffeescript个文件。这些coffeescript文件也应按顺序,以便它们的依赖关系不会中断。将每个coffeescript文件名按顺序编写是很麻烦的。以下脚本可以完美地解决此问题。

mix.coffee([
    'lib/license.coffee',
    'lib/*.coffee',

    'app/app.coffee',
    'app/config.coffee',
    'app/*.coffee',

    'collections/collection.coffee',
    'collections/*.coffee',

    'models/model.coffee',
    'models/*.coffee',

    'views/view.coffee',
    'views/*.coffee',

    'templates/*.coffee',

    'application.coffee'
]);

mix.scripts(null, 'public/js/vendor.js', 'resources/assets/coffee/vendor');

您可以要求目录中的所有coffeescript文件都带有'models/*.coffee'的*(星号)符号。

您还可以在要求目录中的所有文件之前,首先指定应该需要的文件,文件名为'models/model.coffee'。 Laravel-elixir非常聪明,无法再次编译和连接该文件。

这就是我在问题中解决问题的方式。