2012-03-01 5 views
5

Me gustaría ejecutar algún código d3 desde la línea de comandos. Inicialmente, intenté algo como:Quiero ejecutar d3 desde un Cakefile

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

Pero esto no funcionó. Tengo errores como este:

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 

Así que pensé ... esta excepción me estaba diciendo que necesito para ejecutar d3 dentro de un navegador. Intenté esto de dos maneras diferentes. Básicamente, pensé que si acababa de disparar phantomjs probablemente sería capaz de hacer lo que quería hacer. Aquí estaba mi 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() 

Cuando voy esta ruta sin embargo, que siempre terminan recibiendo excepciones como esta:

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) 

¿Qué estoy doin mal ??


Gracias a mbostock me dio el siguiente trabajo:

Mi package.json:

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

Mi Cakefile:

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) 
    }) 
+0

parece que usted ha resuelto su problema. Personalmente recibí el mismo error y lo solucioné con 'export NODE_PATH =/usr/local/lib/node_modules' –

Respuesta

3

Ver D3 de package.json. Más específicamente, el archivo que desea requerir cuando se ejecuta dentro de Node o entornos similares es index.js en lugar de d3.v2.js; este archivo contiene algunos parches especiales que hacen que D3 sea compatible con el operador require.

Para probarlo por ti mismo, cd al repositorio d3, ejecute node para crear un shell interactivo, y luego dicen

var d3 = require("./"); 

O, si usted está en su propia carpeta del proyecto, si' he instalado D3 en node_modules/D3 a través de la NGP (npm install d3), se puede decir:

var d3 = require("d3"); 
+0

Gracias por responder mi vieja pregunta, la probaré hoy. ¡Y del autor d3 nada menos! – dsummersl

+0

Sólo pensé en seguir para preguntar ... ya que el autor está en este hilo ... Intenté 'npm install d3', y mientras var d3 = require ('d3'); en la consola del nodo me da 'undefined' pero puedo hacer d3.version y obtener un número, ponerlo en app.js me da: TypeError: no se puede leer la propiedad 'BSON' de undefined ... ¿me falta algo? – pland

+0

@pland Consulte http://stackoverflow.com/questions/9948350 'var d3 = require (" d3 ");' imprime "undefined" en la consola porque esa expresión se evalúa como indefinida; confusamente, eso no significa que la variable 'd3' no esté definida. El hecho de que pueda imprimir 'd3.version' demuestra que el paquete está cargado correctamente. – mbostock