webpack:找不到模块:错误:无法解析(使用相对路径)

And*_*ius 12 javascript relative-path npm webpack

我有一个app的结构(node_modulesdir从这个列表中排除):

??? actions.js
??? bundle.js
??? components
?   ??? App.js
?   ??? Footer.js
?   ??? Link.js
?   ??? Todo.js
?   ??? TodoList.js
??? Containers
?   ??? AddTodo.js
?   ??? FilterLink.js
?   ??? VisibleTodoList.js
??? index.html
??? index.js
??? main.js
??? package.json
??? package-lock.json
??? reducers.js
??? webpack.config.js
Run Code Online (Sandbox Code Playgroud)

我的webpack配置如下所示:

module.exports = {
    entry: "./main.js",
    output: {
        path: __dirname,
        filename: "bundle.js"
    },
    module: {
        loaders: [
          {
            test: /\.js$/,
            loader: 'babel-loader',
            query: {
              presets: ['es2015', 'react']
            }
          }
        ]
    }
};
Run Code Online (Sandbox Code Playgroud)

npm config:

{
  "name": "webpack-redux",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "nothing"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel": "^6.23.0",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-env": "^1.6.0",
    "babel-preset-es2015": "^6.24.1",
    "webpack": "^3.5.5"
  },
  "dependencies": {
    "react": "^15.6.1",
    "babel-preset-react": "^6.24.1",
    "react-dom": "^15.6.1",
    "react-redux": "^5.0.6",
    "redux": "^3.7.2"
  }
}
Run Code Online (Sandbox Code Playgroud)

当我运行webpack命令时,我收到此错误:

ERROR in ./components/App.js
Module not found: Error: Can't resolve '../containers/AddTodo' in '/home/oerp/js-programs/redux-test/components'
 @ ./components/App.js 11:15-47
 @ ./index.js
 @ ./main.js

ERROR in ./components/Footer.js
Module not found: Error: Can't resolve '../containers/FilterLink' in '/home/oerp/js-programs/redux-test/components'
 @ ./components/Footer.js 11:18-53
 @ ./components/App.js
 @ ./index.js
 @ ./main.js

ERROR in ./components/App.js
Module not found: Error: Can't resolve '../containers/VisibleTodoList' in '/home/oerp/js-programs/redux-test/components'
 @ ./components/App.js 15:23-63
 @ ./index.js
 @ ./main.js
Run Code Online (Sandbox Code Playgroud)

我的components/App.js内容是这样的:

import Footer from './Footer'
import AddTodo from '../containers/AddTodo'
import VisibleTodoList from '../containers/VisibleTodoList'

const App = () => (
  <div>
    <AddTodo />
    <VisibleTodoList />
    <Footer />
  </div>
)

export default App
Run Code Online (Sandbox Code Playgroud)

例如containers/AddTodo.js:

import { connect } from 'react-redux'
import { addTodo } from '../actions'

let AddTodo = ({ dispatch }) => {
  let input

  return (
    <div>
      <form
        onSubmit={e => {
          e.preventDefault()
          if (!input.value.trim()) {
            return
          }
          dispatch(addTodo(input.value))
          input.value = ''
        }}
      >
        <input
          ref={node => {
            input = node
          }}
        />
        <button type="submit">
          Add Todo
        </button>
      </form>
    </div>
  )
}
AddTodo = connect()(AddTodo)

export default AddTodo
Run Code Online (Sandbox Code Playgroud)

它似乎不理解双点的相对路径,如../something

我是否需要以webpack某种方式配置才能理解这些路径?

小智 20

您的文件结构表明文件夹名称带有大写字母ContainerC.但您尝试container使用小写c 导入它.您需要更改其中一个,因为路径区分大小写.


小智 10

导入库时使用文件的确切路径,包括相对于当前文件的目录,例如:

import Footer from './Footer/index.jsx'
import AddTodo from '../containers/AddTodo/index.jsx'
import VisibleTodoList from '../containers/VisibleTodoList/index.jsx'
Run Code Online (Sandbox Code Playgroud)

希望这可能会有所帮助

  • 这不是必需的,“import Footer from './Footer'”的导入是 100% 有效的 (7认同)

W.P*_*rin 9

I met this problem with typescript but forgot to add ts and tsx suffix to resolve entry.

module.exports = {
  ...
  resolve: {
    extensions: ['.js', '.jsx', '.ts', '.tsx'],
  },
};
Run Code Online (Sandbox Code Playgroud)

This does the job for me


Man*_*raj 9

您必须在 webpack.config.js 中使用以下代码来指示 webpack 解析源代码

module.exports={
   ...
   resolve:{
      extensions:['.js','.jsx'];
   }
}
Run Code Online (Sandbox Code Playgroud)

更新:有一个新的构建工具“Vite”,旨在为现代 Web 项目提供更快、更精简的开发体验。它是一个即插即用工具,需要很少的配置。


tre*_*res 6

刚刚遇到这个...我有一个在多个转译产品之间共享的公共库。我使用符号链接和早午餐来处理项目之间的共享。当迁移到 webpack 时,这不再起作用。

真正起作用的是使用 webpack 配置来关闭符号链接解析。

即添加这个webpack.config.js

module.exports = {
  //...
  resolve: {
    symlinks: false
  }
};
Run Code Online (Sandbox Code Playgroud)

如此处记录的:

https://webpack.js.org/configuration/resolve/#resolvesymlinks