2014-04-29 2 views
0

노드에서 RequireJS를 사용하려고하는데 경로 문제로 인해 어려움을 발견했습니다.노드에서 Mocha 및 SquireJS와 함께 RequireJS 사용

여기에 "foo는"여기

$ cat src/foo.js 

define([], function() { 

    var foo = function() { 
     return "foo"; 
    }; 

    return { foo:foo}; 
}); 

foo는 필요로 줄이를 반환하는 간단한 foo는 방법이지만, 상대 경로를 지정하는 경우에만 작동합니다. 그것은 그것이 있어야하는 방법인가?

$ cat src/bar.js 
define(['./foo.js'], function(foo) { 

    var bar = function() { 
     return foo.foo().replace("foo","bar"); 
    }; 

    return { bar : bar }; 
}); 

사항은 모카 테스트에서 훨씬 까다 수 :

  1. 로드 foo는 바는 __dirname 해결 방법이 필요합니다.
  2. 막대의 비동기로드가 실패합니다 (테스트 3 및 4 참조). 시종이 설치 NPM 사용하여 설치되어 있기 때문에, 정확한 경로를 필요로하지만, 표준 노드에 맞지 않는 가져 오기
  3. 구문을 필요로하고 amdefine 해결 방법이 포함되어 있지 않습니다

    : 여기

테스트 코드를

$ cat test/footests.js 
var requirejs = require('requirejs'); 
var chai = requirejs("chai"); 
var should = chai.should(); 
var Squire = requirejs(__dirname + "/../node_modules/squirejs/src/Squire.js"); 

describe('when calling foo.foo()', function() { 
    it('should return "foo"', function() { 
     var foo = requirejs(__dirname + "/../src/foo.js"); 
     foo.foo().should.equal("foo"); 
    }); 
}); 

describe('when calling bar.bar()', function() { 
    var bar = requirejs(__dirname + "/../src/bar.js"); 
    it('should return "bar"', function() { 
     bar.bar().should.equal("bar"); 
    }); 
}); 

describe('when calling bar.bar() with async requirejs', function() { 
    it('should return "bar"', function(done) { 
     requirejs(__dirname + "/../src/bar.js", function(bar) { 
      bar.bar().should.equal("bar"); 
      done(); 
     }) 
    }); 
}); 
describe('when mocking foo.foo() and calling bar.bar()', function() { 
    it('should return "barbar"', function(done) { 
     var injector = new Squire(); 
     var fooMock = { 
      foo : function() { 
       return "foofoo"; /* instead of just foo */ 
      } 
     }; 
     injector 
      .mock('./foo.js', fooMock) 
      .require(__dirname + "/../src/bar.js", function(bar) { 
       bar.bar().should.equal("barbar"); 
       done(); 
      }); 
    }); 
}); 

내가 설정 GitHub의에 재현했습니다 https://github.com/itaifrenkel/node-requirejs-example

답변

4

코드에서 여러 문제가 있습니다

  1. .js을 모듈 이름 끝에 넣지 마십시오. .js을 추가하면 RequireJS가 일반 모듈 이름 해석을 우회하도록 지시합니다. (당신이 확장하지만, 당신이 그것을 필요로 이유를 말할 수있는이 있어야합니다 경우 원하는 경우가 있습니다.) 노드에서

  2. RequireJS는 브라우저에서 사용할 때처럼 구성을 취할 수 있습니다. 따라서 모든 곳에서 경로를 복제 할 필요가 없습니다.

  3. RequireJS는 packages 설정으로 패키지를로드 할 수 있습니다.

  4. Node 모듈을 RequireJS로로드하지 마십시오. 필요하지 않은 경우 노드 모듈을로드하지 마십시오. (. 예를 들어, chai가 RequireJS로드 할 필요가 없습니다)

을 내가 bar.js을 수정하는 경우 그 고독한 의존에서 .js 확장을 삭제하고 다음 테스트 파일을 사용하여, 그것을 작동 :

var requirejs = require('requirejs'); 
requirejs.config({ 
    baseUrl: __dirname + "/../src", 
    packages: [ 
     { 
      name: "squirejs", 
      location: "../node_modules/squirejs", 
      main: "src/Squire" 
     } 
    ] 
}); 
var chai = require("chai"); 
var should = chai.should(); 
var Squire = requirejs("squirejs"); 

describe('when calling foo.foo()', function() { 
    it('should return "foo"', function() { 
     var foo = requirejs("foo"); 
     foo.foo().should.equal("foo"); 
    }); 
}); 

describe('when calling bar.bar()', function() { 
    var bar = requirejs("bar"); 
    it('should return "bar"', function() { 
     bar.bar().should.equal("bar"); 
    }); 
}); 

describe('when calling bar.bar() with async requirejs', function() { 
    it('should return "bar"', function(done) { 
     requirejs(["bar"], function(bar) { 
      bar.bar().should.equal("bar"); 
      done(); 
     }); 
    }); 
}); 
describe('when mocking foo.foo() and calling bar.bar()', function() { 
    it('should return "barbar"', function(done) { 
     var injector = new Squire(); 
     var fooMock = { 
      foo : function() { 
       return "foofoo"; /* instead of just foo */ 
      } 
     }; 
     injector 
      .mock('./foo', fooMock) 
      .require(["bar"], function(bar) { 
       bar.bar().should.equal("barfoo"); 
       done(); 
      }); 
    }); 
}); 
+0

고마워, 그거야. requirejs 헤더가 필요없는 테스트를 보았습니다. requirejs 헤더에서 테스트를 제거하고 define ([ 'chai', 'squirejs'], function (chai, Squire) {...})과 어떤 변경이 필요합니까? "정의가 정의되지 않았습니다"라는 메시지가 나타납니다. – itaifrenkel

+0

"requirejs header"라는 표현으로 무엇을 언급하는지 모르겠습니다. – Louis

+0

다른 일반적인 파일에 "var requirejs; requirejs.config"붙여 넣기를 잘라내어 define ([ 'chai', 'should', 'squire'], function (chai, should, Squire) {}을 사용하여 테스트 파일을 시작한다는 의미입니다.); – itaifrenkel