Pull to refresh
50
0
Oleg Nechaev @lega

Developer

Send message

Чем «фрагменты» могут помочь в Веб-разработке на примере Malina.js

Reading time2 min
Views2.8K


Никто не спрашивает зачем нужны функции, ведь это очевидная и полезная вешь в программировании. Функции позволяют переиспользовать код и делать архитектуру приложения лучше.

Почему бы не использовать такую же способность в шаблонах компонентов. В настоящее время многие фреймворки позволяют использовать компоненты внутри других компонентов. Но это больше похоже на подключение модуля, нежели просто функции. Ведь компонент кроме шаблона может иметь свой JavaScript код, свои стили и он весьма изолирован (что хорошо).
Читать дальше →
Total votes 6: ↑4 and ↓2+2
Comments5

Что если скрестить Svelte и Angular? Или мутабельный Svelte

Reading time3 min
Views1.8K
Svelte — очень хороший фреймворк/библиотека, но она имеет чувствительный недостаток (где их нет...) — это система отслеживания изменений, она плохо ловит мутации данных, поэтому в Svelte комьюнити форсируется иммутабельный подход.

И у меня давно чесались руки попробовать систему отслеживания похожую на ту что используется в Angular для Svelte, и вот появились свободные выходные и я на скорую руку из «говна и палок» состряпал Svelte-подобный компилятор (Svelte-M), что дало положительный побочный эффект в плане размера бандла и скорости работы:

Размер бандла получился почти в 2 раза меньше (todo приложение):

Svelte: 4.7k (2.2k gzipped)
Svelte-M: 2.7k (1.2k gzipped)

Скорость работы:

Рендеринг 5000 элементов: Svelte 894ms, Svelte-M 563ms (Svelte-M быстрее: 63% от времени Svelte).
Удаление 1 элемента: Svelte 113ms, Svelte-M 38ms (Svelte-M быстрее в 3 раза).
Пере-рендеринг (удаление и добавление 5000 элементов): Svelte: 859ms, Svelte-M 418ms (в 2 раза быстрее).
Читать дальше →
Total votes 8: ↑7 and ↓1+6
Comments1

События в Angular Light

Reading time3 min
Views5.2K
Angular Light — это самостоятельный клиентский MV(C/VM) фреймворк, который построен на идеях Angular.js и Knockout.js, и похож на упрощенный Angular.js.



В Angular Light есть директивы обработки событий: al-click, al-dblclick, al-submit, al-blur, al-change, al-focus, al-keydown, al-mousedown, al-mouseenter и т.д. Как видите под каждое отдельное событие создается отдельная директива, а если директивы нет под какое-то событие, то приходилось делать директиву вручную и это не эффективно. Поэтому было принято решение сделать возможность обрабатывать любые события одним способом. Рассматривались разные варианты (например al-on="keypress=onClick($event,$element), mousedown=onMouseMove()"), в итоге остановились на варианте, который используется (или похож) в других фреймворках.
Читать дальше →
Total votes 14: ↑13 and ↓1+12
Comments2

Angular Light для jQuery/JS разработчиков

Reading time3 min
Views18K


Я на Тостере периодический вижу вопросы типа «как скрыть блок по клику» или «как раскрасить по условию», поэтому я хочу вам показать 4 «приема» которые могут улучшить ваш jQuery-код и скорость разработки.

Начальный пример


Примеры к описанию ниже: jQuery пример и Angular Light пример
Этот пример состоит из 2-х «моментов»: 1. Кликом выбрать «панель», 2. Отобразить выбранную «панель».
Читать дальше →
Total votes 14: ↑10 and ↓4+6
Comments3

Angular Light + Object.observe

Reading time2 min
Views13K
Angular Light — это самостоятельный клиентский MV(C/VM) фреймворк, который построен на идеях Angular.js и Knockout.js, и похож на упрощенный Angular.js



Вышла версия Angular Light 0.8 которая включает разные улучшения и исправления, основные изменения:

1. Поддержка Object.observe и Array.observe, что может увеличить производительность веб-приложений.
Использование Object.observe — это опциональная фича, так же её можно включать для отдельных Scope (scope деревьев). Браузеры которые не поддерживают Object.observe продолжают работать через dirty-checking, так же нужно знать некоторые нюансы.
Читать дальше →
Total votes 21: ↑19 and ↓2+17
Comments33

Angular Light 0.6

Reading time2 min
Views15K
Angular Light — это самостоятельный клиентский MV(C/VM) фреймворк, который построен на идеях Angular.js и Knockout.js, и похож на упрощенный Angular.js

Основные изменения за последнее время:
  • Поддержка «совеременных» браузеров без зависимостей (12kb): Google Chrome, Firefox, IE9+ (для IE8 нужен jQuery)
  • Сделан модуль анимации, можно использовать CSS от Angular.js 1.2+
  • Одноразовый биндинг — после получения первых данных $watch удаляется, для этого нужно дописать "::" в начало, например {{::variable}} вместо {{variable}}.
  • Сохранение результирующего списка в директиве al-repeat, после применения фильтра исходный список может изменится и иногда нужно получить результат, например для определения кол-ва элементов или для вывода «список пуст». Использовать можно так: al-repeat="item in list | filter store to variable", пример.
  • Появился «track by» для директивы al-repeat — способ идентификации элементов в списке, работает по аналогии ng-repeat из Angular.js
  • Теги для al-app, позволяют делать биндинг разных частей DOM к одному scope. Бывает полезным когда на странице используется несколько разных фреймворков и не желательно «захватывать» весь документ, с помощью тегов приложение можно «раскидать» в разные места, пример.
  • В ф-ии $watch появилось событие $finishBinding, оно срабатывает после того как произойдет биндинг. Это можно использовать в место timeout в директивах (или контроллерах :) ).
  • Появилась возможность в любой момент сделать текстовую директиву статической с помощью env.finally()

Читать дальше →
Total votes 40: ↑36 and ↓4+32
Comments15

Angular Light: «Ленивое» подключение директив и препроцессор

Reading time2 min
Views5.1K
Для увеличения гибкости использования директив, я добавил «препроцессор» для директив. Он вызывается в момент «подключения» директивы в DOM. Вы можете расширить его либо заменить на свой, что дает такие возможности как:
  • Добавление своих атрибутов в директивы (наподобие template, templateUrl, scope ...)
  • Преобразование директив и их подмена
  • Смена местоположения директив, например в хранить часть директив в scope (ну а вдруг захочется)

Далее пара примеров:
Читать дальше →
Total votes 4: ↑4 and ↓0+4
Comments0

Angular Light. Управляем декларативным биндингом данных в HTML

Reading time2 min
Views8.2K
В angular есть 2 инструмента вывода информации в DOM — это директивы и декларативный биндинг данных в HTML {{model}}.
В то время когда директивы обладают большими возможностями, декларативный биндинг немного ограничен, он делает $watch на модель с возможностью вызвать фильтры и по большому счету — все. А хотелось бы больше гибкости.

Например если посмотреть на библиотеку bindonce для Angular.js, основная идея — это разовый вывод информации без использования $watch.
И для того что-б её можно было использовать в любом месте, для любого атрибута, разработчик сделал ряд отдельных директив: bo-text, bo-href-i, bo-href, bo-src-i, bo-src, bo-class, bo-alt, bo-title, bo-id, bo-style, bo-value, bo-attr и bo-attr-foo. Но по сути, все они делают одно и тоже и по логике это должна быть одна директива.
Так же это отклоняется от декларативного биндинга данных, задуманного в Angular.js, т.е. вместо
<a href="{{link}}">{{name}}</a>
нужно писать
<a bo-href-i="{{link}}" bo-text="name"></a>
Т.е. для чего был придуман декларативный биндинг данных, в этой ситуации не работает.

Поэтому появилась идея реализовать директивы для декларативного биндинга данных.
Как это работает в Angular Light — просто нужно указать имя директивы и перед этим поставить знак "#", т.е. вместо {{model}} будет {{#directive model}}.
Бесполезный, но простой пример счетчика:
<div al-app>
    counter {{#counter model}}
</div>
Делаем биндинг «model» и подключаем директиву «counter», для простоты я опустил использование «model» в данной директиве:
alight.text.counter = function(callback, expression, scope, env) {
    var n = 0;
    setInterval(function(){
        n++;
        callback(n)  // set result
        scope.$scan()  // $digest
    }, 1000);
}
Читать дальше →
Total votes 10: ↑8 and ↓2+6
Comments1

Наследование директив в Angular Light и другие «плюшки»

Reading time2 min
Views7.4K
Недавно после прочтения одной статьи Армина Роначера, я подумал, что неплохо было бы иметь возможность наследовать директивы и
вскоре реализовал это в своей библиотеке Angular Light (aLight).

Вообщем все наследование сводится к разбиению директивы на методы, которые в дальнейшем можно переопределить.
Вот пример al-show-slow на основе al-show, где происходит медленное появление и скрытие элемента, выглядит так:
alight.directives.al.showSlow = function(element, name, scope, env) {
    var dir = alight.directives.al.show(element, name, scope, env);  // Создание родительской директивы
    dir.showDom = function() {  // Подменяем "show"
        $(element).fadeIn(1000);
    }
    dir.hideDom = function() {  // Подменяем "hide"
        $(element).fadeOut(1000);
    }
    return dir;
}

Пример наследования al-show
Ещё один пример al-value-delay на основе al-value, где данные попадают в модель с задержкой (без повторов).

Так же тут возможно множественное наследование, но пока не было в этом необходимости.
Читать дальше →
Total votes 9: ↑7 and ↓2+5
Comments7

Производительность GridFS

Reading time2 min
Views19K
В интернете не так много статей о производительности GridFS, вот одна из них Serving files out of GridFS которая показывает, что отдача файлов из GridFS медленнее чем с диска в 6 раз.
Но в той статье есть недочет — в тестировании обращение идет к одному файлу, а при этом файл кешируется на уровне nginx либо файловой системы что дает отрыв по сравнению с GridFS. Да и неплохо проверить свежий GridFS, 3 года прошло как никак.
Поэтому я решил провести собственное тестирование, с обращением по разным именам файлов.

Есть 52 тыс файлов — постеры к фильмам, общий объем 2Гб, средняя картинка весит 40кб. Копия файлов на ext4, копия в GridFS.
Виртуалка 512Мб с 1 ядром. Ubuntu server 12.04 LTS 64bit, настройки Nginx/1.4.1 стандартные.
Тест рассчитан на low-cost сервер, для мощных серверов результаты будут другие.

Способы отдачи файлов:
1) Nginx — статика
2) Gevent через nginx
3) 2 x Gevent через nginx (балансировка)
4) Gevent напрямую
5) Gevent через nginx (unix socket)
для пунктов 2-5 использовался http сервер на Python + Gevent который отдавал файлы из GridFS

Способы нагрузки:
1) ol, t2 — Обращение к одному url, 2 потока
2) ol, t10 — Обращение к одному url, 10 потоков
3) t2 — Обращение к разным url, 2 потока
4) t10 — Обращение к разным url, 10 потоков


Читать дальше →
Total votes 19: ↑17 and ↓2+15
Comments16

Angular.js + Knockout.js

Reading time2 min
Views9.6K
Недавно я перешел с knockout.js на angular.js, оба инструмента мне нравятся, но в каждом из них есть свои преимущества перед «конкурентом».
И тут выпал скучный вечер, решил я, just for fun, слепить свой MV* инструмент.

Мне не очень нравятся разухабистые фреймворки, я отдаю предпочтение библиотекам, и от angular мне в основном нужно было 2 вещи: scope — данные и их мониторинг, applyBindings — привязать этот scope к DOM.
Читать дальше →
Total votes 4: ↑4 and ↓0+4
Comments2

MongoDB: производительность запросов на диапазонах

Reading time3 min
Views15K
Если вы путешествовали по территории индексов MongoDB, вы возможно слышали принцип: Если ваши запросы содержат сортировку, то добавте сортированное поле в конец индекса который используется в этих запросах.

Во многих случаях когда запросы содержат условия равенства как например {“name”: “Charlie”}, принцип который выше очень полезен. Но что о нем можно сказать со следующим примером:

Запрос:
db.drivers.find({"country": {"$in": ["A", "G"]}).sort({"carsOwned": 1})
Индекс:
{"country": 1, "carsOwned": 1}

Эта связка является не эффективной, хотя принцип соблюдается. Потому что тут есть ловушка в которую вас может привести этот принцип.
Ниже мы рассмотрим причины возниконвения этой ловушки и к концу статьи вы будете иметь новое правило которое будет вам помогать при индексировании.
Читать дальше →
Total votes 35: ↑26 and ↓9+17
Comments15

Inline-callback в tornado server для asyncmongo

Reading time3 min
Views3.9K
Пару недель назад разработчики tornado добавили нативный модуль по созданию inline callback (аналог inlineCallbacks в Twisted, Seq в Node.js, Fibers в Ruby).
Ниже примеры использования и примеры с участием asyncmongo (асинхронным драйвером для mongoDB)
Читать дальше →
Total votes 25: ↑22 and ↓3+19
Comments5

Information

Rating
Does not participate
Location
Stockholm, Stockholms Län, Швеция
Registered
Activity