Изменить путь к стилю в серверной среде

Когда приложение Angular разрабатывается локально, фоновый стиль CSS имеет значение /assets/banner.png, как показано здесь:

.classname {
     background-image: url(/assets/banner.png);
}

Когда приложение развернуто, правильный путь в среде сервера:

 background-image: url(/server/assets/banner.png);

Как мне указать Angular добавлять к путям изображений /server?

Прямо сейчас я делаю несколько операторов sed для файла index.html, и это работает. Подумал, что, возможно, есть лучший способ, чем просто sed все переделать.

Как это генерируется? Если это таблица стилей SASS, пробовали ли вы указать относительный путь к изображению?

amphetamachine 21.08.2024 21:28

используйте background-image: url(./assets/banner.png); или background-image: url(assets/banner.png);. Посмотрите, что если вы добавите '/' Angular поиск в «your-dominio.com» и не примете во внимание «base href»,

Eliseo 22.08.2024 08:03

@amphetamachin это жестко закодированный путь к изображению в обычном файле CSS. Использование относительного пути background-image: url(./assets/banner.png); приводит к ошибке компиляции.

sanjihan 22.08.2024 09:43

@Eliseo, используя относительный путь, приводит к ошибке компиляции Angular.

sanjihan 22.08.2024 09:46

@sanjihan, я сделал небольшой stackblitz и похоже работа :(

Eliseo 22.08.2024 09:52

@Eliseo Спасибо за комментарий. Я нашел проблему. У меня моё окружение url(/assets/banner.png) работает. url(assets/banner.png) или url(./assets/banner.png) — ошибка компиляции. Я решил, что мне нужно добавить к пути src, как в url(src/assets/banner.png). Теперь это работает. url(./src/assets/banner.png) также является ошибкой компиляции. Спасибо всем.

sanjihan 22.08.2024 10:01

@Eliseo, я был слишком быстр... Хотя url(src/assets/banner.png) компилируется, это приводит к неправильному пути на сервере.

sanjihan 22.08.2024 10:07

В angular.json вы можете настроить ресурсы, см. ссылку . «Вход» (где у вас есть «активы» (могут находиться в разных папках) и «выход» (где создаются все ресурсы). По дефекту он создается в папке «Ресурсы» в том же каталоге, что и ваш index.html. Это причина использования «относительных» путей.

Eliseo 22.08.2024 10:30
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
8
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я знаю, что это может показаться излишним, но это может быть полезно для других целей, например для настройки среды, которую вы планируете использовать. Проделав это несколько раз, я создал простой скрипт, который поможет вам в этом. Я также предполагаю, что вы также хотите динамически генерировать окружения.

Этот скрипт может генерировать необходимые окружения, и вы можете запустить его в процессе сборки.

Ниже приведены шаги для достижения этой цели.

  1. Создайте generate-environment.js, скрипт

const { writeFile } = require('fs');

require('dotenv').config();

const isProduction = process.env['DEPLOYMENT_ENV'] === 'prod';
const assetBaseUrl = isProduction ? '/server' : '';

const environmentFileContent = `
export const environment = {
   production: ${isProduction},
   assetBaseUrl: "${assetBaseUrl}"
};
`;

writeFile('./src/environments/environment.ts', environmentFileContent, function (err) {
    if (err) {
        console.info(err);
    } else {
        console.info('Environment file created successfully.');
    }
});
  1. Обновите свой компонент Angular и убедитесь, что ваши компоненты Angular используют обновленную среду.
import { Component, OnInit } from '@angular/core';
import { environment } from '../environments/environment';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  backgroundImageUrl: string;

  ngOnInit() {
    this.backgroundImageUrl = `${environment.assetBaseUrl}/assets/banner.png`;
  }
}
  1. Как будет выглядеть ваш html-файл
<div [ngStyle] = "{'background-image': 'url(' + backgroundImageUrl + ')'}">
  <!-- Your content here -->
</div>
  1. Добавьте это в свой package.json файл.
"scripts": {
  "prebuild": "node generate-environment.js",
  "build": "ng build"
}

Выполняя эти шаги, вы гарантируете, что конфигурация среды динамически генерируется и правильно используется в вашем приложении Angular в процессе сборки.

Я чувствую, что это проще: не добавлять / к URL-адресу.

Eliseo 22.08.2024 08:03

Привет @Eliseo. Я согласен с тобой, я хотел предложить это, но у автора был конкретный вопрос, поэтому и дал ответ.

Derek Roberts 22.08.2024 08:39

@DerekRoberts Спасибо за предложение. Это определенно сработает.

sanjihan 22.08.2024 09:55

Другие вопросы по теме