Webpack在Vue CLI中的应用
webpack 作为目前最流行的项目打包工具,被广泛使用于项目的构建和开发过程中,其实说它是打包工具有点大材小用了,我个人认为它是一个集前端自动化、模块化、组件化于一体的可拓展系统,你可以根据自己的需要来进行一系列的配置和安装,最终实现你需要的功能并进行打包输出。
而在 Vue 的项目中,webpack 同样充当着举足轻重的作用,比如打包压缩、异步加载、模块化管理等等,初学者做初步了解就可以。接下来开始介绍webpack在vue项目中的配置和功能。
1. 与 vue-cli 2.x 的差异
如果你使用过 vue-cli 2.x,那么你应该了解其构建出的目录会包含相应的 webpack 配置文件,但是在 vue-cli 3.x 中你却见不到一份关于 webpack 的配置文件,难道 3.x 抛弃了 webpack?其实不然,3.x 提供了一种开箱即用的模式,即你无需配置 webpack 就可以运行项目,并且它提供了一个 vue.config.js 文件来满足开发者对其封装的 webpack 默认配置的修改
2. vue.config.js 的配置
a. baseurl
在前面的文章中,通过 vue-cli 3.x 成功构建并在浏览器中打开 http://localhost:8080/
展示了项目首页。如果现在你想要将项目地址加一个二级目录,比如:http://localhost:8080/vue/
,那么我们需要在 vue.config.js 里配置 baseurl 这一项:
// vue.config.js
module.exports = {...baseUrl: 'vue',...
}
其改变的其实是 webpack 配置文件中 output 的 publicPath
项,这时候你重启终端再次打开页面的时候我们首页的 url 就会变成带二级目录的形式。
b. outputDir
如果你想将构建好的文件打包输出到 output 文件夹下(默认是 dist 文件夹),你可以配置:
// vue.config.js
module.exports = {...outputDir: 'output',...
}
然后运行命令 yarn build
进行打包输出,你会发现项目跟目录会创建 output 文件夹, 这其实改变了 webpack 配置中 output 下的 path
项,修改了文件的输出路径。
c. productionSourceMap
该配置项用于设置是否为生产环境构建生成 source map,一般在生产环境下为了快速定位错误信息,我们都会开启 source map:
// vue.config.js
module.exports = {...productionSourceMap: true,...
}
该配置会修改 webpack 中 devtool
项的值为 source-map
。
开启 source map 后,我们打包输出的文件中会包含 js 对应的 .map 文件,其用途可以参考:JavaScript Source Map 详解
d. chainWebpack
chainWebpack 配置项允许我们更细粒度的控制 webpack 的内部配置,其集成的是 webpack-chain 这一插件,该插件可以让我们能够使用链式操作来修改配置,比如:
// 用于做相应的合并处理
const merge = require('webpack-merge');module.exports = {...// config 参数为已经解析好的 webpack 配置chainWebpack: config => {config.module.rule('images').use('url-loader').tap(options =>merge(options, {limit: 5120,}))}...
}
以上操作我们可以成功修改 webpack 中 module 项里配置 rules 规则为图片下的 url-loader 值,将其 limit 限制改为 5M,修改后的 webpack 配置代码如下:
{...module: {rules: [{ /* config.module.rule('images') */test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,use: [/* config.module.rule('images').use('url-loader') */{loader: 'url-loader',options: {limit: 5120,name: 'img/[name].[hash:8].[ext]'}}]}]}...
}
这里需要注意的是我们使用了 webpack-merge 这一插件,该插件用于做 webpack 配置的合并处理,这样 options 下面的其他值就不会被覆盖或改变。
e. configureWebpack
除了上述使用 chainWebpack 来改变 webpack 内部配置外,我们还可以使用 configureWebpack 来进行修改,两者的不同点在于 chainWebpack 是链式修改,而 configureWebpack 更倾向于整体替换和修改。示例代码如下:
// vue.config.js
module.exports = {...// config 参数为已经解析好的 webpack 配置configureWebpack: config => {// config.plugins = []; // 这样会直接将 plugins 置空// 使用 return 一个对象会通过 webpack-merge 进行合并,plugins 不会置空return {plugins: []}}...
}
configureWebpack 可以直接是一个对象,也可以是一个函数,如果是对象它会直接使用 webpack-merge 对其进行合并处理,如果是函数,你可以直接使用其 config 参数来修改 webpack 中的配置,或者返回一个对象来进行 merge 处理。
你可以在项目目录下运行 vue inspect
来查看你修改后的 webpack 完整配置,当然你也可以缩小审查范围,比如:
# 只查看 plugins 的内容
vue inspect plugins
f. devServer
vue.config.js 还提供了 devServer 项用于配置 webpack-dev-server 的行为,使得我们可以对本地服务器进行相应配置,我们在命令行中运行的 yarn serve
对应的命令 vue-cli-service serve
其实便是基于 webpack-dev-server 开启的一个本地服务器,其常用配置参数如下:
// vue.config.js
module.exports = {...devServer: {open: true, // 是否自动打开浏览器页面hot: true, // 启用热模块替换,在代码变更时,页面会自动更新。port: 8080, // 端口地址https: true, // 启用 HTTPShttps: false, // 使用https提供服务proxy: {//用于设置代理,以解决跨域问题。可以将请求代理到其他服务器。'/api': {target: 'http://localhost:3000', // 目标服务器changeOrigin: true, // 允许跨域pathRewrite: { '^/api': '' }, // 重写路径},},// 提供在服务器内部的其他中间件之前执行自定义中间件的能力before: (app) => {app.get('/api/custom', (req, res) => {res.json({ message: 'Custom API response' });});},...
}
以上讲解了 vue.config.js 中一些常用的配置项功能,具体的配置实现需要结合实际项目进行,完整的配置项可以查看:vue.config.js
拓展1
1.什么是webpack-merge
webpack-merge
是一个用于合并多个 Webpack 配置文件的工具。它通常用于将基本配置与特定环境(如开发、生产)或功能集(如加载器、插件等)的配置进行合并,便于在不同环境下灵活调整 Webpack 配置。
假设我们有一个基本的 Webpack 配置 webpack.base.js
和一个开发特定的配置 webpack.dev.js
。
1. 基础配置 (webpack.base.js
)
// webpack.base.js
const path = require('path');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',},},],},
};
2. 开发配置 (webpack.dev.js
)
// webpack.dev.js
const { merge } = require('webpack-merge');
const baseConfig = require('./webpack.base.js');module.exports = merge(baseConfig, {mode: 'development',devtool: 'source-map',devServer: {contentBase: './dist',},
});
3. 生产配置 (webpack.prod.js
)
// webpack.prod.js
const { merge } = require('webpack-merge');
const baseConfig = require('./webpack.base.js');module.exports = merge(baseConfig, {mode: 'production',optimization: {minimize: true,},
});
运行构建
在 package.json
中配置 scripts 以运行不同的构建:
"scripts": {"build:dev": "webpack --config webpack.dev.js","build:prod": "webpack --config webpack.prod.js"
}
现在,您可以使用以下命令来构建项目:
- 开发环境:
npm run build:dev
- 生产环境:
npm run build:prod
合并细节
webpack-merge
提供了多种合并策略:
merge
: 简单合并,后面的配置会覆盖前面的配置。smartMerge
: 智能合并,避免重复合并相同的内容。unique
: 合并数组时去重。
2.configureWebpack和chainWebpack的区别
在 Vue CLI 项目中,configureWebpack
和 chainWebpack
是用于自定义 Webpack 配置的两个不同方法。它们各自有不同的特点和适用场景。
1. configureWebpack
- 用途: 用于直接修改 Webpack 配置对象。适用于简单的配置修改。
- 使用方式: 你可以在
vue.config.js
文件中设置configureWebpack
属性,可以是一个对象或一个返回配置对象的函数。
示例
// vue.config.js
const path = require('path');module.exports = {configureWebpack: {resolve: {alias: {'@': path.resolve(__dirname, 'src'),},},plugins: [// 添加自定义插件],},
};
或者使用函数:
module.exports = {configureWebpack: (config) => {// 修改配置config.devtool = 'source-map'; // 仅示例,实际可根据需要修改},
};
2. chainWebpack
- 用途: 通过链式 API 修改 Webpack 配置,提供更多的灵活性和控制能力。适用于更复杂的配置场景,例如修改现有插件或加载器的选项。
- 使用方式: 在
vue.config.js
中设置chainWebpack
属性,它是一个接受webpack-chain
实例作为参数的函数。
示例
// vue.config.js
module.exports = {chainWebpack: (config) => {// 修改现有的规则config.module.rule('vue').use('vue-loader').tap(options => {// 修改选项return {...options,loaders: {scss: 'vue-style-loader!css-loader!sass-loader',},};});// 添加新的插件config.plugin('html').tap(args => {args[0].title = 'My App';return args;});},
};
1. .config.module
- 定义:
config.module
访问到 Webpack 的模块配置部分。 - 功能: 在这里可以定义和修改模块的加载规则。
2. .rule('vue')
- 定义:
rule('vue')
用于访问处理.vue
文件的规则。Vue 文件是 Vue.js 框架的组件文件,通常包含模板、脚本和样式。 - 功能: 这里的
vue
表示的是该规则的名称,即用于处理 Vue 单文件组件。
3. .use('vue-loader')
- 定义:
use('vue-loader')
表示访问该规则中使用的vue-loader
加载器。 - 功能:
vue-loader
是一个专门用于处理 Vue 单文件组件的加载器,负责将 Vue 文件中的内容解析为可被浏览器理解的 JavaScript、HTML 和 CSS。
4. .tap(options => { ... })
- 定义:
tap
是一个用于修改加载器选项的方法。 - 功能: 通过
tap
,可以获取当前vue-loader
的配置选项,并进行修改。
5. return { ...options, loaders: { ... } }
- 展开运算符:
...options
用于将现有的加载器选项展开,确保保留原有的配置。 - 修改加载器: 在返回的对象中,添加或修改了
loaders
属性,特别是对scss
文件的处理。这里设置了使用链式加载器:vue-style-loader
: 将样式注入到 DOM 中。css-loader
: 解析 CSS 文件。sass-loader
: 将 SCSS 文件转换为 CSS。
主要区别
特性 | configureWebpack | chainWebpack |
---|---|---|
语法 | 直接修改配置对象或返回配置对象 | 使用链式 API 进行更细粒度的修改 |
使用的灵活性 | 相对简单,适合简单的修改 | 更灵活,适合复杂的配置和插件的修改 |
适用场景 | 基本的插件添加、别名配置等 | 复杂的加载器配置、条件添加插件等 |
何时使用
- 使用
configureWebpack
: 当你需要简单地添加一个插件、设置路径别名或修改一些基础配置时,可以使用configureWebpack
。 - 使用
chainWebpack
: 当你需要对现有的配置进行细致的修改、删除、替换或在条件下进行配置时,选择chainWebpack
会更合适。
3. 默认插件
通过对 vue.config.js 的了解,我们知道了 vue-cli 3.x 为我们默认封装了项目运行的常用 webpack 配置,那么它给我们提供了哪些默认插件,每一个 plugin 又有着怎样的用途呢?除了使用 vue inspect plugins
我们还可以通过运行 vue ui
进入可视化页面查看,步骤如下:
-
打开可视化页面,点击对应项目进入管理页面(如果没有对应项目,需要导入或新建)
-
点击侧边栏 Tasks 选项,再点击二级栏 inspect 选项
-
点击 Run task 按钮执行审查命令
最后我们从输出的内容中找到 plugins 数组,其包含了如下插件(配置项已经省略,增加了定义插件的代码):
// vue-loader是 webpack 的加载器,允许你以单文件组件的格式编写 Vue 组件
const VueLoaderPlugin = require('vue-loader/lib/plugin');// webpack 内置插件,用于创建在编译时可以配置的全局常量
const { DefinePlugin } = require('webpack');// 用于强制所有模块的完整路径必需与磁盘上实际路径的确切大小写相匹配
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');// 识别某些类型的 webpack 错误并整理,以提供开发人员更好的体验。
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');// 将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");// 用于在 webpack 构建期间优化、最小化 CSS文件
const OptimizeCssnanoPlugin = require('optimize-css-assets-webpack-plugin');// webpack 内置插件,用于根据模块的相对路径生成 hash 作为模块 id, 一般用于生产环境
const { HashedModuleIdsPlugin } = require('webpack');// 用于根据模板或使用加载器生成 HTML 文件
const HtmlWebpackPlugin = require('html-webpack-plugin');// 用于在使用 html-webpack-plugin 生成的 html 中添加 <link rel ='preload'> 或 <link rel ='prefetch'>,有助于异步加载
const PreloadPlugin = require('preload-webpack-plugin');// 用于将单个文件或整个目录复制到构建目录
const CopyWebpackPlugin = require('copy-webpack-plugin');module.exports = {plugins: [/* config.plugin('vue-loader') */new VueLoaderPlugin(), /* config.plugin('define') */new DefinePlugin(),/* config.plugin('case-sensitive-paths') */new CaseSensitivePathsPlugin(),/* config.plugin('friendly-errors') */new FriendlyErrorsWebpackPlugin(),/* config.plugin('extract-css') */new MiniCssExtractPlugin(),/* config.plugin('optimize-css') */new OptimizeCssnanoPlugin(),/* config.plugin('hash-module-ids') */new HashedModuleIdsPlugin(),/* config.plugin('html') */new HtmlWebpackPlugin(),/* config.plugin('preload') */new PreloadPlugin(),/* config.plugin('copy') */new CopyWebpackPlugin()]
}
我们可以看到每个插件上方都添加了使用 chainWebpack 访问的方式,同时我也添加了每个插件相应的用途注释,需要注意的是要区分 webpack 内置插件和第三方插件的区别,如果是内置插件则无需安装下载,而外部插件大家可以直接访问:npm | Home 搜索对应的插件,了解其详细的 api 设置。
拓展2
1.vue.config.js
中还有哪些配置
1. publicPath
-
作用: 指定应用的根 URL,通常用于设置基础路径。默认情况下为
'/'
。 -
示例:
module.exports = {publicPath: process.env.NODE_ENV === 'production' ? '/my-app/' : '/', };
2. outputDir
-
作用: 指定构建输出目录,默认值为
dist
。 -
示例:
module.exports = {outputDir: 'build', // 输出到 build 目录 };
3. assetsDir
-
作用: 指定静态资源的目录,默认值为
''
。 -
示例:
-
module.exports = {outputDir: 'build', // 输出到 build 目录 };
4. indexPath
-
作用: 指定生成的 index.html 文件的输出路径,默认值为
index.html
。 -
示例:
module.exports = {indexPath: 'main.html', // 输出为 main.html };
5. lintOnSave
-
作用: 在开发期间是否启用 ESLint,默认为
true
。 -
示例:
module.exports = {lintOnSave: false, // 禁用 ESLint };
6. configureWebpack
-
作用: 用于直接修改 Webpack 配置。
-
示例:
module.exports = {configureWebpack: {plugins: [// 自定义插件],},
};
7. chainWebpack
-
作用: 使用 Webpack Chain API 进行更详细的配置。
-
示例:
module.exports = {chainWebpack: (config) => {config.module.rule('vue').use('vue-loader').tap(options => {// 修改选项return { ...options, loaders: { scss: 'vue-style-loader!css-loader!sass-loader' } };});},
};
8. devServer
-
作用: 用于配置开发服务器的行为。
-
示例:
module.exports = {devServer: {port: 8080,open: true,proxy: {'/api': {target: 'http://localhost:3000',changeOrigin: true,},},},
};
9. transpileDependencies
-
作用: 指定需要转译的依赖,通常用于支持 ES6+ 的第三方库。
-
示例:
module.exports = {transpileDependencies: ['some-library'],
};
10. productionSourceMap
-
作用: 在生产环境是否生成 source maps,默认为
true
。 -
示例:
module.exports = {productionSourceMap: false, // 禁用生产环境的 source map
};
11. css
-
作用: 用于配置 CSS 相关的选项,如模块化、预处理器等。
-
示例:
module.exports = {css: {modules: true, // 启用 CSS 模块sourceMap: true, // 启用 CSS source maps},
};
12. pluginOptions
-
作用: 用于配置额外的插件选项,通常与 Vue CLI 插件一起使用。
-
示例:
module.exports = {pluginOptions: {i18n: {locale: 'en',fallbackLocale: 'en',localeDir: 'locales',enableLegacy: false,},},
};
2.使用 chainWebpack获取到 webpack 中的某一插件后,如何修改其配置
示例:修改 HtmlWebpackPlugin
的配置
假设我们想要修改 HtmlWebpackPlugin
的配置,比如设置模板文件路径或添加一些选项。可以按照以下步骤进行:
-
使用
chainWebpack
方法:在vue.config.js
中定义chainWebpack
方法。 -
获取插件实例:使用
config.plugin
方法获取到指定的插件。 -
修改配置:通过调用
.tap()
方法来修改插件的选项。
以下是一个完整的示例:
// vue.config.js
module.exports = {chainWebpack: (config) => {// 修改 HtmlWebpackPlugin 的配置config.plugin('html').tap(args => {// args 是传递给 HtmlWebpackPlugin 的参数数组args[0].title = 'My Custom Title'; // 修改页面标题args[0].template = './public/my-template.html'; // 指定自定义模板return args; // 返回修改后的参数});},
};
要点说明
-
获取插件:使用
config.plugin('pluginName')
获取到指定的插件实例。在此示例中,'html'
是HtmlWebpackPlugin
的名称,通常是根据插件在 Webpack 配置中注册的名称。 -
使用
.tap()
方法:此方法接收一个函数,函数的参数是传给插件的原始参数数组,您可以在此数组中做出修改。 -
返回修改后的参数:最后,需要返回修改后的参数数组,以便插件使用。
修改其他插件
类似的方法可以用于修改其他 Webpack 插件的配置。例如,若要修改 MiniCssExtractPlugin
的配置,可以使用如下方式:
config.plugin('extract-css').tap(args => {args[0].filename = 'custom.css'; // 修改输出的 CSS 文件名return args;});
相关文章:
Webpack在Vue CLI中的应用
webpack 作为目前最流行的项目打包工具,被广泛使用于项目的构建和开发过程中,其实说它是打包工具有点大材小用了,我个人认为它是一个集前端自动化、模块化、组件化于一体的可拓展系统,你可以根据自己的需要来进行一系列的配置和安…...
docker-componse集群部署Tdengine3.3.2.0
一、centos7.5集群部署三台机器使用docker-componse进行部署 1、三台服务器分别配置host vim /etc/hosts 192.168.13.244 td.master 192.168.13.245 td.slave1 192.168.12.70 td.slave2 2、...
4.3 数据库HAVING语句
having子句要和group by子句联合起来才能使用,不能单独去使用,接下来咱们看一下为什么要引入having子句语法呢?引入having子句也是出于无奈,因为有些条件查询,用group by子句并不能满足要求,比如说查询部门…...
如何使用React,透传各类组件能力/属性?
在23年的时候,我主要使用的框架还是Vue,当时写了一篇“如何二次封装一个Vue3组件库?”的文章,里面涉及了一些如何使用Vue透传组件能力的方法。在我24年接触React之后,我发现这种扩展组件能力的方式有一个专门的术语&am…...
C# 6.0版本的WebAPI接口部署到Linux服务器
将 C# 6.0 的 Web API 部署到 Linux 服务器涉及多个步骤,包括准备环境、构建和发布应用程序、配置 Web 服务器以及确保应用程序正常运行。以下是详细的部署指南: 1. 准备开发环境 安装 .NET SDK 确保你已经在本地开发环境中安装了 .NET SDK(…...
ArkTs组件(2)
一.下拉列表组件:Select 1.接口 Select(options: Array<SelectOption>) 参数名类型必填说明optionsArray<SelectOption>是设置下拉选项。 SelectOption对象说明 名称类型必填说明valueResourceStr是 下拉选项内容。 iconResourceStr否 下拉选项图片…...
Bash 脚本教程
注:本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程,非常不错,至少没接触过 BASH 的也能看懂! 建立一个脚本 Linux 中有…...
SQL创建和操纵表
本文介绍创建、更改和删除表的基本知识。 1. 创建表 SQL 不仅用于表数据操纵,而且还用来执行数据库和表的所有操作,包括表本身的创建和处理。一般有两种创建表的方法: 多数DBMS 都具有交互式创建和管理数据库表的工具;表也可以…...
1.微服务灰度发布(方案设计)
前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响现有用户的情况下,逐步将新版本的服务部署到生产环境的策略。通过灰度发布,你可以先将新版本的服务暴露给一小部分用户或特定的流量,观察其…...
QT笔记- QTreeView + QFileSystemModel 当前位置的保存与恢复 #选中 #保存当前索引
保存当前位置 QString currentPath model->filePath(view->currentIndex()); // 获得当前位置路径 恢复位置 view->setCurrentIndex(model->index(currentPath)); // 设置此路径所在位置为当前位置...
LeetCode - Google 校招100题 第6天 回溯法(Backtracking) (8题)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144743505 LeetCode 合计最常见的 112 题: 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21题)校招100题 第3天 动态规划(DP) (20题)...
k8s,service如何找到容器
Kubernetes之所以需要Service,一方面是因为Pod的IP不是固定的,另一方面则是因为一组Pod实例之间总会有负载均衡的需求 被selector选中的Pod,就称为Service的Endpoints,查看方式: kubectl get endpoints hostnames需要…...
计算机的错误计算(一百九十二)
摘要 用两个大模型计算 csc(0.999), 其中,0.999是以弧度为单位的角度,结果保留5位有效数字。两个大模型均给出了 Python代码与答案。但是,答案是错误的。 例1. 计算 csc(0.999), 其中,0.999是以弧度为单位的角度,结…...
金仓数据库安装-Kingbase v9-centos
在很多年前有个项目用的金仓数据库,上线稳定后就没在这个项目了,只有公司的开发环境还在维护,已经好多年没有安装过了,重温一下金仓数据库安装,体验一下最新版本,也做一个新版本的试验环境; 一、…...
深入解析 Java 中的 getDeclaredMethods() 方法:使用与原理全攻略
在 Java 的反射机制中,getDeclaredMethods() 是一个非常重要的方法,它允许我们获取类中声明的所有方法(包括公共、私有、保护以及默认访问权限的方法)。通过这个方法,我们可以动态地分析和操作类的行为,这在…...
Dockerfile的用法
Dockerfile的用法 示例 `Dockerfile`使用 `Dockerfile` 创建 Docker 镜像`Dockerfile` 指令详解其他常用指令总结Dockerfile 是一个文本文件,包含了用于创建 Docker 镜像的一系列指令。这些指令描述了镜像的基础、所安装的软件、文件的复制、环境变量的设置以及其他配置。下面…...
Gmsh有限元网格剖分(Python)---点、直线、平面的移动
Gmsh有限元网格剖分(Python)—点、直线、平面的移动和旋转 最近在学习有限元的网格剖分算法,主要还是要参考老外的开源Gmsh库进行,写一些博客记录下学习过程,方便以后回忆嘞。 Gmsh的官方英文文档可以参考:gmsh.pdf 但咋就说&a…...
AI的进阶之路:从机器学习到深度学习的演变(三)
(承接上集:AI的进阶之路:从机器学习到深度学习的演变(二)) 四、深度学习(DL):机器学习的革命性突破 深度学习(DL)作为机器学习的一个重要分支&am…...
如何通过 360 驱动大师检查自己电脑上的显卡信息
在深入探讨如何查看显卡信息之前,首先需要了解显卡的基本概念。显卡(Graphics Processing Unit, GPU),是计算机中负责处理图形输出到显示器的重要硬件。根据其集成度和性能,显卡通常被分为两类: 集成显卡&…...
数据仓库工具箱—读书笔记02(Kimball维度建模技术概述04、使用一致性维度集成)
Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同…...
.net framework wpf 打包免安装exe文件
1、打开所在项目csproj文件添加以下内容: <Target Name"AfterResolveReferences"><ItemGroup><EmbeddedResource Include"(ReferenceCopyLocalPaths)" Condition"%(ReferenceCopyLocalPaths.Extension) .dll"><…...
瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…...
Oracle 日常巡检
1. 检查服务器状态 1.1. CPU使用情况 1.1.1. top top 命令是 Linux 和 Unix 系统中用于显示实时系统状态的工具,特别是对于监控 CPU 和内存的使用非常有用。 在命令行中输入 top,top 会显示一个实时更新的界面,其中包含系统的关键指标&am…...
CS 144 check7: putting it all together
Exercises 经验:两边的TCP连接建立得尽快,如果服务器端启动了,客户端没有启动就连不上。。 服务器端: 客户端: 文件收发测试: 参考: CS 144CS144 | Winter 2024, Lab 0~7 记录࿰…...
springboot数据校验报错
目录 报错信息 原因 解决 报错信息 springboot在进行数据校验的时候ConfigurationProperties注解形式下Email报错 Caused by: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint javax.validation.constraints.Email valid…...
mapbox基础,加载天地图矢量底图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象…...
SLAM/数字图象处理基础
概念 视差:相同特征的不同深度估计的偏差 BoW,DBoW,DBoW2的区别是什么 Bag of Words (BoW)、DBoW(Dynamic Bag of Words)和DBoW2是用于图像处理和计算机视觉中的不同特征表示和匹配方法。它们之间的主要区别如下&am…...
修改vue-element-admin,如何连接我们的后端
改哪几个文件就可以连接我们后端 主要就这四个 main.js,屏蔽这个或者删除 vue-config 最后两个文件改下端口即可 这样基本就能发了,但是还要改下 改成api 然后还要修改request.js 这里改成我们返回的状态码 我讲一个东西很容易就懂了&…...
基于PLC的采摘机械手系统(论文+源码)
1系统方案设计 本次设计围绕基于PLC的采摘机械手系统进行设计, PLC即可编程控制器其是一种常见的微处理器,本次拟采用西门子是S7-200 PLC,一方面对整个设计从器件选型到I/O分配,图纸绘制等进行设计,另一方面还通过组态…...
使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图
在做一些尺度分析时,经常会涉及到对研究区构建不同尺度的渔网进行分析,渔网的形状通常为规则四边形。构建渔网的方法也很简单,使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…...
【5/6 面向应用相关的优化 网卡实现及评估 】
5 面向应用相关的优化 面对数据中心多样化的部署需求和应用场景,如分布式存储、多租户性能隔离等,构建高性能的RDMA系统需要仔细选择传输模式和通信原语以充分发挥其性能优势,并调整软硬件结构进行适配.整体手段:在软件层面结合R…...
如何识别钓鱼邮件和诈骗网站?(附网络安全意识培训PPT资料)
识别钓鱼邮件和诈骗网站是网络安全中的一个重要环节。以下是一些识别钓鱼邮件和诈骗网站的方法: 识别钓鱼邮件: 检查发件人地址: 仔细查看发件人的电子邮件地址,看是否与官方域名一致。 检查邮件内容: 留意邮件中是否…...
TOGAF之架构标准规范-业务架构
TOGAF标准规范中,业务架构阶段的主要工作是开发支持架构愿景的业务架构。 如上所示,业务架构(Business Architecture)在TOGAF标准规范中处于B阶段,该阶段的主要内容包括阶段目标、阶段输入、流程步骤、架构方法。 阶段…...
嵌入式轻量级开源操作系统:HeliOS的使用
嵌入式轻量级开源操作系统:HeliOS的使用 📍项目地址:https://github.com/heliosproj/HeliOS HeliOS项目是一个社区交付的开源项目,用于构建和维护HeliOS嵌入式操作系统(OS)。HeliOS是一个功能齐全的操作系统࿰…...
mysql 数据库迁移到达梦数据库
1.windows安装达梦数据库,去官网下载 dm8 进行安装,安装后,可以使用管理工具管理数据 使用迁移工具对数据进行迁移; 2.使用php 或者 thinkphp连接达梦数据库 2.1、先PHP开启DM扩展 从达梦数据库安装目录下drivers/php_pdo 复制对…...
Java中的异常处理机制
今天想和大家探讨Java中的异常处理机制。异常处理是任何编程语言中不可或缺的一部分,它帮助我们处理程序运行时可能出现的错误,确保程序的健壮性和稳定性。Java作为一种强类型、面向对象的编程语言,提供了一套完整的异常处理框架。 1. 异常的…...
iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量
参考链接:苹果开发者账号下添加新设备UUID - 简书 如果要添加新设备到 Profiles 证书里: 1.登录开发者中心 Sign In - Apple 2.找到证书设置: Certificate,Identifiers&Profiles > Profiles > 选择对应证书 edit &g…...
数据仓库工具箱—读书笔记02(Kimball维度建模技术概述03、维度表技术基础)
Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同…...
Linux中常用的Shell脚本(运维+常用)汇总
废话不多说,直接上干货! 一、运维脚本 (1)监控CPU和内存的使用情况 #!/bin/bashcpu_threshold80 mem_threshold80# 获取CPU和内存使用率 cpu_usage$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.…...
Java 方法注释:规范、实用和高质量的写法
目录 为什么要注释方法? 方法注释的基本要求 Javadoc 注释格式 示例:一个计算圆面积的方法 代码示例 注释分析 如何写出高质量的 Java 方法注释? 1. 关注可读性 2. 使用 Javadoc 格式 3. 描述异常 4. 适当的解释复杂的算法 5. 避…...
解决JIRA、Confluence用户自动注销、反复登录的问题
一、问题描述:当工作从从confluence里面打开jira的时候,在回到confluence时候,就自动退出了,需要账号密码登录重复登录,使人十分厌恶。 二、原因分析: 访问 JIRA、Confluence 或任何其他具有相同域或 IP 上…...
Python9-作业2
记录python学习,直到学会基本的爬虫,使用python搭建接口自动化测试就算学会了,在进阶webui自动化,app自动化 python基础8-灵活运用顺序、选择、循环结构 作业2九九乘法表三种方式打印九九乘法表使用两个嵌套循环使用列表推导式和…...
基于c语言的union、字符串、格式化输入输出
结构体之共用体union 共用体也叫联合体,其关键词为union 与结构体不同的是,共用体所开辟的存储空间仅仅为其中最长类型变量的存储空间而不是全部变量的存储空间,由于同一内存单元在同一时间内只能存放其中一种的数据类型,因此在每…...
SpringCloudAlibaba实战入门之路由网关Gateway初体验(十)
Spring Cloud 原先整合 Zuul 作为网关组件,Zuul 由 Netflix 公司提供的,现在已经不维护了。后面 Netflix 公司又出来了一个 Zuul2.0 网关,但由于一直没有发布稳定版本,所以 Spring Cloud 等不及了就自己推出一个网关,已…...
活着就好20241227
亲爱的朋友们,大家早上好!🌞 今天是27号,星期五,2024年12月的第二十七天,同时也是第51周的第五天,农历甲辰[龙]年十一月初二十三日。在这晨光渐浓的美好时刻,愿那温暖而明媚的阳光洒…...
robotframework中的测试套件
一. 简介 本文简单来了解一下,robotframework中的测试套件。 二. robotframework中测试套件 1. 什么是测试套件? 测试套件(Test Suite) 是一组相关测试用例的集合。每个测试套件通常代表一个特定的功能模块、系统组件或业务流程…...
Echarts连接数据库,实时绘制图表详解
文章目录 Echarts连接数据库,实时绘制图表详解一、引言二、步骤一:环境准备与数据库连接1、环境搭建2、数据库连接 三、步骤二:数据获取与处理1、查询数据库2、数据处理 四、步骤三:ECharts图表配置与渲染1、配置ECharts选项2、动…...
【QED】爱丽丝与混沌的无尽海
文章目录 题目题目描述输入输出格式数据范围测试样例 思路代码复杂度分析时间复杂度空间复杂度 题目 题目链接🔗 题目描述 如图所示,爱丽丝在一个3x3的迷宫之中,每个方格中标有 1 − 9 1-9 1−9各不相同的数字,爱丽丝可以从一格…...
CHM助手 >> 如何安装CHM助手
1 如何安装CHM助手 下载CHM助手.ezip,下载地址打开EverEdit,选择主菜单“扩展 -> 扩展管理 -> 从本地文件安装扩展”,在弹出的文件浏览窗口中选择插件安装包,如下图所示: 🕮说明: …...
硬件设计:LVDS电平标准
什么是LVDS? LVDS(Low-Voltage Differential Signaling)是一种高速、低功耗的差分信号传输标准。它通过一对差分信号线(通常是两根互补信号线)来传输数据,广泛应用于高速数字通信领域。 LVDS 的核心特点 低…...