如何Monkey补丁Rails使用Gulp rev-all Manifest.json



我使用的是Rails 4.2、Ruby 2.2

我使用生成了一个新的应用程序:rails new应用程序--跳过链轮

我所有的Gulp任务都成功运行了(其中很多:从gump changed和gump livereload到gump minify css、gump uncss和其他)。

使用gulp-rev,我能够使用MD5指纹命名约定生成所有资产。

它们被正确保存到rev manifest.json

app/assets/rev manifest.json:

{
  "rev-manifest.json": "rev-manifest.9680cee8.json",
  "images/measurement.png": "images/measurement.cedb4145.png",
  "images/measurement2.png": "images/measurement2.cedb4145.png",
  "scripts/chachin.js": "scripts/chachin.5f30b461.js",
  "stylesheets/chachin.scss": "stylesheets/chachin.4c7c499d.scss"
}

app/helpers/application_helper.rb

module ApplicationHelper
  def stylesheet_link_tag(url, options={})
    url = AssetManifest.stylesheet_path(url)
    super(url, options)
  end
  def crossorigin_javascript_include_tag(url, options={})
    url = AssetManifest.javascript_path(url)
    super(url, options)
  end
  def image_tag(url, options={})
    url = AssetManifest.asset_path(url)
    super(url, options)
  end
  def image_path(url, options={})
    url = AssetManifest.asset_path(url)
    super(url, options)
  end
  def image_url(url, options={})
    url = AssetManifest.asset_path(url)
    super((ActionController::Base.asset_host || "") + url, options)
  end
end

config/ininitializers/asset_manifest.rb

class AssetManifest
  def self.manifest
    if File.exists?("app/assets/rev-manifest.json")
      @manifest ||= JSON.parse(File.read("app/assets/rev-manifest.json"))
    end
  end
  def self.stylesheet_path(url)
    if AssetManifest.manifest
      url += ".css" unless url.end_with?(".css")
      AssetManifest.manifest[url] || url
    else
      url
    end
  end
  def self.javascript_path(url)
    if AssetManifest.manifest
      url += ".js" unless url.end_with?(".js")
      AssetManifest.manifest[url] || url
    else
      url
    end
  end
  def self.asset_path(url)
    if AssetManifest.manifest
      AssetManifest.manifest[url] || url
    else
      url
    end
  end
end

我是不是错过了什么?

Rails.root合并到资产清单文件的路径中可能是个好主意。

以下是我所做的:

config/ininitializers/asset_manifest.rb

class AssetManifest
  MANIFEST_FILE = "rev-manifest.json"
  class << self
    def manifest
      @manifest ||= read_manifest(manifest_file_path)
    end
    def stylesheet_path(url)
      url += ".css" unless url.end_with?(".css")
      AssetManifest.manifest[url] || url
    end
    def javascript_path(url)
      url += ".js" unless url.end_with?(".js")
      AssetManifest.manifest[url] || url
    end
    def asset_path(url)
      AssetManifest.manifest[url] || url
    end
    private
    def manifest_file_path
      File.join(Rails.root, "app", "assets", MANIFEST_FILE)
    end
    def read_manifest(path)
      if File.exists?(path)
        JSON.parse(File.read(manifest_file_path))
      else
        {}
      end
    end
  end
end

帽子提示至https://bugsnag.com/blog/replacing-the-rails-asset-pipeline-with-gulp关于如何使用gump而不是链轮作为资产管道的精彩介绍。

最新更新