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

十五、Webpack打包图片-js-Vue、Label命令、resolve模块解析

一、webpack打包图片

(1)加载图片案例准备

为了演示我们项目中可以加载图片,我们需要在项目中使用图片,比较常见的使用图片的方式是两种:

  1. img元素,设置src属性;
  2. 其他元素(比如div),设置background-image的css属性;

这个时候我们打包会报错:

ERROR in ./src/img/zznh.png 1:0
Module parse failed: Unexpected character '�' (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
(Source code omitted for this binary file)@ ./src/component/cpns.js 5:0-39 21:12-21@ ./src/index.js 2:0-25

(2)认识asset module type

我们当前使用的webpack版本是webpack5:

  • 在webpack5之前,加载这些资源我们需要使用一些loader,比如raw-loader 、url-loader、file-loader
  • 在webpack5开始,我们可以直接使用资源模块类型(asset module type),来替代上面的这些loader; 

资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:

  1. asset/resource 发送一个单独的文件并导出 URL。
    •  之前通过使用 file-loader 实现;
  2. asset/inline 导出一个资源的 data URI。
    • 之前通过使用 url-loader 实现;
  3. asset/source 导出资源的源代码
    • 之前通过使用 raw-loader 实现;
  4. asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。
    • 之前通过使用 url-loader,并且配置资源体积限制实现;

(3)asset module type的使用

我们在webpack.config.js配置文件中新增了这2行代码。然后打包之后,图片是正常能够加载的。

const path = require("path")module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "./build"),},module: {rules: [{// 告诉webpack你要匹配什么类型的文件test: /\.css$/,// 用什么loader去处理use: [// 注意:  style-loader在css-loader的前面,因为loader的执行顺序是从右向左(或者说从下往上,从后往前)。// { loader: "style-loader" },// { loader: "css-loader" },],// 简写一: 如果loader只有一个, 可以把use省略// loader: "css-loader"// 简写二: 如果不需要其他option属性时,可以直接写loader字符串形式。use: ["style-loader","css-loader","postcss-loader",// 下方注释掉的加options属性时,还可以在postcss.config.js文件中添加。// {//   loader: "postcss-loader",//   options: {//     postcssOptions: {//       plugins: ["autoprefixer"],//     },//   },// },],},{test: /\.less$/,use: [ "style-loader", "css-loader", "less-loader", "postcss-loader" ],},{test: /\.(png|jpe?g|svg|gif)$/,type: "asset"}],},
}

 

(4)asset module type 四种模块类型的区别

我们讲下上述说的资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader。我们只看124,3是提供源码使用场景很少,有兴趣的小伙伴可以自己去玩一下。

① type: "asset/resource"

我们使用两种方式使用图片,然后将type设置成下图所示 type: "asset/resource" :

设置完以后我们删掉之前打包后的文件夹build,重新npm run build构建一下。

不难看出,webpack将我下面的两种图片打包进行了一次重命名,是通过哈希算法生成了对应的一个哈希值,对这2个图片资源进行一个复制。 实际上就是把这2张图片的资源路径给设置到我们创建的image元素和div的元素background那个地方。

结论:所以当 type: "asset/resource"时,webpack将打包两张图片,并且这两张图片有自己的地址,将地址设置到img/img-bg里面的background中。

 


 

② type: "asset/inline"

我将打包过后的文件夹目录build删掉,type设置成type: "asset/inline",重新再进行一次打包

然后我们打开打包存放的目录build,发现没有图片了。

然后我们打开html 按F12查看发现图片被进行了编码,这个编码被称之为base64编码。编码之后的结果被放在inline,也就是行内了,放在build目录下面的bundle.js文件里面了。

 

具体base64编码是啥,我们后面再讲。

③ 各自的优劣势 type: "asset/inline" 和 type: "asset/resource"

我们现在先思考一个问题,把图片编码后放在js打包文件中是好还是不好呢?对于我们性能来说是有优势还是劣势呢?

{test: /\.(png|jpe?g|svg|gif)$/,// 1. 打包两张图片,并且这两张图片有自己的地址,将地址设置到img/img-bg里面的background中// type: "asset/resource"// 2. 将图片进行base64的编码,并且直接将编码后的源码放到打包的js文件中。type: "asset/inline"
}

结论:

type: "asset/resource"的缺点:因为多了两张图片,所以需要多发送两次http网络请求,

type: "asset/inline"的缺点: 造成js文件非常大,下载js文件本身消耗时间非常长。

 

④ url-loader的limit效果

对于 resource和 inline 的优缺点我们可以中和一下:

对于小一点的图片,可以进行base64编码。

对于大一点的图片,单独的进行打包,形成url地址,单独的请求这个url图片。

那怎么才能做到这一点呢?

开发中我们往往是小的图片需要转换,但是大的图片直接使用图片即可

  • 这是因为小的图片转换base64之后可以和页面一起被请求,减少不必要的请求过程;
  • 而大的图片也进行转换,反而会影响页面的请求速度;

我们需要两个步骤来实现: 

  • 步骤一:将type修改为asset;
  • 步骤二:添加一个parser属性,并且制定dataUrl的条件,添加maxSize属性;
    • Data URL是一种特殊的URL,可以将数据编码为URL字符串中的一部分。它可以用于嵌入图像、音频、视频和其他数据,而不必将它们作为独立的文件进行加载。Data URL以"data:"作为协议标识符,后面跟着数据的MIME类型和编码,然后是实际的数据本身。例如,一个用base64编码的PNG图像的data URL可能是这样的:

      data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAI.......

      其中"data:image/png"指定了MIME类型,"base64"指定了数据使用的编码,"iVBORw0KGgoAAAANSUhEUgAAAAI......."是实际的base64编码数据。

我们把配置文件改成这样子:

 

再重新打包的时候发现他只复制了一个图片并用哈希值命名,还有一个图片被base64编码放在打包的bundle.js文件中了。

是不是满足我的诉求了,大于一定规格的图片我编码,小于一定规格的图片我直接复制后用哈希值命名。

 

⑤ 自定义文件的输出路径和文件名

通过哈希值重新命名的图片,光看名字我们已经不知道他对应的原图是具体哪一个了。

 

那我们如何可以自定义文件的输出路径和文件名呢?

  • 方式一:修改output,添加assetModuleFilename属性;
  • 方式二:在Rule中,添加一个generator属性,并且设置filename;

 

我们先来试一下方法一:

const path = require("path")module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "./build"),assetModuleFilename: "abc.png"},module: {rules: [{// 告诉webpack你要匹配什么类型的文件test: /\.css$/,// 用什么loader去处理use: [// 注意:  style-loader在css-loader的前面,因为loader的执行顺序是从右向左(或者说从下往上,从后往前)。// { loader: "style-loader" },// { loader: "css-loader" },],// 简写一: 如果loader只有一个, 可以把use省略// loader: "css-loader"// 简写二: 如果不需要其他option属性时,可以直接写loader字符串形式。use: ["style-loader","css-loader","postcss-loader",// 下方注释掉的加options属性时,还可以在postcss.config.js文件中添加。// {//   loader: "postcss-loader",//   options: {//     postcssOptions: {//       plugins: ["autoprefixer"],//     },//   },// },],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|jpe?g|svg|gif)$/,// 1. 打包两张图片,并且这两张图片有自己的地址,将地址设置到img/img-bg里面的background中// 缺点;多图片加载的两次网络请求,两张图片就是两次请求。// type: "asset/resource"// 2. 将图片进行base64的编码,并且直接将编码后的源码放到打包的js文件中。// 缺点: 造成js文件非常大,下载js文件本身消耗时间非常长。// type: "asset/inline"// 3. 合理的规范:// 3.1 对于小一点的图片,可以进行base64编码// 3.2 对于大一点的图片,单独的进行打包,形成url地址,单独的请求这个url图片type: "asset",parser: {dataUrlCondition: {// 1kb=1024byte, 60 * 1024 就是最大值是60字节。maxSize: 60 * 1024, },},},],},
}

然后删掉打包的文件目录,重新打包npm run build,发现图片名字是不是变成了abc.png啦。

但是我们这个方法并不常用,因为如果是字体文件的话你用这个名字命名是不是不好?


我们试一下方法二:

const path = require("path")module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "./build"),// assetModuleFilename: "abc.png"},module: {rules: [{// 告诉webpack你要匹配什么类型的文件test: /\.css$/,// 用什么loader去处理use: [// 注意:  style-loader在css-loader的前面,因为loader的执行顺序是从右向左(或者说从下往上,从后往前)。// { loader: "style-loader" },// { loader: "css-loader" },],// 简写一: 如果loader只有一个, 可以把use省略// loader: "css-loader"// 简写二: 如果不需要其他option属性时,可以直接写loader字符串形式。use: ["style-loader","css-loader","postcss-loader",// 下方注释掉的加options属性时,还可以在postcss.config.js文件中添加。// {//   loader: "postcss-loader",//   options: {//     postcssOptions: {//       plugins: ["autoprefixer"],//     },//   },// },],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|jpe?g|svg|gif)$/,// 1. 打包两张图片,并且这两张图片有自己的地址,将地址设置到img/img-bg里面的background中// 缺点;多图片加载的两次网络请求,两张图片就是两次请求。// type: "asset/resource"// 2. 将图片进行base64的编码,并且直接将编码后的源码放到打包的js文件中。// 缺点: 造成js文件非常大,下载js文件本身消耗时间非常长。// type: "asset/inline"// 3. 合理的规范:// 3.1 对于小一点的图片,可以进行base64编码// 3.2 对于大一点的图片,单独的进行打包,形成url地址,单独的请求这个url图片type: "asset",parser: {dataUrlCondition: {// 1kb=1024byte, 60 * 1024 就是最大值是60字节。maxSize: 60 * 1024, },},generator: {filename: "cba.png"}},],},
}

 我们重新打包试一下效果:是不是打包的文件名变为cba.png啦。


但是现在我又有一个疑惑,我如果有多张图片的话,每张图片都叫cba.png是不是就不合适了?后面的会把前面的图片直接覆盖掉。

所以我们现在得用一个占位符:

const path = require("path")module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "./build"),// assetModuleFilename: "abc.png"},module: {rules: [{// 告诉webpack你要匹配什么类型的文件test: /\.css$/,// 用什么loader去处理use: [// 注意:  style-loader在css-loader的前面,因为loader的执行顺序是从右向左(或者说从下往上,从后往前)。// { loader: "style-loader" },// { loader: "css-loader" },],// 简写一: 如果loader只有一个, 可以把use省略// loader: "css-loader"// 简写二: 如果不需要其他option属性时,可以直接写loader字符串形式。use: ["style-loader","css-loader","postcss-loader",// 下方注释掉的加options属性时,还可以在postcss.config.js文件中添加。// {//   loader: "postcss-loader",//   options: {//     postcssOptions: {//       plugins: ["autoprefixer"],//     },//   },// },],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|jpe?g|svg|gif)$/,// 1. 打包两张图片,并且这两张图片有自己的地址,将地址设置到img/img-bg里面的background中// 缺点;多图片加载的两次网络请求,两张图片就是两次请求。// type: "asset/resource"// 2. 将图片进行base64的编码,并且直接将编码后的源码放到打包的js文件中。// 缺点: 造成js文件非常大,下载js文件本身消耗时间非常长。// type: "asset/inline"// 3. 合理的规范:// 3.1 对于小一点的图片,可以进行base64编码// 3.2 对于大一点的图片,单独的进行打包,形成url地址,单独的请求这个url图片type: "asset",parser: {dataUrlCondition: {// 1kb=1024byte, 60 * 1024 就是最大值是60字节。maxSize: 60 * 1024,},},generator: {// 常见的占位符// 1. name: 指向原来的图片名称filename: "[name].png",},},],},
}

效果是不是显而易见啦。[name] 指向的是原来的图片名称。


我们再试一下 [ext] ,他是处理文件的扩展名。

原来图片是什么文件扩展名,那就是什么扩展名。


这样子其实还会带来其他问题, 如果我在不同目录里,存在相同的名字的图片文件咋办?这样子的话打包起来还是会起冲突是不是。

所以我们得保留原来的哈希值,这样子就能文件名不会重复从而被覆盖。

 


此时又有小伙伴们觉得这个打包出来的图片名字太长了,我能不能对哈希值截取部分,当然可以。

filename: "[name]_[hash:8][ext]"

 

 


 有小伙伴们又提出来一个问题,我图片很多的话,打包和js文件一起全部放在build目录下,这样子看是不是有点乱?我们可不可以整理一下?当然可以!

我们可以设置 

filename: "img/[name]_[hash:8][ext]"

效果展示:是不是在打包目录下又多了一个img目录,打包的图片文件放在了build/img目录下?

完整代码我就放下面啦:

const path = require("path")module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "./build"),// assetModuleFilename: "abc.png"},module: {rules: [{// 告诉webpack你要匹配什么类型的文件test: /\.css$/,// 用什么loader去处理use: [// 注意:  style-loader在css-loader的前面,因为loader的执行顺序是从右向左(或者说从下往上,从后往前)。// { loader: "style-loader" },// { loader: "css-loader" },],// 简写一: 如果loader只有一个, 可以把use省略// loader: "css-loader"// 简写二: 如果不需要其他option属性时,可以直接写loader字符串形式。use: ["style-loader","css-loader","postcss-loader",// 下方注释掉的加options属性时,还可以在postcss.config.js文件中添加。// {//   loader: "postcss-loader",//   options: {//     postcssOptions: {//       plugins: ["autoprefixer"],//     },//   },// },],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|jpe?g|svg|gif)$/,// 1. 打包两张图片,并且这两张图片有自己的地址,将地址设置到img/img-bg里面的background中// 缺点;多图片加载的两次网络请求,两张图片就是两次请求。// type: "asset/resource"// 2. 将图片进行base64的编码,并且直接将编码后的源码放到打包的js文件中。// 缺点: 造成js文件非常大,下载js文件本身消耗时间非常长。// type: "asset/inline"// 3. 合理的规范:// 3.1 对于小一点的图片,可以进行base64编码// 3.2 对于大一点的图片,单独的进行打包,形成url地址,单独的请求这个url图片type: "asset",parser: {dataUrlCondition: {// 1kb=1024byte, 60 * 1024 就是最大值是60字节。maxSize: 60 * 1024,},},generator: {// 常见的占位符// 1. name: 指向原来的图片名称// 2. ext: 指向原来的文件的扩展名// 3. hash: 保留原来webpack生成的hashfilename: "[name]_[hash:8][ext]",},},],},
}

二、babel

(1)为什么需要babel?

事实上,在开发中我们很少直接去接触babel,但是babel对于前端开发来说,目前是不可缺少的一部分:

  • 开发中,我们想要使用ES6+的语法,想要使用TypeScript,开发React项目,它们都是离不开Babel的;
  • 所以,学习Babel对于我们理解代码从编写到线上的转变过程至关重要;

那么,Babel到底是什么呢?

  • Babel是一个工具链,主要用于旧浏览器或者环境中将ECMAScript 2015+代码转换为向后兼容版本的JavaScript;
  • 包括:语法转换、源代码转换等; 

 

(2)babel命令行使用

babel本身可以作为一个独立的工具(和postcss一样),不和webpack等构建工具配置来单独使用。

如果我们希望在命令行尝试使用babel,需要安装如下库:

  • @babel/core:babel的核心代码,必须安装;
  • @babel/cli:可以让我们在命令行使用babel;
  • npm install @babel/cli @babel/core -D
    

     

使用babel来处理我们的源代码:

  • src:是源文件的目录;
  • --out-dir:指定要输出的文件夹dist;
  • npx babel src --out-dir dist
    
     

 

(3)插件的使用(了解,真实开发中不会这么做)

比如我们需要转换箭头函数,那么我们就可以使用箭头函数转换相关的插件:

npm install @babel/plugin-transform-arrow-functions -Dnpx babel src --out-dir dist --plugins=@babel/plugin-transform-arrow-functions

查看转换后的结果:我们会发现 const 并没有转成 var

  • 这是因为 plugin-transform-arrow-functions,并没有提供这样的功能;
  • 我们需要使用 plugin-transform-block-scoping 来完成这样的功能;
npm install @babel/plugin-transform-block-scoping -D npx babel src --out-dir dist --plugins=@babel/plugin-transform-block-scoping,@babel/plugin-transform-arrow-functions

完整配置如下: 

const path = require("path")module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",path: path.resolve(__dirname, "./build"),// assetModuleFilename: "abc.png"},module: {rules: [{// 告诉webpack你要匹配什么类型的文件test: /\.css$/,// 用什么loader去处理use: [// 注意:  style-loader在css-loader的前面,因为loader的执行顺序是从右向左(或者说从下往上,从后往前)。// { loader: "style-loader" },// { loader: "css-loader" },],// 简写一: 如果loader只有一个, 可以把use省略// loader: "css-loader"// 简写二: 如果不需要其他option属性时,可以直接写loader字符串形式。use: ["style-loader","css-loader","postcss-loader",// 下方注释掉的加options属性时,还可以在postcss.config.js文件中添加。// {//   loader: "postcss-loader",//   options: {//     postcssOptions: {//       plugins: ["autoprefixer"],//     },//   },// },],},{test: /\.less$/,use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],},{test: /\.(png|jpe?g|svg|gif)$/,// 1. 打包两张图片,并且这两张图片有自己的地址,将地址设置到img/img-bg里面的background中// 缺点;多图片加载的两次网络请求,两张图片就是两次请求。// type: "asset/resource"// 2. 将图片进行base64的编码,并且直接将编码后的源码放到打包的js文件中。// 缺点: 造成js文件非常大,下载js文件本身消耗时间非常长。// type: "asset/inline"// 3. 合理的规范:// 3.1 对于小一点的图片,可以进行base64编码// 3.2 对于大一点的图片,单独的进行打包,形成url地址,单独的请求这个url图片type: "asset",parser: {dataUrlCondition: {// 1kb=1024byte, 60 * 1024 就是最大值是60字节。maxSize: 60 * 1024,},},generator: {// 常见的占位符// 1. name: 指向原来的图片名称// 2. ext: 指向原来的文件的扩展名// 3. hash: 保留原来webpack生成的hashfilename: "img/[name]_[hash:8][ext]",},},{test: /\.js$/,use: [{loader: "babel-loader",options: {plugins: ["@babel/plugin-transform-arrow-functions", "@babel/plugin-transform-block-scoping"],},},],},],},
}

 

(4)babel.config.js文件

我们有那么多的语法,如果每个都要挨个安装插件的话,是不是特别麻烦?

而且在webpack.config.js文件中,该配置项是不是特别多 特别不好管理?

能不能像postcsss.config.js文件一样,单独抽离出来?回答是,当然可以。

webpack.config.js配置文件中相关test下注释掉该块代码, 

 

新增babel.config.js文件。

 

(5) babel的预设preset

但是如果要转换的内容过多,一个个设置是比较麻烦的,我们可以使用预设(preset):

  • 后面我们再具体来讲预设代表的含义;

安装@babel/preset-env预设:

  • npm install @babel/preset-env -D 

执行如下命令:

npx babel src --out-dir dist --presets=@babel/preset-env

如果我们一个个去安装使用插件,那么需要手动来管理大量的babel插件,我们可以直接给webpack提供一个preset,webpack会根据我们的预设来加载对应的插件列表,并且将其传递给babel。

是不是很方便? 

 

常见的预设有三个:

  • env
  • react
  • TypeScript

  三、webpack对vue文件的处理

(1)案例引导

在开发中我们会编写Vue相关的代码,webpack可以对Vue代码进行解析:

  • 接下来我们编写自己的App.vue代码;

 

(2)App.vue的打包过程

① vue-loader

我们对代码打包会报错:我们需要合适的Loader来处理文件。

  •  

这个时候我们需要使用vue-loader:

  • npm install vue-loader -D
    
     

在webpack的模板规则中进行配置:

  •  

② @vue/compiler-sfc(正常来说安装vue的时候已经默认自动安装这个了)

打包依然会报错,这是因为我们必须添加@vue/compiler-sfc来对template进行解析:

  • npm install @vue/compiler-sfc -D
    
      

另外我们需要配置对应的Vue插件: 

重新打包即可支持App.vue的写法。 

四、resolve模块解析

 

 

 什么叫起别名?

我们举个🌰栗子~我在utils目录下创建一个abc/cba/nba/why/层级目录下创建一个test.js文件,然后在这个文件中引入utils目录下的math.js,

但是我目前这样导入是不是给人看的特别不清晰?

那我可不可以写成 下面这样子:

import { sum } from "utils/math.js"

目前看是不是不行,因为你这么写的话是不是默认会从node/modules里去查找utils下面的math.js?

但是我又希望我在别的地方真的想用到这个的话,我能直接使用utils,那怎么办?回答:起别名。 

我们直接上代码:

 

相关文章:

十五、Webpack打包图片-js-Vue、Label命令、resolve模块解析

一、webpack打包图片 (1)加载图片案例准备 为了演示我们项目中可以加载图片,我们需要在项目中使用图片,比较常见的使用图片的方式是两种: img元素,设置src属性;其他元素(比如div&…...

ARM指令集--数据处理指令

数据处理指令:数学运算,逻辑运算 立即数 立即数的本质 就是包含在指令当中的数,属于指令的一部分 立即数的优点:取指的时候就可以将其读取到CPU,不用单独去内存读取,速度快 立即数的缺点:不…...

Excel embed into a webpage

无法编辑嵌入式 Excel 网页版 工作簿,但具有适当权限的人员可能能够在 Excel 中打开嵌入的工作簿,他们可以在其中编辑数据。 通过制作一个浏览器,打开并编辑它 https://onedrive.live.com/embed? resid5FC97855340825A9%21135& aut…...

uniapp点击事件在小程序中无法传参

这个问题很是神奇,第一次遇到。在h5中,点击事件可以正常传参,打包小程序后确失效了。 修改:for循环中的key,使用 index就好了...

ssprompt:一个LLM Prompt分发管理工具

阅读顺序 🌟前言🔔ssprompt介绍命令介绍Metafile介绍版本依赖规则 🌊 PromptHubGitHub Token 🚀 Quick Install系统依赖pip安装Linux, macOS, Windows (WSL)Windows (Powershell) 🚩 Roadmap🌏 项目交流讨论…...

修复 ChatGPT 发生错误的问题

目录 ChatGPT 发生错误?请参阅如何修复连接错误! 修复 ChatGPT 发生错误的问题 基本故障排除技巧 检查 ChatGPT 的服务器状态 检查 API 限制 检查输入格式 清除浏览数据 香港DSE是什么? 台湾指考是什么? 王湘浩 生平 …...

《热题100》字符串、双指针、贪心算法篇

思路:对于输入的的字符串,只有三种可能,ipv4,ipv6,和neither ipv4:四位,十进制,无前导0,小于256 ipv6:八位,十六进制,无多余0(00情况不允许),不…...

大数据组件Sqoop-安装与验证

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…...

运算符重载(个人学习笔记黑马学习)

1、加号运算符重载 #include <iostream> using namespace std; #include <string>//加号运算符重载 class Person { public://1、成员函数重载号//Person operator(Person& p) {// Person temp;// temp.m_A this->m_A p.m_A;// temp.m_B this->m_B p…...

2023.9.6 Redis 的基本介绍

目录 Redis 的介绍 Redis 用作缓存和存储 session 信息 Redis 用作数据库 消息队列 消息队列是什么&#xff1f; Redis 用作消息队列 Redis 的介绍 特点&#xff1a; 内存中存储数据&#xff1a;奠定了 Redis 进行访问和存储时的快可编程性&#xff1a;支持使用 Lua 编写脚…...

2023-09-08力扣每日一题

链接&#xff1a; 2651. 计算列车到站时间 题意&#xff1a; 不看日期只看时间 解&#xff1a; &#xff1f; 实际代码&#xff1a; 还看&#xff01;你怎么肥四&#xff1f;int findDelayedArrivalTime(int arrivalTime, int delayedTime) {return (arrivalTimedelayed…...

adb-linux 调试桥

这里写自定义目录标题 摘要&#xff1a;一、简介二、adb使用参考连接 摘要&#xff1a; adb 可替代网络、串口等调试手段&#xff0c;可以方便的进行文件传输、终端登录等 一、简介 ADB的全称为Android Debug Bridge&#xff0c;即调试桥&#xff0c;方便调试设备或调试开发…...

入门人工智能 —— 使用 Python 进行文件读写,并完成日志记录功能(4)

入门人工智能 —— 使用 Python 进行文件读写&#xff08;4&#xff09; 入门人工智能 —— 使用 Python 进行文件读写打开文件读取文件内容读取整个文件逐行读取文件内容读取所有行并存储为列表 写入文件内容关闭文件 日志记录功能核心代码&#xff1a;完整代码&#xff1a;运…...

使用Caffeine实现帖子的缓存来优化网站的运行速度

导入依赖 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version>…...

Webpack5 搭建Vue项目(进阶版)

Webpack5 搭建Vue项目&#xff08;进阶版&#xff09; 提示&#xff1a;中间隔了好长时间&#xff0c;我胡汉三又回来继续更新了&#xff01;&#xff01;&#xff01;&#x1f602;&#x1f602;&#x1f602; 文章目录 Webpack5 搭建Vue项目&#xff08;进阶版&#xff09;前…...

论文阅读:Distortion-Free Wide-Angle Portraits on Camera Phones

论文阅读&#xff1a;Distortion-Free Wide-Angle Portraits on Camera Phones 今天介绍一篇谷歌 2019 年的论文&#xff0c;是关于广角畸变校正的。 Abstract 广角摄影&#xff0c;可以带来不一样的摄影体验&#xff0c;因为广角的 FOV 更大&#xff0c;所以能将更多的内容…...

力扣每日一题---207. 课程表

Problem: 207. 课程表 文章目录 解题方法复杂度Code 解题方法 y总的 Topsort 模板题 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) Code class Solution {int res 0; public…...

在Kubernetes环境中有关Nginx Ingress与API Gateway的连接问题

文章目录 小结问题解决参考 小结 在Kubernetes环境中是通过Nginx Ingress来从外部访问Kubernetes内部的环境&#xff0c;并用API Gateway来分发请求&#xff0c;碰到了 502 Bad gateway.的问题&#xff0c;并尝试解决。 问题 从外部通过Nginx Ingress访问Kubernetes内部的环…...

c语言练习44:深入理解strstr

深入理解strstr strstr作用展示&#xff1a; #include <stdio.h> #include <string.h> int main() {char str[] "This is a simple string";char* pch;pch strstr(str, "simple");/*strncpy(pch, "sample", 6);*/printf("%s…...

渗透测试漏洞原理之---【业务安全】

文章目录 1、业务安全概述1.1业务安全现状1.1.1、业务逻辑漏洞1.1.2、黑客攻击目标 2、业务安全测试2.1、业务安全测试流程2.1.1、测试准备2.1.2、业务调研2.1.3、业务建模2.1.4、业务流程梳理2.1.5、业务风险点识别2.1.6 开展测试2.1.7 撰写报告 3、业务安全经典场景3.1、业务…...

CentOS查看CPU、内存、网络流量和磁盘 I/O

安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s rsec/s:…...

无人机航线规划

无人机航线规划&#xff0c;对于无人机的任务执行有着至关重要的作用&#xff0c;无人机在从起点飞向目的点的过程中&#xff0c;如何规划出一条安全路径&#xff0c;并且保证该路径代价最优&#xff0c;是无人机航线规划的主要目的。其中路径最优的含义是&#xff0c;在无人机…...

react中受控组件与非受控组件

受控组件与非受控组件 受控组件: 其值由 React 控制的组件,通常使用 state 来控制和修改组件的值。 例如受控的 组件: class NameForm extends React.Component {constructor(props) {super(props);this.state {value: };}handleChange (event) > {this.setState({val…...

【网络教程】如何解决Docker删除镜像和容器后磁盘空间未释放的问题

文章目录 问题分析解决方案删除未使用的容器删除未使用的镜像删除未使用的数据卷调整Docker数据存储路径问题分析 当删除Docker镜像和容器后,磁盘空间并未释放,这可能导致磁盘空间不足。造成此问题的原因包括: Docker镜像和容器的删除策略:默认情况下,Docker不会立即删除…...

Python中的进度条显示方案

迷途小书童 读完需要 3分钟 速读仅需 1 分钟 大家好&#xff0c;我是迷途小书童! tqdm 是一个非常常用的 Python 进度条库&#xff0c;它可以在循环迭代和 IO 操作期间添加一个进度条&#xff0c;直观地显示循环迭代的进程。 tqdm 是在 2013 年发布的&#xff0c;目的是为 Pyth…...

2023-09-05力扣每日一题

链接&#xff1a; 2605. 从两个数字数组里生成最小数字 题意&#xff1a; 两个数组都只包含1-9的数字&#xff0c;求一个最小数&#xff0c;两个数组内都要有它的其中一位 解&#xff1a; 要么是个位数要么是十位数&#xff0c;存一下数量和两边的最小数即可 实际代码&am…...

ODC现已开源:与开发者共创企业级的数据库协同开发工具

OceanBase 开发者中心&#xff08;OceanBase Developer Center&#xff0c;以下简称 ODC&#xff09;是一款开源的数据库开发和数据库管理协同工具&#xff0c;从首个版本上线距今已经发展了三年有余&#xff0c;ODC 逐步由一款专为 OceanBase 打造的开发者工具演进成为支持多数…...

生成克隆钓鱼网站与对win7进行后渗透操作

目录 目录 前言 系列文章列表 思维导图 1&#xff0c;实验涉及复现环境 2&#xff0c;CS的介绍 2.1,CS的简介 2.2,CS的主要功能 3&#xff0c;CS的安装 3.1,将cobalt_strike_4.5文件夹放到kali中 3.1,放入过程中的注意事项 3.2,如图所示 4,配置工具 4.1,进入c…...

Ubuntu18中NVIDIA,cuda,cudnn,pytorch安装

注意&#xff1a;nvidia驱动和cuda,cudnn,pytroch,python的对应关系 linux安装pytorch&#xff08;包括cuda与cudnn&#xff09;_linux清华园按照pytorch1.12_BryceRui的博客-CSDN博客 安装流程&#xff1a;安装cuda&#xff08;包括nvidia驱动&#xff09; cudnn python安装…...

MATLAB中M文件编写

简介 所谓M文件就是将处理问题的各种命令融合到一个文件中&#xff0c;该文件以.m为扩展名。然后&#xff0c;由MATLAB系统编译M文件&#xff0c;得出相应的运行结果。M文件具有相当大的可开发性和扩展性。M文件有脚本文件和函数文件两种。脚本文件不需要输入参数&#xff0c;…...

卫计委社会信用体系建设网站/百度怎么做推广和宣传

对于水平方向得到居中很简单 先设置paint.setTextAlign(Paint.Align.CENTER) 这样就可以保证水平方向的居中 假设方框的宽度为width 设置x坐标为width / 2就可以使文字居中 垂直方向的居中就不是简单的 height / 2 需要一个叫FontMetrics对象 在使用draw.Text方法的时候&#x…...

如何修改asp网站栏目/郑州seo外包v1

文章目录前言一、.关闭防火墙二、.虚拟机网络设置&#xff08;此处仅写出三种连接模式的概念&#xff09;1.桥接模式2.NAT模式3.仅主机模式三、ping 命令三个参数的使用方法四、Linux 系统查看网卡配置1.方法一&#xff1a;ifconfig 命令查看设置网卡2.方法二&#xff1a;通过 …...

网站开发 安全合同/有哪些搜索引擎网站

模块一 知识点1. 了解计算机硬件体系结构2. 掌握常见的计算机硬件设备3. 了解计算机软件体系结构4. 掌握主板结构的组成5. 了解CPU、内存、硬盘的发展历程6. 掌握CPU、内存、硬盘的结构、性能指标及相关知识7. 掌握显卡和显示器的工作原理、结构特点及性能指标8. 了解计算机的其…...

创新的大良网站建设/网络营销师证书查询

最近开始写一些WPF的小Sample和文章&#xff0c;但是毕竟WPF应用程式不像Silverlight那么方便的只要装个Plugin就可以透过浏览器来看执行结果&#xff0c;因此把脑筋动到了改用WPF Browser Application上&#xff0c;虽然它是WPF&#xff0c;但是一样可以透过浏览器来执行&…...

网站建设合同编号/做关键词推广

TaintDroid剖析之DVM变量级污点跟踪(下篇)作者&#xff1a;简行、走位阿里聚安全 ​ 1 回顾 在上一章节中我们详细分析了TaintDroid对DVM方法参数和方法变量的变量级污点跟踪机制&#xff0c;现在我们将继续分析TaintDroid对类的静态域、实例域以及数组的污点跟踪。 2 了解DVM中…...

国内免费发布产品的平台/太原seo排名公司

【小程序开发】常见的内置组件 文章目录【小程序开发】常见的内置组件写在前面一、Text文本组件二、Button按钮组件2.1 type属性2.2 open-type属性三、View视图组件三、Image图片组件3.1 mode属性3.2 wx.chooseMedia四、ScrollView滚动组件五、组件的共同属性写在前面 &#x1…...