Estou tentando resumir meu conhecimento sobre os mais populares gerenciadores de pacotes JavaScript, empacotadores e executores de tarefas. Por favor me corrija se eu estiver errado:
npm
&bower
são gerenciadores de pacotes. Eles apenas baixam as dependências e não sabem como construir projetos por conta própria. O que eles sabem é chamarwebpack
/gulp
/grunt
depois de buscar todas as dependências.bower
é comonpm
, mas cria árvores de dependência achatadas (ao contrário donpm
que faz recursivamente). O significadonpm
busca as dependências para cada dependência (pode buscar o mesmo algumas vezes), enquantobower
espera que você inclua manualmente subdependências. Às vezes,bower
enpm
são usados juntos para front-end e back-end, respectivamente (já que cada megabyte pode ser importante no front-end).grunt
egulp
são executores de tarefas para automatizar tudo o que pode ser automatizado (por exemplo, compilar CSS / Sass, otimizar imagens, criar um pacote e minimizá-lo / transpilar).grunt
vs.gulp
(é comomaven
vs.gradle
ou código de configuração vs.). O Grunt é baseado na configuração de tarefas independentes separadas, cada tarefa abre / manipula / fecha o arquivo. O Gulp requer menos quantidade de código e é baseado nos fluxos de nó, o que permite a construção de cadeias de tubulação (sem reabrir o mesmo arquivo) e o torna mais rápido.webpack
(webpack-dev-server
) - para mim é um executor de tarefas com recarregamento quente de alterações, o que permite que você esqueça todos os observadores JS / CSS.npm
Osbower
plugins / + podem substituir os executores de tarefas. Suas habilidades geralmente se cruzam, portanto há implicações diferentes se você precisar usargulp
/grunt
sobrenpm
+ plugins. Porém, os executores de tarefas são definitivamente melhores para tarefas complexas (por exemplo, "em cada compilação, crie bundle, transpile do ES6 para o ES5, execute-o em todos os emuladores de navegadores, faça capturas de tela e implante no dropbox através do ftp").browserify
permite empacotar módulos de nó para navegadores.browserify
vsnode
'srequire
é realmente AMD vs commonjs .
Questões:
- O que é
webpack
&webpack-dev-server
? A documentação oficial diz que é um empacotador de módulos, mas para mim é apenas um executor de tarefas. Qual é a diferença? - Onde você usaria
browserify
? Não podemos fazer o mesmo com as importações do nó / ES6? - Quando você usaria
gulp
/grunt
sobrenpm
+ plugins? - Forneça exemplos quando você precisar usar uma combinação
Respostas:
Webpack e Browserify
O Webpack e o Browserify fazem praticamente o mesmo trabalho, que está processando seu código para ser usado em um ambiente de destino (principalmente navegador, embora você possa direcionar outros ambientes como Node). O resultado de tal processamento é um ou mais feixes - Scripts montados adequado para o ambiente alvo.
Por exemplo, digamos que você escreveu o código ES6 dividido em módulos e deseja executá-lo em um navegador. Se esses módulos forem módulos de nó, o navegador não os entenderá, pois eles existem apenas no ambiente do nó. Os módulos ES6 também não funcionarão em navegadores mais antigos como o IE11. Além disso, você pode ter usado recursos de linguagem experimental (próximas propostas do ES) que os navegadores ainda não implementam, portanto, a execução desse script causaria erros. Ferramentas como Webpack e Browserify resolvem esses problemas, traduzindo esse código para um formato que um navegador é capaz de executar . Além disso, eles permitem aplicar uma enorme variedade de otimizações nesses pacotes.
No entanto, o Webpack e o Browserify diferem de várias maneiras, por padrão, o Webpack oferece muitas ferramentas (por exemplo, divisão de código), enquanto o Browserify pode fazer isso somente após o download de plug-ins, mas o uso de ambos leva a resultados muito semelhantes . Tudo se resume à preferência pessoal (o Webpack é mais moderno). Aliás, o Webpack não é um executor de tarefas, é apenas o processador de seus arquivos (os processa pelos chamados carregadores e plugins) e pode ser executado (entre outras maneiras) por um executor de tarefas.
Servidor de desenvolvimento Webpack
O Webpack Dev Server fornece uma solução semelhante ao Browsersync - um servidor de desenvolvimento em que você pode implantar seu aplicativo rapidamente enquanto trabalha nele e verificar seu progresso de desenvolvimento imediatamente, com o servidor dev atualizando automaticamente o navegador em alterações de código ou mesmo propagando códigos alterados ao navegador sem recarregar com a chamada substituição de módulo quente.
Executores de tarefas vs scripts NPM
Eu tenho usado o Gulp por sua concisão e facilidade na redação de tarefas, mas depois descobri que não preciso do Gulp nem do Grunt. Tudo o que eu precisava poderia ter sido feito usando scripts NPM para executar ferramentas de terceiros por meio de sua API. A escolha entre os scripts Gulp, Grunt ou NPM depende do gosto e da experiência da sua equipe.
Embora as tarefas no Gulp ou Grunt sejam fáceis de ler, mesmo para pessoas não familiarizadas com o JS, é mais uma ferramenta para exigir e aprender, e eu pessoalmente prefiro restringir minhas dependências e simplificar as coisas. Por outro lado, substituir essas tarefas pela combinação de scripts NPM e scripts (provavelmente JS) que executam essas ferramentas de terceiros (por exemplo, script de nó configurando e executando rimraf para fins de limpeza) pode ser mais desafiador. Mas na maioria dos casos, esses três são iguais em termos de resultados.
Exemplos
Quanto aos exemplos, sugiro que você dê uma olhada neste projeto inicial do React , que mostra uma boa combinação de scripts NPM e JS que abrangem todo o processo de compilação e implantação. Você pode encontrar esses scripts NPM em
package.json
na pasta raiz, em uma propriedade chamadascripts
. Lá você encontrará principalmente comandos comobabel-node tools/run start
. O nó Babel é uma ferramenta CLI (não destinada ao uso em produção), que inicialmente compila o arquivo ES6tools/run
(arquivo run.js localizado nas ferramentas ) - basicamente um utilitário de execução . Esse corredor pega uma função como argumento e a executa, que neste caso éstart
- outro utilitário (start.js
) responsável por agrupar os arquivos de origem (cliente e servidor) e iniciar o servidor de aplicativos e desenvolvimento (o servidor de desenvolvimento provavelmente será o Webpack Dev Server ou o Browsersync).Falando com mais precisão,
start.js
cria os pacotes do lado do cliente e do servidor, inicia um servidor expresso e, após um lançamento bem-sucedido, inicializa a sincronização do navegador, que no momento da escrita parecia com esta (consulte o projeto inicial do novo código).A parte importante é que
proxy.target
, onde eles definem o endereço do servidor que desejam proxy, que pode ser http: // localhost: 3000 , e o Browsersync inicia um servidor atendendo em http: // localhost: 3001 , onde os ativos gerados são atendidos com alteração automática detecção e substituição do módulo quente. Como você pode ver, há outra propriedade de configuraçãofiles
com arquivos ou padrões individuais. A sincronização do navegador observa alterações e recarrega o navegador, se houver alguma, mas como diz o comentário, o Webpack cuida de observar as fontes js por si só com o HMR, para que elas cooperem há.Agora não tenho nenhum exemplo equivalente dessa configuração do Grunt ou do Gulp, mas com o Gulp (e de maneira semelhante ao Grunt) você escreveria tarefas individuais no gulpfile.js, como
onde você faria essencialmente praticamente as mesmas coisas do kit inicial, desta vez com o executor de tarefas, que resolve alguns problemas para você, mas apresenta seus próprios problemas e algumas dificuldades durante o aprendizado do uso, e como eu digo, o quanto mais dependências você tiver, mais pode dar errado. E é por isso que gosto de me livrar dessas ferramentas.
fonte
Atualização outubro 2018
Se você ainda não tem certeza sobre o desenvolvedor Front-end, pode dar uma olhada rápida em um excelente recurso aqui.
https://github.com/kamranahmedse/developer-roadmap
Atualização junho 2018
Aprender JavaScript moderno é difícil se você não estiver lá desde o início. Se você é o novato, lembre-se de verificar esta excelente redação para ter uma melhor visão geral.
https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70
Atualização julho de 2017
Recentemente, encontrei um guia realmente abrangente da equipe Grab sobre como abordar o desenvolvimento front-end em 2017. Você pode conferir como abaixo.
https://github.com/grab/front-end-guide
Eu também tenho procurado por isso há algum tempo, já que existem muitas ferramentas por aí e cada uma delas nos beneficia em um aspecto diferente. A comunidade é dividida em ferramentas como
Browserify, Webpack, jspm, Grunt and Gulp
. Você também pode ouvir sobreYeoman or Slush
. Isso não é realmente um problema, é apenas confuso para todos que tentam entender um caminho claro a seguir.Enfim, eu gostaria de contribuir com algo.
1. Gerenciador de Pacotes
Os gerenciadores de pacotes simplificam a instalação e a atualização das dependências do projeto, que são bibliotecas como:,
jQuery, Bootstrap
etc - tudo o que é usado no seu site e não é escrito por você.Navegando em todos os sites da biblioteca, baixando e descompactando os arquivos, copiando arquivos para os projetos - tudo isso é substituído por alguns comandos no terminal.
NPM
significa:Node JS package manager
ajuda você a gerenciar todas as bibliotecas nas quais seu software depende. Você definiria suas necessidades em um arquivo chamadopackage.json
e executarianpm install
na linha de comando ... então BANG, seus pacotes serão baixados e prontos para uso. Pode ser usado parafront-end and back-end
bibliotecas.Bower
: para gerenciamento de pacotes front-end, o conceito é o mesmo do NPM. Todas as suas bibliotecas são armazenadas em um arquivo chamadobower.json
e, em seguida, executadasbower install
na linha de comando.NPM
Bower
Yarn
: Um novo gerenciador de pacotes paraJavaScript
publicada pelaFacebook
recentemente com mais algumas vantagens em comparação comNPM
. E com o Yarn, você ainda pode usar os doisNPM
e oBower
registro para buscar o pacote. Se você instalou um pacote anteriormente,yarn
cria uma cópia em cache que facilitaoffline package installs
.jspm
: é um gerenciador de pacotes para oSystemJS
carregador de módulos universal, construído sobre oES6
carregador de módulos dinâmicos . Não é um gerenciador de pacotes totalmente novo com seu próprio conjunto de regras, mas funciona com base nas fontes de pacotes existentes. Fora da caixa, ele trabalha comGitHub
enpm
. Como a maioria dosBower
pacotes baseados é baseadaGitHub
, também podemos instalar esses pacotesjspm
. Ele possui um registro que lista a maioria dos pacotes front-end comumente usados para facilitar a instalação.2. Carregador / Empacotamento de Módulos
A maioria dos projetos de qualquer escala terá seu código dividido entre vários arquivos. Você pode apenas incluir cada arquivo com uma
<script>
tag individual , no entanto,<script>
estabelece uma nova conexão http e, para arquivos pequenos - que é um objetivo de modularidade - o tempo para configurar a conexão pode demorar muito mais do que transferir os dados. Enquanto os scripts estão sendo baixados, nenhum conteúdo pode ser alterado na página.Por exemplo
Por exemplo
Os computadores podem fazer isso melhor do que você, e é por isso que você deve usar uma ferramenta para agrupar tudo automaticamente em um único arquivo.
Então ouvimos sobre
RequireJS
,Browserify
,Webpack
eSystemJS
RequireJS
: é umJavaScript
carregador de arquivos e módulos. É otimizado para uso no navegador, mas pode ser usado em outros ambientes JavaScript, comoNode
.Por exemplo: myModule.js
Em
main.js
, podemos importarmyModule.js
como dependência e usá-lo.E então, no nosso
HTML
, podemos nos referir ao uso comRequireJS
.Browserify
: definido para permitir o uso deCommonJS
módulos formatados no navegador. Consequentemente,Browserify
não é tanto um carregador de módulos quanto um empacotador de módulos:Browserify
é inteiramente uma ferramenta em tempo de construção, produzindo um pacote de código que pode ser carregado no lado do cliente.Comece com uma máquina de compilação com o node & npm instalado e obtenha o pacote:
Escreva seus módulos em
CommonJS
formatoE quando estiver feliz, emita o comando para agrupar:
O Browserify encontra recursivamente todas as dependências do ponto de entrada e as reúne em um único arquivo:
Webpack
: Agrupa todos os seus recursos estáticos, incluindoJavaScript
imagens, CSS e muito mais, em um único arquivo. Também permite processar os arquivos através de diferentes tipos de carregadores. Você pode escrever sua sintaxeJavaScript
withCommonJS
ouAMD
modules. Ele ataca o problema de construção de uma maneira fundamentalmente mais integrada e opinativa. EmBrowserify
que você usaGulp/Grunt
e uma longa lista de transformações e plugins para começar o trabalho feito.Webpack
oferece energia suficiente para uso imediato que você normalmente não precisaGrunt
ouGulp
em tudo.O uso básico está além do simples. Instale o Webpack como o Browserify:
E passe ao comando um ponto de entrada e um arquivo de saída:
SystemJS
: é um carregador de módulo que pode importar módulos em tempo de execução em qualquer um dos formatos populares usados hoje (CommonJS, UMD, AMD, ES6
). Ele é construído sobre oES6
polyfill do carregador de módulos e é inteligente o suficiente para detectar o formato que está sendo usado e manipulá-lo adequadamente.SystemJS
também pode transpilar o código ES6 (comBabel
ouTraceur
) ou outros idiomas comoTypeScript
eCoffeeScript
usando plug-ins.3. Executor de Tarefas
Executores de tarefas e ferramentas de construção são principalmente ferramentas de linha de comando. Por que precisamos usá-los: Em uma palavra: automação . Quanto menos trabalho você executar ao executar tarefas repetitivas, como minificação, compilação, teste de unidade, fiapos, que anteriormente nos custaram muitas vezes com linha de comando ou mesmo manualmente.
Grunt
: Você pode criar automação para o seu ambiente de desenvolvimento para pré-processar códigos ou criar scripts de construção com um arquivo de configuração e parece muito difícil lidar com uma tarefa complexa. Popular nos últimos anos.Cada tarefa
Grunt
é uma variedade de configurações diferentes de plugins, que simplesmente são executadas uma após a outra, de maneira estritamente independente e seqüencial.Gulp
: Automação exatamente como emGrunt
vez de configurações, você pode escreverJavaScript
com fluxos como se fosse um aplicativo de nó. Prefira estes dias.Esta é uma
Gulp
declaração de tarefa de amostra.4. Ferramentas para andaimes
Slush and Yeoman
: Você pode criar projetos iniciais com eles. Por exemplo, você planeja criar um protótipo com HTML e SCSS e, em vez de criar manualmente alguma pasta, como scss, css, img, fonts. Você pode simplesmente instalaryeoman
e executar um script simples. Então tudo aqui para você.Encontre mais aqui .
Minha resposta não é realmente compatível com o conteúdo da pergunta, mas quando estou pesquisando esses conhecimentos no Google, sempre vejo a pergunta no topo, então decidi respondê-la em resumo. Espero que vocês tenham achado útil.
fonte
OK, todos eles têm algumas semelhanças, eles fazem as mesmas coisas para você de maneiras diferentes e semelhantes, divido-os em 3 grupos principais, como abaixo:
1) Empacotadores de módulo
webpack e browserify como populares, funcionam como executores de tarefas, mas com mais flexibilidade, além de agrupar tudo como sua configuração, para que você possa apontar para o resultado como bundle.js, por exemplo, em um único arquivo, incluindo CSS e Javascript, para Para obter mais detalhes de cada um, veja os detalhes abaixo:
webpack
mais aqui
browserify
mais aqui
2) Executores de tarefas
gulp e grunt são executores de tarefas, basicamente o que eles fazem, criando tarefas e executando-os sempre que quiser, por exemplo, você instala um plug-in para reduzir seu CSS e, em seguida, executa-o toda vez para realizar a redução, mais detalhes sobre cada um:
gole
mais aqui
grunhido
mais aqui
3) Gerenciadores de pacotes
gerenciadores de pacotes, o que eles fazem é gerenciar plugins necessários em seu aplicativo e instalá-los para você através do github etc usando package.json, muito útil para atualizar seus módulos, instalá-los e compartilhar seu aplicativo, mais detalhes para cada:
npm
mais aqui
caramanchão
mais aqui
e o gerenciador de pacotes mais recente que não deve ser esquecido, é jovem e rápido no ambiente de trabalho real, comparado ao npm que eu estava usando antes, para reinstalar módulos, ele verifica a pasta node_modules para verificar a existência do módulo, também parece que a instalação dos módulos leva menos tempo:
fio
mais aqui
fonte
Você pode encontrar algumas comparações técnicas no npmcompare
Comparando browserify x grunt x gulp x webpack
Como você pode ver, o webpack é muito bem mantido, com uma nova versão saindo a cada 4 dias em média. Mas Gulp parece ter a maior comunidade de todas (com mais de 20 mil estrelas no Github) Grunt parece um pouco negligenciado (comparado aos outros)
Então, se precisar escolher um sobre o outro, eu iria com o Gulp
fonte
Uma pequena observação sobre o npm: o npm3 tenta instalar dependências de maneira simples
https://docs.npmjs.com/how-npm-works/npm3#npm-v3-dependency-resolution
fonte
dedupe
opção de fazer a mesma coisaO webpack-dev-server é um servidor da Web de recarga ao vivo que os desenvolvedores do Webpack usam para obter feedback imediato sobre o que fazem. Só deve ser usado durante o desenvolvimento.
Este projeto é fortemente inspirado pela ferramenta de teste de unidade nof5 .
Webpack como o nome indica criará uma ÚNICA pacote de idade para a web . O pacote será minimizado e combinado em um único arquivo (ainda vivemos na era HTTP 1.1). Webpack faz a mágica de combinar os recursos (JavaScript, CSS, imagens) e injetá-los como este:
<script src="assets/bundle.js"></script>
.Também pode ser chamado de empacotador de módulo, pois deve entender as dependências do módulo e como capturar as dependências e agrupá-las.
Você pode usar o Browserify exatamente nas mesmas tarefas em que usaria o Webpack . - O Webpack é mais compacto, no entanto.
Observe que os recursos do carregador de módulo ES6 no Webpack2 estão usando System.import , que nem um único navegador suporta nativamente.
Você pode esquecer Gulp, Grunt, Brokoli, Brunch e Bower . Em vez disso, use diretamente scripts de linha de comando npm e você pode eliminar pacotes extras como estes aqui para o Gulp :
Você provavelmente pode usar os geradores de arquivos de configuração Gulp e Grunt ao criar arquivos de configuração para o seu projeto. Dessa forma, você não precisa instalar o Yeoman ou ferramentas similares.
fonte
O Yarn é um gerenciador de pacotes recente que provavelmente merece ser mencionado.
Então, aqui está: https://yarnpkg.com/
Tanto quanto sei, ele pode buscar as dependências npm e bower e possui outros recursos apreciados.
fonte
Webpack
é um empacotador. ComoBrowserfy
ele procura na base de código por solicitações de módulo (require
ouimport
) e as resolve recursivamente. Além disso, você pode configurarWebpack
para resolver não apenas módulos semelhantes a JavaScript, mas CSS, imagens, HTML, literalmente tudo. O que mais me deixa empolgado é queWebpack
você pode combinar os módulos compilados e carregados dinamicamente no mesmo aplicativo. Assim, obtém-se um aumento real de desempenho, especialmente sobre HTTP / 1.x. Como exatamente você faz isso, descrevi com exemplos aqui http://dsheiko.com/weblog/state-of-javascript-modules-2017/ Como uma alternativa para empacotador, podemos pensar emRollup.js
( https://rollupjs.org/ ) , que otimiza o código durante a compilação, mas remove todos os pedaços não utilizados encontrados.Pois
AMD
, em vez deRequireJS
um pode ir com nativoES2016 module system
, mas carregado comSystem.js
( https://github.com/systemjs/systemjs )Além disso, eu apontaria que
npm
é frequentemente usado como uma ferramenta de automação comogrunt
ougulp
. Confira https://docs.npmjs.com/misc/scripts . Pessoalmente, agora eu uso scripts npm, evitando apenas outras ferramentas de automação, embora no passado eu gostasse muitogrunt
. Com outras ferramentas, você precisa contar com inúmeros plugins para pacotes, que geralmente não são bons escritos e não são mantidos ativamente.npm
conhece seus pacotes, então você chama qualquer um dos pacotes instalados localmente por nome como:Na verdade, você geralmente não precisa de nenhum plug-in se o pacote suportar CLI.
fonte