javascript - Webpack - Vaatia kuvia käyttämällä file-loaderia


Käytän Webpackia React-sovelluksessani.

Asensin 'File-loaderin' ja 'Url-loaderin' webpack-konfiguraatiooni.

Kuitenkin en ole varma, miten liittää kuvia komponentteihini. Säilytän kuvan 'src':n 'Data.js'-tiedostossa, josta välitän kuvatiedot React-komponentille.

Minun webpack.config.js-tiedostoni:

...
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
            }
...

React-esityskomponentissani käytän yksinkertaisesti require-komentoa kuvan hakemiseen:

const PreviewTemImgParent = ({ data }) => {
    let img = require( data.get( "src" ));
    return(
        <div className = "card previewImgParent">
            <img
             src = { img }
    ...

Data.js-tiedostossa on absoluuttiset polut (pääsovelluskansio) jokaiselle kuvalle (voin olla väärässä tässä):

export const previewTemImgData = Map({
    body : List.of(
        Map({   // using immutable.js
            src : "app/css/asset/template/png/body/GatheredAtEmpireLine.png",
            alt : "image",
            className : "flipParent",
...

Maailmanlaajuinen hakemiston kuva, mitä sen arvo on:

Mietin, missä teen virheitä ja miten ratkaista tämä?

MUOKKAUS : Luettuani eri lähteitä, tajusin, että webpack tarvitsee viitteen kuvan suhteellisesta sijainnista, joten olen muokannut webpack.config.js tiedostoa seuraavasti:

...
output : {
  path : PATHS.build,
  publicPath : "/",
  filename : "bundle.js"
}
...

Kuitenkin se ei ratkaise ongelmaa. Ohjausta arvostettaisiin suuresti.

Vastaus #1

webpack ei tue asynkronista resurssia nyt, se tarkoittaa, että jos haluat vaatia kuvan, sinun pitäisi vain lähettää sille kuvan polku. juuri näin:

let img = new Image();
img.src = require('./images/1.jpg');

kuvan URL-osoite ei voi olla muuttuja, koska kun webpack pakkaa koodisi, se ei suorita koodiasi, joten muuttujasi arvoa ei voi tietää.

jos todella haluat käyttää require-asynkronisesti. voit yrittää käyttää require.ensure

Vastaus #2

Ehdotuksia :

1. Käytä url-loader-lataajaa kuville.
Määrittämällä limit webpack-konfiguraatiossa, esimerkiksi: url-loader?limit=8000, jos tiedosto on pienempi kuin 8000 tavua, url-loader toimii kuin file-loader. Upota tiedostot pääsisäänmenon pakettiin. Jos ei, katso kohta 2.

2. Käytä url(osoite) css/scss:ssä kuvien käyttämiseen
Tässä on esimerkki, joka toimii Webpackin ja url-loaderin avulla:
background: url('../images/heroBanner.png') no-repeat center center fixed;

Ja koska tiedosto on tarpeeksi suuri, webpack muuntaa tiedoston aivan kuten muutkin niput tulostuskansioon. Se lähettää HTTP-pyynnön tästä kuvasta, kun verkkosivu latautuu.

https://github.com/EcutDavid/EcutDavid.github.io/blob/8346f18dccdae18c4d6e98eb9b8cc51d62338cb5/src/styles/Header.scss#L2