今日、Javascriptの相対パスの経験に驚きました。状況を次のように要約しました。
次のようなディレクトリ構造があるとします。
app/
|
+--app.html
+--js/
|
+--app.js
+--data.json
app.html
が実行するのはjs/app.js
を実行することだけです
<!DOCTYPE html>
<title>app.html</title>
<body>
<script src=js/app.js></script>
</body>
app.js
はJSONファイルをロードし、body
の先頭に貼り付けます:
// js/app.js
fetch('js/data.json') // <-- this path surprises me
.then(response => response.json())
.then(data => app.data = data)
データは有効なJSONで、単なる文字列です。
"Hello World"
これはfetch
の最小限の使用法ですが、fetch
に渡すURLがapp.html
の代わりにapp.js
に相対的でなければならないことに驚いています。 data.json
とapp.js
は同じディレクトリ(js/
)にあるため、このパスが機能することを期待します。
fetch('data.json') // nope
なぜそうなのか説明はありますか?
fetch('data.json')
と言うと、リクエスト元のページに関連しているため、事実上_http://yourdomain.com/data.json
_をリクエストしています。スラッシュでリードする必要があります。これは、パスがドメインルートfetch('/js/data.json')
に相対的であることを示します。または、ドメインfetch('http://yourdomain.com/js/data.json')
で完全な品質を実現します。