2013-10-27 2 views
2

2.2로 업그레이드 한 후 이전처럼 requirejs 작업을 수행 할 수 없습니다.play 2.2 webjars requirejs jquery integration

requirejs가 올바르게 초기화되지 않았거나 올바르게 구성되지 않은 것 같습니다. 나는 https://github.com/mariussoutier/play-angular-require-seed을 따르려고했지만, 심지어 가장 단순한 경우를 작동시킬 수도 없습니다.

jquery는 main.js에서 올바르게 찾을 수 있지만 require ([ 'jquery'] .....)는 태그에서 작동하지 않습니다.

누군가 나를 도와 줄 수 있다면 많은 도움이 될 것입니다.

webjars 정의

libraryDependencies ++= Seq(
    javaJdbc, 
    javaEbean, 
    cache, 
    "org.webjars" % "jquery" % "1.10.2", 
    "org.webjars" % "requirejs" % "2.1.1", 
    "org.webjars" % "webjars-play_2.10" % "2.2.0" 
)  

resolvers += "typesafe" at "http://repo.typesafe.com/typesafe/repo" 

requireJs += "main.js" 

requireJsShim += "main.js" 

main.js

(function(requirejs) { 
     "use strict"; 

     // -- PROD RequireJS config -- 
     requirejs.config({ 
     shim: { 
      "jquery": { exports: "$" } 
     }, 
     paths: { 
      "jquery": ["/webjars/jquery/1.10.2/jquery.min"] 
     } 
     }); 
     // It works fine here   
     require(["jquery"], function($) { 
     console.log($); 
     }); 
    })(requirejs); 

index.scala.html

@(title: String) 

<html> 
    <body> 
    <script src='/lib/require.js' type='text/javascript' data-main="/assets/javascripts/main"></script> 
    <script type="text/javascript"> 
     require(["jquery"], function($) { 
      console.log($); 
      }); 
    </script> 
    </body> 
</html> 

main.js로드하고, 콘솔에 에러 메시지가있다

Uncaught TypeError: Property 'require' of object [object Object] is not a function 

여기서 핵심은 AMD 개념을 이해하는 것입니다. 태그에있는 두 개의 스 니펫이 차례로 배치되지만 순서대로 실행되는 것은 아닙니다. 따라서 두 번째 코드 단편이 실행되면 requirejs가 아직 구성되지 않을 수 있습니다.

  1. 는 (데이터 주에 지정) main.js에서 두 번째 조각의 자바 스크립트 코드를 포함하고 사용이 ([ '의존성'이 필요합니다
    <script src='webjars/requirejs/2.1.8/require.js' type='text/javascript' data-main="javascripts/main"></script> 
    <script type='text/javascript'> 
        // Second snippet 
        require(['jquery'], function($) {return $;}); 
    </script> 
    

    우리가 두 개의 서로 다른 접근 방식을 가지고이 문제를 해결하려면 ], function() {// do second.js}
  2. requirejs를 포함 할 때 data-main 필드를 지정하지 말고 두 번째 부분에서 모든 구성을 수행하십시오.

IMHO는 첫 번째 방법은 index.scala.html에서 ...

을 선호 확실히 내 대답을 예선 샘플 프로젝트 https://github.com/mariussoutier/play-angular-require-seed

답변

0

에 사용 된 정확한 하나가 아닌 전문가입니다 페이지에서 비동기 적으로로드되는 스크립트를 사용하려고합니다. 그것은 시간 내에로드되지 않을 수도 있기 때문에 무작위로 결과를 줄 것입니다. RequireJS 사이트에서

:

참고 : require.js이 데이터의 주요 모듈에 대해 생성하는 스크립트 태그는 비동기 속성이 포함되어 있습니다. 즉, 데이터 메인 스크립트의로드 및 실행이 같은 페이지의 나중에 참조되는 다른 스크립트 보다 먼저 완료된다고 가정 할 수 없습니다.

예를 들어,이 배열은 이 필요할 때 임의로 실패합니다.'foo는'모듈에 대한 설정 경로는 이전 존재가() 'D 필요 나중에 설정되지 않았습니다

또한 링크의 예에서 주 ...의
<script data-main="scripts/main" src="scripts/require.js"></script> 
<script src="scripts/other.js"></script> 

// contents of main.js: 
require.config({ 
    paths: { 
     foo: 'libs/foo-1.1.3' 
    } 
}); 

// contents of other.js: 

// This code might be called before the require.config() in main.js 
// has executed. When that happens, require.js will attempt to 
// load 'scripts/foo.js' instead of 'scripts/libs/foo-1.1.3.js' 
require(['foo'], function(foo) { 

}); 

,이 문제는 피할 수있다 왜냐하면 "require"의 모든 사용은 main * .js에서 발생하기 때문입니다.

그래서 내가해야 할 일은 두 번째 스크립트에 포함 된 JavaScript 코드를 다음과 같은 이벤트를 수신하는 이벤트 핸들러로 래핑하는 것입니다. window.onload 또는 DOMContentLoaded 이벤트를 사용하여 해당 이벤트가 시작될 때까지 실행을 지연합니다.

참고 :

+0

주셔서 감사합니다 해명에 대한 많은. require ([ 'jquery'], ...)의 모든 종속성은 data-main을 지정하여로드 된 다음 두 번째

관련 문제