J'ai été surpris par une expérience avec des chemins relatifs en Javascript aujourd'hui. J'ai résumé la situation comme suit:
Supposons que vous ayez une structure de répertoires comme:
app/
|
+--app.html
+--js/
|
+--app.js
+--data.json
Tous mes app.html
ne s'exécute js/app.js
<!DOCTYPE html>
<title>app.html</title>
<body>
<script src=js/app.js></script>
</body>
app.js
charge le fichier JSON et le colle au début de body
:
// js/app.js
fetch('js/data.json') // <-- this path surprises me
.then(response => response.json())
.then(data => app.data = data)
Les données sont du JSON valide, juste une chaîne:
"Hello World"
Il s'agit d'une utilisation assez minimale de fetch
, mais je suis surpris que l'URL que je passe à fetch
doive être relative à app.html
au lieu de par rapport à app.js
. Je m'attendrais à ce que ce chemin fonctionne, puisque data.json
et app.js
sont dans le même répertoire (js/
):
fetch('data.json') // nope
Y a-t-il une explication pour laquelle c'est le cas?
Lorsque vous dites fetch('data.json')
, vous demandez effectivement http://yourdomain.com/data.json
Car il est relatif à la page à partir de laquelle vous effectuez la demande. Vous devez conduire avec une barre oblique, ce qui indiquera que le chemin est relatif à la racine du domaine: fetch('/js/data.json')
. Ou entièrement de qualité avec votre domaine fetch('http://yourdomain.com/js/data.json')
.