JavaScript系列(87)--Webpack 高级配置详解
Webpack 高级配置详解 🛠️
Webpack 是前端工程化中最流行的构建工具之一,掌握其高级配置可以帮助我们构建更高效、更优化的应用。本文将深入探讨Webpack的高级配置技巧和最佳实践。
Webpack 核心概念回顾 🌟
💡 小知识:Webpack 本质上是一个现代 JavaScript 应用程序的静态模块打包器。当 Webpack 处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
代码分割策略 📦
// 1. 基于入口的代码分割
class EntryPointSplitting {static createConfig() {return {entry: {main: './src/index.js',vendor: './src/vendor.js',admin: './src/admin.js'},output: {filename: '[name].[contenthash].js',path: path.resolve(__dirname, 'dist')},optimization: {runtimeChunk: 'single'}};}
}// 2. 动态导入
class DynamicImports {static asyncComponent() {return `// 路由级别的代码分割const UserProfile = () => import(/* webpackChunkName: "profile" */'./components/UserProfile');// 条件加载const loadAnalytics = () => {if (process.env.NODE_ENV === 'production') {import(/* webpackChunkName: "analytics" */ './analytics').then(module => module.default()).catch(err => console.error('Failed to load analytics:', err));}};`;}static preloadComponent() {return `// 预加载重要资源import(/* webpackChunkName: "important" *//* webpackPreload: true */'./important-module');// 预获取未来可能需要的资源import(/* webpackChunkName: "future" *//* webpackPrefetch: true */'./future-module');`;}
}// 3. SplitChunksPlugin 配置
class SplitChunksConfig {static getAdvancedConfig() {return {optimization: {splitChunks: {chunks: 'all',maxInitialRequests: Infinity,minSize: 20000,cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name(module) {// 获取npm包名 (例如:node_modules/packageName/...)const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];// npm包名转换为有效的文件名return `npm.${packageName.replace('@', '')}`;}},common: {name: 'common',minChunks: 2,priority: 10,reuseExistingChunk: true}}}}};}
}
模块联邦实现 🔗
// 1. 主应用配置
class ModuleFederationHost {static createConfig() {const deps = require('./package.json').dependencies;return {plugins: [new ModuleFederationPlugin({name: 'host',filename: 'remoteEntry.js',remotes: {app1: 'app1@http://localhost:3001/remoteEntry.js',app2: 'app2@http://localhost:3002/remoteEntry.js'},shared: {...deps,react: {singleton: true,requiredVersion: deps.react},'react-dom': {singleton: true,requiredVersion: deps['react-dom']}}})]};}static importRemoteModule() {return `// 动态加载远程模块const RemoteButton = React.lazy(() => import('app1/Button'));const App = () => (<div><h1>Host Application</h1><React.Suspense fallback="Loading Button..."><RemoteButton /></React.Suspense></div>);`;}
}// 2. 微前端模块配置
class ModuleFederationRemote {static createConfig() {const deps = require('./package.json').dependencies;return {plugins: [new ModuleFederationPlugin({name: 'app1',filename: 'remoteEntry.js',exposes: {'./Button': './src/components/Button','./Header': './src/components/Header','./API': './src/services/api'},shared: {...deps,react: {singleton: true,requiredVersion: deps.react},'react-dom': {singleton: true,requiredVersion: deps['react-dom']}}})]};}
}// 3. 共享模块高级配置
class SharedModulesAdvanced {static createConfig() {return {shared: {react: {singleton: true,requiredVersion: '^17.0.0',eager: true,strictVersion: true},moment: {singleton: false,requiredVersion: false,version: false,shareScope: 'default'},lodash: {shareKey: 'lodash',singleton: true,requiredVersion: '^4.17.21',eager: false}}};}
}
性能优化技术 ⚡
// 1. Tree Shaking 优化
class TreeShakingOptimizer {static configurePackageJson() {return {name: "my-project",version: "1.0.0",sideEffects: ["*.css","*.scss","./src/some-side-effectful-file.js"]};}static configureWebpack() {return {mode: 'production',optimization: {usedExports: true,sideEffects: true,providedExports: true,concatenateModules: true, // 模块合并minimize: true}};}static properModuleExport() {return `// 良好的tree-shaking友好导出export const add = (a, b) => a + b;export const subtract = (a, b) => a - b;export const multiply = (a, b) => a * b;export const divide = (a, b) => a / b;// 不友好的导出方式/*const utils = {add: (a, b) => a + b,subtract: (a, b) => a - b,multiply: (a, b) => a * b,divide: (a, b) => a / b};export default utils;*/`;}
}// 2. 缓存优化
class CachingOptimizer {static configureWebpack() {return {output: {filename: '[name].[contenthash].js',path: path.resolve(__dirname, 'dist'),chunkFilename: '[name].[contenthash].chunk.js',assetModuleFilename: 'assets/[hash][ext][query]'},optimization: {moduleIds: 'deterministic',runtimeChunk: 'single',splitChunks: {cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors',chunks: 'all'}}}}};}static configureTerser() {return {optimization: {minimizer: [new TerserPlugin({terserOptions: {compress: {drop_console: true,drop_debugger: true},format: {comments: false}},extractComments: false,parallel: true,cache: true})]}};}
}// 3. 构建性能优化
class BuildPerformanceOptimizer {static configureWebpack() {return {cache: {type: 'filesystem',buildDependencies: {config: [__filename]}},snapshot: {managedPaths: [/^(.+?[\\/]node_modules[\\/])/],immutablePaths: [/node_modules/],buildDependencies: {timestamp: true}},watchOptions: {aggregateTimeout: 300,poll: 1000,ignored: /node_modules/},stats: {chunks: false,modules: false,children: false,assets: true}};}static configureBundleAnalyzer() {return `const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {plugins: [new BundleAnalyzerPlugin({analyzerMode: 'static',reportFilename: 'bundle-report.html',openAnalyzer: false,generateStatsFile: true,statsFilename: 'bundle-stats.json'})]};`;}
}
高级加载器和插件 🔌
// 1. 自定义加载器
class CustomLoader {static createMarkdownLoader() {return `module.exports = function(source) {// 使loader可缓存this.cacheable && this.cacheable();// 异步处理const callback = this.async();// 处理 markdown 转换为 HTMLconst html = convertMarkdownToHtml(source);// 转换为模块导出const code = \`import React from 'react';export default function MarkdownContent() {return React.createElement('div', {dangerouslySetInnerHTML: { __html: ${JSON.stringify(html)} }});}\`;// 返回结果callback(null, code);};function convertMarkdownToHtml(markdown) {// 实现markdown到html的转换// 这里可以使用库如marked或showdownreturn "HTML content";}`;}static configureLoader() {return {module: {rules: [{test: /\.md$/,use: ['babel-loader',path.resolve('./loaders/markdown-loader.js')]}]}};}
}// 2. 自定义插件
class CustomPlugin {static createFileSizePlugin() {return `class FileSizePlugin {constructor(options = {}) {this.options = {outputFile: options.outputFile || 'file-sizes.json',warn: options.warn || false,warnLimit: options.warnLimit || 250 * 1024 // 250KB};}apply(compiler) {compiler.hooks.emit.tapAsync('FileSizePlugin',(compilation, callback) => {// 收集所有生成的文件大小信息const fileSizes = {};let totalSize = 0;for (const filename in compilation.assets) {const size = compilation.assets[filename].size();fileSizes[filename] = this.formatSize(size);totalSize += size;// 警告大文件if (this.options.warn && size > this.options.warnLimit) {console.warn(\`⚠️ Large file: \${filename} (\${this.formatSize(size)})\`);}}// 添加总大小fileSizes['total'] = this.formatSize(totalSize);// 创建输出文件const content = JSON.stringify(fileSizes, null, 2);compilation.assets[this.options.outputFile] = {source: () => content,size: () => content.length};callback();});}formatSize(bytes) {if (bytes < 1024) {return bytes + ' bytes';} else if (bytes < 1024 * 1024) {return (bytes / 1024).toFixed(2) + ' KB';} else {return (bytes / (1024 * 1024)).toFixed(2) + ' MB';}}}module.exports = FileSizePlugin;`;}static configurePlugin() {return `const FileSizePlugin = require('./plugins/file-size-plugin');module.exports = {plugins: [new FileSizePlugin({outputFile: 'file-sizes.json',warn: true,warnLimit: 300 * 1024 // 300KB})]};`;}
}// 3. 环境特定配置
class EnvironmentConfig {static createWebpackEnvConfig() {return `const { merge } = require('webpack-merge');const commonConfig = require('./webpack.common');module.exports = (envVars) => {const { mode } = envVars;const envConfig = require(\`./webpack.\${mode}\`);return merge(commonConfig, envConfig);};`;}static createEnvFiles() {return {common: `const path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: '[name].[contenthash].js',clean: true},module: {rules: [{test: /\.js$/,use: 'babel-loader',exclude: /node_modules/}]},plugins: [new HtmlWebpackPlugin({template: './public/index.html'})]};`,development: `const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');module.exports = {mode: 'development',devtool: 'eval-cheap-module-source-map',devServer: {hot: true,port: 3000,historyApiFallback: true},plugins: [new ReactRefreshWebpackPlugin()]};`,production: `const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');const TerserPlugin = require('terser-webpack-plugin');module.exports = {mode: 'production',devtool: 'source-map',optimization: {minimizer: [new TerserPlugin(),new CssMinimizerPlugin()]},performance: {hints: 'warning',maxEntrypointSize: 512000,maxAssetSize: 512000}};`};}
}
Webpack 5 新特性 🚀
// 1. 资源模块
class AssetModules {static configureAssetModules() {return {module: {rules: [// 图片资源{test: /\.(png|jpg|jpeg|gif)$/i,type: 'asset',parser: {dataUrlCondition: {maxSize: 8 * 1024 // 8KB}},generator: {filename: 'images/[hash][ext][query]'}},// 字体资源{test: /\.(woff|woff2|eot|ttf|otf)$/i,type: 'asset/resource',generator: {filename: 'fonts/[hash][ext][query]'}},// SVG资源{test: /\.svg$/i,oneOf: [{// 针对SVG React组件resourceQuery: /react/,use: ['@svgr/webpack']},{// 普通SVG资源type: 'asset/resource',generator: {filename: 'icons/[hash][ext][query]'}}]}]}};}static assetUsageExample() {return `// 图片资源import logo from './assets/logo.png';document.getElementById('logo').src = logo;// SVG React组件import { ReactComponent as Logo } from './assets/logo.svg?react';function Header() {return <Logo width={50} height={50} />;}// 字体资源import './assets/fonts/opensans.woff2';`;}
}// 2. 持久缓存
class PersistentCache {static configureCache() {return {cache: {type: 'filesystem',version: '1.0',cacheDirectory: path.resolve(__dirname, '.temp_cache'),name: 'my-project-cache',buildDependencies: {config: [__filename]},compression: 'gzip'}};}static setupMaxAge() {return {cache: {type: 'filesystem',maxAge: 5184000000, // 60 days in millisecondsmaxMemoryGenerations: 1}};}
}// 3. 实验性功能
class ExperimentalFeatures {static enableExperiments() {return {experiments: {asyncWebAssembly: true,topLevelAwait: true,outputModule: true,lazyCompilation: {entries: false,imports: true}}};}static topLevelAwaitExample() {return `// 顶级 await(不需要包装在 async 函数中)const response = await fetch('https://api.example.com/data');const data = await response.json();export default data;`;}static webAssemblyExample() {return `// 异步WebAssembly加载async function loadWasm() {const wasm = await import('./module.wasm');return wasm;}// 使用loadWasm().then(module => {module.exports.someFunction();});`;}
}
Webpack分析与调试 🔍
// 1. 构建分析
class BuildAnalysis {static configureStatsPreset() {return {stats: {preset: 'errors-warnings',assets: true,colors: true,timings: true,performance: true,optimizationBailout: true}};}static configureAnalyzerPlugin() {return `const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');module.exports = {plugins: [new BundleAnalyzerPlugin({analyzerMode: process.env.ANALYZE ? 'server' : 'disabled',analyzerHost: '127.0.0.1',analyzerPort: 8888,reportFilename: 'bundle-report.html',openAnalyzer: true,generateStatsFile: true,statsFilename: 'stats.json',statsOptions: {source: false,reasons: true},excludeAssets: [/\.map$/]})]};`;}static configureSpeedMeasurePlugin() {return `const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');const smp = new SpeedMeasurePlugin();// 包装整个webpack配置module.exports = smp.wrap({// 常规webpack配置...});`;}
}// 2. 调试技巧
class WebpackDebugging {static profileConfig() {return `module.exports = {// ...其他配置profile: true};`;}static traceConfig() {return `// 命令行使用示例// webpack --trace-deprecation// webpack --trace-warnings// webpack --trace`;}static inspectConfig() {return `// 检查配置const { inspect } = require('util');module.exports = (env, argv) => {const config = {// ...正常配置};// 输出最终配置到控制台console.log(inspect(config, { depth: null, colors: true }));return config;};`;}
}
高级优化策略 💎
// 1. 懒加载优化
class LazyLoadingOptimization {static routeLevelCodeSplitting() {return `// React Router 懒加载import React, { lazy, Suspense } from 'react';import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';// 懒加载路由组件const Home = lazy(() => import(/* webpackChunkName: "home" */ './pages/Home'));const About = lazy(() => import(/* webpackChunkName: "about" */ './pages/About'));const Dashboard = lazy(() => import(/* webpackChunkName: "dashboard" */ './pages/Dashboard'));function App() {return (<Router><Suspense fallback={<div>Loading...</div>}><Switch><Route exact path="/" component={Home} /><Route path="/about" component={About} /><Route path="/dashboard" component={Dashboard} /></Switch></Suspense></Router>);}`;}static componentLevelCodeSplitting() {return `// 组件级懒加载import React, { lazy, Suspense, useState } from 'react';// 懒加载重型组件const HeavyChart = lazy(() => import(/* webpackChunkName: "heavy-chart" */ './components/HeavyChart'));function Dashboard() {const [showChart, setShowChart] = useState(false);return (<div><h1>Dashboard</h1><button onClick={() => setShowChart(true)}>Load Chart</button>{showChart && (<Suspense fallback={<div>Loading chart...</div>}><HeavyChart /></Suspense>)}</div>);}`;}
}// 2. 线上部署优化
class DeploymentOptimization {static configureOutput() {return {output: {filename: '[name].[contenthash].js',chunkFilename: '[name].[contenthash].chunk.js',path: path.resolve(__dirname, 'dist'),publicPath: 'https://cdn.example.com/',crossOriginLoading: 'anonymous'}};}static configureSecurity() {return {output: {trustedTypes: true,crossOriginLoading: 'anonymous'},devtool: false, // 生产环境禁用源代码映射plugins: [new webpack.ids.HashedModuleIdsPlugin(), // 稳定模块IDnew webpack.DefinePlugin({'process.env.NODE_ENV': JSON.stringify('production'),'process.env.API_URL': JSON.stringify('https://api.example.com')})]};}static configureCompression() {return `const CompressionPlugin = require('compression-webpack-plugin');const zlib = require('zlib');module.exports = {plugins: [// Gzip压缩new CompressionPlugin({filename: '[path][base].gz',algorithm: 'gzip',test: /\.(js|css|html|svg)$/,threshold: 10240, // 只处理大于10KB的资源minRatio: 0.8 // 只有压缩率小于0.8的资源才会被处理}),// Brotli压缩(更高压缩率)new CompressionPlugin({filename: '[path][base].br',algorithm: 'brotliCompress',test: /\.(js|css|html|svg)$/,compressionOptions: {params: {[zlib.constants.BROTLI_PARAM_QUALITY]: 11}},threshold: 10240,minRatio: 0.8})]};`;}
}
结语 📝
Webpack的高级配置能够帮助我们构建更高效、更优化的前端应用。我们学习了:
- 代码分割策略和动态导入
- 模块联邦实现微前端架构
- 性能优化技术如Tree Shaking和缓存优化
- 自定义加载器和插件开发
- Webpack 5的新特性
- 构建分析与调试技巧
- 高级优化策略和部署配置
💡 学习建议:
- 逐步应用这些高级特性,不要一次性应用所有优化
- 使用分析工具监控优化效果
- 根据项目需求选择合适的配置
- 持续关注Webpack的更新和新特性
- 参考成熟项目的Webpack配置学习最佳实践
如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇
终身学习,共同成长。
咱们下一期见
💻
相关文章:
JavaScript系列(87)--Webpack 高级配置详解
Webpack 高级配置详解 🛠️ Webpack 是前端工程化中最流行的构建工具之一,掌握其高级配置可以帮助我们构建更高效、更优化的应用。本文将深入探讨Webpack的高级配置技巧和最佳实践。 Webpack 核心概念回顾 🌟 💡 小知识…...
48.日常算法
1.面试题 03.06. 动物收容所 题目来源 动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或…...
MySql数据库运维学习笔记
数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL(结构化查询语言)中的四个重要类别,它们分别用于不同类型的数据库操作,下面为你简单明了地解释这四类语句: 1. DQL(数据查询语言,Data Query Langu…...
Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现
基于四元数与滑模控制的卫星姿态控制 一、基本原理 1. 四元数姿态表示 四元数运动学方程: 3. 滑模控制设计 二、代码实现(Python) 1. 四元数运算工具 import numpy as npdef quat_mult(q1, q2):"""四元数乘法""…...
MongoDB学习
MongoDB 是一种流行的 NoSQL 数据库,以文档存储为核心,适用于高灵活性、高扩展性的场景。本文将从基础概念到实际应用,带你快速掌握 MongoDB 的核心操作。 1. MongoDB 简介 什么是 MongoDB? MongoDB 是一个基于分布式文件存储的…...
水利工程安全包括哪几个方面
水利工程安全培训的内容主要包括以下几个方面: 基础知识和技能培训 : 法律法规 :学习水利工程相关的安全生产法律法规,了解安全生产标准及规范。 事故案例 :通过分析事故案例,了解事故原因和教训&#x…...
九、数据治理架构流程
一、总体结构 《数据治理架构流程图》(Data Governance Architecture Flowchart) 水平结构:流程图采用水平组织,显示从数据源到数据应用的进程。 垂直结构:每个水平部分进一步划分为垂直列,代表数据治理的…...
Spring boot中的@ConfigurationProperties注解
Spring boot中的ConfigurationProperties注解 ConfigurationProperties 是 Spring Boot 提供的一个强大注解,用于将配置文件(如 application.properties 或 application.yml)中的配置绑定到一个 Java 对象中。它不仅简化了配置管理ÿ…...
04性能监控与调优篇(D2_JVM调优⼯具)
目录 学习前言 讲解一:理论篇(深入理解JVM第三版) 一、虚拟机性能监控、故障处理工具 1. 基本介绍 2. 基础故障处理工具 jps:虚拟机进程状况工具 jstat:虚拟机统计信息监视工具 jinfo:Java配置信息工…...
DeepSeek 提示词:基础结构
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
OkHttp、Retrofit、RxJava:一文讲清楚
一、okHttp的同步和异步请求 Call 是 OkHttp 的核心接口,代表一个已准备好执行的 HTTP 请求。它支持 同步 和 异步 两种模式: enqueue——>okHttp异步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…...
AI前端加速科学研究:ScriptEcho赋能科研新纪元
科学研究正面临前所未有的挑战。数据以前所未有的速度爆炸式增长,研究课题也变得日益复杂。如何高效地处理海量数据、构建复杂模型、并将其转化为有意义的结论,成为摆在科研人员面前的一道难题。传统的科研模式往往需要耗费大量的时间和精力在数据处理、…...
从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?
本文首发:从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)? 阿里云百炼和火山引擎都推出了免费的 DeepSeek 模型体验额度,今天我和大家一起搭建一个本地的专属 AI 助手。 阿里云百炼为 …...
ChatGPT背后的理论基础:从预训练到微调的深度解析
友情提示:本文内容由银河易创(https://ai.eaigx.com)AI创作平台GPT-4o-mini模型生成,仅供参考。请根据具体情况和需求进行适当的调整和验证。 随着人工智能特别是自然语言处理技术的飞速发展,ChatGPT作为一种强大的对话…...
Java八股文(下)
Java八股文下篇 八、JVM高级篇1、JVM的内存模型以及分区介绍一下?2、四种引用方式有什么?3、判断是否为垃圾算法?4、垃圾回收算法介绍一下?5、类的生命周期以及类加载过程6、加载器种类有什么?7、什么是双亲委派模型以…...
软考高级【网络规划设计师】 综合知识
引言:软考高级【网络规划设计师】共分为3个部分,综合知识,案例分析,论文。这里主要讲诉综合知识的相关内容。综合知识一共75道单选,题目跟网工类似,稍难。 第1章 计算机网络基础 考点分析: 本…...
django框架使用
一、app注册: pycharm使用django框架,注意在注册界面时就创建app,如果没有创建app。就在终端中运行 python manage.py startapp [app名] 然后再在settings.py里注册。 格式为: [app名].apps.[首字母大写的app名]Config 二、创…...
Linux主机用户登陆安全配置
Linux主机用户登陆安全配置 在Linux主机上进行用户登录安全配置是一个重要的安全措施,可以防止未经授权的访问。以下是如何创建用户hbu、赋予其sudo权限,以及禁止root用户SSH登录,以及通过ssh key管理主机用户登陆。 创建用户hbu 使用具有…...
MySQL | MySQL库、表的基本操作
MySQL库、表的基本操作01 一、库操作1.1 查看数据库1.2 创建数据库1.3 选择数据库1.4 查看创建数据库的SQL语句1.5 修改数据库1.6 删除数据库 二、表操作2.1 创建数据表2.2 查看表2.3 查看表结构2.4 查看创建数据库的SQL语句2.5 修改表2.6 删除表 ⚠️MySQL版本 8.0 一、库操作…...
【Uniapp-Vue3】在uniapp中使用pinia的基本用法
引入pinia: 在main.js中对pinia进行引入,使用和导出 import * as Pinia from pinia; // 引入pinia app.use(Pinia.createPinia()); // 使用pinia 在项目根目录下创建一个stores文件夹,里面创建一个counter.js文件 我们在counter.js中定义…...
mysql中的计算日期函数 理解、用法
三种计算日期的函数 函数用途示例DATEDIFF()计算两个日期的天数差DATEDIFF(2023-10-05, 2023-10-01) → 4TIMESTAMPDIFF()按指定单位(年、月、小时等)计算差TIMESTAMPDIFF(MONTH, 2023-01-01, 2023-03-01) → 2DATE_ADD()日期加法DATE_ADD(2023-10-01, …...
HTTP实验(ENSP模拟器实现)
目录 HTTP概述 HTTP实验 HTTPS 实验 HTTP概述 HTTP(HyperText Transfer Protocol,超文本传输协议),设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP定义了多种请求方法,常用的包括: …...
Ubuntu指令(一)
一、终端操作指令 打开终端,有两种便捷方式: 直接点击系统中的终端按钮;使用快捷键ctrl alt T。 关闭终端,同样有多种选择: 在终端输入exit指令;使用快捷键ctrl d;直接点击终端窗口的关闭…...
结构型模式 - 装饰者模式 (Decorator Pattern)
结构型模式 - 装饰者模式 (Decorator Pattern) 在展开讲装饰者模式之前,不得不提一下代理模式,因为这两者在一定的层度上是有相似性的, 通过对比可以让我们更好的理解装饰者. 定义与核心目的 装饰者模式 定义:动态地将责任附加到对象上。若要扩展功能,…...
11.Docker 之分布式仓库 Harbor
Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 VMware 开源,其通过添加一些企业必需的功能特性,例…...
vue2使用xlsx依赖导出excel并封装组件
1. 安装 npm install xlsx file-saver --save2. 简单封装 import * as XLSX from xlsx; import { saveAs } from file-saver;export function exportExcel(data, fileName) {return new Promise((resolve, reject) > {if (!data || !data.length) {return reject(new Erro…...
Python入门12:面向对象的三大特征与高级特性详解
面向对象编程(OOP)是Python编程中非常重要的一部分,它通过封装、继承和多态这三大特征,帮助我们更好地组织和管理代码。除此之外,Python还提供了一些其他特性,如类属性、类方法和静态方法,进一步…...
JVM之JVM的组成
Java 虚拟机(JVM)是 Java 程序的运行核心,它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。 类加载系统(Class Loading System) 类加载系统负责在程序运行时动态地将 Java 类加载到 J…...
计算机毕业设计SpringBoot+Vue.js中小型医院网站(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
滑动验证组件-微信小程序
微信小程序-滑动验证组件,直接引用就可以了,效果如下: 组件参数: 1.enable-close:是否允许关闭,默认true 2.bind:onsuccess:验证后回调方法 引用方式: <verification wx:if&qu…...
【DeepSeek问答】QProcess::start是异步的吗?会使UI卡顿吗?
好的,我现在需要回答用户关于QProcess::start是否是异步的,以及它是否会导致UI卡顿的问题。用户之前已经询问过如何开发一个调用7-Zip的Qt应用,并且我给出了示例代码。现在用户可能在使用过程中遇到了问题,或者想更深入了解QProce…...
WebXR教学 01 基础介绍
什么是WebXR? 定义 XR VR AR Web上使用XR技术的API WebXR 是一组用于在 Web 浏览器中实现虚拟现实(VR)和增强现实(AR)应用的技术标准。它由 W3C 的 Immersive Web 工作组开发,旨在提供跨设备的沉浸式体验…...
数据开发面试:DQL,
DQL常见面试题 where 和 having 的区别 三个排序开窗函数的区别 left join 用where 筛选 和 用on筛选的区别 ON 子句:用于定义连接条件,不会丢失左表的行。 WHERE 子句:用于过滤连接后的结果集,可能会丢失左表中没有匹配的行 …...
sage-huga改进SITAN
Sage-Husa自适应滤波算法 Sage-Husa自适应滤波算法是一种在递推滤波过程中实时估计和修正系统噪声和观测噪声统计特性的算法,从而降低系统模型误差,提高滤波精度。该算法基于卡尔曼滤波,并通过自适应调整噪声协方差矩阵来优化滤波效果。 算法原理 Sage-Husa滤波器的核心思…...
深入解析React useEffect与useLayoutEffect:区别、原理与实践
🌌 深入解析React useEffect与useLayoutEffect:区别、原理与实践 在React函数组件中,useEffect和useLayoutEffect是处理副作用的两个核心Hook。它们看似相似,但在执行时机和应用场景上有本质区别。本文将通过原理剖析、对…...
1分钟用DeepSeek编写一个PDF转Word软件
一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的pdf转word工具有收费的wps,免费的有pdfgear,见下文: PDFgear:一款免费的PDF编辑、格式转化软件-CSDN博客 还有网上在线的免费pdf转word工具smallp…...
百度觉醒,李彦宏渴望光荣
文 | 大力财经 作者 | 魏力 2025年刚刚开年,被一家名为DeepSeek的初创公司强势改写。在量化交易出身的创始人梁文锋的带领下,这支团队以不到ChatGPT 6%的训练成本,成功推出了性能可与OpenAI媲美的开源大模型。 此成果一经问世,…...
MySQL知识
1.Navicat客户端连接 打开navicat,点击连接,点击MySQL 输入连接名与密码,如果连接的mysql是windows下的mysql主机号就填写localhost 填写好后点击测试连接 点击确定,mysql连接navicat成功 2.MySQL数据定义语言(DDL) DDL用于数据库…...
从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(三) 实现注册 登录接口
1.划分文件夹 在src目录下创建controllers middleware models routes controllers 放具体的方法 signup login middleware 里面是中间件 请求的验证 models 放对象实体 routes 处理访问路径像/signup /login 等等 2. 接口开发 系统的主要 有用户认证 和 消息 2种类型…...
Pytorch实现之浑浊水下图像增强
简介 简介:这也是一篇非常适合GAN小白们上手的架构文章!提出了一种基于GAN的水下图像增强网络。这种网络与其他架构类似,生成器是卷积+激活函数+归一化+残差结构的组成,鉴别器是卷积+激活函数+归一化以及全连接层。损失函数是常用的均方误差、感知损失和对抗损失三部分。 …...
代码异常(js中forEach)NO.3
1. 环境 Vue3,Element Plsu 2. 示例代码 dataList.value.forEach((x) > {if (x.id ids.value[0]) {x { id: ids.value[0], ...form.value }}})3. 情景描述 循环不能正确改变dataList.value里面的值 4. 原因 在 JavaScript 中,forEach 的回调函…...
Vue 报错error:0308010C:digital envelope routines::unsupported 解决方案
Vue 报错error:0308010C:digital envelope routines::unsupported 解决方案 拿了一个比较老的项目部署在本地,然后先安装依赖npm install,最后npm run serve,在run serve的时候报错:报错error:0308010C:digital envelope routines::unsupportedÿ…...
stm32108键C-B全调性_动态可视化乐谱钢琴
108键全调性钢琴 一 基本介绍1 项目简介2 实现方式3 项目构成 二 实现过程0 前置基本外设驱动1 声音控制2 乐谱录入&基础乐理3 点阵屏谱点动态刷新4 项目交互控制5 录入新曲子过程 三 展示,与链接视频地址1 主要功能函数一览2 下载链接3 视频效果 一 基本介绍 …...
OpenIPC开源FPV之Adaptive-Link安装
OpenIPC开源FPV之Adaptive-Link安装 1. 源由2. 介绍2.1 天空端安装2.2 地面端安装 3. 问题汇总3.1 安装脚本问题3.2 网络安装问题3.3 非SSC30KQ/SSC338Q硬件3.4 代码疑问 4. 总结5. 后续 1. 源由 鉴于飞行过程,发现一些马赛克现象,且60FPS桌面30FPS的录…...
2016年下半年试题二:论软件设计模式及其应用
论文库链接:系统架构设计师论文 论文题目 软件设计模式(Software DesignPatter)是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了重用代码以提高编码效率增加代码的可理解性、保证代码的可靠性。软件设计模式是软件开发中的…...
UE(虚幻)学习(五)初学创建NPC移动和遇到的问题
最近在学习UE中遇到一些问题,把这些问题记录一下,因为实在废了很大功夫。 在学习了UE5的例子中的第三人称移动Demo,想实现几个NPC在场景内移动。 本来想自己写一个类,遇到一堆问题花费了好几天时间,所以我把问题写下来…...
《Keras 2 :使用 RetinaNet 进行对象检测》:此文为AI自动翻译
《Keras 2 :使用 RetinaNet 进行对象检测》 作者:Srihari Humbarwadi 创建日期:2020/05/17 最后修改日期:2023/07/10 描述:实施 RetinaNet:用于密集对象检测的焦点损失。 (i) 此示例使用 Keras 2 在 Colab 中查看 • 介绍 目标检测是计算机中非常重要的问题 视觉。在…...
mfy学习笔记
创建表并导入数据 CREATE TABLE sales (id INT,salesperson STRING,region STRING,sales_amount INT,sale_date DATE );INSERT INTO sales (id, salesperson, region, sales_amount, sale_date) VALUES (1, Alice, North, 1000, 2023-01-01), (2, Bob, South, 1500, 2023-01-0…...
mysql 学习19 MYSQL管理以及使用工具
系统数据库 常用工具 mysql [rootCentOS7 home]# mysql -h192.168.245.131 -P3306 -uroot -pmimaroot -e "select * from tb_sanguo_user;" centositcast [rootCentOS7 home]# mysql -h192.168.245.131 -P3306 -uroot -pmimaroot centositcast -e "select * fr…...
Linux | RHEL / CentOS 中 YUM history / downgrade 命令回滚操作
注:英文引文,机翻未校。 在 RHEL/CentOS 系统上使用 YUM history 命令回滚升级操作 作者: 2daygeek 译者: LCTT DarkSun 为服务器打补丁是 Linux 系统管理员的一项重要任务,为的是让系统更加稳定,性能更加…...