Rails Rails 默然为每个 controller 生成 一个 js 不应该是每个 action 一个 js 吗

xiongmaojames · 2015年04月23日 · 最后由 xiaoronglv 回复于 2015年05月04日 · 2604 次阅读

每个 action 会让页面重新加载一次 documentready 事件的处理 通常 都一样 ,请问 这个问题 大家是怎么处理的?

请高手 发表你的看法

为何 无人 回复 ,刚来 rubychina

你好,我是管理员 Daniel 首先通过你的帖子,我判断你对 DOM Ready 的理解不深。 另外你没有提出正确的问题,或者你可能没有搞明白你的问题是什么,所以我把你的帖子移动到了 NoPoint 节点。

以 action 生成,颗粒度太细了

#4 楼 @huacnlee NoPoint 在主题列表没有隐藏。

#5 楼 @rei 漏了,好像是两个 nin 没合并

@huacnlee 那通常 什么 时候 使用 domready 事件呢 ,在 requirejs -.net 中 默认 会 加载 与 action 同名 的 js

不会的,rails pjax 的机制并不会反复加载资源文件

#7 楼 @xiongmaojames 首先,不应该为每个 action 生成一个 JS,也不需要为每个 controller 生成一个 JS。

具体需要多少个 JS 文件看需求,或者根据业务逻辑分解成多少个 JS 文件。另外无论多少个 JS 文件,在部署的时候都应该合并成一个 JS 文件,以方便缓存。

看来 是要 换个 思路 一直以来 喜欢 用 dom ready

实际上不是每个界面,都会用到全部的 js ,开发的时候 不需要考虑 按需 加载吗,还是 说 js 不是特别多的 时候 ,不用 考虑这个问题

Rails 有自己一套前端 “哲学”,可以看这里大概了解 http://guides.ruby-china.org/working_with_javascript_in_rails.html

归纳起来就是:UJS + SJR + Assets Pipeline + Turbolinks 。

不要觉得前端社区造出的 requirejs 就一定领先,为了性能优化还是要服务端打包压缩,还缺了 md5 签名;另外也一样有跟不同载入方式的包的兼容问题。见 http://requirejs.org/docs/faq-optimization.html

楼主别纠结了,放弃 rails 的 Assets Pipeline 吧,在这里都是 rails 的死忠,问不到 rails 哲学之外的答案的

@tini8 你用 rails 时,怎么处理这些问题的

@rei 剥离 js 之后,如果页面异步的发生变化以后,那些自定义属性谁来处理?指教

paintIt = (element, backgroundColor, textColor) ->
  element.style.backgroundColor = backgroundColor
  if textColor?
    element.style.color = textColor

$ ->
  $("a[data-background-color]").click ->
    backgroundColor = $(this).data("background-color")
    textColor = $(this).data("text-color")
    paintIt(this, backgroundColor, textColor)

<a href="#" data-background-color="#990000">Paint it red</a>
<a href="#" data-background-color="#009900" data-text-color="#FFFFFF">Paint it green</a>
<a href="#" data-background-color="#000099" data-text-color="#FFFFFF">Paint it blue</a>

比如这个例子 页面 加载完毕 之后,给 a 标签 绑定了相应的事件 ,如果 我 ajax 又添加了几个同样的 a 新增加的 a 就没人给他绑定 事件呀

@rei 明白我的 意思吗

#19 楼 @xiongmaojames 改成:

$(document).on 'click', 'a[data-background-color]', ->
  backgroundColor = $(this).data("background-color")
  textColor = $(this).data("text-color")
  paintIt(this, backgroundColor, textColor)

#19 楼 @xiongmaojames 所有的事件绑定都应该用 on 而不是特定的方法比如click ……

这种情况要绑在更高一层……具体还是多看看 jQuery 文档……这跟 rails 没关系了……

@kabie @rei 好的谢谢了 ,刚才 的代码 是在 指南中《 在 Rails 中使用 JavaScript》懂了 谢谢!

@kabie @rei 好的谢谢了 ,刚才 的代码 是在 指南中《 在 Rails 中使用 JavaScript》看到的,所以有疑问,你们告诉我放在 on 上我 懂了, 谢谢!

看来对前端的误解还是挺广泛的啊。

  1. require.js 领不领先和 rails 里使用 js 是什么哲学没有直接关系,它们并不是互斥的。相信楼主也不是说这两者谁比谁更 “领先” 的问题,而是在 rails 的情景下如何应用异步加载。那么我建议你去搜索一下 rails + require.js,在这里扯起来就有点累了。

  2. 楼主你的确缺少对 rails 的理解,而且即便抛开 rails,使用 require.js 也不一定要让每个模块都依赖于 domcontentready;更何况 rails 使用了 turbolinks 有提供另一套事件机制的,我敢打赌你没有看过相关的文档,所以也不要怪别人觉得你的问题有些莫名其妙。

后面的问题,关键点就在用好事件委托,on 方法只是形式,也是 jquery 目前提供的推荐接口……我好担心你们离开了 jquery 就没法干活了。

对大家而言,我觉得最好不要用纯 rails 的视角去看到前端的生态系统,反之亦然。有可能的话,最好两边都对照着理解一下,相互印证才能通晓其然,而具体到了使用场景则应该尊重既定事实的生态圈,除非你有能力改进它,融合二者的优点或改进某种的缺陷,相信到了那一步就会少去很多在这里发生的 “偏见”。

#16 楼 @xiongmaojames 每个 controller 的 js 分开,不用那种都压缩到一个文件的方式,区别各个 action 的时候用 js 判断一下 url

ok 问题 复杂了 ,我们 来 简化 分析 一下 ! 通常 大家 在项目中 A :全部压缩为一个 js B :依赖 controller 和 action c:根据其他的规则, 是 使用 哪一种 ,最好 说明 你的哲学 !

@rei $(document).on 'click', 'a[data-background-color] 所有的事件都 通过这种 方式 绑定 吗 那 document 的 click 忙的过来吗

#29 楼 @xiongmaojames 我一般是绑在最近的不会改变的父节点。。。 不过我也没对全绑在 document 这种做法做过性能测试……

#30 楼 @kabie ok 不是 纠结 这个 问题,我是想 知道 你们 是怎么 把 一个 网站 的 js 都一次性加载

我想 我还是 要 使用 requirejs angularjs 等前段框架了

#33 楼 @xiongmaojames 你明不明白在前端工程里为什么会出现把 JS 文件打包成一个并且压缩这种 “招数”?你想明白这个问题就一切就迎刃而解了。

明确的告诉你,理想的情况下肯定是不用打包也不用压缩才是 “最应该” 的!只不过这个理想的情况迟迟没有到来罢了,幸运的是它越来越近了,因为许多前提条件都在逐渐达成,细节在这里就不铺开了,自行研究吧。

requirejs 不是框架,是用来让浏览器实现异步加载模块的一个工具库,你想想看为什么要 “异步” 加载然后再想想我前面的问题吧。

甚至 angular 都算不上框架,不过它算是可以用来造框架的工具集,它由很多模块组成,但它本身并没有按模块加载的机制。

@nightire 好吧!我只是寻求 一种 较为 合理 或者说 ,rails 是怎么加载 js 的!请大神 写篇博文 ,或者 给个示例 !我们总是在这里整概念 ,又有什么用呢?

我是来赞 @nightire 的。

huopo125 UJS + SJR + Assets Pipeline + Turbolinks 资料 提及了此话题。 08月01日 15:40
需要 登录 后方可回复, 如果你还没有账号请 注册新账号