ReactNative进阶(四十九)project,教你用CSS清除样式

105 阅读8分钟

文章目录

一、前言

Xcode作为日常开发iOS程序的IDE,支持CC++Objective-CSwiftRuby等语言进行编写。日常开发入口就是Xcode workspace或者Xcode project

workspace是一个Xcode文档,它将项目和其他文件、project分组。一个workspace可以包含任意数量的Xcode project,以及资源文件(JSON、脚本、图片、视频等)。workspace除了组织每个project中的文件外,还提供了所包含项目及其目标之间的隐式和显式关系。

project就是一个 Xcode 工程,它是实际管理工程下 targets 、源码、资源文件、framework 等。project 只是一个容器,本身是无法被编译的,所以每个 project 至少应该有一个可编译的 target, target下需要包含可编译的源码。

在这里插入图片描述
由上图可以简单看出workspaceproject的关系:

  • 一个workspace里可以包含多个project
  • 一个project里包含多个target
  • configurationXcode中的Debug/Release 等工程配置;
  • scheme 配置target编译参数;
  • 每个target即每次编译生成对应产物:app或者framework

Xcode 中能看见所有的公共配置信息都存在于 project.pbxproj 中。pbxproj全拼是Project Builder Xcode Project,它其实是我们熟悉的plist文件的一种,但是它不像我们常用的plist文件有着优越的可读性,由于历史原因它才被Xcode一直保存下来。

pbxproj中定义了targetscript、文件、configuration等之间的引用关系,我们看到的Xcode项目布局实际上是可视化了pbxproj

pbxproj主要包含跟文件相关的 BuildFileGroupFileReference;跟编译相关的 BuildPhaseBuild Configuration(List);以及一些列 TargetTargetDependency

开发者比较关键的信息是配置应用PP文件、包名及APP 版本号。

MARKETING\_VERSION = 2.4.2;
ONLY\_ACTIVE\_ARCH = YES;
OTHER\_CODE\_SIGN\_FLAGS = "--deep";
OTHER\_LDFLAGS = (
	"$(inherited)",
	"-ObjC",
	"-lc++",
);
PRODUCT\_BUNDLE\_IDENTIFIER = com.shq5785.com;
PRODUCT\_NAME = shq5785;
PROVISIONING\_PROFILE\_SPECIFIER = "ppFile";

二、project.pbxproj 文件解析

project.pbxproj 文件包含于 Xcode 工程文件 *.xcodeproj 之中,存储着 Xcode 工程的各项配置参数。它本质上是一种旧风格的 Property List 文件,历史可追溯到 NeXT 的 OpenStep。其可读性不如 xmljson,苹果却一直沿用至今,作为一家以创新闻名的公司可能这里剩下的就是情怀吧。

project.pbxproj 使用 UUID 作为交叉引用的索引,保证每个配置信息对象的唯一性。因为 UUID 根据机器硬件和时间戳生成,避免了多人在同一时间段操作修改工程文件带来的问题。也就是说工程中每项配置对象都有个唯一的 UUID,然后其他配置对象想引用某个配置对象直接使用它的 UUID 即可。这就跟我们编程时使用指针指向某个对象的地址一样,其他对象的属性想引用它,只需要给属性传个指针地址就行了。

可以把整个文件的内容想象成一个字典,字典中的 Key 按照字典序来排列。字典的第一层级总共有 5 个键值对,Key 分别为:archiveVersionclassesobjectVersionobjectsrootObject。其中重要的 KeyobjectsrootObject

在这里插入图片描述

所有的配置对象都放在 objects 对应的 Value 中,包括根对象(rootObject)。 objects 对应的 Value 也是一个字典,Key 都为 UUID,Value 依然是个字典。可以将 rootObject 的值(是一个 UUID)作为 Keyobjects 对应的字典中找到根对象。这个根对象的 isa 属性为 PBXProjectisa = PBXProject)。读懂 project.pbxproj 的最好方式就是顺着 rootObject 的各个属性对应的 UUIDobjects 中找到对应的对象,然后一层层看下去。这样整个文件的配置信息存放方式就慢慢摸清了。

objects 的键值对根据内容类型被分成了若干个 section,虽然 section 的顺序是 Xcode 私有 API 钦定的,但每个 section 内部的键值对会根据 Key 的字典序排列。采用注释的方式分节也使得可读性更强。section 的数量跟工程有关,尤其是每个工程的 BuildPhaseTarget 差别都很大。

每个 section 中的对象类型都是相同的,对象的类型是靠 isa 的值区分的。对象内部的属性类型以及含义可以参照这篇文章提供的对照表: Xcode Project File Format

每个对象内部的属性(也是键值对)会把 isa 排在最前面,其余的按照字典序排列。

数组内部的顺序完全按照元素内容的字典序排列。

大概分为以下几类信息:

  • 工程中的文件关联信息、资源关联信息

    • PBXBuildFile 参与编译的文件;
    • PBXFileReference 工程中的所有文件信息;
  • 文件的组织结构信息

    • PBXGroup 工程中的文件夹;
  • 工程的编译配置、证书配置信息

    • PBXResourcesBuildPhase 编译阶段的资源配置;
    • PBXFrameworksBuildPhase 编译阶段的framework配置;
    • PBXProject 工程信息;
    • PBXNativeTarget 工程中所有target的信息;
    • XCConfigurationList 每个target下包含的编译模式,如Debug 、 Release等模式;
    • XCBuildConfiguration 具体的编译信息,如Release模式下的编译配置;

文件间的关系大致如下图所示:

在这里插入图片描述

每一项资源在这个文件中都有一个值作为唯一标识,如903C829A2075C24300EB9AD0。可以看做是id。

一般每个ID值后面都会有一个注释来进行说明这个ID对应的具体内容。如903C829C2075C24300EB9AD0 /* TLauncher */,表示这个ID是代表的是TLauncher这个target。

相同类型的资源是按段进行整理的。

每一段内容前用/* Begin xxx section */注释作为开始。用/* End xxx section */ 作为这一段内容的结束。

每一项内容中用isa = xxx 指示该资源所属于的类型。

其中,PBXFrameworksBuildPhasePBXResourcesBuildPhasePBXShellScriptBuildPhasePBXTargetDependencyPBXSourcesBuildPhase这几项内容都是对工程在编译阶段的配置。

对应于工程中如下配置内容:
在这里插入图片描述

下面是 objectsPBXNativeTarget section 的一个对象,感受一下格式:

/\* Begin PBXNativeTarget section \*/
		00E356ED1AD99517003FC87E /\* shq5785Tests \*/ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 00E357021AD99517003FC87E /\* Build configuration list for PBXNativeTarget "mrcsTests" \*/;
			buildPhases = (
				E813BE00D49641555FA7986E /\* [CP] Check Pods Manifest.lock \*/,
				00E356EA1AD99517003FC87E /\* Sources \*/,
				00E356EB1AD99517003FC87E /\* Frameworks \*/,
				00E356EC1AD99517003FC87E /\* Resources \*/,
			);
			buildRules = (
			);
			dependencies = (
				00E356F51AD99517003FC87E /\* PBXTargetDependency \*/,
			);
			name = shq5785Tests;
			productName = shq5785Tests;
			productReference = 00E356EE1AD99517003FC87E /\* shq5785Tests.xctest \*/;
			productType = "com.apple.product-type.bundle.unit-test";
		};
		13B07F861A680F5B00A75B9A /\* shq5785 \*/ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 13B07F931A680F5B00A75B9A /\* Build configuration list for PBXNativeTarget "shq5785" \*/;
			buildPhases = (
				C8F5F5993094D81A94013E0D /\* [CP] Check Pods Manifest.lock \*/,
				FD10A7F022414F080027D42C /\* Start Packager \*/,
				13B07F871A680F5B00A75B9A /\* Sources \*/,
				13B07F8C1A680F5B00A75B9A /\* Frameworks \*/,
				13B07F8E1A680F5B00A75B9A /\* Resources \*/,
				00DD1BFF1BD5951E006B06BC /\* Bundle React Native code and images \*/,
				605CC81222DD68EB009545B7 /\* Embed Frameworks \*/,
				3A54938F9F6AAF435223E489 /\* [CP] Copy Pods Resources \*/,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = mrcs;
			productName = mrcs;
			productReference = 13B07F961A680F5B00A75B9A /\* shq5785.app \*/;
			productType = "com.apple.product-type.application";
		};
		2D02E47A1E0B4A5D006451C7 /\* shq5785-tvOS \*/ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /\* Build configuration list for PBXNativeTarget "shq5785-tvOS" \*/;
			buildPhases = (
				A6B45AA48E3A2F14663044B6 /\* [CP] Check Pods Manifest.lock \*/,
				FD10A7F122414F3F0027D42C /\* Start Packager \*/,
				2D02E4771E0B4A5D006451C7 /\* Sources \*/,
				2D02E4781E0B4A5D006451C7 /\* Frameworks \*/,
				2D02E4791E0B4A5D006451C7 /\* Resources \*/,
				2D02E4CB1E0B4B27006451C7 /\* Bundle React Native Code And Images \*/,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = "shq5785-tvOS";


#### Vue 编码基础

2.1.1. 组件规范  

2.1.2. 模板中使用简单的表达式  

2.1.3 指令都使用缩写形式  

2.1.4 标签顺序保持一致  

2.1.5 必须为 v-for 设置键值 key  

2.1.6 v-show 与 v-if 选择  

2.1.7 script 标签内部结构顺序  

2.1.8 Vue Router 规范



#### Vue 项目目录规范

2.2.1 基础  

2.2.2 使用 Vue-cli 脚手架  

2.2.3 目录说明  

2.2.4注释说明  

2.2.5 其他



![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6fa6d34bb76849d0b66426e7af6d0d1c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1771407201&x-signature=f2wI1p7x5%2F8UeuWT6l%2FTYNU3C2c%3D)
**开源分享:https://docs.qq.com/doc/DSmRnRGxvUkxTREhO**