보다 구체적인 예는 다음과 같습니다.
60 파일이있는 프로젝트에서 일하고 있습니다. 우리는 그것을 실행하는 두 가지 모드가 있습니다.
연결된 버전, 1 개의 큰 파일을로드하십시오. (생산)
모든 60 파일로드 (개발)
우리는 로더를 사용하고 있으므로 웹 페이지에 하나의 스크립트 만 있습니다.
<script src="loader.js"></script>
기본값은 mode # 1 (하나의 큰 연결 파일로드)입니다. 모드 # 2 (개별 파일)에서 실행하기 위해 플래그를 설정했습니다. 무엇이든 될 수 있습니다. 쿼리 문자열의 키입니다. 이 예제에서 우리는 이것을합니다
<script>useDebugVersion = true;</script>
<script src="loader.js"></script>
loader.js는 다음과 같습니다
if (useDebugVersion) {
injectScript("app.js");
injectScript("somelib.js");
injectScript("someotherlib.js");
injectScript("anotherlib.js");
... repeat for 60 files ...
} else {
injectScript("large-concatinated.js");
}
빌드 스크립트는 다음과 같은 .sh 파일입니다.
cat > large-concantinated.js app.js somelib.js someotherlib.js anotherlib.js
기타...
새 파일이 추가되면 개발 injectScript("somenewfile.js")
중이기 때문에 mode # 2를 사용하는 것 같습니다. loader.js에 줄을 추가해야합니다.
그런 다음 나중에 프로덕션을 위해 빌드 스크립트에 somenewfile.js를 추가해야합니다. 우리는 종종 잊어 버린 다음 오류 메시지를 얻는 단계입니다.
AMD로 전환하면 2 개의 파일을 편집 할 필요가 없습니다. loader.js와 빌드 스크립트를 동기화 상태로 유지하는 문제는 사라졌습니다. 사용 r.js
하거나 webpack
빌드하기 위해 코드를 읽을 수 있습니다.large-concantinated.js
또한 종속성을 처리 할 수 있습니다. 예를 들어 다음과 같이 2 개의 lib1.js 및 lib2.js 파일이로드되었습니다.
injectScript("lib1.js");
injectScript("lib2.js");
lib2에는 lib1이 필요합니다. 내부에 코드가 있습니다.
lib1Api.installPlugin(...);
그러나 삽입 된 스크립트가 비동기식으로로드되므로 올바른 순서로로드 될 것이라는 보장이 없습니다. 이 두 스크립트는 AMD 스크립트가 아니지만 require.js를 사용하여 종속성을 알 수 있습니다
require.config({
paths: {
lib1: './path/to/lib1',
lib2: './path/to/lib2',
},
shim: {
lib1: {
"exports": 'lib1Api',
},
lib2: {
"deps": ["lib1"],
},
}
});
나는 lib1을 사용하는 모듈입니다.
define(['lib1'], function(lib1Api) {
lib1Api.doSomething(...);
});
이제 require.js가 스크립트를 주입 할 것이며 lib2가 lib1에 의존한다고 말했기 때문에 lib1이로드 될 때까지 lib2를 주입하지 않습니다. 또한 lib2와 lib1이 모두로드 될 때까지 lib1을 사용하는 모듈을 시작하지 않습니다.
이것은 개발을 좋게 만들고 (빌드 단계가 필요없고 로딩 순서에 대해 걱정할 필요가 없음) 생산을 좋게 만듭니다 (추가 된 각 스크립트에 대해 빌드 스크립트를 업데이트 할 필요가 없습니다).
추가 보너스로 우리는 webpack의 babel 플러그인을 사용하여 이전 브라우저의 코드에서 babel을 실행할 수 있으며 다시 빌드 스크립트를 유지할 필요가 없습니다.
Chrome (선택한 브라우저) import
이 실제 지원 을 시작한 경우 개발을 위해 지원 으로 전환하지만 실제로는 변경되지 않습니다. 웹팩을 사용하여 연결된 파일을 만들 수 있으며 모든 브라우저의 코드에서 babel을 실행할 수 있습니다.
이 모든 것은 스크립트 태그를 사용하지 않고 AMD를 사용하여 얻습니다.