[英]Webpack doesn't resolve properly my alias
我试图让我的应用程序有一个命名空间作为模块工作,并使用这个命名空间导入我的组件并限制使用相对路径。
虽然,即使我在这里遵循了别名的 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
但它也不起作用。
你知道有什么问题吗?
将别名解析为绝对路径应该可以解决问题:
resolve: {
alias: {
myApp: path.resolve(__dirname, 'src'),
},
extensions: ['', '.js', '.jsx']
}
用一个简单的例子检查这个webpack 解析别名要点。
限制相对路径数量的另一种解决方案是将您的./src
文件夹添加为 根目录而不是别名:
resolve: {
root: [path.resolve('./src')],
extensions: ['', '.js', '.jsx']
}
然后你将能够要求./src
所有文件夹,就好像它们在模块中一样。 例如,假设您有以下目录结构:
.
├── node_modules
├── src
│ ├── components
│ └── utils
您可以像这样从components
和utils
导入:
import Header from 'components/Header';
import { myMethod } from 'utils/myUtils';
类似于为./src
每个文件夹设置别名。
这对许多人来说可能很明显,但是如果您像我一样花了太多时间试图弄清楚为什么从 Windows 或 Mac 迁移到 Linux 时它突然不起作用,然后检查路径中的大小写...
我和项目中的其他人都在使用 Windows 或 Mac,但在家里我喜欢使用双启动 ubuntu。 在克隆我们的代码并运行 webpack 时,我得到了很多Cannot resolve module...
错误。 我花了更多的时间在 node、npm、webpack 或任何东西中搜索一些晦涩的错误,直到我注意到失败模块的路径类似于@app/Shared/settings.js
并且需要是require('@app/shared/settings')
。 Windows 不在乎所以一切都很好,直到我开始在 linux 上工作。 结果证明问题不在于 webpack、node 或其他任何东西,所以这可能就是为什么我没有找到任何人暗示这可能是问题的原因。
希望这可以为某人节省一些时间。 或者也许我只是愚蠢,我不知道。
大多数情况下,这取决于您的项目文件夹结构。 如果您的 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”。
该死! 复制粘贴占用了我很多调试时间
希望这可以帮助因上述原因而面临此类问题的人。
我得到了同样的错误。 最后我发现问题是我写了两次resolve
。 第二个resolve
覆盖了前一个resolve
。 我的代码是这样的:
modules.exports = {
resolve: {
extensions: ['.js', '.jsx'],
alias: {
Components: path.resolve(__dirname, 'src/components/'),
}
},
...
resolve: {
...
}
}
更多帮助可以在Webpack Doc 中找到
我使用没有下一个语法:
resolve: {
alias: {
Data: __dirname + '/src/data'
},
extensions: ['.js', '.jsx', '.json']
}
import points from 'Data/points.json';
就我而言,我想给mobx
别名,这样任何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 LIBRARY_X
链接的,因此我无法删除/统一辅助mobx
文件夹本身)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.