2013-08-07 1 views
12

로드하려고하는 중 Modern01r 기능이 requireJS으로 동적으로 감지됩니다.
Modernizr이 AMD을 지원하므로이 문제가 없어야합니다.ModernJ에 대한 JJ 구성

내 requireJS 구성은 모더 나이저 소스 디렉토리 경로를 포함하고 기능에 디렉토리 감지 :

requirejs.config({ 
    paths: { 
    "modernizr" : "components/modernizr/src", 
    "feature-detects": "components/modernizr/feature-detects" 
    } 
}); 

SVG 테스트를 필요로 내보기 중 하나를 가정 할 수 있습니다. define(['Modernizr'], ..를 모든 기능을 감지하고 모더 나이저 소스 파일을 임의의 디렉토리를 지정하지 않고 모더 나이저를로드하기 때문에 this

define(["feature-detects/svg"], function() { .. }); 

는 불행하게도 svg.jsModernizr.js을 찾을 수없는 것처럼
내보기 정의가 보일 수 있습니다. 결과

매우 추한 require.config

requirejs.config({ 
    paths: { 
    "Modernizr": "components/modernizr/src/Modernizr", 
    "addTest": "components/modernizr/src/addTest", 
    "ModernizrProto": "components/modernizr/src/ModernizrProto", 
    "setClasses": "components/modernizr/src/setClasses", 
    "hasOwnProp": "components/modernizr/src/hasOwnProp", 
    "tests": "components/modernizr/src/tests", 
    "is": "components/modernizr/src/is", 
    "docElement": "components/modernizr/src/docElement", 
    "feature-detects": "components/modernizr/feature-detects" 
    } 
}); 

이 파일을 찾을 수 없습니다 때마다 components/modernizr/src/에서 검색하는 requireJS을 말할 청소기 방법이 있나요?

업데이트 나는 기본 설정과 demonstration 실행을 포함하는 example github project를 만들었습니다. 내가 제대로 질문을 이해한다면

+0

호기심 스크립트에서 정의 사용할 수 있습니까? 파일을 동 기적으로로드하여 나머지 페이지 렌더링 전에 테스트가 실행되도록해야합니다. 내가 올바르게 기억하면, AMD가 주로 빌드 프로세스를 돕기 위해 선택되었습니다. - https://github.com/Modernizr/Modernizr/issues/713 –

+0

@SimonSmith 내 앱을 빌드하기 위해 requireJS'r.js' 스크립트를 사용하고 있습니다. 파일. requireJS를 사용하여 modernizr 종속성을 정의 할 수 있다면 정말 좋을 것입니다. – jantimon

+0

자산 관리를 위해 Bower와 같은 것을 사용한다고 가정하기 때문에'components' 폴더가 프로젝트 폴더와 다릅니다 (즉, RequireJS의'baseUrl'을 Modernizer를 가리킬 수 없습니다). 불행히도 이러한 종속성을 추가하는 쉬운 방법이 없으며이를 해결하는 방법이 유일한 옵션 인 것 같습니다. 대안은 Modernizer에서'r.js'를 실행 한 다음 패키지 된 파일을 앱에 포함시키는 것입니다. 아직도 좋지는 않아. – danielepolencic

답변

19

Modernizr의 AMD 구조는 (현재) 자체 내부 빌드 프로세스 용입니다. 지금까지 시도한 것처럼 사용할 수 있도록 노출을 논의했지만 아직까지는이를 수행하는 편리한 방법에 동의하지 않았습니다. A Modernizr plugin for RequireJS은 하나의 옵션 일 수 있습니다.

Bower를 사용하고 있습니까? 그렇다면 Modernizr isn't suitable for use with Bower yet에 주목할 가치가 있습니다.

Modernizr을 현재 빌드 프로세스에 연결하는 가장 좋은 방법은 grunt-modernizr을 사용하는 것입니다.이 방법은 코드에서 Modernizr 감지에 대한 참조를 자동으로 찾거나 명시 적으로 정의 할 수 있습니다. 그런 다음 결과 Modernizr 빌드를 사용할 수 있습니다 다른 AMD 의존성처럼 때마다 당신은 그것을 필요

define(['path/to/built/modernizr.js'], function (Modernizr) { 
    if (Modernizr.svg) { 
     ... 
    } 
}); 
+0

대단히 감사합니다! 이것이 지금까지만의 유일한 길이라면 나는 꿀꺽 거리는 소리로 바꿀 것입니다. – jantimon

+0

내가 이미 Modernizr (Zurb Foundation과 함께) 사용자 정의 빌드를 가지고 있다면, 어떻게 AMD를 지원합니까? 모듈에 대해 define()이 표시되지 않습니다. 첫 번째 줄에는 창에 글로벌 변수가 붙어 있습니다. 당신은 정교 할 수 있습니까? – elanh

+3

@elanh 빌드 된 Modernizr 스크립트는 AMD와 호환되지 않으므로 [shim config] (http://requirejs.org/docs/api.html#config-shim)을 사용해야합니다. –

-1

, 당신은 너무처럼 기능을 정의 할 것이다 : 당신의 특징 검출 코드가 실행되기 전에

define([ 
    "modernizr", 
    "feature-detects/svg" 
], function(Modernizr) { 
    Modernizr.addTest(); 
}); 

이 방법 모더 나이저가로드됩니다.

+0

종속성이있는 모든 기능을로드하려고합니다. – jantimon

11

나의 제안은 심

에게

paths: { 
     'Modernizr': 'PATH TO MODERNIZR' 
    } 
shim: { 
     'Modernizr': { 
      exports: 'Modernizr' 
     } 
    } 
구성을하는 것입니다

=================

당신은 모더 나이저와 AMD를 사용하는 이유에 관해서

define(['Modernizr'],function(Modernizr) { 
    'use strict'; 

console.log(Modernizr) 
// This should log the Modernizr function 

//For Example 
if(Modernizr.boxshadow){ 
    // Do something here 
} 

};