Webpack 无法正确解析我的别名

Posted

技术标签:

【中文标题】Webpack 无法正确解析我的别名【英文标题】:Webpack doesn't resolve properly my alias 【发布时间】:2016-07-21 19:18:33 【问题描述】:

我正在尝试为我的应用程序提供一个命名空间以作为模块工作,并使用此命名空间导入我的组件并限制相对路径的使用。

尽管我在这里遵循了 webpack 文档的别名:http://webpack.github.io/docs/configuration.html#resolve-alias 我无法让它工作。

这就是我的解析对象的样子:

resolve: 
  root: path.resolve(__dirname),
  alias: 
    myApp: './src',
  ,
  extensions: ['', '.js', '.json', '.jsx']

path.resolve(__dirname) 解析/Users/Alex/Workspace/MyAppName/ui/

我以这种方式将我的文件导入文件/Users/Alex/Workspace/MyAppName/ui/src/components/Header/index.jsx

import  myMethod  from 'myApp/utils/myUtils';

我在构建过程中收到以下错误:

ERROR in ./src/components/Header/index.jsx
Module not found: Error: Cannot resolve module 'myApp/utils/myUtils' in /Users/Alex/Workspace/MyAppName/ui/src/components/Header
 @ ./src/components/Header/index.jsx 33:19-56

我也尝试了modulesDirectories,但它也不起作用。

你知道出了什么问题吗?

【问题讨论】:

而您尝试直接在别名中解析路径,例如:myApp: path.resolve( __dirname, 'src' ) 我试过了,还是不行...同样的错误。 alias: myApp: 'src' 怎么样?这就是我的设置。 你肯定有src/utils/myUtils.jssrc/utils/myUtils/index.js 我试过src 也不起作用。文件名是myUtils.js,但它应该根据extensions 属性来解析它。 【参考方案1】:

将别名解析为绝对路径应该可以解决问题:

resolve: 
  alias: 
    myApp: path.resolve(__dirname, 'src'),
  ,
  extensions: ['', '.js', '.jsx']

用一个简单的例子检查这个webpack resolve alias gist。

另一种限制相对路径数量的解决方案是将您的 ./src 文件夹添加为 root 而不是别名:

resolve: 
  root: [path.resolve('./src')],
  extensions: ['', '.js', '.jsx']

然后您将能够要求 ./src 内的所有文件夹,就好像它们在模块中一样。例如,假设您具有以下目录结构:

.
├── node_modules
├── src
│   ├── components
│   └── utils

您可以像这样从componentsutils 导入:

import Header from 'components/Header';
import  myMethod  from 'utils/myUtils';

类似于为./src 中的每个文件夹设置一个别名。

【讨论】:

我也试过这个,但我无法让它工作。它创建构建,但不断抛出此错误。看起来我的问题在其他地方......【参考方案2】:

我使用没有下一个语法:

resolve: 
        alias: 
            Data:  __dirname + '/src/data'
        ,
        extensions: ['.js', '.jsx', '.json']

    

import points from 'Data/points.json';

【讨论】:

【参考方案3】:

这对很多人来说可能很明显,但如果你像我一样,花了太多时间试图弄清楚为什么它在从 Windows 或 Mac 迁移到 Linux 时突然不起作用,那么请检查路径中的大小写...

我和项目中的其他人都在使用 Windows 或 Mac,但在家里我喜欢使用双启动 ubuntu。在克隆我们的代码并运行 webpack 时,我遇到了很多 Cannot resolve module... 错误。在我发现失败模块的路径类似于@app/Shared/settings.js 并且要求是require('@app/shared/settings') 之前,我花费的时间比我愿意承认的在节点、npm、webpack 或任何东西中搜索一些模糊的错误要多。 Windows 不在乎,所以在我开始使用 linux 之前一切都很好。事实证明,问题不在于 webpack、node 或其他任何东西,所以这可能就是为什么我没有找到任何人暗示这可能是问题所在。

希望这可以为某人节省一些时间。或者我只是笨,我不知道。

【讨论】:

简而言之:一些操作系统/文件系统区分大小写,所以这个问题不是由于resolve.alias,而是文件系统上的文件查找方式。【参考方案4】:

我遇到了同样的错误。最后我发现问题是我写了两次resolve。第二个resolve 覆盖前一个。 我的代码是这样的:

modules.exports = 
 resolve: 
    extensions: ['.js', '.jsx'],
    alias: 
      Components: path.resolve(__dirname, 'src/components/'),
    
  ,
  ...
  resolve: 
    ...
  

更多帮助可以在Webpack Doc找到

【讨论】:

【参考方案5】:

大多数情况下,这取决于您的项目文件夹结构。如果你的 webpack 文件在一个文件夹中,那么请确保你相应地处理它

.
├── node_modules
├── src
│   ├── components
│   └── config/webpack.config.js
modules.exports = 
 resolve: 
    extensions: ['.js', '.jsx'],
    alias: 
      Components: path.resolve(__dirname, '../src/components/'),
    
  ,
  ...
  resolve: 
    ...
  

我们经常将文件夹命名为“source”,但在路径中使用“src”。

该死!复制粘贴占用了我很多调试时间

希望这对由于上述原因而面临此类问题的人有所帮助。

【讨论】:

【参考方案6】:

在我的例子中,我想给mobx 起别名,这样mobx 的任何导入都将始终返回相同的实例,无论导入调用是来自我的主应用程序,还是来自它的其中一个库用过。

一开始我是这样的:

webpackConfig.resolve.alias = 
    mobx: path.resolve(root, "node_modules", "mobx"),
;

但是,这只会强制从我的应用自己的代码中导入 mobx 以使用别名。

要让它也适用于库的导入调用,我必须这样做:

webpackConfig.resolve.alias = 
    mobx: path.resolve(root, "node_modules", "mobx"),
    "LIBRARY_X/node_modules/mobx": path.resolve(root, "node_modules", "mobx"),
;

这很奇怪,因为我很确定以前 mobx 别名在这两种情况下都可以使用,但现在显然不行了(Webpack v4.41.2)。

无论如何,以上是我解决它的方法。 (在我的情况下,我需要它来防止两个 mobx 实例被使用,因为这会破坏事情,并且 LIBRARY_X 是使用 npm-link 进行符号链接的,所以我无法删除/统一辅助 mobx 文件夹本身)

【讨论】:

以上是关于Webpack 无法正确解析我的别名的主要内容,如果未能解决你的问题,请参考以下文章

Gatsby - webpack 无法使用 `gatsby-plugin-alias-imports` 解析别名导入

React Webpack 错误“找不到模块:错误:无法解析 'public/bundle.js' in..”/“字段 'browser' 不包含有效的别名配置”

Vue.js props img src 与 webpack 别名 (@) 绑定

使用 ts-jest 和 webpack 允许 Jest 识别和解析模块别名需要啥?

PhpStorm 无法识别使用 webpack 别名导入的 Sass 文件

使用 Jest 和 Webpack 别名进行测试