Является ли RJS злом и почему?

Я слышал, как группа разработчиков рельсов говорила, что RJS — это зло. Я никогда не использовал его, так как мне всегда удавалось делать то, что я хотел, используя классический javascript или jquery, поэтому я не обращал внимания. Теперь я перехожу к устаревшему коду, и везде есть RJS.

Так... это правда? Каковы недостатки/преимущества использования RJS?


person marcgg    schedule 17.11.2009    source источник
comment
Что означает RJS для R?   -  person JaredPar    schedule 17.11.2009
comment
LOL - сначала я подумал, что это среднеквадратичное значение, и мне стало интересно, что вы имеете против Ричарда Столлмана или среднеквадратичного значения.   -  person Andy West    schedule 25.11.2009


Ответы (7)


Давайте поговорим о том, что такое RJS, прежде чем говорить о том, зло это или нет.

RJS применяет тот же уровень абстракции к высокофункциональным библиотекам Javascript, что и ActiveRecord для SQL. Однако покрытие RJS для библиотек Javascript далеко не так полно, как покрытие адаптеров SQL ActiveRecord.

Rails поставляется с поддержкой RJS только для Prototype/Script.aculo.us. Однако существуют плагины, доступные или находящиеся в разработке, для поддержки других библиотек Javascript. Например, JRails переписывает помощники на основе прототипа для работы с jQuery. Подобные плагины существуют для mootools и, возможно, для Dojo.

Люди, которые считают RJS злом, как правило, это те, кому не нравится, когда с его помощью создается код прототипа, или те, кто считает, что с помощью необработанного Javascript можно добиться большего.

RJS не идеален, так же как ActiveRecord не идеален, время от времени вам приходится опускаться до написания сырого Javascript или SQL, чтобы выполнить свою работу. Опять же, как и в случае с ActiveRecord, чем удобнее вы будете пользоваться расширенными параметрами, тем больше вы сможете сделать без написания необработанного кода.

Одна замечательная особенность RJS заключается в том, что они по сути являются представлениями, которые создают Javascript. Очень легко извлечь RJS в партиалы, которые могут быть включены по мере необходимости либо как ответы контроллерам, либо как часть пользовательских функций Javascript, включенных в страницу. Это делает код более СУХИМ, что упрощает обслуживание.

Лично я часто использую RJS. Я считаю, что это идеальный способ коснуться множества элементов DOM одновременно. Он поставляется с двойным бонусом, позволяющим мне создавать сайты с поддержкой AJAX без написания большого количества Javascript. С другой стороны, я ненавижу писать Javascript.

person EmFi    schedule 20.11.2009
comment
+1 за отличный и краткий ответ, объясняющий плюсы и минусы. Как новичок в RoR, я всегда задаюсь вопросом, должен ли я использовать RJS в своем приложении или использовать библиотеку, такую ​​​​как jQuery, и обрабатывать ее самостоятельно. - person Wayne Molina; 21.11.2009
comment
+1: Слава Эмфи! Я ничего не знаю о RJS или ruby. (Ну хорошо, я знаю, что они существуют...) Я дал +1, когда вы обсуждали факты о том, что такое RJS, и мотивы того, почему людям нравится и не нравится RJS. Отличная работа! - person Jason D; 27.11.2009
comment
Люди, считающие RJS злом, как правило, недовольны созданием кода прототипа. Вы имеете в виду создание кода Javascript? - person tokland; 17.12.2010
comment
tokland, Да и нет. Хотя RJS действительно создает Javascript, поведение по умолчанию (на момент написания этого сообщения, я не уверен, что это все еще верно) было для создания Javascript, который сильно зависит от библиотеки Prototype. Javascript подойдет так же хорошо, как jQuery или любая другая библиотека, где Prototype используется в этом случае. Я хотел подчеркнуть, что RJS производит больше, чем просто Javascript. - person EmFi; 17.01.2011

Учитывая, что я заменил свою базовую библиотеку Prototype на JQuery в своих проектах Rails, я обнаружил, что RJS весьма полезен. Иногда это может быть проблемой, поскольку передача JavaScript обратно на сервер для выполнения еще не совсем распространена.

Впрочем, я не нашел проблем с этим RJS в целом. Единственная жалоба, которая у меня есть, заключается в том, что мне обычно приходится смешивать RJS и старый добрый Javascript в моих файлах .rjs, так что это немного бессмысленно. Но это дает вам чистое место/способ обработки ваших эффектов Javascript и вызовов AJAX, поэтому я думаю, что как «стандартное место для размещения вашего кода» это довольно приятно.

person Topher Fangio    schedule 17.11.2009
comment
Спасибо за ответ! Можете ли вы поместить jQuery/классический javascript в файл .rjs? - person marcgg; 17.11.2009
comment
@marcgg — если вы используете JRails (github.com/aaronchi/jrails), вы можете поместить JQuery внутрь. Однако классический Javascript будет работать независимо от того, какую библиотеку вы используете. Однако есть специальный способ вставки. Проверьте dev-journal.3dmdesign.com/development / для получения дополнительной информации. - person Topher Fangio; 17.11.2009

Я не знаю, зайду ли я так далеко, чтобы сказать зло, но RJS (или любой серверный язык, генерирующий JS) не был бы моим первым выбором. Я предпочитаю писать JS вручную. С jQuery мне действительно нравится писать JS, и сохранение моего JS в application.js просто кажется чистым.

Чтобы немного расширить... Я считаю RJS ненужной абстракцией. Я хочу знать JavaScript и jQuery. Я хочу знать, как манипулировать DOM и как делать вызовы AJAX. А с моим знанием JS/jQuery я могу перейти на другой framework легко и не интересно, справится ли фреймворк с моим JS за меня.

person Andy Gaskell    schedule 17.11.2009
comment
RJS — это файл JavaScript со встроенным Ruby. Это отдельная проблема от JavaScriptHelpers и т. д., которые позволяют вам делать такие вещи, как: page.insert_html :bottom, 'list', content_tag(li, Fox) - person MattMcKnight; 24.11.2009
comment
Да, вы пишете код Ruby для генерации JavaScript, и если это работает для вас, то это здорово. Это просто не для меня. - person Andy Gaskell; 24.11.2009
comment
Я думаю, это не то, что я называю RJS. Шаблоны RJS больше похожи на файлы html.erb — шаблоны для возврата JS в браузер для оценки в качестве ответа на вызов AJAX. Все они могут быть написаны вручную на JS, но добавление ruby ​​позволит вам интерполировать значения из остальной части вашей программы. - person MattMcKnight; 20.12.2009

RJS хорош главным образом тем, что его легко интегрировать в проекты Rails. Чтобы все упростить и уменьшить количество файлов, вы можете встроить его в свои контроллеры, и у него есть много простых в использовании помощников из библиотек прототипов/scriptaculous. Он больше похож на Ruby.

Это означает, что он не так четко отделен от вашего обычного кода Rails, поскольку довольно быстро смешивается с остальным кодом. Это также требует включения гораздо большего количества внешних библиотек через файлы прототипов и scriptaculous js.

Некоторые вещи jQuery очень чистые. Синтаксис довольно сумасшедший, но это означает, что вы можете полностью вытащить свой js из своих страниц/контроллеров (ненавязчивый js), что является гораздо более чистым/разделенным способом ведения дел.

Более того, jQuery выглядит как javascript. Таким образом, вы не получите эту странную смесь javascript и кода Ruby. Мне нравится Руби. Я не люблю Javascript. Но смесь этих двух мне нравится еще меньше. Если вы знаете JS, он покажется вам знакомым.

У Райана Бейтса есть скринкаст о преобразовании RJS в jQuery. Может дать вам хорошее представление о синтаксической разнице между ними: http://railscasts.com/episodes/136-jquery

person Lukas    schedule 20.11.2009
comment
Более того, jQuery выглядит как javascript. Таким образом, вы не получите эту странную смесь javascript и кода Ruby. Этот аргумент является обратным. С помощниками вы не получаете код JavaScript в своем коде, который вы получаете: page.insert_html :bottom, 'list', content_tag(li, Fox) - person MattMcKnight; 24.11.2009
comment
Это если вы ратуете за RJS. Если я выступаю за JS, мне не нужен код Ruby в моем JS. Есть еще много случаев, когда для получения правильной функциональности JS я в конечном итоге использую JS, а не все эти помощники. Это просто проще. А с помощью jQuery я могу переместить все это из своего кода Ruby в Javascript и использовать вспомогательные функции только при необходимости. - person Lukas; 24.11.2009

Если вы не знакомы с JS (или такими фреймворками, как Prototype), но вам нужна функциональность AJAX — RJS — лучший способ для этого. Еще одним преимуществом использования RJS является скорость. Пишите код RJS легко и быстро.

Раньше я использовал RJS во всех проектах Rails. Теперь я лучше познакомился с Prototype (и jQuery), и именно по этой причине я сейчас пишу код JS. Мне это нужно, потому что контроллер с большим количеством RJS потерял свою производительность. И перенос кода RJS в JS был первым шагом к масштабированию контроллера.

Никто не может вам однозначно сказать, как лучше - использовать RJS или нет. Каждый должен выбрать свой путь.

Например, я предпочитаю использовать RJS в административной части (где не нужно ничего масштабировать) моего приложения и писать JS для внешней части.

person Alex Kurkin    schedule 21.11.2009

RJS не «зло», но я думаю, что проблема с ним двояка:

  1. Трудно (невозможно?) сделать ненавязчивый JavaScript с RJS. Если вы пишете приложение с большим количеством Javascript и имеете много логики, и эта логика меняется, вам придется изменить значительное количество файлов, а не только один. Кроме того, и это личное предпочтение, довольно уродливо видеть теги со сжатым Javascript, разбросанные по всему тексту.

  2. RJS абстрагирует Javascript, что может привести к незнанию языка. Идея RJS заключалась в том, чтобы дать разработчику возможность написать все для веб-приложения (кроме HTML и CSS, которыми, вероятно, займется дизайнер), используя только один язык: Ruby, но на практике это не так. что возможно, но не рекомендуется, создавать приложения ASP.NET путем перетаскивания элементов управления или использования большого количества мастеров, создающих тяжелый код. Если все, что вам нужно, это простое решение, требующее Ajax, то RJS отлично подойдет.

RJS — хороший инструмент, когда вы только начинаете работать с Rails и вам нужны некоторые «быстрые и грязные» эффекты Ajax, которые используются экономно (например, канонический комментарий для блога, который появляется на той же странице). Как только вы начинаете требовать интенсивного использования Javascript, RJS становится большим препятствием, потому что он защищает разработчика от чего-то, что он действительно должен пытаться понять.

person Wayne Molina    schedule 21.11.2009
comment
Разве самая ненавязчивая форма JavaScript не та, которую вы даже не видите? - person MattMcKnight; 24.11.2009
comment
RE: Пункт 2. Я знаю многих разработчиков, которые не могут написать веб-сервис без использования какого-либо инструмента или провести рефакторинг без помощи IDE. Я думаю, что проблема заключается в разработчике, а не в инструменте - person Jeremy S; 27.11.2009

RJS — это просто JavaScript-эквивалент RHTML (теперь известный как html.erb). Это шаблон, который выполняет встроенный Ruby и возвращает JavaScript в браузер для обновления страницы. Это позволяет лучше контролировать то, что происходит в результате действия на стороне сервера в приложении AJAX. По сути, результаты вызова RJS оцениваются интерпретатором JavaScript в браузере. Сравните это с приложением AJAX без RJS, где сервер возвращает HTML, который вставляется на страницу обратным вызовом для асинхронного запроса.

«Злая» часть заключается в том, что многим людям не нравится «eval», но я думаю, что это также может быть результатом какой-то путаницы.

Многие из приведенных здесь ответов сосредоточены на помощниках JavaScript, Prototype и Scriptaculous, которые часто используются, но не являются обязательными, как часть шаблона RJS. Я широко использую эти помощники, поскольку они лучше сочетаются с кодом Ruby в шаблонах, но они не являются необходимой частью RJS.

person MattMcKnight    schedule 24.11.2009