Webpack5 基本使用 - 2

常用 loader

  • loader 是辅助打包工具。
  • webpack 默认只能打包 js 文件,打包其它模块就需要配置 loader 来告诉 webpack 该怎么去打包其它文件。
  • loader 可以将文件从不同的语言转换为 JavaScript
  • 一类文件如果需要多个 loader 处理,loader 的执行顺序是从后往前。

打包样式文件

打包 css

css 文件需要先用 css-loader 处理,再用 style-loader 插入 <style></style>标签中。

安装 css-loader、style-loader

yarn add css-loader style-loader --save
module.exports = {
	module: {
		rules: [
			{
				test: /\.css$/,
				use: [
					// 再用 style-loader 创建 style 标签插入 <head></head> 标签中
					'style-loader',
					// css 文件需要先用 css-loader 处理,将 css 编译成 commonjs 整合到 js 中
					'css-loader'
				]
			}
		]
	}
};
// 使用 localIdentName 自定义生成的样式名称格式,可选的参数有: 
// [path] 表示样式表相对于项目根目录所在路径 
// [name] 表示样式表文件名称 
// [local] 表示样式的类名定义名称 
// [hash:length] 表示32位的hash值 

module.exports = {
	module: {
		rules: [
			{
				test: /\.css$/,
				use: [
					'style-loader',
					{
						loader: 'css-loader',
						options: {
							modules: {
								localIdentName: '[path][name]-[local]'
							}
						}
					}
				]
			}
		]
	}
};
// index.js
import add from '@utils/add';
import './css/style.css';

// import styles from './css/style.css';
// console.log(styles);

console.log(add(1, 4));
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 class="title">hello webpack5</h1>
</body>
</html>

在这里插入图片描述

样式兼容性处理

postcss-loader 自动添加浏览器前缀。

使用 autofixer 插件辅助

autoprefixer 可以指定需要兼容的浏览器。

安装 postcss-loader、autofixer

yarn add postcss-loader autoprefixer --save
// 通过配置加载指定的 css 兼容性样式
// postcss-loader 在 css-loader 之前调用
module.exports = {
	module: {
		rules: [
			{
				test: /\.scss$/,
				use: [
					'style-loader',
					'css-loader',
					{
						loader: 'postcss-loader',
						options: {
							postcssOptions: {
								plugins: [
									[
										'autoprefixer', 
										{
											// options
											// 直接在这里指定浏览器版本
											overrideBrowsersList: ['last 5 versions']
										}
									]
								]
							}
						}
					},
					'sass-loader'
				]
			}
		]
	}
};
使用 postcss-preset-env 插件辅助

postcss-preset-env 插件可以指定需要添加的浏览器。

安装 postcss-loader、postcss-preset-env

yarn add postcss-loader postcss-prest-env --save
// 通过配置加载指定的css兼容性样式
module.exports = {
	module: {
		rules: [
			{
				test: /\.scss$/,
				use: [
					'style-loader',
					'css-loader',
					{
						loader: 'postcss-loader',
						options: {
						    postcssOptions: {
								plugins: [
									[
					                    "postcss-preset-env",
					                    {
					                      // Options
					                      "browserslist": {
												"development": [
													// 兼容最近的一个 chrome 的版本
													"last 1 chrome version",
													"last 1 firefox version",
													"last 1 safari version",
												],
												"production": [
													// 大于 99.8% 的浏览器
													">0.2%",
													// 不要已经死了的浏览器:比如 IE10,兼容没有意义
													"not dead",
													// op_mini 的浏览器全都死亡了
													"not op_mini all"
												]
											}
					                    },
				                  	]
								]
							}
						}
					},
					'sass-loader'
				]
			},
			{
				test: /\.scss$/,
				use: [
					'style-loader',
					'css-loader',
					{
						loader: 'postcss-loader',
						// 写法二
						options: {
							ident: 'postcss',
							plugins: [
								require('postcss-preset-env')()
							]
						}
					},
					'sass-loader'
				]
			}
		]
	}
};
打包 less

安装 less、less-loader、css-loader、style-loader

yarn add less less-loader css-loader style-loader --save
module.exports = {
	module: {
		rules: [
			// less-loader 是基于 less 的,所以使用 less-loader 需要同时安装 less
			{
				test: /\.less$/,
				use: [
					'style-loader',
					'css-loader',
					'less-loader'
				]
			}
		]
	}
};

打包 sass

安装 sass、sass-loader、css-loader、style-loader

yarn add sass sass-loader css-loader style-loader --save
module.exports = {
	module: {
		rules: [
			// sass-loader 是基于 sass 的,所以使用 sass-loader 需要同时安装 sass
			{
				test: /\.scss$/,
				use: [
					'style-loader',
					'css-loader',
					'postcss-loader',
					'sass-loader'
				]
			}
		]
	}
};
打包 styl

安装 stylus-loader、style-loader、css-loader'

yarn add stylus-loader css-loader style-loader
module.exports = {
	module: {
		rules: [
			{
				test: /\.scss$/,
				use: [
					'style-loader',
					'css-loader',
					'postcss-loader',
					'stylus-loader'
				]
			}
		]
	}
};

打包图片、字体等静态资源

打包图片

webpack4 需要使用url-loaderfile-loaderwebpack5 已内置,使用模块 asset

asset/resource
  • 使用 asset/resource 处理的资源会输出到目录中,采用哈希命名
  • file-loaderwebpack5 中已被 asset/resource 替代。
module.exports = {
	module: {
		rules: [
			{
				test: /\.(png|jpeg|gif|PNG)$/,
				type: 'asset/resource'
			}
		]
	}
};

在这里插入图片描述

在这里插入图片描述

const path = require('path');

module.exports = {
  output: {
    // ...
    // 指定所有 assetModule 文件的输出目录,同时重命名输出的文件名称
   	// assetModuleFilename: 'static/[hash][ext][query]'
  },
  module: {
    rules: [
      {
        test: /\.(png|jpg|jpeg|gif|PNG)$/,
        type: 'asset/resource',
        generator: {
        	// 与 assetModuleFilename 只取其一
			// 输出图片的名称
			filename: 'images/[hash:8][ext][query]'
		}
     }
    ]
  },
};

在这里插入图片描述

asset/inline
  • url-loaderwebpack5 中已被 asset/inline 替换。
  • 打包输出的数据 URI 使用 Base64 算法编码的文件内容(可以减少 http 请求数量,但是体积会变大)
module.exports = {
	module: {
		rules: [
			{
				test: /\.(png|jpg|jpeg|gif|PNG)$/,
				type: 'asset/inline'
			}
		]
	}
};
asset
module.exports = {
	module: {
		output: {
			// ...
			// 指定 assetModule 文件的输出目录,同时重命名输出的文件名称
        	// assetModuleFilename: 'images/[hash:8][ext][query]'
		},
		rules: [
			{
				test: /\.(png|jpeg|gif|PNG)$/,
				type: 'asset',
				parser: {
					// 自定义转 base64 的界限
					dataUrlCondition: {
						// 小于 10kb 的图片转 base64
						maxSize: 10 * 1024 // 10kb
					}
				},
				generator: {
					// 跟 assetModuleFilename 之中选一个即可
					// 输出图片的名称
					filename: 'images/[hash:8][ext][query]'
				}
			}
		]
	}
};
打包字体图标资源
module.exports = {
	module: {
		output: {
			// ...
			// 指定图片文件的输出目录,同时重命名输出的文件名称
        	// assetModuleFilename: 'fonts/[hash:8][ext][query]'
		},
		rules: [
			{
				test: /\.(ttf|otf|woff2?)$/,
				type: 'asset',
				generator: {
					// 跟 assetModuleFilename 之中选一个即可
					// 输出文件的名称
					filename: 'fonts/[hash:8][ext][query]'
				}
			}
		]
	}
};
打包其他资源
module.exports = {
	module: {
		output: {
			// ...
			// 指定图片文件的输出目录,同时重命名输出的文件名称
        	// assetModuleFilename: 'media/[hash:8][ext][query]'
		},
		rules: [
			{
				test: /\.(mp3|mp4|avi|excel)$/,
				type: 'asset',
				generator: {
					// 跟 assetModuleFilename 之中选一个即可
					// 输出文件的名称
					filename: 'media/[hash:8][ext][query]'
				}
			}
		]
	}
};

js 兼容性处理

因为不是所有浏览器都能识别 es6 语法,所以需要通过 babel 进行转换,将 es6 语法转换成所有浏览器都可以识别的 es5 语法。

使用最新版本 babel

最新版本 babel 已支持转换 generator 函数,以及最新的 es6 语法。

安装 babel-loader、@babel/core、@babel/preset-env

yarn add babel-loader @babel/core @babel/preset-env -D
module.exports = {
	module: {
		rules: [
			{
				test: /\.js$/,
				loader: 'babel-loader',
				exclude: /mode_modules/
			}
		]
	}
};
// 新建 .babelrc 文件
{
    "presets": ["@babel/preset-env"],
    "plugins": []
}
转换 jsx 语法
  • 使用 @babel/preset-react
  • 或者使用 @babel/preset-env 、 @babel/react

方法一:安装 @babel/preset-env 、 @babel/react

{
	presets: [
        '@babel/preset-env',
        '@babel/react'
    ],
    plugins: []
}

方法二:安装 @babel/preset-react

{
	presets: ['@babel/preset-react'],
    plugins: []
}
使用低版本 babel
转换基本语法

安装 babel-loader、@babel/core、@babel/preset-env

module.exports = {
	module: {
		rules: [
			{
				test: /\.js$/,
				loader: 'babel-loader',
				exclude: /mode_modules/,
				// 第一种配置,在这里通过 options 配置预设
				options: {
					// 预设:指示babel做什么样的兼容性处理
					presets: '@babel/preset-env'
				}
			}
		]
	}
};
// 第二种配置:新建 .babelrc 文件
{
    "presets": ["@babel/preset-env"],
    "plugins": []
}
  • @babel/preset-env 不能转换所有的 es6 语法(比如 async awaitgenerator 函数),只能转换基本语法;
  • 最新版本的已支持,如要测试请使用低版本 babel
@babel/pollyfill
  • @babel/pollyfill 相当于 babel 的补丁,使用 @babel/pollyfill 可以转换所有语法。

  • @babel/pollyfillcore-jsregenerator 的集合(推荐单独安装 core-jsregenerator ,因为@babel/pollyfill 会污染全局变量)

  • @babel/pollyfillbabel 7.4.0 以后已被弃用,如果想测试,需要安装低版本 babel 测试。

  • 引入 @babel/pollyfill 可以做 js 全部兼容性处理

  • 会将所有的兼容性代码全部引入,体积太大,而且会污染全局变量

// 在需要处理的文件中通过 import 引入
import '@babel/pollyfill';
按需加载
  • 使用 core-js 可以解决 @babel/pollyfill 全部引入,导致体积太大的问题。
  • core-js@babel/pollyfill 不能同时使用,只安装一个即可, @babel/pollyfill 内置有 core-js

安装 core-js

// .babelrc
{
    "presets": [
        [
            "@babel/preset-env",
            {
                // 按需加载
                "useBuiltIns": "usage",
                // 指定 core-js 版本
                "corejs": 3
            }
        ]
    ],
    "plugins": []
}
babel-runtime
  • babel-runtime 可以解决 @babel/pollyfill 污染全局变量的问题。

安装 @babel/plugin-transform-runtime@babel/runtime

yarn add @babel/plugin-transform-runtime -D
yarn add @babel/runtime --save
// .babelrc
{
    "presets": [
        [
            "@babel/preset-env",
            {
                // 按需加载
                "useBuiltIns": "usage",
                // 指定 core-js 版本
                "corejs": 3
            }
        ]
    ],
    "plugins": [
		[
			"@babel/plugin-transform-runtime",
			{
				"absoluteRuntime": false,
				"corejs": 3,
				"helpers": true,
				"regenerator": true,
				"useESModules": false
			}
		]
	]
}

eslint 语法检查

安装 eslint、eslint-webpack-plugin

yarn add eslint eslint-webpack-plugin -D
const EslintPlugin = require("eslint-webpack-plugin");

module.exports = {
	plugins: [
		new EslintPlugin({
            context: path.resolve(__dirname, 'src'), // 需要检测的根目录
            exclude: 'node_modules', // 需要排除的目录
            extensions: ['js'], // 需要检查的文件类型
            fix: true // 自动修复
        })
	]
};

eslint 规则配置 参考 https://eslint.cn/docs/rules/

// .eslintrc.js
module.exports = {
    root: true,
    env: {
        browser: true,
        node: true
    },
    extends: ['eslint:recommended'],
    rules: {
        'no-console': ['warn', { allow: ['warn', 'error'] }],
        'block-spacing': [2, 'always'],
        'brace-style': [2, '1tbs', { allowSingleLine: true }],
        'jsx-quotes': [2, 'prefer-single'],
        quotes: [
            2,
            'single',
            {
                avoidEscape: true,
                allowTemplateLiterals: true
            }
        ],
        'semi-spacing': [
            2,
            {
                before: false,
                after: true
            }
        ],
        'space-in-parens': [2, 'never'],
        'space-infix-ops': 'error',
        'space-unary-ops': 'error',
        indent: 0,
        semi: 'error',
        'comma-spacing': 0,
        'space-before-blocks': 0,
        'keyword-spacing': 0,
        'key-spacing': ['error', { afterColon: true }],
        'no-multiple-empty-lines': 0,
        'spaced-comment': [
            'error',
            'always',
            {
                line: {
                    markers: ['/'],
                    exceptions: ['-', '+']
                },
                block: {
                    markers: ['!'],
                    exceptions: ['*'],
                    balanced: true
                }
            }
        ],
        'space-before-function-paren': 0,
        'arrow-spacing': 'error',
        'object-curly-spacing': 0,
        'one-var-declaration-per-line': ['error', 'always'],
        'array-bracket-newline': ['error', 'consistent'],
        'no-lonely-if': 'error',
        'object-curly-newline': [
            'error',
            {
                ObjectPattern: { multiline: true },
                ImportDeclaration: { multiline: true },
                ExportDeclaration: { multiline: true }
            }
        ],
        'object-property-newline': ['error', { allowAllPropertiesOnSameLine: false }],
        'padding-line-between-statements': [
            'error',
            {
                blankLine: 'always',
                prev: ['const', 'let', 'var'],
                next: '*'
            },
            {
                blankLine: 'any',
                prev: ['const', 'let', 'var'],
                next: ['const', 'let', 'var']
            }
        ],
        'semi-style': ['error', 'last'],
        'switch-colon-spacing': 'error',
        'wrap-regex': 'error',
        'default-case': 'error',
        'guard-for-in': 'error',
        'no-else-return': 'error',
        'no-empty-function': 'error',
        'no-new-func': 'error',
        'no-useless-return': 'error',
        'symbol-description': 'error',
        'array-element-newline': ['error', 'consistent', { multiline: true }],
        'no-var': 'error',
        'one-var': ['error', 'consecutive'],
        'no-case-declarations': 0
    }
};
// .eslintignore
// 需要忽略 eslint 检查的文件

/.idea/*
/node_modules/*
/.eslintrc.js
static/fonts/*
/yarn.lock
/yarn-error.log
/.gitignore

airbnb 规则

使用 airbnb 规则:如果不想自己一个个配置 eslint rules, 推荐使用 airbnb 规则,需要用 eslint-config-airbnb-base 库。

yarn add eslint eslint-config-airbnb-base eslint-plugin-import -D
// 还需要在 package.json 中配置
{
	"eslintConfig": {
		"extends": "airbnb-base"
	}
}
@babel/eslint-parser

使用 @babel/eslint-parser 可以帮助你在使用 Babel 转换代码时,避免 ESLint 中的语法错误。同时,它也可以在您的代码中使用一些 Babel 特有的语法(如 jsxdecorators)时,帮助 ESLint 正确解析和检查代码。

安装 eslint@babel/core@babe:/eslint-parser

yarn add eslint @babel/eslint-parser -D
yarn add @babel/core --save
module.exports = {
    root: true,
    env: {
        browser: true,
        node: true
    },
    extends: ['eslint:recommended'],
    parserOptions: {
        parser: '@babel/eslint-parser',
        sourceType: 'module',
        ecmaVersion: 6,
        ecmaFeatures: {
            jsx: true,
            experimentalObjectRestSpread: true
        }
    },
    rules: {
    	// ...
    },
};

常用插件

生成 html 文件

安装 html-webpack-plugin

yarn add html-webpack-plugin
  • html-webpack-plugin 默认会创建一个没有任何结构样式的 html 文件,会自动引入打包输出的所有资源。
    但是我们需要有结构的 html 文件,所以需要再配置 options
// 引入插件
const HtmlWebpackPlugin = require('html-webpack-plugin');

// 不传参数,默认生成一个 index.html 文件,并且将打包后输出的所有资源插入 index.html 中
module.exports = {
	plugins: [
		new HtmlWebpackPlugin()
	]
};
// 传参数
const path = require('path');

module.exports = {
	plugins: [
		new HtmlWebpackPlugin({
			 // 指定要生成的 html 模板文件,生成的 index.html 内容跟 /src/index.html 相同,并且会自动引入打包后输出的所有资源
			template: path.resovle(__dirname, 'src/index.html'),
			filename: 'other.html' // 指定生成的 html 文件名
		})
	]
};

提取 css 为单独文件

安装 mini-css-extract-plugin

yarn add mini-css-extract-plugin
  • 使用 mini-css-extract-plugin 可以将打包后的 css 文件以 link 的方式插入 html
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
	module: {
		rules: [
			{
				test: /\.css$/,
				use: [
					// 将 style-loader 换成 MiniCssExtractPlugin 内置的loader
					// 从而将提取出的 css 文件以 link 的方式插入 html 中
					MiniCssExtractPlugin.loader,
					'css-loader',
					'postcss-loader'
				]
			}
		]
	},
	plugins: [
		// 默认输出到 output 指定目录下,和 js 平级,main.css
		new MiniCssExtractPlugin({
			// 可以通过参数指定打包后的路径和文件名,输出为 output 指定目录下的 /css/style.css
			filename: 'css/style.css'
		})
	]
};

在这里插入图片描述

压缩 js

  • mode: 'production' 自动压缩 js
  • mode: 'development' 设置 minimize: true 可压缩
module.exports = {
	mode: 'production',
};
module.exports = {
	mode: 'development',
	optimization: {
		minimize: true
    }
};
  • 如果使用了 css-minimizer-webpack-plugin 压缩 css,那么 js 压缩会失效,需要手动安装 terser-webpack-plugin 插件
yarn add terser-webpack-plugin
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerWebpackPlugin = require("css-minimizer-webpack-plugin");
const TerserWebpackPlugin = require("terser-webpack-plugin");

module.exports = {
	mode: 'development',
	module: {
		rules: [
			{
				test: /\.css$/,
				use: [
					MiniCssExtractPlugin.loader,
					'css-loader',
					'postcss-loader'
				]
			}
		]
	},
	optimization: {
		minimize: true,
        minimizer: [
        	// 压缩 js:解决压缩 css 导致压缩 js 失效的问题
            new TerserWebpackPlugin(),
            // 压缩 css
            new CssMinimizerWebpackPlugin(),
        ],
    },
	plugins: [
		new MiniCssExtractPlugin({
			filename: 'css/style.css'
		})
	]
};

压缩 css

安装 css-minimizer-webpack-plugin

yarn add css-minimizer-webpack-plugin
  • css-minimizer-webpack-plugin 必须要配合 mini-css-extract-plugin 使用,只能对单独的 css 文件进行压缩;
  • 只在 mode: 'production‘ 有效;
  • 如果希望在 mode: 'developmemt‘ 有效,需要设置 minimize: true
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerWebpackPlugin = require("css-minimizer-webpack-plugin");

module.exports = {
	mode: 'production',
	module: {
		rules: [
			{
				test: /\.css$/,
				use: [
					MiniCssExtractPlugin.loader,
					'css-loader',
					'postcss-loader'
				]
			}
		]
	},
	optimization: {
        minimizer: [
            // 压缩 css
            new CssMinimizerWebpackPlugin(),
        ],
    },
	plugins: [
		new MiniCssExtractPlugin({
			filename: 'css/style.css'
		})
	]
};
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerWebpackPlugin = require("css-minimizer-webpack-plugin");

module.exports = {
	mode: 'development',
	module: {
		rules: [
			{
				test: /\.css$/,
				use: [
					MiniCssExtractPlugin.loader,
					'css-loader',
					'postcss-loader'
				]
			}
		]
	},
	optimization: {
		minimize: true,
        minimizer: [
            // 压缩 css
            new CssMinimizerWebpackPlugin(),
        ],
    },
	plugins: [
		new MiniCssExtractPlugin({
			filename: 'css/style.css'
		})
	]
};

压缩 html 文件

html-webpack-plugin
module.exports = {
	plugins: [
		new HtmlWebpackPlugin({
			 // 配置 minify 属性进行压缩
			minify: {
				collapseWhitespace: true, // 移除空行
				removeComments: true // 移除注释
			}
		})
	]
};
html-minimizer-webpack-plugin
const HtmlMinimizerWebpackPlugin = require("html-minimizer-webpack-plugin");

module.exports = {
	mode: 'production',
	plugins: [
		// 压缩 html
        new HtmlMinimizerWebpackPlugin()
	]
};
const HtmlMinimizerWebpackPlugin = require("html-minimizer-webpack-plugin");

module.exports = {
	mode: 'development',
	optimization: {
		minimize: true
    },
	plugins: [
		// 压缩 html
        new HtmlMinimizerWebpackPlugin()
	]
};

其他插件

copy-webpack-plugin
yarn add copy-webpack-plugin
  • 拷贝文件:而是用来复制源代码中已经存在的文件(比如一些静态资源),拷贝到指定的地方去;并不是用来复制打包生成的文件。
  • 比如有一些全局的配置,直接拷贝到目标文件夹下去,后续这些全局配置文件内容有改变,就不需要重新打包,可以直接替换部署的文件
const CopyPlugin = require("copy-webpack-plugin");

module.exports = {
  plugins: [
    new CopyPlugin({
      patterns: [
        { from: path.resolve(__dirname, "src", "static"), to: "public" }
      ]
    })
  ]
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/344303.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学Python第02课:第一个Python程序

在上一课中&#xff0c;我们对 Python 语言的过去现在有了一些了解&#xff0c;我们准备好了运行 Python 程序所需要的解释器环境。相信大家已经迫不及待的想开始自己的 Python 编程之旅了&#xff0c;但是新问题来了&#xff0c;我们应该在什么地方书写 Python 程序&#xff0…

caj在线转换成word怎么转?几种在线转换方法详解

caj在线转换成word怎么转&#xff1f;在日常的学习和工作中&#xff0c;我们常常会遇到各种各样的文件格式。其中&#xff0c;CAJ格式的文件因其专业性强&#xff0c;常常让许多用户感到困扰。如果你手头恰好有这种格式的文件&#xff0c;却苦于无法编辑&#xff0c;那么接下来…

Centos7 两种方式安装 MySQL5.7 步骤 yum 、本地 tar 文件

一、使用 yum 源方式安装 1、卸载系统自带 mariadb MariaDB Server 是最流行的开源 关系型数据库 之一。它由 MySQL 的原始开发者制作&#xff0c;并保证保持开源。 在 CentOS 7 中默认安装有 MariaDB 可忽略&#xff0c;安装完成之后可以直接覆盖掉 MariaDB。 查看并卸载系统…

github无法访问此网站,github.com 的响应时间过长。

问题 点击之前书签页中保存的去github搜集的项目连接&#xff0c;出现github无法访问此网站&#xff0c;github.com 的响应时间过长。 解决办法 1、打开浏览器&#xff0c;点击百度&#xff1b; 2、搜索hub.nuaa.cf&#xff1b; 3、点击第一项&#xff0c;如下所示&#xf…

@RequestPart注解的REST API

RequestPart注解的REST API的做法 问题解决方案body设置header设置区别 问题 为了验证接口, 想使用apipost批量插入多条数据到服务器中, 但是一直没搜索到使用方法. 接口如下: ApiOperation("上传文件")PostMapping("/upload-file")public TeamResponseM…

【数据结构】 顺序栈的基本操作 (C语言版)

目录 一、顺序栈 1、顺序栈的定义&#xff1a; 2、顺序栈的优缺点 二、顺序栈的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、顺序栈的初始化 4、顺序栈的入栈 5、顺序栈的出栈 6、取栈顶元素 7、栈的遍历输出 8、顺序栈的判空 9、顺…

模版——函数模版(方法),类模版(容器)

函数模版 之前我们要实现两个变量值的交换要写交换函数&#xff0c; 但是因为交换函数需要把要交换的变量的参数写出来&#xff0c;所以在不同的两个类型的变量值交换的时候我们就要写重载函数&#xff0c;会显得很麻烦&#xff0c;那么我们是不是可以弄个一交换函数的模版&a…

Nacos持久化配置文件到Mysql(全图文).

1. 确保Mysql版本是在8以下&#xff0c;如果是8或者以上请这一步请参考&#xff1a; 最直接有效的解决nacos配置mysql8.0以上版本后无法启动的问题_nacos 8848端口 和mysql冲突-CSDN博客https://blog.csdn.net/qq_42758288/article/details/108967808 2.初始化数据库在Mysql&a…

Linux下安装 Redis7

Linux下安装 Redis7 三、Linux下安装 Redis7【redis-7.2.4.tar.gz】3.1.下载redis的安装包3.1.1.手动下载Redis压缩包并上传【redis-7.2.4.tar.gz】3.1.2.wget工具下载redis-7.2.4.tar.gz 3.2.将安装包进行解压缩3.3.进入redis的安装包3.4.检查是否有gcc 环境3.5.编译和安装并指…

自然语言处理--概率最大中文分词

自然语言处理附加作业--概率最大中文分词 一、理论描述 中文分词是指将中文句子或文本按照语义和语法规则进行切分成词语的过程。在中文语言中&#xff0c;词语之间没有明显的空格或标点符号来分隔&#xff0c;因此需要通过分词工具或算法来实现对中文文本的分词处理。分词的…

大型语言模型基础知识的可视化指南

直观分解复杂人工智能概念的工具和文章汇总 如今&#xff0c;LLM&#xff08;大型语言模型的缩写&#xff09;在全世界都很流行。没有一天不在宣布新的语言模型&#xff0c;这加剧了人们对错过人工智能领域的恐惧。然而&#xff0c;许多人仍在为 LLM 的基本概念而苦苦挣扎&…

操作系统导论-课后作业-ch14

1. 代码如下&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {int *i NULL;free(i);return 0; }执行结果如下&#xff1a; 可见&#xff0c;没有任何报错&#xff0c;执行完成。 2. 执行结果如下&#xff1a; 3. valgrind安装使用参考&a…

数据结构(Chapter Two -03)—线性表的链式表示

在这一部分&#xff08;数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客&#xff09;里面&#xff0c;我们知道线性表包括顺序表和链表结构。前面写了顺序表的基本操作&#xff0c;那这部分就写一写线性表叭&#xff01; 链表特点&#xff1a;不需要使用地址连续的存储单…

【Flink-1.17-教程】-【四】Flink DataStream API(7)输出算子(Sink)

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;7&#xff09;输出算子&#xff08;Sink&#xff09; 1&#xff09;连接到外部系统2&#xff09;输出到文件3&#xff09;输出到 Kafka4&#xff09;输出到 MySQL&#xff08;JDBC&#xff09;5&#xff09;自定义 …

2024年第十二届亚洲机械与材料工程国际会议(ACMME 2024)即将召开!

时间&#xff1a;2024年6月14-17日 地点&#xff1a;日本京都先端科学大学太秦校区 会议官网&#xff1a;第11届ACMME |日本京都 2024年第十二届亚洲机械与材料工程会议 &#xff08;ACMME 2024&#xff09;将于2024年6月14日-17日在日本京都先端科学大学召开。亚洲机械与材料…

STL第二讲

第二讲 视频标准库源码版本&#xff1a;gnu c 2.9.1/4.9/Visual C OOP vs GP GP是将datas与methods分开&#xff0c;OOP相反&#xff1b; 为什么list不能使用全局的sort&#xff1f; 因为sort源代码&#xff1a; *(first (last - first)/2) // 此迭代器只能是随机访问迭代…

Jedis(一)与Redis的关系

一、Jedis介绍&#xff1a; 1、背景&#xff1a; Jedis是基于Java语言的Redis的客户端&#xff0c;Jedis Java Redis。Redis不仅可以使用命令来操作&#xff0c;现在基本上主流的语言都有API支持&#xff0c;比如Java、C#、C、PHP、Node.js、Go等。在官方网站里有一些Java的…

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…

如何自己制作一个属于自己的小程序?

在这个数字化时代&#xff0c;小程序已经成为了我们生活中不可或缺的一部分。它们方便快捷&#xff0c;无需下载安装&#xff0c;扫一扫就能使用。如果你想拥有一个属于自己的小程序&#xff0c;不论是为了个人兴趣&#xff0c;还是商业用途&#xff0c;都可以通过编程或者使用…

VisualODX——ODX数据自动转换工具 加快开发进度

在创建ODX数据库的过程中&#xff0c;我们需要录入大量的数据以及应对多种数据格式。这不仅费时费力&#xff0c;而且还需很高的人力成本&#xff0c;且其错误率也非常高&#xff0c;从而导致开发速度缓慢、效率低下。基于多年的汽车行业诊断经验&#xff0c;我们开发了VisualO…