
1. 项目概述为什么需要一个游戏开发框架如果你在Unity社区里混迹过一段时间或者参与过几个稍具规模的项目大概率会听到过“StarryFramework”这个名字。它不是一个官方工具也不是某个大厂的商业产品而是一个由社区开发者贡献、在GitHub上开源的、面向Unity的模块化游戏开发框架。简单来说它试图解决一个让无数独立开发者和中小团队头疼的问题如何在一个新项目开始时快速搭建一个稳定、可扩展、且代码结构清晰的基础架构而不是每次都从零开始重复造轮子。想象一下你每次启动一个新游戏项目是不是都要重新思考资源怎么加载和管理UI界面怎么切换和通信游戏数据怎么持久化网络请求怎么处理事件系统怎么设计如果每次都手动搭建不仅耗时费力而且随着项目迭代不同模块之间的耦合度会越来越高最终变成难以维护的“屎山代码”。StarryFramework的出现就是为了提供一个经过实践检验的“地基”和一套“建筑规范”让你能更专注于游戏玩法本身的核心逻辑而不是底层的基础设施。我自己在几个中小型项目中都尝试引入或参考了StarryFramework的设计思想。它的核心价值在于其“模块化”和“约定大于配置”的理念。它提供了一套标准化的模块如资源管理、UI管理、音频管理、配置表、网络等并定义了这些模块之间交互的接口和规则。你不需要从零开始写一个资源加载器只需要按照它的规范去使用它提供的AssetService你也不需要自己设计一个复杂的UI栈管理系统它的UIManager已经帮你处理好了打开、关闭、层级、动画等繁琐细节。当然天下没有免费的午餐框架本身也有一定的学习成本。你需要理解它的设计哲学按照它的规则来组织你的代码和项目结构。但一旦你熟悉了这套规则开发效率的提升是肉眼可见的。这篇指南的目的就是带你从零开始一步步完成StarryFramework的安装、基础配置并理解其核心模块的运作方式让你能顺利地将这个强大的工具集成到你的下一个Unity项目中而不是在配置阶段就踩坑放弃。2. 环境准备与前置条件在开始安装StarryFramework之前确保你的开发环境已经就绪这能避免很多后续的兼容性问题。虽然StarryFramework力求兼容主流版本但明确的环境要求能让整个过程更顺畅。2.1 Unity版本选择与安装StarryFramework通常对较新的Unity LTS长期支持版本有最好的兼容性。根据其官方仓库的说明目前它主要支持Unity 2021.3 LTS及更高版本。我强烈建议你使用Unity Hub进行管理。安装Unity Hub如果你还没有安装去Unity官网下载并安装Unity Hub。它是管理多个Unity版本和项目的必备工具。安装指定Unity编辑器在Unity Hub的“安装”选项卡中点击“安装编辑器”。我建议选择2021.3.x LTS系列的最新版本例如2021.3.34f1。这个版本非常稳定拥有完善的包管理和资源处理机制是大多数框架和插件兼容性的“安全区”。选择安装模块在安装时除了默认的组件请务必勾选以下模块这对后续开发至关重要Microsoft Visual Studio Community 2019或2022这是Unity默认的C# IDE集成了强大的调试和代码补全功能。即使你习惯用VS Code或Rider也建议先安装它因为Unity与Visual Studio的集成度最高。Android Build Support和/或iOS Build Support根据你的目标平台选择。即使你现在不做移动端先安装上也无妨。Windows/Mono或Windows/IL2CPP脚本后端对于PC平台Mono是默认且快速的开发选择。IL2CPP能带来更好的性能和安全性但编译时间更长。初期开发建议先用Mono。注意避免使用过于前沿的Unity版本如Alpha或Beta版这些版本可能引入未稳定的API变化导致框架出现不可预知的问题。坚持使用LTS版本是保障项目长期稳定的关键。2.2 代码编辑器配置虽然Unity自带了MonoDevelop但Visual Studio或JetBrains Rider是更专业的选择。这里以Visual Studio 2022为例确保Visual Studio Tools for Unity已安装在Visual Studio Installer中修改你的VS 2022安装在“工作负载”选项卡中确认“使用Unity的游戏开发”工作负载已被勾选。这个工作负载包含了必要的Unity调试和开发工具。在Unity中关联外部脚本编辑器打开Unity或通过Unity Hub创建一个空项目来测试。进入Edit - Preferences。在左侧选择External Tools。在“External Script Editor”下拉菜单中选择你安装的Visual Studio 2022或你使用的其他IDE。确保下方的“Editor Attaching”选项是勾选的这允许你从Visual Studio直接附加调试器到Unity编辑器进程。完成这一步后在Unity编辑器中双击C#脚本就会自动在配置好的Visual Studio中打开并且可以进行断点调试这是高效开发的基础。2.3 获取StarryFramework源码StarryFramework是一个开源项目通常托管在GitHub上。你有两种主要方式获取它直接下载Release包推荐给初学者访问StarryFramework的GitHub仓库例如https://github.com/YourUsername/StarryFramework请替换为实际仓库地址。找到右侧的“Releases”部分。下载最新稳定版Stable的.zip或.unitypackage文件。.unitypackage文件可以直接在Unity中导入最为方便。使用Git克隆推荐给团队或希望持续更新的开发者如果你熟悉Git这是更好的方式便于更新和版本管理。在命令行中进入你希望存放项目的目录执行git clone https://github.com/YourUsername/StarryFramework.git克隆完成后你会得到一个包含完整源码的文件夹。你可以将其作为子模块Submodule引入你的主游戏项目或者直接将核心文件复制到你的项目Assets目录下。我个人更倾向于使用Git子模块的方式因为它能清晰地隔离框架代码和业务代码并且可以轻松地切换到框架的特定版本或分支。3. 框架核心模块解析与导入在将StarryFramework导入你的项目之前我们先来快速浏览一下它的核心目录结构理解每个部分是做什么的。这能帮助你在后续配置和使用时心中有数。一个典型的StarryFramework源码包可能包含以下关键文件夹Core/框架的核心运行时库。包含所有服务Service的接口和基础实现如GameManager、AssetService、UIManager、AudioManager、EventCenter等。这是框架的“心脏”必须导入。Editor/为Unity编辑器提供的扩展工具。例如自定义的Inspector面板、资源打包工具、配置表生成器等。这些工具能极大提升开发效率。Samples/或Demo/示例场景和代码。强烈建议在导入后先运行和查看这些示例这是最快的学习途径。ThirdParty/可能依赖的第三方库如LitJSON用于JSON解析、BestHTTP网络等。有些框架会将其打包有些则需要你自行导入。Documentation/或README.md说明文档。务必阅读3.1 导入框架到Unity项目现在我们开始将框架导入到一个全新的或已有的Unity项目中。方法一使用.unitypackage导入最简单在Unity编辑器中打开你的目标项目。菜单栏选择Assets - Import Package - Custom Package...。导航到你下载的StarryFramework_vX.X.X.unitypackage文件点击打开。在弹出的导入窗口中建议全选所有文件然后点击“Import”。Unity会将所有文件解压到你的项目Assets目录下通常会创建一个名为StarryFramework或Plugins/StarryFramework的文件夹。方法二手动复制源码在你的项目Assets目录下创建一个名为Framework或ThirdParty的文件夹用于区分业务代码。将你通过Git克隆或解压得到的StarryFramework源码文件夹通常是Assets目录下的内容整体复制到上一步创建的文件夹中。实操心得我习惯在Assets下创建_Framework目录前面加下划线使其排序靠前然后把StarryFramework放进去。再创建_Game目录存放所有游戏业务逻辑。这样的结构非常清晰_Framework下的内容原则上只读不修改所有定制化都在_Game中进行。导入完成后检查Unity的Console窗口是否有报错。常见的初期错误可能是缺少程序集引用或命名空间冲突。如果出现“The type or namespace name Starry could not be found”这类错误请检查是否使用了正确的.NET版本在Player Settings - Configuration - Api Compatibility Level中确保设置为.NET Standard 2.1或.NET Framework根据框架要求。StarryFramework通常需要较新的API支持。程序集定义Assembly Definition检查StarryFramework的各个子文件夹是否有.asmdef文件。确保你的游戏代码所在的程序集引用了框架核心的程序集。如果框架没有使用asmdef则无需担心。3.2 初始化框架入口GameManagerStarryFramework通常需要一个启动入口来初始化所有服务。这个入口往往是一个名为GameManager或App的单例MonoBehaviour。创建启动场景建议创建一个独立的场景例如_Launch专门用于框架初始化和加载首个游戏场景。在这个场景中通常只需要一个空的GameObject。挂载启动脚本在这个GameObject上添加一个脚本我们暂且叫它GameLauncher。这个脚本的职责很简单在Awake或Start方法中初始化StarryFramework的核心管理器。using UnityEngine; using Starry.Core; // 假设框架的核心命名空间 public class GameLauncher : MonoBehaviour { void Awake() { // 确保GameManager单例被创建和初始化 // 有些框架设计为懒加载或通过属性访问时自动创建具体需参考文档 if (GameManager.Instance null) { GameObject go new GameObject(GameManager); go.AddComponentGameManager(); // 假设GameManager继承自MonoBehaviour DontDestroyOnLoad(go); } // 初始化框架服务 GameManager.Instance.Initialize(); // 初始化完成后跳转到你的主菜单或第一个游戏场景 // SceneManager.LoadScene(MainMenu); } }理解GameManager的职责GameManager是框架的总调度中心。它的Initialize()方法内部会按顺序初始化各个子服务日志系统最先初始化以便记录后续所有流程。资源服务(AssetService)加载本地或远程资源。配置服务(ConfigService)加载游戏配置表如Excel转换的JSON。UI服务(UIManager)建立UI画布和层级管理。音频服务(AudioManager)初始化音频混合器Mixer和音频池。场景服务(SceneManager)管理场景加载和切换。对象池服务(PoolManager)初始化常用对象的对象池。网络服务(NetworkManager)如果需要初始化网络连接。这些服务通常以接口形式提供你可以通过GameManager.GetServiceT()来获取。这种设计实现了“依赖注入”的思想让代码耦合度更低更易于测试。4. 核心服务配置详解框架安装好后真正的挑战在于根据你的项目需求对各个服务进行正确的配置。这里我们深入几个最核心的服务。4.1 资源管理服务 (AssetService) 配置Unity自带的Resources加载方式有诸多限制而Addressables系统又略显复杂。StarryFramework的AssetService通常提供了一套折中或封装的方案支持AssetBundle和Resources两种模式甚至可能集成Addressables。配置步骤创建资源配置文件在Resources文件夹或框架指定的配置目录下创建一个配置文件例如AssetConfig.asset一个ScriptableObject。这个文件定义了资源加载的规则。配置资源组AssetGroup在配置文件中你可以定义多个资源组。例如Base包含所有场景共享的UI图集、通用音效、字体等。Scene_01第一个场景独有的模型、纹理。Lobby大厅场景的专属资源。 每个组需要指定其加载模式随游戏启动加载、按需加载、路径以及是否为远程资源。配置AssetBundle构建如果使用AssetBundle模式你需要编写或使用框架提供的编辑器工具来打包资源。通常框架会提供一个BuildAssetBundles的编辑器菜单。在打包前你需要为需要打包的资源设置AssetBundle名称在Inspector面板底部。框架的打包工具会根据这些名称和你的分组配置自动生成AssetBundle文件及其依赖关系清单Manifest。初始化与使用在GameManager初始化时AssetService会读取配置文件并可能预加载Base组的资源。在代码中你可以这样使用// 同步加载一个预制体 GameObject prefab AssetService.Instance.LoadAssetGameObject(UI/Prefabs/Button.prefab); Instantiate(prefab); // 异步加载一个纹理并指定回调 AssetService.Instance.LoadAssetAsyncSprite(Arts/Characters/hero.png, (sprite) { image.sprite sprite; });注意事项资源路径是配置的关键。务必保持代码中的加载路径与资源在项目中的实际路径、或打包后的AssetBundle名称一致。建议使用常量或配置表来管理这些路径字符串避免硬编码。4.2 UI管理系统 (UIManager) 配置一个健壮的UI管理系统是游戏项目的基石。StarryFramework的UIManager通常会解决UI层级、UI事件、UI动画、UI栈打开、关闭、返回等问题。配置步骤创建UI根画布UIManager通常会在初始化时自动创建一个名为UIRoot的GameObject并为其添加Canvas、CanvasScaler、GraphicRaycaster等组件。你需要根据项目需求设置CanvasScaler的适配模式例如Constant Pixel Size, Scale With Screen Size等。定义UI层级在UIRoot下预创建多个子节点代表不同的UI层级。常见的层级有Background背景层如全屏遮罩。Common通用层如常驻的小地图、金币显示。Normal普通窗口层如设置面板、背包。Tips提示层如飘字、弹窗。Top顶层如新手引导、系统公告。Loading加载层覆盖所有UI。 每个层级对应一个RectTransform节点UIManager会根据你打开UI时指定的层级将UI实例化到对应的节点下。创建UI基类与配置框架通常会提供一个UIBase或UIWindow的基类。你的每一个UI预制体都需要挂载一个继承自该基类的脚本。在这个脚本中你需要定义UI的类型全屏窗口、弹窗、固定面板等。重写OnInit,OnOpen,OnClose等生命周期方法。使用框架提供的按钮事件自动绑定功能避免手动拖拽onClick监听。public class UILoginPanel : UIWindow { // 通过属性自动绑定到预制体上的同名GameObject或Component [SerializeField] private Button m_BtnLogin; [SerializeField] private InputField m_InputAccount; public override void OnInit() { // 初始化组件绑定后调用 m_BtnLogin.onClick.AddListener(OnLoginClick); } public override void OnOpen(object args) { // 打开窗口时调用args是传递的参数 Debug.Log(Login Panel Opened with args: args); } private void OnLoginClick() { string account m_InputAccount.text; // 处理登录逻辑... UIManager.Instance.CloseWindow(this); } }使用UIManager// 打开登录面板并传递参数指定在Normal层打开 UIManager.Instance.OpenWindowUILoginPanel(LoginPanelPrefabPath, UILayer.Normal, user_data); // 关闭当前顶层窗口 UIManager.Instance.CloseTopWindow(); // 显示一个提示框Tips层 UIManager.Instance.ShowToast(登录成功);4.3 音频管理服务 (AudioManager) 配置音频管理看似简单但要做好如混音、音量分组、一键静音也需要不少工作。框架的AudioManager帮你封装了这些。配置步骤创建音频混合器Audio Mixer在Unity中创建AudioMixer资源例如MainMixer.mixer。在里面创建你需要的音频组Group如Master总控、BGM背景音乐、SFX音效、Voice语音。配置AudioManager创建一个AudioManager的配置文件ScriptableObject指定上面创建的MainMixer并将各个音频组关联起来。管理音频源AudioSourceAudioManager通常会采用对象池来管理大量的音效AudioSource避免频繁创建销毁。对于BGM则可能使用一个或两个专用的AudioSource进行交叉淡入淡出。使用AudioManager// 播放背景音乐循环并属于BGM分组 AudioManager.Instance.PlayBGM(Audio/BGM/MainTheme, 1.0f, true); // 播放一个音效属于SFX分组 int soundId AudioManager.Instance.PlaySFX(Audio/SFX/Click, 0.8f); // 如果需要可以中途停止这个音效 // AudioManager.Instance.StopSFX(soundId); // 调整分组音量0-1范围内部会转换为分贝 AudioManager.Instance.SetVolume(AudioGroup.SFX, 0.5f); // 全局静音 AudioManager.Instance.MuteAll(true);4.4 配置表与本地化服务对于数值策划和 multilingual 支持配置表系统必不可少。StarryFramework通常会集成一个将Excel或CSV转换为游戏内可读格式如JSON、二进制的工具链并提供一个高效的读取接口。工作流程编辑Excel策划在Excel中编辑游戏数据如物品表Item.xlsx包含ID、名称、图标、属性等列。导出配置使用框架提供的编辑器工具一个自定义的Unity编辑器窗口选择Excel文件点击“导出”。工具会将Excel转换为优化后的JSON文件或二进制文件。同时生成对应的C#数据类如ItemConfig.cs和加载代码。加载与使用游戏运行时ConfigService会在初始化时加载所有导出的配置表到内存中并提供快速的键值查询。// 获取ID为1001的物品配置 ItemConfig item ConfigService.Instance.GetConfigItemConfig(1001); if (item ! null) { Debug.Log($Item Name: {item.Name}, Attack: {item.Attack}); } // 结合本地化 string localizedName LocalizationService.Instance.GetText(item.NameKey);本地化集成配置表工具通常也支持本地化。在Excel中名称列可能不是直接存储文本而是存储一个键如ITEM_NAME_1001。框架会导出所有语言的文本到一个独立的本地化文件如Localization.json。LocalizationService根据当前语言设置动态替换这些键为对应的文本。5. 项目结构规划与最佳实践仅仅安装和配置好框架是不够的如何组织你的项目代码和资源使其与框架和谐共处是决定项目能否长期健康发展的关键。5.1 推荐的目录结构以下是我在多个项目中实践后总结出的一个清晰结构你可以根据项目规模调整Assets/ ├── _Framework/ # 框架代码只读通过子模块或包管理引入 │ └── StarryFramework/ │ ├── Core/ │ ├── Editor/ │ └── ... ├── _Game/ # 游戏业务逻辑你的主战场 │ ├── Scripts/ │ │ ├── Runtime/ # 运行时逻辑 │ │ │ ├── GameLogic/ # 游戏核心玩法逻辑 │ │ │ ├── UI/ # 所有UI面板脚本 │ │ │ │ ├── Login/ │ │ │ │ ├── MainMenu/ │ │ │ │ └── ... │ │ │ ├── Data/ # 数据模型、网络协议定义 │ │ │ ├── Manager/ # 项目自定义的管理器扩展框架 │ │ │ └── Utility/ # 通用工具类 │ │ └── Editor/ # 编辑器扩展脚本 │ ├── Arts/ # 美术资源 │ │ ├── Textures/ │ │ ├── Models/ │ │ ├── Animations/ │ │ └── UI/ # UI预制体、图集 │ ├── Audio/ # 音频资源 │ ├── Configs/ # 配置表原始文件Excel及生成文件 │ ├── Resources/ # 必须通过Resources.Load加载的少量资源 │ └── StreamingAssets/ # 随包体发布的AssetBundle或配置 ├── Plugins/ # 第三方插件DLL等 └── Scenes/ # 场景文件 ├── _Launch.unity # 框架启动场景 ├── MainMenu.unity └── ...5.2 代码组织规范命名空间隔离为你的游戏代码定义独立的命名空间如YourGame.避免与框架的Starry.命名空间冲突。扩展而非修改尽量不要直接修改_Framework下的框架源码。如果框架功能不满足需求尝试通过继承、组合或编写扩展方法来增加功能。如果确实需要修改务必记录并考虑如何向原仓库提交Pull Request。使用程序集定义Assembly Definition对于大型项目强烈建议使用.asmdef文件来划分程序集。例如YourGame.Runtime.asmdef包含所有游戏运行时逻辑。YourGame.Editor.asmdef包含所有编辑器工具并引用UnityEditor和YourGame.Runtime。在YourGame.Runtime.asmdef中添加对StarryFramework.Core等框架程序集的引用。这能显著改善编译速度和代码隔离。5.3 开发工作流建议从Demo开始不要一上来就在大项目中应用。先创建一个空的测试项目导入框架运行并仔细研究其附带的示例Samples。理解每个示例是如何工作的。分模块集成不要试图一次性集成所有框架功能。可以先从最急需的模块开始比如UIManager。在测试项目中成功做出一个完整的UI流程打开-关闭-传参后再将其应用到主项目。编写适配层如果你的老项目希望引入新框架或者你担心未来更换框架的成本可以考虑在框架之上再抽象一层。例如定义一个IResourceManager接口内部调用StarryFramework.AssetService。这样未来如果要换用Addressables只需要修改适配层的实现即可。善用框架的编辑器工具StarryFramework通常自带一些提升效率的编辑器工具比如资源打包工具、配置表导出工具、UI代码生成工具等。花时间学习和配置这些工具长期来看能节省大量手动操作的时间。6. 常见问题与故障排除实录在实际集成StarryFramework的过程中你几乎一定会遇到一些问题。下面是我和同事们踩过的一些坑以及解决方案。6.1 编译错误与引用问题问题现象可能原因解决方案导入后大量CSxxxx编译错误提示找不到Starry命名空间。1. 框架使用了程序集定义(.asmdef)但你的项目没有正确引用。2. 项目使用的.NET API兼容级别过低。1. 检查你的游戏代码所在的.asmdef文件在“Assembly Definition References”中添加对框架核心程序集的引用。2. 前往Project Settings - Player - Other Settings - Configuration将Api Compatibility Level设置为.NET Standard 2.1或.NET 4.x。错误提示某些Unity官方程序集如UnityEngine.UI版本冲突或找不到。框架可能依赖特定版本的Unity模块而你的项目没有安装。通过Unity Hub为当前项目使用的Unity编辑器版本安装对应的模块如UI、2D Sprite、Timeline等。在Visual Studio中代码智能提示IntelliSense不工作但Unity能编译。Visual Studio的项目文件(.csproj)没有正确生成或更新。在Unity编辑器中执行Edit - Preferences - External Tools点击Regenerate project files。然后关闭VS重新从Unity打开脚本。6.2 运行时错误与初始化问题问题现象可能原因解决方案游戏启动时抛出NullReferenceException指向GameManager.Instance。GameManager单例尚未初始化。启动场景中没有创建GameManager实例或者GameLauncher脚本的执行顺序有问题。1. 确保在启动场景中有一个GameObject挂载了初始化脚本如GameLauncher并且该脚本在Awake中创建了GameManager实例。2. 检查脚本执行顺序Edit - Project Settings - Script Execution Order确保初始化脚本早于其他可能访问GameManager.Instance的脚本执行。UI窗口打开后看不到或者层级错乱。1. UI预制体没有正确挂载继承自UIWindow的脚本。2. UI预制体的Canvas组件设置有问题如Render Mode不是Screen Space - Overlay。3.UIManager初始化时创建的层级结构UIRoot被意外修改或破坏。1. 检查UI预制体根节点上的脚本是否继承自框架的UI基类并且类名与预制体名匹配如果框架有命名约定。2. 检查Canvas组件的设置确保其与UIManager的预期一致。通常UIManager会动态设置Canvas的属性。3. 在UIManager初始化后在场景中检查UIRoot及其子层级节点的结构是否正确。资源加载失败返回null。1. 资源路径错误。2. 资源没有被打包到AssetBundle中或者打包配置错误。3. 使用AssetBundle模式时没有先加载AssetBundle的Manifest文件。1. 仔细核对加载路径。使用AssetService提供的调试工具或日志查看它实际查找的路径。2. 检查资源的AssetBundle标签设置并重新运行框架的AssetBundle打包工具。3. 确保在加载任何具体资源前已经调用了AssetService.Instance.Initialize()或类似的方法来初始化资源系统并加载主清单。配置表加载后数据为null或默认值。1. Excel导出失败或导出路径错误。2. 生成的C#数据类字段名与JSON键名不匹配大小写、下划线等。3. 配置表文件没有放到Resources或StreamingAssets等框架指定的读取目录。1. 检查编辑器控制台查看配置表导出工具是否有报错。2. 对比生成的ItemConfig.cs中的字段public int ItemId与JSON文件中的键itemId是否一致。框架的序列化库如LitJSON可能对大小写敏感。3. 确认导出的JSON文件被复制到了游戏构建后能访问到的正确目录。6.3 性能与内存问题问题游戏运行一段时间后卡顿Profiler显示GC Alloc垃圾回收分配很高。排查很可能是频繁地使用Resources.Load或new创建UI/对象。即使有对象池如果使用不当如每次点击都Instantiate一个提示文本也会产生大量GC。解决充分利用对象池对于频繁创建销毁的对象如子弹、伤害数字、特效务必使用框架的PoolManager或Unity自带的ObjectPool。避免在Update中分配内存例如避免在每帧的Update中拼接字符串如Score: score可以使用StringBuilder或提前定义好格式。检查资源引用确保通过AssetService加载的资源在不用时被正确卸载防止内存泄漏。但也要避免同一帧内频繁加载和卸载同一资源。问题AssetBundle模式下的网络资源加载在移动设备上非常慢或失败。排查可能是网络不稳定或者资源服务器配置了不正确的MIME类型。解决为AssetService的网络加载设置超时和重试机制如果框架未提供需要自己封装。对热更新资源实现差分下载只下载有变化的文件。在编辑器开发阶段可以先使用本地模拟模式将所有资源放在StreamingAssets下绕过网络问题。集成一个像StarryFramework这样的开发框架初期确实需要投入时间学习和适应。但一旦你度过了这个爬坡期它会成为你开发过程中强大的助力。关键在于理解其设计思想而不仅仅是调用API。多读它的源码多运行它的示例遇到问题时先查阅文档和Issues。最终你会形成一套基于该框架的高效开发模式这将是你未来快速原型开发和构建复杂项目的宝贵资产。记住框架是仆人不是主人。当框架的设计与你的项目特定需求严重冲突时要有勇气对其进行适当的裁剪或扩展让它真正为你所用。