以下是根据我们之前的讨论整理的Markdown文档,它详细描述了如何配置Angular项目以支持子路径部署,并确保CSS文件和其中引用的资源(如图片)能够正确加载。
```markdown
# Angular 子路径部署与 CSS 资源路径处理
## 概述
本文档指导如何在Angular项目中设置`--base-href`参数来适应子路径部署,并确保所有静态资源(包括CSS文件内引用的图片等资源)都能正确加载。我们将通过具体的示例展示如何实现这一目标。
## 目录结构
```
dist/nova-stv/browser/
├── assets/
│ ├── img/
│ │ └── background.png
│ └── style/
│ └── variables.css
├── index.html
├── main.js
└── ...
```
## 步骤指南
### 1. 设置 baseHref 参数构建项目
使用以下命令构建你的Angular项目:
```bash
ng build --configuration=production --output-path=dist/nova-stv/browser --base-href=/dev/stv/
```
这将确保所有内部资源引用都会自动加上前缀 `/dev/stv/`。
### 2. 修改 angular.json 配置
确保在`angular.json`中为生产环境配置正确的`styles`数组:
```json
"production": {
"styles": [
{
"input": "projects/nova-stv/src/assets/style/variables.prod.css",
"inject": true,
"bundleName": "variables"
},
...
]
}
```
对于开发环境,你可以使用不同的CSS文件或相同的相对路径。
### 3. 动态加载 CSS 文件
在`main.ts`中动态加载CSS文件时,请确保添加正确的`baseHref`:
```typescript
import {environment} from './environments/environment';
import {bootstrapApplication} from '@angular/platform-browser';
import {appConfig} from './app/app.config';
import {AppComponent} from './app/app.component';
// 获取 baseHref(即 /dev/stv/)
const baseHref = (window as any).__app_base_href__ || '/dev/stv/';
const cssFileName = environment.production ? 'variables.production.css' : 'variables.css';
const head = document.head;
const linkElement = document.createElement('link');
linkElement.rel = 'stylesheet';
linkElement.href = `${baseHref}assets/style/${cssFileName}`;
head.appendChild(linkElement);
// 等待样式加载完成后再启动应用(可选,但推荐)
linkElement.onload = () => {
bootstrapApplication(AppComponent, appConfig)
.catch((err) => console.error(err));
};
linkElement.onerror = () => {
console.error(`Failed to load CSS file: ${cssFileName}`);
bootstrapApplication(AppComponent, appConfig)
.catch((err) => console.error(err));
};
```
### 4. 处理 CSS 中的资源引用
为了保证CSS中的资源引用也包含正确的`baseHref`,你需要调整CSS变量定义。例如,在`variables.css`中:
#### 使用相对路径(推荐)
```css
:root {
--asset-path: "assets";
--background-url: url("assets/img/background.png");
}
```
这样可以确保资源请求会基于当前页面的路径进行解析,从而避免绝对路径导致的问题。
### 5. HTML 文件中的资源引用
确保所有的HTML文件中的资源引用也是相对路径,例如:
```html
```
environment.ts
```
// src/environments/environment.prod.ts
export const environment = {
production: true,
// 其他生产环境配置
};
```