如何在angular universal中使用localStorage?
How to use localStorage in angular universal?
我正在使用@angular v4.0.3 和 webpack 2.2.0。
使用 Auler post 它工作正常,但是当我包含 localStorage 时它停止工作了。
有什么方法可以让它工作或 angular universal
中 localStorage 的任何模块
一个好的方法是使 localStorage
成为可注射的并为其提供不同的实现。
一个反映Storage
API的摘要class可以作为token:
export abstract class LocalStorage {
readonly length: number;
abstract clear(): void;
abstract getItem(key: string): string | null;
abstract key(index: number): string | null;
abstract removeItem(key: string): void;
abstract setItem(key: string, data: string): void;
[key: string]: any;
[index: number]: string;
}
然后对于浏览器应用模块是
export function localStorageFactory() {
return localStorage;
}
...
{ provide: LocalStorage, useFactory: localStorageFactory }
对于服务器应用程序模块 localStorage
可以替换为一些实现,例如 node-storage-shim
用于内存存储:
{ provide: LocalStorage, useClass: StorageShim }
使用 DI 而不是全局持久存储也使测试更容易。
发生这种情况是因为使用 Angular 通用服务器端渲染,Angular 应用程序在 Nodejs 服务器和客户端浏览器中运行。此时,服务器应用程序没有对 localStorage 对象的引用,因为它仅在客户端可用。
我写了一篇关于此的文章并实施了解决方案:How to use localStorage on Angular 9 Universal (SSR)
我正在使用@angular v4.0.3 和 webpack 2.2.0。
使用 Auler post 它工作正常,但是当我包含 localStorage 时它停止工作了。 有什么方法可以让它工作或 angular universal
中 localStorage 的任何模块一个好的方法是使 localStorage
成为可注射的并为其提供不同的实现。
一个反映Storage
API的摘要class可以作为token:
export abstract class LocalStorage {
readonly length: number;
abstract clear(): void;
abstract getItem(key: string): string | null;
abstract key(index: number): string | null;
abstract removeItem(key: string): void;
abstract setItem(key: string, data: string): void;
[key: string]: any;
[index: number]: string;
}
然后对于浏览器应用模块是
export function localStorageFactory() {
return localStorage;
}
...
{ provide: LocalStorage, useFactory: localStorageFactory }
对于服务器应用程序模块 localStorage
可以替换为一些实现,例如 node-storage-shim
用于内存存储:
{ provide: LocalStorage, useClass: StorageShim }
使用 DI 而不是全局持久存储也使测试更容易。
发生这种情况是因为使用 Angular 通用服务器端渲染,Angular 应用程序在 Nodejs 服务器和客户端浏览器中运行。此时,服务器应用程序没有对 localStorage 对象的引用,因为它仅在客户端可用。
我写了一篇关于此的文章并实施了解决方案:How to use localStorage on Angular 9 Universal (SSR)