Tenho algumas coisas para desenvolvimento - por exemplo, simulações com as quais gostaria de não sobrecarregar meu arquivo de construção distribuído.
No RequireJS, você pode passar uma configuração em um arquivo de plug-in e exigir coisas condicionalmente com base nisso.
Para o webpack, não parece haver uma maneira de fazer isso. Em primeiro lugar, para criar uma configuração de tempo de execução para um ambiente, usei resolve.alias para reposicionar uma exigência dependendo do ambiente, por exemplo:
// All settings.
var all = {
fish: 'salmon'
};
// `envsettings` is an alias resolved at build time.
module.exports = Object.assign(all, require('envsettings'));
Então, ao criar a configuração do webpack, posso atribuir dinamicamente para quais envsettings
pontos de arquivo (ou seja webpackConfig.resolve.alias.envsettings = './' + env
).
No entanto, gostaria de fazer algo como:
if (settings.mock) {
// Short-circuit ajax calls.
// Require in all the mock modules.
}
Mas obviamente não quero construir nesses arquivos fictícios se o ambiente não for fictício.
Eu poderia reposicionar manualmente todos esses requisitos em um arquivo stub usando resolve.alias novamente - mas existe uma maneira que pareça menos hacky?
Alguma ideia de como posso fazer isso? Obrigado.
fonte
Respostas:
Você pode usar o plugin define .
Eu o uso fazendo algo tão simples quanto isso em seu arquivo de compilação do webpack, onde
env
é o caminho para um arquivo que exporta um objeto de configurações:e então isso em seu código
Ele removerá esse código de seu arquivo de construção se a condição for falsa. Você pode ver um exemplo de construção de Webpack funcional aqui .
fonte
env
. Olhando através desse exemplo, parece que eles estão lidando com aquele sinalizador via gulp e yargs que nem todo mundo está usando."globals": { "ENV": true }
ao seu .eslintrcNão sei por que a resposta "webpack.DefinePlugin" é a principal em todos os lugares para definir as importações / necessidades baseadas no ambiente.
O problema com essa abordagem é que você ainda está entregando todos esses módulos ao cliente -> verifique com webpack-bundle-analyezer, por exemplo. E não reduzindo o tamanho do seu bundle.js :)
Então, o que realmente funciona bem e muito mais lógico é: NormalModuleReplacementPlugin
Então, ao invés de fazer um requisito condicional on_client -> apenas não incluir arquivos não necessários ao pacote em primeiro lugar
espero que ajude
fonte
Use
ifdef-loader
. Em seus arquivos de origem, você pode fazer coisas comoA
webpack
configuração relevante éfonte
Acabei usando algo semelhante à resposta de Matt Derrick , mas estava preocupado com dois pontos:
ENV
(o que é ruim para configurações grandes).require(env)
aponta para arquivos diferentes.O que eu criei é um compositor simples que constrói um objeto de configuração e o injeta em um módulo de configuração.
Aqui está a estrutura do arquivo, estou usando para isso:
O
main.js
contém todas as coisas de configuração padrão:O
dev.js
eproduction.js
material de configuração única espera que substitui a configuração principal:A parte importante é o
webpack.config.js
que compõe a configuração e usa o DefinePlugin para gerar uma variável de ambiente__APP_CONFIG__
que contém o objeto de configuração composto:A última etapa é agora
config.js
, tem a seguinte aparência (usando a sintaxe es6 import export aqui porque está sob webpack):Em seu,
app.js
agora você pode usarimport config from './config';
para obter o objeto de configuração.fonte
outra maneira é usar um arquivo JS como um
proxy
e deixar esse arquivo carregar o módulo de interessecommonjs
e exportá-lo comoes2015 module
, assim:Então você pode usar o módulo ES2015 em seu aplicativo normalmente:
fonte
webpack.optimize.UglifyJsPlugin()
, a otimização do webpack não carregará o módulo, pois o código de linha dentro da condicional é sempre falso, então o webpack remove-o do pacote geradoDiante do mesmo problema do OP e obrigado, por causa do licenciamento, a não incluir determinado código em certas compilações, adotei o webpack-conditional-loader da seguinte maneira:
No meu comando de construção, eu defino uma variável de ambiente apropriada para minha construção. Por exemplo 'demo' em package.json:
A parte confusa que está faltando na documentação que li é que tenho que tornar isso visível em todo o processamento da compilação , garantindo que minha variável env seja injetada no processo global, portanto, em meu webpack.config / demo.js:
Com isso implementado, posso excluir qualquer coisa condicionalmente, garantindo que qualquer código relacionado seja devidamente retirado do JavaScript resultante. Por exemplo, em meu routes.js, o conteúdo de demonstração é mantido fora de outras compilações, assim:
Isso funciona com o webpack 4.29.6.
fonte
Tenho lutado para definir env nas configurações do meu webpack. O que eu costumo quero é set env para que ele possa ser alcançado dentro
webpack.config.js
,postcss.config.js
e dentro do aplicativo ponto de entrada em si (index.js
geralmente). Espero que minhas descobertas possam ajudar alguém.A solução que encontrei é passar
--env production
ou--env development
e definir o modo internowebpack.config.js
. No entanto, isso não me ajuda a tornarenv
acessível onde quero (veja acima), então também preciso definirprocess.env.NODE_ENV
explicitamente, conforme recomendado aqui . A parte mais relevante que tenho awebpack.config.js
seguir abaixo.fonte
Use variáveis de ambiente para criar implantações de desenvolvimento e produção:
https://webpack.js.org/guides/environment-variables/
fonte
Embora essa não seja a melhor solução, pode funcionar para algumas de suas necessidades. Se você deseja executar um código diferente no nó e no navegador usando isso funcionou para mim:
fonte