【99.9%解决】vue3+vite+typescript+vscode使用@alias路径别名配置不正确导致红色波浪线的解决办法

相信很多人设置了别名“@”后在编辑器内产生了大量的红色波浪线,警告无法读取相关模块。网上针对这个问题都没有好好分析原因,并且提供真正理解之下的解决方案。我在历经各种失败后,总结出这篇文章,希望对大家有所帮助。
当然我因为是匆忙上手vue项目,没有系统去学习nodejsvite等,所以很可能这个问题产生的根本原因只是你我都没仔细看说明书~~~

各种出错情况

在这里罗列一下我曾出现的问题,大家如果有别的现象,但后来通过本文所提方法解决了,请写在留言里,我会补充进来。

  • vscode编辑器中出现大量红色波浪线警告,这就是路径没配置好的最明显证据;
  • 使用typescript就出错,使用javascript就正常,把<script lang="ts"></script>中的lang="ts"删除后正常;
  • .vue组件页面中用import引入时不出现警告,但在独立的.js.ts文件中引用文件时出现波浪警告;
  • npm run dev时出现错误提示;
  • 编辑器有大量红色警告,但执行npm run dev命令正常启动服务;
  • 无论开发状态下有没有出现红色警告,但执行命令npm run devvite build正常,执行npm run build时却失败,出现类似提示Cannot find module '@/test/types' or its corresponding type declarations (我就一直卡在这里);
  • 编译时提示模块找不到,出现类似src/index.ts:4:31 - error TS7016: Could not find a declaration file for module '@/components/system/Register.vue'. 'E:/Projects/test/src/components/system/Register.vue' implicitly has an 'any' type.的提示

在这里插入图片描述

vite和typescript调用分析

Vite 配置中设置路径别名时,.vue 文件和 .ts 文件的处理方式有所不同。

  • .vue 文件中的路径解析会被 Vite 的插件自动处理。
    比如 .vue非typerscript代码中找不到 @ 别名,很可能是因为vite.config.ts 文件中没有正确配置路径别名。
  • .ts 文件的别名解析可能依赖于 tsconfig.json 的配置。
    比如 .ts 文件中找不到 @ 别名,很可能是因为tsconfig.json 文件中没有正确配置路径别名。

如果这两个没有配置正确,那自然就会出现之前提及的各种错误。
比如单独的ts或ts代码片段里出现错误,那就说明vite配置好了,但typescript没有配置好。

解决方案

不要跳,一步步看,看懂了以后遇到任何类似问题都能解决了。

- 主要配置

这是网上出现的最主要方案,但很可能配完以后还是失败。

  1. 确认 Vite 配置中的路径别名生效:
    vite.config.ts 中,确保别名配置正确,主要写法如下:
// vite.config.ts
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': '/src'
    }
  }
});
  1. tsconfig.json 中设置路径别名:
    确保在 tsconfig.json 文件中加入类似下面的配置,以便 TypeScript 在编译时能正确解析 @,主要写法如下:
// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}

如果配置完成后还是失败,但情况与之前不同了,那么恭喜你,我们将进入下个必要手段:

  1. 开发时虽然路径有波浪线警告,但执行npm run dev命令正常,前端可运行【说明vite.config.ts配置正确】;
  2. 运行vite build正常【说明vite.config.ts配置正确】;
  3. 运行npm run build失败【说明tsconfig.json配置错误】。

- 次要及必要配置(往往是这一步导致的错)

你再仔细看看你的ts.config.json真是写得一摸一样么?反正我不是。。。

用vite首次创建项目时,tsconfig.json往往内容是这样的:

// tsconfig.json
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ]
}

你改完以后的代码往往是这样的:

// tsconfig.json
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ],
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
    	"@/*": ["src/*"],
    }
  }
}

问题就出在这里了。

typescript在解析时,他根据配置引入了 ./tsconfig.app.json 这个配置文件,而这个配置文件可能是这样的;

// tsconfig.app.json
{
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "skipLibCheck": true,

    /* Bundler mode */
    "moduleResolution": "Bundler",
    "allowImportingTsExtensions": true,
    "isolatedModules": true,
    "moduleDetection": "force",
    "noEmit": true,
    "jsx": "preserve",

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedSideEffectImports": true,
  },
  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}

发现没,这里也有一个compilerOptions项,现在你有那种茅塞顿开的感觉了么?
反正当我看到这个的时候恍然大悟了,原来是tm被覆盖了啊!

路径别名配置的生效文件: 由于 tsconfig.json 文件引用了 tsconfig.app.json 和 tsconfig.node.json,要确保这两个文件中没有覆盖 baseUrl 和 paths 配置。一般来说,主要的路径别名配置应位于 tsconfig.app.json 文件中,以便应用编译时可以正确使用别名。

事情到这里都应该知道怎么处理了吧?其实有很多种方式,这里列二种区别明显的:

方法一:覆盖

我让你覆盖,我让你覆盖。
你是不是要覆盖,行,我让你也有,你爱覆盖谁覆盖谁!

// tsconfig.json 原内容不变
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ],
  // 写不写都可以
  /*"compilerOptions": {
    "baseUrl": ".",
    "paths": {
    	"@/*": ["src/*"],
    }
  }*/
}

// tsconfig.app.json
{
  "compilerOptions": {
   // 原配置
    "noUncheckedSideEffectImports": true,
    ... 

	// 不管tsconfig.json写不写,我都给他写一下
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}

方法二:继承

references配置的模块就是子模块,那我让子模块继承extends父模块的衣钵不就行了?

// tsconfig.json
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ],
  // 新增配置
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
    	"@/*": ["src/*"],
    }
  }
}

// tsconfig.app.json
{
  // 加一句:继承,从你爸爸这里继承配置,看谁覆盖谁
  "extends": "./tsconfig.json",
  // 原生配置
  "compilerOptions": {
    "noUncheckedSideEffectImports": true,
    ...
  },
  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}

通过继承,可以在 tsconfig.json 中定义一些通用的配置项,然后在 tsconfig.app.json 中只定义特定的或覆盖的配置项。这样可以减少重复配置,提高维护性。
了解了继承的概念后,以后你可以根据项目需要写不同的配置,然后把他们按需引进来就行了~~
哇哦,有用却用不上的概念又多了一点点。

其它情况

上面的操作基本上能解决99%的问题,现在我再提几个可能存在的情况。

- 安装依赖

在vue里使用typescript,请看一下node_modules/里是不是已经安装了vuevue-tsc,这个问题一般是不存在的,除非你中途从js转到了ts。。。

npm install vue vue-tsc --save-dev

- path在vite.config.ts的应用

有些人喜欢使用 path 模块的 resolve 方法,将 __dirnamesrc 组合成一个绝对路径,更保险一点。

  • 跨平台兼容性:path 模块确保路径在不同操作系统上都能正确解析,避免了路径分隔符不一致的问题。
  • 动态路径生成:path.resolve 可以根据当前文件的位置动态生成路径,适用于项目结构复杂或路径需要动态变化的场景。
  • 可读性和维护性:使用 path 模块的代码更具可读性和维护性,尤其是在大型项目中,路径管理变得更加清晰。
  1. 先安装path模块
cnpm i path
  1. vite.config.ts里设置
...
import path from 'path'

export default defineConfig({
 ...
 resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
    ...
 }
 ...
})
  1. 示例
// 1. path
const path = require('path');

const srcPath = path.resolve(__dirname, 'src');
console.log(srcPath); // 输出: C:\Users\user\project\src

//2. 原始
const srcPath = '/src';
console.log(srcPath); // 输出: /src
  • __dirname 是当前文件 config.js 所在的目录路径,即 C:\Users\user\project。
  • path.resolve(__dirname, ‘src’) 会将 C:\Users\user\project 和 src 组合成一个绝对路径 C:\Users\user\project\src。
    这个路径是正确的,无论你在哪个操作系统上运行,都会生成正确的路径。

- 版本不同、模块冲突、完整安装等问题

这个情况就很复杂了,每个人当前系统都有差异,不太好分析。

比如你在vite.config.ts中配置如下:

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    },
    extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
  },
  // 编译时的配置
  build: {
    outDir: 'dist',
    assetsDir: 'static',
    rollupOptions: {
      input: 'src/main.ts',
    },
  },
  // 配置生产环境的目录,注意process必须配置了 npm i @types/node
  base: process.env.NODE_ENV === 'production' ? '/abc/' : '/',
})

此刻
如果你没有安装path,那path.resolve(__dirname, 'src')path就无法识别
如果你没有安装@types/node,那base: process.env.NODE_ENV === 'production' ? '/abc/' : '/',process就无法识别

只能先安装了

npm i path
npm i @types/node

其它情况你只能根据错误提示来安装了,如果实在不行我建议就删了重新部署一个干净的,再把项目代码放进去就行了。

- 书写错误

昨天为了写这篇文章,为了测试,在我现有代码上做了很多次改动,结果整个系统崩掉了,所以诸位兄弟姐妹一定要仔细看代码啊。

我的错误也是挺特殊的,正好与本文契合:

我的vite.config.ts写成这样了,@多了一个斜杠/

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

// https://vite.dev/config/
export default defineConfig({
  ...
  resolve: {
    alias: {
      '@/': path.resolve(__dirname, 'src')
    }
  },
  ...
})

然后死活整不出了。。。
这个问题解决也简单:

// 1. 方案一,删掉斜杠
...
export default defineConfig({
  ...
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  },
  ...
})

// 2. 方案二,为了斜杠而斜杠
...
export default defineConfig({
  ...
  resolve: {
    alias: {
      '@/': `${path.resolve(__dirname, 'src')}/`
    }
  },
  ...
})

// 3. 方案三,之前已经写过了,这里重申一下:注意斜杠是在前面的
...
export default defineConfig({
  ...
  resolve: {
    alias: {
      '@': '/src'
    }
  },
  ...
})

通过这里的知识点,其实你已经可以写很多自己的别名了,比如你常用目录是在a/b/c,那就搞个别名叫abc呗~~

- vue声明

vscode开发typescript在引用vue时会提示找不到模块,错误提示大概如下:

`src/index.ts:4:31 - error TS7016: Could not find a declaration file for module '@/components/system/Register.vue'. 'E:/Projects/test/src/components/system/Register.vue' implicitly has an 'any' type.`

这时需要在环境配置中加入声明,一般用方法一就够了。

// src/vite-env.d.ts
/// <reference types="vite/client" />

// 定义 .vue 文件的模块声明,使 TypeScript 能够正确识别和处理 Vue 组件
// 1. 方法1:更适合项目中有复杂的组件配置需求,或者需要更精确的类型检查
declare module "*.vue" { 
    import { ComponentOptions } from 'vue'
    const componentOptions: ComponentOptions
    export default componentOptions
}


// 2. 方法2
declare module "*.vue" {
    import Vue from 'vue';
    export default Vue;  
}

// 注意,当自定义目录下有一些常规内容读不了,试试把这个目录也加进去,如下
// 定义路径别名的类型声明
declare module '@/xxxx/*' {
    import type { ComponentOptions } from 'vue'
    const componentOptions: ComponentOptions
    export default componentOptions
}

- 清空缓存重启服务

有时 TypeScript 缓存可能会导致配置更改没有生效。尝试清理缓存(删除 node_modulesdist_vite 等文件夹),然后重新构建。

cnpm install 

也可以重启vite服务

vite --force 

也可以重启vscode

- 文件后缀或目录完整度

这条不是本文的主题,本文主题是@别名,但会有同学因为这个问题导致出错,所以这里提一下。

还记得原生代码中有这句么?

// tsconfig.app.json
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]

目的很明确了,include 就相当于一个白名单,名单里有的文件类型才编译,那为什么有些人必须要写了这句才能解决@的问题呢?
不是tsconfig.app.json里配置了include么?

我猜,我猜啊,他们这一类在tsconfig.json的配置中没有里这个references

  // tsconfig.json
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ],

因为他们的tsconfig.json里既没有include,又没有references引入tsconfig.app.json,所以出错了。

好了,现在知道为什么要加了不?参考下方代码。

"include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]

我目前强迫症,喜欢把 src/**/*.d.ts 给加进去

- baseUrl基目录

compilerOptions中一般要把baseUrl加进去,"baseUrl": "." 的意思就是将项目的基目录为当前目录。

如果你的文件在D:/project/test/tsconfig.ts,那么.就意味着D:/project/test/是基目录,一切从此出发。

"compilerOptions": {
    "baseUrl": ".",
    "paths": {
    	"@/*": ["src/*"],
    }
  }

你可以注意一下这个位置有没有配置错误。

- 小经验

编译的时候两个命令都用一下最好

vite build
npm run build

这两者产生的错误警告有所不同,编译有时候npm没通过,vite却通过了。

总结

- 文字

  1. 因为是 vitetypescript两条线走路,所以有两处需要配置。
  2. 不管你怎么改,万变不离其宗:主旨就是让typescript调用的时候能看到你的完整路径!
  3. 完整路径由 根目录+目录名+文件名+文件后缀 组成,从这几点上去考虑,相信很快就能找到你自己代码的病症,开出准确的方子来解决。

- 代码

这里贴一下较为完整又精简够用的配置代码

// 1. vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

// https://vite.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    },
    extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
  },
  // 编译时的配置
  build: {
    outDir: 'dist',
    assetsDir: 'static',
    rollupOptions: {
      input: 'src/main.ts',
    },
  },
  // 配置生产环境的目录,注意process必须配置了 npm i @types/node
  base: process.env.NODE_ENV === 'production' ? '/abc/' : '/',
})

// 2.tsconfig.json
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ],
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
    	"@/*": ["src/*"]
    }
  }
}

// 3. tsconfig.app.json
{
  "extends": "./tsconfig.json", // 继承自tsconfig.json

  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "skipLibCheck": true,

    /* Bundler mode */
    "moduleResolution": "Bundler",
    "allowImportingTsExtensions": true,
    "isolatedModules": true,
    "moduleDetection": "force",
    "noEmit": true,
    "jsx": "preserve",

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedSideEffectImports": true
  },
  "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}

如果对你有帮助,一键三连!
如果对你有帮助,一键三连!
如果对你有帮助,一键三连!

参考:
vue3+vite+typescript+setup组合式代码风格的模式开发的项目所需的一些必备内容,该安装安装,该创建创建
vue3+vite+ts 配置别名@报错找不到模块
【typescript - tsc 编译后路径问题/路径别名问题】
【解决90%】vue3+vite3+ts使用@alias路径别名爆红解决办法
Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt限制QGraphicsScene QGraphicsItem内部的移动范围

用过QGraphicsView的都知道&#xff0c;原点一般设定在view和item的中心&#xff0c;所以帮助文档和这个网友说的不一定跟我们对的上&#xff1a; 关于Qt限制QGraphicsScene内部Item的移动范围_qgraphicsitem限制移动范围-CSDN博客 首先&#xff0c;设定view的scenerect&…

前端 react 面试题(二)

文章目录 hooks的使用规则为什么hooks要确保在函数组件的最顶层,而不能放置在循环或者条件语句中。react的事件模型react的合成事件是如何实现的react事件传参,可以使用箭头函数或bind方法,这两种哪一种更好使用箭头函数:使用`bind`方法:react的事件模型和vue的区别React …

在IDEA2024中生成SpringBoot模板

1、创建新项目 根据自己想要创建的工程类型选择&#xff0c;这里创建的时web工程 生成项目&#xff1a; 注意&#xff1a;SpringBoot只会扫描主程序所在的包及其下面的子包

(实战)WebApi第10讲:Swagger配置、RESTful与路由重载

一、Swagger配置 1、导入SwashBuckle.AspNetCore包 2、在.NET Core 5框架里的startup.cs文件里配置swagger 3、在.NET Core 6框架里的Program.cs文件里配置swagger 二、RESTful风格&#xff1a;路由重载&#xff0c;HttpGet()括号中加参数 &#xff08;1&#xff09;原则&…

【AI工作流】Coze - 知识库全面指南:功能、应用场景及使用方法详解

文章目录 Coze知识库介绍功能概述应用场景更多文章功能特性丰富的数据源灵活的内容分割 使用限制创建并使用知识库 创建知识库并上传文本内容创建知识库并上传表格数据 维护知识库内容管理知识库管理分段单个分段操作&#xff1a;使用知识库在工作流内使用 Knowledge 节点 更多…

SWAT-MODFLOW地表水与地下水耦合实践技术

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

基于Matlab的图像去噪算法仿真

在信息化的社会里&#xff0c;图像在信息传播中所起的作用越来越大。所以&#xff0c;消除在图像采集和传输过程中而产生的噪声&#xff0c;保证图像受污染度最小&#xff0c;成了数字图像处理领域里的重要部分。 本文主要研究分析邻域平均法、中值滤波法、维纳滤波法及模糊小…

Java打包出现xxx.jar中没有主清单属性解决方案

BUG&#xff1a; xxx.jar中没有主清单属性 出现原因&#xff1a;在打包构建的jar目录内&#xff0c;可以看到有一个MANIFEST.MF文件&#xff0c;如图所示&#xff1a; 可以看到上面没有函数入口Main-Class属性&#xff0c;所以会出现xxx.jar中没有主清单属性&#xff0c;大概率…

庭田科技参与第四届计算机辅助焊接工程与增材制造国际研讨会

2024年10月18日&#xff0c;秋意盎然&#xff0c;魅力泉城济南迎来了一场科技与学术交融的盛宴——第四届计算机辅助焊接工程与增材制造国际研讨会(The 4th International Symposium on Computer-Aided Welding Engineering and Additive Manufacturing- CAWE-AM 2024)。此次盛…

低代码驱动企业新动能一个老牌的PHP低代码平台

低代码驱动企业新动能。 说说如何用最简单的开发方式助力企业转型升级。 我觉得当下所有的公司、所有的信息化部门都需要脚手架、工具、低代码平台来实现企业的快速驱动。 靠什么呢&#xff1f;因为只有企业内部的部门、信息部门跟业务部门等这些关系联系是最紧密的&#xff…

laravel 跨域解决方案

我们在用 laravel 进行开发的时候&#xff0c;特别是前后端完全分离的时候&#xff0c;由于前端项目运行在自己机器的指定端口(也可能是其他人的机器) &#xff0c; 例如 localhost:8000 , 而 laravel 程序又运行在另一个端口&#xff0c;这样就跨域了&#xff0c;而由于浏览器…

基于SSM医药进出口交易系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品信息管理&#xff0c;仓储部门管理&#xff0c;供应部门管理&#xff0c;业务部门管理&#xff0c;客户管理&#xff0c;财务部管理 业务部门账号功能包括&#xff1a;系统首页&#xff0c;个人中…

SMO算法 公式推导

min ⁡ α 1 2 ∑ i 1 N ∑ j 1 N α i α j y i y j K ( x i ⋅ x j ) − ∑ i 1 N α i s.t. ∑ i 1 N α i y i 0 0 ≤ α i ≤ C , i 1 , 2 , ⋯ , N (9-69) \begin{aligned} & \min_{\alpha} \quad \frac{1}{2} \sum_{i1}^{N} \sum_{j1}^{N} \alpha_i \alpha_j…

深度了解flink Flink 本地运行Standalone模式

环境准备 IDEA 必须git 必须maven 必须jdk 1.8 必须scala 2.12.7 源码下载 如果能访问github&#xff0c;下载github的源码(flink的代码托管网站) git clone https://github.com/apache/flink.git 如果不能访问github&#xff0c;可以通过码云下载(国内的代码托管平台) g…

【Nginx系列】Nginx 中的`proxy_set_header`指令:Host 字段的区别与联系

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

SRS:构建实时免费视频服务器的全方位指南

SRS&#xff08;Simple Realtime Server&#xff09;是一个开源的、基于MIT协议的实时视频服务器&#xff0c;以其简单、高效而著称。它支持多种流媒体协议&#xff0c;包括RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等&#xff0c;使其成为直播和WebRTC领域的理想…

混合搜索与多重嵌入:一次有趣又毛茸茸的猫咪搜索之旅!(一)

作者&#xff1a;来自 Elastic Jo Ann de Leon 演示如何在多个嵌入&#xff08;文本和图像&#xff09;上实现不同类型的搜索 - 词汇、向量和混合。它使用一个简单而有趣的猫搜索应用程序。 你知道 Elastic 可以用作强大的向量数据库吗&#xff1f;在本博客中&#xff0c;我们…

二:Linux学习笔记(第一阶段)-- Linux命令

目录 Linux注意事项&#xff1a; Linux目录 Linux系统基础命令 1. 文件和目录操作 2. 文件查看和编辑 3. 文件权限和所有权 4. 系统信息 5. 网络命令 6. 文件查找 7. 压缩和解压缩 8. 系统管理 Linux注意事项&#xff1a; 严格区分大小写一切皆文件windows下的程序不…

Java设计模式之代理模式(一)

什么是代理&#xff1f;可以理解为其他对象提供一种代理以控制对这个对象的访问。 举个例子&#xff0c;生活中的外卖平台&#xff0c;店铺是制作外卖的&#xff0c;然后放到平台上售卖。这里的店铺就是真实角色&#xff0c;为了能够让店铺不用担心销售等问题&#xff0c;从而…

WebSocket 连接频繁断开的问题及解决方案

文章目录 WebSocket 连接频繁断开的问题及解决方案1. 引言2. 什么是 WebSocket&#xff1f;2.1 WebSocket 的优势2.2 WebSocket 的工作原理 3. WebSocket 连接频繁断开的常见原因3.1 服务器端问题3.1.1 服务器负载过高3.1.2 服务器配置不当3.1.3 超时设置 3.2 网络问题3.2.1 网…