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

前端打包工具之Webpack5

前端打包工具之Webpack5

    • 什么是打包工具
    • 打包工具的作用
    • 常见的打包工具
    • 一、Webpack
      • 1、什么是[webpack](https://webpack.docschina.org/concepts/)
      • 2、webpack本身的功能是有限的
      • 3、webpack基本使用:基于本身功能只解析JS资源
      • 4、webpack配置
        • 4.1、`entry`(入口):指示webpack从哪个文件开始打包
        • 4.2、`output`(出口):指示webpack打包完的文件输出到哪里、如何命名
        • 4.3、`loader` ([加载器](https://webpack.docschina.org/concepts/loaders)):webpack本身只能处理js、json资源,其他资源需要借助loader
        • 4.4、`plugins` ([插件](https://webpack.docschina.org/api/plugins)): 扩展webpack功能
        • 4.5、`mode` ([模式](https://webpack.docschina.org/configuration/mode)) :开发、生产模式
        • 4.6、`browser compatibility` (浏览器兼容性)
        • 4.7、`environment` (环境): Webpack 5 运行于 Node.js v10.13.0+ 的版本
      • 5、webpack提升打包构建速度
        • 5.1、热更新:只针对开发模式
        • 5.2、oneOf配置项
        • 5.3、exclude配置项或者include配置项
        • 5.4、ESLint、babel添加缓存
        • 5.5、启动多线程打包
        • 5.6、减少代码体积
        • 5.7、减少文件中的babel辅助代码引入
        • 5.8、压缩静态资源图片
      • 6、webpack配置代码

什么是打包工具

将浏览器无法运行的高级语法代码(如:es6、scss)编译成浏览器能识别的JS、CSS等语法。

打包工具的作用

  • 语法编辑
  • 压缩代码
  • 兼容性处理
  • 代码性能优化

常见的打包工具

  • Vite
  • Webpack
  • parcel

一、Webpack

1、什么是webpack

webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。它会以一个或多个文件作为打包的入口,将整个项目所有文件编译组合成一个或者多个文件(bundles)输出。

webpack 开箱即用,可以无需使用任何配置文件。然而,webpack 会假定项目的入口起点为 src/index.js,然后会在 dist/main.js 输出结果,并且在生产环境开启压缩和优化

2、webpack本身的功能是有限的

webpack本身的功能是有限的

  • 开发模式: 仅能编译JS中的ES Model语法
  • 生产模式:编译JS中的ES Model语法,还能压缩JS代码

即是:webpack本身只能处理JS编译,其他编译和处理需要进一步的配置

3、webpack基本使用:基于本身功能只解析JS资源

  • 初始化package.json
$ npm init -y
  • 下载依赖 cli
$ npm i webpack webpack-cli -D

webpack从4.0版本开始,在安装时,就需要安装webpack和webpack-cli这两个东西。(1、webpack是打包代码时的核心内容;2、webpack-cli是一个用来在命令行中运行webpack的工具)

xxx-cli的主要功能就是:处理命令行参数(如果你想使用 npx 来运行 webpack,请确保你已经安装了 webpack-cli);npm run build -> 执行node_modules/webpack文件 -> 执行webpack-cli文件 -> 执行cli.run() -> 处理命令行参数。

  • 执行webpack打包
// 开发环境
$ npx webpack ./app.js --mode=development
// 生产环境
$ npx webpack ./app.js --mode=production

npx webpack: 运行本地安装的webpack包(npx: 用于快速执行本地或远程的npm包)
./app.js: 打包入口文件
–mode=XXX:打包模式

以上步骤默认打包的是JS代码,CSS等其他代码的处理,需要另行配置

4、webpack配置

npx webpack init: 根据项目需求快速生产webpack配置

4.1、entry(入口):指示webpack从哪个文件开始打包

默认src/index.js

4.2、output(出口):指示webpack打包完的文件输出到哪里、如何命名
4.3、loader加载器):webpack本身只能处理js、json资源,其他资源需要借助loader

webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中。

loader 的两个属性:

  • test 属性,识别出哪些文件会被转换。
  • use属性,定义出在进行转换时,应该使用哪个 loader。
const path = require('path');module.exports = {output: {filename: 'my-first-webpack.bundle.js',},module: {// 嘿,webpack 编译器,当你碰到「在 require()/import 语句中被解析为 '.txt' 的路径」时,在你对它打包之前,先 use(使用) raw-loader 转换一下rules: [{ test: /\.txt$/, use: 'raw-loader' }],},
};
4.4、plugins (插件): 扩展webpack功能

想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建一个插件实例

const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack'); // 用于访问内置插件module.exports = {module: {rules: [{ test: /\.txt$/, use: 'raw-loader' }],},plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
};
4.5、mode (模式) :开发、生产模式
4.6、browser compatibility (浏览器兼容性)

Webpack 支持所有符合 ES5 标准 的浏览器(不支持 IE8 及以下版本)。webpack 的 import() 和 require.ensure() 需要 Promise。如果你想要支持旧版本浏览器,在使用这些表达式之前,还需要 提前加载 polyfill。

4.7、environment (环境): Webpack 5 运行于 Node.js v10.13.0+ 的版本

5、webpack提升打包构建速度

5.1、热更新:只针对开发模式
// 生产模式下不需要devServer
devServer: {host: '0.0.0.0',port: 3000,compress: true,// 默认为true: 提升开发模式的打包构建速度// 默认只支持css热更新  js的需要加载相应loaderhot: true, // 开启HRM 热更新
},
5.2、oneOf配置项
// 加载器: 帮助webpack识别  本身不能识别的资源
module: {// loader的配置rules: {// 避免找到了loader 还会继续遍历后面的loaderoneOf: [// 处理css资源{},// 处理图片资源{},// 处理其他资源{},// 将高阶JS语法处理成IE等旧浏览器能识别的JS语法{test: /\.js$/,// 排除哪些不需要处理的文件exclude: /(node_modules|bower_components)/,// 只加载一个loader 可以直接使用loader替换useloader: 'babel-loader',// 可以直接在项目中 新建babel配置文件(babel.config.js), 方便配置扩展// options: {//     presets: ['@babel/preset-env']// }}]}
},
5.3、exclude配置项或者include配置项

exclude、include不能同时使用

{test: /\.js$/,// 排除哪些不需要处理的文件exclude: /(node_modules|bower_components)/,// include: path.resolve(__dirname, "../src"),// 只加载一个loader 可以直接使用loader替换useloader: 'babel-loader',// 可以直接在项目中 新建babel配置文件(babel.config.js), 方便配置扩展// options: {//     presets: ['@babel/preset-env']// }
}
5.4、ESLint、babel添加缓存
  • babel添加缓存
// 将高阶JS语法处理成IE等旧浏览器能识别的JS语法
{test: /\.js$/,// 排除哪些不需要处理的文件exclude: /(node_modules|bower_components)/,// 只加载一个loader 可以直接使用loader替换useloader: 'babel-loader',options: {// 可以直接在项目中 新建babel配置文件(babel.config.js), 方便配置扩展// presets: ['@babel/preset-env']cacheDirectory: true, // 开启babel缓存cacheCompression: false // 关闭缓存文件压缩}
}
  • ESLint 添加缓存
// 插件
plugins: [// ESLint检验new ESLintPlugin({// eslint 只检测src下面的文件context: path.resolve(__dirname, '../src'),exclude: 'node_modules', // 默认值: node_modulescache: true, // 开启缓存cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache")}),
],
5.5、启动多线程打包
  • 获取cpu核数
const os = require('os')
// 获取cpu核数
const threads = os.cpus().length;
  • babel操作开启多线程
# 安装thread-loader
$ npm install --save-dev thread-loader
// 将高阶JS语法处理成IE等旧浏览器能识别的JS语法
{test: /\.js$/,// 排除哪些不需要处理的文件exclude: /(node_modules|bower_components)/,use: [{loader: "thread-loader",options: {workers: threads,  // babel: 进程数量}},{loader: 'babel-loader',options: {// 可以直接在项目中 新建babel配置文件(babel.config.js), 方便配置扩展// presets: ['@babel/preset-env']cacheDirectory: true, // 开启babel缓存cacheCompression: false // 关闭缓存文件压缩}}]
}
  • ESLint开启多进程
 plugins: [// ESLint检验new ESLintPlugin({// eslint 只检测src下面的文件context: path.resolve(__dirname, '../src'),exclude: 'node_modules', // 默认值: node_modulescache: true, // 开启缓存cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache"),threads  // 开启多进程}),
],
  • 压缩js开启多进程
const TerserWebpackPlugin = require('terser-webpack-plugin')
optimization: {// 压缩的操作minimizer: [// 压缩jsnew TerserWebpackPlugin({// 开启多进程parallel: threads,}),],
},
5.6、减少代码体积

Tree Shaking: 移除JS中没有使用上的代码。 生产环境下已经默认开启了

5.7、减少文件中的babel辅助代码引入
{test: /\.js$/,// 排除哪些不需要处理的文件exclude: /(node_modules|bower_components)/,use: [{loader: "thread-loader",options: {workers: threads,  // babel: 进程数量}},{loader: 'babel-loader',options: {// 可以直接在项目中 新建babel配置文件(babel.config.js), 方便配置扩展// presets: ['@babel/preset-env']cacheDirectory: true, // 开启babel缓存cacheCompression: false, // 关闭缓存文件压缩plugins: ["@babel/plugin-transform-runtime"] // 减少代码体积:避免不必要的babel的辅助代码注入}}]
}
5.8、压缩静态资源图片

图片压缩

6、webpack配置代码

const path = require('path')
const os = require('os')
const ESLintPlugin = require('eslint-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
const nodeExternals = require('webpack-node-externals')
const TerserWebpackPlugin = require('terser-webpack-plugin')
// 获取cpu核数
const threads = os.cpus().length;
// 生产模式下:进行项目优化: 优化打包速度; 优化运行性能module.exports = {target: 'node',   // ignore built-in modules like path, fs, etc.externals: [nodeExternals()], // 排除Node.js核心模块// 项目打包入口: 相对路径entry: './src/app.js',// 模式mode: "production",// 包含行和列的映射  打包速度慢// 开发模式:  'cheap-module-source-map'devtool: 'source-map', // 将编译后的代码映射回原始源代码// 打包出口: 绝对路径output: {// __dirname: node变量: 当前文件的文件夹目录path: path.resolve(__dirname, '../dist'),  // 打包后所有文件的输出路径filename: 'static/js/[name].js',   // 入口文件打包后的输出路径// 给打包输出的其他文件命名 比如import动态导入的文件// 结合webpack 魔法命名 import(/* webpackChunkName: "app" */ "./src/app.js").then(()=>{})chunkFilename: 'static/js/[name].chunk.js',// 图片、字体等通过type: asset 处理资源命名方式  替换掉generatorassetModuleFilename: 'static/media/[hash:10][ext][query]',clean: true, //  自动清空path目录内容,再进行打包publicPath: '/assets/',},// 加载器: 帮助webpack识别  本身不能识别的资源module: {// loader的配置rules: {// 避免找到了loader 还会继续遍历后面的loaderoneOf: [// 处理css资源{test: /\.s[ac]ss$/,// use的加载顺序: 从右向左use: [// "style-loader",  // 将js中的css通过创建style标签添加到html文件中MiniCssExtractPlugin.loader, // 将css资源抽离成css文件, 通过link引入(避免了加载js的阻塞)"css-loader",   // 将css资源编译成commonjs模块到js中// sass兼容处理// 需要在package 添加需要兼容到哪些浏览器// "browserslist": [//     "last 2 version",  // 所有的浏览器取最新的两个版本//     "> 1%",     // 覆盖99% 的浏览器//     "not dead"//   ]{loader: 'postcss-loader',options: {postcssOptions: {plugins: [['postcss-preset-env',{// 其他选项},],],},},},"sass-loader"   // 将sass编译成css],},// 处理图片资源{// webpack5内置了处理图片的loadertest: /\.(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?|mp3|mp4|avi)$/,type: 'asset/resource',  // 原样打包到dist中// generator: {//     // hash:10   取hash前10个字符//     filename: 'static/media/[hash:10][ext][query]'// }},// 将高阶JS语法处理成IE等旧浏览器能识别的JS语法// babel-loader: 不能处理async、promise等ES+的语法   需要借助core-js// core-js 是专门做ES6以上API的polyfill(补丁)// 在babel.config.js// module.exports = {//     // 智能预设: 能够编译ES6语法//     presets: [//         '@babel/preset-env',//         {//             useBuiltIns: 'usage',  // 按需自动加载core-js对ES6+的兼容性处理//             corejs: 3  // core-js的版本号//         }//     ]// }{test: /\.js$/,// 排除哪些不需要处理的文件exclude: /(node_modules|bower_components)/,// include: path.resolve(__dirname, "../src"),// 只加载一个loader 可以直接使用loader替换useuse: [{loader: "thread-loader",options: {workers: threads,  // babel: 进程数量}},{loader: 'babel-loader',options: {// 可以直接在项目中 新建babel配置文件(babel.config.js), 方便配置扩展// presets: ['@babel/preset-env']cacheDirectory: true, // 开启babel缓存cacheCompression: false, // 关闭缓存文件压缩plugins: ["@babel/plugin-transform-runtime"]   // 减少代码体积:避免不必要的babel的辅助代码注入}}]}]}},// 插件plugins: [// ESLint检验new ESLintPlugin({// eslint 只检测src下面的文件context: path.resolve(__dirname, '../src'),exclude: 'node_modules',threads}),// html文件自动引入依赖资源new HtmlWebpackPlugin({// 模板: 以public/index.html 文件作为模板,创建打包后新的html文件// 新的html文件特点:1、结构和打包之前的一致; 2、自动引入打包输出的资源template: path.resolve(__dirname, '../public/index.html')}),// 单独打包出css文件new MiniCssExtractPlugin({filename: 'static/css/[name].[contenthash:10].css',chunkFilename: 'static/css/[name].chunk.[contenthash:10].css'}),],optimization: {// 压缩的操作minimizer: [// css压缩// 开启生产模式 html、js会自动压缩的new CssMinimizerPlugin(),// 压缩jsnew TerserWebpackPlugin({// 开启多进程parallel: threads,}),],// 代码分割配置splitChunks: {chunks: 'all'},// 保证引用文件不变// 只变runtime和map里面的文件runtimeChunk: {name: (entrypoint) => `runtime-${entrypoint.name}.js`}},// 开发服务器: 不会输出资源到dist中的, 是在内存中进行编译打包的// src下的代码更改后,自动打包/自动编译代码// 生产模式下不需要devServerdevServer: {host: '0.0.0.0',port: 3000,compress: true,// 默认为true: 提升开发模式的打包构建速度// 默认只支持css热更新  js的需要加载相应loaderhot: true, // 开启HRM 热更新},
}

相关文章:

前端打包工具之Webpack5

前端打包工具之Webpack5 什么是打包工具打包工具的作用常见的打包工具一、Webpack1、什么是[webpack](https://webpack.docschina.org/concepts/)2、webpack本身的功能是有限的3、webpack基本使用:基于本身功能只解析JS资源4、webpack配置4.1、entry(入口…...

linux设置环境变量

linux设置环境变量 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! Linux设置环境变量:打造个性化开发环境 在Linux系统中,环境变量是一项…...

vue中对pdf文件和路径的处理

根据url预览pdf文件 地址栏输入url可以直接预览的pdf&#xff0c;这种我们可以直接使用vue-pdf进行预览 <div class"animation-box-pdf"><pdf :src"url" /></div><script> import Pdf from vue-pdfexport default {components: …...

Socks5与代理IP技术探析:构建安全高效的网络通信

1. Socks5协议的技术内幕 1.1 握手与身份验证 Socks5协议的握手阶段通过版本协商和灵活的身份验证方式建立安全连接。这确保了通信的可靠性和用户身份的安全。 1.2 数据传输机制 Socks5通过代理实现数据传输&#xff0c;支持TCP和UDP协议&#xff0c;为用户提供了高度灵活的…...

【lesson13】MySQL表的基本操作之create(创建),update(更新)和replace(替换)

文章目录 表的增删查改create测试建表基础测试 update测试建表基础测试 replace&#xff08;替换&#xff09;测试建表基础测试 表的增删查改 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; create 测试 建表…...

SQL进阶 | HAVING子句

概述 “HAVING”其用法和含义与“WHERE”关键词相似&#xff0c;但具有更高级别的限定性。在SELECT语句中&#xff0c;“HAVING”关键词用于过滤聚合函数的结果。与“WHERE”关键词不同的是&#xff0c;“HAVING”关键词不能用于过滤单个行&#xff0c;它主要用于过滤由GROUP B…...

【Marp】基于Markdown-Marp快速制作PPT

【Marp】基于Markdown-Marp快速制作PPT 文章目录 【Marp】基于Markdown-Marp快速制作PPT零、参考资料一、Marp基本语法&#xff08;创建分页&#xff0c;排版图片&#xff0c;更换主题&#xff0c;Marp扩展指令修改样式&#xff09;1、创建新的PPT页面2、插入图片 & 排版图…...

微服务项目部署

启动rabbitmq \RabbitMQ\rabbitmq_server-3.8.2\sbin 找到你的安装路径 找到\sbin路径下执行这些命令即可 rabbitmqctl status //查看当前状态 rabbitmq-plugins enable rabbitmq_management //开启Web插件 rabbitmq-server start //启动服务 rabbitmq-server stop //停止服务…...

vite+TypeScript+vue3+router4+Pinia+ElmPlus+axios+mock项目基本配置

1.viteTSVue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Select a variant:>>Typescrit2. 修改vite基本配置 配置 Vite {#configuring-vite} | Vite中文网 (vitejs.cn) vite.config.ts import { defineConfig } from vite …...

【rabbitMQ】模拟work queue,实现单个队列绑定多个消费者

上一篇&#xff1a; springboot整合rabbitMQ模拟简单收发消息 https://blog.csdn.net/m0_67930426/article/details/134904766?spm1001.2014.3001.5502 在这篇文章的基础上进行操作 基本思路&#xff1a; 1.在rabbitMQ控制台创建一个新的队列 2.在publisher服务中定义一个…...

pdf转png的两种方法

背景:pdf在一般公司,没有办公系统,又不是word/wps/Office系统,读不出来,识别不了,只能将其转化为图片png,因此在小公司或者一般公司就需要pdf转png的功能。本文将详细展开。 1、fitz库(也就是PyMuPDF) 直接pip安装PyMuPDF即可使用,直接使用fitz操作,无需其他库。 …...

【起草】1-2 讨论 ChatGPT 在自然语言处理领域的重要性和应用价值

【小结&#xff1a;ChatGPT 在自然语言处理领域的八种典型应用】 ChatGPT是一种基于Transformer模型的端到端生成式对话系统&#xff0c;采用自监督学习的方式ChatGPT是一种基于Transformer模型的端到端生成式对话系统&#xff0c;采用自监督学习的方式在海量无标注数据集上进…...

Mapreduce小试牛刀(1)

1.与hdfs一样&#xff0c;mapreduce基于hadoop框架&#xff0c;所以我们首先要启动hadoop服务器 --------------------------------------------------------------------------------------------------------------------------------- 2.修改hadoop-env.sh位置JAVA_HOME配…...

二百一十七、Flume——Flume拓扑结构之聚合的开发案例(亲测,附截图)

一、目的 对于Flume的聚合拓扑结构&#xff0c;进行一个开发测试 二、聚合 &#xff08;一&#xff09;结构含义 这种模式是我们最常见的&#xff0c;也非常实用。日常web应用通常分布在上百个服务器&#xff0c;大者甚至上千个、上万个服务器产生的日志&#xff0c;处理起来…...

vue3+ts+vite+element plus 实现table勾选、点击单行都能实现多选

需求&#xff1a;table的多选栏太小&#xff0c;点击的时候要瞄着点&#xff0c;不然选不上&#xff0c;要求实现点击单行实现勾选 <ElTableborder:data"tableDataD"style"width: 100%"max-height"500"ref"multipleTableRef"selec…...

在WPF窗口中增加水印效果

** 原理&#xff1a; ** 以Canvas作为水印显示载体&#xff0c;在Canvas中创建若干个TextBlock控件用来显示水印文案&#xff0c;如下图所示 然后以每一个TextBlock的左上角为中心旋转-30&#xff0c;最终效果会是如图红线所示&#xff1a; 为了达到第一行旋转后刚好与窗口…...

wget下载到一半断了,重连方法

我是使用wget去下载 data.tar.gz 压缩包 wget https://deepgo.cbrc.kaust.edu.sa/data/deepgozero/data.tar.gz一开始下载的挺快&#xff0c;然后随着下载继续&#xff0c;下载速度就一直在下滑 下了大概2个小时后&#xff0c;已经下载了78%(6G/7.7G&#xff09;就断了。无奈c…...

Docker笔记:docker compose部署项目, 常用命令与负载均衡

docker compose的作用 docker-compose是docker官方的一个开源项目可以实现对docker容器集群的快速编排docker-compose 通过一个配置文件来管理多个Docker容器在配置文件中&#xff0c;所有的容器通过 services来定义然后使用docker-compose脚本来启动&#xff0c;停止和重启容…...

Java单元测试:JUnit和Mockito的使用指南

引言&#xff1a; 在软件开发过程中&#xff0c;单元测试是一项非常重要的工作。通过单元测试&#xff0c;我们可以验证代码的正确性、稳定性和可维护性&#xff0c;帮助我们提高代码质量和开发效率。本文将介绍Java中两个常用的单元测试框架&#xff1a;JUnit和Mockito&#x…...

缓存雪崩问题与应对策略

目录 1. 缓存雪崩的原因 1.1 缓存同时失效 1.2 缓存层无法应对高并发 1.3 缓存和后端系统之间存在紧密关联 2. 缓存雪崩的影响 2.1 系统性能下降 2.2 数据库压力激增 2.3 用户请求失败率增加 3. 应对策略 3.1 多级缓存 3.2 限流与降级 3.3 异步缓存更新 3.4 并发控…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...