D3.js 为什么我需要启动web服务器才能使用d3?

D3.js 为什么我需要启动web服务器才能使用d3?,d3.js,webserver,D3.js,Webserver,我阅读了各种d3js教程,没有人解释为什么使用d3需要启动web服务器(无论是Python还是Node…) 那么,为什么有必要这样做呢?有时候没有必要。但一般来说,复制代码将在其中查看的环境是一个好主意,这样您就不会在发布时遇到不可预见的问题,也不会因为使用不适合您的技术的环境而遇到不必要的挫折 d3打算在浏览器中运行,其中某些部分需要在特定浏览器的网页上运行。根据我的经验,使用浏览器直接打开d3页面(即文件://)时出现的问题分为两类:安全性和无模式URL 安全限制 文件://协议通常有额外的

我阅读了各种d3js教程,没有人解释为什么使用d3需要启动web服务器(无论是Python还是Node…)


那么,为什么有必要这样做呢?

有时候没有必要。但一般来说,复制代码将在其中查看的环境是一个好主意,这样您就不会在发布时遇到不可预见的问题,也不会因为使用不适合您的技术的环境而遇到不必要的挫折

d3打算在浏览器中运行,其中某些部分需要在特定浏览器的网页上运行。根据我的经验,使用浏览器直接打开d3页面(即
文件://
)时出现的问题分为两类:安全性和无模式URL

安全限制
文件://
协议通常有额外的限制。与d3特别相关的是使用
XMLHttpRequest
(在d3v4及以下版本中使用)和
fetch
(在d3v5中使用)的限制,这构成了加载数据文件的基础(例如使用
d3.csv

Chrome和其他浏览器通常不允许
XMLHttpRequest
fetch
请求本地文件。您可能会得到一个错误,该错误表示如下内容:

跨源请求仅支持以下协议方案:http, 数据,chrome,chrome扩展,https

您可以从以下答案中了解有关如何启用本地文件的异步读取以及默认情况下禁用本地文件的原因:

然而,Firefox似乎没有这个限制

无模式URL 一些d3示例,尤其是较老的示例,包括使用此约定的d3:

<script src="//d3js.org/d3.v3.min.js"></script>

//d3js.org
是一个无模式Url(也称为协议相关Url),这意味着浏览器可以决定使用哪个协议。这意味着它将使用
https://d3js.org
如果加载页面使用https,并且(可能)
http://d3js.org
如果加载页面使用http

不幸的是,当通过
文件://
协议加载文件时,这意味着前面提到的URL将引用
file://d3js.org/d3.v3.min.js
,这通常不是我们想要的。在这种情况下,可能会出现如下错误:

得到file://d3js.org/d3.v3.min.js net::找不到错误文件

未捕获引用错误:未定义d3

使用无模式URL已经不再受欢迎,取而代之的是总是使用
https://
。见:

如果这是您遇到的唯一问题,那么可以通过包括协议来解决(即将
src=“//d3js.org/d3.v3.min.js”
更改为
src=”https://d3js.org/d3.v3.min.js“

其他参考资料:

这与D3无关:现代浏览器不允许读取本地文件。如果您使用硬编码数据创建D3代码,则无需服务器即可正常工作。好吧,当我想加载csv、json等外部文件时,问题就出现了?没错。同样,与D3无关,这是浏览器的功能。问得好!我认为这是一个问题这个问题经常出现,因此有理由尝试写一个正式的答案以供将来链接。@Steve问题是这个问题已经被问/回答了几十次。这就是为什么我没有首先回答它,我避免回答明显重复的问题。