rake assets:特定JS文件的预编译

时间:2012-07-10 13:35:15

标签: ruby-on-rails asset-pipeline

我可以针对特定的JavaScript文件运行rake assets:precompile吗?

否则,完整的预编译将持续5分钟,并且快速更改JavaScript文件非常烦人。

5 个答案:

答案 0 :(得分:13)

如果您只想预编译一个文件,可以自定义rake任务,这样做非常容易。

namespace :assets do

  desc "compile one js file"

  task :compile_one_file => :environment do
    dest = "#{Rails.root}/vendor/assets/javascripts/compiled/"
    js_asset = "your_jsfile.js"
    File.write(dest + js_asset, Uglifier.compile(Rails.application.assets.find_asset(js_asset).to_s))
  end

end

然后从命令行

rake assets:compile_one_file

希望这会有所帮助,我发现这对于我不经常更改的供应商js文件很有用,例如jquery和jquery插件。这样,当我开发时,它加快了我的页面加载,使资产管道不必为我的供应商文件路由所有单独的请求。它只提供我所有供应商js的一个缩小的js文件。

答案 1 :(得分:5)

简短:你不能。

在预编译期间,Rails会遍历Application.js文件并将所有导入合并为一个,因此只是更改一个文件是不可能的,因为那里进行了压缩。 (它对未从application.js引用的文件没有任何作用)

接下来:您不应该运行rake资产:在进行快速修复时在开发期间进行预编译。只有部署在哪里(取决于你的耐心),任务运行5分钟应该没问题。

您应该在开发期间使用开发环境,其中不需要资产预编译,因为Rails将为未绑定和未缩小的资产提供服务。 如果您通过rails s在Web服务器上运行Rails构建,则默认情况下这应该是,但您可以使用以下命令显式启动rails服务器:

rails s RAILS_ENV=development

如果资产仍未正确显示或您看到错误,请确保您拥有config.assets.debug = true

答案 2 :(得分:5)

@Tigraine部分正确。 Rails 3.1+资产旨在由Rails完全管理,默认情况下所有资产将被编译为一个js和一个css资产。

...无论其

编译为单个资产依赖于使用由Sprockets gem处理的资产清单(application.js和application.css)。默认情况下,这些清单包括require_tree指令,它是包含所有文件的指令。如果删除该指令,则必须进行更多工作才能编译资产。

如果要构建单独的资源,可以在application.rb中设置配置选项。

config.assets.precompile += %w( additional/asset.css funky/stuff.js )

以上行会将文件additional / asset.css和funky / stuff.js添加到资源预编译时生成的文件的列表中(请注意'+ ='正用于扩展默认列表)。为了尽可能明确,这意味着您将预编译四个资产:application.js,funky / stuff.js,application.css和additional / asset.css。

那就是说,你可能想查看the guard-rails-assets gem。宝石在支持预编译方面具有灵活性;只能预编译已更改的资产。我听到了一些很好的反馈,但我自己没有用过它。

答案 3 :(得分:3)

@Tigraine不正确。

有可能,您只需创建文件夹并将css文件放入其中并将其导入资产文件夹中的不同文件。

application.css
 *= require_self
 *= require foundation_and_overrides
 *= require reset
 *= require_tree ./screen

屏幕是我放在样式表文件夹中的文件夹。比如assets/stylesheets/screen/。我用

调用application.css
<%= stylesheet_link_tag    "application", media: "screen, projection" %>

现在,如果您要为另一个布局创建单个css文件,请在assets/stylesheets

下创建该文件

与xxx.css一样

如果您需要 xxx 的多个文件,请执行与上述相同的步骤,但此处的重要部分是您将此行添加到

<强> production.rb

config.assets.precompile += %w( xxx.css )

然后在你添加的布局中:

<%= stylesheet_link_tag    "xxx", media: "screen, projection" %>

答案 4 :(得分:2)

如果没有Rails,你可以完全做到这一点。这可以使事情运行得更快,具体取决于您的环境。

quick_compile.rb

require 'sprockets'

sprocket =  Sprockets::Environment.new
sprocket.js_compressor = :uglifier # or read off config yml
sprocket.append_path('app/assets/javascripts') # the directory that holds you js src.

file = File.new('test_min.js','w+') # the output file path.
file.puts(sprocket.find_asset('test.js')) # the file to complie
file.close

如果您只想评估// = require语句,可以删除js_compressor设置。 Sprocket将连接所需的文件。