今天这个事吧,由来已久。
前些日子,团队同学抱怨,vue-cli4配置alias怎么不管用,引用模块必须使用默认的`@`别名才可以,直接使用模块名配置不生效,举例如下。
// 期望使用方式
import config from 'config';
// 被迫使用方式
import config from '@/config';
当模块路径很长的时候,开发同学写起来会疯掉,无法忍受。
想想之前使用webpack没什么问题呀,cli3也是可行的,cli4之前也还行呀,难道是自己手贱升级node_modules包导致出现问题?
------------------------------------------分割线------------------------------------------
今天整理优化代码,想起来这事,觉得它不太不能,不可思议,没有道理,一定是哪里出现问题,使用方式不对导致的配置不生效,遂决定找出解决办法。
检查`vue.config.js`文件,配置alias部分如下:
config.resolve.alias
.set('@', resolve('src'))
.set('api', resolve('src/api'))
.set('assets', resolve('src/assets'))
.set('config', resolve('src/config')) // 测试目标,新增加的config目录
.set('utils', resolve('src/utils'))
.set('store', resolve('src/store'))
.set('types', resolve('src/types'))
.end()
按照如下方式使用:
import {config} from 'config/chart';
很开心的收到这样的提示:
Cannot find module 'config/chart' or its corresponding type declarations.Vetur(2307)
掏出用户手册,前前后后翻了翻好几遍,完全正确,没有问题呀。
重启服务试试,执行`npm run serve`命令。
并没什么用。
哎呀,看下源码吧,那个别名@都管用,这个没道理嘛,enmmm,很年轻,很easy,前方的路,前方的路虽然太凄迷, 请在笑容里为我祝福。
好在webpack咱比较熟。
好在vscode强大的搜索功能。
好在node咱用的也不错。
好在咱看代码速度还挺溜。
啊,原来入口是这样写的!
哦,这不就是webpack封装了一下嘛!
emm,代码写的真简洁,很规范!
哦哟,原来还可以这样搞,学习了!
咦?这样也行?
也可能是最近迷上看源码(前几天axios/eslint/websocket)。
在@vue/cli-service v4.5.9 找到关键部分如下:
node_modules/@vue/cli-service/lib/config/base.js // 文件名称 L55
webpackConfig.resolve // This plugin can be removed once we switch to Webpack 6
.plugin('pnp')
.use({ ...require('pnp-webpack-plugin') })
.end()
.extensions
.merge(['.mjs', '.js', '.jsx', '.vue', '.json', '.wasm'])
.end()
.modules
.add('node_modules')
.add(api.resolve('node_modules'))
.add(resolveLocal('node_modules'))
.end()
.alias
.set('@', api.resolve('src')) // line 55
.set('config', api.resolve('src/config')) // 个人新增
重启服务,执行命令。!!!可恶,红色波浪线还在。
我就不信啦,注释掉源码中L55 `.set('@', api.resolve('src'))`这句,vue.config.js中也注释掉。
重启服务,执行命令。-----> 毫无变化。
删除node_modules下的cache目录,重启,命令------> 毫无变化。
我很气愤,关闭这瘪犊子,尿尿。
喝了一大杯水,扯犊子回来后,打开IDE,,,震惊
红波浪线没了
不报错了
执行命令`npm run serve`------> 成功啦,what?
还是重启大法好啊。
------------------------------------------分割线------------------------------------------
这就是我一下午的故事,IDE,你大爷的。
顺路把typescript的别名配置也搞了,如下:
"paths": {
"*": ["*", "src/*"], // 新增此行
"@/*": ["src/*"]
}
这样在ts文件中也可以直接引入,不需要`@/`.
// home.ts
import Api from 'api'; // 目录结构 src/api/index.ts
还留下一个疑问:为什么会这样?IDE识别的速度很慢?有缓存?什么原理?即使注释多数的set('@'),为什么代码里还是能够找到文件,这表示注释没生效呀,注释一定是生效的,只是没有触发?寻求组织交流。