Estou tentando fazer algo que acredito ser possível, mas realmente não consigo entender como fazê-lo apenas a partir da documentação do webpack.
Estou escrevendo uma biblioteca JavaScript com vários módulos que podem ou não depender um do outro. Além disso, o jQuery é usado por todos os módulos e alguns deles podem precisar de plugins do jQuery. Essa biblioteca será usada em vários sites diferentes, que podem exigir alguns ou todos os módulos.
Definir as dependências entre meus módulos foi muito fácil, mas definir suas dependências de terceiros parece ser mais difícil do que eu esperava.
O que eu gostaria de alcançar : para cada aplicativo, quero ter dois arquivos de pacote configurável, um com as dependências de terceiros necessárias e outro com os módulos necessários da minha biblioteca.
Exemplo : Vamos imaginar que minha biblioteca tenha os seguintes módulos:
- a (requer: jquery, jquery.plugin1)
- b (requer: jquery, a)
- c (requer: jquery, jquery.ui, a, b)
- d (requer: jquery, jquery.plugin2, a)
E eu tenho um aplicativo (veja como um arquivo de entrada exclusivo) que requer os módulos a, bec. O Webpack para esse caso deve gerar os seguintes arquivos:
- pacote de fornecedores : com jquery, jquery.plugin1 e jquery.ui;
- pacote de sites : com os módulos a, bec;
No final, eu preferiria ter o jQuery como global, para não precisar exigi-lo em todos os arquivos (só poderia ser exigido no arquivo principal, por exemplo). E os plugins jQuery estenderiam apenas $ global caso sejam necessários (não é um problema se estiverem disponíveis para outros módulos que não precisam deles).
Supondo que isso seja possível, qual seria um exemplo de um arquivo de configuração do webpack para este caso? Tentei várias combinações de carregadores, externos e plugins no meu arquivo de configuração, mas realmente não entendo o que eles estão fazendo e quais devo usar. Obrigado!
fonte
Respostas:
no meu arquivo webpack.config.js (versão 1,2,3), tenho
na minha matriz de plugins
Agora eu tenho um arquivo que adiciona apenas bibliotecas de terceiros a um arquivo, conforme necessário.
Se você deseja obter mais detalhes, separa seus fornecedores e arquivos de ponto de entrada:
Observe que a ordem dos plug-ins é muito importante.
Além disso, isso vai mudar na versão 4. Quando isso é oficial, eu atualizo esta resposta.
Atualização: indexOf alteração de pesquisa para usuários do Windows
fonte
isExternal
nominChunks
meu dia. Como isso não está documentado? Há desvantagens?options.minChunks (number|Infinity|function(module, count) -> boolean):
não estou vendo uma desvantagem.module.userRequest
(e provavelmente o carregador está dentronode_modules
). Meu código paraisExternal()
:return typeof module.userRequest === 'string' && !!module.userRequest.split('!').pop().match(/(node_modules|bower_components|libraries)/);
Não sei se entendi perfeitamente o seu problema, mas como tive um problema semelhante recentemente, tentarei ajudá-lo.
Pacote de fornecedores.
Você deve usar o CommonsChunkPlugin para isso. na configuração, você especifica o nome do pedaço (por exemplo
vendor
) e o nome do arquivo que será gerado (vendor.js
).Agora parte importante, você precisa especificar o que significa
vendor
biblioteca e fazer isso em uma seção de entrada. Mais um item na lista de entradas com o mesmo nome do pedaço recém-declarado (por exemplo, 'fornecedor'). O valor dessa entrada deve ser a lista de todos os módulos que você deseja mover paravendor
agrupar. no seu caso, deve ser algo como:JQuery como global
Teve o mesmo problema e resolveu-o com o ProvidePlugin . aqui você não está definindo um objeto global, mas um tipo de shurtcuts para os módulos. ou seja, você pode configurá-lo assim:
E agora você pode simplesmente usar
$
em qualquer lugar do seu código - o webpack o converterá automaticamente emEspero que tenha ajudado. você também pode olhar para o meu arquivo de configuração do webpack que está aqui
Eu amo o webpack, mas concordo que a documentação não é a mais legal do mundo ... mas ei ... as pessoas estavam dizendo a mesma coisa sobre a documentação do Angular no início :)
Editar:
Para ter blocos de fornecedores específicos para pontos de entrada, use CommonsChunkPlugins várias vezes:
e declare diferentes bibliotecas extenrais para arquivos diferentes:
Se algumas bibliotecas estiverem sobrepostas (e para a maioria delas) entre pontos de entrada, você poderá extraí-las para um arquivo comum usando o mesmo plug-in apenas com configurações diferentes. Veja este exemplo.
fonte
Caso você esteja interessado em agrupar automaticamente seus scripts separadamente dos de fornecedores:
Você pode ler mais sobre esse recurso na documentação oficial .
fonte
vendor : Object.keys(pkg.dependencies)
nem sempre funciona e depende de como o pacote é construído.package.json
está definido. Essa solução alternativa funciona na maioria dos casos, mas há exceções nas quais você precisará seguir um caminho diferente. Pode ser interessante postar sua própria resposta à pergunta para ajudar a comunidade.Object.keys(pkg.dependencies)
pacote de tudo !!!! vamos diz que você tem um monte de carregadores listados lá ... sim, isso será incluído !!! por isso tome cuidado ... separar carrefully o que é devDependency eo que é a dependênciadependencies
?Também não tenho certeza se eu entendo completamente o seu caso, mas aqui está o snippet de configuração para criar blocos de fornecedores separados para cada um de seus pacotes configuráveis:
E link para
CommonsChunkPlugin
docs: http://webpack.github.io/docs/list-of-plugins.html#commonschunkpluginfonte
react
só deve estar presente no pacote configurável do fornecedor se for explicitamente requerido pelo pacote configurável1 e pelo pacote configurável2. Eu não deveria ter que especificar isso no arquivo de configuração ... Isso faz sentido? Alguma ideia?