npm知识
npm 是什么
npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个包(package)(即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。
npm 由三个独立的部分组成:
- 网站 —— 是开发者查找包(package)、设置参数以及管理 npm 使用体验的主要途径。
- 注册表(registry) —— 是一个巨大的数据库,保存了每个包(package)的信息。
- 命令行工具 (CLI) —— 通过命令行或终端运行。开发者通过 CLI 与 npm 打交道。
公共 npm 注册表
公共 npm 注册表是一个 JavaScript 包数据库,每个包都由软件和元数据组成。开源开发人员和公司的开发人员使用 npm 注册表向整个社区或其组织成员贡献包,并下载包以在他们自己的项目中使用。
要开始使用注册表,请注册一个 npm 帐户并查看“入门”和 CLI 文档。
包和模块
npm 注册表包含包,其中许多也是 Node 模块,或者包含 Node 模块。请继续阅读以了解它们有何不同以及它们如何相互作用。
包
包是由 package.json
文件描述的文件或目录。包必须包含 package.json
文件才能发布到 npm 注册表。包可以不受限制,也可以限定为用户或组织,范围限定的包可以是私有或公共的。
包的格式
- a) 包含由
package.json
文件描述的程序的文件夹。 - b) 一个包含(a)的 gzip 压缩包。
- c) 解析为(b)的 URL。
- d) 在注册表中发布(c)的
<name>@<version>
。 - e) 指向(d)的
<name>@<tag>
。 - f) 具有满足(e)
的最新
标记的<name>
。 - g) 一个
git
url,克隆后会导致(a)。
模块
模块是 node_modules
目录中可由 Node.js require()
函数加载的任何文件或目录。
要通过 Node.js require()
函数加载,模块必须是以下之一:
- 一个文件夹,其中包含一个
package.json
文件,其中包含“main”
字段。 - 一个 JavaScript 文件。
**注意:**由于模块不需要具有
package.json
文件,因此并非所有模块都是包。只有具有package.json
文件的模块也是包。
scope
所有 npm 包都有一个名称。一些包名称也有范围(作用域)。作用域遵循包名称的通常规则(URL安全字符,没有前导点或下划线)。在包名称中使用时,作用域前面有一个 @
符号,后面有一个斜线,例如:
@somescope/somepackagename
作用域 (Scope) 是一种将相关包组合在一起的方法,也会影响 npm 处理包的方式。
每个 npm 用户/组织都有自己的范围,只有你才能在你的范围中添加包。这意味着您不必担心有人会抢在您之前使用您的软件包名称。因此,这也是向组织发送官方软件包的好方法。
范围包可以从 npm@2
开始发布和安装,并且受主 npm 注册表支持。无范围包可以依赖于 scoped 包,反之亦然。npm 客户端向后兼容无范围注册表,因此它可以用于同时处理有范围和无范围注册表。
安装范围包
作用域包安装到常规安装文件夹的子文件夹中,例如,如果普通包安装在 node_modules/packagename
中,则作用域包将安装在 node_modules/@myorg/packagename
中。范围文件夹 (@myorg
) 只是范围的名称,前面有一个 @
符号,可以包含任意数量的范围包。
通过在 npm install 中按名称引用 @ 符号来安装范围包:
npm install @myorg/mypackage
或者用 package.json
:
"dependencies": {"@myorg/mypackage": "^1.3.0"
}
请注意,如果省略
@
符号,则在任何一种情况下,npm 都将尝试从 GitHub 安装。
导入范围包
由于范围包安装在 scope 文件夹中,因此在代码中需要它们时,您必须包含范围的名称,例如:
require("@myorg/mypackage");
Node 处理范围文件夹的方式并没有什么特别之处。这只需要名为 @myorg
的文件夹中的 mypackage
模块。
发布范围包
范围包可以从 npm 2.0 或更高版本中发布,并且可以发布到支持它们的任何注册表,包括主 npm 注册表。
将公共范围的包发布到主 npm 注册表
发布到范围时,您有两个选项:
- 发布到您的用户范围(示例:
@username/模块
) - 发布到组织范围(示例:
@org/module
)
如果要将公共模块发布到组织范围,则必须首先使用要发布到的范围名称创建组织,或者将其添加到具有适当权限的现有组织。例如,如果要发布到 @org
,则需要在尝试发布之前在 npmjs.com 上创建 org
组织。
默认情况下,范围包不是公共的。您需要使用初始 npm publish
命令指定 --access public
。这将发布包并将访问权限设置为 public
,就像您在发布后运行 npm access public
一样。在发布现有范围包的新版本时,您无需执行此操作。
将私有范围的包发布到 npm 注册表
要将私有范围的包发布到 npm 注册表,您必须拥有 npm 私有模块帐户。
然后,您可以使用 npm publish
或 npm publish --access restricted
发布模块,它将出现在 npm 注册表中,但访问权限受限。然后,如果需要,您可以使用 npm access
或在 npmjs.com 网站上更改访问权限。
将范围与注册表相关联
范围可以与单独的注册表相关联。这样,您就可以无缝地混合使用来自主 npm 注册表和一个或多个私有注册表的包,例如 GitHub Packages 或开源 Verdaccio 项目。
您可以在登录时将范围与注册表相关联,例如
npm login --registry=http://reg.example.com --scope=@myco
范围与 registry 具有多对一的关系:一个 registry 可以托管多个 scope,但一个 scope 只指向一个 registry。
您还可以使用 npm config
将范围与注册表关联:
npm config set @myco:registry=http://reg.example.com
一旦范围与注册表关联,具有该范围的包的任何 npm install
都将改为从该注册表请求包。包含范围的包名称的任何 npm publish
都将发布到该注册表。
npm install 原理
-
首先得有
package.json
包管理文件才可以执行npm install
-
npm install -> 看是否有
package-lock.json
文件 -
没有
package-lock.json
文件,则构建依赖关系,然后从registry
仓库下载安装包(压缩文件),将压缩包添加到本地的缓存文件中再将下载的压缩包解压到node_modules
中,同时生成package-lock.json
文件,完成安装 -
有
package-lock.json
文件,则先检查下载的包和package-lock.json
文件中的包版本是否符合semver
版本规范,不一定非要完全一样,像 2.2.1 和 2.2.2 是一样的 -
不一致,则重新构建依赖关系,然后就是和第 3 步一样,去仓库下载,加压,添加缓存,解压到
node_modules
中,生成新的package-lock.json
-
一致,则会去本地缓存文件中去查找缓存文件,找到缓存文件,将压缩包解压到
node_modules
中,完成安装
package.json 文件
package.json 文件是项目的清单,用于存储与项目有关的元数据以及依赖项包列表。它向 npm 提供信息,使其能够识别项目并处理所有项目的依赖项。通过 package.json 文件,其他人可以轻松安装和管理与项目相关的软件包。
package.json 文件必须是实际的 JSON,而不仅仅是 JavaScript 对象文本。
name
如果您计划发布包,则 package.json 中最重要的内容是 name
和 version
字段,因为它们是必需的。名称和版本共同构成一个标识符,该标识符假定为完全唯一。对包的更改应随版本更改一起进行。如果您不打算发布包,则 name
(名称) 和 version
(版本) 字段是可选的。
一些规则:
- 名称必须小于或等于 214 个字符。这包括 scoped 包的范围。
- 作用域包的名称可以以点或下划线开头。如果没有范围,则不允许这样做。
- 包的名称中不能包含大写字母。
- 名称最终成为 URL、命令行上的参数和文件夹名称的一部分。因此,名称不能包含任何非 URL 安全字符。
一些提示:
- 不要使用与核心 Node 模块相同的名称。
- 不要在名称中添加 “js” 或 “node” 。假设它是 js,因为你正在编写一个 package.json 文件,你可以使用
engines
字段指定引擎。 - 该名称可能会作为参数传递给
require()
,因此它应该简短,但也具有合理的描述性。 - 在你开发依赖之前,你可能要检查 npm 注册表,看看是否已经有这个名字。
- 名称可以选择以范围为前缀,例如
@myorg/mypackage
。
version
如果您计划发布包,则 package.json 中最重要的内容是 name
和 version
字段,因为它们是必需的。名称和版本共同构成一个标识符,该标识符假定为完全唯一。对包的更改应随版本更改一起进行。如果您不打算发布包,则 name
(名称) 和 version
(版本) 字段是可选的。
版本必须可由 node-semver
解析,它作为依赖项与 npm 捆绑在一起。(npm install semver
自己使用它)
description
在其中添加描述。它是一个字符串。这有助于人们发现你的包,因为它在 npm search
中列出。
keywords
在其中放置关键字。它是一个字符串数组。这有助于人们发现你的包,因为它在 npm search
中列出。
author
顾名思义就是作者,表示该项目包的作者。它有两种形式,一种是字符串格式:
{"author": "CUGGZ <xxxxx@xx.com> (https://juejin.cn/user/3544481220801815)"
}
另一种是对象形式:
{"author": {"name" : "CUGGZ","email" : "xxxxx@xx.com","url" : "https://juejin.cn/user/3544481220801815"}
}
main
该字段用来指定加载的入口文件,在 browser 和 Node 环境中都可以使用。如果我们将项目发布为 npm 包,那么当使用 require
导入 npm 包时,返回的就是 main 字段所列出的文件的 module.exports
属性。如果不指定该字段,默认是项目根目录下的 index.js。如果没找到,就会报错。
该字段的值是一个字符串:
{"main": "./src/index.js"
}
browser
如果您的模块打算在客户端使用,则应使用 browser 字段而不是 main 字段。这有助于提示用户它可能依赖于 Node.js 模块中不可用的原语。(例如:window
)
{"browser": "./src/index.js"
}
repository
表示代码的存放仓库地址,通常有两种书写形式。第一种是字符串形式:
{
"repository": "https://github.com/facebook/react.git"
}
除此之外,还可以显式地设置版本控制系统,这时就是对象的形式:
{"repository": {"type": "git","url": "https://github.com/facebook/react.git"}
}
homepage
项目主页的 URL。
例如:
"homepage": "https://github.com/my-project"
scripts
scripts 属性是一个对象,其中包含在包生命周期中的不同时间运行的脚本命令。key
是生命周期事件,value
是要在该点运行的命令。
{"scripts": {"serve": "webpack server --mode=development","dev": "webpack --mode=development","build": "webpack --mode=production"}
}
可以配置任何 cmd 支持的命令,运行方式是 npm run 脚本名称
,不仅如此,npm 还对某些常用的脚本名称进行了简化,下面的脚本名称是不需要使用 run 的:
- start
- stop
- test
一些细节:
- 脚本中可以省略 npx,因为会将 node_module 中的 bin 目录添加到环境变量中,执行完成后会删除。
- start 脚本有默认值:node server.js。
dependencies
该字段中声明的是项目的生产环境中所必须的依赖包。当使用 npm 或 yarn 安装 npm 包时,该 npm 包会被自动插入到此配置项中:
npm install <PACKAGENAME>
yarn add <PACKAGENAME>
当在安装依赖时使用 --save 或 -S 参数,也会将新安装的 npm 包写入 dependencies 属性。
npm install --save <PACKAGENAME>
使用版本号
该字段的值是一个对象,该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围:
{"dependencies": {"react": "^17.0.2","react-dom": "^17.0.2","react-scripts": "~4.0.3",}
}
使用 URL
您可以指定一个 URL 来代替版本范围。
使用 git URL
Git URL 的形式如下:
<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
<protocol>
是 git
、git+ssh
、git+http
、git+https
或 git+file
之一。
如果提供了 #<commit-ish>
,它将用于克隆该提交。如果 commit-ish
的格式为 #semver:<semver>
,则 <semver>
可以是任何有效的 semver 范围或确切版本,并且 npm 将在远程存储库中查找与该范围匹配的任何标签或引用,就像注册表依赖项一样。如果未指定 #<commit-ish>
或 #semver:<semver>
,则使用默认分支。
git+ssh://git@github.com:npm/cli.git#v1.0.27
git+ssh://git@github.com:npm/cli#semver:^5.0
git+https://isaacs@github.com/npm/cli.git
git://github.com/npm/cli.git#v1.0.27
使用 GitHub URL
就像 git URL 一样,可以包含 commit-ish
后缀。例如:
{"name": "foo","version": "0.0.0","dependencies": {"express": "expressjs/express","mocha": "mochajs/mocha#4727d357ea","module": "user/repo#feature\/branch"}
}
使用本地路径
从版本 2.0.0 开始,您可以提供包含包的本地目录的路径。可以使用 npm install -S
或 npm install --save
使用以下任何形式保存本地路径:
../foo/bar
~/foo/bar
./foo/bar
/foo/bar
在这种情况下,它们将被规范化为相对路径并添加到您的package.json
中。例如:
{"name": "baz","dependencies": {"bar": "file:../foo/bar"}
}
此功能有助于本地离线开发和创建需要安装 npm 的测试,这些测试您不想访问外部服务器,但在将包发布到公共注册表时不应使用。
在这种情况下,运行
npm install
时,通过本地路径链接的包将不会安装自己的依赖项。您必须从本地路径本身内部运行npm install
。
devDependencies
devDependencies
中声明的是开发阶段需要的依赖包,如 Webpack、Eslint、Babel 等,用于辅助开发。它们不同于 dependencies
,因为它们只需安装在开发设备上,而无需在生产环境中运行代码。当打包上线时并不需要这些包,所以可以把这些依赖添加到 devDependencies
中,这些依赖依然会在本地指定 npm install
时被安装和管理,但是不会被安装到生产环境中。
当使用 npm 安装软件包时,指定以下参数后,新安装的 npm 包会被自动插入到此列表中:
npm install --save-dev <PACKAGENAME>
npm install -D <PACKAGENAME>
{"devDependencies": {"webpack": "^5.96.1","webpack-cli": "^5.1.4","webpack-dev-server": "^5.1.0"}
}
private
private
字段可以防止我们意外地将私有库发布到 npm 服务器。只需要将该字段设置为 true
:
{"private": true
}
语义化版本
版本规范:主版本号.次版本号.修订号
-
主版本号(major):当你做了不兼容的 API 修改。
-
次版本号(minor):当你做了向下兼容的功能性新增。
-
修订号(patch,补丁版本号):当你做了向下兼容的问题修正。
版本号范围
>
大于某个版本,例如:>1.2.1
,则说明依赖要大于 1.2.1 版本。
>=
大于等于某个版本,例如:>=1.2.1
,则说明依赖要大于等于 1.2.1 版本。
<
小于某个版本,例如:<1.2.1
,则说明依赖要小于 1.2.1 版本。
<=
小于等于某个版本,例如:<=1.2.1
,则说明依赖要小于等于 1.2.1 版本。
比较器可以用空格连接起来形成一个比较器集,它由它包含的所有比较器的交集来满足。例如,范围 >=1.2.7 <1.3.0
将匹配版本 1.2.7
、1.2.8
和 1.2.99
,但不包括版本 1.2.6
、1.3.0
或 1.1.0
。
一个范围由一个或多个比较器集组成,由 ||
连接。一个版本匹配一个范围,当且仅当至少一个 ||
分隔的比较器集中的每个比较器都满足该版本。范围 1.2.7 || >=1.2.9 <2.0.0
将与版本 1.2.7、1.2.9 和 1.4.6 匹配,但与版本 1.2.8 或 2.0.0 不匹配。
-
指定介于两个版本之间的范围,例如:1.2.3 - 2.3.4
,相当于 >=1.2.3 <=2.3.4
。
如果提供部分版本作为包含范围内的第一个版本,则缺失的部分将替换为零。例如:1.2 - 2.3.4
,相当于 >=1.2.0 <=2.3.4
。
如果提供部分版本作为包含范围内的第二个版本,则接受以提供的第二个版本开头的所有版本,但不接受大于提供的第二个版本。例如:1.2.3 - 2.3
,相当于 >=1.2.3 <2.4.0-0
;1.2.3 - 2
,相当于 >=1.2.3 <3.0.0-0
。
X/x/*
X
、x
或 *
中的任何一个都可以用来 “代替” [major, minor, patch]
中的某个数值。
-
*
相当于
>=0.0.0
,任何非预发行版本都满足。 -
1.x
相当于
>=1.0.0 <2.0.0-0
,匹配主版本号。 -
1.2.x
相当于
>=1.2.0 <1.3.0-0
,匹配主版本号和次要版本号。
部分版本范围被视为 X 范围,因此特殊字符实际上是可选的。
-
""
空字符串,相当于
*
或>=0.0.0
。 -
1
相当于
1.x.x
或>=1.0.0 <2.0.0-0
。 -
1.2
相当于
1.2.x
或>=1.2.0 <1.3.0-0
。
~
如果指定了次要版本,则允许补丁级更改。如果没有指定次要版本,则允许次要级别的更改。
-
~1.2.3
相当于
>=1.2.3 <1.(2+1).0
或>=1.2.3 <1.3.0-0
。 -
~1.2
相当于
>=1.2.0 <1.(2+1).0
或>=1.2.0 <1.3.0-0
(与1.2.x
相同)。 -
~1
相当于
>=1.0.0 <(1+1).0.0
或>=1.0.0 <2.0.0-0
(与1.x
相同)。 -
~0.2.3
相当于
>=0.2.3 <0.(2+1).0
或>=0.2.3 <0.3.0-0
。 -
~0.2
相当于
>=0.2.0 <0.(2+1).0
或>=0.2.0 <0.3.0-0
(与0.2.x
相同)。 -
~0
相当于
>=0.0.0 <(0+1).0.0
或>=0.0.0 <1.0.0-0
(同0.x
)。
^
允许对版本 1.0.0
及更高版本进行补丁更新和次要更新,对版本 0.X >=0.1.0
进行补丁更新,而对版本 0.0.X
没有更新。
-
^1.2.3
相当于
>=1.2.3 <2.0.0-0
。 -
^0.2.3
相当于
>=0.2.3 <0.3.0-0
。 -
^0.0.3
相当于
>=0.0.3 <0.0.4-0
。
解析插入符号范围时,缺少的 patch
值会降级为数字 0
,但即使在主要版本和次要版本均为 0
时,该值也会允许灵活性。
-
^1.2.x
相当于
>=1.2.0 <2.0.0-0
。 -
^0.0.x
相当于
>=0.0.0 <0.1.0-0
。 -
^0.0
相当于
>=0.0.0 <0.1.0-0
。
缺少的 minor
和 patch
值会将糖化为零,但也允许在这些值内灵活使用,即使主要版本为零也是如此。
-
^1.x
相当于
>=1.0.0 <2.0.0-0
。 -
^0.x
相当于
>=0.0.0 <1.0.0-0
。
^
允许对版本 1.0.0
及更高版本进行补丁更新和次要更新,对版本 0.X >=0.1.0
进行补丁更新,而对版本 0.0.X
没有更新。
-
^1.2.3
相当于
>=1.2.3 <2.0.0-0
。 -
^0.2.3
相当于
>=0.2.3 <0.3.0-0
。 -
^0.0.3
相当于
>=0.0.3 <0.0.4-0
。
解析插入符号范围时,缺少的 patch
值会降级为数字 0
,但即使在主要版本和次要版本均为 0
时,该值也会允许灵活性。
-
^1.2.x
相当于
>=1.2.0 <2.0.0-0
。 -
^0.0.x
相当于
>=0.0.0 <0.1.0-0
。 -
^0.0
相当于
>=0.0.0 <0.1.0-0
。
缺少的 minor
和 patch
值会将糖化为零,但也允许在这些值内灵活使用,即使主要版本为零也是如此。
-
^1.x
相当于
>=1.0.0 <2.0.0-0
。 -
^0.x
相当于
>=0.0.0 <1.0.0-0
。
相关文章:
npm知识
npm 是什么 npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个包(package)(即,代码模块)。来自…...
雷电等基于VirtualBox的Android模拟器映射串口和测试CSerialPort串口功能
雷电等基于VirtualBox的Android模拟器映射串口和测试CSerialPort串口功能 1. 修改VirtualBox配置文件映射串口 模拟器配置文件vms/leidian0/leidian.vbox。 在UART标签下增加(修改完成后需要将leidian.vbox修改为只读) <Port slot"1" enabled"true"…...
http请求中的headers和body内容设置
1.headers 1.1 内容相关 headers {Content-Type: application/json, # 或 application/x-www-form-urlencoded, multipart/form-dataContent-Length: 1234, # 内容长度Accept: application/json, # 期望的返回格式Accept-Encoding: gzip, deflate, # 支持的压缩方式Acce…...
Python语言的安全开发
Python语言的安全开发 引言 在信息技术迅速发展的今天,网络安全问题愈发凸显。随着Python语言的广泛应用,尤其是在数据分析、人工智能、Web开发等领域,其安全问题越来越受到重视。Python作为一门高效且易于学习的编程语言,虽然在…...
[LeetCode]day13 19.删除链表的倒数第n个结点
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2&a…...
进程的环境变量
export MUDUO_LOG_DEBUG1 ./testif (::getenv("MUDUO_LOG_TRACE"))return true;有时在程序运行前,我们希望设置环境变量。此处::表示全局命名空间。 在类 Unix 系统(如 Linux、macOS)中,环境变量并不直接存储在堆、栈或…...
《深度揭秘LDA:开启人工智能降维与分类优化的大门》
在当今人工智能蓬勃发展的时代,数据成为了驱动技术进步的核心要素。随着数据采集和存储技术的飞速发展,我们所面临的数据量不仅日益庞大,其维度也愈发复杂。高维数据虽然蕴含着丰富的信息,但却给机器学习算法带来了一系列严峻的挑…...
UE编辑器工具
如何自己制作UE小工具提高工作效率 在虚幻编辑器用户界面中,可以使用各种各样的可视化工具来设置项目,设计和构建关卡,创建游戏性交互等等。但有些时候,当你确定了需要编辑器执行的操作后,可能想要通过编程方式调用它…...
.找到字符串中所有字母异位词(滑动窗口)
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "…...
力扣 121. 买卖股票的最佳时机
🔗 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock 题目 nums 表示连续几天的股票价格,返回最大利润 思路 贪心,模拟 代码 class Solution { public:int maxProfit(vector<int>& prices) {int ans 0;int mi…...
c++ 冒泡排序
c 冒泡排序 冒泡排序是一种简单的排序算法,它通过重复遍历待排序的数列,比较每对相邻元素的大小,并在必要时交换它们的位置。这个过程会一直进行,直到没有需要交换的元素为止,这意味着数列已经排序完成。以下是用C实现…...
JMeter的详细学习路线
以下是一个适合新手的 **JMeter 详细学习路线**,从基础到实战逐步深入,帮助你系统掌握 JMeter 的核心功能和使用技巧。 --- ### **一、入门阶段:理解基础概念** 1. **了解性能测试基础** - 什么是性能测试? - 负载测…...
【C# 】图像资源的使用
在C#中,图像资源的使用方式方法主要依赖于你所使用的框架和库。以下是几种常见的使用图像资源的方法: Windows Forms 直接加载图像: 使用System.Drawing.Image.FromFile()方法可以直接从文件系统加载图像。 Image image Image.FromFile(&qu…...
3.PPT:华老师-计算机基础课程【3】
目录 NO12 NO34 NO56 NO789 NO12 根据考生文件夹下的Word文档“PPT素材.docx”中提供的内容在PPT.pptx中生成初始的6张幻灯片 新建幻灯片6张→ctrlc复制→ctrlv粘贴开始→新建幻灯片→幻灯片(从大纲)→Word文档注❗前提是:Word文档必须应用标题1、标题2…...
关于算尽圆周率
总有人提到圆周率算尽的问题,其实代码都已经在前面给出了,自己跑一下就明白了。 用语言描述的话,那就是: 前面几篇文章已经写清楚了,圆周率的本质就是无限分辨率前提下的可二分度量单位。 就像是自然对数底…...
动态获取脚本名称作为日志文件的名称
优点 独立性: 每个脚本的日志独立存储,避免日志混杂,便于排查问题。 灵活性: 支持动态获取脚本名称,无需手动指定日志记录器名称。 可扩展性: 可以轻松扩展日志格式、级别、存储路径等功能。 易用性&…...
JavaScript前后端交互-AJAX/fetch
摘自千峰教育kerwin的js教程 AJAX 1、AJAX 的优势 不需要插件的支持,原生 js 就可以使用用户体验好(不需要刷新页面就可以更新数据)减轻服务端和带宽的负担缺点: 搜索引擎的支持度不够,因为数据都不在页面上…...
2025 网络安全学习路线 非常详细 推荐学习
关键词:网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊,学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间,光语言都有几门,有些人会倒在学习 linux 系统及命令的路上&#…...
尝试把clang-tidy集成到AWTK项目
前言 项目经过一段时间的耕耘终于进入了团队开发阶段,期间出现了很多问题,其中一个就是开会讨论团队的代码风格规范,目前项目代码风格比较混乱,有的模块是驼峰,有的模块是匈牙利,后面经过讨论,…...
04树 + 堆 + 优先队列 + 图(D1_树(D17_综合刷题练习))
目录 1. 二叉树的前序遍历(简单) 1.1. 题目描述 1.2. 解题思路 方法一:递归(推荐使用) 方法二:非递归(扩展思路) 2. 二叉树的中序遍历(中等) 2.1. 题目…...
C++ Primer 数组
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
Linux(Centos)安装allnnlp失败,jsonnet报错
Linux安装allnnlp失败,jsonnet报错 问题分析并解决1. 什么是 Software Collection (SCL)?2. 安装步骤2.1 安装 SCL 仓库支持2.2 安装 Devtoolset-7 提供的 C 编译器2.3 启用 Devtoolset-7 环境2.4 验证安装 3. 永久启用 Devtoolset-7 环境 问题 执行pip install al…...
小程序设计和开发:要如何明确目标和探索用户需求?
一、明确小程序的目标 确定业务目标 首先,需要明确小程序所服务的业务领域和目标。例如,是一个电商小程序,旨在促进商品销售;还是一个服务预约小程序,方便用户预订各类服务。明确业务目标有助于确定小程序的核心功能和…...
C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】
C#面试题(中级篇),详细讲解,帮助你深刻理解,拒绝背话术!-CSDN博客 简单工厂模式 优点: 根据条件有工厂类直接创建具体的产品 客户端无需知道具体的对象名字,可以通过配置文件创建…...
napalm ‘NXOSDriver‘ object has no attribute ‘port‘ 解决方案(随手记)
解决方案(仍然使用ssh作为访问方式) 使用napalm时,对于Cisco Nexus设备,默认采用的是443的api去访问获取数据,如果需要使用ssh的方式获取,需要特别指定get_network_driver(nxos_ssh) 使用443 https api的…...
顺序表与vector
一、顺序表的模拟实现 1.顺序表的实现方式 按照数组的申请方式,有以下两种实现方式: (1)数组采用静态分配,此时的顺序表称为静态顺序表。 (2)数组采用动态分配,此时的顺序表称为动…...
Spring 面试题【每日20道】【其三】
1、Spring 中的 Profile 注解的作用是什么? 中等 Profile 注解在Spring框架中用于根据不同的环境配置文件(profiles)来激活或忽略某些Bean的注册。它允许开发者定义逻辑以区分不同环境下的bean定义,例如开发、测试和生产环境。 …...
作业day7
请使用条件变量实现2生产者2消费者模型,注意1个生产者在生q产的时候,另外一个生产者不能生产 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h>#define BUFFER_SIZE 5int buffer[BUFFER_SIZE]…...
后盾人JS--继承
继承是原型的继承 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </hea…...
基于CY8CKIT-149 BLE HID设备实现及PC控制功能开发(BLE HID+CapSense)
目录 项目介绍硬件介绍项目设计开发环境总体流程图BLE HID触摸按键与滑条 功能展示项目总结 👉 【Funpack4-1】基于CY8CKIT-149 BLE HID设备实现及PC控制功能开发 👉 Github: EmbeddedCamerata/CY8CKIT-149_ble_hid_keyboard 项目介绍 基于英飞凌 CY8CK…...
工业级 激光测距 飞行时间法TOF 相位法 多频调制的本质!
激光测距仪中使用的相位法飞行时间(Phase-based Time-of-Flight, ToF)是一种通过测量调制光信号的相位差来计算距离的高精度方法。以下是详细解释: 一、核心原理:用“波的延迟”测距离 想象你向一堵墙拍手,通过回声的…...
014-STM32单片机实现矩阵薄膜键盘设计
1.功能说明 本设计主要是利用STM32驱动矩阵薄膜键盘,当按下按键后OLED显示屏上会对应显示当前的按键键值,可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。 2.硬件接线 模块管脚STM32单片机管脚矩阵键盘行1PA0矩阵键盘…...
flowable expression和json字符串中的双引号内容
前言 最近做项目,发现了一批特殊的数据,即特殊字符",本身输入双引号也不是什么特殊的字符,毕竟在存储时就是正常字符,只不过在编码的时候需要转义,转义符是\,然而转义符\也是特殊字符&…...
关于Internet Download Manager(IDM)强制下载合并相关二次开发
目录 前言 强制下载视频 强制合并 迁移下载列表 免责声明 附录 前言 那个下载工具IDM不说了,确实有很多便捷的功能,不过也有一些限制 常见的包括但不限于: 1.无法下载有版权保护的视频(不管真假) 2.有时候下载…...
在Vue3 + Vite 项目中使用 Tailwind CSS 4.0
文章目录 首先是我的package.json根据官网步骤VS Code安装插件验证是否引入成功参考资料 首先是我的package.json {"name": "aplumweb","private": true,"version": "0.0.0","type": "module","s…...
Notepad++消除生成bak文件
设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示...
[mmdetection]fast-rcnn模型训练自己的数据集的详细教程
本篇博客是由本人亲自调试成功后的学习笔记。使用了mmdetection项目包进行fast-rcnn模型的训练,数据集是自制图像数据。废话不多说,下面进入训练步骤教程。 注:本人使用linux服务器进行展示,Windows环境大差不差。另外࿰…...
汽车自动驾驶AI
汽车自动驾驶AI是当前汽车技术领域的前沿方向,以下是关于汽车自动驾驶AI的详细介绍: 技术原理 感知系统:自动驾驶汽车通过多种传感器(如激光雷达、摄像头、雷达、超声波传感器等)收集周围环境的信息。AI算法对这些传感…...
信息学奥赛一本通 2101:【23CSPJ普及组】旅游巴士(bus) | 洛谷 P9751 [CSP-J 2023] 旅游巴士
【题目链接】 ybt 2101:【23CSPJ普及组】旅游巴士(bus) 洛谷 P9751 [CSP-J 2023] 旅游巴士 【题目考点】 1. 图论:求最短路Dijkstra, SPFA 2. 动态规划 3. 二分答案 4. 图论:广搜BFS 【解题思路】 解法1:Dijkstra堆优化 …...
Day25 洛谷 提高- 1007
零基础洛谷刷题记录 Day01 2024.11.18 Day02 2024.11.25 Day03 2024.11.26 Day04 2024.11.28 Day05 2024.11.29 Day06 2024 12.02 Day07 2024.12.03 Day08 2024 12 05 Day09 2024.12.07 Day10 2024.12.09 Day11 2024.12.10 Day12 2024.12.12 Day13 2024.12.16 Day14 2024.12.1…...
minikube 的 Kubernetes 入门教程--Ollama
让我们在本地 Kubernetes 中部署 Ollama(llama3.2) Ollama 安装方式有多样,是可选的,因为有minikube环境,我在 Kubernetes 中Deployment它。调用Ollama镜像,也可以用 Ollama CLI 去运行(run&am…...
【字节青训营-7】:初探 Kitex 字节微服务框架(使用ETCD进行服务注册与发现)
本文目录 一、Kitex概述二、第一个Kitex应用三、IDL四、服务注册与发现 一、Kitex概述 长话短说,就是字节跳动内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。 如果对微服务性能有要求,又希望…...
Docker技术相关学习三
一、Docker镜像仓库管理 1.docker仓库:用于存储和分发docker镜像的集中式存储库,开发者可以将自己创建的镜像推送到仓库中也可以从仓库中拉取所需要的镜像。 2.docker仓库: 公有仓库(docker hub):任何人都可…...
浏览器查询所有的存储信息,以及清除的语法
要在浏览器的控制台中查看所有的存储(例如 localStorage、sessionStorage 和 cookies),你可以使用浏览器开发者工具的 "Application" 标签页。以下是操作步骤: 1. 打开开发者工具 在 Chrome 或 Edge 浏览器中…...
生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)
今天小李哥将开启全新的技术分享系列,为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来,生成式 AI 安全市场正迅速发展。据 IDC 预测,到 2025 年全球 AI 安全解决方案市场规模将突破 200 亿美元,年复合增长率超过 30%…...
mysql 学习8 函数,字符串函数,数值函数,日期函数,流程函数
函数 一 字符串函数 二 数值函数 三 日期函数 四 流程函数...
WSL2中安装的ubuntu搭建tftp服务器uboot通过tftp下载
Windows中安装wsl2,wsl2里安装ubuntu。 1. Wsl启动后 1)Windows下ip ipconfig 以太网适配器 vEthernet (WSL (Hyper-V firewall)): 连接特定的 DNS 后缀 . . . . . . . : IPv4 地址 . . . . . . . . . . . . : 172.19.32.1 子网掩码 . . . . . . . .…...
7.2.背包DP
背包DP 在C中,背包动态规划(Knapsack DP) 是解决资源分配类问题的核心算法范式,尤其在处理物品选择与容量限制的组合优化问题时表现优异。以下是针对不同背包类型的详细解析与代码实现: 一、背包DP问题分类 类型特点…...
芝法酱学习笔记(2.6)——flink-cdc监听mysql binlog并同步数据至elastic-search和更新redis缓存
一、需求背景 在有的项目中,尤其是进销存类的saas软件,一开始为了快速把产品做出来,并没有考虑缓存问题。而这类软件,有着复杂的业务逻辑。如果想在原先的代码中,添加redis缓存,改动面将非常大,…...
pandas习题 071:字典元素列表构造 DataFrame
(编码题)以下有一个列表嵌套字典 data,列表中的每个字典 fields 中的列表为每行数据的值,另有一个 col 为列名,利用这两个数据构造一个 DataFrame。 data = [{fields: [2024-10-07T21:22:01, USER-A, 21, 0,...