采用webpack配置路径别名(alias)
随着项目模块增多,导入模块的路径越来越长,从视觉和编程体验上带来很差的体验,webpack
提供了配置路径别名的方法,可通过resolve
选项中的alias
来配置。
alias
resolve.alias
选项可以将导入路径映射为一个别名,这样就可以简写文件导入路径。比如原来导入路径为../../../components/user
,通过配置alias
选项:
resolve: {
alias: {
$components: path.resolve(__dirname, 'src/components')
}
}
就可以将../../../components/user
简写为$components/user
extensions
extensions
选项配置可以省略文件路径的后缀名
resolve: {
alias: {
$components: path.resolve(__dirname, 'src/components')
},
extensions: ['.js', '.jsx', '.ts', '.tsx']
}
当同一个目录下存在不同后缀名的文件时,只会匹配第一个。因此如果配置
extensions
选项,要注意给不同后缀名的文件不同命名,或者不要将相同文件名的文件放到同一个目录。
webpack.config.js配置
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx', '.css', '.scss', '.sass', '.svg', '.less'],
alias: {
'axios': path.resolve(__dirname, '../node_modules/axios/dist/axios.js'),
'components': path.resolve(__dirname, '../src/components'),
'model': path.resolve(__dirname, '../src/model'),
'utils': path.resolve(__dirname, '../src/utils'),
'constants': path.resolve(__dirname, '../src/constants'),
'src': path.resolve(__dirname, '../src')
}
},
采用TypeScript
静态检查+ESLint
检查规则的项目,配置好了webpack
的alias, extensions
选项,在项目中采用简短路径引入时,仍然会收到类似的报错: Unable to resolve path to module components/user. eslint(import/no-unresolved)
。
很明显,错误是eslint
报的,因为eslint
无法解析路径,要解决这个问题,还需要配置.eslintrc.json
文件中的ESLint模块引入配置-import/resolver
.eslintrc.json配置
moduleDirectory
指明路径引入模块所在的目录。
"settings": {
"import/resolver": {
"node": {
"extensions": [".js", ".jsx", ".ts", ".tsx"],
"moduleDirectory": ["node_modules", "src/"]
}
}
}
import/resolver
是v0.11
中引入的解析器,用于解析项目中导入的模块,目前实现了webpack
和node
解析以及支持第三方package
的解析。
可以在
import/resolver
直接指定package
的配置,也可以通过添加node
节点,在node
节点中进行更细粒度的控制。
google
之后配置moduleDirectory
,但是报错仍然存在,我项目中使用的.eslintrc.json
文件配置的eslint
,网上关于.eslintrc.json
的配置资料相对.eslintrc.js
类型较少,因此查找资料用了不少时间,好在最终问题得到解决:
配置tsconfig.json
文件中的paths
选项
"paths": {
"components/*": ["src/components/*"],
"stores/*": ["src/stores/*"],
"constants/*": ["src/constants/*"],
"utils/*": ["src/utils/*"]
}
需要给tsconfig.json
配置映射路径,那么typescript-eslint
检查就不会报错了
问题解决。
以上就是在TypeScript+React+ESLint
架构的项目中通过webpack
配置alias
的方法,希望能帮到你。
参考资料
Webpack resolve.alias does not work with typescript?
Using eslint with typescript unable to resolve path to module
ESLint-plugin-import github
转载自:https://juejin.cn/post/7008748509864296456