TS学习01 基本类型、编译选项、打包ts代码

news2024/11/26 2:43:58

TS学习

  • TypeScript
  • 00 概念
  • 01 开发环境搭建
  • 02 基本类型
    • 基本使用
    • ⭐类型
  • 03 编译选项
    • tsconfig.json
      • compilerOptions
      • 语法检查相关
  • 04 webpack打包ts代码
    • 错误解决
  • 05 babel

TypeScript

BV1Xy4y1v7S2学习笔记

00 概念

以 JavaScript 为基础构建的语言

一个 JavaScript 的超集

TypeScript扩展了JavaScript,并添加了类型

可以在任何支持JavaScript的平台中执行

  • TS不能被 JS解析器 直接执行。需要先把 TS 编译成 JS

TS 增加了什么?

类型、支持ES新特性、添加了ES不具备的新特性、丰富的配置选项(TS可以被编译为任何版本的 JS)、强大的开发工具

01 开发环境搭建

  1. 下载Node.js(TS需要编译为 JS,TS解析器是用 node写的

    • 64位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x64.msi
    • 32位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x86.msi
    • node -v 检测是否安装成功
  2. 安装Node.js

  3. 使用npm(node里面的包管理器)全局安装typescript

    • 进入命令行cmd
    • 输入:npm i -g typescript
    • tsc 命令,检测是否安装成功
    • 在这里插入图片描述
  4. 创建一个ts文件 (后缀名为 ts)

  5. 使用tsc对ts文件进行编译

    • 进入命令行

    • 进入ts文件所在目录

    • 执行命令:tsc xxx.ts

具体步骤:

在这里插入图片描述

02 基本类型

基本使用

基本使用:变量的声明+赋值

// (1)声明一个变量a,同时执行他的类型为number
let num1:number;
// a 的类型设置为 number,在以后的使用过程中 a 的值只能是数字

num1 = 10;
//  a = 'hello'; // 报错 不能将string类型给a

let num2:number = 20;

// (2)如果变量的【声明和赋值】是同时进行的,TS可以自动对变量进行类型检测
let a = true;
// a = 123 这样是会报错的

基本使用:在函数中使用

//(3)最好的使用场景是 函数中形参的类型
function sum(a, b) {
    return a+b;
}
console.log(sum(123, 456))
console.log(sum(123, '456')) //这样是不报错的

// 修改为
function sum(a:number, b:number) {
    return a+b;
}

// (4)函数返回值的类型
function sum3(a:number, b:number): number{
  return a + b;
}

⭐类型

自动类型判断

  • TS拥有自动的类型判断机制
  • 当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型
  • 所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明
类型例子描述
number1, -33, 2.5任意数字
string‘hi’, “hi”, hi任意字符串
booleantrue、false布尔值true或false
字面量其本身限制变量的值就是该字面量的值
any*任意类型
unknown*类型安全的any
void空值(undefined)没有值(或undefined)
never没有值不能是任何值
object{name:‘孙悟空’}任意的JS对象
array[1,2,3]任意JS数组
tuple[4,5]元素,TS新增类型,固定长度数组
enumenum{A, B}枚举,TS中新增类型
  • 字面量
let a:10;
a = 10;
// a = 11; // 报错:不能将类型“11”分配给类型“10”。
// 有点像常量

// 常用
// 使用 | 链接多个类型(联合类型)
let b: "male" | "false";
b = "male";
b = "false";

let c:boolean | string;
c = true;
c = "hello";
c = false;
  • any
// any表示的是任意类型
// 一个变量设置类型为 any 后相当于对该变量关闭了 TS 的类型检测
let d:any;

// 声明变量如果不指定类型,则TS解析器会自动判断变量的类型为any(隐式的any)
let d2;
d2 = 10;
d2 = 'hello';
d2 = true;
  • unknown
// unknown 表示未知类型的值
// 类型安全的any
// 不可以直接赋值给其他变量
let e: unknown;
e = 10;
e = 'hello';
e = true;

// 区别any类型的好处为:
let str:string; // string
let _a; // 隐式any
str = _a // 这样是不会报错的

// 但是如果使用unknown 就会报错
e = 'hello'
// str = e // 报错:不能将类型“unknown”分配给类型“string”。

// 不可以直接赋值给其他变量
// 解决方法一 
if(typeof e === 'string') {
  str = e
}

// 解决方法二 类型断言
str = e as string; // 告诉解析器e的实际类型

// 解决方法三 
str = <string>e
  • void & never
// void用来表示空
// 以函数为例,就表示没有返回值的函数
function fn(): void {

}

// never表示永远不会返回结果
function fn2(): never {
  throw new Error('报错了!')
}
// 函数不会返回结果,报错之后直接停止
  • object
let a :object; // 表示一个JS对象
a = {};
a = function() {};

// {}用来指定对象中可以包含哪些属性
// 语法:{属性名:属性值,属性名:属性值}
let b :{name: string}; 
b = {name:'haha'}

// 加问号?表示属性可选
let b2 :{name: string, age?:number}; 
b2 = {name:'孙悟空'}
b2 = {name:'孙悟空',age: 18}

// [propName : string] : any表示任意类型的属性
// propName:string表示 【属性名:字符串】,JS中的属性名都是字符串
// propName 自己起名
// [propName:string] 表示任意字符串属性名
// any 任意类型
let c: {name:string,[propName:string]:any};
c = {name:'猪八戒',age:18, gender:'男'}

/**
 * 设置函数结构的类型声明
 *   语法:(形参:类型,形参:类型...) => 返回值
 */
// 声明函数
// 函数有两个参数,都是 number 类型
// 返回值也是number类型
let d:(a:number, b:number) => number;
d = function(n1,n2) :number{
  return n1+n2
}
  • array
/**
 * 数组的类型声明
 *           类型[]
 *           Array<类型>
 */
// string表示字符串数组
let e: string[]; 
let g: Array<number>;

e = ['a','b','c']
g = [1, 2, 3]
  • 元组
// 元组,元组就是固定长度的数组
/**
 * 
 * 语法 [类型,类型, ...]
 */
let h : [string, string]
h = ['hello', 'abc']

let h2 : [string, number]
h2 = ['hello', 234]

let h3 : [string, number, string]
h3 = ['hello', 234, 'world']
  • enum枚举
let i: {name: string, gender: string};
i = {
  name: '孙悟空',
  gender: '男'
}
console.log(i.gender === '男');


// 因为性别只有两种,所以可以使用 枚举类
enum Gender {
  Male,
  Female
}

let i2: {name: string, gender: Gender};
i2 = {
  name: '孙悟空',
  gender: Gender.Male
}

console.log(i2.gender === Gender.Female);
console.log(i2.gender === Gender.Male);
  • ‘或’ 和 ‘与’
let j: string | number;
let j2: string & number; // 这种写法本身就是错的,一个变量不可能同时满足两个类型

let obj: {name:string} & {age:number};
obj = {name:'孙悟空', age: 19}
  • 类型别名
let k: 1|2|3|4|5;
let l: 1|2|3|4|5;

type myType = string
let m: myType

type myType2 = 1|2|3|4|5;
let k2: myType2;
let l2: myType2;

03 编译选项

1、自动编译文件

编译文件时,使用 -w 指令后,TS编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译。

示例 tsc xxx.ts -w

2、自动编译整个项目

直接使用tsc指令 tsc -w,则可以自动将当前项目下的所有ts文件编译为js文件。但是能直接使用tsc命令的前提时,要先在项目根目录下创建一个ts的配置文件 tsconfig.json

tsconfig.json

tsconfig.json是一个JSON文件,添加配置文件后,只需 tsc -w 即可完成对整个项目的编译

tsconfig.json是 ts编译器的配置文件,ts编译器可以根据它的信息来对代码进行编译

配置选项

① include

定义希望被编译文件所在的目录

默认值:[“**/*”]

  • 示例:
"include":["src/**/*", "tests/**/*"]
上述示例中,所有src目录和tests目录下的文件都会被编译

② exclude

定义需要排除在外的目录

默认值:[“node_modules”, “bower_components”, “jspm_packages”]

  • 示例:
"exclude": ["./src/hello/**/*"]

上述示例中,src下hello目录下的文件都不会被编译

③ extends

定义被继承的配置文件

  • 示例:
"extends": "./configs/base"
上述示例中,当前配置文件中会自动包含config目录下base.json中的所有配置信息

④ files

指定被编译文件的列表,只有需要编译的文件少时才会用到

  • 示例:
列表中的文件都会被TS编译器所编译:
"files": [
    "core.ts",
    "sys.ts",
    "types.ts",
    "scanner.ts",
    "parser.ts",
    "utilities.ts",
    "binder.ts",
    "checker.ts",
    "tsc.ts"
  ]

compilerOptions

编译选项是配置文件中非常重要也比较复杂的配置选项

在compilerOptions中包含多个子选项,用来完成对编译的配置

项目选项:

  • target

    • 设置ts代码编译的目标版本

    • 可选值:

      • 如果不知道可选值有哪些,可以在代码里写"target": “ABC”,然后报出来的提示会有具体的可选值ES3(默认)、ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext
    • 示例:

      "compilerOptions": {
          "target": "ES6"
      }
      // 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'esnext'
      
      • 如上设置,我们所编写的ts代码将会被编译为ES6版本的js代码
  • lib: library

    • 指定代码运行时所包含的库(宿主环境)。 用来指定项目中要使用的库

    • 可选值:

      • ‘es5’, 'es6’等
    • 示例:

      "compilerOptions": {
          "lib": ["ES6", "DOM"],
      }
      
  • module

    • 设置编译后代码使用的模块化系统。指定要使用的模块化的规范

    • 可选值:

      • CommonJS、UMD、AMD、System、ES2020、ESNext、None
    • 示例:

      "compilerOptions": {
          "module": "CommonJS"
      }
      // module 指定要使用的模块化的规范
      // 'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'esnext'
      
  • outDir

    • 用来指定编译后文件的所在目录

    • 默认情况下,编译后的js文件会和ts文件位于相同的目录,设置outDir后可以改变编译后文件的位置

    • 示例:

      "compilerOptions": {
          "outDir": "dist"
      }
      
      • 设置后编译后的js文件将会生成到dist目录
  • outFile

    • 所有的文件编译为一个js文件

    • 默认会将所有的编写在全局作用域中的代码合并为一个js文件。如果使用了模块化的话就合并不上了

    • 示例:

      "compilerOptions": {
          "outFile": "dist/app.js"
      }
      
  • rootDir

    • 指定代码的根目录,默认情况下编译后文件的目录结构会以最长的公共目录为根目录,通过rootDir可以手动指定根目录

    • 示例:

      "compilerOptions": {
          "rootDir": "./src"
      }
      
  • allowJs

    • 是否对js文件进行编译,默认是false
  • checkJs

    • 是否对js文件进行检查,默认是false

    • 示例:

      "compilerOptions": {
          "allowJs": true,
          "checkJs": true
      }
      
  • removeComments

    • 是否删除注释
    • 默认值:false
  • noEmit

    • 不对代码进行编译,不生成编译后的文件
    • 默认值:false。设置为true以后就不生成产生的 js 文件,做检查用
  • sourceMap

    • 是否生成sourceMap
    • 默认值:false

语法检查相关

严格检查

  • strict

    启用所有的严格检查,默认值为true,设置后相当于开启了所有的严格检查

  • alwaysStrict

    • 总是以严格模式对代码进行编译,默认false。设置为true后进入严格模式

    • 在JS中严格模式是开头写"use strict",但是TS中语法不是这样,是设置alwaysStrict。总是以严格模式对代码进行编译,默认false。设置为true后进入严格模式。

    • 当有模块化的代码时,编译后的JS代码就没有"use strict"了,因为JS会自动进入严格模式

  • noImplicitAny

    • "noImplicitAny": true禁止隐式的any类型
  • noImplicitThis

    • 禁止类型不明确的this
  • strictBindCallApply

    • 严格检查bind、call和apply的参数列表
  • strictFunctionTypes

    • 严格检查函数的类型
  • strictNullChecks

    • 严格的空值检查
  • strictPropertyInitialization

    • 严格检查属性是否初始化
  • 额外检查

    • noFallthroughCasesInSwitch
      • 检查switch语句包含正确的break
    • noImplicitReturns
      • 检查函数没有隐式的返回值
    • noUnusedLocals
      • 检查未使用的局部变量
    • noUnusedParameters
      • 检查未使用的参数
  • 高级

    • allowUnreachableCode
      • 检查不可达代码
      • 可选值:
        • true,忽略不可达代码
        • false,不可达代码将引起错误
    • noEmitOnError
      • 有错误的情况下不进行编译
      • 默认值:false

04 webpack打包ts代码

通常情况下,实际开发中我们都需要使用构建工具对代码进行打包,TS同样也可以结合构建工具一起使用,下边以webpack为例介绍一下如何结合构建工具使用TS。

步骤:

  1. 初始化项目

    进入项目根目录,执行命令 npm init -y

    主要作用:创建package.json文件(管理项目,项目里的依赖、命令)

  2. 下载构建工具

    命令:npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader clean-webpack-plugin html-webpack-plugin。(这里也可以用cnpm是国内的镜像。-D是开发依赖全称是DEV;webpack是打包工具的核心代码;webpack-cli是命令行工具,安装之后可以用命令行使用打包工具;typescript ts的核心包;)

    共安装了7个包:

    • webpack:构建工具webpack
    • webpack-cli:webpack的命令行工具
    • webpack-dev-server:webpack的开发服务器,可以在这个服务器中运行
    • typescript:ts编译器
    • ts-loader:ts加载器,用于在webpack中编译ts文件
    • html-webpack-plugin:webpack中html插件,用来自动创建html文件
    • clean-webpack-plugin:webpack中的清除插件,每次构建都会先清除目录
  3. 根目录下创建webpack的配置文件webpack.config.js(webpack的配置信息)

    // node.js中的一个模块,作用是拼接路径
    const path = require("path"); 
    
    // npm i -D html-webpack-plugin
    // 引入插件
    const HtmlWebpackPlugin = require("html-webpack-plugin");
    
    // webpack.config.js
    //引入clean插件
    const { CleanWebpackPlugin } = require("clean-webpack-plugin");
    
    //webpack中所有的配置信息都应该写在module.exports中
    module.exports = {
        optimization:{
            minimize: false // 关闭代码压缩,可选
        },
    
        // 入口文件
        entry: "./src/index.ts", 
        
        devtool: "inline-source-map",
        
        
        devServer: {
            contentBase: './dist'
        },
    
        // 打包文件所在的目录
        output: {
            // 指定打包文件的目录
            path: path.resolve(__dirname, "dist"),
            // 打包后文件的名字
            filename: "bundle.js",
            environment: {
                arrowFunction: false // 关闭webpack的箭头函数,可选
            }
        },
    
        // 用来设置引用模块
        resolve: {
            extensions: [".ts", ".js"]
        },
        
        // 指定webpack打包时要使用的模块
        module: {
            // 指定加载的规则
            rules: [
                {
                    // test指定规则生效的文件
                    test: /\.ts$/,
                    // 用ts-loader去处理以ts结尾的文件
                    use: {
                       loader: "ts-loader"     
                    },
                    // 要排除的文件
                    exclude: /node_modules/
                }
            ]
        },
    
        // 配置webpack插件
        plugins: [
            new CleanWebpackPlugin(),
      
            new HtmlWebpackPlugin({
                title:'TS测试',
                template: './src/index.html'// 根据我的代码中的模板生成HTML
            }),
        ]
    
    }
    
  4. 根目录下创建 tsconfig.json,配置可以根据自己需要

    {
        "compilerOptions": {
            "target": "ES2015", // ES2015就是ES6
            "module": "ES2015",
            "strict": true
        }
    }
    
  5. 修改package.json添加如下配置

    {
      ......
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "build": "webpack",// 添加这一句话
        "start": "webpack serve --open chrome.exe" 
        // webpack-dev-server
        // 添加这一句话
      },
      ......
    }
    
  6. 在src下创建ts文件,并在并命令行执行npm run build对代码进行编译,或者执行npm start来启动开发服务器

错误解决

  • package.json 中设置了 “start”: “webpack serve --open” 之后,npm run start 报如下错误

Invalid options object. Dev Server has been initialized using an options object that does not match the API schema.options has an unknown property ‘contentBase’. These properties are valid: object { allowedHosts?, bonjour?, client?, compress?, devMiddleware?, headers?, historyApiFallback?, host?, hot?, ipc?, liveReload?, onListening?, open?, port?, proxy?, server?, setupExitSignals?, setupMiddlewares?, static?, watchFiles?, webSocketServer? }

在这里插入图片描述

解决方法:在webpack.config.js中 把contentBase注释掉,修改成static
在这里插入图片描述

static的意思是,将dist目录下的文件作为额外可访问文件

参考文裆:https://blog.csdn.net/u013803303/article/details/124733344

  • npm run start(“start”: “webpack serve --open” )之后 没有生成bundle.js文件了,但是会弹出网页

dist目录下并没有生成bundle.js文件,这是因为webpack-dev-server将打包好的文件放在了内存中,并没有存放到实际的物理磁盘上,我们可以认为webpack-dev-server把打包好的文件,以一种虚拟的形式,托管到了项目的根目录中,虽然看不到它,但是可以认为和dits、src、node_modules平级,叫做bundle.js。

在这里插入图片描述

可以直接点击链接访问

05 babel

经过一系列的配置,使得TS和webpack已经结合到了一起,除了webpack,开发中还经常需要结合babel来对代码进行转换以使其可以兼容到更多的浏览器,在上述步骤的基础上,通过以下步骤再将babel引入到项目中。

  1. 安装依赖包:

    npm i -D @babel/core @babel/preset-env babel-loader core-js

    共安装了4个包,分别是:

    • @babel/core:babel的核心工具
    • @babel/preset-env:babel的预定义环境
    • @babel-loader:babel在webpack中的加载器
    • core-js:core-js用来使老版本的浏览器支持新版ES语法
  2. 修改webpack.config.js配置文件

    引入的是一个加载器,加载器从后往前执行,所以babel-loader要在ts-loader前

    ......
    module: {
        rules: [
            {
                test: /\.ts$/,
                use: [
                    {   
                        //指定要用的加载器
                        loader: "babel-loader",
                        options:{
                            //设置与定义环境
                            presets: [
                                [
                                    // 指定环境的插件
                                    "@babel/preset-env",
                                    // 配置信息
                                    {
                                        // 浏览器版本
                                        "targets":{
                                            "chrome": "58", 
                                            "ie": "11"
                                        },
                                        // 指定corejs的版本
                                        "corejs":"3",
                                        // 使用codejs的方法
                                        "useBuiltIns": "usage"
                                        // usage是按需加载
                                    }
                                ]
                            ]
                        }
                    },
                    {   
                        loader: "ts-loader",
    
                    }
                ],
                exclude: /node_modules/
            }
        ]
    }
    ......
    
    • 如此一来,使用ts编译后的文件将会再次被babel处理,使得代码可以在大部分浏览器中直接使用,可以在配置选项的targets中指定要兼容的浏览器版本。

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

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

相关文章

YOLOv9改进项目|关于上周更新计划的说明24/4/1

专栏地址&#xff1a;目前售价售价69.9&#xff0c;改进点50 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 本周已更新说明&#xff1a; ### ⭐⭐更新时间&#xff1a;2024/3/30⭐⭐ 1.…

【C语言】带你完全理解指针(四)函数指针的应用sqort函数的实现

前言&#xff1a; 本文主要是函数指针的重要应用&#xff0c;介绍qsort函数以及模拟实现这样一个不限制使用数据类型的快速排序函数。 回调函数 函数指针有一个非常大的作用就是实现回调函数。非常重要 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xf…

广场舞团系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…

关于 ulimit 的两个坑

做过运维的人一定会遇到过 “Too many open files” 错误&#xff0c;这个错误本质是 ulimit 设置不合理导致的。关于 ulimit 设置&#xff0c;有哪些需要注意的点呢&#xff1f;本文给大家做一个介绍&#xff0c;希望对大家有所帮助。 如何确认 ulimit 设置生效了&#xff1f…

Go-Gin-Example 第八部分 优化配置接口+图片上传功能

文章目录 前情提要本节目标 优化配置结构讲解落实修改配置文件优化配置读取及设置初始化顺序第一步 验证 抽离file 实现上传图片接口图片名加密封装image的处理逻辑编写上传图片的业务逻辑增加图片上传的路由 验证实现前端访问 http.FileServerr.StaticFS修改文章接口新增、更新…

80C51实现四种流水灯流水灯 | 自用学习笔记

单个流水灯 #include <reg51.h> #include <intrins.h> // 包含移位库函数的头文件void delay(void) // 定义延时函数 {unsigned char i, j;for(i 0; i < 200; i) // 循环延时&#xff0c;延时约50msfor(j 0; j < 125; j); }void main(void){ unsigned ch…

代码随想录算法训练营Day41|LC343 证书拆分LC96 不同的二叉搜索树

一句话总结&#xff1a;初看觉得难&#xff0c;过几天再做依旧觉得不简单。 原题链接&#xff1a;343 整数拆分 拿到题乍一看两眼一抹黑。还是看题解吧。首先确定动规数组及下标的含义。这里就设置dp[i]为正整数i的最大乘积。 然后确定递推关系式。对于怎么求i的最大乘积&…

CCIE-01-VLAN-Trunk

目录 实验条件网络拓朴逻辑拓扑物理拓扑实验目的 开始配置配置SW1配置SW2检验证配置结果 实验条件 网络拓朴 逻辑拓扑 物理拓扑 实验目的 SW1和SW2之间的E2/0-3配置为trunk&#xff0c;使用802.1q协议&#xff0c;不需要配置捆绑根据逻辑图和物理图标识&#xff0c;使得R1~R7…

电力设备热设计原理(二)

本篇为西安交通大学本科课程《电力设备设计原理》的笔记。 本篇为这一单元的第二篇笔记。上一篇传送门。 电力设备传导换热 主要讨论稳态导热的计算。 通过单层和多层平壁的传导 如上图所示的大平板是一维传导问题&#xff0c;流过平板的热流量和平板两侧温度和平板厚度之间…

【机器学习300问】59、计算图是如何帮助人们理解反向传播的?

在学习神经网络的时候&#xff0c;势必会学到误差反向传播&#xff0c;它对于神经网络的意义极其重大&#xff0c;它是训练多层前馈神经网络的核心算法&#xff0c;也是机器学习和深度学习领域中最为重要的算法之一。要正确理解误差反向传播&#xff0c;不妨借助一个工具——计…

软件心学格物致知篇(5)愿望清单上篇

愿望清单 前言 最近发现愿望清单是一个很有意思的词&#xff0c;结合自己的一些过往经验得到一点点启发。 我发现在众多领域都有东西想伪装成它。 比如一些企业的企业战略&#xff0c;比如客户提出的一些软件需求&#xff0c;比如一些系统的架构设计指标&#xff0c;比如一…

k8s练习-创建一个Deployment

创建Deployment 创建一个nginx deployment [rootk8s-master home]# cat nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:selector:matchLabels:app: nginx # 配置pod的labelsreplicas: 2 # 声明2个副本template:metada…

2024.3.26 ARM

SPI相关理论 概述 SPI&#xff0c;是Serial Peripheral interface的缩写&#xff0c;是串行外围设备接口&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为P…

数字孪生|山海鲸数据管家简介及安装步骤

哈喽,大家好啊,我是雷工! 最近在学习数字孪生相关的软件山海鲸,了解到采集Modbus协议需要先安装山海鲸数据管家,本节先学习数据管家及安装步骤,以下为学习笔记: 1、简介 数据管家是帮用户进行数据管理与转发的软件,能够解决山海鲸可视化等软件对数据接入过程中的许多…

实体机双系统安装

实体机双系统安装 第一步&#xff1a;下载openKylin镜像 前往官网下载x86_64的镜像&#xff08;https://www.openkylin.top/downloads/628-cn.html&#xff09; tips&#xff1a;下载完镜像文件后&#xff0c;请先检查文件MD5值是否和官网上的一致&#xff0c;如果不一致请重…

【python基础教程】2. 算法的基本要素与特性

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

Java中常见的锁策略

目录 乐观锁 vs 悲观锁 悲观锁: 乐观锁&#xff1a; 重量级锁 vs 轻量级锁 ⾃旋锁&#xff08;Spin Lock&#xff09; 公平锁 vs 非公平锁 可重⼊锁 vs 不可重入锁 读写锁 乐观锁 vs 悲观锁 悲观锁: 总是假设最坏的情况&#xff0c;每次去拿数据的时候都认为别…

蓝桥杯第1593题——二进制问题

题目描述 小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗&#xff1f; 输入描述 输入一行包含两个整数 N 和 K。 输出描述 输出一个整数表示答案。 输入输出样例 示例 输入 7 2输出 3评测用例规模与约定 对于 30% …

YOLOv9改进策略 :主干优化 | 极简的神经网络VanillaBlock 实现涨点 |华为诺亚 VanillaNet

💡💡💡本文改进内容: VanillaNet,是一种设计优雅的神经网络架构, 通过避免高深度、shortcuts和自注意力等复杂操作,VanillaNet 简洁明了但功能强大。 💡💡💡引入VanillaBlock GFLOPs从原始的238.9降低至 165.0 ,保持轻量级的同时在多个数据集验证能够高效涨点…

跑spark的yarn模式时RM连不上的情况

在linux控制台跑spark on yarn一个测试案例&#xff0c;日志中总显示RM连yarn服务的时候是&#xff1a;0.0.0.0:8032 具体情况如下图&#xff1a; 我问题出现的原因&#xff0c;总结如下&#xff1a; 1.防火墙没关闭&#xff0c;关闭 2.spark-env.sh这个文件的YARN_CONF_DIR…