深入理解包管理工具

news2024/9/29 12:38:04

目录

  • 引入
  • npm
    • 配置文件
    • 常见属性
    • 版本理解
    • package-lock.json
    • npm install
    • 其他命令
    • 发布自己的包
  • yarn
  • cnpm
  • npx
  • pnpm
    • 安装和使用
    • 硬链接和软链接
    • 非扁平node\_modules
    • 存储store

引入

  • 随着前端技术的发展,项目依赖的第三方库和工具越来越多(例如:React、Vue、Lodash、Axios等),手动管理这些库的版本、兼容性和更新变得非常困难

  • 包管理工具不仅可以来安装、升级、删除我们的工具代码,也能让开发者能够更方便地分享代码,开发者可以将自己的模块发布到公共仓库(如 npm),其他开发者可以通过包管理工具简单地引入和使用这些模块

npm

Node Package Manager,也就是Node包管理器,目前已经不仅仅是Node包管理器了,在前端项目中我们也在使用它来管理依赖的包

  • npm属于node的一个管理工具,安装Node的过程会自动安装npm工具node管理工具:https://nodejs.org/en/

  • npm管理的包可以在 https://www.npmjs.org/ npm官网查看、搜索,只要能搜到就可以通过npm安装

  • npm管理的包都是发布到到registry上面的,安装一个包时也是是从registry上面下载的包

配置文件

那么对于一个项目来说,我们如何使用npm来管理这么多包呢?

  • 每一个项目都会有一个对应的配置文件package.json,无论是前端项目(Vue、React)还是后端Node项目

  • 这个配置文件会记录着你项目的名称、版本号、项目描述

  • 也会记录项目所依赖的其他库的信息和依赖库的版本号

配置文件如何得到呢?

  • 手动从零创建项目,使用 npm init 在创建时填写信息

    // package.json
    {
      "name": "npm",
      "version": "1.0.0",
      "description": "npm包管理工具练习",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC"
    }
    

    在这里插入图片描述

  • 手动从零创建项目,使用 npm init -y 在创建时所有信息使用默认的都是yes

    // package.json
    {
      "name": "npm",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    

    在这里插入图片描述

  • 通过脚手架创建项目,脚手架会帮助我们生成package.json,并且里面有相关的配置

常见属性

  • name:是项目的名称,必须填写

  • version:是当前项目的版本号,必须填写

  • description:是描述信息,很多时候是作为项目的基本描述

  • author:是作者相关信息(发布时用到)

  • license:是开源协议(发布时用到)

  • private:记录当前的项目是否是私有的,当值为true时,npm是不能发布它的,这是防止私有项目或模块发布出去的方式

  • main:设置程序的入口文件,比如使用axios模块 const axios = require('axios'),如果有main属性,实际上是找到对应的main属性查找文件的

  • scripts:用于配置一些脚本命令,以键值对的形式存在

    • 配置后可以通过 npm run 命令的key 来执行这个命令

    • npm startnpm run start是等价的

    • 对于常用的 start、test、stop、restart 可以省略掉 run 直接通过 npm start 等方式运行

  • dependencies:是指定无论开发环境还是生成环境都需要依赖的包

    • 当你运行 npm install 时,dependencies 中的依赖会被安装

    • npm install --production,则只会安装 dependencies 中的依赖,而跳过 devDependencies

  • devDependencies:用于声明开发环境所需的依赖,这些依赖通常在生产环境中不需要

    • 运行 npm install 时,devDependencies 中的依赖会被安装

    • 通过 npm install webpack --save-dev,它会安装到 devDependencies 属性中

    • 常见的 devDependencies 包包括:

      1. 测试框架(如 Jest、Mocha

      2. 构建工具(如 Webpack、Rollup

      3. 代码检查工具(如 ESLint、Prettier

      4. 类型定义文件(如 @types/node

  • peerDependencies:用于定义某个包所需的外部依赖的版本

    • 告诉用户这个包需要与某个特定版本的依赖一起使用

    • 当一个包声明了 peerDependencies,npm 不会自动安装这些依赖,而是会在安装时发出警告,提醒用户需要手动安装合适的版本

    • peerDependencies 常用于插件、组件库和框架,比如element-plus是依赖于vue3的,ant design是依赖于react、react-dom

  • engines:用于指定NodeNPM的版本号

    • 在安装的过程中,会先检查对应的引擎版本,如果不符合就会报错
    • 也可以指定所在的操作系统 “os” : [ “darwin”, “linux” ],只是很少用到
  • browserslist:用于配置打包后的JavaScript浏览器的兼容情况

    • webpack等打包工具服务的一个属性

    • 可以放在 package.json 中,或者在单独的 .browserslistrc 文件中定义

    • 可以使用多种方式定义支持的浏览器,例如:

      1. 指定具体版本:last 2 versions

      2. 指定市场份额:> 1%

      3. 指定浏览器类型:not dead(排除不再维护的浏览器)

版本理解

我们会发现安装的依赖版本出现:^2.0.3~2.0.3,这是什么意思呢?

  • npm的包通常需要遵从semver版本规范:

    • semver:https://semver.org/lang/zh-CN/
    • npm semver:https://docs.npmjs.com/misc/semver
  • semver版本规范是X.Y.Z

    • X主版本号(major:当你做了不兼容的 API 修改(可能不兼容之前的版本)

    • Y次版本号(minor:当你做了向下兼容的功能性新增(新功能增加,但是兼容之前的版本)

    • Z修订号(patch:当你做了向下兼容的问题修正(没有新功能,修复了之前版本的bug

  • ^~ 的区别:

    • x.y.z:表示一个明确的版本号

    • ^x.y.z:表示x是保持不变的,y和z永远安装最新的版本

    • ~x.y.z:表示x和y保持不变的,z永远安装最新的版本

package-lock.json

package-lock.jsonnpm 在安装依赖时自动生成的文件,主要用于锁定项目的依赖版本

  • 记录了每个依赖的确切版本,包括直接依赖和间接依赖。这样可以确保在不同的环境中安装依赖时,版本一致

  • 当安装依赖时,npm 会优先使用 package-lock.json 中记录的信息,从而加快安装速度

package-lock.json 的示例结构如下:

{
  "name": "your-project",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "dependencies": {
    "express": {
      "version": "4.17.1",
      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
      "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
      "dev": false,
      "requires": {
        "body-parser": "1.20.0"
      },
      "engines": {
        "node": ">= 0.10.0"
      },
      "dependencies": {
        "body-parser": {
          "version": "1.20.2",
          ...
        }
      }
    }
  }
}

相关属性:

  • name:项目的名称

  • version:项目的版本

  • lockfileVersionlock文件的版本

  • requires:使用requires来跟踪模块的依赖关系

  • dependencies:项目的依赖

    • 上面代码显示项目依赖 express,但 express 又依赖 body-parser

    • express中的属性如下:

      version:表示实际安装的express的版本

      resolved:用来记录下载的地址,registry仓库中的位置

      requires/dependencies:记录当前模块的依赖

      integrity:用来从缓存中获取索引,再通过索引去获取压缩包文件

npm install

安装npm包分两种情况:

  • 全局安装(global install): npm install XXX -g/global

    • 在某些系统(如 Linux 或 macOS)中,可能需要使用 sudo 来获取安装全局包的权限。例如:sudo npm install XX -g
    • 全局安装的包通常会自动配置环境变量,允许你在命令行中直接使用它们,可运行 npm config get prefix 来查看全局安装路径
  • 项目(局部)安装(local install): npm install XXX

    • 会在当前目录下生成一个 node_modules 文件夹

    • npm install/idependenciesdevDependencies 中的依赖会被安装

    • npm install/i --production,则只会安装 dependencies 中的依赖,而跳过 devDependencies

    • npm install/i XXX:会把依赖安装到 dependencies 属性中

    • npm install/i XXX --save-dev || npm install/i XXX -D,会把依赖安装到 devDependencies 属性中

那么 npm install/i 是什么原理呐?npm install会检测是否有package-lock.json文件

  • 没有lock文件:

    • 分析依赖关系,因为可能有的包会依赖其他包,并且多个包之间会产生相同依赖的情况

    • registry仓库中下载压缩包(如果设置了镜像,会从镜像服务器下载压缩包)

    • 获取到压缩包后会对压缩包进行缓存(从npm5开始有的)

    • 压缩包解压到项目node_modules文件夹中

  • lock文件:

    • 检测lock中包的版本是否和package.json中一致(会按照semver版本规范检测)

    • 不一致,那么会重新构建依赖关系,直接会走顶层的流程

    • 一致的情况下,会去优先查找缓存

    • 没有找到会从registry仓库下载,直接走顶层流程

    • 查找到会获取缓存中的压缩文件,并且将压缩文件解压到node_modules文件夹中

    在这里插入图片描述

其他命令

  • npm uninstall XXX || npm uninstall XXX --save-dev || npm uninstall XXX -D:卸载某个依赖包

  • npm rebuild:强制重新build

  • npm config list:查看基本配置,后面增加参数-l能查看所有配置

  • npm config set registry https://registry.npm.taobao.org:设置下载地址,比如这里的淘宝镜像地址

  • npm --registry https://registry.npm.taobao.org install XXX:临时使用指定的下载地址

  • npm config set cache "D:\xxx\xxx\node_global":设置安装路径

  • npm config set prefix "D:\xxx\xxx\npm_cache":设置缓存路径

  • npm config get xxx:查看某个属性

  • npm cache clean --force:清除npm缓存

  • 更多的命令可以根据需要查阅官方文档:https://docs.npmjs.com/cli-documentation/cli

发布自己的包

  • 注册npm账号:在官网 https://www.npmjs.com/ 选择sign up

  • npm login:在命令行登录

  • 修改package.json

  • npm publish:发布到npm registry

  • 更新仓库:修改版本号(最好符合semver规范),重新npm publish

  • npm unpublish:删除发布的包

  • npm deprecate:让发布的包过期

yarn

yarn是由Facebook、Google、ExponentTilde 联合推出了一个新的 JS 包管理工具

  • 早期的npm存在很多的缺陷,比如安装依赖速度很慢、版本依赖混乱等等一系列的问题

  • yarn 是为了弥补早期 npm 的一些缺陷而出现的

  • 虽然从 npm5 版本开始,进行了很多的升级和改进,但是依然很多人喜欢使用yarn

  • 命令区别如下图:

    在这里插入图片描述

cnpm

由于一些特殊的原因,某些情况下我们没办法很好的从 https://registry.npmjs.org 下载下来一些需要的包,这时我们有两种方式解决:

  • 可以直接设置npm的镜像

    • npm config get registry:查看镜像地址

    • npm config set registry https://registry.npm.taobao.org:设置淘宝镜像

  • 可以使用cnpm,并且将cnpm设置为淘宝的镜像

    • npm install -g cnpm -registry=https://registry.npm.taobao.org:安装 cnpm

    • cnpm config set registry https://registry.npm.taobao.org:设置 cnpm 镜像地址为淘宝地址

    • npm config get registry:查看镜像地址

npx

npxnpm5.2之后自带的一个命令npx 的作用非常多,但是比较常见的是使用它来调用项目中的某个模块的指令

  • 我们拿yarn做例子,我项目安装yarn版本是1.22.0,全局安装yarn版本1.22.22
    在这里插入图片描述

  • 当我在项目目录的终端下执行 yarn -v 命令时打印的是全局安装的版本
    在这里插入图片描述

  • 那么在项目中想要使用项目局部中的yarn时,有以下三种方式:

    • 方式一:在项目目录的终端执行 ./node_modules/.bin/yarn --version
      在这里插入图片描述

    • 方式二:在项目目录的终端执行 npx yarn -vnpx的原理非常简单,它会到当前目录的node_modules/.bin目录下查找对应的命令
      在这里插入图片描述

    • 方式三:package.json文件配置 "scripts": {"yarn": "yarn -version"},在执行npm run yarn
      在这里插入图片描述

pnpm

pnpm:我们可以理解成是performant npm缩写,包括Vue在内的很多公司或者开源项目的包管理工具都切换到了pnpm
在这里插入图片描述

安装和使用

  • 官网提供了很多种方式来安装pnpm:https://www.pnpm.cn/installation, 我们都安装过Nodenpm,所以npm安装:npm install/i pnpm -g

  • 更多命令和用法可以参考pnpm的官网:https://pnpm.io/zh/, 下面是与 npm 等价命令的对照表:

在这里插入图片描述

硬链接和软链接

我们都知道 pnpm 是很快速高效的,那么在它的内部是怎么做到的?首先先理解硬链接和软链接这两个概念

  • 硬链接(hard link

    • 是电脑文件系统中的多个文件平等地共享同一个文件存储单元

    • 指向文件在文件系统中的实际数据块

    • 不会创建新的文件,而是创建一个新的目录项指向同一数据块

    • 删除其中一个链接不会影响其他链接,文件内容只会在所有链接都被删除时才会消失

  • 软链接(soft link)也称符号链接(Symbolic link:快捷桌面就是软链接

    • 是一类特殊的文件,其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用

    • 也可以说是一个指向另一个文件或目录的路径,如果原文件被删除,软链接会失效成为“悬空链接”

在这里插入图片描述

我们来练习并理解一下这两个概念:vsCodecmd终端演练

  • copy copy.js ccopy.js:文件的拷贝,会在硬盘中复制出来一份新的文件数据,这两个文件数据互不影响
    在这里插入图片描述

  • mklink /H hhard.js hard.js :文件的硬链接,hard.jshhard.js 平等地共享同一个文件数据单元,文件之间会互相影响
    在这里插入图片描述

  • mklink ssoft.js soft.js:文件的软连接,文件之间会互相影响,打开软链接文件会打开原文件,删除原文件,软链接文件也就无效了
    在这里插入图片描述

非扁平node_modules

非扁平化通常指的是在数据结构或存储方式中,保持层级或嵌套关系的状态,而不是将所有数据都放在同一层级上

那么为什么说pnpmnode_modules是非扁平的呐?下面以安装axios依赖为例理解一下:

  • 我们可以看到下图右边使用 npm i axios 安装依赖包,axios 和它的依赖包都将被提升到 node_modules 的根目录下,这样会造成可以访问本不属于当前项目所设定的依赖包

  • 而左边的pnpm使用的非扁平化管理,在node_modules中只有axios.pnpm文件夹,不会出现npm的问题
    在这里插入图片描述

上图有的文件我们看到了软链接的符号,各个依赖的软硬链接关系图如下:

在这里插入图片描述

在上图中能非常清晰的看到依赖包都是从.pnpm store硬链接的,下面学习.pnpm-store,它是 pnpm 通过高效的缓存机制优化依赖管理的核心部分

存储store

.pnpm-storepnpm 的一个特定目录,用于存储依赖包的缓存,与其他包管理工具不同,pnpm 通过将所有的依赖包存储在一个全局的存储位置(即 .pnpm-store)中,而不是每个项目都重复下载和存储这些包

  • 它解决了使用 npmYarn 时,有超多项目且所有项目都有一个相同的依赖包,在硬盘上就需要保存超多份该相同依赖包的副本的问题

  • 如果项目中使用.pnpm-store中存在的依赖包版本,pnpm 会创建一个软链接,将该依赖指向 .pnpm-store 中的缓存目录,而不是重新下载

  • 虽然使用了软链接(符号链接),但这些链接指向的是存储在 .pnpm-store 中的特定版本文件,修改这些依赖的文件不会影响原始的版本文件,因为 pnpm.pnpm-store 中保持每个版本的独立副本

  • 如果使用的版本不在 .pnpm-store 中,pnpm 会自动下载该版本并存储到 .pnpm-store,以便将来使用

  • 不同版本之间有相同的文件,pnpm 也会通过硬链接的方式将相同的文件链接到不同的版本上,而不是重复存储

  • 只有在版本之间存在文件差异时,pnpm 才会存储这些不同的文件,确保了磁盘空间的高效利用

在这里插入图片描述

.pnpm-score的存储位置如下:

  • pnpm7.0之前,统一的存储位置是 ~/.pnpm-score中的
    在这里插入图片描述

  • pnpm7.0之后,统一的存储位置进行了更改 <pnpm home directory>/store

    • Linux 上,默认是 ~/.local/share/pnpm/store

    • Windows 上: C:\Users\XXX\AppData\Local\pnpm\store,可以看到它存储的是编码后的文件
      在这里插入图片描述

    • macOS 上: ~/Library/pnpm/store

  • pnpm store path:获取当前活跃的store目录

  • pnpm store prune:从store中删除当前未被引用的包来释放store的空间

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

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

相关文章

信用卡验证-卢恩算法

卢恩算法 什么是 Luhn 算法&#xff1f; Luhn算法&#xff0c;也称为“模10算法”&#xff0c;是一种用于确定用户提供的标识号是否准确的公式。它广泛应用于验证信用卡号码以及其他数字序列&#xff0c;例如政府的社会安全号码 (SSN)。如今&#xff0c;Luhn算法是电子支付系…

详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 HandlerInter…

OJ在线评测系统 前端创建题目(增) 更新题目(改) 题目列表(查) 以及做题页面的开发 基于VUECLI脚手架画界面

目录 前端创建页面的开发一 创建一个路由 用acro design写 前端创建页面的开发二 题目管理页面 搜索 最終效果 题目更新页面的开发 携带参数的那种 修改路由 页码更新细节 我们先处理菜单项的权限控制和权限隐藏 在这里改 属性绑定一个函数 可以参考聚合搜索项目…

金属增材制造咋突破?纳米纹理粉末如何助力金属增材制造?

大家好&#xff0c;今天我们来了解一篇金属增材制造文章——《High absorptivity nanotextured powders for additive manufacturing》发表于《Science Advances》。金属增材制造在医疗、航空航天等领域&#xff0c;它潜力巨大&#xff0c;但目前可打印的金属材料有限&#xff…

word中的表格全部设置宽度100%

1、背景 我们用工具将数据库或其他的数据导出成word时&#xff0c;表格有的会大于100%&#xff0c;超过了边界。word没有提供全局修改的方法。如果我们想改成100%。 一种方式是通过宏&#xff0c;全局改。一种是手动改。 2、宏修改 如果表格多&#xff0c;可以通过这种方式。…

文献阅读——基于拉格朗日乘子的电力系统安全域边界通用搜索方法

摘要 为提升电力系统安全域(security region&#xff0c;SR)的构建效 率&#xff0c;提出一种基于拉格朗日乘子(Lagrange multiplier&#xff0c;LM) 的电力系统安全域边界(security region boundary&#xff0c;SRB)通用搜索方法。 首先&#xff0c;根据电力系统静态安全性问…

15.面试算法-树基础

1. 树基础 树在工程中有非常广泛的应用&#xff0c;在算法中也是一个极为庞大的体系&#xff0c;我们前面链表的文章中说过“没学会反转&#xff0c;链表相当于白学”&#xff0c;现在再加一句“没学会树的问题&#xff0c;算法相当于没学”。 本文我们将系统地学习相关问题。…

PLC程序加密的一种方法(密钥授权管理程序)

引文&#xff1a; 前段时间有客户跟我说&#xff0c;他们客户到期没有打款&#xff0c;所以想在PLC中开发一套授权管理程序&#xff0c;这样可以根据实际情况&#xff0c;给予客户不同的授权&#xff1b; 探讨&#xff1a; PLC怎么实现程序授权管理&#xff01; 对于国内工程师…

五星级可视化页面(28):3D园区—模型与数据的完美结合。

将园区3D模型和数据图表结合起来形成高大上的可视化效果有以下几方面的意义&#xff1a; 1. 提升信息表达效果&#xff1a; 通过将园区3D模型和数据图表结合&#xff0c;可以更生动地展现园区的空间结构和布局&#xff0c;同时将数据图表融入其中&#xff0c;直观地展示园区各…

Redis实战--Redis集群的搭建与使用

Redis是一个开源的高性能key-value数据库&#xff0c;它以其出色的性能和丰富的特性而广受欢迎。随着业务的发展&#xff0c;单机Redis可能无法满足大规模数据存储和高并发访问的需求。这时&#xff0c;Redis集群就显得尤为重要。本文将详细介绍Redis集群的概念、搭建过程以及使…

进阶美颜功能技术开发方案:探索视频美颜SDK

视频美颜SDK&#xff08;SoftwareDevelopmentKit&#xff09;作为提升视频质量的重要工具&#xff0c;越来越多地被开发者关注与应用。接下俩&#xff0c;笔者将深入探讨进阶美颜功能的技术开发方案&#xff0c;助力开发者更好地利用视频美颜SDK。 一、视频美颜SDK的核心功能 …

【CSS in Depth 2 精译_039】6.3 CSS 定位技术之:相对定位(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

IDEA插件:Maven Helper插件强势优化【某个依赖包被哪些maven项目模块引用,快速定位】体验真好!

背景&#xff1a; 开发的项目是maven多模块&#xff0c;子模块数量多&#xff0c;已经超过10个。 而且经常会被扫描漏洞&#xff0c;并进行依赖包升级。 在使用过程中&#xff0c;发现MavenHelper插件和IDEA自带的Analyze Dependencies都有个缺点&#xff1a;只能是单个模块…

【C++笔试强训】如何成为算法糕手Day3

​ 学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;除2&#xff01; 第二题&#xff1a;dd爱框框 第三题&#xff1a;简写单词 第一题&#xff1a;除2&#xff01; 牛客网…

前端独立实现页面是否有发布

1、自动更新js (AutoUpdate.js) import { Modal } from "antd"let lastSrcs; const scriptReg /\<script.*src["](?<src>[^"])/gm; async function extractNewScripts() {const html await fetch(/?_timnestamp Date.now()).then(res > …

追随 HarmonyOS NEXT,Solon v3.0 将在10月8日发布

Solon &#xff08;开放原子开源基金会&#xff0c;孵化项目&#xff09;原计划10月1日发布 v3.0 正式版。看到 HarmonyOS NEXT 将在 10月8日启用公测&#xff0c;现改为10月8日发布以示庆贺。另外&#xff0c;Solon 将在2025年启动“仓颉”版开发&#xff08;届时&#xff0c;…

(11)(2.1.2) DShot ESCs(四)

文章目录 前言 6 混合ESC协议 7 IOMCU DShot限制 8 参数说明 前言 DShot 是一种数字 ESC 协议&#xff0c;它允许快速、高分辨率的数字通信&#xff0c;可以改善飞行器控制&#xff0c;这在多旋翼和 quadplane 应用中特别有用。 6 混合ESC协议 虽然 ArduPilot 自动驾驶仪…

Redis 为什么用跳表实现有序集合

近几年针对 Redis 面试时会涉及常见数据结构的底层设计&#xff0c;其中就有这么一道比较有意思的面试题&#xff1a;“Redis 的有序集合底层为什么要用跳表&#xff0c;而不用平衡树、红黑树或者 B树&#xff1f;”。 本文就以这道大厂常问的面试题为切入点&#xff0c;带大家…

Python 将数据写入 excel(新手入门)

一、场景分析 假设有如下一组列表数据&#xff1a; 写一段 python脚本 将这组数据写入一个新建的 excel&#xff0c;表头是 【序号】、【姓名】、【性别】、【年龄】 student_list [{name:小林, gender:男, age:10}, {name:小红, gender:女, age:11}, {name:小王, gender:男…

mysql数据库:超键、候选键、主键与外键

mysql数据库&#xff1a;超键、候选键、主键与外键 1、超键&#xff08;Superkey&#xff09;2、候选键&#xff08;Candidate Key&#xff09;3、主键&#xff08;Primary Key&#xff09;4、外键&#xff08;Foreign Key&#xff09; &#x1f496;The Begin&#x1f496;点点…