【问题标题】:d3 library installed with npm doesn't load json file使用 npm 安装的 d3 库不加载 json 文件
【发布时间】:2017-11-16 01:06:33
【问题描述】:

我刚刚使用 npm 安装了 d3。在 package.json 中,它显示依赖关系 "d3": "^4.11.0" version,

我尝试用下面的代码加载一个简单的 json 文件:

const d3 = require('d3')

d3.json('jsonfile.json', (err, data) => {
  if (err) {
    console.log(err)
  }
  data.keys.map((t) => {
    console.log(t)
  })
})

但是我收到了这个错误:

SyntaxError: Unexpected token T in JSON at position 0

json文件其实是可以的。我使用此工具进行了验证:https://codebeautify.org/jsonvalidator

但是,当我删除这一行 const d3 = require('d3') 并将脚本直接插入 HTML 文件时:

<script type='text/javascript' src='/js/d3.min.js'></script>

...使用3.5.5版本,json文件被加载。

d3 版本^4.11.0 有什么新东西可以加载本地文件吗?

【问题讨论】:

  • 您是否使用 v4 脚本尝试了相同的解决方案? &lt;script src="https://d3js.org/d3.v4.min.js"&gt;&lt;/script&gt;
  • 嗨。它也适用于该行。我认为问题出在使用npm 安装d3 之后,特别是新版本。我一直在使用require('d3') 读取文件,但直到现在我才拥有SyntaxError:
  • 您是在浏览器中运行它还是作为 nodejs 应用程序运行?使用 webpack 创建包时,我无法在浏览器中重现此问题。如果您在浏览器中运行它,那么浏览器如何解决require 函数?浏览器 JavaScript 没有 require,除非您使用 requirejs 或将代码与 webpack 之类的东西捆绑在一起。
  • 嗨,@HMR。我正在使用 nodejs 应用程序。我正在使用browserifygulp 执行一些任务,例如创建bundle.js 文件。
  • 我在安装 d3 6.3.1 版本时遇到了同样的问题,无法从 php 从本地 url 加载数据,但与 &lt;script src="https://d3js.org/d3.v4.min.js"&gt;&lt;/script&gt; 完美配合

标签: javascript json node.js d3.js


【解决方案1】:

如果您想将代码作为节点应用程序运行,您必须使用完整的 url 加载 json:

const d3 = require('d3');
//use full url to where the json file is
d3.json('http://localhost:8080/jsonfile.json', (err, data) => {
  if (err) {
    console.log(err)
  }
  data.keys.map((t) => {
    console.log(t)
  })
});

如果您想将代码作为节点应用程序运行并从磁盘加载文件,您可以像这样加载文件:

fs = require('fs');
const readFile = (file,encoding) => 
  new Promise(
    (resolve,reject)=>
      fs.readFile(
        file
        ,encoding
        ,(err,data) => {
          if(err !== null){
            reject(err);return;
          }
          resolve(data);
        }
      )
    )
;

readFile("./static/jsonfile.json",'utf8')
.then(
  data =>
    data.toString()
).then(
  text =>
    console.log("Got file content:\n",text)
  ,err =>
    console.error("Failed to load file:",err)
);

如果您的代码在浏览器中运行,但您想使用 npm 作为依赖管理,那么您可以使用 requirejs(旧方式)或 webpack(更好,但学习和设置有点复杂)。如果您在浏览器中使用您的代码,我想知道您如何在const d3 = require('d3'); 上没有收到错误消息。

【讨论】:

  • 谢谢,@HMR。我没有使用完整的 url 到 json 文件所在的位置。我想我需要在项目生产时更改 url,对吗?因此,为了不更改 url,使用 fs 的第二个选项将是最佳选择,对吧?再次感谢。
  • @RamiroTormenta 这取决于,如果数据在磁盘上,那么使用文件。下面是如何在 node 中使用 d3 的示例:gist.github.com/palanik/ba5e15dbbc7ea0574ae0d38252563b0d 因为 node 没有 DOM 你必须使用node-jsdom,当 d3 创建了一个 svg 时你可以使用outerHTML 来获取它的内容。跨度>
  • 很好的提示,谢谢。所以,如果我什至想使用 d3 选择一个 id,node-jsdom `var document = jsdom.jsdom()` 是必须的,对吧?感谢您提供此文档。
  • @RamiroTormenta d3 似乎需要一个节点来使用:d3.select(jsdom.jsdom().body).append('svg').attr ... .append("g") ... 由于节点没有内置的 window 和 window.document 你需要一个库来提供这个和jsdom 似乎可以解决问题。我还没有以这种方式使用 d3,但我看到的大多数示例都使用 jsdom。
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多