Коли використовувати Requirejs, а коли в комплекті javascript?


74

Це може бути німим запитанням для хлопців з Інтернету. Але я трохи розгублений з цього приводу. Зараз у мене є програма, де я використовую пару файлів Javascript для виконання різних завдань. Зараз я використовую пакувальник Javascript для об’єднання та зменшення всіх файлів. Отже, під час виконання буде лише один файл app.min.js. Тепер Requirejs використовується для завантаження модулів або файлів під час виконання. Отже, питання полягає в тому, що якщо у мене вже є всі речі в одному файлі, то чи потрібен мені requirejs? Або що таке сценарій використання, коли я можу використовувати requirejs та / або пакет?

Будь ласка, дайте мені знати, якщо потрібні додаткові деталі.


1
Не розумію, навіщо вам потрібні обидва. Як ви думаєте , ви б?
nnnnnn

2
Це плутанина. Коли використовувати що? Або просто потрібно вибрати одну?
kunjee

Окрім лінивого завантаження javascripts, чи не вимагає також введення залежності функцій, щоб усунути потребу у глобалах? Мені здається, що Require все ще корисний у пакетному файлі. Я помиляюся?
папіро,

Відповіді:


28

Це гаряче суперечливе питання серед багатьох досвідчених розробників javascript. У багатьох інших мовах є фаза "компіляції", коли вся програма складається в комплекті для розгортання (на думку приходять файли .WAR від JBoss). Програмісти, які походять з більш традиційного походження, часто віддають перевагу такому підходу.

Протягом останніх років Javascript спостерігав такий ріст, що складно скласти точні найкращі практики, але ті, хто оцінює більш функціональну природу Javascript, часто віддають перевагу підходу завантаження модулів (наприклад, використання require.js).

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

Щоб відповісти прямо на ваше запитання, так, це одне чи інше.

Більшість, хто стверджує, що ваші сценарії упаковуються в один файл, вважають, що це забезпечує більше стиснення і, отже, є більш ефективним. Я вважаю, що переваги ефективності упаковки в більшості випадків незначні, оскільки: (1) час завантаження модулів розподіляється протягом усього сеансу, (2) окремі модулі можуть бути стиснуті майже до однакового відсотка, (3) окремі модулі можуть бути кешовані сервер і маршрутизатори окремо, і (4) завантаження скриптів лише тоді, коли вони потрібні, врешті-решт дозволяє завантажувати менше коду для деяких користувачів і більше коду загалом.

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


6
Хоча я розумію переваги збереження файлів окремо, я думаю, що зв’язування також зменшує кількість необхідних підключень http. Оскільки конвеєризація у браузерах та серверах стає все більш доступною, це може мати менше значення, але в даний час це досить велика справа.
Ендрю Текен

5
Накладні витрати на з’єднання http можуть швидко змонтуватись, якщо програма велика. Для нашого додатка, коли ми запускаємо його в розпакованому режимі та завантажуємо кожен файл JS окремо, завантаження сторінки займає приблизно 15-30 секунд. У упакованому режимі це приблизно одна секунда.
Matt Greer

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

Тисячі строго набраних класів і один файл .swf, ftw.
Трійко

48

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

Після того, як ви закінчите розробку та захочете розгорнути свій код для своїх кінцевих користувачів, ви можете використовувати оптимізатор, щоб поєднати файли JavaScript разом і зменшити його. У наведеному вище прикладі він може об’єднати main.js та helper / util.js в один файл та зменшити результат.


4
Я знаю, що це стара тема, але я натрапив, бо мав подібні сумніви. Отже, наступне запитання, якщо ви не заперечуєте - якщо ми нарешті об’єднаємо все в один файл для розгортання, то вся моя програма завантажується одним пострілом, а не поштучно (на вимогу). Хіба це не суперечить AMD?
Code Poet

5
так, це в певному сенсі. Але AMD є більш теоретичним, де, так як requirejs, також стосується реальних проблем продуктивності. Завантажувати кожен модуль окремо, безумовно, є чистішим і чистішим, але триватиме назавжди :)
Метт Грір,

1
Я також поставив це запитання для перегляду stackoverflow.com/questions/20515679/… . Можливо, середня точка між двома підходами?
Поет-кодекс

11

Це залежить від вашої заявки. Якщо ви робите серверну програму лише зі скромним javascript (мінімізованим менше 100 кб), тоді йдіть на повну комплектацію, мабуть, у вас все буде добре.

Але якщо ви створюєте додаток javascript і маєте в собі тону коду, то ваші потреби будуть іншими.

Наприклад, у моєму додатку я об’єдную всі основні файли. Є jQuery, підкреслення, магістраль, мої основні файли додатків, моя система входу користувачів, моя система розмітки, мої сповіщення та система чату - все це частина мого великого початкового файлу.

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

Форуми, wiki, wysiwyg, підбір кольорів, перетягування / скидання, календар та деякі анімаційні файли є частиною другої категорії. Вам потрібно негайно прийняти обґрунтовані рішення щодо того, що зазвичай використовується і що потрібно, а не те, що можна відкласти.

Якщо я включу все негайно, я можу перевищити мега javascript, що було б божевільним і зробило б початкове завантаження неприпустимо повільним.

Друга категорія починає завантажуватися після initSuccess активації подій із початкового файлу.

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

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