如果文件名为jsx,webpack无法找到模块

时间:2016-01-08 13:32:41

标签: reactjs webpack webpack-dev-server

我写这样的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中命名模块应用,那么webpack会在index.jsx中说不能找到模块App,但如果我在{{{ 1}},它会找到这个模块并且运行良好。

所以,我对此感到困惑。在我的App.js中,我写了webpack.config.js来检查文件,但为什么找不到名为test: /\.jsx?$/的文件?

enter image description here

8 个答案:

答案 0 :(得分:160)

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

答案 1 :(得分:17)

添加上述答案,

resolve 属性是您必须添加在应用程序中使用的所有文件类型的地方。

假设您要使用 .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'] 
  }
};

答案 2 :(得分:5)

出于可读性和复制粘贴编码的目的。这是来自mr rogers评论的webpack 4答案。

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

答案 3 :(得分:1)

正如@max对答案的评论中提到的那样,对于Webpack 4,我发现我需要将其放入模块下列出的规则之一,例如:

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

答案 4 :(得分:0)

验证,生成的bundle.js没有错误(请检查任务运行器日志)。

如果文件名为jsx&#39;我无法找到模块。由于组件渲染功能中html中的语法错误。

答案 5 :(得分:0)

我遇到了类似的问题,并且能够使用 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

答案 6 :(得分:0)

我在构建具有以下 webpack 依赖项的打字稿项目时遇到了类似的导入问题:

"webpack": "^5.28.0",
"webpack-cli": "^4.5.0" 

因此,我在正确的路径中有一个 App.tsx 文件,并使用命名导出导出。但是,yarn build 失败了 Module not found: Error: Can't resolve './App' in '/app/sample_proj/src'。此错误的相关代码是:import {App} from './App';。为了解决这个问题,我不得不在 .tsx 已知扩展下添加 webpack。来自 webpack.config.js 的示例条目是:

 module.exports = {
       ......
       resolve: {
            extensions: [ '.ts', '.js', '.tsx', '.jsx'],
        }
     }

另外,对于这个错误,导入是默认的还是命名的都没有关系。 webpack 只需要知道它应该处理的文件扩展名类型。

答案 7 :(得分:-2)

我发现重新启动服务器可以解决此问题。只需运行

npm start