sprockets - 预编译独立资产

时间:2014-11-23 10:36:54

标签: ruby-on-rails-4 asset-pipeline sprockets digest pre-compilation

我正在尝试让sprokets编译一个独立的js资产,因此它将uglify并缩小它并成为整个rails项目的一部分。

我需要这个js有一个非摘要的名字,所以它不会改变(即嵌入其他网站等)

我似乎无法强迫rails(4)/链轮进行我的出价。

我尝试了什么:

  1. 在资产/ javascripts下的misc文件夹中添加资产(script.js),而不是在sprockets javascript清单中加载它。虽然这使它保持在项目中,但它不会被弄脏和缩小,并且不会通过资产同步自动加载。

  2. 尝试向scripts-manifest.js资产添加另一个名为//= require script.js的清单,在application.rb的预编译路径中添加其路径,但问题是rails 4为所有人添加了摘要资产无论如何(不像rails 3那样工作)

  3. 尝试使用https://github.com/alexspeller/non-stupid-digest-assets添加资产的非摘要版本。我可能做错了,因为它不起作用或做任何事情......

    我添加了初始化程序NonStupidDigestAssets.whitelist = ["script.js"],并尝试将其放在app / assets / javascripts / misc和public /但仍然无效/

  4. 我已经读过这个宝石应该在大多数情况下都有帮助,而且我确信我在路径定义上做错了,或者在某处没有包含它

3 个答案:

答案 0 :(得分:1)

一种方法是添加一个直接生成编译版本的初始化程序。

  1. 将您的js文件添加到/app/assets/javascripts中的子文件夹中。请勿在{{1​​}}中包含此内容,因此不会将其添加到已编译的资产中。
  2. application.js中创建一个直接使用uglify的初始值设定项

    /config/initializers

    output_file = "#{Rails.root}/public/public_script.js"

    input_file = "#{Rails.root}/app/assets/javascripts/non_digest/public_script.js"

    uglified = Uglifier.compile(File.read(input_file))

  3. 在您的应用程序布局中包含公共js文件(在此示例中为:File.open(output_file, 'w') {|f| f.write(uglified) }

  4. 通过这种方式,您可以直接访问uglify处理js的自定义更改,并且文件的位置永远不会因访问它们的外部服务而发生更改。

    我在本地做了所有这些并测试了它使用Rails 4.2的测试版

答案 1 :(得分:1)

只是想根据Ken的回答添加我自己的解决方案。

我在non_digest.rb中创建了config/initializers

Dir["#{Rails.root}/app/assets/javascripts/non_digest/*"].each do |asset|
  asset_name = File.basename(asset)
  asset_output = "#{Rails.root}/public/external/#{asset_name}"
  asset_uglified = Uglifier.compile(File.read(asset))

  File.open(asset_output, 'w') {|a| a.write(asset_uglified) }
end

不要忘记在javascripts/application.js中存根该文件。因为我们可能不希望它与我们的其他JS一起编译,我们可以继续使用//= require_tree .

//= stub non_digest/external_bookmarklet

答案 2 :(得分:0)

使用rails 4执行此操作的方式如下:

  • 将其添加到预编译列表config.assets.precompile += %w(your_file_name.js)
  • 确保application.js中没有引用它(直接或通过require_tree
  • 在部署时符号化消化的文件
    • 阅读manifest.yml以获取实际文件名
    • ln -s digested-filename.js actual-filename.js

自第4轨以来,已消除了非消化资产的生成(有充分理由),这是实现所需行为的简单直接方式。