Javascript中具有fetch的相对路径
Relative paths with fetch in Javascript
今天我对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')
。
理解为什么会出现这种情况的一个简单方法是考虑如果我们在app/js/helper/logfetch.js
:中编写辅助函数会发生什么
// app/js/helper/logfetch.js
function logFetch(resource) {
console.log('Fetching', resource);
return fetch(resource);
}
现在,考虑一下如果我们使用来自app/js/app.js
:的logFetch会发生什么
// app/js/app.js
fetch('data.json'); // if this is relative to js/, then ...
logFetch('data.json'); // should this be relative to js/ or js/helper/?
我们可能希望这两个调用返回相同的东西,但如果fetch是相对于包含的文件的,那么logFetch将请求js/helper/data.json
,而不是与fetch一致的东西。
如果fetch能够感知从何处调用它,那么要实现logFetch等辅助库,JavaScript将需要一系列新的调用者位置感知功能。
相比之下,相对于HTML文件执行提取提供了更多的一致性。
CSS的工作方式不同,因为它没有方法调用的复杂性:;辅助CSS模块";转换其他CSS模块,因此相对路径的概念在概念上更清晰。
这并不完全是一个建议,因为它依赖于许多不能保证在任何地方都能工作或在未来继续工作的东西,但它在我需要的地方对我有效,可能会对你有所帮助。
const getRunningScript = () => {
return decodeURI(new Error().stack.match(/([^ 'n'(@])*([a-z]*:'/'/'/?)*?[a-z0-9'/'']*'.js/ig)[0])
}
fetch(getRunningScript() + "/../config.json")
.then(req => req.json())
.then(config => {
// code
})
- 可以用'吗/'在相对路径中
- Angular sqlLite set css url()无法设置相对路径
- jquery移动应用程序无法使用jquryMobile框架JS和css文件的相对路径
- node.js需要相对路径
- 相对路径的计算
- 如何访问节点模块中具有相对路径的文件
- 在JQuery中,'加载'方法'的相对路径在引用项目中的html文件时开始
- Javascript中具有fetch的相对路径
- backbone.js在#断开相对路径之前缺少斜杠
- 相对路径中的角度2 img src
- 带有JS点击相对路径的网页URL链接
- 流星 ES6 模块相对路径
- 在不同浏览器中使用 javascript 的相对路径
- 无法加载具有相对路径的 css/js
- SystemJS 相对路径
- 是否可以要求项目目录外部的模块没有相对路径
- 无法使用 Jade 模板包含相对路径文件
- RequireJS 不遵循设置了 baseUrl 的数据主的相对路径
- 如何使用它的相对路径访问tomcat服务器中的文件夹
- jQuery ajax 相对路径未找到文件