AngularJS - візуалізація на стороні сервера


75

Як ви знаєте, AirBnB opensourced Rendr ( http://nerds.airbnb.com/weve-open-sourced-rendr ) , який повинен дозволити стороні сервера візуалізації в Backbone додатків. Це круто, тому що можна запустити першу "ітерацію" візуалізації шаблону на сервері, і клієнт отримує повністю відтворений HTML-документ плюс весь додаток JS. Це значно скорочує час для відображення та може позбавити нас від інших систем шаблонування на стороні сервера.

Отже, чи вдалося комусь відтворити AngularJS за допомогою jsdom або ZombieJS ? Ціх емуляцій dom / браузера на Node.js теоретично повинно вистачити для простого шаблонізації Angular на стороні сервера, але результати, які, на мою думку, погуглив, були не надто переконливими.


7
Можливо, він поставляється в AngularJS 2.0. У цьому відео вони розповідають про рендеринг на стороні сервера і про те, чому наразі це неможливо зробити з AngularJS.
JayQ

чи спрацювала вам якась із відповідей?
Xsmael

Відповіді:


16

Ось ще одне рішення: https://github.com/ithkuil/angular-on-server

wiki для деталей

Оновлення від автора цього репо : це було приблизно 6 років тому (на момент редагування). На даний момент люди, мабуть, повинні використовувати https://angular.io/guide/universal або просто https://prerender.io/


3
річ angular.io призначена для Angular, а не AngularJs. Це дві абсолютно різні мови ...
bokkie

Чи можу я використовувати Prerender у програмі, яка використовує PHP на стороні сервера, замість Express? Як?
Razvan Zamfir

7

Цей новий пакет https://github.com/a-lucas/angular.js-server дозволяє вам попередньо відтворити Angular-додаток і надіслати HTML клієнту, який потім виконає код jS.

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

PS: Я є основним учасником цього пакету.


5

AngularJS працює без контексту jsdom без жодних хитрощів. Просто додайте angular.js до списку js src та головну сторінку програми angular до jsdom при його ініціалізації.

Отже, рендерінг дуже простий: просто використовуйте angular у jsdom, і це працює. Передати його в браузер дещо складніше.

Один із способів - пакетна синхронізація змін DOM.

Щоб отримувати динамічні оновлення від сервера до клієнта, ви можете використовувати MutationEvents (на жаль, jsdom не підтримує MutationObservers, але MutationEvents працює досить швидко). Використовуйте їх, щоб накопичувати зміни DOM у масиві акумулятора та періодично надсилати їх до клієнтського браузера (скажімо, за 25 мс).

Крім того, щоб увімкнути події користувача, вам слід відстежувати їх у документі в браузері, а схожі накопичувати та перекидати на сервер.

Однією з реалізацій такого підходу є jsdom-sync ( https://www.npmjs.org/package/jsdom-sync )

Негативною стороною візуалізації на стороні сервера є відсутність розміру моделі коробки DOM, оскільки для отримання ширини / висоти елемента вона повинна бути фактично відображена. Означає, що це рішення ледве підходить для svg тощо.

Ви також можете розглянути можливість перегляду моделі та синхронізувати її з областями браузера, але це зовсім інша історія.


4

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

Оновлення: Незабаром це стане можливим із введенням Object.observe;)


У більшості випадків візуалізація на стороні сервера застосовується для роботів, а в деяких особливих випадках, тому вплив продуктивності сервера є незначним. Також `` рендерінг '' на стороні сервера - це просто шаблон для обробки html, без фактичного рендерингу (що найбільше вимагає центрального процесора), що в будь-якому випадку відбувається на стороні клієнта.
setec

зазвичай ви хочете зробити рендеринг на стороні сервера при початковому завантаженні. тому користувач x переходить на сторінку списку вперше, відвідуючи додаток. можливо, вони закрили браузер і знову відкрили його пізніше. замість того, щоб завантажувати програму, а потім робити ще один http-запит на дані, сервер може просто зробити все це для нас під час першого запуску. інша дуже корисна причина для цього - пошукові боти. не всі з них такі розумні, як боги Google, і не мають власних компіляторів javascript.
jemiloii 02.03.16

Час візуалізації має значення для ботів Google Adwords, які використовують час завантаження як фактор якості якості цільової сторінки . Я виявив, що навіть безголові браузери, такі як PhantomJS, генерують значне навантаження на процесор.
Едвард Ньюелл


2

@ dai-shi створив connect-prerenderer, дивіться тут . Ще кілька питань, але, сподіваємось, хороший старт


Що робити, якщо у мене є програма, яка використовує PHP на стороні сервера, а не Express? Який варіант я маю?
Разван Замфір


2

Я знаю, що це трохи пізня відповідь, angular.js-сервер ( https://github.com/a-lucas/angular.js-server ) використовує модифіковану версію angular, яка запускає стан очікування, необхідний для виявлення, коли всі ajax запит і $ compile події обробляються.

Мені вдалося попередньо відтворити стек mean.js майже без змін.


1

Це не ефективно, але я працював над простим сервером PhantomJS для Heorku, який буде аналізувати будь-який клієнтський JS. Я використовую його спеціально для Angular та Rails для обслуговування HTML для запитів ботів.


-1

Я сподіваюся, це все одно може допомогти somone, але ось пакет npm, який я створив:

https://www.npmjs.com/package/ng-node-compile


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