Gulp для сборки приожений Angular 1.x
Немного про Gulp
Было время, когда мне очень нравился Grunt, а причина была проста - другие средства сборки Web-проектов только начинали развиваться (2013 год, если что). Вскоре я открыл для себя Gulp. В сравнении с Grunt это был действительно удобный инструмент, и я надолго остановился именно на нём.
Всё никак не найду время на изучение Angular 2 и Webpack, поэтому один из мелких проектов пишу на Angular 1.x (актуальная версия на момент написания статьи - 1.6.x). Кто писал на нём, знает, что все контроллеры, директивы, сервисы и прочие компоненты лучше размещать в отдельных файлах, однако, потом на странице нужно подключать каждый файл отдельно.
Мириться с этим было нельзя, я поискал на StackOverflow похожие запросы и выяснил, что многие сталкивались с этой проблемой. Я предлагаю своё решение, являющееся компиляцией из разных источников.
Установка пакетов
В каталоге проекта инициализируем npm, отвечаем на несколько простых вопросов, после чего ставим необходимые плагины:
npm init && npm install gulp gulp-rename gulp-uglify gulp-include gulp-watch --save
Название | Описание |
---|---|
gulp-rename | Позволяет указать имя целевого файла, отличное от исходного. Используется для создания отладочных и минимизированных версий файлов. |
gulp-uglify | Сжимает JS. Используется для создания минимизированных продуктовых версий. |
gulp-include | Позволяет вставлять код из одного файла в другой подобно тому, как это делает директива #include > в C-подобных языках. Так же позволяет делать вызов require , при этом код будет вставлен только в том случае, если не вставлялся ранее. |
gulp-watch | Отслеживает изменения в нужных файлах, при необходимости автоматически вызывая нужные Gulp Task |
gulpfile.js
В каталоге приложения так же создадим файл по имени gulpfile.js (регистр важен) со следующим содержимым:
(function (r) {
"use strict";
var gulp = r("gulp"),
uglify = r("gulp-uglify"),
include = r("gulp-include"),
rename = r("gulp-rename"),
sources = {
login: "./src/login.js",
app: "./src/app.js"
},
DEST = "./todoist/static/app/"
gulp.task("js-dev", function () {
// Сборка без минификации, специально для отладки
gulp.src(sources.login)
.pipe(gulp.dest(DEST));
gulp.src(sources.app)
.pipe(include())
.pipe(gulp.dest(DEST));
});
gulp.task("js-prod", function () {
gulp.src(sources.login)
.pipe(uglify())
.pipe(rename("login.min.js"))
.pipe(gulp.dest("./todoist/static/app/login.min.js"));
gulp.src(sources.app)
.pipe(include())
.pipe(uglify())
.pipe(rename("app.min.js"))
.pipe(gulp.dest(DEST));
});
gulp.task("watch", function () {
gulp.watch("./src/**/*.js", ["js-dev"]);
});
gulp.task("default", ["js-dev", "watch"]);
}(require));
Надеюсь, комментарии к тому, что тут происходит, не нужны.
Файлы приложения
Все исходные файлы приложения у меня лежат в src/
, для контроллеров создан каталог controllers
, для сервисов - services
(директивы и фильтры пока не успел написать, поэтому и каталогов нет).
Так выглядит главный файл приложения:
(function (A) {
"use strict";
var app = A.module("todoist", ["ui.bootstrap", "ngRoute", "ngCookies"]);
app.config(["$interpolateProvider", "$httpProvider", "$routeProvider", function ($interpolateProvider, $httpProvider, $routeProvider) {
$interpolateProvider.startSymbol("{$");
$interpolateProvider.endSymbol("$}");
$httpProvider.defaults.xsrfCookieName = "csrftoken";
$httpProvider.defaults.xsrfHeaderName = "X-CSRFToken";
$httpProvider.defaults.headers.common.Authorization = "Basic";
$routeProvider.when("/", {
controller: "MainController",
templateUrl: "/ui/index.html"
}).when("/users", {
controller: "UserListController",
templateUrl: "/ui/users/list.html"
}).when("/users/:id", {
controller: "UserDetailController",
templateUrl: "/ui/users/detail.html"
}).otherwise({
redirectTo: "/login"
})
}]);
//=include ./controllers/*.js
//=include ./services/*.js"
}(this.angular));
При сборке вместо комментариев //=include ./controllers/*.js
будет вставлено содержимое лежащих там файлов - как раз то, чего я и хотел добиться.
Последний шаг - подключить файл приложения в шаблоне Django:
<script src="{% static 'app/app.js' %}"></script>
Комментариев нет :
Отправить комментарий