webpack은 jsx라는 파일 인 경우 모듈을 찾을 수 없습니다.


107

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가져옵니다.reactApp

import React from 'react';
import { render } from 'react-dom';

import App from './containers/App';

let rootElement = document.getElementById('box')
render(
  <App />,
  rootElement
)

에서 module app이라는 이름을 지정하면 App.jsxwebpack은 in't index.jsxfind module 이라고 말하지만에서 App이름을 지정한 module app이라는 이름을 지정 App.js하면이 모듈을 찾아 잘 작동합니다.

그래서 나는 그것에 대해 혼란 스럽습니다. 내 webpack.config.js에서 test: /\.jsx?$/파일을 확인하기 위해 작성했지만 왜 named *.jsx를 찾을 수 없습니까?

여기에 이미지 설명 입력

답변:


214

Webpack은 .jsx암시 적으로 파일 을 확인하지 않습니다 . 앱에서 파일 확장자를 지정할 수 있습니다 ( import App from './containers/App.jsx';). 현재 로더 테스트는 jsx 확장자를 가진 파일을 명시 적으로 가져올 때 babel 로더를 사용하도록 말합니다.

또는 .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']
}

63
웹팩 4, 나는 내가 중 하나에 넣고하는 데 필요한 것을 발견 rule아래에 나열된의 module...{ module: { rules: [ { test: /\.jsx?$/, resolve: { extensions: [".js", ".jsx"] }, include: ... } ] }
미스터 로저스

1
@mrrogers 나는 이것을 위해 모든 곳에서 검색했습니다! 내 모자를 당신에게 팁!
Frederik Petersen 2018

1
정말 감사합니다! 나는 그것을 몇 시간 동안 찾고 있었다!
KevinH

1
@mrrogers는 :) 답변에 의견을 홍보 고려
알렉산더 Varwijk

@AlexanderVarwijk에게 감사드립니다. 좋은 생각. 나는 내가 무엇을해야했는지 기억하기 위해이 코멘트로 돌아갔다. :)
mr rogers

24

위의 답변에 추가하여

해결의 모든 응용 프로그램에서 사용하는 파일 형식을 추가해야 할 경우 속성입니다.

.jsx 또는 .es6 파일 을 사용한다고 가정 합니다. 기꺼이 여기에 포함 할 수 있으며 webpack에서 해결합니다.

resolve: {
  extensions: ["", ".js", ".jsx", ".es6"]
}

resolve 속성에 확장을 추가 하면 import 문에서 제거 할 수 있습니다.

import Hello from './hello'; // Extensions removed
import World from './world';

커피 스크립트를 감지하려는 경우와 같은 다른 시나리오에서는 다음과 같이 테스트 속성을 구성해야합니다 .

// 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'] 
  }
};

7
WebPack 3.4에서는 값이 비어있는 resolve.extension을 사용할 수 없습니다. 이로 인해 컴파일에서 예외가 발생합니다. "잘못된 구성 개체입니다. API 스키마와 일치하지 않는 구성 개체를 사용하여 Webpack이 초기화되었습니다.-configuration.resolve.extensions [0]은 비워 둘 수 없습니다."
Julio Spader


10

@max의 답변에 대한 의견에서 언급했듯이 webpack 4의 경우 모듈 아래에 나열된 규칙 중 하나에 다음과 같이 넣어야한다는 것을 알았습니다.

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

1

비슷한 문제에 직면했고 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


0

bundle.js가 오류없이 생성되는지 확인합니다 (작업 실행자 로그 확인).

구성 요소 렌더링 기능에서 html의 구문 오류로 인해 'jsx라는 파일이면 모듈을 찾을 수 없습니다'가 표시되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.