Embora existam ótimas soluções para gerenciar dependências no lado do servidor, não consegui encontrar nenhuma que satisfaça todas as minhas necessidades de ter um fluxo de trabalho de gerenciamento de dependência de JavaScript coerente no lado do cliente. Eu quero satisfazer estes 5 requisitos:
- Gerenciar minhas dependências do lado do cliente em um formato semelhante ao package.json do npm ou bower 's
bower.json
- Ele deve ter a flexibilidade de apontar para git repo ou arquivos js reais (na web ou localmente) em meu
dependency.json
arquivo para bibliotecas menos conhecidas (npm permite que você aponte para git repos) - Ele deve minimizar e definir o namespace de todas as bibliotecas em um único arquivo como ender - esse é o único arquivo js que eu precisaria colocar em minha
<script>
tag no lado do cliente - Ele deve ter suporte imediato para CoffeeScript como BoxJS 4 (agora morto)
No navegador, devo ser capaz de usar o estilo require :
var $ = require('jquery'); var _ = require('underscore');
Ou melhor ainda, faça o estilo headjs :
head.js(['jquery', 'underscore', 'mylib'], function($, _, mylib) { // executed when all libraries are loaded });
Se não existe uma ferramenta única, qual é a melhor combinação de ferramentas, ou seja, uma cadeia de ferramentas que posso combinar usando algo como volo (ou grunhido )?
Já pesquisei todas as ferramentas que vinculei aqui e elas atendem a apenas 3 dos meus requisitos, na melhor das hipóteses, individualmente. Então, por favor, não poste novamente sobre essas ferramentas. Eu só aceitaria uma resposta que forneça uma única ferramenta que satisfaça todos os 5 dos meus requisitos ou se alguém postar um fluxo de trabalho / script / exemplo de trabalho concreto de um conjunto de ferramentas de várias dessas ferramentas que também satisfaça todos os meus requisitos. Obrigado.
fonte
require
sintaxe do nó para o navegador, considere browserifyRespostas:
require.js faz tudo que você precisa.
Minha resposta a esta pergunta pode ajudá-lo
Exemplo:
Hierarquia do projeto do aplicativo cliente:
main.js é onde você inicializa seu aplicativo cliente e configura o require.js:
As dependências usarão o plugin cs quando prefixadas por "cs!". O plugin cs compila o arquivo coffeescript.
Quando você vai em prod, você pode pré-compilar o seu projeto inteiro com r.js .
Aqui estão seus requisitos:
Gerenciar minhas dependências do lado do cliente em um formato semelhante ao package.json do npm ou component.json do bower. Diferente, mas TÃO BOM!
Devo ter a flexibilidade de apontar para git repo ou arquivos js reais (na web ou localmente) em meu arquivo dependency.json para bibliotecas menos conhecidas (npm permite que você aponte para git repos). SIM
Ele deve minimizar e definir o namespace de todas as bibliotecas em um único arquivo como ender - esse é o único arquivo js que eu precisaria colocar em minha tag de script no lado do cliente. SIM com r.js.
Ele deve ter suporte imediato para coffeescript como Box. SIM
No navegador, posso usar o estilo require ou headjs. SIM
fonte
r.js
, posso simplesmente obter versões não minimizadas de todas as bibliotecas ou como devo decidir entre bibliotecas minimizadas e não minimizadas?http://requirejs.org/ é o que você está procurando, eu acredito
fonte
Como @ Guillaume86, acho que a bainha o levará o mais perto de onde você quer estar.
Na bainha, as dependências são gerenciadas usando uma combinação de npm e bainha. Use o npm para instalar explicitamente todas as dependências externas de seus projetos. Use hem para especificar quais dependências (externas e locais) devem ser costuradas para suas operações do lado do cliente.
Eu criei um projeto de esqueleto disso para que você possa ver como isso funcionaria - você pode vê-lo em https://github.com/dsummersl/clientsidehem
Adicionando dependências
Use o npm para pesquisar uma dependência específica e, em seguida, modifique o arquivo package.json para garantir que a dependência seja rastreada no futuro. Em seguida, especifique a dependência para seu aplicativo em slug.json.
Por exemplo, suponha que você queira adicionar a dependência do script de café. Basta usar o npm para instalar a dependência e salvá-la no arquivo package.json:
Suponha que você queira incluir seu próprio módulo 'bloomfilters' e ele não estiver no registro npm. Você pode adicioná-lo ao seu projeto da seguinte maneira:
Módulos locais
Se você quiser incluir seu próprio café ou javascript, pode fazê-lo adicionando esses arquivos ao aplicativo / pasta. Observe que para expor seu script por meio do método 'require', você deve torná-lo um módulo CommonJS. É muito simples - veja as bainhas .
Ficheiros locais
Se você deseja incluir código não CommonJS não 'obrigatório', também pode costurar isso referenciando seu javascript ou coffeescript personalizado por meio da lista 'libs' em slug.json.
CSS
A bainha irá costurar seu CSS também, se você quiser. Veja a bainha docs .
Construção
Depois de ter suas dependências listadas, você pode usar bainha para costurá-las todas juntas.
Notas
A bainha foi feita para o projeto spinejs - mas você não precisa usá-la para isso. Ignore qualquer documento que mencione a coluna vertebral como desejar ...
fonte
Bem, estou surpreso que ninguém mencionou o Browserify ainda.
fonte
napa
ou não? npmjs.org/package/napaTenho certeza de que o Hem atende aos seus requisitos (eu uso um fork pessoal com compiladores adicionais - jade e stylus - é fácil de personalizar de acordo com suas necessidades). Ele usa npm para gerenciar dependências.
fonte
Você pode querer dar uma olhada em Yeoman , que usa várias técnicas para ajudá-lo com seus requisitos.
Suporte integrado para CoffeeScript, Compass e mais. Funciona com r.js ( RequireJS ), teste de unidade etc.
Quanto aos seus requisitos:
Todos os recursos:
fonte
O Bower pode ser adequado às suas necessidades (1) e (2) para o resto que você precisar. Do leia-me:
Para instalar um pacote:
fonte
Veja o gerenciador de pacotes Jam . A seguir está a descrição de sua página inicial
Parece muito semelhante ao npm na forma como funciona.
Instale o pacote como abaixo
mantendo os pacotes atualizados executando
Otimize pacotes para produção
As dependências do Jam podem ser adicionadas ao
package.json
arquivo.Para obter a documentação completa, leia a documentação Jam
fonte
Acabei de encontrar o inject.js
Alguns dos recursos do site do projeto :
fonte
Há um par de opções:
O componente também pode ser de interesse, ele não gerencia dependências por si só, mas permite que você use versões fragmentadas de bibliotecas grandes.
fonte
Eu uso hem com npm e gostaria de adicionar alguns benefícios adicionais que acho que não foram abordados até agora.
hem build
menos que esteja publicando um aplicativo.cake
método acima, você pode apenas vincular diretamente ao coffeescript de projetos dependentes.eco
(Coffeescript incorporado) para visualizações e Stylus para CSS, e compila tudo isso, junto com seu Coffeescript, em um arquivo JS e um arquivo CSS.Aqui está uma lista básica para configurar um aplicativo Spine, hem, coffeescript. Sinta-se à vontade para ignorar as partes da coluna vertebral. Na verdade, às vezes eu costumo
spine app
configurar uma estrutura de diretório para um aplicativo não Spine e, em seguida, editoslug.json
para mudar para uma estrutura de compilação diferente.curl http://npmjs.org/install.sh | sh
em um sistema * nix. Presumo que esteja disponível na linha de comando.npm install -g hem
). O desenvolvimento se ramificou recentemente, então você pode querer tirá-lo diretamente do github ( https://github.com/spine/hem ), fazer checkout de um branch enpm install -g .
dentro dessa pasta.npm install -g spine.app
tornará a coluna disponível como um comando globalspine app folder
vai fazer um projeto Spine chamadaapp
emfolder
, gerando a estrutura de diretórios direita e um monte de arquivos esqueleto para começar.cd
para dobrar e editardependencies.json
as bibliotecas de que você precisa. Adicione-os paraslug.json
que a bainha também saiba onde encontrá-los.npm link
qualquer um de seus pacotes locais em desenvolvimento paranode_modules
, e você pode adicioná-los aslug.json
para bainha (umindex.js
para incluir diretamente ou umindex.coffee
se quiser que bainhe para compilá-lo).npm install .
para baixar todas as dependências que você acabou de inserir.Se você der uma olhada na configuração padrão da spine, verá
app/lib/setup.coffee
que você encontrarárequire
todas as bibliotecas de que precisa em suas dependências. Exemplos:Em
index.coffee
, bastarequire lib/setup
carregar o controlador principal do seu aplicativo. Além disso, você precisa derequire
quaisquer outras classes nesses outros controladores. Você pode usarspine controller something
ouspine model something
para gerar modelos para controladores e modelos. O controlador Spine típico se parece com o seguinte, usando o do nórequire
:O padrão gerado
index.html
normalmente servirá para carregar seu aplicativo, mas modifique conforme necessário. De acordo com seus requisitos, ele puxa apenas umjs
e umcss
arquivo, que você nunca precisa modificar.css
pasta. É muito mais flexível do que CSS :)folder
, executehem server
para iniciar um servidor de bainha e navegue atélocalhost:9294
para ver seu aplicativo. (Se você instalou o hem globalmente.) Ele possui alguns argumentos ocultos, por exemplo,--host 0.0.0.0
escuta em todas as portas.Mais uma coisa: normalmente,
hem server
será atualizado automaticamente conforme você atualiza seu código e salva arquivos, o que o torna fácil de depurar. A execuçãohem build
irá compilar seu aplicativo em dois arquivosapplication.js
,, que é reduzido eapplication.css
. Se você executarhem server
depois disso, ele usará esses arquivos e não será mais atualizado automaticamente. Portanto, não faça issohem build
até que você realmente precise de uma versão reduzida do seu aplicativo para implantação.Referências adicionais: Spine.js & hem primeiros passos
fonte
Esta é uma solução que tem uma abordagem muito diferente: empacote todos os módulos em um objeto JSON e exija módulos lendo e executando o conteúdo do arquivo sem solicitações adicionais.
Implementação de demonstração do cliente puro: http://strd6.github.io/editor/
https://github.com/STRd6/require/blob/master/main.coffee.md
STRd6 / require depende de ter um pacote JSON disponível no tempo de execução. A
require
função é gerada para esse pacote. O pacote contém todos os arquivos que seu aplicativo pode exigir. Nenhuma outra solicitação http é feita porque o pacote reúne todas as dependências. Isso é o mais próximo que se pode chegar da exigência de estilo Node.js no cliente.A estrutura do pacote é a seguinte:
Ao contrário do Node, um pacote não sabe seu nome externo. Cabe ao pacakge incluir a dependência para nomeá-lo. Isso fornece encapsulamento completo.
Dada toda essa configuração, aqui está uma função que carrega um arquivo de dentro de um pacote:
Este contexto externo fornece algumas variáveis às quais os módulos têm acesso.
Uma
require
função é exposta aos módulos, portanto, eles podem exigir outros módulos.Propriedades adicionais, como uma referência ao objeto global e alguns metadados, também são expostas.
Finalmente, executamos o programa dentro do módulo e no contexto fornecido.
Esta resposta será mais útil para aqueles que desejam ter uma instrução de solicitação de estilo node.js síncrona no navegador e não estão interessados em soluções de carregamento de script remoto.
fonte
Verifique o cartero se estiver usando node / express no backend.
fonte
Eu sugiro que você dê uma olhada no kit de ferramentas do dojo, que parece atender à maioria dos seus requisitos. O que eu não tenho certeza é CoffeeScript.
dojo trabalha com módulos escritos no formato Asynchronous Module Definition (AMD). Possui um sistema de construção com pacotes e você pode agregá-los em um ou vários arquivos (chamados de camadas). Aparentemente, ele aceita repositórios do tipo git, mais detalhes sobre o sistema de compilação aqui:
http://dojotoolkit.org/documentation/tutorials/1.8/build/
Para o registro, v1.9 beta é esperado no próximo mês.
fonte
Outro framework que satisfaz todos os meus critérios lançado recentemente: http://duojs.org/ (e também suporta tratar outros recursos como CSS como dependências).
fonte
injeção de dependência com carregamento assíncrono + browserify será outra boa escolha, em comparação com requirejs
asynchronous-frontend-dependency-management-without-AMD
fonte