【问题标题】:webpack can't find module if file named jsx如果文件名为 jsx,webpack 找不到模块
【发布时间】:2016-04-13 05:03:29
【问题描述】:

当我这样写 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的文件?

【问题讨论】:

    标签: reactjs webpack webpack-dev-server


    【解决方案1】:

    Webpack 不知道如何隐式解析 .jsx 文件。您可以在应用程序中指定文件扩展名 (import App from './containers/App.jsx';)。您当前的加载器测试表明当您显式导入具有 jsx 扩展名的文件时使用 babel 加载器。

    或者,您可以将 .jsx 包含在 webpack 无需显式声明即可解析的扩展中:

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

    【讨论】:

    • 对于 webpack 4,我发现我需要把它放在 module 下列出的 rules 之一... { module: { rules: [ { test: /\.jsx?$/, resolve: { extensions: [".js", ".jsx"] }, include: ... } ] }
    • @mrrogers 我到处找这个!先生,我向您致敬!
    • 非常感谢!我找了好几个小时!
    • @mrrogers 考虑将您的评论推广到答案:)
    • 感谢@AlexanderVarwijk。好主意。我自己已经回到这些 cmets 来记住我必须做的事情:)
    【解决方案2】:

    为了可读性和复制粘贴编码。这是此线程中mr rogers 评论的 webpack 4 答案。

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

    【讨论】:

    【解决方案3】:

    添加到上面的答案,

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

    假设您要使用 .jsx 或 .es6 文件;你可以愉快地将它们包含在这里,webpack 会解决它们:

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

    如果您在 resolve 属性中添加扩展,则可以将它们从导入语句中删除:

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

    【讨论】:

    • 在 WebPack 3.4 中,您不能使用值为空的 resolve.extension。这将导致编译异常:“无效的配置对象。Webpack 已使用与 API 架构不匹配的配置对象进行初始化。- configuration.resolve.extensions[0] 不应为空。”
    【解决方案4】:

    正如 @max 的答案中的 cmets 所述,对于 webpack 4,我发现我需要将其放入模块下列出的规则之一中,如下所示:

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

    【讨论】:

      【解决方案5】:

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

      由于组件渲染函数中的 html 语法错误,我得到“如果文件名为 jsx 则找不到模块”。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

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

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

          【讨论】:

            【解决方案8】:

            我发现重启我的服务器解决了这个问题。简单地运行

            npm start
            

            【讨论】:

            • 虽然应该总是尝试重启你的服务器,但这只是重启服务器而不是处理当前的问题。
            • 事实上这个解决方案解决了我的问题。对于不能更改 webpack 代码的 create-react-app 应用程序,这是解决方案。
            猜你喜欢
            • 2016-12-18
            • 2018-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-30
            • 2017-07-25
            • 2017-07-04
            相关资源
            最近更新 更多