AngularJS и браузер не являются, к сожалению, отличным сочетанием. Конечно, не нравится React и браузер, но я отвлекаюсь.
Что сработало для меня, так это то, что каждый файл является модулем AngularJS (поскольку каждый файл уже является модулем CommonJS) и файлы экспортируют свое имя модуля AngularJS.
Так что ваш пример будет выглядеть следующим образом:
app/
app.js
follow/
controllers.js
directives.js
services.js
index.js
app.js
будет выглядеть примерно так:
var angular = require('angular');
var app = angular.module('mnm', [
require('./follow')
]);
// more code here
angular.bootstrap(document.body, ['mnm']);
follow/index.js
будет выглядеть примерно так:
var angular = require('angular');
var app = angular.module('mnm.follow', [
require('./controllers'),
require('./directives'),
require('./services')
]);
module.exports = app.name;
follow/controllers.js
будет выглядеть примерно так:
var angular = require('angular');
var app = angular.module('mnm.follow.controllers', [
require('./services'), // internal dependency
'ui.router' // external dependency from earlier require or <script/>
// more dependencies ...
]);
app.controller('FollowController', ['$scope', 'FollowService', function ...]);
// more code here
module.exports = app.name;
И так далее.
Преимущество этого подхода в том, что вы сохраняете свои зависимости как можно более ясными (т. Е. Внутри модуля CommonJS, который им действительно нужен), а взаимно однозначное сопоставление между модами модулей CommonJS и именами модулей AngularJS предотвращает неприятные сюрпризы.
Наиболее очевидная проблема с вашим подходом заключается в том, что вы сохраняете фактические зависимости, которые будут вставляться отдельно от ожидающей их функции, поэтому, если зависимости функций изменяются, вам нужно коснуться двух файлов вместо одного. Это запах кода (т. Е. Плохая вещь).
Для проверки пригодности любой подход должен работать, поскольку модульная система Angular является по существу гигантским блобом и импортирует два модуля, которые определяют одно и то же имя, будут переопределять друг друга.
EDIT (через два года): Некоторые другие люди (как здесь и в других местах) предложили альтернативные подходы, так что я, вероятно, следует обратиться к ним и какие компромиссы:
Есть один глобальный модуль AngularJS для всего вашего приложения и просто требуется для побочных эффектов (т. е. не имеют подмодулей экспорта ничего, кроме как манипулировать глобальным угловым объектом).
Это, по-видимому, наиболее распространенное решение, но, похоже, мухи перед лицом модулей. Однако это, по-видимому, самый прагматичный подход, и если вы используете AngularJS, вы уже загрязняете глобальные переменные, поэтому я предполагаю, что модули с боковым эффектом являются наименьшей из ваших архитектурных проблем.
Объедините свой код приложения AngularJS до, передавая его для браузера.
Это наиболее буквальное решение для «давайте объединим AngularJS и Browserify». Это правильный подход, если вы начинаете с традиционной позиции «просто слепо конкатенировать свои файлы приложений» AngularJS и хотите добавить Browserify для сторонних библиотек, поэтому я предполагаю, что это делает ее действительной.
Что касается структуры вашего приложения, это ничего не улучшает, добавляя Browserify.
Как 1, но с каждым index.js, определяющим собственный подмодуль AngularJS.
Это подход с использованием шаблонов, предложенный Брайаном Огденом. Это страдает от всех недостатков 1, но создает некоторое подобие иерархии внутри AngularJS тем, что по крайней мере у вас есть более одного модуля AngularJS, а имена модулей AngularJS действительно соответствуют вашей структуре каталогов.
Однако главный недостаток заключается в том, что у вас теперь есть два набора пространств имен, о которых вам нужно беспокоиться (ваши фактические модули и модули AngularJS), но ничто не обеспечивает согласованности между ними. Вам не только нужно помнить, что нужно импортировать правильные модули (которые в очередной раз опираются на побочные эффекты), но вы также должны помнить о том, чтобы добавить их ко всем правильным спискам и добавить один и тот же шаблон в каждый новый файл. Это делает рефакторинг невероятно громоздким и делает этот худший вариант, на мой взгляд.
Если бы я должен был выбрать сегодня, я бы с 2, потому что он отдает всю отговорку AngularJS и Browserify возможности быть унифицировано и просто оставляет как делать свое дело. Плюс, если у вас уже есть система сборки AngularJS, это буквально означает добавление дополнительного шага для Browserify.
Если вы не наследуете базу данных AngularJS и хотите знать, какой подход лучше всего подходит для запуска нового проекта: не запускайте новый проект в AngularJS. Либо выберите Angular2, который поддерживает реальную модульную систему из коробки, либо переключитесь на React или Ember, которые не страдают от этой проблемы.
Это отлично работает - спасибо за проходящие через время, чтобы сделать это. Мне удалось сделать что-то очень похожее на require.js, и вы помогли мне перейти от безумия AMD: D – marksyzm
@AlanPlum ничего себе не удивительно, что вам не нравится, как Browserify смешивается с Angular. Это какой-то сумасшедший код, а не хороший образец. нет необходимости в modules.exports и необходимости установки в экземплярах углового модуля ... проверьте это для лучшего шаблона с помощью AngularJS и выполните прокрутку https: // github.com/Sweetog/yet-another-angular-patplate –
После того, как вы добавите их в нужные списки, вам не нужно когда-либо забывать добавлять их снова, а шаблонный шаблон не относится ко всем файлам, а только к модулям и index.js за как каждый каталог является угловым модулем –