Об’єднайте кілька файлів JavaScript в один файл JS [закрито]


91

Я використовую 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
це може працювати з кермом?
Ден Бейкер,

3
Краще використовувати диспетчер завдань, такий як Grunt, Gulp та інші подібні речі, які роблять це автоматично. Використовуючи Grunt, я компілюю свій менший, машинопис, ручки у створену папку, потім також копіюю файли js / css у згенеровану папку, врешті-решт я також мініфікую в один файл js всі файли .js та в один файл css. усі файли .css. І у мене спостерігач повторно запускає цю конфігурацію при зміні файлу, щоб я міг зберегти файл та оновити браузер, і всі зміни були застосовані протягом 1-3 секунд.
Vadorequest


18

Просто об’єднайте текстові файли, а потім використовуйте щось на зразок YUI Compressor .

Файли можна легко комбінувати за допомогою команди, cat *.js > main.jsа main.js потім можна запускати через компресор YUI за допомогою java -jar yuicompressor-x.y.z.jar -o main.min.js main.js.

Оновлення серпня 2014 року

Зараз я перейшов на використання Gulp для конкатенації та стиснення javascript, оскільки з різними плагінами та деякою мінімальною конфігурацією ви можете робити такі налаштування, як налаштування залежностей, компіляцію coffeescript тощо, а також стискання вашого JS.


1
Виправлено @reformed.
Прайді

11

Ви можете зробити це через

  • a. Вручну: скопіюйте всі файли Javascript в один, запустіть на ньому компресор ( необов’язково, але рекомендується ) і завантажте на сервер та посилання на цей файл.
  • b. Використовуйте PHP: Просто створіть масив усіх файлів JS та includeїх усіх і виведіть у <script>тег

1
Варіант B не рекомендується, оскільки він змушує ваш браузер робити багато запитів для всіх невеликих окремих файлів .js (повільно), а не лише один запит на більший файл .js (швидше).
Mikepote

5
@Mikepote, так ... отже, я використав слово, includeтобто не робити <script src = "...."> посилання на декілька файлів, просто включити їх в один елемент сценарію. В ідеалі слід використовувати cdn разом із належним кешуванням.
Gary Green

Ах, вибачте, я неправильно прочитав вашу відповідь.
Mikepote

3
Ви можете навести тут якийсь приклад.
Ананд Соланкі

Краще використовувати readfile (), щоб уникнути синтаксичного аналізу та випадкового трактування чогось.
Чіното Вокро

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

Я вважаю, що це дуже корисно для простого веб-сайту.


7

Групування сценаріїв є контрпродуктивним, ви повинні завантажувати їх паралельно, використовуючи щось на зразок http://yepnopejs.com/ або http://headjs.com


5
Існують поважні причини поєднання файлів javascript. З одного боку, цілком можливо, що запит на 20 файлів розміром 2 кб займе більше часу, ніж запит на файл розміром 40 кб.
Джоел Б

1
Що відбувається скільки разів на тисячоліття?
Капсула

4
Частіше, ніж ви думаєте. Погляньте навіть на вихідний код stackoverflow: "... Варіант B не рекомендується, оскільки браузер робить багато запитів для всіх невеликих окремих файлів .js (повільно), а не лише один запит на більший .js файл (швидше). "
Джоел Б

4
@Capsule Я не люблю вам це казати, але Інтернет швидко переходить від jQuery до MVC JavaScript, завантаження одного файлу завжди буде швидшим, ніж спрацювання декількох HTTP-запитів.
Фоксгаунд,

1
@Foxhoundn Інтернет також швидко переходить на HTTP2, тому це вже не матиме значення. У будь-якому випадку, jQuery був лише прикладом, ви можете зіткнутися з точно такою ж проблемою з MVC JS
Капсула

7

Скопіюйте цей сценарій у блокнот і збережіть як файл .vbs. Перетягніть .js файли .js на цьому сценарії.

ps. Це буде працювати лише на вікнах.

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

Ви можете використовувати компілятор Закриття, як пропонує orangutancloud. Варто зазначити, що вам насправді не потрібно компілювати / зменшувати JavaScript, це повинно мати можливість просто об’єднати текстові файли JavaScript в один текстовий файл. Просто приєднайтеся до них у тому порядку, в якому вони зазвичай містяться на сторінці.


Так, хороший момент. Компілятор закриття може бути складним, якщо ви або автори плагінів не встигаєте за хорошим синтаксисом або якщо ви намагаєтеся налагодити. Але якщо ви використовуєте його в найпростішому режимі, це може бути корисно. Мені особисто Dojo дуже подобається і використовую їх систему збірки з проектами dojo, це дійсно допомагає зберігати все в одному файлі. Але це корисно лише для розгортання, а не для розробки.
Tom Gruner

4

Якщо ви використовуєте PHP, я рекомендую Minify, оскільки він поєднує та мініфікує на льоту як для CSS, так і для JS. Після того, як ви його налаштували, просто працюйте як зазвичай, і він подбає про все.



2

Ви можете використовувати сценарій, який я створив. Для запуску цього вам потрібен JRuby. https://bitbucket.org/ardee_aram/jscombiner (JSCombiner).

Це відрізняє те, що він спостерігає за змінами файлів у javascript і автоматично поєднує їх із сценарієм на ваш вибір. Тому немає необхідності вручну «будувати» свій javascript кожного разу, коли ви його тестуєте. Сподіваюся, це допоможе вам, я зараз використовую це.


0

Це може бути трохи зусиль, але ви можете завантажити мій проект wiki з відкритим кодом з codeplex:

http://shuttlewiki.codeplex.com

Він містить проект CompressJavascript (і CompressCSS), який використовує проект http://yuicompressor.codeplex.com/ .

Код повинен бути зрозумілим, але комбінування та стиснення файлів робить дещо простішим - все одно для мене :)

Проект ShuttleWiki показує, як використовувати його в події після збірки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.