Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Angular Seed структурирует код, разделяя файлы по назначению.
app/ contollers/ directives/ ... admin/ ... forum/ ...
index.js) соответствующие пути:controllers/ user/ login.js profile.js catalog ... contacts ...
html шаблоны разбросанные по различным директориям, в которых к тому же содержатся «css/less/sass (и иногда даже картинки и прочие файлы)», так как зачастую шаблоны — это не статические файлы. Их генерацией занимается серверная часть приложения, которая может расставить имена полей формы в соответствии с моделью или перевести статические тексты на язык, полученный из GET параметра. /templates/<templatename>.html?lang=en), что на мой взгляд удобнее.Не удобно хранить различные шаблоны для каждого языка приложения и править их все при малейшем изменении, поэтому они генерируются на сервере.
Они могут отдаваться сервером в различном размере в зависимости, например, от размера экрана клиента, хотя и доступны по одному адресу.
Мне думается что приложение которое «целиком статика» — в некотором роде миф.
static/
css/ (здесь хранится скомпилированный, но еще не уменьшенный css, содержит source-maps)
fonts/ (здесь подключаемые шрифты)
img/ (здесь общие картинки и SVG, которые не меняются, лого, иконки)
js/
app/ (здесь Angular приложение)
...
components/ (повторно используемые, независимые от бизнес-логики компоненты)
core/ (здесь основа приложения, layout-директивы, лэйауты, аутентификация, и так далее)
controllers/
models/
services/
templates/ (использование отдельных подпапок "templates" - дело вкуса и размера проекта)
header.html
main-content.html
...
features/ (различные элементы, "фичи", специфичные для приложения)
account/
controllers/
services/
models/
templates/
init.js (подключаемый модуль "фичи", собирает все контроллеры, сервисы, роуты)
routes.js (роуты "фичи")
some-feature1/
some-feature2/
...
app.js (сам файл приложения, подключение зависимостей, и прочее)
init.js (загрузочный файл приложения, аналог bootstrap.js из топика)
routes.js (общие маршруты приложения и маршруты по-умолчанию)
main.js (файл настроек require.js, обычно он же запускает по-умолчанию модуль "app/init", директория "static/js" устанавливается базовой для require.js)
lib/ (здесь находятся все зависимости для клиента, bower устанавливает свои компоненты сюда)
sass/
...
_some-styles.scss (файлы с префиксами - партиалы, подключаются в app.css
app.scss (файл стилей, только он компилируется sass-ом)
index.html (точка входа, загружаемая страница может генерироваться сервером, а может отдаваться в статическом виде напрямую из корня проекта)
students/
students.js
students-list.js
students-list.spec.js
students-view/
students-view.js
students-view.spec.js
students-edit-dlg/
students-edit-dlg.js
students-edit-dlg.spec.js
students-sidebar/
students-sidebar.js
students-sidebar.spec.js
students-filtering/
students-filtering.js
students-filtering.spec.js
… удобно делать вот такие штуки
Так же если у вас множество контроллеров, то удобнее распределить контроллеры по директориям, указав в загрузчике модуля (index.js) соответствующие пути:
перестать беспокоиться о подключении скриптов в правильном порядке;
загружать javascript код асинхронно;
иметь возможность скомпилировать код в один минифицированный JS-файл;
А зачем? в продакшен сборке вы все равно будете использовать сконкатеннированную и заминифицированную версию.
А require.js все равно не обеспечивает «ленивой загрузки».
Популярный миф, что в require.js это есть.
require() это не является ленивой загрузкой?require():$scope.getSomeModule = function(){
require(['lazyLoaded.js'], function(lazyLoaded){
...
});
}
lazyLoaded.js загрузится только после выполнения метода $scope.getSomeModule() (например в ответ на клик или другое событие). Если же метод не выполнится, файл так и останется не загруженным. Поправьте, если я не прав, но это как раз и есть отложенная загрузка.Асинхронна в AMD только подгрузка модулей, а не их определение.
{% compress js %}
<script src="{{ STATIC_URL }}bower_components/angular/angular.js"></script>
<script src='{{ STATIC_URL }}bower_components/angular-ui-router/release/angular-ui-router.js'></script>
<script src="{{ STATIC_URL }}bower_components/angular-resource/angular-resource.js"></script>
<script src="{{ STATIC_URL }}bower_components/angular-sanitize/angular-sanitize.js"></script>
<script src='{{ STATIC_URL }}bower_components/underscore/underscore.js'></script>
<script src='{{ STATIC_URL }}bower_components/angular-bootstrap/ui-bootstrap.min.js'></script>
<script src='{{ STATIC_URL }}bower_components/angular-bootstrap/ui-bootstrap-tpls.js'></script>
<script src='{{ STATIC_URL }}bower_components/angular-gettext/dist/angular-gettext.min.js'></script>
{% endcompress %}
… а как в вашем примере связать все с angular-route?
define(
[
'angular',
'./angular-modules',
'./controllers/index',
'./directives/index',
'./filters/index',
'./services/index'
],
function (ng) {
return ng.module('app', [
'app.services',
'app.controllers',
'app.filters',
'app.directives',
'ngRoute',
//... другие модули
]);
}
);
define(
[
'angular',
'./../ngmodules/angular-route.min',
//... другие модули
],
function () {}
);
ANGULARJS + REQUIREJS