2014-04-28 5 views
1

requirejs에 bootbox (http://bootboxjs.com)를 사용하려고합니다. bootbox 플러그인이로드되면requirejs 전역 변수 내보내기

main.html

<script> 
var require = { 
    baseUrl: 'js', 
    paths: { 
     "jquery" :['jquery-1.11.0.min'], 
     "bootbox" :['bootbox.min'], 
     "bootstrap" :['//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min'] 
    }, 
    shim: 
     'bootstrap' :{deps:['jquery']}, 
     'bootbox' :{deps:['bootstrap'],exports: 'bootbox'} 
    } 
} 
</script> 
<script src="require.min.js"></script> 
<script src="myscript1.js"></script> 

main.js

define(['bootbox'],function(bootbox){ 
    bootbox.alert("Hello world!"); // working properly 
}); 

myscript1.js

require(['main'],function(){ 
    bootbox.alert("Hello world!"); // not functioning (bootbox is not defined) 
}); 

는 일반적으로, 우리는 어디 페이지에에 bootbox을 사용할 수 있습니다 this : bootbox.alert("Hello world!"); requirejs를 사용할 때 bootbox 변수를 전달해야하며 bootbox을 사용하려면 requirejs를 사용할 때마다 정의하십시오. 나는 "수출"을 시도했지만 도움이되지는 않는다.

bootbox 변수는로드 된 후에 어떻게 전역 적으로 사용할 수 있습니까?

감사합니다.

+1

require.js의 전체 요점에는 전역 적으로 사용할 수있는 변수가없고 모듈을 프로그래밍하는 데 필요한 변수가 없습니다.왜 당신이 필요할 때 사용할 수있는 부트 박스를 사용하는 모달 (modal) '컴포넌트'를 만들지 않는가? 이렇게하면 구현을 캡슐화하여 라이브러리를 사용하는 코드에 영향을주지 않고 다른 라이브러리를 사용하도록 선택하면 라이브러리를 스왑 아웃 할 수 있습니다. – Magrangs

답변

2

Bootbox를 전역으로 사용할 수있게하려면 스크립트 태그를 사용하여 수동으로 포함시켜야합니다. RequireJS는 노출하지 않습니다.

그러나이 문제에 대해 적극 권장합니다. RequireJS와 같은 의존성 프레임 워크의 전체적인 개념은 전역 범위에서 어떤 것도 정의하지 않고 종속성을 명시 적으로 만드는 것입니다. 이렇게하면 게으른로드 스크립트를 허용 할뿐만 아니라 나중에 종속성을 바꿀 수도 있습니다. 단위 테스트 용.

편집 : As Louis correctly mentioned Bootbox는 이미 AMD를 지원합니다. RequireJS (또는 다른 AMD 로더)가 감지되면 전역 범위에 아무 것도 노출시키지 않지만 AMD 지원이 있으므로 심을 필요가 없습니다.

+0

답변 해 주셔서 감사합니다. Btw, "심"에서 "수출"의 목적이 무엇인지 아십니까? – user1995781

+0

내보내기는 의존성이 일반적으로 생성하는 전역 객체의 이름이어야합니다. 일반적으로 Bootbox는 글로벌'bootbox' 객체를 생성합니다. 따라서 exports : 'bootbox'를 지정하여 RequireJS가 의존성 주입에 객체를 사용하도록 지정합니다. – Tiddo

+0

설명해 주셔서 감사합니다. 그러나 나는 아직도 그것을 얻지 못한다. '수출 :'bootbox''를 넣으면 어떤 일이 생깁니 까? 어쩌면 몇 가지 예 또는 코드로 설명 할 수 있습니까? – user1995781

3

여기에 있습니다. Bootbox는 RequireJS와 같이 AMD 로더에서 실행 중인지 여부를 감지합니다. 그렇다면, 글로벌 공간으로 아무것도 내보낼 것이 아니라 대신 AMD 모듈로 정의되어 AMD 로더에 의해로드 될 것입니다.

신중하게 실행하면 script 태그가있는 Bootbox를로드하는 Tidoo의 제안이 효과적입니다. Bootbox 을 읽어 들여서 전에 RequireJS를로드해야합니다. 그렇지 않으면 RequireJS가로드되고 AMD 로더로 실행되고 있는지 확인한 다음 자체를 AMD 모듈로 정의합니다. 이로 인해 RequireJS의 익명 모듈 오류가 일치하지 않게됩니다. 또 다른 한가지는 jQuery RequireJS 외부로로드하고 Bootbox 전에로드해야한다는 것입니다. 그럼 다른 script 태그입니다.

내가 필요한 의존성 추가 단순히 코드를 수정하여 해당 솔루션을 피하는 게 좋을 것 : 그것이 AMD가 있는지 여부를 감지 있기 때문에

require(['bootbox', 'main'],function(bootbox){ 
    bootbox.alert("Hello world!"); 
}); 

, 당신은 Bootbox 에 대한 shim 구성을 사용하지 않아야을 로더 주위를 찾은 후 define을 호출합니다. define을 호출하지 않는 코드에 대해서만 shim 구성이 필요합니다.

+0

이것은 실제적인 정답입니다! bootbox에 amd 지원이 있는지 확인하지 않았고, 질문에 shim을 사용하지 않았다고 가정했습니다. 나는 나의 대답도 업데이트 할 것이다. – Tiddo

+0

나는이 똑같은 문제를 가지고 있었다! 이 답변을 읽은 후에도 알아낼 시간이 필요했습니다. 마지막으로 중요한 것은 @Louis가 업데이트 한'myscript1.js'에서'require' 호출로 캡슐화 된 함수입니다. 이 기능 (예 : 'require()'의 두번째 매개 변수 - 이제는 params가 아닌'bootbox' 매개 변수를 얻습니다. 함수에 대한 매개 변수는 첫 번째 배열 인 문자열 배열의 항목과 같은 순서 여야합니다. 더 많은 매개 변수가있는 예는 [this fiddle] (http://jsfiddle.net/bartvanderwal/L1emr4up/)을 확인하십시오. – Bart