webpack复习

webpack

webpack复习

webpack基本配置

拆分配置 - 公共配置 + 生产环境配置 + 开发环境配置 使用merge
webpack-dev-server 启动本地服务
在公共中引入babel-loader处理es6

webpack高级配置

多入口文件

enty 入口为一个对象 里面的key为入口名 value为入口文件路径 例如 path.join(srcPath, ‘index.js’)
output 输出打包文件 也是一个对象 filename使用 [name].[contentHash:8].js 动态命名 path为打包到哪个路径
使用hash做文件名 是因为当文件内容没有改变的时候 hash是不变的 文件名不变 引入的时候就会走缓存 页面加载快

entry: {
	index: path.join(srcPath, 'index.js'),
	other: path.join(srcPath, 'other.js')
},
output: {
	filename: '[name].[contentHash:8].js',
	path:distPath
}

plugins 中的new HtmlWebpackPlugin生成html文件 此时也要写多个
template表示打包的文件
filename表示打包后的名称
chunks表示使用哪个入口文件来打包 如果不设置 则所有入口文件都会被引入

plugins: [
	new HtmlWebpackPlugin({
		template: path.join(srcPath, 'index.html'),
		filename: 'index.html',
		chunks: ['index']
	})new HtmlWebpackPlugin({
		template: path.join(srcPath, 'other.html'),
		filename: 'other.html',
		chunks: ['other']
	})
]

抽离css

使用MiniCssExtractPlugin 替换 style-loader 将css抽离为一个单独的css文件
设置 new MiniCssExtractPlugin 抽离css
optimization 用于优化打包结果的对象

module: {
	rules:{
		{
			test: /\.less$/,
			loader: [
				MiniCssExtractPlugin.loader,
				'css-loader',
				'less-loader',
				'postcss-loader'
			]
		}
	}
},
plugins: [
	new MiniCssExtractPlugin({
		filename: 'css/main.[countenHash:8].css'
	})
],
optimization: {
	// 压缩css
	minimizer: [
    new TerserJSPlugin(),
    new OptimizeCSSAssetsPlugin()
  ]
}

抽离公共代码

抽离打包时公共的包例如lodash

optimazation:{
	// 分割代码块
	splitChunks:{
		chunks: 'all',
		/*
			initial 入口chunk 对于异步导入的文件不处理
			async 异步chunk 只对异步导入的文件处理
			all 全部thunk
		*/
		// 缓存分组
		cacheGroups: {
			// 第三方模块
			vendor: {
				name: 'vendor', //chunk 名称
				priority: 1, //权限更高 优先抽离 重要!!!
				test: /node_modules/, // 命中条件
				minSize: 0, //大小限制 太小就不用单独打包了
				minChunks: 1, //最少重复用过几次 公共模块复用过一次就要单独打包 因为公共组件一般都很大 
			}// 公共的模块
			common: {
				name: 'common', //chunk名称
				priority: 0, //优先级
				minSize: 0, //公共模块大小限制
				minChunks: 2 // 公共模块最少复用几次
			}
		}
	}
}

懒加载

import 语法

处理jsx和处理vue

对于jsx配置babel
.babelrc

{
	"presets": ["@babel/preset-env"]
}

对于vue
使用vue-loader

webpack性能优化

优化构建速度

优化babel-loader

开启缓存 只要是es6代码没有改的 就不会在重新编译 就会缓存 在第二次进行编译的时候 针对没有改的部分 启用缓存就不会重新编译
include 和 exclude 确定范围

{
	test: /\.js$/,
	use: ['babel-loader?cacheDirectory'], //开启缓存
	include: path.resolve(__dirname, 'src'), //明确范围
	// 排除范围 include 和 exclude 两着选一个即可
	exclude: path.resolve(__dirname, 'node_modules')
}

IgnorePlugin 避免引入无用模块

import moment from ‘moment’
默认会引入所有语言JS代码 代码过大

plugins: [
	// 忽略moment下的/locale目录
	new webpack.IgnorePlugin(/\.\/locale/, /moment/)
]
import moment from 'moment'
import 'moment/locale/zh-cn' // 手动引入中文包 

noParse 避免重复打包

module.exports = {
	module: {
		// 忽略对 `react.min.js` 文件的递归解析处理
		noParse: [/react\.min\.js$/],
	}
}

IgnorePlugin 直接不引入 代码中没有 而且优化产出体积
noParse引入 但不打包

happyPack多进程打包

JS单线程 开启多进程打包
提高构建速度(特别是多核CPU)

module: {
	rules: [
		//js
		{
			test: /\.js$/,
			// 把对.js文件的处理转交给id为babel的HappyPack实例
			use: ['happypack/loader?id=babel'],
			include: srcPath,
		}
	]
},
plugins:[
	// happyPack 开启多进程打包
	new HappyPack({
		// 用唯一的标识符 id 来代表当前的HappyPack 是哦用来处理一类特定的文件
		id: 'babel',
		// 如何处理.js文件 用法和loader配置中一样
		loaders: ['babel-loader?cacheDirectory']
	})
]

ParallelUglifyPlugin 多进程压缩JS

webpack内置 Uglify工具压缩JS
JS是单线程的 开启多进程压缩更快
和happyPack同理

plugins:[
	// 使用ParallelUglifyPlugin 进行压缩输出的JS代码
	new ParallelUglifyPlugin ({
		//传递给UglifyJS的参数
		// (还是使用UglifyJS压缩 只不过帮助开启了多进程)
		uglifyJS: {
			output: {
				beautify: false, //最紧凑的输出
				comments: false, //删除所有注释
			},
			compress: {
				// 删除所有的 `console` 语句 可以兼容ie浏览器
				drop_console: true,
				// 内嵌定义了但是只用到一次的变量
				collapse_vars: true,
				// 提取出出现多次但是没有定义成变量去引用的静态变量
				reduce_vars: true,
			}
		}
	})
]
关于开启多进程

当项目较大时 打包较慢 开启多进程能提高速度
当项目较小时 打包很快 开启多进程会降低速度(进程开销)
按需使用

自动刷新

module.export = {
	watch: true, // 开启监听 默认为false
	// 注意 开启监听后 webpack-dev-server 会自动公开其刷新浏览器

	// 监听配置
	watchOptions: {
		ignored: /node_modules/, // 忽略哪些
		// 监听到变化后会等300ms再去执行动作 防止文件更新太快导致重新编译频率太高
		aggregateTimeout: 300, // 默认为300ms
		// 判断文件是否发生变化是通过不停的去询问系统指定文件有没有变化实现的
		poll: 1000 // 默认每隔1000毫秒询问一次
	}
}

热更新

自动刷新:整个页面全部刷新 速度较慢
自动刷新:整个页面全部刷新 状态会丢失
热更新:新代码生效 网页不刷新 状态不丢失

	entry:{
		index: [
			'webpack-dev-server/client?http://localhost:8080/',
			'webpack/hot/dev-server',
			path.join(srcPath, 'index.js')
		],
		other: path.join(srcPath, 'other.js')
	},
	plugins: [
		new HotModuleReplacementPlugin()
	],
	devServer: {
		port: 8080,
		progress: true, //显示打包的进度条
		contentBase: distPath, //根目录
		open: true, //自动打开浏览器
		compress: true, //自动gzip压缩
		
		hot: true, //准备好开启热更新
		
		// 设置代理
		proxy: {
			// 将本地 /api/xxx 代理到 localhost:3000/api/xxx
			'/api': 'http://localhost:3000'
		}
	}

DllPlugin 动态链接库插件

前端框架如vue react 体积大 构建慢
较稳定 不常升级版本
每次npm run dev都要重新构建 vue react
同一个版本只构建一次即可 不用每次都重新构建

webpack已内置 DllPlugin支持
DllPlugin - 打包出dll文件
DllReferencePlugin - 使用dll文件

webpack.dll.js

const path = require('path')
const DllPlugin = require('webpack/lib/DllPlugin')
const {srcPath, distPath} = require('./paths')

module.exports = {
	mode: 'development',
	// JS执行入口文件
	enrty: {
		// 把React相关模块放到一个单独的动态连接库
		react: ['react', 'react-dom']
	},
	output: {
		// 输出的动态链接库的文件名称 [name]代表当前动态链接库的名称
		// 也就是 entry 中配置的react 和 polyfill
		filename: '[name].dll.js',
		// 输出的文件都放到dist目录下
		path: distPath,
		// 存放动态链接库的全局变量名称 例如对应react来说就是_dll_react
		// 之所以在前面加上_dell_是为了防止全局变量冲突
		library: '_dll_[name]'
	},
	plugins: [
		// 接入 DllPlugin
		new DllPlugin({
			// 动态链接库的全局变量名称 需要和output.library中的一致
			// 该字段的值也就是输出的manifest.json文件中的name字段的值
			// 例如 react.manifest.json中就有"name": "_dll_react"
			name: '_dll_[name]',
			// 描述动态链接库的manifest.json文件输出时的文件名称
			path: path.join(distPath, '[name].manifest.json')
		})
	]
}

webpack --config build/webpack.dll.js 打包
最后只要在index.html中引用react.dll.js就可以

<script src="./react.dll.js"></script>

在webpack.dev.js中引入

const path =- require('path')
const webpack = require('webpack')
const {smart} = require('webpack-merge')
const webpackCommonConf = require('./webpack.common.js')
const {srcPath, distPath} = require('./paths')
// 引入DllReferencePlugin
const DllReferencePlugin = require('webpack/lib/DllReferencePlugin')
module.exports = smart(webpackCommonConf, {
	mode: 'development',
	module: {
		reles: [
			{
				test: /\.js$/,
				loader: ['babel-loader'],
				include: srcPath,
				exclude: /node_modules/ //不要再转换node_modules
			}
		]
	},
	plugins: [
		// 告诉webpack使用了哪些动态链接库
		new DllReferencePlugin({
			// 描述 react动态链接库的文件内容
			manifest: require(path.join(distPath, 'react.manifest.js'))
		})
	]
})

webapck性能优化 - 产出代码

小图片base64编码

{
	test: /\.(png|jpg|jpeg|gif)$/,
	use: {
		loader: 'url-loader',
		options: {
			// 小于5kb 的图片用Base64格式产出
			// 否则依然延用file-loader的形式产出url格式
			limit: 5 * 1024,
			// 打包到img目录下
			outputPath: '/img/',
		}
	}
}

bundle + hash

filename: '[name].[contentHash:8].js'

懒加载

提取公共代码

IngorePlugin

使用CDN加速

1、

output: {
	publicPath: 'cdn地址' //修改搜友静态文件url的前缀
}

2、把打包的结果上传到cnd地址上

使用production

将mode设置为production后会自动压缩代码
vue react 等会自动删除调试代码 (如开发环境下的错误提示)
启动Tree-Shaking 【只有ES6 Module 才能让tree-shaking生效 commonjs不行】

module.exports = {
	mode: 'production'
}

ES6 Module 和 Commonjs的区别

ES6 Module静态引入 编译时引用
Commonjs动态引入 执行时引入
只有ES6 Module才能静态分析 实现Tree-Shaking

let apiList = require('./config/api.js')
if(isDev){
	// 可以动态引入 执行时引入
	apiList = require('./config/api_dev.js')
}
import apiList from './config/api.js'
if(isDev){
	// 编译时报错 只能静态引入
	import apiList from './config/api_dev.js'
}

使用Scope Hosting

一个文件打包成一个函数
当文件多时 函数也会多 占内存大
想要多个文件合并成一个函数 使用Scope Hosting

代码体积更小
创建函数作用域更小
可读性更好

const ModuleConcatenationPlugin = require('webpack/lib/optimize/ModuleConcatenationPlugin')

module.exports = {
	resolve: {
		// 针对 Npm中的第三方模块优先采用jsnext:main 中指向的ES6模块化语法的文件
		mainFields: ['jsnext:main', 'browser', 'main']
	},
	plugins: [
		// 开启 Scope Hoisting
		new ModuleConcatenationPlugin()
	]
}

babel环境搭建

presets 一些常用plugins的集合 组合的预设 不用写很多plugin
.babelrc

{
	"presets": [
		[
			"@babel/preset-env" 
		]
	]
}

babel-polyfill

什么是polyfill ? - 补丁
core-js和regenerator
core-js标准库 所有补丁代码
regenerator 支持 generator语法补全core-js
babel-polyfill就是core-js和regenerator的集合
babel7.4弃用了babel-polyfill 推荐直接使用core-js和regenerator

{
	"presets": [
		[
			"@babel/preset-env",
			{
				"useBuiltIns": "usage",
				"corejs": 3
			}
		]
	]
}

问题:
污染全局环境
解决:
babel-runtime

babel-runtime

{
	"plugins":[
		"@babel/plugin-transform-runtime",
		{
			"absoluteRuntime": false,
			"corejs": 3,
			"helpers": true,
			"regenerator": true,
			"useESModules": false
		}
	]
}

前端为何要进行打包和构建

体积更小(Tree-Shaking、压缩、合并) 加载更快
编译高级语言或语法(TS、ES6+、模块化、SCSS)
兼容性和错误提示(Polyfill、postcss、eslint)
统一、高效的开发环境
统一的构建流程和产出标准

loader和plugin的区别

loader模块转换器 如less -> css
plugin 扩展插件 转换完做一些扩展 如HtmlWebpackPlugin 将js或css塞进一个html文件里

bable和webpack的区别

babel-JS新语法编译工具 不关心模块化
webpack- 打包构建工具 是多个loader plugin的集合

如何产出一个lib

在这里插入图片描述

babel-polyfill和babel-runtime的区别

babel-polyfill会污染全局
babel-runtime不会污染全局
产出第三方lib要用babel-runtime

为何Proxy不能被Polyfill

如Class可以用function模拟
如Promise可以用callback来模拟
但Proxy的功能用Object.defineProperty无法模拟

有哪些常见的loader

file-loader:把⽂件输出到⼀个⽂件夹中,在代码中通过相对 URL去引⽤输出的⽂件
url-loader:和 file-loader 类似,但是能在⽂件很⼩的情况下以base64 的⽅式把⽂件内容注⼊到代码中去
image-loader:加载并且压缩图⽚⽂件
babel-loader:把 ES6 转换成 ES5
css-loader:加载 CSS,⽀持模块化、压缩、⽂件导⼊等特性
style-loader:把 CSS 代码注⼊到 JavaScript 中,通过 DOM 操作去加载 CSS。
eslint-loader:通过 ESLint 检查 JavaScript 代码
注意:在 Webpack 中,loader 的执行顺序是从右向左执行的。因为webpack 选择了 compose 这样的函数式编程方式,这种方式的表达式执行是从右向左的。

有哪些常⻅的 Plugin?

define-plugin:定义环境变量
html-webpack-plugin:简化 html⽂件创建
uglifyjs-webpack-plugin:通过 UglifyES 压缩 ES6 代码
webpack-parallel-uglify-plugin: 多核压缩,提⾼压缩速度
webpack-bundle-analyzer: 可视化 webpack 输出⽂件的体积
mini-css-extract-plugin: CSS 提取到单独的⽂件中,⽀持按需加载

module chunk bundle的区别

module - 各个源码文件 webpack中一切皆模块
chunk - 代码块,多模块合并成的 ⽤于代码的合并和分割 如entry import() splitChunk
bundle - 最终的输出文件

Loader 和 Plugin 的不同?

Loader 直译为"加载器"。Webpack 将⼀切⽂件视为模块,但是 webpack原⽣是只能解析 js⽂件,如果想将其他⽂件也打包的话,就会⽤到loader 。 所以 Loader 的作⽤是让 webpack 拥有了加载和解析⾮JavaScript⽂件的能⼒。
Plugin 直译为"插件"。Plugin 可以扩展 webpack 的功能,让 webpack具有更多的灵活性。在 Webpack 运⾏的⽣命周期中会⼴播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的API 改变输出结果。
Loader 在 module.rules 中配置,也就是说他作为模块的解析规则⽽存在。 类型为数组,每⼀项都是⼀个 Object ,⾥⾯描述了对于什么类型的⽂件( test ),使⽤什么加载( loader )和使⽤的参数( options )
Plugin在 plugins 中单独配置。类型为数组,每⼀项是⼀个 plugin的实例,参数都通过构造函数传⼊。

Babel 的原理是什么?

babel 的转译过程也分为三个阶段,这三步具体是:
解析 Parse: 将代码解析⽣成抽象语法树(AST),即词法分析与语法分析的过程;
转换 Transform: 对于 AST 进⾏变换⼀系列的操作,babel 接受得到 AST 并通过 babel-traverse 对其进⾏遍历,在此过程中进⾏添加、更新及移除等操作;
⽣成 Generate: 将变换后的 AST 再转换为 JS 代码, 使⽤到的模块是 babel-generator。

git pull 和 git fetch 的区别

git fetch 只是将远程仓库的变化下载下来,并没有和本地分支合并。
git pull 会将远程仓库的变化下载下来,并和当前分支合并。

git rebase 和 git merge 的区别

git merge 和 git rebase 都是用于分支合并,关键在 commit 记录的处理上不同:
git merge 会新建一个新的 commit 对象,然后两个分支以前的commit 记录都指向这个新 commit 记录。这种方法会保留之前每个
分支的 commit 历史。
git rebase 会先找到两个分支的第一个共同的 commit 祖先记录,然后将提取当前分支这之后的所有 commit 记录,然后将这个commit 记录添加到目标分支的最新提交后面。经过这个合并后,两个分支合并后的 commit 记录就变为了线性的记录了。

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

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

相关文章

mac安装nvm管理工具遇到的问题和解决方法

nvm 是一款可以管理多版本node的工具&#xff0c;因为是刚买没多久的电脑之前用的都是windows&#xff0c;昨天折腾了一下午终于倒腾好了 第一步&#xff1a; 卸载电脑已有的node&#xff1b;访问nvm脚本网址&#xff0c;另存为到电脑上任何目录&#xff0c;我是放在桌面上的…

【音视频、chatGpt】h5页面最小化后,再激活后视频停住问题的解决

目录 现象 观察 解决 现象 页面有时候要切换&#xff0c;要最小化&#xff1b;短时间或者几个小时内切换回来&#xff0c;视频可以正常续上&#xff1b;而放置较长时间&#xff0c;几个小时或者一晚上&#xff0c;切换回来后&#xff0c;视频可能卡死 观察 切换页面&#x…

leetcode118. 119.杨辉三角

118 题目&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 思路&#xff1a; 可以发现从第三行开始&#xff0c;从第二个元素到倒数第二个元素&#xff0c;每个元素都…

TypeScript 关于对【泛型】的定义使用解读

目录 概念导读泛型函数多个泛型参数泛型约束泛型别名泛型接口泛型类总结&#xff1a; 概念导读 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。使用泛型 可以复用类型…

C#小轮子:Visual Studio自动编译Sass文件

文章目录 前言插件安装插件使用compilerconfig.jsonsass输入和css输出&#xff08;自动生成&#xff09;默认配置&#xff08;我不懂就不去动他了&#xff09; 前言 我们知道css文件用起来太麻烦&#xff0c;如果样式一多&#xff0c;嵌套起来用css样式就眼花缭乱。Sass使用层…

ElasticSearch:项目实战(1)

es环境搭建参考&#xff1a;ElasticSearch&#xff1a;环境搭建步骤_Success___的博客-CSDN博客 需求&#xff1a; 用户输入关键可搜索文章列表 关键词高亮显示 文章列表展示与home展示一样&#xff0c;当用户点击某一篇文章&#xff0c;可查看文章详情 思路&#xff1a; …

CSS-grid布局

网格布局也叫grid布局&#xff0c;平常写样式的时候基本上都是用的flex布局。 像以下布局&#xff0c;用flex布局就可能会有有点麻烦&#xff0c;这时候用grid布局就方便的多了。 或者是照片墙 grid布局就是将容器划分为行和列&#xff0c;产生单元格&#xff0c;然后在指定的…

ArcGIS Pro技术应用(暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合)

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

机器学习笔记之优化算法(十一)凸函数铺垫:梯度与方向导数

机器学习笔记之优化算法——凸函数铺垫&#xff1a;梯度与方向导数 引言回顾&#xff1a;偏导数方向余弦方向导数方向导数的几何意义方向导数的定义 方向导数与偏导数之间的关联关系证明过程 梯度 ( Gradient ) (\text{Gradient}) (Gradient) 引言 本节作为介绍凸函数的铺垫&a…

【华秋推荐】新能源汽车中的T-BOX系统,你了解多少?

近几年&#xff0c;新能源汽车产业进入了加速发展的阶段。我国的新能源汽车产业&#xff0c;经过多年的持续努力&#xff0c;技术水平显著提升、产业体系日趋完善、企业竞争力大幅增强&#xff0c;呈现市场规模、发展质量“双提升”的良好局面。同时&#xff0c;通过国家多年来…

IDEA每次启动indexing解决办法

每次启动indexing很浪费时间。 解决办法 setting中搜索index 设置如下&#xff1a; 这样设置以后&#xff0c;启动速度明显快多了。 参考 https://blog.csdn.net/qq_45162113/article/details/121128721

Leetcode24 两两交换链表相邻的节点

迭代解法&#xff1a; class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHead new ListNode(0);dummyHead.next head;ListNode temp dummyHead;while (temp.next ! null && temp.next.next ! null) {ListNode node1 temp.next;ListNode n…

【单片机】51单片机,晨启科技,板子引脚对应关系

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led&#xff0c;用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

树莓派安装Ubuntu系统(无屏幕)

树莓派安装ubuntu系统 前言 软件需要: 1.方案一 win32diskimager-1.0.0-install.exe SDFormatterha Ubuntu镜像&#xff08;可以官网下载也可以清华源&#xff09; 方案二: 树莓派镜像烧录器 树莓派镜像烧录器直达下载 硬件需要: 64GB内存卡&#xff08;推荐Sanddisk Ultra&am…

Java并发编程第4讲——Java中的锁(知识扫盲)

目录 一、锁的相关概念 1.1 什么是锁 1.2 为什么需要锁 1.3 Java中锁的分类 二、synchronized关键字 2.1 三个特点 2.2 三种表现形式&#xff08;&#x1f64b;‍♂️&#xff09; 2.3 sychronized是怎么实现的&#xff08;&#x1f64b;‍♂️&#xff09; 2.4 JDK1.…

用MariaDB创建数据库,SQL练习,MarialDB安装和使用

前言&#xff1a;MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。在存储引擎方面&#xff0c;使用XtraDB来代替MySQ…

有血有肉的PPT

1、PPT是Powerpoint缩写 2、引申的含义是Powerpoint Power(力量/能量&#xff09; Point(观点/要点) 3、用PPT做的文档是讲演稿&#xff0c;讲演的内容要有力度&#xff0c;之所以要去演讲是为了能够影响受众 4、其次演讲稿上的内容要列出要点、表明观点&#xff0c;所以一般P…

Jmeter入门之digest函数 jmeter字符串连接与登录串加密应用

登录请求中加密串是由多个子串连接&#xff0c;再加密之后传输。 参数连接&#xff1a;${var1}${var2}${var3} 加密函数&#xff1a;__digest &#xff08;函数助手里如果没有该函数&#xff0c;请下载最新版本的jmeter5.0&#xff09; 函数助手&#xff1a;Options > …

2.CUDA 编程手册中文版---编程模型

2.编程模型 更多精彩内容&#xff0c;请扫描下方二维码或者访问https://developer.nvidia.com/zh-cn/developer-program 来加入NVIDIA开发者计划 本章通过概述CUDA编程模型是如何在c中公开的&#xff0c;来介绍CUDA的主要概念。 编程接口中给出了对 CUDA C 的广泛描述。 本章…

在Ubuntu中使用Docker启动MySQL8的天坑

写在前面 简介&#xff1a; lower_case_table_names 是mysql设置大小写是否敏感的一个参数。 1.参数说明&#xff1a; lower_case_table_names0 表名存储为给定的大小和比较是区分大小写的 lower_case_table_names 1 表名存储在磁盘是小写的&#xff0c;但是比较的时候是不区…