web-dev-qa-db-ja.com

jsxという名前のファイルがある場合、webpackはモジュールを見つけることができません

このように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.jsxreactモジュールをインポートします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という名前が見つからないのですか?

enter image description here

79
qiuyuntao

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']
}
169
max

上記の答えに加えて、

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'] 
  }
};
18
Ignatius Andrew

読みやすさとコピーアンドペーストコーディングのため。このスレッドの mr rogers コメントからのwebpack 4の回答を以下に示します。

module: {
  rules: [
    {
      test: /\.(js|jsx)$/,
      exclude: /node_modules/,
      resolve: {
        extensions: [".js", ".jsx"]
      },
      use: {
        loader: "babel-loader"
      }
    },
  ]
}
9

@maxからの回答に関するコメントで述べたように、webpack 4の場合、次のように、モジュールの下にリストされているルールの1つにこれを配置する必要があることがわかりました。

{
  module: {
    rules: [ 
      {
        test: /\.jsx?$/, 
        resolve: {
          extensions: [".js", ".jsx"]
        },
        include: ...
      }
    ]
  }
}
3
mr rogers

私は同様の問題に直面しており、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という名前のファイルの場合、モジュールが見つかりません」と表示されていました。

0
rluks