
1.
A entrada instrui o webpack a usar qual arquivo como ponto de partida para iniciar o empacotamento, analisar e construir o gráfico de dependência interna.
2.
A saída instrui o webpack sobre onde gerar os pacotes de recursos empacotados e como nomeá-los.
3. O loader
webpack só pode entender arquivos JavaScript e JSON, que é o recurso integrado do webpack disponível imediatamente. Os carregadores permitem que o webpack processe outros tipos de arquivos e os converta em módulos válidos que podem ser usados por aplicativos e adicionados ao gráfico de dependência.
4.
PluginsPlugins podem ser usados para executar uma ampla gama de tarefas. Os plug-ins variam desde otimização e compactação de empacotamento até redefinição de variáveis no ambiente.
5. Modo modo
(Modo) instrui o webpack a usar a configuração do modo correspondente.
Vamos dar uma introdução detalhada aos cinco conceitos principais do webpack.
O objeto de entrada é usado pelo webpack para localizar, iniciar e construir o pacote configurável. entrada é o ponto inicial do aplicativo. A partir desse ponto inicial, o aplicativo inicia a execução. Se você passar um array, cada item do array será executado. O ponto de entrada indica qual módulo o webpack deve usar para começar a construir seu gráfico de dependência interna. Após entrar no ponto de entrada, o webpack descobrirá de quais módulos e bibliotecas o ponto de entrada depende (direta e indiretamente).
Regra simples: toda página HTML tem um ponto de partida. Aplicativo de página única (SPA): um ponto de entrada, aplicativo de várias páginas (MPA): vários pontos de entrada.
O valor padrão é ./src/index.js , mas você pode especificar um ponto (ou pontos) de entrada diferente configurando o atributo entry na configuração do webpack. Por exemplo:
//Entrada única - string module.exports = {
entrada: './caminho/para/minha/entrada/arquivo.js',
};
//Múltiplas entradas--array module.exports = {
entrada: ['./src/index.js', './src/add.js']
};
//Múltiplas entradas - objeto module.exports = {
entrada: {
casa: './home.js',
sobre: './about.js',
contato: './contact.js'
}
}; Tipo de valor da entrada:
string: entrada única, empacotada para formar um pedaço, e apenas um arquivo de pacote será gerado no final. O nome padrão do pedaço é a
matriz principal: entrada múltipla, todos os arquivos de entrada serão apenas. forme um pedaço no final. Produza um arquivo de pacote e o nome do pedaço será padronizado como principal. Geralmente usado apenas na função HMR para tornar
o objeto eficaz de atualização a quente do HTML: múltiplas entradas, tantos pedaços quantas forem as chaves e tantos arquivos de pacote são gerados, e cada chave (chave) será o nome do pedaço. No tipo de objeto, o valor de cada chave também pode ser um array, não apenas uma string
output o webpack sobre como gerar e onde gerar seu pacote, ativo e outros pacotes que você empacota ou qualquer coisa carregada usando o webpack . O valor padrão do pacote de saída é ./dist/main.js e outros arquivos gerados são colocados na pasta ./dist por padrão.
Você pode configurar esses processos especificando um campo output na configuração:
//webpack.config.js
const caminho = require('caminho');
módulo.exportações = {
entrada: './caminho/para/minha/entrada/arquivo.js',
saída: {
caminho: path.resolve(__dirname, 'dist'),
nome do arquivo: 'meu-primeiro-webpack.bundle.js',
},
}; Podemos informar ao webpack o nome do pacote e onde o pacote é gerado por meio output.filename e output.path .
2.1.output.filename (nome do arquivo e diretório)
Esta opção determina o diretório e o nome de cada pacote de saída. Esses pacotes serão gravados no diretório especificado pela opção output.path .
Para um único ponto入口, filename será um nome estático. No entanto, ao criar vários pacotes configuráveis por meio de vários pontos de entrada, divisão de código ou vários plug-ins, outros métodos devem ser usados para dar a cada pacote um nome exclusivo.
//Entrada única:
módulo.exportações = {
//...
saída: {
nome do arquivo: 'js/bundle.js'
}
};
//Múltiplas entradas--use o nome da entrada:
módulo.exportações = {
//...
saída: {
nome do arquivo: '[nome].bundle.js'
}
};
//Múltiplas entradas - use um hash exclusivo para gerar module.exports = { em cada processo de construção
//...
saída: {
nome do arquivo: '[nome].[hash].bundle.js'
}
};
... 2.2.output.path (diretório de arquivo)
output.path especifica o diretório de todos os arquivos de saída, que é o diretório comum para todas as saídas futuras de recursos. path deve ser um caminho absoluto.
módulo.exportações = {
//...
saída: {
caminho: path.resolve(__dirname, 'dist/assets')
}
}; 2.3. output.publicPath (prefixo do caminho dos recursos referenciados)
publicPath especifica o prefixo do caminho público introduzido por todos os recursos no arquivo html. Não afeta o caminho do arquivo gerado. Em vez disso, quando o arquivo html introduz vários recursos, publicPath é adicionado como um prefixo ao caminho dos recursos importados.
Exemplo:
Na configuração do webpack gerada por vue-cli, o valor de publicPath no ambiente de produção é padronizado como '/', que é o diretório raiz do diretório atual.


Após o empacotamento, abrimos o arquivo html e podemos ver que o caminho do recurso introduzido no arquivo html é:

Como você pode ver, o símbolo / é adicionado na frente do caminho. Ao abrirmos o navegador para acessar o arquivo html gerado, encontraremos um erro O recurso não pode ser acessado e um relatório 404 é relatado. Neste momento, o acesso ao recurso é semelhante ao seguinte:

Pode ser o seguinte no servidor, mas pode haver problemas para acessá-lo.

Podemos alterar publicPath para um caminho relativo ou comentá-lo diretamente.
2.3.1. A diferença entre path e publicPath
打包后文件在硬盘中的存储位置,是webpack所有文件的输出的路径,必须是绝对路径。比如:输出的js、图片,HtmlWebpackPlugin生成的html文件等,都会存放在以path为基础的目录下。2.4.output.chunkFilename (nome do bloco não-entrada)
output.chunkFilename determina o nome do arquivo do bloco não-entrada. Ou seja, além dos pedaços gerados pelo arquivo de entrada, são nomeados os arquivos de pedaços gerados por outros arquivos.
módulo.exportações = {
//...
saída: {
chunkFilename: 'js/[name]_chunk.js' //O nome do bloco sem entrada}
}; O próprio carregador webpack só pode empacotar arquivos JavaScript e JSON ( webpack3+和webpack2+ possuem processamento integrado de arquivos JSON, mas webpack1+并不支持, precisa introduzir json-loader ). webpack disponível imediatamente. O próprio Webpack não oferece suporte ao empacotamento de outros tipos de arquivos, como CSS, Vue, etc., mas podemos usar vários carregadores para permitir que o webpack processe esses tipos de arquivos. O carregador pode converter arquivos de diferentes linguagens (como TypeScript) para JavaScript ou converter imagens embutidas em URLs de dados. O carregador ainda permite import arquivos CSS diretamente em módulos JavaScript!
Ao usar diferentes loader , webpack tem a capacidade de chamar scripts ou ferramentas externas para processar arquivos em diferentes formatos, como analisar e converter scss em css ou converter arquivos JS de próxima geração (ES6, ES7) em arquivos JS compatíveis com navegadores modernos. Para o desenvolvimento do React, os carregadores apropriados podem converter arquivos JSX usados no React em arquivos JS.
Na configuração do webpack, o loader possui dois atributos:
o atributo test , que identifica quais arquivos serão convertidos.
O atributo use define qual carregador deve ser usado ao realizar a conversão.
include/exclude(可选): adicione manualmente arquivos (pastas) que devem ser processados ou bloqueie arquivos (pastas) que não precisam ser processados
query(可选) : forneça opções de configuração adicionais para carregadores
// Exemplo: webpack.config js.
const caminho = require('caminho');
módulo.exportações = {
saída: {
nome do arquivo: 'meu-primeiro-webpack.bundle.js',
},
módulo: {
regras: [
{ teste: /.txt$/, carregador: 'raw-loader' },
{ test: /.css$/, use: ['style-loader', 'css-loader'] } //Se você usar vários carregadores, você deve usar use
],
},
}; Na configuração acima, o atributo rules é definido para um objeto de módulo separado, que contém dois atributos obrigatórios: test e use . Isso equivale a dizer ao compilador do webpack que, quando ele encontrar um caminho analisado como '.txt' na instrução require() / import , use raw-loader para convertê-lo antes de empacotá-lo.
Se você usar vários carregadores, você deve usar use Os carregadores no array use são executados em ordem: da direita para a esquerda, em sequência. Por exemplo, no arquivo css acima, primeiro o css-loader compilará o arquivo css em JS e o carregará no arquivo JS. Em seguida, o style-loader criará uma tag de estilo e inserirá os recursos de estilo em JS na tag head.
3.1. CSS-loader
O Webpack fornece duas ferramentas para processar folhas de estilo, css-loader e style-loader . css-loader permite que você introduza arquivos css usando um método semelhante ao import . style-loader adiciona todos os estilos calculados à página. A combinação dos dois permite incorporar folhas de estilo em arquivos JS empacotados pelo webpack. arquivo pode ser introduzido no arquivo JS.
//Instalar npm install --save-dev style-loader css-loader //Se a versão do css-loader for muito alta, a compilação pode dar errado. Recomenda-se diminuir a versão disponível, como [email protected].
//Usar módulo.exportações = {
...
módulo: {
regras: [
{
teste: /(.jsx|.js)$/,
usar: {
carregador: "babel-loader"
},
excluir: /node_modules/
},
{
test: /.css$/, //Como introduzir vários carregadores no mesmo arquivo. A ordem de ação dos carregadores é que os carregadores posteriores comecem a agir primeiro: [
{
carregador: "carregador de estilo"
}, {
carregador: "css-loader"
}
]
}
]
}
}; Suponha que exista um arquivo main.css:
body {
fundo: verde;
} Para que o webpack encontre o arquivo "main.css", nós o importamos para "main.js", da seguinte forma:
//main.js
importar React de 'react';
importe {render} de 'react-dom';
importar o Greeter de './Greeter';
import './main.css';//Use require para importar o arquivo css render (
<Greeter />, document.getElementById('root')); ser empacotado como um arquivo css separado. No entanto, com a configuração apropriada, o webpack também pode empacotar css em arquivos separados.
são usados para converter certos tipos de módulos, enquanto plug-ins podem ser usados para executar uma gama mais ampla de tarefas, incluindo: otimização de empacotamento, compactação, gerenciamento de recursos, injeção de variáveis de ambiente, etc. O objetivo do plug-in é resolver outras coisas que o carregador não consegue realizar.
Para usar um plugin, precisamos instalá-lo via npm e então adicionar uma instância do plugin na propriedade plugins. Como os plugins podem carregar parâmetros/opções, você deve passar a new instância para plugins na configuração do webpack. A maioria dos plug-ins pode ser personalizada por meio de opções e você pode usar o mesmo plug-in diversas vezes para finalidades diferentes em um arquivo de configuração.
//webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin'); // Instalar via npm const webpack = require('webpack'); // Usado para acessar plug-ins integrados module.exports = {
módulo: {
regras: [{ teste: /.txt$/, use: 'raw-loader' }],
},
plug-ins: [novo HtmlWebpackPlugin({modelo: './src/index.html' })],
}; No exemplo acima, html-webpack-plugin gera um arquivo HTML para a aplicação e injeta automaticamente todos os pacotes gerados.
4.1. Plug-in BannerPlugin (adicionando declaração de direitos autorais)
Abaixo adicionamos um plug-in que adiciona uma declaração de direitos autorais ao código do pacote. Este plug-in é um plug-in integrado no webpack e não precisa ser instalado.
const webpack = require('webpack');
módulo.exportações = {
...
módulo: {
regras: [
{
teste: /(.jsx|.js)$/,
usar: {
carregador: "babel-loader"
},
excluir: /node_modules/
},
{
teste: /.css$/,
usar: [
{
carregador: "carregador de estilo"
}, {
carregador: "css-loader",
opções: {
módulos: verdadeiro
}
}, {
carregador: "postcss-loader"
}
]
}
]
},
plug-ins: [
novo webpack.BannerPlugin('Wenxuehai Todos os direitos reservados, qualquer reprodução será investigada')
],
}; 4.2. Plug-in Hot Module Replacement (carregamento a quente)
Hot Module Replacement (HMR) é um plug-in muito útil no webpack. Ele permite atualizar e visualizar automaticamente o efeito modificado em tempo real após modificar o código do componente. O carregamento a quente é diferente do webpack-dev-server Quando o aplicativo está em execução, a substituição a quente pode visualizar o efeito das atualizações de código sem atualizar a página, assim como modificar o estilo dom diretamente no navegador, enquanto o webpack-dev-server requer atualização. a página.
(1) Adicione o plug-in HMR ao arquivo de configuração do webpack;
(2) Adicione o parâmetro "hot" ao Webpack Dev Server
4.2.1. O React implementa o carregamento a quente
. . Babel possui um plug-in chamado react-transform-hrm , que permite que o HMR funcione corretamente sem configuração adicional do módulo React
install react-transform-hmr
npm install --save-dev babel-plugin-react-transform react -transform; -hmr
const webpack = require('webpack');
módulo.exportações = {
entrada: __dirname + "/app/main.js",//O único arquivo de entrada que foi mencionado muitas vezes saída: {
caminho: __dirname + "/public",
nome do arquivo: "bundle.js"
},
devtool: 'eval-source-mapa',
devServidor: {
contentBase: "./public",//O diretório onde a página carregada pelo servidor local está localizada historyApiFallback: true,//Não pular inline: true,
quente: verdade
},
módulo: {
regras: [
{
teste: /(.jsx|.js)$/,
usar: {
carregador: "babel-loader"
},
excluir: /node_modules/
},
{
teste: /.css$/,
usar: [
{
carregador: "carregador de estilo"
}, {
carregador: "css-loader",
opções: {
módulos: verdadeiro
}
}, {
carregador: "postcss-loader"
}
]
}
]
},
plug-ins: [
novo webpack.BannerPlugin('Direitos autorais, qualquer reprodução será investigada'),
novo webpack.HotModuleReplacementPlugin() //Plugin de recarga a quente],
}; Configurar Babel
//.babelrc
{
"predefinições": ["reação", "env"],
"env": {
"desenvolvimento": {
"plugins": [["react-transform", {
"transforma": [{
"transformar": "react-transform-hmr",
"importa": ["reagir"],
"locais": ["módulo"]
}]
}]]
}
}
} //Saudações,js
importar Reagir, {
Componente
} de 'reagir'
importar estilos de './main.css'
class Greeter estende o componente {
renderizar() {
retornar (
<div>
<h1>
aaaf
</h1>
</div>
);
}
}
exportar saudação padrão //main.js
importar React de 'react';
importar {
renderizar
} de 'react-dom';
importar o Greeter de './greeter.js';
render( < Greeter / > , document.getElementById('root')); Agora, se pudermos implementar o módulo de carregamento a quente, poderemos ver o conteúdo atualizado diretamente no navegador sempre que salvarmos, e o navegador não precisará ser atualizado. Atualizar automaticamente.
(Às vezes não há efeito, pode ser um problema de versão)
4.3. Plug-in ExtractTextWebpackPlugin (extraindo css
Por padrão, o webpack não tratará o estilo css como um arquivo independente, mas também empacotará o css em um arquivo js)
.e empacotar o arquivo gerado. Quando o arquivo js for renderizado, o estilo será inserido na página na forma de tag de estilo por meio da sintaxe js. Mas, neste caso, o arquivo do pacote empacotado pode ser muito grande. Neste momento, podemos usar o plug-in ExtractTextWebpackPlugin para separar o estilo CSS em um arquivo CSS.
O plug-in ExtractTextWebpackPlugin moverá o *.css referenciado no bloco de entrada (incluindo o arquivo css importado e o estilo escrito no arquivo vue) para um arquivo CSS independente e separado. ExtractTextPlugin irá gerar um arquivo css correspondente para cada bloco de entrada, o que significa que uma entrada corresponde a um arquivo css. Se houver várias entradas, vários arquivos css correspondentes serão gerados respectivamente.
Com o plug-in ExtractTextWebpackPlugin, seus estilos não serão mais incorporados ao pacote JS, mas serão colocados em um arquivo CSS separado (ou seja, styles.css ). Se seus arquivos de estilo forem maiores, isso tornará o carregamento antecipado mais rápido porque o pacote CSS será carregado em paralelo com o pacote JS.
const ExtractTextPlugin = require("extract-text-webpack-plugin");
módulo.exportações = {
módulo: {
regras: [
{
teste: /.css$/,
usar: ExtractTextPlugin.extract({
substituto: "carregador de estilo",
use: "css-loader"
})
}
]
},
plug-ins: [
novo ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'), //ExtractTextPlugin gera um arquivo correspondente para cada bloco de entrada, portanto, ao configurar vários blocos de entrada, você deve usar [nome], [id ] ou [contenthash]
// allChunks: true, // Ao usar `CommonsChunkPlugin` e há pedaços extraídos (de `ExtractTextPlugin.extract`) no pedaço comum, `allChunks` ** deve ser definido como `true`.
}),
]
} 4.3.1. Opção allChunks (se também extrair estilos carregados de forma assíncrona)
O valor padrão da opção allChunks do plug-in ExtractTextWebpackPlugin é false.
A opção allChunks significa se os estilos carregados de forma assíncrona precisam ser extraídos juntos. Porque por padrão, mesmo que o plug-in ExtractTextWebpackPlugin seja usado, se o estilo ou arquivo de estilo for carregado de forma assíncrona, esses estilos não serão extraídos em arquivos css independentes, mas ainda serão empacotados em arquivos js.
Portanto, allChunks:true allChunks:false é o valor padrão. O valor padrão é extrair o código da entrada, mas o código carregado de forma assíncrona não será extraído; um arquivo. Se o carregamento assíncrono de estilos for usado, mas allChunks estiver definido como falso, precisamos definir o substituto de ExtractTextPlugin.extract. fallback é usar style-loader para carregar de forma assíncrona quando o código CSS carregado pelo código assíncrono não for usado. extraído. O estilo do componente.
Consulte:
https://github.com/sevenCon/blog-github/blob/master/articles/webpack notas de estudo (2) -Uso de ExtractTextWebpackPlugin.md
https://blog.csdn.net/weixin_41134409/article/ detalhes /88416356
Ao selecionar development , production ou none para definir mode , você pode ativar a otimização integrada do webpack no ambiente correspondente. Seu valor padrão é production .
módulo.exportações = {
modo: 'produção',
}; Configurar a opção mode diretamente no arquivo de configuração dirá ao webpack para usar a otimização integrada do modo correspondente. As opções de modo incluem desenvolvimento, produção e nenhum.
desenvolvimento: modo de desenvolvimento, o código empacotado não será compactado e a depuração de código está habilitada.
produção: modo de produção, exatamente o oposto.

Defina o modo para desenvolvimento ou produção e o webpack definirá automaticamente o valor de process.env.NODE_ENV. Podemos obter esse valor diretamente em qualquer pasta. Mas se você definir apenas NODE_ENV , mode não será definido automaticamente. (No nó, a variável global process representa o processo do nó atual. O atributo process.env contém informações do ambiente do usuário. O atributo NODE_ENV não existe no próprio process.env. Geralmente nós mesmos definimos o atributo NODE_ENV e o usamos para determinar se ele é um ambiente de produção ou um ambiente de desenvolvimento)
(Observação: a opção mode é nova no webpack4. Antes de 4, ela era definida com o plug-in DefinePlugin. Webpack4 excluiu o DefinePlugin)
5.1. é explicado em detalhes
no webpack. Geralmente, o valor de NODE_ENV será configurado no arquivo de configuração. No projeto vue gerado por padrão usando vue-cli, a configuração NODE_ENV é a seguinte:
//No arquivo webpack.dev.conf.js, o arquivo dev.env.js é introduzido new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}), //module.exports = merge(prodEnv, { no arquivo dev.env.js
NODE_ENV: '"desenvolvimento"'
}) // No arquivo webpack.prod.conf.js, o arquivo prod.env.js é introduzido const env = require('../config/prod.env')
novo webpack.DefinePlugin({
'process.env': env
}), //module.exports = { no arquivo prod.env.js
NODE_ENV: '"produção"'
} Como você pode ver acima, no ambiente de desenvolvimento, o arquivo de configuração configura NODE_ENV para 'desenvolvimento' no ambiente de produção, o arquivo de configuração configura NODE_ENV para 'produção';
Quando executarmos o projeto, executaremos npm run dev ou npm run build. Esses dois comandos usam o arquivo de configuração do ambiente de desenvolvimento ou ambiente de produção para gerar o projeto em execução e, de acordo, configurar o valor NODE_ENV correspondente. o valor NODE_ENV correspondente pode ser obtido em qualquer arquivo do projeto (não necessariamente no arquivo de configuração, pois depende se o arquivo de configuração configurado com o valor NODE_ENV entrou em vigor).
5.2
O processo de configuração Process.env.NODE_ENV é uma variável global do nó, e o processo possui o atributo env, mas não possui o atributo NODE_ENV. A variável NODE_ENV não está disponível diretamente em process.env, mas é obtida configurando-o. No entanto, NODE_ENV geralmente é usada para definir o tipo de ambiente. A função desta variável é: podemos distinguir o ambiente de desenvolvimento ou o ambiente de produção julgando esta variável.
(1) Os valores das variáveis globais podem ser definidos por meio do plugin DefinePlugin integrado do webpack:
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('produção')
}), após a configuração, você pode obter este valor no script de execução, por exemplo:
// main.js console.log(process.env.NODE_ENV); //produção
mas este valor não pode ser obtido no arquivo de configuração do webpack webpack.config.js.
(2) Primeiro baixe o pacote cross-env através da
configuração do pacote cross-env:
cnpm i cross-env -D
Defina o arquivo package.json:
"build": "cross-env NODE_ENV=test webpack --config webpack.config .js"
Neste momento, o valor (process.env.NODE_ENV) pode ser obtido no arquivo de configuração, mas não pode ser obtido no script executável. Ele precisa ser usado com o plug-in DefinePlugin.