我正在尝试让sprokets编译一个独立的js资产,因此它将uglify并缩小它并成为整个rails项目的一部分。
我需要这个js有一个非摘要的名字,所以它不会改变(即嵌入其他网站等)
我似乎无法强迫rails(4)/链轮进行我的出价。
我尝试了什么:
在资产/ javascripts下的misc文件夹中添加资产(script.js
),而不是在sprockets javascript清单中加载它。虽然这使它保持在项目中,但它不会被弄脏和缩小,并且不会通过资产同步自动加载。
尝试向scripts-manifest.js
资产添加另一个名为//= require script.js
的清单,在application.rb
的预编译路径中添加其路径,但问题是rails 4为所有人添加了摘要资产无论如何(不像rails 3那样工作)
尝试使用https://github.com/alexspeller/non-stupid-digest-assets添加资产的非摘要版本。我可能做错了,因为它不起作用或做任何事情......
我添加了初始化程序NonStupidDigestAssets.whitelist = ["script.js"]
,并尝试将其放在app / assets / javascripts / misc和public /但仍然无效/
我已经读过这个宝石应该在大多数情况下都有帮助,而且我确信我在路径定义上做错了,或者在某处没有包含它
答案 0 :(得分:1)
一种方法是添加一个直接生成编译版本的初始化程序。
/app/assets/javascripts
中的子文件夹中。请勿在{{1}}中包含此内容,因此不会将其添加到已编译的资产中。在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))
在您的应用程序布局中包含公共js文件(在此示例中为:File.open(output_file, 'w') {|f| f.write(uglified) }
)
通过这种方式,您可以直接访问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轨以来,已消除了非消化资产的生成(有充分理由),这是实现所需行为的简单直接方式。