webpack介绍
entry与output
入口是 Webpack 开始构建依赖图的起点,Webpack 会从入口文件开始,递归地分析项目的依赖图。输出指定 Webpack 打包后的文件存放位置和文件名。
const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "dist"),},
};
依赖图如下所示 :
loader
Webpack 支持使用 loader 对文件进行预处理。这允许你bundle JavaScript 之外的任何静态资源。
css-loader与style-loader
css-loader
是 Webpack 中的一个加载器(loader),它允许你在 JavaScript 中直接导入 CSS 文件,并将这些 CSS 文件打包到最终的 bundle 中。这种方式与传统的通过 <link>
标签在 HTML 中引入 CSS 文件的方式不同。
实验结构如下:
如果只是单纯的在index.js中引入style.css:
#header {color: blue;
}.button {background-color: yellow;
}
import _ from "lodash";
import "./style.css";document.getElementById("button1").addEventListener("click", function () {const el = document.getElementById("header");el.innerHTML = "Hey i have updated the code !";const listItems = ["Apple", "orange", "Banana"];const ul = document.getElementById("shoppingList");_.forEach(listItems, function (item) {const tempEl = document.createElement("li");tempEl.innerHTML = item;ul.appendChild(tempEl);});
});
会报错如下:
首先下载npm install --save-dev css-loader style-loader,并且在webpack.config.js中进行配置:
const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "dist"),},module: {rules: [{test: /\.css$/,use: ["css-loader", "style-loader"],},],},
};
module
是一个关键配置项,用于定义 如何处理项目中不同类型的模块(如 JavaScript、CSS、图片、字体等),其中rules可以设置多种资源的loader,test匹配文件名,use调用对应loader。
为了匹配文件名使用正则表达式,其中/
正表示则表达式的开始和结束符号,\.
表示匹配字符 .
(因为 .
在正则中有特殊含义,所以需要用 \
转义),css表示匹配字符串 css,
$
表示匹配字符串的结尾。)
成功bundle如下:
webpack会隐式插入:
但以上内容还存在问题
我们接着引入clearButton.js与clearButton.css,如下:
import "./clearButton.css";const el = document.createElement("button");
el.innerHTML = "Clear";
el.classList.add("button");
el.onclick = function () {alert("Clear clicked");
};document.body.appendChild(el);
.button {background-color: red;
}
index.js与index.html如下:
import _ from "lodash";
import "./style.css";
import "./clearButton";document.getElementById("button1").addEventListener("click", function () {console.log("-----------");const el = document.getElementById("header");el.innerHTML = "Hey i have updated the code !";const listItems = ["Apple", "orange", "Banana"];const ul = document.getElementById("shoppingList");_.forEach(listItems, function (item) {const tempEl = document.createElement("li");tempEl.innerHTML = item;ul.appendChild(tempEl);});
});
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><h1 id="header">Hey this is my first webpack application !!</h1><ul id="shoppingList"></ul><button id="button1" class="button">Click me</button></body><script src="/dist/bundle.js"></script>
</html>
会存在以下问题
后面.button覆盖了前面的 !
要解决这个问题修改webpack.config.js, 在 css-loader
中启用了 modules: true
,这会将 CSS 文件中的类名局部化。如下:
const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "dist"),},module: {rules: [{test: /\.css$/,use: [{ loader: "style-loader" },{ loader: "css-loader", options: { modules: true } },],},],},
};
如此类名将会发生变化
但是这样仍然存在问题——直接import "xxx".css将会找不到类名。
需要用 这种方式导入css,
import { button } from "./index.css";
import { button } from "./clearButton.css";
并且以此种方式对元素进行添加。
btn1.classList.add([button]);
el.classList.add([button]);
另外,还能将css类名定义为全局类名,保持其原有的名称。
:global(.button) {background: yellow;
}
img-loader
webpack.config.js中设置如下,在 Webpack 中,type: "asset/resource"
是一种用于处理静态资源(如图片、字体等)的配置方式。如下所示:
const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "dist"),assetModuleFilename: "images/[hash][ext]",clean: true,},module: {rules: [{test: /\.(css)$/,use: [{ loader: "style-loader" },{ loader: "css-loader", options: { modules: true } },],},{test: /.(png|jpeg|gif|svg)$/,type: "asset/resource",},],},
};
图片生成如下:
在代码中,导入这些文件时会返回文件的 URL。
import logo from "./assets/webpack_logo.png";
logoEl.src = logo;
补充:
1.assetModuleFilename
:资源文件输出路径
-
作用
全局定义通过资源模块(Asset Modules)处理的文件(如图片、字体、视频等)的输出路径和文件名格式。 -
配置位置
位于output
配置对象中。 -
路径格式说明
-
[hash]
: 文件内容的哈希值(避免缓存问题) -
[ext]
: 原始文件扩展名(如.png
)
-
2.clean
:清理输出目录
-
作用
在每次构建前自动清理output.path
目录(默认是dist
),删除旧文件,避免残留文件干扰。 -
配置位置
直接作为顶级配置项。
font-loader
webpack.config.js配置如下:
const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "dist"),assetModuleFilename: "images/[hash][ext]",clean: true,},module: {rules: [{test: /\.(css)$/,use: [{ loader: "style-loader" },{ loader: "css-loader", options: { modules: true } },],},{test: /.(png|jpeg|gif|svg)$/,type: "asset/resource",},{test: /.(ttf|woff|woff2)$/,type: "asset/resource",},],},
};
其中字体文件可以放置于asset/font目录下
引入字体文件
import "./assets/fonts/Redressed-Regular.ttf";
这样就可以使用该字体了
.header {text-decoration: underline;color: blue;font-family: 'Redressed', cursive;
}
其余loader可在官网查看!
plugin
multiple entry
在 Webpack 中,多入口允许你定义多个入口文件,Webpack 会分别处理这些入口,并为每个入口生成独立的打包文件。
module.exports = {entry: {index: "./src/index.js",product: "./src/products.js",},output: {filename: "[name].bundle.js",path: path.resolve(__dirname, "dist"),},
}
1. 多入口 (entry
对象)
-
作用:允许将代码拆分为多个独立的入口文件,每个入口生成一个独立的依赖关系图和打包结果。
-
适用场景:
-
多页面应用(MPA):每个页面有独立的入口和资源。
-
按功能拆分代码:如管理后台和用户端分离。
-
2. 输出占位符 [name]
-
动态替换:
[name]
会被替换为入口对象的键名(如index
和product
)。 -
生成的文件:
-
dist/index.bundle.js
-
dist/product.bundle.js
-
有问题:现在还需再html中手动链接bundle.js:
Plugin有什么作用
增强webpack
HTML WebpackPlugin
HtmlWebpackPlugin
是 Webpack 生态中一个核心插件,用于 自动化生成 HTML 文件 并 自动注入打包后的 JavaScript/CSS 资源路径。
核心功能
-
自动生成 HTML 文件
基于模板(或默认模板)生成 HTML,自动插入<script>
和<link>
标签。 -
多入口适配
为每个入口生成独立的 HTML 文件,并精准注入对应的资源。 -
资源路径管理
自动处理带哈希的文件名(如bundle.[contenthash].js
),避免缓存问题。 -
HTML 优化
支持压缩 HTML、移除注释、排序属性等优化操作。
基础用法
先下载插件
npm install --save-dev html-webpack-plugin
引入插件
const htmlWebpackPlugin = require("html-webpack-plugin");
基本配置
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},plugins: [new HtmlWebpackPlugin()]
};
高级配置
多页面应用
module.exports = {entry: {index: './src/index.js',product: './src/product.js'},plugins: [// 首页new HtmlWebpackPlugin({template: './src/index.html',filename: 'index.html',chunks: ['index'] // 只注入 index 入口的 JS}),// 商品页new HtmlWebpackPlugin({template: './src/product.html',filename: 'product.html',chunks: ['product'] // 只注入 product 入口的 JS})]
};
- template: 用于 指定生成 HTML 文件的模板
- chunks: 用于 控制哪些 chunk 会被注入到生成的 HTML 文件中。
- filename: 指定生成的 HTML 文件名。
产物如下所示:
这样还存在问题:
css和其他资源文件都不在生成的dist中。 我们当然可以手动的移动这些文件到dist目录下,但是我们也可以配置服务器热更新。
首先安装
npm i --save-dev webpack-dev-server
进行配置
const path = require("path");module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "dist"),// 确保资源文件路径正确(可选)assetModuleFilename: "assets/[hash][ext][query]",},module: {rules: [// 处理 CSS 文件{test: /\.css$/,use: ["style-loader", "css-loader"], // 顺序从右到左执行},// 处理图片、字体等资源文件{test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/,type: "asset/resource", // Webpack 5+ 原生资源模块// 或使用 file-loader(Webpack 4)// use: "file-loader",},],},// 配置开发服务器(热更新)devServer: {static: {directory: path.join(__dirname, "dist"), // 服务 dist 目录},hot: true, // 启用热更新open: true, // 自动打开浏览器},
};
在node脚本中进行配置
"scripts": {"build": "webpack --config webpack.config.js --mode development","dev": "webpack serve --mode development --open"},
代码拆分
1. 提取公共代码(SplitChunksPlugin)
module.exports = {optimization: {splitChunks: {chunks: 'all', // 提取所有类型的 chunk(包括异步和同步)minSize: 20000, // 文件大于 20KB 才提取cacheGroups: {vendors: {test: /[\\/]node_modules[\\/]/, // 提取 node_modules 中的代码name: 'vendors', // 输出文件名priority: 10 // 优先级},default: {minChunks: 2, // 至少被引用 2 次才提取name: 'common',priority: 5}}}}
};
生成的文件:
2. 动态导入(Dynamic Imports)
使用 import()
语法动态加载模块,Webpack 会自动将其拆分为单独的 chunk,它不会在初始加载时立即请求模块,而是延迟到实际需要时才加载。其饭返回一个promise:
// 动态加载模块
button.addEventListener('click', () => {import('./module.js').then(module => {module.default();});
});
生成的文件:
自定义 chunk 名称:
使用 webpackChunkName
注释:
import(/* webpackChunkName: "my-chunk" */ './module.js');
这段代码是 Webpack 的动态导入语法,结合了 魔法注释(Magic Comments),用于实现 代码拆分(Code Splitting)。它的核心作用是将 module.js
文件单独打包成一个独立的代码块(chunk),并赋予其一个自定义名称 my-chunk
。
魔法注释:
应用场景 :
在用户交互时加载特定组件:
button.addEventListener('click', () => {import('./Modal.js').then(module => {const Modal = module.default;Modal.show();});
});
路由懒加载:
在单页面应用(SPA)中,按需加载路由组件:
const Home = () => import(/* webpackChunkName: "home" */ './Home.vue');
const About = () => import(/* webpackChunkName: "about" */ './About.vue');
为bundle添加hash
在 Webpack 中,为打包后的文件(如 JavaScript、CSS、图片等)添加 哈希值(Hash) 是一种常见的优化策略。
1. 哈希类型
Webpack 支持以下几种哈希类型:
2. 配置哈希文件名
在 webpack.config.js
中,通过 output.filename
和 output.chunkFilename
配置哈希文件名。
const path = require('path');module.exports = {entry: './src/index.js',output: {filename: '[name].[contenthash].js', // 入口文件使用 contenthashchunkFilename: '[name].[contenthash].js', // 动态导入的 chunk 使用 contenthashpath: path.resolve(__dirname, 'dist'),},module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader'],},{test: /\.(png|jpg|jpeg|gif|svg)$/,type: 'asset/resource',generator: {filename: 'assets/[name].[contenthash][ext]', // 图片文件使用 contenthash},},],},
};
3. 生成的文件结构
4. 哈希值的稳定性
-
[hash]
:每次构建都会变化,即使文件内容没有变化。 -
[chunkhash]
:只有 chunk 内容变化时才会变化。 -
[contenthash]
:只有文件内容变化时才会变化。
推荐使用 [contenthash]
,因为它更精确地反映了文件内容的变化。
从js中提取css
将CSS从JavaScript中提取出来并单独作为CSS文件,可以对浏览器加载HTML带来以下好处:
-
缓存和性能改善:
-
当HTML、CSS和JavaScript分离时,浏览器可以缓存CSS文件,从而在访问其他页面时减少加载时间,提高性能。
-
-
渲染速度提升:
-
CSS文件是渲染阻塞资源,浏览器必须下载并解析CSS后才能渲染页面。
-
通过提取关键CSS(critical CSS)并内联到HTML头部,可以减少初始渲染时间,特别是在网络条件较差的情况下3。
-
1. 核心思路
-
提取 CSS:将 CSS 从 JavaScript 中分离,生成独立的
.css
文件。 -
自动注入:在 HTML 中自动插入
<link>
标签引用生成的 CSS 文件。
2. 安装依赖
npm install --save-dev mini-css-extract-plugin html-webpack-plugin
3. 配置 Webpack
在 webpack.config.js
中配置以下内容:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {entry: './src/index.js',output: {filename: 'bundle.[contenthash].js',path: path.resolve(__dirname, 'dist'),clean: true, // 自动清理 dist 目录},module: {rules: [// 处理 CSS 文件{test: /\.css$/,use: [MiniCssExtractPlugin.loader, // 提取 CSS 到独立文件'css-loader', // 解析 CSS 语法],},// 处理图片、字体等资源文件(可选){test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/,type: 'asset/resource', // Webpack 5+ 原生资源模块generator: {filename: 'assets/[name].[contenthash][ext]', // 资源文件输出路径},},],},plugins: [// 提取 CSS 到独立文件new MiniCssExtractPlugin({filename: 'styles.[contenthash].css', // 输出的 CSS 文件名(带哈希)}),// 自动生成 HTML 并注入 CSS/JSnew HtmlWebpackPlugin({template: './src/index.html', // HTML 模板文件}),],
};
4. 项目结构示例
src/index.js
import './styles.css'; // 导入 CSS 文件
src/styles.css
body {background: #f0f0f0;font-family: Arial;
}
src/index.html
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>My App</title><!-- 不需要手动写 <link>,HtmlWebpackPlugin 会自动注入 --></head><body><div id="root"></div></body>
</html>
5. 构建结果
运行 npm run build
后,生成的 dist
目录如下:
生成的 dist/index.html:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>My App</title><link href="styles.5a6b7c8d.css" rel="stylesheet"> <!-- 自动注入 CSS --></head><body><div id="root"></div><script src="bundle.3f9a8b7e.js"></script> <!-- 自动注入 JS --></body>
</html>
Shimming
Webpack Shimming 是一种在 Webpack 中处理全局依赖或模块兼容性问题的技术。它的核心作用是为代码提供缺失的依赖项,或者修改模块的行为,使其能够在 Webpack 构建的环境中正常运行。
为什么需要 Shimming?
-
处理全局变量:某些库依赖全局变量(如
jQuery
的$
),但 Webpack 默认不会将这些变量暴露给模块。 -
兼容旧代码:一些老旧的库可能不符合模块化规范(如 CommonJS、ES Module),需要手动处理。
-
提供缺失的依赖:某些模块可能依赖特定的全局变量或模块,但这些依赖在 Webpack 中不存在。
Shimming 的实现方式
Webpack 提供了多种方式来实现 Shimming:
1. 使用 ProvidePlugin
ProvidePlugin
是 Webpack 内置的插件,用于自动加载模块,并将其注入到每个模块中。
示例:自动加载 jQuery
假设项目中使用了 jQuery
,但不想在每个模块中手动 import $ from 'jquery'
,可以通过 ProvidePlugin
自动注入 $
和 jQuery
。
const webpack = require('webpack');module.exports = {plugins: [new webpack.ProvidePlugin({$: 'jquery', // 当模块中使用 $ 时,自动加载 jqueryjQuery: 'jquery', // 当模块中使用 jQuery 时,自动加载 jquery}),],
};
效果
-
在任何模块中使用
$
或jQuery
时,Webpack 会自动引入jquery
模块。 -
例如:
// 不需要手动 import $ from 'jquery';
$(document).ready(() => {console.log('jQuery is ready!');
});
2.使用 externals
externals
是 Webpack 的一个配置选项,用于将某些依赖项排除在打包之外。它的核心作用是告诉 Webpack:“这些依赖项不需要打包到最终的输出文件中,因为它们已经在运行环境中存在了。”
1) 使用 CDN 加载库
在 HTML 中引入 jQuery
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>My App</title><script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script></head><body><div id="root"></div><script src="bundle.js"></script></body>
</html>
在 Webpack 中配置 externals
module.exports = {externals: {jquery: 'jQuery', // 将 jquery 映射为全局变量 jQuery},
};
在代码中使用 jQuery
import $ from 'jquery'; // 从全局变量中获取 jQuery$(document).ready(() => {console.log('jQuery is ready!');
});
效果
-
Webpack 不会将
jQuery
打包到bundle.js
中。 -
代码中通过
import $ from 'jquery'
获取全局变量jQuery
。
2) 排除第三方库
module.exports = {externals: {react: 'React', // 排除 React'react-dom': 'ReactDOM', // 排除 ReactDOMlodash: '_', // 排除 Lodash},
};
3.resolve.alias
resolve.alias
是 Webpack 的一个配置选项,用于为模块路径创建别名(Alias)。它的核心作用是简化模块的导入路径,避免在代码中编写冗长的相对路径,同时也可以解决模块路径冲突的问题。
基本配置
在 webpack.config.js
中配置 resolve.alias
:
const path = require('path');module.exports = {resolve: {alias: {'@': path.resolve(__dirname, 'src'), // 将 @ 映射为 src 目录components: path.resolve(__dirname, 'src/components'), // 将 components 映射为 src/components 目录},},
};
效果
-
在代码中可以使用别名代替完整路径:
import MyComponent from '@/components/MyComponent'; // 相当于 src/components/MyComponent
import Button from 'components/Button'; // 相当于 src/components/Button
常见使用场景
1. 简化路径
将常用的目录映射为简短的别名:
resolve: {alias: {'@': path.resolve(__dirname, 'src'),components: path.resolve(__dirname, 'src/components'),utils: path.resolve(__dirname, 'src/utils'),},
}
2. 解决模块冲突
如果项目中安装了多个版本的库(如 lodash
和 lodash-es
),可以通过别名指定使用哪个版本:
resolve: {alias: {lodash: path.resolve(__dirname, 'node_modules/lodash-es'), // 强制使用 lodash-es},
}
3. 替换模块
如果某个模块需要替换为自定义实现,可以通过别名指定:
resolve: {alias: {'original-module': path.resolve(__dirname, 'src/custom-module'), // 替换为自定义模块},
}
结合 TypeScript 使用
如果项目使用 TypeScript,需要在 tsconfig.json
中配置路径映射,以确保 TypeScript 能够正确解析别名。
tsconfig.json
配置
{"compilerOptions": {"baseUrl": ".", // 基础路径"paths": {"@/*": ["src/*"], // 将 @ 映射为 src 目录"components/*": ["src/components/*"] // 将 components 映射为 src/components 目录}}
}
Webpack 配置
{"compilerOptions": {"baseUrl": ".", // 基础路径"paths": {"@/*": ["src/*"], // 将 @ 映射为 src 目录"components/*": ["src/components/*"] // 将 components 映射为 src/components 目录}}
}
Tree shaking
Tree shaking(摇树优化) 是前端构建工具(如 Webpack、Rollup)中的一种优化技术,用于在打包时 移除未被使用的代码(Dead Code),比如不用。它的名字来源于“摇晃一棵树,让枯叶(无用代码)落下”的比喻。
Tree shaking 生效的条件
配置方式
1. 配置生产模式
// webpack.config.js
module.exports = {mode: 'production', // 生产模式自动启用 Tree shaking 和代码压缩
};
2. 标记无副作用的模块
在 package.json
中声明:
{"sideEffects": false // 所有文件均无副作用(默认值)
}
Tree shaking 的局限性
-
动态导入无法优化
动态导入(如import('module')
)的代码可能无法被静态分析。 -
第三方库的兼容性
未使用 ES6 模块的库(如 Lodash)需配合插件(如babel-plugin-lodash
)或按需引入。 -
副作用代码需手动标记
未正确标记副作用的代码可能被误删,导致运行时错误。
Production vs Development Build
webpack配置文件拆分
在大型项目中,Webpack 配置文件可能会变得非常复杂和冗长。为了提升可维护性和灵活性,通常会将 Webpack 配置文件拆分为多个文件,分别用于不同的环境(如开发环境、生产环境)。
webpack-merge
:用于合并多个配置文件。
webpack.common.js
(公共配置)
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: './src/index.js',output: {filename: '[name].bundle.js',path: path.resolve(__dirname, '../dist'),},module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader'],},{test: /\.(png|jpg|jpeg|gif|svg)$/,type: 'asset/resource',},],},plugins: [new HtmlWebpackPlugin({template: './src/index.html',}),],
};
webpack.dev.js
(开发环境配置)
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');module.exports = merge(common, {mode: 'development',devtool: 'inline-source-map',devServer: {static: './dist',hot: true,},
});
webpack.prod.js
(生产环境配置)
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');module.exports = merge(common, {mode: 'production',devtool: 'source-map',optimization: {splitChunks: {chunks: 'all',},},
});
相关文章:
webpack介绍
entry与output 入口是 Webpack 开始构建依赖图的起点,Webpack 会从入口文件开始,递归地分析项目的依赖图。输出指定 Webpack 打包后的文件存放位置和文件名。 const path require("path");module.exports {entry: "./src/index.js&qu…...
使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图
以下是使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图: graph TDA[开始移植] --> B[代码兼容性检查]B --> C[检查系统调用差异\nfork/exec -> CreateProcess]B --> D[检查文件路径格式\n/ vs \\]B --> E[检查依赖库兼容性\nPOSIX vs …...
蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码
文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言:STM32G431RBT6实现嵌入式组第七届题目解析源码&…...
【spring bean的生命周期】
以下是使用 Mermaid 绘制的 Spring Bean 生命周期流程图: 流程说明 实例化:Spring 容器创建 Bean 的实例。属性赋值:Spring 为 Bean 的属性注入值(依赖注入)。BeanPostProcessor.postProcessBeforeInitialization&…...
数据类设计_图片类设计之3_半规则图类设计(前端架构基础)
前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇讨论半规则图类型的设计 半规则图的定义 什么是半规则图?笔者看见了一些似乎规则又不是太规则的图形,例如带圆角的矩阵,在页面上找一个圆角框 为了…...
【leetcode hot 100 138】随机链表的复制
解决一:回溯 哈希表 本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建…...
如何安全处置旧设备?
每年,数百万台旧设备因老化、故障或被新产品取代而被丢弃,这些设备上存储的数据可能带来安全风险。 如果设备没有被正确删除数据,这些数据往往仍可被恢复。因此,安全处置旧设备至关重要。 旧设备可能包含的敏感数据 旧设备中可能…...
Windows 万兴恢复专家 Wondershare Recoverit-v13.5.7.9-[电脑数据恢复工具]
Windows 万兴恢复专家Wondershare_Recoverit 链接:https://pan.xunlei.com/s/VOL3z608vzAj_IYTvH-F1q7kA1?pwdiu89# 1. 打开Setup.exe进行安装,安装完不要打开软件,记住安装目录 2. 将"Crack"文件夹内的所有文件复制到安装目录 …...
eLection: 1靶场渗透测试
eLection: 1 来自 <eLection: 1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.196 3,对靶机进行端口服…...
类与对象(下)
1 . 再谈构造函数 1.1构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class B { public:B(int a0){_a a;} private:int _a; };虽然上述构造函数调用之后,对象中已经有了一个初始值…...
数字人源头技术搭建模型--v10追踪推理逻辑
数字人源头技术搭建模型--v10追踪推理逻辑 #数字人# #数字人技术源头saas开发# 数字人源头技术搭建模型V10的追踪推理逻辑通常涉及以下几个关键方面: 数据收集与预处理 - 多模态数据采集:收集图像、音频等多模态数据。例如通过摄像头采集人物的面部…...
基于Asp.net的高校迎新管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
商业智能BI的未来,如何看待AI+BI这种模式?
昨天在和一位朋友线上聊天的时候,提了一个问题,你是如何看待AI(人工智能)BI(商业智能)这种模式和方向的,我大概来说一下我个人的看法。 以我在商业智能BI项目中接触到的行业和企业,…...
C++ 编程指南27 - 始终将 mutex 与它所保护的数据一起定义,并尽可能使用 synchronized_value<T>
一:概述 在多线程编程中,互斥锁(std::mutex)的作用是保护共享数据的访问。但如果 mutex 和它保护的数据分开定义,可能会导致以下问题: 锁的使用不明显:程序员可能会忘记获取 mutex 就访问数据&…...
选择 DotNetBrowser 还是 EO.WebBrowser
您是否正在为 .NET 应用寻找 Web 视图控件?如果是的话,那您真是太幸运了!.NET 生态系统提供了丰富的选择。既有开源和专有的免费 Web 视图控件,也有许多企业广泛选择的商业 Web 视图控件。 在这篇博客文章中,我们将对…...
ngin配置内网服务-具体案例【天地图】
ngin配置内网服务-具体案例【天地图】 描述需求整体网络架构1. 政务内网服务器(10.10.10.70)2. 网闸(10.10.10.240:8088)3. 跳板机(10.10.20.70:9109)4. 天地图服务 具体步骤第一步:配置跳板机&…...
【网络】poll 与epoll(原理、工作模式LT、ET)
文章目录 1. poll2. epoll3. epoll原理4. epoll工作模式4.1 水平模式LT4.2 边缘模式ET 在前面用的select中,它的使用方式非常麻烦,而且能支持的文件描诉符太少了。 下面来介绍一下更加方便、高效的方式: 1. poll poll函数接口: include <…...
DeepIn Wps 字体缺失问题
系统缺失字体 Symbol 、Wingdings 、Wingdings2、Wingdings3、MT—extra 字体问题 问了下DeepSeek 在应用商店安装或者在windows 里面找 装了一个GB-18030 还是不行 在windows里面复制了缺失的字体 将字体复制到DeepIn 的字体目录(Ubuntu 应该也是这个目录&am…...
Spring有哪些缺点?
大家好,我是锋哥。今天分享关于【Spring有哪些缺点?】面试题。希望对大家有帮助; Spring有哪些缺点? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring是一个非常流行的Java框架,提供了丰富的功能和灵活的配置选项…...
使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile
比起容器、镜像来说,Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤&…...
蓝桥杯刷题周计划(第二周)
目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…...
03 | fastgo 项目规范及目录结构介绍
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入我的训练营:云原生AI实战营,一个助力 Go 开发者在 AI 时代建立技术竞争力的实战营。 为了让你更好的学习本课程。本节课,我来简单介绍下 fastgo…...
K8S学习之基础二十三:k8s的持久化存储之nfs
K8S持久化存储之nfs 在 Kubernetes (k8s) 中使用 NFS(Network File System)作为存储解决方案是一种常见的方式,特别是在需要共享存储的场景中。以下是关于如何在 Kubernetes 中使用 NFS 存储的详细说明: 1. 准备 NFS 服务器 …...
CTF代码学习日记 Python
os模块 在Python中,os是一个内置的标准模块,主要用于与操作系统进行交互,提供了许多操作文件、目录、进程等的功能。 例如: os.mkdir()用于创建新目录os.rmdir()用于删除空目录os.listdir()可以列出指定目录下的所有文件和目录…...
存储优化(protobuf与mmkv)
存储优化(protobuf与mmkv) 在Android应用开发中,数据存储是一个基础且关键的环节。随着应用功能的日益复杂,数据量的增加,传统的存储方式如SharedPreferences、SQLite等在性能上的局限性逐渐显现。本文将深入探讨两种…...
MTK Android12 添加GMS后,报“设备未经过play保护认证“问题
文章目录 问题解决 问题 在MTK平台的Android12机柜上面,客户要求安装GMS。安装后,打开发现报"设备未经过play保护认证"问题,无法使用。解决 路径:/build/make/tools/buildinfo.sh diff --git a/build/make/tools/bui…...
自定义Linux网络协议的开发与测试
在当今快速发展的技术领域中,定制化网络协议可以为特定的应用场景提供灵活而强大的解决方案。本文将详细介绍如何在Linux系统上开发一个自定义网络协议,并编写相应的用户空间程序进行测试。所有步骤基于2025年3月11日的时间点完成。 开发自定义协议内核模块 定义协议和实现…...
Ubuntu 24.04 安装与配置 JetBrains Toolbox 指南
📌 1. JetBrains Toolbox 介绍 JetBrains Toolbox 是 JetBrains 开发的工具管理器,可用于安装、更新和管理 IntelliJ IDEA、PyCharm、WebStorm、CLion 等。本指南记录了 JetBrains Toolbox 在 Ubuntu 24.04 上的 安装、路径调整、权限管理 及 遇到的问题…...
说一下spring的事务隔离级别?
大家好,我是锋哥。今天分享关于【说一下spring的事务隔离级别?】面试题。希望对大家有帮助; 说一下spring的事务隔离级别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring的事务隔离级别是指在数据库事务管理中…...
【社区投稿】深入再谈智能指针、AsRef引用与Borrow借用
深入再谈智能指针、AsRef引用与Borrow借用 这是一个具有深度的技术主题。每次重温其理论知识,都会有新的领悟。大约 2 年前,我曾就这一技术方向撰写过另一篇短文《从类型转换视角,浅谈Deref<Target T>, AsRef<T>, Borrow<T&g…...
C++ Primer Plus第十二章课后习题总结
1. 对于下面的类声明: class Cow {char name[20];char * hobby;double weight;public:Cow();Cow(const char * nm, const char * ho, double wt);Cow(const Cow c&);~Cow();Cow & operator(const Cow & c);void ShowCow() const; // display all cow d…...
Xavier 初始化:深度网络权重初始化的经典之作
Xavier 初始化:深度网络权重初始化的经典之作 发音:美 [zeɪvjər] n.泽维尔(男子名) 在深度学习的发展历程中,权重初始化对神经网络训练的成功至关重要。随机初始化的简单方法在浅层网络中尚可,但在深层…...
【量化策略】动量反转策略
【量化策略】动量反转策略 🚀量化软件开通 🚀量化实战教程 技术背景与应用场景 动量反转策略是一种基于市场行为分析的量化交易策略,它假设股票价格在经历一段时间的持续上涨或下跌后,会出现反转。这种策略适用于那些希望通过…...
菜鸟之路Day23一一JavaScript 入门
菜鸟之路Day23一一JavaScript 入门 作者:blue 时间:2025.3.10 文章目录 菜鸟之路Day23一一JavaScript 入门0.概述1.JS的引入方式2.JS的基础语法2.1输出语句2.2变量2.3数据类型2.4运算符2.5类型转换 3.函数4.JS对象4.1Array对象4.2String对象4.3Js自定义…...
FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求
FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求 0、界面预览00、简介1、编译安装1.1 编辑模块配置文件 2、使用2.1 拨号规则GET 请求POST 请求JSON 数据 2.2 Lua 脚本GET 请求POST 请求JSON 数据 3 、示例3.1 示例 1:提交 CDR 到第三方接口3.2 示例 2…...
TCP/IP原理详细解析
前言 TCP/IP是一种面向连接,可靠的传输,传输数据大小无限制的。通常情况下,系统与系统之间的http连接需要三次握手和四次挥手,这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...
HTTP与HTTPS的深度解析:技术差异、安全机制及应用场景
引言 HTTP(超文本传输协议)作为互联网通信的核心协议,自1991年诞生以来,经历了从HTTP/1.0到HTTP/3的多次迭代。然而,随着网络安全威胁的升级,纯HTTP协议因缺乏加密机制逐渐暴露其局限性。本文将重点解析HT…...
DrissionPage:更高效的动态爬虫实践(实例)
场景分析 代码重构对比 原Requests方案痛点 DrissionPage方案优势 重构后完整代码 关键技术点解析 1. 会话保持与指纹模拟 2. 智能请求重试 3. 反反爬策略 4. 混合模式扩展 性能对比测试 适用场景建议 常见问题解决 场景分析 原代码通过Requests直接调用B站API接…...
Triplet Loss原理及 Python实现
Triplet loss最初是谷歌在 FaceNet: A Unified Embedding for Face Recognition and Clustering 论文中提出的,可以学到较好的人脸的embedding Triplet Loss 是一种用于训练特征嵌入(feature embedding)的损失函数,广泛应用于人脸…...
2025人工智能AI新突破:PINN内嵌物理神经网络火了
最近在淘金的时候发现基于物理信息的神经网络(简称PINN)也是个研究热点,遂研读了几篇经典论文,深觉这也是个好发论文的方向,所以火速整理了一些个人认为很值得一读的PINN论文和同学们分享。 为了方面同学们更好地理解…...
深入探索Matter协议:开发Matter智能家居设备的基本步骤
随着家居智能化程度的提高,智能家居设备之间相互连接的网络虽然提升了家庭便利性,但也变得越来越复杂,难以管理。将亚马逊Alexa、Ring门铃、谷歌Nest Hub和苹果HomeKit等各种设备连接起来,并确保这些不同设备和操作系统能够良好地…...
搜广推校招面经四十五
快手主站推荐算法 这个是做因果选券的,如果大家的工作和这个有关,可以看看 一、有没有分析特征对各个的贡献度,怎么做? 传统的特征重要度衡量方法,就不介绍了。什么基于树模型的、SHAP值、LIME等。 但其实实际工程中…...
python之replace,strip,split命令
1. replace() 方法 功能:替换字符串中的指定子串 语法:str.replace(old, new[, count]) 特点: 全部替换(默认)或指定替换次数区分大小写返回新字符串,原字符串不变 示例: text "Hello…...
C语言处理字符串的十个函数(附带大量实例)
C语言的字符串处理函数主要集中在 <string.h> 头文件中,使用这些函数前必须包含该头文件。 字符串处理函数操作的对象通常是字符串(以 \0 结尾的字符数组),它们极大地方便了文本处理任务。 以下是我们将要讲解的主要函数&…...
【10】单片机编程核心技巧:指令周期与晶振频率
【10】单片机编程核心技巧:指令周期与晶振频率 🌟 核心概念 单片机的运算速度与时间控制,本质上由 指令周期 和 晶振频率 共同决定。理解这两者的关系,是掌握单片机底层控制的关键。 📌 1. 节拍与指令周期 …...
GitLab的Dockerfile 追踪
为了在 GitLab 上准备每个平台的 Docker 镜像文件,并实现完整的 Dockerfile 追踪,可以按照以下步骤进行操作: 项目准备 首先,确保你有一个 GitLab 项目,并且本地已经克隆了该项目的仓库。如果还没有项目,可…...
HTML基础
前言 什么是 HTML? HTML 是一种用于创建网页结构的标记语言,通过标签(Tag)定义内容的结构和呈现方式。 浏览器解析 HTML 文档后,将其渲染为可视化网页。 一、HTML 语法 1. HTML 基本骨架 所有 HTML 文档必须包含以下…...
静态时序分析:无法满足的生成时钟(TIM-255警告、UITE-461或PTE-075错误)
相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在阅读本文前,强烈建议首先阅读介绍生成时钟的文章,尤其是其中关于时钟极性和反相的相关内容。 静态时序分析:SDC约束命令cr…...
SpringBoot日常:集成shareingsphere-jdbc
文章目录 pom依赖application.yml配置log4j2.xml实体类MapperServicecontroller调用插入接口调用查询接口 本章内容我们来聊聊如何将shareingsphere-jdbc集成到我们自己的springboot项目中,本章采用的shareingsphere-jdbc版本是5.1.2,springboot项目是2.…...
Java 生成图形验证码
一、图形验证码的意义 图形验证码是一种广泛应用于互联网领域的安全验证机制,它通过向用户展示包含字符、数字、图形等信息的图片,要求用户正确识别并输入其中的内容,以此来区分用户是人类还是机器程序。图形验证码具有多方面重要意义&#…...