就依照 RESTful 的设计,例如一个 Post resource 就有 new、edit、show 和 index 四个 page,如果我对于这四个页面都有他们各自的 css 和 script,我现在是都写在 app/assets/javascripts/posts.js.coffee
和 app/assets/stylesheets/posts.css.scss
里面。
但这样进入各个 page 常会载入用不到的东西(例如进入 show,会载入 posts.js.coffee
和 posts.css.scss
但只用得到里面的 1/4 的程式码和 style)。
但若把 javascript 和 css 又各分成 4 个,这样会变成 8 个档案。在进行 assets precompile 之前,我要在 config/environments/production.rb
先定义额外的 assets:
config.assets.precompile += %w(posts_new.css posts_edit.css posts_show.css posts_index.css)
这样会变得很冗长,所以想来此请教前辈们该如何管理这些档案比较恰当?
把全网站的 javascript 和 css 档案 precompile 成 1 个档案是好方法吗?
#4 楼 @tonytonyjan 本身这种 precompile 的方式就决定了没法按需加载。
如果能做到 require 的 application.js 可以根据页面不同加载不同的话就行了。问题是做不到.( 或者说我不知道有什么办法。
在前端领域近期也有非常多的这样的尝试。让我觉得 asset-pipeline ( sprocket 也许不是问题的最终答案。
看了楼上的回复,有两点我不赞同: 一次加载可以利用缓存,难道多次加载就不能利用缓存了吗? asset pipeline 并不是说非要把所有 js 和 css 合并成一个,你可以看下 http://rubyonrails.org 的官网有多少次请求。如果有人找到官方的说明,请附上链接。
#3 楼 @tonytonyjan 同样你的想法,按需加载。我一般是这么做的,在 layout 里加上
= javascript_include_tag "application"
= yield :javascripts
通用的放到 application.js 里,个性的 view 里使用
content_for :javascript do
#...
end
来加载,如果像你这样命名很规范的,就更简单了,
content_for :javascript do
javascript_include_tag "controller_name/#{action_name}"
end
另外config.assets.precompile
里是可以用正则来匹配文件的,没必要一个个写。
@hooopo 不一定要每个页面一个啊。我觉得 css 是没必要分了,反正大也大不到哪里去,顶多加一个 admin 后台的文件。js 可以按大的功能块合成几个,比如用户管理部分的 js 可以合成一个,一般浏览网站页面的时候就没必要加载。