新手问题 不同 controller 加载不同 assets 最佳方法

lilijreey · 发布于 2016年08月17日 · 最后由 FrankFang 回复于 2016年08月20日 · 1392 次阅读
24996

Rails的预编译清单文件只有一个就是 application.js.要是把所有的资源都在这里面加载会导致很多页面加载无用js,css,文件的情况. 但是清单文件只认application.js 每个控制权的coffee文件并不支持清单文件的加载语法. 需要手动修改Rails.application.config.assets.precompile .有没有什么好方法,可以让不同的controller只加载自己需要的js,css文件.

共收到 13 条回复
845

可以通过给页面加 controller 标识,然后让 js 去查找这个标识决定加载不加载。

layouts/application.html.erb

<body data-controller-name="<%= controller_name  %>">
...
</body>

xxx.js

$(function(){
  if($('body[data-controller-name="xxx"]').length > 0) {
    return ;
  }

  // your logic here
})
24996

#1楼 @bastengao 这个可以加载的资源,不会被rails自动编译. 比较麻烦.

23140

http://theflyingdeveloper.com/controller-specific-assets-with-rails-4/

我发现下面“相关话题”有很多东西👇

24996

#1楼 @bastengao #3楼 @jojoma 看了一下Rails5的文档,有给出Controller Specific Assert的做法 对于把文件加载到pipeline 使用下面这个会好一些. 不需要每个都手动添加.

Rails.application.config.assets.precompile += 
  Dir.entries('app/assets/javascripts/').select{ |name| name =~ /.*\.coffee$/}  +
  Dir.entries('app/assets/stylesheets/').select{ |name| name =~ /.*\.scss$/}

845

#2楼 @lilijreey 可能我没有说清楚,所有的 js 还是会全都编译到一个 application.js, 但是对应的代码只在特定的 controller 下面执行。

24996

#5楼 @bastengao 恩,我知道.但是我不想把所有代码编译到一个文件中,因为这样会引入大量无用代码.

24996

目前使用的这个方法还是有问题的,比如有的资源文件是空的,还是会请求一次.

目前自己写了一个view heapler

 module ApplicationHelper
  HAS_CONTROLLERS=[].freeze
  def controllerAsset
    if HAS_CONTROLLERS.include?(params[:controller])
      params[:controller]
    else
      ""
    end
  end
end

来判断是否需要加载asset

1107

#7楼 @lilijreey https://github.com/jasl/a_rails_start_up_omakase/blob/master/app/helpers/application_helper.rb#L94-L98 类似这样的写法就可以了,几年前写的,应该还可以用 需要有定制assets的页面在view里调一下这helper

1107

对应代码只在特定action执行也很容易,可以在html标签上加class属性,里面添加好action和controller信息,然后嘛... jquery呀

1
  1. 删除 Turbolinks
  2. 清空 application.js 里面的内容
  3. 不要在布局 javascript_include_tag 'application'
  4. 配置文件里面 config.assets.precompile += '*.js' 把每个文件都独立编译。(如果你不担心静态文件缓存,不需要 hash tag,不需要预处理,那么直接放 public 目录里面就行了)
  5. 在每个页面单独 javascript_include_tag 需要的 js 文件。(如果放在 public 目录,就直接写 script 标签)

成功回到 Rails 2 时代。

6636

我尝试过一种方式,application.js 或者 application.css 其实是当manifest文件来用的。 文件夹下的 index.js文件也当成manifest来用,这样的话可以这样组织代码

-lib/assets/javascripts/
-----------------users_app/
--------------------------models/
--------------------------views/
--------------------------helpers/
--------------------------etc...
--------------------------index.js
index.js 文件的内容
//require_tree ./models
//require_tree ./views
//require_tree ./helpers
//...etc

在 app/assets/javascripts 文件夹下创建一个 users.js(controller同名)并加入到预编译配置中:
config.assets.precompile += 'users.js'

users.js文件的内容
//require jquery
//require xxx
//require users_app
写一个helper方法
def include_javascripts_by_controller
  javascript_include_tag params[:controller] if ['users'].include?  params[:controller]
end

在application.html.erb中使用

<%= include_javascripts_by_controller %>

PS: 这样做之后不知道 Turbolinks 好用不好用,Rails 5中也没有试过 :)

96

一次加载有一次加载的好。 加载了又不会执行,浪费点流量而已。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册