Angular 18のpublicフォルダ内アセット参照方法
問題概要
Angular 18ではワークスペース構成のアプリケーションで、/public
フォルダに配置したアセット(画像など)が参照できない問題があります。v17まではsrc/assets
フォルダが標準でしたが、v18では次の構造に変更されています:
workspace-name
│
├── projects
│ │
│ └── application-name
│ │
│ ├── public ← 新しいアセット配置場所
│ └── src
期待される動作:
public
フォルダ内のファイルがビルド時に出力ディレクトリにコピーされる- テンプレートから
<img src="...">
で正しく参照できる
実際の現象:
- アセット参照が失敗する
- ビルド時に
public
フォルダの内容が出力ディレクトリにコピーされない angular.json
の初期設定で期待通り動作しない
根本原因
Angular 18のデフォルト設定では、ワークスペース構成の場合にangular.json
のアセット設定パスが不完全です。初期設定は以下ですが、ワークスペース内のアプリケーションに対して相対パスが適切に解決されません:
"assets": [
{
"glob": "**/*",
"input": "public" // 問題のある部分
}
]
解決策
基本設定(単一アプリケーション)
publicフォルダ直下にimg
フォルダを作成し画像logo.png
を配置:
public/
└── img/
└── logo.png
テンプレートでの参照:
<!-- public/をパスに含めない -->
<img src="img/logo.png" alt="ロゴ">
ワークスペース構成修正法
ワークスペース配下のアプリケーションでは、angular.json
を修正:
"assets": [
{
"glob": "**/*",
"input": "projects/アプリケーション名/public", // 完全パス指定
"output": "/"
}
]
修正後、ビルド時にpublic
フォルダの内容が出力ディレクトリのルートにコピーされます。
assetsフォルダを維持する方法
public
フォルダ内にassets
フォルダを作成してv17形式を維持:
public/
└── assets/
└── images/
└── icon.png
angular.json
のassets
設定に追記:
"assets": [
{
"glob": "**/*",
"input": "public"
},
{
"glob": "**/*",
"input": "src/assets", // 旧形式フォルダも利用可能
"output": "/assets"
}
]
テンプレート参照:
<img src="assets/images/icon.png" alt="アイコン">
CSS/SCSS内での参照方法
CSSファイルからアセットを参照する場合、パスに^
プレフィックスを使用:
/* src/styles.css */
@font-face {
font-family: 'CustomFont';
src: url('^public/fonts/custom-font.woff2') format('woff2');
}
^
はプロジェクトルートからの絶対パスを意味します。
よくある落とし穴と解決法
注意点1: ビルド後にアセットが存在しない
ビルド後もアセットがdist
に存在しない場合:
angular.json
のパスが正しいか確認- 入力パスが
projects/アプリ名/public
形式になっているか確認 - サーバー再起動(
ng serve
の再実行)
パス参照規則
- ルート相対パス
: /assets/image.png
(public/assets
が存在する場合) - 相対パス:
img/photo.jpg
(public/img/photo.jpg
が存在する場合) - 絶対パスを使用する場合、デプロイ環境でのベースURLに注意
エラー発生時のチェックリスト:
public
フォルダの位置が正しいかangular.json
の修正後にビルド再実行したか- 参照パスに
public/
が含まれていないか - ファイル拡張子が正しいか(.jpg, .pngなど)
設定のカスタマイズ例
特定ファイルのみをコピー
{
"glob": "*.{jpg,png,webp}",
"input": "public/images",
"output": "/img"
}
出力フォルダ変更
{
"glob": "**/*",
"input": "public",
"output": "static-assets" // dist/static-assets/に出力
}
まとめ
Angular 18の正しいアセット参照では:
- ワークスペース構成では
angular.json
にアプリケーション相対パスを設定 - 参照時は
public/
フォルダ名をパスに含めない - 従来の
assets
フォルダ形式を維持する場合はpublic/assets
を作成 - CSS内参照には
^
プレフィックスを使用
デフォルト設定が完全ではないため、ワークスペース利用時は必ずangular.json
のパスを確認してください。これによりpublicフォルダのアセットが正しくビルドされ、参照可能になります。