Похоже, вы уже знаете, что делать. Рендеринг на стороне сервера - плохая идея.
Простое рассуждение о том, что вы Javascript, живет как на серверных страницах, так и в отдельных файлах Javascript (при условии, что вы вообще используете Javascript). Это может стать отладочным кошмаром, чтобы исправить вещи, когда все повсюду.
Если бы вы не использовали какой-либо другой Javascript, кроме того, что генерируют сценарии на стороне сервера, он, вероятно, был бы хорошим и управляемым (забудьте, что говорит ненавязчивое движение).
Во-вторых, если у вас есть 100 ссылок на странице, вы будете повторять этот же код в 100 местах. Повторение - еще один кошмар обслуживания и отладки. Вы можете обрабатывать все ссылки на всех страницах с помощью одного обработчика событий и одного атрибута. Это даже не нуждается во второй мысли.
<Rant>
Нелегко разделить HTML и Javascript, и даже CSS, особенно если вы хотите использовать AJAX или UI. Чтобы получить полное разделение, нам нужно перейти к модели настольных приложений, где весь код переднего плана генерируется на стороне клиента программно с использованием Javascript, и все взаимодействие с сервером получает ограничен чистым обменом данными.
Большая часть восходящей связи (клиент-сервер) - это просто обмен данными, но не нисходящая связь. Многие серверные скрипты генерируют HTML, объединяют его с данными и выплевывают обратно. Это хорошо, пока сервер остается в команде создания представлений HTML. Но когда навороченный Javascript приходит на борт и начинает добавлять строки в таблицы, и div для комментариев, точно копируя существующую структуру HTML, мы создали две точки, в которых генерируется разметка.
$(".comments").append($("<div>", {
"id": "123",
"class": "comment",
"html": "I would argue this is still bad practice..."
}));
Может быть, это не такой уж страшный кошмар (в зависимости от масштаба), но это может быть и серьезной проблемой. Теперь, если мы изменим структуру комментариев, это нужно сделать в двух местах: на стороне сервера и в шаблонах, где изначально создается контент, и на стороне Javascript, которая динамически добавляет комментарии после загрузки страницы.
Второй пример касается приложений, которые используют перетаскивание. Если вы можете перетаскивать элементы div вокруг страницы, их нужно будет удалить из обычного потока страниц и расположить абсолютно или относительно с точными координатами. Теперь, поскольку мы не можем заранее создать классы для всех возможных координат (и это было бы глупо пытаться), мы в основном внедряем стили непосредственно в элемент. Наш HTML тогда выглядит так:
<div style="position: absolute; top: 100px; left: 250px;">..</div>
Мы испортили наши красивые семантические страницы, но это нужно было сделать.
</Rant>
Семантическое и поведенческое разделение в стороне, я бы сказал, в основном сводится к повторению. Вы повторяете код без необходимости. Несколько слоев обрабатывают одну и ту же логику. Можно ли засыпать все это в один слой или сократить все повторения.