Rumah  >  Artikel  >  hujung hadapan web  >  Penerokaan mendalam tentang kaedah modularisasi dan pemuatan seajs_Seajs

Penerokaan mendalam tentang kaedah modularisasi dan pemuatan seajs_Seajs

WBOY
WBOYasal
2016-05-16 16:04:21914semak imbas

Sejak saya menggunakannya, saya belajar tentang kod sumber seajs. Inilah pemahaman saya tentang soalan berikut:

1. Bagaimanakah kaedah seajs memerlukan(XXX) melaksanakan pemuatan modul?

2. Mengapa anda perlu pramuat?

3. Mengapa anda memerlukan alat binaan?

4. Apakah perbezaan antara kod sebelum dan selepas membina, dan mengapa anda melakukan ini?

Soalan 1: Bagaimanakah kaedah memerlukan(XXX) seajs melaksanakan pemuatan modul?

Logik kod agak berbelit-belit Pemahaman tentang kod sumber diletakkan pada akhir artikel Di sini kami menyemak secara ringkas logik pemuatan modul:

1. Dari entri kaedah seajs.use, mula memuatkan modul yang digunakan.

2. Modul yang digunakan mestilah tidak wujud dalam cache mod pada masa ini. seajs mencipta mod baharu dan memberikannya beberapa status awal.

3. Jalankan kaedah mod.load

4. Selepas banyak logik, pergi ke kaedah seajs.request dan minta fail modul. Selepas modul dimuatkan, kaedah define dilaksanakan.

5. Kaedah takrifan menganalisis dan mengekstrak modul bergantung modul dan menyimpannya. Kilang dicache tetapi tidak dilaksanakan.

6. Modul bergantung modul dimuatkan semula Jika masih terdapat modul bergantung, pemuatan diteruskan. Sehingga semua modul bergantung dimuatkan.

7. Selepas semua modul dimuatkan, laksanakan panggilan balik kaedah penggunaan.

8. Logik dalaman modul dilaksanakan daripada panggilan balik. Kaedah memerlukan hanya dilaksanakan semasa proses ini.

Soalan 2: Mengapa pramuat diperlukan?

Kami melihat bahawa kaedah seajs.use sebenarnya melaksanakan panggilan balik selepas semua modul bergantung telah dimuatkan. Dapat difahami bahawa sebelum kod logik perniagaan dilaksanakan, semua kod modul bergantung mesti dimuatkan terlebih dahulu. Jadi mengapa ada logik sedemikian yang mesti dimuatkan terlebih dahulu?

Jawapannya terletak pada kaedah pelaksanaan kaedah memerlukan yang merujuk kaedah modul lain dalam kod logik:

var mod = memerlukan(id);

Sintaks ini menentukan bahawa pemerolehan mod adalah proses pelaksanaan segerak Jika kod modul belum dimuatkan sebelum ini, ia hanya boleh dilaksanakan menggunakan kaedah panggil balik pemuatan asynchronous, maka keseluruhan logik pelaksanaan seajs akan menjadi sepenuhnya. sesuatu yang lain. Kerana asynchrony, anda tidak akan memahami susunan pelaksanaan modul, dan logik akan menjadi sukar untuk dikawal.

Soalan 3: Mengapa anda memerlukan alat binaan?

Anda dapat melihat bahawa setiap modul bergantung dimuatkan secara berasingan sebelum membina. Ini akan menjana terlalu banyak permintaan modul, yang memudaratkan prestasi pemuatan halaman. Alat binaan pada asasnya direka untuk menyelesaikan masalah pemuatan modul gabungan.

Soalan 4: Apakah perbezaan antara kod sebelum dan selepas membina, dan mengapa kita melakukan ini?

Apakah sebenarnya yang dilakukan oleh alat binaan. Kami mengatakan bahawa ia pada asasnya untuk menyelesaikan masalah pemuatan gabungan kod, jadi apa yang dilakukannya hanyalah menggabungkan pelbagai fail modul ke dalam satu fail?

Sudah tentu tidak. Ujinya jika anda hanya menggabungkan beberapa fail modul ke dalam satu fail, anda akan mendapati bahawa fail ini tidak boleh dilaksanakan seperti biasa.

Alasannya terletak pada pelaksanaan kaedah define.

Seajs mengesyorkan hanya menghantar parameter kilang dalam kaedah define semasa menentukan modul. Melihat kembali kaedah tentukan, apabila tiada id (sementara bersamaan dengan url modul) dihantar, kaedah getCurrentScript() akan digunakan untuk mendapatkan laluan url fail modul yang sedang dilaksanakan, dan kemudian laluan ini akan digunakan sebagai nilai kunci bersama-sama dengan modul itu sendiri untuk cachedMods. Perkara utama di sini ialah mekanisme caching modul dalam keseluruhan seajs sebenarnya bergantung pada URL setiap modul sebagai kunci cache. Kaedah require(id) akhirnya datang melalui nilai kunci url. Kaedah require(id) akhirnya menggunakan nilai kunci URL untuk mencari modul yang sepadan dalam cachedMods. Nilai utama ini tidak boleh diulang dan tidak boleh membuat kesilapan, jika tidak, hubungan yang sepadan antara modul akan keliru. Jika beberapa fail modul a, b, dan c hanya digabungkan ke dalam fail sasaran x, getCurrentScript() hanya boleh mendapatkan laluan x, dan nilai utama ketiga-tiga modul tidak dapat dibezakan, dan pelaksanaan pasti akan pergi salah.

Jadi, jika anda ingin menggabungkan beberapa fail modul bersama-sama, anda mesti menentukan uri untuk setiap modul. Iaitu, kaedah define mesti lulus dalam parameter id. Apabila id dihantar masuk, seajs akan menukar id menjadi url dan menggunakannya sebagai kunci cache.

Jika hanya id dan kilang diluluskan, iaitu, define(id, factory), maka deps = undefined, kaedah define akan melaksanakan kaedah parseDependencies(factory.toString()) untuk mengekstrak modul bergantung dalam kilang, dan kemudian ia akan pergi ke Parse laluan modul dan memuatkan logik setiap modul secara berasingan dalam talian Pada masa ini, maksud pemuatan gabungan hilang.

Jadi untuk pemuatan gabungan, kaedah define mesti lulus dengan betul dalam tiga parameter id, deps dan kilang untuk dilaksanakan dengan betul.

Kaedah definisi modul CMD Seajs menggalakkan semua orang untuk melepasi hanya satu parameter, kilang, semasa fasa penulisan modul dan dua parameter lain dijana dalam fasa pembinaan kod kemudian. Di atas menerangkan mengapa kedua-dua parameter ini diperlukan selepas pembinaan.

Mengenai mengapa disyorkan untuk hanya lulus kilang semasa menentukan modul, saya fikir ia adalah terutamanya kerana parameter id dan deps yang dihantar secara manual sangat terdedah kepada ralat dan menyusahkan untuk diselenggara. Alat boleh meningkatkan kecekapan dan memastikan parameter yang betul.

Lampiran: Pemahaman tentang logik kod utama seajs.

Nota: Versi kod sumber ialah Sea.js 2.3.0

1. Mari kita lihat dahulu apa yang dilakukan oleh kaedah define

Module.define = fungsi (id, deps, kilang)

Kaedah define menyokong tiga parameter. Antaranya, id dan deps adalah pilihan. kilang diperlukan. Kod dikawal oleh logik berikut:

Tetapi deps sebenarnya perlu, kerana seajs mesti tahu modul mana setiap modul bergantung, jika tidak, ia tidak boleh dimuatkan.

Jadi, apabila kilang adalah fungsi dan deps tidak dihantar secara aktif, anda perlu menggunakan kaedah parseDependencies untuk menganalisis modul bergantung di kilang.

Perkara utama yang dilakukan oleh kaedah parseDependencies ialah menggunakan ungkapan biasa untuk mengekstrak XXX dalam semua keperluan(XXX) dalam badan fungsi Ini adalah semua modul yang bergantung pada fungsi ini.

Kaedah itu sendiri tidak rumit, tetapi ungkapan biasa ini tidak mudah:

Selepas menganalisis deps, simpan definisi modul dalam cache:

Perhatikan bahawa kami akan mendapati bahawa kaedah define hanya menganalisis modul dan menyimpan modul, dan tidak melaksanakan modul.

2. Pelaksanaan sebenar modul adalah dalam kaedah yang diperlukan. Mari lihat keperluan seterusnya.

Ringkasnya, kaedah yang diperlukan adalah untuk mencari modul yang sepadan dalam cache modul di mana definisi definisi disimpan berdasarkan id, dan laksanakannya untuk mendapatkan kaedah yang dikembalikan oleh definisi modul:

Dalam keseluruhan langkah besar ini, terdapat langkah yang sangat kritikal yang perlu dijelaskan secara terperinci:

Module.get(require.resolve(id)).

Apabila memerlukan modul, anda mesti mencari modul terlebih dahulu. Kaedah Module.get memainkan peranan ini.

Jika tiada cachedMods, buat Modul baharu dan cache dalam cachedMods:

Kaedah define dan rquire nampaknya tidak rumit. Sebab utama seajs ialah logik pemuatan modul agak rumit.

3. Titik masuk sebenar untuk pelaksanaan seajs ialah kaedah penggunaan:

Melalui kaedah penggunaan, pemuatan dan pelaksanaan modul dicetuskan bermula dari id di sini.

Anda dapat melihat bahawa titik utama pemuatan adalah dalam kaedah mod.load.

Kod kaedah muat agak panjang Logik utama adalah untuk menentukan sama ada status semasa mod dimuatkan atau dimuatkan.

Dalam fungsi keselesaan Modul, kita dapat melihat bahawa nilai lalai status ialah 0.

Jadi modul baharu yang belum dimuatkan ada di sini: mod.status = STATUS.LOADING Status ditetapkan kepada pemuatan, dan logik pemuatan seterusnya dilaksanakan.

Langkah seterusnya ialah mendapatkan url pergantungan modul

kaedah mod.resolve:

Kaedah Module.resolve pada asasnya menukar laluan relatif, laluan yang dikonfigurasikan, alias, dll. kepada laluan mutlak. Tiada lagi kod disiarkan.

Kemas kini status pemuatan modul.

Logik untuk memuatkan modul:

Terutamanya kaedah m.fetch, logik lain di dalamnya dilangkau di sini.

Sie können sehen, dass seajs.request schließlich die Moduldatei lädt:

Nachdem alle abhängigen Module geladen wurden, führen Sie die Onload-Methode des Mods aus

Hier ist die mod.onload()-Methode

An diesem Punkt haben Sie fast die Kernlogik von Seajs gesehen. Als Referenz: Wenn Sie ein unklares Verständnis oder einen ungenauen Ausdruck haben, können Sie dies gerne gemeinsam besprechen.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn