รวมไฟล์ JavaScript หลายไฟล์ไว้ในไฟล์ JS เดียว [ปิด]


95

ฉันใช้ jquery ในเว็บแอปพลิเคชันของฉันและฉันต้องการโหลดไฟล์สคริปต์ jquery เพิ่มเติมในหน้าเดียว

Google แนะนำให้ฉันรวมไฟล์สคริปต์ jquery ทั้งหมดไว้ในไฟล์เดียว

ฉันจะทำเช่นนี้ได้อย่างไร?

คำตอบ:


53

บน linux คุณสามารถใช้เชลล์สคริปต์อย่างง่ายhttps://github.com/dfsq/compressJS.shเพื่อรวมไฟล์ javascript หลายไฟล์ไว้ในไฟล์เดียว มันใช้บริการออนไลน์ของ Closure Compiler ดังนั้นสคริปต์ผลลัพธ์จึงถูกบีบอัดอย่างมีประสิทธิภาพ

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

1
มันใช้แฮนด์บาร์ได้ไหม
Dan Baker

3
ควรใช้ตัวจัดการงานเช่น Grunt, Gulp และสิ่งอื่น ๆ เช่นนั้นโดยอัตโนมัติ การใช้ Grunt ฉันรวบรวม less, typescript, handlebars ของฉันลงในโฟลเดอร์ที่สร้างขึ้นจากนั้นฉันคัดลอกไฟล์ js / css ไปยังโฟลเดอร์ที่สร้างขึ้นเช่นกันในท้ายที่สุดฉันยังย่อขนาดเป็นไฟล์ js ไฟล์. js ทั้งหมดและเป็นไฟล์ css เดียว ไฟล์. css ทั้งหมด และฉันมีผู้เฝ้าดูเรียกใช้การกำหนดค่านั้นใหม่ในการเปลี่ยนแปลงไฟล์เพื่อให้ฉันสามารถบันทึกไฟล์และรีเฟรชเบราว์เซอร์และการเปลี่ยนแปลงทั้งหมดจะถูกนำไปใช้ภายใน 1-3 วินาที
Vadorequest


18

เพียงแค่รวมไฟล์ข้อความแล้วใช้สิ่งที่ต้องการYUI คอมเพรสเซอร์

ไฟล์สามารถรวมกันได้อย่างง่ายดายโดยใช้คำสั่งcat *.js > main.jsและ main.js สามารถเรียกใช้ผ่านคอมเพรสเซอร์ YUI โดยใช้ไฟล์java -jar yuicompressor-x.y.z.jar -o main.min.js main.js.

อัปเดต ส.ค. 2557

ตอนนี้ฉันได้ย้ายไปใช้Gulpสำหรับการต่อและการบีบอัดจาวาสคริปต์เช่นเดียวกับปลั๊กอินต่างๆและการกำหนดค่าขั้นต่ำบางอย่างที่คุณสามารถทำได้เช่นตั้งค่าการอ้างอิงรวบรวมกาแฟ ฯลฯ รวมถึงการบีบอัด JS ของคุณ


1
แก้ไข @reformed
Prydie

11

คุณสามารถทำได้ผ่านทาง

  • ก. ด้วยตนเอง:คัดลอกไฟล์ Javascript ทั้งหมดเป็นไฟล์เดียวเรียกใช้ Compressor บนไฟล์ ( ทางเลือก แต่แนะนำ ) และอัปโหลดไปยังเซิร์ฟเวอร์และลิงก์ไปยังไฟล์นั้น
  • ข. ใช้ PHP:เพียงแค่สร้างอาร์เรย์ของไฟล์ JS ทั้งหมดและไฟล์includeทั้งหมดและส่งออกเป็น<script>แท็ก

1
ไม่แนะนำให้ใช้ตัวเลือก B เนื่องจากเบราว์เซอร์ของคุณส่งคำขอจำนวนมากสำหรับไฟล์. js ขนาดเล็กทั้งหมด (ช้า) แทนที่จะขอไฟล์. js ที่ใหญ่กว่าเพียงครั้งเดียว (เร็วกว่า)
Mikepote

5
@ Mikepote ใช่ ... ด้วยเหตุนี้ฉันจึงใช้คำว่าincludeคืออย่า <script src = ".... "> ลิงก์ไปยังไฟล์หลายไฟล์เพียงแค่รวมไว้ในองค์ประกอบสคริปต์เดียว ควรใช้ cdn พร้อมกับการแคชที่เหมาะสม
Gary Green

ขออภัยฉันอ่านคำตอบของคุณผิด
Mikepote

3
คุณช่วยยกตัวอย่างที่นี่ได้ไหม
Anand Solanki

ควรใช้ readfile () เพื่อหลีกเลี่ยงค่าใช้จ่ายในการแยกวิเคราะห์และการตีความบางอย่างโดยบังเอิญ
Chinoto Vokro

9

ฉันมักจะมีมันใน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)

จากนั้นคุณเรียกใช้:

make compile

ฉันหวังว่ามันจะช่วยได้


8

ผมใช้เชลล์สคริปต์นี้บน Linux https://github.com/eloone/mergejs

เมื่อเทียบกับสคริปต์ข้างต้นมันมีข้อดีของการใช้งานง่ายมากและข้อดีอย่างมากคือคุณสามารถแสดงรายการไฟล์ js ที่คุณต้องการรวมในไฟล์ข้อความอินพุตและไม่อยู่ในบรรทัดคำสั่งดังนั้นรายการของคุณจึงสามารถนำมาใช้ซ้ำได้และ คุณไม่จำเป็นต้องพิมพ์ทุกครั้งที่คุณต้องการรวมไฟล์ของคุณ มีประโยชน์มากเนื่องจากคุณจะทำขั้นตอนนี้ซ้ำทุกครั้งที่ต้องการผลักดันสู่การผลิต คุณยังสามารถแสดงความคิดเห็นไฟล์ที่คุณไม่ต้องการรวมในรายการได้ บรรทัดคำสั่งที่คุณมักจะพิมพ์คือ:

$ mergejs js_files_list.txt output.js

และถ้าคุณต้องการบีบอัดไฟล์ที่ผสานด้วย:

$ mergejs -c js_files_list.txt output.js

สิ่งนี้จะสร้างoutput-min.jsย่อโดยคอมไพเลอร์การปิดของ Google หรือ :

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

หากคุณต้องการชื่อเฉพาะสำหรับไฟล์ที่ย่อขนาดของคุณชื่อ output.minified.js

ฉันคิดว่ามันมีประโยชน์มากสำหรับเว็บไซต์ง่ายๆ


8

คัดลอกสคริปต์นี้ไปยัง notepad และบันทึกเป็นไฟล์. vbs ลากและวางไฟล์. js บนสคริปต์นี้

ปล. สิ่งนี้จะใช้ได้กับ 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

7

การจัดกลุ่มสคริปต์เป็นการต่อต้านคุณควรโหลดพร้อมกันโดยใช้สิ่งต่างๆเช่นhttp://yepnopejs.com/หรือhttp://headjs.com


5
มีเหตุผลที่ถูกต้องสำหรับการรวมไฟล์จาวาสคริปต์ ประการแรกค่อนข้างเป็นไปได้ว่าการขอไฟล์ 2kb 20 ไฟล์จะใช้เวลานานกว่าการขอไฟล์ 40 kb หนึ่งไฟล์
Joel B

1
ซึ่งจะเกิดขึ้นกี่ครั้งต่อพันปี?
แคปซูล

4
บ่อยกว่าที่คุณคิด ดูแม้แต่ซอร์สโค้ดสำหรับ stackoverflow: "... ไม่แนะนำให้ใช้ตัวเลือก B เนื่องจากเบราว์เซอร์ของคุณส่งคำขอจำนวนมากสำหรับไฟล์. js ขนาดเล็กทั้งหมด (ช้า) แทนที่จะเป็นคำขอเดียวสำหรับ. js ที่ใหญ่กว่า ไฟล์ (เร็วกว่า) "
Joel B

4
@Capsule ฉันเกลียดที่จะบอกคุณ แต่อินเทอร์เน็ตกำลังเปลี่ยนจาก jQuery เป็น MVC JavaScript อย่างรวดเร็วการโหลดไฟล์เดียวจะเร็วกว่าการส่งคำขอ HTTP หลายรายการ
Foxhoundn

1
@Foxhoundn อินเทอร์เน็ตกำลังย้ายไปที่ HTTP2 อย่างรวดเร็วดังนั้นมันจะไม่สำคัญอีกต่อไป อย่างไรก็ตาม jQuery เป็นเพียงตัวอย่างคุณสามารถเผชิญกับปัญหาเดียวกันกับ MVC JS
Capsule

5

คุณสามารถใช้ Closure-compiler ตามที่ orangutancloud แนะนำ เป็นสิ่งที่ควรค่าแก่การชี้ให้เห็นว่าคุณไม่จำเป็นต้องคอมไพล์ / ย่อขนาด JavaScript แต่ควรเป็นไปได้ที่จะเชื่อมต่อไฟล์ข้อความ JavaScript ลงในไฟล์ข้อความเดียว เพียงเข้าร่วมตามลำดับที่รวมอยู่ในเพจตามปกติ


ใช่จุดที่ดี คอมไพเลอร์การปิดอาจเป็นเรื่องยุ่งยากหากคุณหรือผู้เขียนปลั๊กอินไม่ได้ใช้ไวยากรณ์ที่ดีหรือหากคุณกำลังพยายามดีบัก แต่ถ้าคุณใช้ในโหมดพื้นฐานที่สุดก็จะมีประโยชน์ โดยส่วนตัวแล้วฉันชอบ Dojo มากและใช้ระบบ build กับโปรเจ็กต์ dojo มันช่วยเก็บทุกอย่างไว้ในไฟล์เดียว แต่มีประโยชน์สำหรับการปรับใช้เท่านั้นไม่ใช่เพื่อการพัฒนา
Tom Gruner

4

หากคุณใช้ PHP ฉันขอแนะนำให้Minifyเพราะมันรวมและย่อขนาดได้ทันทีสำหรับทั้ง CSS และ JS เมื่อคุณกำหนดค่าแล้วให้ทำงานตามปกติและดูแลทุกอย่าง



2

คุณสามารถใช้สคริปต์ที่ฉันสร้างขึ้น คุณต้องใช้ JRuby เพื่อเรียกใช้สิ่งนี้ https://bitbucket.org/ardee_aram/jscombiner (JSCombiner)

สิ่งที่ทำให้สิ่งนี้แตกต่างคือมันเฝ้าดูการเปลี่ยนแปลงของไฟล์ในจาวาสคริปต์และรวมเข้ากับสคริปต์ที่คุณเลือกโดยอัตโนมัติ ดังนั้นจึงไม่จำเป็นต้อง "สร้าง" จาวาสคริปต์ของคุณด้วยตนเองทุกครั้งที่คุณทดสอบ หวังว่ามันจะช่วยคุณได้ฉันกำลังใช้สิ่งนี้อยู่


0

อาจใช้ความพยายามเล็กน้อย แต่คุณสามารถดาวน์โหลดโครงการวิกิโอเพนซอร์สของฉันได้จาก codeplex:

http://shuttlewiki.codeplex.com

มีโครงการ CompressJavascript (และ CompressCSS) ที่ใช้โครงการhttp://yuicompressor.codeplex.com/

โค้ดควรอธิบายได้ด้วยตัวเอง แต่มันทำให้การรวมและบีบอัดไฟล์ง่ายขึ้นเล็กน้อย - สำหรับฉันแล้ว :)

โครงการ ShuttleWiki แสดงวิธีใช้ในเหตุการณ์หลังการสร้าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.