Vue项目整合与优化
前几篇文章,我们讲述了 Vue 项目构建的整体流程,从无到有的实现了单页和多页应用的功能配置,但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案,就像大楼造完需要进行最后的项目验收改进一样,有待我们进一步的去完善。
使用 alias 简化路径
使用 webpack 构建过 Vue 项目的读者应该知道 alias
的作用,我们可以使用它将复杂的文件路径定义成一个变量来访问。在不使用 alias 的项目中,我们引入文件的时候通常会去计算被引入文件对于引入它的文件的相对路径,比如像这样:
import HelloWorld from '../../../../HelloWorld.vue'
一旦相对层次结构较深,我们就很难去定位所引入文件的具体位置,其实这并不是我们应该操心的地方,完全可以交给 webpack 来进行处理。在原生的 webpack 配置中我们可以定义 alias 来解决这一问题:
const path = require('path');// 解析路径的函数
const resolve = dir => {return path.join(__dirname, dir); // 将当前目录与给定目录连接
}module.exports = {// 其他配置...resolve: {alias: {'@': resolve('src'), // 将 '@' 映射到 'src' 目录_lib: resolve('src/common'), // 将 '_lib' 映射到 'src/common' 目录_com: resolve('src/components'), // 将 '_com' 映射到 'src/components' 目录_img: resolve('src/images'), // 将 '_img' 映射到 'src/images' 目录_ser: resolve('src/services'), // 将 '_ser' 映射到 'src/services' 目录}},// 其他配置...
}
上方我们在 webpack resolve(解析)对象下配置 alias 对象的值,将常用的一些路径赋值给了我们自定义的变量,这样在配置了别名之后,可以在代码中使用这些别名来导入模块。:
import HelloWorld from '_com/HelloWorld.vue'
alias
对象:定义了一系列别名,这样在你的 JavaScript 或 Vue 文件中,你可以用简短的别名来引用相关目录,而不必使用相对路径
而在 CLI 3.x 中我们无法直接操作 webpack 的配置文件,我们需要通过 chainWebpack (在“Webpack在Vue CLI中的应用”中有较详细的解释)来进行间接修改,代码如下:
/* vue.config.js */
module.exports = {...chainWebpack: config => {config.resolve.alias.set('@', resolve('src')).set('_lib', resolve('src/common')).set('_com', resolve('src/components')).set('_img', resolve('src/images')).set('_ser', resolve('src/services'))},...
}
如果使用 VSCode,可以在 jsconfig.json
或 tsconfig.json
中定义路径,以便编辑器能够识别这些别名:
{"compilerOptions": {"baseUrl": ".","paths": {"@/*": ["src/*"],"_lib/*": ["src/common/*"],"_com/*": ["src/components/*"],"_img/*": ["src/images/*"],"_ser/*": ["src/services/*"]}}
这样我们修改 webpack alias 来简化路径的优化就实现了。但是需要注意的是对于在样式及 html 模板中引用路径的简写时,前面需要加上 ~
符,否则路径解析会失败,如:
.img {background: url('~_img/home.png'); /* 使用 ~ 表示从别名中导入 */
}
拓展1
1.resolve
函数的作用
resolve
函数是一个常用的工具函数,通常用于将相对路径转换为绝对路径。这个函数通过 path.join
方法,将当前文件的目录(由 __dirname
提供)与给定的目录名连接,从而生成一个绝对路径。
在上文的代码中:
const path = require('path');const resolve = dir => {return path.join(__dirname, dir); // 将当前目录与给定目录连接
};
dir:
- 这是函数的参数,代表您希望连接的目录名。它可以是一个相对路径,相对于当前文件的目录
结合起来:
假设项目结构如下:
/my-project├── src│ ├── components│ └── services
可以在 config.js
中使用 resolve
函数来设置别名,如下所示:
const path = require('path');const resolve = dir => {return path.join(__dirname, dir);
};module.exports = {chainWebpack: config => {config.resolve.alias.set('@', resolve('src')) // 将 '@' 映射到 'src' 目录.set('_com', resolve('src/components')) // 将 '_com' 映射到 'src/components' 目录.set('_ser', resolve('src/services')); // 将 '_ser' 映射到 'src/services' 目录}
};
一旦设置了别名,就可以在项目中使用这些别名来导入模块,例如:
// 引入组件
import MyComponent from '_com/MyComponent.vue';// 引入服务
import MyService from '_ser/MyService';
2.使用 ~
前缀的原因
当在样式表或 HTML 模板中引入资源时,如果希望使用 Webpack 的模块解析特性,需要在路径前加上 ~
符号。这样做的目的有几个:
-
模块解析:
~
符号告诉 Webpack 从node_modules
或配置的别名目录中解析路径。这使得开发者可以方便地引用模块或资源,而不必使用相对路径。 -
避免路径错误: 当使用相对路径时,可能会因为文件位置的变化导致路径失效。而使用
~
前缀能够确保路径正确,即使文件位置发生变化。
这里简单的举个例子
在 CSS 文件中
.img {background: url('~_img/home.png'); /* 正确:使用 ~ 前缀 */
}
在 HTML 模板中
如果使用 Vue、React 或其他框架的模板文件,也需要使用 ~
符号来引入样式或资源:
<template><div class="img" style="background-image: url('~_img/home.png');"></div>
</template>
在webpack.config.js
中
const path = require('path');module.exports = {resolve: {alias: {'_img': path.resolve(__dirname, 'src/images'), // 示例别名配置}}
};
-
没有
~
的情况: 如果在路径前面不加~
,Webpack 将会尝试从当前文件位置的相对路径进行解析,这可能会导致找不到文件的错误。
整合功能模块
在多页应用的构建中,由于存在多个入口文件,因此会出现重复书写相同入口配置的情况,这样对于后期的修改和维护都不是特别友好,需要修改所有入口文件的相同配置,比如在 index 单页的入口中我们引用了 VConsole 及 performance 的配置,同时在 Vue 实例上还添加了 $openRouter 方法:
import Vue from 'vue'
import App from './index.vue'
import router from './router'
import store from '@/store/'
import { Navigator } from '../../common'// 如果是非线上环境,不加载 VConsole
if (process.env.NODE_ENV !== 'production') {var VConsole = require('vconsole/dist/vconsole.min.js');var vConsole = new VConsole();//启用 Vue.js 的性能监控功能,可以在 Chrome 开发者工具中查看组件渲染的性能分析Vue.config.performance = true;
}//将 Navigator.openRouter 方法挂载到 Vue 原型上
Vue.$openRouter = Vue.prototype.$openRouter = Navigator.openRouter;new Vue({router,store,render: h => h(App)
}).$mount('#app')
而在 page1 和 page2 的入口文件中也同样进行了上述配置,那我们该如何整合这些重复代码,使其能够实现一次修改多处生效的功能呢?最简单的方法便是封装成一个共用方法来进行调用,这里我们可以在 common 文件夹下新建 entryConfig 文件夹用于放置入口文件中公共配置的封装,封装代码如下:
import { Navigator } from '../index'export default (Vue) => {// 如果是非线上环境,不加载 VConsoleif (process.env.NODE_ENV !== 'production') {var VConsole = require('vconsole/dist/vconsole.min.js');var vConsole = new VConsole();Vue.config.performance = true;}Vue.$openRouter = Vue.prototype.$openRouter = Navigator.openRouter;
}
上述代码我们向外暴露了一个函数,在调用它的入口文件中传入 Vue 实例作为参数即可实现内部功能的共用,我们可以将原本的入口文件简化为:
import Vue from 'vue'
import App from './index.vue'
import router from './router'
import store from '@/store/'
import entryConfig from '_lib/entryConfig/'// 调用公共方法加载配置
entryConfig(Vue)new Vue({router,store,render: h => h(App)// 使用 render 函数渲染 App 组件
}).$mount('#app') // 将根实例挂载到 id 为 app 的 DOM 元素上
h
是createElement
的别名。render函数的这个用法是反应式的,并且它的结构相对简洁。
这样我们便完成了入口文件配置的整合,当然你还可以给该函数传入 router 实例及自定义参数用于其他共用配置的封装。
拓展2
1.VConsole的作用
VConsole
是一个轻量级的移动端调试工具,主要用于在移动设备上调试 JavaScript 应用。它提供了一个可视化的控制台,让开发者能够轻松查看日志、网络请求、错误信息和其他调试信息,类似于浏览器开发者工具的控制台功能。
主要特性
-
日志记录: 您可以在 VConsole 中查看
console.log
,console.error
,console.warn
, 和console.info
等输出的日志信息。 -
网络请求监控: VConsole 能够捕获和显示应用发出的网络请求,包括请求的 URL、方法、状态码和响应时间等信息。
-
原生错误捕获: 捕获 JavaScript 运行时错误并在控制台中显示错误信息,方便调试。
-
元素查看: 可以查看和操作 DOM 元素的状态(在某些情况下)。
-
支持自定义功能: 开发者可以扩展 VConsole 的功能,添加自定义的面板和功能。
下面介绍它的基础用法
安装
要在项目中使用 vconsole
,首先需要安装它。可以通过 npm 或 yarn 安装:
npm install vconsole && yarn add vconsole
然后,在应用中引入并实例化它:
import VConsole from 'vconsole';// 仅在开发环境中启用 VConsole
if (process.env.NODE_ENV !== 'production') {const vConsole = new VConsole();
}
简单的 VConsole 使用示例
import VConsole from 'vconsole';if (process.env.NODE_ENV !== 'production') {const vConsole = new VConsole(); // 实例化 VConsole
}// 示例日志
console.log('Hello, VConsole!');
console.error('This is an error message!');
2.render函数的详细介绍
1. render
函数的基本概念
在 Vue.js 中,render
函数是一种编程方式来描述组件如何生成虚拟 DOM。每当 Vue 组件的状态变化时,render
函数会被重新调用,生成新的虚拟 DOM,并与之前的虚拟 DOM 进行比较以实现高效的更新。
2. render
函数的结构
render
函数通常在 Vue 组件的定义中使用,基本的形式如下:
export default {render(createElement) {// 生成虚拟 DOMreturn createElement('div', 'Hello, World!');}
}
- createElement: 是一个函数,用于创建虚拟节点(VNode)。该函数是 Vue 内部实现的一部分。
3. 创建虚拟节点(VNode)
虚拟节点是 Vue 用来描述底层 DOM 的数据结构。通过 createElement
,可以创建不同类型的节点:
3.1. 创建 HTML 元素
render(createElement) {return createElement('h1', 'Hello, World!');
}
3.2. 创建组件
import MyComponent from './MyComponent.vue';render(createElement) {return createElement(MyComponent);
}
3.3. 传递属性
可以传递属性和事件监听器给创建的元素或组件。属性可以通过一个对象传递,包含 attrs
、props
和 on
等字段:
render(createElement) {return createElement('button', {attrs: {type: 'button',},on: {click: this.handleClick}}, 'Click Me');
}
3.4. 嵌套子元素
可以通过传递一个虚拟节点数组来创建嵌套的结构:
render(createElement) {return createElement('div', [createElement('h1', 'Title'),createElement('p', 'This is a paragraph.'),]);
}
4. 与模板语法的比较
虽然模板语法更常用,且更简洁,但 render
函数提供了更大的灵活性。
4.1. 逻辑复杂性
当需要在渲染过程中进行复杂的逻辑判断时,render
函数可以更容易地进行条件判断:
render(createElement) {return this.isLoggedIn? createElement('h1', 'Welcome back!'): createElement('h1', 'Please log in.');
}
4.2. 动态生成结构
在某些情况下,可能需要动态生成组件或元素,render
函数能够更好地处理这种情况:
javascript
render(createElement) {return this.items.map(item => createElement('li', item));
}
5. 支持 JSX
如果项目配置支持 JSX,可以使用 JSX 语法来编写 render
函数,使代码更简洁和可读:
render() {return (<div><h1>Hello, JSX!</h1><MyComponent /></div>);
}
6. 高级用法
6.1. 使用 Slots
如果组件支持插槽,可以在 render
函数中使用 this.$slots
来访问插槽内容:
javascript
render(createElement) {return createElement('div', this.$slots.default);
}
6.2. 具名插槽
具名插槽可以通过传递一个 vnode
数组来实现:
render(createElement) {return createElement('div', [createElement('header', this.$slots.header),createElement('main', this.$slots.default),createElement('footer', this.$slots.footer),]);
}
6.3. 动态组件
可以通过 is
属性来动态渲染不同的组件:
render(createElement) {return createElement('component', {props: { is: this.currentComponent }});
}
7. 性能优化
- 函数式组件: 如果组件不需要维护状态,可以考虑使用函数式组件,这样可以减少开销。函数式组件的
render
函数无需this
,并且可以更高效地渲染。
export default {functional: true,render(createElement, context) {return createElement('div', context.children);}
}
开启 Gzip 压缩
在《webpack 在 CLI 3 中的应用》章节,我们介绍了 CLI 为我们内置的 webpack plugins,使用这些内置插件基本已经能够满足我们大多数项目的构建和优化,当然你仍然可以为项目添加自己想要的插件来实现一些差异化的功能,比如使用 compression-webpack-plugin 来开启 Gzip 压缩。在 vue.config.js 配置文件中,我们通过 configureWebpack 中返回一个对象来实现 plugins 的合并:
/* vue.config.js */
const isPro = process.env.NODE_ENV === 'production'module.exports = {...//使用configureWebpack 直接修改 Webpack 的配置。configureWebpack: config => {if (isPro) {return {plugins: [new CompressionWebpackPlugin({// 定义生成的压缩文件的名称。[path]表示原始文件的路径和 [query]是查询字符串。如果原始文件是 app.js,压缩后文件名将是 app.js.gzfilename: '[path].gz[query]',// 使用 gzip 压缩算法algorithm: 'gzip', // 正则表达式匹配需要被压缩的文件类型test: new RegExp('\\.(js|css)$'),// 只处理大于此大小的文件threshold: 10240,// 最小压缩比达到 0.8 时才会被压缩minRatio: 0.8,})]}}}...
}
上方我们通过在生产环境中增加 Gzip 压缩配置实现了打包后输出增加对应的 .gz 为后缀的文件,而由于我们配置项中配置的是只压缩大小超过 10240B(10kB)的 JS 及 CSS,因此不满足条件的文件不会进行 Gzip 压缩。
Gzip 压缩能在普通压缩的基础上再进行 50% 以上 的压缩,我们可以直接来看下控制台的输出对比图:
很明显,Gzip 压缩后的文件体积得到了很大程度的减小,这对于浏览器资源加载速度的提升起到了非常有效的帮助。但是需要注意的是访问 Gzip 压缩的文件需要服务端进行相应配置,以下是 Nginx Gzip 压缩的流程:
Nginx 开启 Gzip 压缩配置后,其会根据配置情况对指定的类型文件进行压缩,主要针对 JS 与 CSS 。如果文件路径中存在与原文件同名(加了个 .gz),Nginx 会获取 gz 文件,如果找不到,会主动进行 Gzip 压缩。
拓展3
除了本文中介绍的项目优化方法,还有哪些常见的优化手段?如何通过 Vue CLI 3 配置实现?
以下为我总结的一些常见的优化方法以及如何通过 Vue CLI 3 进行配置的示例:
1. 代码分割(Code Splitting)
目的:通过将应用程序的代码分成较小的块(chunk),实现按需加载,从而减少初始加载时间。
实现方法:
- Vue CLI 默认使用 Webpack,支持基于路由的代码分割。通过动态导入组件实现代码分割。
示例:
const Home = () => import('./views/Home.vue');
const About = () => import('./views/About.vue');
2. 懒加载(Lazy Loading)
目的:只在需要时加载某些组件或库,可以减少首次加载的内容
实现方法:
- 使用 Vue Router 的懒加载特性来实现路由组件的懒加载
示例:
javascript
const routes = [{path: '/home',component: () => import('./views/Home.vue')},{path: '/about',component: () => import('./views/About.vue')}
];
3. 生产模式下的性能优化
目的:确保在生产环境中应用最佳性能优化
实现方法:
- 确保在生产环境下构建时启用 Vue 的生产提示
在 vue.config.js
中:
module.exports = {productionSourceMap: false, // 不生成 source mapsconfigureWebpack: {optimization: {splitChunks: {chunks: 'all', // 对所有模块进行代码分割}}}
};
4. 图片优化
目的:减小图片的体积以加快页面加载
实现方法:
- 使用图像压缩工具(如
imagemin
)在构建过程中优化图像
示例:
npm install imagemin-webpack-plugin --save-dev
在 vue.config.js
中:
const ImageminPlugin = require('imagemin-webpack-plugin').default;module.exports = {configureWebpack: {plugins: [new ImageminPlugin({test: /\.(jpe?g|png|gif|svg)$/i,pngquant: {quality: '95-100'}})]}
};
5. 使用 PWA(渐进式 Web 应用)
目的:通过增强用户体验,提供离线支持、快速加载速度等
实现方法:
- 使用 Vue CLI 的 PWA 插件
安装 PWA 插件:
vue add pwa
这将自动配置 vue.config.js
和其他必要的文件
6. HTTP/2 支持
目的:利用 HTTP/2 的多路复用特性,提高文件传输速度
实现方法:
- 确保你的服务器支持 HTTP/2,并配置相应的 SSL/TLS
7. 使用 CDN
目的:将静态资源托管在 CDN 上,加快加载速度
实现方法:
- 在
vue.config.js
中配置公共路径
module.exports = {publicPath: process.env.NODE_ENV === 'production' ? 'https://cdn.example.com/' : '/'
};
8. 监控性能
目的:通过监控应用性能,找出瓶颈并进行优化
实现方法:
- 使用工具如 Google Lighthouse、Webpack Bundle Analyzer 等
安装 webpack-bundle-analyzer
:
npm install --save-dev webpack-bundle-analyzer
在 vue.config.js
中配置:
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {configureWebpack: {plugins: [new BundleAnalyzerPlugin()]}
};
9. 使用 Tree Shaking
目的:去除未使用的代码以减小最终打包体积
实现方法:
- 确保在项目中使用 ES6 的模块导入语法,Webpack 会自动对未使用的代码进行剔除
10. 预加载和预获取
目的:提高资源的获取速度
实现方法:
在 vue.config.js
中配置 html-webpack-plugin
:
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {configureWebpack: {plugins: [new HtmlWebpackPlugin({// 其他选项preload: ['app.js'], // 预加载prefetch: ['vendor.js'] // 预获取})]}
};
相关文章:

Vue项目整合与优化
前几篇文章,我们讲述了 Vue 项目构建的整体流程,从无到有的实现了单页和多页应用的功能配置,但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案,就像大楼造完需要进行最后的项目验收改进一样,有待我们进一步…...

WinForm开发-自定义组件-1. 工具栏: UcompToolStrip
这里写自定义目录标题 1. 工具栏: UcompToolStrip1.1 展示效果1.2 代码UcompToolStrip.csUcompToolStrip.Designer.cs 1. 工具栏: UcompToolStrip 自定义一些Winform组件 1.1 展示效果 1)使用效果 2)控件事件 1.2 代码 设计 编码 UcompToolStrip.…...

法律专业legal case的留学论文写作技巧分析(1)
对于法律专业的留学生而言,案例的分析是写作的重要方面。无论留学的国家是英、美、澳洲还是加拿大,它们都属于case law 的法律体系。一个非常显著的特点便是通过对案例进行分析和提炼,从中总结提炼出principle和rules。case analysis的留学论…...

2025编程技术前沿:探索最新的开发工具与趋势
随着技术的飞速发展,编程领域每天都在演化,新的技术、框架和工具层出不穷。本文将聚焦2025年最具潜力和吸引力的编程技术与工具,从前沿语言到最受欢迎的开发框架,带您一起探索软件开发领域的最新趋势。 一、编程语言的新生代之星…...

sqlserver sql转HTMM邮件发送
通过sql的形式,把表内数据通过邮件的形式发送出去 declare title varchar(100) DECLARE stat_date CHAR(10),create_time datetime SET stat_dateCONVERT(char(10),GETDATE(),120) SET create_timeDATEADD(MINUTE,-20,GETDATE()) DECLARE xml NVARCHAR (max) DECLAR…...

GeoTrust True BusinessID Wildcard
GeoTrust由DigiCert 提供支持,是最受信任和尊重的品牌之一,以提供高保证的网站安全而闻名。 GeoTrust True BusinessID通配符证书 – 以低成本保护多个主机名。即使将其用于您的公司主页或电子邮件服务器主机名,保护所有敏感信息也是您的目标…...

R语言的数据结构
R语言的数据结构 R语言是专门为统计计算和数据分析而设计的一种编程语言,因其强大的数据处理能力而受到广泛欢迎。在R中,数据结构是理解和有效使用R语言的基础。本文将详细介绍R语言中的主要数据结构,包括向量、矩阵、数据框、列表、因子等&…...

安装和配置MySQL教程
以下是在不同操作系统下安装和配置MySQL的详细教程: Windows系统 下载MySQL安装包 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/),根据你的操作系统版本(32位或64位)下载相应的MySQL Commu…...

黑马Java面试教程_P10_设计模式
系列博客目录 文章目录 系列博客目录前言1. 工厂方法模式1.1 概述1.2 简单工厂模式1.2.1 结构1.2.2 实现1.2.3 优缺点 1.3 工厂方法模式1.3.1 概念1.3.2 结构1.3.3 实现1.3.4 优缺点 1.4 抽象工厂模式1.4.1 概念1.4.2 结构1.4.3 实现1.4.4 优缺点1.4.5 使用场景 总结࿰…...

043_小驰私房菜_MTK Camera,Hal层将camera型号写到property属性中
【问题背景】 app层需要知道当前设备的摄像头型号,然后做一些差异化处理。底下如何上报这个摄像头型号? 【分析】 在kernel和hal层,都是有地方能获取到当前摄像头的型号,就看在哪里添加方便。获取到摄像头硬件型号后,将其写入到property属性, 然后app就可以通过读取该…...

基础图形化界面的一个图片爬虫期末
下面是爬取界面: 点击即可自动化爬取 以下是完整代码: import tkinter as tk import requests import os #用于文件和目录操作。# 图片爬虫函数 def image_spider(textbox):headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …...
Outlook2024版如何回到经典Outlook
Outlook2024版如何回到经典Outlook 如果新加入一家公司,拿到的电脑,大概率是最新版的Windows, 一切都是新的。 如果不coding, 使用国产的foxmail大概就可以解决一切问题了。可惜老程序员很多Coding都是基于传统Outlook的,科技公司所有人都是I…...

仿生的群体智能算法总结之二(十种)
群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是10种常见的群体智能算法,接上文https://blog.csdn.net/lzm12278828/article/details/144933367仿生的群体智能算法总结之一(十种)-CSDN博客https://blog.csdn.net/lzm12278828/article/detail…...

SpringBoot入门之创建一个Hello World项目
文章目录 一、使用传统的方式1、创建一个SpringBoot项目2、配置pom.xml文件3、下载Maven依赖4、创建一个Controller类:com.devops.controller.HelloController5、创建一个引导类:com.devops.HelloApplication6、启动项目8、访问80809、完整项目结构 二、…...

MySQL与标准SQL的区别
我们试图使MySQL Server遵循ANSI SQL标准和ODBC SQL标准,但MySQL Server在某些情况下执行不同的操作: MySQL和标准SQL特权系统之间有一些区别。例如,在MySQL中,删除表时不会自动撤销表的特权。您必须显式发出REVOKE来撤销表的特权…...

docker中使用Dockerfile设置Volume挂载点
关于在docker中如何使用Volume,可以参考文章: docker中使用Volume完成数据共享-CSDN博客 如果想在生成docker镜像的时候设置好挂载点,而不是在运行镜像生成容器时生成。 下面以自建一个tomcat镜像为例,演示如何在生成镜像时设置…...

Samsung手机首次主要采用竞对Micron LPDDR5内存
根据韩国媒体《韩国先驱报》(The Korea Herald)的报道,即将在1月底发布的三星 Galaxy S25 系列智能手机将首次主要使用美光科技(Micron Technology)提供的移动DRAM,而非三星自家的产品。这一消息对于三星的…...

【项目开发】C#环境配置及VScode运行C#教程(学生管理系统)
原创文章,禁止转载。 文章目录 下载.NETVScode配置运行程序下载.NET 官网链接: https://dotnet.microsoft.com/en-us/download选择任意版本下载: 下载完成后,双击运行exe文件,等待安装完成。 在控制台输入: dotnet --version若出现版本信息,说明安装成功: VScode配…...

[241231] CachyOS 2024 年终总结:性能飞跃与社区繁荣 | ScyllaDB 宣布转向开源可用许可证
目录 CachyOS 2024 年终总结:性能飞跃与社区繁荣ScyllaDB 宣布转向开源可用许可证 CachyOS 2024 年终总结:性能飞跃与社区繁荣 CachyOS 2024 年的最后一个版本 (也是第 13 个版本) 已经发布,同时也迎来了辞旧迎新之际。让我们一起回顾 Cachy…...

AI-Talk开发板之超拟人
一、说明 运行duomotai_ap sdk下的LLM_chat例程,实现开发板和超拟人大模型进行语音交互,支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人,如果当前SDK在v2.3.o以下,需要更新SDK。在SDK目录(duomotai_ap)下…...

Swift Concurrency(并发)学习
Swift 的并发模型是基于 异步任务 和 任务调度 的一套现代化的异步编程工具。以下是相关语法规则总结 1. 异步函数(async)与 await async 用于声明一个异步函数,表示函数可能会执行耗时任务,例如网络请求、文件读写等。在调用异步…...

从0开始的opencv之旅(1)cv::Mat的使用
目录 Mat 存储方法 创建一个指定像素方式的图像。 尽管我们完全可以把cv::Mat当作一个黑盒,但是笔者的建议是仍然要深入理解和学习cv::Mat自身的构造逻辑和存储原理,这样在查找问题,或者是遇到一些奇奇怪怪的图像显示问题的时候能够快速的想…...

Hoverfly 任意文件读取漏洞(CVE-2024-45388)
漏洞简介 Hoverfly 是一个为开发人员和测试人员提供的轻量级服务虚拟化/API模拟/API模拟工具。其 /api/v2/simulation 的 POST 处理程序允许用户从用户指定的文件内容中创建新的模拟视图。然而,这一功能可能被攻击者利用来读取 Hoverfly 服务器上的任意文件。尽管…...

详解网络管理
网络管理是指对计算机网络资源、设备和服务的有效配置、监控、管理和优化的过程。它的目的是确保网络的高效、可靠和安全运行。网络管理的关键任务包括网络监控、配置管理、性能管理、安全管理、故障管理和计费管理。下面是详细的讲解: 1. 网络管理的目标 高可用性…...

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容
HEIF,也称为高效图像格式,是iOS 11 之后发布的新图像格式,以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说,HEIF 图像格式可以具有相同或更好的照片质量,同时比 JPEG、PNG、GIF、TIFF 占用更少的设…...

深入AIGC领域:ChatGPT开发者获取OpenAI API Key的实用指南
在AIGC(人工智能生成内容)领域,ChatGPT作为一种强大的自然语言处理工具,正逐渐成为开发者们不可或缺的助手。然而,要充分发挥ChatGPT的潜力,首先需要获取OpenAI的API Key。本文将详细介绍如何获取OpenAI AP…...

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计
一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段,要设计软件体系结构,即是确定软件系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。同时把模块组织成良好的层次系统:顶层模块通过调用它的下层…...

密码学精简版
密码学是数学上的一个分支,同时也是计算机安全方向上很重要的基础原理,设置密码的目的是保证信息的机密性、完整性和不可抵赖性,安全方向上另外的功能——可用性则无法保证,可用性有两种方案保证,冗余和备份࿰…...

开源模型迎来颠覆性突破:DeepSeek-V3与Qwen2.5如何重塑AI格局?
不用再纠结选择哪个AI模型了!chatTools 一站式提供o1推理模型、GPT4o、Claude和Gemini等多种选择,快来体验吧! 在全球人工智能模型快速发展的浪潮中,开源模型正逐渐成为一股不可忽视的力量。近日,DeepSeek-V3和Qwen 2.…...

【51单片机零基础-chapter4:LED数码管】
LED数码管本质是一种廉价的显示器,由多个发光二极管封装组成的8字形器件 如果要显示6,那么需要点亮除了B以外的所有段,并且开发板上默认是共阴极 阳极A->G除了B全点亮,所以7,4,2,1,9,10全接正极:10111110 这个就是段码,表示显示的数据 静态LED显示 开发板上是四个一体…...