Birden çok JavaScript dosyasını tek bir JS dosyasında birleştirin [kapalı]


92

Web uygulamamda jquery kullanıyorum ve tek bir sayfaya daha fazla jquery komut dosyası yüklemem gerekiyor.

Google, tüm jquery komut dosyalarını tek bir dosyada birleştirmemi önerdi.

Bunu nasıl yapabilirim?

Yanıtlar:


53

Linux'ta , birden çok javascript dosyasını tek bir dosyada birleştirmek için https://github.com/dfsq/compressJS.sh basit bir kabuk komut dosyasını kullanabilirsiniz . Closure Compiler çevrimiçi hizmetini kullanır, böylece ortaya çıkan komut dosyası da etkili bir şekilde sıkıştırılır.

$ ./compressJS.sh some-script.js another-sctipt.js onemore.js

1
bu gidonlarla çalışabilir mi?
Dan Baker

3
Grunt, Gulp gibi bir görev yöneticisi ve bunun gibi diğer şeyler bunu otomatik olarak yapmak daha iyidir. Grunt kullanarak daha az, typcript, gidonlarımı oluşturulan bir klasöre derlerim, ardından js / css dosyalarını oluşturulan klasöre de kopyalarım, sonunda tüm .js dosyalarını tek bir js dosyasına ve tek bir css dosyasına küçültürüm tüm .css dosyaları. Ve bir dosyayı kaydedip tarayıcıyı yenileyebilmek için dosya değişikliğinde bu yapılandırmayı yeniden çalıştıran bir izleyicim var ve tüm değişiklikler 1-3 saniye içinde uygulandı.
Vadorequest


18

Metin dosyalarını birleştirin ve ardından YUI Compressor gibi bir şey kullanın .

Dosyalar, komut kullanılarak kolayca birleştirilebilir cat *.js > main.jsve daha sonra main.js, kullanılarak YUI sıkıştırıcı aracılığıyla çalıştırılabilir java -jar yuicompressor-x.y.z.jar -o main.min.js main.js.

Ağustos 2014 Güncellemesi

Şimdi , çeşitli eklentilerde olduğu gibi javascript birleştirme ve sıkıştırma için Gulp kullanmaya başladım ve bazı minimum yapılandırmalarda, bağımlılıklar kurmak, kahve komut dosyası derlemek vb. Gibi şeyleri yapabilir ve JS'nizi sıkıştırabilirsiniz.


1
@Reformed düzeltildi.
Prydie

11

Bunu şu yolla yapabilirsiniz:

  • a. Manuel olarak: tüm Javascript dosyalarını tek bir dosyaya kopyalayın, üzerinde bir sıkıştırıcı çalıştırın ( isteğe bağlı ancak önerilir ) ve sunucuya yükleyin ve bu dosyaya bağlantı verin.
  • b. PHP'yi kullanın: Tüm JS dosyalarının ve hepsinin bir dizisini oluşturun includeve bir <script>etikete çıktı alın

1
Seçenek B, tarayıcınızın daha büyük bir .js dosyası için tek bir istek (daha hızlı) yerine tüm küçük tek tek .js dosyaları için (yavaş) birçok istekte bulunmasına neden olduğu için önerilmez.
Mikepote

5
@Mikepote, evet ... bu yüzden kelimesini kullandım includeyani <script src = "...."> birden fazla dosyaya bağlanma, sadece onları bir komut dosyası öğesine ekleyin. İdeal olarak, uygun önbelleğe alma ile birlikte bir cdn kullanılmalıdır.
Gary Green

Ah pardon, cevabınızı yanlış anladım.
Mikepote

3
Burada bir örnek verebilir misiniz?
Anand Solanki

Ayrıştırma ek yükünden kaçınmak ve yanlışlıkla bir şeyin yorumlanmasını önlemek için readfile () kullanmak daha iyidir.
Chinoto Vokro

9

Genelde şuna sahip olurum 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)

Sonra koşarsın:

make compile

Umut ediyorum bu yardım eder.


8

Bu kabuk komut dosyasını Linux'ta https://github.com/eloone/mergejs kullanıyorum .

Yukarıdaki komut dosyalarıyla karşılaştırıldığında, kullanımının çok basit olma avantajlarına sahiptir ve büyük bir artı, birleştirmek istediğiniz js dosyalarını komut satırında değil, bir girdi metin dosyasında listeleyebilmenizdir, böylece listeniz yeniden kullanılabilir ve dosyalarınızı her birleştirmek istediğinizde yazmak zorunda değilsiniz. Üretime her adım atmak istediğinizde bu adımı tekrar edeceğiniz için çok kullanışlıdır. Listede birleştirmek istemediğiniz dosyalara da yorum yapabilirsiniz. Büyük olasılıkla yazacağınız komut satırı şudur:

$ mergejs js_files_list.txt output.js

Ve sonuçta ortaya çıkan birleştirilmiş dosyayı da sıkıştırmak istiyorsanız:

$ mergejs -c js_files_list.txt output.js

Bu, output-min.jsGoogle'ın kapanış derleyicisi tarafından küçültülmüş oluşturacaktır . Veya:

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

Küçültülmüş dosyanız için belirli bir ad istiyorsanız output.minified.js

Basit bir web sitesi için gerçekten yararlı buluyorum.


7

Komut dosyası gruplaması verimsizdir, bunları http://yepnopejs.com/ veya http://headjs.com gibi bir şey kullanarak paralel olarak yüklemelisiniz.


5
JavaScript dosyalarını birleştirmenin geçerli nedenleri vardır. Birincisi, 20 adet 2kb dosya istemek, 40 kb'lik bir dosya istemekten daha uzun sürebilir.
Joel B

1
Hangi milenyumda kaç kez olur?
Kapsül

4
Sandığınızdan daha sık. Stackoverflow için kaynak koduna bile bir göz atın: "... B Seçeneği, tarayıcınızın daha büyük .js için tek bir istek yerine tüm küçük bireysel .js dosyaları (yavaş) için birçok istekte bulunmasına neden olduğundan önerilmez. dosya (daha hızlı). "
Joel B

4
@Capsule Söylemekten nefret ediyorum, ancak internet hızla jQuery'den MVC JavaScript'e geçiyor, bir dosyanın yüklenmesi her zaman birden fazla HTTP isteğini ateşlemekten daha hızlı olacaktır.
Foxhoundn

1
@Foxhoundn internet de hızla HTTP2'ye geçiyor, bu yüzden artık gerçekten önemli olmayacak. Her neyse, jQuery sadece bir örnekti, MVC JS
Capsule

7

Bu komut dosyasını not defterine kopyalayın ve .vbs dosyası olarak kaydedin. .Js dosyalarını bu komut dosyasına sürükleyip bırakın.

ps. Bu yalnızca pencerelerde çalışacaktır.

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

5

Closure-derleyiciyi orangutancloud'un önerdiği gibi kullanabilirsiniz. Aslında JavaScript'i derlemenize / küçültmenize gerek olmadığını , JavaScript metin dosyalarını tek bir metin dosyasına birleştirmenin mümkün olması gerektiğini belirtmekte fayda var. Normalde sayfaya dahil edildikleri sırayla onlara katılın.


Evet, iyi nokta. Kapatma derleyicisi, siz veya eklenti yazarları iyi sözdizimine uymuyorsa veya hata ayıklamaya çalışıyorsanız yanıltıcı olabilir. Ancak, en temel modda kullanırsanız, yardımcı olabilir. Ben şahsen Dojo'yu çok seviyorum ve derleme sistemlerini dojo projelerinde kullanıyorum, her şeyi tek bir dosyada tutmak gerçekten yardımcı oluyor. Ancak geliştirme için değil, yalnızca dağıtım için yararlıdır.
Tom Gruner

4

PHP çalıştırıyorsanız, tavsiye küçültmek o CSS ve JS ikisi için anında birleştirir ve küçültür yapar çünkü. Bir kez yapılandırdıktan sonra, normal şekilde çalışın ve her şeyi halledin.



2

Yaptığım bir senaryoyu kullanabilirsiniz. Bunu çalıştırmak için JRuby'ye ihtiyacınız var. https://bitbucket.org/ardee_aram/jscombiner (JSCombiner).

Bunu diğerlerinden ayıran şey, javascript'teki dosya değişikliklerini izlemesi ve otomatik olarak seçtiğiniz komut dosyasıyla birleştirmesidir. Dolayısıyla, her test ettiğinizde javascript'inizi elle "oluşturmanıza" gerek yoktur. Umarım size yardımcı olur, şu anda bunu kullanıyorum.


0

Bu biraz çaba gerektirebilir ancak açık kaynaklı wiki projemi codeplex'ten indirebilirsiniz:

http://shuttlewiki.codeplex.com

Http://yuicompressor.codeplex.com/ projesini kullanan bir CompressJavascript projesi (ve CompressCSS) içerir .

Kod kendinden açıklamalı olmalı, ancak dosyaları birleştirmeyi ve sıkıştırmayı biraz kolaylaştırıyor --- yine de benim için :)

ShuttleWiki projesi, inşa sonrası olayda nasıl kullanılacağını gösterir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.