Backbone.js — легковесный JavaScript-фреймворк для построения одностраничных приложений (SPA), предоставляющий структуры Models, Collections, Views и Routers. Несмотря на минималистичность, крупные Backbone-приложения требуют тщательно организованного Build процесса, включающего компиляцию, оптимизацию, тестирование и управление зависимостями.
В Backbone-приложениях структура каталогов должна отражать архитектуру приложения:
app/
models/
collections/
views/
routers/
templates/
utils/
main.js
Models и Collections отвечают за данные, Views — за отображение и DOM-логику, Routers — за навигацию. Templates хранят HTML-шаблоны, чаще всего в формате Underscore или Handlebars. Utils — вспомогательные функции и модули.
Код следует разбивать на отдельные модули, чтобы облегчить дальнейшую сборку и оптимизацию.
Backbone не предоставляет встроенной системы модулей, поэтому чаще всего используется RequireJS, Browserify или Webpack для управления зависимостями и сборки в один или несколько бандлов.
Основные шаги сборки:
Пример конфигурации Webpack для Backbone:
const path = require('path');
module.exports = {
entry: './app/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader',
},
{
test: /\.html$/,
use: 'html-loader',
},
],
},
resolve: {
alias: {
Backbone: 'backbone/backbone.js',
Underscore: 'underscore/underscore.js',
},
},
mode: 'production',
};
Backbone Views обычно используют шаблоны для генерации HTML. Для больших приложений рекомендуется предкомпилировать шаблоны:
handlebars templates/ -f compiled_templates.js_.template() во время
сборкиПредкомпилированные шаблоны ускоряют работу приложения и уменьшают нагрузку на клиент.
В Backbone-приложениях зависимости часто включают jQuery, Underscore и сторонние плагины. Для их управления используются:
Важно избегать глобальных зависимостей и использовать модульную систему, чтобы сборщик мог корректно разрешать пути.
Минификация и обфускация. Использование Terser для уменьшения размера JS.
Разделение кода (code splitting). Основной бандл + ленивые загрузки модулей.
Кэширование. Добавление хешей в имена бандлов для корректного обновления.
Source Maps. Для отладки минифицированного кода необходимо генерировать карты исходников.
Пример в Webpack:
module.exports = {
mode: 'production',
devtool: 'source-map',
};
Backbone-приложения часто тестируются с использованием Jest, Mocha или QUnit. Build процесс должен включать:
Пример команды для Mocha с Chai и Babel:
mocha --require @babel/register 'test/**/*.spec.js'
Для крупных проектов автоматизация жизненно необходима. Используются npm scripts, Gulp или Grunt. Типичные задачи:
Пример Gulp-задачи:
const gulp = require('gulp');
const concat = require('gulp-concat');
const terser = require('gulp-terser');
gulp.task('scripts', function() {
return gulp.src('app/**/*.js')
.pipe(concat('bundle.js'))
.pipe(terser())
.pipe(gulp.dest('dist/'));
});
После сборки проект обычно имеет следующую структуру:
dist/
bundle.js
bundle.js.map
index.html
css/
images/
Все исходные модули, шаблоны и ассеты компилируются, объединяются и оптимизируются для быстрой загрузки и выполнения в браузере. Такой подход обеспечивает масштабируемость и удобство поддержки Backbone-приложений.