Size: a a a

Angular-universal-ru

2020 March 18

YG

Yurii Gavdan in Angular-universal-ru
Vadim
В angular-universal-starter есть реализация этого.
нашел: npm run prerender

буду пробовать, спасибо,
возможно проще будет проект перенести на стартер,

чем куски кода со стартера натягивать на проект :)
источник

YG

Yurii Gavdan in Angular-universal-ru
Aram Khachatrian
Кроме кеширования даных с сервера в не меньшей степени поможет кеширование отрендериных страниц. В моем случае это дало даже больший выигрыш. При этом не всегда годится чистый пререндеринг, т.к. данные, влияющие на отображение могут менятся чаще чем кому-то понравится ре-билдить приложение. Я просто кеширую готовые страницы в Redis, при чем прикрутил самопальную конфигурацию какие страницы и как долго держать в кеше.
супер, я так понимаю самое главное это home-page
источник

ИК

Игорь Кравченко in Angular-universal-ru
Vadim
@gorniv куда ты кеширование в стартере дел? Я не могу его найти.
блин, я этот кусок кода потерял при перезде на 9-ый, вот пример из 8-го https://github.com/Angular-RU/angular-universal-starter/blob/master/server.bak.ts#L131
источник

YG

Yurii Gavdan in Angular-universal-ru
Спасибо!
источник

YG

Yurii Gavdan in Angular-universal-ru
Кстати сделал просто в стартере
npm install
и вручную запустил
npm run generate:prerender

и оно к сожалению вылетело
(но у меня 10ая нода и она нам нужна, вохможно сдесь уже 12я нада):

dist
Unhandled Promise rejection: R3InjectorError[ApplicationModule -> ApplicationRef -> ApplicationInitStatus -> InjectionToken Application Initializer -> [object Object] -> TranslatesService -> InjectionToken REQUEST -> InjectionToken REQUEST -> InjectionToken REQUEST]:
 NullInjectorError: No provider for InjectionToken REQUEST! ; Zone: <root> ; Task: Promise.then ; Value: { NullInjectorError: R3InjectorError[ApplicationModule -> ApplicationRef -> ApplicationInitStatus -> InjectionToken Application Initializer -> [object Object] -> TranslatesService -> InjectionToken REQUEST -> InjectionToken REQUEST -> InjectionToken REQUEST]:
 NullInjectorError: No provider for InjectionToken REQUEST!


PS: а 10ая имменно потому что на 12 что то было не так с hiredis либой, для работы редиса...

PS: да, сорри если много текста... хочется просто найти быстрое решение :)
источник

YG

Yurii Gavdan in Angular-universal-ru
Aram Khachatrian
Кроме кеширования даных с сервера в не меньшей степени поможет кеширование отрендериных страниц. В моем случае это дало даже больший выигрыш. При этом не всегда годится чистый пререндеринг, т.к. данные, влияющие на отображение могут менятся чаще чем кому-то понравится ре-билдить приложение. Я просто кеширую готовые страницы в Redis, при чем прикрутил самопальную конфигурацию какие страницы и как долго держать в кеше.
подскажи пжлст как ты к redis подключаешься?
и это работает на 12й ноде?

у нас вот (на сколько я помню работало только на 10й и это печально), запускаю на 12й сейчас, чтобы вспомнить что там ломалось
"redis": "^2.8.0",
"connect-redis": "^3.4.2",
"hiredis": "^0.5.0",

да, увы не работает:
при попытке сделать npm install:

Library/Caches/node-gyp/12.14.1/include/node/v8config.h:311:29: note:
     expanded from macro 'V8_DEPRECATED'
 declarator __attribute__((deprecated(message)))


и тут забавынй момент,
удаляем библиотеку "hiredis",

переходим на 12ую ноду,
rm -rf node_modules/
npm install

npm start - запускается SPA версия - рабоает,

пробуем запустить SSR  версию, все валится из-за этого hiredis.js :(

ERROR in ./node_modules/redis-parser/lib/hiredis.js
Module not found: Error: Can't resolve 'hiredis' in '/Users/igavdan/Projects/hydra/v2--slikkepott/node_modules/redis-parser/lib'
источник

YG

Yurii Gavdan in Angular-universal-ru
в результате нужно найти решение, как запустить redis на 12й ноде и можно пробовать преходить на стартер 9ый,

и кстати 12ая нода по быстрее локально работает чем 10ая
источник

AK

Aram Khachatrian in Angular-universal-ru
У меня:
node v13.9.0
redis ^3.0.2

connect-redis, hiredis - отсутствуют

Подключаюсь так:
import * as redis from 'redis';

const redisClient = redis.createClient({ password: config.redis.password });
redisClient.on('error', error => console.error(error));

Ну и дальше:
redisClient.get(...)
redisClient.set(...)
источник

AK

Aram Khachatrian in Angular-universal-ru
На 12 ноде не пробовал.
источник

YG

Yurii Gavdan in Angular-universal-ru
Aram Khachatrian
У меня:
node v13.9.0
redis ^3.0.2

connect-redis, hiredis - отсутствуют

Подключаюсь так:
import * as redis from 'redis';

const redisClient = redis.createClient({ password: config.redis.password });
redisClient.on('error', error => console.error(error));

Ну и дальше:
redisClient.get(...)
redisClient.set(...)
Спасибо, попробую
источник

YG

Yurii Gavdan in Angular-universal-ru
Yurii Gavdan
Спасибо, попробую
пфф, проблема была именно при сборке, нужно было в файле
webpack.server.config.js
доабвить игнор этого плагина
plugins: [
 new webpack.IgnorePlugin(/^hiredis$/),

но у нас юзается
const RedisStore = connectRedis(session);

Ура, работает! :)
источник

YG

Yurii Gavdan in Angular-universal-ru
источник

nt

nur tlek in Angular-universal-ru
Yurii Gavdan
пфф, проблема была именно при сборке, нужно было в файле
webpack.server.config.js
доабвить игнор этого плагина
plugins: [
 new webpack.IgnorePlugin(/^hiredis$/),

но у нас юзается
const RedisStore = connectRedis(session);

Ура, работает! :)
красавчик
источник

YG

Yurii Gavdan in Angular-universal-ru
nur tlek
красавчик
то не я то stackoverflow))
источник

nt

nur tlek in Angular-universal-ru
ахахах 😄
источник

YG

Yurii Gavdan in Angular-universal-ru
nur tlek
ахахах 😄
забавно что я 3-5 мес назад хотел еще это сделать))
источник

nt

nur tlek in Angular-universal-ru
всему своё время дье
источник

AK

Aram Khachatrian in Angular-universal-ru
А зечем те две доп либы? Просто интересно
источник

YG

Yurii Gavdan in Angular-universal-ru
Aram Khachatrian
А зечем те две доп либы? Просто интересно
без hiredis не запускалось на 10й ноде,
а connectRedis - не помню уже,
там наверное более богатая API,
оч. давно подключал и уже не помню
const RedisStore = connectRedis(session);
const store = new RedisStore({ client: redisClient });
но там ее вставляют потом сюда (после меня там еще бэк чуть допиливали)
this.express.use(session({
....
store,
}));
или для сессий по другому нельзя юзать было
источник

YG

Yurii Gavdan in Angular-universal-ru
Aram Khachatrian
А зечем те две доп либы? Просто интересно
нам под каждого пользователя нужно хранить сессию, возможно все-таки для этого
источник