Inilah contoh yang lebih konkret.
Saya sedang mengerjakan proyek dengan 60 file. Kami memiliki 2 mode berbeda untuk menjalankannya.
Muat versi yang disatukan, 1 file besar. (Produksi)
Memuat semua 60 file (pengembangan)
Kami menggunakan loader sehingga kami hanya memiliki satu skrip di halaman web
<script src="loader.js"></script>
Itu default ke mode # 1 (memuat satu file besar bersatu). Untuk menjalankan dalam mode # 2 (file terpisah) kami menetapkan beberapa flag. Itu bisa apa saja. Kunci dalam string kueri. Dalam contoh ini kita hanya melakukan ini
<script>useDebugVersion = true;</script>
<script src="loader.js"></script>
loader.js terlihat seperti ini
if (useDebugVersion) {
injectScript("app.js");
injectScript("somelib.js");
injectScript("someotherlib.js");
injectScript("anotherlib.js");
... repeat for 60 files ...
} else {
injectScript("large-concatinated.js");
}
Skrip build hanyalah file .sh yang terlihat seperti ini
cat > large-concantinated.js app.js somelib.js someotherlib.js anotherlib.js
dll ...
Jika file baru ditambahkan, kami kemungkinan akan menggunakan mode # 2 karena kami sedang melakukan pengembangan, kami harus menambahkan injectScript("somenewfile.js")
baris ke loader.js
Kemudian untuk produksi kami juga harus menambahkan somenewfile.js ke skrip build kami. Sebuah langkah yang sering kita lupakan dan kemudian mendapat pesan kesalahan.
Dengan beralih ke AMD kita tidak perlu mengedit 2 file. Masalah menjaga loader.js dan skrip build dalam sinkronisasi hilang. Menggunakan r.js
atau webpack
hanya dapat membaca kode yang akan dibuatlarge-concantinated.js
Itu juga dapat menangani dependensi, misalnya kita memiliki 2 file lib1.js dan lib2.js dimuat seperti ini
injectScript("lib1.js");
injectScript("lib2.js");
lib2 membutuhkan lib1. Ada kode di dalamnya yang berfungsi seperti itu
lib1Api.installPlugin(...);
Tetapi karena skrip yang disuntikkan dimuat secara asinkron, tidak ada jaminan mereka akan memuat dalam urutan yang benar. 2 skrip ini bukan skrip AMD tetapi dengan menggunakan require.js kita dapat mengatakan dependensi mereka
require.config({
paths: {
lib1: './path/to/lib1',
lib2: './path/to/lib2',
},
shim: {
lib1: {
"exports": 'lib1Api',
},
lib2: {
"deps": ["lib1"],
},
}
});
Saya modul kami yang menggunakan lib1 kami melakukan ini
define(['lib1'], function(lib1Api) {
lib1Api.doSomething(...);
});
Sekarang memerlukan.js akan menyuntikkan skrip untuk kami dan itu tidak akan menyuntikkan lib2 sampai lib1 telah dimuat karena kami mengatakan lib2 tergantung pada lib1. Itu juga tidak akan memulai modul kami yang menggunakan lib1 sampai lib2 dan lib1 dimuat.
Ini membuat pengembangan bagus (tidak ada langkah pembangunan, tidak perlu khawatir tentang memuat pesanan) dan itu membuat produksi menyenangkan (tidak perlu memperbarui skrip pembuatan untuk setiap skrip yang ditambahkan).
Sebagai bonus tambahan, kita dapat menggunakan plugin babel webpack untuk menjalankan babel di atas kode untuk browser yang lebih lama dan sekali lagi kita tidak harus mempertahankan script build itu.
Perhatikan bahwa jika Chrome (browser pilihan kami) mulai mendukung import
nyata, kami mungkin akan beralih ke itu untuk pengembangan tetapi itu tidak akan benar-benar mengubah apa pun. Kami masih bisa menggunakan webpack untuk membuat file gabungan dan kami bisa menggunakannya menjalankan babel atas kode untuk semua browser.
Semua ini diperoleh dengan tidak menggunakan tag skrip dan menggunakan AMD