Чи має сенс використовувати Require.js з Angular.js? [зачинено]


443

Я новачок у Angular.js і намагаюся зрозуміти, чим він відрізняється від Backbone.js ... Ми використовували для управління залежностями наших пакунків за допомогою Require.js під час використання Backbone. Чи є сенс робити те саме з Angular.js?


Ще один блог та насіннєвий проект: startersquad.com/blog/angularjs-requirejs
iwein

19
Ні - Не використовуйте Requ.js АБО переглядайте Angular.JS цього просто не потрібно - AngularJS має модульну систему, а використання іншої модульної системи над нею зробить ваше життя надмірно важким. Я стежив за відповідями в цій темі і витрачав занадто багато годин на те, що було абсолютно непотрібним. Прочитайте цю статтю, яка пояснює, чому ні: medium.com/@dickeyxxx/…
VitalyB

Прочитайте це, щоб зрозуміти різницю між кутовими та потрібними модулями juristr.com/blog/2014/07/lazy-angular-modules
pilavdzice

1
ось чудове відео, яке пояснює, чому це гарна ідея, і показує, як користуватися RequJS з angularJS youtube.com/watch?v=4yulGISBF8w#t=142
gskalinskii

2
@VitalyB Приємна стаття! Я віддаю перевагу завантаженню додатків невеликими шматочками. Це швидко нічого не коштуватиме . Чорт, зараз це нічого не коштує для мене.
dsign

Відповіді:


224

Так, це має сенс використовувати angular.jsпоряд з тим, require.jsде ви можете використовувати require.jsдля модуляції компонентів.

Є насіннєвий проект, який використовує both angular.js and require.js.


108
Згаданий вище проект про насіння вже рік не торкався, тому я створив новий, використовуючи новітні AngularJS та RequireJS з повною підтримкою тестакулярного тестування.
tnajdek

2
@tnajdek, я оновив посилання у відповіді Аншу, щоб вказати на ту, яку ви запропонували.
Девід Ріверс

7
Зауважте, що жоден із цих насіннєвих проектів не схвалює команда Angular. Вимагати - це модель, яка має більше сенсу в інших контекстах, і взуття, що вводить її в Angular, не є, IMHO, найкращою практикою.
XML

2
Книга O'Reilly AngularJS Бреда Гріна та Шяма Сешадрі (вийшла в квітні цього року) також рекомендує додати RequireJS на початку розвитку проекту Angular, і детально викладає деталі.
bjorke

1
Я набагато краще зробити все в час збирання 1. browserify.org 2. npmjs.org/package/gulp-angular-filesort
A-Dubb

150

Щоб повторити те, що, на мою думку, дійсно є питанням ОП:

Якщо я будую додаток, головним чином, у Angular 1.x, і (неявно) це роблю в епоху Grunt / Gulp / Broccoli та Bower / NPM, і, можливо, я маю пару додаткових залежностей від бібліотеки, Потрібно додати чітке, конкретне значення понад те, що я отримую, використовуючи Angular без вимоги?

Або, по-іншому:

"Чи потрібен ванільний кутовий, щоб ефективно керувати завантаженням основних компонентів Angular, якщо у мене є інші способи обробки основного завантаження сценарію? "

І я вважаю, що основною відповіддю на це є: "якщо тільки у вас щось не відбувається, і / або ви не можете використовувати новіші, сучасніші інструменти".

Будемо зрозумілі на початку: RequireJS - це чудовий інструмент, який вирішив деякі дуже важливі проблеми та запустив нас у дорогу, до якої ми йдемо, до більш масштабованих, більш професійних додатків Javascript. Важливо, що вперше багато людей стикалися з концепцією модуляризації та виведення речей із світового масштабу. Отже, якщо ви збираєтеся створити програму Javascript, яка потребує масштабування, то «Вимагати» та «шаблон AMD» не є поганими інструментами для цього.

Але чи є щось особливе щодо Angular, що робить Require / AMD особливо гарним? Ні. Насправді, Angular надає вам власну схему модуляції та інкапсуляції, яка багато в чому робить зайвими основні особливості модуляції AMD. І інтегрувати кутові модулі в шаблон AMD неможливо, але це трохи ... вибагливо. Ви обов'язково витратите час на отримання двох моделей, щоб вони добре інтегрувались.

З точки зору самої команди Angular, це є , від Брайана Форда, автора Angular Batarang і тепер члена основної команди Angular:

Я не рекомендую використовувати RequireJS з AngularJS. Хоча це, безумовно, можливо, я не бачив жодного випадку, де RequireJS виявився корисним на практиці.

Отже, щодо дуже специфічного питання AngularJS: Angular and Require / AMD є ортогональними, а місцями перекриваються. Ви можете використовувати їх разом, але немає причин, конкретно пов'язаних з природою / моделями самого Angular.

Але як щодо базового управління внутрішніми та зовнішніми залежностями для масштабованих програм Javascript? Чи не вимагає робити щось дійсно критичне для мене там?

Я рекомендую перевірити Bower та NPM, і особливо NPM. Я не намагаюся розпочати святу війну з приводу порівняльних переваг цих інструментів. Я просто хочу сказати: є інші способи зняти цю кішку, і ці способи можуть бути навіть кращими, ніж AMD / Require. (Вони , звичайно , мають набагато більш популярний імпульс в кінці 2015 року, в зокрема , НПМ, в поєднанні з модулями ES6 або CommonJS см. Відповідний SO питання .)

А що з ледачим завантаженням?

Зауважте, що ледачі завантаження та ледачі завантаження різні. Ліниве завантаження Angular не означає, що ви перетягуєте їх прямо з сервера. У застосуванні в стилі Yeoman з автоматичною підтримкою JavaScript ви об'єднуєте і з’єднуєте весь шебанг разом в один файл. Вони присутні, але не виконуються / встановлюються до необхідності до необхідності. Покращення швидкості та пропускної здатності, які ви отримуєте завдяки цьому, значно перевершує будь-які ймовірні поліпшення внаслідок ледачого завантаження певного 20-рядкового контролера. Насправді, даремна затримка мережі та накладні витрати для цього контролера будуть на порядок більше, ніж розміри самого контролера.

Але скажімо, що вам дійсно потрібні ледачі завантаження, можливо, для нечасто використовуваних фрагментів вашої програми, наприклад, інтерфейс адміністратора. Це дуже законний випадок. Вимога дійсно може зробити це за вас. Але є також багато інших , потенційно більш гнучких варіантів, які виконують те саме. І Angular 2.0, мабуть, подбає про це для нас, вбудований в маршрутизатор . ( Детальніше .)

А як бути під час розвитку на моєму місцевому розробнику?

Як я можу завантажувати всі свої десятки / сотні файлів сценаріїв, не потрібно вручну вкладати їх у index.html?

Подивіться на підгенератори в генераторі-кутові генератора Yeoman або на схеми автоматизації, втілені в генератор-gulp-angletal , або на стандартну автоматику Webpack для React. Вони забезпечують вам чистий масштабований спосіб: автоматично приєднувати файли в той час, коли компоненти розміщуються, або просто автоматично захопити їх, якщо вони є в певних папках / відповідають певним глобальним шаблонам. Вам більше не потрібно думати про власну завантаження сценарію, як тільки ви отримаєте останні варіанти.

Нижня лінія?

Вимагати - це чудовий інструмент для певних речей. Але йдіть із зерном, коли це можливо, і розділіть свої проблеми, коли це можливо. Нехай Angular потурбується про власний модуляційний модуль Angular, і розгляне можливість використання модулів ES6 або CommonJS як загальної схеми модуляції. Нехай сучасні засоби автоматизації турбуються про завантаження скриптів та управління залежностями. І дбайте про асинхронізування ледачих навантажень гранульованим способом, а не пов'язуючи це з двома іншими проблемами.

Однак, якщо ви розробляєте кутові програми, але не можете встановити Node на вашій машині, щоб з певних причин використовувати інструменти автоматизації Javascript, то «Потрібно» може бути хорошим альтернативним рішенням. І я бачив дійсно складні установки, коли люди хочуть динамічно завантажувати кутові компоненти, які кожен заявляють про власні залежності чи щось подібне. І хоча я, мабуть, спробую вирішити цю проблему іншим способом, я бачу достоїнства ідеї саме для цієї конкретної ситуації.

Але в іншому випадку ... починаючи з нуля з новим додатком Angular та гнучкістю для створення сучасного середовища автоматизації ... у вас є маса інших, більш гнучких, більш сучасних варіантів.

(Оновлено неодноразово, щоб не відставати від розвивається сцени JS.)


1
Проект насіння NG- Boilerplate ( github.com/ngbp/ngbp ) також створює веб-сторінку для однієї сторінки з одним js-файлом. Використання маніфесту HTML5 гарантує, що цей файл завантажується лише один раз у кожній версії.
Федеріко Елз

2
Хоча, як завжди, <i> це залежить </i>. Багато людей використовують Require для всієї своєї архітектури та потребують інтеграції Angular у цю екосистему. Це зовсім інша ситуація, ніж коли ви будуєте додатки ізольовано.
Дейв Нікол

2
Домовились. Але тяга ОП, схоже, така: "Якщо я будую програму в основному в Angular, і (неявно) це роблю в епоху Грунта, і, можливо, я маю пару додаткових залежностей від бібліотеки, чи потрібно додати чітке, конкретне значення що я отримую, використовуючи Angular без вимоги? " І я вважаю, відповідь така: ні. Якщо у вас є величезна програма із 40 зовнішніми залежностями, або ви не можете контролювати своє середовище CI, або ваш начальник обожнює вимагати, або ви обожнюєте вимагати, або кутовий - це лише одна деталь більшого додатка тощо, і т. Д., То YMMV.
XML

1
Але оскільки він, схоже, не задає цих питань, і оскільки він просто згадує альтернативний контекст додатка Backbone, він, схоже, запитує: "чи потрібен ванільний кутовий, щоб ефективно керувати його компонентами?" І відповідь: "ні, якщо у вас щось ще не відбувається". Крім того, це питання виникло в результаті руху CI Javascript, в якому ми отримали набагато кращі способи впоратися з базовим, фізичним завантаженням сценарію. Якщо ви вирішили цю проблему, вимога в основному стосується відповідності залежності та інкапсуляції. Кутовий робить обидва ці речі для вас.
XML

Google використовує ледачу завантаження в деяких проектах AngularJS, тому що в іншому випадку користувач завантажуватиме 24 Мб файлів під час завантаження першої сторінки (а це з файлами, які невідомі та зв'язані). Так, так, у складних додатках це не дозволяє просто об'єднати всі розділи, коли є розділи, які користувач не буде відкривати з кожним відвідуванням.
ngDeveloper

136

Так, це має сенс.

Кутові модулі не намагаються вирішити проблему впорядкування завантаження скриптів або ледачого вилучення сценарію. Ці цілі є ортогональними, і обидві модульні системи можуть жити поряд і виконувати свої цілі.

Джерело: офіційний веб-сайт Angular JS


6
Якщо ви використовуєте один модуль на js файл, ви можете завантажити свій кутовий модуль у будь-якому порядку. Але якщо ви хочете розмістити, наприклад, різні сервіси у різних js-файлах, але ви хочете приєднати їх до одного і того ж кутового модуля, вам слід завантажити декларацію модуля перед декларацією послуг. Тож це архітектурне рішення.
Matohawk

@Tiago: Будь ласка, вкажіть посилання на місце, з якого ви отримали це джерело. Я не можу його знайти ніде. Я здогадуюсь, що він походить від більш ранньої версії кутових документів, до того, як шаблони Angular стали настільки ж усталеними, і до того, як стало зрозуміло, що існують значні переваги уникнути вимоги, принаймні, для кутових компонентів.
XML

@XMLilley: чи можете ви надати посилання, що пояснює переваги уникання вимоги при використанні Angular? Я вирішую, використовувати чи не потрібно в своєму проекті, і це звучить так, як це було б корисно.
Тревор

1
Мені тут було не зовсім зрозуміло: є вагомі переваги в тому, щоб використовувати власні вбудовані модулі-навантажувачі Angular та працювати із зерном кутових шаблонів. Питання полягає не в тому, щоб уникати Require, а в тому, чи є цінність для додавання додаткового рівня складності. Ясно, що вбудовані шаблони Angular зручно та елегантно вирішуватимуть необхідність завантаження власних модулів Angular. Якщо "Require" служить цілі для завантаження модулів за межами кутового контексту, то так і буде. Але використання Require for Angular є стороннім.
XML

6
@XMLilley все, що робить Angular, - це зробити вам ін'єкцію залежності. Фактичне завантаження модуля - ваша відповідальність. Це можна зробити, додавши тег сценарію, створивши сценарій збірки або використовуючи Requjs. Система модулів Angulars щодо цього не має думки.
gillesruppert

57

Це я вважаю суб'єктивним питанням, тому я висловлю свою суб’єктивну думку.

Angular має вбудований механізм модуляції. Коли ви створюєте додаток, перше, що ви зробите - це

var app = angular.module("myApp");

і потім

app.directive(...);

app.controller(...);

app.service(...);

Якщо ви подивитесь на кутовий набір, який є акуратним додатком для початківців для кутових, вони розділили директиви, служби, контролери тощо на різні модулі, а потім завантажили ці модулі як залежності від вашого основного додатка.

Щось на зразок :

var app = angular.module("myApp",["Directives","Controllers","Services"];

Кутовий також ледачий завантажує ці модулі (в пам'ять) не їх файли сценаріїв.

З точки зору ледачого завантаження файлів сценаріїв, якщо бути відвертим, якщо ви не пишете щось надзвичайно велике, це було б надмірним вмістом, оскільки кутовий за своєю суттю зменшує кількість написаного вами коду. Типовий додаток, написаний у більшості інших рамок, може очікувати зниження приблизно на 30-50% у LOC, якщо писати кутовим.


5
Дійсно, краще налаштувати служби в Angular.js, ніж завантажувати модулі з Require.js. Це полегшує гру з розмахом і послугами $, як я грав у Socket.io
Marco Godínez

33

Використовувати RequireJS з AngularJS має сенс, але лише якщо ви розумієте, як працює кожен з них щодо введення залежностей , так як хоча вони обидва вводять залежності, вони вводять дуже різні речі.

AngularJS має власну систему залежності, яка дозволяє вводити модулі AngularJS в новостворений модуль, щоб повторно використовувати реалізації. Скажімо, ви створили "перший" модуль, який реалізує фільтр AngularJS "привіт":

angular
  .module('first', [])
  .filter('greet', function() {
    return function(name) {
      return 'Hello, ' + name + '!';
    }
  });

А тепер скажімо, що ви хочете використовувати фільтр "привітання" в іншому модулі під назвою "другий", який реалізує фільтр "до побачення". Ви можете зробити це, ввівши модуль "перший" у модуль "другий":

angular
  .module('second', ['first'])
  .filter('goodbye', function() {
    return function(name) {
      return 'Good bye, ' + name + '!';
    }
  });

Вся справа в тому, що для того, щоб зробити цю роботу правильно без RequireJS, ви повинні переконатися, що "перший" модуль AngularJS завантажений на сторінку, перш ніж створити "другий" модуль AngularJS. Цитування документації:

Залежно від модуля означає, що необхідний модуль потрібно завантажити перед завантаженням необхідного модуля.

У цьому сенсі, ось де RequireJS може допомогти вам, оскільки RequireJS забезпечує чіткий спосіб вставити скрипти на сторінку, що допоможе вам організувати залежність сценарію між собою.

Повертаючись до «першого» та «другого» модулів AngularJS, ось як це можна зробити, використовуючи RequireJS, що розділяє модулі на різні файли, щоб використовувати завантаження залежностей від сценарію:

// firstModule.js file
define(['angular'], function(angular) {
  angular
    .module('first', [])
    .filter('greet', function() {
      return function(name) {
        return 'Hello, ' + name + '!';
      }
    });
});
// secondModule.js file
define(['angular', 'firstModule'], function(angular) {
  angular
    .module('second', ['first'])
    .filter('goodbye', function() {
      return function(name) {
        return 'Good bye, ' + name + '!';
      }
    });
});

Ви можете бачити, що ми залежимо від файлу "firstModule", який потрібно ввести до того, як вміст зворотного виклику RequireJS може бути виконаний, для створення якого потрібно "перший" модуль AngularJS для створення "другого" модуля AngularJS.

Бічна примітка: Введення "angular" у файли "firstModule" та "secondModule" як залежність потрібна для того, щоб використовувати AngularJS всередині функції зворотного виклику RequireJS, і він повинен бути налаштований на конфігурації RequireJS для відображення "кутового" в код бібліотеки. Можливо, AngularJS також завантажується на сторінку традиційним чином (тег сценарію), хоча перемагає переваги RequireJS.

Детальніше про підтримку RequireJS від ядра AngularJS з версії 2.0 у своєму блозі.

Базуючись на моєму дописі в блозі "Створення сенсу RequireJS за допомогою AngularJS" , ось посилання .


2
Насправді найкраще, включаючи посилання, узагальнити вміст посилання тут на стеку переповнення. Якщо ваше посилання коли-небудь перерветься, що робиться в Інтернеті, ваша відповідь тут була б марною для майбутніх відвідувачів. Розгляньте редагування, щоб внести підсумки та покращити цю публікацію. Удачі!
jmort253

3
Ось вам, спасибі jmort253.
leog

Дякуємо, що внесли ці зміни та пояснили, як RequireJS може допомогти керувати залежностями, щоб уникнути проблем з Angular, намагаючись завантажити щось, що ще не існує.
jmort253

Я повністю погоджуюся, найкраще використовувати цей підхід для великих програм, якщо ні, у вашій програмі буде кілька тегів <script>.
І.Тигер

21

Як згадував @ganaraj, AngularJS має ін'єкцію залежності у своїй основі. Створюючи додатки для насіння іграшок з і без RequireJS, я особисто виявив, що RequireJS був, мабуть, надмірним для більшості випадків використання.

Це не означає, що RequireJS не корисний, оскільки це можливість завантаження скриптів та підтримка чистоти вашої бази коду під час розробки. Поєднання оптимізатора r.js ( https://github.com/jrburke/r.js ) з мигдалем ( https://github.com/jrburke/almond ) може створити дуже тонку історію завантаження сценарію. Однак, оскільки функції управління залежністю не такі важливі, як у основі вашої програми, ви також можете оцінити іншу сторону клієнта (HeadJS, LABjs, ...) або навіть серверну (MVC4 Bundler, ...) рішення для завантаження сценарію. для вашої конкретної програми.


17

Так, спеціально для дуже великих SPA.

У деяких сценаріях RequireJS є обов'язковим. Наприклад, я розробляю програми PhoneGap за допомогою AngularJS, який також використовує API Google Map. Без завантажувача AMD, як RequireJS, додаток просто вийде з ладу при запуску в автономному режимі, оскільки він не може створити сценарії API Google Map. Навантажувач AMD дає мені можливість відобразити повідомлення про помилку користувачеві.

Однак інтеграція між AngularJS та RequireJS трохи хитра. Я створив кутовий AMD, щоб зробити це менш болісним процесом:

http://marcoslin.github.io/angularAMD/




7

Так, має сенс використовувати RequJS з Angular, я витратив кілька днів на тестування декількох технічних рішень.

Я зробив кутове насіння з RequireJS на стороні сервера. Дуже простий. Я використовую позначення SHIM для жодного модуля AMD, а не для AMD, тому що я думаю, що дуже важко мати справу з двома різними системами введення залежностей.

Я використовую grunt і r.js для об'єднання файлів js на сервері, залежить від файлу конфігурації (залежності) SHIM. Тому я посилаюсь лише на один js-файл у своєму додатку.

Для отримання додаткової інформації перейдіть на мій кутовий насіння github: https://github.com/matohawk/angular-seed-requirejs


3

Я б уникав використання Require.js. Програми, які я бачив, це призводить до безладу декількох типів архітектури шаблонів модулів. AMD, викриття, різні аромати IIFE тощо. Існують інші способи завантаження на вимогу, наприклад, кутовий мод loadOnDemand . Додавання інших матеріалів просто заповнює ваш код, наповнений суворими, і створює низьке співвідношення сигнал / шум і робить ваш код важким для читання.


2

Ось підхід, який я використовую: http://thaiat.github.io/blog/2014/02/26/angularjs-and-requirejs-for-very-large-applications/

На сторінці показана можлива реалізація AngularJS + RequireJS, де код розділений за функціями, а потім за типом компонента.


3
Навіть коли посилання дає інформацію для відповіді на запитання, пояснення того, що відображається на сторінці, є найкращою практикою.
juliocesar


0

Я думаю, що це залежить від складності вашого проекту, оскільки кутова значно модулюється. Ваші контролери можуть бути відображені на карті, і ви можете просто імпортувати ці класи JavaScript на вашу сторінку index.html.

Але у випадку, якщо ваш проект стане більшим. Або ви передбачаєте такий сценарій, вам слід інтегрувати кутовий з Requjs. У цій статті ви можете побачити демо-додаток для такої інтеграції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.