NemerleWeb — Уникальный веб-фреймворк

    NemerleWeb NemerleWeb — это фреймворк для создания одностраничных веб приложений (Single Page Application — SPA), который транслирует код написанный на Nemerle в смесь JavaScript и HTML, а также обеспечивает двустороннюю привязку данных, прозрачное дуплексное общение с сервером, статическую типизацию с настоящими подсказками и ещё много чего другого.

    Как это работает?


    Разработчик описывает логику моделей на компилируемом языке Nemerle.
    Благодаря макросам, код на этом языке получается очень лаконичным, фактически мы только описываем логику приложения. Это выгодно отличает наше решение от библиотек на чистом JavaScript.

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

    <input value=”$Name” />
    

    Достаточно внутри атрибута поставить первым символом $, и атрибут будет вычисляться автоматически, на основании последующего кода.
    В этом коде, кстати, разрешены практически любые выражения — главное, чтобы эти выражения уместились в результирующем HTML.

    Дальше из созданной модели генерируются *.js файлы и шаблоны, и всё это дело вставляется в вашу статичную до того страницу.

    Описание модели — это один файл внутри обыкновенного ASP.NET MVC проекта.

    Покажите мне код!


    Код простейшей модели выглядит примерно так:

    [Unit]
    public class Page
    {
      Name : string = "world";
    
      [Html]
      public View() : string
      {
       <#
         <input value=”$Name” /> 
         <div>Hello, $Name</div>
       #>
      }
    }
    

    Смотреть: Результат, Исходный код

    Из этого будет сгенерирован JavaScript “класс” Page и HTML шаблон Page_View, который включает в себя примитивы для автоматической двусторонней привязки данных.

    Атрибутом [Unit] помечаются классы, из которых нужно создавать client side код, а [Html] те методы, которые мы хотим превратить в шаблоны.

    У меня уже есть готовый сайт на C#


    Если у вас есть готовый сайт, к которому не хочется приплетать Nemerle, вы можете создать отдельный проект на Nemerle, модель из которого вставить в основной сайт на C# таким образом:

    public ActionResult PageWithModel() 
    {
      return View("Index", (object)NemerleProject.MyModel.Render());
    }
    

    Статический метод Render будет автоматически сгенерирован компилятором для любой модели, которую вы создадите. В этот метод, кстати, можно передавать параметры, с которыми потом будет вызван конструктор на стороне клиента.

    Почему Nemerle и NemerleWeb?


    Дело в том, что Nemerle обладает очень развитой инфрастуктурой для создания макросов. Разработчику позволено вмешиваться во многие стадии компиляции и по необходимости вносить свои изменения.
    Именно метапрограммирование позволило создать фреймворк с очень лаконичной структурой и с практически неограниченными возможностями. А так как Nemerle к тому же статически типизирован, мы бесплатно получаем интеллисенс и базовую проверку на опечатки.

    Список задач


    Для демонстрации возможностей я выбрал типичный список задач (ToDo list), но с расширенными возможностями. Наш список будет автоматически сохранять изменения на сервер, при этом оповещая других клиентов об обновлении посредством SignalR.

    Задачи будут отсортированы по приоритету с помощью LINQ. Им, кстати, можно пользоваться прямо из шаблона.

    Для общения сервера с клиентом мы используем SignalR, который уже является стандартом для подобного рода решений в ASP.NET.

    // Вся логика в классе с атрибутом [Unit] будет транслирована в JavaScript, 
    // кроме внутреннего класса Server, из которого будет сгенерирован
    // ASP.NET MVC Controller
    [Unit]
    public class ReactiveToDo
    {
      // Макрос [Dto] помечает все поля как public mutable.
      // Также добавляет макроатрибут [Record], который создаёт конструктор,
      // принимающий значения всех полей
      [Dto] public class Task { Name : string; IsDone : bool; Priority : string; }
      // Все переменные в типе с атрибутом [Unit] находятся на клиенте за исключением переменных класса Server, которые будут на сервере.
    
      // В Nemerle по умолчанию все поля неизменяемые в отличии от C#.
      // Нам нужны изменяемые поля, поэтому мы помечаем их модификатором mutable.
      mutable _tasks = List.[Task]();
      mutable _todoName = "New task";
      mutable _todoPriority = "high"; 
    
      public this() 
      {
        // Поле server генерируется автоматически, если в классе Unit
        // присутствует класс Server (см. ниже)
        // К параметрам метода Load() добавляется callback,
        // который принимает результат.
        // Так как параметров у Load нет, то callback - это единственный параметр.
        // Методы сервера возвращают объект типа XMLHttpRequest
        // Благодаря этому возможно узнать статус запроса и отменить вызов.
        _ = server.Load(tasks => SetTasks(tasks));
      } 
    
      // Мы будем вызывать этот код с сервера с помощью SignalR,
      // поэтому выделяем такую простую логику в отдельный метод
      SetTasks(tasks : List[Task]) : void
      { 
        _tasks = tasks; 
      } 
    
      Add() : void
      {
        _tasks.Add(Task(_todoName, false, _todoPriority));
    
        SaveToServer(); 
    
        _todoName = "Task #" + _tasks.Count;
        _todoPriority = "high";
      }
    
      SaveToServer() : void
      {
        // Метод Save принимает параметр List[Task], к которому автоматически генерируется 
        // функция обратного вызова с результатом.
        // На данный момент нам с этим результатом делать нечего, 
        // поэтому просто выведем его в консоль, для наглядности
        // Здесь window.console.log это обычный вызов JavaScript функции.
        _ = server.Save(_tasks, status => window.console.log(status)) 
      } 
    
      // О примитивах привязки данных мы расскажем впоследствие более подробно.
      // Можете обратить внимание, что внутри шаблонов работает LINQ, 
      // который реализован с помощью linq.js
      // <# #> - аналог C# строк вида @””, но позволяет писать обычные кавычки.
      // Также эти строки поддерживают рекурсию: <# <# a #> #> .
      [Html] 
      public View() : string
      {
       <#
         <table class="reactive-todo-table">
           <tr>
             <th>Priority</th><th>Task</th><th>Status</th>
           </tr>
           <tr $foreach(task in _tasks.OrderBy(t => t.Priority))>
             <td>$(task.Priority)</td>
             <td>$(task.Name)</td>
             <td><input type="checkbox" event-change="$SaveToServer" checked="$(task.IsDone)" /></td>
           </tr>
         </table>
         <div>
           <input value="$_todoName" />
           <select value="$_todoPriority">
             <option>high</option>
             <option>low</option>
           </select>
           <button click="$Add">Add</button>
         </div>
       #>
      } 
    
      // Из этого класса будет сгенерирован контроллер ASP.NET MVC
      // Весь маппинг между клиентом и сервером делается автоматически,
      // поэтому параметры и возвращаемое значение это те же типы, которые
      // мы используем на стороне клиента.
      // Атрибутом [SignalR] помечаются те типы Server,
      // в которых мы будем пользоваться макросами broadcast или signal (см. ниже)
      [SignalR]
      public class Server
      { 
        // Эта переменная находится на сервере.
        // Статическая переменная дает нам в некотором роде БД в памяти.
        static mutable _db : List[Task] = List();
    
        static this()
        {
          _db.Add(Task("Write article", false, "high"));
          _db.Add(Task("Fix website bugs", false, "high"));
          _db.Add(Task("Add new functionality", false, "low"));
        }  
    
        public Load() : List[Task]
        {
          // Nemerle позволяет не писать return для возвращения значения
          // Такой синтаксис позволяет реализовать идею "Все есть выражение"
          _db 
        }
    
        // Методы сервера всегда возвращают значение.
        // В будущем будет позволенно объявить метод возвращающий ‘void’.
        public Save(tasks : List[Task]) : string
        {
          _db = tasks;
    
          // Вот он весь SignalR. Как обычно, все неудобные подробности 
          // для нас генерирует макрос. Мы же просто пользуемся готовым
          // полем client, у которого есть все методы присутствующие на 
          // стороне клиента.
          // Опять же маппинг автоматический.
          // Макрос broadcast вызовет метод SetTasks у всех клиентов. 
          // В противопоставление ему есть макрос signal, который вызовет
          // метод только у текущего пользователя и ни у кого более
    
          broadcast client.SetTasks(_db);
    
          //Возвращать нам нечего, поэтому просто отвечаем:
          "ok"
        }
      }
    }
    

    Смотреть: Результат, Исходный код
    Пример, очищенный от коментариев: gist

    Примечание: Откройте страницу в двух вкладках одновременно, чтобы увидеть как данные обновляются автоматически.

    Отступление


    Цель данной публикации — не сподвигнуть людей использовать NemerleWeb в продакшене, а скорее рассказать о проекте и, может быть, найти единомышленников. По нашему скромному мнению, макросистема Немерле позволяет делать вещи, которые раньше просто не были доступны в веб разработке, поэтому мы и увлеклись этой затеей. Очень надеемся, что в конце концов из этого можно будет сделать стройный надёжный фреймворк.

    Заключение


    На этом первую статью пора завершать.

    В следующих частях расскажем про:
    • Привязка данных, шаблоны.
    • Связь с сервером, SignalR
    • Подробности трансляции, Typescript (да, мы умеем автоматически парсить декларации Typescript)


    Ссылки


    Сайт проекта: www.nemerleweb.com
    Репозиторий: https://github.com/NemerleWeb/NemerleWeb
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 104

      +22
      Ужас
        +4
        Почему ужас?
          –6
          .NET это вообще какой-то другой мир, для них это может и красиво.
            +12
            Я пишу на .NET Но и для меня это ужас. Ненавижу подобный код.
            Хуже только Objective-C
              –14
              Хуже только Objective-C

              Вот сейчас сильно обидел.
                0
                Без обид, но при виде Objective-C шарписты начинают громко плакать :)
                  0
                  Шарписты не плачут! Они как кремень. Из умерших шарпистов делают сверла по бетону.
                  0
                  Ну его Apple не просто так выкидывает, заменяя на Swift.
                    0
                    Интересно, как публика оценивает свифт?
                    Не мертворожденный ли это язык?

                    Я попробовал, напомнило Паскаль, но прикипел за 5 лет к Обж-Си.
                    Сижу и думаю, наступать на горло старой песне или подождать?
                      0
                      Выглядит он как минимум со стороны очень приятно, имеет в нужном объеме налёт функциональщины, а так же полезный набор плюшек и синтаксического сахара. Всяко лучше надстройки над сишкой, которой по сути является Obj-C. На паскаль похож слабо хотя бы отсутствием уродливых конструкций с begin/end.
                        0
                        А это фортрановское отсутствие
                        ;
                        в конце оператора?
                        Тем не менее, уговорил, с понедельника начну новую жизнь.
                  0
                  А можно подробнее, какой код вы ненавидете?
                    +3
                    Возможно и не ужас, но пример кода, который Вы привели навевает на мысль, что код приложения — каша из кусков шаблонов и логики приправленный макросами, чтобы всем этим управлять. Также сам код примера выглядит очень «грязным» и с наскоку разобраться в нем не очень просто, хотя подобные статьи нацелены на то, чтобы я посмотрел на код и влюбился в него, а затем использовал бы у себя. Если Вы, разработчик (как я понял), пишите такой ужасный код, то боюсь у меня все будет выглядеть еще хуже, так как некоторые нюансы я буду знать явно хуже Вас.
                      0
                      Я могу ошибаться, но вполне вероятно что такая реакция вызвана обилием поясняющих коментариев. Вот тот же код без них: https://gist.github.com/ionoy/1424ef755d04cec34284
                        +1
                        Я так понимаю, что пример этот совсем плевый. По крайней мере для этого фреймворка.

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

                        То что вы в чем-то не можете разобраться может быть следствием вашей неподготовленности, а не грязи в коде. Объясните в двух словах ваши критерии «грозности кода». Лучше с примерами из этого кода.
                      +3
                      Пишу на C# и Namarle для меня — это язык со сверхвозможностями. Надо просто попробовать =) JetBrains не просто так выкупили всех разработчиков Nemerle и взяли Nitra под свое крыло =)
                        0
                        Nemerle, конечно же =)
                          +1
                          Скорее всего они выкупили их для запиливания их c# ide
                            +1
                            Нет, они их выкупили для разработки Nitra.
                              0
                              Нет. Мы выпиливаем Nitralanguage workbench (т.е. средство для создания своих языков). К разработке ReSharper-а мы непричастны (хотя и сидим в соседних комнатах).
                      +4
                      Что-то типа ReactJS с jsx-синтаксисом для C#? Извращение)
                        +2
                        Что-то вроде. Только тут компилируемый, функциональный язык с поддержкой макросов, которые в свою очередь позволяют делать чудеса, которые ReactJS даже не снились.
                          +2
                          Как по мне, звучит прогрессивно, но до тех пор, пока не понадобится нечто подобное отладить. Там ведь нет ни sourcemap, ни чего-нибудь подобного (если ошибаюсь, прошу поправить). Дебажить сгенерированный код — увольте.
                            +2
                            Да, sourcemap пока, к сожалению, не успели сделать, хоть он у нас и в приоритете. Надеюсь что скоро осилим — штука хорошая.
                              0
                              Я вам сразу сказал, что это нужно в обязательном порядке сделать. Отладка по реальным (а не сгенерированным) исходникам — это очень важно.
                        +3
                        Каких только костылей не придумают.
                          +5
                          Учить еще один язык для разработки SPA? Зачем? Ради сомнительной поддержки макросов?
                            0
                            Ради нормального функционального программирования и совсем несомнительной поддержки макросов. Посмотрите на последний пример. В каком фреймворке вы можете обеспечить связь сервера с клиентами + маппинг одним ключевым словом?
                            Немерле даёт возможности описывать только логику приложения, практически не отвлекаясь на инфраструктурные конструкции. В яваскрипт фреймворках это практически нереально.
                              +1
                              Я правильно понимаю, что вот то, что вы сейчас написали про ключевое слово, работает только с ASP.NET MVC?
                                0
                                Да, пока только с ASP.NET MVC. Но это не жёсткое ограничение, просто до других серверных технологий пока не дошли руки. Проще говоря, пока не надо было.
                              • UFO just landed and posted this here
                                  +3
                                  Ну вообще говоря Nemerle сейчас используется в JetBrains. И команда разработки трудоустроена у них же. Пилят генератор компиляторов нового поколения или что-то такое.
                                  • UFO just landed and posted this here
                                    +3
                                    Да, наверное стоило об этом написать в статье. Цель данной публикации — не сподвинуть людей использовать NemerleWeb в продакшене, а скорее рассказать о проекте и может быть найти единомышленников. По нашему скромному мнению, макросистема Немерле позволяет делать вещи, которые раньше просто не были доступны в веб разработке, поэтому мы и увлеклись этой затеей. Очень надеемся, что в конце концов из этого можно будет сделать стройный надёжный фреймворк.
                                    • UFO just landed and posted this here
                                        +3
                                        Немерле позволяет не писать код обслуживающий доменную логику, а сосредоточиться на самой логике. То есть в некотором смысле DSL для Single Page Applications.

                                        Не были доступны трюки наподобие макроса broadcast/signal, который сам генерирует нужный код в зависимости от использования. Не было доступной генерации адаптера к серверу, где ты добавив на сервере метод Save автоматически получаешь на клиенте поле метод _server.Save(). Это всё проверяется на этапе компиляции кстати, с интеллисенсом и прочими прелестями. И это только единичные примеры, всяких мелочей, которые самостоятельно генерируют нужный код там уйма.

                                        А то что представление — это метод внутри модели, так это просто деталь реализации. Если кому-то очень не нравится, можно вынести в отдельный файл. Нарушения принципов MVVM там нет.
                                          +3
                                          Nemerle — это язык, в котором есть только вызов функций, match и макросы. Всё. Даже всякие if, while и прочее — это макросы. Язык изначально заточен под создание любых встроенных DSL.
                                        +1
                                        Миф — это только для тех кто не в теме. Что до конкретного случая, то — да, для конкретного. Но вся мощь расширяемых языков (к которым относится Nemerle) как раз и залючается в том, что на них можно строить решения для конкретных случаев. Этот подход называется LOP (Language Oriented Programming). Вы создаете простые языки (или языковые расширения) решающие конкретные задачи, а макросы позволяют сотворить почти любую магию во время компиляции, автоматически генерируя весь нужный обвязочный код.
                                      +1
                                      Учиться нужно, в первую очередь, для себя. Ведь пока не освоишь что-то, и оценить его невозможно. Тут вот в обсуждении очень много высказываний в стиле персонажа одной известной басни. Не уподобляйтесь им!
                                      А для начала можно и на C# писать. Nemerle его компилировать умеет. Одна беда — ителлисенса нет для C#.
                                      Вот здесь у них есть пример на C#.
                                      0
                                      да бог с ним зачем.
                                      Оно нормально не работает. С react'ом и рядом не стояло по скорости.
                                      Судя по всему там отрисовка не на requestAnimationFrame, вот от туда и тормоза начинаются(
                                        0
                                        Перформанс должен быть удовлетворительным для большинства задач, на мобильниках работает нормально. Но вполне вероятно, что оно, действительно, рядом не стояло по скорости с React'ом. Перформанс сейчас пока не на первом месте в приоритете, в основном занимаемся другими задачами,
                                        +3
                                        Просто клацаю и бах, каждый 5-10 клик:
                                        screencloud.net/v/9465
                                          0
                                          Спасибо за скрин!
                                          +2
                                          Как предлагается редактировать подобную разметку? Ведь ни один существующий HTML-редактор её не осилит (я не о WYSIWYG, если что).

                                          И вообще, что насчет разделения представления и модели?
                                            0
                                            HTML редактор, конечно, не осилит. Но многие шаблонные движки страдают этим. Это не повод отказываться от шаблонных движком.
                                            Стоит так же учесть, что в NemerleWeb уклон сделан на композицию шаблонов. Так что очень больших кусков HTML в коде не должно встречаться. Редактировать такое можно и кодовом редакторе, во всяком случае я проблем не заметил.
                                              0
                                              Здесь нет смешения модели и представления. Более того, здесь есть два уровня модели. Модель (что на сервере) и модель представления. Это же MVVM.

                                              В представлении же встречается исключительно код отвечающий за рендеринг и связывание. Без него в интерактивных приложениях никуда.
                                              +2
                                              Nemerle классный язык, но опыт GWT ничему не учит, как я посмотрю…
                                                0
                                                У GWT не было главного — макросов. Они дают возможность делать такие вещи как бесшовная интеграция с SignalR, например.
                                                  0
                                                  SignalR у меня лично вызывает отторжение — настолько негативный был с ним опыт, так что для меня это не аргумент:)

                                                  Сама по себе идея писать императивный код, который превращается в декларативный (в HTML-разметку), кажется довольно странной. И вставлять в императивный код куски разметки — тоже.

                                                  Вот в clojure тоже есть макросы, и даже вроде есть вебовый фреймворк на них, а вот не взлетело. Почему-то ни один из таких фреймворков так и не нашел широкого распространения. Все о них знают, но желающих работать — единицы.

                                                  Конечно, заманчиво вместо этого хиленького html и причудливого js писать на мощном языке с выведением типов и макросами, но на деле смешение фронтенда и бэкенда слишком часто оказывается кашей.
                                                    0
                                                    Сама по себе идея писать императивный код, который превращается в декларативный (в HTML-разметку), кажется довольно странной. И вставлять в императивный код куски разметки — тоже.

                                                    Хм, у нас нет имеративной генерации HTML кода. Всё вполне себе декларативно, как в любом другом шаблонизаторе. Тут есть возможность использовать любые выражения в атрибутах, но это в любой как серверной, так и клиентской технологии можно встретить.

                                                    Метод, помеченный макро-атрибутом View по сути методом не является. Его невозможно вызвать и получить вменяемый результат. Фреймворк использует такие методы как отдельные шаблоны.
                                                      0
                                                      Хм, а почему бы тогда не вынести этот код в отдельный файл?
                                                        0
                                                        Наверное стоит это сделать в ближайшее время, но я заметил, что удобно разрабатывать когда шаблон находится рядом с кодом. Шаблон должен отражать представление конкретной модели, поэтому если он сильно разрастается, стоит задуматься о том, что модель тоже превращается в God object, и начинает нарушать Signle Responsibility Principle.

                                                        Модели можно включать друг в друга, а значит и их шаблоны. Кстати, у модели может быть несколько шаблонов, конкретный шаблон выбирается кодом, который рендерит эту модель.
                                                          0
                                                          удобно разрабатывать когда шаблон находится рядом с кодом
                                                          Иногда удобно. Но для этого должна быть команда Switch to view/controller в редакторе/IDE. Если приходится часто переключаться между первым и вторым — это звоночек, что у вас слишком сильная связанность.

                                                          В идеале, имхо, шаблоны должны быть такими, чтобы их можно было написать, глядя на IDL (JSON Schema, XSD, .proto) того, что в них будет передано.
                                                            0
                                                            Связанность зависит только от того, как много данных мы хотим показывать в нашем шаблоне. Впрочем, как и везде.
                                                            Но реквест вынести представление в отдельный файл мы слышим не в первый раз, так что наверное стоит этим заняться. Тем более что для этого всего то надо, натравить макрос на отдельный файл вместо метода.
                                                              +1
                                                              Так partial class же, не?
                                                                0
                                                                Ага, такой вариант будет хоть сейчас работать.
                                                          0
                                                          Это можно сделать просто поместив его в паршал-класс.

                                                          public partial class ReactiveToDo { [Html] public View() : string { ... } }

                                                          Метод же использован только потому, что у Nemerle имеет отличные средства расширения себя самого, но в нем не очень просто создать DSL хранящий код в отдельном фале (со своим расширением). Хотя это и возможно, но работы много.

                                                          Эту проблему должна решить Nitra.
                                                    0
                                                    А в чем заключается опыт GWT?
                                                      +1
                                                      Тяжеловесно, неудобно, мало желающих разбираться и копаться, ergo, «не взлетит».
                                                        0
                                                        А что тогда взлетит?
                                                          0
                                                          Django летает, Rails летает, Yii, Kohana, Symfony тоже летают.
                                                            0
                                                            Ну так у них и функционал немного другой. В GWT, как я понимаю, можно собрать SPA из компонентов не написав ни строчки js кода. Все как в старых добрых GUI framework'ах. В django такого уровня абстракции нет.
                                                              0
                                                              такого уровня абстракции нет
                                                              зачастую и не надо, вот я к чему веду.
                                                                +1
                                                                Может и не надо, только вот все в свои framework пилят трансляторы в js. И это ж-ж-ж-ж не спроста. ©
                                                                0
                                                                А что такое старые добрые GUI-фреймворки? MFC? Delphi? а что в них доброго, кроме ностальгии?
                                                                  0
                                                                  Qt/GTK и все что рядом. Доброго в них то, что есть виджеты и их можно компоновать. И делать все на одном языке.
                                                                  В мире SPA виджетов все еще нет. И писать можно только на js. Никакой хаскель в браузере исполняться не будет.
                                                                    0
                                                                    Если бы дизайн приложений на Qt/GTK был бы так же разнообразен и изменчив, как дизайн веб-приложений, если бы Qt/GTK приложениям тоже надо было бы работать на десятке платформ (а из них половина безбожно устаревшая и неимоверная глючная) без перекомпиляции — там бы тоже никаких виджетов не было бы (точнее, они только начали бы появляться).
                                                                      0
                                                                      99% SPA имеют интерфейс не сильно сложнее того, что может предложить Qt/GTK. Да и что такого можно сделать на js, но нельзя на Qt/GTK?
                                                                      js не работает на 10 платформ, всего у нас 2-3 интерпретатора, на которые все ориентируются. Мозилла, Хром, ИЕ.
                                                                      Перекомпиляция тут тоже ни при чем. Гугол в свое время сделал NaCl, но мозилла не поддержала. Поддержала бы и не было бы сейчас никакого js. Вообще.
                                                            –1
                                                            В каком месте тяжеловесно?
                                                            GWT это компилятор(хотя правильнее наверное сказать транслятор) java to javascript. Как вы его можете с Django или Rails сравнивать то?.. И да, он тоже летает, но компилируется долго.

                                                              0
                                                              В любом месте тяжеловесно. Пустой проект собирается две минуты — до свиданья. Да и потом, простите, не летает оно ну никак. Неимоверное количество лишней разметки и сгенеренный код производительности не способствуют.

                                                              GWT это не только transpiler, это же еще и среда разработки (плагин к Eclipse) и фреймворк. Я не сравниваю это с рельсами и джангой, а противопоставляю.
                                                                0
                                                                Разметки там будет столько сколько вы захотите. Никто не заставляет использовать устаревшие компоненты, основанные на таблицах.
                                                                На SSD пустой проект собирается за несколько секунд.
                                                                Вы видимо давно работали с GWT. Проблема в нем в том, что гугль его забросил и поддерживать его некому. Те люди, которые его сейчас мейнтейнят, делают это очень неспешно. О новых фичах можно вообще забыть.
                                                              0
                                                              Так тут-то как раз легковесно.
                                                              Ангуляр и НокаутЖС взлетели ведь. Тут тот же принцип (MVVM и биндинг) плюс автоматизация целой кучи работы: автоматическая сериализация данных при передаче между сервером и клиентом, прозрачность серверной части, статическая типизация, интелисенс.
                                                          +1
                                                          Идея забавная, но в ней я вижу несколько фатальных недостатков:

                                                          • Код и разметка смешиваются в одном файле. На любом проекте, кроме самого маленького, это станет абсолютно неподдерживаемым.
                                                          • Нет подсказок и проверок со стороны среды разработки.
                                                          • Нет совместимости с существующими популярными решениями, и как следствие — ограниченная расширяемость.

                                                          Имхо было бы больше смысла в тулзе, которая позволяет транслировать модель и вьюху, описанные в строго типизированной форме в cshtml/cs, в аналогичные сущности для AngularJS или какого-нибудь другого MVC-фреймворка.
                                                            0
                                                            1. Резметка и код не смешиваются, они просто находятся в одном файле. Принципы MVVM не нарушаются. При желании можно вынести в отдельный файл.
                                                            2. Подсказки и интеллисенс есть, в этом фишка проекта.
                                                            3. Совместимость есть практически со всеми яваскрипт фреймворками, благодаря Typescript и проекту DefinitelyTyped. Мы, с помощью макроса, парсим определения к фреймворкам и генерируем на лету нужный код. Так что в коде можно использовать типизированное представление практически любой популярной библиотеки.

                                                            Мы как раз начали с того, что генерировали код для KnockoutJS, но полёт нашей фантазии был быстро прерван ограничениями нокаута. Та же история с AngularJS, он слишком сильно навязывает совственную архитектуру. Мы же хотим дать разработчику полную свободу.
                                                              0
                                                              Разработчикам типичного SPA «полная свобода» абсолютно не нужна — даже наоборот, для них была бы куда более актуальна совместимость с миллионом готовых модулей для того же AngularJS! Ведь фреймворки как раз для того и создаются, чтобы снимать с разработчика головную боль от необходимости выбора архитектуры и вместо этого предлагать готовое решение.
                                                                0
                                                                Я не уверен, что есть смысл использовать NemerleWeb на одной странице с AngularJS, а тем более общаться между ними. Но такая возможность присутствует, так как даже если вы не найдёте нужной типизации в DefinitelyTyped, то всегда можно вставить «сырой» джаваскрипт вот таким образом:
                                                                js <# someGlobalObject.DoSomething(); #>;
                                                                  0
                                                                  Вы не совсем меня поняли. Я аргументировал в пользу того, что NemerleWeb стоило бы основываться на существующем MVC-фреймворке, а не изобретать собственный биндинг — для потенциальных пользователей в этом было бы больше проку.
                                                                    0
                                                                    У нас по началу такие же мысли были, поэтому первые версии основывались на KnockoutJS. Однако с ним мы постоянно натыкались на неустранимые препятствия, которые в конце концов вынудили написать свой биндинг.

                                                                    Наверное в плане продвижения проще сделать некую типизированную обёртку над AngularJS, но тогда очень большое количество фишек трансляции было бы просто недоступно.

                                                                    NemerleWeb — это проект, где мы пытаемся разобраться как можно применять метапрограммирование в веб разработке. Для этой цели нужна максимально мощная трансляция и отсутствие чужих conventions.
                                                                0
                                                                > 1. Резметка и код не смешиваются, они просто находятся в одном файле. Принципы MVVM не нарушаются. При желании можно вынести в отдельный файл.

                                                                Вот вы бы показали вариант с отделённой разметкой — было бы классно и не было б такой негативной реакции, по-моему. Razor же юзают, например, и всем нравится.
                                                                  0
                                                                  Я смотрю со своей колокольни, мне кажется удобным когда шаблон находится рядом, под рукой. Как уже выше отметил kekekeks проще всего выделить шаблон в отдельный файл через partial атрибут.

                                                                  Если сделать шаблон текстовым, то пропадёт подчёркивание ошибок и интеллисенс. Во всяком случае до тех пор, пока у нас нет работающей Нитры
                                                                    0
                                                                    При редактировании cshtml-файла, по крайней мере при наличии R#, показывается вполне адекватная подсказка и для встроенных выражений на C#, и для HTML/CSS. Вот это было бы реально удобно.
                                                                      0
                                                                      Для этого нужно написать расширение к VS или Resharper. Теоретически реально сделать, но пока этим никто не занимался.
                                                                      0
                                                                      «Подчеркивание» ошибок не пропадет. Интеллисенс, да — пропадет. Но можно захардкодить его поддержку.
                                                                  0
                                                                  Жалко здесь нет смайликов, потому что сообщение очень смешное. Покритиковал и предложил сделать то что критиковал (причем его альфа-версию). Видимо критиковать намного проще и интереснее нежели разобраться в предмете критики. :)
                                                                    0
                                                                    Что ж поделать, если от самой практичной (на мой взгляд) идеи решили отказаться в альфа-версии по причине «прерывания полета фантазии»?
                                                                      0
                                                                      У нас был был выбор, либо сделать кастрированый фреймворк с биндингом на Нокауте или полноценный со своим биндингом. В чём профит использования Нокаута в нашем случае, я не понимаю.
                                                                        0
                                                                        Профит в существующей базе пользователей. Представьте, что в следующей итерации вы придумаете какую-нибудь киллер-фичу, но вот незадача — возможности платформы .NET позволят реализовать ее только в кастрированном виде, и вы решите реализовать свою собственную виртуальную машину?
                                                                          0
                                                                          Зачем доводить до абсурда? Ещё раз повтряю: Нокаут, который бы занимался биндингом сидя под нашим фреймворком, никоим образом не дал бы дополнительного профита. Биндинг в любом случае скрыт от программиста. А делать типизированную обёртку над популярным JS фреймворком у нас желания не было. Цель проекта в другом.
                                                                  0
                                                                  Примечание: Откройте страницу в двух вкладках одновременно, чтобы увидеть как данные обновляются автоматически.


                                                                  Открыл и есть какой-то явный баг. Убрал 5 галок — на второй вкладке все синхронизировалось. затем убираю 6ую и вместе с ней проставляется еще 2, которые я убирал. Затем 6 возвращаю на место и те самые 2 убираются. И так постоянно.
                                                                  Иногда ставлю галку, она проставляется, влtчет за собой проставление еще каких-то галок, а потом сама снимается.
                                                                    0
                                                                    Я думаю это эффект того, что много пользователей делают это одновременно. Данные общие для всех.
                                                                      0
                                                                      Я думал про это, но проблема в том, что повторяется один в один. Т.е. снимаю галку 6 -> проставляются галки 2 и 4. Ставлю галку 6 -> снимаются 2 и 4. И так много раз на одних и тех же элементах. В случае если бы это были бы данные от разных пользователей, то я бы видел мерцание всех галок.
                                                                    0
                                                                    Код, экшины, шаблоны, и все вперемешку? Я думал это время кануло в небытие.
                                                                    Даже если это мелкий и кастомный продукт, все равно смена дизайна или UI станет просто нереальным. Кастомизация это не только другие стили в CSS подключить.
                                                                    Для .NET ведь есть Razor который в умелых руках практически превращает в аналог Node,js с динамической генерацией на стороне сервера, но это в свою очередь убьет в производительности сам .NET.
                                                                    Трудно представить как в данном подходе производить изменения в проекте… тоже поле провести по всей структуре, а секюрити? Я может что-то упустил? в чем идея данного подхода?
                                                                      0
                                                                      Код, экшины, шаблоны, и все вперемешку?
                                                                      Это MVVM, так что данные и код, действительно, в перемешку. Что касается шаблонов, то я уже отвечал в комментариях, что это деталь реализации. Шаблон связан с кодом ничуть не больше чем в любых других MVC/MVVM фреймворках.

                                                                      Для .NET ведь есть Razor который в умелых руках практически превращает в аналог Node,js с динамической генерацией на стороне сервера, но это в свою очередь убьет в производительности сам .NET.
                                                                      Для создания аналога Node.JS недостаточно генерировать нужный HTML код.

                                                                      Трудно представить как в данном подходе производить изменения в проекте… тоже поле провести по всей структуре, а секюрити?
                                                                      Не совсем понимаю проблему. Наш подход в плане данных не сильно отличается от остальных.
                                                                      0
                                                                      Такой код обычно красив только в примерах.
                                                                      В настоящих приложениях шаг влево, вправо и вся красота сходит на нет под тяжестью наваленных сверху костылей.
                                                                        0
                                                                        Не могу сказать, что разработка идёт совсем без проблем, но наваленных костылей точно нет.
                                                                        0
                                                                        Хм, похожее я уже видел несколько лет назад в Lift. Только там была Scala.
                                                                          0
                                                                          Ага и оно никому не нравилось, теперь все на Play!, где нет этих извратов
                                                                            0
                                                                            Да, порог вхождения в Lift неприлично высок, но не скажу, что там прям извраты. Для общего развития интересно побаловаться, в продакшн такое тащить не хочется.
                                                                              0
                                                                              Орлы, я вас удивлю. Лифт — это серверная генерилка текста вроде Разора. С Play, но по беглому описанию это тоже самое, но с синтаксисом Разора. К описываемому здесь продукту и его подходу он (и Разор) не имеют никакого отношения.

                                                                              Изучите на досуге MVVM и поймите, что все шаблоны представленные в этой статье: а) работают на клиенте; б) динамические (перегенерируют HTML при изменении модели представления).
                                                                                0
                                                                                Не скажу, что прям удивлён. Похожесть я увидел в плане внешнего вида кода. first-class xml, сниппеты в коде, автоматическая генерация js. Биндинги в лифте не полностью генерятся, формы нужны.

                                                                                Вы, видимо, разработчик этой вундервафли, раз так резко реагируете.
                                                                                  0
                                                                                  В стародавние времена, когда .NET казался манной небесной, на RSDN жил программер-легенда с таким же ником.
                                                                                  Он, действительно, писал какой-то интересный код и агитировал за Nemerle, но легендарным было его ЧСВ, которое зашкаливало все мыслимые пределы. Так что не обращайте внимание, это все равно, что ругать Mithgol'a за его руссизмы.
                                                                                    0
                                                                                    Лифт никакого js автоматически не генерирует. Лифт — это серверная генерилка текста. Он конечно может сгенерировать страницу содержащую js, но это совсем не тоже самое, что сгенерировать js по коду на Скале. Соответственно понятия клиентского биндинга в Лифте нет.

                                                                                    В данном же случае код который пишется на Немерле преобразуется в js во время компиляции. И биндинги делаются на клиентской стороне.

                                                                                    Если этого не понять, то понять написанное в статье невозможно.
                                                                                    0
                                                                                    Простая и понятная серверная генерилка текста/json'на — это то, что нужно, хотя в Play наворочено побольше.
                                                                                    Более сложные веб-проекты уже давно ваяют на client-side фреймворках типа Angular.
                                                                                    Банально удобнее работать, когда код на JS чистый, а не сгенерированный.
                                                                                    Тогда с ним можно работать отдельно от основного приложения, покрывать тестами и не заморачиваться тем, что там на сервере и, как бонус, никакого vendor-lock.

                                                                                    Я, кстати, не поленился заглянуть в вики и почитать про MVVM, потому что давно ничего про него не слышал, с тех самых пор как MS изторг из себя мертворожденный Silverlight:
                                                                                    A criticism of the pattern comes from MVVM creator John Gossman himself,[15] who points out that the overhead in implementing MVVM is «overkill» for simple UI operations. He also states that for larger applications, generalizing the View layer becomes more difficult. Moreover, he illustrates that data binding in very large applications can result in considerable memory consumption.

                                                                                    Забавно, что сам автор осознал, что породил монстра.

                                                                                    Проект, объективно, решает какую-то несуществующую проблему, удачи вам в других начинаниях.
                                                                                      +1
                                                                                      Простая и понятная серверная генерилка текста/json'на — это то, что нужно, хотя в Play наворочено побольше.

                                                                                      Кому и CGI то что нужно. Кто до чего дорос.

                                                                                      Более сложные веб-проекты уже давно ваяют на client-side фреймворках типа Angular.

                                                                                      Вот этот фреймворк и есть аналог Angular-а, только без необходимости вручную связывать его с сервером, вручную генерить джейсон, и склеивать все это в одно приложение. Вместо этого код (и клиентский, и серверный) пишется на Немерле, а компилятор сам преобразует его в js или в серверный код. При этом обеспечивается автоматическая и прозрачная сериализация, контроль ошибок во время компиляции и куча других вкусностей.

                                                                                      Банально удобнее работать, когда код на JS чистый, а не сгенерированный.

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

                                                                                      Я, кстати, не поленился заглянуть в вики и почитать про MVVM, потому что давно ничего про него не слышал

                                                                                      О, это в духе тех кто рассуждает о чужом ЧСВ. Сначала сослаться на AngularJS, а потом сказать, что давно не слышал про MVVM. Но AngularJS и есть реализация MVVM.

                                                                            Only users with full accounts can post comments. Log in, please.