모듈로드는 실제로 개발 및 유지 보수를 쉽게하기 위해 JS를 많은 모듈로 나눕니다. 따라서 많은 JS 모듈을로드 할 때는 사용자 경험을 향상시키기 위해 동적으로로드해야합니다.
모듈로드 라이브러리를 소개하기 전에 메소드를 소개합니다.
JS 방법의 동적 로딩 :
코드 사본은 다음과 같습니다.
함수 loadjs (url, 콜백) {
var node = document.createElement ( "스크립트");
노드 [window.addeventListener? "onload": "OnreadyStateChange"] = function () {
if (winde
콜백 ();
node.onreadyStateChange = null;
}
}
node.onerror = function () {};
node.src = url;
var head = document.getElementsByTagName ( "Head") [0];
head.insertbefore (노드, head.firstchild); // 헤드의 첫 번째 노드에 삽입하기 전에 IE6 아래의 헤드 태그가 닫히지 않도록하고 AppendChild를 사용하여 오류를보고합니다.
}
SITIE Zhengmei는 모듈 로딩을 도입하기 위해 쓴 대량 프레임 워크를 사용했기 때문에 업계에서 가장 많이 사용되는 것은 요구 사항입니다. JS 및 SEA.JS. 그러므로 나는 그가 강한 성격을 가지고 있다고 생각합니다.
Sea.js의 적재 과정에 대해 이야기하겠습니다.
페이지 chaosan.js 페이지는 헤드 태그에 소개되며 SEAJS 객체가 얻어집니다.
또한 index.js를 소개합니다.
index.js 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
seajs.use ([ './ a', 'jquery'], function (a, $) {
var num = aa;
$ ( '#j_a'). 텍스트 (num);
})
A.JS :
코드 사본은 다음과 같습니다.
정의 (함수 (요구, 내보내기, 모듈) {
var b = 요구 사항 ( './ b');
var a = function () {
반환 1 + parseint (bb ());
}
내보내기. A = A;
})
B.JS :
코드 사본은 다음과 같습니다.
정의 (함수 (요구, 내보내기, 모듈) {
var c = 요구 ( './ c');
var b = function () {
반환 2 + parseint (cc ());
}
수출 .B = B;
})
C.JS :
코드 사본은 다음과 같습니다.
정의 (함수 (요구, 내보내기, 모듈) {
var c = function () {
반환 3;
}
Exports.c = C;
})
위에서, 우리는 모듈 a가 b에 의존하고 b는 c에 의존한다는 것을 알 수있다.
프로그램이 index.js에 들어가면 SEAJS는 사용 방법을 호출합니다.
코드 사본은 다음과 같습니다.
seajs.use = function (ids, 콜백) {
GlobalModule._USE (IDS, 콜백)
}
설명 : GlobalModule이 SEAJS에서 초기화 될 때 (SEA.JS가 소개 될 때) 모듈의 인스턴스 var globalModule = new Module (util.pageuri, status.compiled)
이 시점에서 ids-> [ './a','jquery '], 콜백 -> 함수 (a, $) {var num = aa; $ ('#j_a '). text (num);}
다음으로 GlobalModule._use (IDS, Callback)가 호출됩니다
코드 사본은 다음과 같습니다.
module.prototype._use = function (ids, 콜백) {
var uris = resolve (ids, this.uri); // 해상도 [ './a','jquery ']
this._load (uris, function () {// 구문 분석 된 a 및 jQuery 모듈 [url1, url2]의 주소를 호출하고 _load 메소드를 호출하십시오.
//util.map : 모든 데이터 멤버가 한 번에 지정된 기능을 실행하고 원래 배열 멤버의 콜백 실행 결과 인 새 배열을 반환하도록합니다.
var args = util.map (uris, function (uri) {
URI를 반환 하시겠습니까? CachedModules [uri] ._ compile () : null; // URL이 존재하면 _compile 메소드를 호출하십시오.
})
if (Callback) {Callback.apply (null, args)}
})
}
_load 메소드를 호출 한 후 두 개의 콜백 함수가 나타나므로 기능 (a, $) {var num = aa; $ ( '#j_a'). text (num);} on Callback1,
this._load (uris, function () {}) 콜백 메소드 플래그를 콜백 2로 설정하십시오.
Resolve 방법은 모듈 주소를 해결하는 것이므로 여기에서 자세히 설명하지 않습니다.
마지막으로, var uris = resolve (ids, this.uri)의 uris는 [ 'http : //localhost/test/seajs/a.js' ,'http : //localhost/test/seajs/lib/juqery/1.7.7.2/juqery-debug.js에 구문 분석되었습니다.
다음은 다음과 같습니다 ._LOAD가 실행됩니다
코드 사본은 다음과 같습니다.
// _load () 메소드는 먼저 준비가되지 않은 리소스 파일을 결정합니다. 모든 리소스 파일이 준비 상태 인 경우 Callback2가 실행됩니다.
//이 경우 원형 종속성을 만들고 언로드 된 JS에 대한로드를 수행합니다.
module.prototype._load = function (uris, callback2) {
//util.filter : 모든 데이터 멤버가 한 번에 지정된 기능을 실행하고 새 배열을 반환하도록합니다. 배열은 원래 배열 멤버에서 콜백을 실행 한 후 True를 반환하는 멤버입니다.
// unloadeduris는 컴파일되지 않은 모듈 배열입니다.
var unloadeduris = util.filter (uris, function (uri) {
// 실행 함수가있는 멤버를 반환합니다. 부울 값은 true, URI가 존재하고 내부 변수 캐시 모드에 존재하지 않을 때 true를 반환하거나 상태보다 낮은 상태 값을 저장합니다.
// 상태가 4 인 경우 4, 4 미만인 경우 검색 및 다운로드 할 수 있습니다.
uri && (캐시드 모듈 [uri] ||를 반환합니다
CachedModules [uri] .status <status.ready)
});
// URI의 모든 모듈이 준비된 경우 콜백을 실행하고 기능 본문을 종료하십시오 (이번에는 모듈의 _COMPILE 메소드가 호출됩니다).
var 길이 = unloadeduris.length
if (length === 0) {Callback2 () return}
//로드되지 않은 모듈 수입니다
var 남아 = 길이
// 클로저 생성 및로드되지 않은 모듈을로드하려고합니다.
for (var i = 0; i <길이; i ++) {
(기능 (uri) {
// URI 스토리지 정보가 내부 변수 캐시드 모듈에 존재하지 않는지 판단하고 모듈 개체를 인스턴스화합니다.
var module = CachedModules [uri] ||
(CachedModules [uri] = New Module (uri, status.fetching)))
// 모듈의 상태 값이 2보다 크거나 같으면 모듈이 다운로드되어 이미 로컬에 존재 함을 의미합니다. 현재 onfetched ()가 실행됩니다
// 그렇지 않으면, fetch (uri, onfetched)가 자원 파일을 다운로드하려고 시도합니다. 리소스 파일이 다운로드 된 후에 온로드가 트리거되며, 온부하에서 온로드 메소드가 실행됩니다.
module.status> = status.fetched? onfetched () : fetch (uri, onfetched)
function onfetched () {
모듈 = 캐시 모드 [URI]
// 모듈의 상태 값이 상태보다 크거나 동일하면 모듈의 모든 종속성 정보가 얻어 졌음을 의미합니다.
if (module.status> = status.saved) {
// getPuredependencies : 원형 종속성이없는 종속성 배열을 가져옵니다
var deps = getPuredependencies (모듈)
// 종속성 배열이 비어 있지 않은 경우
if (deps.length) {
// 모든 종속성이로드되고 모든 종속성의로드가 완료된 후 콜백이 실행될 때까지 _load () 메소드를 다시 실행합니다.
module.prototype._load (deps, function () {
CB (모듈)
})
}
// 종속성 배열이 비어 있으면 CB (모듈)를 직접 실행하십시오
또 다른 {
CB (모듈)
}
}
// 획득이 404와 같이 실패한 경우 또는 모듈 식 사양을 준수하지 않습니다.
//이 경우 Module.Status는 메모를하거나 가져 오는 데 유지됩니다.
또 다른 {
CB ()
}
}
}) (unloadeduris [i])
}
// CB 메소드 - 모든 모듈을로드 후 콜백을 실행합니다.
함수 CB (모듈) {
// 모듈의 스토리지 정보가 존재하면 모듈 스토리지 정보의 상태 값을 수정하고 상태로 수정합니다.
module && (module.status = status.ready)
// 콜백은 모든 모듈이로드 된 경우에만 실행됩니다.
-remain === 0 && callback2 ()
}
}
}
여기서 unloadeduris의 배열 길이는 2, [ 'http : //localhost/test/seajs/a.js' ,'http : //localhost/test/seajs/lib/juqery/1.7.2/juqery-debug.js']
http : //localhost/test/seajs/a.js를 예로 들어 보겠습니다
다음 : 먼저 모듈이 생성됩니다.
코드 사본은 다음과 같습니다.
CachedModules ( 'http : //localhost/test/seajs/a.js') = new Module ( 'http : //localhost/test/seajs/a.js'
module.status> = status.fetched? onfetched () : fetch (uri, onfetched)
모듈 A가 현재로드되지 않기 때문에 Fetch (URI, OnFetched)는 다음에 실행됩니다.
코드 사본은 다음과 같습니다.
함수 페치 (uri, onfetched) {
//지도의 규칙에 따라 URI를 새 요청 주소로 바꾸십시오.
var requestUri = util.parsemap (uri)
// 먼저, requestUri 레코드가 얻은 목록에 포함되어 있는지 알아보십시오.
if (fetchedList [requestUri]) {
// 현재, 원래 URI의 모듈 저장소 정보를 MAP로 재정의 된 요청에 따라 새로 고칩니다.
CachedModules [uri] = CachedModules [requesturi]
// onfetched 및 return을 실행합니다. 즉, 모듈이 성공적으로 얻어 졌음을 의미합니다.
onfetched ()
반품
}
// query requestUri의 스토리지 정보 획득 목록에 있습니다
if (fetchingList [requestUri]) {
// 콜백리스트에서 URI에 해당하는 콜백 추가 및 반환
CallbackList [requestUri] .push (onfetched) // 검색중인 경우이 모듈의 onfetched 콜백 메소드를 배열로 밀어 넣고 반환하십시오.
반품
}
// 획득하려는 모듈이 fetchedList 및 FetchingList에 표시되지 않으면 요청 목록과 콜백 목록에 각각 정보를 추가하십시오.
fetchinglist [requestUri] = true
CallbackList [requestUri] = [onfetched]
// 가져옵니다
module._fetch (
requesturi,
기능() {
fetchedList [requestUri] = true
// 모듈 상태를 업데이트합니다
// module.status가 status와 같다. fectching, module 상태를 수정하십시오.
var module = 캐시 모드 [uri]
if (module.status === status.fetching) {
module.status = status.fetched
}
if (fetchingList [requestUri]) {
fetchinglist 삭제 [requesturi]
}
// CallbackList 통화 통합 콜백 실행
if (callbackList [requestUri]) {
util.foreach (CallbackList [requestUri], function (fn) {
fn () // fn은 모듈 a에 해당하는 온화 된 메소드입니다.
})
CallbackList 삭제 [requestUri]
}
},
config.charset
))
}
다음으로, module._fetch ()가 실행되며 여기에서 콜백 함수를 Callback3로 호출합니다.
이 방법은 loadjs 메소드를 호출하여 A.JS 파일을 동적으로 다운로드하는 것입니다. (A와 JQuery가 있기 때문에 두 개의 새로운 스크립트가 생성됩니다). 여기에 질문이 있습니다. A 용 스크립트를 만들고 헤드에 추가하면 JS 파일을 다운로드합니다. 그러나 Seajs에서는 다운로드되지 않습니다. 대신, jQuery의 스크립트가 설정되어 헤드에 추가 될 때까지 기다릴 것입니다 (Google 디버거는 중단 점을 설정하고 대기중인 대기 중임을 계속 표시합니다). 이것은 마오를위한 것입니까?
(여기서 권장 : http://ux.sohu.com/topics/50972d9ae7de3e752e0081ff. 여기서 추가 질문에 대해 이야기하겠습니다. 테이블이 렌더링되기 위해 테이블을 사용해야하는 이유를 알 수 있습니다. 테이블이 여러 번만 계산 해야하는 반면, 한 번만 계산해야합니다. DIV는 테이블에 tbody 태그가있는 경우, IE6, 7, 8에서는 "<tables> </table>"에 따라 세그먼트에 표시됩니다.
다운로드가 성공하면 구문 분석 및 실행되며 Define 메소드가 실행됩니다. 여기서는 먼저 모듈 코드를 실행합니다.
정의 (id, deps, function () {}) 메소드 분석
코드 사본은 다음과 같습니다.
// 정의 정의, ID : 모듈 ID, deps : 모듈 종속성, 공장
module._define = function (id, deps, factory) {
// 종속성 해결 // DEPS가 배열 유형이 아닌 경우 공장은 기능입니다.
if (! util.isarray (deps) && util.isfunction (factory)) {// 기능 본체는 정기적으로 요구 문자열과 일치하고 DEPS로 할당을 반환하기 위해 배열을 형성합니다.
deps = util.parsedependencies (factory.tostring ())
}
// 메타 정보를 설정합니다
var meta = {id : id, 종속성 : DEPS, 공장 : 공장}
if (document.attachevent) {
// 현재 스크립트의 노드를 가져옵니다
var script = util.getCurrentScript ()
// 스크립트 노드가 존재하는 경우
if (script) {
// 원래 URI 주소를 가져옵니다
deriveduri = util.unparsemap (util.getScriptabsolutesrc (script))}
if (! deviveduri) {
util.log ( '대화식 스크립트에서 URI를 도출하지 못했습니다 :', factory.toString (), 'warn')
}
}
.........
}
Define은 먼저 공장에서 판단을 수행하여 기능인지 여부를 결정합니다 (그 이유는 정의에 파일과 객체를 포함 할 수 있기 때문입니다).
함수 인 경우 기능은 Factory.tostring ()을 통해 얻어지고 A.JS의 종속성이 정기적으로 일치하고 DEPS에서 의존성이 저장됩니다.
A.JS의 경우 그 종속성은 b.js이므로 deps는 [ './b']입니다.
A.JS var meta = {id : id, 종속성 : DEPS, 공장 : 공장}의 정보를 저장하십시오.
A.js meta = {id : 정의되지 않은, 종속성 : [ './b'], 공장 : function (xxx) {xxx}}
IE 6-9 브라우저에서는 JS를 실행하는 경로를 얻을 수 있습니다. 그러나 표준 브라우저에서는 가능하지 않으므로 Meta 정보를 AnonymousModuleMeta = Meta에 할당 할 수 있습니다.
그런 다음 onload를 트리거하면 콜백 메소드 콜백3이 호출됩니다. 이 콜백 메소드는 현재 콜백 모듈 (a.js)의 상태 값을 수정하고 module.status = status.fetched로 설정합니다.
다음으로, 콜백 큐 콜백리스트에서 A.JS에 해당하는 콜백은 균일하게 실행됩니다.
onfetched 메소드는 모듈 A에 종속 모듈이 있는지 확인합니다. A는 b에 의존하기 때문에 모듈 A가 의존하는 B.js에서 _load ()를 실행하십시오.
B 모듈이 다운로드되고 jQuery 정의 방법이 먼저 실행됩니다. jQuery는 모듈에 의존하지 않기 때문에 Onload Callback 후. onfetched Call CB 메소드.
B가 A와 동일한 프로세스에서 구현되면 모듈 C가 다운로드됩니다. 마지막으로, C, B, 모듈이 다운로드 및 실행되며, 온부하가 완료되면 CB 메소드도 호출됩니다 (첫 번째 C, B, C)
모든 모듈이 준비되면 Callback2 메소드가 호출됩니다.
마지막으로, 콜백은 back2라고하며 a _compile 메소드와 jQuery 모듈이 실행됩니다.
먼저 A.JS 모듈을 컴파일하고 모듈 a의 기능을 실행하십시오. A는 (B.JS) 요구 사항이 있으므로 모듈 B의 기능을 실행합니다.
모듈 A의 함수는 실행을 시작합니다
모듈 B의 기능이 실행되기 시작합니다
모듈 C의 함수는 실행을 시작합니다
모듈 C의 기능 실행이 완료되었습니다
모듈 B의 기능 실행이 완료되었습니다
모듈 A의 기능 실행이 완료되었습니다
마지막으로 jQuery의 기능을 실행하십시오.
컴파일 후 Callback1을 실행하면 a 및 jQuery 객체를 사용할 수 있습니다.
추신 : SEAJS 버전이 업데이트되었으며 지금은 _compile 메소드가 없습니다. (모두가 직접보고 나도보고 싶어)
SEAJS 모듈 컴파일 _compile 프로세스에 대해 이야기 해 봅시다.
먼저, A.JS의 편집
코드 사본은 다음과 같습니다.
module.prototype._compile = function () {
126 var 모듈 = 이것입니다
127 // 모듈이 컴파일 된 경우 Module.Exports를 직접 반환합니다.
128 if (module.status === status.compiled) {
129 반환 모듈
130}
133 // 1. 모듈 파일은 404입니다.
134 // 2. 모듈 파일은 유효한 모듈 형식으로 작성되지 않았습니다.
135 // 3. 기타 오류 사례.
136 // 여기에 다루는 몇 가지 예외가 있습니다.
137 if (module.status <status.saved &&! hasmodifiers (module)) {
138 리턴 널
139}
140 // 모듈 상태를 컴파일로 변경합니다. 즉, 모듈이 컴파일되고 있음을 의미합니다.
141 module.status = status.compiling
142
143 // 모듈의 내부 사용은 다른 모듈 (서브 모듈이라고 함)에서 제공하는 인터페이스를 얻고 동기식으로 작동하는 데 사용되는 메소드입니다.
144 기능 요구 (id) {
145 // ID에 따라 모듈의 경로를 경로하십시오
146 var uri = resolve (id, module.uri)
147 // 모듈 캐시에서 모듈 가져 오기 (기본 모듈로서의 하위 모듈의 종속성이 다운로드 됨)
148 var child = cachedmodules [uri]
149
150 // URI가 유효하지 않으면 Null을 반환합니다.
151 // 자식이 비어 있으면 매개 변수가 잘못 채워진 다음 Null을 직접 반환한다는 것을 의미 할 수 있습니다.
152 if (! child) {
153 리턴 널
154}
155
156 // 원형 통화를 피합니다.
157 // 하위 모드의 상태가 status.compiling 인 경우 child.corts를 직접 반환하여 원형 종속성으로 인해 모듈의 반복적 인 편집을 피하십시오.
158 if (child.status === status.compiling) {
159 Return Child. Exports
160}
161 // 초기화 중 현재 모듈을 호출하는 모듈을 가리 킵니다. 이 속성에 따라 모듈이 초기화되면 통화 스택을 얻을 수 있습니다.
162 child.parent = 모듈
163 // 모듈을 반환합니다
164 Return Child._compile ()
165}
166 // 내부적으로 사용하여 모듈을 비동기로로드하고로드가 완료된 후 지정된 콜백을 실행합니다.
167 require.async = function (ids, 콜백) {
168 Module._USE (IDS, 콜백)
169}
170 // 모듈 시스템 내부의 경로 해상도 메커니즘을 사용하여 모듈 경로를 구문 분석하고 반환합니다. 이 함수는 모듈을로드하지 않으며 구문 분석 된 절대 경로 만 반환합니다.
171 require.resolve = function (id) {
172 반환 Resolve (id, module.uri)
173}
174 //이 속성을 통해 모듈 시스템에서로드 된 모든 모듈을 볼 수 있습니다.
175 // 경우에 따라 모듈을 다시로드 해야하는 경우 모듈의 URI를 가져온 다음 Delete requile.cache [uri]로 정보를 삭제할 수 있습니다. 다음에 사용할 때 다시 인쇄됩니다.
176 require.cache = 캐시 모듈
177
178 // 요구 사항은 다른 모듈에서 제공하는 인터페이스를 얻는 방법입니다.
179 module.require = 요구 사항
180 // 내보내기는 모듈 인터페이스를 외부에 제공하는 객체입니다.
181 module.exports = {}
182 var factory = module.factory
183
184 // Factory가 함수 인 경우 모듈의 생성자를 나타냅니다. 이 방법을 실행하면 모듈에서 제공 한 인터페이스를 외부로 얻을 수 있습니다.
185 if (util.isfunction (factory)) {
186 Compilestack.push (모듈)
187 RuninModuleContext (공장, 모듈)
188 Compilestack.pop ()
189}
190 // 팩토리가 객체, 문자열 등과 같은 비 기능 유형 인 경우 모듈을 나타내는 인터페이스는 객체, 문자열 및 기타 값입니다.
191 // 예 : 정의 ({ "foo": "bar"});
192 // 예를 들어 : 정의 ( '템플릿입니다. 내 이름은 {{name}}.');
193 else if (factory! == 정의되지 않은) {
194 module.exports = 공장
195}
196 년
197 // 모듈 상태를 컴파일 된 상태로 변경합니다. 이는 모듈이 컴파일되었음을 의미합니다.
198 module.status = status.compiled
199 // seajs.modify ()를 통해 모듈 인터페이스 수정 실행
200 명의 execmodifiers (모듈)
201 RETURN MODULE.EXPORTS
202}
코드 사본은 다음과 같습니다.
if (util.isfunction (factory)) {
186 Compilestack.push (모듈)
187 RuninModuleContext (공장, 모듈)
188 Compilestack.pop ()
189}
다음은 module.export의 초기화입니다. runinModuleContext 메소드 :
코드 사본은 다음과 같습니다.
// 모듈 컨텍스트에 따라 모듈 코드 실행
489 함수 runinModuleContext (fn, module) {
490 // 모듈 및 모듈 자체와 관련된 두 매개 변수로 전달됩니다.
491 // 내보내기는 인터페이스를 노출시키는 데 사용됩니다
492 // 요구 사항은 종속 모듈 (동기)을 얻는 데 사용됩니다 (Compile)
493 var ret = fn (module.require, module.exports, module)
494 // 반환 값 노출의 인터페이스 형식을 지원합니다.
495 // return {
496 // fn1 : xx
497 //, fn2 : xx
498 // ...
499 //}
500 if (ret! == 정의되지 않은) {
501 module.exports = ret
502}
503}
A.JS에서 함수 메소드를 실행하면 var B = 요구 사항 ( "B.JS")이 호출됩니다.
요구 메소드는 B의 컴파일 메소드의 반환 값을 반환하고 B 모듈에는 var c = 요구 ( 'c.js')가 있습니다.
현재 C의 컴파일 방법이 호출되고 C의 함수가 호출됩니다. C에서 객체가 노출되거나 반환 오브젝트 C가 반환되는 경우 모듈 C의 내보내기는 내보내기 = c입니다. 또는 직접 module.export = c; 요컨대, module c.export = c는 마지막에 반환됩니다. var c = 모듈 c.export = c. 모듈 B에서 변수 c를 사용하여 모듈 c에서 c 객체의 메소드와 속성을 호출 할 수 있습니다.
유사하게, 모듈 A는 결국 모듈 b에서 B 객체의 속성과 방법을 호출 할 수 있습니다.
Module.export = xx 모듈을 사용하는 한 어떤 모듈에 관계없이, 다른 모듈은 요구 ( "xx module")를 사용하여 XX 모듈에서 다양한 메소드를 호출 할 수 있습니다.
최종 모듈 상태는 module.status = status.compiled가됩니다.
코드 사본은 다음과 같습니다.
module.prototype._use = function (ids, 콜백) {
var uris = resolve (ids, this.uri); // 해상도 [ './a','jquery ']
this._load (uris, function () {// 구문 분석 된 a 및 jQuery 모듈 [url1, url2]의 주소를 호출하고 _load 메소드를 호출하십시오.
//util.map : 모든 데이터 멤버가 한 번에 지정된 기능을 실행하고 원래 배열 멤버의 콜백 실행 결과 인 새 배열을 반환하도록합니다.
var args = util.map (uris, function (uri) {
URI를 반환 하시겠습니까? CachedModules [uri] ._ compile () : null; // URL이 존재하면 _compile 메소드를 호출하십시오.
})
if (Callback) {Callback.apply (null, args)}
})
}
현재 Args = [Module A.Export, Module jQuery.export];
코드 사본은 다음과 같습니다.
seajs.use ([ './ a', 'jquery'], function (a, $) {
var num = aa;
$ ( '#j_a'). 텍스트 (num);
})
현재 함수의 A와 $는 모듈 A.Export 및 모듈 jQuery.export입니다.
나는 지금 jQuery 소스 코드와 jQuery 프레임 워크 설계를 연구하고 있기 때문에 몇 가지 경험을 공유합니다.
jQuery 소스 코드, 온라인으로 많은 분석을 읽었지만 보면 더 이상 읽을 수 없습니다. 그다지 의미가 없으므로 Miaowei Classroom의 JQuery 소스 코드 분석을 권장합니다.
Situ Zhengmei의 JavaScript 프레임 워크 설계는 어렵지만주의 깊게 읽은 후에는 선임 프론트 엔지니어가됩니다.
나는 Yu Bo의 Sea.js를 배우고 사용하는 것이 좋습니다. 결국 그것은 중국인들에 의해 만들어집니다. 회사의 새로운 프로젝트 또는 재건은 SEAJS를 사용하여 수행됩니다.
다음은 모듈 식 핸드 바 및 MVC 백본 또는 MVVM 각도의 소스 코드 집중 판독입니다. 여기서 누군가가 어떤 책, 웹 사이트 및 비디오에 대해 신속하게 배우도록 제안하기를 바랍니다.