javascript - Webpack - Requerer Imagens Usando File-Loader
Estou a usar o Webpack para a minha aplicação React.
Instalei o 'File-loader' e o 'Url-loader' na minha configuração do webpack.
No entanto, não tenho certeza de como ligar imagens aos meus componentes. Estou a guardar o 'src' da imagem num ficheiro 'Data.js', de onde passo os dados da imagem para o componente React.
O meu webpack.config.js:
...
const PATHS = {
app : path.join( __dirname, "app" ),
build : path.join( __dirname, "build" )
};
const common = {
entry : {
app : PATHS.app
},
output : {
path : PATHS.build,
filename : "bundle.js"
},
module : {
preLoaders : [
...
loaders : [
{
test : /\.css$/,
loaders : [ "style", "css" ],
include : PATHS.app
},
{
test : /\.jsx?$/,
loader : "babel",
query : {
cacheDirectory : true,
presets : [ "react", "es2015" ]
},
include : PATHS.app
},
{
test : /\.(jpg|png)$/,
loader : "file-loader?name=[name].[ext]",
include : PATHS.app
}
...
No meu componente de apresentação em React, estou simplesmente a usar require para obter a imagem:
const PreviewTemImgParent = ({ data }) => {
let img = require( data.get( "src" ));
return(
<div className = "card previewImgParent">
<img
src = { img }
...
O ficheiro Data.js tem caminhos absolutos (pasta principal da aplicação) para cada imagem (posso estar a errar aqui):
export const previewTemImgData = Map({
body : List.of(
Map({ // using immutable.js
src : "app/css/asset/template/png/body/GatheredAtEmpireLine.png",
alt : "image",
className : "flipParent",
...
Imagem de diretório global pelo que vale:
Pergunto-me onde estou a cometer os erros e como resolvê-los?
EDITAR : Depois de pesquisar, percebi que o webpack precisa de referência para a posição relativa da imagem, por isso alterei o webpack.config.js para o seguinte:
...
output : {
path : PATHS.build,
publicPath : "/",
filename : "bundle.js"
}
...
No entanto, isso não resolve o problema. A orientação seria muito apreciada.
Resposta #1
O webpack não suporta recursos assíncronos agora, o que significa que se quiser requerer uma imagem, deve apenas enviar o caminho da imagem para ele. exatamente desta forma:
let img = new Image();
img.src = require('./images/1.jpg');
O URL da imagem não pode ser uma variável, porque quando o webpack empacota o seu código, ele não executa o seu código, por isso não pode conhecer o valor da sua variável.
se quiser realmente usar require de forma assíncrona, pode tentar usar require.ensure
Resposta #2
Sugestões :
1. Utilize url-loader para imagens.
Ao especificar o limit na sua configuração do webpack, como: url-loader?limit=8000, se o ficheiro for inferior a 8000 Bytes, o url-loader funciona de forma semelhante ao file-loader. Insira os ficheiros no bundle de saída para a entrada principal. Caso contrário, veja o ponto 2.
2. Usar url(endereço) em css/scss para usar imagens
Aqui está um exemplo que é suportado pelo Webpack e url-loader:
background: url('../images/heroBanner.png') no-repeat center center fixed;
E porque o ficheiro é suficientemente grande, o webpack transforma o ficheiro tal como outros pacotes para o diretório de saída. Ele enviará um pedido HTTP para esta imagem quando a página web estiver a carregar.
https://github.com/EcutDavid/EcutDavid.github.io/blob/8346f18dccdae18c4d6e98eb9b8cc51d62338cb5/src/styles/Header.scss#L2

