当前位置: 首页 > news >正文

webpack基本使用(基础配置)

文章目录

    • 概要理解
  • 一、使用示例
    • 1.引入库
    • 2.创建config/webpack.dev.js 测试环境
    • 3.创建config/webpack.prod.js 正式环境
    • 3.创建eslintrc.js
    • 4.创建babel.config.js
    • 5.package.json
    • 5.main.js
  • 总结


概要理解

vue或者react 通常用webpack作为打包工具,打包成浏览器识别的html、css、js -------简单理解webpack做为一个工厂。

  1. 需要告诉工厂先从那个入口(entry)开始去处理代码(通常是项目的main.js入口文件)
  2. 在所有的资源都间接或者直接被man,js引入之后,使用加载器(loaders) 将不同的原材料(less 、图片、css)转成javascript能理解的文件
  3. 当工厂还需要做一些特殊的处理(检查文件、代码压缩、图区css到单独的文件)的操作,这就是用来做特殊处理的工具(plugins)
  4. 那都处理好之后就需要输出了吧(output), webpack就将模块打包成一个或者多个文件,这些文件最终是浏览器运行的代码包

一、使用示例

首先先去webpack官方网站,包含了各种loader和plugins

1.引入库

npm install less less-loader --save-dev //处理less
npm install --save-dev css-loader //处理css
npm install --save-dev style-loader //处理style
npm install stylus stylus-loader --save-dev //处理stylus
npm i thread-loader -D

2.创建config/webpack.dev.js 测试环境


//创建config/webpack.dev.js 测试环境//处理路径问题
const path = require("path");
//使用ESLintPlugin 来做文件检查(常用作团队开发 规范代码作用)
const ESLintPlugin = require("eslint-webpack-plugin"); 
//在打包之后的dist文件中 生成一个html根目录文件
const HtmlWebpackPlugin = require("html-webpack-plugin");
const os = require("os");
const threads = os.cpus().length; // 检查cpu核数  多进程打包//工厂
module.exports = {// 入口entry: "./src/main.js", // 相对路径// 输出output: {// 所有文件的输出路径// 开发模式没有输出path: undefined,//开发模式中 devserver会重新运行刷新// 入口文件打包输出文件名 filename: "static/js/[name].js",// 给打包输出的其他文件命名chunkFilename: "static/js/[name].chunk.js",// 图片、字体等通过type:asset处理资源命名方式assetModuleFilename: "static/media/[hash:10][ext][query]",},// 加载器module: {rules: [// loader的配置{// 每个文件只能被其中一个loader配置处理//这样处理的好处 如果检测到是css 那么就不会往下走了,提高打包效率oneOf: [{test: /\.css$/, // 只检测.css文件use: [// 执行顺序:从右到左(从下到上)"style-loader", // 将js中css通过创建style标签添加html文件中生效"css-loader", // 将css资源编译成commonjs的模块到js中],},{test: /\.less$/,// loader: 'xxx', // 只能使用1个loaderuse: [// 使用多个loader"style-loader","css-loader","less-loader", // 将less编译成css文件],},{test: /\.s[ac]ss$/,use: ["style-loader","css-loader","sass-loader", // 将sass编译成css文件],},{test: /\.styl$/,use: ["style-loader","css-loader","stylus-loader", // 将stylus编译成css文件],},{test: /\.(png|jpe?g|gif|webp|svg)$/,type: "asset",parser: {dataUrlCondition: {// 小于10kb的图片转base64// 优点:减少请求数量(降低服务器压力)  缺点:体积会更大maxSize: 10 * 1024, // 10kb},},//generator: {// 输出图片名称// [hash:10] hash值取前10位//filename: "static/images/[hash:10][ext][query]",//},},{test: /\.(ttf|woff2?|map3|map4|avi)$/,type: "asset/resource",// generator: {// 输出名称// filename: "static/media/[hash:10][ext][query]",//},},{test: /\.js$/,exclude: /node_modules/, // 排除node_modules下的文件,其他文件都处理use: [{loader: "thread-loader", // 开启多进程options: {works: threads, // 进程数量},},{loader: "babel-loader",options: {// presets: ["@babel/preset-env"],cacheDirectory: true, // 开启babel缓存cacheCompression: false, // 关闭缓存文件压缩plugins: ["@babel/plugin-transform-runtime"], // 减少代码体积},},],},],},],},// 插件plugins: [// plugin的配置new ESLintPlugin({// 检测哪些文件context: path.resolve(__dirname, "../src"),exclude: "node_modules", // 默认值cache: true, //  开启缓存 意思就是说 每次打包 都要进行语句检查,那么缓存之前的,只检查修改的文件,提高性能cacheLocation: path.resolve(__dirname,"../node_modules/.cache/eslintcache"),threads, // 开启多进程和设置进程数量}),new HtmlWebpackPlugin({// 模板:以public/index.html文件创建新的html文件// 新的html文件特点:1. 结构和原来一致 2. 自动引入打包输出的资源template: path.resolve(__dirname, "../public/index.html"),}),],// 开发服务器: 不会输出资源,在内存中编译打包的devServer: {host: "localhost", // 启动服务器域名port: "3000", // 启动服务器端口号open: true, // 是否自动打开浏览器hot: true, // 开启HMR(默认值 意思是不会全部更新 哪里修改更新哪里 热更新除了js文件},optimization: {// 开发模式下不需要压缩// 代码分割配置splitChunks: {chunks: "all",// 其他都用默认值},},// 模式mode: "development",devtool: "cheap-module-source-map",
};

3.创建config/webpack.prod.js 正式环境

//创建config/webpack.prod.js 正式环境//处理路径问题
const path = require("path");
//使用ESLintPlugin 来做文件检查(常用作团队开发 规范代码作用)
const ESLintPlugin = require("eslint-webpack-plugin"); 
//在打包之后的dist文件中 生成一个html根目录文件
const HtmlWebpackPlugin = require("html-webpack-plugin");
//将打包的css 处理成单独的css文件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
//将抽离出来的css 进行压缩
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const os = require("os");
const threads = os.cpus().length; // cpu核数 开启多进程打包
//压缩js 
const TerserWebpackPlugin = require("terser-webpack-plugin");
//压缩图片
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
//预加载 浏览器空余时间 加载其他模块内容 提高性能
const PreloadWebpackPlugin = require("@vue/preload-webpack-plugin");
//断网了,但是页面还是会展示出来,离线缓存
const WorkboxPlugin = require("workbox-webpack-plugin");// 用来获取处理样式的loader
function getStyleLoader(pre) {return [MiniCssExtractPlugin.loader, // 提取css成单独文件"css-loader", // 将css资源编译成commonjs的模块到js中{loader: "postcss-loader",options: {postcssOptions: {plugins: ["postcss-preset-env", // 能解决大多数样式兼容性问题],},},},pre,].filter(Boolean);
}module.exports = {// 入口entry: "./src/main.js", // 相对路径// 输出output: {// 所有文件的输出路径// __dirname nodejs的变量,代表当前文件的文件夹目录path: path.resolve(__dirname, "../dist"), // 绝对路径// 入口文件打包输出文件名filename: "static/js/[name].[contenthash:10].js",// 给打包输出的其他文件命名chunkFilename: "static/js/[name].chunk.[contenthash:10].js",// 图片、字体等通过type:asset处理资源命名方式assetModuleFilename: "static/media/[hash:10][ext][query]",// 自动清空上次打包的内容// 原理:在打包前,将path整个目录内容清空,再进行打包clean: true,},// 加载器module: {rules: [// loader的配置{//这样处理的好处 如果检测到是css 那么就不会往下走了,提高打包效率oneOf: [{test: /\.css$/, // 只检测.css文件use: getStyleLoader(), // 执行顺序:从右到左(从下到上)},{test: /\.less$/,// loader: 'xxx', // 只能使用1个loaderuse: getStyleLoader("less-loader"),},{test: /\.s[ac]ss$/,use: getStyleLoader("sass-loader"),},{test: /\.styl$/,use: getStyleLoader("stylus-loader"),},{test: /\.(png|jpe?g|gif|webp|svg)$/,type: "asset",parser: {dataUrlCondition: {// 小于10kb的图片转base64// 优点:减少请求数量  缺点:体积会更大maxSize: 10 * 1024, // 10kb},},// generator: {// 输出图片名称// [hash:10] hash值取前10位// filename: "static/images/[hash:10][ext][query]",//},},{	//字体图标 其他资源文件 处理test: /\.(ttf|woff2?|map3|map4|avi)$/,type: "asset/resource",//通过output统一输出//generator: {// 输出名称//filename: "static/media/[hash:10][ext][query]",//},},{	// 排除node_modules下的文件,将其他的js文件都做处理 //(因为浏览器虽然识别js文件,但是一些es6新语法// 比如箭头函数、解构赋值依然没办法识别)所以使用babel转译代码test: /\.js$/,exclude: /node_modules/,use: [{loader: "thread-loader", // 开启多进程options: {works: threads, // 进程数量},},{loader: "babel-loader",options: {// presets: ["@babel/preset-env"],cacheDirectory: true, // 开启babel缓存cacheCompression: false, // 关闭缓存文件压缩plugins: ["@babel/plugin-transform-runtime"], // 减少打包代码体积},},],},],},],},// 插件plugins: [// plugin的配置new ESLintPlugin({// 检测哪些文件 (检查src下面所有的文件)context: path.resolve(__dirname, "../src"),exclude: "node_modules", // 默认值(除了node_modules)cache: true, // 开启缓存 意思就是说 每次打包 都要进行语句检查,那么缓存之前的,只检查修改的文件,提高性能cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache"), //缓存的地址threads, // 开启多进程和设置进程数量}),new HtmlWebpackPlugin({// 模板:以public/index.html文件创建新的html文件// 新的html文件特点:1. 结构和原来一致 2. 自动引入打包输出的资源//会在dist文件下创建一个一样index.html 并且以link标签方式,引入了output出口文件main.js文件template: path.resolve(__dirname, "../public/index.html"),}),//在插件中 创建MiniCssExtractPlugin(将css文件抽出,并放到指定的目录下)//打包后 会以link标签方式,在index.html,引入了main.css文件//new MiniCssExtractPlugin({//filename: "static/css/main.css",//}),//打包后 拆分为不同的css文件new MiniCssExtractPlugin({filename: "static/css/[name].[contenthash:10].css",chunkFilename: "static/css/[name].chunk.[contenthash:10].css",}),// 将打包后css压缩//new CssMinimizerPlugin(),// 打包后js压缩// new TerserWebpackPlugin({// parallel: threads, // 开启多进程和设置进程数量//}),// 预获取/预加载模块 浏览器空闲时候 提前加载模块 提高加载性能new PreloadWebpackPlugin({// rel: "preload",// as: "script",rel: "prefetch",}),// 意思 假如断网了,但是页面还是会展示出来,离线缓存new WorkboxPlugin.GenerateSW({// 这些选项帮助快速启用 ServiceWorkers// 不允许遗留任何“旧的” ServiceWorkersclientsClaim: true,skipWaiting: true,}),],//将js css 图片等 打包后的资源 进行压缩optimization: {// 压缩的操作minimizer: [// 压缩cssnew CssMinimizerPlugin(),// 压缩jsnew TerserWebpackPlugin({parallel: threads, // 开启多进程和设置进程数量}),// 压缩图片new ImageMinimizerPlugin({minimizer: {implementation: ImageMinimizerPlugin.imageminGenerate,options: {plugins: [["gifsicle", { interlaced: true }],["jpegtran", { progressive: true }],["optipng", { optimizationLevel: 5 }],["svgo",{plugins: ["preset-default","prefixIds",{name: "sortAttrs",params: {xmlnsOrder: "alphabetical",},},],},],],},},}),],// 代码分割配置splitChunks: {chunks: "all",// 其他都用默认值},runtimeChunk: {name: (entrypoint) => `runtime~${entrypoint.name}.js`,},},// 模式mode: "production",devtool: "source-map",
};

3.创建eslintrc.js

//根目录下 eslintrc.js  需要在webpack.prod.js做相应配置 
//在这个文件下 来自定义语法规范
module.exports = {// 继承 Eslint 规则extends: ["eslint:recommended"],env: {node: true, // 启用node中全局变量browser: true, // 启用浏览器中全局变量},parserOptions: {ecmaVersion: 6, // es6sourceType: "module", // es module},rules: {"no-var": 2, // 不能使用 var 定义变量},plugins: ["import"], // 解决动态导入语法报错
};

4.创建babel.config.js

//根目录下 babel.config.js  需要在webpack.prod.js做相应配置 
//(因为浏览器虽然识别js文件,但是一些es6新语法
// 比如箭头函数、解构赋值依然没办法识别)所以使用babel转译代码
// 配置智能预设(根据你所支持的浏览器或运行环境(如 Node.js)的版本,自动决定需要哪些 Babel 插件来转换代码)
module.exports = {// 智能预设:能够编译ES6语法presets: [["@babel/preset-env",{useBuiltIns: "usage", // 按需加载自动引入corejs: 3, //识别es6+新语法 补丁的作用 解决兼容性问题},],],
};

5.package.json

{"name": "web-pack-code","version": "1.0.0","description": "",//测试环境下 输出文件"main": "./src/main.js","scripts": {//启动dev命令 令devserver重新刷新项目 //devserver 实际会打包,但是打包的会存储在内存中,不会写入到磁盘    中,让保存修改文件时,触发devserver会重新更新,并将结果存储到内存中。"start": "npm run dev",//这里测试环境入口 就是配置的webpack.dev.js"dev": "webpack serve --config ./config/webpack.dev.js",// 打包 使用配置的正式环境 打包成一个或者多个文件组合成的dist"build": "webpack --config ./config/webpack.prod.js"},

5.main.js

// 完整引入
// import 'core-js'
// 按需加载 识别es6+新语法 补丁的作用 解决兼容性问题
// import "core-js/es/promise";if (module.hot) {// 判断是否支持热模块替换功能module.hot.accept("./js/count");module.hot.accept("./js/sum");
}//离线缓存
if ("serviceWorker" in navigator) {window.addEventListener("load", () => {navigator.serviceWorker.register("/service-worker.js").then((registration) => {console.log("SW registered: ", registration);}).catch((registrationError) => {console.log("SW registration failed: ", registrationError);});});
}

总结

`未完 继续更新,有错误请留言 会及时改正

相关文章:

webpack基本使用(基础配置)

文章目录 概要理解 一、使用示例1.引入库2.创建config/webpack.dev.js 测试环境3.创建config/webpack.prod.js 正式环境3.创建eslintrc.js4.创建babel.config.js5.package.json5.main.js 总结 概要理解 vue或者react 通常用webpack作为打包工具,打包成浏览器识别的…...

在js渲染的dom中的事件中传递对象

在某些情况下&#xff0c;可能需要将整个对象或部分对象嵌入到 HTML 元素的属性中&#xff0c;可以将对象数据序列化为 JSON 字符串&#xff0c;存储在 data-* 自定义属性中。这样可以在事件中取出并解析对象数据&#xff1a; <!DOCTYPE html> <html lang"en&qu…...

服务器加速器如何应对大规模并行计算需求

服务器加速器&#xff0c;如GPU(图形处理单元)、FPGA(现场可编程门阵列)和TPU(张量处理单元)&#xff0c;在大规模并行计算需求中发挥着重要作用。它们通过提供高效的并行处理能力&#xff0c;大幅提升了计算性能&#xff0c;满足了许多领域对大规模并行计算的需求。下面详细介…...

C++/Qt 多媒体(续四)

一、前言 前边讲述到了Qt的两项独特的模块编程支持的另一项内容——多媒体编程,上篇文章具体讲述的包括采集和播放原始音频相关类的概述,而本章开始主要概述多媒体编程实现的功能中的最后两项:播放视频文件和通过摄像头拍照和录像。 对于上篇内容的示例全部代码,可…...

怎样把flv转换成mp4格式?8种可以推荐的视频转换方法

怎样把flv转换成mp4格式&#xff1f;MP4格式因其广泛的兼容性&#xff0c;几乎可以在所有设备和媒体播放器上顺畅播放&#xff0c;这极大地方便了用户的观看体验。与flv文件相比&#xff0c;MP4通常能更有效地压缩视频文件&#xff0c;既能保持较高的画质&#xff0c;又能显著减…...

【2024数学建模国赛赛题解析已出】原创免费分享

2024数模国赛赛题已正式发布 数模加油站初步分析评估了此次竞赛题目&#xff1a; A题&#xff1a;偏数学仿真建模&#xff0c;难度偏难&#xff0c;适合数学专业背景的同学 B题&#xff1a;评价决策类&#xff0c;自由度大&#xff0c;容易水&#xff0c;适合基础不太好的同…...

Windows安装使用Docker

配置Dorker环境 启用或关闭windows功能 安装wsl 以管理员身份打开windows PowerShell&#xff0c;安装相关配置 下载docker应用程序 Releases tech-shrimp/docker_installer (github.com) 安装Docker 指定安装位置 默认双击程序就开始安装了&#xff0c;要安装在指定位置…...

【wsl2】从C盘迁移到G盘

参考大神 C盘的ubuntu22.04 非常大&#xff0c;高达30g 迁移后就只有几百M了&#xff1a; 右键有一个move没有敢尝试 迁移过程 Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improveme…...

低代码技术新趋势——逆向工程

低代码的下一个趋势&#xff0c;应该是“逆向工程”&#xff0c;用户可以通过 可视化界面&#xff0c;逆向输出全栈工程代码。而标准的工程代码同样可以编译为支持可视化分析、编辑、调整的“无代码”程序。前一个是解释性语言向编译性语言的逆向工程。后者则是一个理论实践应用…...

HTTP 二、进阶

四、安全 1、TLS是什么 &#xff08;1&#xff09;为什么要有HTTPS ​ 简单的回答是“因为 HTTP 不安全”。由于 HTTP 天生“明文”的特点&#xff0c;整个传输过程完全透明&#xff0c;任何人都能够在链路中截获、修改或者伪造请求 / 响应报文&#xff0c;数据不具有可…...

【Hot100】LeetCode—35. 搜索插入位置

目录 1- 思路二分 2- 实现⭐35. 搜索插入位置——题解思路 3- ACM 实现 题目连接&#xff1a;35. 搜索插入位置 1- 思路 二分 二分左区间的三种情况。由于目标值不一定在数组中&#xff0c;因此二分的过程中有三种情况判断 2- 实现 ⭐35. 搜索插入位置——题解思路 class So…...

001集——CAD—C#二次开发入门——开发环境基本设置

CAD C#二次开发首先需要搭建一个舒服的开发环境&#xff0c;软件安装后&#xff0c;需要修改相关设置。本文为保姆级入门搭建开发环境教程&#xff0c;默认已成功安装vs和cad 。 第一步&#xff1a;创建类库 第二步&#xff1a;进行相关设置&#xff0c;如图&#xff1a; 下一…...

Java类和对象——快速自动生成带参数的结构

1.鼠标点击右键或者&#xff08;使用快捷按键&#xff1a;AltInsert&#xff09; 2.选着generate 3.选择想要执行的指令 其中Constructor---构造方法&#xff08;声明了private属性然后直接使用即可&#xff09;&#xff0c;生成带参数的结构 1&#xff1a;不带参数的结构&…...

Python操作数据库的ORM框架SQLAlchemy快速入门教程

连接内存版SQLIte from sqlalchemy import create_engineengine create_engine(sqlite:///:memory:) print(engine)连接文件版SQLite from sqlalchemy import create_engineengine create_engine(sqlite:///sqlite3.db) print(engine)连接MySQL数据库 from sqlalchemy imp…...

提交MR这个词儿您知道是什么意思吗?

作为测试的同学&#xff0c;是不是经常会听研发同学说提交MR呢&#xff1f;那么究竟什么是提交MR呢&#xff1f;在这篇文章中会告诉大家&#xff01; 在Git中&#xff0c;提交MR&#xff08;Merge Request&#xff0c;合并请求&#xff09;是在进行协作开发的一种常见方式&…...

Linux sentinel写法

在linux驱动里我们经常能看到类似下面的写法&#xff1a; static const struct of_device_id asensm6_of_match[] {{ .compatible DRIVER_COMPATIBLE },{ /* sentinel */ }, };static const struct of_device_id rockchip_pinctrl_dt_match[] {{ .compatible "rockch…...

顶级域名服务器 - TLD服务器

TLD服务器&#xff08;顶级域名服务器&#xff09;是负责管理互联网域名系统&#xff08;DNS&#xff09;中所有顶级域名&#xff08;Top-Level Domains, TLDs&#xff09;的DNS记录的服务器。顶级域名是域名层级结构中的最高级别&#xff0c;位于域名的最右侧&#xff0c;例如…...

【LeetCode】01.两数之和

题目要求 做题链接&#xff1a;1.两数之和 解题思路 我们这道题是在nums数组中找到两个两个数使得他们的和为target&#xff0c;最简单的方法就是暴力枚举一遍即可&#xff0c;时间复杂度为O&#xff08;N&#xff09;&#xff0c;空间复杂度为O&#xff08;1&#xff09;。…...

便宜好用的云手机盘点

云手机作为一种新型远程计算服务&#xff0c;凭借其便利性、高效性和可扩展性&#xff0c;迅速成为了用户的热门选择。然而&#xff0c;面对市场上众多的云手机品牌&#xff0c;如何选择一款性价比高且体验良好的云手机&#xff1f;本文将为您盘点几款便宜好用的云手机产品。 雷…...

pdf怎么压缩小一些?推荐的几种PDF压缩方法

pdf怎么压缩小一些&#xff1f;在工作中&#xff0c;我们经常处理PDF文件。大文件不仅存储麻烦&#xff0c;还会拖慢传输速度。因此&#xff0c;我们通常希望将这些文件压缩成更小的尺寸。压缩后的文件更便于分享和管理&#xff0c;适用于云存储、社交媒体或其他在线平台&#…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...