是否可以在没有服务器的情况下运行angular 8应用程序(离线)?

时间:2019-09-30 18:15:08

标签: angular offline

我有一个必须在不提供服务的情况下运行的应用程序。生成了一个html文件,它需要的所有内容都在其中。我正在使用带有引导程序的jquery(我只是将它们直接导入html中),但是我想更改为Angular 8,例如,因为项目越来越大。我相信Angular会发出http请求来读取文件,模板,也许是路由等,并且众所周知,浏览器不允许在没有http服务器的情况下读取文件。

问题:是否有任何允许我构建离线独立应用程序(只需打开html文件)的angular / ng-cli构建说明或开发指南(例如,不像惰性加载模块那样)?

当我使用ng build --prod构建应用程序时,生成的文件仍需要服务器。我在chrome上收到以下错误:

  

不允许加载本地资源


(一些编辑使其更加清晰)

我处于一个非常受限且多样化的OS商业环境中,在该环境中无法生成二进制文件。每个人的计算机上都有浏览器,但不是每个人都可以访问互联网。然后必须离线运行html。

这是过程:我生成一个html文件,然后将这个html文件发送给没有Internet访问权限的用户,然后他们在浏览器中打开它,只需单击它即可。没有可以访问生成的html的http服务器。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您要问的问题,将Angular打包后,就不需要任何东西来运行它,因此为什么可以将其打包并作为静态网站提供给Amazon Web Services S3之类的地方桶(“无服务器”)。您可以在断开连接的环境中读取JSON文件,只要它们在项目中是本地的即可。它可能看起来像以下内容:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { IDataFile } from '../interfaces/data-file.interface';

@Injectable({
    providedIn: 'root'
})
export class MyDataService {
    static data: IDataFile;
    constructor(private http: HttpClient) { }
    load() {
       const jsonFile = `assets/data/my-data.json`;
        return new Promise<void>((resolve, reject) => {
            this.http.get(jsonFile).toPromise().then((response: IDataFile) => {
                MyDataService.data = <IDataFile>response;
                resolve();
            }).catch((response: any) => {
                reject(`Could not load file '${jsonFile}': ${JSON.stringify(response)}`);
            });
        });
    }
}

然后,您可以在启动时通过在导入后将方法添加到app.module.ts中,然后在提供程序下添加服务来将数据加载到服务中:

export function initializeApp(data: MyDataService ) {
return () => data.load();
}
...
providers: [
    MyDataService ,
    {
        provide: APP_INITIALIZER,
        useFactory: initializeApp,
        deps: [MyDataService], multi: true
    },
 ]

然后,您可以通过MyDataService.data.somedata在应用程序中的任何地方使用服务。

所有这些的主要警告是,正如我说的那样,您可以从JSON文件中读取,但是您不能写回它,因此,除了内存中的数据(不是持久,并且会在重新加载时重置)如果您使用本地sessionStorage或localStorage甚至cookie,则可以在某种程度上与之抗争;如果您使用了本地存储,则可以覆盖预加载的数据。但在这种情况下,将没有数据的集中管理,因此必须是特定的用例。

如果您希望在文件系统上写入文件,我将为您的Angular应用程序(例如Electron(https://electronjs.org/))提供桌面应用程序包装,但这需要为您的用户安装。