Добрий чи поганий вбудований JavaScript?


16

На даний момент я перейшов з WordPress на Yii Framework, і зовнішній розробник відновлює мій сайт.

Я зауважую, що кожен раз, коли він викликає AJAX / jQuery способом Yii, він вставляє вбудований JavaScript на веб-сторінці. Хоча здається, що код JavaScript розміщений нижче нижнього колонтитулу, він все ще знаходиться в рядку.

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


Що саме ви маєте на увазі під тим, що він вставляє JavaScript на веб-сторінці ?
Салман А

3
Заради інших, хто вважає це питання і думає про такі речі, як <a onClick="function(){/* do stuff */} ">Click Here</a>це я розумію, вважається ДУЖЕ поганим, і слід відокремити свій код від свого HTML Див. Ця стаття
TecBrat

1
@ user1066946 t.co/j1RpJgwoku :-)
Кос

1
@ user1066946 Мені дуже подобається використовувати Angular, я просто зауважив, що "семантична павутина" зробила коло (з точки зору збереження коду клею поруч із DOM)
Кос

1
"Хоча здається, що код JavaScript розміщений нижче нижнього колонтитулу, він все ще є вбудованим." - Це здається, ніби ви маєте на увазі вбудований JavaScript, а не "вбудований" JavaScript (на який посилається TecBrat).
Містер Білий

Відповіді:


13

Вбудований JavaScript збільшує час завантаження сторінки, що не добре. При виклику до .jsфайлу, принаймні, це можуть бути паралельні виклики та час завантаження вмісту зменшився. Так, бувають випадки, коли можна правильно вводити JavaScript безпосередньо в HTML-код, але вам краще краще максимально завантажувати це.

Майте на увазі, що час завантаження сторінки (тобто HTML) і не всі виклики ресурсів впливають на показники, які впливають на ранжирування (хоч як PageRank або в SERPs це не має значення). Справа в тому, що це впливає на продуктивність сайтів для SEO, однак це проявляється.


7
Переговори про друге з'єднання з імовірно тим самим хостом, щоб завантажити той самий обсяг даних, швидше, ніж в активному потоці? зазвичай, якщо ви отримуєте, скажімо, 50Kbps у файлі хосту, починаючи другий сеанс, можна скоротити його так, що обидва зараз мають 25Kbps. Якщо хост чомусь не дроселює за з'єднання.
EkriirkE

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

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

Думка розділити пропускну здатність, хоча я розумію вашу логіку, і це не зовсім помилково, трохи вводить в оману. HTML менше, тим менше часу і будь-який наступний дзвінок може насправді чекати.
closetnoc

3
якщо ви замикаєтесь на час, ви неправильно дивитесь на пропускну здатність. дивіться на профайлер у часи завантаження: зазвичай час підключення становить 10-100x БІЛЬШЕ, ніж реальний час обміну даними. це означає, що ФРАГМЕНТАЦІЯ є справжньою проблемою, і використання зовнішнього, виділеного файлу для дійсно невеликих js може бути найгіршим, що вбудовано. Inline краще в браузері, який не проводить реальної паралелізації
Lesto

29

На моєму сайті конвертації валюти більшість сеансів - це перегляди однієї сторінки. Це пояснюється тим, що користувачі можуть здійснювати обчислення своєї валюти безпосередньо на цільовій сторінці (усі розрахунки обробляються на стороні клієнта за допомогою JavaScript.)

Моя сторінка завантажується та відображається приблизно в половині часу, коли всі ресурси (css, js та навіть зображення ) знаходяться на сторінці. Оскільки так мало моїх користувачів переглядають декілька сторінок, я не отримав би великої користі від кешування деяких ресурсів між переглядами сторінок.

Мій сайт не типовий. Більшість сайтів мають кілька сторінок на сеанс та великі зображення, які б зробили мою техніку менш застосовною. Немає жодного правильного рішення цього питання; це залежить від сайту. Вам потрібно виміряти його самостійно на основі типової поведінки користувачів.


12

Не обов'язково погано мати JavaScript у вашому HTML-файлі, але ви повинні зателефонувати за ним.

Це є поганим , якщо у вас є велика кількість JavaScript використовується на декількох сторінках. У такому випадку JavaScript повинен знаходитись у зовнішньому, стисненому та кешованому файлі, і якщо на вашому веб-сайті є дуже інтенсивний трафік, ви повинні використовувати CDN.

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

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

У кінцевому підсумку ви повинні зважити розмір JavaScript у порівнянні із накладними витратами на додаткові HTTP-запити. Здебільшого для "середнього" сайту він, ймовірно, не збирається зробити велику різницю, просто помістивши його у зовнішній файл.


4

Я розробник Yii і можу вам сказати, що Yii не має нічого спільного з цим . Це повністю на стороні розробника , чи він або вона помістить Javascript-код в окремий файл і зареєструє його на сторінці HTML (перегляду) за допомогою CClientScript::registerScriptFileметоду, або поставить його безпосередньо для перегляду (HTML) коду та зареєструє його за допомогою CClientScript::registerScriptметоду.

Відповідно до вашої відповіді, більшість (професійних?) Розробників Yii наполегливо голосують за перший підхід, тобто - зберігати якомога більше коду Javascript в окремих файлах, наскільки це можливо. Отже, це, звичайно, не нова тенденція кодування, а скоріше погана практика розробника. Принаймні, так це бачиться в громаді Yii.

EDIT : Насправді я забув про найважливіший аргумент. Yii (як і більшість інших професійних фреймворків PHP) будується на шаблоні дизайну MVC (власне: архітектурний зразок). І той самий візерунок можна використовувати в лицьовій частині: HTML-код - це модель (дані), CSS - це перегляд (декоратор), а Javascript - контролер. Усі вони розміщені в окремі файли , .jsа .cssфайли - мінімізовані, затемнені та gzipped за найкращим сценарієм.

Коли ви збираєте свою програму Yii, ви можете порушити шаблон MVC і зберегти все в одному файлі. Питання - чи варто це робити, які переваги (немає?) І куди це вас призведе? Ви можете використовувати ту ж аргументацію, коли запитуєте, чи слід зберігати JS-код вбудованим чи ні?


Добре. Схоже, розробник використовує сторонні віджети для всього; Автозаповнення, завантаження зображення у форматі Ajax тощо. Все це додає вбудовані js.
Стівен

Ні, я не можу погодитися. Я використовую Twitter Bootstrap у своїх додатках Yii (можливо, найбільше розширення та величезний набір віджетів Yii), а також у багатьох інших розширеннях Yii, і жоден з них не використовує вбудований JS. Ваш розробник мав би пощастить знайти віджети та розширення, які використовують лише вбудований Javascript. Вам потрібно бути досить досвідченим в Yii, щоб почати писати власні розширення (за винятком тих кількох, насправді погано написаних), і навіть напівдосвідчений розробник Yii використовує вбудований код як останній з варіантів, якщо все інше не вдається.
трейдер

Використання сторонніх розширень та віджетів в Yii - чудова ідея (вам не доведеться вигадувати колесо знову). Але використання вбудованого коду JS в додатку або розширенні Yii насправді є поганим ставленням. Тому або змушуйте свого розробника писати кращий код / ​​використовувати кращі розширення та віджети, або ... отримуйте кращий розробник! :]
трейдер

Добре, дякую за відгуки. Окрім Stackoverflow, де я можу знайти хорошу спільноту Yii?
Стівен

На форумі Yii . Більшість сторінок є вільно доступними. Деякі вимагають зареєструвати акаунт та увійти. Більшість розробників Yii в Stack Overflow мають власні акаунти на форумі. Після майже шести років існування система Yii заробила велику спільноту розробників, тож якщо ви уважно подивіться, ви зможете знайти декілька розробників Yii у вашій місцевій спільноті чи навіть сусідстві. Удачі.
трейдер

3

Це насправді залежить від мети веб-сторінки, яку ви розробляєте:

Я використовую невелику кількість вбудованого JavaScript, тоді як я віддаю перевагу зовнішнім файлам JavaScript, якщо він великий.

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


2

Відповідь насправді залежить від того, що робиться.

Якщо ви помітили вбудований JavaScript, який використовується на веб-сайті (наприклад, віджет, який відображається всередині заголовка на всіх сторінках веб-сайту), тоді було б доречно перемістити його у "загальний" файл JavaScript.

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

З іншого боку, якщо JavaScript - це просто купа параметрів конфігурації / ініціалізації, наприклад:

$(function () {
    myplugin({
        images: ["img1", "img2", "img3"]
    });
});

де з якихось причин неможливо перемістити код у зовнішній файл JavaScript (наприклад, коли параметри зображення надходять із бази даних), я б зберігав його у вбудованому вигляді. Сказавши це, я вибрав би сторонні плагіни, які є "ненав'язливими" (або перетворять їх як такі).


2

Ці відповіді пропускають оцінку. Погляньте на кешування Inline .

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

Замість того, щоб надіслати клієнту цілу купу загальних функцій Javascript у .js-файлі, у яких немає контексту, поки не надаються дані (дані, які можуть сидіти на сервері та вимагати зворотної поїздки), ми можемо "запустити" контекст / дані як частина функції Javascript. Це ощадливо, оскільки це означає, що ви надсилаєте функціональні можливості / дані разом, а також надсилаєте лише ті функціональні можливості / дані, які клієнту можуть знадобитися в той час, а не надсилати весь додаток під час завантаження на першу сторінку. Це також означає, що не потрібно виставляти весь додаток до простого завантаження та реверсивного проектування під час завантаження на першій сторінці, оскільки ви вводите лише невеликі частини функціональності, які можуть знадобитися кожному окремому клієнту в той час. Не впевнений, наскільки це добре для SEO, але я впевнений, що це можна оптимізувати відповідно.

Розглянемо випадок, коли кінцевий користувач пише сторінку в деякому програмному забезпеченні CMS за допомогою редактора WYSIWYG. Як цей користувач буде додавати нові функції на сторінку, коли вони не мають доступу до ваших вихідних .js-файлів на сервері? Вони переходять на вкладку HTML і використовують вбудований Javascript.

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

Список літератури:


0

Зазвичай вбудований JS-код поганий, як говорили інші перед мною.

Але я думаю про випадок використання, коли вбудований JS кращий .

Подумайте про CMS, який вставляє галерею, керовану JS. Галерея, можливо, зроблена в jQuery. Він ідентифікується за атрибутом id, який не тільки унікальний на сторінці, але й унікальний на всьому сайті. У цьому випадку - я думаю - вбудований JS був би кращим, тому що код JS використовується лише на одній сторінці і у вас немає HTTP-накладних витрат

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