2016-07-14 4 views
0

편집 :분명히하기 위해 아래 코드는 당면 문제에 초점을 맞추어 단순화되었습니다. 나는 window이 노드에 "존재하지 않음"을 알고 있습니다. 이 코드는 실제로 오프라인 렌더링을 위해 jsdom과 함께 사용됩니다 (내 문맥에서 window을 사용할 수 있음). windowdocument :NodeJS : 'require'에 변수를 전달할 수 있습니까?

나는 require에 부하 두 변수에 액세스 할 수 있어야합니다 모듈이 필요합니다. 저는 Node를 처음 접했고 변수 범위와 관련하여 뭔가 빠졌을 것입니다. 내부 함수가 외부 함수의 매개 변수에 액세스 할 수 있다고 생각했습니다. 그래서 여기 내가 사용하는 메커니즘 (이 코드는 다음과 같이 많은 이해가되지 않습니다 알고,하지만 난 실제 코드에서 "아이디어"를 추출하는 시도)입니다 :

var t = function(window, document){ 
    var Chart = require('chart.js'); 
} 

var t2 = function(){ 
    var window = {}; 
    var document = {}; 
    t(window, document); 
} 

t2(); 

는하지만 그것은 작동하지 않습니다. chart.js이로드 될 때 windowdocument은 정의되지 않습니다. 나는 그것이 작동되도록하려면 전역으로 windowdocument를 선언해야합니다

window = null; 
document = null; 

var t = function(window, document){ 
    var Chart = require('chart.js'); 
} 

var t2 = function(){ 
    t(window, document); 
} 

t2(); 

을하지만 그것은 아마 나쁜.

어떻게 이것이 "제대로"이루어 집니까? Chart.js 모듈 자체는 수정할 수 없습니다.

+0

번들러를 사용 중이고 서버 측 렌더링을하지 않을 경우 'window'또는 해당 속성을 명시 적으로 전달할 필요가 없으며 코드가 실행될 때 전역 적으로 사용할 수 있습니다 (브라우저, 노드에 없음) –

+0

NodeJS에서'window'를 사용해야합니까? – epascarello

+0

노드와 노드에서 문서가 필요합니다. –

답변

2

'require'에 변수를 전달할 수 있습니까?

번호

나는 노드에 새로운 오전 아마 변수 '범위에 대해 뭔가를 놓친 거지. 내부 함수가 외부 함수의 매개 변수에 액세스 할 수 있다고 생각했습니다.

var t = function(window, document){ 
    var Chart = require('chart.js'); 
} 

var t2 = function(){ 
    var window = {}; 
    var document = {}; 
    t(window, document); 
} 

t2(); 

는 않습니다,하지만 당신은을 통해 반입하고있는 코드는 위의 t 또는 t2 기능에하지 않습니다 필요합니다. 당신 require하기 전에 글로벌 windowdocument 속성을 만들 수 있지만

:

global.window = /*...*/; 
global.document = /*...*/; 

을 ... 그 두 가지 수준에서 나쁜 일이 ™ 다음과 같습니다

  1. 귀하의 require 호출은 반드시 chart.js 모듈을로드하는 호출 일 필요는 없습니다.

  2. 지구본은 icky입니다. 그것이 기술적 인 용어입니다. 대신

chart.js는 초기화 함수를 노출합니다. 그런 다음 필요한 종속성으로 호출하면 모든 설정이 완료됩니다.


참고 : NodeJS에는 UI가 없습니다. 일종의 오프라인 렌더링을 수행하려는 경우 NodeJS가 아닌 PhantomJS 또는 유사 헤드리스 브라우저가 필요할 수 있습니다.

+0

감사합니다 T.J.! 'chart.js'는 내 lib가 아닙니다. 따라서 (필자는 "touch"할 필요가 없다) 초기화 함수를 어떻게 노출시킬 수 있을까? 두 번째 사항 : jsdom을 사용하고 있습니다. 그것은 잘 작동하는 것 같고 Node vs PhantomJS 내에서 설정하고 사용하는 것이 더 쉬워지는 이점이 있습니다. – PJC

+0

@PJC : 나는 그렇게 생각하지 않는다. 확실히 당신이 NodeJS를 통하지 않고 * jsdom을 통해'chart.js' *를로드하고 싶습니다 ([jQuery와 함께하는 것처럼] (http://stackoverflow.com/questions/15601289/jsdom-and-document-ready)). '필요하다 '. –

+0

OK, 예. 그것은 내가하고있는 일이고 잘 작동합니다. 나는이 두 개의 "전역"변수를 노출해야한다는 사실에 우려하고 있었지만, 실제로이 모든 것을 처리하는 모듈 안에 jsdom, chart.js 등을 넣을 수 있다고 생각합니다. – PJC

관련 문제