【ECMAScript 从入门到进阶教程】第四部分:项目实践(项目结构与管理,单元测试,最佳实践与开发规范,附录)

news2024/10/5 20:22:36

第四部分:项目实践

第十四章 项目结构与管理

在构建现代 Web 应用程序时,良好的项目结构和管理是确保代码可维护性、高效开发和部署成功的关键因素。这一章将深入讨论项目初始化与配置,以及如何使用构建工具来简化和优化项目建设过程。

14.1. 项目初始化与配置

一个良好的项目开头是确保以后工作顺利进行的基础。以下是一些初始设置的关键步骤和细节。

14.1.1 项目初始化
  1. 创建项目目录:

    首先需要在你的计算机上创建一个新的目录来存放你的项目代码。建议使用相关的名字进行命名,便于识别与管理。

    mkdir my-project
    cd my-project
    

    使用 mkdircd 命令分别创建项目目录并进入该目录。

  2. 初始化版本控制系统:

    初始化一个 Git 仓库,以便跟踪项目文件的变更历史并进行版本管理。这对于团队协作和项目备份极为重要。

    git init
    
    • git init:初始化一个新的本地 Git 仓库。
  3. 使用 Package Manager:

    使用 Node.js 提供的包管理器如 npm(Node 包管理器)或 yarn 来初始化项目。包管理器的主要作用是帮助管理和安装项目依赖(如第三方库)并设置基础的项目结构。

    npm init -y
    
    • npm init -y:快速创建一个默认的 package.json 文件,自动填写默认值。

    package.json 是项目的元数据文件,它包含了项目名称、版本、描述、项目入口文件、依赖项等信息。

14.1.2 设置项目结构

一个规范化的项目结构可以让代码更易于阅读、维护和扩展。以下是常见的项目目录结构:

/my-project
  /src
    index.js
  /dist
  package.json
  • src:存放源代码的目录。

    • index.js:通常作为项目的入口文件。
  • dist:存放编译或构建后的输出文件的目录。

    dist 目录用于生产环境下的部署,存储动态或静态资源文件。

14.1.3 基本配置

package.json 文件中,可以配置项目的一些基本信息和脚本:

{
  "name": "my-project",        // 项目名称
  "version": "1.0.0",          // 项目版本号
  "scripts": {                 // 定义可以运行的项目脚本
    "start": "webpack serve --open",  // 启动开发服务器
    "build": "webpack --mode production" // 构建项目
  },
  "dependencies": {},          // 项目运行时的依赖
  "devDependencies": {}        // 项目开发时的依赖
}

知识点

  • scripts:用于定义自定义命令简化项目重复任务。例如,start 可用于启动应用程序的开发环境,build 用于生产构建。
  • dependencies vs devDependencies
    • dependencies:项目在生产环境中运行所必需的包。
    • devDependencies:仅在开发时需要的包,如构建工具、测试框架等。

通过以上步骤,你便为你的 JavaScript 项目创建了良好的基础。这种初始化不仅能组织你的代码库,还能提升项目的可维护性和可拓展性,是现代开发工作的标准流程之一。

14.2. 使用构建工具(如 Webpack,Babel)

现代 JavaScript 开发中,使用构建工具是必不可少的。它能够帮助简化复杂的开发和部署过程,提高开发效率和性能。掌握这些工具使得我们能更轻松地处理代码打包、转换、优化、模块化管理等任务。

14.2.1. Webpack

Webpack 是一个模块打包器,最常用于打包前端资源。它能够将项目中的 JavaScript、CSS、图片等资源打包成一个或多个文件,以便在生产环境中使用。

基本使用方法:

  1. 安装 Webpack:

    使用 npm(Node Package Manager)安装 Webpack 及其命令行工具:

    npm install --save-dev webpack webpack-cli
    

    知识点

    • npm 是 Node.js 的包管理工具,--save-dev 表示将包作为开发依赖安装。
  2. 配置文件(webpack.config.js):

    Webpack 的行为通过配置文件来控制。以下是一个简单的 Webpack 配置例子:

    const path = require('path'); // Node.js 内置模块,用于处理文件路径
    
    module.exports = {
      entry: './src/index.js', // 应用程序的入口文件
      output: {
        filename: 'bundle.js', // 输出的文件名
        path: path.resolve(__dirname, 'dist') // 输出目录的绝对路径
      },
      module: {
        rules: [
          {
            test: /\.js$/, // 正则匹配 JavaScript 文件
            exclude: /node_modules/, // 排除 node_modules 目录
            use: 'babel-loader' // 使用 Babel 加载器进行转译
          }
        ]
      }
    };
    

    知识点

    • entry:定义打包的入口文件。
    • output:配置输出文件的路径和名称。
    • module.rules:定义模块规则,比如如何处理不同类型的文件。
  3. 运行 Webpack:

    在命令行中使用以下命令构建项目:

    npx webpack --config webpack.config.js
    

    知识点

    • npx 是 npm 5.2.0+ 提供的命令,用于调用本地安装的 Node.js 包。
14.2.2. Babel

Babel 是一个 JavaScript 编译器,其主要功能是将 ECMAScript 2015+ 代码转换为向下兼容的 JavaScript 版本,以在各种浏览器中正常运行。

  1. 安装 Babel:

    安装 Babel 核心和基本预设:

    npm install --save-dev @babel/core @babel/preset-env babel-loader
    

    知识点

    • @babel/core:Babel 的核心包。
    • @babel/preset-env:用于智能地转换最新的 JavaScript 语法到特定的目标浏览器版本。
  2. 创建 Babel 配置文件(.babelrc):

    配置 Babel 使用的预设和插件,通过 .babelrc 文件:

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

    知识点

    • presets:Babel 的预设配置,@babel/preset-env 可以根据目标环境自动选择所需的插件。
  3. 与 Webpack 集成

    在 Webpack 的配置中使用 Babel,确保在构建过程自动转换代码:

    • babel-loader 作为加载器,结合 Webpack 将带有新特性和语法的 JavaScript 转换为兼容版本。

总结

通过这些配置和工具的使用,可以有效管理项目的资源和依赖,以及提高项目的开发和构建效率。掌握 Webpack 和 Babel 的使用将帮助开发人员更高效地管理复杂的现代 JavaScript 项目。拥有这些工具的知识是现代前端开发人员的基本技能。

第十五章 单元测试

单元测试是一种对软件来源代码的单独模块进行测试的过程,目的是验证每个模块的行为是否符合预期。对 JavaScript 项目进行有效的单元测试是实现稳定、可维护代码的关键环节。

15.1. 测试框架(如 Jest,Mocha)

选择合适的测试框架可以帮助我们简化测试流程,提高测试的易用性与可读性。在现代 JavaScript 应用程序开发中,进行自动化测试是确保代码质量的关键过程。

Jest

Jest 是由 Facebook 开发的一个功能强大且易于使用的 JavaScript 测试框架。它内置了对处理异步代码、快照测试和覆盖报告的良好支持,被广泛用于 React 项目。

  • 特点
    • 易于上手,开箱即用:Jest 安装简单,配置默认即已符合大多数项目需求。
    • 内置代码覆盖率工具:Jest 内置生成代码覆盖报告的工具,帮助开发者快速识别未覆盖的代码。
    • 强大的快照测试:支持 UI 组件的快照测试,用于检测 UI 的意外变更。

Mocha

Mocha 是一个灵活、功能丰富的 JavaScript 测试框架,适用于 Node.js 和浏览器环境。与 Jest 不同,Mocha 需要一些额外的库(如 Chai)来进行断言。

  • 特点
    • 支持异步测试:提供灵活的异步测试处理机制,使用回调或 Promise。
    • 中间件式架构,易于扩展:通过插件机制可以轻松扩展其功能。
    • 多种断言库兼容:可以与 Chai、Should.js 等多种断言库配合使用,增强灵活性。

范例使用

  • Jest 基本使用

    安装 Jest 并编写简单测试:

    npm install --save-dev jest
    

    package.json 中添加测试脚本,这样可以通过 npm test 命令运行 Jest:

    {
      "scripts": {
        "test": "jest"
      }
    }
    

    创建一个简单函数 sum.js 文件:

    function sum(a, b) {
      return a + b; // 返回两个数的加和
    }
    module.exports = sum;
    

    创建一个对应的测试文件 sum.test.js

    const sum = require('./sum');
    
    test('adds 1 + 2 to equal 3', () => {
      expect(sum(1, 2)).toBe(3); // 断言函数:判断 sum(1, 2) 是否等于 3
    });
    

    运行测试:

    npm test
    

    知识点

    • test 函数:Jest 中的全局方法,定义一个测试用例。
    • expect 和匹配器:用于定义期望条件,.toBe() 是常用匹配器之一。
  • Mocha & Chai 基本使用

    安装 Mocha 和 Chai:

    npm install --save-dev mocha chai
    

    创建测试文件 sum.spec.js

    const sum = require('./sum');
    const { expect } = require('chai'); // 从 Chai 引入 expect
    
    describe('Sum function test', function() {
      it('should add 1 + 2 to equal 3', function() {
        expect(sum(1, 2)).to.equal(3); // 使用 Chai 进行断言
      });
    });
    

    package.json 中添加测试脚本:

    {
      "scripts": {
        "test": "mocha"
      }
    }
    

    运行测试:

    npm test
    

    知识点

    • describe:用于分组测试用例,提高可读性。
    • it:定义具体的测试用例。
    • expect 断言:用于书写期望的结果,.to.equal() 是 Chai 的断言方法之一。

选择测试框架通常取决于项目需求。Jest 适合快速上手、开箱即用的项目,特别是涉及到 React 的开发。Mocha 则提供了更多灵活性和扩展性,适合需要自定义或具有复杂需求的测试环境。

15.2. 编写测试用例与测试驱动开发

测试是确保代码质量的关键环节。在编写测试用例和应用测试驱动开发(TDD)时,开发者能够更好地捕捉潜在的错误和提升代码的可靠性。测试不仅帮助验证功能,还可以成为文档的一部分,说明模块和函数的预期行为。

15.2.1. 编写测试用例

编写测试用例的核心是确定函数或模块应该如何行为,并为这些行为撰写断言。良好的测试用例应能涵盖代码的边界、异常以及 edge case(边缘情况)。

编写测试用例时的考虑

  • 正常情况:测试函数在正常输入下是否产生预期结果。
  • 边缘条件:包括处理输入边界值(如空数组、极大数值等)。
  • 异常情况:测试函数如何处理无效输入或异常情况(如 null 输入或错误类型的参数)。
  • 性能:在某些情况下,测试还需要验证函数在执行特定操作时的性能。

示例:

想象我们要为一个 add 函数编写测试用例:

function add(a, b) {
  return a + b;
}

编写的测试用例可能包括:

describe('add function', () => {
  it('should return the sum of two positive numbers', () => {
    expect(add(1, 2)).toBe(3);
  });

  it('should return the sum of two negative numbers', () => {
    expect(add(-1, -2)).toBe(-3);
  });

  it('should handles zero correctly', () => {
    expect(add(0, 5)).toBe(5);
    expect(add(5, 0)).toBe(5);
  });

  it('should throw when a non-number is used', () => {
    expect(() => add('a', 2)).toThrow();
  });
});

知识点

  • 断言:使用断言库(如 Jest、Mocha)来验证实际输出和预期输出是否匹配。
  • 测试框架:JavaScript 常用的测试框架有 Jest、Mocha、Chai 等。
15.2.2. 测试驱动开发(TDD)

测试驱动开发(TDD)是一种软件开发过程,强调在编写实现功能代码之前,先创建对应的测试用例。TDD 旨在通过更早发现问题和设计缺陷,提高软件质量。

TDD 的好处

  1. 更可靠:在代码实现之前,明确需求和预期功能,减少功能偏差。
  2. 更可维护:在重构或调整代码时,现有测试用例提供了立即反馈并保持功能正确性。
  3. 提高信心:对现有功能更改或扩展时,测试用例能快速验证旧功能未被破坏。

TDD 基本步骤

  1. 编写一个失败的测试:编写一个测试用例,设计测试用例时需要定义预期行为。此时由于代码未实现或未通过,因此测试将失败。
  2. 实现代码以通过测试:编写最小量的代码来通过该测试。
  3. 重构:对实现的代码进行优化或重构,确保所有测试仍然通过。

示例:应用 TDD 编写一个简单函数

  1. 编写测试

    describe('multiply function', () => {
      it('should return the product of two numbers', () => {
        expect(multiply(2, 3)).toBe(6);
      });
    });
    
  2. 实现功能,使测试通过

    function multiply(a, b) {
      return a * b;
    }
    
  3. 重构代码

    观察是否可以优化代码,在此示例中,代码已较为简洁,但在复杂场景下,可能需要重构以提高可读性和性能。

掌握单元测试和 TDD 的技巧,有助于提高项目代码质量、减少错误以及简化后续的代码更新与维护过程。TDD 将测试作为开发过程的核心部分,使得开发者能更有计划和系统地进行编码。

第十六章 最佳实践与开发规范

在JavaScript开发中,遵循最佳实践和维护一致的代码风格不仅能够提高代码的可读性和可维护性,还能减少错误的可能性。ESLint等工具可以帮助我们自动化这些任务。此外,合理地应用ECMAScript最新特性能够增强代码质量和性能。以下是本章的详细内容:

16.1. 代码风格与 Lint 工具

代码风格和 Lint 工具在开发过程中扮演着重要角色,它们不仅提升了代码的可读性和可维护性,还帮助团队维持统一的编码标准。在 JavaScript 开发中,这些工具可以有效地减少代码审查中的人为错误。

16.1.1. 代码风格

代码风格是指代码的格式和编写规范,它决定了代码的外观和一致性。统一的代码风格是一种最佳实践,有助于团队合作和提高代码的可理解性。良好的代码风格可以避免讨论“代码长什么样子”,而是专注于“代码做了什么”。具体内容包括:

  • 缩进:使用两个空格代替 Tab,以确保在不同编辑器和查看器中的一致性。缩进是层级关系的直接体现。

  • 变量声明:始终使用 letconst 代替 var,因为它们提供了块级作用域和提升的行为更一致。

  • 命名约定:采用 camelCase(小驼峰式)命名法进行变量和函数命名,增强可读性和遵循 JavaScript 社区的惯例。

  • 尾随逗号:在多行对象或数组尾部使用逗号,可以减少在进行行编辑时的版本控制变更冲突。

  • 单引号 vs 双引号:在 JavaScript 中通常推荐使用单引号 ' ' 来包裹字符串,除非字符串本身包含单引号需要双引号来避免转义。

运用一致的代码风格,有助于团队的代码库在长期维护中保持清晰和一致。

16.1.2. Lint 工具

Lint 工具提供了自动化代码质量检查,标记出不符合代码风格或可能导致错误的代码片段。通过静态分析,Lint 工具可以帮助开发者在提交代码之前发现问题,减少了代码审查中的重复工作。

ESLint 是一个广泛使用的 JavaScript Lint 工具,它不仅检查代码格式,还可以检查代码中潜在的逻辑错误。借助 ESLint,开发团队可以定义一套完整的规则,并确保代码在任何情况下都一致和合理。

使用 ESLint 的基本步骤:
  1. 安装 ESLint
    使用 npm(Node Package Manager) 安装 ESLint 到项目的开发依赖中。

    npm install eslint --save-dev
    
  2. 初始化 ESLint 配置
    通过命令行运行 ESLint 初始化命令,生成配置文件(如 .eslintrc.js)。该命令会询问一些有关项目结构和规则的配置需求。

    npx eslint --init
    

    配置文件中,你可以扩展已有规则或者自定义属于你的团队规则。

  3. 运行 ESLint 检查代码
    使用 ESLint 来检查指定文件或目录内的代码中的风格和语法问题。

    npx eslint yourfile.js
    

插件和共享配置

  • 插件:ESLint 插件可以是特定框架(如 React, Vue)的代码风格检查扩展。

  • 共享配置:许多组织(如 Airbnb, Google)已创建了流行的代码风格指南,ESLint 提供了共享配置支持,可以很容易地引用这些配置。

通过这种工具集成,项目代码质量和一致性得到显著提升,开发者能专注于业务逻辑和项目实现,而不是细节的代码风格问题,从而提高开发效率。

16.2. ECMAScript 最新特性合理应用

随着 ECMAScript 的持续发展,每年发布的新特性不断增强 JavaScript 的能力,为开发者提供了更直观和高效的编程方式。合理应用这些特性是现代 JavaScript 开发的重要组成部分。

16.2.1 可选链(Optional Chaining)

可选链操作符 ?. 用于简化安全访问嵌套对象属性的代码,避免在访问链中某个中间属性不存在时抛出 TypeError: Cannot read property '...' of undefined 的问题。它可以使代码更具鲁棒性。

const user = {};
// 使用 ?. 访问对象嵌套属性,如果某个属性不存在,返回 undefined,而不是抛出错误。
console.log(user?.profile?.bio); // 输出: undefined

知识点

  • 安全访问:使用 ?. 操作符可以避免未定义属性访问导致的运行时错误。
  • 链式访问?. 可以在属性访问、方法调用、数组元素访问等场景使用。
16.2.2 空值合并(Nullish Coalescing)

空值合并运算符 ?? 提供了一种安全赋予默认值的方法,该操作符在遇到 nullundefined 时会返回右侧的操作数。与 || 不同的是,?? 只在前者为 nullundefined 时才生效,不包括诸如 0'' 等 falsy 值。

const foo = null ?? 'default string';
console.log(foo); // 输出: "default string"

// 不会触发合并,因为 '' 是 falsy 但不为 null/undefined
const bar = '' ?? 'default string';
console.log(bar); // 输出: ''

知识点

  • 与逻辑或 || 的区别:逻辑或会处理所有的 falsy 值,而 ?? 只处理 nullundefined
16.2.3 Async/Await

自从 ES2017 引入 asyncawait,异步操作能够以同步方式书写,极大提高了代码的可读性和可维护性。相比于复杂的回调函数或 .then() 链,这种方式更为直观。

async function fetchData() {
  try {
    // 异步请求,通过 await 等待 Promise 解析
    const response = await fetch('https://api.example.com/data');
    const data = await response.json(); // 再次等待响应数据解析为 JSON
    return data;
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

知识点

  • 同步化异步代码await 暂停 async 函数的执行,直到 Promise 解决为止。
  • 错误处理:可以使用 try...catch 进行错误捕获,就像普通的同步代码一样。
16.2.4 模板字符串(Template Literals)

模板字符串(由反引号包裹)替代传统的字符串连接方式,可以在字符串中嵌入表达式和多行文本,使插值操作更直观。

const name = "Alice";
console.log(`Hello, ${name}!`); // 输出: Hello, Alice!

const greeting = `Hi ${name},
Welcome to ECMAScript!`; 
console.log(greeting);
/*
输出:
Hi Alice,
Welcome to ECMAScript!
*/

知识点

  • 插值表达式:使用 ${} 可以在字符串中动态插入变量和表达式。
  • 多行字符串:无需使用换行符 \n,自然支持跨行文本。

运用这些 ECMAScript 的现代特性可以编写出更简洁、高效的代码。通过遵循一致的代码风格和使用 Lint 工具,我们能进一步提升代码的质量和团队协作的效率。建议开发者始终关注新的 ECMAScript 提案,因地制宜地应用于项目以保持技术领先。

附录

常见问题解答
  1. JavaScript 和 ECMAScript 有什么区别?

    • JavaScript 是一种编程语言,而 ECMAScript 是定义 JavaScript 语言的标准。现代 JavaScript 实现通常遵循 ECMAScript 规范。
  2. 如何处理异步操作?

    • 现代 ECMAScript 提供了多种方式来处理异步操作,包括回调函数、Promise 和 async/await。
  3. 什么是闭包,它们有什么作用?

    • 闭包是指函数以及函数可以访问的周边状态(即词法环境)的组合。它们允许函数访问并保留其词法作用域,即使函数在其原始作用域之外执行。
ECMAScript 规范与更新记录

ECMAScript 标准是由 ECMA 国际理事会(ECMA International)管理,并通过技术委员会 TC39 进行开发和更新。以下是有关 ECMAScript 规范更新的一些关键信息:

  1. ECMAScript 5 (ES5)

    • 发布于 2009 年,包括严格模式和 JSON 支持等特性。
  2. ECMAScript 2015 (ES6/ES2015)

    • 发布于 2015 年,引入 class、箭头函数、模块、letconst 等重大更新。
  3. ECMAScript 2016 (ES7)

    • 小更新,包括 Array.prototype.includes 和指数操作符(**)。
  4. ECMAScript 2017 (ES8)

    • 引入 async/await、Object.values/Object.entries 等实用功能。
  5. ECMAScript 2018 (ES9)

    • 包括异步迭代器、Promise.finally() 等。
  6. ECMAScript 2019 (ES10)

    • 引入 Array.prototype.flat/flatMap、Object.fromEntries 等。
  7. ECMAScript 2020 (ES11)

    • 包括可选链操作符(?.)、null 合并操作符(??)等。
  8. ECMAScript 最新版本

    • 每年6月发布新版本,最新版本可在 ECMA 网站和 GitHub 上的 tc39/proposals 仓库找到。

每年的新特性通常在 ECMAScript 提案阶段进行公开讨论、审查和调整,TC39 提案阶段从 Stage 0(待提出)到 Stage 4(最终提案)形成正式规范。了解最新特性和提案的过程,可以帮助开发者紧跟 ECMAScript 的发展潮流。

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

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

相关文章

EtherCAT 转 EtherNet/IP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899协议转换通信网关 EtherCAT 转 EtherNet/IP GW系列型号 MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关,为用户提供两…

突发!Meta重磅发布Movie Gen入局视频生成赛道!

引言 Meta于2024年10月4日首次推出 Meta Movie Gen,号称是迄今为止最先进的媒体基础模型。Movie Gen 由 Meta 的 AI 研究团队开发,在一系列功能上获取最先进的效果,包括:文生视频、创建个性化视频、精准的视频编辑和音频创作。 …

递归--C语言

1 递归定义 函数自己调用自己的过程,称为递归。 2 递归的必要条件 1.必须要有终止条件。达到条件就停止递归,退出函数。2.每次调用自己都要越来越接近这个终止条件。 因此写函数的时候,也分两部分 第一部分:写终止条件&#x…

点击按钮提示气泡信息(Toast)

演示效果&#xff1a; 目录结构&#xff1a; activity_main.xml(布局文件)代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http:…

【第三版 系统集成项目管理工程师】第15章 组织保障

持续更新。。。。。。。。。。。。。。。 【第三版】第十五章 组织保障 15.1信息和文档管理15.1.1 信息和文档1.信息系统信息-P5462.信息系统文档-P546 15.1.2 信息(文档)管理规则和方法1.信息(文档)编制规范-P5472.信息(文档)定级保护-P5483.信息(文档)配置管理-P549练习 15.…

38 文件包含(标准库头文件、自定义头文件)、相对路径与绝对路径、条件编译(#if、#ifdef、#if define、#ifndef)

目录 1 文件包含 1.1 #include 指令 1.2 包含标准库头文件 1.3 包含自定义头文件 1.3.1 使用相对路径 1.3.2 使用绝对路径 2 条件编译 2.1 #if … #endif 2.1.1 语法格式 2.1.2 功能说明 2.1.3 流程分析 2.1.4 案例演示&#xff1a;#if 0 ... #endif 2.1.5 案例演…

关于懒惰学习与渴求学习的一份介绍

在这篇文章中&#xff0c;我将介绍些懒惰学习与渴求学习的算法例子&#xff0c;会介绍其概念、优缺点以及其python的运用。 一、渴求学习 1.1概念 渴求学习&#xff08;Eager Learning&#xff09;是指在训练阶段构建出复杂的模型&#xff0c;然后在预测阶段运用这个构建出的…

分布式锁--redission 最佳实践!

我们知道如果我们的项目服务不只是一个实例的时候&#xff0c;单体锁就不再适用&#xff0c;而我们自己去用redis实现分布式锁的话&#xff0c;会有比如锁误删、超时释放、锁的重入、失败重试、Redis主从一致性等等一系列的问题需要自己解决。 当然&#xff0c;上述问题并非无…

3dsMax合并FBX的时候相同的节点会被合并(重命名解决),3Ds MAX创建空物体(虚拟对象或者点)

3dsMax合并FBX的时候相同的节点会被合并 3dsamax的文档&#xff0c;但是并没有说FBX的合并如何处理 https://help.autodesk.com/view/3DSMAX/2024/CHS/?guidGUID-98146EB8-436F-4954-8682-C57D4E53262A模型节点信息&#xff0c;yase&#xff0c;Points&#xff0c;Mesh 都是点…

【优选算法】(第二十一篇)

目录 外观数列(medium) 题目解析 讲解算法原理 编写代码 数⻘蛙&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 外观数列(medium) 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给定⼀个正整数n&#xff0…

openpnp - 坐标文件中的元件0角度如果和编带规定的角度不一样,需要调整贴片任务中的元件旋转角度

文章目录 openpnp - 坐标文件中的元件0角度如果和编带规定的角度不一样&#xff0c;需要调整贴片任务中的元件旋转角度笔记查看自己图纸中的封装的0角度方法贴片任务的角度值范围编带规定的0角度根据编带规定的元件0角度来调整贴片的元件旋转角度如果是托盘飞达备注备注END ope…

电脑失声,一招搞定

早已习惯了Edge浏览器的“大声朗读”功能&#xff0c;今天值班&#xff0c;值班室用的两台电脑只配有耳机&#xff0c;没有音箱&#xff0c;顿时感觉不适。 先找了一个带功放的老音箱&#xff0c;发现少了电箱到功放的音频线。 一顿搜索&#xff0c;在找到音频线的同时&#…

2024年计算机视觉与艺术研讨会(CVA 2024)

目录 基本信息 大会简介 征稿主题 会议议程 参会方式 基本信息 大会官网&#xff1a;www.icadi.net&#xff08;点击了解参会投稿等信息&#xff09; 大会时间&#xff1a;2024年11月29-12月1日 大会地点&#xff1a;中国-天津 大会简介 2024年计算机视觉与艺术国际学术…

基于SpringBoot+Vue+MySQL的装修公司管理系统

系统展示 管理员后台界面 员工后台界面 系统背景 随着信息技术的快速发展&#xff0c;装修行业正面临数字化转型的关键时刻。传统的装修管理方式存在信息管理混乱、出错率高、信息安全性差等问题&#xff0c;已无法满足现代市场的需求。因此&#xff0c;开发一套高效、便捷的装…

仿《11773手游》源码/手机游戏软件下载门户网站模板/帝国CMS 7.5

帝国CMS 7.5仿《11773手游》源码&#xff0c;手机游戏软件下载门户网站模板。简洁漂亮的手游下载网站模板&#xff0c;采用帝国CMS7.5核心&#xff0c;同步刷新M端。 该模板带同步生成插件&#xff0c;整站干净大气界面漂亮&#xff0c;简单不失简约&#xff0c;模板中的典范&…

css 简单网页布局(一)

1. 三种布局方式 1.1 标准流 1.2 浮动的使用 1.3 简述浮动 1.3.1 浮动三大特性 <style>.out {border: 1px red solid;width: 1000px;height: 500px;}.one {background-color: aquamarine;width: 200px;height: 100px;}.two {background-color: blueviolet;width: 200px;h…

Chromium 中JavaScript Fetch API接口c++代码实现(二)

Chromium 中JavaScript Fetch API接口c代码实现&#xff08;一&#xff09;-CSDN博客 接着上一篇继续介绍调用&#xff0c;上函数堆栈。 1、打开http://192.168.8.1/chfs/shared/test/test02.html 此标签进程ID12484&#xff0c; 2、打开vs附加上此进程ID12484 3、点击页面测…

华为 HCIP-Datacom H12-821 题库 (31)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1. 默认情况下&#xff0c;IS-IS Level-1-2 路由器会将 Level-2 区域的明细路由信息发布到Lev…

YOLOv8 基于NCNN的安卓部署

YOLOv8 NCNN安卓部署 前两节我们依次介绍了基于YOLOv8的剪枝和蒸馏 本节将上一节得到的蒸馏模型导出NCNN&#xff0c;并部署到安卓。 NCNN 导出 YOLOv8项目中提供了NCNN导出的接口&#xff0c;但是这个模型放到ncnn-android-yolov8项目中你会发现更换模型后app会闪退。原因…

【STM32 Blue Pill编程实例】-OLED显示HC-SR04超声波测距结果

OLED显示HC-SR04超声波测距结果 文章目录 OLED显示HC-SR04超声波测距结果1、HC-SR04超声波传感器介绍2、硬件准备及接线模块配置3.1 定时器配置3.2 OLED I2C接口配置3.3 HC-SR04引脚配置4、代码实现在本文中,我们将 HC-SR04 超声波传感器与 STM32 Blue Pill 开发板结合使用,并…