Имея мало знаний о клиентской маршрутизации в JavaScript, я решил сравнить две среды:
Sammy.js и
Flatiron Director .
Сфера
Я сделаю сравнение на очень простом приложении (на основе примера из Flatiron). Функции, которые я хотел бы использовать:
- Маршрутизация : Маршрутизация на основе хэш — адресов , как
app#/author. - Маршрутизация с параметрами : получение параметров из URL-адресов, например, «15» из
app#/books/15. - Несколько привязок : выполнение более одного действия для маршрута (в реальном приложении это может быть маршрутизация и загрузка некоторых данных).
- Маршруты по умолчанию : подключение маршрута по умолчанию для всех несопоставленных путей.
- Прослушиватели : подключение прослушивателя — специальное действие, выполняемое в дополнение к маршрутизации по всем путям.
Код
Флэтайрон Директор
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Flatiron Director Sample</title>
<script src="https://raw.github.com/flatiron/director/master/build/director-1.1.6.min.js"></script>
<script>
var author = function () { console.log("author"); };
var books = function () { console.log("books"); };
var viewBook = function(bookId) {
console.log("viewBook: bookId is populated: " + bookId);
};
var wildcard = function(route) {
console.log("Wildcard at: " + route);
};
var listener = function() {
console.log("Listener at: " + window.location);
};
var routes = {
'/author': author,
'/books': [books, function() { console.log("An inline route handler."); }],
'/books/view/:bookId': viewBook,
'/:def': wildcard
};
var router = Router(routes);
router.configure({ on: listener });
router.init();
</script>
</head>
<body>
<ul>
<li><a href="#/author">#/author</a></li>
<li><a href="#/books">#/books</a></li>
<li><a href="#/books/view/1">#/books/view/1</a></li>
<li><a href="#/other">#/other</a></li>
</ul>
</body>
</html>
Sammy.js
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Sammy Sample</title>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="https://raw.github.com/quirkey/sammy/master/lib/min/sammy-latest.min.js"></script>
<script>
$(function() {
var author = function () { console.log("author"); };
var books = function () { console.log("books"); };
var viewBook = function(bookId) {
console.log("viewBook: bookId is populated: " + bookId);
};
var wildcard = function() {
console.log("Wildcard at: " + this.params['route']);
};
var listener = function() {
console.log("Listener at: " + this.params['path']);
};
$.sammy("#main", function() {
this.get('#author', author);
this.get('#books', books);
this.get('#books/view/:id', function() {
viewBook(this.params['id']);
console.log("An inline route handler.");
});
this.get('#:route', wildcard);
this.bind('run-route', listener);
}).run('#');
});
</script>
</head>
<body id="main">
<ul>
<li><a href="#author">#author</a></li>
<li><a href="#books">#books</a></li>
<li><a href="#books/view/1">#books/view/1</a></li>
<li><a href="#other">#other</a></li>
</ul>
</body>
</html>
Заметки
Так что я думаю о них?
Директор кажется довольно легким и простым. Он не имеет зависимостей и весит 3,7 кБ. Это почти функциональное программирование (за исключением момента, когда вы его включаете) — вы можете сразу увидеть, что происходит и какие есть варианты.
По сравнению с этим Sammy.js намного тяжелее. Это зависит от jQuery (32,7 кБ) и весит 6,5 кБ. Это делает больше предположений: ваш код должен запускаться после загрузки страницы (вот почему он включен $.readyздесь). Это заставляет вас писать OO-код — у функций нет аргументов, но вы получаете больше информации this.
Директор поддерживает подключение нескольких обработчиков к маршруту из коробки (вы можете передать массив функций). В Сэмми, видимо, вам нужно обернуть их в другую функцию.
По какой-то причине директор, похоже, требует, чтобы URL-адреса имели косую черту, например app#/books— никогда app#books. Сэмми все равно.
Остальное вы можете увидеть сами в коде выше.
решение суда
Сэмми заставляет меня загружать больше кода, и все время мне нужно читать документацию («Итак, какие параметры здесь доступны?», «Что скрывает этот объект?»), И в конце концов он даже заставляет меня писать больше кода. Посмотрите на параметризованный viewBookобработчик: с помощью Director я могу добавить параметр в функцию обработчика, и он просто работает. С Сэмми мне нужно получить это this.
На данный момент я сильно предпочитаю директора. Это меньше и намного проще в использовании. Мне это нравится еще больше, потому что я могу напрямую использовать его из ClojureScript с минимальным трением. Потребовалось бы немало усилий, чтобы интегрировать Сэмми.