Comme j'écris webpack.config.js comme ceci
module.exports = {
entry: './index.jsx',
output: {
filename: 'bundle.js'
},
module: {
loaders: [{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: ['es2015', 'react']
}
}]
}
};
Et dans index.jsx
j'importe un module react
App
import React from 'react';
import { render } from 'react-dom';
import App from './containers/App';
let rootElement = document.getElementById('box')
render(
<App />,
rootElement
)
Je trouve que si j'ai nommé module app dans App.jsx
, puis Webpack dira dans index.jsx
ne pourra pas trouver le module App
, mais si j'ai nommé module app dans App.js
, il trouvera ce module et fonctionnera bien.
Donc, je suis confus à ce sujet. Dans mon webpack.config.js
, j'ai écrit test: /\.jsx?$/
pour vérifier le fichier, mais pourquoi nommé *.jsx
ne peut pas être trouvé?
Webpack ne sait pas résoudre les fichiers .jsx
implicitement. Vous pouvez spécifier une extension de fichier dans votre application (import App from './containers/App.jsx';
). Votre test de chargeur actuel indique d'utiliser le chargeur babel lorsque vous importez explicitement un fichier avec l'extension jsx.
ou, vous pouvez inclure .jsx
dans les extensions que Webpack doit résoudre sans déclaration explicite:
module.exports = {
entry: './index.jsx',
output: {
filename: 'bundle.js'
},
module: {
loaders: [{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: ['es2015', 'react']
}
}]
},
resolve: {
extensions: ['', '.js', '.jsx'],
}
};
Pour Webpack 2, laissez l'extension vide.
resolve: {
extensions: ['.js', '.jsx']
}
Ajoutant à la réponse ci-dessus,
La propriété resol est l'endroit où vous devez ajouter tous les types de fichiers que vous utilisez dans votre application.
Supposons que vous souhaitiez utiliser . Jsx ou .es6 fichiers; vous pouvez les inclure ici et Webpack les résoudra:
resolve: {
extensions: ["", ".js", ".jsx", ".es6"]
}
Si vous ajoutez les extensions dans la propriété resol , vous pouvez les supprimer de l'instruction d'importation:
import Hello from './hello'; // Extensions removed
import World from './world';
D'autres scénarios tels que si vous voulez que le script coffee soit détecté, vous devez configurer votre propriété test ainsi:
// webpack.config.js
module.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
module: {
loaders: [
{ test: /\.coffee$/, loader: 'coffee-loader' },
{
test: /\.js$/,
loader: 'babel-loader',
query: {
presets: ['es2015', 'react']
}
}
]
},
resolve: {
// you can now require('file') instead of require('file.coffee')
extensions: ['', '.js', '.json', '.coffee']
}
};
Dans un souci de lisibilité et de codage copier-coller. Voici le webpack 4 réponse de mr rogers commenter dans ce fil de discussion.
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
resolve: {
extensions: [".js", ".jsx"]
},
use: {
loader: "babel-loader"
}
},
]
}
Comme mentionné dans les commentaires sur la réponse de @max, pour le Webpack 4, j'ai constaté que je devais l'insérer dans l'une des règles répertoriées dans le module, comme suit:
{
module: {
rules: [
{
test: /\.jsx?$/,
resolve: {
extensions: [".js", ".jsx"]
},
include: ...
}
]
}
}
Je faisais face à un problème similaire, et j'ai pu résoudre en utilisant résoudre la propriété .
const path = require('path');
module.exports = {
entry: './src/app.jsx',
output: {
path: path.join(__dirname,'public'),
filename: 'bundle.js'
},
module : {
rules: [{
loader: 'babel-loader',
test: /\.jsx$/,
exclude: /node_modules/
}]
},
resolve: {
extensions: ['.js', '.jsx']
}
}
Comme vous pouvez le voir, j’ai utilisé le fichier .jsx qui a résolu l’erreur suivante
ERREUR dans ./src/app.jsx Module introuvable: erreur: impossible à résoudre
Pour référence: https://webpack.js.org/configuration/resolve/#resolve-extensions
Vérifiez que bundle.js est généré sans erreur (consultez le journal du gestionnaire de tâches).
Je devenais 'ne trouve pas le module si le fichier s'appelle jsx' en raison de l'erreur de syntaxe en HTML dans la fonction de rendu du composant.