webpack không thể tìm thấy mô-đun nếu tệp có tên jsx


107

Khi tôi viết webpack.config.js như thế này

module.exports = {
  entry: './index.jsx',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders: [{
      test: /\.jsx?$/,
      exclude: /node_modules/,
      loader: 'babel',
      query: {
        presets: ['es2015', 'react']
      }
    }]
  }
};

Và trong index.jsxtôi nhập một reactmô-đunApp

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

import App from './containers/App';

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

Tôi thấy nếu tôi đặt tên ứng dụng mô-đun trong App.jsx, thì webpack sẽ thông báo trong index.jsxkhông thể tìm thấy mô-đun App, nhưng nếu tôi đặt tên ứng dụng mô-đun đã đặt tên trong App.js, nó sẽ tìm thấy mô-đun này và hoạt động tốt.

Vì vậy, tôi nhầm lẫn về nó. Trong của tôi webpack.config.js, tôi đã viết test: /\.jsx?$/để kiểm tra tệp, nhưng tại sao *.jsxkhông tìm thấy tên?

nhập mô tả hình ảnh ở đây

Câu trả lời:


214

Webpack không biết giải quyết .jsxcác tệp một cách ngầm định. Bạn có thể chỉ định phần mở rộng tệp trong ứng dụng của mình ( import App from './containers/App.jsx';). Kiểm tra trình tải hiện tại của bạn cho biết sử dụng trình tải babel khi bạn nhập rõ ràng tệp có phần mở rộng jsx.

hoặc, bạn có thể đưa .jsxvào các tiện ích mở rộng mà webpack sẽ giải quyết mà không cần khai báo rõ ràng:

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

Đối với Webpack 2, hãy bỏ đi phần mở rộng trống.

resolve: {
  extensions: ['.js', '.jsx']
}

63
Đối với webpack 4, tôi thấy rằng tôi cần thiết để đặt điều này trong một trong những rules đã được liệt kê dưới module...{ module: { rules: [ { test: /\.jsx?$/, resolve: { extensions: [".js", ".jsx"] }, include: ... } ] }
mr rogers

1
@mrrogers Tôi đã tìm kiếm cái này ở khắp mọi nơi! Tôi ngả mũ của tôi với bạn, thưa ông!
Frederik Petersen

1
cảm ơn bạn rất nhiều! Tôi đã tìm kiếm điều đó trong nhiều giờ!
KevinH

1
@mrrogers Cân nhắc quảng cáo nhận xét của bạn đến một câu trả lời :)
Alexander Varwijk

Cảm ơn @AlexanderVarwijk. Ý tưởng tốt. Bản thân tôi đã quay lại những bình luận này để ghi nhớ những gì tôi phải làm :)
mr rogers

24

Thêm vào câu trả lời ở trên,

Các quyết tài sản là nơi bạn có để thêm tất cả các loại tập tin mà bạn đang sử dụng trong ứng dụng của bạn.

Giả sử bạn muốn sử dụng tệp .jsx hoặc .es6 ; bạn có thể vui vẻ đưa chúng vào đây và webpack sẽ giải quyết chúng:

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

Nếu bạn thêm các tiện ích mở rộng trong thuộc tính giải quyết , bạn có thể xóa chúng khỏi câu lệnh nhập:

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

Các trường hợp khác như nếu bạn muốn phát hiện tập lệnh cà phê, bạn nên định cấu hình thuộc tính thử nghiệm của mình cũng như:

// 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
Trong WebPack 3.4, bạn không thể sử dụng giải quyết.extension với giá trị trống. Điều này sẽ gây ra một ngoại lệ trong quá trình biên dịch: "Đối tượng cấu hình không hợp lệ. Webpack đã được khởi tạo bằng cách sử dụng đối tượng cấu hình không khớp với lược đồ API. - configuration.resolve.extensions [0] không được để trống."
Julio Spader


10

Như đã đề cập trong phần nhận xét về câu trả lời từ @max, đối với webpack 4, tôi thấy rằng tôi cần đặt điều này vào một trong các quy tắc được liệt kê trong mô-đun, như sau:

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

1

Tôi đã gặp sự cố tương tự và có thể giải quyết bằng cách sử dụng thuộc tính giải quyế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']
    }
}

Như Bạn có thể thấy, tôi đã sử dụng .jsx trong đó đã giải quyết được lỗi sau

ERROR trong ./src/app.jsx Mô-đun không tìm thấy: Lỗi: Không thể giải quyết

Để tham khảo: https://webpack.js.org/configuration/resolve/#resolve-extensions


0

Xác minh rằng pack.js đang được tạo mà không có lỗi (kiểm tra Nhật ký chạy tác vụ).

Tôi nhận được 'không thể tìm thấy mô-đun nếu tệp có tên jsx' do lỗi cú pháp trong html trong chức năng kết xuất thành phần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.