如何为在别处加载的 Angular 应用程序捆绑资产

qkh*_*pro 5 angular

对于最终构建为的 Angular 7 应用程序

- main.js
- assets
  -- assets/img
Run Code Online (Sandbox Code Playgroud)

使用引用资产的组件/html

src='./assets/img/img1.jpeg'
Run Code Online (Sandbox Code Playgroud)

该应用程序将提供给不同的团队,并且可以托管在不同的根上

example.com/route/first
example2.com/route/second
Run Code Online (Sandbox Code Playgroud)

如果消费者将我的构建内容称为 <script src=''../some-dir/libs/main.js">

Angular 应用程序将查看当前路径以查找资产(example.com/route/first/assets),这将强制他们将我提供的资产文件夹复制粘贴到其根目录。我想如果我的组件可以在相对于我的构建内容 ( '../some-dir/libs/asset')的位置而不是它们的目录根目录中查找我的资产,那么对于客户来说会简单得多。但是我不太确定我的期望是否符合行业标准或适当

如何通过提取和引用/导入我的构建内容来正确构建/捆绑/引用消费者可以在任何地方使用的资产?(我不需要知道消费者的项目结构,消费者也不需要改变我/他的文件夹结构)

zhi*_*min 5

只需在应用程序中使用相对网址,如下所示:

<img src='./assets/img/img1.jpeg' />
Run Code Online (Sandbox Code Playgroud)

如果您知道哪里有根上下文,建立与您的应用程序base-hrefdeploy-url参数如下:

ng build --prod --base-href=/route1/ --deploy-url=/route1/
Run Code Online (Sandbox Code Playgroud)

如果您需要部署到不同的根上下文,请更改参数的值并重新构建。

但是如果您不知道部署根上下文,则计划 B 是:

更改useHashtrueapp-routing.module.ts

const routes: Routes = [/* your routes goes here */];

@NgModule({
    imports: [
        RouterModule.forRoot(routes, {
            useHash: true, // change useHash to true
            enableTracing: !environment.production
        })
    ],
    exports: [RouterModule]
})
export class AppRoutingModule { }
Run Code Online (Sandbox Code Playgroud)

并将base hrefin更改index.html./,

<head>
  <base href="./">
</head>
Run Code Online (Sandbox Code Playgroud)

不要添加base-hrefdeploy-url参数 with ng build,然后您可以将您的应用程序部署到任何网络根目录。但网址将以/{webroot}/#/{client-route}


wat*_*lea 4

我相信在 angular.json 中定义"baseHref"选项或在 index.htmlbase中定义标签head应该有所帮助。