我正在使用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'], ($) ->
// ...
答案 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