Node와 동일한 유연성 / 모듈성 / 사용 편의성을 제공하는 브라우저 내 자바 스크립트 용 라이브러리가 require
있습니까?
더 자세한 정보를 제공하기 위해 : 그 이유 require
는 다음과 같습니다.
- 다른 위치에서 코드를 동적으로로드 할 수 있습니다 (HTML에서 모든 코드를 연결하는 것보다 스타일이 더 좋습니다).
- 모듈 구축을위한 일관된 인터페이스를 제공합니다.
- 모듈이 다른 모듈에 의존하기 쉽습니다 (예를 들어 jQuery가 필요한 API를 작성할 수 있으므로
jQuery.ajax()
- 로드 된 자바 스크립트는 범위 가 지정되어 있습니다 . 즉,로드
var dsp = require("dsp.js");
할 수 있고 액세스 할 수 있습니다dsp.FFT
. 이는 내 로컬을 방해하지 않습니다.var FFT
이를 효과적으로 수행하는 도서관을 아직 찾지 못했습니다. 내가 사용하는 해결 방법은 다음과 같습니다.
coffeescript-concat- 다른 js를 요구하는 것은 쉽지만 컴파일해야합니다. 즉, 빠른 개발 (예 : 테스트 내 API 빌드)에는 적합하지 않습니다.
RequireJS- 인기 있고 간단하며 1-3을 해결하지만 범위 지정이 없다는 것은 실제 거래를 방해하는 요소 입니다 (나는 head.js 가 범위 지정이 없다는 점에서 비슷 하다고 생각 합니다.하지만 사용할 기회가 없었습니다. 마찬가지로 LABjs 는
.wait()
종속성 문제를 로드하고 수정 하지만 여전히 범위를 지정하지 않습니다.)
내가 알 수있는 한, 자바 스크립트의 동적 및 / 또는 비동기 로딩에 대한 많은 솔루션이있는 것처럼 보이지만 HTML에서 js를로드하는 것과 동일한 범위 지정 문제가있는 경향이 있습니다. 무엇보다도, 전역 네임 스페이스를 전혀 오염시키지 않지만 여전히 라이브러리를로드하고 사용할 수 있도록하는 자바 스크립트를로드하는 방법을 원합니다 (노드의 요구 사항과 마찬가지로).
2020 업데이트 : 모듈 은 이제 ES6의 표준이며 2020 년 중반부터 대부분의 브라우저에서 기본적으로 지원됩니다 . 모듈은 동기 및 비동기 (Promise 사용)로드를 모두 지원합니다. 나의 현재 권장 사항은 대부분의 새로운 프로젝트는 ES6 모듈을 사용하고 트랜스 파일러를 사용하여 레거시 브라우저 용 단일 JS 파일로 폴백하는 것입니다.
일반적으로 오늘날의 대역폭은 원래이 질문을 할 때보 다 일반적으로 훨씬 더 넓습니다. 따라서 실제로는 항상 ES6 모듈과 함께 트랜스 파일러를 사용하도록 합리적으로 선택하고 네트워크보다는 코드 효율성에 집중할 수 있습니다.
이전 편집 (또는 ES6 모듈이 마음에 들지 않는 경우) : 이 글을 작성한 후 RequireJS를 광범위하게 사용 했습니다 (이제 훨씬 더 명확한 문서가 있음). RequireJS는 제 생각에 정말 올바른 선택이었습니다. 저처럼 혼란스러워하는 사람들을 위해 시스템이 어떻게 작동하는지 명확히하고 싶습니다.
require
일상적인 개발에 사용하실 수 있습니다 . 모듈은 함수 (일반적으로 개체 또는 함수)에서 반환하는 모든 것이 될 수 있으며 매개 변수로 범위가 지정됩니다. 다음을 사용하여 배포를 위해 프로젝트를 단일 파일로 컴파일 할 수도 있습니다 r.js
(실제로는 require
스크립트를 병렬로로드 할 수 있더라도 거의 항상 빠릅니다 ).
RequireJS와 node-style require like browserify (tjameson이 제안한 멋진 프로젝트) 사용의 주요 차이점은 모듈이 설계되고 요구되는 방식입니다.
- RequireJS는 AMD (Async Module Definition)를 사용합니다. AMD에서는
require
로드 할 모듈 (자바 스크립트 파일) 목록과 콜백 함수를받습니다. 각 모듈을로드하면 각 모듈을 콜백에 대한 매개 변수로 사용하여 콜백을 호출합니다. 따라서 진정한 비동기식이므로 웹에 적합합니다. - Node는 CommonJS를 사용합니다. CommonJS에서
require
모듈을로드하고이를 객체로 반환하는 차단 호출입니다. 파일이 파일 시스템에서 읽히기 때문에 노드에서는 잘 작동합니다. 파일 시스템은 충분히 빠르지 만 파일을 동기식으로로드하는 데 훨씬 오래 걸릴 수 있기 때문에 웹에서는 제대로 작동하지 않습니다.
실제로 많은 개발자가 AMD를보기 전에 Node (및 CommonJS)를 사용했습니다. 또한 많은 라이브러리 / 모듈이 exports
AMD ( define
함수 에서 모듈 반환)가 아닌 CommonJS ( 객체 에 항목 추가) 용으로 작성됩니다 . 따라서 많은 Node-turned 웹 개발자가 웹에서 CommonJS 라이브러리를 사용하기를 원합니다. <script>
태그 에서로드하는 것이 차단 되기 때문에 가능합니다 . browserify와 같은 솔루션은 CommonJS (노드) 모듈을 가져 와서이를 래핑하여 스크립트 태그와 함께 포함 할 수 있습니다.
따라서 웹용 다중 파일 프로젝트를 개발하는 경우 RequireJS가 진정 웹용 모듈 시스템이기 때문에 강력하게 권장합니다 (공정한 공개에서 AMD는 CommonJS보다 훨씬 더 자연 스럽습니다). 최근에는 RequireJS를 사용하여 기본적으로 CommonJS 구문을 사용할 수 있으므로 구별이 덜 중요해졌습니다. 또한 RequireJS를 사용하여 Node에서 AMD 모듈을로드 할 수 있습니다 (나는 node-amd-loader를 선호하지만 ).