Combine vários arquivos JavaScript em um arquivo JS [fechado]

90

Estou usando jquery em meu aplicativo da web e preciso carregar mais arquivos de script jquery em uma única página.

O Google sugeriu que eu combinasse todos os arquivos de script jquery em um único arquivo.

Como posso fazer isso?

Chandrasekhar
fonte

Respostas:

52

No Linux, você pode usar um script de shell simples https://github.com/dfsq/compressJS.sh para combinar vários arquivos javascript em um único. Ele faz uso do serviço online Closure Compiler para que o script resultante também seja compactado de forma eficaz.

$ ./compressJS.sh some-script.js another-sctipt.js onemore.js
dfsq
fonte
1
isso poderia funcionar com guidão?
Dan Baker
3
Melhor usar um gerenciador de tarefas como Grunt, Gulp e outras coisas assim fazem isso automaticamente. Usando o Grunt, eu compilo meu less, manuscrito e guiador em uma pasta gerada, depois copio os arquivos js / css para a pasta gerada também, no final também minifico em um arquivo js todos os arquivos .js e em um arquivo css todos os arquivos .css. E eu tenho um observador executando novamente essa configuração na alteração do arquivo para que eu possa salvar um arquivo e atualizar o navegador e todas as alterações foram aplicadas dentro de 1-3 segundos.
Vadorequest
18

Basta combinar os arquivos de texto e usar algo como o Compressor YUI .

Os arquivos podem ser facilmente combinados usando o comando cat *.js > main.jse main.js pode ser executado por meio do compressor YUI usando java -jar yuicompressor-x.y.z.jar -o main.min.js main.js.

Atualização de agosto de 2014

Agora migrei para o uso do Gulp para concatenação e compactação de javascript como com vários plug-ins e algumas configurações mínimas, você pode fazer coisas como configurar dependências, compilar coffeescript etc, bem como compactar seu JS.

Prydie
fonte
O link do compressor YUI está morto.
reformado
11

Você pode fazer isso via

  • uma. Manualmente: copie todos os arquivos Javascript em um, execute um compressor ( opcional, mas recomendado ), carregue no servidor e crie um link para esse arquivo.
  • b. Use PHP: basta criar uma matriz de todos os arquivos JS e includetodos eles e gerar uma <script>tag
Gary Green
fonte
1
A opção B não é recomendada porque faz com que seu navegador faça muitas solicitações para todos os pequenos arquivos .js individuais (lento) em vez de apenas uma solicitação para um arquivo .js maior (mais rápido).
Mikepote de
5
@Mikepote, sim ... portanto, usei a palavra includeou seja, não faça <script src = "...."> vinculando a vários arquivos, apenas inclua-os em um elemento de script. Idealmente, um cdn junto com o cache adequado deve ser usado.
Gary Green
Ah, desculpe, eu interpretei mal sua resposta.
Mikepote
3
Você pode dar algum exemplo aqui.
Anand Solanki
Melhor usar readfile () para evitar a sobrecarga de análise e, acidentalmente, obter algo interpretado.
Chinoto Vokro
9

Eu geralmente tenho em um 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)

Então você executa:

make compile

Espero que ajude.


fonte
8

Eu uso este script de shell no Linux https://github.com/eloone/mergejs .

Comparado com os scripts acima, ele tem as vantagens de ser muito simples de usar, e uma grande vantagem é que você pode listar os arquivos js que deseja mesclar em um arquivo de texto de entrada e não na linha de comando, portanto, sua lista é reutilizável e você não precisa digitá-lo toda vez que quiser mesclar seus arquivos. É muito útil, pois você repetirá essa etapa toda vez que quiser entrar em produção. Você também pode comentar os arquivos que não deseja mesclar na lista. A linha de comando que você provavelmente digitaria é:

$ mergejs js_files_list.txt output.js

E se você também deseja compactar o arquivo resultante mesclado:

$ mergejs -c js_files_list.txt output.js

Isso criará output-min.jsminimizado pelo compilador de encerramento do Google. Ou:

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

Se você quiser um nome específico para o seu arquivo reduzido chamado output.minified.js

Acho muito útil para um site simples.

eloone
fonte
7

O agrupamento de scripts é contraproducente, você deve carregá-los em paralelo usando algo como http://yepnopejs.com/ ou http://headjs.com

Cápsula
fonte
5
Existem razões válidas para combinar arquivos javascript. Por um lado, é bem possível que solicitar 20 arquivos de 2kb leve mais tempo do que solicitar um arquivo de 40 kb.
Joel B
1
O que acontece quantas vezes por milênio?
Cápsula de
4
Mais frequentemente do que você pensa. Dê uma olhada até mesmo no código-fonte para stackoverflow: "... A opção B não é recomendada porque faz com que seu navegador faça muitas solicitações para todos os pequenos arquivos .js individuais (lento) em vez de apenas uma solicitação para um .js maior arquivo (mais rápido). "
Joel B
4
@Capsule odeio dizer a você, mas a Internet está mudando rapidamente de jQuery para MVC JavaScript, carregar um arquivo sempre será mais rápido do que disparar várias solicitações HTTP.
Foxhoundn,
1
@Foxhoundn a internet também está mudando rapidamente para HTTP2, então isso não importa mais. Enfim, o jQuery foi apenas um exemplo, você poderia enfrentar exatamente o mesmo problema com MVC JS
Capsule
7

Copie este script para o bloco de notas e salve como um arquivo .vbs. Arraste e solte arquivos .js neste script.

ps. Isso funcionará apenas no 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
fonte
5

Você pode usar o compilador Closure como orangutancloud sugere. Vale ressaltar que você não precisa realmente compilar / minimizar o JavaScript, deve ser possível simplesmente concatenar os arquivos de texto JavaScript em um único arquivo de texto. Basta juntá-los na ordem em que são normalmente incluídos na página.

Jim Blackler
fonte
Sim, bom ponto. O compilador de encerramento pode ser complicado se você ou os autores do plug-in não mantiverem uma boa sintaxe, ou se você estiver tentando depurar. Mas se você usá-lo no modo mais básico, pode ser útil. Eu pessoalmente gosto muito do Dojo e uso seu sistema de construção com projetos dojo, realmente ajuda a manter tudo em um arquivo. Mas é útil apenas para implantação, não para desenvolvimento.
Tom Gruner,
4

Se você estiver executando o PHP, recomendo o Minify porque ele combina e minimiza rapidamente para CSS e JS. Depois de configurá-lo, funcione normalmente e ele cuidará de tudo.

technoTarek
fonte
4

Você pode usar o KjsCompiler: https://github.com/knyga/kjscompiler Cool dependency managment

Oleksandr Knyga
fonte
Estou procurando por ferramentas como essa há horas, mas finalmente funciona exatamente como imaginei que deveria funcionar. Simples e direto.
Gergely Kovács
2

Você pode usar um script que fiz. Você precisa do JRuby para executá-lo. https://bitbucket.org/ardee_aram/jscombiner (JSCombiner).

O que diferencia isso é que ele observa as alterações do arquivo no javascript e o combina automaticamente com o script de sua escolha. Portanto, não há necessidade de "construir" manualmente o seu javascript cada vez que você o testa. Espero que ajude você, estou usando isso no momento.

Ardee Aram
fonte
0

Pode ser um pouco trabalhoso, mas você pode baixar meu projeto wiki de código aberto em codeplex:

http://shuttlewiki.codeplex.com

Ele contém um projeto CompressJavascript (e CompressCSS) que usa o projeto http://yuicompressor.codeplex.com/ .

O código deve ser autoexplicativo, mas torna a combinação e compactação dos arquivos um pouco mais simples - para mim, de qualquer maneira :)

O projeto ShuttleWiki mostra como usá-lo no evento pós-compilação.

Eben Roux
fonte