Я хочу запустить d3 из Cakefile

Я хотел бы выполнить код 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 внутри браузера. Я пробовал это несколькими способами. В основном, однако, я думал, что если я просто запущу фантомы, я, вероятно, смогу делать то, что хочу. Вот мой Cakefile:

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 у меня получилось следующее:

Мой пакет.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)
  })

person dsummersl    schedule 01.03.2012    source источник
comment
Похоже, вы решили свою проблему. Я лично получил ту же ошибку и исправил ее с помощью export NODE_PATH=/usr/local/lib/node_modules   -  person Thomas Ahle    schedule 16.08.2012


Ответы (1)


См. package.json D3. В частности, при работе внутри Node или подобных сред требуется файл index. js вместо d3.v2.js; этот файл содержит несколько специальных исправлений, делающих D3 совместимым с оператором require.

Чтобы попробовать это самостоятельно, cd перейдите в репозиторий d3, запустите node, чтобы создать интерактивную оболочку, а затем произнесите

var d3 = require("./");

Или, если вы находитесь в собственной папке проекта, если вы установили D3 в node_modules/d3 через npm (npm install d3), вы можете сказать:

var d3 = require("d3");
person mbostock    schedule 06.03.2012
comment
Спасибо за ответ на мой немного старый вопрос - сегодня попробую. И от автора д3 не меньше! - person dsummersl; 06.03.2012
comment
Просто подумал, что я должен спросить... так как автор находится в этой теме... Я попробовал «npm install d3», и пока var d3 = require('d3'); в консоли узла дает мне «неопределенное», но я могу сделать d3.version и получить число, помещая его в app.js, дает мне: TypeError: Не удается прочитать свойство «BSON» неопределенного... я что-то упустил? - person pland; 30.03.2012
comment
@pland См. stackoverflow.com/questions/9948350 var d3 = require("d3"); выводит undefined в консоль, поскольку это выражение оценивается как undefined; как ни странно, это не означает, что переменная d3 не определена! Тот факт, что вы можете напечатать d3.version, свидетельствует о том, что пакет загружен правильно. - person mbostock; 30.03.2012