J'essaie d'afficher une image dans un composant React dans le cadre d'un projet utilisant webpack et webpack-dev-server.
Jusqu'ici j'ai complété les étapes suivantes:
Ayant pris ces mesures, webpack ne parvient pas à compiler avec l'erreur «impossible de trouver le module»:
ERROR in [at-loader] ./src/components/App.tsx:4:26
TS2307: Cannot find module '../images/kitten-header.jpg'.
Ma structure de dossier est la suivante:
/dist
/images
kitten-header.jpg
bundle.js
bundle.js.map
/node_modules
(content ignored for brevity)
/src
/components
App.tsx
/images
kitten-header.jpg
/styles
App.less
index.tsx
index.html
package.json
tsconfig.json
webpack.config.js
Le nouveau chargeur que j'ai ajouté à mon webpack.config.js est:
test: /\.(jpe?g|gif|png|svg)$/, loader: "file-loader?name=./images/[name].[ext]"
J'ai importé le fichier image, dans App.tsx, comme ceci:
import kittenHeader from '../images/kitten-header.jpg';
... et utilisé l'importation dans un tag img comme ceci:
<img src={ kittenHeader } />
Remarque: Les textes complets de webpack.config.js et App.tsx ont été fournis jusqu'à ce que je me rapproche un peu de la réponse et que je réalise qu'ils ne sont pas pertinents (voir la mise à jour 1).
Je suppose que je fais une erreur très triviale en ce qui concerne le chemin relatif dans l'importation. Comme vous pouvez l'imaginer, j'ai essayé diverses alternatives.
Quelqu'un peut-il donner un aperçu?
Pour référence, comme je frappe continuellement des articles et des questions relatives à la mauvaise version de webpack, voici mes versions:
Apparemment, je vais devoir fournir un fichier d.ts ou utiliser une instruction require.
Presque là...
Avec regular require, voici comment je l’utilise dans un fichier tsx:
const logo = require('../assets/logo.png');
...
<img alt='logo' style={{ width: 100 }} src={String(logo)} />
J'espère que cela t'aides. import
ing n'a pas fonctionné pour moi non plus.
Voici comment je le fais fonctionner:
// This declaration can be move in some common .d.ts file, will prevent tslint from throwing error
declare function require(path: string);
const SampleComponent = () => (
<div>
<img src={require('./styles/images/deadline.png')} alt="Test" />
</div>
);
La façon dont vous avez proposé votre réponse finira par écrire la déclaration de modules pour chaque fichier image inséré dans les composants.
En plus de la réponse de mcku, vous pouvez également utiliser les importations de cette façon:
// @ts-ignore
import * as kittenHeader from '../images/kitten-header.jpg';
...
<img alt='logo' style={{ width: 100 }} src={logo} />
Bien que vous deviez ignorer l'avertissement.