2014-01-26 2 views
0

Require.js와 같은 것을 사용하지 않으면 애플리케이션이 사용자의 웹 브라우저에로드 될 때 애플리케이션 클라이언트 측 컨트롤러와 같은 것을 인스턴스화합니다. 이 방법으로 브라우저의 응용 프로그램 수명 동안 메모리에 각 컨트롤러의 단일 인스턴스가 유지됩니다.require.js로 작업하여 새로운 객체를 반복적으로 피하십시오.

Require.js가 도입되면 같은 것을 달성하기위한 관용적 인 방법은 무엇입니까?

+0

RequireJs 모듈은 어쨌든 싱글 톤입니다. – Bergi

답변

2

인스턴스가 아닌 AMD 모듈에서 클래스를 내보내는 것이 좋습니다. 예 :

// controllers/some_controller.js 
define(function (require) { 
    function SomeController() {}; 
    SomeController.prototype.foo = function() {}; 
    return SomeController; 
}); 

그리고 다른 곳에 당신의 객체의 라이프 사이클을 관리, 아마 당신 app.js에 당신이 할

// app.js 
define(function (require) { 

    var SomeController = require("./controllers/some_controller"); 

    var activeController; 

    ... 

    router.on("/foo", function() { 
    if (activeController) { 
     activeController.destroy(); 
    } 
    activeController = new SomeController(); 
    }); 
}); 

같은 또는 당신은 당신이 말한 것처럼, 당신이 할 수있는, 컨트롤러는 싱글이 될 갖고 싶어 어쨌든이

// app.js 
define(function (require) { 

    var controllers = { 
    "some": require("./controllers/some_controller") 
    }; 
    var controllerCache; 

    function getController(name) { 
    if (!controllerCache[name]) { 
     controllerCache[name] = new controllers[name](); 
    } 
    return controllerCache[name]; 
    } 

    var activeController; 

    ... 

    router.on("/foo", function() { 
    if (activeController) { 
     activeController.exit(); 
    } 
    activeController = getController("some"); 
    }); 
}); 

같은 것을 할이 꽤 복잡한 예입니다,하지만 내 요점은 내가 당신의 모듈 수출 클래스를 추천한다는 것입니다 -하지 인스턴스를 -이 방법을 ' 이러한 객체와 라이프 사이클을 관리하는 방법을 제어하고, 클래스를 요구하고, 스텁하고, 모의 의존성을 제공 할 수 있기 때문에 테스트 가능성에도 도움이됩니다. (컨테이너를 사용하여 다양한 객체의 인스턴스를 조회하는 고급 예제는 http://www.slideshare.net/mixonic/containers-di을 참조하십시오. . 그는 심지어 AMD 모듈과 함께 그것을 사용하는 방법의 예제를 제공합니다)

희망이 다소 도움이됩니다.

UPDATE 물론 , 당신이 할 수있는 기능도 수출 함수 또는 객체와 해당하지만, 당신이 일을 인스턴스화 또는 모듈의 최상위 수준에 일을 실행하지 않을 가능성이 높습니다 어떤 다른 - 최고의 require.js의 일부가 아닌 응용 프로그램 흐름의 일부로 모듈 플로우를 수행하십시오.

+0

그래서 인스턴스 생성을 제어하고 존재하는 인스턴스를 재사용하는 함수에 내 내보내기를 래핑 할 수 있습니까? – Ben

+0

뭔가를 얻기 위해 호출 할 수있는 팩토리 함수를 내 보내면 그 팩토리 함수가 해당 인스턴스를 캐싱합니까? 물론, 당신은 정말로 아무것도 할 수 있습니다. 관용적 인 "Require.js"방법은 없다고 생각합니다. 소프트웨어 공학이 그저 그렇습니다. 저는 기존 프레임 워크/라이브러리에서 영감을 얻는 경향이 있습니다. 노드 사람들이 require() 등을 어떻게 사용하는지보십시오. – Karolis

관련 문제