Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Прототип библиотеки jNext (https://javascript.ru/forum/project/24387-prototip-biblioteki-jnext.html)

FINoM 28.12.2011 04:35

Прототип библиотеки jNext
 
Мне нравится jQuery. Нравится из-за того, с ней я могу сделать почти всё, не прибегая к нативным средствам браузера, не трахаясь с кроссбраузерностью. Но мне не нравится одно: её пихают куда ни попадя, даже в мобильные сайты. Огромная куча кода для поддержки кроссбраузерности инициируется каждый раз, когда открываешь страничку на мобильном. Анимации в jQuery сделаны старым дедовским способом: с помощью свойства style. Кроме этого, я полностью уверен в том, что в недалеком будущем (лет 5—10) она будет казаться старым пердящим запорожцем. Даже сейчас, когда IE6 практически сдох, в коде библиотеки наблюдается его поддержка. Что будет потом, когда умрет IE8? Разработчики будут выковыривать ненужные вещи? Сомневаюсь.

Поэтому я рискнул начать делать библиотеку, очень похожую на jQuery, использующую встроенные фишки по максимуму. Вся выборка элементов происходит с помощью querySelectorAll и matchesSelector, анимации сделаны на CSS3, данные, данные присваиваются элементу с помощью dataset. В дальнейшем, будет реализована работа с классами через classList и т. д.

Почему я взял за пример jQuery? Потому что очень удобно было бы писать один код под те же мобилы, планшеты и полноценные компы, просто подключая ту или иную библиотеку. Скрипты на jNext будут совместимы с jQuery, но не наоборот. А потом, можно вообще забить на совместимость, предоставляя свои фишки с блекджеком и шлюхами. В будущем, если руки дойдут, напишу модуль, который определяет, может ли моя либа работать с данным браузером или нет и, исходя из этого, решать, какая библиотека будет задействована.

Для примера, приведу алгоритм работы одной из функци. Допустим это siblings.
1. Берем все элементы из текущей выборки и проделываем следующие вещи
2. Допустим node — текущий элемент
a) node.dataset.randomId = Math.random(); // допустим 0.1
б) node.parentNode.dataset.randomId = Math.random(); // допустим 0.2
3. Конструируем селектор, он у нас получится таким:
[data-random-id=0.2] > :not([data-random-id=0.1])
4. Применяем селектор к node.parentNode, конкатенируем полученный массив с массивом новой выборки
5. Удаляем .dataset.randomId из 2.а и 2.б
Так работает большинство функций выборок и, как показал один из холиваров, в которых я участвовал, достаточно быстро. По поводу сравнения скорости с выборкой на регулярках, думаю, спорить вообще смысла нет.

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

Чтоб не быть голословным, вот, очень простой пример: http://jsfiddle.net/finom/Yb2MH/
Вот код: http://dl.dropbox.com/u/13598455/jNext/jNext.js , в котором очень много не реализовано, что-то сделано не до конца (метод css вообще работает только на установку стилей). Это прототип, пользоваться нельзя ни в коем случае. Работает пока что только в хроме (может и в сафари) из-за вездесущих префиксов -webkit-.

На всякий случай: не нужно здесь писать, что jQuery — говно. Только по коду, пожалуйста. С холиварами в оффтоп и не забудьте дать ссылку.

FINoM 28.12.2011 04:38

Тут многие писали, что jQuery молчалива в плане вывода ошибок. Как лучше реализовать отлов и вывод ошибок?

FINoM 28.12.2011 05:05

И еще, я тут видел замечания о том, что хотелось бы собирать библиотеку самому, выбирая только нужные функции.

FINoM 28.12.2011 06:53

Цитата:

Сообщение от FINoM
Для примера, приведу алгоритм работы одной из функци. Допустим это siblings.

Только сейчас дорубил, что querySelectorAll можно использовать всего-лишь один раз и не задействуя конкатенаций. Просто нужно два раза пробежаться по элементам: сначала выставить рандомный айдишник, затем убрать. Просто непочатый край для оптимизаций.

FINoM 28.12.2011 21:42

Рискну спросить.
Никто не может поделиться советами? Может я чем-то задел в своём сообщении?

DreamTheater 28.12.2011 22:07

Да нет, молодец :)

Octane 28.12.2011 22:23

Цитата:

Сообщение от FINoM
Тут многие писали, что jQuery молчалива в плане вывода ошибок. Как лучше реализовать отлов и вывод ошибок?

Мне в jQuery не нравится, что она всегда работает с коллекцией элементов, даже если известно, что элемент один, например:
$("#btn").hide()

в случае отсутствия #btn, никакой ошибки не произойдет, а логичнее было бы получить в консоли сообщение о том, что какое-то внутреннее свойство null.

Я бы сделал 2 функции и 2 набора методов для работы с одним элементом и коллекцией.
$("#btn")  → {node: HTMLElement}
$$(".btn") → {list: Array}

Работа с одним элементом:
$("#btn").addClass("active")

тут мы получим сообщение «node is null», если #btn отсутствует

Работа c коллекцией:
$$(".btn").each("addClass", "active")

FINoM 28.12.2011 22:59

Цитата:

Сообщение от Octane
в случае отсутствия #btn, никакой ошибки не произойдет, а логичнее было бы получить в консоли сообщение о том, что какое-то внутреннее свойство null.

Да, согласен.
Цитата:

Сообщение от Octane
Я бы сделал 2 функции и 2 набора методов для работы с одним элементом и коллекцией.

Тогда будет больше кода, а производительность не сильно изменится (при одном элементе будет одна итерация цикла).

FINoM 28.12.2011 23:32

Забыл сделать бекап предыдущей версии, поэтому пример временно не работает.

melky 29.12.2011 00:12

FINoM, почему вы не используете github в таком интересном проекте? хотя бы из-за возможости откатиться или принять чужой фикс какой-нибудь ошибки


PS хм. трудновато понять код, когда он отдан plain'ом на маленький экранчик смартфона. больше всего не понял "класс" Selector.


Часовой пояс GMT +3, время: 16:22.