16

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

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

4

5 回答 5

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 文件。

于 2014-03-20T16:49:33.527 回答
6

短:你不能。

在预编译期间,Rails 会遍历 Application.js 文件并将所有导入合并到一个文件中,因此由于其中正在进行压缩,因此仅更改一个文件是不可能的。(它对没有从 application.js 引用的文件没有任何作用)

下一步:在进行快速修复时,您不必在开发期间运行 rake assets:precompile。仅在部署时(取决于您的耐心),让任务运行 5 分钟应该没问题。

您应该在开发期间使用不需要预编译资产的开发环境,因为 Rails 将为未合并和未缩小的资产提供服务。如果您在 web-server 中运行 Rails 构建,rails s这应该是默认设置,但您可以使用以下命令显式启动 rails 服务器:

rails s RAILS_ENV=development

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

于 2012-07-10T13:41:48.343 回答
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 和附加/asset.css。

就是说,您可能想查看guard-rails-assets gem。gem 支持预编译的方式很灵活;仅预编译更改的资产是可能的。我听说过一些关于它的好反馈,但我自己没有使用它。

于 2013-05-16T14:39:31.870 回答
3

@Tigraine 不正确。

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

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

其中 Screen 是我放置在样式表文件夹中的文件夹。喜欢assets/stylesheets/screen/。我调用 application.css

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

现在,如果你想为另一个布局创建一个 css 文件,你可以在下面创建它assets/stylesheets

喜欢 xxx.css

如果您需要xxx的多个文件,请按照与上述相同的步骤进行操作,但这里重要的部分是您将此行添加到

生产.rb

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

然后在您添加的布局内:

<%= stylesheet_link_tag    "xxx", media: "screen, projection" %>
于 2013-11-11T17:18:27.933 回答
3

你完全可以在没有 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 将连接所需的文件。

于 2015-06-14T07:24:31.183 回答