基于 Yeoman 脚手架技术构建前端项目的实践

news2024/12/23 0:38:03
NodeJ、CLI
基于 Yeoman 脚手架技术构建前端项目的实践

作者李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/131251347



1. 概述

Yeoman 是一个开源的、基于 Node.js 的脚手架工具, 由 Google 的前端工程师 Paul Irish 和 Addy Osmani 于 2012 年创建。它用于生成项目结构、配置文件和代码模板。Yeoman 提供了一个丰富的插件和模板生态系统,可以支持多种技术栈和项目类型。通过 Yeoman,开发者可以快速搭建项目、统一技术栈和规范、降低学习成本,提高开发效率。

其主要功能和特点包括:

功能描述
项目搭建Yeoman 可以根据预设的模板,自动生成项目的目录结构、配置文件和基础代码。
插件生态Yeoman 提供了一个丰富的插件生态系统,包括各种生成器(Generator)、子生成器(Sub-Generator)和工具。开发者可以根据项目需求选择合适的插件,或者自定义插件。
技术栈支持Yeoman 支持多种技术栈和项目类型,如 Web 应用、Node.js 项目、React/Vue/Angular 应用等。开发者可以根据自己的技术栈和需求选择合适的模板。
自定义模板Yeoman 支持自定义项目结构和技术栈,开发者可以根据团队的规范和需求创建自己的模板。
易于升级和维护Yeoman 可以集中管理项目的依赖和配置,方便开发者进行升级和维护。当项目需要更新技术栈或规范时,只需更新 Yeoman 的插件和模板即可。

通过了解 Yeoman 的概念、背景和主要功能,开发者可以更好地利用 Yeoman 脚手架技术构建高效的前端项目。本文将详细介绍 Yeoman 的安装、使用和自定义方法。

如果你想要了解更多关于 Yeoman 的信息,也可以访问其官方站点 https://yeoman.io/。

2. 安装和使用 Yeoman

2.1 安装 Node.js 和 pnpm

使用 Yeoman前,需要安装 Node.js 和 pnpm。如果你习惯于 npm,后续也可以直接使用 npm 而不要单独安装 pnpm。

2.1.1 安装 Node.js

访问 Node.js 官网,下载并安装适合你操作系统的 Node.js 版本。安装完成后,打开命令行工具,输入 node -v,如果显示 Node.js 版本号,则说明安装成功。

2.1.1 安装 pnpm

pnpm 是一个更快、更高效的 npm 替代品。要安装 pnpm,请打开命令行工具,输入以下命令:

npm install -g pnpm

当然其实你也可以使用 npm 或者 yarn。

安装完成后,输入 pnpm -v,如果显示 pnpm 版本号,则说明安装成功。

2.2 全局安装 yo 和相关 generator

安装好 Node.js 和 pnpm 后,我们可以全局安装 yo 和相关 generator。

2.2.1 安装 yo

打开命令行工具,输入以下命令:

pnpm install -g yo

安装完成后,输入 yo --version,如果显示 yo 版本号,则说明安装成功:

在这里插入图片描述

2.2.1 安装相关 generator

根据你的需求,需要选择并安装合适的 generator。例如,安装 generator-webapp 的命令为:

pnpm install -g generator-webapp

安装完成后,输入 yo,如果显示已安装的 generator 列表,则说明安装成功。

现在我们已经成功安装了 Node.js、pnpm、yo 和相关 generator。

2.3 使用 yo 初始化项目和运行 generator

在安装好 Node.js、pnpm、yo 和相关 generator 后,我们可以使用 yo 初始化项目并运行 generator。本小节将介绍如何初始化项目、运行 generator、生成代码模板等操作。

  1. 创建项目目录:首先,我们需要创建一个项目目录。在命令行工具中,输入以下命令:
mkdir my-projectcd my-project

这将创建一个名为 my-project 的目录,并将当前工作目录切换到该目录。

  1. 初始化项目:在项目目录中,我们需要使用 yo 初始化项目。输入以下命令:
yo

这将启动 yo,并显示已安装的 generator 列表。根据提示,选择合适的 generator,如 generator-webapp。然后,按照提示输入项目信息,如项目名称、描述、作者等。

  1. 运行 generator:在初始化项目后,yo 将自动运行所选的 generator。generator 会根据预设的模板和配置文件,自动生成项目结构、代码模板和配置文件。这些文件包括 HTML、CSS、JavaScript、图片等资源,以及构建工具(如 Grunt/Gulp)的配置文件。

  2. 查看生成的项目结构和代码模板:在 generator 运行完成后,我们可以查看生成的项目结构和代码模板。这些文件已经按照最佳实践进行了组织,可以直接用于开发。

  3. 修改代码模板:根据项目需求,我们可以修改生成的代码模板。例如,我们可以添加新的 HTML 页面、修改 CSS 样式、编写 JavaScript 代码等。我们还可以使用其他 generator,如 generator-angular,为项目添加新的功能。

  4. 构建项目:在完成代码编写后,我们可以使用集成的构建工具(如 Grunt/Gulp)构建项目。输入以下命令:

grunt build
# 或
gulp build

这将执行构建任务,如编译、压缩、合并、测试、发布等。构建完成后,我们可以将项目部署到服务器上,供用户访问。

通过以上步骤,我们使用 yo 初始化了项目并运行了 generator。接下来,我们可以根据需求修改代码模板,使用构建工具构建项目,提高开发效率。在实际项目中,我们还可以使用其他 generator 和插件,以实现更多功能。

3. Yeoman 原理和相关核心

3.1 Yeoman 核心组件

上一章中我们已经初步使用了Yeoman,尽管对一些概念还不是很清楚。而这一招,我们将聚焦与介绍相关的概念。包括 yo、generator 和 grunt/gulp。

3.1 命令行工具 yo

yo 是 Yeoman 的命令行工具,用于运行和管理生成器(generator)。通过 yo,开发者可以方便地创建、更新和维护项目。yo 提供了一系列命令,如 yo --help(查看帮助信息)、yo --generators(查看已安装的生成器)等。

yo 的常用选项有:

命令描述
yo运行默认生成器
yo [generator-name]运行指定的生成器
yo --version查看 yo 的版本信息
yo --generators查看已安装的生成器

无需记忆,忘记的时候可以使用 yo --help 查看帮助:

yo --help

在这里插入图片描述

3.1.2 生成器:generator

generator 用于生成 项目结构、配置文件 和 代码模板,实际上也是一个 Node.js 模块,可以通过 npm/pnpm 等工具安装和管理。每个 generator 都有一个独立的命名空间,如 generator-webappgenerator-angular 等。

generator 的主要功能包括:

  • 自动生成项目结构和配置文件
  • 提供可选的子生成器(sub-generator),用于生成特定的代码模板和文件
  • 支持自定义模板和技术栈

你需要根据自己的实际需求选择合适的 generator,或者自定义 generator。

比如,如果需要创建一个基于 React 和 Webpack 的项目,可以选择 generator-react-webpack;如果需要创建一个基于 Vue.js 的项目,可以选择 generator-vuejs

★请注意,如果你自定义了一个 generator,需要确保它成为一个全局模块才可以使用,这时,你如要先依据你所使用的包管理器,获取你的全局模块位置。

比如如果你使用的是pnpm,先运行 root 命令:

pnpm root
# 或者如果你使用npm
npm root

将显示全局模块的位置,比如

C:\Users\jcstudio\node_modules

在这里插入图片描述

然后你可以将你的生成器项目使用 pnpm lint 或者 npm lint 链接过来。

3.1.3 grunt 与 gulp

gruntgulp 是两款流行的前端构建工具,用于自动化项目的构建、测试、发布等任务。Yeoman 可以与 grunt 或 gulp 集成,提供一站式的脚手架解决方案。grunt 和 gulp 的功能差不多,不过我个人更喜欢 gulp。比较起来:

项目描述
语法和API
  1. Grunt使用基于配置的方式,通过配置文件定义任务和插件。
  2. Gulp使用基于流的API,通过代码编写任务和使用插件。
插件系统两者都使用插件来实现各种任务,但Gulp的插件通常更加简单,因为它们直接操作文件流。
构建性能由于Gulp 一款基于流且支持异步构建的工具,它通往往 Grunt 更快速和高效。
配置文件
  1. Grunt的配置文件相对较复杂,需要手动指定输入和输出文件以及其他配置选项。
  2. Gulp的配置相对简单,因为它使用代码来定义任务和流水线。
社区支持Grunt是早期比较流行的构建工具,因此它有一个庞大的社区支持,有大量的插件可用。Gulp也有一个活跃的社区,尽管插件数量可能相对较少,但仍然有很多常用的插件可供选择。

通过集成 grunt/gulp,Yeoman 可以提供更完善的脚手架解决方案,帮助开发者提高前端项目的开发效率。

3.2 Yeoman 的工作原理和特点

在了解了 Yeoman 的核心组件后,我们将详细介绍 Yeoman 的工作原理和特点。这将有助于我们更深入地理解 Yeoman 脚手架技术,以便在实际项目中更好地使用它。

3.2.1 Yeoman 的工作原理

Yeoman 的工作原理可以分为以下几个步骤:

步骤序号描述
选择生成器开发者根据项目需求选择合适的 generator,如 generator-webappgenerator-angular 等。也可以自定义 generator,以满足特定的需求。
安装生成器通过 npm 安装 generator。例如,安装 generator-webapp 的命令为 npm install -g generator-webapp
运行生成器使用 yo 命令运行 generator。例如,运行 generator-webapp 的命令为 yo webapp
生成项目结构和代码模板generator 根据预设的模板和配置文件,自动生成项目结构、代码模板和配置文件。开发者可以根据需求修改这些文件。
构建项目通过集成的 grunt/gulp 进行项目构建,如编译、压缩、合并、测试、发布等。

3.2.2 Yeoman 的特点

Yeoman 主要具有以下特点:

项目描述
易用Yeoman 提供了简洁的命令行界面,开发者可以快速上手。通过 yo 命令,开发者可以轻松创建、更新和维护项目。
灵活Yeoman 支持多种 generator,可以根据项目需求选择合适的 generator。同时,开发者可以自定义 generator,以满足特定的需求。
一站式解决方案Yeoman 集成了 grunt/gulp,提供了一站式的脚手架解决方案。开发者无需单独安装和配置构建工具,可以直接进行项目构建。
丰富的生态系统Yeoman 拥有丰富的生态系统,包括大量的 generator 和插件。开发者可以根据需求选择合适的 generator 和插件,轻松实现项目的快速开发。
可扩展Yeoman 支持自定义 generator 和插件,开发者可以根据需求扩展 Yeoman 的功能。这使得 Yeoman 能够适应各种前端项目,满足不同的开发需求。

Yeoman 脚手架技术通过简洁的命令行界面、灵活的生成器选择、一站式的构建解决方案、丰富的生态系统和可扩展性等特点,帮助开发者快速搭建前端项目,提高开发效率。了解 Yeoman 的工作原理和特点,将有助于我们在实际项目中更好地利用 Yeoman 脚手架技术。

4. 自定义 生成器

使用 Yeoman 的过程中,我们可能需要创建自定义的 generator,以满足特定的项目需求。本章将介绍如何创建和发布自定义 generator。首先,我们需要了解 Yeoman generator 的基本结构。

4.1 生成器项目的结构

一个 Yeoman generator 通常包含以下几个部分:

  1. package.json:这是一个标准的 npm 包描述文件,包含了 generator 的名称、版本、依赖、脚本等信息。其中,generator 的名称必须以 generator- 开头,例如 generator-webapp。此外,package.json 文件还需要包含一个 files 字段,指定要发布的文件和目录。
  2. generators:这是一个目录,包含了 generator 的所有子生成器。一个 generator 可以包含多个子生成器,每个子生成器负责生成特定类型的文件或代码。子生成器的名称通常为 appmodulecontroller 等。每个子生成器都有一个 index.js 文件,用于定义生成器的行为和选项。
  3. templates:这是一个目录,包含了 generator 的所有模板文件。模板文件可以是任何类型的文件,如 HTML、CSS、JavaScript、图片等。在生成项目结构和代码模板时,generator 会根据用户输入的信息,替换模板文件中的变量,并将生成的文件输出到目标目录。
  4. .yo-rc.json:这是一个配置文件,包含了 generator 的默认选项和配置信息。用户可以在项目目录中创建一个同名文件,以覆盖 generator 的默认配置。.yo-rc.json 文件还可以用于识别项目目录,以确保 generator 在正确的位置运行。

了解了 Yeoman generator 的基本结构后,我们可以开始创建自定义 generator。在下一小节中,我们将介绍如何创建、测试和发布自定义 generator。

4.2 创建自定义generator的基本步骤

本节介绍一个自定义generator一般步骤,在4.3小节中我们将在本节基础上进一步完成我们的生成器。

4.2.1 创建 generator 目录

首先,我们需要创建一个目录,用于存放 generator 的代码和资源。在命令行工具中,输入以下命令:

mkdir generator-my-generatorcd generator-my-generator

这将创建一个名为 generator-my-generator 的目录,并将当前工作目录切换到该目录。

4.2.2 初始化 npm 项目

在 generator 目录中,我们需要初始化一个 npm 项目。输入以下命令:

pnpm init
# or
npm init -y

然后在 package.json文件中修改 name字段。该字段表示项目名。作为一个 generator 的项目名称必须以 generator- 开头,例如 generator-my-generator

4.2.3 安装 Yeoman 依赖

创建 generator 时,我们需要安装 Yeoman 和相关依赖。输入以下命令:

pnpm add yeoman-generator

这将安装 yeoman-generator 包,并将其添加到 package.json 文件的依赖中。

4.2.4 创建子生成器

在 generator 目录中,创建一个名为 generators 的目录。然后,在该目录中创建一个名为 app 的子目录。在 app 子目录中,创建一个名为 index.js 的文件,用于定义子生成器的行为和选项。在 index.js 文件中,输入以下代码:

const Generator = require('yeoman-generator');

module.exports = class extends Generator {
  prompting() {} // 在其中添加与用户的交互代码
  writing() {}   // 在其中添加生成文件的代码
  install() {}   // 在其中添加安装依赖的代码
  end() {}       // 在其中添加生成器结束时的代码
};

这在 4.3 生成器行为选项 中有详细的例子。

4.2.5 创建模板文件

在 generator 目录中,创建一个名为 templates 的目录。然后,在该目录中添加模板文件,如 HTML、CSS、JavaScript 等。在生成项目时,这些模板文件将根据用户输入的信息进行替换,并输出到目标目录。

4.2.6 编写生成器逻辑

在子生成器的 index.js 文件中,编写生成器逻辑。这包括与用户的交互、生成文件、安装依赖等操作。例如,我们可以使用 this.prompt() 方法与用户交互,使用 this.fs.copyTpl() 方法生成文件,使用 this.npmInstall() 方法安装依赖等。

4.2.7 测试生成器

在开发过程中,我们需要不断测试生成器,以确保其正常工作。为了方便测试,我们可以在本地安装生成器。在命令行工具中,输入以下命令:

pnpm link
# or
npm link

这将在全局范围内安装生成器,使其可以在任何位置使用。然后,在测试项目中,使用以下命令运行生成器:

yo my-generator

如果生成器正常工作,我们可以继续优化和完善其功能。

4.2.8 发布生成器

在完成生成器开发后,我们可以将其发布到 npm。首先,确保 package.json 文件中的信息正确无误。然后,在命令行工具中,输入以下命令:

npm publish

这将将生成器发布到 npm,使其他用户可以安装和使用。

通过以上步骤,我们创建了一个自定义 Yeoman generator。在实际项目中,我们可以根据需求创建多个子生成器,以生成不同类型的文件和代码。此外,我们还可以使用 Yeoman 提供的 API 和插件,以实现更多功能。

4.3 生成器行为选项

在上一小节中,我们介绍了自定义 Yeoman generator 的基本步骤。现在,让我们详细介绍如何使用 yeoman-generator 模块来创建一个功能丰富的自定义 generator。

yeoman-generator 模块提供了一系列 API 和工具,用于简化生成器的开发过程。在本小节中,我们将介绍以下几个重要的功能:

4.3.1 prompting:用户交互

与用户交互是生成器的核心功能之一。yeoman-generator 模块提供了 this.prompt() 方法,用于获取用户输入的信息。例如,我们可以在 prompting() 方法中添加以下代码:

async prompting() {
  const answers = await this.prompt([
    {
      type: 'input',
      name: 'name',
      message: '你的项目名',
      default: this.appname // 默认值为当前目录名
    },
    {
      type: 'confirm',
      name: 'typescript',
      message: '您想要在项目中使用TypeScript吗?'
    }
  ]);

  this.log('项目名:', answers.name);
  this.log('typescript:', answers.typescript);
}

上述代码将向用户显示两个问题:项目名称和是否启用 Typescript 编写项目。用户输入的答案将被存储在 answers 对象中,供后续使用。

4.3.2 writing:生成文件

生成文件 是生成器的另一个核心功能。yeoman-generator 模块提供了 this.fs 对象,用于处理文件的读写操作。例如,我们可以在 writing() 方法中添加以下代码:

writing() {
  this.fs.copyTpl(
    this.templatePath('index.html'),
    this.destinationPath('public/index.html'),
    { title: '一个Yeoman应用' }
  );
}

上述代码将从 templates 目录中读取 index.html 文件,替换其中的变量(如 title),然后将结果写入到目标目录(如 public/index.html)。

4.3.3 install:安装依赖

在生成项目时,我们通常需要安装一些依赖包。yeoman-generator 模块提供了 this.npmInstall() 方法,用于安装 npm 依赖。例如,我们可以在 install() 方法中添加以下代码:

install() {
  this.npmInstall(
    ['lodash', 'jquery'], { 'save-dev': true });
}

上述代码将安装 lodashjquery 两个依赖包,并将它们添加到 package.json 文件的 devDependencies 中。

4.3.4 end:生成器结束

在生成器结束时,我们可以执行一些清理或提示操作。yeoman-generator 模块提供了 this.log() 方法,用于输出信息。例如,我们可以在 end() 方法中添加以下代码:

end() {
  this.log('全部完成!');
}

上述代码将在生成器结束时,向用户显示一条友好的提示信息。

通过以上功能,我们可以创建一个功能丰富的自定义 Yeoman generator。在实际项目中,我们还可以根据需求使用其他 yeoman-generator 模块提供的 API 和工具,以实现更多功能。同时,我们可以使用 Yeoman 生态系统中的插件和扩展,进一步提高生成器的效率和可用性。

4.4 在 generator 中使用模板引擎

在自定义的 Yeoman generator 中,我们可以使用模板引擎(如 EJS、Handlebars)生成文件,从而实现更加灵活和强大的功能。在本小节中,我们将介绍如何在 generator 中使用 EJS 和 Handlebars 模板引擎生成文件。

4.4.1 使用 EJS 模板引擎

首先,我们需要安装 EJS 模板引擎:

pnpm install ejs

接下来,在 generator 的 templates 目录中,创建一个名为 index.ejs 的模板文件,并添加如下内容:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title><%= title %></title>
</head>
<body>
  <h1>Welcome to <%= projectName %>!</h1>
  <% if (cool) { %>
    <p>This is a cool project!</p>
  <% } %>
</body>
</html>

在 generator 的 writing 阶段,我们可以使用 this.fs.copyTpl() 方法将模板文件转换为实际的 HTML 文件:

writing() {
  this.fs.copyTpl(
    this.templatePath('index.ejs'),
    this.destinationPath('public/index.html'),
    {
      title: 'My App',
      projectName: this.answers.name,
      cool: this.answers.cool
    }
  );
}

4.4.2 使用 Handlebars 模板引擎

首先,我们需要安装 Handlebars 模板引擎:

npm install handlebars

接下来,在 generator 的 templates 目录中,创建一个名为 index.hbs 的模板文件,并添加如下内容:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>{{title}}</title>
</head>
<body>
  <h1>Welcome to {{projectName}}!</h1>
  {{#if cool}}
    <p>This is a cool project!</p>
  {{/if}}
</body>
</html>

在 generator 的 writing 阶段,我们需要使用 Handlebars 的 compile() 方法将模板文件转换为实际的 HTML 文件:

const Handlebars = require('handlebars');
const fs = require('fs');

writing() {
  const template = this.fs.read(this.templatePath('index.hbs'));
  const compiledTemplate = Handlebars.compile(template);
  const output = compiledTemplate({
    title: 'My App',
    projectName: this.answers.name,
    cool: this.answers.cool
  });

  this.fs.write(this.destinationPath('public/index.html'), output);
}

通过以上步骤,我们在自定义的 Yeoman generator 中成功使用了 EJS 和 Handlebars 模板引擎生成文件。在实际项目中,我们可以根据需求选择合适的模板引擎,以实现更加灵活和强大的功能。

5. 发布和使用自定义 generator

在创建了自定义的 Yeoman generator 之后,你当然可以使用 pnpm 或者npm 的 lint 命令,以方便自己在本地中使用。不过我们该可以考虑将其发布到 npm 仓库,以便其他开发者可以方便地安装和使用。在本小节中,我们将介绍如何发布和使用自定义 generator,其实这和发布一个其它普通的npm包是一样的。

5.1 发布自定义 generator

在发布自定义 generator 之前,我们需要确保已安装并配置好 npm。接下来,按照以下步骤发布 generator:

  1. 在 generator 项目根目录中,打开 package.json 文件,确保 name 字段以 generator- 为前缀,例如 generator-myapp。这是 Yeoman 识别 generator 的标准命名规范。

  2. 确保 version 字段已设置为一个合适的版本号,例如 1.0.0

  3. 在项目根目录中,运行以下命令登录 npm:

npm login

输入您的 npm 用户名、密码和邮箱地址。

  1. 登录成功后,运行以下命令发布 generator:
npm publish

此命令将把 generator 打包并发布到 npm 仓库。

其实更简单地,你也可以直接使用 publish 命令,如果你还没有登陆,会引导你打开浏览器登陆后获得权限,授权给npm会话,完成你的登陆过程。

5.2 使用自定义 generator

在发布了自定义 generator 之后,我们自己或者其他开发者就都可以通过以下步骤安装和使用它了:

  1. 在命令行中,运行以下命令安装自定义 generator:
npm install -g generator-myapp

generator-myapp 替换为实际的 generator 名称。

  1. 在项目目录中,运行以下命令启动自定义 generator:
yo myapp

myapp 替换为实际的 generator 名称。

  1. 根据提示输入相关信息,generator 将自动生成项目文件。

通过以上步骤,我们成功发布了自定义的 Yeoman generator,并在其他项目中使用了它。

6. 结语

Yeoman 与 前端专门化的CLI,如 Vue CLI 等不同,Yeoman 本质其实是一个制作 CLI 的工具,或者说是 CLI 框架 本文仅仅是介绍了 Yeoman 的基本用法,在本文之后你还需要有大量的工程实践。

Yeoman 辅助实现 前端工程化 时,我们还需要各种工具。比如使用 Yeoman 集成代码质量工具,如 ESLint、Prettier。

我们也可以多逛逛 https://yeoman.io/generators/ 寻找对我们有用的现成的生成器,完成特定的工作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

torch.optim.lr_scheduler.OneCycleLR 学习与理解

一、功能和参数 1.1、通过图像直观地理解 OneCycleLR 的过程&#xff1a; 补充&#xff1a; 生成该图像的代码&#xff1a; 来自&#xff1a;torch.optim.lr_scheduler.OneCycleLR用法_dxz_tust的博客-CSDN博客 import cv2 import torch.nn as nn import torch from torchv…

Nodejs二、内置模块

零、文章目录 Nodejs二、内置模块 1、fs 文件系统模块 &#xff08;1&#xff09;fs 文件系统模块是什么 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 fs.readFile() &#xff1a;用来读取指…

【深度学习-第2篇】CNN卷积神经网络30分钟入门!足够通俗易懂了吧(图解)

网络上有着很多关于CNN入门的教程&#xff0c;但是总还是觉得缺少足够简易、直观、全面的文章&#xff0c;能让人通读下来酣畅淋漓&#xff0c;将CNN概念尽收囊中。本篇文章就想尝试一下&#xff0c;真正地带小白同学们轻松入门。 这篇文章包含很多图片&#xff0c;为了花这些…

k8s-containerd容器运行时默认50G存储位置更换

containerd作为k8s主要的cri&#xff0c;它默认存储位置是使用的/根目录挂载的资源。当容器运行的越来越多&#xff0c;默认的50G不够使用了。有2种方法可以进行解决。 方式1、增加/根分区的磁盘空间。 方式2、修改containerd配置文件&#xff0c;修改默认配置为/home 这里我…

【汤4操作系统】深入理解信号量的使用-三大问题的变体

主要从生产者消费者、读写者、哲学家问题中的经典变体进行讲述&#xff0c;均使用伪代码实现 生产者消费者变体 顾客看作是生产出的产品&#xff0c;理发师看作是消费者&#xff0c;沙发有空位&#xff0c;顾客就进去&#xff0c;沙发有顾客&#xff0c;理发师就去理发 和生产者…

Redis客户端 - Jdies快速入门

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis客户端 - Jdies快速入门 | CoderMast编程桅杆Redis客户端 - Jdies快速入门 简介 Jedis is a Java client for Redis designed for performance and ease of use. Jedis是Redis 的 Java 客户端&#xff0c;专为性能和易…

Python中使用matplotlib绘制各类图表示例

折线图 折线图是一种用于表示数据随时间、变量或其他连续性变化的趋势的图表。通过在横轴上放置时间或如此类似的连续变量&#xff0c;可以在纵轴上放置数据点的值&#xff0c;从而捕捉到数据随时间发生的变化。折线图可以用于比较不同变量的趋势&#xff0c;轻松地发现不同的…

不写代码如果解决Jmeter跨线程组取参数值问题?

目录 前言 定义属性法 文件转接法 总结&#xff1a; 前言 如果你工作中已经在用jmeter做接口测试&#xff0c;或性能测试了&#xff0c;你可能会遇到一个麻烦。 那就是jmeter的变量值不能跨线程组传递。 看&#xff0c;官方就已经给出了解释&#xff1a; 这个不是jmeter的…

机器学习——识别足球和橄榄球

一、选题的背景 橄榄球起源于足球&#xff0c;二者即相似又有所区别。计算机技术发展至今&#xff0c;AI技术也有了极大的进步&#xff0c;通过机器学习不断的训练&#xff0c;AI对于足球和橄榄球的识别能力可以帮助人们对足球和橄榄球的分辨。机器学习是一种智能技术&#xff…

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql

文章目录 一、问题引入 二、问题分析 三、问题解决 ​四、总结 一、问题引入 今天是学习谷粒商城的第一天&#xff0c;既然是第一天&#xff0c;肯定就是先对项目先有个基本的了解&#xff0c;比如是项目所用到的技术栈&#xff0c;项目整体的架构等&#xff0c;还对分布…

操作系统闲谈09——内存管理算法

操作系统闲谈09——内存管理算法 Buddy伙伴系统 假设存在一段连续的页框&#xff0c;阴影部分表示已经被使用的页框&#xff0c;现在需要申请一个连续的5个页框。这个时候&#xff0c;在这段内存上不能找到连续的5个空闲的页框&#xff0c;就会去另一段内存上去寻找5个连续的页…

华为OD机试真题B卷 JavaScript 实现【乱序整数序列两数之和绝对值最小】,附详细解题思路

一、题目描述 给定一个随机的整数&#xff08;可能存在正整数和负整数&#xff09;数组 nums&#xff0c;请你在该数组中找出两个数&#xff0c;其和的绝对值(|nums[x]nums[y]|)为最小值&#xff0c;并返回这个两个数&#xff08;按从小到大返回&#xff09;以及绝对值。 每种…

Android 行业就业难! 我是否该负重前行~

不知从何时开始&#xff0c;互联网市场岗位开始以收缩趋势进行发展&#xff0c;使得不少互联网行业的从业者面临者工作难找的难题&#xff0c;对于我们开发人群来说很不友好。 以前可以靠着跳槽实现涨薪梦&#xff0c;而如今是能不动就不动&#xff0c;能稳住是最好。 为什么这…

Docker——安装MySQL

一、安装并拉取MySQL镜像 先把docker启动起来 systemctl restart docker systemctl status docker 安装MySQL docker search mysql拉取镜像&#xff0c; 如果拉取不成功或者显示超时&#xff0c;可以去配置加速镜像源。 二、查看本地镜像并启动MySQL 但是光有镜像没有把镜像…

Redis面试之数据类型及底层原理

废话不多说直接上类型 string&#xff08;字符串&#xff09; hash&#xff08;哈希&#xff09; list&#xff08;列表&#xff09; set&#xff08;集合&#xff09; zset&#xff08;有序集合&#xff09; stream&#xff08;流&#xff09; geospatial&#xff08;地…

CRM软件有哪些?这9款值得推荐

业内有一句流传已久的话&#xff1a;你的左手不知道你的右手在做什么。同一个企业内部&#xff0c;不同部门之间往往存在信息不同步&#xff0c;数据不对称的情况&#xff0c;比如销售和营销部门关于某个市场活动所带来的效果产生分歧。CRM软件的存在就可以解决这类问题。 在正…

实验4 Cache性能分析【计算机系统结构】

实验4 Cache性能分析【计算机系统结构】 前言推荐实验四 Cache性能分析1 实验目的2 实验平台3 实验内容和步骤3.1 Cache容量对不命中率的影响3.2 相联度对不命中率的影响3.3 Cache块大小对不命中率的影响3.4 替换算法对不命中率的影响 4 实验总结与心得5 请思考 最后 前言 202…

8年测试工程师分享,我是怎么开展性能测试的(基础篇)

第一节 测试的一般步骤 性能测试的工作是基于系统功能已经完备或者已经趋于完备之上的&#xff0c;在功能还不够完备的情况下没有多大的意义&#xff08;后期功能完善上会对系统的性能有影响&#xff0c;过早进入性能测试会出现测试结果不准确、浪费测试资源&#xff09;&…

足不出户怎么在家赚钱,暑假在家别闲着,给自己赚点生活费吧

在当今快节奏的现代生活中&#xff0c;人们面临着越来越大的竞争压力。为了过上舒适的生活、提前退休、创业或增加收入&#xff0c;许多人都希望能够在家中赚钱。那么&#xff0c;在家里如何可以找到赚钱的项目呢&#xff1f;本文将为您详细介绍一些方法。 一、在家工作有很多好…

《计算之魂》读书笔记——第2章,从递推到递归

我们人类的固有思维方式常常是出于直观的&#xff0c;由近及远、从少到多&#xff0c;这样的思维方式让我们很容易理解具体的事物&#xff0c;却也限制了我们的抽象思维&#xff0c;所以当我们理解远离我们生活经验的事物时&#xff0c;就容易出现障碍。我们人类这种自底向上、…