このようにwebpack.config.jsを書くと
module.exports = {
entry: './index.jsx',
output: {
filename: 'bundle.js'
},
module: {
loaders: [{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: ['es2015', 'react']
}
}]
}
};
そして、index.jsx
でreact
モジュールをインポートしますApp
import React from 'react';
import { render } from 'react-dom';
import App from './containers/App';
let rootElement = document.getElementById('box')
render(
<App />,
rootElement
)
App.jsx
でモジュールappという名前を付けた場合、webpackはindex.jsx
でモジュールApp
を見つけられないと言いますが、App.js
で名前付きモジュールappを付けた場合、このモジュールを見つけます。うまく機能します。
だから、私はそれについて混乱しています。 webpack.config.js
で、ファイルをチェックするためにtest: /\.jsx?$/
と書きましたが、なぜ*.jsx
という名前が見つからないのですか?
Webpackは.jsx
ファイルを暗黙的に解決することを知りません。アプリでファイル拡張子を指定できます(import App from './containers/App.jsx';
)。現在のローダーテストでは、jsx拡張子を持つファイルを明示的にインポートするときにbabelローダーを使用するように指示されています。
または、明示的な宣言なしにwebpackが解決する拡張機能に.jsx
を含めることができます。
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'],
}
};
Webpack 2の場合、空の拡張機能は省略します。
resolve: {
extensions: ['.js', '.jsx']
}
上記の答えに加えて、
resolveプロパティは、アプリケーションで使用しているすべてのファイルタイプを追加する必要がある場所です。
。jsxまたは.es6ファイルを使用するとします。ここに喜んでそれらを含めることができ、webpackはそれらを解決します:
resolve: {
extensions: ["", ".js", ".jsx", ".es6"]
}
resolveプロパティに拡張機能を追加する場合、importステートメントからそれらを削除できます。
import Hello from './hello'; // Extensions removed
import World from './world';
コーヒースクリプトを検出したい場合のような他のシナリオでは、testプロパティも設定する必要があります。
// 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']
}
};
読みやすさとコピーアンドペーストコーディングのため。このスレッドの mr rogers コメントからのwebpack 4の回答を以下に示します。
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
resolve: {
extensions: [".js", ".jsx"]
},
use: {
loader: "babel-loader"
}
},
]
}
@maxからの回答に関するコメントで述べたように、webpack 4の場合、次のように、モジュールの下にリストされているルールの1つにこれを配置する必要があることがわかりました。
{
module: {
rules: [
{
test: /\.jsx?$/,
resolve: {
extensions: [".js", ".jsx"]
},
include: ...
}
]
}
}
私は同様の問題に直面しており、resolveプロパティを使用して解決できました。
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']
}
}
あなたが見ることができるように、私はそこに.jsxを使用しており、次のエラーを解決しました
./src/app.jsxモジュールのエラーが見つかりません:エラー:解決できません
参考: https://webpack.js.org/configuration/resolve/#resolve-extensions
Bundle.jsがエラーなしで生成されていることを確認します(タスクランナーログを確認します)。
コンポーネントレンダリング機能のhtmlの構文エラーのため、「jsxという名前のファイルの場合、モジュールが見つかりません」と表示されていました。