OpenGL-ES 学习(10) ---- OpenGL-ES Shader语言语法
目录
- Shader 举例
- Shader 语法
- 版本规范声明
- 变量和定法方法
- 向量构造方法
- 矩阵构造方法
- 结构,数组,函数定义
- 结构
- 数组
- 函数
- 内建函数
- 条件语句和运算符
- 统一变量
- 统一变量块
- Shader 输入输出
- 插值限定符
- 预处理命令
- 精度限定符
- 不变性
Shader 举例
一个典型的简单的 Shader
程序:
const char vShaderStr[] ="#version 300 es \n""layout(location = 0) in vec4 a_position; \n""layout(location = 1) in vec4 a_color; \n""out vec4 v_color; \n""void main() \n""{ \n"" v_color = a_color; \n"" gl_Position = a_position; \n""}";
Shader 语法
版本规范声明
定义在 Shader
程序的第一行;
Shader
版本规范 没有声明版本号的默认将会使用 1.0
版本,但是3.0
版本中显然定义了更多的功能
变量和定法方法
分类 | 类型 | 描述 |
---|---|---|
浮点向量 | float、vec2、vec3、vec4 | 有1,2,3,4 个分量的浮点向量类型 |
整数向量 | int, ivec2, ivec3, ivec4 | 有1,2,3,4 个分量的整数向量类型 |
无符号整数向量 | uint, uvec2, uvec3, uvec4 | 有1,2,3,4 个分量的无符号整数向量类型 |
布尔向量 | bool, bvec2, bvec3, bvec4 | 有1,2,3,4 个分量基于bool的向量类型 |
矩阵 | mat2 mat2x3 mat2x4 mat3x2 mat3 mat3x4 mat4x2 mat4 | 2-2 2-3 2-4 等不同的向量类型 |
OpenGL ES 的变量只能赋值为同类型的其他变量
或者和同类型的其他变量进行运算
举例:
float myFloat = 1.0
float myFloat2 = 1 **定义错误,类型转换错误**
bool myBool = true
int myInt = 0
int myInt2 = 0.0 **定义错误,类型转换错误**
myFloat = float(myBool) **类型转换 bool -> float**
myFloat = float(myInt) **类型转换 int -> float**
myBool=bool(myInt) **类型转换 int -> bool**
向量构造方法
定义方法 | 含义 |
---|---|
vec4 myVec4 = vec4(1.0) | vec4 myVec4 = vec4{1.0, 1.0,1.0,1.0} |
vec3 myVec3 = vec3(1.0,0.0,0.5) | myVec3 = {1.0, 0.0, 0.5} |
vec3 temp = vec3(myVec3) | temp = myVec3 |
vec2 myVec2 = vec2(myVec3) | myVec2 = {myVec3.x, myVec3.y} |
myVec4 = vec4(myVec2, temp) | myVec4 {myVec2.x, myVecy, temp.x, temp.y} |
矩阵构造方法
矩阵的每个分量可以用 {r, g, b, a} {x, y, z, w} {s, t, p, q}
- 矩阵分量如果只设定为一个标量参数,那么该值将会被放置在对角线上
- 矩阵可以从多个向量参数构造,
mat2
可以用两个vec2
构造 - 矩阵可以从多个标量参数构造
结构,数组,函数定义
结构
结构可以认为是C语言中的结构体的概念
struct {vec4 color;float start;float end;
} fogVar;
数组
数组与C语言类型 从 0
开始索引
float floatArray[4];
vec4 vecArray[2];
数组的构造初始化形式:
float floatArray[4] = float[](1.0, 2.0, 3.0,4.0);
float floatArray[4] = float[4](1.0, 2.0, 3.0,4.0);
vec2 c[2] = vec2[2](vec(1.0), vec2(1.0)))
函数
声明方法和C语言相同,如果函数在定义之前使用,那么必须要提供原型声明,区别在于参数的传递方法,Open-GL ES
中的限定符:
限定符 | 描述 |
---|---|
in | 没有指定时的默认限定符 这个限定值按照参数值传递,函数不能修改 |
inout | 这个限定符按照引用传入参数,在函数退出后会变化 |
out | 该变量不被传入函数,在函数返回时会被修改 |
函数不能递归
内建函数
常用的内建函数都是有的,比如 sin
,cos
等等
条件语句和运算符
举例:
if(color.a < 0.25)
条件语句中测试的表达式必须是一个 bool 值
统一变量
统一变量是应用程序通过 Open-GL ES API
传入的, Shader
只是读取 Uniform
的值
uniform mat4 viewProjMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition;
注意统一变量的命名空间在 VertexShader
和 PixelShader
都是共享的,也就是说,如果 VertexShader
和 PixelShader
一起链接到一个程序对象,它们就会共享同一组统一变量,如果在VertexShader
和 PixelShader
声明同一个同一变量,那么两个声明必须匹配
统一变量通常保存在硬件中,这个区域被叫做常量存储,是硬件中为存储常量值而分配的特殊空间,因为常量的大小一般是固定的,所以程序中可以使用统一变量数量受到限制,OpenGL ES 3.0
实现必须提供 256 个顶点统一向量和224 个片段统一向量
统一变量块
统一变量缓冲区对象可以通过一个缓冲区对象支持统一变量数据的存储,具备下面的优势:
- 统一变量的缓冲区数据可以在多个程序之间共享,但是只需要设置一次
- 统一变量对象可以存储大量的统一变量数据
- 在缓冲区对象之间切换比单独加载一个统一变量更加高效
Shader 输入输出
顶点输入变量用于指定 VetexShader
每个顶点的输入,用 in
关键字指定;它们通常存储位置,法线,纹理坐标和颜色 这样的数据
顶点输入是为绘制的每个顶点指定的数据;本质上,应用程序会为每个顶点创建一个顶点数组,该数组包含位置和颜色。
底层硬件通常可以在输入Vertex shader
的数量上有限制,OpenGL ES 3.0
实现可支持的最小属性为 16个
#version 300 es
uniform mat4 u_matViewProjection;
layout(location = 0) in vec4 a_position
layout(location = 1) in vec4 a_color
out vec3 v_color
void main(void) {gl_position = u_matViewProjection * a_positionv_color = a_color;
}#version 300 es
precision medium floatin vec3 v_color
layout(location = 0) out vec4 o_fragColor
void main()
{o_fragColor = vec4(v_color, 1.0)
}
插值限定符
OpenGL ES
支持两种插值
- 线性插值,平滑着色
- 平面着色
定义了顶点着色器在基本图元中的插值形式:
线性插值:
smooth out vec3 v_color
smooth in vec3 v_color
平面着色
flat out vec3 v_color
flat in vec3 v_color
预处理命令
#define
#undef
#if
#ifdef
#ifndef
#else
#elif
#endif
__LINE__
__FILE__
#version
GL_ES#error
#extension
#pragma
精度限定符
精度限定符可以用作任何基于浮点数或者整数的变量的精度,关键字为
lowp
,meidump
,highp
示例:
highp vec4 position;
varying lowp vec4 color;
mediump float specularExp;
也可以对类型指定默认精度
presision highp float;
presision medium int;
为 float
指定的精度将用作基于浮点值的变量的默认精度,
- 在
VertexShader
,没有指定默认精度,为int
和float
的值都是 highp; - 但是在
Pixel Shader
没有默认的精度值,每个Pixel Shader 必须指定一个精度
不变性
OpenGL-ES
规定的 invariant
关键字可以用于任何可变顶点的 Shader
输出;
在 Shader
编译的时候,编译器进行优化,可能导致指令的重新排序; 这种指令的重排意味着两个 Shader
之间的等价计算不能保证产生完全相同的结果,这种不一致性在多变的Shader
特效的时候尤其会有可能产生问题,在这种情况下,相同的对象会用Alpha 混合绘制在自身上方,如果计算输出位置的数值的精度不完全一样,精度差异就会产生伪像。这个对象通常表现为深度冲突(Z Fighting
),
可以将变量定义为 invariant
变量,比如:
invarient gl_positioninvarirent textCoord
一旦某个输出变量声明了不变性,编译器便保证相同的计算和 Shader
输入的条件下计算结果相同,
也可以用 #pragma
让所有的变量保持不变:
#pragma STDGL invarient(all)
相关文章:
OpenGL-ES 学习(10) ---- OpenGL-ES Shader语言语法
目录 Shader 举例Shader 语法版本规范声明变量和定法方法向量构造方法矩阵构造方法结构,数组,函数定义结构数组函数 内建函数条件语句和运算符统一变量统一变量块Shader 输入输出插值限定符预处理命令精度限定符不变性 Shader 举例 一个典型的简单的 Sh…...
Unity SpriteAtlas (精灵图集)
🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎为什么要打图集? 💡打图集的目的就是减少DrawCall 提高性能 &a…...
(33)VTK C++开发示例 ---图片转3D
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 这是 VTK 测试 clipArt.tcl 的改编版本。 提供带有 2D 剪贴画的 jpg 文件,该示例将创建 3D 多边形数据模…...
RAG工程-基于LangChain 实现 Advanced RAG(预检索-查询优化)(上)
Enrich 完善问题 完善问题流程概述 问题转述 在典型RAG架构中,用户问题的质量直接影响检索系统的表现。研究表明,未经优化的自然语言查询会导致: 关键实体识别缺失 语义漂移导致召回偏离 长尾问题检索失败率升高 大多数用户并非提示词工程…...
交我算使用保姆教程:在计算中心利用singularity容器训练深度学习模型
文章目录 准备工作步骤如何封装和使用容器安装创建 Singularity 容器编写 def 文件构建容器查看构建容器的 python 版本本地测试挂载数据集和代码 如何上传数据windows 系统Linux 系统 如何设置作业任务脚本的结构常用的 Slurm 参数一份完整的 slurm 作业示例 如何在 debug 队列…...
CMake中强制启用option定义变量的方法
在CMake中,若要在另一个CMake文件中强制启用由option()定义的变量,可使用set(... FORCE)覆盖缓存变量。具体步骤如下: 使用set命令强制覆盖缓存: 在需要强制启用选项的CMake文件中,使用set命令并指定CACHE和FORCE参数。…...
图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别
图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别 在多人协作开发中,选择合适的 Git 分支管理策略至关重要。Merge、Rebase 和 Pull Request 是最常见的三种方式,它们本质不同,使用场景也不同。 本文将通过流程图&am…...
图与网络模型
目录 图的基本概念 例题:比赛的安排 MATLAB作图 最短路径模型 Dijkstra算法步骤 最短路径的Dijkstra算法示例 Dijkstra算法的Matlab函数 最短路径的Floyd算法模型 最短路径的Floyd算法步骤 Floyd算法的Matlab函数 图的基本概念 图G是一个二重组: …...
连接linux虚拟机并运行C++【从0开始】
连接linux虚拟机并运行C【从0开始】 NetSarang安装后两个,其实更加常用的 安装VMware安装Ubuntu 的 ISO 镜像VMWare--TipsUbuntu快捷键,可以在设置里面修改 连接Linux运行cwhy剪不断,理还乱操作 因为好多判题系统,后台都是Linux环…...
多线程系列二:Thread类
Thread类是jvm用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread对象与之关联 1.Thread常见构造方法 Thread():创建线程对象Thread(Runnable target):使用Runnable对象创建线程对象Thread(String name):创…...
2025五一杯数学建模C题:社交媒体平台用户分析问题,完整第一问模型与求解+代码
完整代码模型请见文末名片 • 问题1分析: – 来龙去脉和与其他问题的内在联系: • 来龙去脉:社交媒体平台为了评估博主的价值,合理分配资源和优化内容推荐,需要准确预测博主的新增关注数。新增关注数是衡量博主影响…...
开源飞控软件:推动无人机技术进步的引擎
在过去的二十年里,众多开源自动驾驶仪项目极大地推动了无人机技术的发展。像 MatrixPilot、Baseflight、TauLabs、OpenPilot、Cleanflight、MultiWii 和 dRonin 等一些开源自动驾驶仪项目已经停止开发,然而,Ardupilot/APM、Pixhawk/PX4、Papa…...
Pinia: vue3状态管理
一、Pinia 的相关介绍 1. 什么是 Pinia Pinia 是一个专门配合 vue.js 使用的状态管理, 从而实现跨组建通信或实现多个组件共享数据的一种技术 2. 使用 Pinia 的目的 我们的vuejs有俩个特性: 1> 数据驱动视图. 2> 组件化开发 基于这俩个特性, 我们引出pinia的使用目的 …...
初学Vue之记事本案例
初学Vue之记事本案例 案例功能需求相关Vue知识案例实现1.实现方法及代码2.演示 案例收获与总结 案例功能需求 基于Vue实现记事功能(不通过原生JS实现) 1.点击保存按钮将文本框的内容显示在特定位置,且清空文本框内容 2.点击清空按钮&#x…...
中国发布Web3计划:区块链列为核心基础技术,不排除发展加密资产应用!
在全球数字化浪潮汹涌、Web3概念方兴未艾之际,中国政府再次展现了其在区块链技术领域的雄心与布局。近日,北京市多个核心政府部门联合发布了一项名为《北京市区块链创新应用发展行动计划(2025–2027年)》的重要政策文件࿰…...
并发设计模式实战系列(11):两阶段终止(Two-Phase Termination)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第十一章两阶段终止(Two-Phase Termination),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 两阶段终止流…...
科学养生,解锁健康生活密码
健康是生命的基石,养生并非高深的学问,而是通过科学的生活方式,为身体构筑持久的健康防线。在现代快节奏生活中,掌握正确的养生方法,能有效提升生活质量,预防疾病侵袭。 均衡饮食是养生的核心。日常饮食应遵…...
计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践
概述 设想一下,你在多地拥有多个仓库,要同时监控每个仓库的实时状况,这对于时间和精力而言,都构成了一项艰巨挑战。从成本和可靠性的层面考量,大规模部署计算设备也并非可行之策。一方面,大量计算设备的购…...
初识 Java
文章目录 一、背景知识二、技术体系 一、背景知识 Java 是美国 sun(Stanford University Network)公司(2009 年被 Oracle 公司收购)在 1995 年推出的一门计算机高级编程语言 二、技术体系 Java SE(Java Standard Edition):标准版,Java 技术的核心和基…...
彩带飘落效果
文章目录 彩带效果适应场景HTML版本Vue3版本 彩带效果 彩带特效组件 适应场景 完成小结、版本升级等场景。提供HTM、Vue3版本。 HTML版本 <!doctype html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"…...
统计模式识别理论与方法
我们在前文《模式识别的基本概念与理论体系》中就已经提及“模式分类”。 具体内容看我的CSDN文章:模式识别的基本概念与理论体系-CSDN博客 模式的识别方法主要有统计模式识别方法和结构模式识别方法两大类。统计模式识别方法提出得较早,理论也较成熟…...
Ubuntu 安装 Cursor
Cursor 目前只有 Windows 和 Mac 版本,那么如何在 Ubuntu 上运行呢? 本质上是一个如何在 Ubuntu 运行 .appimage 的问题。 1. 下载 Cursor Linux 首先找到 Cursor 官网,下载 x64 安装包,如果你是 arm 架构,就下载 ar…...
前端八股 7
垃圾回收机制 系统周期性地找出暂时不再使用的变量的机制,释放其内存的机制 方法:古老引用计数法 创建一张引用表记录各种资源被引用的次数,当引用次数为0就回收 问题:当有两个对象互相引用时会造成内存泄漏 比如:…...
二、HTML
2.1 介绍 HTML(HyperText Markup Language,超文本标记语言) HTML是网页的骨架,用于定义网页的结构和内容。通过各种标签(如<div>、<p>、<a>、<img>等)来组织文本、图片、表格、表…...
EBO的使用
EBO 其实就是个索引,绑定在相应的VAO中,用来描述绘制顺序。比如在OpenGL绘制三角形的时候,假设有四个顶点,我称他们分别为1,2,3,4号顶点,常规绘制三角形函数是按三个点为一组&#x…...
AI大模型基础设施:NVIDIA的用于AI大语言模型训练和推理的几款主流显卡
英伟达(NVIDIA)在AI大语言模型(LLM)的训练和推理领域占据主导地位,其GPU因强大的并行计算能力和专为深度学习优化的架构而广受青睐。以下介绍几款主流的NVIDIA GPU,适用于AI大语言模型的训练和推理…...
面试手撕——迭代法中序遍历二叉树
思路 访问顺序和处理顺序不一致导致迭代法难写,体现在总要先遍历根节点,才能访问左右孩子,用null标记,null标记的节点表示已经访问过了,下一次可以处理,所以在当前栈顶节点不是null的时候,都要…...
SQL注入与简单实战
Example1 谁从小还没有一个当黑帽子的梦想呢,所以就来讲讲SQL💉🩸吧… 环境要求 sqlmap命令行工具使用Go语言安装包:waybackruls (需要在自己的电脑上部署) 寻找目标 url 对目标网站使用: echo https://xxx | wayb…...
ffmpeg 元数据
ffmpeg 元数据 1. 解释什么是ffmpeg元数据 ffmpeg元数据是指与音视频文件相关的附加信息,这些信息不直接影响音视频内容的播放,但提供了关于文件内容、创作者、版权、播放参数等的有用信息。元数据在音视频文件的处理、管理和共享中起着重要作用。 2.…...
Qwen3 正式发布
2025 年 4 月 29 日,阿里巴巴正式发布新一代通义千问模型 Qwen31。此次发布的 Qwen3 包含多种模型版本,具体如下: MoE 模型:有 Qwen3-235B-A22B(总参数 2350 亿,激活参数 220 亿)和 Qwen3-30B-A…...
[操作系统] 线程互斥
文章目录 背景概念线程互斥的引出互斥量锁的操作初始化 (Initialization)静态初始化动态初始化 加锁 (Locking)阻塞式加锁非阻塞式加锁 (尝试加锁/一般不考虑) 解锁 (Unlocking)销毁 (Destruction)设置属性 (Setting Attributes - 通过 pthread_mutex_init) 锁本身的保护互斥锁…...
KDD 2025 | (8月轮)时间序列(Time Series)论文总结
KDD 2025将在2025年8月3号到7号在加拿大多伦多举行,本文总结了KDD 2025(August Cycle)有关时间序列(Time Series)相关文章,共计11篇,其中1-10为Research Track,11为ADS Track。如有疏漏,欢迎补充…...
Spring MVC @PathVariable 注解怎么用?
我们来详细分析 Spring MVC 中的 PathVariable 注解。 PathVariable 注解的作用 PathVariable 注解用于从 URI 模板(URI Template)中提取值,并将这些值绑定到 Controller 方法的参数上。URI 模板是一种包含占位符的 URL 路径,这…...
PostgreSQL运算符
运算符 算数运算符 运算符描述示例加法SELECT 2 3; 结果为 5-减法SELECT 5 - 2; 结果为 3*乘法SELECT 2 * 3; 结果为 6/除法(对于整数相除,会截断小数部分)SELECT 5 / 2; 结果为 2 ,若要得到精确结果,可使用浮点数 …...
Ocelot与.NETcore7.0部署(基于腾讯云)
资料链接:https://download.csdn.net/download/ly1h1/90731290 1.效果 基于Ocelot,实现对3个微服务的轮询调用,实现不停机更新,无缝更新; 2.环境要求 1.部署环境:腾讯云的轻量化应用服务器 2.系统环境&…...
Umi-OCR项目(1)
最近接触到了一个项目,我在想能不能做出点东西出来。 目标:识别一张带表格的图片,要求非表格内容和表格内容都要识别得很好,并且可视化输出为word文档。 下面是第一步的测试代码,测试是否能够调用ocr能力。 import re…...
前端面试常问问题[From CV]
作为前端面试官,我会针对简历中的技术栈、项目经历和技能细节提出以下20个问题,并附上参考答案: 技术基础类问题 Q:请解释JavaScript事件循环机制,结合宏任务/微任务说明代码执行顺序 A:事件循环分为调用栈…...
C语言学习之动态内存的管理
学完前面的C语言内容后,我们之前给内存开辟空间的方式是这样的。 int val20; char arr[10]{0}; 我们发现这个方式有两个弊端:空间是固定的;同时在声明的时候必须指定数组的长度,一旦确定了大小就不能调整的。 而实际应用的过程中…...
CMake中的“包管理“模块FetchContent
背景介绍 C的包管理工具,好像除了微软家的vcpkg外,并没有一个特别有名的包管理器。 CMake其实也提供了基础的包管理功能。使用 FetchContent 模块系列命令可以下载项目依赖的源代码或者其他文件。 基本用法 FetchContent_Declare命令定义我们下载的内…...
python3基础
Python3 基础教程 1. Python简介 Python是一种高级、解释型、通用的编程语言,由Guido van Rossum于1989年底发明。Python的设计哲学强调代码的可读性和简洁性,其核心理念体现在"Python之禅"中: 优美胜于丑陋(Beautiful is better than ugly) 显式胜于隐式(E…...
课题推荐——通信信号处理中的非线性系统状态估计(如信号跟踪、相位恢复等场景),使用无迹卡尔曼滤波(UKF)的非线性滤波算法,MATLAB实现
给出一个基于无迹卡尔曼滤波(UKF)的非线性滤波算法及其MATLAB实现,适用于通信信号处理中的非线性系统状态估计(如信号跟踪、相位恢复等场景)。该算法结合了非线性动态模型和观测模型,并通过UT变换避免雅可比…...
Postgresql源码(145)优化器nestloop参数化路径评估不准问题分析
相关 《Postgresql源码(133)优化器动态规划生成连接路径的实例分析》 1 问题 最近遇到一个问题,评估行数和真实行数存在较大差距,导致计划不准的问题。 nestloop内表评估是根据外表的参数来的。因为外表驱动表每取一条ÿ…...
【深度学习新浪潮】小米MiMo-7B报告内容浅析
一段话总结 该报告介绍了专为推理任务设计的大语言模型MiMo-7B,其在预训练阶段通过优化数据预处理、采用三阶段数据混合策略(处理约25万亿token)和引入MultiToken Prediction(MTP)目标提升推理潜力;后训练阶段构建13万可验证数学和编程问题数据集,结合测试难度驱动奖励…...
使用Python和Pandas实现的Snowflake权限检查与SQL生成用于IT审计
import snowflake.connector import pandas as pddef get_snowflake_permissions():# 连接Snowflake(需要替换实际凭证)conn snowflake.connector.connect(user<USER>,password<PASSWORD>,account<ACCOUNT>,warehouse<WAREHOUSE&g…...
spring 从application.properties中获取参数的四种方式
在Spring Boot中,自定义一个Starter时,从application.properties中获取参数主要有以下几种方法: 使用Value注解 这是最常用的方法之一,通过Value注解可以直接将application.properties中的属性值注入到Spring管理的Bean中。 imp…...
react学习笔记2——基于React脚手架与ajax
使用create-react-app创建react应用 react脚手架 xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置(语法检查、jsx编译、devServer…)下载好了所有相关的依赖可以直接运行一个简单效果 react提供了一个用于创建react项…...
nim模块教程
导入一个模块 如果我们想要导入一个模块,并且和它的所有函数,我们要做的是写import <moduleName>在我们的文件里,这通常是在文件顶部进行的,这样我们就可以很容易地看到我们的代码使用了什么。 创建一个模块 first.nim …...
雅马哈SMT贴片机高效精密制造解析
内容概要 作为电子制造领域的核心装备,雅马哈SMT贴片机通过集成高速运动控制、智能视觉识别与模块化供料三大技术体系,构建了精密电子元件贴装的工业化解决方案。其YSM系列设备在5G通讯模组、汽车电子控制器及智能穿戴设备等场景中,实现了每…...
审计专员简历模板
模板信息 简历范文名称:审计专员简历模板,所属行业:其他 | 职位,模板编号:KSJYVR 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作。希…...
npm宿主依赖、宿主环境依赖(peerDependencies)(指由宿主环境提供的依赖)
文章目录 宿主环境依赖详解基本概念工作原理应用场景插件开发UI组件库 与其他依赖类型对比npm不同版本处理差异npm v3-v6npm v7 实际应用示例React插件开发 解决宿主依赖问题 宿主环境依赖详解 基本概念 宿主环境依赖(peerDependencies)是指包声明自身…...