我写这样的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?$/
的文件?
答案 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