require.js和预编译资产w / rails

时间:2012-08-29 02:52:41

标签: ruby-on-rails ruby-on-rails-3.2 requirejs

我正在使用requirejs-rails gem以及各种第三方javascripts。在开发中,这一切似乎都在起作用......即使在预编译我的资产时,无论在临时/生产(heroku)中它都找不到资产。

以jQuery为例(使用jquery-rails gem)。如果我做的话,从heroku控制台

Rails.application.assets.find_asset('jquery.min')它找到资产 (/app/vendor/bundle/ruby/1.9.1/gems/jquery-rails-2.1.1/vendor/assets/javascripts/jquery.min.js“)。

但是,如果我尝试浏览domain.com/assets/jquery.min.js,我会收到404。

我的requirejs-rails配置是:

shim:
  jquery:
    exports: '$'
  jquery-ujs:
    - jquery
paths:
  jquery: jquery.min
  jquery-ujs: jquery_ujs

在我的application.js.coffee中我有

require ['jquery', 'jquery-ujs'], ($) ->
  // ...

2 个答案:

答案 0 :(得分:3)

requirejs-rails的工作方式(以及来自requirejs的r.js)是它将编译它所知道的所有javascript文件(通过requirejs.yml中的路径或通过代码中的实际定义调用)进入一个大文件,然后可以进行uglified,压缩和缓存(通过在名称中包含摘要)。因此,如果你有一个名为/assets/views/my_view.js的文件可以在dev中访问,http就不再存在于生产中(因为它是你application.js的一部分)。

在您的情况下,如果您在生产中查看application-<digest>.js(您可以通过查看所提供的应用程序页面的html获得实际摘要),您将看到jquery已经包含在那里(您可以看到许可评论)。

因此该文件存在,它作为application-<digest>.js的一部分正确提供,您不应该依赖它直接可用。由于资产管道和requirejs-rails插件的重点是将所有文件编译成一个缩小的压缩文件,以提高页面性能。

答案 1 :(得分:0)

我没有使用过requirejs,但你检查过Rails.application.assets.paths以确定哪个资产在哪里?还要确保在当前环境中正确设置config.action_controller.asset_host