Angular Universal Starter, LocalStorage в производстве: использование «окна» в browser.module для ссылки на перерывы в локальном хранилище с производственной сборкой

Здесь есть хороший вопрос и ответ по использованию localstorage и angular2. https://stackoverflow.com/a/39098748/6203604

Этот подход, похоже, отлично работает с «запуском npm». Однако при запуске «npm run build» возникает ошибка:

Свойство 'window' не существует для типа 'typeof ../browser.module'.

В 'Universal Gotchas' на https://github.com/angular/universal-starter это говорит

окна, документы, навигаторы и другие типы браузеров — не существуют на сервере — поэтому их использование или любая библиотека, которая их использует (например, jQuery), не будет работать. У вас есть несколько вариантов, если вам действительно нужны некоторые из этих функций: если вам нужно их использовать, подумайте о том, чтобы ограничить их только вашим main.client и ситуативно обернуть их импортированными функциями isBrowser / isNode из Universal. импортировать {isBrowser, isNode} из 'angular2-universal'; Другой вариант — использовать DOM из «@angular/platform-browser».

Подойдет ли здесь оболочка isBrowser или использование браузера платформы для ссылки на localStorage? Есть примеры как лучше написать?

например, в browser.module.ts нужно ли что-то сделать, чтобы обернуть window.localStorage для распространяемого пакета?

import {LocalStorage} from './local-storage.ts';

export function ngApp() {
  return bootstrap(App, [
    // ...

    UserService,
    { provide: LocalStorage, useValue: window.localStorage}
  ]);

с чем-то, что будет работать с распространяемым пакетом «npm run build»?

Кроме того, при запуске npm start я получаю сообщение об ошибке: Неожиданный токен u. введите здесь описание изображения

Похоже, что это происходит от «u» в useValue в файле node.module.ts, поскольку он исчезает и заменяется на «Нет поставщика для Token LocalStorage!»

... 
providers: [
    // ...
    UserService,
    {provide: LocalStorage, useValue: {getItem() {} }}
]
...

У кого есть что-то подобное. Идеи?


person owenc    schedule 02.01.2017    source источник


Ответы (1)


Вы можете использовать «фальшивую» службу хранения для сервера, который на самом деле не имеет доступа к window, и использовать DI, чтобы установить его в модуле сервера, и право доступа window для модуля браузера. Хороший пример можно найти здесь

person Issac    schedule 26.02.2017
comment
Спасибо, Исаак, я попробую в эти выходные и дам тебе знать, как все идет. - person owenc; 27.02.2017