3

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

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

我似乎无法强迫 rails (4) /sprockets 来做我的竞标。

我尝试了什么:

  1. script.js在 assets/javascripts 下的 misc 文件夹中添加资产 ( ),而不是将其加载到 sprockets javascript 清单中。虽然这将其保留在项目中,但它不会被丑化和缩小,也不会通过资产同步自动加载。

  2. 尝试添加另一个名为asset的清单,以将其路径添加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/ 但它仍然无法工作/

我已经读过这个 gem 在大多数情况下应该会有所帮助,而且我确信我在路径定义上做错了,或者在某个地方没有包含它

4

3 回答 3

1

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

  1. 将您的 js 文件添加到/app/assets/javascripts. 不要将其包含在内,application.js因此它不会添加到已编译的资产中。
  2. 创建一个/config/initializers直接使用 uglify的初始化程序

    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))

    File.open(output_file, 'w') {|f| f.write(uglified) }

  3. /public/public_script.js在您的应用程序布局中包含公共 js 文件(在此示例中为:)

通过这种方式,您可以直接访问对uglify如何处理您的 js 进行自定义更改,并且文件的位置永远不会因为您的外部服务访问它们而改变。

我在本地完成了所有这些,并测试了它使用 Rails 4.2 的 beta 版本是否有效

于 2014-12-02T23:50:47.193 回答
1

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

我创建non_digest.rbconfig/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

于 2016-09-27T06:23:09.380 回答
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

自 rails 4 以来,非消化资产的生成已被删除(有充分的理由),这是实现所需行为的一种简单直接的方法。

于 2014-12-08T10:59:22.097 回答