Gabungkan beberapa file JavaScript menjadi satu file JS [ditutup]

91

Saya menggunakan jquery dalam aplikasi web saya dan saya perlu memuat lebih banyak file script jquery ke dalam satu halaman.

Google menyarankan agar saya menggabungkan semua file script jquery menjadi satu file.

Bagaimana saya bisa melakukan ini?

Chandrasekhar
sumber

Jawaban:

53

Di linux Anda dapat menggunakan skrip shell sederhana https://github.com/dfsq/compressJS.sh untuk menggabungkan beberapa file javascript menjadi satu. Itu memanfaatkan layanan online Closure Compiler sehingga skrip yang dihasilkan juga dikompresi secara efektif.

$ ./compressJS.sh some-script.js another-sctipt.js onemore.js
dfsq.dll
sumber
1
bisakah ini bekerja dengan setang?
Dan Baker
3
Lebih baik menggunakan pengelola tugas seperti Grunt, Gulp dan hal-hal lain seperti itu melakukannya secara otomatis. Menggunakan Grunt saya mengkompilasi less, typescript, setang ke dalam folder yang dihasilkan, kemudian saya menyalin file js / css ke folder yang dihasilkan juga, pada akhirnya saya juga mengecilkan menjadi satu file js semua file .js dan menjadi satu file css semua file .css. Dan saya memiliki pengamat yang menjalankan kembali konfigurasi itu pada perubahan file sehingga saya dapat menyimpan file dan menyegarkan browser dan semua perubahan telah diterapkan dalam 1-3 detik.
Vadorequest
18

Cukup gabungkan file teks dan kemudian gunakan sesuatu seperti YUI Compressor .

File dapat dengan mudah digabungkan menggunakan perintah cat *.js > main.jsdan main.js kemudian dapat dijalankan melalui kompresor YUI menggunakan java -jar yuicompressor-x.y.z.jar -o main.min.js main.js.

Perbarui Agustus 2014

Saya sekarang telah bermigrasi untuk menggunakan Gulp untuk penggabungan dan kompresi javascript seperti dengan berbagai plugin dan beberapa konfigurasi minimal Anda dapat melakukan hal-hal seperti mengatur dependensi, menyusun coffeescript dll serta mengompresi JS Anda.

Prydie
sumber
1
Memperbaiki @dibentuk.
Prydie
11

Anda dapat melakukannya melalui

  • Sebuah. Secara manual: salin semua file Javascript menjadi satu, jalankan kompresor di atasnya ( opsional tetapi disarankan ) dan unggah ke server dan tautkan ke file itu.
  • b. Gunakan PHP: Buat saja sebuah array dari semua file JS dan includesemuanya dan output menjadi sebuah <script>tag
Gary Green
sumber
1
Opsi B tidak disarankan karena ini menyebabkan browser Anda membuat banyak permintaan untuk semua file .js individual kecil (lambat) daripada hanya satu permintaan untuk file .js yang lebih besar (lebih cepat).
Mikepote
5
@Mikepote, ya ... maka saya menggunakan kata includeyaitu jangan lakukan <script src = "...."> menautkan ke banyak file, cukup masukkan ke dalam satu elemen skrip. Idealnya cdn bersama dengan caching yang tepat harus digunakan.
Gary Green
Ah maaf, saya salah membaca jawaban Anda.
Mikepote
3
Bisakah Anda memberikan beberapa contoh di sini.
Anand Solanki
Lebih baik menggunakan readfile () untuk menghindari overhead penguraian dan secara tidak sengaja menafsirkan sesuatu.
Chinoto Vokro
9

Saya biasanya memilikinya di Makefile:

# All .js compiled into a single one.
compiled=./path/of/js/main.js

compile:
    @find ./path/of/js -type f -name "*.js" | xargs cat > $(compiled)

Kemudian Anda lari:

make compile

Saya harap ini membantu.


sumber
8

Saya menggunakan skrip shell ini di Linux https://github.com/eloone/mergejs .

Dibandingkan dengan skrip di atas, skrip ini memiliki kelebihan karena sangat mudah digunakan, dan nilai tambahnya adalah Anda dapat mencantumkan file js yang ingin Anda gabungkan dalam file teks masukan dan bukan di baris perintah, sehingga daftar Anda dapat digunakan kembali dan Anda tidak perlu mengetiknya setiap kali ingin menggabungkan file Anda. Ini sangat berguna karena Anda akan mengulangi langkah ini setiap kali Anda ingin masuk ke produksi. Anda juga dapat mengomentari file yang tidak ingin Anda gabungkan dalam daftar. Baris perintah yang kemungkinan besar akan Anda ketik adalah:

$ mergejs js_files_list.txt output.js

Dan jika Anda ingin juga mengompres file gabungan yang dihasilkan:

$ mergejs -c js_files_list.txt output.js

Ini akan membuat output-min.jsdikecilkan oleh kompiler penutupan Google. Atau :

$ mergejs -c js_files_list.txt output.js output.minified.js

Jika Anda menginginkan nama tertentu untuk file yang diperkecil bernama output.minified.js

Saya merasa sangat membantu untuk situs web sederhana.

eloone
sumber
7

Pengelompokan skrip kontraproduktif, Anda harus memuatnya secara paralel menggunakan sesuatu seperti http://yepnopejs.com/ atau http://headjs.com

Kapsul
sumber
5
Ada alasan yang valid untuk menggabungkan file javascript. Pertama, sangat mungkin meminta 20 file 2kb akan memakan waktu lebih lama daripada meminta satu file 40 kb.
Joel B
1
Yang terjadi berapa kali per milenium?
Kapsul
4
Lebih sering dari yang Anda pikirkan. Lihat bahkan kode sumber untuk stackoverflow: "... Opsi B tidak disarankan karena ini menyebabkan browser Anda membuat banyak permintaan untuk semua file .js individual kecil (lambat) daripada hanya satu permintaan untuk .js yang lebih besar file (lebih cepat). "
Joel B
4
@Capsule Saya benci memberi tahu Anda, tetapi internet dengan cepat berpindah dari jQuery ke MVC JavaScript, memuat satu file akan selalu lebih cepat daripada menjalankan beberapa permintaan HTTP.
Foxhoundn
1
@Foxhoundn internet juga dengan cepat berpindah ke HTTP2 jadi tidak masalah lagi. Bagaimanapun, jQuery hanyalah sebuah contoh, Anda dapat menghadapi masalah yang sama persis dengan MVC JS
Capsule
7

Salin skrip ini ke notepad dan simpan sebagai file .vbs. Seret & Jatuhkan file .js pada skrip ini.

ps. Ini hanya akan berfungsi di windows.

set objArgs = Wscript.Arguments
set objFso = CreateObject("Scripting.FileSystemObject")
content = ""

'Iterate through all the arguments passed
for i = 0 to objArgs.count  
    on error resume next
    'Try and treat the argument like a folder
    Set folder = objFso.GetFolder(objArgs(i))
    'If we get an error, we know it is a file
    if err.number <> 0 then
        'This is not a folder, treat as file
        content = content & ReadFile(objArgs(i))
    else
        'No error? This is a folder, process accordingly
        for each file in folder.Files
            content = content & ReadFile(file.path)
        next
    end if
    on error goto 0
next

'Get system Temp folder path
set tempFolderPath = objFso.GetSpecialFolder(2)
'Generate a random filename to use for a temporary file
strTempFileName = objFso.GetTempName
'Create temporary file in Temp folder
set objTempFile = tempFolderPath.CreateTextFile(strTempFileName)
'Write content from JavaScript files to temporary file
objTempFile.WriteLine(content)
objTempFile.Close

'Open temporary file in Notepad
set objShell = CreateObject("WScript.Shell")
objShell.Run("Notepad.exe " & tempFolderPath & "\" & strTempFileName)


function ReadFile(strFilePath)
    'If file path ends with ".js", we know it is JavaScript file
    if Right(strFilePath, 3) = ".js" then       
        set objFile = objFso.OpenTextFile(strFilePath, 1, false)
        'Read entire contents of a JavaScript file and returns it as a string
        ReadFile = objFile.ReadAll & vbNewLine
        objFile.Close
    else
        'Return empty string
        ReadFile = ""
    end if  
end function
SasHok.Tk
sumber
5

Anda dapat menggunakan Closure-compiler seperti yang disarankan oleh orangutan. Perlu diketahui bahwa Anda tidak benar-benar perlu mengkompilasi / mengecilkan JavaScript, seharusnya mungkin untuk hanya menggabungkan file teks JavaScript ke dalam satu file teks. Cukup gabungkan mereka dalam urutan yang biasanya mereka masukkan dalam laman.

Jim Blackler
sumber
Ya, poin yang bagus. Kompiler closure bisa jadi rumit jika Anda atau pembuat plugin tidak mengikuti sintaks yang baik, atau jika Anda mencoba men-debug. Tetapi jika Anda menggunakannya dalam mode paling dasar, ini dapat membantu. Saya pribadi sangat menyukai Dojo dan menggunakan sistem build mereka dengan proyek dojo, sangat membantu untuk menyimpan semuanya dalam satu file. Tapi ini hanya berguna untuk penyebaran, bukan untuk pengembangan.
Tom Gruner
4

Jika Anda menjalankan PHP, saya merekomendasikan Minify karena itu menggabungkan dan meminimalkan dengan cepat untuk CSS dan JS. Setelah Anda mengonfigurasinya, bekerjalah seperti biasa dan itu akan menangani semuanya.

technoTarek
sumber
4

Anda dapat menggunakan KjsCompiler: https://github.com/knyga/kjscompiler Manajemen ketergantungan keren

Oleksandr Knyga
sumber
Saya telah mencari alat seperti ini selama berjam-jam tetapi akhirnya ini bekerja persis seperti yang saya bayangkan seharusnya berhasil. Sederhana dan mudah.
Gergely Kovács
2

Anda bisa menggunakan script yang saya buat. Anda membutuhkan JRuby untuk menjalankan ini. https://bitbucket.org/ardee_aram/jscombiner (JSCombiner).

Yang membedakannya adalah ia melihat perubahan file di javascript, dan menggabungkannya secara otomatis ke skrip pilihan Anda. Jadi tidak perlu "membangun" javascript Anda secara manual setiap kali Anda mengujinya. Semoga membantu Anda, saya sedang menggunakan ini.

Ardee Aram
sumber
0

Ini mungkin sedikit usaha tetapi Anda dapat mengunduh proyek wiki sumber terbuka saya dari codeplex:

http://shuttlewiki.codeplex.com

Ini berisi proyek CompressJavascript (dan CompressCSS) yang menggunakan proyek http://yuicompressor.codeplex.com/ .

Kode harus cukup jelas tetapi itu membuat menggabungkan dan mengompresi file sedikit lebih sederhana --- untuk saya sih :)

Proyek ShuttleWiki menunjukkan bagaimana menggunakannya dalam acara pasca-pembangunan.

Eben Roux
sumber