angular - Angular 中 Assets 的动态位置

标签 angular relative-path

我的应用程序将在多台机器上使用,并且每次都可能位于不同的位置。例如,回家路线可能位于以下任何位置:

本地主机:9000/家

本地主机:9000/abc/home

localhost:2000/yet/another/location/home

因此,我想确保我的应用无论需要在哪里查找其 Assets 都能正常运行。我所有的路径都是相对的,所以希望这是朝着正确方向迈出的一步,就像这样:

<link rel="stylesheet" href="assets/global-styles.css">

在我的组件模板中,像这样:

<img src="assets/components/dashboard/images/foo.png" />

这是我到目前为止尝试过的:

我修改了我的 <base>属性所以手动抓取端口之后和“home”之前的 URL 部分,如下所示:

<html>
    <head>
    <script>
        // manually sets the <base> tag's href attribute so the app can be located in places other than root
        var split = location.pathname.split('/');
        var base = "";
        for (var i = 0; i < split.length - 1; i++) {
            base += split[i];
            if (i < split.length - 2) {
                base += "/";
            }
        }
        window['_app_base'] = base;
        document.write("<base href='" + base + "' />");
    </script>
        ....

到目前为止的例子,如果用户在 localhost:9000/hello/home 加载主页,那么 <base>标签看起来像这样:

<base href='/hello' />

该代码还将一个变量设置为相同的值,然后我在我的 app.module.ts 中使用它来提供一个新的基值:

从“@angular/common”导入 { APP_BASE_HREF };

@NgModule({
    declarations: [...],
    imports: [...],
    providers: [
        ...,
        { provide: APP_BASE_HREF, useValue: window['_app_base'] || '/' }
    ]
});

然而,尽管如此,该应用仍在寻找 Assets 文件夹中的 Assets ,它认为该文件夹仍在根位置。

GET http://localhost:9000/assets/ionic-styles.css net::ERR_ABORTED
GET http://localhost:9000/inline.bundle.js net::ERR_ABORTED
GET http://localhost:9000/assets/font-awesome-4.6.3/css/font-awesome.min.css net::ERR_ABORTED
GET http://localhost:9000/assets/bootstrap.min.css net::ERR_ABORTED
GET http://localhost:9000/assets/global-styles.css net::ERR_ABORTED
GET http://localhost:9000/polyfills.bundle.js net::ERR_ABORTED
GET http://localhost:9000/styles.bundle.js net::ERR_ABORTED
GET http://localhost:9000/vendor.bundle.js net::ERR_ABORTED

我错过了什么?我还看到人们采取了一种方法,他们在 ng build 命令中指定了一个路径……在上面的所有内容之上是否有必要?我真的很想避免为每个人安装一个单独的构建,但如果需要这样做,请告诉我。

谢谢。

更新: 令人沮丧的几天后,我的应用程序可以使用上述问题中显示的代码运行。原来我只需要有 <script>在我的 <head>修改 <base> .无需在 ngModule 提供程序中添加 APP_BASE_HREF。但是,添加 APP_BASE_HREF 也不会破坏任何东西......

这是其中一个问题,在将问题搁置一周并重新解决后,它“刚刚奏效”。也许发生了某种缓存问题?毕竟,我曾尝试更新 <base>上周,但它仍然在错误的地方寻找 Assets 。尽管我上周尝试调试此问题时已多次清除浏览器缓存,但我不确定缓存是否真的是问题所在。

很抱歉,这个答案对以后遇到这个问题的人没有帮助。我真的不知道是什么解决了这个问题。我最好的猜测是以下答案之一可能会为您指明正确的方向。似乎无论我尝试什么,它都因为某种未知原因而无法正常工作。

如果您遇到此问题并有具体问题,请随时给我发消息或发表评论,我会告诉您我是如何设置的。

最佳答案

您只需在您的 index.html

中创建以下 base href
<base href="./">

您可以手动或在构建时执行此操作

ng build --base-href ./

除了将内容从 dist 目录复制到服务器的 /whatever/is/your/root/ 之外,您不需要在 Angular 方面做任何其他事情目录。

现在您可以使用 url 访问您的 angular 应用程序

localhost:port/whatever/is/your/root/index.html

更新

您可能想在您的服务器上做更多的事情。但是,您如何操作将完全取决于您在服务器上使用的技术。

  1. localhost:port/whatever/is/your/root/index.html 作为您的默认主页。

  2. 为了使您的 Angular 应用程序的 html5 路由 url 在浏览器刷新时正常工作,您应该将所有请求转发到 url localhost:port/whatever/is/your/root/**localhost:port/whatever/is/your/root/index.html请注意,您应该转发请求而不是发送重定向。

关于angular - Angular 中 Assets 的动态位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48347430/

相关文章:

node.js - Microsoft.AspNetCore.SpaServices由于 Node 模块map.d.ts而失败

html - 在 Ionic Angular 项目上的 HTML5 视频标签上播放/暂停

batch-file - BAT脚本中的相对路径

wpf - 相对于程序集的本地文件的 URI

将绝对路径转换为当前存在的相对路径的 Linux 命令

javascript - 无法使我的 Highcharts 以 Angular 5 响应

angular - "this"不能用于 typescript 函数 (Angular)

css - Angular NgStyle : list image style

eclipse - 我可以在不使用绝对路径的情况下在 Eclipse (CDT) 中的项目之间共享源代码吗?

spring - UriComponentsBuilder 查询参数和片段