Насколько большим преимуществом является языковая однородность в веб-приложениях? - PullRequest
10 голосов
/ 04 апреля 2011

Привет всем, это больше вопрос философии, чем все остальное. Я написал свое первое веб-приложение, календарь событий в Бостоне на http://bloozit.com. Я написал его на Python, и я очень доволен его простотой, однако мой Python содержит капли HTML, CSS и Javascript. как тушеное мясо с плавающими в нем головами рыб и глазными яблоками.

Затем я увидел этот учебник по веб-приложениям, использующим Lisp: http://www.adampetersen.se/articles/lispweb.htm Я прочитал On Lisp и написал несколько программ на Лиспе, так что я не Пол Грэм, но я знаком с ним. Одна вещь, которая мне очень понравилась, заключалась в том, как автор сгенерировал HTML и Javascript из Lisp, сделав все это красивым и однородным.

Вопрос в том, насколько ценна эта однородность в реальном мире? Всякий раз, когда что-то идет не так, вы должны загрузить страницу в Firebug, и тогда вы будете смотреть на сгенерированный HTML, CSS и Javascript, а не на исходный код Lisp, поэтому вы должны держать отображение в своей голове. Решает ли гомогенность, обеспечиваемая Лиспом, что-нибудь, или просто перекрывает проблему, которая в конечном итоге снова появляется вниз по течению?

Если есть кто-то, кто на самом деле пробовал оба подхода, я бы ДЕЙСТВИТЕЛЬНО хотел бы услышать от вас!

Ответы [ 4 ]

5 голосов
/ 04 апреля 2011

Ну, я потратил год на программирование с использованием parenscript и ht-ajax, и в конце концов сдался и просто сгенерировал javascript вручную (все еще используя hunchentoot на сервере).Я обнаружил, что результат был гораздо более предсказуемым, и, как вы подразумеваете в своем вопросе, это значительно облегчило понимание того, что происходит при использовании firebug.(Я также переключился на использование jquery, который был намного лучше, чем ht-ajax, но это не совсем то, о чем вы просите).

Тем не менее, я настоятельно рекомендую cl-who (http://weitz.de/cl-who/),что делает динамическое генерирование HTML намного более аккуратным.

4 голосов
/ 04 апреля 2011

Вопрос в том, насколько ценна эта однородность в реальном мире?

Вероятно, довольно важно: посмотрите на всех людей, делающих Javascript на стороне сервера в наши дни. Javascript ни в чем не превосходен, и его поддержка библиотек для серверного кода вовсе не так уж хороша, но его использование дает большие преимущества.

Когда что-то идет не так, вы должны загрузить страницу в Firebug,

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

Например, если вы генерируете свой CSS из s-exps, то проблемы с вашим CSS могут заставить вас взглянуть на «скомпилированный» CSS только из-за странных синтаксических проблем (например, уловок IE6). Если вы просто посмотрите на страницу и решите, что вам нужна дополнительная рамка, вы можете добавить (:border 1) и покончить с этим. (Конечно, если вы обработаете это, чтобы сгенерировать целый набор правил CSS для обслуживания клиента, это будет еще большая победа.)

Еще один способ подумать об этом: в очень редких случаях мне приходилось извлекать анализатор пакетов и дизассемблер при работе с современным веб-приложением. Да, это отстой, но с хорошими библиотеками это тоже очень редко. Я бы не стал писать низкоуровневый код весь день, чтобы избежать несоответствия импеданса при переключении на анализатор пакетов в тех редких случаях, когда мне нужен такой уровень информации.

Это предполагает, что вы хотите и можете достичь уровня, на котором вы пишете (V) код HLL. Common Lisp не может превзойти C в том, что он C, и если вы просто пытаетесь выплеснуть простой блог в HTML, то и вам это не место: Rails уже действительно хорош в подобных вещах. Но существует множество экспериментальных программ, в которых полезно изменить один флаг и запустить код на клиенте, а не на сервере.

и тогда вы будете смотреть на сгенерированный HTML, CSS и Javascript, а не на исходный код Lisp, поэтому вам нужно держать отображение в своей голове. Решает ли гомогенность, обеспечиваемая Лиспом, что-нибудь, или просто перекрывает проблему, которая в конечном итоге снова появляется вниз по течению?

Я написал веб-приложения для всех Lisp и Javascript, и я думаю, что лучший ответ, который я могу дать прямо сейчас: это может . Я использовал Parenscript, и основная проблема заключается в том, что Parenscript - это язык Lisp-y, но это не Common Lisp и не какой-либо другой полный язык, который вы можете использовать на стороне сервера. (Если бы существовал компилятор Common Lisp to Javascript, как GWT для Java, то это было бы замечательно. Хотя я не вижу, чтобы кто-то всерьез пытался его создать.) Итак, вы все равно получили, как вы заметили, два языка.

В этом отношении Javascript сегодня немного лучше, потому что вы можете запускать один и тот же код в обоих местах. Это не вполне идеально, потому что ваш серверный Javascript, вероятно, имеет функции, которые вы не можете гарантировать, будут существовать на стороне клиента (если вы не ограничите своих пользователей, скажем, последними версиями Firefox). Если вы похожи на меня, вы не хотите ограничивать свой серверный код JS, который выполняется в каждом браузере, поэтому ваш JS на стороне сервера и JS на стороне клиента будут различаться по тонкости. Это не посредник - это все еще довольно приятно - но это все еще 2 немного разных языка.

Я думаю, было бы неплохо, если бы существовала программа, которая могла бы принимать код, написанный на последнем Javascript (1.8.5), и генерировать старый школьный Javascript, который работал в любом браузере. Я не думаю, что такая программа существует, но я не знаю, насколько это будет сложно.

Существуют реализации Scheme для Javascript, и, возможно, ситуация со Scheme лучше. Наверное, мне стоит взглянуть на это на днях.

Я часто расстраиваюсь, когда приходится использовать язык на стороне сервера, который полностью отличается от моего языка на стороне клиента (Javascript).Но я также разочарован, когда мне приходится использовать язык более низкого уровня, чем Lisp (а это большинство из них).Это большая победа, чтобы быть более похожим на Lisp или более похожим на Javascript?Я не знаю.Я бы не хотел выбирать.

1 голос
/ 06 апреля 2011

Это не столько ответ, сколько твердое мнение, но фундаментальная проблема в том, что HTML и CSS просто ужасны (1).Ни то, ни другое не делает то, что предполагается.Javascript лучше, и его часто используют для исправления недостатков этих двух (2), но это не идеальное решение (3).И как результат, языки на стороне сервера необходимы для генерации HTML и CSS, что еще больше усложняет беспорядок.Смехотворно, что самое простое веб-приложение требует программирования не менее чем на четырех разных языках.

Итак, да, ваше желание иметь один хороший надежный язык, с которым вы можете взаимодействовать, а не с другими, понятно, но такДо тех пор, пока вы пишете код, который генерирует HTML / CSS, так что вам нужно иметь дело с деталями HTML и CSS, вы просто носите варежки, которые могут (читай «вероятно») мешать, когда вы играете на пианино.Если ваш код на Лисп выглядит следующим образом: (: body (: div (: @ (: style (: border "1"))) (: p "hello"))), то вы не свободны от проблемэто чума

Лично я думаю, что нам нужно что-то еще, чтобы занять место супа, который мы получили сейчас, и он должен скомпилировать в HTML / CSS / JS, но освободить пользователя от его забот,C компилируется в ассемблер, но программист C никогда не видит коды операций STA, MOV, LDX, с которыми он компилируется, в своем собственном написанном коде.И если бы он был популярен, браузеры могли бы поддерживать его напрямую.Во всяком случае, это просто идея.Проблеск.

Удачи,

Крис Перкинсmedialab.com

(1) HTML-документы - это составные документы с изображениями, сценариями, таблицами стилей и т. Д., Которые хранятся в других файлах.Но одна вещь, которую HTML-документ не может сделать, это плавное встраивание другого HTML-документа - единственное, что ему больше всего нужно.Теги iframes / object имеют фиксированный размер и оба негативно влияют на SEO.Эта тривиальная задача часто является единственной причиной, по которой такой язык на стороне сервера, как PHP, используется на многих веб-сайтах.Вам не нужно, чтобы я говорил вам, насколько плох CSS.

(2) Существует множество примеров: LESS (lesscss.org), document.write, AJAX и т. Д.

(3) Несоответствие между правилами DOM и CSS для Javascript практически невероятно,Сколько высот у DIV в DOM (scrollHeight, offsetHeight, clientHeight и т. Д.)?4 или больше, может быть?Сколько из них адресуется через CSS?0 или 1. Кроме того, хотя Javascript может заткнуть много дыр, он часто делает это за счет SEO

1 голос
/ 04 апреля 2011

Javascript действительно находится в отдельной категории от CSS и HTML, если вы делаете что-то вроде Parenscript.Похоже, это может быть хорошо, если все сделано очень хорошо.Однако я не испытывал такого примера.Я не пробовал parenscript, но ответ Руперта не говорит об этом.Лично я использую coffescript, который вместо отображения существующего языка в javascript создал лучший вариант поверх него.Вы знаете, что он сгенерирует, потому что он очень четко отображается на javascript, и это облегчает отладку.

Если вы просто хотите вставить значения из своего приложения в javascript, то принципы аналогичны выполнению этого дляHTML и CSS.Ниже я расскажу о своем опыте веб-разработчика на Ruby и участника веб-фреймворка haskell Yesod , но я думаю, что он обобщает веб-разработку на любом языке.

Подумайте оHTML-шаблон как DSL для генерации HTML.Является ли размещение группы двоеточий перед именами тегов (или в других языках / системах, выполняющих вызовы функций имен тегов) действительно улучшением DSL?Очевидно, что это нехитрый html в язык, где можно легко манипулировать шаблоном вместо того, чтобы улучшать язык шаблонов.

Код lisp не требует закрывающих тегов, но нет причины, по которой шаблон должен, HAML - очень мощный и СУХОЙ язык шаблонов, изначально написанный на ruby, концепции которого теперь перенесены на другие языки, и есть другие языки шаблонов с другим синтаксисом, которые вместо этого поддерживают важную концепцию макета на основе пробелов.написания закрывающих тегов.Моя проблема с HAML заключается в том, что он полностью отказывается от синтаксиса html.Я чувствую, что это html для обуви в HAML вместо кода.В веб-фреймворке Yesod мы взяли концепцию HAML, но использовали обычный синтаксис html, сделавший DRY - мы называем это hamlet .

Одна из причин генерации all html в коде потому, что в противном случае может быть затруднительно вставлять некоторые фрагментов вашего шаблона непосредственно в код - мы решили, что это хорошо в хамлете, используя квазицитаты haskell - в других языках вам может понадобиться вызов функции и мультистрока, которая в разной степени более громоздка в зависимости от синтаксиса многострочной строки.

Эти концепции одинаково хорошо работают с css.Пользователи HAML используют SASS или SCSS (которые мы теперь также переносим на Yesod). Вот эквиваленты Python

Таким образом, шаблоны представляют собой общедоступный синтаксис, которому не может соответствовать html как код.Если шаблон позволяет вам вызывать вспомогательную функцию, генерирующую html, то вы не теряете много энергии.

Одним из аспектов создания html, css и js из кода является простая возможность сгруппировать их вместе и взаимодействоватьс логикой приложения.Например, если вы хотите, чтобы поле даты использовало всплывающее окно календаря javascript, вам нужно, чтобы некоторые html, css и js работали вместе - и вы хотите, чтобы они располагались в непосредственной близости друг от друга в вашем источнике , но находится отдельно от html-страницы или в отдельных файлах при получении клиентом.В Yesod у нас есть виджетов для выполнения этого, помещенных в код или с 3 отдельными файлами.В HAML можно объявить части одного и того же шаблона как html, javascript или css, хотя вам нужны ваши собственные помощники из вашей среды или приложения, если вы хотите объединить их более разумным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...