把vuecli源码翻了个遍,最后跪在了IDE

1,175 阅读3分钟

今天这个事吧,由来已久。

前些日子,团队同学抱怨,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('@'),为什么代码里还是能够找到文件,这表示注释没生效呀,注释一定是生效的,只是没有触发?寻求组织交流。