我想从 Cakefile 运行 d3

2024-04-28

我想从命令行执行一些 d3 代码。最初我只是尝试了类似的方法:

task 'data', 'Build some data with d3', ->
      d3 = require('lib/d3.v2')
      console.log "d3 version = "+ d3.version

但这没有用。我遇到这样的错误:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
          ^
ReferenceError: CSSStyleDeclaration is not defined
    at /Users/mydir/Documents/classes/middleclass/app/lib/d3.min.js:1:21272
    at Object.<anonymous> (/Users/mydir/Documents/classes/middleclass/app/lib/d3.min.js:2:25395)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Object.action (/Users/mydir/Documents/classes/middleclass/Cakefile:22:10)
    at /usr/local/lib/node_modules/coffee-script/lib/coffee-script/cake.js:39:26

所以...我认为这个异常告诉我需要在浏览器内执行 d3 。我用几种不同的方式尝试了这一点。但基本上,我想如果我启动 phantomjs,我可能就能做我想做的事。这是我的蛋糕文件:

task 'data2', 'Build some data with d3', ->
  hem = spawn 'hem', ['server']
  phantom = require('phantom')
  phantom.create (ph) ->
    ph.createPage (page) ->
      page.open 'http://localhost:9294/sandbox.html', (status) ->
        page.evaluate (-> window), (window) ->
          require = window.require
          require('lib/d3.v2')
          console.log("d3 version = "+ d3.version)
          ph.exit()
          hem.kill()

当我走这条路时,我总是会遇到这样的异常:

TypeError: object is not a function
    at Object.CALL_NON_FUNCTION (native)
    at Object.<anonymous> (/Users/mydir/Documents/classes/middleclass/Cakefile:52:13)
    at Object.<anonymous> (/Users/mydir/Documents/classes/middleclass/node_modules/phantom/node_modules/dnode-protocol/index.js:274:16)
    at apply (/Users/mydir/Documents/classes/middleclass/node_modules/phantom/node_modules/dnode-protocol/index.js:143:17)
    at EventEmitter.handle (/Users/mydir/Documents/classes/middleclass/node_modules/phantom/node_modules/dnode-protocol/index.js:120:13)
    at /Users/mydir/Documents/classes/middleclass/node_modules/phantom/node_modules/dnode-protocol/index.js:81:20
    at EventEmitter.<anonymous> (/Users/mydir/Documents/classes/middleclass/node_modules/phantom/node_modules/dnode/node_modules/lazy/lazy.js:62:13)
    at EventEmitter.<anonymous> (/Users/mydir/Documents/classes/middleclass/node_modules/phantom/node_modules/dnode/node_modules/lazy/lazy.js:46:19)
    at EventEmitter.emit (events.js:67:17)
    at EventEmitter.<anonymous> (/Users/mydir/Documents/classes/middleclass/node_modules/phantom/node_modules/dnode/node_modules/lazy/lazy.js:46:39)

我做错了什么?


感谢 mbostock 我得到了以下工作:

我的package.json:

{
    "name": "app",
    "version": "0.0.1",
    "dependencies": {
        "d3": "~2.8.0",
        "jsdom": "~0.2.13"
    }
}

我的蛋糕文件:

task 'd3', 'Do something with d3', ->
  jsdom = require('jsdom')
  jsdom.env({
    html: 'public/sandbox.html'
    done: (errors,window) ->
      require('d3/index.js')
      console.log("d3 version = "+ d3.version)
  })

参见 D3包.json https://github.com/mbostock/d3/blob/master/package.json。更具体地说,在 Node 或类似环境中运行时需要的文件是index.js https://github.com/mbostock/d3/blob/master/index.js而不是 d3.v2.js;该文件包含一些特殊补丁,使 D3 与require操作员。

要亲自尝试一下,cd到 d3 存储库,运行node创建一个交互式 shell,然后说

var d3 = require("./");

或者,如果您在自己的项目文件夹中,如果您已通过 npm 将 D3 安装到 node_modules/d3 中(npm install d3), 你可以说:

var d3 = require("d3");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我想从 Cakefile 运行 d3 的相关文章

随机推荐